feat(buzbee): hexadecimal to byte conversion routine and skip-whitespace routine for tokenizer

This commit is contained in:
2025-10-11 17:30:30 -05:00
parent a616d47e76
commit 31cf42167f

View File

@@ -13,15 +13,17 @@
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BBIN_DEPTH EQU $7F BBIN_DEPTH EQU $80 ; Input buffer depth
BBTOKENS_DEPTH EQU $3F BBTOKENS_DEPTH EQU $40 ; Token buffer depth
SECTION BBVARS,bss SECTION BBVARS,bss
tagbbvar STRUCT tagbbvar STRUCT
input rmb BBIN_DEPTH ; Input buffer input rmb BBIN_DEPTH ; Input buffer
cchinput rmd 1 ; Input buffer char count
tokens rmb BBTOKENS_DEPTH ; Token buffer tokens rmb BBTOKENS_DEPTH ; Token buffer
cbtokens rmb 2 cbtokens rmd 1 ; Token buffer byte count
scratch rmd 1 ; Scratch word
ENDSTRUCT ENDSTRUCT
ORG $0200 ORG $0200
@@ -38,10 +40,10 @@ BBVAR tagbbvar
EXPORT BUZBEE EXPORT BUZBEE
BUZBEE BUZBEE
bsr NEWLINE ; Setup the new input line and handle display. lbsr NEWLINE ; Setup the new input line and handle display.
bsr INPLOOP ; Fill input buffer. bsr INPLOOP ; Fill input buffer.
cmpy #$0000 ; No data? cmpy #$0000 ; No data?
beq BUZBEE ; Try again... beq BUZBEE ; Try again...
; TODO: Parse the input buffer into tokens ; TODO: Parse the input buffer into tokens
lbsr RUNIF lbsr RUNIF
bra BUZBEE bra BUZBEE
@@ -52,20 +54,6 @@ BUZBEE
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Handle new lines; prints a new prompt and then clears the input buffer
NEWLINE
PZSTR PROMPTLINE ; Print prompt line
CLRIN ; Label to just clear input buffer without newline
clra ; Init A and X
ldx #$0000
NEXT@
sta BBVAR.input,x ; Clear input buffer
leax 1,x
cmpx #BBIN_DEPTH
blo NEXT@
ldy #$0000 ; Reset buffer fill pointer
rts
; Fills input buffer with characters from the serial console. Sets Y to the ; Fills input buffer with characters from the serial console. Sets Y to the
; offset in the input buffer of the last char read. ; offset in the input buffer of the last char read.
INPLOOP INPLOOP
@@ -79,13 +67,14 @@ INPLOOP
cmpa #$08 ; BS? cmpa #$08 ; BS?
beq HBACKSPC@ ; Backup a char beq HBACKSPC@ ; Backup a char
cmpa #$0D ; CR? cmpa #$0D ; CR?
beq EXIT@ ; Then parse input buffer beq HCR@ ; Then terminate and parse input buffer
cmpy #BBIN_DEPTH ; Are we at the end of the input buffer? cmpy #BBIN_DEPTH ; Are we at the end of the input buffer?
beq FULLBUF@ ; Handle the buffer being full beq FULLBUF@ ; Handle the buffer being full
ECHO@ ECHO@
jsr POUTCHAR ; Echo char back, this includes BS chars jsr POUTCHAR ; Echo char back, this includes BS chars
sta BBVAR.input,y ; Add it to the input buffer sta BBVAR.input,y ; Add it to the input buffer
leay 1,y leay 1,y
; Fall through
NOCHAR@ NOCHAR@
; Check for error condition, work based on The Serial Port release 19 ; Check for error condition, work based on The Serial Port release 19
bitb #(UARTF_LSR_FIFO|UARTF_LSR_BI|UARTF_LSR_FE|UARTF_LSR_PE|UARTF_LSR_OE) bitb #(UARTF_LSR_FIFO|UARTF_LSR_BI|UARTF_LSR_FE|UARTF_LSR_PE|UARTF_LSR_OE)
@@ -103,10 +92,11 @@ NOPARITY@
PZSTR EM_FRAMING PZSTR EM_FRAMING
NOFRAM@ NOFRAM@
bitb #UARTF_LSR_FIFO ; Check for FIFO error bitb #UARTF_LSR_FIFO ; Check for FIFO error
beq INPLOOP beq INPLOOP ; Loop over
PZSTR EM_FIFO PZSTR EM_FIFO
bra INPLOOP bra INPLOOP ; Loop over
EXIT@ HCR@
sty BBVAR.cchinput ; Store buffer length
rts rts
HESC@ HESC@
lda #'^ ; Print a char that signifies that ESC was pressed lda #'^ ; Print a char that signifies that ESC was pressed
@@ -121,7 +111,21 @@ HBACKSPC@
FULLBUF@ FULLBUF@
lda #$07 ; ASCII BEL lda #$07 ; ASCII BEL
jsr POUTCHAR jsr POUTCHAR
bra INPLOOP lbra INPLOOP
; Handle new lines; prints a new prompt and then clears the input buffer
NEWLINE
PZSTR PROMPTLINE ; Print prompt line
CLRIN ; Label to just clear input buffer without newline
clra ; Init A and X
ldx #$0000
NEXT@
sta BBVAR.input,x ; Clear input buffer
leax 1,x
cmpx #BBIN_DEPTH
blo NEXT@
ldy #$0000 ; Reset buffer fill pointer
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
@@ -130,7 +134,7 @@ FULLBUF@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Prints a byte in A ; Prints a byte in A
; @param a: byte to print ; @param A: byte to print
PBYTE PBYTE
pshs b pshs b
tfr a,b ; Transfer lower nybble into B tfr a,b ; Transfer lower nybble into B
@@ -148,24 +152,58 @@ PBYTE
rts rts
; Converts a nybble into a valid hex digit ; Converts a nybble into a valid hex digit
; @param a: nybble to convert to a char ; @param A: nybble to convert to a char
; @return a: resulting char ; @return A: resulting char
NYB2HEX NYB2HEX
anda #$0F anda #$0F
ora #'0 ; Add "0" ora #'0 ; Add "0"
cmpa #$3A ; ":" "9"+1 cmpa #$3A ; ":" "9"+1
bcc SKIP@ blo SKIP@
adca #6 ; Add offset to "A" in ascii adca #6 ; Add offset to "A" in ascii
SKIP@ SKIP@
rts rts
; Converts a hexadecimal sequence into a byte value
; @param D: hex representation of a byte with A: MSD B: LSD
; @return A: returned byte value
; NOTE: Conversion logic credit to Wozniak. This code unrolled for speed.
HEX2BYT
eora #$B0 ; Map digits to 0-9
cmpa #9+1 ; Is it a decimal?
blo AISDEC@ ; Yes? skip hex adjust
adca #$88 ; Map 'A'-'F' to $FA-$FF
cmpa #$FA ; Hex char?
blo BADHEX@ ; No? Print error
AISDEC@
asla ; Shift MSD into upper nybble of A
asla
asla
asla
; Do B part
eorb #$B0 ; Map digits to 0-9
cmpa #9+1 ; Is it a decimal?
blo BISDEC@ ; Yes? skip hex adjust
adcb #$88 ; Map 'A'-'F' to $FA-$FF
andb #$0F ; Mask high nybble
cmpb #$0A ; Hex char?
blo BADHEX@ ; No? Print error
BISDEC@
stb BBVAR.scratch ; Store low nybble in scratch buffer
ora BBVAR.scratch ; Combine the nybbles
rts
BADHEX@
PZSTR EM_BADHEX ; Print an error message
clrd ; Prevent RUNIF from executing
std BBVAR.cbtokens
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; BUZBEE Tokenizing Routines ;; BUZBEE Tokenizing Routines
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Makes a hash of four chars in BBIN starting at offset X. ; Makes a hash of four chars in BBIN starting at offset X
; @param X: offset in BBIN to read the four chars from ; @param X: offset in BBIN to read the four chars from
; @return A: resulting hash ; @return A: resulting hash
MKCMDSUM MKCMDSUM
@@ -180,6 +218,18 @@ NEXTC@
bne NEXTC@ ; No? loop bne NEXTC@ ; No? loop
rts rts
; Skips "whitespace" to the next semantic char
; @param Y: current index in text buffer
; @return Y: resulting index in text buffer
SKIPTONEXTC
lda BBVAR.input,y ; Get our char?
cmpa #$20 ; SPACE or control char?
bhi EXIT@ ; Yes? End
leay 1,y ; Iterate next char
bra SKIPTONEXTC
EXIT@
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; BUZBEE IF Handling Functions ;; BUZBEE IF Handling Functions
@@ -190,6 +240,9 @@ NEXTC@
; @corrupts B ; @corrupts B
; @return X: command data table index ; @return X: command data table index
RUNIF RUNIF
clrd ; Do we have any tokens?
cmpd BBVAR.cbtokens
beq NOTOK@
ldx #0 ; Counting up from zero ldx #0 ; Counting up from zero
lda BBVAR.tokens ; Load token lda BBVAR.tokens ; Load token
NEXTHASH@ NEXTHASH@
@@ -198,13 +251,15 @@ NEXTHASH@
leax 1,x ; Begin considering next hash leax 1,x ; Begin considering next hash
cmpx BBCHTC ; Is this the last byte? cmpx BBCHTC ; Is this the last byte?
blo NEXTHASH@ ; No? try next hash, Yes? fall through blo NEXTHASH@ ; No? try next hash, Yes? fall through
PZSTR EM_BADCMD ; Print an error message PZSTR EM_BADHASH ; Print an error message
lbra IFHELP ; Proceed to call "HELP" lbra IFHELP ; Proceed to call "HELP"
CALCPTR@ CALCPTR@
tfr x,d ; Swap into d to do a cheap multiply tfr x,d ; Swap into d to do a cheap multiply
asld ; Cheaply << to get *2, pointer size asld ; Cheaply << to get *2, pointer size
tfr d,x ; Restore x from d and jump to function at index tfr d,x ; Restore x from d and jump to function at index
jmp [BBCMDPTRTBL,x] jmp [BBCMDPTRTBL,x]
NOTOK@
rts
; IF pointer table ; IF pointer table
BBCMDPTRTBL BBCMDPTRTBL
@@ -238,40 +293,25 @@ IFPEEK
ldd BBVAR.cbtokens ; One 16-bit token given, single peek ldd BBVAR.cbtokens ; One 16-bit token given, single peek
cmpd #3 cmpd #3
lblo INVALIDARG ; Not enough args given lblo INVALIDARG ; Not enough args given
bhi SELFORBAC@ ; Select forward or backward peek bhi SELTYPE@ ; Select forward or backward peek
SINGLE@ SINGLE@
lda [BBVAR.tokens+1] ; Get byte lda [BBVAR.tokens+1] ; Get byte
lbsr PBYTE ; Print peek byte lbsr PBYTE ; Print peek byte
rts rts
SELFORBAC@ SELTYPE@
ldd BBVAR.cbtokens ; Have enough tokens? ldd BBVAR.cbtokens ; Have enough tokens?
cmpd #5 cmpd #5
lbne INVALIDARG ; No? bounce out lbne INVALIDARG ; No? bounce out
ldd BBVAR.tokens+1 ; Are we forwards (BASE < HIGH)? ldd BBVAR.tokens+1 ; Are we forwards (BASE < HIGH)?
cmpd BBVAR.tokens+3 cmpd BBVAR.tokens+3
beq SINGLE@ ; Gracefully handle BASE == HIGH beq SINGLE@ ; Gracefully handle BASE == HIGH
blo PEEKFWD bhi INVALIDARG ; Malformed if BASE > HIGH
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 ldx BBVAR.tokens+1 ; Get BASE
PREV@ NEXT@
lda 0,x ; Get current byte lda ,x+ ; Get the next byte
leax -1,x ; Prep for next byte
lbsr PBYTE ; Print our byte lbsr PBYTE ; Print our byte
cmpx BBVAR.tokens+3 ; Are we at <HIGH> yet? cmpx BBVAR.tokens+3 ; Are we at <HIGH> yet?
bne PREV@ ; No? loop bne NEXT@ ; No? loop
rts rts
; Poke bytes into memory ; Poke bytes into memory
@@ -297,12 +337,12 @@ IFSREC
; Invalid argument IF tail ; Invalid argument IF tail
INVALIDARG INVALIDARG
PZSTR EM_MISSINGARG PZSTR EM_BADARG
rts rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; BUZBEE Strings and Tables ;; BUZBEE Strings and Fixed Data
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -327,20 +367,26 @@ PROMPTLINE
fcb $0D,$0A,$25,$00 ; CR LF '%' NUL fcb $0D,$0A,$25,$00 ; CR LF '%' NUL
EM_OVERRUN EM_OVERRUN
fcc "!!! Overrun Error !!!" fcc "!!! UART Overrun Error !!!"
fcb $0D,$0A,$00 fcb $0D,$0A,$00
EM_PARITY EM_PARITY
fcc "!!! Parity Error !!!" fcc "!!! UART Parity Error !!!"
fcb $0D,$0A,$00 fcb $0D,$0A,$00
EM_FRAMING EM_FRAMING
fcc "!!! Framing Error !!!" fcc "!!! UART Framing Error !!!"
fcb $0D,$0A,$00 fcb $0D,$0A,$00
EM_FIFO EM_FIFO
fcc "!!! FIFO Error !!!" fcc "!!! UART FIFO Error !!!"
fcb $0D,$0A,$00 fcb $0D,$0A,$00
EM_BADCMD EM_BADHASH
fcc "!!! Bad Command Hash !!!" fcc "!!! Bad Command Hash !!!"
fcb $0D,$0A,$00 fcb $0D,$0A,$00
EM_MISSINGARG EM_BADARG
fcc "!!! Missing Arguments !!!" fcc "!!! Malformed Arguments !!!"
fcb $0D,$0A,$00
EM_TOKFAIL
fcc "!!! Tokenization Failure !!!"
fcb $0D,$0A,$00
EM_BADHEX
fcc "!!! Maleformed Hex Value !!!"
fcb $0D,$0A,$00 fcb $0D,$0A,$00