Listing of file='DOGFGT.MAC;16' on disk='vmedia/dogfight-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; DOGFGT - W.W. I DOG-FIGHT ; ; PLAYER USES THE JOYSTICK TO GET A BI-PLANE INTO THE ; CROSS-HAIRS AND THEN SHOOTS THE MACHINE-GUN BY PUSHING ; THE BUTTON. ; ; EXTERNALS :- REQUIRED SUBROUTINES ; EXTRN DRWSYM ;DRAW A SHIP EXTRN FIRCTL,FIRCNT,HITCNT,FIRMSG,HITMSG,DBCNT ;DO ALL THE SHOOTING EXTRN RANDOM,RANPTR ;RANDOM NUMBER GENERATOR EXTRN SNDSET ;SETUP SOUND CHIP EXTRN TIME,SETTIM ;TIME CONTROL ROUTINE (DOWN COUNTER) EXTRN JMPVEC ;ROUTINE SETS UP CORRECT JUMP ADDRESSES FOR ;THE VERSION OF FCS SO FCS ROUTINES CAN BE USED ; FCS ROUTINES EXTRN OSTR ;OUTPUT A STRING EXTRN SAVE ;SAVE ALL REGISTERS ; ; EQUATES :- ; ; SYSTEM ADDRESSES ; TICKS EQU 81B8H ;TICKS OF REAL-TIME CLOCK SECS EQU 81B9H ;SECONDS USRINP EQU 81C5H ;USER INPUT JUMP VECTOR KBDFL EQU 81DFH ;KEYBOARD INPUT FLAG ; ; PROGRAM PARAMETERS ; PLAYTM EQU 3 ;PLAYING TIME (MINUTES) SHPWID EQU 14 ;WIDTH OF SHIP GRAPHIC (IN BYTES, ; INCLUDING CCI'S) SHPHGT EQU 3 ;HEIGHT OF SHIP GRAPHIC (IN LINES) XMAX EQU 63 ;MAXIMUM X-COORD FOR SHIPS YMAX EQU 31 ;MAXIMUM Y-COORD FOR SHIPS MXSPCT EQU 5 ;MAXIMUM SPEED COUNT FOR PLANE ; ; PUBLIC VARIABLES NEEDED FOR LINKAGES TO OTHER ROUTINES ; PUBLIC SCT,HLSCT,SHPTYP,GRPTR,XPOS,YPOS PUBLIC HORCNT,VRTCNT PUBLIC XPLCNT,EXPLDE PUBLIC XSPD,XDIRN,YSPD,YDIRN ;.............................................................. ; ; MAIN PROGRAM ; DOGFGT: DI LXI H,0 ;SAVE FCS STACK POINTER FOR RETURN DAD SP SHLD FCSSP LXI SP,STACK CALL JMPVEC ;SETUP JUMPS TO OSTR AND SAVE WITH ;CORRECT ADDRESSES FOR VERSION OF FCS LXI H,ERASE ;ERASE THE SCREEN CALL OSTR MVI A,0C3H ;LOAD USER INPUT JUMP VECTOR STA USRINP LXI H,CHARIN SHLD USRINP+1 MVI A,31 ;SETUP KEYBOARD INPUT FLAG STA KBDFL LXI H,300 ;INITIALIZE SOUND CHIP MVI A,15 CALL SNDSET MVI A,7 ;ADD NOISE ON SOUND OUT 30H MVI A,36H OUT 31H MVI A,6 OUT 30H XRA A OUT 31H EI LXI H,INSTR ;PRINT HEADING AND INSTRUCTIONS CALL OSTR START: LXI H,SKLMSG ;ASK FOR NUMBER OF SHIPS CALL OSTR LXI H,KBCHR MVI M,0 DOG10: MOV A,M ;WAIT FOR USER TO READ INSTRUCTIONS ORA A ; AND CHOOSE NUMBER OF SHIPS JZ DOG10 MVI M,0 SUI 48 ORA A JZ DOG10 CPI 10 JNC DOG10 STA SKILL CALL SETUP ;SETUP THE SCREEN, ETC. ; ; MAIN LOOP ; MAIN: LXI H,XHRMSG ;DISPLAY X-HAIRS ON SCREEN CALL OSTR CALL GENSHP ;GENERATE NEW PLANE IF NEEDED CALL FIRCTL ;TAKE CARE OF USER'S MOTION AND FIRING CALL MOVSHP ;MOVE ALL THE PLANE CALL TIME ;UPDATE TIME ... JZ EXIT ; ... AND EXIT IF EXPIRED LDA KBCHR ;CHECK FOR STOP COMMAND CPI 'S' JZ EXIT JMP MAIN ;REPEAT ....... ;.............................................................. ; ; KEYBOARD INTERRUPT ROUTINE ; CHARIN: CALL SAVE MOV A,E STA KBCHR ;SIMPLY STORE THE CHAR AND RETURN RET KBCHR: DB 0 ;.............................................................. ; ; EXIT ROUTINE ; EXIT: LXI H,HITMSG ;PRINT OUT FINAL SCORES CALL OSTR LXI H,FIRMSG CALL OSTR LXI H,FINMSG ;OUTPUT GAME OVER MESSAGE CALL OSTR LXI H,KBCHR EX10: MVI M,0 EX20: MOV A,M ;WAIT ON USER TO ANSWER 'PLAY AGAIN ?' ORA A JZ EX20 CPI 'Y' JZ EX30 ;START OVER IF ANSWER IS 'Y' CPI 'N' JNZ EX10 ;USER MUST TYPE 'Y' OR 'N' LXI H,ERASE ;IF 'N', ERASE SCREEN, CALL OSTR MVI A,13 STA KBDFL ; RESTORE KEYBOARD FLAG TO FCS MVI B,0 ; SET NO FCS ERROR, LHLD FCSSP ; RESTORE FCS STACK POINTER, SPHL RET ; AND RETURN. EX30: LXI H,ERASE ;ERASE SCREEN AND RESTART GAME CALL OSTR JMP START ;.............................................................. ; ; SETUP ALL PARAMETERS AND SCREEN ; SETUP: LXI H,ERASE ;ERASE SCREEN CALL OSTR LDA TICKS ;GENERATE A NEW RANDOM NUMBER SEED MOV L,A LDA SECS CMA MOV H,A SHLD RANPTR LXI H,SCT ;ZERO OUT THE SCT MVI B,LSCTE XRA A SETU20: MOV M,A INX H DCR B JNZ SETU20 SETU30: XRA A ;ZERO OUT NUMBER OF HITS AND SHOTS STA HITCNT ; FIRED STA FIRCNT MVI A,1 STA XCNT STA XSPD STA YCNT STA YSPD LDA SKILL STA DBCNT MVI A,PLAYTM CALL SETTIM CALL TIME ;DISPLAY STARTING TIME RET ;.............................................................. ; ; GENERATE A SHIP ; GENSHP: MVI A,5 ;CHECK 1 OUT OF 5 TIMES CALL RANDOM CPI 3 RNZ LXI H,SCT MOV A,M GENS1: ORA A RNZ GENS2: SHLD HLSCT ;SAVE POINTER TO SCT MVI A,0FFH STA SHPTYP ;MARK PLANE AS ACTIVE LXI H,PLANE SHLD GRPTR ;SAVE GRAPHICS POINTER MVI A,MXSPCT ;CHOOSE "SPEEDS" (REALLY DELAY CALL RANDOM ;COUNTERS WHICH ARE THE INVERSE ADI 1 ;OF TRUE SPEEDS) RLC ADI 5 STA HORSPD ;HORIZONTAL "SPEED" STA HORCNT ;SET UP INITIAL COUNT VALUE TOO MVI A,2 ;PICK DIRECTION:- CALL RANDOM ; 1 = +VE COORD DIRN ORA A ; -1 = -VE COORD DIRN JNZ GENS4 MVI A,-1 GENS4: STA HORDRN ;STORE DIRECTION MVI A,MXSPCT ;SAME FOR VERTICAL CALL RANDOM ADI 1 RLC ADI 5 STA VRTSPD ;VERTICAL "SPEED" STA VRTCNT MVI A,2 CALL RANDOM ORA A JNZ GENS5 MVI A,-1 GENS5: STA VRTDRN MVI A,4 CALL RANDOM ;CHOOSE A SIDE OF THE SCREEN ORA A JZ LEFT CPI 1 JZ RIGHT CPI 2 JZ TOP CPI 3 JZ BOTTOM LEFT: MVI A,1 ;FORCE +VE HORIZONTAL DIRECTION SO STA HORDRN ;SHIP MUST MOVE ONTO SCREEN MVI A,1-SHPWID/2 ;START OUT JUST OFF SCREEN STA XPOS JMP VERT TOP: MVI A,1 ;FORCE +VE VERTICAL DIRN (DOWN) TO STA VRTDRN ;MAKE SHIP MOVE ONTO SCREEN MVI A,1-SHPHGT ;START OUT OFF SCREEN AT TOP STA YPOS JMP HORIZ RIGHT: MVI A,-1 ;SIMILARLY FOR OTHER EDGES OF SCREEN STA HORDRN MVI A,XMAX STA XPOS JMP VERT BOTTOM: MVI A,-1 STA VRTDRN MVI A,YMAX STA YPOS JMP HORIZ VERT: MVI A,YMAX CALL RANDOM STA YPOS JMP GENFIN HORIZ: MVI A,XMAX CALL RANDOM STA XPOS GENFIN: XRA A ;MARK SHIP AS NOT EXPLODING STA XPLCNT RET ;.............................................................. ; ; MOVE THE SHIPS ; MOVSHP: LXI H,SCT ;SHIP CONTROL TABLE SHLD HLSCT MOVE: MOV A,M ;GET SHIP TYPE ORA A RZ ;RETURN IF NO SHIP LXI H,MOVED ;MARK SHIP AS NOT HAVING MOVED MVI M,0 LDA XPOS ;GET PREVIOUS POSITIONS AS "NEW" IN STA NEWX ; CASE ONE OF THEM IS NOT UPDATED LDA XCNT ;UPDATE USER X-COUNTER DCR A STA XCNT JNZ MV10 LDA XSPD ;RESTORE COUNTER STA XCNT LDA XDIRN ;CORRECT PLANE POSITION FOR USER'S MOV B,A ; MOTION LDA NEWX SUB B STA NEWX MVI M,0FFH MV10: LDA YPOS ;SIMILARLY FOR Y-COORD STA NEWY LDA YCNT DCR A STA YCNT JNZ MV20 LDA YSPD STA YCNT LDA YDIRN MOV B,A LDA NEWY ADD B ;NOTE THE ADD BECAUSE Y-COORDS ARE STA NEWY ;BACKWARDS (0 IS TOP OF SCREEN) MVI M,0FFH MV20: LDA HORCNT ;SEE IF TIME IS UP FOR MOVE IN X-DIRN DCR A STA HORCNT JNZ YMOVE ;NO, CHECK Y-DIRN LDA HORSPD ;YES, RESET COUNTER STA HORCNT LDA XPLCNT ;DON'T REVERSE DIRECTION IF EXPLODING ORA A JNZ MOVE1 MVI A,30 ;RANDOMLY REVERSE DIRECTION CALL RANDOM ; ROUGHLY ONCE EACH PASS ACROSS SCREEN CPI 27 JNZ MOVE1 LDA HORDRN ;COMPLEMENT DIRECTION CMA ADI 1 STA HORDRN MOVE1: MVI A,0FFH STA MOVED ;SET FLAG SAYING SHIP MOVED LDA NEWX ;UPDATE X-COORD MOV B,A LDA HORDRN ADD B ;MAKE THE MOVE STA NEWX ;AND SAVE NEW X-COORD ADI SHPWID/2 ;CHECK IF MOVED OFF SCREEN JM CLRSHP ;LEFT SIDE FIRST CPI XMAX+SHPWID/2+1 ;RIGHT SIDE JNC CLRSHP YMOVE: LDA VRTCNT ;SEE IF READY FOR MOVE IN Y-DIRN DCR A STA VRTCNT JNZ MOVFIN LDA VRTSPD ;RESTORE COUNTER STA VRTCNT LDA XPLCNT ;SEE IF EXPLODING ORA A JNZ MOVE2 MVI A,30 ;CHANGE DIRECTION ? CALL RANDOM CPI 17 JNZ MOVE2 LDA VRTDRN CMA ADI 1 STA VRTDRN MOVE2: MVI A,0FFH STA MOVED ;MARK SHIP AS HAVING MOVED LDA NEWY MOV C,A LDA VRTDRN ADD C STA NEWY ;SAVE NEW Y-COORD ADI SHPHGT ;CHECK IF SHIP HAS MOVED OFF SCREEN JM CLRSHP ;AT TOP, CPI YMAX+SHPHGT+1 ;AND AT BOTTOM JNC CLRSHP MOVFIN: LDA MOVED ORA A JZ MOVEND ;RETURN IF SHIP HAS NOT MOVED LXI H,XPLCNT ;CHECK FOR EXPLODING SHIP MOV A,M ORA A JZ MOVDRW DCR M JZ CLRSHP ;TIME-OUT ON EXPLOSION MOVDRW: CALL WIPOUT ;ERASE OLD SHIP GRAPHIC LDA NEWX ;UPDATE THE COORDS STA XPOS MOV B,A LDA NEWY STA YPOS MOV C,A LHLD GRPTR ;GET POINTER TO GRAPHIC XCHG MVI H,SHPWID MVI L,SHPHGT CALL DRWSYM ;DRAW SHIP IN NEW POSITION MOVEND: RET CLRSHP: CALL WIPOUT ;ERASE SHIP FROM SCREEN XRA A STA SHPTYP ;SET NO SHIP JMP MOVEND MOVED: DB 0 ;FLAG FOR SHIP MOVED NEWX: DB 0 ;NEW SHIP COORDS NEWY: DB 0 ; ; REMOVE SHIP FROM SCREEN ; WIPOUT: LDA XPOS MOV B,A LDA YPOS MOV C,A LXI D,BLANK MVI H,SHPWID MVI L,SHPHGT CALL DRWSYM RET ;.............................................................. ; ; DATA AREA ; SKILL: DB 1 ; TEMPORARY STORAGE FOR A SCT (SHIP CONTROL TABLE) ENTRY HLSCT: DS 2 ;POINTER TO CURRENT SCT ENTRY SCT: SHPTYP: DB 0 ;SHIP "TYPE" GRPTR: DS 2 ;POINTER TO SHIP GRAPHIC HORSPD: DS 1 ;HORIZONTAL "SPEED" HORDRN: DS 1 ;HORIZONTAL DIRECTION HORCNT: DS 1 ;HORIZONTAL COUNTER VRTSPD: DS 1 ;SIMILARLY FOR VERTICAL VRTDRN: DS 1 VRTCNT: DS 1 XPLCNT: DS 1 ;EXPLOSION COUNTER XPOS: DS 1 ;X-COORD OF SHIP YPOS: DS 1 ;Y-COORD OF SHIP LSCTE EQU $-SHPTYP ;LENGTH OF AN ENTRY IN THE ; SHIP CONTROL TABLE ; ; TABLE OF DATA FOR USER'S MOTION RELATIVE TO PLANE ; XSPD: DS 1 XDIRN: DS 1 XCNT: DS 1 YSPD: DS 1 YDIRN: DS 1 YCNT: DS 1 ;.............................................................. ; ; GRAPHIC FOR THE PLANE ; DEFINITION OF THE CCI'S BLK EQU 0 ;BLACK CYN EQU 6 ;CYAN GRN EQU 2 ;GREEN PUR EQU 5 ;PURPLE RED EQU 1 ;RED YEL EQU 3 PLANE: DB 69H,RED,69H,RED,69H,RED,6EH,RED,69H,RED,69H,RED DB 69H,RED DB 7FH,YEL,7FH,YEL,7FH,YEL,4FH,RED,7FH,YEL,7FH,YEL DB 7FH,YEL DB 20H,BLK,3AH,YEL,08H,PUR,20H,BLK,06H,PUR,3AH,YEL DB 20H,BLK SHPLEN EQU $-PLANE ;LENGTH OF PLANE GRAPHIC ; BLANKS FOR ERASING A SHIP BLANK: DB 20H,BLK,20H,BLK,20H,BLK,20H,BLK,20H,BLK,20H,BLK DB 20H,BLK DB 20H,BLK,20H,BLK,20H,BLK,20H,BLK,20H,BLK,20H,BLK DB 20H,BLK DB 20H,BLK,20H,BLK,20H,BLK,20H,BLK,20H,BLK,20H,BLK DB 20H,BLK ; GARBAGE FOR AN EXPLOSION ; ; NOTE THAT IT IS LONGER THAN THE OTHERS TO ALLOW ; FOR A RANDOM STARTING POSITION IN THE MESS RDB EQU 0C1H ;RED+BLINK+PLOT RDP EQU 081H ;RED+PLOT RYB EQU 0D9H ;RED ON YELLOW +BLINK+PLOT YLB EQU 0C3H ;YELLOW+BLINK+PLOT YRB EQU 0CBH ;YELLOW ON RED +BLINK+PLOT EXPLDE: DB 5CH,RED,0C3H,YLB,0BCH,RDB,20H,BLK,0AAH,RYB DB 3CH,YRB,20H,BLK,0C9H,RDP,1H,YRB,0C3H,RDB DB 80H,YLB,2FH,YEL,20H,BLK,01H,YLB,20H,BLK DB 0C8H,RDB,0F0H,RYB,80H,YLB,20H,BLK,7FH,YEL DB 20H,BLK,16H,RDB,9,PUR,3AH,YEL,20H,BLK DB 1CH,RDP,64H,YRB,20H,BLK,0E2H,RDB,20H,BLK ; ; MESSAGES ; INSTR: DB 29,6,RED,14,3,22,1,'D O G F I G H T',13,10,10 DB 15,6,YEL,' COPYRIGHT (C)',6,CYN,' 1980' DB 6,YEL,' BY ',6,PUR,' TREVOR TAYLOR',13,10,6,GRN DB ' THIS IS A WORLD WAR I DOGFIGHT, AND YOU' DB ' ARE TRYING TO',13,10 DB 'SHOOT DOWN AS MANY ENEMY BI-PLANES AS YOU' DB ' CAN IN THE TIME',13,10 DB 'ALLOWED. USE THE JOYSTICK TO MANOEUVRE THE' DB ' PLANES INTO THE',13,10 DB 'CROSS-HAIRS AND FIRE USING THE PUSH-BUTTON.' DB 13,10,10 DB ' BECAUSE YOU ARE FOLLOWING THE ENEMY, YOU' DB ' MUST PUSH THE',13,10 DB 'JOYSTICK',6,CYN,' TOWARDS',6,GRN,' THE PLANE.' DB 13,10,10 DB ' YOU WILL NOTICE THAT THE BULLETS TAKE A' DB ' LITTLE WHILE TO',13,10 DB 'REACH THE PLANE, SO YOU MUST ALLOW FOR THIS.' DB ' ALSO, YOUR SHOTS',13,10 DB 'MUST BE FAIRLY ACCURATE (WINGS DON''T COUNT).' DB 13,10,10,239 SKLMSG: DB 6,YEL,'SKILL LEVEL (1-9) ? ',6,GRN,239 XHRMSG: DB 3,100,32,14,CYN,6EH,3,100,31,15,CYN DB '-+-',3,100,32,16,CYN,6EH,239 ;CROSS-HAIRS FOR MACHINE GUN FINMSG: DB 6,45H,14,3,24,15,'G A M E O V E R',15,10,11 DB 6,YEL,3,26,27,'PLAY AGAIN ? ',239 ERASE: DB 15,6,GRN,12,3,64,0,239 ;ERASE SCREEN FCSSP: DS 2 ;SAVE FCS STACK POINTER DS 100 STACK: ;PROGRAM STACK END DOGFGT