drawview.asm
dschmenk_LightCycles/drawview.asm
;*
;* Draw player viewport
;*
DRAWVIEW
	STA	VIEWPORT
;*
;* Render ground from bottom -> up
;*	
DRAWGRND LDA	ANGLE	; Calc S,T,DS,DT table address
	AND	#$7F	; ST table offset = angle * horizon * 8
	LSR		; horizon * 8 = 16 * 8 = 128
	TAX		; angle * 128 = angle << 7 == (angle<<8) >> 1
	LDA	#$00	; 
	STA	SCANLN	; for later...
	ROR
;	CLC		; Carry = 0 from above
	ADC	#<ST_TBL ; Add ST table address to offset
	STA	STPTRL
	TXA
	ADC	#>ST_TBL
	STA	STPTRH
;*
;* Draw even and odd scanlines together
;*
DRAWGRNDSCN
	LDA	VIEWPORT ; Max scanline number/2
	SEC
	SBC	SCANLN
	TAX
	LDA	TXT_TBLL,X
	STA	GBASL
	LDA	TXT_TBLH,X
	ORA	GPAGE
	STA	GBASH
;*
;* Draw right half of odd scanline
;*
	LDY	#$00	; Copy and update working values from ST table
	STY	S_MIDFL	; Convert ST_TBL from 6.10 fixpt to 8.16 fixpt and add XYVIEW
	STY	T_MIDFL
	LDA	(STPTR),Y
	STA	S_MIDFH
	INY
	LDA	(STPTR),Y
	CMP	#$80
	ROR
	ROR	S_MIDFH
	ROR	S_MIDFL
	CMP	#$80
	ROR
	ROR	S_MIDFH
	ROR	S_MIDFL
	STA	S_MIDI
	LDA	S_MIDFH
	CLC
	ADC	XVIEWF
	STA	S_MIDFH
	LDA	S_MIDI
	ADC	XVIEWI
	STA	S_MIDI        
	INY
	LDA	(STPTR),Y
	STA	T_MIDFH
	INY
	LDA	(STPTR),Y
	CMP	#$80
	ROR
	ROR	T_MIDFH
	ROR	T_MIDFL
	CMP	#$80
	ROR
	ROR	T_MIDFH
	ROR	T_MIDFL
	STA	T_MIDI
	LDA	T_MIDFH
	CLC
	ADC	YVIEWF
	STA	T_MIDFH
	LDA	T_MIDI
	ADC	YVIEWI
	STA	T_MIDI
	INY
	LDA	(STPTR),Y
	STA	DS_FRACL
	LDX	#$00
	INY
	LDA	(STPTR),Y
	CMP	#$80
	BCC	+
	DEX
+	STA	DS_FRACH
	STX	DS_INT
	ROR		; S = S_MID + DS/2
	STA	S_FRACH
	LDA	DS_FRACL
	ROR
	CLC
	ADC	S_MIDFL
	STA	S_FRACL
	LDA	S_FRACH
	ADC	S_MIDFH
	STA	S_FRACH
	TXA
	ADC	S_MIDI
	STA	S_INT
	INY
	LDA	(STPTR),Y
	STA	DT_FRACL
	LDX	#$00
	INY
	LDA	(STPTR),Y
	CMP	#$80
	BCC	+
	DEX
+	STA	DT_FRACH
	STX	DT_INT
	ROR		; T = T_MID + DT/2
	STA	T_FRACH
	LDA	DT_FRACL
	ROR
	CLC
	ADC	T_MIDFL
	STA	T_FRACL
	LDA	T_FRACH
	ADC	T_MIDFH
	STA	T_FRACH
	TXA
	ADC	T_MIDI
	STA	T_INT
	TYA		; Update STPTR to next scanline
	SEC
	ADC	STPTRL
	STA	STPTRL
	BCC	+
	INC	STPTRH
+	LDY	#15	; Right-middle of screen
	BNE	GRNDRO
-	LDA	#$00
	BEQ	+
GRNDRO	LDA	S_INT
	CMP	#$40
	BCS	-
	LDX	T_INT
	CPX	#$40
	BCS	-
	ORA	MAP_TBLL,X
	STA	RDTEXRO+1
	LDA	MAP_TBLH,X
	STA	RDTEXRO+2
