*PLAYER MISSILE INTERFACE TO BASIC
*CODE BY JEFF STANTON & DAN PINAL
*PLAYER SHAPES ARE STORED IN PAGE ONE P/M AREA
*MAX LENGTH 64 BYTES EACH
*
HPOSP0	EQU	$D000
SHAPEL	EQU	$D4		; LO BYTE WHERE SHAPE IS STORED
SHAPEH	EQU	$D5		; HI BYTE
SHPML	EQU	$CE		; LO BYTE TO DRAW OR ERASE SHAPE IN P/M AREA
SHPMH	EQU	$CF		; HI BYTE
*
* CALL FROM BASIC
* A=USR(1536, PLAYER #,PLAYER LEN,OLD Y,NEW Y,NEW X)
	ORG	$600
*	.TF	"D:PMSUB.OBJ"
*TRANSFER VALUES IN USR FUNCTION THAT ARE STORED ON STACK TO SUBROUTINE
START	PLA			; PULL # OF ARG'S OFF STACK
	LDX	#$00
PULL	PLA			; DISCARD THE HIBYTE IT'S USELESS
	PLA			; GET VALUE
	STA	PLAYNUM,X
	INX
	CPX	#$05		; GOT ALL 5 YET?
	BNE	PULL
*SETUP POINTERS TO MOVE SHAPE FROM STORAGE PLACE TO PLACE IN P/M AREA
	LDA	NEWX		; HORIZONTAL POSITION
	LDX	PLAYNUM
	STA	HPOSP0,X	; TELL ANTIC NEWX
	LDA	BASE		; HIBYTE OF PMBASE
	STA	SHAPEH
	CLC
	ADC	#$04		; SET FOR PLAYER 0 ADDRESS
	STA	SHPMH
	LDA	PLAYNUM		; PLAYER
	CMP	#$04		; MISSILES?
	BGE	MISSILES
	TAX			; PLAYER # BECOMES INDEX
	LDA	INDEX,X
	STA	SHAPEL
AA1	DEX			; WE INCREMENT SHPMH FOR EACH PLAYER UNLESS 0
	BMI	ERASE
	INC	SHPMH		; EACH INDIVIDUAL P/M AREA 256 BYTES APART
	BNE	AA1		; ALWAYS
ERASE
	LDA	OLDY		; Y
	STA	SHPML
	LDA	#$00		; ERASE WITH 0
	TAY			; Y--O
AB1	STA	(SHPML),Y	; STORE IN PROPER P/M AREA
	INY			; NEXT BYTE
	CPY	PLAYLEN		; DONE?
	BL	AB1
	LDA	NEWY		; NEW Y
	STA	SHPML		; SETUP POINTER TO PLOT
	LDY	#$00
DRAW	LDA	(SHAPEL),Y	; LOAD BYTE FROM PLAYER SHAPE TABLE
	STA	(SHPML),Y	; STORE IN PROPER P/M PLAYER AREA
	INY			; NEXT BYTE
	CPY	PLAYLEN		; DONE?
	BL	DRAW
	RTS
*COMES HERE WITH ACC=MISSILE# PLUS 4
MISSILES SEC
	SBC	#$04		; GET PROPER MISSILE # (0-3)
	TAX			; SET INDEX FOR MISSILE MASKS
	DEC	SHPMH		; SHPMH WAS SET FOR PLAYERO, MISSILES ARE 1
	LDA	OLDY		; OLD/CURRENT Y POS.	; \PAGE LOWER
	STA	SHPML
	LDY	#$00
UNDRAW	LDA	(SHPML),Y	; LOAD OLD MISSILES DATA
	AND	MASKS,X		; ERASE IT BUT DON'T DISTURB OTHER MISSILES
	STA	(SHPML),Y	; STORE COMBINED MISSILE DATA IN P/M AREA
	INY			; NEXT BYTE
	CPY	PLAYLEN		; DONE?
	BL	UNDRAW
	LDA	NEWY		; NEW Y POS.
	STA	SHPML
	LDY	#$00
MDRAW	LDA	(SHPML),Y	; LOAD OLD MISSILES DATA
	ORA	SHOTS,X		; MERGE SHOT DATA WITH OTHER MISSILES
	STA	(SHPML),Y	; STORE NEW COMBINED MISSILE BYTE
	INY			; NEXT BYTE
	CPY	PLAYLEN		; DONE?
	BL	MDRAW
	RTS
INDEX	DB	$00,$40,$80,$C0	; LO BYTE OF STORED PLAYER SHAPES
MASKS	DB	$FC,$F3,$CF,$3F	; MISSILE MASKS
SHOTS	DB	$03,$0C,$30,$C0	; MISSILE SHAPES
PLAYNUM	DS	1
PLAYLEN	DS	1
OLDY	DS	1
NEWY	DS	1
NEWX	DS	1
BASE	DS	1		; HI BYTE PMBASE IS POKED IN FROM BASIC
