Compucolor.org – Virtual Media

Listing of file='FIREJ.MAC;12' on disk='vmedia/laser_gun_joystick-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	FIRMSG,FIRED,HITMSG,HITS,DBCNT
	PUBLIC	X,Y

;
;	VALUES ON ENTRY:
;	   IRRELEVANT
;
;	RETURNS:
;	   NOTHING - HITS AND SHOTS FIRED ARE PUBLIC
;
;	DESTROYS:
;	   ALL REGISTERS
;
;
;	EXTERNALS - REQUIRED SUBROUTINES
;
	EXTRN	CHKSHP	;CHECKS A SHIP FOR A HIT
	EXTRN	DELAY	;WASTE TIME
	EXTRN	INCCNT	;INCREMENT ASCII COUNT
	EXTRN	JOYSTK,PSHBUT	;JOYSTICK ROUTINES
	EXTRN	LASER,BOOM	;MAKE SOUNDS
	EXTRN	OSTR	;OUTPUT A STRING

	EXTRN	SCT,HLSCT,BMPSCT,NSHIP	;IN MAIN PROGRAM

;
;	PARAMETERS -
;

ADJDEL	EQU	20	;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:	XRA	A	;SET JOYSTICK NO. 0
	CALL	PSHBUT	;SEE IF BUTTON IS DEPRESSED
	JNZ	BUTT50
	XRA	A
	CALL	JOYSTK	;GET JOYSTICK POSITION
	MOV	A,B
	RRC		;DIVIDE BY 2
	ANI	7FH
	STA	X	;SAVE X-COORD
	MOV	A,C	;SAME FOR Y-COORD
	RRC
	ANI	7FH
	STA	Y

	LXI	H,WHITE	;SET COLOR
	CALL	OSTR
	LXI	H,BEAM	;DRAW THE LASER BEAM
	CALL	OSTR
	LXI	H,FIRED-1	;INCREMENT COUNT OF SHOTS FIRED
	CALL	INCCNT
	LXI	H,FIRMSG	;   AND PRINT MESSAGE
	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	BUTT10	;BUT MAKE SURE ITS NOT THE ONLY ONE
	INR	B
BUTT10:	PUSH	B
	SHLD	HLSCT
	CALL	CHKSHP	;SCAN EACH SHIP FOR A HIT
	JNZ	BUTT20

	LXI	H,HITS-1	;INCREMENT SCORE IF A HIT
	CALL	INCCNT
	LXI	H,HITMSG	;   AND DISPLAY THE HIT COUNT
	CALL	OSTR
	CALL	BOOM	;MAKE EXPLOSION SOUND
	JMP	BUTT40
BUTT20:	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	BUTT10
	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

;
;	MESSAGES
;

FIRMSG:	DB	15,3,10,30,6,2,'FIRED',10,26,26,26,26,26
	DB	'0000'
FIRED:	DB	239	;SHOTS FIRED

HITMSG:	DB	15,3,50,30,6,2,'HITS',10,26,26,26,26,26
	DB	'0000'
HITS:	DB	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