RDTEXRO	LDA	MAP
	AND	#$F0
+	STA	(GBASE),Y
	LDA	S_FRACL	; S = S + DS
	CLC
	ADC	DS_FRACL
	STA	S_FRACL
	LDA	S_FRACH
	ADC	DS_FRACH
	STA	S_FRACH
	LDA	S_INT
	ADC	DS_INT
	STA	S_INT
	LDA	T_FRACL	; T = T + DT
	CLC
	ADC	DT_FRACL
	STA	T_FRACL
	LDA	T_FRACH
	ADC	DT_FRACH
	STA	T_FRACH
	LDA	T_INT
	ADC	DT_INT
	STA	T_INT
	INY
	CPY	#30
	BNE	GRNDRO
;*
;* Draw left half of odd scanline
;*
	LDA	DS_FRACL
	STA	TMP
	LDA	DS_FRACH
	CMP	#$80
	ROR		; S = S_MID - DS/2
	STA	TMP+1
	ROR	TMP
	LDA	S_MIDFL
	SEC
	SBC	TMP
	STA	S_FRACL
	LDA	S_MIDFH
	SBC	TMP+1
	STA	S_FRACH
	LDA	S_MIDI
	SBC	DS_INT
	STA	S_INT
	LDA	DT_FRACL
	STA	TMP
	LDA	DT_FRACH
	CMP	#$80
	ROR		; T = T_MID - DT/2
	STA	TMP+1
	ROR	TMP
	LDA	T_MIDFL
	SEC
	SBC	TMP
	STA	T_FRACL
	LDA	T_MIDFH
	SBC	TMP+1
	STA	T_FRACH
	LDA	T_MIDI
	SBC	DT_INT
	STA	T_INT
	LDY	#14	; Left-middle of screen
	BNE	GRNDLO
-	LDA	#$00
	BEQ	+
GRNDLO	LDA	S_INT
	CMP	#$40
	BCS	-
	LDX	T_INT
	CPX	#$40
	BCS	-
	ORA	MAP_TBLL,X
	STA	RDTEXLO+1
	LDA	MAP_TBLH,X
	STA	RDTEXLO+2
RDTEXLO	LDA	MAP
	AND	#$F0
+	STA	(GBASE),Y
	LDA	S_FRACL	; S = S + DS
	SEC
	SBC	DS_FRACL
	STA	S_FRACL
	LDA	S_FRACH
	SBC	DS_FRACH
	STA	S_FRACH
	LDA	S_INT
	SBC	DS_INT
	STA	S_INT
	LDA	T_FRACL	; T = T + DT
	SEC
	SBC	DT_FRACL
	STA	T_FRACL
	LDA	T_FRACH
	SBC	DT_FRACH
	STA	T_FRACH
	LDA	T_INT
	SBC	DT_INT
	STA	T_INT
	DEY
	BPL	GRNDLO
;*
;* Draw right half of even scanline
;*
	DEC	VDLY
	BNE	+
	BIT	SPEAKER
	LDA	VTONE
	STA	VDLY
+	LDY	#$00	; Copy and update working values from ST table
	STY	S_MIDFL	; Convert ST_TBL from 6.10 fixpt to 8.16 fixpt and add XYVIEW
	STY	T_MIDFL
	LDA	(STPTR),Y
	STA	S_MIDFH
	INY
	LDA	(STPTR),Y
	CMP	#$80
	ROR
	ROR	S_MIDFH
	ROR	S_MIDFL
	CMP	#$80
	ROR
	ROR	S_MIDFH
	ROR	S_MIDFL
	STA	S_MIDI
	LDA	S_MIDFH
	CLC
	ADC	XVIEWF
	STA	S_MIDFH
	LDA	S_MIDI
	ADC	XVIEWI
	STA	S_MIDI        
	INY
	LDA	(STPTR),Y
	STA	T_MIDFH
	INY
	LDA	(STPTR),Y
	CMP	#$80
	ROR
	ROR	T_MIDFH
	ROR	T_MIDFL
	CMP	#$80
	ROR
	ROR	T_MIDFH
	ROR	T_MIDFL
	STA	T_MIDI
	LDA	T_MIDFH
	CLC
	ADC	YVIEWF
	STA	T_MIDFH
	LDA	T_MIDI
	ADC	YVIEWI
	STA	T_MIDI
	INY
	LDA	(STPTR),Y
	STA	DS_FRACL
	LDX	#$00
	INY
	LDA	(STPTR),Y
	CMP	#$80
	BCC	+
	DEX
