Files
mtmc-web/src/commonMain/kotlin/mtmc/os/shell/builtins/SetCommand.kt

58 lines
2.0 KiB
Kotlin

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 <loc> <value>- 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()
}