; ;INTERRUPT HANDLERS & EXECUTIVE MODULE ; COPYRIGHT 1976 D. KRUGLINSKI ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SYSTEM LINKAGES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ESTRT EQU 300H ;LOAD ADDRESS TADR EQU 42H ;ADDRESS OF # TASKS ; FOLLOWED BY DISPATCH TABLE KINTA EQU 10H ;KBRD INT ADDR CINTA EQU 18H ;RTC INT ADDR KINTC EQU 0FFC1H ;KBRD INT CONROL ADDR KDCOD EQU 44H ;KEYBOARD DECODER ADDR TIME EQU 3FH ORG KINTA ;KEYBOARD INTERRUPT JMP KBENT ;HANDLER ADDR ORG CINTA ;RTC INTERRUPT JMP CENT ;CLOCK HANDLER ORG TIME DB 0 ORG KDCOD DW KBDCD ;DUMMY KB DECODER ORG ESTRT ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; HANDLER FOR REAL-TIME CLOCK OR 'EXEC' COMMAND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CENT: PUSH PSW PUSH H ;SAVE ALL REGS LXI H,TIME INR M ;INCREMENT TIME LXI H,TIME-1 MVI A,1 CMP M JZ CENTX MOV M,A PUSH B PUSH D EI ;ENABLE INTERRUPT JMP EXECU ;GO TO EXECUTIVE CENTX: POP H ;RESTORE REGS POP PSW EI RET ;RETURN TO GRAPHICS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; HANDLER FOR KEYBOARD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KBENT: PUSH PSW PUSH B PUSH D PUSH H LDA KINTC ;REAC CHAR/CLEAR EI LXI H,HRTN PUSH H ;SAVE RETURN ADDR LHLD KDCOD ;KEYBOARD DECODER PCHL ;SIMULATED 'CALL' HRTN: POP H POP D POP B POP PSW RET ;RTNNTERRUPTED PGM ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; EXECUTIVE -- SCANS DISPATCH TABLE, DISPATCHES ; PROGRAM WITH OBJECT BLOCK WHEN TIMES MATCH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EXECU: LXI H,TIME MOV B,M ;SAVE TIME IN B LHLD TADR ;# OF TASKS MOV C,M INX H ;TOP OF DISPATCH TABLE LXI D,5 ELOOP: MOV A,M ANA B ;MASK TIME FOR TASK INX H CMP M ;COMPARE OBJECT TIME JNZ NOTEQ ;DISPATCH IF EQUAL PUSH B ;SAVE BC (TIME & #) INX H MOV C,M INX H MOV B,M ;OBJECT BLOCK ADDR IN BC INX H MOV E,M INX H MOV D,M ;PROGRAM ADDR IN DE INX H PUSH H ;SAVE HL (POINTER IN LIST) LXI H,ERTN PUSH H ;SAVE RETURN ADDRESS XCHG ;PROGRAM ADDRESS IN HL PCHL ;JUMP TO PROGRAM (CALL) ERTN: POP H ;RESTORE POINTER POP B ;RESTORE BC LXI D,5 JMP ENDL ;CONTINUE SCANNING TABLE NOTEQ: DAD D ;HL=HL+5 ENDL: DCR C ;DECREMENT TASK CNT JNZ ELOOP ;TEST NEXT TASK LXI H,TIME-1 MVI M,0 POP D POP B POP H POP PSW RET ;RETURN TO HANDLER ; ;SPACE WAR APPLICATIONS MODULE ; COPYRIGHT 1976 D. KRUGLINSKI ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; IMPORTANT CONSTANTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ASTRT EQU 500H ;LOAD ADDRESS BADR1 EQU 0FFFEH ;BUTTON READ ADDRESS SUN EQU 7 ;COLLISION RAD OF SUN INTVL EQU 18H ;DURATION OF EXPLOSION EPSLN EQU 8H ;COLLSIION RAD OF TORPEDOS ACON EQU 8 ;ACCELERATION CONSTANT RMAX EQU 12 ;TORPEDO TIMEOUT VCON EQU 300H ;TORPEDO RELATIVE VELOCITY HDLY EQU 20H ;HYPERSPACE EXIT DELAY LIMIT EQU 7AH ;SCREEN EDGE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; MACROS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; GRAPHICS MACROS MBEAM MACRO X,Y DB 0 DB X DB Y ENDM ; MDISP MACRO X,Y DB 2 DB X DB Y ENDM ; LVEC MACRO X,Y DB 4 DB X DB Y ENDM ; SVEC MACRO DB 6 ENDM SV MACRO LEN,DIR DB DIR OR (LEN SHL 4) ENDM SVF MACRO LEN,DIR DB DIR OR (LEN SHL 4) OR 8H ENDM SVE MACRO LEN,DIR DB DIR OR (LEN SHL 4) OR 80H ENDM SVEF MACRO LEN,DIR DB DIR OR (LEN SHL 4) OR 88H ENDM ; PARAM MACRO SCL,ORN DB 8 DB ORN OR (SCL SHL 4) ENDM ; JUMP MACRO ADDR DB 0AH DW ADDR ENDM ; JUMPS MACRO ADDR DB 0CH DW ADDR ENDM ; RETS MACRO DB 0EH ENDM ; EXEC MACRO DB 10H ENDM ; ; ENTRY MACRO FOR DISPATCH TABLE ENTRY MACRO MASK,TIME,OBJ,PROG DB MASK DB TIME DW OBJ DW PROG ENDM ; ; SYSTEM CALL MACRO SCALL MACRO MODN RST 7 DB MODN ENDM ; ; MACRO TO CREATE 12-BYTE COORDINATE BLK COORD MACRO XN,XM,XAC,YN,YM,YAC DW XN DW XM DW XAC DW YN DW YM DW YAC ENDM ; ; MACRO TO LOAD REG INDEXED (BC=BASE) ; DESTROYS HL LOADX MACRO REG,OFSET LXI H,OFSET DAD B MOV REG,M ENDM ; ; MACRO TO STORE REG INDEXED (BC=BASE) ; DESTROYS HL STORX MACRO REG,OFSET LXI H,OFSET DAD B MOV M,REG ENDM ; ; MACRO TO LOAD 2 BYTES FROM OFSET ; INTO HL (BC=BASE ADDR) LDBLX MACRO OFSET PUSH D LXI H,OFSET DAD B MOV E,M INX H MOV D,M XCHG POP D ENDM ; ; MACRO TO STORE 2 BYTES IN OFSET ; FROM HL (BC=BASE ADDR) SDBLX MACRO OFSET PUSH D XCHG LXI H,OFSET DAD B MOV M,E INX H MOV M,D POP D ENDM ; ;MACRO TO TAKE ABSOLUTE VALUE OF A ABS MACRO CPI 0 JP POS ;JUMP IF A POS CMA ;COMPLEMENT A POS: ENDM ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; LINKAGE BETWEEN SYSTEM AND APPLICATION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TIME EQU 3FH NUMS EQU 46H ORG 40H DW START ;DISPLAY FILE ORG 42H DW NTSK ;# TASKS + LIST ORG 44H DW KBDCD ;KEYBOARD DECODE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DISPATCH TABLE + NUMBER OF OBJECTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG ASTRT NTSK: DB 14 ;# TASKS ; DISPATCH TABLE IENT1: ENTRY 0,0,SH1,INIT IENT2: ENTRY 0,0,SH2,INIT PENT1: ENTRY 0,1,SH1,SSTRT PENT2: ENTRY 0,1,SH2,SSTRT ENTRY 0,0,SH1,SFLY ENTRY 0,0,SH2,SFLY ENTRY 0,0,BU1,BFLY ENTRY 0,0,BU2,BFLY GENT1: ENTRY 0,1,SH1,FIRE GENT2: ENTRY 0,1,SH2,FIRE ENTRY 0FH,0,SC1,SCORE ENTRY 0FH,8,SC2,SCORE ENTRY 7H,2,SH1,ROT ENTRY 7H,6,SH2,ROT ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; OBJECT BLOCKS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; SHIP OBJECT BLOCKS SH1: COORD 0,0,0,0,0,0 ;DYNAMIC COORDS DW PPOS1 ;PNTR TO MBEAM INSTR ; START POSTN COORD -6F00H,-7000H,0,6000H,6000H,0 DW BU1 ;PNTR TO TORPEDO DW PEXH1+1 ;CALL EXHAUST/ZERO DW SHIP1 ;SHIP SUB DW PSUB1+1 ;CALL SHIP/EXPLO DW PDIR1+1 ;SHIP ORENT DW PENT1 ;BACK POINTER DW GENT1 ;FIRE ENTRY DW SC1 ;SCORE DB 01H ;ACC BUTTON MASK DB 02H ;FIRE MASK DB 04H ;CW MASK DB 08H ;CCW MASK DB 0 ;INHIBIT FIRE DB 0 ;ORIENTATION DW BADR1 ;BUTTON ADDRESS DB 0CH ;HYPERSPACE MASK DB 0 ;HYPERSPACE FLAG DB 0 ;INITIAL ORIENTATION DW IENT1 ;BACK PNTR TO INIT PGM SH2: COORD 0,0,0,0,0,0 DW PPOS2 COORD 6F00H,7000H,0,-6000H,-6000H,0 DW BU2 DW PEXH2+1 DW SHIP2 DW PSUB2+1 DW PDIR2+1 DW PENT2 DW GENT2 DW SC2 DB 10H DB 20H DB 40H DB 80H DB 0 DB 0 DW BADR1 DB 0C0H DB 0 DB 4 DW IENT2 ; TORPEDO OBJECT BLOCKS BU1: COORD 0,0,0,0,0,0 ;DYN COORDS DW BPOS1 ;PNTR TO MDISP INSTR DW BU2 ;PNTR TO NEXT TORPEDO DB 0 ;COUNTDOWN SINCE FIRING BU2: COORD 0,0,0,0,0,0 DW BPOS2 DW 0 DB 0 ; SCORE OBJECT BLOCKS SC1: DB 0 ;BINARY SCORE VAL DW SC11+1 ;1ST DIGIT DW SC12+1 ;2ND DIGIT SC2: DB 0 DW SC21+1 DW SC22+1 ; WORKING STORAGE LOCATION ORSAV: DW 0 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DISPLAY FILE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; START: EXEC MBEAM 80H,80H ;SUN PARAM 0,0 JUMPS SUNSB PPOS1: MBEAM 0,0E0H PDIR1: PARAM 1,0 PEXH1: JUMPS NULL PSUB1: JUMPS SHIP1 PPOS2: MBEAM 0,0C0H PDIR2: PARAM 1,0 PEXH2: JUMPS NULL PSUB2: JUMPS SHIP2 BPOS1: MBEAM 0,0 BPOS2: MBEAM 0,0 PARAM 1,0 MBEAM 1,1 SC11: JUMPS NULL SC12: JUMPS NULL MBEAM 0D0H,1 SC21: JUMPS NULL SC22: JUMPS NULL JUMP START ; SUNSB: SVEC SVF 6,0 SV 3,2 SV 3,3 SV 6,4 SV 3,5 SV 6,6 SV 3,7 SV 6,0 SV 3,1 SVE 3,2 RETS ; SHIP1: SVEC SVF 3,0 SV 2,5 SV 4,4 SV 2,2 SVF 2,6 SVF 4,0 SVF 2,1 SV 2,3 SV 4,4 SVE 2,6 RETS SHIP2: SVEC SV 3,0 SV 2,5 SV 4,4 SV 2,2 SVF 2,6 SVF 4,0 SVF 2,1 SV 2,3 SV 4,4 SVE 2,6 RETS EXPLO: PARAM 2,0 SVEC SVF 3,0 SV 6,4 SVF 3,2 SV 6,7 SVF 3,4 SV 6,2 SVF 3,0 SVE 6,5 RETS NULL: RETS EXHST: SVEC SV 7,4 SVEF 7,0 RETS ; ; *********** PROGRAMS ************* ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; INITIALIZATION PROGRAM ; SCHEDULED AT START & BY CTL C ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SCPNT SET 28H IEPNT SET 35H PEPNT SET 24H INIT: LDBLX SCPNT ;GET SCORE ADDR MVI M,0 ;ZERO SCORE LDBLX PEPNT ;GET ADDR OF SHIP ST INX H ;TIME MVI M,0 ;SCHED SHIP START LDBLX IEPNT ;ADDR OF INIT ENTRY INX H MVI M,1 ;DESCHED SELF RET ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SHIP START PROGRAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DC SET 0 STCRD SET 0EH FBPNT SET 1AH EXPNT SET 1CH PLPNT SET 1EH PCPNT SET 20H PDPNT SET 22H ORENT SET 2FH HFLAG SET 33H ;HYPERSPACE FLAG IORNT SET 34H ;INITIAL ORIENTATION ; SELECT ACCORDING TO HFLAG SSTRT: LOADX A,HFLAG CPI 0 JNZ HYPR ; CASE--H=0--NORMAL START--NOT HYPERSPACE CALL STRT ;SHIP INST, DESCHED CALL BEGIN ;ORENT=0,START POS RET HYPR: JM HDEST ; CASE--H=1--HYPERSPACE RETURN--NO DESTROY CALL STRT CALL HCORD ;RANDOM COORDINATES RET ; CASE--H=-1--HYPERSPACE RETURN--DESTROY HDEST: CALL DSTRY CALL HCORD ;RAND COORDS RET ; ENDSELECT ; STRT: LDBLX PLPNT ;NORMAL START XCHG ;SHIP SUB ADDR IN DE LDBLX PCPNT ;CALL ADDR IN HL MOV M,E ;SHIP SUB -> CALL INX H MOV M,D LDBLX PEPNT ;ENTRY ADDR MVI M,0 ;MASK INX H MVI M,1 ;DESCHED SELF RET ; BEGIN: LOADX A,IORNT ;SET ORIENTATION STORX A,ORENT LXI H,STCRD ;START COORD DAD B ; ADDR IN HL MVI D,12 ;12 BYTES TO MOVE PXLOP: MOV A,M ; FROM START COORDS STAX B ; TO DYN COORDS INX H INX B DCR D JNZ PXLOP RET ; HCORD: SCALL 2 ;RANDOM BYTE IN A STORX A,XN+1 ;H.O. X COORD STORX A,XNM+1 SCALL 2 STORX A,YN+1 ;H.O. Y COORD STORX A,YNM+1 SCALL 2 STORX A,XN ;L.O. X (VELOCITY) SCALL 2 STORX A,XNM SCALL 2 STORX A,YN ;L.O. Y SCALL 2 STORX A,YNM MVI A,0 ;ZERO HYPERSPACE FLAG STORX A,HFLAG RET ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SHIP FLY PROGRAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; XN SET 0H YN SET 6H XNM SET 2H YNM SET 8H XACC SET 04H YACC SET 0AH INPNT SET 0CH NBPNT SET 0EH RCNT SET 10H ;TORPEDO TIMEOUT FIPNT SET 26H ACCM SET 2AH FIREM SET 2BH CWM SET 2CH CCWM SET 2DH HYPM SET 32H ;HYPERSPACE MASK FINH SET 2EH BAPNT SET 30H ACON1 EQU (5*ACON)/7 SFLY: SCALL 0 ;MOVE SHIP/EXPLO SCALL 1 ;ACCELERATE ; TEST BUTTONS ONLY IF NOT IN HYPERSPACE LOADX A,HFLAG CPI 0 RNZ ; CHECK IF ACC BUTTON ON LDBLX BAPNT ;BUTTON ADDR MOV D,M ;BUTTON WORD LOADX A,ACCM ;ACC MASK ANA D LXI D,NULL ;NO EXHAUST JZ XHST ;NO ACCELERATION MVI D,0 LOADX E,ORENT LXI H,XATAB DAD D DAD D ;X ACC ADDR FOR ORENT MOV E,M ;XACC L.O. INX H MOV D,M ;XACC H.O. LDBLX XACC ;ADD TO ORIGINAL DAD D SDBLX XACC ; SAME LOGIC FOR YACC MVI D,0 LOADX E,ORENT LXI H,YATAB DAD D DAD D MOV E,M INX H MOV D,M LDBLX YACC DAD D SDBLX YACC LXI D,EXHST ;EXHAUST XHST: LDBLX EXPNT ;INSERT EXHAUST/ZERO MOV M,E ;IN DISPLAY FILE INX H MOV M,D ; TEST IF X NEAR EDGE ETST: LOADX A,XN+1 ABS CPI LIMIT CP SWAPX ;YES ; TEST IF Y NEAR EDGE LOADX A,YN+1 ABS CPI LIMIT CP SWAPY ;YES ; SHIP HIT SUN? LOADX A,XN+1 ABS CPI SUN ;H.O. X < SUN RADIUS JP BTST LOADX A,YN+1 ABS CPI SUN ;H.O. Y < SUN RADIUS JP BTST CALL DSTRY RET ; TEST FOR CLOSE TORPEDOS BTST: LOADX D,DC+1 ;HO X POS OF SHIP LOADX E,DC+7 ;HO Y POS OF SHIP PUSH B ;SAVE SHIP BLK PNTR LXI H,BU1 ;FIRST TORPEDO BLK PNTR FLOOP: MOV B,H ;HL ->BC MOV C,L LOADX A,RCNT ;TORPEDO CLAIMED? CPI 0 ;TEST FOR ZERO JZ NXBUL ;NEXT TORPEDO NRTST: LOADX A,DC+1 ;HO X POS OF TORPEDO SUB D ABS CPI EPSLN JP NXBUL ;NOT CLOSE ENOUGH LOADX A,DC+7 ;HO Y POS OF TORPEDO SUB E ;SUBT SHIP POS ABS CPI EPSLN JM HIT ;BOTH CLOSE ENOUGH NXBUL: LDBLX NBPNT ;NEXT TORPEDO PNTR SUB A ;ZERO A CMP H ;CHECK OF H 0 JNZ FLOOP ;NO CMP L JNZ FLOOP ;L NOT 0 POP B ;SANE STACK RET ;BOTH H&L ZERO HIT: LDBLX INPNT ;TORPEDO POSTION MVI M,0 ;MBEAM INSTR (BLANK) MVI A,0 ;RELEASE TORPEDO STORX A,RCNT POP B ;RESTORE SHIP BLK CALL DSTRY RET ; SUBROUTINE TO INCREMENT SCORE, SCHED ; SHIP START AND REPLACE SHIP WITH EXPLOSION ; ALSO USED IN HYPERSPACE PROCESSING DSTRY: LDBLX SCPNT ;RESTORE SCORE ADDR MOV A,M ;INCREMENT SCORE INR A DAA MOV M,A ; SCHED SHIP START LDBLX PEPNT ;SHIP ENTRY ADDR MVI M,-1 ;MASK = -1 LDA TIME ADI INTVL INX H MOV M,A ;TIME+INTVAL TO PL ST ; REPLACE SHIP WITH EXPLOSION LXI D,EXPLO ;EXPLO SUB LDBLX PCPNT ;SUB CALL MOV M,E INX H MOV M,D RET ; SWAPX: LDBLX XN ;SWAP X COORDS XCHG LDBLX XNM SDBLX XN XCHG SDBLX XNM RET ; SWAPY: LDBLX YN ;SWAP Y COORDS XCHG LDBLX YNM SDBLX YN XCHG SDBLX YNM RET ; ; ACCELERATION TABLE XATAB: DW 0 DW ACON1 YATAB: DW ACON DW ACON1 DW 0 DW -ACON1 DW -ACON DW -ACON1 DW 0 DW ACON1 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; TORPEDO FLY PROGRAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BFLY: SCALL 1 ;ACCELERATION LOOKUP SCALL 0 ;MOVE TORPEDO ; TEST IF X NEAR SCREEN EDGE LOADX A,DC+1 ;HO X POS OF TORPEDO ABS ;ABS VALUE OF X CPI LIMIT ;SUBTRCT LIMIT JP BLANK ;NEAR EDGE IF + OR 0 ; TEST IF Y NEAR EDGE LOADX A,DC+7 ;HO Y POS OF TORPEDO ABS CPI LIMIT JP BLANK ;NOT NEAR EDGE ; TORPEDO HIT SUN LOADX A,XN+1 ABS CPI SUN RP ;RETN IF NOT LOADX A,YN+1 ABS CPI SUN RP ;RETURN IF NOT BLANK: LDBLX INPNT ;MBEAM/MDISP INST MVI M,0 ;MBEAM MVI A,0 STORX A,RCNT ;RELEASE TORPEDO RET ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; TORPEDO FIRE PROGRAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GEPNT SET 26H RCON EQU EPSLN*140H VCON1 EQU (5*VCON)/7 FIRE: LDBLX GEPNT ;DISPATCH TABLE ENTRY FOR SHIP INX H MVI M,1 ;DESCHEDULE SELF LOADX A,ORENT ADD A ;DOUBLE ORIENTATION MOV L,A ;SAVE FOR LATER MVI H,0 SHLD ORSAV LDBLX FBPNT ;PNTR TO 1ST TORPEDO ->HL PUSH B ;SAVE SHIP BLOCK BASE ; FIND FREE TORPEDO MOV B,H ;HL -> BC MOV C,L LOADX A,RCNT ;TEST FOR CLAIMED TORPEDO CPI 0 JZ SHOOT ;NOT CLAIMED POP B ;SANE STACK RET ;NO FREE TORPEDOS ; SHOOT A TORPEDO SHOOT: LDBLX INPNT ;UNBLANK TORPEDO MVI M,2 ; 'MDISP' MVI A,RMAX ;SET TIMEOUT COUNTER STORX A,RCNT ; TO CLAIM TORPEDO POP H ;SHIP OBJ BLK IN HL MVI D,10 ;10 BYTES TO MOVE XLOOP: MOV A,M ;BYTE FROM SHIP COORDS STAX B ; INTO TORPEDO COORDS INX H ;NEXT BYTE INX B DCR D ;DECREMENT CNTR JNZ XLOOP ;NOT DONE YET LXI H,-10 DAD B ;RESTORE TORPEDO BLK MOV B,H MOV C,L ; COMPUTE INITIAL TORPEDO COORDINATES ; X(N-1) & Y(N-1) ARE SHIP'S + COLLISION RAD ; X(N) & Y(N) ARE SHIP'S + VELOCITY + COLL RAD LHLD ORSAV LXI D,XVTAB ;X VELOCITY TABLE DAD D MOV E,M ;XVEL IN DE INX H MOV D,M LDBLX XN DAD D ;ADD VEL+COLL TO X(N) SDBLX XN ; LHLD ORSAV LXI D,XRTAB ;COLL RAD TABLE DAD D MOV E,M INX H MOV D,M LDBLX XNM DAD D ;ADD COLL TO X(N-1) SDBLX XNM ; LHLD ORSAV LXI D,YVTAB DAD D MOV E,M INX H MOV D,M LDBLX YN DAD D ;ADD VEL+COLL TO Y(N) SDBLX YN ; LHLD ORSAV LXI D,YRTAB DAD D MOV E,M INX H MOV D,M LDBLX YNM DAD D ;ADD COLL TO Y(N-1) SDBLX YNM RET ; COLLISION RADIUS TABLES XRTAB: DW 0 DW RCON YRTAB: DW RCON DW RCON DW 0 DW -RCON DW -RCON DW -RCON DW 0 DW RCON ; H.O. VELOCITY + COLL RAD TABLES XVTAB: DW 0 DW VCON1+RCON YVTAB: DW VCON+RCON DW VCON1+RCON DW 0 DW -VCON1-RCON DW -VCON-RCON DW -VCON1-RCON DW 0 DW VCON1+RCON ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SCORE PROGRAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SCRE SET 0 SDIG1 SET 1 SDIG2 SET 3 SCORE: LOADX A,SCRE ;SCORE VALUE ANI 0FH ;RIGHT DIGIT RLC ;*2 ADI NUMS ;INDEX OF SUBR IN HL MVI H,0 MOV L,A MOV E,M ;SUBR ADDR IN DE INX H MOV D,M LDBLX SDIG2 ;PNTR TO DIGIT MOV M,E ;SUBR ADDR IN DISPL FILE INX H MOV M,D LOADX A,SCRE ;SCORE VALUE ANI 0F0H ;LEFT DIGIT RRC ;JUSTIFY & *2 RRC RRC ADI NUMS MVI H,0 MOV L,A MOV E,M INX H MOV D,M LDBLX SDIG1 MOV M,E INX H MOV M,D ;LEFT DIG IN DISPL FILE RET ;RETURN ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PROGRAM TO ROTATE SHIPS, INITIATE TORPEDO FIRE, ; DO HYPERSPACE PROCESSING & CHECK ; FOR SPENT TORPEDOS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DON'T CHECK BUTTONS IF ALREADY IN HYPERSPACE ROT: LOADX A,HFLAG CPI 0 JNZ SPNCK ;CHECK FOR SPENT BULLETS ANYWAY LDBLX BAPNT MOV D,M ;BUTTON WORD ; CHECK FOR BOTH CW AND CCW, ; INDICATING HYPERSPACE LOADX A,HYPM ;MASK FOR HYPERSPACE MOV E,A ANA D XRA E JNZ CWCK ;NO - CHECK FOR CW ; BLANK SHIP LXI D,NULL ;NULL GRAPHICS SUB LDBLX PCPNT ;PNTR TO CALL MOV M,E INX H MOV M,D ;INSERT ; SCHEDULE SHIP START AFTER HDLY LDBLX PEPNT ;SHIP START ENTRY MVI M,-1 LDA TIME ADI HDLY INX H MOV M,A ; SEE IF WE NEED TO DESTROY SHIP LATER MVI D,1 SCALL 2 ;RANDOM # IN A CPI 0 ;> ZERO JP NODST ;YES--DON'T DESTRY MVI D,-1 ;NO--DESTRY NODST: STORX D,HFLAG ;INDICATE TO SSHIP START PGM JMP SPNCK ; END OF HYPERSPACE PROCESSING ; CHECK FOR CW (CLOCKWISE) ROTATION CWCK: LOADX A,CWM ;MASK FOR CW ANA D JZ CCWCK ;CHECK FOR CCW LOADX A,ORENT ;OLD ORIENTATION INR A ;UP BY 1 ANI 7 STORX A,ORENT ; CHECK FOR CCW (COUNTERCLOCKWISE) CCWCK: LOADX A,CCWM ;MASK FOR CCW ANA D JZ DINS LOADX A,ORENT DCR A ;DOWN BY 1 ANI 7 STORX A,ORENT ;INSERT ORENT IN DISPLAY FILE DINS: LOADX D,ORENT LDBLX PDPNT ;ORENTATION IN DISPLAY MOV A,M ANI 0F8H ;STRIP OLD ORENT BITS ORA D ;INSERT NEW MOV M,A ; CHECK IF FIRE BUTTON ON FIRCK: LDBLX BAPNT ;BUTTON ADDR MOV D,M ;BUTTON WORD LOADX A,FIREM ;FIRE MASK ANA D JNZ INCHK ;SEE IF INHIBIT MVI A,0 ;NO FIRE -- CLEAR INH STORX A,FINH JMP SPNCK INCHK: LOADX A,FINH ;CHECK INHIBIT FLG CPI 0 JNZ SPNCK ;SET MVI A,1 ;NOT SET -- SET IT STORX A,FINH LDBLX FIPNT ;SCHEDULE TORPEDO FIRE INX H MVI M,0 ; CHECK FOR SPENT TORPEDOS SPNCK: LDBLX FBPNT ; TORPEDO POINTER ; FIND CLAIMED TORPEDO WITH TIMEOUT ; FOR THIS SHIP MOV B,H ;HL -> BC MOV C,L LOADX A,RCNT CPI 0 ;TEST FOR CLAIMED RZ ;NOT CLAIMED DCR A ;DECREMENT TIMER STORX A,RCNT ;RESTORE IN BLOCK RNZ ;NOT ZERO YET LDBLX INPNT MVI M,0 ;BLANK TORPEDO RET ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; KEYBOARD DECODE PROGRAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CTLC EQU 'C' KBDCD: MOV C,A ;SAVE CHAR CPI CTLC ;"C"? RNZ ;RETURN IF NOT LXI H,IENT1+1 ;SCHED INIT1 MVI M,0 LXI H,IENT2+1 ;SCHED INIT2 MVI M,0 RET ; END