	.PREL
	.IDENT	VARS
	.INSERT	HVG.LIB
	.INSERT	MACRO.LIB
	.INSERT	BBEQU.ASM
	.RELOC
; DEVICE VARIABLE TABLE
PARNUM	==	21	; 21 GUYS
INIDEV:: .WORD	7
	.WORD	0A5H
	.WORD	5BH
	.WORD	8
	.WORD	80	; WINDOW XR
	.WORD	-79	; WINDOW XL
	.WORD	51	; WINDOW YT
	.WORD	-50	; WINDOW YB
	.WORD	1
; CHAR STUFF FOLLOWS
	.WORD	-79
	.WORD	51
	.WORD	7	; COLOR
	.WORD	0	; LAST CHAR
	.WORD	SMLFNT#	; SMALL FONT
	.WORD	80	; CHAR WINDOW XR
	.WORD	-79	; XL
	.WORD	51	; YT
	.WORD	-50	; YB
	.WORD	10	; NUMBER BASE
	.WORD	0
	.WORD	0
; DEVICE VARIABLE LOOKUP TABLE - IN INVERSE ORDER IN MEMORY
DEVLST:	
	.BYTE	'R'-'@'
	.BYTE	'M'
	.BYTE	'X'-'@'
	.BYTE	'Y'
	.BYTE	'N'-'@'
	.BYTE	'B'
	.BYTE	'C'-'@'
	.BYTE	'B'
	.BYTE	'C'-'@'
	.BYTE	'T'
	.BYTE	'C'-'@'
	.BYTE	'L'
	.BYTE	'C'-'@'
	.BYTE	'R'
	.BYTE	'C'-'@'
	.BYTE	'F'
	.BYTE	'L'-'@'
	.BYTE	'C'
	.BYTE	'C'-'@'
	.BYTE	'C'
	.BYTE	'C'-'@'
	.BYTE	'Y'
	.BYTE	'C'-'@'
	.BYTE	'X'
	.BYTE	'N'-'@'
	.BYTE	'T'
	.BYTE	'Y'-'@'
	.BYTE	'B'
	.BYTE	'Y'-'@'
	.BYTE	'T'
	.BYTE	'X'-'@'
	.BYTE	'L'
	.BYTE	'X'-'@'
	.BYTE	'R'
	.BYTE	'F'-'@'
	.BYTE	'C'
	.BYTE	'F'-'@'
	.BYTE	'B'
	.BYTE	'F'-'@'
	.BYTE	'A'
	.BYTE	'B'-'@'
	.BYTE	'C'
; SET ALL SYSTEM VARS TO DEFAULT VALUES
RSETDV:: PUSH	D
	LXI	H,INIDEV
	LXI	D,DEVVAR#
	LXI	B,PARNUM*2
	LDIR
	POP	D
	RSTFIN
; ZERO OUT ALL THE VARIABLES
VARZRO::
	LXI	H,VARBGN#
	MVI	B,52
	XRA	A
..ZROL:	MOV	M,A
	INX	H
	DJNZ	..ZROL
	RSTFIN
; ROUTINE TO RETURN ADDRESSED BYTE OF EXPRESSION
BYTEFUN::
	TSTC	'(',BYTDUD
	RSTEXP	; GET EXPR
	PUSH	H	; SAVE HER
	TSTCC	COMMA,BYTDUD
	RSTEXP
	TSTC	')',BYTDUD
	MOV	A,L
	POP	H
	ANI	1
	JRZ	..NERD
	MOV	L,H
..NERD:	MVI	H,0
	RET
; ROUTINE TO SET INDICATED BYTE
BYTEVAR::
	TSTC	'(',BYTDUD
	CALL	TSTVFF
	PUSH	H
	TSTCC	COMMA,BYTDUD
	RSTEXP
	PUSH	H
	TSTC	')',BYTDUD
	TSTC	'=',BYTDUD
	RSTEXP
	MOV	A,L	; A=VAL TO STORE
	POP	B	; B=WHICH ONE
	POP	H	; HL=STORE ADDR
	DAD	B	; HL=DISPLACED STORE ADDR
	MOV	M,A	; DO IT
	RSTFIN
BYTDUD:	JMP	QWHAT#
; DATA INITIALIZER
; 10 DATA @(0),37,2,47,...
INIDAT:: CALL	TSTVFF
..IND1:	LDAX	D	; AT NEWLINE YET?
	CALL	ATNL#
	JRZ	..DONE
	TSTCC	COMMA,PUTIO2	; KICKOUT IF NO COMMA
	PUSH	H	; SAVE STORAGE PTR
	RSTEXP	; GET NEXT VALUE
	XCHG		; SCAN PTR TO HL
	XTHL		; HL=STORE,STK=SCAN
	MOV	M,E	; STUFF THE VALUE
	INX	H
	MOV	M,D
	INX	H
	POP	D	; GET SCAN POINTER BACK
	JMPR	..IND1	; AND LOOP TILL END
..DONE:	RSTFIN
; FUNCTION TO RETURN ADDRESS OF VARIABLE FOLLOWING
RETADR:: PUSH	B
	CALL	TSTVFF
	POP	B
	RET
