; D:TRC1B.ASM

; Check trig

P0FLG	DB	0	;previous speed flag
TRIG	PROC
	LDX	STRIG0
	STX	MVFSTE+1
	BEQ	:OVER
	LDY	P0FLG
	BEQ	NWSPD5
	RTS
:OVER	LDY	P0FLG
	BNE	NWSPD6
	RTS
; change speed from fast to slow
NWSPD5 =	*
	STX	P0FLG
	LDA	#RNFRQS	;new sound
	STA	FRQSTO
	STA	SAUDF2
	RTS
NWSPD6 =	*	;from slow to fast
	STX	P0FLG
	LDA	#RNFRQF
	STA	FRQSTO
	STA	SAUDF2
	RTS

; Update stick direction value

;opposite direction value of stick
STKCPL DB	0
;direction value in index form eg. 0,1,2,3
INDEX	DB	0,0,0,0
;minimum movement  allowed before dir. change register
MINMV2	DB	$FF
;data table to convert OS stick value to index
DIRVAL DB	$E,$D,$7,$B
CPLTBL DB	$D,$E,$B,$7
FRQSTO	DB	0	;audio freq. base value
SSTICK	DB	0	;current stick in OS format

STICK	PROC
	LDX	#03
;	LDA	MINMV2	;min. move 2 pix
;	BPL	SKIPY	;skip new dir if +
:NEXT	LDA	DIRVAL,X
	CMP	STICK0
	BNE	STKOUT	;skip if not UDRL
	CMP	STKCPL
	BEQ	STKOUT	;skip if opp. dir
	CMP	SSTICK
	BEQ	STKOUT	;skip if curr dir
	STA	SSTICK
	LDA	CPLTBL,X
	STA	STKCPL
	TXA
	ASL	A
	JSR	TURN2	;advance 2 pix
	STA	INDEX
	LDA	FRQSTO	;new direction
	STA	SAUDF2	;restart sound
;	LDA	#1	;set for min move
;	STA	MINMV2
STKOUT	DEX
	BPL	:NEXT
SKIPY	RTS

; movement routines for player and computer

SYSPUT	=	$F5B7
PLROW	DB	0,0,0,0	;plot row coord
PLCOL	DB	0,0,0,0	;plot column coord
PVPRG	DB	0,0,0,0	;P/M vert. coord
PHPRG	DB	0,0,0,0	;P/M horiz. coord
WORK	DB	0,0	;work space for various routines

; vector table to update position registers

VECTBL DW	MOVEUP,MOVEDN,MOVERT,MOVELT

; vector table to P/M graphics ram update

PIVTBL DW	P0UP,P0DN,P0RT,P0LT,P1UP,P1DN,P1RT,P1LT,P2UP,P2DN,P2RT,P2LT,P3UP,P3DN,P3RT,P3LT

; P/M data

PDUP	DB	0,0,0,0,0,$14,$14,8,0
PDDN	DB	0,8,$14,$14,0,0,0,0,0
PDRT	DB	0,0,0,6,1,6,0,0,0
PDLT	DB	0,0,0,$30,$40,$30,0,0,0
CDUP	DB	0,0,0,0,0,$14,$08,8,0
CDDN	DB	0,8,$08,$14,0,0,0,0,0
CDRT	DB	0,0,0,4,3,4,0,0,0
CDLT	DB	0,0,0,$10,$60,$10,0,0,0

; move computer ship. x reg set with
; index to choose which ship to move

MVCOMP	PROC
	LDY	INDEX,X
	LDA	VECTBL,Y
	STA	SUBVC8+1	;ongosub
	LDA	VECTBL+1,Y
	STA	SUBVC8+2
SUBVC8 JSR	SUBVC8	;to update position registers
	JSR	HVHSET
	TXA
	ASL A ! ASL A ! ASL A
	STA	WORK
	TYA ! CLC
	ADC	WORK
	TAY
	LDA	PIVTBL,Y	;ongosub
	STA	SUBVC9+1
	LDA	PIVTBL+1,Y
	STA	SUBVC9+2
SUBVC9 JSR	SUBVC9	;update P/M graphics ram
	JSR	MYPLOT	;send point out to my plot proc
	RTS

; player move routine

MVPLYR	PROC
	LDX	#0
	LDA	MINMV2
	BMI	:OVER
	DEC	MINMV2
	BPL	:EXIT
:OVER	=	*
	LDY	INDEX
	LDA	VECTBL,Y
	STA	SUBVC3+1
	LDA	VECTBL+1,Y
	STA	SUBVC3+2
