basic: add puth command

This commit is contained in:
Virgil Dupras 2019-12-09 14:15:43 -05:00
parent d9db0a824e
commit beaea6f978
7 changed files with 71 additions and 75 deletions

View File

@ -149,6 +149,11 @@ that value in `A`.
`putc <char>`: Puts the specified character to the console.
`puth <char>`: Puts the specified character to the console, encoded in two
hexadecimal digits. For example, `puth 0x42` yields `42`. This is useful for
spitting binary contents to a console that has special handling of certain
control characters.
`sleep <units>`: Sleep a number of "units" specified by the supplied
expression. A "unit" depends on the CPU clock speed. At 4MHz, it is roughly 8
microseconds.

View File

@ -359,6 +359,15 @@ basPUTC:
xor a ; set Z
ret
basPUTH:
call rdExpr
ret nz
push ix \ pop hl
ld a, l
call printHex
xor a ; set Z
ret
basSLEEP:
call rdExpr
ret nz
@ -474,6 +483,8 @@ basCmds2:
.dw basGETC
.db "putc", 0
.dw basPUTC
.db "puth", 0
.dw basPUTH
.db "sleep", 0
.dw basSLEEP
.db "addr", 0

View File

@ -1,3 +1,6 @@
; *** Requirements ***
; stdioPutC
;
; Same as fmtDecimal, but DE is considered a signed number
fmtDecimalS:
@ -65,3 +68,47 @@ fmtDecimal:
call divide
pop de
ret
; Format the lower nibble of A into a hex char and stores the result in A.
fmtHex:
; The idea here is that there's 7 characters between '9' and 'A'
; in the ASCII table, and so we add 7 if the digit is >9.
; daa is designed for using Binary Coded Decimal format, where each
; nibble represents a single base 10 digit. If a nibble has a value >9,
; it adds 6 to that nibble, carrying to the next nibble and bringing the
; value back between 0-9. This gives us 6 of that 7 we needed to add, so
; then we just condtionally set the carry and add that carry, along with
; a number that maps 0 to '0'. We also need the upper nibble to be a
; set value, and have the N, C and H flags clear.
or 0xf0
daa ; now a =0x50 + the original value + 0x06 if >= 0xfa
add a, 0xa0 ; cause a carry for the values that were >=0x0a
adc a, 0x40
ret
; Print the hex char in A as a pair of hex digits.
printHex:
push af
; let's start with the leftmost char
rra \ rra \ rra \ rra
call fmtHex
call stdioPutC
; and now with the rightmost
pop af \ push af
call fmtHex
call stdioPutC
pop af
ret
; Print the hex pair in HL
printHexPair:
push af
ld a, h
call printHex
ld a, l
call printHex
pop af
ret

View File

@ -1,70 +0,0 @@
; *** Requirements ***
; printnstr
;
; *** Variables ***
; Used to store formatted hex values just before printing it.
.equ STDIO_HEX_FMT STDIO_RAMSTART
.equ STDIO_RAMEND @+2
; *** Code ***
; Format the lower nibble of A into a hex char and stores the result in A.
fmtHex:
; The idea here is that there's 7 characters between '9' and 'A'
; in the ASCII table, and so we add 7 if the digit is >9.
; daa is designed for using Binary Coded Decimal format, where each
; nibble represents a single base 10 digit. If a nibble has a value >9,
; it adds 6 to that nibble, carrying to the next nibble and bringing the
; value back between 0-9. This gives us 6 of that 7 we needed to add, so
; then we just condtionally set the carry and add that carry, along with
; a number that maps 0 to '0'. We also need the upper nibble to be a
; set value, and have the N, C and H flags clear.
or 0xf0
daa ; now a =0x50 + the original value + 0x06 if >= 0xfa
add a, 0xa0 ; cause a carry for the values that were >=0x0a
adc a, 0x40
ret
; Formats value in A into a string hex pair. Stores it in the memory location
; that HL points to. Does *not* add a null char at the end.
fmtHexPair:
push af
; let's start with the rightmost char
inc hl
call fmtHex
ld (hl), a
; and now with the leftmost
dec hl
pop af
push af
rra \ rra \ rra \ rra
call fmtHex
ld (hl), a
pop af
ret
; Print the hex char in A
printHex:
push bc
push hl
ld hl, STDIO_HEX_FMT
call fmtHexPair
ld b, 2
call printnstr
pop hl
pop bc
ret
; Print the hex pair in HL
printHexPair:
push af
ld a, h
call printHex
ld a, l
call printHex
pop af
ret

View File

@ -17,12 +17,12 @@ jp init
.dw blkBselCmd, blkSeekCmd, blkLoadCmd, blkSaveCmd
.dw fsOnCmd, flsCmd, fnewCmd, fdelCmd, fopnCmd
.equ STDIO_RAMSTART SHELL_RAMEND
.inc "lib/stdio.asm"
.inc "lib/ari.asm"
.inc "lib/fmt.asm"
.inc "shell/blkdev.asm"
.inc "shell/fs.asm"
.equ PGM_RAMSTART STDIO_RAMEND
.equ PGM_RAMSTART SHELL_RAMEND
.equ PGM_CODEADDR USER_CODE
.inc "shell/pgm.asm"

View File

@ -9,7 +9,7 @@ jp init
.inc "lib/util.asm"
.inc "lib/parse.asm"
.inc "lib/args.asm"
.inc "lib/stdio.asm"
.inc "lib/fmt.asm"
.equ SHELL_RAMSTART USER_RAMSTART
.equ SHELL_EXTRA_CMD_COUNT 0
.inc "shell/main.asm"

View File

@ -5,7 +5,8 @@ jp test
.inc "lib/ari.asm"
.inc "lib/fmt.asm"
testNum: .db 1
stdioPutC:
ret
test:
ld sp, 0xffff
@ -80,6 +81,8 @@ testFmtDecimalS:
.dw 0-1234
.db "-1234", 0
testNum: .db 1
nexttest:
ld a, (testNum)
inc a