; DEVICE VARIABLE TO OUTPUT TO REFERENCED IO PORT
PUTIO::	RSTPAR	; GET PORT #
	TSTC    '=',PUTIO2	; GET EQUALS
	PUSH	H	; SAVE PORT #
	RSTEXP	; EVALUATE EXPRESSION FOLLOWING
	MOV	A,L	; A=VALUE TO OUTPUT
	POP	H	; RESTORE PORT #
	PUSH	B
	MOV	B,H
	MOV	C,L
	OUTP	A	; IT	1
	POP	B
BBRET:	RSTFIN	; GO HOME
PUTIO2:	JMP	QWHAT#
; FUNCTION TO RETURN VALUE OF A GIVEN IO PORT
IOFUN::	RSTPAR	; GET PORT NUMBA
	PUSH	B
	MOV	B,H
	MOV	C,L
	INP	A
	MOV	L,A
	MVI	H,0
	POP	B
	RET
; ROUTINE TO TRANSFER CONTROL TO ASSEMBLY LANGUAGE SUBROUTINE
DOCALL:: LXI	H,BBRET	; PUSH RETURN ADDR ON STACK
	PUSH	H
	RSTEXP	; GET ADDRESS
	PCHL		; AND JUMP TO IT
; FUNCTION TO SENSE DIAL VALUE
GETPOT:: MVI	A,1BH
	CALL	CHKRNG	; GET DATA
	CMA	
	SUI	80H
	MOV	L,A
	JMP	SGNEXT#
; FUNCTION TO SENSE STATE OF TRIGGER
GETTRG:: CALL	CHKRN1
	ANI	10H
	RZ	
	INR	L
	RET
; FUNCTIONS TO RETURN JOYSTICK VALUE
; THESE FUNCTIONS RETURN EITHER +1, ,0  OR -1, DEPENDING
; ON JOYSTICK STATE
GETJX::	CALL	CHKRN1	; PARM IN RANGE?
	RRC
	RRC
	RRC
	JRC	GETJY3
	RRC
	JRC	GETJY1
	RET
; ENTRY FOR Y JOYSTICK VALUE
GETJY::	CALL	CHKRN1
	RRC
	JRNC	GETJY2
GETJY1:	INX	H
	RET
GETJY2:	RRC
	RNC	
GETJY3:	DCX	H
	RET
; SUBROUTINE TO GET PARAMETER BETWEEN 1 AND 4
CHKRN1:	MVI	A,0FH
CHKRNG:	PUSH	B
	PUSH	PSW
	RSTPAR
	POP	PSW
	ADD	L
	MOV	C,A
	INP	A
	POP	B
	LXI	H,0
	RET
; SETVAL, FIN, AND ERROR
SETVAL:: CALL	TSTVFF
	TSTC	'=',SVWHAT
SETV1::	PUSH	H
	RSTEXP
	MOV	B,H
	MOV	C,L
	POP	H
	PUSH	PSW
	MOV	A,C
	MOV	M,A
	INX	H
	MOV	A,B
	MOV	M,A
	POP	PSW
	RET
; SUBROUTINE TO GET A VARIABLE MAKING SURE IT IS ONE
TSTVFF:: CALL	TSTV
	RNC
SVWHAT:	JMP	QWHAT#
TSTV:: RSTIGN
	CPI	'%'	; PEEK-POKE?
	JRZ	TSTV0
	SUI	'@'
	RC	
	JRNZ	TV1
	INX	D
	RSTPAR
	DAD	H
	JC	QHOW#
TSTB:	PUSH	D
	XCHG	
	CALL	SIZE#
	CALL	COMP#
	JC	ASORRY#
	LHLD	TXTUNF#
	INX	H
	INX	H
	DAD	D
	POP	D
	ANA	A
	RET
; %(ADDR) PEEK-POKE CALL	
TSTV0:	INX	D
	RSTPAR	; GET ADDR
	XRA	A	; CLEAR CY
	RET	; AND GO BACK
TV1:	CALL	HKTSTV#
	CPI	27
	CMC	
	RC	
	INX	D
; IS SECOND CHARACTER ALSO ALPHA?
	MOV	L,A	; SAVE FIRST	ONE
	LDAX	D
	CPI	'A'
	JRC	DEVV4	; IF NOT IN RANGE A-Z
	CPI	'Z'+1
	JRNC	DEVV4	; THEN SEARCH
	PUSH	B
	PUSH	D
	MOV	H,A	; SECOND CHAR TO H
	MVI	B,PARNUM	; B - ITERATION CTR
	LXI	D,DEVLST	; DE - SEARCH TABLE
DEVV1:	LDAX	D	; GET FIRST	ENTRY
	INX	D
	CMP	L
	LDAX	D
	INX	D
	JRNZ	DEVV2
	CMP	H
	JRNZ	DEVV2
; MATCH FOUND - FIGURE OUT LOOKUP INDEX
	MOV	A,B
	ADI	26
	MOV	L,A
	POP	D
	INX	D	; BUMP CHAR PTR
	JMPR	DEVV3
; MISMATCH - LOOP BACK IF POSS
DEVV2:	DJNZ	DEVV1
; NOT POSSIBLE - RETURN NOT A VAR
	POP	D
	POP	B
	DCX	D	; BACKUP TO CHAR START
	STC		; SET CARRY
	RET
DEVV3:	POP	B
DEVV4:	MOV	A,L
	LXI	H,VARBGN#-2
	RLC	
	ADD	L
	MOV	L,A
	MVI	A,0
	ADC	H
	MOV	H,A
	ANA	A
	RET
	.END
                                              