mirror of
https://github.com/RevCurtisP/C02.git
synced 2024-11-25 21:33:44 +00:00
125 lines
4.2 KiB
Plaintext
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
|
|
|