generated from rnentjes/kotlin-server-web-undertow
58 lines
2.0 KiB
Kotlin
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()
|
|
}
|