Compucolor.org – Virtual Media

Listing of file='DECIN.MAC;02' on disk='vmedia/asm_utilities_macros-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	SCAN INPUT BUFFER FOR DIGITS
;
;	IGNORES SPACES AND COMMAS
;
	ENTRY	SCND

;	VALUES ON ENTRY:
;	   HL => INPUT BUFFER
;
;	RETURNS:
;	   <C> SET IF DIGIT FOUND
;
;	DESTROYS:
;	   A REG.
;	   HL INCREMENTED TO POINT TO FIRST NON-SPACE
;


SCND:	INX	H
	MOV	A,M
	CPI	' '		;IGNORE SPACES
	JZ	SCND
	CPI	','		;IGNORE COMMAS
	JZ	SCND
	CALL	DIG		;<C> SET IF DIGIT
	RET


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	CHECK FOR A DIGIT
;
	ENTRY	DIG

;	VALUES ON ENTRY:
;	   HL => POINTS TO BYTE TO TEST
;
;	RETURNS:
;	   <C> SET IF A DIGIT
;
;	DESTROYS:
;	   A REG.
;

DIG:	MOV	A,M
	CPI	'9'+1
	RNC
	CPI	'0'
	CMC
	RET


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	GET AN UNSIGNED DECIMAL VALUE FROM INPUT BUFFER
;
	ENTRY	DECIN

;	VALUES ON ENTRY:
;	   HL => INPUT BUFFER
;
;	RETURNS:
;	   DECIMAL VALUE (0-255) IN A REGISTER (AND B REG.)
;	   RETURNS A VALUE OF ZERO IF NO VALID DIGITS FOUND.
;
;	DESTROYS:
;	   A,B,C REGS.
;	   HL INCREMENTED TO POINT TO FIRST NON-DIGIT
;

DECIN:	MVI	B,0	;SETUP AS ZERO INITIALLY

DECIN1:	CALL	DIG	;CHECK FOR DIGIT
	JNC	DECIN2
	SUI	'0'
	MOV	C,A	;PUT NEW DIGIT IN C
	MOV	A,B
	RLC		;MULTIPLY PARTIAL RESULT BY 10
	RLC
	ADD	B
	RLC
	ADD	C	;ADD IN NEW DIGIT ...
	MOV	B,A	;... AND SAVE RESULT IN B
	INX	H
	JMP	DECIN1	;REPEAT - EXCESS DIGITS FALL OUT TOP

DECIN2:	MOV	A,B
	RET

	END