Compucolor.org – Virtual Media

Listing of file='BUFPRO.MAC;03' on disk='vmedia/asm_utility_3-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	UTILITY ROUTINES FOR PROCESSING AN INPUT BUFFER
;
;	NOTE: IN ALL CASES, HL => INPUT BUFFER ON ENTRY
;

;
;	SCAN PAST SPACES AND COMMA FOR DIGIT
;
	ENTRY	SCND

SCND:	INX	H	;IGNORE SPACES
	MOV	A,M	;
	CPI 	' '	;
	JZ	SCND	;
	CPI	','	;IGNORE COMMAS
	JZ	SCND	;
	CALL	DIG	;DIGIT? <C>=YES
	CMC		; <NC>=YES
	RET

;
;	CHECK FOR A LETTER
;
	ENTRY	LET

LET:	MOV	A,M	;GET CHAR
	CPI	'Z'+1	;IS IT A LETTER?
	RNC		;NO!
	CPI	'A'	;CHECK OTHER END
	CMC		;SET <C> CORRECTLY
	RET		;RETURN <C> IF LETTER

;
;	CHECK FOR A LETTER OR A DIGIT
;
	ENTRY	LODG

LODG:	CALL	LET	;IS IT A LETTER?
	RC		;YES!

;	CHECK FOR A DIGIT

	ENTRY	DIG

DIG:	MOV	A,M	;GET CHAR
	CPI	'9'+1	;IS IT A DIGIT?
	RNC		;NO!
	CPI	'0'	;CHECK OTHER END
	CMC		;SET <C> CORRECTLY
	RET		;RETURN <C> IF DIGIT

;
;	GETS VALUE FROM BUFFER TO <A>
;
	ENTRY	GVAL

GVAL:	MVI	B,0	;CLEAR <B>
	CALL	G01	;GET SUM IN <B>
	MOV	A,B	;TO <A>
	STC		;SET CARRY
	CMC		;SET <NC> FOR ERROR
	RET

G01:	MOV	A,M	;GET DIGIT
	SUI	'0'	;CHECK IF 0-9
	RC		;NO
	CPI	'9'+1
	RNC		;NO
	MOV	M,A	;BACK TO MEM
	MOV	A,B	;GET CURRENT SUM
	RLC		;   *2
	RLC		;   *4
	ADD	B	;   *5
	RLC		;   *10 FOR SUM
	ADD	M	;ADD DIGIT
	MOV	B,A	;SAVE IN B
	INX	H	;POINT TO NEXT DIGIT
	JMP	G01

	END