; D:TRCD.ASM

; Special program equates

SLOWSP	=	180	;speed values
INTMSP	=	120
FASTSP	=	70
FAST	=	1	;high speed value
RNFRQS	=	43	;audio values
RNFRQF	=	33
;frequency decrement value: used to rev up engines
FDECV	=	35

; Score keeping logic

ZSUPP	=	$88
SCNPRT	=	$84
PLACC	=	$82
SCR0	DB	0,0,0	;BCD score buffers
SCR1	DB	0,0,0
SCRSCN	PROC
; CONVERT SCORE PLAYER 1
	LDA	#LOW SCR1	;score to print
	STA	PLACC
	LDA	#HIGH SCR1
	STA	PLACC+1
	CLC
	LDA	SAVMSC
	ADC	#LOW [3680 + 6]
	STA	SCNPRT	;place on screen to put score
	LDA	SAVMSC+1
	ADC	#HIGH [3680 + 6]
	STA	SCNPRT+1
	LDA	#%01000000  ;blue GR set
	STA	WORK
	JSR	CNVSCR
; CONVERT PLAYER 2
	LDA	#LOW SCR0
	STA	PLACC
	LDA	#HIGH SCR0
	STA	PLACC+1
	CLC
	LDA	SAVMSC
	ADC	#LOW [3680+12]
	STA	SCNPRT
	LDA	SAVMSC+1
	ADC	#HIGH [3680+12]
	STA	SCNPRT+1
	LDA	#%10000000  ;red GR set
	STA	WORK
	JSR	CNVSCR
	RTS

XREG	DB	0
YREG	DB	0

; This proc puts score addressed in PLACC
; to the screen using data from the zero
; suppression module to zero suppress

CNVSCR	PROC
	JSR	ZEROSP
	LDX	#5
	STX	XREG
	LDY	#2
	STY	YREG
:NEXT	LDY	YREG
	LDA	XREG   ; zero suppression
	CMP	ZSUPP
	BCC	:SKIP
	LDA	(PLACC),Y
	AND	#%00001111
	CLC
	ADC	#$10
	ORA	WORK
	
	LDY	XREG
	STA	(SCNPRT),Y
:SKIP	=	*
	DEC	XREG

	LDY	YREG
	LDA	XREG	;check zero supp
	CMP	ZSUPP
	BCC	:SKIP2
	LDA	(PLACC),Y
	LSR  A ! LSR  A ! LSR  A ! LSR A
	CLC
	ADC	#$10
	ORA	WORK
	LDY	XREG
	STA	(SCNPRT),Y
:SKIP2	=	*
	DEC	XREG
	DEC	YREG
	BPL	:NEXT
	RTS

; This proc clears the score buffers
; and clears the screen

CLRSCR	PROC
	CLC
	LDA	SAVMSC
	ADC	#LOW [3680+6]
	STA	SCNPRT
	LDA	SAVMSC+1
	ADC	#HIGH [3680+6]
	STA	SCNPRT+1
	LDX	#5
	LDA	#0
:LOOP	STA	SCR0,X
	DEX
	BPL	:LOOP
	LDY	#13	; blank screen
	LDA	#0
:LOOP2	=	*
	STA	(SCNPRT),Y
	DEY
	BPL	:LOOP2
	JSR	SCRSCN
	RTS

; conformation sound to any key press
; in the title screen mode

CLF2	DB	20,20,20
CSPAU1	DB	03,03,03
CSPAU2	DB	1,2,2
TACSND	PROC	     ; game parm alter sound
	LDX	#2
:LOOP	LDA	#168
	STA	AUDC3
	LDA	CLF2,X
	STA	AUDF3
	LDY	CSPAU1,X
	JSR	PAUSE
	LDY	CSPAU2,X
	BEQ	:SKIP
	LDA	#0
	STA	AUDC3
	JSR	PAUSE
:SKIP	=	*
	DEX
	BPL	:LOOP
	RTS

; Zero suppress scores

ZEROSP	PROC
	LDX	#0
	LDY	#0
:NEXT	LDA	(PLACC),Y
	AND	#%11110000
	BNE	:OUT
	INX
	LDA	(PLACC),Y
	AND	#%00001111
	BNE	:OUT
	INX
	INY
	CPY	#3
	BNE	:NEXT
	DEX		;display first digit
:OUT	=	*
	STX	ZSUPP
	RTS

;Sound for winner