+	STA	DS_FRACH
	STX	DS_INT
	ROR		; S = S_MID + DS/2
	STA	S_FRACH
	LDA	DS_FRACL
	ROR
	CLC
	ADC	S_MIDFL
	STA	S_FRACL
	LDA	S_FRACH
	ADC	S_MIDFH
	STA	S_FRACH
	TXA
	ADC	S_MIDI
	STA	S_INT
	INY
	LDA	(STPTR),Y
	STA	DT_FRACL
	LDX	#$00
	INY
	LDA	(STPTR),Y
	CMP	#$80
	BCC	+
	DEX
+	STA	DT_FRACH
	STX	DT_INT
	ROR		; T = T_MID + DT/2
	STA	T_FRACH
	LDA	DT_FRACL
	ROR
	CLC
	ADC	T_MIDFL
	STA	T_FRACL
	LDA	T_FRACH
	ADC	T_MIDFH
	STA	T_FRACH
	TXA
	ADC	T_MIDI
	STA	T_INT
	TYA		; Update STPTR to next scanline
	SEC
	ADC	STPTRL
	STA	STPTRL
	BCC	+
	INC	STPTRH
+	LDY	#15	; Right-middle of screen
	BNE	GRNDRE
-	LDA	#$00
	BEQ	+
GRNDRE	LDA	S_INT
	CMP	#$40
	BCS	-
	LDX	T_INT
	CPX	#$40
	BCS	-
	ORA	MAP_TBLL,X
	STA	RDTEXRE+1
	LDA	MAP_TBLH,X
	STA	RDTEXRE+2
RDTEXRE	LDA	MAP
	AND	#$0F
+	ORA	(GBASE),Y
	STA	(GBASE),Y
	LDA	S_FRACL	; S = S + DS
	CLC
	ADC	DS_FRACL
	STA	S_FRACL
	LDA	S_FRACH
	ADC	DS_FRACH
	STA	S_FRACH
	LDA	S_INT
	ADC	DS_INT
	STA	S_INT
	LDA	T_FRACL	; T = T + DT
	CLC
	ADC	DT_FRACL
	STA	T_FRACL
	LDA	T_FRACH
	ADC	DT_FRACH
	STA	T_FRACH
	LDA	T_INT
	ADC	DT_INT
	STA	T_INT
	INY
	CPY	#30
	BNE	GRNDRE
;*
;* Draw left half of even scanline
;*
	LDA	DS_FRACL
	STA	TMP
	LDA	DS_FRACH
	CMP	#$80
	ROR		; S = S_MID - DS/2
	STA	TMP+1
	ROR	TMP
	LDA	S_MIDFL
	SEC
	SBC	TMP
	STA	S_FRACL
	LDA	S_MIDFH
	SBC	TMP+1
	STA	S_FRACH
	LDA	S_MIDI
	SBC	DS_INT
	STA	S_INT
	LDA	DT_FRACL
	STA	TMP
	LDA	DT_FRACH
	CMP	#$80
	ROR		; T = T_MID - DT/2
	STA	TMP+1
	ROR	TMP
	LDA	T_MIDFL
	SEC
	SBC	TMP
	STA	T_FRACL
	LDA	T_MIDFH
	SBC	TMP+1
	STA	T_FRACH
	LDA	T_MIDI
	SBC	DT_INT
	STA	T_INT
	LDY	#14	; Left-middle of screen
	BNE	GRNDLE
-	LDA	#$00
	BEQ	+
GRNDLE	LDA	S_INT
	CMP	#$40
	BCS	-
	LDX	T_INT
	CPX	#$40
	BCS	-
	ORA	MAP_TBLL,X
	STA	RDTEXLE+1
	LDA	MAP_TBLH,X
	STA	RDTEXLE+2
RDTEXLE	LDA	MAP
	AND	#$0F
