	.PREL
	.IDENT	MATH
	.INSERT	HVG.LIB
	.INSERT	MACRO.LIB
	.INSERT	BBEQU.ASM
	.RELOC
; BCD MATH ROUTINE INTERFACE
; IMPLEMENTS $+, $-, $*, */
BCDMAT:: RSTIGN
	INX	D
	PUSH	PSW	; SAVE CODE SCANNED
	CALL	TSTVFF#	; GET FIRST	VAR
	PUSH	D
	LXI	D,BCDA1#	; CONVERT TO BCD
	CALL	ASCBCD
	POP	D
	TSTCC	COMMA,BCDDUD	; INSIST ON COMMAS
	CALL	TSTVFF#	; GET 2ND VAR
	POP	PSW
	PUSH	D
	LXI	D,BCDA2#	; SAME STORY
	PUSH	PSW
	CALL	ASCBCD
	LXI	D,BCDA1#
	POP	PSW
	MVI	B,9
	CALL	DOBCDO
	POP	D		; SCAN FOR PLACE TO STORE
	TSTCC	COMMA,BCDDUD
	CALL	TSTVFF#
	PUSH	D
	LXI	D,BCDA1#
; ARG1 CONTAINS THE RESULT - STICK IT LAST VAR
	LXI	B,1200H
BCDASC:	XCHG	
	INDEXN
	ADI	'0'
	XCHG	
	MOV	M,A
	INX	H
	INX	H
	INR	C
	DJNZ	BCDASC
	POP	D
	RSTFIN
BCDDUD:	JMP	QWHAT#
; SUBROUTINE TO IT	1
DOBCDO:	CPI	62H	; < MULT?
	JRNC	BCD3	; NO
	CPI	'-'	; YES IS IT MINUS?
	JRZ	BCD2	; JUMP IF SO
	BCDADD	; NO - ITS ADD THEN
	RET
BCD2:	BCDSUB	; SUBTR	1
	RET
BCD3:	JRNZ	BCD4	; JUMP IF NOT = TIMES
	BCDMUL	; ELSE MULT
	RET
BCD4:	BCDDIV
	RET
; SUBROUTINE TO CONVERT ASCII STRING TO BCD
; HL = ASCII IN, DE=BCD OUT
; OUT:	DE=ASCII IN BUMPED, HL=BCD OUT NOT BUMPED
ASCBCD:	XCHG	
	LXI	B,1200H
ASCBC1:	LDAX	D
	STOREN
	INR	C
	INX	D
	INX	D
	DJNZ	ASCBC1
	RET
; RANDOM NUMBER FUNCTION
RND::	RSTPAR
	MOV	A,H
	ORA	A
	JM	QHOW#
	ORA	L
	JZ	QHOW#
	PUSH	B
	PUSH	D
	PUSH	H	; SAVE RANGE
	CALL	RND32
	POP	D	; GET RANGE BACK
; HL = RANDOM #
	CALL	DIVIDE
	POP	D
	POP	B
	INX	H
	RET
; 32 BIT RANDOM NUMBER GENERATOR FROM TERSE
RND32::
	LBCD	BBRND#
	LXI	H,1321H
	DAD	B
	PUSH	H
	LXI	H,2776H
	DADC	B
	LDED	BBRND#+2
	DAD	D
	XTHL
	DAD	B
	XTHL
	DADC	D
	XTHL
	DAD	B
	XTHL
	DADC	D
	XTHL
	MOV	D,E
	MOV	E,B
	MOV	B,C
	MVI	C,0
	DAD	B
	SHLD	BBRND#
	XTHL
	DADC	D
	SHLD	BBRND#+2
	POP	D
	RET
; ABSOLUTE VALUE FUNCTION
ABS::	RSTPAR
	DCX	D
	CALL	CHKSGN
	INX	D
	RET
; SIZE FUNCTION - RETURNS BYTES NOT YET USED
SIZE::	LHLD	TXTUNF#
	PUSH	D
	XCHG	
	LHLD	HVDFTL#
	ANA	A
	DSBC	D
	POP	D
	RET
; SIGN EXTEND SUBROUTINE
SGNEXT:: MVI	H,0
	MOV	A,L
	ANA	A
	RP	
	DCR	H
	RET
; DIVIDE, SUBDE, CHKSGN, CHGSGN, CKHLDE
DIVIDE:: PUSH	H
	MOV	L,H
	MVI	H,0
	CALL	DV1
	MOV	B,C
	MOV	A,L
	POP	H
	MOV	H,A
DV1:	MVI	C,-1
DV2:	INR	C
	ANA	A
	DSBC	D
	JRNC	DV2
	DAD	D
	RET
CHKSGN:: MOV	A,H
	ORA	A
	RP	
CHGSGN:: MOV	A,H
	ORA	L
	RZ	
	MOV	A,H
	PUSH	PSW
	CMA	
	MOV	H,A
	MOV	A,L
	CMA	
	MOV	L,A
	INX	H
	POP	PSW
	XRA	H
	JP	QHOW#
	MOV	A,B
	XRI	80H
	MOV	B,A
	RET
;CKHLDE:	MOV	A,H
;	XRA	D
;	JP	CK1
;	XCHG	
;CK1:	CALL	COMP
;	RET
;COMP:	MOV	A,H
;	CMP	D
;	RNZ	
;	MOV	A,L
;	CMP	E
;	RET
	.END
                                                 