Compucolor.org – Virtual Media

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