mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-07 19:51:51 +09:00
simple memory monitor
This commit is contained in:
101
assets/bios/mon.js
Normal file
101
assets/bios/mon.js
Normal file
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
C O M M A N D S
|
||||
|
||||
L (srec literal) : load the s-record into the memory address specified by the s-record. Pointer will also be
|
||||
moved to the specified start address if such field exists; otherwise untouched
|
||||
J (hex addr) : jump to the program stored in the address
|
||||
R : execute the code starting from the current pointer
|
||||
M (hex addr) : shows a byte on the address
|
||||
N : Increment the memory pointer, then show the byte on the address
|
||||
W (hex string) : write given byte string to the memory starting from the current pointer. If the length of the
|
||||
hex string is odd, error will be thrown. The pointer will auto-increment.
|
||||
|
||||
Prompt on successful: .
|
||||
Prompt on error: ?
|
||||
|
||||
*/
|
||||
|
||||
|
||||
let uhex = (i, len) => { return (i >>> 0).toString(16).toUpperCase().padStart(len||2, '0').slice(-(len||2)) }
|
||||
|
||||
println(`/MONITOR/ ${sys.maxmem()} BYTES SYSTEM`)
|
||||
|
||||
let prompt = ['?','.']
|
||||
|
||||
let mode = "M"
|
||||
let ptr = 0
|
||||
let previousError = undefined
|
||||
|
||||
while (1) {
|
||||
print(prompt[+!previousError])
|
||||
let buf = read().split(' ')
|
||||
let cmd = buf[0].toUpperCase()
|
||||
|
||||
if ("M" == cmd) {
|
||||
let addr = parseInt(buf[1], 16)
|
||||
let addr2 = parseInt(buf[2], 16)
|
||||
if (Number.isNaN(addr)) {
|
||||
println((uhex(ptr, 4))+' : '+uhex(sys.peek(ptr)))
|
||||
previousError = undefined
|
||||
}
|
||||
else {
|
||||
let oldptr = ptr
|
||||
ptr = addr
|
||||
if (Number.isNaN(addr2)) {
|
||||
println(uhex(sys.peek(ptr)))
|
||||
previousError = undefined
|
||||
}
|
||||
else if (Math.abs(addr2) <= Math.abs(addr))
|
||||
previousError = "Range error: end is greater than start"
|
||||
else {
|
||||
for (let i = 0; i <= Math.abs(addr2) - Math.abs(addr); i++) {
|
||||
if (i % 16 == 0 && i > 0) { println() }
|
||||
if (i % 16 == 0) { print((uhex(ptr, 4))+' : ') }
|
||||
print(uhex(sys.peek(ptr)) + ' ')
|
||||
if (addr < 0 && addr2 < 0) { ptr-- } else { ptr++ }
|
||||
}
|
||||
println()
|
||||
previousError = undefined
|
||||
}
|
||||
ptr = oldptr
|
||||
}
|
||||
}
|
||||
else if ("N" == cmd) {
|
||||
ptr++
|
||||
println((uhex(ptr, 4))+' : '+uhex(sys.peek(ptr)))
|
||||
previousError = undefined
|
||||
}
|
||||
else if ("J" == cmd) {
|
||||
let addr = parseInt(buf[1], 16)
|
||||
if (Number.isNaN(addr))
|
||||
previousError = "Jump address unspecified"
|
||||
else {
|
||||
ptr = addr
|
||||
previousError = undefined
|
||||
}
|
||||
}
|
||||
else if ("W" == cmd) {
|
||||
let arg = buf[1]
|
||||
if (arg == undefined)
|
||||
previousError = "No arguments given"
|
||||
else if (arg.length % 2 == 1)
|
||||
previousError = "Length of byte string is odd number"
|
||||
else {
|
||||
for (let i = 0; i < arg.length; i += 2) {
|
||||
let b = parseInt(arg.charAt(i)+arg.charAt(i+1), 16)
|
||||
sys.poke(ptr++, b)
|
||||
}
|
||||
previousError = undefined
|
||||
}
|
||||
}
|
||||
else if ('' == cmd) {
|
||||
// do nothing
|
||||
}
|
||||
else if ('?' == cmd) {
|
||||
println(previousError)
|
||||
}
|
||||
else {
|
||||
previousError = "Unknown command"
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user