.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