Compucolor.org – Virtual Media

Listing of file='DPB2D.MAC;05' on disk='vmedia/asm_utility_routines-sideB-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	DPB2D - DOUBLE PRECISION BINARY TO DECIMAL
;
	TITLE	DPB2D
;
;	VALUES ON ENTRY:
;	   A  - FLAG TO SUPPRESS LEADING ZEROS
;		A  = 0  LEAVE ZEROS ALONE
;		A <> 0  BLANK OUT LEADING ZEROS
;	   DE - NUMBER TO BE CONVERTED (0-65535)
;	   HL - POINTER TO MEMORY BUFFER FOR CHR STRING
;
;	RETURNS:
;	   NOTHING IN REGISTERS, CHARACTER STRING IN MEMORY
;
;	DESTROYS:
;	   A,BC,DE (ONLY HL IS PRESERVED)
;

	ENTRY	DPB2D

DPB2D:	PUSH	PSW
	PUSH	H
	MVI	C,5		;FILL BUFFER WITH ZEROS
SETTO0:	MVI	M,'0'
	INX	H
	DCR	C
	JNZ	SETTO0
	POP	H
	PUSH	H
	LXI	B,-10000	;GET TEN THOUSANDS DIGIT
	CALL	DIGIT
	LXI	B,-1000		;   AND THOUSANDS ...
	CALL	DIGIT
	LXI	B,-100		;   AND HUNDREDS ...
	CALL	DIGIT
	LXI	B,-10		;   AND TENS ...
	CALL	DIGIT
	MVI	A,'0'
	ADD	E		;   AND ONLY UNITS LEFT
	MOV	M,A
	POP	H
	POP	PSW		;CHECK ZERO SUPPRESS FLAG
	ORA	A
	RZ			;RETURN IF NO SUPPRESSION

	PUSH	H
	MVI	C,4		;BLANK OUT LEADING ZEROS,
CHK0:	MOV	A,M		;   TAKING CARE TO LEAVE
	CPI	'0'		;   AT LEAST ONE ZERO
	JNZ	FIN
	MVI	M,' '
	INX	H
	DCR	C
	JNZ	CHK0
FIN:	POP	H
	RET


;
;	DETERMINE A DIGIT OF THE NUMBER
;

DIGIT:	PUSH	H
	XCHG
	DAD	B		;SUBTRACT VALUE
	JNC	ADDIT		;GONE TO FAR, ADD IT BACK IN
	XCHG
	POP	H
	INR	M		;INCREMENT ASCII DIGIT
	JMP	DIGIT

ADDIT:	MOV	A,C		;TAKE TWO'S COMPLEMENT
	CMA
	MOV	E,A
	MOV	A,B
	CMA
	MOV	D,A
	INX	D
	DAD	D		;ADD IT TO PARTIAL RESULT
	XCHG
	POP	H
	INX	H		;MOVE TO NEXT BYTE IN MEMORY
	RET

	END