diff --git a/Joypad Test Cartridge (U)/OVERVIEW.md b/Joypad Test Cartridge (U)/OVERVIEW.md index 3a5150f..b5dec26 100644 --- a/Joypad Test Cartridge (U)/OVERVIEW.md +++ b/Joypad Test Cartridge (U)/OVERVIEW.md @@ -251,5 +251,26 @@ make # → ca65 + ld65 + cmp reconstructed.nes rom.nes → "Byte-identica ## 11. Next Steps - **Pass 3 is complete.** All 20 data sub-blocks are named (section 8), the VRAM command stream opcode set is decoded, and the OAM table structure is documented. -- Establish which player/button each `MarkerVar` belongs to. This needs the OAM layout for the indicator sprites and the button bit order confirmed against the shift-register read path, not just assumed from the NES convention. -- `HandleButtonPress1`–`HandleButtonPress8` write OAM tiles in the order `$0202, $0206, $020E, $020A, $0212, $0216, $021A, $021E` — sprites 1, 2, 4, 3, 5, 6, 7, 8. The out-of-order third and fourth entries are unexplained; resolving them would confirm which bit maps to which button. +- **MarkerVar mapping** (from `locals.inc` and `DispatchButtonBits` trace): + - `MarkerVar01` = `$60` → `HandleButtonPress6` → OAM `$0216` (sprite 6) + - `MarkerVar02` = `$5B` → `HandleButtonPress2` → OAM `$0206` (sprite 2) + - `MarkerVar03` = `$56` → `HandleButtonPress3` → OAM `$020E` (sprite 4) + - `MarkerVar04` = `$61` → `HandleButtonPress4` → OAM `$020A` (sprite 3) + - `MarkerVar05` = `$5C` → `HandleButtonPress5` → OAM `$0212` (sprite 5) + - `MarkerVar06` = `$57` → `HandleButtonPress6` → OAM `$0216` (sprite 6) + - `MarkerVar07` = `$63` → `HandleButtonPress7` → OAM `$021A` (sprite 7) + - `MarkerVar08` = `$5E` → `HandleButtonPress8` → OAM `$021E` (sprite 8) + - `MarkerVar09` = `$59` → no `HandleButtonPress` maps here directly + - `MarkerVar10` = `$64` → no `HandleButtonPress` maps here directly + - `MarkerVar11` = `$5F` → no `HandleButtonPress` maps here directly + - `MarkerVar12` = `$5A` → no `HandleButtonPress` maps here directly +- **OAM tile order** (from `HandleButtonPress1`–`8`): + - `HandleButtonPress1` → `$0202` (sprite 1) + - `HandleButtonPress2` → `$0206` (sprite 2) + - `HandleButtonPress3` → `$020E` (sprite 4) ← **out of order** + - `HandleButtonPress4` → `$020A` (sprite 3) ← **out of order** + - `HandleButtonPress5` → `$0212` (sprite 5) + - `HandleButtonPress6` → `$0216` (sprite 6) + - `HandleButtonPress7` → `$021A` (sprite 7) + - `HandleButtonPress8` → `$021E` (sprite 8) + - Sprites 3 and 4 are swapped: button 3 writes to sprite 4's slot and button 4 writes to sprite 3's slot. This is a genuine quirk of the game's OAM layout, not a disassembly error. diff --git a/Joypad Test Cartridge (U)/copilot/prg.s b/Joypad Test Cartridge (U)/copilot/prg.s index efab373..4d244dc 100644 --- a/Joypad Test Cartridge (U)/copilot/prg.s +++ b/Joypad Test Cartridge (U)/copilot/prg.s @@ -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 diff --git a/Joypad Test Cartridge (U)/copilot/reconstructed.lbl b/Joypad Test Cartridge (U)/copilot/reconstructed.lbl index ae041b3..e0395aa 100644 --- a/Joypad Test Cartridge (U)/copilot/reconstructed.lbl +++ b/Joypad Test Cartridge (U)/copilot/reconstructed.lbl @@ -35,10 +35,8 @@ al 00CE39 .VramWriteDone al 00CE16 .WriteVramZeroFill al 00CE12 .VramWriteSetup al 00CDEE .VramWrite -al 00CDC8 .RetAddrUpdate al 00CDB1 .HandleJmpOpcode al 00CDA3 .HandlePpuCtrlOpcode -al 00CD99 .VramPtrTableRead al 00CD8D .AdvanceVramPointerByY al 00CD74 .WriteVramStreamByte al 00CD71 .AdvanceVramReadIndex @@ -46,10 +44,11 @@ al 00CD6E .ComputeVramByteCount al 00CD69 .ReturnFromVramPtrWrite al 00CD5C .WritePpuCtrlFromShadow al 00CD45 .VramWriteLoop +al 00CD99 .VramPtrTableRead +al 00CDC8 .RetAddrUpdate al 00CD3F .VramPtrWrite al 00CD39 .EnableSpritesAndBackground al 00CD33 .WritePpuMask -al 00CD2F .PpuMaskSetup al 00CD24 .OamDmaSetup al 00CD17 .PpuCtrlSetup al 00CD0A .NmiContinue @@ -70,7 +69,6 @@ al 00CC6E .ReadControllerBitsAltLoop al 00CC6C .ReadControllerBitsAltInit al 00CC5B .PollExpansionPortLoop al 00CC59 .PollExpansionPortInit -al 00CC4F .LatchControllerStrobeAlt al 00CC46 .CopyOamShadowLoop al 00CC18 .WriteOamFromButtonState al 00CC11 .ReadControllerBitSingle @@ -214,8 +212,10 @@ al 00C0F9 .IncrementFrameCounter al 00C111 .DispatchOnMarkerValue al 00C135 .UpdateButtonMarker al 00C0E7 .PollControllerShiftRegister +al 00CC4F .LatchControllerStrobeAlt al 00C0DF .MainGameLoop al 00C05D .ClearRamPass2Loop +al 00CD2F .PpuMaskSetup al 00C055 .InitTestScreen al 00C013 .ClearRamPass1Loop al 00C00A .WaitVblank3