feat(buzbee): Implemented CALL, PEEK, POKE IFs

This commit is contained in:
2025-10-10 23:29:30 -05:00
parent 1cd6720bf6
commit a616d47e76

View File

@@ -29,7 +29,7 @@ BBVAR tagbbvar
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; BUZBEE Machine Language Monitor for CHIBI PC-09
;; BUZBEE Main Loop
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -43,7 +43,7 @@ BUZBEE
cmpy #$0000 ; No data?
beq BUZBEE ; Try again...
; TODO: Parse the input buffer into tokens
; TODO: Execute the token buffer
lbsr RUNIF
bra BUZBEE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -125,7 +125,43 @@ FULLBUF@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; BUZBEE Command Hashing Routines
;; Hex Conversion and Printing Routines
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Prints a byte in A
; @param a: byte to print
PBYTE
pshs b
tfr a,b ; Transfer lower nybble into B
andd #$F00F ; Mask and adjsut
asra
asra
asra
asra
bsr NYB2HEX ; Print A
jsr POUTCHAR
tfr b,a ; Print B next
bsr NYB2HEX ; Print B
jsr POUTCHAR
puls b
rts
; Converts a nybble into a valid hex digit
; @param a: nybble to convert to a char
; @return a: resulting char
NYB2HEX
anda #$0F
ora #'0 ; Add "0"
cmpa #$3A ; ":" "9"+1
bcc SKIP@
adca #6 ; Add offset to "A" in ascii
SKIP@
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; BUZBEE Tokenizing Routines
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -144,44 +180,126 @@ NEXTC@
bne NEXTC@ ; No? loop
rts
; Maps a command hash to a command index, and executes it
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; BUZBEE IF Handling Functions
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Executes a command based on the initial token
; @corrupts B
; @param A: input hash
; @return X: command data table index
CALLFROMHASH
ldx #0 ; Counting up from zero
RUNIF
ldx #0 ; Counting up from zero
lda BBVAR.tokens ; Load token
NEXTHASH@
cmpa BBCHT,x ; Is this hash our hash?
beq CALCPTR@ ; Yes? skip to next step to put ptr in x
leax 1,x ; Begin considering next hash
cmpx BBCHTC ; Is this the last byte?
blo NEXTHASH@ ; No? try next hash, Yes? fall through
PZSTR EM_BADCMD ; Print an error message
lbra IFHELP ; Proceed to call "HELP"
cmpa BBCHT,x ; Is this hash our hash?
beq CALCPTR@ ; Yes? skip to next step to put ptr in x
leax 1,x ; Begin considering next hash
cmpx BBCHTC ; Is this the last byte?
blo NEXTHASH@ ; No? try next hash, Yes? fall through
PZSTR EM_BADCMD ; Print an error message
lbra IFHELP ; Proceed to call "HELP"
CALCPTR@
tfr x,d ; Swap into d to do a cheap multiply
asld ; Cheaply << to get *2, pointer size
tfr d,x ; Restore x from d and jump to function at index
tfr x,d ; Swap into d to do a cheap multiply
asld ; Cheaply << to get *2, pointer size
tfr d,x ; Restore x from d and jump to function at index
jmp [BBCMDPTRTBL,x]
; IF pointer table
BBCMDPTRTBL
fdb IFCALL
fdb IFHELP
fdb IFPEEK
fdb IFPOKE
fdb IFSREC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; BUZBEE Internal Command Functions
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Call a pointer
IFCALL
ldd BBVAR.cbtokens ; Only jump if three tokens given
cmpd #3
lbne INVALIDARG
jsr [BBVAR.tokens+1] ; Make our jump (doesn't implicitly return)
rts
; Print out a help message
IFHELP
PZSTR HELP_MSG
rts
; Placeholder function labels to make assembler happy before git commit
IFCALL
; Peek memory
IFPEEK
ldd BBVAR.cbtokens ; One 16-bit token given, single peek
cmpd #3
lblo INVALIDARG ; Not enough args given
bhi SELFORBAC@ ; Select forward or backward peek
SINGLE@
lda [BBVAR.tokens+1] ; Get byte
lbsr PBYTE ; Print peek byte
rts
SELFORBAC@
ldd BBVAR.cbtokens ; Have enough tokens?
cmpd #5
lbne INVALIDARG ; No? bounce out
ldd BBVAR.tokens+1 ; Are we forwards (BASE < HIGH)?
cmpd BBVAR.tokens+3
beq SINGLE@ ; Gracefully handle BASE == HIGH
blo PEEKFWD
bhi PEEKBACK
; Peek forward
PEEKFWD
ldx BBVAR.tokens+1 ; Get BASE
NEXT@
lda ,x+ ; Get the next byte
lbsr PBYTE ; Print our byte
cmpx BBVAR.tokens+3 ; Are we at <HIGH> yet?
bne NEXT@ ; No? loop
rts
; Peek backwards
PEEKBACK
ldx BBVAR.tokens+1 ; Get BASE
PREV@
lda 0,x ; Get current byte
leax -1,x ; Prep for next byte
lbsr PBYTE ; Print our byte
cmpx BBVAR.tokens+3 ; Are we at <HIGH> yet?
bne PREV@ ; No? loop
rts
; Poke bytes into memory
; NOTE: Blocks could also use 6309 TFM instruction
IFPOKE
ldx BBVAR.cbtokens ; Make sure we have enough tokens
cmpx #4
lblo INVALIDARG
leax -3,x ; Get count of bytes to write into X
ldy #0 ; Setup Y for indexing
NEXTB@
lda BBVAR.tokens+3,y ; Get source byte to copy
sta [BBVAR.tokens+1,y] ; Copy byte
leay +1,y ; Increment memory indexer
leax -1,x ; Decement byte count
cmpx #0 ; Are we at our last byte?
bhi NEXTB@ ; No? loop
rts
; Placeholder function labels to make assembler happy before git commit
IFSREC
rts
; Invalid argument IF tail
INVALIDARG
PZSTR EM_MISSINGARG
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; BUZBEE Strings and Tables
@@ -195,8 +313,6 @@ HELP_MSG
fcb $0D,$0A
fcc "CALL <PTR> - Call the pointer given in <PTR> as a subroutine."
fcb $0D,$0A
fcc "EXEC <PTR> - Start program at <PTR>."
fcb $0D,$0A
fcc "HELP [CMD] - Display help, command optional."
fcb $0D,$0A
fcc "PEEK <BASE> [<HIGH>] - Read memory at <BASE> to <HIGH>."
@@ -207,13 +323,6 @@ HELP_MSG
fcb $0D,$0A
fcb $00
BBCMDPTRTBL
fdb IFCALL
fdb IFHELP
fdb IFPEEK
fdb IFPOKE
fdb IFSREC
PROMPTLINE
fcb $0D,$0A,$25,$00 ; CR LF '%' NUL
@@ -232,3 +341,6 @@ EM_FIFO
EM_BADCMD
fcc "!!! Bad Command Hash !!!"
fcb $0D,$0A,$00
EM_MISSINGARG
fcc "!!! Missing Arguments !!!"
fcb $0D,$0A,$00