; *** Requirements *** ; stdioPutC ; divide ; ; Same as fmtDecimal, but DE is considered a signed number fmtDecimalS: bit 7, d jr z, fmtDecimal ; unset, not negative ; Invert DE. spit '-', unset bit, then call fmtDecimal push de ld a, '-' ld (hl), a inc hl ld a, d cpl ld d, a ld a, e cpl ld e, a inc de call fmtDecimal dec hl pop de ret ; Format the number in DE into the string at (HL) in a decimal form. ; Null-terminated. DE is considered an unsigned number. fmtDecimal: push ix push hl push de push af push hl \ pop ix ex de, hl ; orig number now in HL ld e, 0 .loop1: call .div10 push hl ; push remainder. --> lvl E inc e ld a, b ; result 0? or c push bc \ pop hl jr nz, .loop1 ; not zero, continue ; We now have C digits to print in the stack. ; Spit them! push ix \ pop hl ; restore orig HL. ld b, e .loop2: pop de ; <-- lvl E ld a, '0' add a, e ld (hl), a inc hl djnz .loop2 ; null terminate xor a ld (hl), a pop af pop de pop hl pop ix ret .div10: push de ld de, 0x000a 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