Compucolor.org – Virtual Media

Listing of file='CHKSHP.MAC;0E' on disk='vmedia/laser_gun_joystick-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	CHKSHP - CHECK A SHIP FOR A HIT
;
;	   CHECKS A SHIP FOR A HIT AS INDICATED BY A WHITE
;	   FOREGROUND IN PART OF THE SHIP. SETS UP THE
;	   EXPLOSION GRAPHIC AND DURATION IF HIT.
;

	TITLE	CHKSHP

	ENTRY	CHKSHP

;
;	VALUES ON ENTRY ARE IRRELEVANT
;
;	RETURNS WITH THE <Z> BIT SET IF THERE IS A HIT, AND
;	NOT SET IF NO HIT.
;

	EXTRN	GETSCT,PUTSCT
	EXTRN	HLSCT,SHPTYP,GRPTR,XPOS,YPOS,HORCNT,VRTCNT
	EXTRN	XPLCNT,EXPLDE
	EXTRN	RANDOM
;

SHPWID	EQU	10
SHPHGT	EQU	3

;..............................................................
;

CHKSHP:	CALL	GETSCT	;GET THE SCT
	LDA	SHPTYP	;MAKE SURE THE SHIP EXISTS
	ORA	A	;  AND IF NOT ...
	JNZ	CHKS10
	MVI	A,1	;  ... RETURN WITH <Z> NOT SET
	ORA	A
	RET
CHKS10:	LDA	XPLCNT	;SEE IF SHIP ALREADY EXPLODING
	ORA	A	;  AND IF SO ...
	RNZ		;  ... RETURN WITH <Z> NOT SET
	CALL	SCNSHP	;SCAN SHIPS FOR HITS
	RNZ		;RETURN IF SHIP NOT HIT (<Z> NOT SET)
	MVI	A,8	;SELECT RANDOM DURATION FOR EXPLOSION
	CALL	RANDOM
	ADI	2
	STA	XPLCNT
	MVI	A,SHPWID	;RANDOMLY CHOSE GRAPHIC
	CALL	RANDOM
	RLC
	MOV	E,A
	XRA	A
	MOV	D,A
	LXI	H,EXPLDE
	DAD	D
	SHLD	GRPTR		;AND STORE IN GRAPHIC POINTER
	MVI	A,1	;SET MOVE COUNTERS TO ENSURE AN
	STA	HORCNT	;   IMMEDIATE MOVE AND DISPLAY
	STA	VRTCNT
	CALL	PUTSCT
	XRA	A	;RETURN WITH <Z> BIT SET
	RET

;..............................................................
;
;	SCAN THE GRAPHIC LOOKING FOR A LASER HIT
;
	ENTRY	SCNSHP
;
;	VALUES ON ENTRY:
;	   IRRELEVANT
;
;	ALL REGISTERS DESTROYED
;
;	RETURNS WITH <Z> BIT SET IF A HIT, AND NOT SET IF
;	NO HIT. A HIT IS INDICATED IF PART OF THE SHIP HAS
;	A FOREGROUND COLOR OF WHITE I.E. LASER BEAM. THE
;	SHIP GRAPHIC MUST THEREFORE NOT CONTAIN ANY WHITE
;	SECTIONS.
;

	EXTRN	XYADDR
	EXTRN	X,Y	;COORDS OF END OF LASER BEAM

LPS	EQU	32	;LINES PER SCREEN
CPL	EQU	64	;CHARACTERS PER LINE
BPL	EQU	128	;BYTES PER LINE

SCNSHP:	LDA	XPOS
	MOV	B,A
	LDA	YPOS
	MOV	C,A
	CALL	XYADDR	;GET ADDRESS IN REFRESH RAM
	PUSH	H
	SHLD	CRTRAM
	MVI	A,SHPHGT
	MOV	L,A
SCNS1:	MOV	A,C	;GO THROUGH EACH LINE OF THE FIGURE
	ORA	A
	JP	SCNS2
	JMP	SCNEND
SCNS2:	CPI	LPS	;SEE IF OFF BOTTOM OF SCREEN
	JNC	FIN	;AND RETURN IF TRUE
	MVI	A,SHPWID	;OTHERWISE LOOK AT X-COORD
	RRC		;DIVIDE BY TWO
	ANI	7FH
	MOV	H,A
	LDA	XPOS
	MOV	B,A
SCNS3:	MOV	A,B	;CHECK X-COORD FOR EACH CHARACTER
	ORA	A
	JP	SCNS6
SCNS4:	XTHL		;OFF SCREEN TO LEFT, INCREMENT
	INX	H
	INX	H
	XTHL
SCNS5:	INR	B	;UPDATE X-COORD
	DCR	H	;SEE IF THIS LINE OF FIGURE FINISHED
	JNZ	SCNS3
	JMP	SCNEND
SCNS6:	CPI	CPL	;CHECK FOR OFF SCREEN TO RIGHT
	JNC	SCNEND
	XTHL
SCNS7:	INX	H
	MOV	A,M	;GET COMPOSITE COLOR CODE
	ANI	07H	;FIND FOREGROUND COLOR
	CPI	07H	;COMPARE TO WHITE
	JZ	HIT	;AND RETURN IF TRUE (<Z> IS SET)
	INX	H
	XTHL
	JMP	SCNS5
SCNEND:	INR	C	;GO TO NEXT LINE OF FIGURE
	DCR	L
	JZ	FIN	;RETURN IF NONE LEFT
	XTHL
	LHLD	CRTRAM	;UPDATE REFRESH RAM ADDRESS
	PUSH	D
	LXI	D,BPL
	DAD	D
	POP	D
	SHLD	CRTRAM
	XTHL
	JMP	SCNS1	;REPEAT FOR THIS LINE
FIN:	MVI	A,1	;CLEAR <Z> BIT
	ORA	A
HIT:	POP	H
	RET
MISS:	MVI	A,1	;MISSED THE SHIP
	ORA	A
	RET

;	TEMPORARY STORAGE AREA

CRTRAM:	DS	2	;ADDRESS IN REFRESH RAM

	END