.comment \

HXDC24 module by ESKAY 08-21-84

HXDC24 converts a 24 bit number in EHL and stores it at (IX)
on exit, IX points to the byte following the 8-digit number,
all other registers are undefined.

This module is in the Public Domain and may be used, improved,
updated and otherwise treated as necessary for any particular
application. This module may be used freely in commercial
programming but may not be sold as an individual component.

There are 4 modes of operation supported, as determined by the contents
of the accumulator on entry:

A = 0	raw conversion with leading zeroes
A = 1	conversion with no leading zeroes
A = 2	conversion with leading zeroes and commas as thousands dividers
A = 3	conversion with no leading zeroes, with commas

	(bits 0 and 1 are used, all others are insignificant)

	Have fun displaying 24-bit numbers!

\
.z80
;
	public	hxdc24
;
hxdc24:	ld	(flag),a	;save the mode flag
	ld	bc,6980h	;-10,000,000
	ld	d,67h
	call	mkdec		;make tens of millions
	ld	bc,0bdc0h	;-1,000,000
	ld	d,0f0h
	call	mkdec		;make millions
	ld	a,(flag)
	bit	0,a		;if commas flag reset...
	jr	z,skc		;then skip commas
	call	putcm		;  else may need a comma
skc:	ld	bc,7960h	;-100,000
	ld	d,0feh
	call	mkdec		;make hundreds of thousands
	ld	bc,-10000
	ld	d,0ffh
	call	mkdec		;make tens of thousands
	ld	bc,-1000
	call	mkdec		;make thousands (D reg is preserved FF)
	ld	a,(flag)
	bit	0,a		;if commas flag reset...
	jr	z,skc1		;then skip commas
	call	putcm		;  else may need a comma
skc1:	ld	bc,-100
	call	mkdec		;make hundreds
	ld	bc,-10
	call	mkdec		;make tens
	ld	bc,-1
	call	mkdec		;make units
;	ret	nz
;	ld	a,'0'
;	call	putcx
	ret
;
mkdec:	ld	iy,-1		;set up counter
mkdecl:	ld	(hltmp),hl	;save intermediate result
	ld	(detmp),de
	inc	iy
	add	hl,bc		;subtract DBC from EHL until carry...
	ld	a,e		;...IY then has the decimal digit
	adc	a,d
	ld	e,a
	jr	c,mkdecl
	ld	hl,(hltmp)	;restore intermediate result
	ld	de,(detmp)
	push	iy		;get IY into BC
	pop	bc
	push	hl		;save HL
	ld	hl,flag		;get flag byte
	ld	a,c		;if digit <> 0...
	or	a
	jr	nz,doput	;...then put it out...
	bit	1,(hl)		;...else if zero suppress...
	jr	nz,nozer	;...then skip
doput:	res	1,(hl)		;once we have a non-zero, suppress flag is off
	add	a,'0'		;make ascii digit
	call	putcx		;put it away at (IX)
nozer:	pop	hl		;restore hl
	ret
;
; conditional comma output
; make comma only if preceded by a digit
;
putcm:	ld	a,(flag)
	bit	1,a		;if flag bit 1 is on...
	ret	nz		;...then leading zeroes being suppressed...
	ld	a,','		;else output comma
;
; store A at (IX) and increment pointer
;
putcx:	ld	(ix+0),a
	inc	ix
	ret
;
hltmp:	dw	0		;temporary storage
detmp:	dw	0
flag:	db	0		;mode flag byte
	end
),hl	;save intermediate result
	