mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-24 01:58:06 +11:00
basic: add puth command
This commit is contained in:
parent
d9db0a824e
commit
beaea6f978
@ -149,6 +149,11 @@ that value in `A`.
|
|||||||
|
|
||||||
`putc <char>`: Puts the specified character to the console.
|
`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
|
`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
|
expression. A "unit" depends on the CPU clock speed. At 4MHz, it is roughly 8
|
||||||
microseconds.
|
microseconds.
|
||||||
|
@ -359,6 +359,15 @@ basPUTC:
|
|||||||
xor a ; set Z
|
xor a ; set Z
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
basPUTH:
|
||||||
|
call rdExpr
|
||||||
|
ret nz
|
||||||
|
push ix \ pop hl
|
||||||
|
ld a, l
|
||||||
|
call printHex
|
||||||
|
xor a ; set Z
|
||||||
|
ret
|
||||||
|
|
||||||
basSLEEP:
|
basSLEEP:
|
||||||
call rdExpr
|
call rdExpr
|
||||||
ret nz
|
ret nz
|
||||||
@ -474,6 +483,8 @@ basCmds2:
|
|||||||
.dw basGETC
|
.dw basGETC
|
||||||
.db "putc", 0
|
.db "putc", 0
|
||||||
.dw basPUTC
|
.dw basPUTC
|
||||||
|
.db "puth", 0
|
||||||
|
.dw basPUTH
|
||||||
.db "sleep", 0
|
.db "sleep", 0
|
||||||
.dw basSLEEP
|
.dw basSLEEP
|
||||||
.db "addr", 0
|
.db "addr", 0
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
; *** Requirements ***
|
||||||
|
; stdioPutC
|
||||||
|
;
|
||||||
|
|
||||||
; Same as fmtDecimal, but DE is considered a signed number
|
; Same as fmtDecimal, but DE is considered a signed number
|
||||||
fmtDecimalS:
|
fmtDecimalS:
|
||||||
@ -65,3 +68,47 @@ fmtDecimal:
|
|||||||
call divide
|
call divide
|
||||||
pop de
|
pop de
|
||||||
ret
|
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
|
||||||
|
@ -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
|
|
||||||
|
|
||||||
|
|
@ -17,12 +17,12 @@ jp init
|
|||||||
.dw blkBselCmd, blkSeekCmd, blkLoadCmd, blkSaveCmd
|
.dw blkBselCmd, blkSeekCmd, blkLoadCmd, blkSaveCmd
|
||||||
.dw fsOnCmd, flsCmd, fnewCmd, fdelCmd, fopnCmd
|
.dw fsOnCmd, flsCmd, fnewCmd, fdelCmd, fopnCmd
|
||||||
|
|
||||||
.equ STDIO_RAMSTART SHELL_RAMEND
|
.inc "lib/ari.asm"
|
||||||
.inc "lib/stdio.asm"
|
.inc "lib/fmt.asm"
|
||||||
.inc "shell/blkdev.asm"
|
.inc "shell/blkdev.asm"
|
||||||
.inc "shell/fs.asm"
|
.inc "shell/fs.asm"
|
||||||
|
|
||||||
.equ PGM_RAMSTART STDIO_RAMEND
|
.equ PGM_RAMSTART SHELL_RAMEND
|
||||||
.equ PGM_CODEADDR USER_CODE
|
.equ PGM_CODEADDR USER_CODE
|
||||||
.inc "shell/pgm.asm"
|
.inc "shell/pgm.asm"
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ jp init
|
|||||||
.inc "lib/util.asm"
|
.inc "lib/util.asm"
|
||||||
.inc "lib/parse.asm"
|
.inc "lib/parse.asm"
|
||||||
.inc "lib/args.asm"
|
.inc "lib/args.asm"
|
||||||
.inc "lib/stdio.asm"
|
.inc "lib/fmt.asm"
|
||||||
.equ SHELL_RAMSTART USER_RAMSTART
|
.equ SHELL_RAMSTART USER_RAMSTART
|
||||||
.equ SHELL_EXTRA_CMD_COUNT 0
|
.equ SHELL_EXTRA_CMD_COUNT 0
|
||||||
.inc "shell/main.asm"
|
.inc "shell/main.asm"
|
||||||
|
@ -5,7 +5,8 @@ jp test
|
|||||||
.inc "lib/ari.asm"
|
.inc "lib/ari.asm"
|
||||||
.inc "lib/fmt.asm"
|
.inc "lib/fmt.asm"
|
||||||
|
|
||||||
testNum: .db 1
|
stdioPutC:
|
||||||
|
ret
|
||||||
|
|
||||||
test:
|
test:
|
||||||
ld sp, 0xffff
|
ld sp, 0xffff
|
||||||
@ -80,6 +81,8 @@ testFmtDecimalS:
|
|||||||
.dw 0-1234
|
.dw 0-1234
|
||||||
.db "-1234", 0
|
.db "-1234", 0
|
||||||
|
|
||||||
|
testNum: .db 1
|
||||||
|
|
||||||
nexttest:
|
nexttest:
|
||||||
ld a, (testNum)
|
ld a, (testNum)
|
||||||
inc a
|
inc a
|
||||||
|
Loading…
Reference in New Issue
Block a user