Compucolor.org – Virtual Media

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