1
0
mirror of https://github.com/RevCurtisP/C02.git synced 2024-11-24 15:31:17 +00:00
C02/vcs/include/k2line.a02

125 lines
4.2 KiB
Plaintext

;k2line.a02 - Two Line Kernal Assembly Language File for C02
;Requires ConSTAnts KNLLNS, P0HGHT and P1HGHT
;Set Kernel Top Line
;;TODO - Adjust for Extra WSYNC in DSPLNS
;; Need to Execute a second WSYNC if KNLLNS is Even
KNLTOP EQU KNLLNS/2-1 ;Kernel Lines / 2 Scanlines - 1 (Zero Based)
P0DRAW EQU $D0 ;Player 0 Draw Counter
P1DRAW EQU $D1 ;Player 1 Draw Counter
P0PTRL EQU $D2 ;Player 0 Graphics Pointer
P0PTRH EQU $D3
P1PTRL EQU $D4 ;Player 0 Graphics Pointer
P1PTRH EQU $D5
;p0prep() - Prepare Player 0 for Display
;Args: A - Y-Position
; X,Y - Address of Graphics Data
;Uses: KNLLNS, P0HGHT
;Sets: TEMP0 - Y-Position
;Affects; A,C,N,Z
P0PREP: LSR ;Divide by 2 for Two-line Position
STA TEMP0 ;Save Y Position
ROL ;Rotate Carry into Bit 1
EOR #1 ;Reverse It
STA VDELP0 ;and Store in Vertical Delay Register
LDA #KNLTOP ;Draw = Top Line + Height - Y Position
CLC
ADC #P0HGHT
SEC
SBC TEMP0
STA P0DRAW
TXA ;Pointer = GfxAddr + Height - 1 - Y Position
CLC
ADC #P0HGHT-1
TAX
TYA
ADC #0
TAY
TXA
SEC
SBC TEMP0
STA P0PTRL
TYA
SBC #0
STA P0PTRH
RTS
;p1prep() - Prepare Player 1 for Display
;Args: A - Y-Position
; X,Y - Address of Graphics Data
;Uses: KNLLNS, P1HGHT
;Sets: TEMP1 - Y-Position
;Affects; A,C,N,Z
P1PREP: CLC ;Add 1 to Y-Position
ADC #1 ;to Compensate for GRP1 Priming
LSR ;Divide by 2 for Two-line Position
STA TEMP1 ;Save Y Position
ROL ;Rotate Carry into Bit 1
EOR #1 ;Reverse It
STA VDELP1 ;and Store in Vertical Delay Register
LDA #KNLTOP ;Draw = Top Line + Height - Y Position + 1
CLC
ADC #P1HGHT+1
SEC
SBC TEMP1
STA P1DRAW
TXA ;Pointer = GfxAddr + Height - 1 - Y Position
CLC
ADC #P1HGHT-1
TAX
TYA
ADC #0
TAY
TXA
SEC
SBC TEMP1
STA P1PTRL
TYA
SBC #0
STA P1PTRH
RTS
;dsplns() - Kernel Display Routine
;Args: None
;Uses: KNLLNS, P0HGHT, P1HGHT, P0PTRL, P1PTRL
;Affects: A,X,Y,C,N,Z
DSPLNS: LDY #KNLTOP+1 ; - Number of Kernal Lines (Scanlines / 2)
LDA #1 ; - Reflect Playfield
STA CTRLPF ; - Set Playfield Control Register
LDA #P1HGHT-1 ; - Preset GRP1 if Player 1 on Top Line
DCP P1DRAW ;
BCS DSPLN0 ;
LDA #0 ;
BYTE $2C ;
DSPLN0: LDA (P1PTRL),Y ;
STA GRP1 ; 3 6
DEY ; 2 8
AND ($FF),Y ; 5 13 - Waste 5 Cycles to Match Line 2 Loop
DSPLNL: LDA #P0HGHT-1 ; 2 15 - Player 1 Height minus 1 due to STArting with 0
DCP P0DRAW ; 5 20 - Decrement P0DRAW and compare with height
BCS DSPLN1 ; 2 22 - If Player 0 not on Current Scanline
LDA #0 ; 2 24 - Load 0 (No Graphics)
BYTE $2C ; 4 28 - Else (BIT trick)
DSPLN1: LDA (P0PTRL),Y ;(5 28)- Load Player 0 Graphics Line
STA WSYNC ; 3 31 - STArt Line 2
STA GRP0 ; 3 3 - Set Player 0 Graphics Data
LDX #%11111111 ; 2 5 - Set Playfield Pattern for
STX PF0 ; 3 8 - Vertical Alignment Testing
LDA #P1HGHT-1 ; 2 10 - Player 1 Height minus 1 due to STArting with 0
DCP P1DRAW ; 5 15 - Load 0 (No Graphics)
BCS DPSLN2 ; 2 17 - If Player 1 not on Current Scanline
LDA #0 ; 2 19 - Load 0 (No Graphics)
BYTE $2C ; 4 23 - Else (BIT trick)
DPSLN2: LDA (P1PTRL),Y ;(5 23)- Load Player 1 Graphics Line
STA WSYNC ; 3 26 - STArt Line 2
STA GRP1 ; 3 3 - Set Player 1 Graphics Data
LDX #0 ; 2 5 - Set Playfield Pattern for
STX PF0 ; 3 8 - Vertical Alignment Testing
DEY ; 2 10 - Decrement Loop Counter
BPL DSPLNL ; 2 12 - and Loop if >= 0
RTS