mirror of
https://github.com/RevCurtisP/C02.git
synced 2024-11-22 16:34:15 +00:00
149 lines
4.8 KiB
Plaintext
149 lines
4.8 KiB
Plaintext
|
;arena.a02 - Two Line Arena Kernal for Atari 2600
|
||
|
;Requires Constants ARLINS, P0LINS and P1LINS
|
||
|
|
||
|
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
|
||
|
|
||
|
P0OFST: STA TEMP0 ;Save Multiplier
|
||
|
BEQ POFFSX ;If 0, Return
|
||
|
LDA #P0LINS ;Load # of Lines
|
||
|
BNE POFFST
|
||
|
|
||
|
P1OFST: STA TEMP0 ;Save Multiplier
|
||
|
BEQ POFFSX ;If 0, Return
|
||
|
LDA #P1LINS ;Load # of Lines
|
||
|
POFFST: STA TEMP1
|
||
|
POFFSL: TXA
|
||
|
CLC
|
||
|
ADC TEMP1
|
||
|
TAX
|
||
|
TYA
|
||
|
ADC #0
|
||
|
TAY
|
||
|
DEC TEMP0
|
||
|
BNE POFFSL
|
||
|
POFFSX: RTS
|
||
|
|
||
|
;p0prep() - Prepare Player 0 for Display
|
||
|
;Args: A - Y-Position
|
||
|
; X,Y - Address of Graphics Data
|
||
|
;Uses: ARLINS, P0LINS
|
||
|
;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 #ARLINS ;Draw = Top Line + Height - Y Position
|
||
|
CLC
|
||
|
ADC #P0LINS
|
||
|
SEC
|
||
|
SBC TEMP0
|
||
|
STA P0DRAW
|
||
|
TXA ;Pointer = GfxAddr + Height - 1 - Y Position
|
||
|
CLC
|
||
|
ADC #P0LINS-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: ARLINS, P1LINS
|
||
|
;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 #ARLINS ;Draw = Top Line + Height - Y Position + 1
|
||
|
CLC
|
||
|
ADC #P1LINS+1
|
||
|
SEC
|
||
|
SBC TEMP1
|
||
|
STA P1DRAW
|
||
|
TXA ;Pointer = GfxAddr + Height - 1 - Y Position
|
||
|
CLC
|
||
|
ADC #P1LINS-1
|
||
|
TAX
|
||
|
TYA
|
||
|
ADC #0
|
||
|
TAY
|
||
|
TXA
|
||
|
SEC
|
||
|
SBC TEMP1
|
||
|
STA P1PTRL
|
||
|
TYA
|
||
|
SBC #0
|
||
|
STA P1PTRH
|
||
|
RTS
|
||
|
|
||
|
;ardisp() - Kernel Display Routine
|
||
|
;Args: A = Playfield Color
|
||
|
;Uses: ARLINS, P0LINS, P1LINS, P0PTRL, P1PTRL
|
||
|
;Affects: A,X,Y,C,N,Z
|
||
|
ARDISP: STA COLUPF
|
||
|
LDY #ARLINS+1 ; 2 14 - Number of Kernal Lines (Scanlines / 2)
|
||
|
LDX #$FF ; - Initialize Playfield Index
|
||
|
LDA #1 ; - Reflect Playfield
|
||
|
STA CTRLPF ; - Set Playfield Control Register
|
||
|
LDA #P1LINS-1 ; - Preset GRP1 if Player 1 on Top Line
|
||
|
DCP P1DRAW ;
|
||
|
BCS ARDIS0 ;
|
||
|
LDA #0 ;
|
||
|
BYTE $2C ;
|
||
|
ARDIS0: LDA (P1PTRL),Y ;
|
||
|
STA GRP1 ; 3 6
|
||
|
DEY ; 2 ??
|
||
|
ARDISL: TYA ; 2 29 - Get Loop Counter
|
||
|
AND #ARMULT-1 ; 2 31 - Mask Against Multiplier
|
||
|
BNE ARDISS ; 2 33 If 0
|
||
|
INX ; 2 35 - Increment Playfield Pointer
|
||
|
ARDISS: LDA #P0LINS-1 ; 2 15 - Player 1 Height minus 1 due to STArting with 0
|
||
|
DCP P0DRAW ; 5 20 - Decrement P0DRAW and compare with height
|
||
|
BCS ARDIS1 ; 2 22 - If Player 0 not on Current Scanline
|
||
|
LDA #0 ; 2 24 - Load 0 (No Graphics)
|
||
|
BYTE $2C ; 4 28 - Else (BIT trick)
|
||
|
ARDIS1: 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
|
||
|
LDA ARENA0,X ; 4 7 - get current scanline's playfield pattern
|
||
|
STA PF0 ; 3 10 - @0-22 and update it
|
||
|
LDA ARENA1,X ; 4 14 - get current scanline's playfield pattern
|
||
|
STA PF1 ; 3 17 - @71-28 and update it
|
||
|
LDA ARENA2,X ; 4 21 - get current scanline's playfield pattern
|
||
|
STA PF2 ; 3 24 - @60-39
|
||
|
LDA #P1LINS-1 ; 2 26 - Player 1 Height minus 1 due to STArting with 0
|
||
|
DCP P1DRAW ; 5 31 - Load 0 (No Graphics)
|
||
|
BCS ARDIS2 ; 2 33 - If Player 1 not on Current Scanline
|
||
|
LDA #0 ; 2 35 - Load 0 (No Graphics)
|
||
|
BYTE $2C ; 4 39 - Else (BIT trick)
|
||
|
ARDIS2: LDA (P1PTRL),Y ;(5 39)- Load Player 1 Graphics Line
|
||
|
STA WSYNC ; 3 42 - Start Line 2
|
||
|
STA GRP1 ; 3 3 - Set Player 1 Graphics Data
|
||
|
DEY ; 2 5 - Decrement Loop Counter
|
||
|
BNE ARDISL ; 2 7 - and Loop if >= 0
|
||
|
STY PF0 ; 3 10 - Clear Playfield
|
||
|
STY PF1 ; 3 13 -
|
||
|
STY PF2 ; 3 16 -
|
||
|
RTS
|
||
|
|