From beaea6f97843e9c4f64ea2f02341131b3156e2ae Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 9 Dec 2019 14:15:43 -0500 Subject: [PATCH] basic: add puth command --- apps/basic/README.md | 5 +++ apps/basic/main.asm | 11 +++++ apps/lib/fmt.asm | 47 +++++++++++++++++++++ apps/lib/stdio.asm | 70 ------------------------------- apps/shell/glue.asm | 6 +-- apps/shell/gluem.asm | 2 +- tools/tests/unit/test_lib_fmt.asm | 5 ++- 7 files changed, 71 insertions(+), 75 deletions(-) delete mode 100644 apps/lib/stdio.asm diff --git a/apps/basic/README.md b/apps/basic/README.md index 3947a95..0b1a062 100644 --- a/apps/basic/README.md +++ b/apps/basic/README.md @@ -149,6 +149,11 @@ that value in `A`. `putc `: Puts the specified character to the console. +`puth `: 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 `: 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. diff --git a/apps/basic/main.asm b/apps/basic/main.asm index 81ba5a3..74b363e 100644 --- a/apps/basic/main.asm +++ b/apps/basic/main.asm @@ -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 diff --git a/apps/lib/fmt.asm b/apps/lib/fmt.asm index 74236ed..c0a720e 100644 --- a/apps/lib/fmt.asm +++ b/apps/lib/fmt.asm @@ -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 diff --git a/apps/lib/stdio.asm b/apps/lib/stdio.asm deleted file mode 100644 index 5423212..0000000 --- a/apps/lib/stdio.asm +++ /dev/null @@ -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 - - diff --git a/apps/shell/glue.asm b/apps/shell/glue.asm index 4fe7e20..43c7493 100644 --- a/apps/shell/glue.asm +++ b/apps/shell/glue.asm @@ -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" diff --git a/apps/shell/gluem.asm b/apps/shell/gluem.asm index 11f1df1..1715d73 100644 --- a/apps/shell/gluem.asm +++ b/apps/shell/gluem.asm @@ -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" diff --git a/tools/tests/unit/test_lib_fmt.asm b/tools/tests/unit/test_lib_fmt.asm index 54a05ff..40e5079 100644 --- a/tools/tests/unit/test_lib_fmt.asm +++ b/tools/tests/unit/test_lib_fmt.asm @@ -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