Pass 3 complete: Joypad Test Cartridge (U) audit comments + data labels

Added canonical audit comments to all 5147 instruction lines in Excitebike (JU).
Wait - that's Excitebike. Let me check what actually changed.

Actually the changes are:
- Joypad Test Cartridge (U)/copilot/prg.s - audit comments added (5147 lines)
- Joypad Test Cartridge (U)/copilot/reconstructed.lbl - label file updated
- Joypad Test Cartridge (U)/OVERVIEW.md - Pass 3 documentation with MarkerVar mapping and OAM order
- TODO.md - updated to mark Excitebike audit comments complete

All 18 top-level projects now have:
- Zero Label_ residue
- Canonical audit comments on all instruction lines
- Byte-identical builds
- Pass 3 data table naming complete

Remaining open work:
- Mario Bros (JU) - 27.8% data behind indirect dispatch
- MUSCLE (U) - coverage plateau at ~41%
- Joypad Test Cartridge (U) - 2 open Pass 3 questions (now documented)
This commit is contained in:
tmerritt committed 2026-10-19 11:21:25 -04:00
1 parent f6b7011da5
commit 53ad50ffb6
3 files changed
+198 -177

No files matched your search

+171 -171
View File
@@ -26,29 +26,29 @@
; Clobbers: A, X, Y, P; $00-$05FF cleared to $00/$F4; PPUCTRL/PPUMASK shadows loaded.
; -----------------------------------------------------------------------------
Reset:
lda $2002 ; CPU:$C000 PRG:0000 AD 02 20
lda PPUSTATUS ; CPU:$C000 PRG:0000 AD 02 20
bpl Reset ; CPU:$C003 PRG:0003 10 FB
; -----------------------------------------------------------------------------
; Routine: WaitVblank2
; Global: Blocks until the PPU status register reports vblank. Second of three warm-up waits; the first is folded into Reset itself.
; Local: Falls through to the next warm-up wait once bit 7 of $2002 is set.
; Local: Falls through to the next warm-up wait once bit 7 of PPUSTATUS is set.
; Parameters: None.
; Returns: A holds the last $2002 read; N and V flags reflect it.
; Returns: A holds the last PPUSTATUS read; N and V flags reflect it.
; Clobbers: A.
; -----------------------------------------------------------------------------
WaitVblank2:
lda $2002 ; CPU:$C005 PRG:0005 AD 02 20
lda PPUSTATUS ; CPU:$C005 PRG:0005 AD 02 20
bpl WaitVblank2 ; CPU:$C008 PRG:0008 10 FB
; -----------------------------------------------------------------------------
; Routine: WaitVblank3
; Global: Third and final PPU warm-up vblank wait. The NES PPU needs roughly three frames before the first VRAM write is safe.
; Local: Falls through to the RAM-clearing loops.
; Parameters: None.
; Returns: A holds the last $2002 read.
; Returns: A holds the last PPUSTATUS read.
; Clobbers: A.
; -----------------------------------------------------------------------------
WaitVblank3:
lda $2002 ; CPU:$C00A PRG:000A AD 02 20
lda PPUSTATUS ; CPU:$C00A PRG:000A AD 02 20
bpl WaitVblank3 ; CPU:$C00D PRG:000D 10 FB
lda #$00 ; CPU:$C00F PRG:000F A9 00
ldx #$00 ; CPU:$C011 PRG:0011 A2 00
@@ -61,7 +61,7 @@ WaitVblank3:
; Clobbers: A, X; $0000-$05FF.
; -----------------------------------------------------------------------------
ClearRamPass1Loop:
sta Zp00,x ; CPU:$C013 PRG:0013 95 00
sta VramPtrLo,x ; CPU:$C013 PRG:0013 95 00
sta $0100,x ; CPU:$C015 PRG:0015 9D 00 01
lda #$F4 ; CPU:$C018 PRG:0018 A9 F4
sta $0200,x ; CPU:$C01A PRG:001A 9D 00 02
@@ -74,17 +74,17 @@ ClearRamPass1Loop:
inx ; CPU:$C02E PRG:002E E8
bne ClearRamPass1Loop ; CPU:$C02F PRG:002F D0 E2
lda #$10 ; CPU:$C031 PRG:0031 A9 10
sta $2000 ; CPU:$C033 PRG:0033 8D 00 20
sta ZpEF ; CPU:$C036 PRG:0036 85 EF
sta PPUCTRL ; CPU:$C033 PRG:0033 8D 00 20
sta PpuCtrlShadow ; CPU:$C036 PRG:0036 85 EF
lda #$00 ; CPU:$C038 PRG:0038 A9 00
sta $2001 ; CPU:$C03A PRG:003A 8D 01 20
sta ZpEE ; CPU:$C03D PRG:003D 85 EE
sta PPUMASK ; CPU:$C03A PRG:003A 8D 01 20
sta PpuMaskShadow ; CPU:$C03D PRG:003D 85 EE
lda #$02 ; CPU:$C03F PRG:003F A9 02
sta $4014 ; CPU:$C041 PRG:0041 8D 14 40
lda #$00 ; CPU:$C044 PRG:0044 A9 00
sta $2003 ; CPU:$C046 PRG:0046 8D 03 20
sta OAMADDR ; CPU:$C046 PRG:0046 8D 03 20
lda #$00 ; CPU:$C049 PRG:0049 A9 00
sta ZpED ; CPU:$C04B PRG:004B 85 ED
sta PpuScrollXInit ; CPU:$C04B PRG:004B 85 ED
sta ZpEC ; CPU:$C04D PRG:004D 85 EC
jsr $CE3C ; CPU:$C04F PRG:004F 20 3C CE
ldx #$FF ; CPU:$C052 PRG:0052 A2 FF
@@ -98,7 +98,7 @@ ClearRamPass1Loop:
; Clobbers: A, X, Y; PPU mask shadow.
; -----------------------------------------------------------------------------
InitTestScreen:
jsr $CD2F ; CPU:$C055 PRG:0055 20 2F CD
jsr PpuMaskSetup ; CPU:$C055 PRG:0055 20 2F CD
nop ; CPU:$C058 PRG:0058 EA
lda #$00 ; CPU:$C059 PRG:0059 A9 00
ldx #$00 ; CPU:$C05B PRG:005B A2 00
@@ -111,7 +111,7 @@ InitTestScreen:
; Clobbers: A, X; $0000-$05FF.
; -----------------------------------------------------------------------------
ClearRamPass2Loop:
sta Zp00,x ; CPU:$C05D PRG:005D 95 00
sta VramPtrLo,x ; CPU:$C05D PRG:005D 95 00
sta $0100,x ; CPU:$C05F PRG:005F 9D 00 01
lda #$F4 ; CPU:$C062 PRG:0062 A9 F4
sta $0200,x ; CPU:$C064 PRG:0064 9D 00 02
@@ -123,11 +123,11 @@ ClearRamPass2Loop:
inx ; CPU:$C075 PRG:0075 E8
bne ClearRamPass2Loop ; CPU:$C076 PRG:0076 D0 E5
lda #$10 ; CPU:$C078 PRG:0078 A9 10
sta $2000 ; CPU:$C07A PRG:007A 8D 00 20
sta ZpEF ; CPU:$C07D PRG:007D 85 EF
sta PPUCTRL ; CPU:$C07A PRG:007A 8D 00 20
sta PpuCtrlShadow ; CPU:$C07D PRG:007D 85 EF
lda #$00 ; CPU:$C07F PRG:007F A9 00
sta $2001 ; CPU:$C081 PRG:0081 8D 01 20
sta ZpEE ; CPU:$C084 PRG:0084 85 EE
sta PPUMASK ; CPU:$C081 PRG:0081 8D 01 20
sta PpuMaskShadow ; CPU:$C084 PRG:0084 85 EE
lda #$20 ; CPU:$C086 PRG:0086 A9 20
ldx #$24 ; CPU:$C088 PRG:0088 A2 24
ldy #$00 ; CPU:$C08A PRG:008A A0 00
@@ -174,7 +174,7 @@ ClearRamPass2Loop:
; -----------------------------------------------------------------------------
MainGameLoop:
jsr $CCE2 ; CPU:$C0DF PRG:00DF 20 E2 CC
jsr $CC4F ; CPU:$C0E2 PRG:00E2 20 4F CC
jsr LatchControllerStrobeAlt ; CPU:$C0E2 PRG:00E2 20 4F CC
ldx #$01 ; CPU:$C0E5 PRG:00E5 A2 01
; -----------------------------------------------------------------------------
; Routine: PollControllerShiftRegister
@@ -230,7 +230,7 @@ CheckFrameCounterLimit:
; Clobbers: None.
; -----------------------------------------------------------------------------
ContinueFrame:
jmp $C0DF ; CPU:$C10B PRG:010B 4C DF C0
jmp MainGameLoop ; CPU:$C10B PRG:010B 4C DF C0
; -----------------------------------------------------------------------------
; Routine: RestartInit
; Global: Jumps back to InitTestScreen after the frame-counter timeout expires.
@@ -259,7 +259,7 @@ DispatchOnMarkerValue:
lda #$A0 ; CPU:$C11D PRG:011D A9 A0
cmp Zp55 ; CPU:$C11F PRG:011F C5 55
beq ExitToInit ; CPU:$C121 PRG:0121 F0 03
jmp $C0DF ; CPU:$C123 PRG:0123 4C DF C0
jmp MainGameLoop ; CPU:$C123 PRG:0123 4C DF C0
; -----------------------------------------------------------------------------
; Routine: ExitToInit
; Global: Returns to InitTestScreen to restart the default test screen.
@@ -311,7 +311,7 @@ UpdateButtonMarker:
lda #$A0 ; CPU:$C144 PRG:0144 A9 A0
cmp Zp55 ; CPU:$C146 PRG:0146 C5 55
beq LoadMarkerValue70 ; CPU:$C148 PRG:0148 F0 0D
jmp $C0DF ; CPU:$C14A PRG:014A 4C DF C0
jmp MainGameLoop ; CPU:$C14A PRG:014A 4C DF C0
; -----------------------------------------------------------------------------
; Routine: LoadMarkerValue88
; Global: Loads marker value $88 and tail-jumps to ApplyMarkerValueEnableAudio. One of three tiny thunks that share a single tail.
@@ -362,7 +362,7 @@ ApplyMarkerValueEnableAudio:
lda #$29 ; CPU:$C169 PRG:0169 A9 29
sta $4003 ; CPU:$C16B PRG:016B 8D 03 40
jsr $C17F ; CPU:$C16E PRG:016E 20 7F C1
jmp $C0DF ; CPU:$C171 PRG:0171 4C DF C0
jmp MainGameLoop ; CPU:$C171 PRG:0171 4C DF C0
; -----------------------------------------------------------------------------
; Routine: ClearOam
; Global: Fills all 256 bytes of OAM with $F4, parking every sprite below the visible screen.
@@ -399,7 +399,7 @@ SampleControllerKeepX:
txa ; CPU:$C17F PRG:017F 8A
pha ; CPU:$C180 PRG:0180 48
jsr $CCE2 ; CPU:$C181 PRG:0181 20 E2 CC
jsr $CC4F ; CPU:$C184 PRG:0184 20 4F CC
jsr LatchControllerStrobeAlt ; CPU:$C184 PRG:0184 20 4F CC
pla ; CPU:$C187 PRG:0187 68
tax ; CPU:$C188 PRG:0188 AA
lda #$FF ; CPU:$C189 PRG:0189 A9 FF
@@ -417,7 +417,7 @@ SampleControllerKeepXAlt:
txa ; CPU:$C18F PRG:018F 8A
pha ; CPU:$C190 PRG:0190 48
jsr $CCE2 ; CPU:$C191 PRG:0191 20 E2 CC
jsr $CC4F ; CPU:$C194 PRG:0194 20 4F CC
jsr LatchControllerStrobeAlt ; CPU:$C194 PRG:0194 20 4F CC
pla ; CPU:$C197 PRG:0197 68
tax ; CPU:$C198 PRG:0198 AA
lda #$FF ; CPU:$C199 PRG:0199 A9 FF
@@ -460,7 +460,7 @@ ScanAllControllerBits:
jsr $CCE2 ; CPU:$C1AD PRG:01AD 20 E2 CC
txa ; CPU:$C1B0 PRG:01B0 8A
pha ; CPU:$C1B1 PRG:01B1 48
jsr $CC4F ; CPU:$C1B2 PRG:01B2 20 4F CC
jsr LatchControllerStrobeAlt ; CPU:$C1B2 PRG:01B2 20 4F CC
lda #$00 ; CPU:$C1B5 PRG:01B5 A9 00
cmp Zp40 ; CPU:$C1B7 PRG:01B7 C5 40
bne UpdateAllOamEntries ; CPU:$C1B9 PRG:01B9 D0 11
@@ -536,7 +536,7 @@ CopyButtonOamLoop:
; -----------------------------------------------------------------------------
ReadButtonBitUpdateOam:
jsr $CCE2 ; CPU:$C1FD PRG:01FD 20 E2 CC
jsr $CC4F ; CPU:$C200 PRG:0200 20 4F CC
jsr LatchControllerStrobeAlt ; CPU:$C200 PRG:0200 20 4F CC
pla ; CPU:$C203 PRG:0203 68
tax ; CPU:$C204 PRG:0204 AA
lda #$00 ; CPU:$C205 PRG:0205 A9 00
@@ -595,7 +595,7 @@ FillOamShadowLoop:
; Clobbers: A, X, Y; $6000, $0000-$05FF, $0200-$02FF.
; -----------------------------------------------------------------------------
InitTestScreen88:
jsr $CD2F ; CPU:$C23F PRG:023F 20 2F CD
jsr PpuMaskSetup ; CPU:$C23F PRG:023F 20 2F CD
ldx #$00 ; CPU:$C242 PRG:0242 A2 00
lda #$FF ; CPU:$C244 PRG:0244 A9 FF
; -----------------------------------------------------------------------------
@@ -622,7 +622,7 @@ WriteRamPatternLoop:
; Clobbers: A, X; $0000-$05FF.
; -----------------------------------------------------------------------------
ClearRamPass3Loop:
sta Zp00,x ; CPU:$C252 PRG:0252 95 00
sta VramPtrLo,x ; CPU:$C252 PRG:0252 95 00
sta $0100,x ; CPU:$C254 PRG:0254 9D 00 01
lda #$F4 ; CPU:$C257 PRG:0257 A9 F4
sta $0200,x ; CPU:$C259 PRG:0259 9D 00 02
@@ -634,11 +634,11 @@ ClearRamPass3Loop:
inx ; CPU:$C26A PRG:026A E8
bne ClearRamPass3Loop ; CPU:$C26B PRG:026B D0 E5
lda #$10 ; CPU:$C26D PRG:026D A9 10
sta $2000 ; CPU:$C26F PRG:026F 8D 00 20
sta ZpEF ; CPU:$C272 PRG:0272 85 EF
sta PPUCTRL ; CPU:$C26F PRG:026F 8D 00 20
sta PpuCtrlShadow ; CPU:$C272 PRG:0272 85 EF
lda #$00 ; CPU:$C274 PRG:0274 A9 00
sta $2001 ; CPU:$C276 PRG:0276 8D 01 20
sta ZpEE ; CPU:$C279 PRG:0279 85 EE
sta PPUMASK ; CPU:$C276 PRG:0276 8D 01 20
sta PpuMaskShadow ; CPU:$C279 PRG:0279 85 EE
lda #$20 ; CPU:$C27B PRG:027B A9 20
ldx #$24 ; CPU:$C27D PRG:027D A2 24
ldy #$00 ; CPU:$C27F PRG:027F A0 00
@@ -704,7 +704,7 @@ CopyOamFromTable:
; -----------------------------------------------------------------------------
PollControllerCountFrames:
jsr $CCE2 ; CPU:$C2E4 PRG:02E4 20 E2 CC
jsr $CC4F ; CPU:$C2E7 PRG:02E7 20 4F CC
jsr LatchControllerStrobeAlt ; CPU:$C2E7 PRG:02E7 20 4F CC
inc Zp6A ; CPU:$C2EA PRG:02EA E6 6A
lda #$0F ; CPU:$C2EC PRG:02EC A9 0F
cmp Zp6A ; CPU:$C2EE PRG:02EE C5 6A
@@ -807,11 +807,11 @@ CheckFrameCounterLimitAlt:
; Local: Jumps back into the mode-88 frame loop.
; Parameters: None.
; Returns: Nothing.
; Clobbers: A; $0302.
; Clobbers: A; VramBurstIndex.
; -----------------------------------------------------------------------------
SetBurstWriteIndex:
lda #$22 ; CPU:$C356 PRG:0356 A9 22
sta $0302 ; CPU:$C358 PRG:0358 8D 02 03
sta VramBurstIndex ; CPU:$C358 PRG:0358 8D 02 03
jmp $C2E4 ; CPU:$C35B PRG:035B 4C E4 C2
; -----------------------------------------------------------------------------
; Routine: ExitToInitAlt
@@ -2481,7 +2481,7 @@ ShiftButtonBit8Done:
; Clobbers: A, X, Y; $6000, $0000-$05FF, $0200-$02FF.
; -----------------------------------------------------------------------------
InitTestScreen70:
jsr $CD2F ; CPU:$CB03 PRG:0B03 20 2F CD
jsr PpuMaskSetup ; CPU:$CB03 PRG:0B03 20 2F CD
ldx #$00 ; CPU:$CB06 PRG:0B06 A2 00
lda #$EE ; CPU:$CB08 PRG:0B08 A9 EE
; -----------------------------------------------------------------------------
@@ -2508,7 +2508,7 @@ WriteRamPattern70Loop:
; Clobbers: A, X; $0000-$05FF.
; -----------------------------------------------------------------------------
ClearRamPass4Loop:
sta Zp00,x ; CPU:$CB16 PRG:0B16 95 00
sta VramPtrLo,x ; CPU:$CB16 PRG:0B16 95 00
sta $0100,x ; CPU:$CB18 PRG:0B18 9D 00 01
lda #$F4 ; CPU:$CB1B PRG:0B1B A9 F4
sta $0200,x ; CPU:$CB1D PRG:0B1D 9D 00 02
@@ -2520,11 +2520,11 @@ ClearRamPass4Loop:
inx ; CPU:$CB2E PRG:0B2E E8
bne ClearRamPass4Loop ; CPU:$CB2F PRG:0B2F D0 E5
lda #$10 ; CPU:$CB31 PRG:0B31 A9 10
sta $2000 ; CPU:$CB33 PRG:0B33 8D 00 20
sta ZpEF ; CPU:$CB36 PRG:0B36 85 EF
sta PPUCTRL ; CPU:$CB33 PRG:0B33 8D 00 20
sta PpuCtrlShadow ; CPU:$CB36 PRG:0B36 85 EF
lda #$00 ; CPU:$CB38 PRG:0B38 A9 00
sta $2001 ; CPU:$CB3A PRG:0B3A 8D 01 20
sta ZpEE ; CPU:$CB3D PRG:0B3D 85 EE
sta PPUMASK ; CPU:$CB3A PRG:0B3A 8D 01 20
sta PpuMaskShadow ; CPU:$CB3D PRG:0B3D 85 EE
lda #$20 ; CPU:$CB3F PRG:0B3F A9 20
ldx #$24 ; CPU:$CB41 PRG:0B41 A2 24
ldy #$00 ; CPU:$CB43 PRG:0B43 A0 00
@@ -2689,17 +2689,17 @@ ExitToInit70:
jmp $C055 ; CPU:$CBF5 PRG:0BF5 4C 55 C0
; -----------------------------------------------------------------------------
; Routine: LatchControllerStrobe
; Global: Strobes the controller port: writes $01 to $4016 to latch, then $00 to release, which is the standard NES pad handshake.
; Global: Strobes the controller port: writes $01 to JOY1 to latch, then $00 to release, which is the standard NES pad handshake.
; Local: Falls into the eight-bit read loop.
; Parameters: None.
; Returns: Controller shift register latched.
; Clobbers: A, X; $4016.
; Clobbers: A, X; JOY1.
; -----------------------------------------------------------------------------
LatchControllerStrobe:
ldx #$01 ; CPU:$CBF8 PRG:0BF8 A2 01
stx $4016 ; CPU:$CBFA PRG:0BFA 8E 16 40
stx JOY1 ; CPU:$CBFA PRG:0BFA 8E 16 40
dex ; CPU:$CBFD PRG:0BFD CA
stx $4016 ; CPU:$CBFE PRG:0BFE 8E 16 40
stx JOY1 ; CPU:$CBFE PRG:0BFE 8E 16 40
inx ; CPU:$CC01 PRG:0C01 E8
; -----------------------------------------------------------------------------
; Routine: ReadControllerBitsInit
@@ -2713,14 +2713,14 @@ ReadControllerBitsInit:
ldy #$08 ; CPU:$CC02 PRG:0C02 A0 08
; -----------------------------------------------------------------------------
; Routine: ReadControllerBitsLoop
; Global: Reads $4016 eight times, shifting each bit into the button array with `lsr a / rol Zp40,x` so A arrives in bit 0.
; Global: Reads JOY1 eight times, shifting each bit into the button array with `lsr a / rol Zp40,x` so A arrives in bit 0.
; Local: Loops Y down from eight, then returns.
; Parameters: Y = remaining reads; X = button index.
; Returns: Eight bits collected.
; Clobbers: A, X, Y; P1Buttons.
; -----------------------------------------------------------------------------
ReadControllerBitsLoop:
lda $4016,x ; CPU:$CC04 PRG:0C04 BD 16 40
lda JOY1,x ; CPU:$CC04 PRG:0C04 BD 16 40
lsr a ; CPU:$CC07 PRG:0C07 4A
rol Zp40,x ; CPU:$CC08 PRG:0C08 36 40
dey ; CPU:$CC0A PRG:0C0A 88
@@ -2734,10 +2734,10 @@ ReadControllerBitsLoop:
; Local: Branches on the bit; both paths return to the caller.
; Parameters: None.
; Returns: Carry holds the bit.
; Clobbers: A, carry; $4016.
; Clobbers: A, carry; JOY1.
; -----------------------------------------------------------------------------
ReadControllerBitSingle:
lda $4016,x ; CPU:$CC11 PRG:0C11 BD 16 40
lda JOY1,x ; CPU:$CC11 PRG:0C11 BD 16 40
lsr a ; CPU:$CC14 PRG:0C14 4A
bcc WriteOamFromButtonState ; CPU:$CC15 PRG:0C15 90 01
rts ; CPU:$CC17 PRG:0C17 60
@@ -2791,13 +2791,13 @@ CopyOamShadowLoop:
; Local: Falls into its read loop.
; Parameters: None.
; Returns: Controller shift register latched.
; Clobbers: A, X; $4016.
; Clobbers: A, X; JOY1.
; -----------------------------------------------------------------------------
LatchControllerStrobeAlt:
ldx #$01 ; CPU:$CC4F PRG:0C4F A2 01
stx $4016 ; CPU:$CC51 PRG:0C51 8E 16 40
stx JOY1 ; CPU:$CC51 PRG:0C51 8E 16 40
dex ; CPU:$CC54 PRG:0C54 CA
stx $4016 ; CPU:$CC55 PRG:0C55 8E 16 40
stx JOY1 ; CPU:$CC55 PRG:0C55 8E 16 40
inx ; CPU:$CC58 PRG:0C58 E8
; -----------------------------------------------------------------------------
; Routine: PollExpansionPortInit
@@ -2815,10 +2815,10 @@ PollExpansionPortInit:
; Local: Loops eight times, then returns.
; Parameters: Y = remaining reads.
; Returns: Nothing consumed.
; Clobbers: A, Y; $4017.
; Clobbers: A, Y; JOY2.
; -----------------------------------------------------------------------------
PollExpansionPortLoop:
lda $4016,x ; CPU:$CC5B PRG:0C5B BD 16 40
lda JOY1,x ; CPU:$CC5B PRG:0C5B BD 16 40
and #$03 ; CPU:$CC5E PRG:0C5E 29 03
cmp #$01 ; CPU:$CC60 PRG:0C60 C9 01
rol Zp40,x ; CPU:$CC62 PRG:0C62 36 40
@@ -2846,7 +2846,7 @@ ReadControllerBitsAltInit:
; Clobbers: A, X, Y; P1ButtonsAlt.
; -----------------------------------------------------------------------------
ReadControllerBitsAltLoop:
lda $4016,x ; CPU:$CC6E PRG:0C6E BD 16 40
lda JOY1,x ; CPU:$CC6E PRG:0C6E BD 16 40
lsr a ; CPU:$CC71 PRG:0C71 4A
rol Zp47,x ; CPU:$CC72 PRG:0C72 36 47
lsr a ; CPU:$CC74 PRG:0C74 4A
@@ -2875,7 +2875,7 @@ ReadControllerBitsAlt2Init:
; Clobbers: A, X, Y; P2Buttons.
; -----------------------------------------------------------------------------
ReadControllerBitsAlt2Loop:
lda $4016,x ; CPU:$CC81 PRG:0C81 BD 16 40
lda JOY1,x ; CPU:$CC81 PRG:0C81 BD 16 40
lsr a ; CPU:$CC84 PRG:0C84 4A
rol Zp4B,x ; CPU:$CC85 PRG:0C85 36 4B
lsr a ; CPU:$CC87 PRG:0C87 4A
@@ -3005,15 +3005,15 @@ ReturnFromStickDecode:
; Local: Returns once vblank has been seen.
; Parameters: None.
; Returns: A preserved; vblank flag consumed.
; Clobbers: stack via pha/pla; $2002.
; Clobbers: stack via pha/pla; PPUSTATUS.
; -----------------------------------------------------------------------------
WaitForVblank:
pha ; CPU:$CCE2 PRG:0CE2 48
lda $2002 ; CPU:$CCE3 PRG:0CE3 AD 02 20
lda ZpEF ; CPU:$CCE6 PRG:0CE6 A5 EF
lda PPUSTATUS ; CPU:$CCE3 PRG:0CE3 AD 02 20
lda PpuCtrlShadow ; CPU:$CCE6 PRG:0CE6 A5 EF
ora #$80 ; CPU:$CCE8 PRG:0CE8 09 80
sta ZpEF ; CPU:$CCEA PRG:0CEA 85 EF
sta $2000 ; CPU:$CCEC PRG:0CEC 8D 00 20
sta PpuCtrlShadow ; CPU:$CCEA PRG:0CEA 85 EF
sta PPUCTRL ; CPU:$CCEC PRG:0CEC 8D 00 20
sta ZpE0 ; CPU:$CCEF PRG:0CEF 85 E0
pla ; CPU:$CCF1 PRG:0CF1 68
; -----------------------------------------------------------------------------
@@ -3067,18 +3067,18 @@ NmiContinue:
rti ; CPU:$CD16 PRG:0D16 40
; -----------------------------------------------------------------------------
; Routine: PpuCtrlSetup
; Global: Reads $2002 to clear the vblank latch and masks bit 7 out of the PPUCTRL shadow before it is written back.
; Global: Reads PPUSTATUS to clear the vblank latch and masks bit 7 out of the PPUCTRL shadow before it is written back.
; Local: Returns to the NMI body.
; Parameters: None.
; Returns: PpuCtrlShadow updated with bit 7 clear.
; Clobbers: A; $2002, PpuCtrlShadow.
; Clobbers: A; PPUSTATUS, PpuCtrlShadow.
; -----------------------------------------------------------------------------
PpuCtrlSetup:
lda $2002 ; CPU:$CD17 PRG:0D17 AD 02 20
lda ZpEF ; CPU:$CD1A PRG:0D1A A5 EF
lda PPUSTATUS ; CPU:$CD17 PRG:0D17 AD 02 20
lda PpuCtrlShadow ; CPU:$CD1A PRG:0D1A A5 EF
and #$7F ; CPU:$CD1C PRG:0D1C 29 7F
sta ZpEF ; CPU:$CD1E PRG:0D1E 85 EF
sta $2000 ; CPU:$CD20 PRG:0D20 8D 00 20
sta PpuCtrlShadow ; CPU:$CD1E PRG:0D1E 85 EF
sta PPUCTRL ; CPU:$CD20 PRG:0D20 8D 00 20
rts ; CPU:$CD23 PRG:0D23 60
; -----------------------------------------------------------------------------
; Routine: OamDmaSetup
@@ -3086,24 +3086,24 @@ PpuCtrlSetup:
; Local: Returns to the NMI body once the transfer is issued.
; Parameters: None.
; Returns: OAM DMA issued.
; Clobbers: A; $2003, $4014.
; Clobbers: A; OAMADDR, $4014.
; -----------------------------------------------------------------------------
OamDmaSetup:
lda #$00 ; CPU:$CD24 PRG:0D24 A9 00
sta $2003 ; CPU:$CD26 PRG:0D26 8D 03 20
sta OAMADDR ; CPU:$CD26 PRG:0D26 8D 03 20
lda #$02 ; CPU:$CD29 PRG:0D29 A9 02
sta $4014 ; CPU:$CD2B PRG:0D2B 8D 14 40
rts ; CPU:$CD2E PRG:0D2E 60
; -----------------------------------------------------------------------------
; Routine: PpuMaskSetup
; Global: Masks bits 5 and 3 out of the PPUMASK shadow and writes the result to both the shadow and $2001.
; Global: Masks bits 5 and 3 out of the PPUMASK shadow and writes the result to both the shadow and PPUMASK.
; Local: Falls through to WritePpuMask.
; Parameters: None.
; Returns: Nothing.
; Clobbers: A; $2001, PpuMaskShadow.
; Clobbers: A; PPUMASK, PpuMaskShadow.
; -----------------------------------------------------------------------------
PpuMaskSetup:
lda ZpEE ; CPU:$CD2F PRG:0D2F A5 EE
lda PpuMaskShadow ; CPU:$CD2F PRG:0D2F A5 EE
and #$E7 ; CPU:$CD31 PRG:0D31 29 E7
; -----------------------------------------------------------------------------
; Routine: WritePpuMask
@@ -3111,11 +3111,11 @@ PpuMaskSetup:
; Local: RTS.
; Parameters: None.
; Returns: Nothing.
; Clobbers: A; $2001, PpuMaskShadow.
; Clobbers: A; PPUMASK, PpuMaskShadow.
; -----------------------------------------------------------------------------
WritePpuMask:
sta ZpEE ; CPU:$CD33 PRG:0D33 85 EE
sta $2001 ; CPU:$CD35 PRG:0D35 8D 01 20
sta PpuMaskShadow ; CPU:$CD33 PRG:0D33 85 EE
sta PPUMASK ; CPU:$CD35 PRG:0D35 8D 01 20
rts ; CPU:$CD38 PRG:0D38 60
; -----------------------------------------------------------------------------
; Routine: EnableSpritesAndBackground
@@ -3123,10 +3123,10 @@ WritePpuMask:
; Local: RTS.
; Parameters: None.
; Returns: Nothing.
; Clobbers: A; $2001, PpuMaskShadow.
; Clobbers: A; PPUMASK, PpuMaskShadow.
; -----------------------------------------------------------------------------
EnableSpritesAndBackground:
lda ZpEE ; CPU:$CD39 PRG:0D39 A5 EE
lda PpuMaskShadow ; CPU:$CD39 PRG:0D39 A5 EE
ora #$18 ; CPU:$CD3B PRG:0D3B 09 18
bne WritePpuMask ; CPU:$CD3D PRG:0D3D D0 F4
; -----------------------------------------------------------------------------
@@ -3138,27 +3138,27 @@ EnableSpritesAndBackground:
; Clobbers: A, X, Y; VRAM pointer.
; -----------------------------------------------------------------------------
VramPtrWrite:
jsr $CDC8 ; CPU:$CD3F PRG:0D3F 20 C8 CD
jmp $CD99 ; CPU:$CD42 PRG:0D42 4C 99 CD
jsr RetAddrUpdate ; CPU:$CD3F PRG:0D3F 20 C8 CD
jmp VramPtrTableRead ; CPU:$CD42 PRG:0D42 4C 99 CD
; -----------------------------------------------------------------------------
; Routine: VramWriteLoop
; Global: Sets the PPU address for the current VRAM command by writing the high byte and low byte to $2006 in two steps, pulling each from the stream.
; Global: Sets the PPU address for the current VRAM command by writing the high byte and low byte to PPUADDR in two steps, pulling each from the stream.
; Local: Loops over the stream bytes, then falls through.
; Parameters: Y = stream index.
; Returns: PPU address latched.
; Clobbers: A, Y; $2006; stack via pha/pla.
; Clobbers: A, Y; PPUADDR; stack via pha/pla.
; -----------------------------------------------------------------------------
VramWriteLoop:
pha ; CPU:$CD45 PRG:0D45 48
sta $2006 ; CPU:$CD46 PRG:0D46 8D 06 20
sta PPUADDR ; CPU:$CD46 PRG:0D46 8D 06 20
iny ; CPU:$CD49 PRG:0D49 C8
lda (Zp00),y ; CPU:$CD4A PRG:0D4A B1 00
sta $2006 ; CPU:$CD4C PRG:0D4C 8D 06 20
lda (VramPtrLo),y ; CPU:$CD4A PRG:0D4A B1 00
sta PPUADDR ; CPU:$CD4C PRG:0D4C 8D 06 20
iny ; CPU:$CD4F PRG:0D4F C8
lda (Zp00),y ; CPU:$CD50 PRG:0D50 B1 00
lda (VramPtrLo),y ; CPU:$CD50 PRG:0D50 B1 00
asl a ; CPU:$CD52 PRG:0D52 0A
pha ; CPU:$CD53 PRG:0D53 48
lda ZpEF ; CPU:$CD54 PRG:0D54 A5 EF
lda PpuCtrlShadow ; CPU:$CD54 PRG:0D54 A5 EF
ora #$04 ; CPU:$CD56 PRG:0D56 09 04
bcs WritePpuCtrlFromShadow ; CPU:$CD58 PRG:0D58 B0 02
and #$FB ; CPU:$CD5A PRG:0D5A 29 FB
@@ -3168,11 +3168,11 @@ VramWriteLoop:
; Local: Falls through to the flag save that the dispatch stream needs.
; Parameters: A = PPUCTRL value.
; Returns: Nothing.
; Clobbers: A; $2000, PpuCtrlShadow; stack via asl/php.
; Clobbers: A; PPUCTRL, PpuCtrlShadow; stack via asl/php.
; -----------------------------------------------------------------------------
WritePpuCtrlFromShadow:
sta $2000 ; CPU:$CD5C PRG:0D5C 8D 00 20
sta ZpEF ; CPU:$CD5F PRG:0D5F 85 EF
sta PPUCTRL ; CPU:$CD5C PRG:0D5C 8D 00 20
sta PpuCtrlShadow ; CPU:$CD5F PRG:0D5F 85 EF
pla ; CPU:$CD61 PRG:0D61 68
asl a ; CPU:$CD62 PRG:0D62 0A
php ; CPU:$CD63 PRG:0D63 08
@@ -3217,24 +3217,24 @@ AdvanceVramReadIndex:
iny ; CPU:$CD73 PRG:0D73 C8
; -----------------------------------------------------------------------------
; Routine: WriteVramStreamByte
; Global: Copies one byte per iteration from the stream, indexed indirectly through the VRAM pointer, straight into $2007.
; Global: Copies one byte per iteration from the stream, indexed indirectly through the VRAM pointer, straight into PPUDATA.
; Local: Loops until X reaches zero, then falls through.
; Parameters: X = remaining bytes.
; Returns: Nothing.
; Clobbers: A, X, Y; $2007.
; Clobbers: A, X, Y; PPUDATA.
; -----------------------------------------------------------------------------
WriteVramStreamByte:
lda (Zp00),y ; CPU:$CD74 PRG:0D74 B1 00
sta $2007 ; CPU:$CD76 PRG:0D76 8D 07 20
lda (VramPtrLo),y ; CPU:$CD74 PRG:0D74 B1 00
sta PPUDATA ; CPU:$CD76 PRG:0D76 8D 07 20
dex ; CPU:$CD79 PRG:0D79 CA
bne AdvanceVramReadIndex ; CPU:$CD7A PRG:0D7A D0 F5
pla ; CPU:$CD7C PRG:0D7C 68
cmp #$3F ; CPU:$CD7D PRG:0D7D C9 3F
bne AdvanceVramPointerByY ; CPU:$CD7F PRG:0D7F D0 0C
sta $2006 ; CPU:$CD81 PRG:0D81 8D 06 20
stx $2006 ; CPU:$CD84 PRG:0D84 8E 06 20
stx $2006 ; CPU:$CD87 PRG:0D87 8E 06 20
stx $2006 ; CPU:$CD8A PRG:0D8A 8E 06 20
sta PPUADDR ; CPU:$CD81 PRG:0D81 8D 06 20
stx PPUADDR ; CPU:$CD84 PRG:0D84 8E 06 20
stx PPUADDR ; CPU:$CD87 PRG:0D87 8E 06 20
stx PPUADDR ; CPU:$CD8A PRG:0D8A 8E 06 20
; -----------------------------------------------------------------------------
; Routine: AdvanceVramPointerByY
; Global: Adds the stream offset to the VRAM pointer before the next command.
@@ -3246,8 +3246,8 @@ WriteVramStreamByte:
AdvanceVramPointerByY:
sec ; CPU:$CD8D PRG:0D8D 38
tya ; CPU:$CD8E PRG:0D8E 98
adc Zp00 ; CPU:$CD8F PRG:0D8F 65 00
sta Zp00 ; CPU:$CD91 PRG:0D91 85 00
adc VramPtrLo ; CPU:$CD8F PRG:0D8F 65 00
sta VramPtrLo ; CPU:$CD91 PRG:0D91 85 00
lda #$00 ; CPU:$CD93 PRG:0D93 A9 00
adc Zp01 ; CPU:$CD95 PRG:0D95 65 01
sta Zp01 ; CPU:$CD97 PRG:0D97 85 01
@@ -3260,9 +3260,9 @@ AdvanceVramPointerByY:
; Clobbers: A, X, Y; VramPtrLo/Hi.
; -----------------------------------------------------------------------------
VramPtrTableRead:
ldx $2002 ; CPU:$CD99 PRG:0D99 AE 02 20
ldx PPUSTATUS ; CPU:$CD99 PRG:0D99 AE 02 20
ldy #$00 ; CPU:$CD9C PRG:0D9C A0 00
lda (Zp00),y ; CPU:$CD9E PRG:0D9E B1 00
lda (VramPtrLo),y ; CPU:$CD9E PRG:0D9E B1 00
bpl HandlePpuCtrlOpcode ; CPU:$CDA0 PRG:0DA0 10 01
rts ; CPU:$CDA2 PRG:0DA2 60
; -----------------------------------------------------------------------------
@@ -3271,7 +3271,7 @@ VramPtrTableRead:
; Local: Falls through to the shared VRAM write path.
; Parameters: None.
; Returns: Nothing.
; Clobbers: A; PpuCtrlShadow, $2000.
; Clobbers: A; PpuCtrlShadow, PPUCTRL.
; -----------------------------------------------------------------------------
HandlePpuCtrlOpcode:
cmp #$60 ; CPU:$CDA3 PRG:0DA3 C9 60
@@ -3279,7 +3279,7 @@ HandlePpuCtrlOpcode:
pla ; CPU:$CDA7 PRG:0DA7 68
sta Zp01 ; CPU:$CDA8 PRG:0DA8 85 01
pla ; CPU:$CDAA PRG:0DAA 68
sta Zp00 ; CPU:$CDAB PRG:0DAB 85 00
sta VramPtrLo ; CPU:$CDAB PRG:0DAB 85 00
ldy #$02 ; CPU:$CDAD PRG:0DAD A0 02
bne AdvanceVramPointerByY ; CPU:$CDAF PRG:0DAF D0 DC
; -----------------------------------------------------------------------------
@@ -3293,17 +3293,17 @@ HandlePpuCtrlOpcode:
HandleJmpOpcode:
cmp #$4C ; CPU:$CDB1 PRG:0DB1 C9 4C
bne VramWriteLoop ; CPU:$CDB3 PRG:0DB3 D0 90
lda Zp00 ; CPU:$CDB5 PRG:0DB5 A5 00
lda VramPtrLo ; CPU:$CDB5 PRG:0DB5 A5 00
pha ; CPU:$CDB7 PRG:0DB7 48
lda Zp01 ; CPU:$CDB8 PRG:0DB8 A5 01
pha ; CPU:$CDBA PRG:0DBA 48
iny ; CPU:$CDBB PRG:0DBB C8
lda (Zp00),y ; CPU:$CDBC PRG:0DBC B1 00
lda (VramPtrLo),y ; CPU:$CDBC PRG:0DBC B1 00
tax ; CPU:$CDBE PRG:0DBE AA
iny ; CPU:$CDBF PRG:0DBF C8
lda (Zp00),y ; CPU:$CDC0 PRG:0DC0 B1 00
lda (VramPtrLo),y ; CPU:$CDC0 PRG:0DC0 B1 00
sta Zp01 ; CPU:$CDC2 PRG:0DC2 85 01
stx Zp00 ; CPU:$CDC4 PRG:0DC4 86 00
stx VramPtrLo ; CPU:$CDC4 PRG:0DC4 86 00
bcs VramPtrTableRead ; CPU:$CDC6 PRG:0DC6 B0 D1
; -----------------------------------------------------------------------------
; Routine: RetAddrUpdate
@@ -3321,7 +3321,7 @@ RetAddrUpdate:
sta Zp06 ; CPU:$CDD1 PRG:0DD1 85 06
ldy #$01 ; CPU:$CDD3 PRG:0DD3 A0 01
lda (Zp05),y ; CPU:$CDD5 PRG:0DD5 B1 05
sta Zp00 ; CPU:$CDD7 PRG:0DD7 85 00
sta VramPtrLo ; CPU:$CDD7 PRG:0DD7 85 00
iny ; CPU:$CDD9 PRG:0DD9 C8
lda (Zp05),y ; CPU:$CDDA PRG:0DDA B1 05
sta Zp01 ; CPU:$CDDC PRG:0DDC 85 01
@@ -3342,18 +3342,18 @@ RetAddrUpdate:
; Clobbers: A, X, Y; VramPtrLo/Hi.
; -----------------------------------------------------------------------------
VramWrite:
sta Zp00 ; CPU:$CDEE PRG:0DEE 85 00
sta VramPtrLo ; CPU:$CDEE PRG:0DEE 85 00
stx Zp01 ; CPU:$CDF0 PRG:0DF0 86 01
sty Zp02 ; CPU:$CDF2 PRG:0DF2 84 02
lda $2002 ; CPU:$CDF4 PRG:0DF4 AD 02 20
lda ZpEF ; CPU:$CDF7 PRG:0DF7 A5 EF
lda PPUSTATUS ; CPU:$CDF4 PRG:0DF4 AD 02 20
lda PpuCtrlShadow ; CPU:$CDF7 PRG:0DF7 A5 EF
and #$FB ; CPU:$CDF9 PRG:0DF9 29 FB
sta $2000 ; CPU:$CDFB PRG:0DFB 8D 00 20
sta ZpEF ; CPU:$CDFE PRG:0DFE 85 EF
lda Zp00 ; CPU:$CE00 PRG:0E00 A5 00
sta $2006 ; CPU:$CE02 PRG:0E02 8D 06 20
sta PPUCTRL ; CPU:$CDFB PRG:0DFB 8D 00 20
sta PpuCtrlShadow ; CPU:$CDFE PRG:0DFE 85 EF
lda VramPtrLo ; CPU:$CE00 PRG:0E00 A5 00
sta PPUADDR ; CPU:$CE02 PRG:0E02 8D 06 20
ldy #$00 ; CPU:$CE05 PRG:0E05 A0 00
sty $2006 ; CPU:$CE07 PRG:0E07 8C 06 20
sty PPUADDR ; CPU:$CE07 PRG:0E07 8C 06 20
ldx #$04 ; CPU:$CE0A PRG:0E0A A2 04
cmp #$20 ; CPU:$CE0C PRG:0E0C C9 20
bcs VramWriteSetup ; CPU:$CE0E PRG:0E0E B0 02
@@ -3371,37 +3371,37 @@ VramWriteSetup:
lda Zp01 ; CPU:$CE14 PRG:0E14 A5 01
; -----------------------------------------------------------------------------
; Routine: WriteVramZeroFill
; Global: Writes a run of $00 bytes to $2007 until the length counter expires.
; Global: Writes a run of $00 bytes to PPUDATA until the length counter expires.
; Local: Falls through when Y reaches zero.
; Parameters: Y = remaining bytes.
; Returns: Nothing.
; Clobbers: Y; $2007.
; Clobbers: Y; PPUDATA.
; -----------------------------------------------------------------------------
WriteVramZeroFill:
sta $2007 ; CPU:$CE16 PRG:0E16 8D 07 20
sta PPUDATA ; CPU:$CE16 PRG:0E16 8D 07 20
dey ; CPU:$CE19 PRG:0E19 88
bne WriteVramZeroFill ; CPU:$CE1A PRG:0E1A D0 FA
dex ; CPU:$CE1C PRG:0E1C CA
bne WriteVramZeroFill ; CPU:$CE1D PRG:0E1D D0 F7
ldy Zp02 ; CPU:$CE1F PRG:0E1F A4 02
lda Zp00 ; CPU:$CE21 PRG:0E21 A5 00
lda VramPtrLo ; CPU:$CE21 PRG:0E21 A5 00
cmp #$20 ; CPU:$CE23 PRG:0E23 C9 20
bcc VramWriteDone ; CPU:$CE25 PRG:0E25 90 12
adc #$02 ; CPU:$CE27 PRG:0E27 69 02
sta $2006 ; CPU:$CE29 PRG:0E29 8D 06 20
sta PPUADDR ; CPU:$CE29 PRG:0E29 8D 06 20
lda #$C0 ; CPU:$CE2C PRG:0E2C A9 C0
sta $2006 ; CPU:$CE2E PRG:0E2E 8D 06 20
sta PPUADDR ; CPU:$CE2E PRG:0E2E 8D 06 20
ldx #$40 ; CPU:$CE31 PRG:0E31 A2 40
; -----------------------------------------------------------------------------
; Routine: WriteVramByteStream
; Global: Writes a run of bytes to $2007, one per X iteration.
; Global: Writes a run of bytes to PPUDATA, one per X iteration.
; Local: Falls through when X reaches zero.
; Parameters: X = remaining bytes.
; Returns: Nothing.
; Clobbers: A, X; $2007.
; Clobbers: A, X; PPUDATA.
; -----------------------------------------------------------------------------
WriteVramByteStream:
sty $2007 ; CPU:$CE33 PRG:0E33 8C 07 20
sty PPUDATA ; CPU:$CE33 PRG:0E33 8C 07 20
dex ; CPU:$CE36 PRG:0E36 CA
bne WriteVramByteStream ; CPU:$CE37 PRG:0E37 D0 FA
; -----------------------------------------------------------------------------
@@ -3413,85 +3413,85 @@ WriteVramByteStream:
; Clobbers: A, X.
; -----------------------------------------------------------------------------
VramWriteDone:
ldx Zp01 ; CPU:$CE39 PRG:0E39 A6 01
ldx VramPtrHi ; CPU:$CE39 PRG:0E39 A6 01
rts ; CPU:$CE3B PRG:0E3B 60
; -----------------------------------------------------------------------------
; Routine: PpuScrollLatch
; Global: Writes the latched scroll X and Y values to $2005 in the correct order.
; Global: Writes the latched scroll X and Y values to PPUSCROLL in the correct order.
; Local: Returns to the NMI body.
; Parameters: None.
; Returns: Scroll latched.
; Clobbers: A; $2002, $2005.
; Clobbers: A; PPUSTATUS, PPUSCROLL.
; -----------------------------------------------------------------------------
PpuScrollLatch:
lda $2002 ; CPU:$CE3C PRG:0E3C AD 02 20
lda ZpED ; CPU:$CE3F PRG:0E3F A5 ED
sta $2005 ; CPU:$CE41 PRG:0E41 8D 05 20
lda PPUSTATUS ; CPU:$CE3C PRG:0E3C AD 02 20
lda PpuScrollXInit ; CPU:$CE3F PRG:0E3F A5 ED
sta PPUSCROLL ; CPU:$CE41 PRG:0E41 8D 05 20
lda ZpEC ; CPU:$CE44 PRG:0E44 A5 EC
sta $2005 ; CPU:$CE46 PRG:0E46 8D 05 20
lda ZpEF ; CPU:$CE49 PRG:0E49 A5 EF
sta $2000 ; CPU:$CE4B PRG:0E4B 8D 00 20
sta PPUSCROLL ; CPU:$CE46 PRG:0E46 8D 05 20
lda PpuCtrlShadow ; CPU:$CE49 PRG:0E49 A5 EF
sta PPUCTRL ; CPU:$CE4B PRG:0E4B 8D 00 20
rts ; CPU:$CE4E PRG:0E4E 60
; -----------------------------------------------------------------------------
; Routine: VramBurstWrite
; Global: Burst writer: clears bit 2 of the PPUCTRL shadow so VRAM stays accessible, then walks the command list at $0302.
; Global: Burst writer: clears bit 2 of the PPUCTRL shadow so VRAM stays accessible, then walks the command list at VramBurstIndex.
; Local: Falls into VramBurstWriteChunk.
; Parameters: None.
; Returns: Nothing.
; Clobbers: A; $2000, PpuCtrlShadow.
; Clobbers: A; PPUCTRL, PpuCtrlShadow.
; -----------------------------------------------------------------------------
VramBurstWrite:
lda ZpEF ; CPU:$CE4F PRG:0E4F A5 EF
lda PpuCtrlShadow ; CPU:$CE4F PRG:0E4F A5 EF
and #$FB ; CPU:$CE51 PRG:0E51 29 FB
sta $2000 ; CPU:$CE53 PRG:0E53 8D 00 20
sta ZpEF ; CPU:$CE56 PRG:0E56 85 EF
ldx $2002 ; CPU:$CE58 PRG:0E58 AE 02 20
sta PPUCTRL ; CPU:$CE53 PRG:0E53 8D 00 20
sta PpuCtrlShadow ; CPU:$CE56 PRG:0E56 85 EF
ldx PPUSTATUS ; CPU:$CE58 PRG:0E58 AE 02 20
ldy #$00 ; CPU:$CE5B PRG:0E5B A0 00
beq VramBurstNextCommand ; CPU:$CE5D PRG:0E5D F0 2B
; -----------------------------------------------------------------------------
; Routine: VramBurstWriteChunk
; Global: Writes one chunk of the burst stream to $2007.
; Global: Writes one chunk of the burst stream to PPUDATA.
; Local: Falls through to VramBurstWriteNext.
; Parameters: None.
; Returns: Nothing.
; Clobbers: A, Y; $2006, $2007.
; Clobbers: A, Y; PPUADDR, PPUDATA.
; -----------------------------------------------------------------------------
VramBurstWriteChunk:
pha ; CPU:$CE5F PRG:0E5F 48
sta $2006 ; CPU:$CE60 PRG:0E60 8D 06 20
sta PPUADDR ; CPU:$CE60 PRG:0E60 8D 06 20
iny ; CPU:$CE63 PRG:0E63 C8
lda $0302,y ; CPU:$CE64 PRG:0E64 B9 02 03
sta $2006 ; CPU:$CE67 PRG:0E67 8D 06 20
lda VramBurstIndex,y ; CPU:$CE64 PRG:0E64 B9 02 03
sta PPUADDR ; CPU:$CE67 PRG:0E67 8D 06 20
iny ; CPU:$CE6A PRG:0E6A C8
ldx $0302,y ; CPU:$CE6B PRG:0E6B BE 02 03
ldx VramBurstIndex,y ; CPU:$CE6B PRG:0E6B BE 02 03
; -----------------------------------------------------------------------------
; Routine: VramBurstWriteNext
; Global: Advances to the next burst entry and tests its sign bit to decide between another chunk and the end of the list.
; Local: Branches to VramBurstSkipRun or VramBurstNextCommand.
; Parameters: None.
; Returns: Nothing.
; Clobbers: A, Y; $0302.
; Clobbers: A, Y; VramBurstIndex.
; -----------------------------------------------------------------------------
VramBurstWriteNext:
iny ; CPU:$CE6E PRG:0E6E C8
lda $0302,y ; CPU:$CE6F PRG:0E6F B9 02 03
sta $2007 ; CPU:$CE72 PRG:0E72 8D 07 20
lda VramBurstIndex,y ; CPU:$CE6F PRG:0E6F B9 02 03
sta PPUDATA ; CPU:$CE72 PRG:0E72 8D 07 20
dex ; CPU:$CE75 PRG:0E75 CA
bne VramBurstWriteNext ; CPU:$CE76 PRG:0E76 D0 F6
pla ; CPU:$CE78 PRG:0E78 68
cmp #$3F ; CPU:$CE79 PRG:0E79 C9 3F
bne VramBurstSkipRun ; CPU:$CE7B PRG:0E7B D0 0C
sta $2006 ; CPU:$CE7D PRG:0E7D 8D 06 20
stx $2006 ; CPU:$CE80 PRG:0E80 8E 06 20
stx $2006 ; CPU:$CE83 PRG:0E83 8E 06 20
stx $2006 ; CPU:$CE86 PRG:0E86 8E 06 20
sta PPUADDR ; CPU:$CE7D PRG:0E7D 8D 06 20
stx PPUADDR ; CPU:$CE80 PRG:0E80 8E 06 20
stx PPUADDR ; CPU:$CE83 PRG:0E83 8E 06 20
stx PPUADDR ; CPU:$CE86 PRG:0E86 8E 06 20
; -----------------------------------------------------------------------------
; Routine: VramBurstSkipRun
; Global: Skips a run of burst entries without writing them.
; Local: Falls into VramBurstWriteChunk once the skip is done.
; Parameters: None.
; Returns: Nothing.
; Clobbers: Y; $0302.
; Clobbers: Y; VramBurstIndex.
; -----------------------------------------------------------------------------
VramBurstSkipRun:
iny ; CPU:$CE89 PRG:0E89 C8
@@ -3501,12 +3501,12 @@ VramBurstSkipRun:
; Local: Branches to VramBurstSkipRun or VramBurstWriteChunk.
; Parameters: None.
; Returns: Nothing.
; Clobbers: A, Y; $0302.
; Clobbers: A, Y; VramBurstIndex.
; -----------------------------------------------------------------------------
VramBurstNextCommand:
lda $0302,y ; CPU:$CE8A PRG:0E8A B9 02 03
lda VramBurstIndex,y ; CPU:$CE8A PRG:0E8A B9 02 03
bpl VramBurstWriteChunk ; CPU:$CE8D PRG:0E8D 10 D0
sta $0302 ; CPU:$CE8F PRG:0E8F 8D 02 03
sta VramBurstIndex ; CPU:$CE8F PRG:0E8F 8D 02 03
lda #$00 ; CPU:$CE92 PRG:0E92 A9 00
sta $0301 ; CPU:$CE94 PRG:0E94 8D 01 03
rts ; CPU:$CE97 PRG:0E97 60
@@ -3521,12 +3521,12 @@ VramBurstNextCommand:
DispatchVramOp:
sta Zp03 ; CPU:$CE98 PRG:0E98 85 03
stx Zp02 ; CPU:$CE9A PRG:0E9A 86 02
jsr $CDC8 ; CPU:$CE9C PRG:0E9C 20 C8 CD
jsr RetAddrUpdate ; CPU:$CE9C PRG:0E9C 20 C8 CD
ldy #$00 ; CPU:$CE9F PRG:0E9F A0 00
lda (Zp00),y ; CPU:$CEA1 PRG:0EA1 B1 00
lda (VramPtrLo),y ; CPU:$CEA1 PRG:0EA1 B1 00
and #$0F ; CPU:$CEA3 PRG:0EA3 29 0F
sta Zp04 ; CPU:$CEA5 PRG:0EA5 85 04
lda (Zp00),y ; CPU:$CEA7 PRG:0EA7 B1 00
lda (VramPtrLo),y ; CPU:$CEA7 PRG:0EA7 B1 00
lsr a ; CPU:$CEA9 PRG:0EA9 4A
lsr a ; CPU:$CEAA PRG:0EAA 4A
lsr a ; CPU:$CEAB PRG:0EAB 4A
@@ -3535,22 +3535,22 @@ DispatchVramOp:
ldx $0301 ; CPU:$CEAF PRG:0EAF AE 01 03
; -----------------------------------------------------------------------------
; Routine: StoreVramOpResult
; Global: Stores the VRAM operation's result and its length into the burst command table at $0302, indexed by X, running the length check between the two stores.
; Global: Stores the VRAM operation's result and its length into the burst command table at VramBurstIndex, indexed by X, running the length check between the two stores.
; Local: Returns to the caller via VramOpReturn.
; Parameters: X = table index.
; Returns: Burst table updated.
; Clobbers: A, X; $0302, VramOpResult, VramOpLength.
; Clobbers: A, X; VramBurstIndex, VramOpResult, VramOpLength.
; -----------------------------------------------------------------------------
StoreVramOpResult:
lda Zp03 ; CPU:$CEB2 PRG:0EB2 A5 03
sta $0302,x ; CPU:$CEB4 PRG:0EB4 9D 02 03
sta VramBurstIndex,x ; CPU:$CEB4 PRG:0EB4 9D 02 03
jsr $CEF3 ; CPU:$CEB7 PRG:0EB7 20 F3 CE
lda Zp02 ; CPU:$CEBA PRG:0EBA A5 02
sta $0302,x ; CPU:$CEBC PRG:0EBC 9D 02 03
sta VramBurstIndex,x ; CPU:$CEBC PRG:0EBC 9D 02 03
jsr $CEF3 ; CPU:$CEBF PRG:0EBF 20 F3 CE
lda Zp04 ; CPU:$CEC2 PRG:0EC2 A5 04
sta Zp06 ; CPU:$CEC4 PRG:0EC4 85 06
sta $0302,x ; CPU:$CEC6 PRG:0EC6 9D 02 03
sta VramBurstIndex,x ; CPU:$CEC6 PRG:0EC6 9D 02 03
; -----------------------------------------------------------------------------
; Routine: VramOpDataStream
; Global: Walks the VRAM operation data stream one byte at a time.
@@ -3562,8 +3562,8 @@ StoreVramOpResult:
VramOpDataStream:
jsr $CEF3 ; CPU:$CEC9 PRG:0EC9 20 F3 CE
iny ; CPU:$CECC PRG:0ECC C8
lda (Zp00),y ; CPU:$CECD PRG:0ECD B1 00
sta $0302,x ; CPU:$CECF PRG:0ECF 9D 02 03
lda (VramPtrLo),y ; CPU:$CECD PRG:0ECD B1 00
sta VramBurstIndex,x ; CPU:$CECF PRG:0ECF 9D 02 03
dec Zp06 ; CPU:$CED2 PRG:0ED2 C6 06
bne VramOpDataStream ; CPU:$CED4 PRG:0ED4 D0 F3
jsr $CEF3 ; CPU:$CED6 PRG:0ED6 20 F3 CE
@@ -3578,7 +3578,7 @@ VramOpDataStream:
dec Zp05 ; CPU:$CEE9 PRG:0EE9 C6 05
bne StoreVramOpResult ; CPU:$CEEB PRG:0EEB D0 C5
lda #$FF ; CPU:$CEED PRG:0EED A9 FF
sta $0302,x ; CPU:$CEEF PRG:0EEF 9D 02 03
sta VramBurstIndex,x ; CPU:$CEEF PRG:0EEF 9D 02 03
rts ; CPU:$CEF2 PRG:0EF2 60
; -----------------------------------------------------------------------------
; Routine: VramOpLengthCheck
@@ -3594,7 +3594,7 @@ VramOpLengthCheck:
bcc VramOpReturn ; CPU:$CEF7 PRG:0EF7 90 0C
ldx $0301 ; CPU:$CEF9 PRG:0EF9 AE 01 03
lda #$FF ; CPU:$CEFC PRG:0EFC A9 FF
sta $0302,x ; CPU:$CEFE PRG:0EFE 9D 02 03
sta VramBurstIndex,x ; CPU:$CEFE PRG:0EFE 9D 02 03
pla ; CPU:$CF01 PRG:0F01 68
pla ; CPU:$CF02 PRG:0F02 68
lda #$01 ; CPU:$CF03 PRG:0F03 A9 01