+	ORA	(GBASE),Y
	STA	(GBASE),Y
	LDA	S_FRACL	; S = S + DS
	SEC
	SBC	DS_FRACL
	STA	S_FRACL
	LDA	S_FRACH
	SBC	DS_FRACH
	STA	S_FRACH
	LDA	S_INT
	SBC	DS_INT
	STA	S_INT
	LDA	T_FRACL	; T = T + DT
	SEC
	SBC	DT_FRACL
	STA	T_FRACL
	LDA	T_FRACH
	SBC	DT_FRACH
	STA	T_FRACH
	LDA	T_INT
	SBC	DT_INT
	STA	T_INT
	DEY
	BPL	GRNDLE
	DEC	VDLY
	BNE	+
	BIT	SPEAKER
	LDA	VTONE
	STA	VDLY
+	INC	SCANLN	; Move on to next even/odd scanlines
	LDY	SCANLN
	CPY	#HORIZON/2
	BEQ	DRAWBACK
	JMP	DRAWGRNDSCN
;*
;* Draw background
;*
DRAWBACK LDA	VIEWPORT ; Max scanline number/2
	SEC
	SBC	SCANLN
	TAY
	LDA	TXT_TBLL,Y
	STA	STBCK1+1
	LDA	TXT_TBLH,Y
	ORA	GPAGE
	STA	STBCK1+2
	LDA	TXT_TBLL-1,Y
	STA	STBCK2+1
	LDA	TXT_TBLH-1,Y
	ORA	GPAGE
	STA	STBCK2+2
	LDY	#29
	LDA	ANGLE
	CLC
	ADC	#15
-	AND	#$7F
	TAX
	LDA	WALLS,X
STBCK1	STA	$0400,Y
	AND	#$F0
STBCK2	STA	$0400,Y
	DEX
	TXA
	DEY
	BPL	-
;*
;* Draw top-down map view
;*
DRAWMAP	LDA	VIEWPORT
	TAY
	STY	SCANLN
	SEC
	SBC	#9	; 20 - 2
	STA	VIEWPORT
DRAWMAPSCN
	LDA	TXT_TBLL,Y
	STA	STMAP+1
	LDA	TXT_TBLH,Y
	ORA	GPAGE
	STA	STMAP+2
	LDX	#$80
	TYA
	CLC
	ADC	YVIEWI
	SEC
	SBC	#$05
;	SEC
	SBC	VIEWPORT
	CMP	#$40
	BCS	+	; Scanline is off the map, so force black coordinates
	TAX
	LDA	MAP_TBLL,X
	STA	LDMAP+1
	LDA	MAP_TBLH,X
	STA	LDMAP+2
	LDA	XVIEWI
	SEC
	SBC	#$04
	TAX
+	LDY	#31
-	CPX	#$40
	BCC	LDMAP
	LDA	#$00
	BEQ	STMAP
LDMAP	LDA	MAP,X
STMAP	STA	$0400,Y
	INX
	INY
	CPY	#40
	BNE	-
	DEC	MDLY
	BNE	+
	BIT	SPEAKER
	LDA	MTONE
	STA	MDLY
+	DEC	SCANLN
	LDY	SCANLN
	CPY	VIEWPORT
	BNE	DRAWMAPSCN
	LDA	P1XI	; Plot player 1 on map
	SEC
	SBC	XVIEWI
	CLC
	ADC	#$04
	BMI	+
	CMP	#9
	BCS	+
	ADC	#31
	TAY
	LDA	P1YI
	SEC
	SBC	YVIEWI
	CLC
	ADC	#$04
	BMI	+
	CMP	#9
	BCS	+
	SEC
	ADC	VIEWPORT
	TAX
	LDA	TXT_TBLL,X
	STA	TMP
	LDA	TXT_TBLH,X
	ORA	GPAGE
	STA	TMP+1
	LDA	P1CYCLE
	STA	(TMP),Y
+	LDA	P2XI	; Plot player 2 on map
	SEC
	SBC	XVIEWI
	CLC
	ADC	#$04
	BMI	+
	CMP	#9
	BCS	+
	ADC	#31
	TAY
	LDA	P2YI
	SEC
	SBC	YVIEWI
	CLC
	ADC	#$04
	BMI	+
	CMP	#9
	BCS	+
	SEC
	ADC	VIEWPORT
	TAX
	LDA	TXT_TBLL,X
	STA	TMP
	LDA	TXT_TBLH,X
	ORA	GPAGE
	STA	TMP+1
	LDA	P2CYCLE
	STA	(TMP),Y
