Listing of file='FIREJ.MAC;0E' on disk='vmedia/taylor-sideB-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; FIRCTL - FIRE CONTROL ROUTINE ; ; DOES ALL THE SHOOTING AT SHIPS. INTERNAL HIT ; AND SHOT COUNTERS ARE PUBLIC, AS ARE THE ; MESSAGES THAT PRINT THEM. MAKES SOUNDS FOR THE ; SHOT AND EXPLOSIONS (HITS). THE COUNT TO BE USED ; IN DEBOUNCING THE PUSH-BUTTON IS PUBLIC. ; ; *** JOYSTICK VERSION *** ; ; (USES JOYSTICK FOR BOTH DISTANCE AND DIRECTION) ; TITLE FIRCTL ENTRY FIRCTL PUBLIC FIRCNT,HITCNT,FIRMSG,HITMSG,DBCNT PUBLIC X,Y ; ; VALUES ON ENTRY: ; IRRELEVANT ; ; RETURNS: ; NOTHING - HITS AND SHOTS FIRED ARE PUBLIC ; ; DESTROYS: ; ALL REGISTERS ; ; ; EXTERNALS - REQUIRED SUBROUTINES ; EXTRN DECOUT ;CONVERTS A BYTE TO ASCII DECIMAL NO. EXTRN DELAY ;WASTE TIME EXTRN LASER,BOOM ;MAKE SOUNDS EXTRN CHKSHP ;CHECKS A SHIP FOR A HIT EXTRN OSTR ;OUTPUT A STRING EXTRN SCT,HLSCT,BMPSCT,NSHIP ;IN MAIN PROGRAM ; ; EQUATES :- ; ; I/O PORTS ; PBR EQU 028H ;PUSH-BUTTON REGISTER XREG EQU 020H ;X REGISTER (A/D CHANNEL NO.) YREG EQU 021H ;Y REGISTER ; ; PUSH-BUTTON REGISTER ASSIGNMENTS ; EOC EQU 80H ;END-OF-CONVERSION FLAG BUTT EQU 08H ;BUTTON ; ; PROGRAM PARAMETERS ; ADJDEL EQU 25 ;DELAY TO ADJUST TIMING FOR WHEN A SHOT ; IS NOT FIRED. SHOULD BALANCE OUT THE ; TIME TAKEN IF A SHOT IS FIRED. ;.............................................................. FIRCTL: LDA DEBNCE ;DEBOUNCE THE PUSH-BUTTON ORA A JZ BUTTON DCR A STA DEBNCE JMP BUTT50 BUTTON: IN PBR ;SEE IF BUTTON IS DEPRESSED ANI BUTT JNZ BUTT50 OUT XREG ;INITIATE A CONVERSION NOP ; *** IMPORTANT *** NOP ;WAIT FOR EOC TO GO LOW BUTT10: IN PBR ;CHECK FOR END-OF-CONVERSION ANI EOC JZ BUTT10 IN XREG ;READ X-COORD RRC ;DIVIDE BY 2 ANI 7FH STA X ;SAVE IT OUT YREG ;SIMILARLY FOR THE Y-COORD NOP NOP BUTT20: IN PBR ANI EOC JZ BUTT20 IN YREG RRC ANI 7FH STA Y LXI H,WHITE ;SET COLOR CALL OSTR LXI H,BEAM ;DRAW THE LASER BEAM CALL OSTR LXI H,FIRCNT ;INCREMENT COUNT OF SHOTS FIRED INR M MOV A,M LXI H,FIRED ;AND PRINT MESSAGE CALL DECOUT LXI H,FIRMSG CALL OSTR CALL LASER ;MAKE A LASER SOUND LXI H,SCT LDA NSHIP ;GET NUMBER OF SHIPS DCR A ;LEAVE ONE ALONE MOV B,A JNZ BUTT30 ;BUT MAKE SURE ITS NOT THE ONLY ONE INR B BUTT30: PUSH B SHLD HLSCT CALL CHKSHP ;SCAN EACH SHIP FOR A HIT JNZ BUTT35 LXI H,HITCNT ;INCREMENT SCORE IF A HIT INR M MOV A,M LXI H,HITS ;AND DISPLAY THE HIT COUNT CALL DECOUT LXI H,HITMSG CALL OSTR CALL BOOM ;MAKE EXPLOSION SOUND JMP BUTT40 BUTT35: MVI A,ADJDEL ;ADJUST TIMING IF NO HIT CALL DELAY BUTT40: LHLD HLSCT CALL BMPSCT ;STEP THROUGH SHIP CONTROL TABLE POP B DCR B JNZ BUTT30 LXI H,BLACK ;SET COLOR TO BLACK CALL OSTR LXI H,BEAM ;AND ERASE THE LASER BEAM CALL OSTR LDA DBCNT ;RESTORE THE DEBOUNCE COUNT STA DEBNCE RET BUTT50: LDA NSHIP MOV B,A BUTT60: MVI A,ADJDEL ;ADJUST TIMING IF NO SHOT FIRED CALL DELAY DCR B JNZ BUTT60 RET ;.............................................................. ; ; DATA AREA ; DBCNT: DB 4 ;COUNT FOR DEBOUNCING DEBNCE: DB 4 ;DEBOUNCE COUNTER FIRCNT: DB 0 ;COUNT OF SHOTS FIRED HITCNT: DB 0 ;COUNT OF HITS ; ; MESSAGES ; FIRMSG: DB 15,3,10,30,6,2,'FIRED',10,26,26,26,26 FIRED: DB '000',239 ;SHOTS FIRED HITMSG: DB 15,3,50,30,6,2,'HITS',10,26,26,26,26 HITS: DB '000',239 ;NUMBER OF HITS WHITE: DB 6,7,239 BLACK: DB 6,0,239 BEAM: DB 2,64,64,242 ;LASER BEAM (PLOTTED VECTOR) X: DB 128 Y: DB 128 DB 255,239 END