package mtmc.os.shell.builtins import mtmc.emulator.MonTanaMiniComputer import mtmc.emulator.Register import mtmc.os.shell.ShellCommand import mtmc.tokenizer.MTMCToken import mtmc.tokenizer.MTMCTokenizer class SetCommand : ShellCommand() { @Throws(Exception::class) public override fun exec(tokens: MTMCTokenizer, computer: MonTanaMiniComputer) { val memLocation = tokens.matchAndConsume( MTMCToken.TokenType.INTEGER, MTMCToken.TokenType.HEX, MTMCToken.TokenType.BINARY ) if (memLocation == null) { val register = tokens.matchAndConsume(MTMCToken.TokenType.IDENTIFIER) if (register == null) usageException() val value = tokens.matchAndConsume( MTMCToken.TokenType.INTEGER, MTMCToken.TokenType.HEX, MTMCToken.TokenType.BINARY ) if (value == null) usageException() val reg = Register.toInteger(register!!.stringValue) if (reg >= 0) { computer.setRegisterValue(reg, value!!.intValue()) } else { throw IllegalArgumentException("Bad register: " + register.stringValue) } } else { val value = tokens.matchAndConsume( MTMCToken.TokenType.INTEGER, MTMCToken.TokenType.HEX, MTMCToken.TokenType.BINARY, MTMCToken.TokenType.STRING ) if (value == null) usageException() if (value?.type === MTMCToken.TokenType.INTEGER || value?.type === MTMCToken.TokenType.BINARY || value?.type === MTMCToken.TokenType.HEX) { computer.writeWordToMemory(memLocation.intValue(), value.intValue()) } else { computer.writeStringToMemory( memLocation.intValue(), value!!.stringValue.encodeToByteArray() ) } } } override val help: String get() = """ set - sets a memory location value loc: a register name or memory location value: an integer, hex or binary value, or, for memory locations, a quoted string """.trimIndent() }