+	RTS
;*
;* Draw enemy light cycle
;*
DRAWENEMY
	ASL
	STA	EBTTM
	INC	EBTTM
	INC	EBTTM
;	SEC
	SBC	#HORIZON-1
	STA	VIEWPORT
	LDA	#$00
	STA	SCANLN
	TXA
	ASL
	STA	TMP
	CMP	#$80
	ROR
	CMP	#$80
	ROR
	CLC
	ADC	TMP
	STA	TMP
	LDA	#15
	SEC
	SBC	TMP
	CMP	#30
	BCS	++
	STA	ECNTR
	LDA	PPSIZE
	CMP	#$01
	BNE	+
	LDY	VIEWPORT	; Only one pixel to plot
	INY
	LDX	ECNTR
	JMP	GPLOT
+	LDA	SCANLN
-	CLC
	ADC	VIEWPORT
	TAY
	LDA	ECNTR
	SEC
	SBC	SCANLN
	BPL	+
	LDA	#$00
+	TAX
	LDA	ECNTR
	CLC
	ADC	SCANLN
	CMP	#30
	BCC	+
	LDA	#29
+	JSR	GHLIN
	INC	SCANLN
	LDA	SCANLN
	CMP	PPSIZE
	BCC	-
	ASL
;	CLC
	ADC	VIEWPORT
	STA	VIEWPORT
-	SEC
	SBC	SCANLN
	CMP	EBTTM
	BCS	++
	TAY
	LDA	ECNTR
	SEC
	SBC	SCANLN
	BPL	+
	LDA	#$00
+	TAX
	LDA	ECNTR
	CLC
	ADC	SCANLN
	CMP	#30
	BCC	+
	LDA	#29
+	JSR	GHLIN
	LDA	VIEWPORT
	DEC	SCANLN
	BPL	-
++	RTS
ECNTR	!BYTE	$00
EBTTM	!BYTE	$00
;*
;* Draw boost amount
;*
UPDTBST	LSR
	LSR
	LSR
	LSR
	STA	TMP
	JSR	GOTOXY
	JSR	NORMAL
	LDX	#$0F
EMPTYBST CPX	TMP
	BEQ	+
	LDA	#' '
	JSR	PUTC
	DEX
	BPL	EMPTYBST
	BMI	++
+	CPX	#$00
	BEQ	++
	JSR	INVERSE
FULLBST	LDA	#'='
	JSR	PUTC
	DEX
	BNE	FULLBST
++	JSR	INVERSE
	RTS
;*
;* Draw paddle position
;*
UPDTPDL	TYA
	LSR
	LSR
	LSR
	CMP	GCPREVY
	BEQ	++
	STX	TMP
	PHA
	LDX	#0
	LDY	#22
	JSR	GOTOXY
	LDA	GCPREVY
	CMP	#14
	BCC	+
	LDA	#14
+	CLC
	ADC	#3
	TAY
	LDA	(TBAS1),Y
	AND	#$7F
	STA	(TBAS1),Y
	STA	(TBAS2),Y
	PLA
	STA	GCPREVY
	CMP	#14
	BCC	+
	LDA	#14
+	CLC
	ADC	#3
	TAY
	LDA	(TBAS1),Y
	ORA	#$80
	STA	(TBAS1),Y
	STA	(TBAS2),Y
	LDX	TMP
++	TXA
	LSR
	LSR
	LSR
	CMP	GCPREVX
	BEQ	++
	PHA
	LDX	#0
	LDY	#22
	JSR	GOTOXY
	LDA	GCPREVX
	CMP	#14
	BCC	+
	LDA	#14
+	CLC
	ADC	#22
	TAY
	LDA	(TBAS1),Y
	AND	#$7F
	STA	(TBAS1),Y
	STA	(TBAS2),Y
	PLA
	STA	GCPREVX
	CMP	#14
	BCC	+
	LDA	#14
+	CLC
	ADC	#22
	TAY
	LDA	(TBAS1),Y
	ORA	#$80
	STA	(TBAS1),Y
	STA	(TBAS2),Y
++	LDY	GCPREVY
	LDX	GCPREVX
	RTS
GCPREVX	!BYTE	$00
GCPREVY	!BYTE	$00
