diff --git a/src/buzbee.s b/src/buzbee.s index 0682f0f..5bfe2df 100644 --- a/src/buzbee.s +++ b/src/buzbee.s @@ -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 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 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 - Call the pointer given in as a subroutine." fcb $0D,$0A - fcc "EXEC - Start program at ." - fcb $0D,$0A fcc "HELP [CMD] - Display help, command optional." fcb $0D,$0A fcc "PEEK [] - Read memory at to ." @@ -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