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