SUBVC3 JSR	SUBVC3	;to update position registers
	LDA	PIVTBL,Y
	STA	SUBVC4+1
	LDA	PIVTBL+1,Y
	STA	SUBVC4+2
SUBVC4 JSR	SUBVC4	;update P/M graphics ram
	TAY
	LDA	PLROW	;send player plot
	STA	ROWCRS	; out to system
	LDA	PLCOL	; plot routine
	STA	COLCRS

	LDA	BRKKEY	;move break key to
	STA	SBRKKY	;shadow for pause
	LDA	#1	;before sysput
	STA	BRKKEY	;catches it

	TYA
	JSR	SYSPUT
	LDA	PHPRG
	STA	HPOSP0
:EXIT	RTS

; set horiz pos reg & row col's. x set 
; with which ship to set

HVHSET	PROC
	LDA	PHPRG,X
	STA	HPOSP0,X
	LDA	PLROW,X
	STA	ROWPUT
	LDA	PLCOL,X
	STA	COLPUT
	RTS

;update row and column proc

MOVEUP DEC	PLROW,X
	DEC	PVPRG,X
	RTS
MOVEDN INC	PLROW,X
	INC	PVPRG,X
	RTS
MOVERT INC	PLCOL,X
	INC	PHPRG,X
	RTS
MOVELT DEC	PLCOL,X
	DEC	PHPRG,X
	RTS

; definition of P/M graphics ram update
; proc. named after my wife

PAMMY	MACRO   PLAYER_DATA,GRAPHICS_RAM,BIT_VALUE
%L	=	*
	LDY	PVPRG,X
	LDX	#8
?%K	LDA	%1,X
	STA	%2,Y
	INY
	DEX
	BPL	?%K
	LDA	#%3
	RTS
       	ENDM

P0UP	PAMMY	PDUP,GRP0,2
P0DN	PAMMY	PDDN,GRP0,2
P0RT	PAMMY	PDRT,GRP0,2
P0LT	PAMMY	PDLT,GRP0,2
P1UP	PAMMY	CDUP,GRP1,3
P1DN	PAMMY	CDDN,GRP1,3
P1RT	PAMMY	CDRT,GRP1,3
P1LT	PAMMY	CDLT,GRP1,3
P2UP	PAMMY	CDUP,GRP2,3
P2DN	PAMMY	CDDN,GRP2,3
P2RT	PAMMY	CDRT,GRP2,3
P2LT	PAMMY	CDLT,GRP2,3
P3UP	PAMMY	CDUP,GRP3,3
P3DN	PAMMY	CDDN,GRP3,3
P3RT	PAMMY	CDRT,GRP3,3
P3LT	PAMMY	CDLT,GRP3,3

;process sounds.decrement soft freq regs
; X carries 0,1. Y=0,4 to access audf2,4 or 1,3

SAUDF1	DB	0,0	;shadow audio freq1
SAUDF2	DB	0,0
PROSND	PROC
	TXA
	ASL	A
	ASL	A
	TAY
	SEC
	LDA	SAUDF1,X
	SBC	#FDECV	;freq decrement value
	BCS	:OVER
	DEC	SAUDF2,X
:OVER	=	*
	STA	SAUDF1,X
	PHA
	LDA	TRIGGR	;if vblank sound active
	BNE	:EXIT	;don't over write its audio chan.
	PLA
	STA	AUDF1,Y
	LDA	SAUDF2,X
	STA	AUDF2,Y
	LDA	#168
	STA	AUDC2
	RTS
:EXIT	PLA ! RTS

; vblank move player control rtn

ALT	DB	1	;move every other vblank
MVPLYI	PROC
	CLD
	DEC	ALT	;move fast enable
	BPL	:EXIT	; + 1 set to 0 so 
MVFSTE	LDX	#1	;will move each vblk
	STX	ALT
	JSR	TRIG
	JSR	STICK
	LDX	#0
	JSR	PROSND
	JSR	MVPLYR
	JSR	CLLTST
:EXIT	JMP	VBSND

; move computer during timr4 interupt

;computer ships move one at a time please alternate
ALTCMS	DB	0,0,0,0
CMVEN	DB	0,0,0,0 	;computer ship move enable
MVCMP	PROC
	LDX	ALTCMS	; move 1 each int
	DEX
AUTOX	BNE	:OVER	; 1..3 p/m
	LDX	#3
:OVER	STX	ALTCMS
	LDA	CMVEN,X
	BNE	:EXIT
	JSR	SCORCP
	JSR	MVCOMP
:EXIT	=	*
	RTS

	INCLUDE	D:MYPLOT.ASM

	LINK		D:TRC1C.ASM
