; *** 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