F1	DB	50,76,37,29,33
SPAU1	DB	3,3,3,3,3
SPAU2	DB	1,1,1,1,1
COLRS	DB	188,180,188,180,188,180,188
SCRSND	PROC
	LDA	#0
	STA	AUDCTL
	LDA	#6
	STA	WORK
:NEXT	=	*
	LDX	#4
:LOOP	LDA	#168
	STA	AUDC1
	LDA	F1,X
	STA	AUDF1
	LDY	SPAU1,X
	JSR	PAUSE
	LDY	SPAU2,X
	BEQ	:SKIP	;dont zero audc1
	LDA	#0
	STA	AUDC1
	JSR	PAUSE
:SKIP	=	*
	DEX
	BPL	:LOOP
	LDX	WORK
	LDA	COLRS,X
FANCOL	STA	FANCOL+1
	LDY	#13
	JSR	PAUSE
	DEC	WORK
	BPL	:NEXT
	RTS

; Zero hori. pos. addr's for P/M

ZHPOS	PROC
	LDX	#3
	LDA	#0
:LOOP	STA	HPOSP0,X
	DEX
	BPL	:LOOP
	RTS

; Print round count to screen

PRNDS	DS	1	; screen printable round count
PRTRDS	PROC
	LDY	#3
	SED
	LDA	PRNDS
	CLC
	ADC	#1
	STA	PRNDS
	CLD
	AND	#%00001111
	CLC
	ADC	#$10
	STA	(STRPAD),Y
	LDA	PRNDS
	LSR A! LSR A! LSR A! LSR A
	BNE	PTNUM  ; if not zero put
	LDA	#0
	JMP	PUTBL
PTNUM	CLC
	ADC	#$10
PUTBL	DEY
	STA	(STRPAD),Y
	RTS

; Display list interupt routine

DLIRTN	=	*
	PHA
	TXA
	PHA
DLCL1	LDA	#52
	EOR	COLRSH
	AND	DRKMSK
	TAX
DLCL0	LDA	#116
	EOR	COLRSH
	AND	DRKMSK
	STA	WSYNC
	STA	COLPF1
	STX	COLPF2
	LDA	#212
	EOR	COLRSH
	AND	DRKMSK
	STA	COLPF0
	PLA
	TAX
	PLA
	RTI

; Winner detemination and annoucement

WINNER	PROC
	LDX	#0	;compare both score accumulators
:NEXT	LDA	SCR1,X
	CMP	SCR0,X
	BCC	SCR1WN
	BNE	SCR0WN
	INX
	CPX	#3
	BNE	:NEXT
	RTS

SCR0WN	=	*
	LDA	#LOW [DLCL0+1]	;set display list
	STA	FANCOL+1		;interupt color flipper
	LDA	#HIGH [DLCL0+1]
	STA	FANCOL+2
	JSR	SCRSND
	LDA	#116
	STA	DLCL0+1
	RTS

SCR1WN	=	*
	LDA	#LOW [DLCL1+1]
	STA	FANCOL+1
	LDA	#HIGH [DLCL1+1]
	STA	FANCOL+2
	JSR	SCRSND
	LDA	#52
	STA	DLCL1+1
	RTS

;  ******  Rounds Control for 2 plyr mode   ******

; Round control changes screens 
; & keeps track of rounds

SRNDS	DB	0	;holds round count
RNDCTL	PROC
	LDA	#0
	STA	DMACTL
	STA	SDMCTL
	LDA	PDLSTL	;change dlist to
	STA	SDLSTL	;mode 7 screen
	LDA	PDLSTH
	STA	SDLSTH
	LDA	#%00101010
	STA	SDMCTL
	LDA	RNDS
	STA	SRNDS	; shadow rounds
	LDY	#1
	LDA	#$32	; Put 'R' on screen
	STA	(STRPAD),Y
	LDA	#0	;zero printable round count
	STA	PRNDS
	JSR	PRTRDS
	JSR	CLRSCR
:NEXT	JSR	PLYTWO
	LDA	#1
	CMP	SRNDS	; if last round
	BEQ	:SKIP	; skip round count update
	JSR	PRTRDS
	DEC	SRNDS
	BNE	:NEXT
:SKIP	JSR	KILSND
	JSR	WINNER
	JSR	ZHPOS
RTNTTL	=	*
	LDA	#0	;return to title screen
	STA	DMACTL
	STA	SDMCTL
	STA	COLOR2	;set color for name strip
	STA	COLPF2
	LDA	#LOW TTLDL
	STA	SDLSTL
	LDA	#HIGH TTLDL
	STA	SDLSTH
	LDA	#%00101010
	STA	SDMCTL
	RTS

	END	START
