From a29b03b00be7103ac11a472c2282d6ea2c822707 Mon Sep 17 00:00:00 2001 From: Trevor Merritt Date: Thu, 15 Oct 2026 18:47:05 -0400 Subject: [PATCH] Standardizes build process and adds OVERVIEW.md for each --- Balloon Fight (JU)/OVERVIEW.md | 265 + Balloon Fight (JU)/copilot/Makefile | 33 +- Balloon Fight (JU)/copilot/chr.s | 2 + Balloon Fight (JU)/copilot/header.s | 2 + Balloon Fight (JU)/copilot/linker.cfg | 10 +- Balloon Fight (JU)/copilot/locals.inc | 337 +- Balloon Fight (JU)/copilot/prg.s | 94 +- .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes Balloon Fight (JU)/copilot/rom.nes | 1 + Balloon Fight (JU)/copilot/symbols.inc | 52 + Baseball (UE)/OVERVIEW.md | 433 + Baseball (UE)/copilot/Makefile | 33 +- Baseball (UE)/copilot/chr.bin | Bin 0 -> 8192 bytes Baseball (UE)/copilot/chr.o | Bin 0 -> 12596 bytes Baseball (UE)/copilot/chr.s | 2 + Baseball (UE)/copilot/header.bin | Bin 0 -> 16 bytes Baseball (UE)/copilot/header.o | Bin 0 -> 336 bytes Baseball (UE)/copilot/header.s | 2 + Baseball (UE)/copilot/linker.cfg | 10 +- Baseball (UE)/copilot/locals.inc | 7 - Baseball (UE)/copilot/prg.o | Bin 0 -> 209979 bytes Baseball (UE)/copilot/prg.s | 84 +- Baseball (UE)/copilot/reconstructed.lbl | 951 ++ Baseball (UE)/copilot/reconstructed.map | 32 + Baseball (UE)/copilot/reconstructed.nes | Bin 0 -> 24592 bytes Baseball (UE)/copilot/rom.nes | 1 + Bomberman (U)/OVERVIEW.md | 335 + Bomberman (U)/copilot/Makefile | 26 +- Bomberman (U)/copilot/chr.bin | Bin 0 -> 8192 bytes Bomberman (U)/copilot/chr.o | Bin 0 -> 53833 bytes Bomberman (U)/copilot/chr.s | 515 + Bomberman (U)/copilot/header.bin | Bin 0 -> 16 bytes Bomberman (U)/copilot/header.o | Bin 0 -> 3118 bytes Bomberman (U)/copilot/header.s | 12 + Bomberman (U)/copilot/linker.cfg | 14 +- Bomberman (U)/copilot/locals.inc | 73 +- Bomberman (U)/copilot/main.s | 54 +- Bomberman (U)/copilot/prg.o | Bin 0 -> 161659 bytes Bomberman (U)/copilot/prg.s | 7552 +++++++++++++ Bomberman (U)/copilot/reconstructed.lbl | 467 + Bomberman (U)/copilot/reconstructed.map | 32 + Bomberman (U)/copilot/reconstructed.nes | Bin 0 -> 24592 bytes Bomberman (U)/copilot/rom.nes | 1 + Burger Time (U)/OVERVIEW.md | 364 + Burger Time (U)/copilot/Makefile | 27 +- Burger Time (U)/copilot/burger_time.nes | 1 + Burger Time (U)/copilot/chr.bin | Bin 0 -> 8192 bytes Burger Time (U)/copilot/chr.o | Bin 0 -> 12596 bytes Burger Time (U)/copilot/chr.s | 2 +- Burger Time (U)/copilot/header.bin | Bin 0 -> 16 bytes Burger Time (U)/copilot/header.o | Bin 0 -> 336 bytes Burger Time (U)/copilot/header.s | 2 +- Burger Time (U)/copilot/linker.cfg | 16 +- Burger Time (U)/copilot/prg.o | Bin 0 -> 181701 bytes Burger Time (U)/copilot/prg.s | 1 - Burger Time (U)/copilot/reconstructed.lbl | 634 ++ Burger Time (U)/copilot/reconstructed.map | 32 + Burger Time (U)/copilot/reconstructed.nes | Bin 0 -> 24592 bytes Burger Time (U)/copilot/rom.nes | 1 + Defender 2 (U)/OVERVIEW.md | 254 + Defender 2 (U)/copilot/Makefile | 34 +- Defender 2 (U)/copilot/chr.bin | Bin 0 -> 8192 bytes Defender 2 (U)/copilot/chr.o | Bin 0 -> 12596 bytes Defender 2 (U)/copilot/chr.s | 2 +- Defender 2 (U)/copilot/header.bin | Bin 0 -> 16 bytes Defender 2 (U)/copilot/header.o | Bin 0 -> 336 bytes Defender 2 (U)/copilot/header.s | 2 +- Defender 2 (U)/copilot/linker.cfg | 14 +- Defender 2 (U)/copilot/prg.o | Bin 0 -> 212738 bytes Defender 2 (U)/copilot/prg.s | 3 +- Defender 2 (U)/copilot/reconstructed.lbl | 779 ++ Defender 2 (U)/copilot/reconstructed.map | 34 + Defender 2 (U)/copilot/reconstructed.nes | Bin 0 -> 24592 bytes Defender 2 (U)/copilot/rom.nes | 1 + Excitebike (JU)/OVERVIEW.md | 418 + Excitebike (JU)/copilot/Makefile | 33 +- Excitebike (JU)/copilot/chr.o | Bin 0 -> 12596 bytes Excitebike (JU)/copilot/chr.s | 2 + Excitebike (JU)/copilot/header.o | Bin 0 -> 336 bytes Excitebike (JU)/copilot/header.s | 2 + Excitebike (JU)/copilot/linker.cfg | 10 +- Excitebike (JU)/copilot/locals.inc | 181 + Excitebike (JU)/copilot/prg.o | Bin 0 -> 211433 bytes Excitebike (JU)/copilot/reconstructed.lbl | 1045 ++ Excitebike (JU)/copilot/reconstructed.map | 32 + Excitebike (JU)/copilot/reconstructed.nes | Bin 0 -> 24592 bytes Excitebike (JU)/copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes Excitebike (JU)/copilot/rom.nes | 1 + OVERVIEW.md | 148 + Pac-Man (USA) (Namco)/OVERVIEW.md | 467 + Pac-Man (USA) (Namco)/copilot/Makefile | 33 +- Pac-Man (USA) (Namco)/copilot/chr.bin | Bin 0 -> 8192 bytes Pac-Man (USA) (Namco)/copilot/chr.o | Bin 0 -> 12596 bytes Pac-Man (USA) (Namco)/copilot/chr.s | 2 + Pac-Man (USA) (Namco)/copilot/header.bin | Bin 0 -> 16 bytes Pac-Man (USA) (Namco)/copilot/header.o | Bin 0 -> 336 bytes Pac-Man (USA) (Namco)/copilot/header.s | 2 + Pac-Man (USA) (Namco)/copilot/linker.cfg | 10 +- Pac-Man (USA) (Namco)/copilot/locals.inc | 181 + Pac-Man (USA) (Namco)/copilot/prg.o | Bin 183348 -> 183348 bytes .../copilot/reconstructed.map | 6 + .../copilot/reconstructed.nes | Bin 0 -> 24592 bytes Pac-Man (USA) (Namco)/copilot/rom.nes | 1 + Pac-Man (USA) (Namco)/copilot/symbols.inc | 51 + Tennis (JU)/OVERVIEW.md | 367 + Tennis (JU)/copilot/Makefile | 33 +- Tennis (JU)/copilot/chr.bin | Bin 0 -> 8192 bytes Tennis (JU)/copilot/chr.o | Bin 0 -> 12596 bytes Tennis (JU)/copilot/chr.s | 2 + Tennis (JU)/copilot/header.bin | Bin 0 -> 16 bytes Tennis (JU)/copilot/header.o | Bin 0 -> 336 bytes Tennis (JU)/copilot/header.s | 2 + Tennis (JU)/copilot/linker.cfg | 10 +- Tennis (JU)/copilot/locals.inc | 2 +- Tennis (JU)/copilot/prg.o | Bin 200080 -> 193601 bytes Tennis (JU)/copilot/prg.s | 1 + Tennis (JU)/copilot/reconstructed.map | 6 + .../copilot/{prg.bin => reconstructed.nes} | Bin 16384 -> 24592 bytes Tennis (JU)/copilot/reconstructed_prg.bin | Bin 16384 -> 0 bytes Tennis (JU)/copilot/rom.nes | 1 + .../Donkey Kong 3 (JUE).nes | Bin .../Makefile | 9 + .../DonkeyKong3_ZeroPageSemanticNames/chr.o | Bin 0 -> 12582 bytes .../DonkeyKong3_ZeroPageSemanticNames/chr.s | 2 + .../DonkeyKong3_ZeroPageSemanticNames/dk3.nes | Bin 0 -> 24592 bytes .../header.o | Bin 0 -> 322 bytes .../header.s | 2 + .../linker.cfg | 2 + .../locals.inc | 319 + .../DonkeyKong3_ZeroPageSemanticNames/prg.o | Bin 0 -> 131573 bytes .../DonkeyKong3_ZeroPageSemanticNames/prg.s | 9952 +++++++++++++++++ .../symbols.inc | 12 + _wip/Donkey Kong 3 (JUE)/chr.bin | Bin 0 -> 8192 bytes _wip/Donkey Kong 3 (JUE)/dk3.nes.txt | Bin 0 -> 24592 bytes _wip/Donkey Kong 3 (JUE)/header.bin | Bin 0 -> 16 bytes 135 files changed, 26562 insertions(+), 420 deletions(-) create mode 100644 Balloon Fight (JU)/OVERVIEW.md create mode 100644 Balloon Fight (JU)/copilot/chr.s create mode 100644 Balloon Fight (JU)/copilot/header.s create mode 100644 Balloon Fight (JU)/copilot/reconstructed_prg.bin create mode 120000 Balloon Fight (JU)/copilot/rom.nes create mode 100644 Balloon Fight (JU)/copilot/symbols.inc create mode 100644 Baseball (UE)/OVERVIEW.md create mode 100644 Baseball (UE)/copilot/chr.bin create mode 100644 Baseball (UE)/copilot/chr.o create mode 100644 Baseball (UE)/copilot/chr.s create mode 100644 Baseball (UE)/copilot/header.bin create mode 100644 Baseball (UE)/copilot/header.o create mode 100644 Baseball (UE)/copilot/header.s create mode 100644 Baseball (UE)/copilot/prg.o create mode 100644 Baseball (UE)/copilot/reconstructed.lbl create mode 100644 Baseball (UE)/copilot/reconstructed.map create mode 100644 Baseball (UE)/copilot/reconstructed.nes create mode 120000 Baseball (UE)/copilot/rom.nes create mode 100644 Bomberman (U)/OVERVIEW.md create mode 100644 Bomberman (U)/copilot/chr.bin create mode 100644 Bomberman (U)/copilot/chr.o create mode 100644 Bomberman (U)/copilot/chr.s create mode 100644 Bomberman (U)/copilot/header.bin create mode 100644 Bomberman (U)/copilot/header.o create mode 100644 Bomberman (U)/copilot/header.s create mode 100644 Bomberman (U)/copilot/prg.o create mode 100644 Bomberman (U)/copilot/prg.s create mode 100644 Bomberman (U)/copilot/reconstructed.lbl create mode 100644 Bomberman (U)/copilot/reconstructed.map create mode 100644 Bomberman (U)/copilot/reconstructed.nes create mode 120000 Bomberman (U)/copilot/rom.nes create mode 100644 Burger Time (U)/OVERVIEW.md create mode 120000 Burger Time (U)/copilot/burger_time.nes create mode 100644 Burger Time (U)/copilot/chr.bin create mode 100644 Burger Time (U)/copilot/chr.o create mode 100644 Burger Time (U)/copilot/header.bin create mode 100644 Burger Time (U)/copilot/header.o create mode 100644 Burger Time (U)/copilot/prg.o create mode 100644 Burger Time (U)/copilot/reconstructed.lbl create mode 100644 Burger Time (U)/copilot/reconstructed.map create mode 100644 Burger Time (U)/copilot/reconstructed.nes create mode 120000 Burger Time (U)/copilot/rom.nes create mode 100644 Defender 2 (U)/OVERVIEW.md create mode 100644 Defender 2 (U)/copilot/chr.bin create mode 100644 Defender 2 (U)/copilot/chr.o create mode 100644 Defender 2 (U)/copilot/header.bin create mode 100644 Defender 2 (U)/copilot/header.o create mode 100644 Defender 2 (U)/copilot/prg.o create mode 100644 Defender 2 (U)/copilot/reconstructed.lbl create mode 100644 Defender 2 (U)/copilot/reconstructed.map create mode 100644 Defender 2 (U)/copilot/reconstructed.nes create mode 120000 Defender 2 (U)/copilot/rom.nes create mode 100644 Excitebike (JU)/OVERVIEW.md create mode 100644 Excitebike (JU)/copilot/chr.o create mode 100644 Excitebike (JU)/copilot/chr.s create mode 100644 Excitebike (JU)/copilot/header.o create mode 100644 Excitebike (JU)/copilot/header.s create mode 100644 Excitebike (JU)/copilot/locals.inc create mode 100644 Excitebike (JU)/copilot/prg.o create mode 100644 Excitebike (JU)/copilot/reconstructed.lbl create mode 100644 Excitebike (JU)/copilot/reconstructed.map create mode 100644 Excitebike (JU)/copilot/reconstructed.nes create mode 100644 Excitebike (JU)/copilot/reconstructed_prg.bin create mode 120000 Excitebike (JU)/copilot/rom.nes create mode 100644 OVERVIEW.md create mode 100644 Pac-Man (USA) (Namco)/OVERVIEW.md create mode 100644 Pac-Man (USA) (Namco)/copilot/chr.bin create mode 100644 Pac-Man (USA) (Namco)/copilot/chr.o create mode 100644 Pac-Man (USA) (Namco)/copilot/chr.s create mode 100644 Pac-Man (USA) (Namco)/copilot/header.bin create mode 100644 Pac-Man (USA) (Namco)/copilot/header.o create mode 100644 Pac-Man (USA) (Namco)/copilot/header.s create mode 100644 Pac-Man (USA) (Namco)/copilot/locals.inc create mode 100644 Pac-Man (USA) (Namco)/copilot/reconstructed.nes create mode 120000 Pac-Man (USA) (Namco)/copilot/rom.nes create mode 100644 Tennis (JU)/OVERVIEW.md create mode 100644 Tennis (JU)/copilot/chr.bin create mode 100644 Tennis (JU)/copilot/chr.o create mode 100644 Tennis (JU)/copilot/chr.s create mode 100644 Tennis (JU)/copilot/header.bin create mode 100644 Tennis (JU)/copilot/header.o create mode 100644 Tennis (JU)/copilot/header.s rename Tennis (JU)/copilot/{prg.bin => reconstructed.nes} (66%) delete mode 100644 Tennis (JU)/copilot/reconstructed_prg.bin create mode 120000 Tennis (JU)/copilot/rom.nes rename {_ROMS => _wip/Donkey Kong 3 (JUE)}/Donkey Kong 3 (JUE).nes (100%) create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/Makefile create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.o create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.s create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/dk3.nes create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/header.o create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/header.s create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/linker.cfg create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/locals.inc create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/prg.o create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/prg.s create mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/symbols.inc create mode 100644 _wip/Donkey Kong 3 (JUE)/chr.bin create mode 100644 _wip/Donkey Kong 3 (JUE)/dk3.nes.txt create mode 100644 _wip/Donkey Kong 3 (JUE)/header.bin diff --git a/Balloon Fight (JU)/OVERVIEW.md b/Balloon Fight (JU)/OVERVIEW.md new file mode 100644 index 0000000..bbe7ebd --- /dev/null +++ b/Balloon Fight (JU)/OVERVIEW.md @@ -0,0 +1,265 @@ +# Balloon Fight (JU) — Game Flow from Power-On + +This document describes the execution flow of the disassembled Balloon Fight (JU) PRG bank (16 KB, mapped at CPU **$C000–$FFFF**), starting from power-on. It is based entirely on `copilot/prg.s` in the repository. The rebuild is verified **byte-identical** to the original `prg.bin`. + +--- + +## 1. Reset Vector — CPU $FFFC → $C000 + +**`Reset`** ($C000–$C07E) + +On power-on or reset, the 6502 jumps to `$C000`. The reset routine performs cold-start hardware initialization: + +| Step | Code | Purpose | +|------|------|---------| +| 1 | `lda #$00 / sta PPUCTRL` | Disable NMI and PPU rendering | +| 2 | `lda #$00 / sta PPUMASK` | Disable screen output | +| 3–6 | Poll `$2002` twice | Wait for two full VBlank periods (PPU warm-up) | +| 7 | `sei / cld` | Disable interrupts, clear decimal mode | +| 8 | `ldx #$FF / txs` | Initialize stack pointer | +| 9–13 | Clear Zero Page | Zero all of RAM $00–$FF | +| 14–21 | Warm-start signature check | Compare RAM `$07FA`–`$07FC` against `"HAL"` ($C082–$C084). If valid, skip full memory clear | +| 22–31 | Initialize memory | Clear zero page + stack page ($0700–$07FF), set `$15 = $32`, run block-init loop (`jsr $D6DE` 50 times), `jsr $C579` | +| 32–44 | Copy initialization data | Copy 15 bytes from $C085 to $0629 (initial game state table) | +| 45–51 | Clear local variables | Zero $03–$06 | +| 52–56 | Copy saved signature | Re-store `"HAL"` to $07FA–$07FC | +| 57 | `jmp MainInitialization` | Transfer control to $F1D4 | + +**Warm-start signature:** `"HAL"` stored at $C082; RAM copy at $07FA. This lets the game resume state after a soft reset without re-initializing everything. + +--- + +## 2. Main Initialization + +**`MainInitialization`** is at **$F1D4** (forward-referenced in `locals.inc`). It sets up the first round, initializes object pools, and enters the main loop. Its body lives in the upper bank region (not fully shown in the decoded $C000–$C07E range). + +--- + +## 3. Interrupt Vectors — CPU $FFFA–$FFFF + +Located at the end of the bank (PRG offset $3FFA): + +| Vector | Address | Handler | +|--------|---------|---------| +| NMI | $C094 | `NmiHandler` | +| RESET | $C000 | `Reset` | +| IRQ | $C0F7 | `IrqHandler` (self-loop `jmp $C0F7` — unused) | + +--- + +## 4. NMI / Frame Heartbeat — `NmiHandler` ($C094) + +The NMI fires once per frame and drives the frame pacing. It: + +1. **Preserves registers** (A, X, Y on stack) +2. **OAM DMA**: writes `$00` to `$2003`, then `$02` to `$4014` (DMA from $0200–$02FF) +3. **PPU command buffer flush**: compares read/write offsets at $52/$53; if data pending, calls `FlushPpuCommandPreserved` ($C17C) +4. **Transfer sources**: `jsr UpdatePpuTransferSources` ($D60D) +5. **Build OAM**: `jsr BuildFrameOam` ($D798) +6. **Frame counter**: `inc FrameCounter` ($19) +7. **Scroll/rendering setup**: sets $2006/$2005 scroll registers, conditionally waits for VBlank if rendering disabled, writes $2000 +8. **Audio**: `jsr UpdateAudioFrame` ($FFF7 bank call → `Sound_F758`) +9. **Sets `NmiCompletedFlag`** ($02 = $01) +10. **Restores registers, `rti`** + +The main game loop runs during VBlank and waits for this flag. + +--- + +## 5. Main Game Loop — $C209 + +After initialization, control reaches the per-frame loop at **$C209**: + +``` +UpdateGameplayObjects ($E691) ; update all 20 gameplay-object slots +UpdateSpecialObjectSystem ($C6F9) ; every other frame (frame counter / 2) +[round spawner / HUD / spawning logic] +[object physics & collision] +[particle system] +[OAM sorting / sprite setup] +WaitForFrame ($F465) ; wait for NMI-completed flag +jmp back to $C209 +``` + +Key flow details: + +- **Scroll handling** ($C227): if `PpuScrollX` ($17) is non-zero, toggles `PpuControlBase` bit 0 (screen scroll page flip), decrements scroll X. +- **Carrier/rescue sequence** ($C233): updates carrier position ($0488), target player, sound requests. +- **Effect object pool** (8 slots, $055D–$0584): updates timers, respawns offscreen. +- **Gameplay object pool** (20 slots, $0530–$055C): movement, position integration. +- **Round spawner** ($C790): on frame boundaries, counts down `RoundSpawnDelay`, finds free slots, spawns round objects from tables ($C88F–$C8B5), plays spawn sound. +- **HUD updates** ($C831): when spawn delay reaches 1, writes round HUD digits to PPU buffer. +- **Sprite sorting**: `SortOrInitializeRecords` ($C579) maintains a sorted table of up to 50 five-byte records ($0700–$07F9) for OAM priority. + +--- + +## 6. Subsystems + +### 6.1 PPU Command Buffer ($C12D–$C1C4) + +A buffered PPU update system. Commands are staged at $0300 with format: +- Byte 0: PPU address high | $20 +- Byte 1: PPU address low +- Byte 2: length (number of data bytes following) + +Routines: +- `AppendBytesToPpuBuffer` ($C131) — appends raw bytes +- `AppendLengthPrefixedPpuData` ($C139) — appends with length prefix +- `BuildPpuCommand` ($C154, formerly `Sub_C154`) — formats address+length command +- `FlushPpuCommandPreserved` ($C17C, formerly `Sub_C17C`) — drains buffer to $2006/$2007, preserving X/Y +- Special handling for palette writes ($3Fxx range) + +### 6.2 Round Spawning ($C77A–$C88A) + +- `ChooseRoundSpawnIndex` ($C77A): picks a random spawn index below `RoundSpawnRandomLimit`, rejecting zero +- `UpdateRoundSpawner` ($C790): timer-driven spawning; initializes object position, velocity (from tables at $C89F–$C8B1), flip flags, aux state; increments `SpawnSelector`; requests spawn sound ($F0 bit $04) +- `UpdateRoundHud` / `ConfigureRoundPresentation` ($C831–$C88A): writes round number / HUD tiles to PPU buffer + +**Spawn tables** ($C88F–$C8B5): flip X/Y, X/Y offsets, parameter, velocity Y, position hi, velocity X — six entry types. + +### 6.3 Gameplay Objects ($C8B7–$C9DC) + +`UpdateRoundObjectSpritesAndPhysics` ($C8B7) updates slots 1 and 0: +- Builds 3-sprite OAM per object from tile tables ($C9DD–$CA33) +- Integrates fixed-point position ($C9B6) +- Bounds testing (`TestGameplayObjectAgainstBounds`, $CA67) against rectangular regions +- Velocity reflection on collision (`BounceGameplayObjectX/Y`, $CA4F/$CA37) +- Object removal when offscreen + +### 6.4 Bonus Objects ($CB74–$CCCA) + +- `UpdateBonusObjectSystem` ($CB74): per-frame phase/timer advance for the single active bonus slot +- `TestBonusObjectPlayerOverlap` ($CBB2): rectangle overlap vs both players; applies horizontal/vertical impulses, collision sound +- `TestBonusObjectCollection` ($CC3A): phase-3 collection; starts bonus timer +- `TriggerBonusObjectEffect` ($CCBF): increments effect counter, calls `ApplyBonusEffect` ($E983) +- `DrawBonusObjectHud` ($CCCB): 3-row HUD tile display from phase tables ($CD26–$D046) + +### 6.5 Carrier / Rescue Sequence ($C5C3–$C715) + +- `UpdateCarrierSequence` ($C6F9): advances carrier target X while idle; finds eligible player; starts sequence +- `FindEligiblePlayerForCarrier` ($C614): scans player slots 7→0, finds one at lower screen boundary ($B4+) matching carrier target X +- `BeginCarrierTargetSequence` ($C6C4): captures player position/state, resets timer +- `UpdateCarrierArrivalSequence` ($C658): moves carrier down, checks contact, transitions player to hit/rescue state, sound request +- `UpdateCarrierObjectDisplay` ($C5C3): builds 8-sprite carrier metasprite, updates target player position relative to carrier +- Tables: `NormalDisplayModeTable` ($C5B7), `AlternateDisplayModeTable` ($C5BB), `CarrierAnimationSequenceTable` ($C6B8) + +### 6.6 Particle System ($CD4A–$CEAD) + +- `InitializeParticleSlots` ($CD4A): 10 slots, offscreen Y ($F0) +- `SpawnTimedParticle` ($CD5A): random timer, finds free slot, assigns position/velocity from `ParticleInitialVelocityTable` ($CEAE) +- `UpdateParticleSystem` ($CDAA): integrates signed motion, applies scroll delta, retires offscreen particles +- `DrawParticleSprites` ($CE2F): 3-sprite OAM per particle with animation/attribute masking + +### 6.7 Sound Driver ($FFF7 region, bank-switched) + +- `UpdateAudioFrame` jumps to `Sound_F758` in another bank +- Sound sequence pointer table at $3BCA (32 entries) +- Encoded sequence data $3BCA–$3FF1 (note/duration bytes with $02/$FF/$8x control codes) +- APU channel init at $F7xx region (`InitializeApuChannelState`, `SilencePulseChannels`) +- Sound request flags: $F0 (flags 0), $F1 (flags 1), $F2 (flags 2), $F3 (flags 3) + +--- + +## 7. Memory Map (Key Zero Page / RAM) + +| Address | Name | Use | +|---------|------|-----| +| $00 | `PpuControlShadow` | $2000 mirror | +| $01 | `PpuMaskShadow` | $2001 mirror | +| $02 | `NmiCompletedFlag` | VBlank sync flag | +| $12–$13 | `RecordIndex` / `ReverseRecordIndex` | Sorted-record insertion | +| $14–$15 | `SpawnParameter` / `SpawnPixelPosition` | Spawn args | +| $16 | `RenderingDisabledFlag` | Rendering state | +| $17 | `PpuScrollX` | Scroll X | +| $18 | `PpuControlBase` | Base PPU control | +| $19 | `FrameCounter` | Frame tick | +| $1B | `RandomState` | PRNG state | +| $1D–$1E | `RecordPtrLo/Hi` | Record table pointer | +| $23–$24 | `SpawnCommandPointerLo/Hi` | Command stream pointer | +| $25–$26 | `DispatchPointerLo/Hi` | Spawn dispatch indirect jump | +| $52–$53 | Ppu buffer read/write offsets | Command buffer | +| $54–$56 | Ppu command address/length | Pending PPU command | +| $7F | `PlayerLifecycleState` | Per-player lifecycle | +| $88 | `PlayerSlotState` | Per-player active state | +| $91 | `PlayerPosX` / `Player0PosX` | Player X | +| $99 | `CarrierTargetX` | Carrier target | +| $9A | `PlayerPosY` / `Player0PosY` | Player Y | +| $A2 | `CarrierPosY` | Carrier Y | +| $BD | `PlayerCollisionDisable` | Collision immunity | +| $F0–$F3 | Sound request flags 0–3 | Audio requests | +| $0300–$03FF | PPU command buffer | Staged PPU updates | +| $0489–$048D | Carrier sequence state | Active, mode, target, drop, timer | +| $0490–$0530 | Gameplay object pool (20 slots) | State, pos, velocity | +| $055D–$0584 | Effect object pool (8 slots) | State, pos | +| $0558–$05CE | Particle / sequence state | 10-slot particle pool | +| $05D1–$060E | Bonus object state | Timer, phase, pos, HUD | +| $0700–$07F9 | Sorted record table | 50 × 5-byte OAM sort records | +| $07FA–$07FC | Warm-start signature | "HAL" | + +--- + +## 8. Object Pools + +| Pool | Slots | State array | Purpose | +|------|-------|-------------|---------| +| Gameplay objects | 20 ($00–$13) | $0530 | Round enemies/objects, movement & physics | +| Effect objects | 8 ($00–$07) | $055D | Short-lived spawn effects | +| Particles | 10 ($00–$09) | $055D | Visual particles (shared state array, different offset interpretation) | + +Slot state convention: **negative ($FF) = inactive/free**, zero or positive = active. + +--- + +## 9. Summary of Execution Flow + +``` +Power On / Reset + │ + ▼ +Reset ($C000) ────► hardware init, clear RAM, validate "HAL" signature + │ + ▼ +jmp MainInitialization ($F1D4) + │ + ▼ +[first-round setup, object pool init] + │ + ▼ +Main Loop ($C209) ──────────────────────────────────────────────┐ + │ │ + ├─ UpdateGameplayObjects ($E691) │ + ├─ UpdateSpecialObjectSystem ($C6F9) [alt frames] │ + ├─ Carrier sequence ($C6F9 family) │ + ├─ Round spawner ($C790) + HUD ($C831) │ + ├─ Object physics & collision ($C8B7, $CA67) │ + ├─ Bonus object system ($CB74) │ + ├─ Particle system ($CDAA) │ + ├─ OAM sort ($C579) │ + ├─ WaitForFrame ($F465) ◄──────── waits for NMI flag ──────┘ + │ + ▼ (loop back to $C209) + +NMI ($C094) [once per frame] + ├─ OAM DMA ($4014) + ├─ Flush PPU command buffer ($C17C) + ├─ Update transfer sources ($D60D) + ├─ Build frame OAM ($D798) + ├─ Frame counter++, scroll setup + ├─ UpdateAudioFrame ($FFF7 → Sound_F758) + └─ Set NmiCompletedFlag, rti +``` + +--- + +## 10. Notes on Provisional Areas + +Some routines in the disassembly still carry placeholder names (`Label_Cxxxx`, `Sound_FBxx`) and some data blocks were previously marked "undecoded." These have been cleaned up in this review: + +- `Sub_C154` → **`BuildPpuCommand`** +- `Sub_C17C` → **`FlushPpuCommandPreserved`** +- `Sub_C40C` → **`SpawnRandomObject`** +- `SpawnCommandStreamData_C4AD` → **`RoundSpawnCommandStream`** (format documented) + +The 497 `Label_` branch targets are local intra-routine labels; none are subroutine entry points (confirmed against all `jsr`/`jmp` targets in the source). The 77 `Sound_FBxx` labels are sound-driver entry points in the banked audio region. + +Build verification: `make` in `copilot/` produces `reconstructed_prg.bin` that is **byte-identical** to `prg.bin` and to the PRG bank of `balloon.nes`. \ No newline at end of file diff --git a/Balloon Fight (JU)/copilot/Makefile b/Balloon Fight (JU)/copilot/Makefile index 3f9ba6f..7b0587a 100644 --- a/Balloon Fight (JU)/copilot/Makefile +++ b/Balloon Fight (JU)/copilot/Makefile @@ -1,10 +1,25 @@ -all: reconstructed_prg.bin verify -prg.o: prg.s symbols.inc prg.bin - ca65 -g -o $@ prg.s -reconstructed_prg.bin: prg.o linker.cfg - ld65 -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ prg.o -verify: reconstructed_prg.bin prg.bin - cmp reconstructed_prg.bin prg.bin - @echo BYTE-IDENTICAL +CA65 ?= ca65 +LD65 ?= ld65 + +all: reconstructed.nes verify + +prg.o: prg.s symbols.inc locals.inc + $(CA65) -g -o $@ $< + +header.o: header.s + $(CA65) -g -o $@ $< + +chr.o: chr.s + $(CA65) -g -o $@ $< + +reconstructed.nes: header.o prg.o chr.o linker.cfg + $(LD65) -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ header.o prg.o chr.o + +verify: reconstructed.nes + cmp reconstructed.nes rom.nes + @echo "Byte-identical ROM verified." + clean: - rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl + rm -f *.o reconstructed.nes reconstructed.map reconstructed.lbl + +.PHONY: all verify clean \ No newline at end of file diff --git a/Balloon Fight (JU)/copilot/chr.s b/Balloon Fight (JU)/copilot/chr.s new file mode 100644 index 0000000..f6a8c21 --- /dev/null +++ b/Balloon Fight (JU)/copilot/chr.s @@ -0,0 +1,2 @@ +.segment "CHR" + .incbin "chr.bin" \ No newline at end of file diff --git a/Balloon Fight (JU)/copilot/header.s b/Balloon Fight (JU)/copilot/header.s new file mode 100644 index 0000000..37d1389 --- /dev/null +++ b/Balloon Fight (JU)/copilot/header.s @@ -0,0 +1,2 @@ +.segment "HEADER" + .incbin "header.bin" \ No newline at end of file diff --git a/Balloon Fight (JU)/copilot/linker.cfg b/Balloon Fight (JU)/copilot/linker.cfg index d9d421d..cfaf881 100644 --- a/Balloon Fight (JU)/copilot/linker.cfg +++ b/Balloon Fight (JU)/copilot/linker.cfg @@ -1,6 +1,10 @@ MEMORY { - PRG: start = $C000, size = $4000, file = %O, fill = yes; + HEADER: start = $0000, size = $0010, fill = yes; + PRG: start = $C000, size = $4000, fill = yes; + CHR: start = $0000, size = $2000, fill = yes; } SEGMENTS { - PRG: load = PRG, type = ro; -} + HEADER: load = HEADER, type = ro; + PRG: load = PRG, type = ro; + CHR: load = CHR, type = ro; +} \ No newline at end of file diff --git a/Balloon Fight (JU)/copilot/locals.inc b/Balloon Fight (JU)/copilot/locals.inc index f4c6416..8b641d5 100644 --- a/Balloon Fight (JU)/copilot/locals.inc +++ b/Balloon Fight (JU)/copilot/locals.inc @@ -1,230 +1,229 @@ -; Balloon Fight application-specific RAM and forward references. - -; Spawn-dispatch state -DispatchPointerLo = $25 -DispatchPointerHi = $26 -SpawnCommandPointerLo = $23 -SpawnCommandPointerHi = $24 -SpawnParameter = $14 -SpawnPixelPosition = $15 - -; Eight-entry effect-object pool ($00-$07) -EffectObjectState = $055D -EffectObjectPosX = $0567 -EffectObjectPosY = $057B - -; Twenty-entry gameplay-object pool ($00-$13) -GameplayObjectPosX = $0490 -GameplayObjectPosY = $04A4 -GameplayObjectVelocityY = $04E0 -GameplayObjectVelocityX = $04F4 -GameplayObjectParameter = $0508 -GameplayObjectPosXHi = $051C -GameplayObjectState = $0530 - -; NMI/PPU state PpuControlShadow = $00 PpuMaskShadow = $01 NmiCompletedFlag = $02 +CurrentRecord = $0003 + +Temp12 = $12 +RecordIndex = $12 +CurrentRoundObjectTile = $12 +CollisionDeltaX = $12 +MotionDeltaLo = $12 + +ReverseRecordIndex = $13 +CollisionDeltaY = $13 +MotionDeltaHi = $13 + +SpawnParameter = $14 +SpawnPixelPosition = $15 + RenderingDisabledFlag = $16 PpuScrollX = $17 PpuControlBase = $18 FrameCounter = $19 + +RandomState = $1B + +RecordPtrLo = $1D +RecordPtrHi = $1E +DestinationPtrLo = $1F +DestinationPtrHi = $20 + PpuSourcePtrLo = $21 PpuSourcePtrHi = $22 + +SpawnCommandPointerLo = $23 +BoundsLeftPtrLo = $23 + +SpawnCommandPointerHi = $24 +BoundsLeftPtrHi = $24 + +DispatchPointerLo = $25 +BoundsRightPtrLo = $25 + +DispatchPointerHi = $26 +BoundsRightPtrHi = $26 + +BoundsTopPtrLo = $27 +BoundsTopPtrHi = $28 +BoundsBottomPtrLo = $29 +BoundsBottomPtrHi = $2A + +RoundIndex = $3C + +CurrentObjectIndex = $3E +SequencePlayerIndex = $3E + +PlayerCountMinusOne = $40 +PlayerActiveFlags = $41 + +SelectedRecordIndex = $43 + +SequenceStep = $46 +SequenceValueLo = $47 +SequenceValueHi = $48 + +SelectedRecordIndexCopy = $49 +ScaledRecordValue = $4A + PpuDestinationHi = $50 PpuBufferReadOffset = $52 PpuBufferWriteOffset = $53 PpuCommandAddressHi = $54 PpuCommandAddressLo = $55 PpuCommandLength = $56 -Temp12 = $12 -; Temporary forward references outside the decoded block -MainInitialization = $F1D4 -UpdatePpuTransferSources = $D60D -BuildFrameOam = $D798 -WaitForFrame = $F465 -InitializeOrQueueObject = $D6DE -SortOrInitializeRecords = $C579 -InitializeAudio = $F4A5 -UpdateGameplayObjects = $E691 -UpdateSpecialObjectSystem = $C6F9 -ReflectObjectYVelocity = $CA4F -GetRandomValue = $F1B3 +RoundHudCommandAddressHi = $57 +HudCommandAddressHi = $57 +PpuCommandData0 = $57 -; Sorted five-byte record table helpers -RecordIndex = $12 -ReverseRecordIndex = $13 -RecordPtrLo = $1D -RecordPtrHi = $1E -DestinationPtrLo = $1F -DestinationPtrHi = $20 -SelectedRecordIndex = $43 -SelectedRecordIndexCopy = $49 -ScaledRecordValue = $4A -RoundSeedValue = $0559 -SortedRecordTable = $0700 -CurrentRecord = $0003 +RoundHudCommandAddressLo = $58 +HudCommandAddressLo = $58 +PpuCommandData1 = $58 -; Temporary forward references used by the decoded record helpers -UpdateRoundSeedSource = $D0E2 -DivideOrScaleRecordValue = $D77C +RoundHudCommandLength = $59 +HudCommandLength = $59 +PpuCommandData2 = $59 + +RoundHudTile = $5A +HudCommandTile0 = $5A + +HudCommandTile1 = $5B +HudCommandTile2 = $5C + +PpuBufferHead = $5D + +SequencePointerLo = $68 +SequencePointerHi = $69 -; Carrier/rescue sequence state PlayerLifecycleState = $7F + CarrierDisplayMode = $87 PlayerSlotState = $88 CarrierPhase = $89 + PlayerPosX = $91 Player0PosX = $92 + CarrierTargetX = $99 PlayerPosY = $9A Player0PosY = $9B + CarrierPosY = $A2 +RoundSpawnRandomLimit = $A3 +SelectedSpawnIndex = $A4 +SelectedSpawnIndexCopy = $A5 + +RoundSpawnBaseX = $B2 +RoundSpawnBaseY = $B5 +RoundSpawnDelay = $B8 +SpawnSelector = $BA + +PlayerCollisionDisable = $BD +SequenceState = $BE + +BonusEffectCounter = $CB +GameplayObjectCollisionFlags = $CC +BoundsCandidateIndex = $CD + +SoundRequestFlags0 = $F0 +SoundRequestFlags1 = $F1 SoundRequestFlags2 = $F2 +SoundRequestFlags3 = $F3 + +OamBuffer = $0200 +ParticleOamBase = $0250 +OamEntryE0Y = $02E0 +OamEntryE4Y = $02E4 +OamEntryE8Y = $02E8 + +PlayerHorizontalImpulse = $041B +PlayerVerticalImpulse = $042D + +PlayerVariantTable = $0448 +CarrierSavedValue = $0450 +PlayerAnimationState = $0451 +PlayerStateTimer = $045A CarrierSequenceActive = $0489 CarrierMode = $048A CarrierTargetPlayer = $048B CarrierDropPending = $048C CarrierSequenceTimer = $048D -CarrierSavedValue = $0450 -PlayerVariantTable = $0448 -PlayerAnimationState = $0451 - -; Forward references used by the carrier display/update code -BuildObjectMetasprite = $E3A4 - -; Round initialization state -RoundIndex = $3C -CurrentObjectIndex = $3E -RoundSpawnDelay = $B8 -SpawnSelector = $BA -SoundRequestFlags3 = $F3 -GameplayObjectAuxState = $0544 -OamEntryE0Y = $02E0 -OamEntryE4Y = $02E4 -OamEntryE8Y = $02E8 - -; Forward references used by round initialization -SpawnRoundObjects = $C77A - -; Round spawner and HUD state -RoundSpawnRandomLimit = $A3 -SelectedSpawnIndex = $A4 -SelectedSpawnIndexCopy = $A5 -RoundHudTile = $5A - -; Three-byte HUD command staged at $57-$59 before buffer append -RoundHudCommandAddressHi = $57 -RoundHudCommandAddressLo = $58 -RoundHudCommandLength = $59 -SoundRequestFlags0 = $F0 -SoundRequestFlags1 = $F1 +GameplayObjectPosX = $0490 +GameplayObjectPosY = $04A4 GameplayObjectVelocityFracY = $04B8 GameplayObjectVelocityIntY = $04CC +GameplayObjectVelocityY = $04E0 +GameplayObjectVelocityX = $04F4 -; Temporary forward references for round spawn parameter tables +GameplayObjectParameter = $0508 +GameplayObjectPosXHi = $051C +GameplayObjectState = $0530 +GameplayObjectAuxState = $0544 -; Round-object renderer state -CurrentRoundObjectTile = $12 -RoundSpawnBaseX = $B2 -RoundSpawnBaseY = $B5 -OamBuffer = $0200 +ParticleSequenceIndex = $0558 +RoundSeedValue = $0559 +ParticleSequenceValue = $0559 +ParticleScrollDelta = $055A +SequenceDataLo = $055B +SequenceDataHi = $055C -; Forward tables and routines used by the round-object renderer +EffectObjectState = $055D +ParticleState = $055D -; Table-driven gameplay-object boundary tests -BoundsLeftPtrLo = $23 -BoundsLeftPtrHi = $24 -BoundsRightPtrLo = $25 -BoundsRightPtrHi = $26 -BoundsTopPtrLo = $27 -BoundsTopPtrHi = $28 -BoundsBottomPtrLo = $29 -BoundsBottomPtrHi = $2A -GameplayObjectCollisionFlags = $CC -BoundsCandidateIndex = $CD +EffectObjectPosX = $0567 +ParticlePosX = $0567 -; Forward routine at the next decoded boundary +ParticlePosXFrac = $0571 -; Gameplay-object/player interaction state -CollisionDeltaX = $12 -CollisionDeltaY = $13 -PlayerCollisionDisable = $BD -PlayerStateTimer = $045A -PlayerHorizontalImpulse = $041B -PlayerVerticalImpulse = $042D +EffectObjectPosY = $057B +ParticlePosY = $057B + +ParticlePosYFrac = $0585 +ParticleVelocityXHi = $058F +ParticleVelocityXLo = $0599 + +ParticleVelocityYLo = $05B7 +ParticleVelocityYHi = $05C1 + +ParticleSpawnRemaining = $05CB +ParticleSpawnCountdown = $05CC +PlayerParticleHitCount = $05CD +PlayerParticleHitCount2 = $05CE -; Bonus-object subsystem -BonusEffectCounter = $CB ActiveBonusObjectIndex = $05D1 BonusObjectPosX = $05D2 BonusObjectPosY = $05DC BonusHudAddressLo = $05E6 BonusHudAddressHi = $05F0 BonusObjectPhase = $05FA + BonusObjectTimer = $0604 BonusObjectPhaseTimer = $060E -; Bonus HUD command staged at $57-$5C -HudCommandAddressHi = $57 -HudCommandAddressLo = $58 -HudCommandLength = $59 -HudCommandTile0 = $5A -HudCommandTile1 = $5B -HudCommandTile2 = $5C +SortedRecordTable = $0700 -; Forward references used by interaction and bonus-object code AbsoluteDifference = $F08E +UpdateSignedMotionAccumulator = $F1A6 +GetRandomValue = $F1B3 +MainInitialization = $F1D4 +WaitForFrame = $F465 +InitializeAudio = $F4A5 + +SortOrInitializeRecords = $C579 +SpawnRoundObjects = $C77A +UpdateRoundSeedSource = $D0E2 +UpdatePpuTransferSources = $D60D +InitializeOrQueueObject = $D6DE +BuildFrameOam = $D798 +DivideOrScaleRecordValue = $D77C + +BuildObjectMetasprite = $E3A4 +UpdateGameplayObjects = $E691 ApplyBonusEffect = $E983 AdjustPlayerHorizontalState = $EBB2 AdjustPlayerVerticalState = $EBBB -; Ten-slot particle/effect subsystem -RandomState = $1B -MotionDeltaLo = $12 -MotionDeltaHi = $13 -ParticleScrollDelta = $055A -ParticleState = $055D -ParticlePosX = $0567 -ParticlePosXFrac = $0571 -ParticlePosY = $057B -ParticlePosYFrac = $0585 -ParticleVelocityXHi = $058F -ParticleVelocityXLo = $0599 -ParticleVelocityYLo = $05B7 -ParticleVelocityYHi = $05C1 -ParticleSpawnRemaining = $05CB -ParticleSpawnCountdown = $05CC -ParticleOamBase = $0250 - -; Forward references used by the particle subsystem -UpdateSignedMotionAccumulator = $F1A6 - -; Particle result/sequence state -ParticleSequenceIndex = $0558 -ParticleSequenceValue = $0559 -SequenceDataLo = $055B -SequenceDataHi = $055C -PlayerParticleHitCount = $05CD -PlayerParticleHitCount2 = $05CE -SequencePlayerIndex = $3E -SequenceStep = $46 -SequenceValueLo = $47 -SequenceValueHi = $48 -SequencePointerLo = $68 -SequencePointerHi = $69 -SequenceState = $BE - -; Forward parameter tables for the next sequence-data block - -; Shared player-count and PPU staging aliases used by the particle sequence -PlayerCountMinusOne = $40 -PlayerActiveFlags = $41 -PpuCommandData0 = $57 -PpuCommandData1 = $58 -PpuCommandData2 = $59 -PpuBufferHead = $5D +ReflectObjectYVelocity = $CA4F +UpdateSpecialObjectSystem = $C6F9 \ No newline at end of file diff --git a/Balloon Fight (JU)/copilot/prg.s b/Balloon Fight (JU)/copilot/prg.s index 2c8c2de..56356f9 100644 --- a/Balloon Fight (JU)/copilot/prg.s +++ b/Balloon Fight (JU)/copilot/prg.s @@ -154,7 +154,7 @@ NmiHandler: lda PpuBufferReadOffset ; $00A3: A5 52 cmp PpuBufferWriteOffset ; $00A5: C5 53 beq Label_C0AC ; $00A7: F0 03 - jsr Sub_C17C ; $00A9: 20 7C C1 + jsr FlushPpuCommandPreserved ; $00A9: 20 7C C1 Label_C0AC: jsr UpdatePpuTransferSources ; $00AC: 20 0D D6 jsr BuildFrameOam ; $00AF: 20 98 D7 @@ -340,7 +340,7 @@ SetPpuMask: ;=============================================================================== WaitForFrameAndSetPpuMask: - jsr Sub_C154 ; $0119: 20 54 C1 + jsr BuildPpuCommand ; $0119: 20 54 C1 ldy #$00 ; $011C: A0 00 Label_C11E: lda $0057,y ; $011E: B9 57 00 @@ -439,26 +439,27 @@ Label_C144: tax ; $0152: AA rts ; $0153: 60 ;=============================================================================== -; Sub_C154 +; BuildPpuCommand ; ; Global: -; Reachable game-engine routine identified during recursive Pass-1 tracing. +; Builds a PPU command-buffer entry from the pending command address/length. ; ; Local: -; Performs the control flow beginning at CPU $C154; detailed semantics are -; refined as its RAM and table dependencies are traced. +; Formats the PPU command (address high byte with $20 prefix, address low +; byte, length) and writes it into the command buffer at $0300. ; ; Parameters: -; Caller-defined register and global RAM state. +; PpuCommandAddressLo/Hi ($55/$54), PpuCommandLength ($56), +; PpuBufferWriteOffset ($53). ; ; Returns: -; Routine-specific result; register preservation remains provisional. +; PpuBufferWriteOffset advanced; command bytes appended to $0300 buffer. ; ; PRG offset: $0154 ; CPU address: $C154 ;=============================================================================== -Sub_C154: +BuildPpuCommand: ldx PpuBufferWriteOffset ; $0154: A6 53 lda #$00 ; $0156: A9 00 sta Temp12 ; $0158: 85 12 @@ -505,26 +506,26 @@ AppendPpuAddressAndLength: inx ; $017A: E8 rts ; $017B: 60 ;=============================================================================== -; Sub_C17C +; FlushPpuCommandPreserved ; ; Global: -; Reachable game-engine routine identified during recursive Pass-1 tracing. +; Flushes the PPU command buffer while preserving the X and Y registers. ; ; Local: -; Performs the control flow beginning at CPU $C17C; detailed semantics are -; refined as its RAM and table dependencies are traced. +; Saves X/Y, calls PreserveXYAndFinalizePpuCommand to walk the $0300 command +; buffer and write pending PPU updates, then restores X/Y. ; ; Parameters: -; Caller-defined register and global RAM state. +; PpuBufferReadOffset/WriteOffset ($52/$53). ; ; Returns: -; Routine-specific result; register preservation remains provisional. +; X and Y preserved; PPU command buffer drained. ; ; PRG offset: $017C ; CPU address: $C17C ;=============================================================================== -Sub_C17C: +FlushPpuCommandPreserved: tya ; $017C: 98 pha ; $017D: 48 txa ; $017E: 8A @@ -978,35 +979,38 @@ SpawnAtRandomPosition: jsr GetRandomValue ; $03F7: 20 B3 F1 and #$7F ; $03FA: 29 7F cmp #$04 ; $03FC: C9 04 - bcc Sub_C40C ; $03FE: 90 0C + bcc SpawnRandomObject ; $03FE: 90 0C cmp #$18 ; $0400: C9 18 - bcs Sub_C40C ; $0402: B0 08 + bcs SpawnRandomObject ; $0402: B0 08 asl a ; $0404: 0A asl a ; $0405: 0A asl a ; $0406: 0A sta SpawnPixelPosition ; $0407: 85 15 jsr AllocateEffectObject ; $0409: 20 6B C4 ;=============================================================================== -; Sub_C40C +; SpawnRandomObject ; ; Global: -; Reachable game-engine routine identified during recursive Pass-1 tracing. +; Spawns a gameplay object at a randomized screen position. ; ; Local: -; Performs the control flow beginning at CPU $C40C; detailed semantics are -; refined as its RAM and table dependencies are traced. +; Picks a random Y position in the valid band, snaps it to a 32-pixel grid, +; derives a spawn parameter from random state and the spawn selector table, +; allocates a gameplay-object slot, then retries (optionally reflecting Y +; velocity) until the object is placed or the slot pool is exhausted. ; ; Parameters: -; Caller-defined register and global RAM state. +; RandomState ($1B), SpawnSelector ($BA), SpawnSelectorAdjustmentTable. ; ; Returns: -; Routine-specific result; register preservation remains provisional. +; A gameplay object allocated and initialized; X = slot ($00-$13) or $FF if +; the pool is full. ; ; PRG offset: $040C ; CPU address: $C40C ;=============================================================================== -Sub_C40C: +SpawnRandomObject: jsr GetRandomValue ; $040C: 20 B3 F1 and #$3F ; $040F: 29 3F cmp #$02 ; $0411: C9 02 @@ -1025,9 +1029,9 @@ Sub_C40C: jsr $C486 ; $042A: 20 86 C4 jsr GetRandomValue ; $042D: 20 B3 F1 lsr a ; $0430: 4A - bcc Sub_C40C ; $0431: 90 D9 + bcc SpawnRandomObject ; $0431: 90 D9 jsr ReflectObjectYVelocity ; $0433: 20 4F CA - jmp Sub_C40C ; $0436: 4C 0C C4 + jmp SpawnRandomObject ; $0436: 4C 0C C4 Label_C439: rts ; $0439: 60 SpawnSelectorAdjustmentTable: @@ -1112,7 +1116,7 @@ SpawnPatternNoneAlt: ;=============================================================================== InitializeSpecialObject: - jsr Sub_C40C ; $045F: 20 0C C4 + jsr SpawnRandomObject ; $045F: 20 0C C4 jsr GetRandomValue ; $0462: 20 B3 F1 and #$7F ; $0465: 29 7F sta $0508,x ; $0467: 9D 08 05 @@ -1210,17 +1214,19 @@ AllocateGameplayObject: sta GameplayObjectPosY,x ; $04A9: 9D A4 04 rts ; $04AC: 60 -; Preserve the remaining undecoded PRG bytes. -;=============================================================================== -; SpawnCommandStreamData_C4AD +; Round spawn command stream ; -; Structured spawn/object command data preceding the sorted-record helpers. -; The exact record boundaries and gameplay meanings remain provisional. +; Command data consumed by SpawnFromCommandStream ($C3C9) to initialize +; round objects. Each command byte: top 3 bits give the spawn Y position, +; bits 7-6 select object type (%10 = effect object via AllocateEffectObject, +; %00 = gameplay object via AllocateGameplayObject), and any other value +; terminates the stream. ; ; PRG offsets: $04AD-$0526 ; CPU range: $C4AD-$C526 ;=============================================================================== -SpawnCommandStreamData_C4AD: + +RoundSpawnCommandStream: .byte $00, $00, $09, $00, $08, $8C, $00, $07; $04AD: 00 00 09 00 08 8C 00 07 .byte $18, $00, $18, $00, $19, $00, $1A, $00; $04B5: 18 00 18 00 19 00 1A 00 .byte $84, $94, $1A, $00, $1A, $00, $1A, $00; $04BD: 84 94 1A 00 1A 00 1A 00 @@ -1384,8 +1390,6 @@ Label_C5AE: bpl Label_C5AE ; $05B4: 10 F8 rts ; $05B6: 60 -; Preserve the remaining undecoded PRG bytes. -;=============================================================================== ; Carrier display-selection tables ;=============================================================================== NormalDisplayModeTable: @@ -1604,8 +1608,6 @@ Label_C6B3: Label_C6B7: rts ; $06B7: 60 -; Preserve the remaining undecoded PRG bytes. -;=============================================================================== ; Carrier animation remap table ; Maps player animation states to the carrier-sequence animation states. ;=============================================================================== @@ -1759,8 +1761,6 @@ Label_C72E: lda #$03 ; $0743: A9 03 jmp ConfigureRoundPresentation ; $0745: 4C 56 C8 -; Preserve the remaining undecoded PRG bytes. -;=============================================================================== ; Round spawn lookup tables ;=============================================================================== RoundObjectCountTable: @@ -2010,8 +2010,6 @@ AppendRoundHudValue: Label_C88A: rts ; $088A: 60 -; Preserve the remaining undecoded PRG bytes. -;=============================================================================== ; Round spawner and sprite lookup tables ;=============================================================================== RoundHudTileTable: @@ -2215,8 +2213,6 @@ IntegrateGameplayObjectPosition: sta GameplayObjectPosY,x ; $09D9: 9D A4 04 rts ; $09DC: 60 -; Preserve the remaining undecoded PRG bytes. -;=============================================================================== ; Round-object sprite tables ;=============================================================================== RoundObjectTileTable: @@ -2426,8 +2422,7 @@ Label_CB0C: Label_CB18: jmp Label_CAE1 ; $0B18: 4C E1 CA -; Preserve the remaining undecoded PRG bytes. -; $0B1B is the RTS terminating TestGameplayObjectAgainstBounds. +; $0B1B: RTS terminating TestGameplayObjectAgainstBounds. rts ; $0B1B: 60 ;=============================================================================== @@ -2867,8 +2862,6 @@ AdvanceHudCommandAddress: Label_CD25: rts ; $0D25: 60 -; Preserve the remaining undecoded PRG bytes. -;=============================================================================== ; Bonus-object HUD tile triplets ; ; Each four-byte table is indexed by BonusObjectPhase ($00-$03). The three @@ -2900,7 +2893,6 @@ BonusHudRow2Tile1Table: BonusHudRow2Tile2Table: .byte $A7, $24, $24, $24 ; $0D46: A7 24 24 24 -; Preserve the remaining undecoded PRG bytes. ;=============================================================================== ; InitializeParticleSlots ; @@ -3152,8 +3144,6 @@ Label_CE99: sta $0259,y ; $0EAA: 99 59 02 rts ; $0EAD: 60 -; Preserve the remaining undecoded PRG bytes. -;=============================================================================== ; Particle rendering tables ;=============================================================================== ParticleInitialVelocityTable: @@ -3502,7 +3492,6 @@ Label_D104: sta PlayerParticleHitCount2 ; $1109: 8D CE 05 rts ; $110C: 60 -; Preserve the remaining undecoded PRG bytes. ; Sequence parameter tables ParticleSequenceIndexTable: .byte $03, $05, $07, $07, $07 ; $110D: 03 05 07 07 07 @@ -4172,7 +4161,6 @@ GetNametableAddressForIndex: sta $51 ; $1659: 85 51 rts ; $165B: 60 -; Preserve the remaining undecoded PRG bytes. NametableAddressPairTable: .byte $63, $21, $A5, $21, $CB, $20, $B7, $20 ; $165C: 63 21 A5 21 CB 20 B7 20 .byte $7D, $21, $9B, $22, $F2, $20, $49, $22 ; $1664: 7D 21 9B 22 F2 20 49 22 diff --git a/Balloon Fight (JU)/copilot/reconstructed_prg.bin b/Balloon Fight (JU)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..07026b9d6e913231bdaceb9763aadf1827257ae9 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/Balloon Fight (JU)/copilot/rom.nes b/Balloon Fight (JU)/copilot/rom.nes new file mode 120000 index 0000000..5aa2b74 --- /dev/null +++ b/Balloon Fight (JU)/copilot/rom.nes @@ -0,0 +1 @@ +../balloon.nes \ No newline at end of file diff --git a/Balloon Fight (JU)/copilot/symbols.inc b/Balloon Fight (JU)/copilot/symbols.inc new file mode 100644 index 0000000..245e111 --- /dev/null +++ b/Balloon Fight (JU)/copilot/symbols.inc @@ -0,0 +1,52 @@ +; PPU registers +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 +OAMDMA = $4014 +JOY1 = $4016 +JOY2 = $4017 + +APUPC1BASE = $4000 +APUPC1SWEEP = $4001 +APUPC1TLOW = $4002 +APUPC1THIGH = $4003 + +APUPC2BASE = $4004 +APUPC2SWEEP = $4005 +APUPC2LOW = $4006 +APUPC2HIGH = $4007 + +APUTRIBASE = $4008 +APUTRILOW = $400A +APUTRIHIGH = $400B + +APUNOISEBASE = $400C +APUNOISELOOP = $400E +APUNOISELENGTH = $400F + +APUDMABASE = $4010 +APUDMALOAD = $4011 +APUDMAADDR = $4012 +APUDMALEN = $4013 + +APUCTRL = $4015 +APUSTATUS = $4015 +APUFRAMECNT = $4017 + +; Controller Masks +PAD_RIGHT=$01 +PAD_LEFT=$02 +PAD_DOWN=$04 +PAD_UP=$08 +PAD_START=$10 +PAD_SELECT=$20 +PAD_B=$40 +PAD_A=$80 +PAD_HORIZONTAL=PAD_LEFT|PAD_RIGHT +PAD_VERTICAL=PAD_UP|PAD_DOWN +PAD_DPAD=PAD_HORIZONTAL|PAD_VERTICAL diff --git a/Baseball (UE)/OVERVIEW.md b/Baseball (UE)/OVERVIEW.md new file mode 100644 index 0000000..a3e6761 --- /dev/null +++ b/Baseball (UE)/OVERVIEW.md @@ -0,0 +1,433 @@ +# Baseball (UE) — Game Flow from Power-On + +This document describes the execution flow of the disassembled Baseball (UE) PRG bank (16 KB, mapped at CPU **$C000–$FFFF**), starting from power-on. It is based entirely on `copilot/prg.s` in the repository. The rebuild is verified **byte-identical** to the original `prg.bin`. + +--- + +## 1. ROM and Memory Layout + +| Property | Value | +|----------|-------| +| Format | iNES / NES 2.0 | +| PRG | 1 × 16 KB (mapped at CPU $C000–$FFFF) | +| CHR | 1 × 8 KB | +| Mirroring | Horizontal | +| PRG bank start | CPU $C000 (`.org $C000`) | +| Linker output | `reconstructed_prg.bin`, byte-identical to `prg.bin` | + +### Interrupt vectors (CPU $FFFA–$FFFF) + +| Vector | Address | Handler | Notes | +|--------|---------|---------|-------| +| NMI | $C046 | `NMI` | Runs once per frame; the primary frame driver | +| RESET | $C40B | `Reset` | Cold-start initialization | +| IRQ / BRK | $C43E | `IRQ` | Just `rti` (unused) | + +--- + +## 2. Reset — CPU $FFFC → $C40B + +**`Reset`** ($C40B) + +On power-on or reset: + +1. `sei` / `cld` — disable maskable interrupts, clear decimal mode. +2. **Clear CPU RAM** $0000–$07FF — one 256-byte page at a time using the indirect pointer at $00/$01, repeatedly writing $2000 to PPUCTRL during the clear. +3. `jsr InitializeSpriteSortTables` ($C7B1) — set up the sprite sort/index tables at $0377, $038C, $0399. +4. `jsr DisablePpuRendering` ($E96C) — turn off PPU output. +5. **Disable APU** — write $00 to APUSTATUS ($4015) to silence all channels, then select the five-step frame-counter mode and inhibit frame-counter IRQ via JOY2 ($4017). +6. `jsr ExpandRecordPointerList` ($C8BB) with inline data — builds record pointer structures. +7. `lda #$1A / sta PpuMaskShadow` — initial PPU mask shadow value. +8. `jmp InitializeTitleScreen` ($C74A) — RESET does not return; it transfers directly to the title screen. + +--- + +## 3. NMI / Frame Heartbeat — `NMI` ($C046) + +The NMI fires once per frame and is the central frame driver. It does **not** simply return; it performs substantial per-frame work: + +1. **Save X and Y** into `NmiSavedX` ($0D) / `NmiSavedY` ($0E). +2. **Read PPUSTATUS** ($2002) to reset the PPU address latch. +3. **OAM DMA** — write $02 to OAMDMA ($4014) to copy $0200–$02FF to sprite memory. +4. **Process the PPU command queue** at $0300 — walk variable-length packets (write packets to $2007, read packets discarded), terminating on a zero-length entry, then reset the queue head (`stx $0300`). +5. **Apply scroll** — write `ScrollX` ($DF) and `ScrollY` ($E0) to $2005. +6. **Apply PPU registers** — write `PpuMaskShadow` ($DE) to $2001 and `PpuCtrlShadow` ($DD) to $2000. +7. `jsr InitializeAudioEngine` ($F9D0) — initialize/advance the audio engine. +8. **Latch controllers** — strobe JOY1 ($4016) with $01 then $00. +9. **Read both controllers** — sample JOY1/JOY2 eight times each, shifting button states into `ControllerPressed1` ($15) / `ControllerPressed2` ($16). +10. **Update controller state** — compute newly-pressed edges (`Pressed = (Pressed & ~Held) | raw`) and update `ControllerHeld1/2` ($11/$12). +11. **START-button branch**: + - If START pressed and `SessionActive` ($1E) is set → `jsr ProcessQueuedObjectEvent` with command $0B. + - If START pressed and session is **not** active → set `TransitionActive` ($1D) and `GameplaySuspended` ($EF), then `jmp InitializeNewSession` ($C49C). +12. `NMI_CheckState` — if `NmiStateFlag` ($1F) is nonzero, skip ahead and restore registers. +13. Otherwise `jsr QueueInlineObjectEvent` ($EB55) with inline command bytes `$05,$21,$C1`, then `jsr ProcessQueuedObjectEvent` ($EB2A) with command $0B. +14. `inc FrameCounter` ($E3). +15. `jsr CalculateControllerAssignments` ($C87E) — derive per-player control state. +16. Store derived input into `InputState1/2` ($13/$14) and `InputAux1/2` ($17/$18). +17. **Restore X, Y, A**, `rti`. + +Because the NMI does controller reading and event dispatch, the main loop largely waits on the NMI-driven queued-event system rather than polling hardware directly. + +--- + +## 4. Title Screen — InitializeTitleScreen ($C74A) + +Shared entry point used by RESET and by post-match/transition paths: + +1. `jsr InitializeQueuedEventSystem` ($EB9D) — clear the $0600–$06FF event page, the queue count ($E2), active-event slots, and set `CurrentObjectIndex` ($E1) = 1. +2. `GameplaySuspended` ($EF) = 0; `TransitionActive` ($1D) = 1. +3. `PpuCtrlShadow` = $80; disable PPU rendering; fill PPU memory (`FillPpuMemoryAfterValueSaved` at $E985 with value $25). +4. `jsr ProcessInlinePpuStream` ($EA63) twice — streams title PPU data (inline records `$8D,$F8` and `$00,$C0`). +5. `jsr EnableNmiAndWaitForFrame` ($E978) — enable NMI and synchronize to a frame. +6. Enable APU channels ($4015 = $0F), set timing byte $FD = $08. +7. `RefreshTitleScreen` ($C77A) loop: + - Update `ModeFlags` ($40). + - `jsr QueueModeIndicatorTiles` ($E5CF). + - Wait for controller input release (SELECT/$20) and for the frame counter / delay byte $1B to elapse. +8. On exit: `TransitionActive` = 0, `GameplaySuspended` = 1, clear audio ($4015), re-init the event system, queue an inline command `$03,$88,$C4`, then `jmp InitializeSessionDisplay` ($C4AA). + +### Attract mode — RunAttractMessageLoop ($C43F) + +Before reaching the title input loop, `Reset` can flow into `RunAttractMessageLoop`, which: +- Clears `NmiStateFlag`, selects object event bank 1. +- Draws encoded six-character messages via `CopyInlineDisplayRecord` ($EA17) with inline text bytes. +- Exchanges the object event bank ($EB4E), increments `NmiStateFlag`, and loops back to itself — this is the idle attract display until the player presses START. + +--- + +## 5. Session and Match Initialization + +### InitializeSessionDisplay ($C4AA) +PPU shadow setup, disable rendering, fill PPU memory with $26, then process an inline PPU stream (`$F2,$F4`). + +### InitializeMatchState ($C4B9) +- Clears base position and acceleration fields ($C94F/$C943). +- Sets `$053B` and `PositionSignState` ($B7) to $80. +- `jsr EnableNmiAndWaitForFrame`. +- **Player/team selection**: + - `Random0To5` ($C850) → `PlayerOneSelection` ($34). + - Repeatedly `Random0To5` until a value different from player one → `PlayerTwoSelection` ($35). +- If `GameplaySuspended` is set, skip side selection; otherwise derive `ActivePlayerSide` ($4B) from mode flags or a random bit. +- Queue inline object events `$03,$19,$C8` and `$02,$19,$C8`, set `PlayerSelectionActive` ($44) = 1. +- `WaitForPlayerSelection` ($C4FF) spins until `$43` (`SelectionState`) becomes negative, then queues `$03,$3E,$C4` and falls into `CompleteMatchSetup` ($C50C). + +### CompleteMatchSetup ($C50C) +- `FillSelectionBackgroundBlocks` ($C85A), `QueuePlayerSelectionDisplay` ($C7DD), `InitializeRandomBitfields` ($C899), `QueuePlayerValueDisplay` ($CF8B). +- Queue inline command `$09,$37,$CE`, then enter `InitializeRoundState` ($C51E). + +--- + +## 6. Round / Gameplay State Machine + +### InitializeRoundState ($C51E) +Round-setup entry point: +- If gameplay is not suspended and `RoundStateIndex` ($33) < $12, select round music cue; otherwise reset round counters. +- `EnableRoundAudio` ($C52A): enable APU channels ($4015 = $0F), set $FD = $08. +- `ResetRoundCounters` ($C536): clear scores ($67/$68) and `RoundStateIndex`. +- `jsr InitializeObjectsFromTable` ($D06B) — initialize objects from the table at $D0A0–$D131. +- Set `$053B` / `PositionSignState` = $80. +- Store a $3C-tick delay, draw an 8-character message, store another $3C delay. +- `SelectRoundMusicCue` ($C566): choose a music delay value ($20 or $40) based on `RoundStateIndex` parity → store in $FD. +- `PrepareRoundObjects` ($C573): queue player-selection display, queue random-state record, clear `MatchCompleteFlag` ($45) and `SecondarySequenceState` ($64). + +### ResetGameplayState ($C57F) +- Clear `InningOrSharedScore` ($66), `BaseMotionActive` ($5C). +- Mark four state entries ($0598–$059B) inactive ($FF). +- `jsr QueueRoundNumberDisplay` ($CF67), re-init objects, set sign state to $80. +- Store a $B4-tick delay. + +### Round setup continuation points +- `ResumeRoundSetupAtRandomDirection` ($C5A4): queue random-direction record, clear primary/transition sequence state, set `StateSequenceActive` ($46) = 1, clear state field pairs ($03,$23 via $CF51). +- `ResumeRoundSetupAtSelectionDisplay` ($C5BA): clear the 8-character field, clear $0597–$05A6, clear the 38-byte motion field range $056F–$0594. +- Based on `RoundStateIndex` and score comparison ($67 vs $68), either jump to `CompleteMatchState` ($C6F7) or finish the reset. + +### FinishGameplayReset ($C5F1) +- `InitializeDefaultObjects` ($D030), clear sign state, select event bank 1 → enter `RunRoundStateLoop` ($C5FE). + +### RunRoundStateLoop ($C5FE) — main per-round loop +This is the core gameplay loop: +- If `PendingStateTransition` ($60) is set → `InitializeObjectStateLookup` ($C8A3). +- If either `PendingStateTransition` or `StateSequenceActive` ($46) is nonzero → dispatch state-specific handlers via queued inline commands (`$0D,$77,$D4`, `$0F,$81,$D3`). +- `RunPrimaryRoundHandlers` ($C619): + - `InitializeSecondaryActors` ($D633), `InitializeConditionalObject` ($D126). + - Clear working state: `PendingScoreIncrement`, `BaseMotionPhase`, `BaseMotionEventCount`, `TrajectoryResult`, `PendingStateTransition`, `SpecialSequenceState`, `ObjectTransitionState`, `BaseMotionActive`, `ActionSequenceCounter`, `TrajectoryEvaluationEnabled`, and several others. + - Clear base acceleration and position fields. + - Queue three inline object events (`$25,$5A,$D8`, `$0E,$66,$D1`, `$1F,$76,$CA`). + - `jsr UpdateObjectEventBank_Exchange` with command $08. + - Walk the 22-entry `RoundEventSlotTable` ($C6E1) in reverse, dispatching each via `DispatchNextQueuedEvent` ($EB66). + - Write one inline character ($3F, value $28) to the PPU. +- `ApplyPendingScoreUpdate` ($C67E): if a score increment is pending and no state transition, `jsr UpdateCountersAndDisplay` ($CFA6), clear the increment. +- `StartPostRoundDelay` ($C68D): wait for `PendingEvent` ($6F) to clear, then count down delay counter $48. +- If match is not complete and no sequence is active → `jmp ResumeRoundSetupAtSelectionDisplay` ($C5BA) to start the next round. +- `ProcessPostRoundEvents` ($C6A5): dispatch event slots $0D and $0F, store a $0A-tick delay, decrement a counter based on `RoundStateIndex` parity. +- `CheckPostRoundContinuation` ($C6C5): if match complete → `AdvanceRoundNumber` ($C6CC); otherwise `jmp ResumeRoundSetupAtRandomDirection` ($C5A4). +- `AdvanceRoundNumber` ($C6CC): update counters/display, increment `RoundStateIndex`; if index reaches $12 → `InitializeResultsPosition` ($C708); otherwise `SelectRoundMusicCue` ($C566) to begin the next round. + +--- + +## 7. Per-Frame Object and Motion Updates + +### UpdateFrameObjectsAndTimers ($C122) +Called each frame to drive object motion: +- Reset PPU queue offset, OAM write offset, and `FrameState20` ($20). +- Queue/process inline object events ($07,$64,$C2 via bank, then command $01). +- Decrement per-object timers at $063F,X (30 slots); when a timer reaches zero, queue a decoded object event. +- Decrement four short countdowns at $05AD,X. +- If a transition is active, jump to `CommonEngineExit` ($EB6A); otherwise `IntegrateAllObjectPositions` ($C15B). + +### IntegrateAllObjectPositions ($C15B) +- For 36 object slots (X stepping by 2, each logical object uses two indices): + - Sign-extend and add horizontal delta ($050B/$050C,X from $056F/$0570,X). + - Sign-extend and add vertical delta ($053C/$053D,X from $0570/$0571,X). + +### UpdateBaseMotionSequence ($C18D) +- Integrate velocity/position for three base object indices ($00, $31, $62). +- Reflect base motion values when $056C is negative (negate $056B/$056C and halve $0569/$056A). +- Apply doubled horizontal/vertical velocity adjustments to $0507/$0508 and $0538/$0539. +- `jsr EvaluateTrajectoryResult` ($CAD2). +- Advance `BaseMotionPhase` ($5D); when motion settles, clear base acceleration/position fields. +- `UpdatePositionSignState` ($C228): compute a signed position delta relative to a $0A threshold, track sign changes in `PositionSignState` ($B7), and update rendering flags. + +### IntegrateObjectVelocityAndPosition ($C3CA) +Signed fixed-point position integration used by the three base motion call sites: shifts the signed 16-bit velocity right twice (sign-preserving), adds to position ($0507/$0508), then adds the result to the secondary position ($0509/$050A). + +--- + +## 8. Rendering and OAM + +### BuildFrameOam ($C2DE) +- If `TransitionActive` is set: copy an 88-byte sprite/OAM template from $F94D into shadow OAM at $0200, set `OamWriteOffset` ($3F), and jump to `TerminatePpuUpdateQueue`. +- Otherwise, if `PlayerSelectionActive` ($44) is set: copy an 8-byte OAM template from $C331, position two sprites from player selection coordinates (scaled ×16 + $50), choose tiles based on `ModeFlags`. +- Otherwise: `SortObjectsByY` ($C339) — sort object indices by signed 16-bit Y coordinates ($0538/$0539) using the index table at $0377/$0378, then render each sorted object via `RenderSpriteRecordList` ($E77B). + +### FinalizeOamAndPpuQueue ($C386) +- If `ObjectListFlag` ($C7) is set, skip status OAM; otherwise copy 20 bytes from $EBC2 into shadow OAM and select two extra bytes from $EBBC based on player selections. +- `TerminatePpuUpdateQueue` ($C3AA): write $00 to terminate the PPU command queue at $0300,Y. +- Hide unused sprites by writing $F0 to each remaining OAM Y coordinate (stepping by 4). +- `jsr AdvanceRandomState` ($E5F4), then `jmp CommonEngineExit` ($EB6A). + +--- + +## 9. Batting and Pitching + +### Pitching (RunPitcherWindupSequence, $C6044) +- `RunPitcherWindupSequence` animates the pitcher windup (frames selected via `SetWindupFrame`). +- `SelectPitchAction` ($C6139): reads controller input to choose the pitch action. +- `SelectPitchType` ($C6178): searches `PitchTypeThresholdTable` / `PitchDirectionThresholdTable` ($C5973/$C5980) to determine pitch type and direction. +- `AnimatePitchStart` ($C6229), `UpdatePitchMovement` ($C6321): apply pitch trajectory and controller-based horizontal/vertical input. +- Pitch tables: `PitchVelocityBiasTable` ($C6399), `PitchDelayTable` ($C6402), `PitchRenderFlagTable` ($C6405). + +### Batting (SelectBatterAction, $C6414) +- `WaitForBatterAction` ($C6422): wait for batter input. +- `UseBatterControllerInput` ($C6464): map controller to batter action slot. +- `SelectActionFromObjectState` ($C6590) with `ObjectActionLookupTable` ($C6502). +- `DispatchActionType` ($C6614): route to the appropriate action handler. + +### Object motion and collision +- `MoveControlledObject` ($D371): apply controlled horizontal/vertical offsets (`ControlledHorizontalOffsetTable` / `ControlledVerticalOffsetTable` at $D384/$D38C). +- `TestObjectCollision` ($D38B): object-vs-object collision testing. +- `TestCurrentObjectInput` ($D7D7): resolve controller input for the current object. +- Geometry helpers: `CalculateCurrentObjectGeometry` ($D7AE), `CalculateGeometryDifference` ($D566), `BuildGeometryVector` ($D74D), extensive trigonometry/vector math routines ($D5xx–$D8xx). + +--- + +## 10. Audio Engine + +### InitializeAudioEngine ($F9D0) +Initialize the APU: write DMC settings, configure pulse/triangle/noise channel presets, write pulse periods from tables ($FA00–), set up audio lookup data. + +### UpdateAudioEngine ($FB05) +Per-frame audio update: +- Clear/finalize primary audio effects. +- Update pulse 1 and pulse 2 effects (preset effects, descending effects, state-change effects, phase effects). +- Update triangle pitch sweeps. +- Dispatch music and noise (`DispatchMusicAndNoise` at $FB65): update music sequencer, noise envelope, timed triangle effects, DMC output. + +### Music +- `StartMusicSequence` ($FD34): initialize a music sequence by finding its bank and copying the descriptor. +- Channels: pulse 1 ($FD96), pulse 2 ($FDCF), triangle ($FE0B). +- Music sequence data tables at $FE60–$FFD0 (`MusicSequenceData_FE60` … `MusicSequenceData_FFD0`). +- Sound effect presets and noise/triangle envelopes throughout the $F9xx–$FE2x region. + +Audio is advanced from the NMI via `jsr InitializeAudioEngine` ($F9D0) each frame; the broader `UpdateAudioEngine` ($FB05) is called from the event system. + +--- + +## 11. Object Event System (the main-loop engine) + +The game is driven by a **queued event system** rather than a simple polling loop: + +- `InitializeQueuedEventSystem` ($EB9D): clear $0600–$06FF, queue count $E2, active slots, set current object index. +- `QueueInlineObjectEvent` ($EB55) / `QueueDecodedObjectEvent` ($EB2A): push an event onto the queue. +- `ProcessQueuedObjectEvent` ($EB2A): walk the queue and process active events. +- `DispatchNextQueuedEvent` ($EB66): pop the newest event, save its continuation address on the hardware stack (SP = $FF), and `rts` into it — this is how control transfers between event handlers. +- `CommonEngineExit` ($EB6A): mark the current object inactive; if the queue is empty, wait (`beq DispatchNextQueuedEvent_Wait`) polling $E2; otherwise disable NMI bit 7 and dispatch the next entry. + +The main gameplay loop (`RunRoundStateLoop`) and most state handlers ultimately pass through `CommonEngineExit`, which blocks until the NMI or another producer queues the next event. This makes the NMI the real-time heartbeat and the main loop an event consumer. + +--- + +## 12. PPU Streaming Helpers ($E9xx–$EBxx) + +A family of routines drives PPU updates from inline byte streams embedded in the code: +- `DisablePpuRendering` ($E96C), `EnableNmiAndWaitForFrame` ($E978). +- `FillPpuMemoryWith26` / `FillPpuMemoryAfterValueSaved` ($E983/$E985): fill PPU memory with a byte value. +- `DecodeInlineParameters` ($EA09), `ReadInlineWord` ($EA28), `CopyInlineBytesToZeroPage` ($EA45). +- `WritePpuControlFromCarry` ($EA6E), `SetPpuAddressFromInlineRecord` ($EA97), `WritePendingPpuByte` ($EABF), `WriteInlinePpuBlock` ($EAC9), `PPUWriteString` ($EAFB). +- `CopyInlineDisplayRecord` ($EA17): draw an encoded text record (count byte followed by character data) — used heavily for titles, scores, round numbers, and announcements. +- `ProcessInlinePpuStream` ($EA63): process a stream of PPU commands. + +Many routines are followed by `.byte` inline data that must **not** be disassembled as instructions; the disassembly marks these explicitly. + +--- + +## 13. Match Completion and Results + +### CompleteMatchState ($C6F7) +- Increment `RoundStateIndex`. +- If `InningOrSharedScore` ($66) is nonzero → `InitializeResultsPosition`; otherwise draw a single encoded character ($32). +- `InitializeResultsPosition` ($C708): set sign state to $80, draw a 10-character message (`$25,$10,$0A,$16,$0E,$25,$1C,$0E,$1D,$25`), set timing $FD = $4, dispatch event slot 2, queue inline `$02,$88,$C4`. +- `ResultsDelayLoop` ($C737): repeat a $3C-tick delay 10 times. +- Disable APU ($4015 = $00), clear `SessionActive` ($1E), then fall into `InitializeTitleScreen` ($C74A) to return to the title. + +--- + +## 14. Summary of Execution Flow + +``` +Power On / Reset + │ + ▼ +Reset ($C40B) ───► clear RAM $0000-$07FF, init sprite sort, disable PPU/APU + │ + ▼ +jmp InitializeTitleScreen ($C74A) + │ + ├─ init event system, draw title screen + ├─ EnableNmiAndWaitForFrame (NMI now runs each frame) + ├─ WaitForTitleInputRelease (wait for START + input release) + ▼ +jmp InitializeSessionDisplay ($C4AA) + │ + ▼ +jmp InitializeMatchState ($C4B9) + │ + ├─ Random0To5 → PlayerOneSelection ($34) + ├─ Random0To5 (≠ P1) → PlayerTwoSelection ($35) + ├─ derive ActivePlayerSide ($4B) + └─ WaitForPlayerSelection (spin until $43 < 0) + │ + ▼ +CompleteMatchSetup ($C50C) + │ + ▼ +InitializeRoundState ($C51E) + │ + ├─ enable audio, reset counters, init objects from table ($D06B) + ├─ draw messages, select music cue + ▼ +ResetGameplayState ($C57F) → FinishGameplayReset ($C5F1) + │ + ▼ +RunRoundStateLoop ($C5FE) ◄───────────────────┐ + │ │ + ├─ InitializeObjectStateLookup │ + ├─ RunPrimaryRoundHandlers │ + │ ├─ InitializeSecondaryActors │ + │ ├─ InitializeConditionalObject │ + │ ├─ walk RoundEventSlotTable │ + │ └─ dispatch queued events │ + ├─ ApplyPendingScoreUpdate │ + ├─ StartPostRoundDelay (wait $48 ticks) │ + ├─ ProcessPostRoundEvents │ + ├─ CheckPostRoundContinuation │ + │ ├─ match complete → results → title │ + │ └─ AdvanceRoundNumber → next round │ + └─ eventually → CommonEngineExit ($EB6A) │ + wait for queued event ($E2) │ + dispatch next event (rts into it)│ + └────────────────────────────────┘ + +NMI ($C046) [every frame] + ├─ PPU command queue flush ($0300) + ├─ OAM DMA ($4014) + ├─ scroll ($2005), PPU mask/ctrl ($2001/$2000) + ├─ InitializeAudioEngine ($F9D0) + ├─ controller latch + read (JOY1/JOY2) + ├─ controller state (pressed/held edges) + ├─ START branch → new session or command $0B + ├─ QueueInlineObjectEvent + ProcessQueuedObjectEvent + ├─ FrameCounter++, CalculateControllerAssignments + └─ restore registers, rti +``` + +--- + +## 15. Key Zero-Page / RAM Symbols + +| Address | Symbol | Use | +|---------|--------|-----| +| $00–$01 | IndirectPtrLo/Hi | RAM-clear indirect pointer | +| $0D–$0E | NmiSavedX/Y | NMI register save | +| $0F | DerivedControl0 | Derived control input | +| $11–$12 | ControllerHeld1/2 | Currently held buttons | +| $13–$14 | InputState1/2 | Current input state | +| $15–$16 | ControllerPressed1/2 | Newly pressed buttons | +| $17–$18 | InputAux1/2 | Auxiliary input | +| $19–$1A | RandomStateLo/Hi | PRNG state | +| $1B | TransitionCounter | Transition delay | +| $1D | TransitionActive | Transition in progress | +| $1E | SessionActive | Session/game active flag | +| $1F | NmiStateFlag | NMI state flag | +| $20 | FrameState20 | Frame state | +| $21 | SelectedPitchAction | Current pitch action | +| $33 | RoundStateIndex | Current round/inning index | +| $34–$35 | PlayerOne/TwoSelection | Selected teams | +| $36–$39 | ObjectScreenX/Y (+Hi) | Object screen coordinates | +| $3E–$3F | PpuQueueOffset / OamWriteOffset | PPU/OAM write positions | +| $40 | ModeFlags | Display/mode flags | +| $42 | CurrentObjectArrayOffset | Current object slot | +| $43 | SelectionState | Selection state | +| $44 | PlayerSelectionActive | Player selection active | +| $45 | MatchCompleteFlag | Match finished | +| $46 | StateSequenceActive | State sequence running | +| $48 | DelayCounter | General delay | +| $4B | ActivePlayerSide | Active player (0/1) | +| $4D–$50 | RandomState0/1, RandomBits0/1 | Randomization state | +| $53–$56 | SavedBaseX/Y (Lo/Hi) | Saved base coordinates | +| $5C | BaseMotionActive | Base motion active | +| $5D | BaseMotionPhase | Base motion phase | +| $5E | BaseMotionEventCount | Base motion event count | +| $5F | TrajectoryResult | Trajectory result | +| $60 | PendingStateTransition | Pending state change | +| $66 | InningOrSharedScore | Inning / shared score | +| $67–$68 | PlayerOne/TwoScore | Scores | +| $69–$6A | EventWrite/ReadIndex | Event queue indices | +| $6F | PendingEvent | Pending event | +| $7E | ActionSequenceCounter | Action sequence counter | +| $83 | ObjectApproachCount | Approach counter | +| $86 | TrajectoryEvaluationEnabled | Trajectory eval enabled | +| $8E–$90 | RandomHorizontal/VerticalMotion | Random motion | +| $9D | CurrentActionState | Current action | +| $9F–$A1 | SecondaryActorState0–2 | Secondary actor states | +| $A2 | ObjectSequenceState | Object sequence state | +| $B7 | PositionSignState | Position sign tracking | +| $C7 | ObjectListFlag | Object list flag | +| $C9–$CA | SpriteSortBaseIndex / SpriteArrayEnd | Sort table bounds | +| $DD–$E0 | PpuCtrl/MaskShadow, ScrollX/Y | PPU/shadow/scroll state | +| $E1 | CurrentObjectIndex | Current object being processed | +| $E2 | ScriptDepth / queue count | Queued event count | +| $E3 | FrameCounter | Frame tick counter | +| $EF | GameplaySuspended | Gameplay suspended | +| $F6–$F7 | SoundPtrLo/Hi | Sound pointer | +| $FE | PendingAudioFlags | Pending audio flags | +| $FF | RenderStateFlags | Render state flags | + +--- + +## 16. Notes on the Disassembly + +- The source is **21,624 lines** and thoroughly annotated with symbolic names for nearly every routine, table, and data block — there are no generic `Label_Cxxxx` placeholders. +- Numerous routines are followed by inline `.byte` data blocks consumed by `QueueInlineObjectEvent`, `CopyInlineDisplayRecord`, or `ProcessInlinePpuStream`; these are intentionally left as raw bytes and marked in comments. +- The PRG is a single 16 KB bank at $C000–$FFFF; calls to $Dxxx/$Exxx/$Fxxx targets are all within the same bank (no bank switching). +- Build verification: `make` in `copilot/` produces `reconstructed_prg.bin` that is **byte-identical** to `prg.bin` and to the PRG bank of `baseball.nes`. \ No newline at end of file diff --git a/Baseball (UE)/copilot/Makefile b/Baseball (UE)/copilot/Makefile index 3f9ba6f..7b0587a 100644 --- a/Baseball (UE)/copilot/Makefile +++ b/Baseball (UE)/copilot/Makefile @@ -1,10 +1,25 @@ -all: reconstructed_prg.bin verify -prg.o: prg.s symbols.inc prg.bin - ca65 -g -o $@ prg.s -reconstructed_prg.bin: prg.o linker.cfg - ld65 -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ prg.o -verify: reconstructed_prg.bin prg.bin - cmp reconstructed_prg.bin prg.bin - @echo BYTE-IDENTICAL +CA65 ?= ca65 +LD65 ?= ld65 + +all: reconstructed.nes verify + +prg.o: prg.s symbols.inc locals.inc + $(CA65) -g -o $@ $< + +header.o: header.s + $(CA65) -g -o $@ $< + +chr.o: chr.s + $(CA65) -g -o $@ $< + +reconstructed.nes: header.o prg.o chr.o linker.cfg + $(LD65) -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ header.o prg.o chr.o + +verify: reconstructed.nes + cmp reconstructed.nes rom.nes + @echo "Byte-identical ROM verified." + clean: - rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl + rm -f *.o reconstructed.nes reconstructed.map reconstructed.lbl + +.PHONY: all verify clean \ No newline at end of file diff --git a/Baseball (UE)/copilot/chr.bin b/Baseball (UE)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..463db49a60c30fdf1ec6c55a6e1f1648d7f27856 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/Baseball (UE)/copilot/chr.o b/Baseball (UE)/copilot/chr.o new file mode 100644 index 0000000000000000000000000000000000000000..49313150da01babaf64b73566e91d4c11972cdc4 GIT binary patch literal 12596 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 QbW`lw8$YW=5*SALKST7Ay8r+H literal 0 HcmV?d00001 diff --git a/Baseball (UE)/copilot/chr.s b/Baseball (UE)/copilot/chr.s new file mode 100644 index 0000000..f6a8c21 --- /dev/null +++ b/Baseball (UE)/copilot/chr.s @@ -0,0 +1,2 @@ +.segment "CHR" + .incbin "chr.bin" \ No newline at end of file diff --git a/Baseball (UE)/copilot/header.bin b/Baseball (UE)/copilot/header.bin new file mode 100644 index 0000000000000000000000000000000000000000..aee36c438eb06284501f97c9f7247d5d3193af17 GIT binary patch literal 16 PcmeZs4VGeLWPk$z4(cKuo6tm}MsHTTfdHY<3I{K`XcOz92T3^aPCfz!TU421ONjhyr|rI`{z^4A5ly_Q32J zBB>z?A#Q&^H-!}3n0~#VSr@q7x`YLr1sMe@g_V_Z{uS0SmwnB$*2csUxhw=ZW0kaE znx`>vIOZE=1%}JmXPfMpoVQfJrXT*Y^`fsXy?NI^zxFy_m@YD%d&q7&-DcIZ$nu)M p%+{%WAB9TBQ5ZY~)?Jd=MmUcujwV4*+2h%0B>O4|RZJ|&r9UHyEL8vi literal 0 HcmV?d00001 diff --git a/Baseball (UE)/copilot/header.s b/Baseball (UE)/copilot/header.s new file mode 100644 index 0000000..37d1389 --- /dev/null +++ b/Baseball (UE)/copilot/header.s @@ -0,0 +1,2 @@ +.segment "HEADER" + .incbin "header.bin" \ No newline at end of file diff --git a/Baseball (UE)/copilot/linker.cfg b/Baseball (UE)/copilot/linker.cfg index d9d421d..cfaf881 100644 --- a/Baseball (UE)/copilot/linker.cfg +++ b/Baseball (UE)/copilot/linker.cfg @@ -1,6 +1,10 @@ MEMORY { - PRG: start = $C000, size = $4000, file = %O, fill = yes; + HEADER: start = $0000, size = $0010, fill = yes; + PRG: start = $C000, size = $4000, fill = yes; + CHR: start = $0000, size = $2000, fill = yes; } SEGMENTS { - PRG: load = PRG, type = ro; -} + HEADER: load = HEADER, type = ro; + PRG: load = PRG, type = ro; + CHR: load = CHR, type = ro; +} \ No newline at end of file diff --git a/Baseball (UE)/copilot/locals.inc b/Baseball (UE)/copilot/locals.inc index 65b8c77..a620918 100644 --- a/Baseball (UE)/copilot/locals.inc +++ b/Baseball (UE)/copilot/locals.inc @@ -151,10 +151,3 @@ SoundPtrHi = $F7 PendingAudioFlags = $FE RenderStateFlags = $FF - -; Local References -Music_Update = $EB0A -Sound_Update = $EB2A -UpdateSprites = $EB48 -WaitFrame_End = $F9D0 - diff --git a/Baseball (UE)/copilot/prg.o b/Baseball (UE)/copilot/prg.o new file mode 100644 index 0000000000000000000000000000000000000000..6ecea6cebf770e5d2f430f0f4e94b54701aa7f6a GIT binary patch literal 209979 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

c3gNys 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 S|D&zl;C}EIVzGbp3;!Q6sd6g- literal 0 HcmV?d00001 diff --git a/Baseball (UE)/copilot/prg.s b/Baseball (UE)/copilot/prg.s index 1af6ac1..b54cdc5 100644 --- a/Baseball (UE)/copilot/prg.s +++ b/Baseball (UE)/copilot/prg.s @@ -5,16 +5,6 @@ .include "symbols.inc" .include "locals.inc" -; ------------------------------------------------------------ -; PRG-ROM $0000-$0045 (CPU $C000-$C045) -; Unreached on first pass. Preserve as data. -; ------------------------------------------------------------ -; ============================================================================ -; PRG-ROM mapping: -; File offset $0000 = CPU $C000 -; File offset $3FFF = CPU $FFFF -; ============================================================================ - ; ============================================================================ ; Zero-page scratch policy ; @@ -224,7 +214,7 @@ NMI_CheckState: ; $C0EC jsr QueueInlineObjectEvent ; $C0F0: 20 0A EB - ; Inline command data consumed by the routine at $EB0A. + ; Inline command data consumed by the routine at QueueInlineObjectEvent. ; These bytes must not be assembled as 6502 instructions. .byte $05,$21,$C1 ; $C0F3-$C0F5 @@ -281,7 +271,7 @@ UpdateFrameObjectsAndTimers: ; $C122 jsr QueueInlineObjectEvent ; $C12A: 20 0A EB - ; Inline command data consumed by the routine at $EB0A. + ; Inline command data consumed by the routine at QueueInlineObjectEvent. .byte $07,$64,$C2 ; $C12D-$C12F ldx #$01 ; $C130: A2 01 @@ -540,7 +530,7 @@ SaveSignedPositionDelta: ; $C23A jsr QueueInlineObjectEvent ; $C243: 20 0A EB - ; Inline command data consumed by the routine at $EB0A. + ; Inline command data consumed by the routine at QueueInlineObjectEvent. .byte $23,$52,$C2 ; $C246-$C248 CommitSignedPositionDelta: ; $C249 @@ -1359,13 +1349,13 @@ DeriveSelectedSideFromMode: ; $C4EC jsr QueueInlineObjectEvent ; $C4EF: 20 0A EB - ; Inline command data consumed by $EB0A. + ; Inline command data consumed by QueueInlineObjectEvent. .byte $03,$19,$C8 ; $C4F2-$C4F4 StartPlayerSelection: ; $C4F5 jsr QueueInlineObjectEvent ; $C4F5: 20 0A EB - ; Inline command data consumed by $EB0A. + ; Inline command data consumed by QueueInlineObjectEvent. .byte $02,$19,$C8 ; $C4F8-$C4FA lda #$01 ; $C4FB: A9 01 @@ -1386,7 +1376,7 @@ WaitForPlayerSelection: ; $C4FF jsr QueueInlineObjectEvent ; $C506: 20 0A EB - ; Inline command data consumed by $EB0A. + ; Inline command data consumed by QueueInlineObjectEvent. .byte $03,$3E,$C4 ; $C509-$C50B ; ---------------------------------------------------------------------------- @@ -1401,7 +1391,7 @@ CompleteMatchSetup: ; $C50C jsr QueueInlineObjectEvent ; $C518: 20 0A EB - ; Inline command data consumed by $EB0A. + ; Inline command data consumed by QueueInlineObjectEvent. .byte $09,$37,$CE ; $C51B-$C51D ; ============================================================================ @@ -1703,12 +1693,12 @@ CheckRoundTransitionState: ; $C605 jsr QueueInlineObjectEvent ; $C60D: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $0D,$77,$D4 ; $C610-$C612 jsr QueueInlineObjectEvent ; $C613: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $0F,$81,$D3 ; $C616-$C618 ; ---------------------------------------------------------------------------- @@ -3377,7 +3367,7 @@ UpdateTrajectoryFrame: ; $CA77 jsr QueueInlineObjectEvent ; $CA98: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $24,$A3,$CD ; $CA9B-$CA9D jmp WaitForTrajectoryLimit @@ -3386,7 +3376,7 @@ UpdateTrajectoryFrame: ; $CA77 QueueNegativeTrajectoryCommand: ; $CAA1 jsr QueueInlineObjectEvent ; $CAA1: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $26,$A3,$CD ; $CAA4-$CAA6 jmp WaitForTrajectoryLimit @@ -3395,7 +3385,7 @@ QueueNegativeTrajectoryCommand: ; $CAA1 QueueLaterTrajectoryCommand: ; $CAAA jsr QueueInlineObjectEvent ; $CAAA: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $1A,$97,$CD ; $CAAD-$CAAF ; ---------------------------------------------------------------------------- @@ -3572,7 +3562,7 @@ ApplyNegativeTrajectoryResult: ; $CB1E jsr QueueInlineObjectEvent ; $CB27: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $18,$4C,$CC ; $CB2A-$CB2C rts ; $CB2D: 60 @@ -3580,7 +3570,7 @@ ApplyNegativeTrajectoryResult: ; $CB1E QueueNegativeResultCommand: ; $CB2E jsr QueueInlineObjectEvent ; $CB2E: 20 0A EB - ; Alternate inline command record consumed by $EB0A. + ; Alternate inline command record consumed by QueueInlineObjectEvent. .byte $1C,$4C,$CC ; $CB31-$CB33 TrajectoryResultReturn: ; $CB34 @@ -3922,7 +3912,7 @@ AdvancePrimaryStateSequence: ; $CC01 jsr QueueInlineObjectEvent ; $CC13: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $06,$ED,$D9 ; $CC16-$CC18 jsr ClearPrimaryStateField ; $CC19: 20 4A CF @@ -3965,7 +3955,7 @@ QueuePrimaryStateEvent: ; $CC2A jsr QueueInlineObjectEvent ; $CC35: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $28,$3B,$CC ; $CC38-$CC3A Routine_CC3B_Return: ; $CC3B @@ -4109,7 +4099,7 @@ Routine_CCAA_OneTimeCommand: ; $CCAA jsr QueueInlineObjectEvent ; $CCB2: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $28,$B8,$CC ; $CCB5-$CCB7 Routine_CCB8_Return: ; $CCB8 @@ -4210,7 +4200,7 @@ Routine_CD09_OneTimeCommand: ; $CD09 jsr QueueInlineObjectEvent ; $CD11: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $28,$17,$CD ; $CD14-$CD16 Routine_CD17_Return: ; $CD17 @@ -4279,7 +4269,7 @@ QueueSelectedStateMarker: ; $CD2E jsr QueueInlineObjectEvent ; $CD3B: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $28,$41,$CD ; $CD3E-$CD40 Routine_CD41_Return: ; $CD41 @@ -4410,12 +4400,12 @@ RunHomeRunCelebration: ; $CDA4 sta SpecialSequenceState ; $CDAA: 85 6D ; ---------------------------------------------------------------------------- -; Dispatch an inline command through $EB0A. +; Dispatch an inline command through QueueInlineObjectEvent. ; ---------------------------------------------------------------------------- jsr QueueInlineObjectEvent ; $CDAC: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $15,$D8,$CD ; $CDAF-$CDB1 ; ---------------------------------------------------------------------------- @@ -6002,7 +5992,7 @@ InitializePrimaryGameplayActor: ; $D167 jsr QueueInlineObjectEvent ; $D16B: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $19,$F7,$D3 ; $D16E-$D170 ; ---------------------------------------------------------------------------- @@ -6136,7 +6126,7 @@ SetWindupFrame: ; $D1A2 FinishWindupSequence: ; $D1C8 jsr QueueInlineObjectEvent ; $D1C8: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $17,$AC,$D2 ; $D1CB-$D1CD inc ActionSequenceCounter ; $D1CE: E6 7E @@ -6244,7 +6234,7 @@ AnimatePitchStart: ; $D212 jsr QueueInlineObjectEvent ; $D21A: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $13,$DA,$D6 ; $D21D-$D21F ; ---------------------------------------------------------------------------- @@ -6321,7 +6311,7 @@ PitchStartAnimationLoop: ; $D225 jsr QueueInlineObjectEvent ; $D25F: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $04,$85,$D7 ; $D262-$D264 ; ---------------------------------------------------------------------------- @@ -6396,7 +6386,7 @@ CheckPitchVerticalLimit: ; $D28F jsr QueueInlineObjectEvent ; $D29B: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $21,$27,$D0 ; $D29E-$D2A0 jmp CommonEngineExit ; $D2A1: 4C 6A EB @@ -6546,7 +6536,7 @@ SaveBatterAction: ; $D2F9 jsr QueueInlineObjectEvent ; $D317: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $11,$D7,$D5 ; $D31A-$D31C lda #$1E ; $D31D: A9 1E @@ -6658,7 +6648,7 @@ Routine_D355_State1: ; $D355 jsr QueueInlineObjectEvent ; $D35A: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $10,$AB,$E3 ; $D35D-$D35F rts ; $D360: 60 @@ -6688,7 +6678,7 @@ Routine_D367_State2: ; $D367 jsr QueueInlineObjectEvent ; $D36C: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $12,$AB,$E3 ; $D36F-$D371 rts ; $D372: 60 @@ -6703,7 +6693,7 @@ Routine_D373_State3: ; $D373 jsr QueueInlineObjectEvent ; $D378: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $16,$AB,$E3 ; $D37B-$D37D dec $03B7 ; $D37E: CE B7 03 @@ -8323,12 +8313,12 @@ WaitForVerticalPosition02: ; $D7EC jsr QueueInlineObjectEvent ; $D801: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $17,$AC,$D2 ; $D804-$D806 jsr QueueInlineObjectEvent ; $D807: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $11,$D7,$D5 ; $D80A-$D80C jmp CommonEngineExit ; $D80D: 4C 6A EB @@ -8462,7 +8452,7 @@ ProcessSecondaryObjectStates: ; $D85B jsr QueueInlineObjectEvent ; $D860: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $08,$84,$D8 ; $D863-$D865 ; ---------------------------------------------------------------------------- @@ -8479,7 +8469,7 @@ CheckObjectState059A: ; $D866 jsr QueueInlineObjectEvent ; $D86E: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $0A,$84,$D8 ; $D871-$D873 ; ---------------------------------------------------------------------------- @@ -8497,7 +8487,7 @@ CheckObjectState059B: ; $D874 jsr QueueInlineObjectEvent ; $D87C: 20 0A EB - ; Inline command record consumed by $EB0A. + ; Inline command record consumed by QueueInlineObjectEvent. .byte $0C,$84,$D8 ; $D87F-$D881 ; ---------------------------------------------------------------------------- @@ -13360,9 +13350,9 @@ CandidateObjectOffsetTable: ; $E295 ; 3. Restore X. ; 4. Tail-call the command dispatcher at $EB0D. ; -; The jump to $EB0D enters three bytes after the normal $EB0A entry, which +; The jump to $EB0D enters three bytes after the normal QueueInlineObjectEvent entry, which ; suggests $E99A has already completed the inline-record setup normally -; performed by $EB0A. +; performed by QueueInlineObjectEvent. ; ============================================================================ ; ---------------------------------------------------------------------------- diff --git a/Baseball (UE)/copilot/reconstructed.lbl b/Baseball (UE)/copilot/reconstructed.lbl new file mode 100644 index 0000000..7390cbc --- /dev/null +++ b/Baseball (UE)/copilot/reconstructed.lbl @@ -0,0 +1,951 @@ +al 00FFFE .IrqBrkVectorWord +al 00FFFC .ResetVectorWord +al 00FFFA .NmiVectorWord +al 00FFFA .InterruptVectors +al 00FFE2 .UnusedRomPadding +al 00FFD0 .MusicSequenceData_FFD0 +al 00FFC0 .MusicSequenceData_FFC0 +al 00FFA0 .MusicSequenceData_FFA0 +al 00FF80 .MusicSequenceData_FF80 +al 00FF60 .MusicSequenceData_FF60 +al 00FF40 .MusicSequenceData_FF40 +al 00FF20 .MusicSequenceData_FF20 +al 00FF00 .MusicSequenceData_FF00 +al 00FEE0 .MusicSequenceData_FEE0 +al 00FEC0 .MusicSequenceData_FEC0 +al 00FEA0 .MusicSequenceData_FEA0 +al 00FE80 .MusicSequenceData_FE80 +al 00FE60 .MusicSequenceData_FE60 +al 00FE40 .MusicSequenceData +al 00FE36 .UpdateMusicChannel3_WriteLinear +al 00FE30 .UpdateMusicChannel3_CheckBank +al 00FE15 .UpdateMusicChannel3_Decrement +al 00FE3F .UpdateMusicSequence_Return +al 00FE02 .UpdateMusicChannel2_Write +al 00FDF1 .UpdateMusicChannel2_SelectControl +al 00FDDF .UpdateMusicChannel2_HaveCommand +al 00FE05 .UpdateTriangleMusicChannel +al 00FDC7 .UpdateMusicChannel2_Decrement +al 00FDAA .UpdateMusicChannel1_CheckAlt +al 00FDB0 .UpdateMusicChannel1_Write +al 00FD99 .UpdateMusicChannel1_SelectControl +al 00FD90 .UpdateMusicChannel1_HaveNote +al 00FD79 .UpdateMusicChannel1_Decrement +al 00FDB9 .UpdatePulse2MusicChannel +al 00FD51 .InitializeMusicSequence_CopyDescriptor +al 00FD49 .InitializeMusicSequence_LoadPointer +al 00FD3C .InitializeMusicSequence_BankFound +al 00FD36 .InitializeMusicSequence_FindBank +al 00FD67 .UpdatePulse1MusicChannel +al 00FD34 .StartMusicSequence +al 00FD0C .NoiseEnvelopeSequence +al 00FCFD .AudioEvent_8_SetTimer +al 00FCCF .CountDownTimedAudioEffect +al 00FCC0 .ConfigureTimedTriangleEffect +al 00FD14 .UpdateNoiseEnvelopeSequence +al 00FD2A .UpdateMusicEngine +al 00FC87 .ResetTimedAudioEvents +al 00FCF3 .StartTriangleEffectAlternate +al 00FD01 .UpdateTriangleEffectAlternate +al 00FCD6 .StartTriangleEffectLong +al 00FCE4 .UpdateTriangleEffectLong +al 00FCB4 .StartTriangleEffectMedium +al 00FC9A .StartTriangleEffectShort +al 00FCA8 .UpdateDmcOutputEffect +al 00FC97 .UpdateNoiseEffectSequence +al 00FC31 .StartTriangleSweep_Save +al 00FC1E .StartTrianglePitchSweep +al 00FC33 .UpdateTrianglePitchSweep +al 00FC60 .DispatchMusicAndNoise +al 00FBFB .PulseEffectAlternate_Use90 +al 00FBF8 .PulseEffectAlternate_TestOdd +al 00FBE4 .UpdateAlternatePulse2PhaseEffect +al 00FC58 .CountDownPulse2PhaseEffect +al 00FBD3 .StartAlternatePulse2PhaseEffect +al 00FC55 .WritePulse2PhaseRegisters +al 00FBD0 .PulseEffectF4_Apply +al 00FBC8 .PulseEffectF4_CheckUpper +al 00FBBC .PulseEffectF4_Configure +al 00FBB9 .PulseEffectF4_WriteTimer +al 00FBB3 .PulseEffectF4_Phase10 +al 00FBA9 .UpdatePulse2PhaseEffect +al 00FBAF .PulseEffectF4_Phase18 +al 00FBA1 .StartPulse2PhaseEffect +al 00FC94 .UpdateMusicSequencer +al 00FB95 .UpdateAudioEffect2_SelectPitch +al 00FB90 .UpdateAudioEffect2_WriteSweep +al 00FB9C .UpdateAudioEffect2_CountDown +al 00FB7F .UpdateAudioEffect2_CheckState +al 00FB97 .UpdateAudioEffect2_Trigger +al 00FBFF .UpdateSecondaryEffects +al 00FB35 .ClearPrimaryAudioEffect +al 00FB63 .StartPulse1StateChangeEffect +al 00FB6B .UpdatePulse1StateChangeEffect +al 00FB43 .StartPulse1DescendingEffect +al 00FB4A .UpdatePulse1DescendingEffect +al 00FB40 .UpdateAudioEngine_Finalize +al 00FB5A .UpdateAudioEffect1_Write +al 00FB02 .FinalizeSoundEffectPreset_Apply +al 00FAF6 .FinalizeSoundEffectPreset_SelectX +al 00FAEC .StartPulse1EffectPreset3FromControl +al 00FAE5 .StartPulse1EffectPreset3 +al 00FAE1 .StartPulse1EffectPreset2FromControl +al 00FADA .StartPulse1EffectPreset2 +al 00FAEE .UpdatePulse1PresetEffect +al 00FAD6 .StartPulse1EffectPreset1FromControl +al 00FACF .StartPulse1EffectPreset1 +al 00FAC5 .LookupAudioControlValueFinalRotate +al 00FABF .LookupAudioControlValue +al 00FABA .ReduceValueByOneThirtySecond_Subtract +al 00FAAE .ReduceValueByOneThirtySecond +al 00FAAA .WriteTrianglePeriodFromTable +al 00FAA6 .WritePulse2PeriodAfterSweep +al 00FAA3 .WritePulse2PeriodFromTable +al 00FAA2 .WriteApuTimerFromTable_Return +al 00FA91 .WriteApuTimerFromTable +al 00FA8C .InitializePulse1PeriodAfterStateSaved +al 00FA8F .WritePulsePeriod_SelectChannel +al 00FA86 .WritePulsePeriodFromTable +al 00FA7A .ConfigureNoiseChannel +al 00FA73 .WritePulse2SweepAndControlFromRegisters +al 00FA71 .WritePulse2SweepAndControl +al 00FA6A .WritePulse1SweepAndControlFromRegisters +al 00FA68 .WritePulse1SweepAndControl +al 00FA76 .WritePulse2Control +al 00FA64 .ConfigurePulse2ControlPreset +al 00FA6D .WritePulse1Control +al 00FA60 .ConfigurePulse1ControlPreset +al 00FA00 .AudioLookupData_FA00 +al 00F9F4 .AudioPadding_F9F4 +al 00F9ED .InitializeAudioEngine_WriteDmc +al 00FB05 .UpdateAudioEngine +al 00F9A5 .RenderingAnimationData_F9A5 +al 00F900 .RenderingAnimationData_F900 +al 00F800 .RenderingAnimationData_F800 +al 00F700 .RenderingAnimationData_F700 +al 00F600 .RenderingAnimationData_F600 +al 00F500 .RenderingAnimationData_F500 +al 00F400 .RenderingAnimationData_F400 +al 00F300 .RenderingAnimationData_F300 +al 00F200 .RenderingAnimationData_F200 +al 00F100 .RenderingAnimationData_F100 +al 00F000 .RenderingAnimationData_F000 +al 00EF00 .RenderingAnimationData_EF00 +al 00EE00 .RenderingAnimationData_EE00 +al 00ED00 .RenderingAnimationData_ED00 +al 00EC1C .RenderingAndAnimationData_EC1C +al 00EBFC .RenderingData_EBFC +al 00EBDC .RenderingData_EBDC +al 00EBBC .RenderingData_EBBC +al 00EBB4 .UpdateRelativeObjectEventBank +al 00EBAD .InitializeQueuedEventSystem_ClearActive +al 00EBA0 .InitializeQueuedEventSystem_ClearPage +al 00EB7D .DispatchNextQueuedEvent_Wait +al 00EB81 .DispatchNextQueuedEvent_HaveEntry +al 00EB65 .Return_EB65 +al 00EB5B .RestoreObjectEventContext +al 00EB5A .UpdateObjectEventBank_Restore +al 00EB3C .UpdateObjectEventBank +al 00EB2F .ProcessQueuedObjectEvent_Loop +al 00EB3B .ProcessQueuedObjectEvent_Return +al 00EB16 .QueueDecodedObjectEventCheckActive +al 00EAF5 .WriteFixedPpuSequence +al 00EB00 .WriteGeneratedPpuWord +al 00EAAF .RunDisplayTransition +al 00EA8F .ProcessInlinePpuStream_Write +al 00EA8C .ProcessInlinePpuStream_WriteLoop +al 00EA89 .ProcessInlinePpuStream_DecodeCount +al 00EA6C .ProcessInlinePpuStream_Record +al 00EAA3 .ProcessInlinePpuStream_CheckRecord +al 00EA26 .CopyInlineDisplayRecord_Loop +al 00EA17 .PPUWriteString +al 00EA0A .WriteInlinePpuBlock_Loop +al 00EA05 .WriteInlinePpuBlockAfterAddress +al 00EA02 .WriteInlinePpuBlock +al 00E9FC .WritePendingPpuByte +al 00E9E8 .SetPpuAddress_AddOffset +al 00E9E0 .SetRelativePpuAddressFromInlineRecord +al 00E9EF .SetPpuAddress_Write +al 00E9D2 .WritePpuControlFromCarry +al 00E9C7 .CopyInlineBytesToZeroPage_Loop +al 00E9C2 .CopyInlineBytesToZeroPage +al 00E9B1 .DecodeInlineParameters_Jump +al 00E9B4 .ReadInlineWord +al 00E990 .FillPpuMemoryWith26_Loop +al 00E9DB .SetPpuAddressFromInlineRecord +al 00E957 .UpdatePrimaryArithmeticPairAlternate_ShiftHigh +al 00E943 .UpdatePrimaryArithmeticPairAlternate_ShiftLow +al 00E93A .UpdatePrimaryArithmeticPairAlternate_SaveMask +al 00E923 .UpdateSecondaryArithmeticPair_ShiftHigh +al 00E929 .UpdateSecondaryArithmeticPair_AddHigh +al 00E912 .UpdateSecondaryArithmeticPair_ShiftLow +al 00E918 .UpdateSecondaryArithmeticPair_AddLow +al 00E8FA .UpdatePrimaryArithmeticPair_ShiftHigh +al 00E900 .UpdatePrimaryArithmeticPair_AddHigh +al 00E8E9 .UpdatePrimaryArithmeticPair_ShiftLow +al 00E8ED .UpdatePrimaryArithmeticPair_AddLow +al 00E8E3 .UpdatePrimaryArithmeticPair_SaveMask +al 00E8CB .TransformSignedComponentPair_Loop +al 00E8C2 .TransformSignedComponentPair_SaveY +al 00E8BB .TransformSignedComponentPair_SaveA +al 00E8B7 .TransformSignedComponentPair +al 00E931 .UpdatePrimaryArithmeticPairAlternate +al 00E8B0 .RunEightRoundTransform_Loop +al 00E88A .NormalizeSignedVector_Loop +al 00E882 .NormalizeSignedVector_SaveSign +al 00E86C .CalculateVectorFromRotatedMask_SaveMask +al 00E863 .CalculateVectorFromRotatedMask_Loop +al 00E908 .UpdateSecondaryArithmeticPair +al 00E842 .CalculateSignedVector_Loop +al 00E832 .CalculateSignedVector_SaveSign +al 00E822 .CalculateSignedVector +al 00E8DA .UpdatePrimaryArithmeticPair +al 00E81B .CalculateVectorMagnitude_Loop +al 00E810 .CalculateVectorMagnitude_SaveX +al 00E802 .DivideUnsignedByte_Shift +al 00E7FC .DivideUnsignedByte_Loop +al 00E7F5 .DivideUnsignedByte +al 00E7EF .CalculateScaledProduct_Next +al 00E7E4 .CalculateScaledProduct_Loop +al 00E7DB .CalculateScaledProduct +al 00E7DA .AbsoluteValueAY_Return +al 00E7C0 .HideOamSprites_Loop +al 00E7BC .HideOamSprites +al 00E791 .RenderSpriteRecordList_Loop +al 00E7BB .RenderSpriteRecordList_Return +al 00E76E .RenderingStateTable_Alternate +al 00E761 .RenderingStateTable_Default +al 00E761 .RenderingStateTable +al 00E756 .InitializeRenderingState_CopyLoop +al 00E752 .InitializeRenderingState_SaveFlags +al 00E741 .InitializeRenderingState +al 00E735 .ProjectObjectCoordinates_Return +al 00E736 .ProjectObjectCoordinates_Fail +al 00E6C1 .ProjectObjectCoordinates +al 00E66F .DivideOrNormalizeWord_Return +al 00E670 .DivideOrNormalizeWord_Overflow +al 00E654 .DivideOrNormalizeWord_Shift +al 00E64E .DivideOrNormalizeWord_CheckCarry +al 00E644 .DivideOrNormalizeWord_Loop +al 00E63E .DivideOrNormalizeWord +al 00E630 .MultiplyByteBySignedWord_Shift +al 00E61F .MultiplyByteBySignedWord_Loop +al 00E611 .MultiplyByteBySignedWord +al 00E60A .AdvanceRandomState_SaveLow +al 00E5F9 .AdvanceRandomState_Loop +al 00E5F4 .Return_E5F4 +al 00E5DF .QueueModeIndicatorTiles_Fill +al 00E5C4 .InitializeSharedObjectMotion_Save +al 00E965 .CalculateScaledRatio +al 00E598 .ApplyBaseObjectGeometry_CopyCurrent +al 00E576 .ApplyCurrentObjectGeometry_CopyPosition +al 00E533 .StoreBaseObjectPositionAndClearMovement +al 00E828 .CalculateSignedVectorFromResult +al 00E510 .EvaluateGeometryDifference_VerticalReady +al 00E509 .EvaluateGeometryDifference_HorizontalReady +al 00E4D7 .CalculateBaseGeometryDifference +al 00E4B2 .UseGeometryRecordOffset +al 00E4B5 .StoreGeometryParameter +al 00E46B .GetCurrentGeometryRecordOffset +al 00E453 .GeometryParameterData_Block3 +al 00E433 .GeometryParameterData_Block2 +al 00E413 .GeometryParameterData +al 00E57E .ApplyBaseObjectGeometry +al 00E3C0 .RunSelectedObjectTransition_WaitLoop +al 00E3BD .RunSelectedObjectTransition_GeometryClear +al 00E3AF .RunSelectedObjectTransition_TestGeometry +al 00E59D .InitializeSharedObjectMotion +al 00E3AC .RunSelectedObjectTransition +al 00E391 .ProcessCompactObjectState_LoadEntry +al 00E39D .ProcessCompactObjectState_Consume +al 00E379 .ProcessCompactObjectState_CompareState64 +al 00E380 .ProcessCompactObjectState_SavePending +al 00E3AB .ProcessCompactObjectState_Return +al 00E33F .FindAndQueueSelectedState_Found +al 00E336 .FindAndQueueSelectedState_Search +al 00E329 .CurrentObjectAnimationDelayTable +al 00E30C .UpdateCurrentObjectAnimationDelay_LoadDelay +al 00E319 .CurrentObjectAnimationBaseTable +al 00E306 .UpdateCurrentObjectAnimationDelay_Reset +al 00E321 .CurrentObjectAnimationLimitTable +al 00E310 .UpdateCurrentObjectAnimationDelay_Default +al 00E2A5 .CalculateObjectCoordinateDifference +al 00EB0D .QueueDecodedObjectEvent +al 00E28A .FindNearestCandidateObject_Next +al 00E80B .CalculateVectorMagnitude +al 00E295 .CandidateObjectOffsetTable +al 00E264 .FindNearestCandidateObject_Loop +al 00E25A .FindObjectStateForSelector_Previous +al 00E252 .FindObjectStateForSelector_Search +al 00E25D .FindObjectStateForSelector_Return +al 00E384 .ProcessCompactObjectState_Validate +al 00E23A .ProcessSelectedObjectState_Clear +al 00E200 .FindEligibleObjectState_Return +al 00E201 .TestIndexedObjectGeometry +al 00E1FA .FindEligibleObjectState_Next +al 00E1E9 .FindEligibleObjectState_Loop +al 00E1E6 .TestObjectGeometryFourTimes_Return +al 00E1D2 .TestObjectGeometryFourTimes_Loop +al 00E1BE .ObjectStateDispatch_SaveFrame67 +al 00E1A7 .ObjectStateDispatch_SaveFrame5F +al 00E19B .ObjectStateDispatch_SaveFirstFrame +al 00E1C6 .ObjectStateDispatch_Object04 +al 00E15E .ObjectStateDispatch_SelectedObjectClear +al 00E150 .ObjectStateDispatch_TestSelectedObject +al 00E16C .ObjectStateDispatch_DifferentObject +al 00E25E .FindNearestCandidateObject +al 00E141 .ObjectStateDispatch_AssignState +al 00E135 .ObjectStateDispatch_CheckSelector4 +al 00E10D .ObjectStateDispatch_FindInputIndex +al 00E0CC .ObjectStateDispatch_CompareTables +al 00E114 .ObjectStateDispatch_ForwardTransition +al 00E0B7 .ObjectStateDispatch_TestState +al 00E0F2 .ObjectStateDispatch_NextEntry +al 00E0A8 .ObjectStateDispatch_Search +al 00E0A5 .ObjectStateDispatch_AdvanceIndex +al 00E098 .ObjectStateDispatch_SelectStart +al 00E0F6 .ObjectStateDispatch_WaitLoop +al 00E107 .ObjectStateDispatch_ForwardPath +al 00E222 .ProcessSelectedObjectState +al 00E089 .ObjectStateDispatch_InputActive +al 00E074 .ObjectStateDispatch_TimerLoop +al 00E06F .ObjectStateDispatch_StoreTimer +al 00E06D .ObjectStateDispatch_SetTimer +al 00E05F .ObjectStateDispatch_InitializeObject +al 00E1E7 .FindEligibleObjectState +al 00E331 .FindAndQueueSelectedState +al 00E36A .ProcessCompactObjectState_TestSelector +al 00E347 .ProcessCompactObjectState +al 00E040 .ProcessObjectStateSelection +al 00E049 .ObjectStateDispatch_CheckCandidate +al 00E1CE .TestObjectGeometryFourTimes +al 00E027 .ObjectStateResultTable +al 00E021 .ObjectStateThresholdTable +al 00E01D .ObjectStateLookupData +al 00E313 .UpdateCurrentObjectAnimationAndWait +al 00E017 .SetCurrentObjectState_Finish +al 00E009 .SetCurrentObjectState_Retry +al 00DFFF .SetCurrentObjectState5 +al 00DFFB .SetCurrentObjectState4 +al 00DFF7 .SetCurrentObjectState3 +al 00DFF3 .SetCurrentObjectState2 +al 00E001 .SetCurrentObjectState +al 00DFEF .SetCurrentObjectState1 +al 00DFEB .ObjectDisplayAttributeTable +al 00DFC4 .SignedCoordinateOffsetTable +al 00DFBE .TransformSignedValue_Next +al 00DFB6 .TransformSignedValue_Loop +al 00DFAE .TransformSignedValue_HaveMagnitude +al 00DFA7 .TransformSignedValue +al 00DF92 .AddTransformedSignedValues +al 00DF8A .CalculateCurrentObjectGeometry_ClearX +al 00DF8C .CalculateCurrentObjectGeometry_SaveArguments +al 00DF77 .CalculateCurrentObjectGeometry_RunTest +al 00E8A5 .RunEightRoundTransform +al 00DF80 .CalculateCurrentObjectGeometry_Clamp +al 00DF67 .CalculateCurrentObjectGeometry_CompareMagnitude +al 00DF7A .CalculateCurrentObjectGeometry_Nonnegative +al 00E877 .NormalizeSignedVector +al 00DF3C .PrepareBaseObjectGeometry +al 00DF27 .SetupBaseObjectGeometry +al 00DF12 .SetupCurrentObjectGeometry +al 00DF05 .SelectObjectGeometrySize_Save +al 00DEF8 .AssignCurrentObjectToSavedSlot +al 00DED5 .ObjectRouting_MergeComplete +al 00DEA7 .ObjectRouting_SaveCandidateAttribute +al 00DEAA .ObjectRouting_UpdateCandidate +al 00DE92 .ObjectRouting_SetCandidateAnimation +al 00DEC8 .ObjectRouting_CandidateBelow2 +al 00E519 .BuildGeometryVectorFromArguments +al 00DE66 .ObjectRouting_SetupCoordinates +al 00DE84 .ObjectRouting_CandidateBelow7 +al 00DEEF .AssignCurrentObjectSlot +al 00E037 .ObjectStateDispatch +al 00DE4A .ObjectRouting_EnterEngine +al 00E35A .ProcessCompactObjectState_FindAlternate +al 00DE42 .ObjectRouting_TestRegion +al 00DE2F .ObjectRouting_MergeSucceeded +al 00DE1F .ObjectRouting_SaveMainFrame +al 00DE18 .ObjectRouting_SaveFrames +al 00DE16 .ObjectRouting_UseFrame60 +al 00DE78 .ObjectRouting_ApplyCoordinateSetup +al 00DE4D .ObjectRouting_Alternate +al 00DE6F .ObjectRouting_LargeCandidate +al 00DDF7 .ObjectRouting_CompareCurrent +al 00DDF5 .ObjectRouting_CheckCandidate8 +al 00DE55 .ObjectRouting_BaseStateAtLeast3 +al 00DDD0 .ObjectRouting_SearchSlots +al 00DDC5 .ProcessSavedObjectAnimation_Done +al 00DDB4 .ProcessSavedObjectAnimation +al 00E562 .EvaluateLoadedCurrentObjectGeometry +al 00DEFB .SelectObjectGeometrySize +al 00DD88 .HandleSavedObject +al 00DD8F .ProcessSavedObjectGeometry +al 00DD80 .ObjectSelection_RestartSlots +al 00DD7E .ObjectSelection_StatePath +al 00DDC8 .ObjectRoutingPath +al 00DDDF .ObjectRouting_CheckBaseState +al 00DED8 .ObjectRouting_ReverseMovement +al 00DD68 .ObjectSelection_CheckCurrent +al 00DD78 .ObjectSelection_NoSavedObject +al 00DD51 .ObjectSelection_SearchSlots +al 00DD4D .ObjectSelectionSharedPath +al 00DD82 .ObjectSelection_CheckActive +al 00DD3C .AssignObjectToSlot +al 00DD29 .FindAvailableObjectSlot_Search +al 00DD30 .CheckSavedObjectOffset +al 00DD21 .FindAvailableObjectSlot +al 00DFD4 .UpdateCurrentObjectDisplayState +al 00E548 .StoreGeometryInCurrentObject +al 00DD4A .ContinueObjectProcessingWithDelay +al 00E528 .StoreCurrentObjectMovement +al 00E513 .BuildGeometryVector +al 00DD15 .ProcessSelectedObject_SmallResult +al 00DD07 .ProcessSelectedObject_LargeResult +al 00E4DB .CalculateCurrentGeometryDifference +al 00E4C2 .LoadGeometryRecord +al 00E474 .SelectGeometryRecord_Default +al 00DCEC .ProcessSelectedObject_Geometry +al 00DCE0 .ProcessSelectedObject +al 00DF45 .CalculateCurrentObjectGeometry +al 00DD48 .ContinueObjectProcessing +al 00DCCC .SelectActiveObject_Save +al 00DF08 .TestCurrentObjectGeometry +al 00DCD8 .SelectActiveObject_Alternate +al 00DCDF .SelectActiveObject_Return +al 00DCBA .SelectActiveObject +al 00DCA4 .DispatchSixObjectEvents_Loop +al 00DCA2 .DispatchSixObjectEvents +al 00E4B8 .SelectGeometryRecordFromObject +al 00DC97 .WaitForObjectRegionClear_Test +al 00E2DE .UpdateCurrentObjectAnimationDelay +al 00DC91 .WaitForObjectRegionClear +al 00E29B .DispatchInlineObjectCommand +al 00DC72 .InitializeObjectEventSequence_DispatchLoop +al 00DC88 .ObjectEventSlotTable +al 00DC60 .InitializeObjectEventSequence_ProcessEvents +al 00DC5A .InitializeObjectEventSequence_SaveBounds +al 00DC50 .InitializeObjectEventSequence_CheckUpper +al 00DC31 .InitializeObjectEventSequence +al 00DC29 .VerticalAdjustmentTable +al 00DC28 .TestCurrentObjectCoordinateRegion_Return +al 00DC2A .HorizontalAdjustmentTable +al 00DC06 .TestCurrentObjectCoordinateRegion +al 00DBF6 .SecondaryAnimationBaseTable +al 00DBED .SecondaryObjectDelay_ResetFrame +al 00DBFE .SecondaryAnimationLimitTable +al 00DBF3 .SecondaryObjectDelay_Return +al 00DBAE .TestCurrentObjectRegion_Shift +al 00DBAF .TestCurrentObjectRegion_Return +al 00DB8E .TestCurrentObjectRegion_Search +al 00DB75 .ResolveCurrentObject_ZeroResult +al 00DB84 .TestCurrentObjectRegion +al 00DB82 .ResolveCurrentObject_Neutral +al 00DB79 .ResolveCurrentObject_SecondaryRegion +al 00DB7E .ResolveCurrentObject_AlternateResult +al 00DB46 .ResolveCurrentObjectSelector +al 00DBB0 .InputMaskTable +al 00DB2E .CurrentObjectInputFallback +al 00DB2C .TestCurrentObjectInput_Shift +al 00DB17 .UpdateCurrentObjectSelectorState_Return +al 00DAF6 .StoreCurrentObjectSelector_Return +al 00E2D3 .ClearCurrentObjectMovement +al 00DAC8 .StoreStateSelector +al 00DAC3 .DisableCurrentObject +al 00DAB4 .CountMatchingObjectStates_Next +al 00DAAE .CountMatchingObjectStates_Loop +al 00DAD5 .FinishSecondaryObject +al 00DAA0 .ObjectAnimationFrameTable +al 00DA9C .ObjectAnimationAttributeTable +al 00DA80 .MarkMatchingObjectState_Return +al 00E246 .FindObjectStateForSelector +al 00DA5C .SecondaryObject_DA5C_ReturnToIndexedPath +al 00E49A .SelectGeometryRecord_28 +al 00DA49 .SecondaryObject_DA49_CheckSelector +al 00DA2C .SecondaryObject_DA2C_TimerLoop +al 00DA11 .SecondaryObject_WaitForState +al 00E4B0 .UseFixedGeometryRecord54 +al 00DA00 .SecondaryObject_SelectRetryDelay +al 00DA06 .SecondaryObject_RunFrameHelper_DA06 +al 00D9E0 .SecondaryObject_FinishSelectorEight +al 00D9CC .SecondaryObject_RunFrameHelper +al 00D9A2 .SecondaryObject_ActionWait +al 00D991 .SecondaryObject_RetryPath +al 00D981 .SecondaryObject_RecalculateSelector +al 00D9B3 .SecondaryObject_SelectorEight +al 00E3DC .GetCurrentObjectSelectorAndState +al 00D967 .SecondaryObject_AdvanceIndexedState +al 00D997 .SecondaryObject_ActionActive +al 00D960 .SecondaryObject_ActionStatePath +al 00D95D .SecondaryObject_TimerPath +al 00D94A .SecondaryObject_State86Wait +al 00D95A .SecondaryObject_JumpToNegativeResult +al 00D9E6 .SecondaryObject_TransitionHandler +al 00D93C .SecondaryObject_CheckResult +al 00D941 .SecondaryObject_Transition +al 00DA5F .GetCurrentObjectSelector +al 00D92B .SecondaryObject_CheckState6D +al 00DA6D .MarkMatchingObjectState +al 00D917 .SecondaryObject_StateLoop +al 00E48F .SelectGeometryRecord_34 +al 00D906 .SecondaryObject_RetryGeometry +al 00D90C .SecondaryObject_Continue +al 00DAEB .StoreCurrentObjectSelector +al 00DAF7 .UpdateCurrentObjectSelectorState +al 00DAA4 .CountMatchingObjectStates +al 00D8F4 .SecondaryObject_NoCollision +al 00E4A5 .SelectGeometryRecord_24 +al 00DABC .CheckCurrentObjectSelector +al 00D8DC .SecondaryObject_ProcessFrame +al 00D8CA .SecondaryObject_TimerLoop +al 00D8C5 .SecondaryObject_SetTimer +al 00DA25 .SecondaryObject_NegativeResultPath +al 00DB18 .TestCurrentObjectInput +al 00D944 .SecondaryObject_State86Path +al 00D8B3 .SecondaryObject_CheckFlags +al 00D8A9 .SecondaryObject_WaitFrame +al 00DA81 .UpdateCurrentObjectAnimation +al 00E55F .ApplyCurrentObjectGeometry +al 00E481 .SelectGeometryRecord_44 +al 00D8C3 .SecondaryObject_ActivateTimer +al 00DBB8 .SelectSecondaryObjectDelay +al 00D88D .SecondaryObject_RetryDelay +al 00D897 .SecondaryObject_CheckRegion +al 00DA68 .GetCurrentObjectStateIndex +al 00D885 .UpdateSecondaryObjectState +al 00D882 .FinishSecondaryObjectStates +al 00D874 .CheckObjectState059B +al 00D866 .CheckObjectState059A +al 00D85B .ProcessSecondaryObjectStates +al 00D84F .AnimationFrameDelayTable +al 00D837 .AnimationFrameBaseTable +al 00D82B .CheckLowerFrameBound +al 00D843 .AnimationFrameLimitTable +al 00D831 .SelectAnimationDelay +al 00D810 .SelectAnimationFrameAndDelay +al 00E3E8 .CopyCurrentObjectPositionToBaseAfterIndex +al 00D7EC .WaitForVerticalPosition02 +al 00D7B2 .WaitForObjectFieldsFrame +al 00D7AB .WaitForObjectFieldsToClear +al 00E08B .ObjectStateDispatch_NextPath +al 00E3E6 .InitializeBaseObjectFromCurrent +al 00D786 .WaitForVerticalPositionF6 +al 00D783 .ExitObjectApproachState +al 00D769 .AdvanceObjectApproachState +al 00D734 .AddObjectProximityCount +al 00D732 .AddDoubleObjectProximityCount +al 00D736 .UpdateObjectCoordinateFlag +al 00D745 .EvaluateObjectApproachCompletion +al 00D6F5 .CheckObjectApproachState +al 00D6EA .UpdateObjectApproachFrame +al 00D6E8 .UpdateObjectApproachTimer +al 00D6E4 .ResetObjectApproachTimer +al 00D6DB .RunObjectApproachSequence +al 00D6CB .StoreState2Actor +al 00D6B7 .InitializeState2Actor +al 00D69D .StoreState4Actor +al 00D689 .InitializeState4Actor +al 00D66A .StoreState6Actor +al 00D656 .InitializeState6Actor +al 00D5DC .Routine_D5DC_WaitFrame +al 00D5D8 .WaitForMotionToSettle +al 00D5CE .RandomMotionAngleThresholdTable +al 00D5CD .RandomMotionAnglePadding +al 00D5C3 .RandomMotionAngleTable +al 00D5BE .RandomMotionThresholdTable +al 00D5B9 .RandomMotionBaseTable +al 00D599 .FinishRandomMotionSequence +al 00D584 .UpdateMotionEndAnimation +al 00E855 .CalculateVectorFromRotatedMask +al 00D527 .CompareMotionAngleThreshold +al 00D524 .SearchMotionAngleThreshold +al 00D52D .SelectRandomMotionOffset +al 00D510 .StartRandomMotion +al 00D504 .SearchMotionThreshold +al 00D4D5 .UpdateFielderAnimationCounters +al 00D4E7 .ReverseFielderAnimation +al 00D4FF .SelectRandomMotionParameters +al 00D4BE .UpdateFielderAnimationFrame +al 00D4B4 .CheckFielderAnimationState +al 00D4AD .AdvanceFielderAnimationCycle +al 00D4A6 .WaitForFielderInput +al 00D49E .ResetFielderAnimationCounters +al 00D478 .RunFielderAnimationSequence +al 00D46A .RunActorAlternateDelay +al 00D453 .RunActorFinalDelay +al 00D448 .RunActorDelayCountdown +al 00D475 .FinishControlledActorDelay +al 00D461 .SelectActorAlternateDelay +al 00D41D .WaitForActorDescent +al 00D414 .WaitForActorAscent +al 00D407 .SelectControlledActorDelay +al 00D3FC .Routine_D3FC_InitialDelay +al 00D3F8 .RunControlledActorDelay +al 00D3E8 .Routine_D3E8_UpdateObject +al 00D3CB .Routine_D3CB_AddVertical +al 00D3F3 .ControlledVerticalOffsetTable +al 00D3C1 .Routine_D3C1_Vertical +al 00D399 .Routine_D399_AddHorizontal +al 00D3F0 .ControlledHorizontalOffsetTable +al 00D38B .Routine_D38B_FindIndex +al 00D382 .MoveControlledObject +al 00D355 .Routine_D355_State1 +al 00D367 .Routine_D367_State2 +al 00D373 .Routine_D373_State3 +al 00D352 .Routine_D352_NextEntry +al 00D344 .Routine_D344_SearchEntries +al 00D361 .Routine_D361_TestBits +al 00D339 .ObjectActionLookupTable +al 00D33C .DispatchActionType +al 00D2F9 .SaveBatterAction +al 00D2F7 .UseBatterInputAction +al 00D2DB .FindAvailableBatterActionSlot +al 00D2D9 .SelectBatterActionSlot +al 00D32A .SelectActionFromObjectState +al 00D2BF .CheckActiveFieldObjects +al 00D2D4 .UseBatterControllerInput +al 00D2B2 .WaitForBatterAction +al 00D2AD .SelectBatterAction +al 00D28F .CheckPitchVerticalLimit +al 00D28B .SetPitchMovementFlags +al 00D285 .ApplyPitchLeftInput +al 00D27D .ApplyPitchHorizontalInput +al 00D27B .UsePitchControllerInput +al 00D265 .UpdatePitchMovement +al 00D2A7 .PitchDelayTable +al 00D2A4 .PitchVelocityBiasTable +al 00D2AA .PitchRenderFlagTable +al 00D225 .PitchStartAnimationLoop +al 00D212 .AnimatePitchStart +al 00D1FD .SearchPitchDirectionThresholds +al 00D1ED .SearchPitchTypeThresholds +al 00D1EA .SelectPitchType +al 00D1E1 .FindAvailablePitchState +al 00D20A .UseControllerPitchSelection +al 00D1D0 .SelectPitchAction +al 00D1C8 .FinishWindupSequence +al 00D19A .RunWindupAlternateFrame +al 00D1A2 .SetWindupFrame +al 00D18B .RunPitcherWindupSequence +al 00D171 .ClearPrimaryActorState +al 00D167 .InitializePrimaryGameplayActor +al 00D162 .PitchTypeResultTable +al 00D15D .PitchTypeThresholdTable +al 00D154 .PitchDirectionResultTable +al 00D14B .PitchDirectionThresholdTable +al 00D14A .ConditionalObjectInitReturn +al 00D125 .ObjectInitTable_End +al 00D11E .ObjectInit_D11E +al 00D117 .ObjectInit_D117 +al 00D110 .ObjectInit_D110 +al 00D109 .ObjectInit_D109 +al 00D102 .ObjectInit_D102 +al 00D0FB .ObjectInit_D0FB +al 00D0F4 .ObjectInit_D0F4 +al 00D0ED .ObjectInit_D0ED +al 00D0E6 .ObjectInit_D0E6 +al 00D0DF .ObjectInit_D0DF +al 00D0D8 .ObjectInit_D0D8 +al 00D0D1 .ObjectInit_D0D1 +al 00D0CA .ObjectInit_D0CA +al 00D0C3 .ObjectInit_D0C3 +al 00D0BC .ObjectInit_D0BC +al 00D0B5 .ObjectInit_D0B5 +al 00D0AE .ObjectInit_D0AE +al 00D0A7 .ObjectInit_D0A7 +al 00D0A0 .ObjectInit_D0A0 +al 00D09A .AdvanceObjectInitRecord +al 00D09F .ObjectInitializationReturn +al 00D0A0 .ObjectInitializationTable +al 00D06C .InitializeNextObjectRecord +al 00D047 .ConvertSharedCounterToDigits +al 00D028 .DisplaySharedCounter +al 00D01F .Routine_D01F_SubtractTen +al 00D00B .SelectSharedCounterQueueOffset +al 00CFFB .SelectPlayerDisplayQueueOffset +al 00CFEB .StoreCounterDisplayDigits +al 00CFE7 .BlankLeadingCounterDigit +al 00D01D .DivideABy10 +al 00CFB6 .SaveSaturatedSideCounter +al 00CF5C .QueueThreeBlanks +al 00CF3A .QueueStateMarkerEntry +al 00CF18 .Routine_CF18_SaveIndex +al 00CF0B .AnnouncementTextSafe +al 00CF05 .AnnouncementTextChange +al 00CEFF .AnnouncementTextDeadBall +al 00CEF9 .AnnouncementTextThreeBase +al 00CEF3 .AnnouncementTextTwoBase +al 00CEED .AnnouncementTextSingle +al 00CEE7 .AnnouncementTextWalk +al 00CEE1 .AnnouncementTextBall +al 00CEDB .AnnouncementTextOut +al 00CED5 .AnnouncementTextStrike +al 00CECF .AnnouncementTextFoul +al 00CEC9 .AnnouncementTextBlank +al 00CEC9 .AnnouncementTextTable +al 00CEBC .CopyAnnouncementText +al 00CEAC .DisplaySecondaryAnnouncement +al 00CEAE .QueueAnnouncementText +al 00CEA5 .DisplayAnnouncementPair +al 00CE91 .SaveAnnouncementAudioFlag +al 00CE8B .CheckAnnouncement18 +al 00CE85 .CheckAnnouncement0C +al 00CE7F .CheckAnnouncement42 +al 00CE79 .CheckAnnouncement12 +al 00CE9C .DisplayBlankAnnouncement +al 00CE71 .MapAnnouncementToAudioFlag +al 00CE46 .FindReadyAnnouncement +al 00CE38 .WaitAnnouncementDelay +al 00CE36 .ReloadAnnouncementDelay +al 00CE32 .RunEventAnnouncementLoop +al 00CE1A .CelebrationPaletteSequence +al 00CDF5 .WaitCelebrationColorFrame +al 00CDEE .SaveCelebrationColorIndex +al 00CDEC .ResetCelebrationColorIndex +al 00CDBD .HomeRunAnimationLoop +al 00CDA4 .RunHomeRunCelebration +al 00CD98 .StartHomeRunSequence +al 00CD7B .WaitForStateAnimation +al 00CD4F .LoadStateAnimationParameters +al 00CD42 .RunSelectedStateAnimation +al 00CD41 .Routine_CD41_Return +al 00CD2E .QueueSelectedStateMarker +al 00CD2B .StateVerticalHighTable +al 00CD28 .StateVerticalLowTable +al 00CD25 .StateHorizontalHighTable +al 00CD22 .StateHorizontalLowTable +al 00CD51 .StoreStateAnimationParameters +al 00CD18 .DispatchStateSelectorAnimation +al 00CD17 .Routine_CD17_Return +al 00CD09 .Routine_CD09_OneTimeCommand +al 00CF45 .ClearBothStateFields +al 00CD02 .Routine_CD02_OptionalSetup +al 00CCC9 .RunDualStateAnimationTail +al 00CCB9 .RunDualStateAnimation +al 00CCB8 .Routine_CCB8_Return +al 00CE22 .FinishStateProgression +al 00CF2A .QueueSecondaryStateMarker +al 00CCAA .Routine_CCAA_OneTimeCommand +al 00CC7A .AdvanceDualStateSequence +al 00E738 .ConvertObjectOffsetToDisplayIndex +al 00CF23 .QueuePrimaryStateMarker +al 00CC58 .QueueSecondaryStateEvent +al 00CC4D .AdvanceSecondaryStateSequence +al 00CC3C .RunPrimaryStateDelay +al 00CC3B .Routine_CC3B_Return +al 00CF11 .AddTimedStateEvent +al 00CF2F .BuildStateMarkerEntries +al 00CC2A .QueuePrimaryStateEvent +al 00CF4A .ClearPrimaryStateField +al 00CC20 .HandleEarlyPrimaryState +al 00CC01 .AdvancePrimaryStateSequence +al 00E502 .EvaluateGeometryDifference +al 00E4DD .CalculateGeometryDifference +al 00CBEA .TestCurrentObjectCollision +al 00CBA5 .Routine_CBA5_SecondPositive +al 00CB86 .Routine_CB86_FirstPositive +al 00CBC4 .IntegrateFixedPointObject +al 00CB63 .Routine_CB63_UpdateLoop +al 00CB7D .PrepareFixedPointObject +al 00CB39 .SimulateObjectTrajectories +al 00CB2E .QueueNegativeResultCommand +al 00CCE4 .AdvanceAlternateStateSequence +al 00CB1E .ApplyNegativeTrajectoryResult +al 00CB35 .TrajectoryResultTable +al 00CB34 .TrajectoryResultReturn +al 00CAC7 .FinishTrajectorySequence +al 00CAA1 .QueueNegativeTrajectoryCommand +al 00CAAA .QueueLaterTrajectoryCommand +al 00CAB0 .WaitForTrajectoryLimit +al 00CBEC .TestObjectCollision +al 00CA77 .UpdateTrajectoryFrame +al 00CA54 .AdvanceTrajectoryPhase +al 00CA4C .RunBaseTrajectorySequence +al 00CA2A .InitializeBaseMotion +al 00CA2F .StoreBaseMotionInitialization +al 00CA23 .InitializeBaseMotionZero +al 00E7CB .AbsoluteValueAY +al 00CA20 .ObjectMergeFailed +al 00C9C0 .TryMergeObjectIntoBase +al 00C9A7 .LoadObjectPositionInline +al 00C963 .LoadBasePositionFieldsInline +al 00C959 .ClearBaseMotionFields +al 00C985 .LoadBaseMotionFieldsInline +al 00C93A .QueueAlternateDirectionRecord +al 00C92F .SaveDirectionSelection +al 00C926 .SelectRandomDirectionBit +al 00C92C .UseRandomDirectionSignBit +al 00C914 .QueueAlternateRandomStateRecord +al 00C8EF .Routine_C8EF_BuildRandomBits +al 00C8EA .Routine_C8EA_NextEntry +al 00C8E5 .Routine_C8E5_Done +al 00C8C6 .Routine_C8C6_ReadRecord +al 00E99A .DecodeInlineParameters +al 00C8B1 .Routine_C8B1_SaveResult +al 00C8A8 .Routine_C8A8_SearchValues +al 00C8A4 .Routine_C8A4_NextEntry +al 00C899 .CalculateOppositeControllerAssignment +al 00C8A1 .ControllerAssignmentReturn +al 00C86F .FillBackgroundBlock +al 00EA3E .AllocateDisplayBufferRecord +al 00C860 .FillNextBackgroundBlock +al 00C83A .SavePlayerSelection +al 00C832 .ApplySelectionDecrement +al 00C81D .SelectPlayerSelectionEntry +al 00C81A .UpdatePlayerSelections +al 00C7BF .InitializeNextSpriteSortIndex +al 00C7B3 .InitializeSpriteSortIndexLoop +al 00C783 .WaitForTitleInputRelease +al 00E5CF .QueueModeIndicatorTiles +al 00C77A .RefreshTitleScreen +al 00E985 .FillPpuMemoryAfterValueSaved +al 00C737 .ResultsDelayLoop +al 00C708 .InitializeResultsPosition +al 00C6CC .AdvanceRoundNumber +al 00C6C5 .CheckPostRoundContinuation +al 00C6A5 .ProcessPostRoundEvents +al 00C691 .WaitPostRoundFrame +al 00CFA6 .UpdateCountersAndDisplay +al 00C68D .StartPostRoundDelay +al 00C67E .ApplyPendingScoreUpdate +al 00EB66 .DispatchNextQueuedEvent +al 00C6E1 .RoundEventSlotTable +al 00C66A .ProcessRoundEventSlotTable +al 00D126 .InitializeConditionalObject +al 00D610 .InitializeSecondaryActors +al 00C619 .RunPrimaryRoundHandlers +al 00C8A2 .InitializeObjectStateLookup +al 00C605 .CheckRoundTransitionState +al 00C5FE .RunRoundStateLoop +al 00D069 .InitializeDefaultObjects +al 00C6F7 .CompleteMatchState +al 00C5F1 .FinishGameplayReset +al 00C5DC .ClearObjectMotionFields +al 00C7C9 .ClearEightCharacterField +al 00C5BA .ResumeRoundSetupAtSelectionDisplay +al 00CF51 .ClearStateFieldPair +al 00C91B .QueueRandomDirectionRecord +al 00C5A4 .ResumeRoundSetupAtRandomDirection +al 00CF67 .QueueRoundNumberDisplay +al 00C57F .ResetGameplayState +al 00C904 .QueueRandomStateRecord +al 00C571 .StoreRoundMusicCue +al 00C573 .PrepareRoundObjects +al 00EB41 .StoreObjectEventBankValue +al 00D06B .InitializeObjectsFromTable +al 00C536 .ResetRoundCounters +al 00C566 .SelectRoundMusicCue +al 00C52A .EnableRoundAudio +al 00C51E .InitializeRoundState +al 00CF8B .QueuePlayerValueDisplay +al 00C8E8 .InitializeRandomBitfields +al 00C7DD .QueuePlayerSelectionDisplay +al 00C85A .FillSelectionBackgroundBlocks +al 00C4FF .WaitForPlayerSelection +al 00C4F5 .StartPlayerSelection +al 00C4EC .DeriveSelectedSideFromMode +al 00C50C .CompleteMatchSetup +al 00C4CE .SelectDistinctSecondPlayerValue +al 00C850 .Random0To5 +al 00E978 .EnableNmiAndWaitForFrame +al 00C4B9 .InitializeMatchState +al 00EA63 .ProcessInlinePpuStream +al 00E983 .FillPpuMemoryWith26 +al 00C4AA .InitializeSessionDisplay +al 00EB9D .InitializeQueuedEventSystem +al 00C496 .CheckStartInputSign +al 00EB4C .SelectObjectEventBank0 +al 00C489 .WaitForStartInput +al 00EB4E .UpdateObjectEventBank_Exchange +al 00EA17 .CopyInlineDisplayRecord +al 00EB48 .SelectObjectEventBank1 +al 00C43F .RunAttractMessageLoop +al 00C43E .IRQ +al 00C74A .InitializeTitleScreen +al 00C8BB .ExpandRecordPointerList +al 00E96C .DisablePpuRendering +al 00C7B1 .InitializeSpriteSortTables +al 00C416 .Reset_ClearPageLoop +al 00C40B .Reset +al 00C3FC .AddIntegratedPosition +al 00C3DC .SaveVelocitySignExtension +al 00C3D3 .CalculateSignedVelocityDelta +al 00E5F5 .AdvanceRandomState +al 00C3BB .HideUnusedOamSpriteLoop +al 00C3C7 .FinishFrameRendering +al 00C3B9 .HideUnusedOamSprites +al 00C38E .CopyStatusOamData +al 00E77B .RenderSpriteRecordList +al 00C366 .RenderNextSortedObject +al 00C35D .ContinueObjectDepthSort +al 00C33C .SortNextObjectPair +al 00C331 .OAMTemplate_C331 +al 00C386 .FinalizeOamAndPpuQueue +al 00C32A .FinishSelectionOam +al 00C2FB .CopySelectionOamTemplate +al 00C339 .SortObjectsByY +al 00C3AA .TerminatePpuUpdateQueue +al 00F94D .FrameOamTemplate_F94D +al 00C2E6 .CopyTransitionOamTemplate +al 00C2F5 .CheckOamBuildMode +al 00C2DE .BuildFrameOam +al 00C2CA .StoreSecondaryAnimationTile +al 00C2D7 .SetFinalBaseObjectTile +al 00E695 .BuildBaseMovementTransforms +al 00C2A0 .StorePrimaryAnimationTile +al 00C2A3 .SelectSecondaryAnimationTile +al 00E673 .BuildCurrentMovementTransforms +al 00C27B .SaveBaseObjectRenderFlags +al 00C2D0 .SetDefaultBaseObjectTile +al 00C265 .UpdateBaseObjectSprites +al 00E6B7 .ClearMovementTransforms +al 00C255 .UpdateNextGameplayObject +al 00C253 .UpdateAllGameplayObjects +al 00E746 .InitializeRenderingStateFromCarry +al 00C249 .CommitSignedPositionDelta +al 00C237 .SubtractPositionThreshold +al 00C23A .SaveSignedPositionDelta +al 00C94F .ClearBasePositionFields +al 00C943 .ClearBaseAccelerationFields +al 00C215 .AdvanceBaseMotionPhase +al 00CAD2 .EvaluateTrajectoryResult +al 00C1F0 .DoubleVerticalVelocity +al 00C1D0 .DoubleHorizontalVelocity +al 00C228 .UpdatePositionSignState +al 00C1A4 .ReflectBaseMotionValues +al 00C3CA .IntegrateObjectVelocityAndPosition +al 00C18D .UpdateBaseMotionSequence +al 00C17B .AddObjectVerticalDelta +al 00C165 .AddObjectHorizontalDelta +al 00C15D .IntegrateObjectPositionLoop +al 00EB6A .CommonEngineExit +al 00C15B .IntegrateAllObjectPositions +al 00C151 .UpdateNextShortCountdown +al 00C149 .UpdateShortCountdowns +al 00EB15 .QueueDecodedObjectEventSelectIndex +al 00C144 .UpdateNextObjectTimer +al 00C137 .UpdateObjectTimerLoop +al 00C122 .UpdateFrameObjectsAndTimers +al 00C118 .NMI_StoreSecondObject +al 00C10A .NMI_StoreFirstObject +al 00C87E .CalculateControllerAssignments +al 00EB0A .QueueInlineObjectEvent +al 00C11C .NMI_RestoreRegisters +al 00EB2A .ProcessQueuedObjectEvent +al 00C49C .InitializeNewSession +al 00C0E7 .NMI_RunCommand0B +al 00C0EC .NMI_CheckState +al 00C0CA .NMI_UpdateControllerState +al 00C0B3 .NMI_ReadControllers +al 00F9D0 .InitializeAudioEngine +al 00C081 .NMI_ReadPacketLoop +al 00C072 .NMI_WritePacket +al 00C07E .NMI_ReadPacket +al 00C08D .NMI_QueueDone +al 00C055 .NMI_PacketLoop +al 00C046 .NMI +al 00C036 .CalculateRandomizedPitchMotion +al 00C030 .TeamSelectionSpriteXTable +al 00C02A .TeamSelectionSpriteTileTable +al 00C024 .TeamInitialTileTable +al 00C000 .TitleCopyrightPpuStream diff --git a/Baseball (UE)/copilot/reconstructed.map b/Baseball (UE)/copilot/reconstructed.map new file mode 100644 index 0000000..1ad1cc6 --- /dev/null +++ b/Baseball (UE)/copilot/reconstructed.map @@ -0,0 +1,32 @@ +Modules list: +------------- +header.o: + HEADER Offs=000000 Size=000010 Align=00001 Fill=0000 +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 +chr.o: + CHR Offs=000000 Size=002000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +CHR 000000 001FFF 002000 00001 +HEADER 000000 00000F 000010 00001 +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/Baseball (UE)/copilot/reconstructed.nes b/Baseball (UE)/copilot/reconstructed.nes new file mode 100644 index 0000000000000000000000000000000000000000..08fab2d2a60e82f3df55f8c541ffc7f8b9cc8adc GIT binary patch literal 24592 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 H*Gv9CkGGx; literal 0 HcmV?d00001 diff --git a/Baseball (UE)/copilot/rom.nes b/Baseball (UE)/copilot/rom.nes new file mode 120000 index 0000000..8a34dbc --- /dev/null +++ b/Baseball (UE)/copilot/rom.nes @@ -0,0 +1 @@ +../baseball.nes \ No newline at end of file diff --git a/Bomberman (U)/OVERVIEW.md b/Bomberman (U)/OVERVIEW.md new file mode 100644 index 0000000..eb82dd0 --- /dev/null +++ b/Bomberman (U)/OVERVIEW.md @@ -0,0 +1,335 @@ +# Bomberman (U) — Game Flow from Power-On + +This document describes the execution flow of the disassembled Bomberman (U) PRG bank (16 KB, mapped at CPU **$C000–$FFFF**), starting from power-on. It is based entirely on `copilot/main.s` in the repository. + +--- + +## 1. ROM and Memory Layout + +| Property | Value | +|----------|-------| +| Format | iNES / NES 2.0 | +| PRG | 1 × 16 KB (mapped at CPU $C000–$FFFF) | +| CHR | 1 × 8 KB | +| Mirroring | Vertical (per header byte $01) | +| PRG bank start | CPU $C000 | +| Source file | `copilot/main.s` (8,070 lines, ~614 KB) | +| Output | `reconstructed_bomberman.nes` (24,592 bytes) | + +### Interrupt vectors (CPU $FFFA–$FFFF) + +| Vector | Address | Handler | +|--------|---------|---------| +| NMI | $C01A | `NmiHandler` | +| RESET | $C000 | `Reset` | +| IRQ / BRK | $FFF9 | `IrqHandler` (just `rti` — unused) | + +--- + +## 2. Build Status + +`make` in `copilot/` assembles and links successfully, producing `reconstructed_bomberman.nes` (24,592 bytes). + +**Verification result:** The reconstructed ROM is **byte-identical** to `bomberman.nes` — headers, CHR, and all 16,384 PRG bytes match exactly. + +### Naming fixes applied + +| Change | Location | Reason | +|--------|----------|--------| +| `RandomState0` kept at `$54`; added `RandomStateAlt = $E4` | `locals.inc` | Zero-page reuse: `$54` is the random-state byte used by most code; `$E4` is a distinct byte decremented at CPU `$E71B` | +| `dec RandomState0` → `dec RandomStateAlt` | `main.s:6972` | The original ROM has `dec $E4` at CPU `$E71B`, not `dec $54` | +| `ControllerState` → `ControllerState1` | `main.s` (16 refs) | Clarifies this is controller port 1; added `ControllerState2 = $13` for port 2 | +| `Main_HandleControl_C368` → `MainGameLoop` | `main.s` (3 refs) | Main per-frame game loop entry point | +| `Gameplay_HandleControl_C79D` → `GameplayUpdate` | `main.s` (4 refs) | Gameplay object dispatcher/update | +| `Sound_HandleControl_E65F` → `SoundUpdate` | `main.s` (3 refs) | Sound engine update called from NMI | + +--- + +## 3. Reset — CPU $FFFC → $C000 + +**`Reset`** ($C000) + +On power-on or reset: + +1. `sei` — disable maskable interrupts. +2. `lda #$00 / sta PPUMASK / sta PPUCTRL` — disable PPU rendering and NMI. +3. `cld` — clear decimal mode. +4. `ldx #$FF / txs` — initialize stack pointer to $FF. +5. **Wait for two startup VBlanks** — `WaitForFirstStartupVBlank` ($C00D) and `WaitForSecondStartupVBlank` ($C012) each poll `PPUSTATUS` ($2002) for the VBlank bit. +6. `jmp InitializeSystemAndRunMainLoop` ($C30C) — transfer control to the system initializer. + +--- + +## 4. System Initialization — `InitializeSystemAndRunMainLoop` ($C30C) + +This is the main entry point after reset: + +1. **Clear RAM** — writes $00 to zero page and a range of RAM via an indirect pointer at $E0/$E1 (loops through $00–$FF pages). +2. `jsr InitializeVideoSystem` ($C1F2) — disables rendering, clears shadow OAM, uploads the system palette, enables NMI. +3. `jsr InitializeApu` ($E642) — silences all APU channels, resets sound delay/state variables. +4. Sets up the sound dispatch index and writes zero to sound state variables ($E0–$E3). +5. Sets stack pointer to $FF, enables APU ($4015 = $0F). +6. `jsr ComposeStatusScreen` ($DE83) — draws the initial status/title screen. +7. `jsr EnableNmiInPpuControl` ($C2B0) — enables NMI via PPUCTRL shadow. +8. Sets `GameplayActive`-style flag $72 = $01. +9. Enters the main loop at `Main_HandleControl_C368` ($C368). + +--- + +## 5. NMI / Frame Heartbeat — `NmiHandler` ($C01A) + +The NMI fires once per frame and is the central real-time driver: + +1. **Save registers** (A, X, Y on stack). +2. Set `FrameSyncFlag` ($0B) = $00. +3. Set OAM address to $00. +4. **Sprite DMA path** — if $60 is zero, write OAM entry $0700–$0703 (sprite #0 at Y=$F8) and trigger OAMDMA ($4014 = $07). +5. **VRAM transfer path** — if $14 ≠ $15, transfer VRAM data from a table at $0600–$0607, indexing into pointer data at $D9C6–$D9C9. Handles both write and read packet types. +6. **Screen state / NMI work pending** — based on $72 and $60, transfers various VRAM data blocks (title screen, gameplay screen, etc.) using `SetPpuAddress` ($C196). +7. **PPU status / audio** — reads PPUSTATUS, commits PPU state and scroll via `CommitPpuStateAndScroll` ($C296), increments a frame counter at $33, handles audio channel timing at $69/$6A. +8. `jsr Ppu_WriteZp10_C19D` ($C19D) — reads and debounces both controller ports, stores results in `ControllerState` ($12) and $13. +9. `jsr Gameplay_ReadZpB2_E4C7` ($E4C7) — gameplay input handling. +10. `jsr Sound_HandleControl_E65F` ($E65F) — sound engine update. +11. **DMC control** — if $38 and $59 are zero, starts DMC playback ($4010 = $0E, DMC address $C000, length $FF, enable channels). +12. **PPU scroll wait** — if $60 is set, waits for VBlank (polls PPUSTATUS bit 6), then applies scroll from $0E/$0F. +13. Toggles $DB with EOR #$05 (frame parity / flip-flop flag). +14. **Restore registers, `rti`.** + +### Controller reading (`Ppu_ReadControllerAndReturnA_C1BF` / $C1BF) +- Strobes JOY1 ($4016) with $01 then $00. +- Reads 8 bits per controller, shifting into X. +- `Ppu_HandleControl_C1EB` masks to the low 2 bits ($03) and increments X if non-zero (button press detection). +- Port 1 result → `ControllerState` ($12); port 2 result → $13. + +--- + +## 6. Main Loop + +The main loop starts at **`Main_HandleControl_C368`** ($C368): + +``` +Main_HandleControl_C368 ($C368): + wait until ControllerState ($12) is nonzero (button pressed) + └─ branch on SELECT ($20) to toggle $5F + └─ decrement sub-delay $71 / main delay $70 + └─ when delays expire, increment $59 (game mode / screen state) +``` + +Based on `$59` and `$5F`, the loop dispatches to: +- `RunMenuSelectionScreen` ($DA8E) — title/menu screen +- Gameplay initialization paths ($C3B6–$C5FF) — sets up object positions, stage, sound +- `Main_WriteStageCounter_C613` ($C613) — stage counter display + +The core per-frame gameplay dispatch uses a **state table** at `MainStateDispatchTable` ($C75D–$C79C), which maps state indices to handler sub-indices ($00–$27). Gameplay object processing walks arrays at $03E6 (state), $0436, $0486 (X/Y position), $04D6, $0526 (timer/flags), with up to 80 ($4F) object slots. + +Key main-loop subroutines: +- `Main_ReadGameMode_C60B` ($C60B) — waits for $B5 (frame delay) to reach zero. +- `Main_WriteStageCounter_C613` ($C613) — updates stage counter, handles START button to begin gameplay. +- `Gameplay_HandleControl_C79D` ($C79D) — main gameplay object dispatcher (80 slots). +- `Gameplay_Dispatch_C7A4` / `Gameplay_Dispatch_C835` — object state dispatch. +- `Stage_WriteObjectWorkX_D8FC` ($D8FC) — object work initialization. + +--- + +## 7. Gameplay Systems + +### Object management +- Up to 80 object slots ($00–$4F), tracked by state at $03E6,X. +- Position arrays: $0436,X / $0486,X (X/Y), $04D6,X (state/flags), $0526,X (timer/direction). +- `Stage_WriteObjectWorkX_D8FC` ($D8FC) initializes object work fields. +- Objects are processed in a loop with `dex`/index retreat patterns ($C756, $C8A6). + +### Bomb / explosion / player mechanics +Referenced throughout the gameplay code: +- `Gameplay_HandleControl_C96A`, `Gameplay_HandleControl_CA1B`, `Gameplay_HandleControl_C79D` — player/bomb input and state. +- `Object_WriteStageProgress_CFB0` ($CFB0) — stage progress tracking. +- `Frame_ReadObjectIndex_CE5B` ($CE5B), `Frame_ReadObjectX_CDD4` ($CDD4) — frame-based object reading. + +### Stage system +- `Stage_ReadZp58_D69A` ($D69A) — stage data lookup. +- Stage counter display via `Main_WriteStageCounter_C613`. + +--- + +## 8. Audio / Sound Engine + +### `InitializeApu` ($E642) +- Clears DMC direct register ($4011), sound delays $E1–$E3. +- Silences pulse 1, pulse 2, triangle, noise channel controls ($4000, $4004, $4008, $400C). +- Enables APU channels ($4015 = $0F). + +### `Sound_HandleControl_E65F` ($E65F) +- Loops over 3 sound channels (X = 2 down to 0). +- Decrements per-channel delay at $E1,X. +- When delay expires, reads sound command state from $DF: + - If $DF < 0 → read sound RAM pointer ($E6BC table). + - If $DF == 3 → write sound command state. + - Otherwise → return or handle based on $E0 (indirect pointer). +- Calls into sound dispatch via `SoundDispatchAddressTable` ($E6AD–$E6C8). + +### Sound dispatch table (`SoundDispatchAddressTable`, $E6AD) +A jump table of 14 sound handler addresses (e.g., $E641, $E6C8, $E6CC, $E6DE, $E727, $E766, $E792, $E7AB, etc.), each handling a specific sound effect or music channel. + +### Channel-specific sound paths +- `Sound_UpdateAudioChannelPath_E6CF` ($E6CF) — noise channel ($400E–$400F). +- `Sound_UpdateAudioChannelPath_E6DF` ($E6DF) — pulse 2 channel: sets sweep ($4005 = $84), timer lo/hi ($4006/$4007), noise period/length. +- `Sound_UpdateAudioChannelPath_E70B` ($E70B) — decrements `RandomState0`, reconfigures pulse 2 when expired. + +### Sound state (zero page) +| Address | Symbol | Use | +|---------|--------|-----| +| $DF | SoundCommandState | Sound command / state | +| $E0 | SoundDispatchIndex / IndirectPtrLo | Sound dispatch pointer low | +| $E1–$E3 | SoundDelay0–2 | Per-channel sound delays | + +--- + +## 9. PPU / Rendering + +### `InitializeVideoSystem` ($C1F2) +- `jsr DisableRendering` ($C257) — wait for VBlank, turn off PPUMASK. +- `jsr Ppu_HandleControl_C2B9` ($C2B9) — apply PPUCTRL shadow with NMI disabled. +- Set PPUCTRL shadow ($0C) = $10, clear $0E/$0F/$14/$15. +- `jsr HideAllSprites` ($C268) — fills $0700–$07FF with $F8 (offscreen) in 32-byte strides. +- `jsr UploadSystemPalette` ($C2C3) — uploads 32 bytes of palette data from `SystemPaletteData` ($C2E7) to $3F00–$3F1F. +- `jsr EnableNmiInPpuControl` ($C2B0) — enable NMI. + +### `CommitPpuStateAndScroll` ($C296) +- Writes `PpuMaskShadow` ($0D) to PPUMASK ($2001). +- Sets PPU address to $0000, writes $00 to $2005 twice (scroll). +- Writes `PpuCtrlShadow` ($0C) to PPUCTRL ($2000). + +### Palette data (`SystemPaletteData`, $C2E7) +32 bytes of NES palette colors starting at $3F00. + +--- + +## 10. Zero-Page / RAM Symbols + +| Address | Symbol | Use | +|---------|--------|-----| +| $0B | FrameSyncFlag | NMI frame sync | +| $0C–$0D | PpuCtrlShadow / PpuMaskShadow | PPU register shadows | +| $12 | ControllerState1 | Controller port 1 state | +| $13 | ControllerState2 | Controller port 2 state | +| $14–$15 | VramReadOffset / VramWriteLimit | NMI VRAM-transfer window (index + limit) | +| $16 | NmiPathSelector | Selects NMI sub-path (sprite DMA vs VRAM data) | +| $1F–$20 | (unnamed) | Object X/Y temp | +| $28–$2C | (unnamed) | Object spawn parameters | +| $29–$2B | (unnamed) | Object coordinates | +| $33 | FrameCounter | Frame tick counter | +| $34 | IndirectPtrHi | Pointer high (used by sound/object) | +| $36 | (unnamed) | Object X temp | +| $38 | (unnamed) | DMC / audio flag | +| $39 | (unnamed) | Stage counter flag | +| $3C–$3F | (unnamed) | Delay counters | +| $54–$57 | RandomState0–3 | PRNG state (4-byte RNG) | +| $59 | GameMode | Game mode / screen state | +| $5A | (unnamed) | Stage / level | +| $5B | (unnamed) | Object X bound | +| $5C–$5E | (unnamed) | Object state flags | +| $5F | (unnamed) | Menu toggle | +| $60 | NmiWorkPending | NMI VRAM-transfer work pending flag | +| $61–$6A | (unnamed) | Object init / temp | +| $68–$70 | MainDelay / SubDelay | Main loop delay counters | +| $72 | ScreenState | Screen state flag | +| $73 | ObjectXLimit | Object X limit | +| $76–$7A | (unnamed) | Object position/state | +| $7D–$7E | (unnamed) | Bomb / object state | +| $78–$7C | (unnamed) | Player / bomb coords | +| $79–$7A | (unnamed) | Player position | +| $93 | StageCounter | Stage counter | +| $94 | (unnamed) | Audio / object | +| $9C–$9F | ObjectWork0–3 | Object work fields | +| $A0–$A7 | (unnamed) | Object work / bonus | +| $A4 | BonusTimer | Bonus timer | +| $AC–$AE | (unnamed) | Audio data pointers | +| $B0 | GameModeCounter | Game mode counter | +| $B1 | ObjectType | Object type | +| $B2 | (unnamed) | Audio flag | +| $B5 | FrameDelay | Frame delay | +| $DB | FrameParity | Frame parity toggle (NMI toggles each frame) | +| $DF | SoundCommandState | Sound command state | +| $E0–$E3 | SoundDispatchIndex / SoundDelay0–2 | Sound dispatch & delays | +| $E4 | RandomStateAlt | Alternate random-state byte (dec'd at CPU $E71B; distinct from RandomState0 at $54) | + +--- + +## 11. Data Tables + +| Label | Address | Description | +|-------|---------|-------------| +| `InesHeader` | $C000–$C00F | iNES header (embedded in source) | +| `SystemPaletteData` | $C2E7–$C306 | 32-byte palette for $3F00 | +| `MainStateDispatchTable` | $C75D–$C79C | 64-byte gameplay state dispatch table | +| `SoundDispatchAddressTable` | $E6AD–$E6C8 | 14-entry sound handler jump table | +| `PatternTableGraphics` | $C010+ (CHR) | CHR pattern table data | + +--- + +## 12. Summary of Execution Flow + +``` +Power On / Reset + │ + ▼ +Reset ($C000) ───────────────────────────────────────┐ + │ sei, disable PPU, cld, stack=$FF │ + │ wait 2× VBlank │ + ▼ │ +jmp InitializeSystemAndRunMainLoop ($C30C) │ + │ │ + ├─ clear RAM ($0000–$07FF) │ + ├─ InitializeVideoSystem ($C1F2) │ + │ ├─ DisableRendering │ + │ ├─ HideAllSprites │ + │ ├─ UploadSystemPalette ($3F00–$3F1F) │ + │ └─ EnableNmiInPpuControl │ + ├─ InitializeApu ($E642) — silence all channels │ + ├─ ComposeStatusScreen ($DE83) │ + ├─ EnableNmiInPpuControl │ + └─ MainGameLoop ($C368) ◄─────────────┘ + │ +MainGameLoop ($C368) ─────────────────────────────────┤ + │ │ + ├─ wait for controller button press │ + ├─ handle SELECT / delay counters ($70,$71) │ + ├─ increment game mode ($59) │ + ├─ RunMenuSelectionScreen ($DA8E) [title] │ + ├─ gameplay init ($C3B6–$C5FF) │ + ├─ GameplayUpdate ($C79D) │ + │ │ 80 object slots ($03E6 state array) │ + │ ├─ object position ($0436/$0486) │ + │ ├─ object timer ($0526) │ + │ └─ object dispatch via StateDispatchTable │ + └─ eventually → back to MainGameLoop │ + │ +NMI ($C01A) [every frame] │ + │ │ + ├─ OAM setup + DMA ($4014) │ + ├─ VRAM transfer from $0600 table │ + ├─ screen state transfer ($D9C6–$D9C9 pointers) │ + ├─ controller read & debounce ($C1BF) │ + ├─ Gameplay_ReadZpB2_E4C7 ($E4C7) │ + ├─ SoundUpdate ($E65F) │ + ├─ DMC start ($4010–$4013) │ + ├─ PPU state & scroll commit ($C296) │ + ├─ frame parity toggle ($DB) │ + └─ rti │ + │ +Sound Engine ($E65F) [from NMI] │ + ├─ per-channel delay countdown ($E1–$E3) │ + ├─ SoundDispatchAddressTable ($E6AD) │ + ├─ pulse 2, noise, DMC channel control │ + └─ RandomStateAlt ($E4) decrement │ +``` + +--- + +## 13. Notes + +- **Build is byte-identical:** The apparent one-byte difference (`dec $E4` vs `dec $54` at CPU $E71B) was resolved by recognizing zero-page reuse — `$54` is `RandomState0` used by most code, while `$E4` is a distinct byte (`RandomStateAlt`) decremented at that one location. Both are now separately named in `locals.inc`. +- The source uses a "ROM $00XXXX" file-offset annotation scheme on every instruction, enabling direct comparison with the binary. +- Code is organized as reachable routines traced from the NMI/RESET/IRQ control-flow graph; unreachable bytes are classified as explicit data regions. +- The disassembly is a single file (`main.s`) with embedded iNES header and CHR data segments. +- Vectors confirm NMI at $C01A and RESET at $C000, matching the reset handler location. \ No newline at end of file diff --git a/Bomberman (U)/copilot/Makefile b/Bomberman (U)/copilot/Makefile index 2721d3d..7b0587a 100644 --- a/Bomberman (U)/copilot/Makefile +++ b/Bomberman (U)/copilot/Makefile @@ -1,19 +1,25 @@ CA65 ?= ca65 LD65 ?= ld65 -all: reconstructed_bomberman.nes +all: reconstructed.nes verify -main.o: main.s symbols.inc locals.inc - $(CA65) -g -o $@ main.s +prg.o: prg.s symbols.inc locals.inc + $(CA65) -g -o $@ $< -reconstructed_bomberman.nes: main.o linker.cfg - $(LD65) -C linker.cfg -o $@ main.o +header.o: header.s + $(CA65) -g -o $@ $< -verify: reconstructed_bomberman.nes - @test "$$(wc -c < reconstructed_bomberman.nes)" -eq 24592 - cmp -l original_bomberman.nes reconstructed_bomberman.nes +chr.o: chr.s + $(CA65) -g -o $@ $< + +reconstructed.nes: header.o prg.o chr.o linker.cfg + $(LD65) -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ header.o prg.o chr.o + +verify: reconstructed.nes + cmp reconstructed.nes rom.nes + @echo "Byte-identical ROM verified." clean: - rm -f main.o reconstructed_bomberman.nes + rm -f *.o reconstructed.nes reconstructed.map reconstructed.lbl -.PHONY: all verify clean +.PHONY: all verify clean \ No newline at end of file diff --git a/Bomberman (U)/copilot/chr.bin b/Bomberman (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..543c3bde2b0c919e66856c016dd4040539da6c7b GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/Bomberman (U)/copilot/chr.o b/Bomberman (U)/copilot/chr.o new file mode 100644 index 0000000000000000000000000000000000000000..6ad76dd431e5684cbcb832ddcc87abe99626532c GIT binary patch literal 53833 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 literal 0 HcmV?d00001 diff --git a/Bomberman (U)/copilot/header.s b/Bomberman (U)/copilot/header.s new file mode 100644 index 0000000..5a67ad9 --- /dev/null +++ b/Bomberman (U)/copilot/header.s @@ -0,0 +1,12 @@ +; Bomberman NES - Phase 3 semantic refinement +; Based on the user-validated Phase 2 recursive trace from NMI, RESET, and IRQ/BRK. +; Reachable official 6502 opcodes are emitted as instructions. +; Unreachable bytes are classified as explicit data regions. + +.setcpu "6502" +.include "symbols.inc" +.include "locals.inc" + +.segment "HEADER" +InesHeader: + .byte $4E, $45, $53, $1A, $01, $01, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; ROM $000000: 4E 45 53 1A 01 01 01 00 00 00 00 00 00 00 00 00 diff --git a/Bomberman (U)/copilot/linker.cfg b/Bomberman (U)/copilot/linker.cfg index 818df82..137e696 100644 --- a/Bomberman (U)/copilot/linker.cfg +++ b/Bomberman (U)/copilot/linker.cfg @@ -1,10 +1,10 @@ MEMORY { - HEADER: start = $0000, size = $0010, file = %O, fill = yes; - PRG: start = $C000, size = $4000, file = %O, fill = yes; - CHR: start = $0000, size = $2000, file = %O, fill = yes; + HEADER: start = $0000, size = $0010, fill = yes; + PRG: start = $0010, size = $4000, fill = yes; + CHR: start = $4010, size = $2000, fill = yes; } SEGMENTS { - HEADER: load = HEADER, type = ro; - PRG: load = PRG, type = ro; - CHR: load = CHR, type = ro; -} + HEADER: load = HEADER, type = ro; + PRG: load = PRG, type = ro; + CHR: load = CHR, type = ro; +} \ No newline at end of file diff --git a/Bomberman (U)/copilot/locals.inc b/Bomberman (U)/copilot/locals.inc index 0fc2b45..ab10886 100644 --- a/Bomberman (U)/copilot/locals.inc +++ b/Bomberman (U)/copilot/locals.inc @@ -9,8 +9,18 @@ FrameSyncFlag = $0B PpuCtrlShadow = $0C PpuMaskShadow = $0D -; Controller sample consulted by main-loop and menu paths. -ControllerState = $12 +; Controller samples consulted by main-loop and menu paths. +ControllerState1 = $12 +ControllerState2 = $13 + +; NMI VRAM-transfer window: $14 indexes into the $0600 transfer table, +; $15 is the upper limit compared against $14 to decide whether to keep +; transferring or switch to the screen-state path. +VramReadOffset = $14 +VramWriteLimit = $15 + +; Selects which NMI sub-path is taken ($60=0 → sprite DMA; $60≠0 → VRAM data). +NmiPathSelector = $16 ; Four-byte pseudo-random generator state used by AdvanceRandomState. RandomState0 = $54 @@ -18,13 +28,68 @@ RandomState1 = $55 RandomState2 = $56 RandomState3 = $57 +; Alternate random-state byte at $E4 (decremented at CPU $E71B; distinct from +; RandomState0 which lives at $54 — zero-page is reused across subsystems). +RandomStateAlt = $E4 + +; Main loop delay counters. +MainDelay = $70 +SubDelay = $71 + +; Screen / mode state. +ScreenState = $72 +GameMode = $59 + +; NMI work-pending flag: nonzero means the NMI should perform VRAM transfers. +NmiWorkPending = $60 + +; Object coordinate / state temporaries used by gameplay object processing. +ObjectScreenX = $1F +ObjectScreenY = $20 +ObjectXLimit = $73 +ObjectSpawnParam = $28 +ObjectSpawnY = $29 +ObjectSpawnX = $2A +ObjectSpawnWidth = $2B +ObjectSpawnHeight = $2C +ObjectStateFlags = $5C +ObjectStateTimer = $5D +ObjectStateExtra = $5E + +; Frame counters and stage counters. +FrameCounter = $33 +StageCounter = $93 + +; Object work fields and bonus timer. +ObjectWork0 = $9C +ObjectWork1 = $9D +ObjectWork2 = $9E +ObjectWork3 = $9F +BonusTimer = $A4 + +; Game mode counter and object type. +GameModeCounter = $B0 +ObjectType = $B1 +FrameDelay = $B5 + +; Frame parity toggle (NMI toggles this each frame). +FrameParity = $DB + ; General-purpose indirect pointer used by RAM clearing and transfer loops. +; Aliased with sound dispatcher state below (zero-page is reused). IndirectPtrLo = $E0 IndirectPtrHi = $E1 ; Sound dispatcher and channel-delay state observed in the $E642 sound engine. +; $E0/$E1 double as IndirectPtrLo/IndirectPtrHi; $E2/$E3 are dedicated delays. SoundCommandState = $DF -SoundDispatchIndex = $E0 -SoundDelay0 = $E1 +SoundDispatchIndex = $E0 ; aliases IndirectPtrLo +SoundDelay0 = $E1 ; aliases IndirectPtrHi SoundDelay1 = $E2 SoundDelay2 = $E3 + +; Audio data pointers used by the sound engine. +AudioPtrLo = $AC +AudioPtrHi = $AD +AudioArgLo = $AE +AudioArgHi = $AF \ No newline at end of file diff --git a/Bomberman (U)/copilot/main.s b/Bomberman (U)/copilot/main.s index b7e2a5f..0649991 100644 --- a/Bomberman (U)/copilot/main.s +++ b/Bomberman (U)/copilot/main.s @@ -295,7 +295,7 @@ Nmi_UpdateAudioChannelPath_C13E: sta $69 ; ROM $00014E: 85 69 jsr Ppu_WriteZp10_C19D ; ROM $000150: 20 9D C1 jsr Gameplay_ReadZpB2_E4C7 ; ROM $000153: 20 C7 E4 - jsr Sound_HandleControl_E65F ; ROM $000156: 20 5F E6 + jsr SoundUpdate ; ROM $000156: 20 5F E6 lda $38 ; ROM $000159: A5 38 beq Nmi_ReadNmiWorkPending_C16E ; ROM $00015B: F0 21 lda $59 ; ROM $00015D: A5 59 @@ -385,12 +385,12 @@ SetPpuAddress: ; Confidence: High for reachability and encoding; semantic role provisional. Ppu_WriteZp10_C19D: jsr Ppu_ReadControllerAndReturnA_C1BF ; ROM $0001AD: 20 BF C1 - lda ControllerState ; ROM $0001B0: A5 12 + lda ControllerState1 ; ROM $0001B0: A5 12 sta $10 ; ROM $0001B2: 85 10 lda $13 ; ROM $0001B4: A5 13 sta $11 ; ROM $0001B6: 85 11 jsr Ppu_ReadControllerAndReturnA_C1BF ; ROM $0001B8: 20 BF C1 - lda ControllerState ; ROM $0001BB: A5 12 + lda ControllerState1 ; ROM $0001BB: A5 12 cmp $10 ; ROM $0001BD: C5 10 bne Ppu_WriteZp13_C1B8 ; ROM $0001BF: D0 07 lda $13 ; ROM $0001C1: A5 13 @@ -406,7 +406,7 @@ Ppu_WriteZp10_C19D: ; Confidence: High for reachability and encoding; semantic role provisional. Ppu_WriteZp13_C1B8: lda #$00 ; ROM $0001C8: A9 00 - sta ControllerState ; ROM $0001CA: 85 12 + sta ControllerState1 ; ROM $0001CA: 85 12 sta $13 ; ROM $0001CC: 85 13 rts ; ROM $0001CE: 60 ; Routine: Ppu_ReadControllerAndReturnA_C1BF @@ -437,7 +437,7 @@ Ppu_ReadControllerPath_C1CC: lda JOY1 ; ROM $0001DF: AD 16 40 jsr Ppu_HandleControl_C1EB ; ROM $0001E2: 20 EB C1 bne Ppu_ReadControllerPath_C1CC ; ROM $0001E5: D0 F5 - stx ControllerState ; ROM $0001E7: 86 12 + stx ControllerState1 ; ROM $0001E7: 86 12 ldx #$00 ; ROM $0001E9: A2 00 ldy #$08 ; ROM $0001EB: A0 08 ; Routine: Ppu_ReadControllerPath_C1DD @@ -767,7 +767,7 @@ SystemPaletteData: ; Side effects: Registers, flags, memory, and hardware registers written below. ; Confidence: High for reachability and encoding; semantic role provisional. WaitForFrameBoundary: - lda ControllerState ; ROM $000317: A5 12 + lda ControllerState1 ; ROM $000317: A5 12 bne WaitForFrameBoundary ; ROM $000319: D0 FC rts ; ROM $00031B: 60 ; Routine: InitializeSystemAndRunMainLoop @@ -857,16 +857,16 @@ Main_UpdateAudioChannelPath_C34A: jsr EnableNmiInPpuControl ; ROM $000371: 20 B0 C2 lda #$01 ; ROM $000374: A9 01 sta $72 ; ROM $000376: 85 72 -; Routine: Main_HandleControl_C368 +; Routine: MainGameLoop ; Global: Reachable code entry at CPU $C368 traced from the interrupt-root control-flow graph. ; Local: Performs the instruction sequence below; semantic purpose remains provisional. ; Parameters: Register and memory inputs are caller-dependent. ; Returns: Determined by the terminating RTS, RTI, jump, or branch path. ; Side effects: Registers, flags, memory, and hardware registers written below. ; Confidence: High for reachability and encoding; semantic role provisional. -Main_HandleControl_C368: - lda ControllerState ; ROM $000378: A5 12 - bne Main_HandleControl_C368 ; ROM $00037A: D0 FC +MainGameLoop: + lda ControllerState1 ; ROM $000378: A5 12 + bne MainGameLoop ; ROM $00037A: D0 FC ; Routine: Main_WriteMainDelay_C36C ; Global: Reachable code entry at CPU $C36C traced from the interrupt-root control-flow graph. ; Local: Performs the instruction sequence below; semantic purpose remains provisional. @@ -886,10 +886,10 @@ Main_WriteMainDelay_C36C: ; Confidence: High for reachability and encoding; semantic role provisional. Main_ReadOptionState_C370: jsr WaitForNmiFrameHandoff ; ROM $000380: 20 FB CB - lda ControllerState ; ROM $000383: A5 12 + lda ControllerState1 ; ROM $000383: A5 12 and #$10 ; ROM $000385: 29 10 bne Main_ReadGameState_C398 ; ROM $000387: D0 1F - lda ControllerState ; ROM $000389: A5 12 + lda ControllerState1 ; ROM $000389: A5 12 and #$20 ; ROM $00038B: 29 20 beq Main_DecrementSubDelay_C38B ; ROM $00038D: F0 0C lda $5F ; ROM $00038F: A5 5F @@ -1077,7 +1077,7 @@ Main_ReadZp5D_C44F: lda $33 ; ROM $000482: A5 33 and #$03 ; ROM $000484: 29 03 bne Main_ReadZp5D_C44F ; ROM $000486: D0 D7 - jsr Gameplay_HandleControl_C79D ; ROM $000488: 20 9D C7 + jsr GameplayUpdate ; ROM $000488: 20 9D C7 jsr Main_HandleControl_C66C ; ROM $00048B: 20 6C C6 jmp Main_ReadZp5D_C44F ; ROM $00048E: 4C 4F C4 ; Routine: Main_ReadGameState_C481 @@ -1123,7 +1123,7 @@ Main_WriteNmiWorkPending_C49F: ; Side effects: Registers, flags, memory, and hardware registers written below. ; Confidence: High for reachability and encoding; semantic role provisional. Main_ReadGameMode_C4AA: - lda ControllerState ; ROM $0004BA: A5 12 + lda ControllerState1 ; ROM $0004BA: A5 12 and #$10 ; ROM $0004BC: 29 10 bne Main_WriteGameMode_C4B4 ; ROM $0004BE: D0 04 lda $B5 ; ROM $0004C0: A5 B5 @@ -1146,7 +1146,7 @@ Main_WriteGameMode_C4B4: ; Side effects: Registers, flags, memory, and hardware registers written below. ; Confidence: High for reachability and encoding; semantic role provisional. Main_HandleControl_C4B8: - lda ControllerState ; ROM $0004C8: A5 12 + lda ControllerState1 ; ROM $0004C8: A5 12 beq Main_HandleControl_C4B8 ; ROM $0004CA: F0 FC jmp Main_UpdateAudioChannelPath_C34A ; ROM $0004CC: 4C 4A C3 ; Routine: Main_ReadGameState_C4BF @@ -1278,7 +1278,7 @@ Main_ReadZp93_C52E: lda $33 ; ROM $00055D: A5 33 and #$01 ; ROM $00055F: 29 01 bne Main_ReadZp93_C52E ; ROM $000561: D0 DB - jsr Gameplay_HandleControl_C79D ; ROM $000563: 20 9D C7 + jsr GameplayUpdate ; ROM $000563: 20 9D C7 jsr Main_HandleControl_C66C ; ROM $000566: 20 6C C6 jmp Main_ReadZp93_C52E ; ROM $000569: 4C 2E C5 ; Routine: Main_WriteGameMode_C55C @@ -1382,7 +1382,7 @@ Main_ReadGameMode_C5BF: ; Side effects: Registers, flags, memory, and hardware registers written below. ; Confidence: High for reachability and encoding; semantic role provisional. Main_WriteZp58_C5C3: - lda ControllerState ; ROM $0005D3: A5 12 + lda ControllerState1 ; ROM $0005D3: A5 12 beq Main_WriteZp58_C5C3 ; ROM $0005D5: F0 FC lda #$01 ; ROM $0005D7: A9 01 sta $58 ; ROM $0005D9: 85 58 @@ -1460,7 +1460,7 @@ Main_WriteStageCounter_C613: jsr WaitForNmiFrameHandoff ; ROM $000623: 20 FB CB lda #$01 ; ROM $000626: A9 01 sta $39 ; ROM $000628: 85 39 - lda ControllerState ; ROM $00062A: A5 12 + lda ControllerState1 ; ROM $00062A: A5 12 and #$10 ; ROM $00062C: 29 10 beq Main_ReturnToCaller_C643 ; ROM $00062E: F0 23 lda $59 ; ROM $000630: A5 59 @@ -1478,7 +1478,7 @@ Main_WriteStageCounter_C613: ; Side effects: Registers, flags, memory, and hardware registers written below. ; Confidence: High for reachability and encoding; semantic role provisional. Main_WriteSoundCommandState_C62F: - lda ControllerState ; ROM $00063F: A5 12 + lda ControllerState1 ; ROM $00063F: A5 12 and #$10 ; ROM $000641: 29 10 beq Main_WriteSoundCommandState_C62F ; ROM $000643: F0 FA lda #$06 ; ROM $000645: A9 06 @@ -1774,14 +1774,14 @@ MainStateDispatchTable: .byte $0F, $10, $11, $12, $13, $14, $15, $16, $13, $14, $11, $12, $0F, $10, $00, $00 ; ROM $00077D: 0F 10 11 12 13 14 15 16 13 14 11 12 0F 10 00 00 .byte $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $1F, $20, $21, $22, $23, $24, $25, $26 ; ROM $00078D: 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 .byte $1F, $20, $21, $22, $1B, $1C, $1D, $1E, $17, $18, $19, $1A, $00, $00, $00, $00 ; ROM $00079D: 1F 20 21 22 1B 1C 1D 1E 17 18 19 1A 00 00 00 00 -; Routine: Gameplay_HandleControl_C79D +; Routine: GameplayUpdate ; Global: Reachable code entry at CPU $C79D traced from the interrupt-root control-flow graph. ; Local: Performs the instruction sequence below; semantic purpose remains provisional. ; Parameters: Register and memory inputs are caller-dependent. ; Returns: Determined by the terminating RTS, RTI, jump, or branch path. ; Side effects: Registers, flags, memory, and hardware registers written below. ; Confidence: High for reachability and encoding; semantic role provisional. -Gameplay_HandleControl_C79D: +GameplayUpdate: ldx #$4F ; ROM $0007AD: A2 4F ; Routine: Gameplay_ReadRam03E6_C79F ; Global: Reachable code entry at CPU $C79F traced from the interrupt-root control-flow graph. @@ -3804,7 +3804,7 @@ Object_ReturnToCaller_CFA3: ; Side effects: Registers, flags, memory, and hardware registers written below. ; Confidence: High for reachability and encoding; semantic role provisional. Object_MergeZp13_CFA4: - lda ControllerState ; ROM $000FB4: A5 12 + lda ControllerState1 ; ROM $000FB4: A5 12 ora $13 ; ROM $000FB6: 05 13 rts ; ROM $000FB8: 60 ; Routine: Object_IncrementZpAC_CFA9 @@ -4785,7 +4785,7 @@ Menu_TransferVramDataPath_DAB5: ; Confidence: High for reachability and encoding; semantic role provisional. Menu_TransferVramDataPath_DAC9: jsr WaitForVBlankTransition ; ROM $001AD9: 20 8B C2 - lda ControllerState ; ROM $001ADC: A5 12 + lda ControllerState1 ; ROM $001ADC: A5 12 and #$8F ; ROM $001ADE: 29 8F bne Menu_UpdateAudioChannelPath_DAF8 ; ROM $001AE0: D0 26 dex ; ROM $001AE2: CA @@ -4807,7 +4807,7 @@ Menu_TransferVramDataPath_DAC9: ; Confidence: High for reachability and encoding; semantic role provisional. Menu_CallHelper_DAE9: jsr WaitForVBlankTransition ; ROM $001AF9: 20 8B C2 - lda ControllerState ; ROM $001AFC: A5 12 + lda ControllerState1 ; ROM $001AFC: A5 12 and #$8F ; ROM $001AFE: 29 8F bne Menu_UpdateAudioChannelPath_DAF8 ; ROM $001B00: D0 06 dex ; ROM $001B02: CA @@ -6804,14 +6804,14 @@ InitializeApu: lda #$0F ; ROM $002669: A9 0F sta APUSTATUS ; ROM $00266B: 8D 15 40 rts ; ROM $00266E: 60 -; Routine: Sound_HandleControl_E65F +; Routine: SoundUpdate ; Global: Reachable code entry at CPU $E65F traced from the interrupt-root control-flow graph. ; Local: Performs the instruction sequence below; semantic purpose remains provisional. ; Parameters: Register and memory inputs are caller-dependent. ; Returns: Determined by the terminating RTS, RTI, jump, or branch path. ; Side effects: Registers, flags, memory, and hardware registers written below. ; Confidence: High for reachability and encoding; semantic role provisional. -Sound_HandleControl_E65F: +SoundUpdate: ldx #$02 ; ROM $00266F: A2 02 ; Routine: Sound_ReadSoundDelay0_E661 ; Global: Reachable code entry at CPU $E661 traced from the interrupt-root control-flow graph. @@ -6969,7 +6969,7 @@ Sound_UpdateAudioChannelPath_E6DF: ; Side effects: Registers, flags, memory, and hardware registers written below. ; Confidence: High for reachability and encoding; semantic role provisional. Sound_UpdateAudioChannelPath_E70B: - dec RandomState0 ; ROM $00271B: C6 E4 + dec RandomStateAlt ; ROM $00271B: C6 E4 bne Sound_ReturnToCaller_E727 ; ROM $00271D: D0 18 lda #$DF ; ROM $00271F: A9 DF sta APUPULSE2CTRL ; ROM $002721: 8D 04 40 diff --git a/Bomberman (U)/copilot/prg.o b/Bomberman (U)/copilot/prg.o new file mode 100644 index 0000000000000000000000000000000000000000..4e3cad5c6e7698cf61bd8aea744f9d187966e522 GIT binary patch literal 161659 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 M{K=d-oqqCv07NQaK>z>% literal 0 HcmV?d00001 diff --git a/Bomberman (U)/copilot/prg.s b/Bomberman (U)/copilot/prg.s new file mode 100644 index 0000000..48b384d --- /dev/null +++ b/Bomberman (U)/copilot/prg.s @@ -0,0 +1,7552 @@ +; Bomberman NES - Phase 3 semantic refinement +; Based on the user-validated Phase 2 recursive trace from NMI, RESET, and IRQ/BRK. +; Reachable official 6502 opcodes are emitted as instructions. +; Unreachable bytes are classified as explicit data regions. + +.setcpu "6502" +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.org $C000 + +; Routine: Reset +; Global: Reachable code entry at CPU $C000 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Reset: + sei ; ROM $000010: 78 + lda #$00 ; ROM $000011: A9 00 + sta PPUMASK ; ROM $000013: 8D 01 20 + sta PPUCTRL ; ROM $000016: 8D 00 20 + cld ; ROM $000019: D8 + ldx #$FF ; ROM $00001A: A2 FF + txs ; ROM $00001C: 9A +; Routine: WaitForFirstStartupVBlank +; Global: Reachable code entry at CPU $C00D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +WaitForFirstStartupVBlank: + lda PPUSTATUS ; ROM $00001D: AD 02 20 + bpl WaitForFirstStartupVBlank ; ROM $000020: 10 FB +; Routine: WaitForSecondStartupVBlank +; Global: Reachable code entry at CPU $C012 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +WaitForSecondStartupVBlank: + lda PPUSTATUS ; ROM $000022: AD 02 20 + bpl WaitForSecondStartupVBlank ; ROM $000025: 10 FB + jmp InitializeSystemAndRunMainLoop ; ROM $000027: 4C 0C C3 +; Routine: NmiHandler +; Global: Reachable code entry at CPU $C01A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +NmiHandler: + pha ; ROM $00002A: 48 + txa ; ROM $00002B: 8A + pha ; ROM $00002C: 48 + tya ; ROM $00002D: 98 + pha ; ROM $00002E: 48 + ldx #$00 ; ROM $00002F: A2 00 + stx FrameSyncFlag ; ROM $000031: 86 0B + stx OAMADDR ; ROM $000033: 8E 03 20 + lda $60 ; ROM $000036: A5 60 + beq Nmi_TransferSpriteDmaPath_C03E ; ROM $000038: F0 14 + lda #$19 ; ROM $00003A: A9 19 + sta $0700 ; ROM $00003C: 8D 00 07 + lda #$EC ; ROM $00003F: A9 EC + sta $0701 ; ROM $000041: 8D 01 07 + lda #$00 ; ROM $000044: A9 00 + sta $0702 ; ROM $000046: 8D 02 07 + lda #$F8 ; ROM $000049: A9 F8 + sta $0703 ; ROM $00004B: 8D 03 07 +; Routine: Nmi_TransferSpriteDmaPath_C03E +; Global: Reachable code entry at CPU $C03E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_TransferSpriteDmaPath_C03E: + lda #$07 ; ROM $00004E: A9 07 + sta OAMDMA ; ROM $000050: 8D 14 40 + ldx #$09 ; ROM $000053: A2 09 + stx $16 ; ROM $000055: 86 16 + bne Nmi_ReadZp14_C0B3 ; ROM $000057: D0 6A +; Routine: Nmi_TransferVramDataPath_C049 +; Global: Reachable code entry at CPU $C049 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_TransferVramDataPath_C049: + lda $0602,y ; ROM $000059: B9 02 06 + ora $0600,y ; ROM $00005C: 19 00 06 + pha ; ROM $00005F: 48 + sta PPUADDR ; ROM $000060: 8D 06 20 + ldx $0601,y ; ROM $000063: BE 01 06 + stx PPUADDR ; ROM $000066: 8E 06 20 + ldx $0603,y ; ROM $000069: BE 03 06 + lda $D9C6,x ; ROM $00006C: BD C6 D9 + sta PPUDATA ; ROM $00006F: 8D 07 20 + lda $D9C7,x ; ROM $000072: BD C7 D9 + sta PPUDATA ; ROM $000075: 8D 07 20 + pla ; ROM $000078: 68 + sta PPUADDR ; ROM $000079: 8D 06 20 + lda $0601,y ; ROM $00007C: B9 01 06 + clc ; ROM $00007F: 18 + adc #$20 ; ROM $000080: 69 20 + sta PPUADDR ; ROM $000082: 8D 06 20 + lda $D9C8,x ; ROM $000085: BD C8 D9 + sta PPUDATA ; ROM $000088: 8D 07 20 + lda $D9C9,x ; ROM $00008B: BD C9 D9 + sta PPUDATA ; ROM $00008E: 8D 07 20 + lda #$23 ; ROM $000091: A9 23 + ora $0600,y ; ROM $000093: 19 00 06 + pha ; ROM $000096: 48 + sta PPUADDR ; ROM $000097: 8D 06 20 + lda $0604,y ; ROM $00009A: B9 04 06 + sta PPUADDR ; ROM $00009D: 8D 06 20 + tax ; ROM $0000A0: AA + lda PPUDATA ; ROM $0000A1: AD 07 20 + lda PPUDATA ; ROM $0000A4: AD 07 20 + and $0606,y ; ROM $0000A7: 39 06 06 + ora $0607,y ; ROM $0000AA: 19 07 06 + tay ; ROM $0000AD: A8 + pla ; ROM $0000AE: 68 + sta PPUADDR ; ROM $0000AF: 8D 06 20 + stx PPUADDR ; ROM $0000B2: 8E 06 20 + sty PPUDATA ; ROM $0000B5: 8C 07 20 + lda #$08 ; ROM $0000B8: A9 08 + clc ; ROM $0000BA: 18 + adc $14 ; ROM $0000BB: 65 14 + sta $14 ; ROM $0000BD: 85 14 + dec $16 ; ROM $0000BF: C6 16 + beq Nmi_ReadScreenState_C0B9 ; ROM $0000C1: F0 06 +; Routine: Nmi_ReadZp14_C0B3 +; Global: Reachable code entry at CPU $C0B3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_ReadZp14_C0B3: + ldy $14 ; ROM $0000C3: A4 14 + cpy $15 ; ROM $0000C5: C4 15 + bne Nmi_TransferVramDataPath_C049 ; ROM $0000C7: D0 90 +; Routine: Nmi_ReadScreenState_C0B9 +; Global: Reachable code entry at CPU $C0B9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_ReadScreenState_C0B9: + lda $72 ; ROM $0000C9: A5 72 + beq Nmi_ReadNmiWorkPending_C0E4 ; ROM $0000CB: F0 27 + lda #$22 ; ROM $0000CD: A9 22 + ldx #$68 ; ROM $0000CF: A2 68 + jsr SetPpuAddress ; ROM $0000D1: 20 96 C1 + ldy #$B0 ; ROM $0000D4: A0 B0 + lda $5F ; ROM $0000D6: A5 5F + bne Nmi_TransferVramDataPath_C0CC ; ROM $0000D8: D0 02 + ldy #$40 ; ROM $0000DA: A0 40 +; Routine: Nmi_TransferVramDataPath_C0CC +; Global: Reachable code entry at CPU $C0CC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_TransferVramDataPath_C0CC: + sty PPUDATA ; ROM $0000DC: 8C 07 20 + lda #$22 ; ROM $0000DF: A9 22 + ldx #$70 ; ROM $0000E1: A2 70 + jsr SetPpuAddress ; ROM $0000E3: 20 96 C1 + ldy #$B0 ; ROM $0000E6: A0 B0 + lda $5F ; ROM $0000E8: A5 5F + beq Nmi_TransferVramDataPath_C0DE ; ROM $0000EA: F0 02 + ldy #$40 ; ROM $0000EC: A0 40 +; Routine: Nmi_TransferVramDataPath_C0DE +; Global: Reachable code entry at CPU $C0DE traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_TransferVramDataPath_C0DE: + sty PPUDATA ; ROM $0000EE: 8C 07 20 + jmp Nmi_ReadPpuStatusPath_C126 ; ROM $0000F1: 4C 26 C1 +; Routine: Nmi_ReadNmiWorkPending_C0E4 +; Global: Reachable code entry at CPU $C0E4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_ReadNmiWorkPending_C0E4: + lda $60 ; ROM $0000F4: A5 60 + beq Nmi_ReadPpuStatusPath_C126 ; ROM $0000F6: F0 3E + lda $16 ; ROM $0000F8: A5 16 + cmp #$04 ; ROM $0000FA: C9 04 + bcc Nmi_ReadPpuStatusPath_C126 ; ROM $0000FC: 90 38 + lda #$20 ; ROM $0000FE: A9 20 + ldx #$4B ; ROM $000100: A2 4B + jsr SetPpuAddress ; ROM $000102: 20 96 C1 + ldx #$00 ; ROM $000105: A2 00 +; Routine: Nmi_TransferVramDataPath_C0F7 +; Global: Reachable code entry at CPU $C0F7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_TransferVramDataPath_C0F7: + lda $61,x ; ROM $000107: B5 61 + bne Nmi_TransferVramDataPath_C107 ; ROM $000109: D0 0C + lda #$3A ; ROM $00010B: A9 3A + sta PPUDATA ; ROM $00010D: 8D 07 20 + inx ; ROM $000110: E8 + cpx #$07 ; ROM $000111: E0 07 + bne Nmi_TransferVramDataPath_C0F7 ; ROM $000113: D0 F2 + beq Nmi_ReadZp93_C114 ; ROM $000115: F0 0D +; Routine: Nmi_TransferVramDataPath_C107 +; Global: Reachable code entry at CPU $C107 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_TransferVramDataPath_C107: + lda $61,x ; ROM $000117: B5 61 + clc ; ROM $000119: 18 + adc #$30 ; ROM $00011A: 69 30 + sta PPUDATA ; ROM $00011C: 8D 07 20 + inx ; ROM $00011F: E8 + cpx #$07 ; ROM $000120: E0 07 + bne Nmi_TransferVramDataPath_C107 ; ROM $000122: D0 F3 +; Routine: Nmi_ReadZp93_C114 +; Global: Reachable code entry at CPU $C114 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_ReadZp93_C114: + lda #$20 ; ROM $000124: A9 20 + ldx #$46 ; ROM $000126: A2 46 + jsr SetPpuAddress ; ROM $000128: 20 96 C1 + lda $93 ; ROM $00012B: A5 93 + cmp #$FF ; ROM $00012D: C9 FF + bne Nmi_CallHelper_C123 ; ROM $00012F: D0 02 + lda #$00 ; ROM $000131: A9 00 +; Routine: Nmi_CallHelper_C123 +; Global: Reachable code entry at CPU $C123 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_CallHelper_C123: + jsr Menu_HandleControl_DF48 ; ROM $000133: 20 48 DF +; Routine: Nmi_ReadPpuStatusPath_C126 +; Global: Reachable code entry at CPU $C126 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_ReadPpuStatusPath_C126: + lda PPUSTATUS ; ROM $000136: AD 02 20 + jsr CommitPpuStateAndScroll ; ROM $000139: 20 96 C2 + inc $33 ; ROM $00013C: E6 33 + lda $6A ; ROM $00013E: A5 6A + beq Nmi_UpdateAudioChannelPath_C13E ; ROM $000140: F0 0C + inc $69 ; ROM $000142: E6 69 + lda $69 ; ROM $000144: A5 69 + cmp #$3C ; ROM $000146: C9 3C + bcc Nmi_UpdateAudioChannelPath_C13E ; ROM $000148: 90 04 + lda #$00 ; ROM $00014A: A9 00 + sta $6A ; ROM $00014C: 85 6A +; Routine: Nmi_UpdateAudioChannelPath_C13E +; Global: Reachable code entry at CPU $C13E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_UpdateAudioChannelPath_C13E: + sta $69 ; ROM $00014E: 85 69 + jsr Ppu_WriteZp10_C19D ; ROM $000150: 20 9D C1 + jsr Gameplay_ReadZpB2_E4C7 ; ROM $000153: 20 C7 E4 + jsr SoundUpdate ; ROM $000156: 20 5F E6 + lda $38 ; ROM $000159: A5 38 + beq Nmi_ReadNmiWorkPending_C16E ; ROM $00015B: F0 21 + lda $59 ; ROM $00015D: A5 59 + bne Nmi_ReadNmiWorkPending_C16E ; ROM $00015F: D0 1D + lda #$0E ; ROM $000161: A9 0E + sta APUDMCCTRL ; ROM $000163: 8D 10 40 + lda #$00 ; ROM $000166: A9 00 + sta $38 ; ROM $000168: 85 38 + lda #$C0 ; ROM $00016A: A9 C0 + sta APUDMCADDR ; ROM $00016C: 8D 12 40 + lda #$FF ; ROM $00016F: A9 FF + sta APUDMCLENGTH ; ROM $000171: 8D 13 40 + lda #$0F ; ROM $000174: A9 0F + sta APUSTATUS ; ROM $000176: 8D 15 40 + lda #$1F ; ROM $000179: A9 1F + sta APUSTATUS ; ROM $00017B: 8D 15 40 +; Routine: Nmi_ReadNmiWorkPending_C16E +; Global: Reachable code entry at CPU $C16E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_ReadNmiWorkPending_C16E: + lda $60 ; ROM $00017E: A5 60 + beq Nmi_ToggleZpDB_C18A ; ROM $000180: F0 18 +; Routine: Nmi_ReadPpuStatusPath_C172 +; Global: Reachable code entry at CPU $C172 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_ReadPpuStatusPath_C172: + lda PPUSTATUS ; ROM $000182: AD 02 20 + and #$40 ; ROM $000185: 29 40 + bne Nmi_ReadPpuStatusPath_C172 ; ROM $000187: D0 F9 +; Routine: Nmi_ReadPpuStatusPath_C179 +; Global: Reachable code entry at CPU $C179 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_ReadPpuStatusPath_C179: + lda PPUSTATUS ; ROM $000189: AD 02 20 + and #$40 ; ROM $00018C: 29 40 + beq Nmi_ReadPpuStatusPath_C179 ; ROM $00018E: F0 F9 + lda $0E ; ROM $000190: A5 0E + sta PPUSCROLL ; ROM $000192: 8D 05 20 + lda $0F ; ROM $000195: A5 0F + sta PPUSCROLL ; ROM $000197: 8D 05 20 +; Routine: Nmi_ToggleZpDB_C18A +; Global: Reachable code entry at CPU $C18A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Nmi_ToggleZpDB_C18A: + lda #$05 ; ROM $00019A: A9 05 + eor $DB ; ROM $00019C: 45 DB + sta $DB ; ROM $00019E: 85 DB + pla ; ROM $0001A0: 68 + tay ; ROM $0001A1: A8 + pla ; ROM $0001A2: 68 + tax ; ROM $0001A3: AA + pla ; ROM $0001A4: 68 + rti ; ROM $0001A5: 40 +; Routine: SetPpuAddress +; Global: Reachable code entry at CPU $C196 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +SetPpuAddress: + sta PPUADDR ; ROM $0001A6: 8D 06 20 + stx PPUADDR ; ROM $0001A9: 8E 06 20 + rts ; ROM $0001AC: 60 +; Routine: Ppu_WriteZp10_C19D +; Global: Reachable code entry at CPU $C19D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_WriteZp10_C19D: + jsr Ppu_ReadControllerAndReturnA_C1BF ; ROM $0001AD: 20 BF C1 + lda ControllerState1 ; ROM $0001B0: A5 12 + sta $10 ; ROM $0001B2: 85 10 + lda $13 ; ROM $0001B4: A5 13 + sta $11 ; ROM $0001B6: 85 11 + jsr Ppu_ReadControllerAndReturnA_C1BF ; ROM $0001B8: 20 BF C1 + lda ControllerState1 ; ROM $0001BB: A5 12 + cmp $10 ; ROM $0001BD: C5 10 + bne Ppu_WriteZp13_C1B8 ; ROM $0001BF: D0 07 + lda $13 ; ROM $0001C1: A5 13 + cmp $11 ; ROM $0001C3: C5 11 + bne Ppu_WriteZp13_C1B8 ; ROM $0001C5: D0 01 + rts ; ROM $0001C7: 60 +; Routine: Ppu_WriteZp13_C1B8 +; Global: Reachable code entry at CPU $C1B8 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_WriteZp13_C1B8: + lda #$00 ; ROM $0001C8: A9 00 + sta ControllerState1 ; ROM $0001CA: 85 12 + sta $13 ; ROM $0001CC: 85 13 + rts ; ROM $0001CE: 60 +; Routine: Ppu_ReadControllerAndReturnA_C1BF +; Global: Reachable code entry at CPU $C1BF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_ReadControllerAndReturnA_C1BF: + lda #$01 ; ROM $0001CF: A9 01 + sta JOY1 ; ROM $0001D1: 8D 16 40 + lda #$00 ; ROM $0001D4: A9 00 + sta JOY1 ; ROM $0001D6: 8D 16 40 + tax ; ROM $0001D9: AA + ldy #$08 ; ROM $0001DA: A0 08 +; Routine: Ppu_ReadControllerPath_C1CC +; Global: Reachable code entry at CPU $C1CC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_ReadControllerPath_C1CC: + txa ; ROM $0001DC: 8A + asl a ; ROM $0001DD: 0A + tax ; ROM $0001DE: AA + lda JOY1 ; ROM $0001DF: AD 16 40 + jsr Ppu_HandleControl_C1EB ; ROM $0001E2: 20 EB C1 + bne Ppu_ReadControllerPath_C1CC ; ROM $0001E5: D0 F5 + stx ControllerState1 ; ROM $0001E7: 86 12 + ldx #$00 ; ROM $0001E9: A2 00 + ldy #$08 ; ROM $0001EB: A0 08 +; Routine: Ppu_ReadControllerPath_C1DD +; Global: Reachable code entry at CPU $C1DD traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_ReadControllerPath_C1DD: + txa ; ROM $0001ED: 8A + asl a ; ROM $0001EE: 0A + tax ; ROM $0001EF: AA + lda JOY2 ; ROM $0001F0: AD 17 40 + jsr Ppu_HandleControl_C1EB ; ROM $0001F3: 20 EB C1 + bne Ppu_ReadControllerPath_C1DD ; ROM $0001F6: D0 F5 + stx $13 ; ROM $0001F8: 86 13 + rts ; ROM $0001FA: 60 +; Routine: Ppu_HandleControl_C1EB +; Global: Reachable code entry at CPU $C1EB traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_HandleControl_C1EB: + and #$03 ; ROM $0001FB: 29 03 + beq Ppu_RetreatIndexY_C1F0 ; ROM $0001FD: F0 01 + inx ; ROM $0001FF: E8 +; Routine: Ppu_RetreatIndexY_C1F0 +; Global: Reachable code entry at CPU $C1F0 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_RetreatIndexY_C1F0: + dey ; ROM $000200: 88 + rts ; ROM $000201: 60 +; Routine: InitializeVideoSystem +; Global: Reachable code entry at CPU $C1F2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +InitializeVideoSystem: + jsr DisableRendering ; ROM $000202: 20 57 C2 + jsr Ppu_HandleControl_C2B9 ; ROM $000205: 20 B9 C2 + lda #$10 ; ROM $000208: A9 10 + sta PpuCtrlShadow ; ROM $00020A: 85 0C + sta PPUCTRL ; ROM $00020C: 8D 00 20 + lda #$00 ; ROM $00020F: A9 00 + sta $0E ; ROM $000211: 85 0E + sta $14 ; ROM $000213: 85 14 + sta $15 ; ROM $000215: 85 15 + sta $0F ; ROM $000217: 85 0F + jsr HideAllSprites ; ROM $000219: 20 68 C2 + jsr DisableRendering ; ROM $00021C: 20 57 C2 + jsr WaitForVBlankTransition ; ROM $00021F: 20 8B C2 + jsr UploadSystemPalette ; ROM $000222: 20 C3 C2 +; Routine: Ppu_HandleControl_C215 +; Global: Reachable code entry at CPU $C215 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_HandleControl_C215: + lda #$20 ; ROM $000225: A9 20 + ldx #$00 ; ROM $000227: A2 00 + jsr SetPpuAddress ; ROM $000229: 20 96 C1 + ldy #$08 ; ROM $00022C: A0 08 + lda #$B0 ; ROM $00022E: A9 B0 +; Routine: Ppu_TransferVramDataPath_C220 +; Global: Reachable code entry at CPU $C220 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_TransferVramDataPath_C220: + sta PPUDATA ; ROM $000230: 8D 07 20 + dex ; ROM $000233: CA + bne Ppu_TransferVramDataPath_C220 ; ROM $000234: D0 FA + dey ; ROM $000236: 88 + bne Ppu_TransferVramDataPath_C220 ; ROM $000237: D0 F7 + lda #$23 ; ROM $000239: A9 23 + ldx #$C0 ; ROM $00023B: A2 C0 + jsr SetPpuAddress ; ROM $00023D: 20 96 C1 + ldx #$40 ; ROM $000240: A2 40 + lda #$00 ; ROM $000242: A9 00 +; Routine: Ppu_TransferVramDataPath_C234 +; Global: Reachable code entry at CPU $C234 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_TransferVramDataPath_C234: + sta PPUDATA ; ROM $000244: 8D 07 20 + dex ; ROM $000247: CA + bne Ppu_TransferVramDataPath_C234 ; ROM $000248: D0 FA + rts ; ROM $00024A: 60 +; Routine: Ppu_CallHelper_C23B +; Global: Reachable code entry at CPU $C23B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_CallHelper_C23B: + jsr Ppu_HandleControl_C2B9 ; ROM $00024B: 20 B9 C2 + jsr WaitForVBlankTransition ; ROM $00024E: 20 8B C2 + lda #$0E ; ROM $000251: A9 0E + jsr Ppu_UpdatePpuState_C25C ; ROM $000253: 20 5C C2 + jsr Ppu_TransferSpriteDmaAndReturnA_C24C ; ROM $000256: 20 4C C2 + jmp EnableNmiInPpuControl ; ROM $000259: 4C B0 C2 +; Routine: Ppu_TransferSpriteDmaAndReturnA_C24C +; Global: Reachable code entry at CPU $C24C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_TransferSpriteDmaAndReturnA_C24C: + lda #$00 ; ROM $00025C: A9 00 + sta OAMADDR ; ROM $00025E: 8D 03 20 + lda #$07 ; ROM $000261: A9 07 + sta OAMDMA ; ROM $000263: 8D 14 40 + rts ; ROM $000266: 60 +; Routine: DisableRendering +; Global: Reachable code entry at CPU $C257 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +DisableRendering: + jsr WaitForVBlankTransition ; ROM $000267: 20 8B C2 + lda #$00 ; ROM $00026A: A9 00 +; Routine: Ppu_UpdatePpuState_C25C +; Global: Reachable code entry at CPU $C25C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_UpdatePpuState_C25C: + sta PPUMASK ; ROM $00026C: 8D 01 20 +; Routine: Ppu_HandleControl_C25F +; Global: Reachable code entry at CPU $C25F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_HandleControl_C25F: + sta PpuMaskShadow ; ROM $00026F: 85 0D + rts ; ROM $000271: 60 +; Routine: Ppu_HandleControl_C262 +; Global: Reachable code entry at CPU $C262 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_HandleControl_C262: + lda PpuMaskShadow ; ROM $000272: A5 0D + ora #$10 ; ROM $000274: 09 10 + bne Ppu_HandleControl_C25F ; ROM $000276: D0 F7 +; Routine: HideAllSprites +; Global: Reachable code entry at CPU $C268 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +HideAllSprites: + ldy #$1C ; ROM $000278: A0 1C + lda #$F8 ; ROM $00027A: A9 F8 +; Routine: Ppu_WriteRam0700_C26C +; Global: Reachable code entry at CPU $C26C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_WriteRam0700_C26C: + sta $0700,y ; ROM $00027C: 99 00 07 + sta $0720,y ; ROM $00027F: 99 20 07 + sta $0740,y ; ROM $000282: 99 40 07 + sta $0760,y ; ROM $000285: 99 60 07 + sta $0780,y ; ROM $000288: 99 80 07 + sta $07A0,y ; ROM $00028B: 99 A0 07 + sta $07C0,y ; ROM $00028E: 99 C0 07 + sta $07E0,y ; ROM $000291: 99 E0 07 + dey ; ROM $000294: 88 + dey ; ROM $000295: 88 + dey ; ROM $000296: 88 + dey ; ROM $000297: 88 + bpl Ppu_WriteRam0700_C26C ; ROM $000298: 10 E2 + rts ; ROM $00029A: 60 +; Routine: WaitForVBlankTransition +; Global: Reachable code entry at CPU $C28B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +WaitForVBlankTransition: + lda PPUSTATUS ; ROM $00029B: AD 02 20 + bmi WaitForVBlankTransition ; ROM $00029E: 30 FB +; Routine: Ppu_WaitPpuStatusPath_C290 +; Global: Reachable code entry at CPU $C290 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_WaitPpuStatusPath_C290: + lda PPUSTATUS ; ROM $0002A0: AD 02 20 + bpl Ppu_WaitPpuStatusPath_C290 ; ROM $0002A3: 10 FB + rts ; ROM $0002A5: 60 +; Routine: CommitPpuStateAndScroll +; Global: Reachable code entry at CPU $C296 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +CommitPpuStateAndScroll: + lda PpuMaskShadow ; ROM $0002A6: A5 0D + sta PPUMASK ; ROM $0002A8: 8D 01 20 + lda #$00 ; ROM $0002AB: A9 00 + ldx #$00 ; ROM $0002AD: A2 00 + jsr SetPpuAddress ; ROM $0002AF: 20 96 C1 + lda #$00 ; ROM $0002B2: A9 00 + sta PPUSCROLL ; ROM $0002B4: 8D 05 20 + sta PPUSCROLL ; ROM $0002B7: 8D 05 20 + lda PpuCtrlShadow ; ROM $0002BA: A5 0C + sta PPUCTRL ; ROM $0002BC: 8D 00 20 + rts ; ROM $0002BF: 60 +; Routine: EnableNmiInPpuControl +; Global: Reachable code entry at CPU $C2B0 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +EnableNmiInPpuControl: + jsr WaitForVBlankTransition ; ROM $0002C0: 20 8B C2 + lda PpuCtrlShadow ; ROM $0002C3: A5 0C + ora #$80 ; ROM $0002C5: 09 80 + bne Ppu_UpdatePpuStatePath_C2BD ; ROM $0002C7: D0 04 +; Routine: Ppu_HandleControl_C2B9 +; Global: Reachable code entry at CPU $C2B9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_HandleControl_C2B9: + lda PpuCtrlShadow ; ROM $0002C9: A5 0C + and #$7F ; ROM $0002CB: 29 7F +; Routine: Ppu_UpdatePpuStatePath_C2BD +; Global: Reachable code entry at CPU $C2BD traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_UpdatePpuStatePath_C2BD: + sta PpuCtrlShadow ; ROM $0002CD: 85 0C + sta PPUCTRL ; ROM $0002CF: 8D 00 20 + rts ; ROM $0002D2: 60 +; Routine: UploadSystemPalette +; Global: Reachable code entry at CPU $C2C3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +UploadSystemPalette: + lda #$3F ; ROM $0002D3: A9 3F + ldx #$00 ; ROM $0002D5: A2 00 + jsr SetPpuAddress ; ROM $0002D7: 20 96 C1 + ldy #$20 ; ROM $0002DA: A0 20 +; Routine: Ppu_TransferVramDataPath_C2CC +; Global: Reachable code entry at CPU $C2CC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_TransferVramDataPath_C2CC: + lda $C2E7,x ; ROM $0002DC: BD E7 C2 + sta PPUDATA ; ROM $0002DF: 8D 07 20 + inx ; ROM $0002E2: E8 + dey ; ROM $0002E3: 88 + bne Ppu_TransferVramDataPath_C2CC ; ROM $0002E4: D0 F6 +; Routine: Ppu_SetVramAddress_C2D6 +; Global: Reachable code entry at CPU $C2D6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Ppu_SetVramAddress_C2D6: + lda #$3F ; ROM $0002E6: A9 3F + sta PPUADDR ; ROM $0002E8: 8D 06 20 + lda #$00 ; ROM $0002EB: A9 00 + sta PPUADDR ; ROM $0002ED: 8D 06 20 + sta PPUADDR ; ROM $0002F0: 8D 06 20 + sta PPUADDR ; ROM $0002F3: 8D 06 20 + rts ; ROM $0002F6: 60 + +; Data region: CPU $C2E7-$C306; unreachable by direct recursive trace. +SystemPaletteData: + .byte $19, $0F, $10, $30, $19, $16, $26, $36, $19, $0F, $18, $28, $19, $0F, $17, $07 ; ROM $0002F7: 19 0F 10 30 19 16 26 36 19 0F 18 28 19 0F 17 07 + .byte $19, $30, $21, $26, $19, $0F, $26, $30, $19, $0F, $15, $30, $19, $0F, $21, $30 ; ROM $000307: 19 30 21 26 19 0F 26 30 19 0F 15 30 19 0F 21 30 +; Routine: WaitForFrameBoundary +; Global: Reachable code entry at CPU $C307 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +WaitForFrameBoundary: + lda ControllerState1 ; ROM $000317: A5 12 + bne WaitForFrameBoundary ; ROM $000319: D0 FC + rts ; ROM $00031B: 60 +; Routine: InitializeSystemAndRunMainLoop +; Global: Reachable code entry at CPU $C30C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +InitializeSystemAndRunMainLoop: + ldy #$00 ; ROM $00031C: A0 00 + sty $E0 ; ROM $00031E: 84 E0 + iny ; ROM $000320: C8 + sty $E1 ; ROM $000321: 84 E1 + dey ; ROM $000323: 88 + tya ; ROM $000324: 98 + ldx #$07 ; ROM $000325: A2 07 +; Routine: Main_WriteSoundDispatchIndex_C317 +; Global: Reachable code entry at CPU $C317 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteSoundDispatchIndex_C317: + sta ($E0),y ; ROM $000327: 91 E0 + iny ; ROM $000329: C8 + bne Main_WriteSoundDispatchIndex_C317 ; ROM $00032A: D0 FB + inc $E1 ; ROM $00032C: E6 E1 + dex ; ROM $00032E: CA + bne Main_WriteSoundDispatchIndex_C317 ; ROM $00032F: D0 F6 + ldx #$00 ; ROM $000331: A2 00 + ldy $08 ; ROM $000333: A4 08 + cpy #$93 ; ROM $000335: C0 93 + bne Main_WriteZp00_C333 ; ROM $000337: D0 0A + ldy $09 ; ROM $000339: A4 09 + bne Main_WriteZp00_C333 ; ROM $00033B: D0 06 + ldy $0A ; ROM $00033D: A4 0A + bne Main_WriteZp00_C333 ; ROM $00033F: D0 02 + ldx #$08 ; ROM $000341: A2 08 +; Routine: Main_WriteZp00_C333 +; Global: Reachable code entry at CPU $C333 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteZp00_C333: + sta $00,x ; ROM $000343: 95 00 + inx ; ROM $000345: E8 + bne Main_WriteZp00_C333 ; ROM $000346: D0 FB + lda #$93 ; ROM $000348: A9 93 + sta $08 ; ROM $00034A: 85 08 +; Routine: Main_WriteZpDB_C33C +; Global: Reachable code entry at CPU $C33C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteZpDB_C33C: + jsr InitializeVideoSystem ; ROM $00034C: 20 F2 C1 + lda #$00 ; ROM $00034F: A9 00 + sta $DB ; ROM $000351: 85 DB + jsr InitializeApu ; ROM $000353: 20 42 E6 + lda #$01 ; ROM $000356: A9 01 + sta $B5 ; ROM $000358: 85 B5 +; Routine: Main_UpdateAudioChannelPath_C34A +; Global: Reachable code entry at CPU $C34A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_UpdateAudioChannelPath_C34A: + ldx #$FF ; ROM $00035A: A2 FF + txs ; ROM $00035C: 9A + lda #$0F ; ROM $00035D: A9 0F + sta APUSTATUS ; ROM $00035F: 8D 15 40 + lda #$00 ; ROM $000362: A9 00 + sta $38 ; ROM $000364: 85 38 + sta $59 ; ROM $000366: 85 59 + sta $B2 ; ROM $000368: 85 B2 + sta $60 ; ROM $00036A: 85 60 + sta $70 ; ROM $00036C: 85 70 + jsr ComposeStatusScreen ; ROM $00036E: 20 83 DE + jsr EnableNmiInPpuControl ; ROM $000371: 20 B0 C2 + lda #$01 ; ROM $000374: A9 01 + sta $72 ; ROM $000376: 85 72 +; Routine: MainGameLoop +; Global: Reachable code entry at CPU $C368 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +MainGameLoop: + lda ControllerState1 ; ROM $000378: A5 12 + bne MainGameLoop ; ROM $00037A: D0 FC +; Routine: Main_WriteMainDelay_C36C +; Global: Reachable code entry at CPU $C36C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteMainDelay_C36C: + lda #$08 ; ROM $00037C: A9 08 + sta $70 ; ROM $00037E: 85 70 +; Routine: Main_ReadOptionState_C370 +; Global: Reachable code entry at CPU $C370 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadOptionState_C370: + jsr WaitForNmiFrameHandoff ; ROM $000380: 20 FB CB + lda ControllerState1 ; ROM $000383: A5 12 + and #$10 ; ROM $000385: 29 10 + bne Main_ReadGameState_C398 ; ROM $000387: D0 1F + lda ControllerState1 ; ROM $000389: A5 12 + and #$20 ; ROM $00038B: 29 20 + beq Main_DecrementSubDelay_C38B ; ROM $00038D: F0 0C + lda $5F ; ROM $00038F: A5 5F + eor #$01 ; ROM $000391: 49 01 + sta $5F ; ROM $000393: 85 5F + jsr WaitForFrameBoundary ; ROM $000395: 20 07 C3 + jmp Main_WriteMainDelay_C36C ; ROM $000398: 4C 6C C3 +; Routine: Main_DecrementSubDelay_C38B +; Global: Reachable code entry at CPU $C38B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_DecrementSubDelay_C38B: + jsr AdvanceRandomState ; ROM $00039B: 20 70 D6 + dec $71 ; ROM $00039E: C6 71 + bne Main_ReadOptionState_C370 ; ROM $0003A0: D0 DE + dec $70 ; ROM $0003A2: C6 70 + bne Main_ReadOptionState_C370 ; ROM $0003A4: D0 DA + inc $59 ; ROM $0003A6: E6 59 +; Routine: Main_ReadGameState_C398 +; Global: Reachable code entry at CPU $C398 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadGameState_C398: + lda $59 ; ROM $0003A8: A5 59 + bne Main_WriteScreenState_C3A3 ; ROM $0003AA: D0 07 + lda $5F ; ROM $0003AC: A5 5F + beq Main_WriteScreenState_C3A3 ; ROM $0003AE: F0 03 + jsr RunMenuSelectionScreen ; ROM $0003B0: 20 8E DA +; Routine: Main_WriteScreenState_C3A3 +; Global: Reachable code entry at CPU $C3A3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteScreenState_C3A3: + lda #$00 ; ROM $0003B3: A9 00 + sta $72 ; ROM $0003B5: 85 72 + jsr WaitForFrameBoundary ; ROM $0003B7: 20 07 C3 + lda #$02 ; ROM $0003BA: A9 02 + sta $68 ; ROM $0003BC: 85 68 + lda $59 ; ROM $0003BE: A5 59 + bne Main_WriteZp58_C3B6 ; ROM $0003C0: D0 04 + lda $5F ; ROM $0003C2: A5 5F + bne Main_WriteObjectDirection_C40A ; ROM $0003C4: D0 54 +; Routine: Main_WriteZp58_C3B6 +; Global: Reachable code entry at CPU $C3B6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteZp58_C3B6: + lda #$01 ; ROM $0003C6: A9 01 + sta $58 ; ROM $0003C8: 85 58 + lda $59 ; ROM $0003CA: A5 59 + bne Main_UpdateAudioChannelPath_C3C7 ; ROM $0003CC: D0 09 + ldx #$06 ; ROM $0003CE: A2 06 + lda #$00 ; ROM $0003D0: A9 00 +; Routine: Main_WriteZp61_C3C2 +; Global: Reachable code entry at CPU $C3C2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteZp61_C3C2: + sta $61,x ; ROM $0003D2: 95 61 + dex ; ROM $0003D4: CA + bpl Main_WriteZp61_C3C2 ; ROM $0003D5: 10 FB +; Routine: Main_UpdateAudioChannelPath_C3C7 +; Global: Reachable code entry at CPU $C3C7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_UpdateAudioChannelPath_C3C7: + lda #$10 ; ROM $0003D7: A9 10 + sta $73 ; ROM $0003D9: 85 73 + lda #$00 ; ROM $0003DB: A9 00 + sta $74 ; ROM $0003DD: 85 74 + sta $77 ; ROM $0003DF: 85 77 + sta $75 ; ROM $0003E1: 85 75 + sta $76 ; ROM $0003E3: 85 76 + sta $79 ; ROM $0003E5: 85 79 + sta $94 ; ROM $0003E7: 85 94 + lda $59 ; ROM $0003E9: A5 59 + beq Main_WriteObjectDirection_C40A ; ROM $0003EB: F0 2D + lda #$09 ; ROM $0003ED: A9 09 + sta $74 ; ROM $0003EF: 85 74 + lda #$40 ; ROM $0003F1: A9 40 + sta $73 ; ROM $0003F3: 85 73 + lda #$01 ; ROM $0003F5: A9 01 + sta $77 ; ROM $0003F7: 85 77 + lda #$00 ; ROM $0003F9: A9 00 + sta APUSTATUS ; ROM $0003FB: 8D 15 40 + sta RandomState0 ; ROM $0003FE: 85 54 + sta RandomState1 ; ROM $000400: 85 55 + sta RandomState2 ; ROM $000402: 85 56 + sta RandomState3 ; ROM $000404: 85 57 + sta $33 ; ROM $000406: 85 33 + lda #$F4 ; ROM $000408: A9 F4 + sta $AC ; ROM $00040A: 85 AC + lda #$ED ; ROM $00040C: A9 ED + sta $AD ; ROM $00040E: 85 AD + lda $EDF2 ; ROM $000410: AD F2 ED + sta $AE ; ROM $000413: 85 AE + lda $EDF3 ; ROM $000415: AD F3 ED + sta $AF ; ROM $000418: 85 AF +; Routine: Main_WriteObjectDirection_C40A +; Global: Reachable code entry at CPU $C40A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteObjectDirection_C40A: + lda #$00 ; ROM $00041A: A9 00 + sta $78 ; ROM $00041C: 85 78 + sta $7A ; ROM $00041E: 85 7A +; Routine: Main_WriteZpB1_C410 +; Global: Reachable code entry at CPU $C410 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteZpB1_C410: + lda #$00 ; ROM $000420: A9 00 + sta $B1 ; ROM $000422: 85 B1 + sta $A8 ; ROM $000424: 85 A8 + sta $60 ; ROM $000426: 85 60 + sta $9E ; ROM $000428: 85 9E + sta $9F ; ROM $00042A: 85 9F + sta $9C ; ROM $00042C: 85 9C + sta $A0 ; ROM $00042E: 85 A0 + sta $A1 ; ROM $000430: 85 A1 + sta $A2 ; ROM $000432: 85 A2 + sta $A3 ; ROM $000434: 85 A3 + sta $A4 ; ROM $000436: 85 A4 + sta $A5 ; ROM $000438: 85 A5 + sta $A6 ; ROM $00043A: 85 A6 + sta $A7 ; ROM $00043C: 85 A7 + jsr Menu_WriteZp0E_DE1D ; ROM $00043E: 20 1D DE + lda #$02 ; ROM $000441: A9 02 + sta $B5 ; ROM $000443: 85 B5 + jsr Main_ReadGameMode_C60B ; ROM $000445: 20 0B C6 + lda #$03 ; ROM $000448: A9 03 + sta $B5 ; ROM $00044A: 85 B5 + jsr Ppu_HandleControl_C2B9 ; ROM $00044C: 20 B9 C2 + jsr Gameplay_WriteTransferPointer_CA4B ; ROM $00044F: 20 4B CA + jsr Main_WriteObjectType_C5CE ; ROM $000452: 20 CE C5 + jsr Gameplay_ReadZp58_E4AF ; ROM $000455: 20 AF E4 + jsr Main_CallHelper_C5FF ; ROM $000458: 20 FF C5 + lda #$C8 ; ROM $00045B: A9 C8 + sta $93 ; ROM $00045D: 85 93 +; Routine: Main_ReadZp5D_C44F +; Global: Reachable code entry at CPU $C44F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadZp5D_C44F: + jsr Main_WriteStageCounter_C613 ; ROM $00045F: 20 13 C6 + jsr HideAllSprites ; ROM $000462: 20 68 C2 + jsr Frame_ReadZp7D_CC36 ; ROM $000465: 20 36 CC + jsr Gameplay_HandleControl_C96A ; ROM $000468: 20 6A C9 + jsr Frame_ReadObjectIndex_CE5B ; ROM $00046B: 20 5B CE + jsr Object_WriteStageProgress_CFB0 ; ROM $00046E: 20 B0 CF + jsr Gameplay_HandleControl_CA1B ; ROM $000471: 20 1B CA + jsr Main_ReadZp33_C644 ; ROM $000474: 20 44 C6 + jsr Gameplay_ReadStageProgress_E399 ; ROM $000477: 20 99 E3 + lda $5D ; ROM $00047A: A5 5D + bne Main_ReadGameState_C481 ; ROM $00047C: D0 13 + lda $5E ; ROM $00047E: A5 5E + bne Main_ReadGameState_C4BF ; ROM $000480: D0 4D + lda $33 ; ROM $000482: A5 33 + and #$03 ; ROM $000484: 29 03 + bne Main_ReadZp5D_C44F ; ROM $000486: D0 D7 + jsr GameplayUpdate ; ROM $000488: 20 9D C7 + jsr Main_HandleControl_C66C ; ROM $00048B: 20 6C C6 + jmp Main_ReadZp5D_C44F ; ROM $00048E: 4C 4F C4 +; Routine: Main_ReadGameState_C481 +; Global: Reachable code entry at CPU $C481 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadGameState_C481: + lda $59 ; ROM $000491: A5 59 + bne Main_WriteGameMode_C4C3 ; ROM $000493: D0 3E + lda #$00 ; ROM $000495: A9 00 + sta $76 ; ROM $000497: 85 76 + sta $78 ; ROM $000499: 85 78 + sta $77 ; ROM $00049B: 85 77 + sta $79 ; ROM $00049D: 85 79 + sta $7A ; ROM $00049F: 85 7A + lda #$08 ; ROM $0004A1: A9 08 + sta $B5 ; ROM $0004A3: 85 B5 + jsr Main_ReadGameMode_C60B ; ROM $0004A5: 20 0B C6 + dec $68 ; ROM $0004A8: C6 68 + bmi Main_WriteNmiWorkPending_C49F ; ROM $0004AA: 30 03 + jmp Main_WriteZpB1_C410 ; ROM $0004AC: 4C 10 C4 +; Routine: Main_WriteNmiWorkPending_C49F +; Global: Reachable code entry at CPU $C49F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteNmiWorkPending_C49F: + lda #$00 ; ROM $0004AF: A9 00 + sta $60 ; ROM $0004B1: 85 60 + jsr Menu_CallHelper_DD3E ; ROM $0004B3: 20 3E DD + lda #$09 ; ROM $0004B6: A9 09 + sta $B5 ; ROM $0004B8: 85 B5 +; Routine: Main_ReadGameMode_C4AA +; Global: Reachable code entry at CPU $C4AA traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadGameMode_C4AA: + lda ControllerState1 ; ROM $0004BA: A5 12 + and #$10 ; ROM $0004BC: 29 10 + bne Main_WriteGameMode_C4B4 ; ROM $0004BE: D0 04 + lda $B5 ; ROM $0004C0: A5 B5 + bne Main_ReadGameMode_C4AA ; ROM $0004C2: D0 F6 +; Routine: Main_WriteGameMode_C4B4 +; Global: Reachable code entry at CPU $C4B4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteGameMode_C4B4: + lda #$00 ; ROM $0004C4: A9 00 + sta $B5 ; ROM $0004C6: 85 B5 +; Routine: Main_HandleControl_C4B8 +; Global: Reachable code entry at CPU $C4B8 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_HandleControl_C4B8: + lda ControllerState1 ; ROM $0004C8: A5 12 + beq Main_HandleControl_C4B8 ; ROM $0004CA: F0 FC + jmp Main_UpdateAudioChannelPath_C34A ; ROM $0004CC: 4C 4A C3 +; Routine: Main_ReadGameState_C4BF +; Global: Reachable code entry at CPU $C4BF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadGameState_C4BF: + lda $59 ; ROM $0004CF: A5 59 + beq Main_WriteGameMode_C4D5 ; ROM $0004D1: F0 12 +; Routine: Main_WriteGameMode_C4C3 +; Global: Reachable code entry at CPU $C4C3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteGameMode_C4C3: + lda #$00 ; ROM $0004D3: A9 00 + sta $B5 ; ROM $0004D5: 85 B5 + inc $B0 ; ROM $0004D7: E6 B0 + lda $B0 ; ROM $0004D9: A5 B0 + and #$03 ; ROM $0004DB: 29 03 + beq Main_Dispatch_C4D2 ; ROM $0004DD: F0 03 + jmp Main_UpdateAudioChannelPath_C34A ; ROM $0004DF: 4C 4A C3 +; Routine: Main_Dispatch_C4D2 +; Global: Reachable code entry at CPU $C4D2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_Dispatch_C4D2: + jmp Main_WriteZpDB_C33C ; ROM $0004E2: 4C 3C C3 +; Routine: Main_WriteGameMode_C4D5 +; Global: Reachable code entry at CPU $C4D5 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteGameMode_C4D5: + lda #$0A ; ROM $0004E5: A9 0A + sta $B5 ; ROM $0004E7: 85 B5 + jsr Main_ReadGameMode_C60B ; ROM $0004E9: 20 0B C6 + inc $68 ; ROM $0004EC: E6 68 + inc $58 ; ROM $0004EE: E6 58 + ldy #$00 ; ROM $0004F0: A0 00 + lda $58 ; ROM $0004F2: A5 58 + cmp #$33 ; ROM $0004F4: C9 33 + bne Main_AdvanceIndexY_C4EB ; ROM $0004F6: D0 03 + jmp Main_WriteObjectX_C56C ; ROM $0004F8: 4C 6C C5 +; Routine: Main_AdvanceIndexY_C4EB +; Global: Reachable code entry at CPU $C4EB traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_AdvanceIndexY_C4EB: + iny ; ROM $0004FB: C8 + sec ; ROM $0004FC: 38 + sbc #$05 ; ROM $0004FD: E9 05 + bcs Main_AdvanceIndexY_C4EB ; ROM $0004FF: B0 FA + dey ; ROM $000501: 88 + cpy #$08 ; ROM $000502: C0 08 + bcc Main_WriteZp7E_C4F8 ; ROM $000504: 90 02 + ldy #$08 ; ROM $000506: A0 08 +; Routine: Main_WriteZp7E_C4F8 +; Global: Reachable code entry at CPU $C4F8 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteZp7E_C4F8: + sty $7E ; ROM $000508: 84 7E + adc #$05 ; ROM $00050A: 69 05 + cmp #$01 ; ROM $00050C: C9 01 + beq Main_WriteNmiWorkPending_C503 ; ROM $00050E: F0 03 + jmp Main_WriteZpB1_C410 ; ROM $000510: 4C 10 C4 +; Routine: Main_WriteNmiWorkPending_C503 +; Global: Reachable code entry at CPU $C503 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteNmiWorkPending_C503: + lda #$00 ; ROM $000513: A9 00 + sta $60 ; ROM $000515: 85 60 + jsr Menu_WriteZp0E_DE53 ; ROM $000517: 20 53 DE + lda #$02 ; ROM $00051A: A9 02 + sta $B5 ; ROM $00051C: 85 B5 + jsr Main_ReadGameMode_C60B ; ROM $00051E: 20 0B C6 + jsr Ppu_HandleControl_C2B9 ; ROM $000521: 20 B9 C2 + jsr Gameplay_WriteTransferPointer_CA72 ; ROM $000524: 20 72 CA + jsr Main_WriteObjectType_C5CE ; ROM $000527: 20 CE C5 + jsr Main_CallHelper_C5FF ; ROM $00052A: 20 FF C5 + jsr Gameplay_HandleControl_CBC5 ; ROM $00052D: 20 C5 CB + lda #$06 ; ROM $000530: A9 06 + sta $B5 ; ROM $000532: 85 B5 + lda #$01 ; ROM $000534: A9 01 + sta $7A ; ROM $000536: 85 7A + sta $7D ; ROM $000538: 85 7D + lda #$1E ; ROM $00053A: A9 1E + sta $93 ; ROM $00053C: 85 93 +; Routine: Main_ReadZp93_C52E +; Global: Reachable code entry at CPU $C52E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadZp93_C52E: + jsr Main_WriteStageCounter_C613 ; ROM $00053E: 20 13 C6 + lda $93 ; ROM $000541: A5 93 + beq Main_WriteGameMode_C55C ; ROM $000543: F0 27 + jsr HideAllSprites ; ROM $000545: 20 68 C2 + jsr Gameplay_HandleControl_C8ED ; ROM $000548: 20 ED C8 + jsr Frame_ReadZp7D_CC36 ; ROM $00054B: 20 36 CC + jsr Gameplay_HandleControl_C96A ; ROM $00054E: 20 6A C9 + jsr Frame_ReadObjectIndex_CE5B ; ROM $000551: 20 5B CE + jsr Object_WriteStageProgress_CFB0 ; ROM $000554: 20 B0 CF + jsr Gameplay_HandleControl_CA1B ; ROM $000557: 20 1B CA + jsr Main_ReadZp33_C65F ; ROM $00055A: 20 5F C6 + lda $33 ; ROM $00055D: A5 33 + and #$01 ; ROM $00055F: 29 01 + bne Main_ReadZp93_C52E ; ROM $000561: D0 DB + jsr GameplayUpdate ; ROM $000563: 20 9D C7 + jsr Main_HandleControl_C66C ; ROM $000566: 20 6C C6 + jmp Main_ReadZp93_C52E ; ROM $000569: 4C 2E C5 +; Routine: Main_WriteGameMode_C55C +; Global: Reachable code entry at CPU $C55C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteGameMode_C55C: + lda #$0A ; ROM $00056C: A9 0A + sta $B5 ; ROM $00056E: 85 B5 + jsr Main_ReadGameMode_C60B ; ROM $000570: 20 0B C6 + lda #$00 ; ROM $000573: A9 00 + sta $7D ; ROM $000575: 85 7D + sta $7A ; ROM $000577: 85 7A + jmp Main_WriteZpB1_C410 ; ROM $000579: 4C 10 C4 +; Routine: Main_WriteObjectX_C56C +; Global: Reachable code entry at CPU $C56C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteObjectX_C56C: + jsr InitializeVideoSystem ; ROM $00057C: 20 F2 C1 + jsr Menu_WriteWorkValue_DBF9 ; ROM $00057F: 20 F9 DB + jsr Gameplay_WriteTransferPointer_CA72 ; ROM $000582: 20 72 CA + lda #$08 ; ROM $000585: A9 08 + sta $29 ; ROM $000587: 85 29 + sta $2B ; ROM $000589: 85 2B + lda #$00 ; ROM $00058B: A9 00 + sta $60 ; ROM $00058D: 85 60 + sta $28 ; ROM $00058F: 85 28 + lda #$09 ; ROM $000591: A9 09 + sta $2A ; ROM $000593: 85 2A + lda #$07 ; ROM $000595: A9 07 + sta $B5 ; ROM $000597: 85 B5 + jsr Ppu_HandleControl_C262 ; ROM $000599: 20 62 C2 + jsr EnableNmiInPpuControl ; ROM $00059C: 20 B0 C2 +; Routine: Main_WriteStageCounter_C58F +; Global: Reachable code entry at CPU $C58F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteStageCounter_C58F: + jsr WaitForNmiFrameHandoff ; ROM $00059F: 20 FB CB + lda #$01 ; ROM $0005A2: A9 01 + sta $39 ; ROM $0005A4: 85 39 + jsr HideAllSprites ; ROM $0005A6: 20 68 C2 + jsr Frame_ReadObjectIndex_CE5B ; ROM $0005A9: 20 5B CE + lda $33 ; ROM $0005AC: A5 33 + ror a ; ROM $0005AE: 6A + bcs Main_ReadObjectType_C5A4 ; ROM $0005AF: B0 03 + jsr Frame_ReadObjectX_CDD4 ; ROM $0005B1: 20 D4 CD +; Routine: Main_ReadObjectType_C5A4 +; Global: Reachable code entry at CPU $C5A4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadObjectType_C5A4: + lda $28 ; ROM $0005B4: A5 28 + cmp #$08 ; ROM $0005B6: C9 08 + bne Main_WriteStageCounter_C58F ; ROM $0005B8: D0 E5 +; Routine: Main_WriteStageCounter_C5AA +; Global: Reachable code entry at CPU $C5AA traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteStageCounter_C5AA: + jsr WaitForNmiFrameHandoff ; ROM $0005BA: 20 FB CB + lda #$01 ; ROM $0005BD: A9 01 + sta $39 ; ROM $0005BF: 85 39 + jsr HideAllSprites ; ROM $0005C1: 20 68 C2 + jsr Frame_ReadZp2D_CEA7 ; ROM $0005C4: 20 A7 CE + lda $33 ; ROM $0005C7: A5 33 + ror a ; ROM $0005C9: 6A + bcs Main_ReadGameMode_C5BF ; ROM $0005CA: B0 03 + jsr Frame_ReadObjectX_CDD4 ; ROM $0005CC: 20 D4 CD +; Routine: Main_ReadGameMode_C5BF +; Global: Reachable code entry at CPU $C5BF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadGameMode_C5BF: + lda $B5 ; ROM $0005CF: A5 B5 + bne Main_WriteStageCounter_C5AA ; ROM $0005D1: D0 E7 +; Routine: Main_WriteZp58_C5C3 +; Global: Reachable code entry at CPU $C5C3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteZp58_C5C3: + lda ControllerState1 ; ROM $0005D3: A5 12 + beq Main_WriteZp58_C5C3 ; ROM $0005D5: F0 FC + lda #$01 ; ROM $0005D7: A9 01 + sta $58 ; ROM $0005D9: 85 58 + jmp Main_WriteZpB1_C410 ; ROM $0005DB: 4C 10 C4 +; Routine: Main_WriteObjectType_C5CE +; Global: Reachable code entry at CPU $C5CE traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteObjectType_C5CE: + lda #$01 ; ROM $0005DE: A9 01 + sta $28 ; ROM $0005E0: 85 28 + sta $2A ; ROM $0005E2: 85 2A + lda #$08 ; ROM $0005E4: A9 08 + sta $29 ; ROM $0005E6: 85 29 + sta $2B ; ROM $0005E8: 85 2B + lda #$00 ; ROM $0005EA: A9 00 + sta $2C ; ROM $0005EC: 85 2C + sta $5D ; ROM $0005EE: 85 5D + sta $5C ; ROM $0005F0: 85 5C + sta $5E ; ROM $0005F2: 85 5E + jsr Gameplay_HandleControl_CBC5 ; ROM $0005F4: 20 C5 CB + jsr Stage_ReadZp58_D69A ; ROM $0005F7: 20 9A D6 + jsr Gameplay_WriteWorkValue_CB06 ; ROM $0005FA: 20 06 CB + jsr WaitForVBlankTransition ; ROM $0005FD: 20 8B C2 + jsr UploadSystemPalette ; ROM $000600: 20 C3 C2 + ldx $58 ; ROM $000603: A6 58 + lda $CC03,x ; ROM $000605: BD 03 CC + sta $5B ; ROM $000608: 85 5B + lda #$01 ; ROM $00060A: A9 01 + sta $60 ; ROM $00060C: 85 60 + rts ; ROM $00060E: 60 +; Routine: Main_CallHelper_C5FF +; Global: Reachable code entry at CPU $C5FF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_CallHelper_C5FF: + jsr HideAllSprites ; ROM $00060F: 20 68 C2 + jsr EnableNmiInPpuControl ; ROM $000612: 20 B0 C2 + jsr Ppu_CallHelper_C23B ; ROM $000615: 20 3B C2 + jmp Ppu_HandleControl_C262 ; ROM $000618: 4C 62 C2 +; Routine: Main_ReadGameMode_C60B +; Global: Reachable code entry at CPU $C60B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadGameMode_C60B: + lda $B5 ; ROM $00061B: A5 B5 + bne Main_ReadGameMode_C60B ; ROM $00061D: D0 FC + rts ; ROM $00061F: 60 +; Routine: Main_Dispatch_C610 +; Global: Reachable code entry at CPU $C610 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_Dispatch_C610: + jmp Main_WriteGameMode_C4C3 ; ROM $000620: 4C C3 C4 +; Routine: Main_WriteStageCounter_C613 +; Global: Reachable code entry at CPU $C613 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteStageCounter_C613: + jsr WaitForNmiFrameHandoff ; ROM $000623: 20 FB CB + lda #$01 ; ROM $000626: A9 01 + sta $39 ; ROM $000628: 85 39 + lda ControllerState1 ; ROM $00062A: A5 12 + and #$10 ; ROM $00062C: 29 10 + beq Main_ReturnToCaller_C643 ; ROM $00062E: F0 23 + lda $59 ; ROM $000630: A5 59 + bne Main_Dispatch_C610 ; ROM $000632: D0 EC + lda #$01 ; ROM $000634: A9 01 + sta $B2 ; ROM $000636: 85 B2 + lda #$06 ; ROM $000638: A9 06 + sta $DF ; ROM $00063A: 85 DF + jsr WaitForFrameBoundary ; ROM $00063C: 20 07 C3 +; Routine: Main_WriteSoundCommandState_C62F +; Global: Reachable code entry at CPU $C62F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteSoundCommandState_C62F: + lda ControllerState1 ; ROM $00063F: A5 12 + and #$10 ; ROM $000641: 29 10 + beq Main_WriteSoundCommandState_C62F ; ROM $000643: F0 FA + lda #$06 ; ROM $000645: A9 06 + sta $DF ; ROM $000647: 85 DF + lda #$00 ; ROM $000649: A9 00 + sta $B2 ; ROM $00064B: 85 B2 + jsr WaitForFrameBoundary ; ROM $00064D: 20 07 C3 + jmp WaitForNmiFrameHandoff ; ROM $000650: 4C FB CB +; Routine: Main_ReturnToCaller_C643 +; Global: Reachable code entry at CPU $C643 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReturnToCaller_C643: + rts ; ROM $000653: 60 +; Routine: Main_ReadZp33_C644 +; Global: Reachable code entry at CPU $C644 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadZp33_C644: + lda $33 ; ROM $000654: A5 33 + and #$3F ; ROM $000656: 29 3F + bne Main_ReturnToCaller_C65E ; ROM $000658: D0 14 + lda $93 ; ROM $00065A: A5 93 + cmp #$FF ; ROM $00065C: C9 FF + beq Main_ReturnToCaller_C65E ; ROM $00065E: F0 0E + dec $93 ; ROM $000660: C6 93 + bne Main_ReturnToCaller_C65E ; ROM $000662: D0 0A + jsr Gameplay_HandleControl_CBD7 ; ROM $000664: 20 D7 CB + lda #$08 ; ROM $000667: A9 08 + sta $7E ; ROM $000669: 85 7E + jmp Gameplay_HandleControl_C8ED ; ROM $00066B: 4C ED C8 +; Routine: Main_ReturnToCaller_C65E +; Global: Reachable code entry at CPU $C65E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReturnToCaller_C65E: + rts ; ROM $00066E: 60 +; Routine: Main_ReadZp33_C65F +; Global: Reachable code entry at CPU $C65F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadZp33_C65F: + lda $33 ; ROM $00066F: A5 33 + and #$3F ; ROM $000671: 29 3F + bne Main_ReturnToCaller_C65E ; ROM $000673: D0 F9 + lda $93 ; ROM $000675: A5 93 + beq Main_ReturnToCaller_C65E ; ROM $000677: F0 F5 + dec $93 ; ROM $000679: C6 93 + rts ; ROM $00067B: 60 +; Routine: Main_HandleControl_C66C +; Global: Reachable code entry at CPU $C66C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_HandleControl_C66C: + ldx #$4F ; ROM $00067C: A2 4F +; Routine: Main_ReadRam03E6_C66E +; Global: Reachable code entry at CPU $C66E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadRam03E6_C66E: + lda $03E6,x ; ROM $00067E: BD E6 03 + beq Main_Dispatch_C6CD ; ROM $000681: F0 5A + bpl Main_ReadRam0436_C688 ; ROM $000683: 10 13 + and #$7F ; ROM $000685: 29 7F + tay ; ROM $000687: A8 + lda $0436,x ; ROM $000688: BD 36 04 + sta $1F ; ROM $00068B: 85 1F + lda $0486,x ; ROM $00068D: BD 86 04 + sta $20 ; ROM $000690: 85 20 + lda $C75D,y ; ROM $000692: B9 5D C7 + jmp Main_ReadZp5C_C6DA ; ROM $000695: 4C DA C6 +; Routine: Main_ReadRam0436_C688 +; Global: Reachable code entry at CPU $C688 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadRam0436_C688: + lda $0436,x ; ROM $000698: BD 36 04 + sta $1F ; ROM $00069B: 85 1F + lda $0486,x ; ROM $00069D: BD 86 04 + sta $20 ; ROM $0006A0: 85 20 + lda $0526,x ; ROM $0006A2: BD 26 05 + and #$78 ; ROM $0006A5: 29 78 + beq Main_Dispatch_C6CD ; ROM $0006A7: F0 34 + lda $0526,x ; ROM $0006A9: BD 26 05 + bpl Main_WriteZp32_C6B2 ; ROM $0006AC: 10 14 + and #$07 ; ROM $0006AE: 29 07 + sta $32 ; ROM $0006B0: 85 32 + lda $0526,x ; ROM $0006B2: BD 26 05 + lsr a ; ROM $0006B5: 4A + and #$3C ; ROM $0006B6: 29 3C + clc ; ROM $0006B8: 18 + adc $32 ; ROM $0006B9: 65 32 + tay ; ROM $0006BB: A8 + lda $C778,y ; ROM $0006BC: B9 78 C7 + jmp Main_ReadZp5C_C6DA ; ROM $0006BF: 4C DA C6 +; Routine: Main_WriteZp32_C6B2 +; Global: Reachable code entry at CPU $C6B2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_WriteZp32_C6B2: + and #$07 ; ROM $0006C2: 29 07 + beq Main_ReadRam0526_C6D0 ; ROM $0006C4: F0 1A + and #$01 ; ROM $0006C6: 29 01 + eor #$01 ; ROM $0006C8: 49 01 + sta $32 ; ROM $0006CA: 85 32 + lda $0526,x ; ROM $0006CC: BD 26 05 + lsr a ; ROM $0006CF: 4A + lsr a ; ROM $0006D0: 4A + and #$1E ; ROM $0006D1: 29 1E + clc ; ROM $0006D3: 18 + adc $32 ; ROM $0006D4: 65 32 + clc ; ROM $0006D6: 18 + adc #$07 ; ROM $0006D7: 69 07 + tay ; ROM $0006D9: A8 + jmp Main_ReadRamC764_C6D6 ; ROM $0006DA: 4C D6 C6 +; Routine: Main_Dispatch_C6CD +; Global: Reachable code entry at CPU $C6CD traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_Dispatch_C6CD: + jmp Main_RetreatIndexX_C756 ; ROM $0006DD: 4C 56 C7 +; Routine: Main_ReadRam0526_C6D0 +; Global: Reachable code entry at CPU $C6D0 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadRam0526_C6D0: + lda $0526,x ; ROM $0006E0: BD 26 05 + lsr a ; ROM $0006E3: 4A + lsr a ; ROM $0006E4: 4A + lsr a ; ROM $0006E5: 4A +; Routine: Main_ReadRamC764_C6D6 +; Global: Reachable code entry at CPU $C6D6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadRamC764_C6D6: + tay ; ROM $0006E6: A8 + lda $C764,y ; ROM $0006E7: B9 64 C7 +; Routine: Main_ReadZp5C_C6DA +; Global: Reachable code entry at CPU $C6DA traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadZp5C_C6DA: + and #$FF ; ROM $0006EA: 29 FF + beq Main_CallHelper_C753 ; ROM $0006EC: F0 75 + jsr Stage_WriteObjectWorkX_D8FC ; ROM $0006EE: 20 FC D8 + lda $5C ; ROM $0006F1: A5 5C + bne Main_HandleControl_C705 ; ROM $0006F3: D0 20 + lda $79 ; ROM $0006F5: A5 79 + bne Main_HandleControl_C705 ; ROM $0006F7: D0 1C + lda $7A ; ROM $0006F9: A5 7A + bne Main_HandleControl_C705 ; ROM $0006FB: D0 18 + lda $28 ; ROM $0006FD: A5 28 + cmp $1F ; ROM $0006FF: C5 1F + bne Main_HandleControl_C705 ; ROM $000701: D0 12 + lda $2A ; ROM $000703: A5 2A + cmp $20 ; ROM $000705: C5 20 + bne Main_HandleControl_C705 ; ROM $000707: D0 0C + lda #$05 ; ROM $000709: A9 05 + sta $DF ; ROM $00070B: 85 DF + lda #$01 ; ROM $00070D: A9 01 + sta $5C ; ROM $00070F: 85 5C + lda #$0C ; ROM $000711: A9 0C + sta $2C ; ROM $000713: 85 2C +; Routine: Main_HandleControl_C705 +; Global: Reachable code entry at CPU $C705 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_HandleControl_C705: + ldy #$09 ; ROM $000715: A0 09 +; Routine: Main_ReadRam0576_C707 +; Global: Reachable code entry at CPU $C707 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReadRam0576_C707: + lda $0576,y ; ROM $000717: B9 76 05 + beq Main_RetreatIndexY_C74E ; ROM $00071A: F0 42 + cmp #$09 ; ROM $00071C: C9 09 + bcs Main_RetreatIndexY_C74E ; ROM $00071E: B0 3E + lda $0580,y ; ROM $000720: B9 80 05 + cmp $1F ; ROM $000723: C5 1F + bne Main_RetreatIndexY_C74E ; ROM $000725: D0 37 + lda $0594,y ; ROM $000727: B9 94 05 + cmp $20 ; ROM $00072A: C5 20 + bne Main_RetreatIndexY_C74E ; ROM $00072C: D0 30 + inc $9E ; ROM $00072E: E6 9E + lda #$00 ; ROM $000730: A9 00 + sta $A0 ; ROM $000732: 85 A0 + sta $A1 ; ROM $000734: 85 A1 + sta $A2 ; ROM $000736: 85 A2 + sta $A3 ; ROM $000738: 85 A3 + lda #$64 ; ROM $00073A: A9 64 + sta $05C6,y ; ROM $00073C: 99 C6 05 + lda $0576,y ; ROM $00073F: B9 76 05 + sta $05D0,y ; ROM $000742: 99 D0 05 + lda $6A ; ROM $000745: A5 6A + sta $05DA,y ; ROM $000747: 99 DA 05 + inc $6A ; ROM $00074A: E6 6A + lda #$09 ; ROM $00074C: A9 09 + sta $0576,y ; ROM $00074E: 99 76 05 + lda $05A8,y ; ROM $000751: B9 A8 05 + lsr a ; ROM $000754: 4A + lsr a ; ROM $000755: 4A + and #$07 ; ROM $000756: 29 07 + clc ; ROM $000758: 18 + adc #$20 ; ROM $000759: 69 20 + sta $05A8,y ; ROM $00075B: 99 A8 05 +; Routine: Main_RetreatIndexY_C74E +; Global: Reachable code entry at CPU $C74E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_RetreatIndexY_C74E: + dey ; ROM $00075E: 88 + bpl Main_ReadRam0576_C707 ; ROM $00075F: 10 B6 + bmi Main_RetreatIndexX_C756 ; ROM $000761: 30 03 +; Routine: Main_CallHelper_C753 +; Global: Reachable code entry at CPU $C753 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_CallHelper_C753: + jsr Stage_WriteObjectWorkX_D8FC ; ROM $000763: 20 FC D8 +; Routine: Main_RetreatIndexX_C756 +; Global: Reachable code entry at CPU $C756 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_RetreatIndexX_C756: + dex ; ROM $000766: CA + bmi Main_ReturnToCaller_C75C ; ROM $000767: 30 03 + jmp Main_ReadRam03E6_C66E ; ROM $000769: 4C 6E C6 +; Routine: Main_ReturnToCaller_C75C +; Global: Reachable code entry at CPU $C75C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Main_ReturnToCaller_C75C: + rts ; ROM $00076C: 60 + +; Data region: CPU $C75D-$C79C; unreachable by direct recursive trace. +MainStateDispatchTable: + .byte $27, $03, $04, $05, $06, $07, $00, $00, $0B, $0C, $0D, $0E, $0D, $0C, $0B, $00 ; ROM $00076D: 27 03 04 05 06 07 00 00 0B 0C 0D 0E 0D 0C 0B 00 + .byte $0F, $10, $11, $12, $13, $14, $15, $16, $13, $14, $11, $12, $0F, $10, $00, $00 ; ROM $00077D: 0F 10 11 12 13 14 15 16 13 14 11 12 0F 10 00 00 + .byte $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $1F, $20, $21, $22, $23, $24, $25, $26 ; ROM $00078D: 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 + .byte $1F, $20, $21, $22, $1B, $1C, $1D, $1E, $17, $18, $19, $1A, $00, $00, $00, $00 ; ROM $00079D: 1F 20 21 22 1B 1C 1D 1E 17 18 19 1A 00 00 00 00 +; Routine: GameplayUpdate +; Global: Reachable code entry at CPU $C79D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +GameplayUpdate: + ldx #$4F ; ROM $0007AD: A2 4F +; Routine: Gameplay_ReadRam03E6_C79F +; Global: Reachable code entry at CPU $C79F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRam03E6_C79F: + lda $03E6,x ; ROM $0007AF: BD E6 03 + bne Gameplay_ReadRam0486_C7A7 ; ROM $0007B2: D0 03 +; Routine: Gameplay_Dispatch_C7A4 +; Global: Reachable code entry at CPU $C7A4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_Dispatch_C7A4: + jmp Gameplay_RetreatIndexX_C8A6 ; ROM $0007B4: 4C A6 C8 +; Routine: Gameplay_ReadRam0486_C7A7 +; Global: Reachable code entry at CPU $C7A7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRam0486_C7A7: + pha ; ROM $0007B7: 48 + ldy $0486,x ; ROM $0007B8: BC 86 04 + sty $20 ; ROM $0007BB: 84 20 + jsr Gameplay_ReadRamE2A3_CBEB ; ROM $0007BD: 20 EB CB + ldy $0436,x ; ROM $0007C0: BC 36 04 + sty $1F ; ROM $0007C3: 84 1F + pla ; ROM $0007C5: 68 + bpl Gameplay_ReadTransferPointer_C7CB ; ROM $0007C6: 10 13 + inc $03E6,x ; ROM $0007C8: FE E6 03 + lda $03E6,x ; ROM $0007CB: BD E6 03 + cmp #$87 ; ROM $0007CE: C9 87 + bne Gameplay_Dispatch_C7A4 ; ROM $0007D0: D0 E2 + lda #$00 ; ROM $0007D2: A9 00 + sta $03E6,x ; ROM $0007D4: 9D E6 03 + sta ($34),y ; ROM $0007D7: 91 34 + beq Gameplay_Dispatch_C7A4 ; ROM $0007D9: F0 D9 +; Routine: Gameplay_ReadTransferPointer_C7CB +; Global: Reachable code entry at CPU $C7CB traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadTransferPointer_C7CB: + lda ($34),y ; ROM $0007DB: B1 34 + tay ; ROM $0007DD: A8 + beq Gameplay_ReadRam0526_C838 ; ROM $0007DE: F0 68 + cpy #$02 ; ROM $0007E0: C0 02 + bne Gameplay_ReadRam04D6_C7DE ; ROM $0007E2: D0 0A + inc $A4 ; ROM $0007E4: E6 A4 + lda #$80 ; ROM $0007E6: A9 80 + sta $03E6,x ; ROM $0007E8: 9D E6 03 + jmp Gameplay_RetreatIndexX_C8A6 ; ROM $0007EB: 4C A6 C8 +; Routine: Gameplay_ReadRam04D6_C7DE +; Global: Reachable code entry at CPU $C7DE traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRam04D6_C7DE: + cpy #$03 ; ROM $0007EE: C0 03 + bne Gameplay_ReadWorkIndex_C7EE ; ROM $0007F0: D0 0C + lda $04D6,x ; ROM $0007F2: BD D6 04 + ora #$10 ; ROM $0007F5: 09 10 + ldy $1F ; ROM $0007F7: A4 1F + sta ($34),y ; ROM $0007F9: 91 34 + jmp Gameplay_WriteRam03E6_C830 ; ROM $0007FB: 4C 30 C8 +; Routine: Gameplay_ReadWorkIndex_C7EE +; Global: Reachable code entry at CPU $C7EE traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadWorkIndex_C7EE: + cpy #$04 ; ROM $0007FE: C0 04 + bne Gameplay_ReadWorkIndex_C800 ; ROM $000800: D0 0E + ldy $1F ; ROM $000802: A4 1F + lda #$08 ; ROM $000804: A9 08 + sta ($34),y ; ROM $000806: 91 34 + lda #$28 ; ROM $000808: A9 28 + jsr Stage_WriteObjectWorkX_D8FC ; ROM $00080A: 20 FC D8 + jmp Gameplay_WriteRam03E6_C830 ; ROM $00080D: 4C 30 C8 +; Routine: Gameplay_ReadWorkIndex_C800 +; Global: Reachable code entry at CPU $C800 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadWorkIndex_C800: + cpy #$05 ; ROM $000810: C0 05 + bne Gameplay_ReadWorkIndex_C815 ; ROM $000812: D0 11 + ldy $1F ; ROM $000814: A4 1F + lda #$06 ; ROM $000816: A9 06 + sta ($34),y ; ROM $000818: 91 34 + lda #$28 ; ROM $00081A: A9 28 + clc ; ROM $00081C: 18 + adc $5B ; ROM $00081D: 65 5B + jsr Stage_WriteObjectWorkX_D8FC ; ROM $00081F: 20 FC D8 + jmp Gameplay_WriteRam03E6_C830 ; ROM $000822: 4C 30 C8 +; Routine: Gameplay_ReadWorkIndex_C815 +; Global: Reachable code entry at CPU $C815 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadWorkIndex_C815: + cpy #$08 ; ROM $000825: C0 08 + beq Gameplay_IncrementBonusTimer_C828 ; ROM $000827: F0 0F + cpy #$06 ; ROM $000829: C0 06 + bne Gameplay_WriteRam03E6_C830 ; ROM $00082B: D0 13 + ldy $1F ; ROM $00082D: A4 1F + lda #$00 ; ROM $00082F: A9 00 + sta ($34),y ; ROM $000831: 91 34 + jsr Stage_WriteObjectWorkX_D8FC ; ROM $000833: 20 FC D8 + dec $A7 ; ROM $000836: C6 A7 +; Routine: Gameplay_IncrementBonusTimer_C828 +; Global: Reachable code entry at CPU $C828 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_IncrementBonusTimer_C828: + inc $A7 ; ROM $000838: E6 A7 + jsr Gameplay_HandleControl_C8AD ; ROM $00083A: 20 AD C8 + jmp Gameplay_WriteRam03E6_C830 ; ROM $00083D: 4C 30 C8 +; Routine: Gameplay_WriteRam03E6_C830 +; Global: Reachable code entry at CPU $C830 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteRam03E6_C830: + lda #$00 ; ROM $000840: A9 00 + sta $03E6,x ; ROM $000842: 9D E6 03 +; Routine: Gameplay_Dispatch_C835 +; Global: Reachable code entry at CPU $C835 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_Dispatch_C835: + jmp Gameplay_RetreatIndexX_C8A6 ; ROM $000845: 4C A6 C8 +; Routine: Gameplay_ReadRam0526_C838 +; Global: Reachable code entry at CPU $C838 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRam0526_C838: + lda $0526,x ; ROM $000848: BD 26 05 + clc ; ROM $00084B: 18 + adc #$08 ; ROM $00084C: 69 08 + sta $0526,x ; ROM $00084E: 9D 26 05 + and #$7F ; ROM $000851: 29 7F + cmp #$48 ; ROM $000853: C9 48 + bcs Gameplay_ReadWorkIndex_C7EE ; ROM $000855: B0 A7 + lda $04D6,x ; ROM $000857: BD D6 04 + sta $36 ; ROM $00085A: 85 36 + and #$07 ; ROM $00085C: 29 07 + beq Gameplay_Dispatch_C835 ; ROM $00085E: F0 E5 + tay ; ROM $000860: A8 + lda #$00 ; ROM $000861: A9 00 + sta $04D6,x ; ROM $000863: 9D D6 04 + lda $0436,x ; ROM $000866: BD 36 04 + clc ; ROM $000869: 18 + adc $CA16,y ; ROM $00086A: 79 16 CA + sta $1F ; ROM $00086D: 85 1F + lda $0486,x ; ROM $00086F: BD 86 04 + clc ; ROM $000872: 18 + adc $CA11,y ; ROM $000873: 79 11 CA + sta $20 ; ROM $000876: 85 20 + ldy #$4F ; ROM $000878: A0 4F + jsr Gameplay_ReadRam03E6_CBE5 ; ROM $00087A: 20 E5 CB + bne Gameplay_RetreatIndexX_C8A6 ; ROM $00087D: D0 37 + lda $1F ; ROM $00087F: A5 1F + sta $0436,y ; ROM $000881: 99 36 04 + lda $20 ; ROM $000884: A5 20 + sta $0486,y ; ROM $000886: 99 86 04 + lda #$01 ; ROM $000889: A9 01 + sta $03E6,y ; ROM $00088B: 99 E6 03 + lda $36 ; ROM $00088E: A5 36 + and #$07 ; ROM $000890: 29 07 + sta $0526,y ; ROM $000892: 99 26 05 + lda $36 ; ROM $000895: A5 36 + clc ; ROM $000897: 18 + adc #$10 ; ROM $000898: 69 10 + cmp $73 ; ROM $00089A: C5 73 + bcc Gameplay_WriteRam04D6_C89E ; ROM $00089C: 90 10 + lda #$00 ; ROM $00089E: A9 00 + sta $03E6,y ; ROM $0008A0: 99 E6 03 + lda $0526,x ; ROM $0008A3: BD 26 05 + ora #$80 ; ROM $0008A6: 09 80 + sta $0526,x ; ROM $0008A8: 9D 26 05 + jmp Gameplay_WriteRam04D6_C8A1 ; ROM $0008AB: 4C A1 C8 +; Routine: Gameplay_WriteRam04D6_C89E +; Global: Reachable code entry at CPU $C89E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteRam04D6_C89E: + sta $04D6,y ; ROM $0008AE: 99 D6 04 +; Routine: Gameplay_WriteRam04D6_C8A1 +; Global: Reachable code entry at CPU $C8A1 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteRam04D6_C8A1: + lda #$00 ; ROM $0008B1: A9 00 + sta $04D6,x ; ROM $0008B3: 9D D6 04 +; Routine: Gameplay_RetreatIndexX_C8A6 +; Global: Reachable code entry at CPU $C8A6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_RetreatIndexX_C8A6: + dex ; ROM $0008B6: CA + bmi Gameplay_ReturnToCaller_C8AC ; ROM $0008B7: 30 03 + jmp Gameplay_ReadRam03E6_C79F ; ROM $0008B9: 4C 9F C7 +; Routine: Gameplay_ReturnToCaller_C8AC +; Global: Reachable code entry at CPU $C8AC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReturnToCaller_C8AC: + rts ; ROM $0008BC: 60 +; Routine: Gameplay_HandleControl_C8AD +; Global: Reachable code entry at CPU $C8AD traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_HandleControl_C8AD: + ldy #$09 ; ROM $0008BD: A0 09 +; Routine: Gameplay_ReadRam0576_C8AF +; Global: Reachable code entry at CPU $C8AF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRam0576_C8AF: + lda $0576,y ; ROM $0008BF: B9 76 05 + bne Gameplay_RetreatIndexY_C8E9 ; ROM $0008C2: D0 35 + lda $5B ; ROM $0008C4: A5 5B + sta $0576,y ; ROM $0008C6: 99 76 05 + sta $05A8,y ; ROM $0008C9: 99 A8 05 + lda #$08 ; ROM $0008CC: A9 08 + sta $058A,y ; ROM $0008CE: 99 8A 05 + sta $059E,y ; ROM $0008D1: 99 9E 05 + jsr AdvanceRandomState ; ROM $0008D4: 20 70 D6 + and #$03 ; ROM $0008D7: 29 03 + clc ; ROM $0008D9: 18 + adc #$01 ; ROM $0008DA: 69 01 + sta $05D0,y ; ROM $0008DC: 99 D0 05 + lda $1F ; ROM $0008DF: A5 1F + sta $0580,y ; ROM $0008E1: 99 80 05 + lda $20 ; ROM $0008E4: A5 20 + sta $0594,y ; ROM $0008E6: 99 94 05 + lda #$00 ; ROM $0008E9: A9 00 + sta $05DA,y ; ROM $0008EB: 99 DA 05 + sta $05C6,y ; ROM $0008EE: 99 C6 05 + sta $05E4,y ; ROM $0008F1: 99 E4 05 + lda #$1E ; ROM $0008F4: A9 1E + sta $05B2,y ; ROM $0008F6: 99 B2 05 +; Routine: Gameplay_RetreatIndexY_C8E9 +; Global: Reachable code entry at CPU $C8E9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_RetreatIndexY_C8E9: + dey ; ROM $0008F9: 88 + bpl Gameplay_ReadRam0576_C8AF ; ROM $0008FA: 10 C3 + rts ; ROM $0008FC: 60 +; Routine: Gameplay_HandleControl_C8ED +; Global: Reachable code entry at CPU $C8ED traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_HandleControl_C8ED: + ldy #$09 ; ROM $0008FD: A0 09 +; Routine: Gameplay_ReadRam0576_C8EF +; Global: Reachable code entry at CPU $C8EF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRam0576_C8EF: + lda $0576,y ; ROM $0008FF: B9 76 05 + bne Gameplay_RetreatIndexY_C935 ; ROM $000902: D0 41 + lda $7E ; ROM $000904: A5 7E + sta $0576,y ; ROM $000906: 99 76 05 + sec ; ROM $000909: 38 + sbc #$01 ; ROM $00090A: E9 01 + asl a ; ROM $00090C: 0A + asl a ; ROM $00090D: 0A + sta $05A8,y ; ROM $00090E: 99 A8 05 + lda #$08 ; ROM $000911: A9 08 + sta $058A,y ; ROM $000913: 99 8A 05 + sta $059E,y ; ROM $000916: 99 9E 05 + jsr AdvanceRandomState ; ROM $000919: 20 70 D6 + and #$03 ; ROM $00091C: 29 03 + clc ; ROM $00091E: 18 + adc #$01 ; ROM $00091F: 69 01 + sta $05D0,y ; ROM $000921: 99 D0 05 + sty $5A ; ROM $000924: 84 5A + jsr Gameplay_WriteObjectWorkX_CACF ; ROM $000926: 20 CF CA + ldy $5A ; ROM $000929: A4 5A + lda $24 ; ROM $00092B: A5 24 + sta $0580,y ; ROM $00092D: 99 80 05 + lda $25 ; ROM $000930: A5 25 + sta $0594,y ; ROM $000932: 99 94 05 + lda #$00 ; ROM $000935: A9 00 + sta $05DA,y ; ROM $000937: 99 DA 05 + sta $05C6,y ; ROM $00093A: 99 C6 05 + sta $05E4,y ; ROM $00093D: 99 E4 05 + lda #$1E ; ROM $000940: A9 1E + sta $05B2,y ; ROM $000942: 99 B2 05 +; Routine: Gameplay_RetreatIndexY_C935 +; Global: Reachable code entry at CPU $C935 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_RetreatIndexY_C935: + dey ; ROM $000945: 88 + bpl Gameplay_ReadRam0576_C8EF ; ROM $000946: 10 B7 + rts ; ROM $000948: 60 +; Routine: Gameplay_HandleControl_C939 +; Global: Reachable code entry at CPU $C939 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_HandleControl_C939: + ldx #$09 ; ROM $000949: A2 09 +; Routine: Gameplay_ReadRam03A0_C93B +; Global: Reachable code entry at CPU $C93B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRam03A0_C93B: + lda $03A0,x ; ROM $00094B: BD A0 03 + beq Gameplay_RetreatIndexX_C966 ; ROM $00094E: F0 26 + ldy $03B4,x ; ROM $000950: BC B4 03 + lda $E2A3,y ; ROM $000953: B9 A3 E2 + sta $34 ; ROM $000956: 85 34 + lda $E2B0,y ; ROM $000958: B9 B0 E2 + sta $35 ; ROM $00095B: 85 35 + sty $20 ; ROM $00095D: 84 20 + ldy $03AA,x ; ROM $00095F: BC AA 03 + sty $1F ; ROM $000962: 84 1F + lda #$00 ; ROM $000964: A9 00 + jsr Gameplay_WriteZp2F_C9B6 ; ROM $000966: 20 B6 C9 + jsr Gameplay_WriteDisplayMode_CBF6 ; ROM $000969: 20 F6 CB + lda #$00 ; ROM $00096C: A9 00 + sta ($34),y ; ROM $00096E: 91 34 + lda #$00 ; ROM $000970: A9 00 + sta $03A0,x ; ROM $000972: 9D A0 03 + rts ; ROM $000975: 60 +; Routine: Gameplay_RetreatIndexX_C966 +; Global: Reachable code entry at CPU $C966 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_RetreatIndexX_C966: + dex ; ROM $000976: CA + bpl Gameplay_ReadRam03A0_C93B ; ROM $000977: 10 D2 + rts ; ROM $000979: 60 +; Routine: Gameplay_HandleControl_C96A +; Global: Reachable code entry at CPU $C96A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_HandleControl_C96A: + ldx #$09 ; ROM $00097A: A2 09 +; Routine: Gameplay_ReadRam03A0_C96C +; Global: Reachable code entry at CPU $C96C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRam03A0_C96C: + lda $03A0,x ; ROM $00097C: BD A0 03 + beq Gameplay_RetreatIndexX_C9B2 ; ROM $00097F: F0 41 + ldy $03B4,x ; ROM $000981: BC B4 03 + lda $E2A3,y ; ROM $000984: B9 A3 E2 + sta $34 ; ROM $000987: 85 34 + lda $E2B0,y ; ROM $000989: B9 B0 E2 + sta $35 ; ROM $00098C: 85 35 + sty $20 ; ROM $00098E: 84 20 + ldy $03AA,x ; ROM $000990: BC AA 03 + sty $1F ; ROM $000993: 84 1F + lda ($34),y ; ROM $000995: B1 34 + cmp #$03 ; ROM $000997: C9 03 + bne Gameplay_ReadFlamePass_C999 ; ROM $000999: D0 0E + inc $03D2,x ; ROM $00099B: FE D2 03 + lda $77 ; ROM $00099E: A5 77 + bne Gameplay_RetreatIndexX_C9B2 ; ROM $0009A0: D0 20 + dec $03BE,x ; ROM $0009A2: DE BE 03 + bne Gameplay_RetreatIndexX_C9B2 ; ROM $0009A5: D0 1B + lda #$00 ; ROM $0009A7: A9 00 +; Routine: Gameplay_ReadFlamePass_C999 +; Global: Reachable code entry at CPU $C999 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadFlamePass_C999: + and #$07 ; ROM $0009A9: 29 07 + jsr Gameplay_WriteZp2F_C9B6 ; ROM $0009AB: 20 B6 C9 + lda $A5 ; ROM $0009AE: A5 A5 + cmp #$FF ; ROM $0009B0: C9 FF + beq Gameplay_WriteTransferPointer_C9A6 ; ROM $0009B2: F0 02 + inc $A5 ; ROM $0009B4: E6 A5 +; Routine: Gameplay_WriteTransferPointer_C9A6 +; Global: Reachable code entry at CPU $C9A6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteTransferPointer_C9A6: + jsr Gameplay_WriteDisplayMode_CBF6 ; ROM $0009B6: 20 F6 CB + lda #$00 ; ROM $0009B9: A9 00 + sta ($34),y ; ROM $0009BB: 91 34 + lda #$00 ; ROM $0009BD: A9 00 + sta $03A0,x ; ROM $0009BF: 9D A0 03 +; Routine: Gameplay_RetreatIndexX_C9B2 +; Global: Reachable code entry at CPU $C9B2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_RetreatIndexX_C9B2: + dex ; ROM $0009C2: CA + bpl Gameplay_ReadRam03A0_C96C ; ROM $0009C3: 10 B7 +; Routine: Gameplay_ReturnToCaller_C9B5 +; Global: Reachable code entry at CPU $C9B5 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReturnToCaller_C9B5: + rts ; ROM $0009C5: 60 +; Routine: Gameplay_WriteZp2F_C9B6 +; Global: Reachable code entry at CPU $C9B6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteZp2F_C9B6: + stx $2F ; ROM $0009C6: 86 2F + sty $30 ; ROM $0009C8: 84 30 + tay ; ROM $0009CA: A8 + lda $C9DE,y ; ROM $0009CB: B9 DE C9 + sta $2E ; ROM $0009CE: 85 2E + lda #$01 ; ROM $0009D0: A9 01 + jsr Gameplay_TestZp2E_C9E3 ; ROM $0009D2: 20 E3 C9 + lda #$02 ; ROM $0009D5: A9 02 + jsr Gameplay_TestZp2E_C9E3 ; ROM $0009D7: 20 E3 C9 + lda #$03 ; ROM $0009DA: A9 03 + jsr Gameplay_TestZp2E_C9E3 ; ROM $0009DC: 20 E3 C9 + lda #$04 ; ROM $0009DF: A9 04 + jsr Gameplay_TestZp2E_C9E3 ; ROM $0009E1: 20 E3 C9 + lda #$00 ; ROM $0009E4: A9 00 + jsr Gameplay_TestZp2E_C9E3 ; ROM $0009E6: 20 E3 C9 + ldx $2F ; ROM $0009E9: A6 2F + ldy $30 ; ROM $0009EB: A4 30 + rts ; ROM $0009ED: 60 + +; Data region: CPU $C9DE-$C9E2; unreachable by direct recursive trace. +GameplayDirectionDeltaTable: + .byte $FF, $03, $04, $01, $02 ; ROM $0009EE: FF 03 04 01 02 +; Routine: Gameplay_TestZp2E_C9E3 +; Global: Reachable code entry at CPU $C9E3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_TestZp2E_C9E3: + cmp $2E ; ROM $0009F3: C5 2E + beq Gameplay_ReturnToCaller_C9B5 ; ROM $0009F5: F0 CE + sta $31 ; ROM $0009F7: 85 31 + tax ; ROM $0009F9: AA + ldy #$4F ; ROM $0009FA: A0 4F + jsr Gameplay_ReadRam03E6_CBE5 ; ROM $0009FC: 20 E5 CB + bmi Gameplay_ReturnToCaller_CA10 ; ROM $0009FF: 30 1F + lda $20 ; ROM $000A01: A5 20 + clc ; ROM $000A03: 18 + adc $CA11,x ; ROM $000A04: 7D 11 CA + sta $0486,y ; ROM $000A07: 99 86 04 + lda $1F ; ROM $000A0A: A5 1F + clc ; ROM $000A0C: 18 + adc $CA16,x ; ROM $000A0D: 7D 16 CA + sta $0436,y ; ROM $000A10: 99 36 04 + lda $31 ; ROM $000A13: A5 31 + sta $04D6,y ; ROM $000A15: 99 D6 04 + sta $0526,y ; ROM $000A18: 99 26 05 + lda #$01 ; ROM $000A1B: A9 01 + sta $03E6,y ; ROM $000A1D: 99 E6 03 +; Routine: Gameplay_ReturnToCaller_CA10 +; Global: Reachable code entry at CPU $CA10 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReturnToCaller_CA10: + rts ; ROM $000A20: 60 + +; Data region: CPU $CA11-$CA1A; unreachable by direct recursive trace. +GameplayObjectClassTable: + .byte $00, $00, $FF, $00, $01, $00, $01, $00, $FF, $00 ; ROM $000A21: 00 00 FF 00 01 00 01 00 FF 00 +; Routine: Gameplay_HandleControl_CA1B +; Global: Reachable code entry at CPU $CA1B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_HandleControl_CA1B: + ldx #$09 ; ROM $000A2B: A2 09 +; Routine: Gameplay_ReadRam03A0_CA1D +; Global: Reachable code entry at CPU $CA1D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRam03A0_CA1D: + lda $03A0,x ; ROM $000A2D: BD A0 03 + beq Gameplay_RetreatIndexX_CA43 ; ROM $000A30: F0 21 + lda $03AA,x ; ROM $000A32: BD AA 03 + sta $1F ; ROM $000A35: 85 1F + lda $03B4,x ; ROM $000A37: BD B4 03 + sta $20 ; ROM $000A3A: 85 20 + lda $03D2,x ; ROM $000A3C: BD D2 03 + and #$0F ; ROM $000A3F: 29 0F + bne Gameplay_RetreatIndexX_CA43 ; ROM $000A41: D0 10 + lda $03D2,x ; ROM $000A43: BD D2 03 + lsr a ; ROM $000A46: 4A + lsr a ; ROM $000A47: 4A + lsr a ; ROM $000A48: 4A + lsr a ; ROM $000A49: 4A + and #$03 ; ROM $000A4A: 29 03 + tay ; ROM $000A4C: A8 + lda $CA47,y ; ROM $000A4D: B9 47 CA + jsr Stage_WriteObjectWorkX_D8FC ; ROM $000A50: 20 FC D8 +; Routine: Gameplay_RetreatIndexX_CA43 +; Global: Reachable code entry at CPU $CA43 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_RetreatIndexX_CA43: + dex ; ROM $000A53: CA + bpl Gameplay_ReadRam03A0_CA1D ; ROM $000A54: 10 D7 + rts ; ROM $000A56: 60 + +; Data region: CPU $CA47-$CA4A; unreachable by direct recursive trace. +GameplayObjectAttributeTable: + .byte $09, $0A, $09, $08 ; ROM $000A57: 09 0A 09 08 +; Routine: Gameplay_WriteTransferPointer_CA4B +; Global: Reachable code entry at CPU $CA4B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteTransferPointer_CA4B: + jsr Gameplay_WriteTransferPointer_CA72 ; ROM $000A5B: 20 72 CA + jsr Gameplay_WriteObjectWorkX_CACF ; ROM $000A5E: 20 CF CA + lda #$04 ; ROM $000A61: A9 04 + sta ($34),y ; ROM $000A63: 91 34 + jsr Gameplay_WriteObjectWorkX_CACF ; ROM $000A65: 20 CF CA + lda #$05 ; ROM $000A68: A9 05 + sta ($34),y ; ROM $000A6A: 91 34 + lda #$32 ; ROM $000A6C: A9 32 + clc ; ROM $000A6E: 18 + adc $58 ; ROM $000A6F: 65 58 + clc ; ROM $000A71: 18 + adc $58 ; ROM $000A72: 65 58 + sta $1F ; ROM $000A74: 85 1F +; Routine: Gameplay_WriteTransferPointer_CA66 +; Global: Reachable code entry at CPU $CA66 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteTransferPointer_CA66: + jsr Gameplay_WriteObjectWorkX_CACF ; ROM $000A76: 20 CF CA + lda #$02 ; ROM $000A79: A9 02 + sta ($34),y ; ROM $000A7B: 91 34 + dec $1F ; ROM $000A7D: C6 1F + bne Gameplay_WriteTransferPointer_CA66 ; ROM $000A7F: D0 F5 + rts ; ROM $000A81: 60 +; Routine: Gameplay_WriteTransferPointer_CA72 +; Global: Reachable code entry at CPU $CA72 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteTransferPointer_CA72: + lda #$00 ; ROM $000A82: A9 00 + sta $34 ; ROM $000A84: 85 34 + lda #$02 ; ROM $000A86: A9 02 + sta $35 ; ROM $000A88: 85 35 + ldy #$00 ; ROM $000A8A: A0 00 + ldx #$00 ; ROM $000A8C: A2 00 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000A8E: 20 BA CA + ldx #$20 ; ROM $000A91: A2 20 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000A93: 20 BA CA + ldx #$40 ; ROM $000A96: A2 40 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000A98: 20 BA CA + ldx #$20 ; ROM $000A9B: A2 20 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000A9D: 20 BA CA + ldx #$40 ; ROM $000AA0: A2 40 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000AA2: 20 BA CA + ldx #$20 ; ROM $000AA5: A2 20 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000AA7: 20 BA CA + ldx #$40 ; ROM $000AAA: A2 40 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000AAC: 20 BA CA + ldx #$20 ; ROM $000AAF: A2 20 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000AB1: 20 BA CA + ldx #$40 ; ROM $000AB4: A2 40 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000AB6: 20 BA CA + ldx #$20 ; ROM $000AB9: A2 20 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000ABB: 20 BA CA + ldx #$40 ; ROM $000ABE: A2 40 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000AC0: 20 BA CA + ldx #$20 ; ROM $000AC3: A2 20 + jsr Gameplay_WriteObjectWorkX_CABA ; ROM $000AC5: 20 BA CA + ldx #$00 ; ROM $000AC8: A2 00 +; Routine: Gameplay_WriteObjectWorkX_CABA +; Global: Reachable code entry at CPU $CABA traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteObjectWorkX_CABA: + lda #$20 ; ROM $000ACA: A9 20 + sta $24 ; ROM $000ACC: 85 24 +; Routine: Gameplay_ReadRamE243_CABE +; Global: Reachable code entry at CPU $CABE traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRamE243_CABE: + lda $E243,x ; ROM $000ACE: BD 43 E2 + sta ($34),y ; ROM $000AD1: 91 34 + inc $34 ; ROM $000AD3: E6 34 + bne Gameplay_DecrementObjectWorkX_CAC9 ; ROM $000AD5: D0 02 + inc $35 ; ROM $000AD7: E6 35 +; Routine: Gameplay_DecrementObjectWorkX_CAC9 +; Global: Reachable code entry at CPU $CAC9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_DecrementObjectWorkX_CAC9: + inx ; ROM $000AD9: E8 + dec $24 ; ROM $000ADA: C6 24 + bne Gameplay_ReadRamE243_CABE ; ROM $000ADC: D0 F0 + rts ; ROM $000ADE: 60 +; Routine: Gameplay_WriteObjectWorkX_CACF +; Global: Reachable code entry at CPU $CACF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteObjectWorkX_CACF: + jsr AdvanceRandomState ; ROM $000ADF: 20 70 D6 + ror a ; ROM $000AE2: 6A + ror a ; ROM $000AE3: 6A + and #$1F ; ROM $000AE4: 29 1F + beq Gameplay_WriteObjectWorkX_CACF ; ROM $000AE6: F0 F7 + sta $24 ; ROM $000AE8: 85 24 +; Routine: Gameplay_WriteObjectWorkY_CADA +; Global: Reachable code entry at CPU $CADA traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteObjectWorkY_CADA: + jsr AdvanceRandomState ; ROM $000AEA: 20 70 D6 + ror a ; ROM $000AED: 6A + ror a ; ROM $000AEE: 6A + ror a ; ROM $000AEF: 6A + and #$0F ; ROM $000AF0: 29 0F + beq Gameplay_WriteObjectWorkY_CADA ; ROM $000AF2: F0 F6 + cmp #$0C ; ROM $000AF4: C9 0C + bcs Gameplay_WriteObjectWorkY_CADA ; ROM $000AF6: B0 F2 + sta $25 ; ROM $000AF8: 85 25 + tay ; ROM $000AFA: A8 + lda $E2A3,y ; ROM $000AFB: B9 A3 E2 + sta $34 ; ROM $000AFE: 85 34 + lda $E2B0,y ; ROM $000B00: B9 B0 E2 + sta $35 ; ROM $000B03: 85 35 + ldy $24 ; ROM $000B05: A4 24 + lda ($34),y ; ROM $000B07: B1 34 + bne Gameplay_WriteObjectWorkX_CACF ; ROM $000B09: D0 D4 + cpy #$03 ; ROM $000B0B: C0 03 + bcs Gameplay_ReturnToCaller_CB05 ; ROM $000B0D: B0 06 + lda $25 ; ROM $000B0F: A5 25 + cmp #$03 ; ROM $000B11: C9 03 + bcc Gameplay_WriteObjectWorkX_CACF ; ROM $000B13: 90 CA +; Routine: Gameplay_ReturnToCaller_CB05 +; Global: Reachable code entry at CPU $CB05 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReturnToCaller_CB05: + rts ; ROM $000B15: 60 +; Routine: Gameplay_WriteWorkValue_CB06 +; Global: Reachable code entry at CPU $CB06 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteWorkValue_CB06: + jsr DisableRendering ; ROM $000B16: 20 57 C2 + lda #$00 ; ROM $000B19: A9 00 + sta $20 ; ROM $000B1B: 85 20 + lda #$00 ; ROM $000B1D: A9 00 + sta $26 ; ROM $000B1F: 85 26 + lda #$02 ; ROM $000B21: A9 02 + sta $27 ; ROM $000B23: 85 27 + ldy #$00 ; ROM $000B25: A0 00 +; Routine: Gameplay_WriteWorkIndex_CB17 +; Global: Reachable code entry at CPU $CB17 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteWorkIndex_CB17: + lda #$00 ; ROM $000B27: A9 00 + sta $1F ; ROM $000B29: 85 1F +; Routine: Gameplay_ReadZp94_CB1B +; Global: Reachable code entry at CPU $CB1B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadZp94_CB1B: + lda $94 ; ROM $000B2B: A5 94 + beq Gameplay_ReadDataPointer_CB24 ; ROM $000B2D: F0 05 + lda ($26),y ; ROM $000B2F: B1 26 + jmp Gameplay_IncrementZp27_CB30 ; ROM $000B31: 4C 30 CB +; Routine: Gameplay_ReadDataPointer_CB24 +; Global: Reachable code entry at CPU $CB24 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadDataPointer_CB24: + lda ($26),y ; ROM $000B34: B1 26 + cmp #$04 ; ROM $000B36: C9 04 + beq Gameplay_HandleControl_CB2E ; ROM $000B38: F0 04 + cmp #$05 ; ROM $000B3A: C9 05 + bne Gameplay_IncrementZp27_CB30 ; ROM $000B3C: D0 02 +; Routine: Gameplay_HandleControl_CB2E +; Global: Reachable code entry at CPU $CB2E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_HandleControl_CB2E: + lda #$02 ; ROM $000B3E: A9 02 +; Routine: Gameplay_IncrementZp27_CB30 +; Global: Reachable code entry at CPU $CB30 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_IncrementZp27_CB30: + jsr Gameplay_WriteObjectWorkY_CB4E ; ROM $000B40: 20 4E CB + iny ; ROM $000B43: C8 + bne Gameplay_IncrementWorkIndex_CB38 ; ROM $000B44: D0 02 + inc $27 ; ROM $000B46: E6 27 +; Routine: Gameplay_IncrementWorkIndex_CB38 +; Global: Reachable code entry at CPU $CB38 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_IncrementWorkIndex_CB38: + inc $1F ; ROM $000B48: E6 1F + lda $1F ; ROM $000B4A: A5 1F + and #$20 ; ROM $000B4C: 29 20 + beq Gameplay_ReadZp94_CB1B ; ROM $000B4E: F0 DB + inc $20 ; ROM $000B50: E6 20 + lda $20 ; ROM $000B52: A5 20 + cmp #$0D ; ROM $000B54: C9 0D + bne Gameplay_WriteWorkIndex_CB17 ; ROM $000B56: D0 CF + jsr Menu_HandleControl_DDC7 ; ROM $000B58: 20 C7 DD + jmp CommitPpuStateAndScroll ; ROM $000B5B: 4C 96 C2 +; Routine: Gameplay_WriteObjectWorkY_CB4E +; Global: Reachable code entry at CPU $CB4E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteObjectWorkY_CB4E: + sty $25 ; ROM $000B5E: 84 25 + jsr Stage_WriteZp1A_D924 ; ROM $000B60: 20 24 D9 + ldx #$00 ; ROM $000B63: A2 00 +; Routine: Gameplay_ReadZp17_CB55 +; Global: Reachable code entry at CPU $CB55 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadZp17_CB55: + lda $17,x ; ROM $000B65: B5 17 + sta $0600,x ; ROM $000B67: 9D 00 06 + inx ; ROM $000B6A: E8 + cpx #$08 ; ROM $000B6B: E0 08 + bne Gameplay_ReadZp17_CB55 ; ROM $000B6D: D0 F6 + jsr Gameplay_TransferVramData_CB65 ; ROM $000B6F: 20 65 CB + ldy $25 ; ROM $000B72: A4 25 + rts ; ROM $000B74: 60 +; Routine: Gameplay_TransferVramData_CB65 +; Global: Reachable code entry at CPU $CB65 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_TransferVramData_CB65: + lda $0602 ; ROM $000B75: AD 02 06 + ora $0600 ; ROM $000B78: 0D 00 06 + pha ; ROM $000B7B: 48 + sta PPUADDR ; ROM $000B7C: 8D 06 20 + ldx $0601 ; ROM $000B7F: AE 01 06 + stx PPUADDR ; ROM $000B82: 8E 06 20 + ldx $0603 ; ROM $000B85: AE 03 06 + lda $D9C6,x ; ROM $000B88: BD C6 D9 + sta PPUDATA ; ROM $000B8B: 8D 07 20 + lda $D9C7,x ; ROM $000B8E: BD C7 D9 + sta PPUDATA ; ROM $000B91: 8D 07 20 + pla ; ROM $000B94: 68 + sta PPUADDR ; ROM $000B95: 8D 06 20 + lda $0601 ; ROM $000B98: AD 01 06 + clc ; ROM $000B9B: 18 + adc #$20 ; ROM $000B9C: 69 20 + sta PPUADDR ; ROM $000B9E: 8D 06 20 + lda $D9C8,x ; ROM $000BA1: BD C8 D9 + sta PPUDATA ; ROM $000BA4: 8D 07 20 + lda $D9C9,x ; ROM $000BA7: BD C9 D9 + sta PPUDATA ; ROM $000BAA: 8D 07 20 + lda #$23 ; ROM $000BAD: A9 23 + ora $0600 ; ROM $000BAF: 0D 00 06 + pha ; ROM $000BB2: 48 + sta PPUADDR ; ROM $000BB3: 8D 06 20 + lda $0604 ; ROM $000BB6: AD 04 06 + sta PPUADDR ; ROM $000BB9: 8D 06 20 + tax ; ROM $000BBC: AA + lda PPUDATA ; ROM $000BBD: AD 07 20 + lda PPUDATA ; ROM $000BC0: AD 07 20 + and $0606 ; ROM $000BC3: 2D 06 06 + ora $0607 ; ROM $000BC6: 0D 07 06 + tay ; ROM $000BC9: A8 + pla ; ROM $000BCA: 68 + sta PPUADDR ; ROM $000BCB: 8D 06 20 + stx PPUADDR ; ROM $000BCE: 8E 06 20 + sty PPUDATA ; ROM $000BD1: 8C 07 20 + rts ; ROM $000BD4: 60 +; Routine: Gameplay_HandleControl_CBC5 +; Global: Reachable code entry at CPU $CBC5 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_HandleControl_CBC5: + ldx #$09 ; ROM $000BD5: A2 09 + lda #$00 ; ROM $000BD7: A9 00 +; Routine: Gameplay_WriteRam03A0_CBC9 +; Global: Reachable code entry at CPU $CBC9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteRam03A0_CBC9: + sta $03A0,x ; ROM $000BD9: 9D A0 03 + dex ; ROM $000BDC: CA + bpl Gameplay_WriteRam03A0_CBC9 ; ROM $000BDD: 10 FA + ldx #$4F ; ROM $000BDF: A2 4F +; Routine: Gameplay_WriteRam03E6_CBD1 +; Global: Reachable code entry at CPU $CBD1 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteRam03E6_CBD1: + sta $03E6,x ; ROM $000BE1: 9D E6 03 + dex ; ROM $000BE4: CA + bpl Gameplay_WriteRam03E6_CBD1 ; ROM $000BE5: 10 FA +; Routine: Gameplay_HandleControl_CBD7 +; Global: Reachable code entry at CPU $CBD7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_HandleControl_CBD7: + lda #$00 ; ROM $000BE7: A9 00 + ldx #$09 ; ROM $000BE9: A2 09 +; Routine: Gameplay_WriteRam0576_CBDB +; Global: Reachable code entry at CPU $CBDB traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteRam0576_CBDB: + sta $0576,x ; ROM $000BEB: 9D 76 05 + dex ; ROM $000BEE: CA + bpl Gameplay_WriteRam0576_CBDB ; ROM $000BEF: 10 FA + rts ; ROM $000BF1: 60 +; Routine: Gameplay_RetreatIndexY_CBE2 +; Global: Reachable code entry at CPU $CBE2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_RetreatIndexY_CBE2: + dey ; ROM $000BF2: 88 + bmi Gameplay_ReturnToCaller_CBEA ; ROM $000BF3: 30 05 +; Routine: Gameplay_ReadRam03E6_CBE5 +; Global: Reachable code entry at CPU $CBE5 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRam03E6_CBE5: + lda $03E6,y ; ROM $000BF5: B9 E6 03 + bne Gameplay_RetreatIndexY_CBE2 ; ROM $000BF8: D0 F8 +; Routine: Gameplay_ReturnToCaller_CBEA +; Global: Reachable code entry at CPU $CBEA traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReturnToCaller_CBEA: + rts ; ROM $000BFA: 60 +; Routine: Gameplay_ReadRamE2A3_CBEB +; Global: Reachable code entry at CPU $CBEB traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRamE2A3_CBEB: + lda $E2A3,y ; ROM $000BFB: B9 A3 E2 + sta $34 ; ROM $000BFE: 85 34 + lda $E2B0,y ; ROM $000C00: B9 B0 E2 + sta $35 ; ROM $000C03: 85 35 + rts ; ROM $000C05: 60 +; Routine: Gameplay_WriteDisplayMode_CBF6 +; Global: Reachable code entry at CPU $CBF6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteDisplayMode_CBF6: + lda #$01 ; ROM $000C06: A9 01 + sta $38 ; ROM $000C08: 85 38 + rts ; ROM $000C0A: 60 +; Routine: WaitForNmiFrameHandoff +; Global: Reachable code entry at CPU $CBFB traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +WaitForNmiFrameHandoff: + lda FrameSyncFlag ; ROM $000C0B: A5 0B + bne WaitForNmiFrameHandoff ; ROM $000C0D: D0 FC + lda #$01 ; ROM $000C0F: A9 01 + sta FrameSyncFlag ; ROM $000C11: 85 0B + rts ; ROM $000C13: 60 + +; Data region: CPU $CC04-$CC35; unreachable by direct recursive trace. +FrameAnimationSequenceTable: + .byte $02, $01, $05, $03, $01, $01, $02, $05, $06, $04, $01, $01, $05, $06, $02, $04 ; ROM $000C14: 02 01 05 03 01 01 02 05 06 04 01 01 05 06 02 04 + .byte $01, $06, $01, $05, $06, $05, $01, $05, $06, $08, $02, $01, $05, $07, $04, $01 ; ROM $000C24: 01 06 01 05 06 05 01 05 06 08 02 01 05 07 04 01 + .byte $05, $08, $06, $07, $05, $02, $04, $08, $05, $04, $06, $05, $08, $04, $06, $05 ; ROM $000C34: 05 08 06 07 05 02 04 08 05 04 06 05 08 04 06 05 + .byte $07, $08 ; ROM $000C44: 07 08 +; Routine: Frame_ReadZp7D_CC36 +; Global: Reachable code entry at CPU $CC36 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadZp7D_CC36: + lda $7D ; ROM $000C46: A5 7D + bne Frame_ReadZp5C_CC4C ; ROM $000C48: D0 12 + lda $7A ; ROM $000C4A: A5 7A + beq Frame_ReadZp5C_CC4C ; ROM $000C4C: F0 0E + lda $33 ; ROM $000C4E: A5 33 + and #$07 ; ROM $000C50: 29 07 + bne Frame_ReadZp5C_CC4C ; ROM $000C52: D0 08 + dec $7A ; ROM $000C54: C6 7A + bne Frame_ReadZp5C_CC4C ; ROM $000C56: D0 04 + lda #$03 ; ROM $000C58: A9 03 + sta $B5 ; ROM $000C5A: 85 B5 +; Routine: Frame_ReadZp5C_CC4C +; Global: Reachable code entry at CPU $CC4C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadZp5C_CC4C: + lda $5C ; ROM $000C5C: A5 5C + beq Frame_ReadObjectX_CC63 ; ROM $000C5E: F0 13 + lda $33 ; ROM $000C60: A5 33 + and #$0F ; ROM $000C62: 29 0F + bne Frame_ReturnToCaller_CC62 ; ROM $000C64: D0 0C + inc $2C ; ROM $000C66: E6 2C + lda $2C ; ROM $000C68: A5 2C + cmp #$14 ; ROM $000C6A: C9 14 + bne Frame_ReturnToCaller_CC62 ; ROM $000C6C: D0 04 + lda #$01 ; ROM $000C6E: A9 01 + sta $5D ; ROM $000C70: 85 5D +; Routine: Frame_ReturnToCaller_CC62 +; Global: Reachable code entry at CPU $CC62 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReturnToCaller_CC62: + rts ; ROM $000C72: 60 +; Routine: Frame_ReadObjectX_CC63 +; Global: Reachable code entry at CPU $CC63 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectX_CC63: + lda $29 ; ROM $000C73: A5 29 + cmp #$08 ; ROM $000C75: C9 08 + bne Frame_ReadObjectFlags_CCA4 ; ROM $000C77: D0 3B + lda $2B ; ROM $000C79: A5 2B + cmp #$08 ; ROM $000C7B: C9 08 + bne Frame_ReadObjectFlags_CCA4 ; ROM $000C7D: D0 35 + ldy $2A ; ROM $000C7F: A4 2A + sty $20 ; ROM $000C81: 84 20 + lda $E2A3,y ; ROM $000C83: B9 A3 E2 + sta $34 ; ROM $000C86: 85 34 + lda $E2B0,y ; ROM $000C88: B9 B0 E2 + sta $35 ; ROM $000C8B: 85 35 + ldy $28 ; ROM $000C8D: A4 28 + sty $1F ; ROM $000C8F: 84 1F + lda ($34),y ; ROM $000C91: B1 34 + cmp #$08 ; ROM $000C93: C9 08 + beq Frame_IncrementBombCapacity_CC95 ; ROM $000C95: F0 0E + cmp #$06 ; ROM $000C97: C9 06 + bne Frame_ReadObjectFlags_CCA4 ; ROM $000C99: D0 19 + lda #$00 ; ROM $000C9B: A9 00 + sta ($34),y ; ROM $000C9D: 91 34 + jsr Stage_WriteObjectWorkX_D8FC ; ROM $000C9F: 20 FC D8 + jmp Frame_WriteSoundCommandState_CEE9 ; ROM $000CA2: 4C E9 CE +; Routine: Frame_IncrementBombCapacity_CC95 +; Global: Reachable code entry at CPU $CC95 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_IncrementBombCapacity_CC95: + inc $9F ; ROM $000CA5: E6 9F + lda #$00 ; ROM $000CA7: A9 00 + sta $A6 ; ROM $000CA9: 85 A6 + lda $9C ; ROM $000CAB: A5 9C + bne Frame_ReadObjectFlags_CCA4 ; ROM $000CAD: D0 05 + lda #$01 ; ROM $000CAF: A9 01 + sta $5E ; ROM $000CB1: 85 5E +; Routine: Frame_ReturnToCaller_CCA3 +; Global: Reachable code entry at CPU $CCA3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReturnToCaller_CCA3: + rts ; ROM $000CB3: 60 +; Routine: Frame_ReadObjectFlags_CCA4 +; Global: Reachable code entry at CPU $CCA4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectFlags_CCA4: + lda $75 ; ROM $000CB4: A5 75 + bne Frame_WriteInvincibilityTimer_CCAE ; ROM $000CB6: D0 06 + lda $33 ; ROM $000CB8: A5 33 + and #$03 ; ROM $000CBA: 29 03 + beq Frame_ReturnToCaller_CCA3 ; ROM $000CBC: F0 F5 +; Routine: Frame_WriteInvincibilityTimer_CCAE +; Global: Reachable code entry at CPU $CCAE traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_WriteInvincibilityTimer_CCAE: + jsr Object_ReadGameState_CF87 ; ROM $000CBE: 20 87 CF + bne Frame_CopyAToX_CCB7 ; ROM $000CC1: D0 04 + sta $A6 ; ROM $000CC3: 85 A6 + sta $7B ; ROM $000CC5: 85 7B +; Routine: Frame_CopyAToX_CCB7 +; Global: Reachable code entry at CPU $CCB7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_CopyAToX_CCB7: + tax ; ROM $000CC7: AA + and #$01 ; ROM $000CC8: 29 01 + beq Frame_CopyXToA_CCBF ; ROM $000CCA: F0 03 + jsr Frame_ReadObjectX_CDD4 ; ROM $000CCC: 20 D4 CD +; Routine: Frame_CopyXToA_CCBF +; Global: Reachable code entry at CPU $CCBF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_CopyXToA_CCBF: + txa ; ROM $000CCF: 8A + and #$02 ; ROM $000CD0: 29 02 + beq Frame_CopyXToA_CCC7 ; ROM $000CD2: F0 03 + jsr Frame_ReadObjectX_CDA3 ; ROM $000CD4: 20 A3 CD +; Routine: Frame_CopyXToA_CCC7 +; Global: Reachable code entry at CPU $CCC7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_CopyXToA_CCC7: + txa ; ROM $000CD7: 8A + and #$08 ; ROM $000CD8: 29 08 + beq Frame_CopyXToA_CCCF ; ROM $000CDA: F0 03 + jsr Frame_ReadObjectY_CD70 ; ROM $000CDC: 20 70 CD +; Routine: Frame_CopyXToA_CCCF +; Global: Reachable code entry at CPU $CCCF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_CopyXToA_CCCF: + txa ; ROM $000CDF: 8A + and #$04 ; ROM $000CE0: 29 04 + beq Frame_ReadObjectSubtype_CCD7 ; ROM $000CE2: F0 03 + jsr Frame_ReadObjectY_CD39 ; ROM $000CE4: 20 39 CD +; Routine: Frame_ReadObjectSubtype_CCD7 +; Global: Reachable code entry at CPU $CCD7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectSubtype_CCD7: + txa ; ROM $000CE7: 8A + and #$80 ; ROM $000CE8: 29 80 + bne Frame_ReadObjectState_CCEF ; ROM $000CEA: D0 13 + lda $77 ; ROM $000CEC: A5 77 + beq Frame_ReturnToCaller_CCEE ; ROM $000CEE: F0 0E + lda $7B ; ROM $000CF0: A5 7B + bne Frame_ReturnToCaller_CCEE ; ROM $000CF2: D0 0A + txa ; ROM $000CF4: 8A + and #$40 ; ROM $000CF5: 29 40 + beq Frame_ReturnToCaller_CCEE ; ROM $000CF7: F0 05 + sta $7B ; ROM $000CF9: 85 7B + jsr Gameplay_HandleControl_C939 ; ROM $000CFB: 20 39 C9 +; Routine: Frame_ReturnToCaller_CCEE +; Global: Reachable code entry at CPU $CCEE traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReturnToCaller_CCEE: + rts ; ROM $000CFE: 60 +; Routine: Frame_ReadObjectState_CCEF +; Global: Reachable code entry at CPU $CCEF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectState_CCEF: + ldy $2A ; ROM $000CFF: A4 2A + lda $E2A3,y ; ROM $000D01: B9 A3 E2 + sta $34 ; ROM $000D04: 85 34 + lda $E2B0,y ; ROM $000D06: B9 B0 E2 + sta $35 ; ROM $000D09: 85 35 + ldy $28 ; ROM $000D0B: A4 28 + lda ($34),y ; ROM $000D0D: B1 34 + bne Frame_ReturnToCaller_CCEE ; ROM $000D0F: D0 ED + jsr Frame_ReadObjectX_CE10 ; ROM $000D11: 20 10 CE + jsr Frame_ReadObjectY_CE1F ; ROM $000D14: 20 1F CE + ldx $74 ; ROM $000D17: A6 74 +; Routine: Frame_ReadRam03A0_CD09 +; Global: Reachable code entry at CPU $CD09 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadRam03A0_CD09: + lda $03A0,x ; ROM $000D19: BD A0 03 + beq Frame_WriteTransferPointer_CD12 ; ROM $000D1C: F0 04 + dex ; ROM $000D1E: CA + bpl Frame_ReadRam03A0_CD09 ; ROM $000D1F: 10 F8 + rts ; ROM $000D21: 60 +; Routine: Frame_WriteTransferPointer_CD12 +; Global: Reachable code entry at CPU $CD12 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_WriteTransferPointer_CD12: + lda #$03 ; ROM $000D22: A9 03 + sta ($34),y ; ROM $000D24: 91 34 + lda $28 ; ROM $000D26: A5 28 + sta $03AA,x ; ROM $000D28: 9D AA 03 + lda $2A ; ROM $000D2B: A5 2A + sta $03B4,x ; ROM $000D2D: 9D B4 03 + lda #$00 ; ROM $000D30: A9 00 + sta $03D2,x ; ROM $000D32: 9D D2 03 + lda #$00 ; ROM $000D35: A9 00 + sta $03C8,x ; ROM $000D37: 9D C8 03 + lda #$A0 ; ROM $000D3A: A9 A0 + sta $03BE,x ; ROM $000D3C: 9D BE 03 + lda #$01 ; ROM $000D3F: A9 01 + sta $03A0,x ; ROM $000D41: 9D A0 03 + lda #$03 ; ROM $000D44: A9 03 + sta $DF ; ROM $000D46: 85 DF + rts ; ROM $000D48: 60 +; Routine: Frame_ReadObjectY_CD39 +; Global: Reachable code entry at CPU $CD39 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectY_CD39: + lda $2B ; ROM $000D49: A5 2B + cmp #$08 ; ROM $000D4B: C9 08 + bcs Frame_ReadObjectState_CD44 ; ROM $000D4D: B0 05 + inc $2B ; ROM $000D4F: E6 2B + jmp Frame_HandleControl_CD69 ; ROM $000D51: 4C 69 CD +; Routine: Frame_ReadObjectState_CD44 +; Global: Reachable code entry at CPU $CD44 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectState_CD44: + ldy $2A ; ROM $000D54: A4 2A + iny ; ROM $000D56: C8 + lda $E2A3,y ; ROM $000D57: B9 A3 E2 + sta $34 ; ROM $000D5A: 85 34 + lda $E2B0,y ; ROM $000D5C: B9 B0 E2 + sta $35 ; ROM $000D5F: 85 35 + ldy $28 ; ROM $000D61: A4 28 + jsr Object_ReadTransferPointer_CF60 ; ROM $000D63: 20 60 CF + bne Frame_HandleControl_CD69 ; ROM $000D66: D0 11 + jsr Frame_ReadObjectX_CE10 ; ROM $000D68: 20 10 CE + inc $2B ; ROM $000D6B: E6 2B + lda $2B ; ROM $000D6D: A5 2B + cmp #$10 ; ROM $000D6F: C9 10 + bne Frame_HandleControl_CD69 ; ROM $000D71: D0 06 + lda #$00 ; ROM $000D73: A9 00 + sta $2B ; ROM $000D75: 85 2B + inc $2A ; ROM $000D77: E6 2A +; Routine: Frame_HandleControl_CD69 +; Global: Reachable code entry at CPU $CD69 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_HandleControl_CD69: + lda #$04 ; ROM $000D79: A9 04 + ldy #$07 ; ROM $000D7B: A0 07 + jmp Frame_ReadZp33_CE2E ; ROM $000D7D: 4C 2E CE +; Routine: Frame_ReadObjectY_CD70 +; Global: Reachable code entry at CPU $CD70 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectY_CD70: + lda $2B ; ROM $000D80: A5 2B + cmp #$09 ; ROM $000D82: C9 09 + bcc Frame_ReadObjectState_CD7B ; ROM $000D84: 90 05 + dec $2B ; ROM $000D86: C6 2B + jmp Frame_HandleControl_CD9C ; ROM $000D88: 4C 9C CD +; Routine: Frame_ReadObjectState_CD7B +; Global: Reachable code entry at CPU $CD7B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectState_CD7B: + ldy $2A ; ROM $000D8B: A4 2A + dey ; ROM $000D8D: 88 + lda $E2A3,y ; ROM $000D8E: B9 A3 E2 + sta $34 ; ROM $000D91: 85 34 + lda $E2B0,y ; ROM $000D93: B9 B0 E2 + sta $35 ; ROM $000D96: 85 35 + ldy $28 ; ROM $000D98: A4 28 + jsr Object_ReadTransferPointer_CF60 ; ROM $000D9A: 20 60 CF + bne Frame_HandleControl_CD9C ; ROM $000D9D: D0 0D + jsr Frame_ReadObjectX_CE10 ; ROM $000D9F: 20 10 CE + dec $2B ; ROM $000DA2: C6 2B + bpl Frame_HandleControl_CD9C ; ROM $000DA4: 10 06 + lda #$0F ; ROM $000DA6: A9 0F + sta $2B ; ROM $000DA8: 85 2B + dec $2A ; ROM $000DAA: C6 2A +; Routine: Frame_HandleControl_CD9C +; Global: Reachable code entry at CPU $CD9C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_HandleControl_CD9C: + lda #$08 ; ROM $000DAC: A9 08 + ldy #$0B ; ROM $000DAE: A0 0B + jmp Frame_ReadZp33_CE2E ; ROM $000DB0: 4C 2E CE +; Routine: Frame_ReadObjectX_CDA3 +; Global: Reachable code entry at CPU $CDA3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectX_CDA3: + lda $29 ; ROM $000DB3: A5 29 + cmp #$09 ; ROM $000DB5: C9 09 + bcc Frame_ReadObjectState_CDAE ; ROM $000DB7: 90 05 + dec $29 ; ROM $000DB9: C6 29 + jmp Frame_HandleControl_CDCF ; ROM $000DBB: 4C CF CD +; Routine: Frame_ReadObjectState_CDAE +; Global: Reachable code entry at CPU $CDAE traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectState_CDAE: + ldy $2A ; ROM $000DBE: A4 2A + lda $E2A3,y ; ROM $000DC0: B9 A3 E2 + sta $34 ; ROM $000DC3: 85 34 + lda $E2B0,y ; ROM $000DC5: B9 B0 E2 + sta $35 ; ROM $000DC8: 85 35 + ldy $28 ; ROM $000DCA: A4 28 + dey ; ROM $000DCC: 88 + jsr Object_ReadTransferPointer_CF60 ; ROM $000DCD: 20 60 CF + bne Frame_HandleControl_CDCF ; ROM $000DD0: D0 0D + jsr Frame_ReadObjectY_CE1F ; ROM $000DD2: 20 1F CE + dec $29 ; ROM $000DD5: C6 29 + bpl Frame_HandleControl_CDCF ; ROM $000DD7: 10 06 + lda #$0F ; ROM $000DD9: A9 0F + sta $29 ; ROM $000DDB: 85 29 + dec $28 ; ROM $000DDD: C6 28 +; Routine: Frame_HandleControl_CDCF +; Global: Reachable code entry at CPU $CDCF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_HandleControl_CDCF: + lda #$00 ; ROM $000DDF: A9 00 + jmp Frame_WriteZp2D_CE06 ; ROM $000DE1: 4C 06 CE +; Routine: Frame_ReadObjectX_CDD4 +; Global: Reachable code entry at CPU $CDD4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectX_CDD4: + lda $29 ; ROM $000DE4: A5 29 + cmp #$08 ; ROM $000DE6: C9 08 + bcs Frame_ReadObjectState_CDDF ; ROM $000DE8: B0 05 + inc $29 ; ROM $000DEA: E6 29 + jmp Frame_HandleControl_CE04 ; ROM $000DEC: 4C 04 CE +; Routine: Frame_ReadObjectState_CDDF +; Global: Reachable code entry at CPU $CDDF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectState_CDDF: + ldy $2A ; ROM $000DEF: A4 2A + lda $E2A3,y ; ROM $000DF1: B9 A3 E2 + sta $34 ; ROM $000DF4: 85 34 + lda $E2B0,y ; ROM $000DF6: B9 B0 E2 + sta $35 ; ROM $000DF9: 85 35 + ldy $28 ; ROM $000DFB: A4 28 + iny ; ROM $000DFD: C8 + jsr Object_ReadTransferPointer_CF60 ; ROM $000DFE: 20 60 CF + bne Frame_HandleControl_CE04 ; ROM $000E01: D0 11 + jsr Frame_ReadObjectY_CE1F ; ROM $000E03: 20 1F CE + inc $29 ; ROM $000E06: E6 29 + lda $29 ; ROM $000E08: A5 29 + cmp #$10 ; ROM $000E0A: C9 10 + bne Frame_HandleControl_CE04 ; ROM $000E0C: D0 06 + lda #$00 ; ROM $000E0E: A9 00 + sta $29 ; ROM $000E10: 85 29 + inc $28 ; ROM $000E12: E6 28 +; Routine: Frame_HandleControl_CE04 +; Global: Reachable code entry at CPU $CE04 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_HandleControl_CE04: + lda #$40 ; ROM $000E14: A9 40 +; Routine: Frame_WriteZp2D_CE06 +; Global: Reachable code entry at CPU $CE06 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_WriteZp2D_CE06: + sta $2D ; ROM $000E16: 85 2D + lda #$00 ; ROM $000E18: A9 00 + ldy #$03 ; ROM $000E1A: A0 03 + jmp Frame_ReadZp33_CE2E ; ROM $000E1C: 4C 2E CE + +; Data region: CPU $CE0F-$CE0F; unreachable by direct recursive trace. +FrameSingleByteConstant: + .byte $60 ; ROM $000E1F: 60 +; Routine: Frame_ReadObjectX_CE10 +; Global: Reachable code entry at CPU $CE10 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectX_CE10: + lda $29 ; ROM $000E20: A5 29 + cmp #$08 ; ROM $000E22: C9 08 + bcc Frame_IncrementObjectX_CE1B ; ROM $000E24: 90 05 + beq Frame_ReturnToCaller_CE1E ; ROM $000E26: F0 06 + dec $29 ; ROM $000E28: C6 29 + rts ; ROM $000E2A: 60 +; Routine: Frame_IncrementObjectX_CE1B +; Global: Reachable code entry at CPU $CE1B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_IncrementObjectX_CE1B: + inc $29 ; ROM $000E2B: E6 29 + rts ; ROM $000E2D: 60 +; Routine: Frame_ReturnToCaller_CE1E +; Global: Reachable code entry at CPU $CE1E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReturnToCaller_CE1E: + rts ; ROM $000E2E: 60 +; Routine: Frame_ReadObjectY_CE1F +; Global: Reachable code entry at CPU $CE1F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectY_CE1F: + lda $2B ; ROM $000E2F: A5 2B + cmp #$08 ; ROM $000E31: C9 08 + bcc Frame_IncrementObjectY_CE2A ; ROM $000E33: 90 05 + beq Frame_ReturnToCaller_CE2D ; ROM $000E35: F0 06 + dec $2B ; ROM $000E37: C6 2B + rts ; ROM $000E39: 60 +; Routine: Frame_IncrementObjectY_CE2A +; Global: Reachable code entry at CPU $CE2A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_IncrementObjectY_CE2A: + inc $2B ; ROM $000E3A: E6 2B + rts ; ROM $000E3C: 60 +; Routine: Frame_ReturnToCaller_CE2D +; Global: Reachable code entry at CPU $CE2D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReturnToCaller_CE2D: + rts ; ROM $000E3D: 60 +; Routine: Frame_ReadZp33_CE2E +; Global: Reachable code entry at CPU $CE2E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadZp33_CE2E: + pha ; ROM $000E3E: 48 + lda $33 ; ROM $000E3F: A5 33 + and #$03 ; ROM $000E41: 29 03 + cmp #$02 ; ROM $000E43: C9 02 + bne Frame_RestoreAccumulator_CE59 ; ROM $000E45: D0 22 + lda $33 ; ROM $000E47: A5 33 + pla ; ROM $000E49: 68 + inc $A6 ; ROM $000E4A: E6 A6 + inc $2C ; ROM $000E4C: E6 2C + cmp $2C ; ROM $000E4E: C5 2C + bcc Frame_TestObjectIndex_CE45 ; ROM $000E50: 90 03 + sta $2C ; ROM $000E52: 85 2C + rts ; ROM $000E54: 60 +; Routine: Frame_TestObjectIndex_CE45 +; Global: Reachable code entry at CPU $CE45 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_TestObjectIndex_CE45: + cpy $2C ; ROM $000E55: C4 2C + bcc Frame_WriteObjectIndex_CE4A ; ROM $000E57: 90 01 + rts ; ROM $000E59: 60 +; Routine: Frame_WriteObjectIndex_CE4A +; Global: Reachable code entry at CPU $CE4A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_WriteObjectIndex_CE4A: + sta $2C ; ROM $000E5A: 85 2C + cmp #$04 ; ROM $000E5C: C9 04 + bcc Frame_HandleControl_CE54 ; ROM $000E5E: 90 04 + lda #$02 ; ROM $000E60: A9 02 + bne Frame_WriteSoundCommandState_CE56 ; ROM $000E62: D0 02 +; Routine: Frame_HandleControl_CE54 +; Global: Reachable code entry at CPU $CE54 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_HandleControl_CE54: + lda #$01 ; ROM $000E64: A9 01 +; Routine: Frame_WriteSoundCommandState_CE56 +; Global: Reachable code entry at CPU $CE56 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_WriteSoundCommandState_CE56: + sta $DF ; ROM $000E66: 85 DF + rts ; ROM $000E68: 60 +; Routine: Frame_RestoreAccumulator_CE59 +; Global: Reachable code entry at CPU $CE59 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_RestoreAccumulator_CE59: + pla ; ROM $000E69: 68 +; Routine: Frame_ReturnToCaller_CE5A +; Global: Reachable code entry at CPU $CE5A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReturnToCaller_CE5A: + rts ; ROM $000E6A: 60 +; Routine: Frame_ReadObjectIndex_CE5B +; Global: Reachable code entry at CPU $CE5B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadObjectIndex_CE5B: + lda $2C ; ROM $000E6B: A5 2C + cmp #$13 ; ROM $000E6D: C9 13 + bcs Frame_ReturnToCaller_CE5A ; ROM $000E6F: B0 F9 + lda $2D ; ROM $000E71: A5 2D + sta $3D ; ROM $000E73: 85 3D + ldy #$00 ; ROM $000E75: A0 00 + sty $3C ; ROM $000E77: 84 3C + lda $28 ; ROM $000E79: A5 28 + cmp #$08 ; ROM $000E7B: C9 08 + bcc Frame_WriteZp0E_CE80 ; ROM $000E7D: 90 11 + ldy #$F0 ; ROM $000E7F: A0 F0 + cmp #$17 ; ROM $000E81: C9 17 + bcs Frame_WriteZp0E_CE80 ; ROM $000E83: B0 0B + asl a ; ROM $000E85: 0A + asl a ; ROM $000E86: 0A + asl a ; ROM $000E87: 0A + asl a ; ROM $000E88: 0A + clc ; ROM $000E89: 18 + adc $29 ; ROM $000E8A: 65 29 + sec ; ROM $000E8C: 38 + sbc #$80 ; ROM $000E8D: E9 80 + tay ; ROM $000E8F: A8 +; Routine: Frame_WriteZp0E_CE80 +; Global: Reachable code entry at CPU $CE80 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_WriteZp0E_CE80: + sty $0E ; ROM $000E90: 84 0E + lda $28 ; ROM $000E92: A5 28 + asl a ; ROM $000E94: 0A + asl a ; ROM $000E95: 0A + asl a ; ROM $000E96: 0A + asl a ; ROM $000E97: 0A + clc ; ROM $000E98: 18 + adc $29 ; ROM $000E99: 65 29 + sec ; ROM $000E9B: 38 + sbc #$08 ; ROM $000E9C: E9 08 + sbc $0E ; ROM $000E9E: E5 0E + sta $3A ; ROM $000EA0: 85 3A + lda $2A ; ROM $000EA2: A5 2A + asl a ; ROM $000EA4: 0A + asl a ; ROM $000EA5: 0A + asl a ; ROM $000EA6: 0A + asl a ; ROM $000EA7: 0A + clc ; ROM $000EA8: 18 + adc $2B ; ROM $000EA9: 65 2B + adc #$17 ; ROM $000EAB: 69 17 + sta $3B ; ROM $000EAD: 85 3B + ldx $2C ; ROM $000EAF: A6 2C + lda $CED6,x ; ROM $000EB1: BD D6 CE + jmp Stage_WriteZp3F_D5F2 ; ROM $000EB4: 4C F2 D5 +; Routine: Frame_ReadZp2D_CEA7 +; Global: Reachable code entry at CPU $CEA7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_ReadZp2D_CEA7: + lda $2D ; ROM $000EB7: A5 2D + sta $3D ; ROM $000EB9: 85 3D + ldy #$03 ; ROM $000EBB: A0 03 + sty $3C ; ROM $000EBD: 84 3C + lda $28 ; ROM $000EBF: A5 28 + asl a ; ROM $000EC1: 0A + asl a ; ROM $000EC2: 0A + asl a ; ROM $000EC3: 0A + asl a ; ROM $000EC4: 0A + clc ; ROM $000EC5: 18 + adc $29 ; ROM $000EC6: 65 29 + sec ; ROM $000EC8: 38 + sbc #$08 ; ROM $000EC9: E9 08 + sta $3A ; ROM $000ECB: 85 3A + lda $2A ; ROM $000ECD: A5 2A + asl a ; ROM $000ECF: 0A + asl a ; ROM $000ED0: 0A + asl a ; ROM $000ED1: 0A + asl a ; ROM $000ED2: 0A + clc ; ROM $000ED3: 18 + adc $2B ; ROM $000ED4: 65 2B + adc #$17 ; ROM $000ED6: 69 17 + sta $3B ; ROM $000ED8: 85 3B + ldx $2C ; ROM $000EDA: A6 2C + lda $CED2,x ; ROM $000EDC: BD D2 CE + jmp Stage_WriteZp3F_D5F2 ; ROM $000EDF: 4C F2 D5 + +; Data region: CPU $CED2-$CEE8; unreachable by direct recursive trace. +FrameObjectOffsetTable: + .byte $10, $11, $12, $11, $00, $01, $02, $01, $03, $04, $05, $04, $06, $07, $08, $07 ; ROM $000EE2: 10 11 12 11 00 01 02 01 03 04 05 04 06 07 08 07 + .byte $09, $0A, $0B, $0C, $0D, $0E, $0F ; ROM $000EF2: 09 0A 0B 0C 0D 0E 0F +; Routine: Frame_WriteSoundCommandState_CEE9 +; Global: Reachable code entry at CPU $CEE9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Frame_WriteSoundCommandState_CEE9: + lda #$04 ; ROM $000EF9: A9 04 + sta $DF ; ROM $000EFB: 85 DF + lda #$0A ; ROM $000EFD: A9 0A + jsr Menu_WriteObjectWorkX_DD83 ; ROM $000EFF: 20 83 DD + ldx $5B ; ROM $000F02: A6 5B + dex ; ROM $000F04: CA + beq Object_ReadObjectTimer_CF0D ; ROM $000F05: F0 16 + dex ; ROM $000F07: CA + beq Object_ReadObjectMode_CF1A ; ROM $000F08: F0 20 + dex ; ROM $000F0A: CA + beq Object_WriteObjectFlags_CF2A ; ROM $000F0B: F0 2D + dex ; ROM $000F0D: CA + beq Object_WriteObjectPhase_CF33 ; ROM $000F0E: F0 33 + dex ; ROM $000F10: CA + beq Object_WriteObjectSubtype_CF3C ; ROM $000F11: F0 39 + dex ; ROM $000F13: CA + beq Object_WriteObjectDirection_CF45 ; ROM $000F14: F0 3F + dex ; ROM $000F16: CA + beq Object_WriteObjectSpeed_CF4E ; ROM $000F17: F0 45 + dex ; ROM $000F19: CA + beq Object_WriteObjectCounter_CF57 ; ROM $000F1A: F0 4B + rts ; ROM $000F1C: 60 +; Routine: Object_ReadObjectTimer_CF0D +; Global: Reachable code entry at CPU $CF0D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadObjectTimer_CF0D: + lda $74 ; ROM $000F1D: A5 74 + cmp #$09 ; ROM $000F1F: C9 09 + beq Object_WriteGameMode_CF15 ; ROM $000F21: F0 02 + inc $74 ; ROM $000F23: E6 74 +; Routine: Object_WriteGameMode_CF15 +; Global: Reachable code entry at CPU $CF15 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteGameMode_CF15: + lda #$04 ; ROM $000F25: A9 04 + sta $B5 ; ROM $000F27: 85 B5 + rts ; ROM $000F29: 60 +; Routine: Object_ReadObjectMode_CF1A +; Global: Reachable code entry at CPU $CF1A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadObjectMode_CF1A: + lda $73 ; ROM $000F2A: A5 73 + cmp #$50 ; ROM $000F2C: C9 50 + beq Object_WriteGameMode_CF25 ; ROM $000F2E: F0 05 + clc ; ROM $000F30: 18 + adc #$10 ; ROM $000F31: 69 10 + sta $73 ; ROM $000F33: 85 73 +; Routine: Object_WriteGameMode_CF25 +; Global: Reachable code entry at CPU $CF25 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteGameMode_CF25: + lda #$04 ; ROM $000F35: A9 04 + sta $B5 ; ROM $000F37: 85 B5 + rts ; ROM $000F39: 60 +; Routine: Object_WriteObjectFlags_CF2A +; Global: Reachable code entry at CPU $CF2A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteObjectFlags_CF2A: + lda #$01 ; ROM $000F3A: A9 01 + sta $75 ; ROM $000F3C: 85 75 + lda #$04 ; ROM $000F3E: A9 04 + sta $B5 ; ROM $000F40: 85 B5 + rts ; ROM $000F42: 60 +; Routine: Object_WriteObjectPhase_CF33 +; Global: Reachable code entry at CPU $CF33 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteObjectPhase_CF33: + lda #$01 ; ROM $000F43: A9 01 + sta $76 ; ROM $000F45: 85 76 + lda #$04 ; ROM $000F47: A9 04 + sta $B5 ; ROM $000F49: 85 B5 + rts ; ROM $000F4B: 60 +; Routine: Object_WriteObjectSubtype_CF3C +; Global: Reachable code entry at CPU $CF3C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteObjectSubtype_CF3C: + lda #$01 ; ROM $000F4C: A9 01 + sta $77 ; ROM $000F4E: 85 77 + lda #$04 ; ROM $000F50: A9 04 + sta $B5 ; ROM $000F52: 85 B5 + rts ; ROM $000F54: 60 +; Routine: Object_WriteObjectDirection_CF45 +; Global: Reachable code entry at CPU $CF45 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteObjectDirection_CF45: + lda #$01 ; ROM $000F55: A9 01 + sta $78 ; ROM $000F57: 85 78 + lda #$04 ; ROM $000F59: A9 04 + sta $B5 ; ROM $000F5B: 85 B5 + rts ; ROM $000F5D: 60 +; Routine: Object_WriteObjectSpeed_CF4E +; Global: Reachable code entry at CPU $CF4E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteObjectSpeed_CF4E: + lda #$01 ; ROM $000F5E: A9 01 + sta $79 ; ROM $000F60: 85 79 + lda #$05 ; ROM $000F62: A9 05 + sta $B5 ; ROM $000F64: 85 B5 + rts ; ROM $000F66: 60 +; Routine: Object_WriteObjectCounter_CF57 +; Global: Reachable code entry at CPU $CF57 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteObjectCounter_CF57: + lda #$FF ; ROM $000F67: A9 FF + sta $7A ; ROM $000F69: 85 7A + lda #$05 ; ROM $000F6B: A9 05 + sta $B5 ; ROM $000F6D: 85 B5 + rts ; ROM $000F6F: 60 +; Routine: Object_ReadTransferPointer_CF60 +; Global: Reachable code entry at CPU $CF60 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadTransferPointer_CF60: + lda ($34),y ; ROM $000F70: B1 34 + beq Object_ReturnToCaller_CF7C ; ROM $000F72: F0 18 + cmp #$08 ; ROM $000F74: C9 08 + beq Object_ReturnToCaller_CF7C ; ROM $000F76: F0 14 + cmp #$06 ; ROM $000F78: C9 06 + beq Object_ReturnToCaller_CF7C ; ROM $000F7A: F0 10 + cmp #$02 ; ROM $000F7C: C9 02 + beq Object_ReadObjectPhase_CF7D ; ROM $000F7E: F0 0D + cmp #$04 ; ROM $000F80: C9 04 + beq Object_ReadObjectPhase_CF7D ; ROM $000F82: F0 09 + cmp #$05 ; ROM $000F84: C9 05 + beq Object_ReadObjectPhase_CF7D ; ROM $000F86: F0 05 + cmp #$03 ; ROM $000F88: C9 03 + beq Object_ReadObjectDirection_CF82 ; ROM $000F8A: F0 06 +; Routine: Object_ReturnToCaller_CF7C +; Global: Reachable code entry at CPU $CF7C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReturnToCaller_CF7C: + rts ; ROM $000F8C: 60 +; Routine: Object_ReadObjectPhase_CF7D +; Global: Reachable code entry at CPU $CF7D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadObjectPhase_CF7D: + lda $76 ; ROM $000F8D: A5 76 + eor #$01 ; ROM $000F8F: 49 01 + rts ; ROM $000F91: 60 +; Routine: Object_ReadObjectDirection_CF82 +; Global: Reachable code entry at CPU $CF82 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadObjectDirection_CF82: + lda $78 ; ROM $000F92: A5 78 + eor #$01 ; ROM $000F94: 49 01 + rts ; ROM $000F96: 60 +; Routine: Object_ReadGameState_CF87 +; Global: Reachable code entry at CPU $CF87 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadGameState_CF87: + lda $59 ; ROM $000F97: A5 59 + beq Object_MergeZp13_CFA4 ; ROM $000F99: F0 19 + lda $AF ; ROM $000F9B: A5 AF + dec $AE ; ROM $000F9D: C6 AE + bne Object_ReturnToCaller_CFA3 ; ROM $000F9F: D0 12 + pha ; ROM $000FA1: 48 + ldy #$00 ; ROM $000FA2: A0 00 + lda ($AC),y ; ROM $000FA4: B1 AC + sta $AE ; ROM $000FA6: 85 AE + jsr Object_IncrementZpAC_CFA9 ; ROM $000FA8: 20 A9 CF + lda ($AC),y ; ROM $000FAB: B1 AC + sta $AF ; ROM $000FAD: 85 AF + jsr Object_IncrementZpAC_CFA9 ; ROM $000FAF: 20 A9 CF + pla ; ROM $000FB2: 68 +; Routine: Object_ReturnToCaller_CFA3 +; Global: Reachable code entry at CPU $CFA3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReturnToCaller_CFA3: + rts ; ROM $000FB3: 60 +; Routine: Object_MergeZp13_CFA4 +; Global: Reachable code entry at CPU $CFA4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_MergeZp13_CFA4: + lda ControllerState1 ; ROM $000FB4: A5 12 + ora $13 ; ROM $000FB6: 05 13 + rts ; ROM $000FB8: 60 +; Routine: Object_IncrementZpAC_CFA9 +; Global: Reachable code entry at CPU $CFA9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_IncrementZpAC_CFA9: + inc $AC ; ROM $000FB9: E6 AC + bne Object_ReturnToCaller_CFAF ; ROM $000FBB: D0 02 + inc $AD ; ROM $000FBD: E6 AD +; Routine: Object_ReturnToCaller_CFAF +; Global: Reachable code entry at CPU $CFAF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReturnToCaller_CFAF: + rts ; ROM $000FBF: 60 +; Routine: Object_WriteStageProgress_CFB0 +; Global: Reachable code entry at CPU $CFB0 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteStageProgress_CFB0: + lda #$00 ; ROM $000FC0: A9 00 + sta $9C ; ROM $000FC2: 85 9C + lda #$C0 ; ROM $000FC4: A9 C0 + sta $6B ; ROM $000FC6: 85 6B + ldx #$09 ; ROM $000FC8: A2 09 +; Routine: Object_ReadRam0576_CFBA +; Global: Reachable code entry at CPU $CFBA traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadRam0576_CFBA: + lda $0576,x ; ROM $000FCA: BD 76 05 + beq Object_RetreatIndexX_CFE9 ; ROM $000FCD: F0 2A + cmp #$09 ; ROM $000FCF: C9 09 + bcs Object_ReadRam05B2_CFC5 ; ROM $000FD1: B0 02 + inc $9C ; ROM $000FD3: E6 9C +; Routine: Object_ReadRam05B2_CFC5 +; Global: Reachable code entry at CPU $CFC5 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadRam05B2_CFC5: + ldy $05B2,x ; ROM $000FD5: BC B2 05 + beq Object_ReadRamD245_CFCF ; ROM $000FD8: F0 05 + dec $05B2,x ; ROM $000FDA: DE B2 05 + bne Object_RetreatIndexX_CFE9 ; ROM $000FDD: D0 1A +; Routine: Object_ReadRamD245_CFCF +; Global: Reachable code entry at CPU $CFCF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadRamD245_CFCF: + asl a ; ROM $000FDF: 0A + tay ; ROM $000FE0: A8 + jsr Object_WriteZp4D_D1C8 ; ROM $000FE1: 20 C8 D1 + lda #$CF ; ROM $000FE4: A9 CF + pha ; ROM $000FE6: 48 + lda #$E2 ; ROM $000FE7: A9 E2 + pha ; ROM $000FE9: 48 + lda $D245,y ; ROM $000FEA: B9 45 D2 + pha ; ROM $000FED: 48 + lda $D244,y ; ROM $000FEE: B9 44 D2 + pha ; ROM $000FF1: 48 + rts ; ROM $000FF2: 60 + +; Data region: CPU $CFE3-$CFE8; unreachable by direct recursive trace. +ObjectPositionLimitTable: + .byte $20, $07, $D2, $20, $06, $D0 ; ROM $000FF3: 20 07 D2 20 06 D0 +; Routine: Object_RetreatIndexX_CFE9 +; Global: Reachable code entry at CPU $CFE9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_RetreatIndexX_CFE9: + dex ; ROM $000FF9: CA + bpl Object_ReadRam0576_CFBA ; ROM $000FFA: 10 CE +; Routine: Object_ReturnToCaller_CFEC +; Global: Reachable code entry at CPU $CFEC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReturnToCaller_CFEC: + rts ; ROM $000FFC: 60 +; Routine: Object_ReadStageIndex_CFED +; Global: Reachable code entry at CPU $CFED traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadStageIndex_CFED: + lda $9D ; ROM $000FFD: A5 9D + clc ; ROM $000FFF: 18 + adc #$2C ; ROM $001000: 69 2C + sta $46 ; ROM $001002: 85 46 + lda $AA ; ROM $001004: A5 AA + sta $42 ; ROM $001006: 85 42 + lda $AB ; ROM $001008: A5 AB + sta $44 ; ROM $00100A: 85 44 + lda #$08 ; ROM $00100C: A9 08 + sta $43 ; ROM $00100E: 85 43 + sta $45 ; ROM $001010: 85 45 + lda #$00 ; ROM $001012: A9 00 + beq Object_WriteZp3D_D010 ; ROM $001014: F0 0A + lda $41 ; ROM $001016: A5 41 + beq Object_ReturnToCaller_CFEC ; ROM $001018: F0 E2 + cmp #$0B ; ROM $00101A: C9 0B + beq Object_WriteZp3D_D08C ; ROM $00101C: F0 7E + lda $48 ; ROM $00101E: A5 48 +; Routine: Object_WriteZp3D_D010 +; Global: Reachable code entry at CPU $D010 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteZp3D_D010: + sta $3D ; ROM $001020: 85 3D + ldy #$00 ; ROM $001022: A0 00 + sty $50 ; ROM $001024: 84 50 + lda $42 ; ROM $001026: A5 42 + asl a ; ROM $001028: 0A + asl a ; ROM $001029: 0A + asl a ; ROM $00102A: 0A + asl a ; ROM $00102B: 0A + rol $50 ; ROM $00102C: 26 50 + clc ; ROM $00102E: 18 + adc $43 ; ROM $00102F: 65 43 + sta $4F ; ROM $001031: 85 4F + lda $50 ; ROM $001033: A5 50 + adc #$00 ; ROM $001035: 69 00 + sta $50 ; ROM $001037: 85 50 + lda $4F ; ROM $001039: A5 4F + sec ; ROM $00103B: 38 + sbc #$08 ; ROM $00103C: E9 08 + sta $4F ; ROM $00103E: 85 4F + lda $50 ; ROM $001040: A5 50 + sbc #$00 ; ROM $001042: E9 00 + sta $50 ; ROM $001044: 85 50 + lda $4F ; ROM $001046: A5 4F + sec ; ROM $001048: 38 + sbc $0E ; ROM $001049: E5 0E + sta $4F ; ROM $00104B: 85 4F + lda $50 ; ROM $00104D: A5 50 + sbc #$00 ; ROM $00104F: E9 00 + bne Object_ReturnToCaller_D08B ; ROM $001051: D0 48 + lda $4F ; ROM $001053: A5 4F + cmp #$F8 ; ROM $001055: C9 F8 + bcs Object_ReturnToCaller_D08B ; ROM $001057: B0 42 + sta $3A ; ROM $001059: 85 3A + lda $44 ; ROM $00105B: A5 44 + asl a ; ROM $00105D: 0A + asl a ; ROM $00105E: 0A + asl a ; ROM $00105F: 0A + asl a ; ROM $001060: 0A + clc ; ROM $001061: 18 + adc $45 ; ROM $001062: 65 45 + adc #$17 ; ROM $001064: 69 17 + sta $3B ; ROM $001066: 85 3B + ldy $46 ; ROM $001068: A4 46 + lda $D186,y ; ROM $00106A: B9 86 D1 + sta $3C ; ROM $00106D: 85 3C + lda $D154,y ; ROM $00106F: B9 54 D1 + jsr Stage_WriteZp3F_D5F2 ; ROM $001072: 20 F2 D5 + lda $46 ; ROM $001075: A5 46 + cmp #$20 ; ROM $001077: C9 20 + bcs Object_ReturnToCaller_D08B ; ROM $001079: B0 20 + lda $5C ; ROM $00107B: A5 5C + bne Object_ReturnToCaller_D08B ; ROM $00107D: D0 1C + lda $7A ; ROM $00107F: A5 7A + bne Object_ReturnToCaller_D08B ; ROM $001081: D0 18 + lda $42 ; ROM $001083: A5 42 + cmp $28 ; ROM $001085: C5 28 + bne Object_ReturnToCaller_D08B ; ROM $001087: D0 12 + lda $44 ; ROM $001089: A5 44 + cmp $2A ; ROM $00108B: C5 2A + bne Object_ReturnToCaller_D08B ; ROM $00108D: D0 0C + lda #$05 ; ROM $00108F: A9 05 + sta $DF ; ROM $001091: 85 DF + lda #$01 ; ROM $001093: A9 01 + sta $5C ; ROM $001095: 85 5C + lda #$0C ; ROM $001097: A9 0C + sta $2C ; ROM $001099: 85 2C +; Routine: Object_ReturnToCaller_D08B +; Global: Reachable code entry at CPU $D08B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReturnToCaller_D08B: + rts ; ROM $00109B: 60 +; Routine: Object_WriteZp3D_D08C +; Global: Reachable code entry at CPU $D08C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteZp3D_D08C: + txa ; ROM $00109C: 8A + pha ; ROM $00109D: 48 + lda #$00 ; ROM $00109E: A9 00 + sta $3D ; ROM $0010A0: 85 3D + ldy #$00 ; ROM $0010A2: A0 00 + sty $50 ; ROM $0010A4: 84 50 + lda $42 ; ROM $0010A6: A5 42 + asl a ; ROM $0010A8: 0A + asl a ; ROM $0010A9: 0A + asl a ; ROM $0010AA: 0A + asl a ; ROM $0010AB: 0A + rol $50 ; ROM $0010AC: 26 50 + clc ; ROM $0010AE: 18 + adc $43 ; ROM $0010AF: 65 43 + sta $4F ; ROM $0010B1: 85 4F + lda $50 ; ROM $0010B3: A5 50 + adc #$00 ; ROM $0010B5: 69 00 + sta $50 ; ROM $0010B7: 85 50 + lda $4F ; ROM $0010B9: A5 4F + sec ; ROM $0010BB: 38 + sbc #$08 ; ROM $0010BC: E9 08 + sta $4F ; ROM $0010BE: 85 4F + lda $50 ; ROM $0010C0: A5 50 + sbc #$00 ; ROM $0010C2: E9 00 + sta $50 ; ROM $0010C4: 85 50 + lda $4F ; ROM $0010C6: A5 4F + sec ; ROM $0010C8: 38 + sbc $0E ; ROM $0010C9: E5 0E + sta $4F ; ROM $0010CB: 85 4F + lda $50 ; ROM $0010CD: A5 50 + sbc #$00 ; ROM $0010CF: E9 00 + bne Object_RestoreAccumulator_D0F7 ; ROM $0010D1: D0 34 + lda $4F ; ROM $0010D3: A5 4F + cmp #$F8 ; ROM $0010D5: C9 F8 + bcs Object_RestoreAccumulator_D0F7 ; ROM $0010D7: B0 2E + sta $3A ; ROM $0010D9: 85 3A + lda $44 ; ROM $0010DB: A5 44 + asl a ; ROM $0010DD: 0A + asl a ; ROM $0010DE: 0A + asl a ; ROM $0010DF: 0A + asl a ; ROM $0010E0: 0A + clc ; ROM $0010E1: 18 + adc $45 ; ROM $0010E2: 65 45 + adc #$1B ; ROM $0010E4: 69 1B + sta $3B ; ROM $0010E6: 85 3B + lda $4B ; ROM $0010E8: A5 4B + clc ; ROM $0010EA: 18 + adc $4A ; ROM $0010EB: 65 4A + cmp #$10 ; ROM $0010ED: C9 10 + bcc Object_WriteObjectWorkX_D0E3 ; ROM $0010EF: 90 02 + lda #$10 ; ROM $0010F1: A9 10 +; Routine: Object_WriteObjectWorkX_D0E3 +; Global: Reachable code entry at CPU $D0E3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteObjectWorkX_D0E3: + sta $24 ; ROM $0010F3: 85 24 + asl a ; ROM $0010F5: 0A + clc ; ROM $0010F6: 18 + adc $24 ; ROM $0010F7: 65 24 + tax ; ROM $0010F9: AA + ldy $6B ; ROM $0010FA: A4 6B + jsr Object_ReadRamD121_D0FA ; ROM $0010FC: 20 FA D0 + jsr Object_ReadRamD121_D0FA ; ROM $0010FF: 20 FA D0 + jsr Object_ReadRamD121_D0FA ; ROM $001102: 20 FA D0 + sty $6B ; ROM $001105: 84 6B +; Routine: Object_RestoreAccumulator_D0F7 +; Global: Reachable code entry at CPU $D0F7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_RestoreAccumulator_D0F7: + pla ; ROM $001107: 68 + tax ; ROM $001108: AA + rts ; ROM $001109: 60 +; Routine: Object_ReadRamD121_D0FA +; Global: Reachable code entry at CPU $D0FA traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReadRamD121_D0FA: + lda $D121,x ; ROM $00110A: BD 21 D1 + beq Object_AdvanceIndexX_D11C ; ROM $00110D: F0 1D + pha ; ROM $00110F: 48 + lda $3B ; ROM $001110: A5 3B + sta $0700,y ; ROM $001112: 99 00 07 + iny ; ROM $001115: C8 + pla ; ROM $001116: 68 + sta $0700,y ; ROM $001117: 99 00 07 + iny ; ROM $00111A: C8 + lda #$01 ; ROM $00111B: A9 01 + sta $0700,y ; ROM $00111D: 99 00 07 + iny ; ROM $001120: C8 + lda $3A ; ROM $001121: A5 3A + sta $0700,y ; ROM $001123: 99 00 07 + iny ; ROM $001126: C8 + clc ; ROM $001127: 18 + adc #$08 ; ROM $001128: 69 08 + sta $3A ; ROM $00112A: 85 3A +; Routine: Object_AdvanceIndexX_D11C +; Global: Reachable code entry at CPU $D11C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_AdvanceIndexX_D11C: + inx ; ROM $00112C: E8 + iny ; ROM $00112D: C8 + dey ; ROM $00112E: 88 + bne Object_ReturnToCaller_D123 ; ROM $00112F: D0 02 + ldy #$FC ; ROM $001131: A0 FC +; Routine: Object_ReturnToCaller_D123 +; Global: Reachable code entry at CPU $D123 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_ReturnToCaller_D123: + rts ; ROM $001133: 60 + +; Data region: CPU $D124-$D1C7; unreachable by direct recursive trace. +ObjectMovementParameterTable: + .byte $EC, $46, $00, $ED, $46, $00, $EE, $46, $00, $EF, $46, $00, $FC, $46, $00, $FD ; ROM $001134: EC 46 00 ED 46 00 EE 46 00 EF 46 00 FC 46 00 FD + .byte $46, $00, $FE, $46, $00, $FF, $46, $00, $EC, $46, $46, $ED, $46, $46, $EE, $46 ; ROM $001144: 46 00 FE 46 00 FF 46 00 EC 46 46 ED 46 46 EE 46 + .byte $46, $EF, $46, $46, $FC, $46, $46, $FD, $46, $46, $FE, $46, $46, $FF, $46, $46 ; ROM $001154: 46 EF 46 46 FC 46 46 FD 46 46 FE 46 46 FF 46 46 + .byte $18, $19, $1A, $19, $1C, $1D, $1E, $1D, $20, $21, $22, $21, $24, $25, $26, $25 ; ROM $001164: 18 19 1A 19 1C 1D 1E 1D 20 21 22 21 24 25 26 25 + .byte $28, $29, $2A, $29, $2C, $2D, $2E, $2D, $30, $31, $32, $31, $34, $35, $36, $35 ; ROM $001174: 28 29 2A 29 2C 2D 2E 2D 30 31 32 31 34 35 36 35 + .byte $1B, $1F, $23, $27, $2B, $2F, $33, $37, $14, $15, $16, $17, $38, $39, $3A, $3B ; ROM $001184: 1B 1F 23 27 2B 2F 33 37 14 15 16 17 38 39 3A 3B + .byte $3C, $3D, $01, $01, $01, $01, $03, $03, $03, $03, $02, $02, $02, $02, $01, $01 ; ROM $001194: 3C 3D 01 01 01 01 03 03 03 03 02 02 02 02 01 01 + .byte $01, $01, $03, $03, $03, $03, $02, $02, $02, $02, $01, $01, $01, $01, $01, $02 ; ROM $0011A4: 01 01 03 03 03 03 02 02 02 02 01 01 01 01 01 02 + .byte $01, $02, $01, $03, $02, $01, $03, $02, $01, $01, $01, $01, $01, $01, $01, $00 ; ROM $0011B4: 01 02 01 03 02 01 03 02 01 01 01 01 01 01 01 00 + .byte $01, $02, $03, $01, $01, $02, $04, $08, $0A, $14, $28, $50, $64, $C8, $02, $04 ; ROM $0011C4: 01 02 03 01 01 02 04 08 0A 14 28 50 64 C8 02 04 + .byte $05, $0A, $14, $28 ; ROM $0011D4: 05 0A 14 28 +; Routine: Object_WriteZp4D_D1C8 +; Global: Reachable code entry at CPU $D1C8 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Object_WriteZp4D_D1C8: + stx $4D ; ROM $0011D8: 86 4D + lda $0576,x ; ROM $0011DA: BD 76 05 + sta $41 ; ROM $0011DD: 85 41 + lda $0580,x ; ROM $0011DF: BD 80 05 + sta $42 ; ROM $0011E2: 85 42 + lda $058A,x ; ROM $0011E4: BD 8A 05 + sta $43 ; ROM $0011E7: 85 43 + lda $0594,x ; ROM $0011E9: BD 94 05 + sta $44 ; ROM $0011EC: 85 44 + lda $059E,x ; ROM $0011EE: BD 9E 05 + sta $45 ; ROM $0011F1: 85 45 + lda $05A8,x ; ROM $0011F3: BD A8 05 + sta $46 ; ROM $0011F6: 85 46 + lda $05B2,x ; ROM $0011F8: BD B2 05 + sta $47 ; ROM $0011FB: 85 47 + lda $05BC,x ; ROM $0011FD: BD BC 05 + sta $48 ; ROM $001200: 85 48 + lda $05C6,x ; ROM $001202: BD C6 05 + sta $49 ; ROM $001205: 85 49 + lda $05D0,x ; ROM $001207: BD D0 05 + sta $4A ; ROM $00120A: 85 4A + lda $05DA,x ; ROM $00120C: BD DA 05 + sta $4B ; ROM $00120F: 85 4B + lda $05E4,x ; ROM $001211: BD E4 05 + sta $4C ; ROM $001214: 85 4C + rts ; ROM $001216: 60 + +; Data region: CPU $D207-$D5F1; unreachable by direct recursive trace. +ObjectAndStageLookupTables: + .byte $A6, $4D, $A5, $41, $9D, $76, $05, $A5, $42, $9D, $80, $05, $A5, $43, $9D, $8A ; ROM $001217: A6 4D A5 41 9D 76 05 A5 42 9D 80 05 A5 43 9D 8A + .byte $05, $A5, $44, $9D, $94, $05, $A5, $45, $9D, $9E, $05, $A5, $46, $9D, $A8, $05 ; ROM $001227: 05 A5 44 9D 94 05 A5 45 9D 9E 05 A5 46 9D A8 05 + .byte $A5, $47, $9D, $B2, $05, $A5, $48, $9D, $BC, $05, $A5, $49, $9D, $C6, $05, $A5 ; ROM $001237: A5 47 9D B2 05 A5 48 9D BC 05 A5 49 9D C6 05 A5 + .byte $4A, $9D, $D0, $05, $A5, $4B, $9D, $DA, $05, $A5, $4C, $9D, $E4, $05, $60, $20 ; ROM $001247: 4A 9D D0 05 A5 4B 9D DA 05 A5 4C 9D E4 05 60 20 + .byte $D3, $E7, $D2, $C8, $D2, $05, $D3, $B4, $D2, $19, $D3, $A0, $D3, $8A, $D3, $A2 ; ROM $001257: D3 E7 D2 C8 D2 05 D3 B4 D2 19 D3 A0 D3 8A D3 A2 + .byte $D2, $64, $D2, $5B, $D2, $C6, $49, $D0, $42, $A9, $00, $85, $41, $60, $C6, $49 ; ROM $001267: D2 64 D2 5B D2 C6 49 D0 42 A9 00 85 41 60 C6 49 + .byte $D0, $39, $A9, $0A, $85, $49, $E6, $46, $A5, $46, $C9, $2C, $D0, $2D, $A5, $4B ; ROM $001277: D0 39 A9 0A 85 49 E6 46 A5 46 C9 2C D0 2D A5 4B + .byte $18, $65, $4A, $A8, $C0, $0B, $90, $15, $C0, $10, $90, $02, $A0, $10, $B9, $B7 ; ROM $001287: 18 65 4A A8 C0 0B 90 15 C0 10 90 02 A0 10 B9 B7 + .byte $D1, $AA, $A9, $C8, $20, $83, $DD, $CA, $D0, $F8, $4C, $9A, $D2, $B9, $B7, $D1 ; ROM $001297: D1 AA A9 C8 20 83 DD CA D0 F8 4C 9A D2 B9 B7 D1 + .byte $20, $83, $DD, $A9, $0B, $85, $41, $A9, $64, $85, $49, $60, $C6, $49, $D0, $0C ; ROM $0012A7: 20 83 DD A9 0B 85 41 A9 64 85 49 60 C6 49 D0 0C + .byte $A9, $0A, $85, $41, $A9, $28, $85, $46, $A9, $14, $85, $49, $60, $60, $A9, $10 ; ROM $0012B7: A9 0A 85 41 A9 28 85 46 A9 14 85 49 60 60 A9 10 + .byte $A0, $13, $20, $DA, $D5, $20, $7E, $D3, $A5, $33, $29, $03, $D0, $EF, $4C, $10 ; ROM $0012C7: A0 13 20 DA D5 20 7E D3 A5 33 29 03 D0 EF 4C 10 + .byte $D3, $60, $A9, $08, $A0, $0B, $20, $DA, $D5, $20, $7E, $D3, $A5, $33, $29, $03 ; ROM $0012D7: D3 60 A9 08 A0 0B 20 DA D5 20 7E D3 A5 33 29 03 + .byte $F0, $EF, $C6, $4C, $A5, $4C, $C9, $96, $B0, $03, $20, $26, $D4, $4C, $3F, $D3 ; ROM $0012E7: F0 EF C6 4C A5 4C C9 96 B0 03 20 26 D4 4C 3F D3 + .byte $60, $A9, $04, $A0, $07, $20, $DA, $D5, $20, $7E, $D3, $A5, $33, $29, $03, $F0 ; ROM $0012F7: 60 A9 04 A0 07 20 DA D5 20 7E D3 A5 33 29 03 F0 + .byte $EF, $C6, $4C, $A5, $4C, $C9, $96, $B0, $03, $20, $3D, $D4, $4C, $3F, $D3, $A9 ; ROM $001307: EF C6 4C A5 4C C9 96 B0 03 20 3D D4 4C 3F D3 A9 + .byte $0C, $A0, $0F, $20, $DA, $D5, $20, $7E, $D3, $C6, $4C, $A5, $4C, $C9, $C8, $4C ; ROM $001317: 0C A0 0F 20 DA D5 20 7E D3 C6 4C A5 4C C9 C8 4C + .byte $37, $D3, $60, $A9, $14, $A0, $17, $4C, $25, $D3, $A9, $00, $A0, $03, $20, $DA ; ROM $001327: 37 D3 60 A9 14 A0 17 4C 25 D3 A9 00 A0 03 20 DA + .byte $D5, $20, $7E, $D3, $A5, $33, $29, $01, $F0, $E8, $C6, $4C, $A5, $4C, $C9, $14 ; ROM $001337: D5 20 7E D3 A5 33 29 01 F0 E8 C6 4C A5 4C C9 14 + .byte $B0, $06, $20, $3D, $D4, $20, $26, $D4, $A5, $49, $F0, $22, $C6, $49, $A5, $4A ; ROM $001347: B0 06 20 3D D4 20 26 D4 A5 49 F0 22 C6 49 A5 4A + .byte $20, $DE, $D4, $F0, $18, $C9, $03, $90, $10, $A4, $4A, $B9, $12, $D4, $85, $4A ; ROM $001357: 20 DE D4 F0 18 C9 03 90 10 A4 4A B9 12 D4 85 4A + .byte $A9, $00, $85, $4C, $A9, $60, $85, $49, $60, $A9, $00, $85, $49, $60, $20, $70 ; ROM $001367: A9 00 85 4C A9 60 85 49 60 A9 00 85 49 60 20 70 + .byte $D6, $48, $29, $18, $0A, $0A, $18, $69, $20, $85, $49, $68, $2A, $2A, $2A, $29 ; ROM $001377: D6 48 29 18 0A 0A 18 69 20 85 49 68 2A 2A 2A 29 + .byte $03, $18, $69, $01, $85, $4A, $60, $A0, $00, $A5, $4A, $C9, $03, $90, $02, $A0 ; ROM $001387: 03 18 69 01 85 4A 60 A0 00 A5 4A C9 03 90 02 A0 + .byte $40, $84, $48, $60, $A9, $1C, $A0, $1F, $20, $DA, $D5, $A0, $00, $A5, $46, $C9 ; ROM $001397: 40 84 48 60 A9 1C A0 1F 20 DA D5 A0 00 A5 46 C9 + .byte $1D, $D0, $02, $A0, $40, $84, $48, $4C, $AB, $D3, $A9, $18, $A0, $1B, $20, $DA ; ROM $0013A7: 1D D0 02 A0 40 84 48 4C AB D3 A9 18 A0 1B 20 DA + .byte $D5, $20, $7E, $D3, $A5, $4C, $F0, $05, $C6, $4C, $D0, $07, $60, $20, $3D, $D4 ; ROM $0013B7: D5 20 7E D3 A5 4C F0 05 C6 4C D0 07 60 20 3D D4 + .byte $20, $26, $D4, $A5, $4A, $0A, $05, $4B, $A8, $B9, $17, $D4, $85, $53, $A8, $B9 ; ROM $0013C7: 20 26 D4 A5 4A 0A 05 4B A8 B9 17 D4 85 53 A8 B9 + .byte $21, $D4, $85, $52, $20, $54, $D4, $25, $52, $F0, $0E, $A5, $53, $85, $4A, $A9 ; ROM $0013D7: 21 D4 85 52 20 54 D4 25 52 F0 0E A5 53 85 4A A9 + .byte $01, $45, $4B, $85, $4B, $A9, $00, $85, $49, $E6, $49, $A5, $49, $C9, $1F, $90 ; ROM $0013E7: 01 45 4B 85 4B A9 00 85 49 E6 49 A5 49 C9 1F 90 + .byte $06, $A9, $01, $45, $4B, $85, $4B, $A5, $4A, $20, $DE, $D4, $F0, $10, $C9, $03 ; ROM $0013F7: 06 A9 01 45 4B 85 4B A5 4A 20 DE D4 F0 10 C9 03 + .byte $B0, $0D, $E6, $4A, $A5, $4A, $C9, $05, $D0, $04, $A9, $01, $85, $4A, $60, $A9 ; ROM $001407: B0 0D E6 4A A5 4A C9 05 D0 04 A9 01 85 4A 60 A9 + .byte $60, $85, $4C, $A4, $4A, $B9, $12, $D4, $85, $4A, $60, $00, $03, $04, $01, $02 ; ROM $001417: 60 85 4C A4 4A B9 12 D4 85 4A 60 00 03 04 01 02 + .byte $01, $04, $04, $02, $01, $03, $02, $04, $03, $01, $00, $01, $02, $04, $08, $A5 ; ROM $001427: 01 04 04 02 01 03 02 04 03 01 00 01 02 04 08 A5 + .byte $5C, $D0, $12, $A5, $44, $C5, $2A, $D0, $0C, $A5, $42, $C5, $28, $A9, $01, $90 ; ROM $001437: 5C D0 12 A5 44 C5 2A D0 0C A5 42 C5 28 A9 01 90 + .byte $02, $A9, $03, $85, $4A, $60, $A5, $5C, $D0, $FB, $A5, $42, $C5, $28, $D0, $0C ; ROM $001447: 02 A9 03 85 4A 60 A5 5C D0 FB A5 42 C5 28 D0 0C + .byte $A5, $44, $C5, $2A, $A9, $04, $90, $02, $A9, $02, $85, $4A, $60, $A9, $00, $85 ; ROM $001457: A5 44 C5 2A A9 04 90 02 A9 02 85 4A 60 A9 00 85 + .byte $51, $A5, $43, $C9, $08, $D0, $04, $A5, $45, $C9, $08, $D0, $59, $A4, $44, $B9 ; ROM $001467: 51 A5 43 C9 08 D0 04 A5 45 C9 08 D0 59 A4 44 B9 + .byte $A3, $E2, $85, $34, $B9, $B0, $E2, $85, $35, $A4, $42, $C8, $20, $C0, $D4, $D0 ; ROM $001477: A3 E2 85 34 B9 B0 E2 85 35 A4 42 C8 20 C0 D4 D0 + .byte $04, $A9, $01, $85, $51, $88, $88, $20, $C0, $D4, $D0, $06, $A9, $04, $05, $51 ; ROM $001487: 04 A9 01 85 51 88 88 20 C0 D4 D0 06 A9 04 05 51 + .byte $85, $51, $A4, $44, $88, $B9, $A3, $E2, $85, $34, $B9, $B0, $E2, $85, $35, $A4 ; ROM $001497: 85 51 A4 44 88 B9 A3 E2 85 34 B9 B0 E2 85 35 A4 + .byte $42, $20, $C0, $D4, $D0, $06, $A9, $02, $05, $51, $85, $51, $A4, $44, $C8, $B9 ; ROM $0014A7: 42 20 C0 D4 D0 06 A9 02 05 51 85 51 A4 44 C8 B9 + .byte $A3, $E2, $85, $34, $B9, $B0, $E2, $85, $35, $A4, $42, $20, $C0, $D4, $D0, $06 ; ROM $0014B7: A3 E2 85 34 B9 B0 E2 85 35 A4 42 20 C0 D4 D0 06 + .byte $A9, $08, $05, $51, $85, $51, $A5, $51, $60, $B1, $34, $F0, $FB, $C9, $08, $F0 ; ROM $0014C7: A9 08 05 51 85 51 A5 51 60 B1 34 F0 FB C9 08 F0 + .byte $F7, $C9, $06, $F0, $F3, $C9, $02, $F0, $01, $60, $A5, $41, $C9, $05, $F0, $E8 ; ROM $0014D7: F7 C9 06 F0 F3 C9 02 F0 01 60 A5 41 C9 05 F0 E8 + .byte $C9, $06, $F0, $E4, $C9, $08, $60, $A2, $00, $86, $4E, $AA, $C9, $01, $D0, $03 ; ROM $0014E7: C9 06 F0 E4 C9 08 60 A2 00 86 4E AA C9 01 D0 03 + .byte $20, $8D, $D5, $8A, $C9, $03, $D0, $03, $20, $62, $D5, $8A, $C9, $02, $D0, $03 ; ROM $0014F7: 20 8D D5 8A C9 03 D0 03 20 62 D5 8A C9 02 D0 03 + .byte $20, $37, $D5, $8A, $C9, $04, $D0, $03, $20, $05, $D5, $A5, $4E, $60, $A5, $45 ; ROM $001507: 20 37 D5 8A C9 04 D0 03 20 05 D5 A5 4E 60 A5 45 + .byte $C9, $08, $B0, $03, $E6, $45, $60, $A4, $44, $C8, $B9, $A3, $E2, $85, $34, $B9 ; ROM $001517: C9 08 B0 03 E6 45 60 A4 44 C8 B9 A3 E2 85 34 B9 + .byte $B0, $E2, $85, $35, $A4, $42, $20, $C0, $D4, $D0, $12, $20, $BC, $D5, $E6, $45 ; ROM $001527: B0 E2 85 35 A4 42 20 C0 D4 D0 12 20 BC D5 E6 45 + .byte $A5, $45, $C9, $10, $D0, $06, $A9, $00, $85, $45, $E6, $44, $60, $85, $4E, $60 ; ROM $001537: A5 45 C9 10 D0 06 A9 00 85 45 E6 44 60 85 4E 60 + .byte $A5, $45, $C9, $09, $90, $03, $C6, $45, $60, $A4, $44, $88, $B9, $A3, $E2, $85 ; ROM $001547: A5 45 C9 09 90 03 C6 45 60 A4 44 88 B9 A3 E2 85 + .byte $34, $B9, $B0, $E2, $85, $35, $A4, $42, $20, $C0, $D4, $D0, $E0, $20, $BC, $D5 ; ROM $001557: 34 B9 B0 E2 85 35 A4 42 20 C0 D4 D0 E0 20 BC D5 + .byte $C6, $45, $10, $06, $A9, $0F, $85, $45, $C6, $44, $60, $A5, $43, $C9, $09, $90 ; ROM $001567: C6 45 10 06 A9 0F 85 45 C6 44 60 A5 43 C9 09 90 + .byte $03, $C6, $43, $60, $A4, $44, $B9, $A3, $E2, $85, $34, $B9, $B0, $E2, $85, $35 ; ROM $001577: 03 C6 43 60 A4 44 B9 A3 E2 85 34 B9 B0 E2 85 35 + .byte $A4, $42, $88, $20, $C0, $D4, $D0, $B5, $20, $CB, $D5, $C6, $43, $10, $06, $A9 ; ROM $001587: A4 42 88 20 C0 D4 D0 B5 20 CB D5 C6 43 10 06 A9 + .byte $0F, $85, $43, $C6, $42, $60, $A5, $43, $C9, $08, $B0, $03, $E6, $43, $60, $A4 ; ROM $001597: 0F 85 43 C6 42 60 A5 43 C9 08 B0 03 E6 43 60 A4 + .byte $44, $B9, $A3, $E2, $85, $34, $B9, $B0, $E2, $85, $35, $A4, $42, $C8, $20, $C0 ; ROM $0015A7: 44 B9 A3 E2 85 34 B9 B0 E2 85 35 A4 42 C8 20 C0 + .byte $D4, $D0, $8A, $20, $CB, $D5, $E6, $43, $A5, $43, $C9, $10, $D0, $06, $A9, $00 ; ROM $0015B7: D4 D0 8A 20 CB D5 E6 43 A5 43 C9 10 D0 06 A9 00 + .byte $85, $43, $E6, $42, $60, $A5, $43, $C9, $08, $90, $05, $F0, $06, $C6, $43, $60 ; ROM $0015C7: 85 43 E6 42 60 A5 43 C9 08 90 05 F0 06 C6 43 60 + .byte $E6, $43, $60, $60, $A5, $45, $C9, $08, $90, $05, $F0, $06, $C6, $45, $60, $E6 ; ROM $0015D7: E6 43 60 60 A5 45 C9 08 90 05 F0 06 C6 45 60 E6 + .byte $45, $60, $60, $48, $A5, $33, $29, $07, $D0, $0F, $68, $E6, $46, $C5, $46, $90 ; ROM $0015E7: 45 60 60 48 A5 33 29 07 D0 0F 68 E6 46 C5 46 90 + .byte $03, $85, $46, $60, $C4, $46, $90, $F9, $60, $68, $60 ; ROM $0015F7: 03 85 46 60 C4 46 90 F9 60 68 60 +; Routine: Stage_WriteZp3F_D5F2 +; Global: Reachable code entry at CPU $D5F2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_WriteZp3F_D5F2: + stx $3F ; ROM $001602: 86 3F + sty $40 ; ROM $001604: 84 40 + asl a ; ROM $001606: 0A + pha ; ROM $001607: 48 + and #$0E ; ROM $001608: 29 0E + sta $3E ; ROM $00160A: 85 3E + pla ; ROM $00160C: 68 + asl a ; ROM $00160D: 0A + and #$E0 ; ROM $00160E: 29 E0 + ora $3E ; ROM $001610: 05 3E + sta $3E ; ROM $001612: 85 3E + lda $39 ; ROM $001614: A5 39 + inc $39 ; ROM $001616: E6 39 + clc ; ROM $001618: 18 + adc $DB ; ROM $001619: 65 DB + cmp #$0C ; ROM $00161B: C9 0C + bcc Stage_ReadZp3D_D611 ; ROM $00161D: 90 02 + sbc #$0A ; ROM $00161F: E9 0A +; Routine: Stage_ReadZp3D_D611 +; Global: Reachable code entry at CPU $D611 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ReadZp3D_D611: + asl a ; ROM $001621: 0A + asl a ; ROM $001622: 0A + asl a ; ROM $001623: 0A + asl a ; ROM $001624: 0A + tay ; ROM $001625: A8 + lda $3D ; ROM $001626: A5 3D + bne Stage_IncrementZp3E_D622 ; ROM $001628: D0 08 + jsr Stage_ReadPositionHi_D631 ; ROM $00162A: 20 31 D6 + inc $3E ; ROM $00162D: E6 3E + jmp Stage_ReadZp3F_D629 ; ROM $00162F: 4C 29 D6 +; Routine: Stage_IncrementZp3E_D622 +; Global: Reachable code entry at CPU $D622 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_IncrementZp3E_D622: + inc $3E ; ROM $001632: E6 3E + jsr Stage_ReadPositionHi_D631 ; ROM $001634: 20 31 D6 + dec $3E ; ROM $001637: C6 3E +; Routine: Stage_ReadZp3F_D629 +; Global: Reachable code entry at CPU $D629 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ReadZp3F_D629: + jsr Stage_ReadPositionHi_D631 ; ROM $001639: 20 31 D6 + ldx $3F ; ROM $00163C: A6 3F + ldy $40 ; ROM $00163E: A4 40 + rts ; ROM $001640: 60 +; Routine: Stage_ReadPositionHi_D631 +; Global: Reachable code entry at CPU $D631 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ReadPositionHi_D631: + lda $3B ; ROM $001641: A5 3B + sta $0700,y ; ROM $001643: 99 00 07 + lda $3E ; ROM $001646: A5 3E + pha ; ROM $001648: 48 + sta $0701,y ; ROM $001649: 99 01 07 + lda $3C ; ROM $00164C: A5 3C + ora $3D ; ROM $00164E: 05 3D + sta $0702,y ; ROM $001650: 99 02 07 + lda $3A ; ROM $001653: A5 3A + sta $0703,y ; ROM $001655: 99 03 07 + lda $3B ; ROM $001658: A5 3B + clc ; ROM $00165A: 18 + adc #$08 ; ROM $00165B: 69 08 + sta $0704,y ; ROM $00165D: 99 04 07 + pla ; ROM $001660: 68 + clc ; ROM $001661: 18 + adc #$10 ; ROM $001662: 69 10 + sta $0705,y ; ROM $001664: 99 05 07 + lda $3C ; ROM $001667: A5 3C + ora $3D ; ROM $001669: 05 3D + sta $0706,y ; ROM $00166B: 99 06 07 + lda $3A ; ROM $00166E: A5 3A + sta $0707,y ; ROM $001670: 99 07 07 + tya ; ROM $001673: 98 + clc ; ROM $001674: 18 + adc #$08 ; ROM $001675: 69 08 + tay ; ROM $001677: A8 + lda $3A ; ROM $001678: A5 3A + clc ; ROM $00167A: 18 + adc #$08 ; ROM $00167B: 69 08 + sta $3A ; ROM $00167D: 85 3A + rts ; ROM $00167F: 60 +; Routine: AdvanceRandomState +; Global: Reachable code entry at CPU $D670 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +AdvanceRandomState: + lda RandomState0 ; ROM $001680: A5 54 + rol a ; ROM $001682: 2A + rol a ; ROM $001683: 2A + eor #$41 ; ROM $001684: 49 41 + rol a ; ROM $001686: 2A + rol a ; ROM $001687: 2A + eor #$93 ; ROM $001688: 49 93 + adc RandomState1 ; ROM $00168A: 65 55 + sta RandomState0 ; ROM $00168C: 85 54 + rol a ; ROM $00168E: 2A + rol a ; ROM $00168F: 2A + eor #$12 ; ROM $001690: 49 12 + rol a ; ROM $001692: 2A + rol a ; ROM $001693: 2A + adc RandomState2 ; ROM $001694: 65 56 + sta RandomState1 ; ROM $001696: 85 55 + adc RandomState0 ; ROM $001698: 65 54 + inc RandomState2 ; ROM $00169A: E6 56 + bne Stage_ToggleRandomState3_D697 ; ROM $00169C: D0 09 + pha ; ROM $00169E: 48 + lda RandomState3 ; ROM $00169F: A5 57 + clc ; ROM $0016A1: 18 + adc #$1D ; ROM $0016A2: 69 1D + sta RandomState3 ; ROM $0016A4: 85 57 + pla ; ROM $0016A6: 68 +; Routine: Stage_ToggleRandomState3_D697 +; Global: Reachable code entry at CPU $D697 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ToggleRandomState3_D697: + eor $57 ; ROM $0016A7: 45 57 + rts ; ROM $0016A9: 60 +; Routine: Stage_ReadZp58_D69A +; Global: Reachable code entry at CPU $D69A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ReadZp58_D69A: + lda $58 ; ROM $0016AA: A5 58 + cmp #$1A ; ROM $0016AC: C9 1A + bcc Stage_HandleControl_D6A8 ; ROM $0016AE: 90 08 + sbc #$19 ; ROM $0016B0: E9 19 + ldx #$02 ; ROM $0016B2: A2 02 + ldy #$D8 ; ROM $0016B4: A0 D8 + bne Stage_WriteZp97_D6AC ; ROM $0016B6: D0 04 +; Routine: Stage_HandleControl_D6A8 +; Global: Reachable code entry at CPU $D6A8 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_HandleControl_D6A8: + ldx #$08 ; ROM $0016B8: A2 08 + ldy #$D7 ; ROM $0016BA: A0 D7 +; Routine: Stage_WriteZp97_D6AC +; Global: Reachable code entry at CPU $D6AC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_WriteZp97_D6AC: + stx $97 ; ROM $0016BC: 86 97 + sty $98 ; ROM $0016BE: 84 98 + sec ; ROM $0016C0: 38 + sbc #$01 ; ROM $0016C1: E9 01 + asl a ; ROM $0016C3: 0A + sta $24 ; ROM $0016C4: 85 24 + asl a ; ROM $0016C6: 0A + asl a ; ROM $0016C7: 0A + clc ; ROM $0016C8: 18 + adc $24 ; ROM $0016C9: 65 24 + tay ; ROM $0016CB: A8 + ldx #$09 ; ROM $0016CC: A2 09 +; Routine: Stage_ReadZp97_D6BE +; Global: Reachable code entry at CPU $D6BE traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ReadZp97_D6BE: + lda ($97),y ; ROM $0016CE: B1 97 + sta $0576,x ; ROM $0016D0: 9D 76 05 + beq Stage_AdvanceIndexY_D703 ; ROM $0016D3: F0 3E + sec ; ROM $0016D5: 38 + sbc #$01 ; ROM $0016D6: E9 01 + asl a ; ROM $0016D8: 0A + asl a ; ROM $0016D9: 0A + sta $05A8,x ; ROM $0016DA: 9D A8 05 + lda #$08 ; ROM $0016DD: A9 08 + sta $058A,x ; ROM $0016DF: 9D 8A 05 + sta $059E,x ; ROM $0016E2: 9D 9E 05 + jsr AdvanceRandomState ; ROM $0016E5: 20 70 D6 + and #$03 ; ROM $0016E8: 29 03 + clc ; ROM $0016EA: 18 + adc #$01 ; ROM $0016EB: 69 01 + sta $05D0,x ; ROM $0016ED: 9D D0 05 + sty $5A ; ROM $0016F0: 84 5A +; Routine: Stage_ReadObjectWorkX_D6E2 +; Global: Reachable code entry at CPU $D6E2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ReadObjectWorkX_D6E2: + jsr Gameplay_WriteObjectWorkX_CACF ; ROM $0016F2: 20 CF CA + lda $24 ; ROM $0016F5: A5 24 + cmp #$05 ; ROM $0016F7: C9 05 + bcc Stage_ReadObjectWorkX_D6E2 ; ROM $0016F9: 90 F7 + sta $0580,x ; ROM $0016FB: 9D 80 05 + lda $25 ; ROM $0016FE: A5 25 + sta $0594,x ; ROM $001700: 9D 94 05 + lda #$00 ; ROM $001703: A9 00 + sta $05B2,x ; ROM $001705: 9D B2 05 + sta $05DA,x ; ROM $001708: 9D DA 05 + sta $05C6,x ; ROM $00170B: 9D C6 05 + sta $05E4,x ; ROM $00170E: 9D E4 05 + ldy $5A ; ROM $001711: A4 5A +; Routine: Stage_AdvanceIndexY_D703 +; Global: Reachable code entry at CPU $D703 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_AdvanceIndexY_D703: + iny ; ROM $001713: C8 + dex ; ROM $001714: CA + bpl Stage_ReadZp97_D6BE ; ROM $001715: 10 B7 + rts ; ROM $001717: 60 + +; Data region: CPU $D708-$D8FB; unreachable by direct recursive trace. +GameplayParameterTables: + .byte $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $01, $01, $01, $02, $02, $02 ; ROM $001718: 01 01 01 01 01 01 00 00 00 00 01 01 01 02 02 02 + .byte $00, $00, $00, $00, $01, $01, $02, $02, $03, $03, $00, $00, $00, $00, $01, $02 ; ROM $001728: 00 00 00 00 01 01 02 02 03 03 00 00 00 00 01 02 + .byte $03, $03, $04, $04, $00, $00, $00, $00, $02, $02, $02, $02, $03, $03, $03, $00 ; ROM $001738: 03 03 04 04 00 00 00 00 02 02 02 02 03 03 03 00 + .byte $00, $00, $02, $02, $03, $03, $03, $04, $04, $00, $00, $00, $02, $02, $03, $03 ; ROM $001748: 00 00 02 02 03 03 03 04 04 00 00 00 02 02 03 03 + .byte $03, $05, $05, $00, $00, $00, $02, $03, $03, $04, $04, $04, $04, $00, $00, $00 ; ROM $001758: 03 05 05 00 00 00 02 03 03 04 04 04 04 00 00 00 + .byte $02, $03, $04, $04, $04, $04, $06, $00, $00, $00, $02, $03, $04, $05, $06, $06 ; ROM $001768: 02 03 04 04 04 04 06 00 00 00 02 03 04 05 06 06 + .byte $06, $00, $00, $00, $02, $03, $03, $04, $04, $04, $05, $06, $00, $00, $02, $03 ; ROM $001778: 06 00 00 00 02 03 03 04 04 04 05 06 00 00 02 03 + .byte $04, $05, $06, $06, $06, $06, $00, $00, $03, $03, $03, $04, $04, $04, $06, $06 ; ROM $001788: 04 05 06 06 06 06 00 00 03 03 03 04 04 04 06 06 + .byte $00, $00, $05, $05, $05, $05, $05, $05, $05, $07, $00, $00, $03, $04, $04, $04 ; ROM $001798: 00 00 05 05 05 05 05 05 05 07 00 00 03 04 04 04 + .byte $06, $06, $06, $07, $00, $00, $04, $04, $04, $06, $06, $06, $06, $07, $00, $00 ; ROM $0017A8: 06 06 06 07 00 00 04 04 04 06 06 06 06 07 00 00 + .byte $03, $03, $03, $03, $03, $06, $06, $07, $00, $00, $01, $01, $01, $02, $02, $02 ; ROM $0017B8: 03 03 03 03 03 06 06 07 00 00 01 01 01 02 02 02 + .byte $07, $07, $00, $00, $01, $02, $03, $03, $03, $05, $07, $07, $00, $00, $02, $03 ; ROM $0017C8: 07 07 00 00 01 02 03 03 03 05 07 07 00 00 02 03 + .byte $04, $05, $06, $06, $07, $07, $00, $00, $05, $05, $05, $06, $06, $06, $06, $07 ; ROM $0017D8: 04 05 06 06 07 07 00 00 05 05 05 06 06 06 06 07 + .byte $07, $00, $03, $03, $03, $03, $04, $04, $04, $06, $07, $00, $03, $03, $04, $04 ; ROM $0017E8: 07 00 03 03 03 03 04 04 04 06 07 00 03 03 04 04 + .byte $05, $05, $06, $06, $07, $00, $03, $04, $05, $06, $06, $05, $06, $06, $07, $00 ; ROM $0017F8: 05 05 06 06 07 00 03 04 05 06 06 05 06 06 07 00 + .byte $02, $02, $03, $04, $05, $05, $06, $06, $07, $00, $01, $02, $03, $04, $05, $05 ; ROM $001808: 02 02 03 04 05 05 06 06 07 00 01 02 03 04 05 05 + .byte $06, $06, $07, $00, $01, $02, $06, $06, $06, $05, $06, $06, $07, $00, $02, $03 ; ROM $001818: 06 06 07 00 01 02 06 06 06 05 06 06 07 00 02 03 + .byte $03, $03, $04, $04, $04, $06, $07, $00, $05, $05, $05, $05, $05, $06, $07, $06 ; ROM $001828: 03 03 04 04 04 06 07 00 05 05 05 05 05 06 07 06 + .byte $07, $00, $03, $03, $03, $04, $04, $05, $05, $06, $07, $00, $02, $02, $03, $03 ; ROM $001838: 07 00 03 03 03 04 04 05 05 06 07 00 02 02 03 03 + .byte $04, $04, $05, $05, $06, $06, $02, $03, $04, $04, $04, $06, $06, $06, $06, $07 ; ROM $001848: 04 04 05 05 06 06 02 03 04 04 04 06 06 06 06 07 + .byte $03, $03, $04, $04, $05, $06, $06, $07, $06, $07, $03, $03, $04, $04, $04, $06 ; ROM $001858: 03 03 04 04 05 06 06 07 06 07 03 03 04 04 04 06 + .byte $06, $07, $06, $07, $03, $03, $04, $05, $00, $06, $06, $07, $06, $07, $03, $03 ; ROM $001868: 06 07 06 07 03 03 04 05 00 06 06 07 06 07 03 03 + .byte $04, $04, $06, $06, $07, $06, $07, $07, $03, $03, $04, $05, $06, $06, $07, $06 ; ROM $001878: 04 04 06 06 07 06 07 07 03 03 04 05 06 06 07 06 + .byte $07, $07, $03, $03, $04, $04, $06, $06, $07, $06, $07, $07, $03, $04, $05, $05 ; ROM $001888: 07 07 03 03 04 04 06 06 07 06 07 07 03 04 05 05 + .byte $06, $07, $06, $07, $07, $07, $03, $04, $04, $06, $06, $07, $06, $07, $07, $07 ; ROM $001898: 06 07 06 07 07 07 03 04 04 06 06 07 06 07 07 07 + .byte $03, $04, $05, $06, $06, $06, $07, $07, $07, $07, $04, $05, $06, $06, $07, $06 ; ROM $0018A8: 03 04 05 06 06 06 07 07 07 07 04 05 06 06 07 06 + .byte $07, $07, $07, $07, $04, $05, $06, $07, $06, $07, $07, $07, $07, $07, $04, $05 ; ROM $0018B8: 07 07 07 07 04 05 06 07 06 07 07 07 07 07 04 05 + .byte $06, $07, $06, $07, $07, $07, $07, $07, $05, $06, $05, $06, $07, $07, $07, $07 ; ROM $0018C8: 06 07 06 07 07 07 07 07 05 06 05 06 07 07 07 07 + .byte $07, $07, $05, $06, $05, $06, $07, $07, $07, $07, $07, $07, $06, $05, $05, $06 ; ROM $0018D8: 07 07 05 06 05 06 07 07 07 07 07 07 06 05 05 06 + .byte $07, $07, $07, $07, $07, $07, $06, $05, $06, $07, $07, $07, $07, $07, $07, $08 ; ROM $0018E8: 07 07 07 07 07 07 06 05 06 07 07 07 07 07 07 08 + .byte $05, $05, $06, $07, $07, $07, $07, $07, $07, $08, $05, $05, $06, $07, $07, $07 ; ROM $0018F8: 05 05 06 07 07 07 07 07 07 08 05 05 06 07 07 07 + .byte $07, $07, $08, $08 ; ROM $001908: 07 07 08 08 +; Routine: Stage_WriteObjectWorkX_D8FC +; Global: Reachable code entry at CPU $D8FC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_WriteObjectWorkX_D8FC: + stx $24 ; ROM $00190C: 86 24 + sty $25 ; ROM $00190E: 84 25 + pha ; ROM $001910: 48 +; Routine: Stage_ReadZp14_D901 +; Global: Reachable code entry at CPU $D901 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ReadZp14_D901: + lda $14 ; ROM $001911: A5 14 + sec ; ROM $001913: 38 + sbc $15 ; ROM $001914: E5 15 + cmp #$08 ; ROM $001916: C9 08 + beq Stage_ReadZp14_D901 ; ROM $001918: F0 F7 + pla ; ROM $00191A: 68 + jsr Stage_WriteZp1A_D924 ; ROM $00191B: 20 24 D9 + ldy $15 ; ROM $00191E: A4 15 + ldx #$00 ; ROM $001920: A2 00 +; Routine: Stage_ReadZp17_D912 +; Global: Reachable code entry at CPU $D912 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ReadZp17_D912: + lda $17,x ; ROM $001922: B5 17 + sta $0600,y ; ROM $001924: 99 00 06 + iny ; ROM $001927: C8 + inx ; ROM $001928: E8 + cpx #$08 ; ROM $001929: E0 08 + bne Stage_ReadZp17_D912 ; ROM $00192B: D0 F5 + sty $15 ; ROM $00192D: 84 15 + ldx $24 ; ROM $00192F: A6 24 + ldy $25 ; ROM $001931: A4 25 + rts ; ROM $001933: 60 +; Routine: Stage_WriteZp1A_D924 +; Global: Reachable code entry at CPU $D924 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_WriteZp1A_D924: + tay ; ROM $001934: A8 + asl a ; ROM $001935: 0A + asl a ; ROM $001936: 0A + sta $1A ; ROM $001937: 85 1A + lda $D994,y ; ROM $001939: B9 94 D9 + sta $1E ; ROM $00193C: 85 1E + ldy #$00 ; ROM $00193E: A0 00 + lda $1F ; ROM $001940: A5 1F + cmp #$10 ; ROM $001942: C9 10 + bcc Stage_WriteZp17_D93A ; ROM $001944: 90 04 + ldy #$04 ; ROM $001946: A0 04 + sbc #$10 ; ROM $001948: E9 10 +; Routine: Stage_WriteZp17_D93A +; Global: Reachable code entry at CPU $D93A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_WriteZp17_D93A: + sty $17 ; ROM $00194A: 84 17 + asl a ; ROM $00194C: 0A + sta $21 ; ROM $00194D: 85 21 + lda $20 ; ROM $00194F: A5 20 + clc ; ROM $001951: 18 + adc #$02 ; ROM $001952: 69 02 + asl a ; ROM $001954: 0A + sta $22 ; ROM $001955: 85 22 + and #$FC ; ROM $001957: 29 FC + asl a ; ROM $001959: 0A + sta $1B ; ROM $00195A: 85 1B + lda $21 ; ROM $00195C: A5 21 + lsr a ; ROM $00195E: 4A + lsr a ; ROM $00195F: 4A + clc ; ROM $001960: 18 + adc $1B ; ROM $001961: 65 1B + clc ; ROM $001963: 18 + adc #$C0 ; ROM $001964: 69 C0 + sta $1B ; ROM $001966: 85 1B + lda #$23 ; ROM $001968: A9 23 + sta $1C ; ROM $00196A: 85 1C + lda #$02 ; ROM $00196C: A9 02 + and $22 ; ROM $00196E: 25 22 + sta $23 ; ROM $001970: 85 23 + lda $21 ; ROM $001972: A5 21 + and #$03 ; ROM $001974: 29 03 + lsr a ; ROM $001976: 4A + clc ; ROM $001977: 18 + adc $23 ; ROM $001978: 65 23 + asl a ; ROM $00197A: 0A + pha ; ROM $00197B: 48 + lda #$FC ; ROM $00197C: A9 FC + sta $1D ; ROM $00197E: 85 1D + pla ; ROM $001980: 68 + tax ; ROM $001981: AA + beq Stage_WriteZp19_D97C ; ROM $001982: F0 08 +; Routine: Stage_ShiftLeftZp1E_D974 +; Global: Reachable code entry at CPU $D974 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ShiftLeftZp1E_D974: + asl $1E ; ROM $001984: 06 1E + sec ; ROM $001986: 38 + rol $1D ; ROM $001987: 26 1D + dex ; ROM $001989: CA + bne Stage_ShiftLeftZp1E_D974 ; ROM $00198A: D0 F8 +; Routine: Stage_WriteZp19_D97C +; Global: Reachable code entry at CPU $D97C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_WriteZp19_D97C: + lda #$01 ; ROM $00198C: A9 01 + sta $19 ; ROM $00198E: 85 19 + lda $22 ; ROM $001990: A5 22 + ldx #$05 ; ROM $001992: A2 05 +; Routine: Stage_RotateLeftZp19_D984 +; Global: Reachable code entry at CPU $D984 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_RotateLeftZp19_D984: + asl a ; ROM $001994: 0A + rol $19 ; ROM $001995: 26 19 + dex ; ROM $001997: CA + bne Stage_RotateLeftZp19_D984 ; ROM $001998: D0 FA + clc ; ROM $00199A: 18 + adc $21 ; ROM $00199B: 65 21 + sta $18 ; ROM $00199D: 85 18 + bcc Stage_ReturnToCaller_D993 ; ROM $00199F: 90 02 + inc $19 ; ROM $0019A1: E6 19 +; Routine: Stage_ReturnToCaller_D993 +; Global: Reachable code entry at CPU $D993 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Stage_ReturnToCaller_D993: + rts ; ROM $0019A3: 60 + +; Data region: CPU $D994-$DA8D; unreachable by direct recursive trace. +StageLayoutPointerData: + .byte $00, $00, $00, $01, $01, $01, $01, $01, $00, $00, $00, $01, $01, $01, $01, $01 ; ROM $0019A4: 00 00 00 01 01 01 01 01 00 00 00 01 01 01 01 01 + .byte $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01 ; ROM $0019B4: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + .byte $01, $01, $01, $01, $01, $01, $01, $01, $03, $02, $02, $02, $02, $02, $02, $02 ; ROM $0019C4: 01 01 01 01 01 01 01 01 03 02 02 02 02 02 02 02 + .byte $02, $03, $5F, $5F, $5F, $5F, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $6D ; ROM $0019D4: 02 03 5F 5F 5F 5F 64 65 66 67 68 69 6A 6B 6C 6D + .byte $6E, $6F, $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7A, $7B, $7C, $7D ; ROM $0019E4: 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D + .byte $7E, $7F, $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D ; ROM $0019F4: 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D + .byte $8E, $8F, $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $20, $20 ; ROM $001A04: 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 20 20 + .byte $21, $21, $22, $23, $22, $23, $24, $24, $25, $25, $26, $27, $26, $27, $28, $28 ; ROM $001A14: 21 21 22 23 22 23 24 24 25 25 26 27 26 27 28 28 + .byte $29, $29, $2A, $2B, $2A, $2B, $2C, $2C, $2D, $2D, $2E, $2F, $2E, $2F, $20, $9D ; ROM $001A24: 29 29 2A 2B 2A 2B 2C 2C 2D 2D 2E 2F 2E 2F 20 9D + .byte $21, $9F, $9C, $9D, $22, $23, $9C, $20, $9E, $21, $22, $23, $9E, $9F, $24, $A1 ; ROM $001A34: 21 9F 9C 9D 22 23 9C 20 9E 21 22 23 9E 9F 24 A1 + .byte $25, $A3, $A0, $A1, $26, $27, $A0, $24, $A2, $25, $26, $27, $A2, $A3, $28, $A5 ; ROM $001A44: 25 A3 A0 A1 26 27 A0 24 A2 25 26 27 A2 A3 28 A5 + .byte $29, $A7, $A4, $A5, $2A, $2B, $A4, $28, $A6, $29, $2A, $2B, $A6, $A7, $2C, $A9 ; ROM $001A54: 29 A7 A4 A5 2A 2B A4 28 A6 29 2A 2B A6 A7 2C A9 + .byte $2D, $AB, $A8, $A9, $2E, $2F, $A8, $2C, $AA, $2D, $2E, $2F, $AA, $AB, $68, $69 ; ROM $001A64: 2D AB A8 A9 2E 2F A8 2C AA 2D 2E 2F AA AB 68 69 + .byte $6A, $6B, $3C, $3D, $3E, $3F, $00, $01, $10, $11, $02, $03, $12, $13, $04, $05 ; ROM $001A74: 6A 6B 3C 3D 3E 3F 00 01 10 11 02 03 12 13 04 05 + .byte $14, $15, $06, $07, $16, $17, $08, $09, $18, $19, $0A, $0B, $1A, $1B, $0C, $0D ; ROM $001A84: 14 15 06 07 16 17 08 09 18 19 0A 0B 1A 1B 0C 0D + .byte $1C, $1D, $0E, $0F, $1E, $1F, $68, $69, $6A, $6B ; ROM $001A94: 1C 1D 0E 0F 1E 1F 68 69 6A 6B +; Routine: RunMenuSelectionScreen +; Global: Reachable code entry at CPU $DA8E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +RunMenuSelectionScreen: + jsr DisableRendering ; ROM $001A9E: 20 57 C2 + jsr Ppu_HandleControl_C2B9 ; ROM $001AA1: 20 B9 C2 + jsr UploadMenuPalette ; ROM $001AA4: 20 27 DF + lda #$00 ; ROM $001AA7: A9 00 + sta $60 ; ROM $001AA9: 85 60 + sta $72 ; ROM $001AAB: 85 72 + sta $B5 ; ROM $001AAD: 85 B5 + ldy #$9F ; ROM $001AAF: A0 9F + lda #$20 ; ROM $001AB1: A9 20 + ldx #$E7 ; ROM $001AB3: A2 E7 + jsr Menu_CallHelper_DC41 ; ROM $001AB5: 20 41 DC + jsr Ppu_CallHelper_C23B ; ROM $001AB8: 20 3B C2 + lda #$06 ; ROM $001ABB: A9 06 + sta $1F ; ROM $001ABD: 85 1F + lda #$3A ; ROM $001ABF: A9 3A + sta $20 ; ROM $001AC1: 85 20 + ldy #$00 ; ROM $001AC3: A0 00 +; Routine: Menu_TransferVramDataPath_DAB5 +; Global: Reachable code entry at CPU $DAB5 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DAB5: + jsr WaitForVBlankTransition ; ROM $001AC5: 20 8B C2 + lda #$22 ; ROM $001AC8: A9 22 + ldx $1F ; ROM $001ACA: A6 1F + jsr SetPpuAddress ; ROM $001ACC: 20 96 C1 + lda $20 ; ROM $001ACF: A5 20 + sta PPUDATA ; ROM $001AD1: 8D 07 20 + jsr CommitPpuStateAndScroll ; ROM $001AD4: 20 96 C2 + ldx #$0A ; ROM $001AD7: A2 0A +; Routine: Menu_TransferVramDataPath_DAC9 +; Global: Reachable code entry at CPU $DAC9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DAC9: + jsr WaitForVBlankTransition ; ROM $001AD9: 20 8B C2 + lda ControllerState1 ; ROM $001ADC: A5 12 + and #$8F ; ROM $001ADE: 29 8F + bne Menu_UpdateAudioChannelPath_DAF8 ; ROM $001AE0: D0 26 + dex ; ROM $001AE2: CA + bne Menu_TransferVramDataPath_DAC9 ; ROM $001AE3: D0 F4 + jsr WaitForVBlankTransition ; ROM $001AE5: 20 8B C2 + lda #$22 ; ROM $001AE8: A9 22 + ldx $1F ; ROM $001AEA: A6 1F + jsr SetPpuAddress ; ROM $001AEC: 20 96 C1 + lda #$3B ; ROM $001AEF: A9 3B + sta PPUDATA ; ROM $001AF1: 8D 07 20 + jsr CommitPpuStateAndScroll ; ROM $001AF4: 20 96 C2 + ldx #$0A ; ROM $001AF7: A2 0A +; Routine: Menu_CallHelper_DAE9 +; Global: Reachable code entry at CPU $DAE9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_CallHelper_DAE9: + jsr WaitForVBlankTransition ; ROM $001AF9: 20 8B C2 + lda ControllerState1 ; ROM $001AFC: A5 12 + and #$8F ; ROM $001AFE: 29 8F + bne Menu_UpdateAudioChannelPath_DAF8 ; ROM $001B00: D0 06 + dex ; ROM $001B02: CA + bne Menu_CallHelper_DAE9 ; ROM $001B03: D0 F4 + jmp Menu_TransferVramDataPath_DAB5 ; ROM $001B05: 4C B5 DA +; Routine: Menu_UpdateAudioChannelPath_DAF8 +; Global: Reachable code entry at CPU $DAF8 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_UpdateAudioChannelPath_DAF8: + bmi Menu_TransferVramDataPath_DB43 ; ROM $001B08: 30 49 + pha ; ROM $001B0A: 48 + lda #$12 ; ROM $001B0B: A9 12 + sta APUPULSE1TIMERHI ; ROM $001B0D: 8D 03 40 + pla ; ROM $001B10: 68 + cmp #$01 ; ROM $001B11: C9 01 + beq Menu_ReadWorkValue_DB24 ; ROM $001B13: F0 1F + lda $20 ; ROM $001B15: A5 20 + cmp #$3A ; ROM $001B17: C9 3A + bne Menu_ReadWorkValue_DB0F ; ROM $001B19: D0 04 + lda #$51 ; ROM $001B1B: A9 51 + sta $20 ; ROM $001B1D: 85 20 +; Routine: Menu_ReadWorkValue_DB0F +; Global: Reachable code entry at CPU $DB0F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_ReadWorkValue_DB0F: + lda $20 ; ROM $001B1F: A5 20 + cmp #$41 ; ROM $001B21: C9 41 + beq Menu_WriteWorkValue_DB1A ; ROM $001B23: F0 05 + dec $20 ; ROM $001B25: C6 20 + jmp Menu_CallHelper_DB1E ; ROM $001B27: 4C 1E DB +; Routine: Menu_WriteWorkValue_DB1A +; Global: Reachable code entry at CPU $DB1A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_WriteWorkValue_DB1A: + lda #$50 ; ROM $001B2A: A9 50 + sta $20 ; ROM $001B2C: 85 20 +; Routine: Menu_CallHelper_DB1E +; Global: Reachable code entry at CPU $DB1E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_CallHelper_DB1E: + jsr WaitForFrameBoundary ; ROM $001B2E: 20 07 C3 + jmp Menu_TransferVramDataPath_DAB5 ; ROM $001B31: 4C B5 DA +; Routine: Menu_ReadWorkValue_DB24 +; Global: Reachable code entry at CPU $DB24 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_ReadWorkValue_DB24: + lda $20 ; ROM $001B34: A5 20 + cmp #$3A ; ROM $001B36: C9 3A + bne Menu_ReadWorkValue_DB2E ; ROM $001B38: D0 04 + lda #$40 ; ROM $001B3A: A9 40 + sta $20 ; ROM $001B3C: 85 20 +; Routine: Menu_ReadWorkValue_DB2E +; Global: Reachable code entry at CPU $DB2E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_ReadWorkValue_DB2E: + lda $20 ; ROM $001B3E: A5 20 + cmp #$50 ; ROM $001B40: C9 50 + beq Menu_WriteWorkValue_DB39 ; ROM $001B42: F0 05 + inc $20 ; ROM $001B44: E6 20 + jmp Menu_CallHelper_DB3D ; ROM $001B46: 4C 3D DB +; Routine: Menu_WriteWorkValue_DB39 +; Global: Reachable code entry at CPU $DB39 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_WriteWorkValue_DB39: + lda #$41 ; ROM $001B49: A9 41 + sta $20 ; ROM $001B4B: 85 20 +; Routine: Menu_CallHelper_DB3D +; Global: Reachable code entry at CPU $DB3D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_CallHelper_DB3D: + jsr WaitForFrameBoundary ; ROM $001B4D: 20 07 C3 +; Routine: Menu_Dispatch_DB40 +; Global: Reachable code entry at CPU $DB40 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_Dispatch_DB40: + jmp Menu_TransferVramDataPath_DAB5 ; ROM $001B50: 4C B5 DA +; Routine: Menu_TransferVramDataPath_DB43 +; Global: Reachable code entry at CPU $DB43 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DB43: + lda #$11 ; ROM $001B53: A9 11 + sta APUPULSE1TIMERHI ; ROM $001B55: 8D 03 40 + lda $20 ; ROM $001B58: A5 20 + cmp #$3A ; ROM $001B5A: C9 3A + beq Menu_Dispatch_DB40 ; ROM $001B5C: F0 F2 + and #$0F ; ROM $001B5E: 29 0F + tax ; ROM $001B60: AA + lda $DFA0,x ; ROM $001B61: BD A0 DF + sta $007F,y ; ROM $001B64: 99 7F 00 + jsr WaitForVBlankTransition ; ROM $001B67: 20 8B C2 + lda #$22 ; ROM $001B6A: A9 22 + ldx $1F ; ROM $001B6C: A6 1F + jsr SetPpuAddress ; ROM $001B6E: 20 96 C1 + lda $20 ; ROM $001B71: A5 20 + sta PPUDATA ; ROM $001B73: 8D 07 20 + jsr CommitPpuStateAndScroll ; ROM $001B76: 20 96 C2 + lda #$3A ; ROM $001B79: A9 3A + sta $20 ; ROM $001B7B: 85 20 + inc $1F ; ROM $001B7D: E6 1F + iny ; ROM $001B7F: C8 + cpy #$14 ; ROM $001B80: C0 14 + beq Menu_HandleControl_DB7A ; ROM $001B82: F0 06 + jsr WaitForFrameBoundary ; ROM $001B84: 20 07 C3 + jmp Menu_TransferVramDataPath_DAB5 ; ROM $001B87: 4C B5 DA +; Routine: Menu_HandleControl_DB7A +; Global: Reachable code entry at CPU $DB7A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DB7A: + ldx #$00 ; ROM $001B8A: A2 00 + stx RandomState0 ; ROM $001B8C: 86 54 +; Routine: Menu_ReadZp7F_DB7E +; Global: Reachable code entry at CPU $DB7E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_ReadZp7F_DB7E: + lda $7F,x ; ROM $001B8E: B5 7F + pha ; ROM $001B90: 48 + clc ; ROM $001B91: 18 + adc #$07 ; ROM $001B92: 69 07 + clc ; ROM $001B94: 18 + adc RandomState0 ; ROM $001B95: 65 54 + and #$0F ; ROM $001B97: 29 0F + sta $7F,x ; ROM $001B99: 95 7F + pla ; ROM $001B9B: 68 + sta RandomState0 ; ROM $001B9C: 85 54 + inx ; ROM $001B9E: E8 + cpx #$14 ; ROM $001B9F: E0 14 + bne Menu_ReadZp7F_DB7E ; ROM $001BA1: D0 EB + ldx #$00 ; ROM $001BA3: A2 00 +; Routine: Menu_HandleControl_DB95 +; Global: Reachable code entry at CPU $DB95 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DB95: + ldy #$04 ; ROM $001BA5: A0 04 + lda #$00 ; ROM $001BA7: A9 00 +; Routine: Menu_AddToZp7F_DB99 +; Global: Reachable code entry at CPU $DB99 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_AddToZp7F_DB99: + clc ; ROM $001BA9: 18 + adc $7F,x ; ROM $001BAA: 75 7F + inx ; ROM $001BAC: E8 + dey ; ROM $001BAD: 88 + bne Menu_AddToZp7F_DB99 ; ROM $001BAE: D0 F9 + and #$0F ; ROM $001BB0: 29 0F + cmp $7F,x ; ROM $001BB2: D5 7F + bne Menu_Dispatch_DBCC ; ROM $001BB4: D0 26 + inx ; ROM $001BB6: E8 + cpx #$0F ; ROM $001BB7: E0 0F + bne Menu_HandleControl_DB95 ; ROM $001BB9: D0 EA + lda $83 ; ROM $001BBB: A5 83 + asl a ; ROM $001BBD: 0A + sta $1F ; ROM $001BBE: 85 1F + lda $88 ; ROM $001BC0: A5 88 + asl a ; ROM $001BC2: 0A + clc ; ROM $001BC3: 18 + adc $1F ; ROM $001BC4: 65 1F + sta $1F ; ROM $001BC6: 85 1F + lda $8D ; ROM $001BC8: A5 8D + asl a ; ROM $001BCA: 0A + clc ; ROM $001BCB: 18 + adc $1F ; ROM $001BCC: 65 1F + ldx #$04 ; ROM $001BCE: A2 04 +; Routine: Menu_AddToZp8D_DBC0 +; Global: Reachable code entry at CPU $DBC0 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_AddToZp8D_DBC0: + clc ; ROM $001BD0: 18 + adc $8D,x ; ROM $001BD1: 75 8D + dex ; ROM $001BD3: CA + bne Menu_AddToZp8D_DBC0 ; ROM $001BD4: D0 FA + and #$0F ; ROM $001BD6: 29 0F + cmp $92 ; ROM $001BD8: C5 92 + beq Menu_HandleControl_DBCF ; ROM $001BDA: F0 03 +; Routine: Menu_Dispatch_DBCC +; Global: Reachable code entry at CPU $DBCC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_Dispatch_DBCC: + jmp RunMenuSelectionScreen ; ROM $001BDC: 4C 8E DA +; Routine: Menu_HandleControl_DBCF +; Global: Reachable code entry at CPU $DBCF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DBCF: + ldx #$00 ; ROM $001BDF: A2 00 + ldy #$00 ; ROM $001BE1: A0 00 +; Routine: Menu_ReadRam007F_DBD3 +; Global: Reachable code entry at CPU $DBD3 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_ReadRam007F_DBD3: + jsr Gameplay_ReadRamE360_E353 ; ROM $001BE3: 20 53 E3 + lda $007F,y ; ROM $001BE6: B9 7F 00 + sty $25 ; ROM $001BE9: 84 25 + ldy #$00 ; ROM $001BEB: A0 00 + sta ($34),y ; ROM $001BED: 91 34 + ldy $25 ; ROM $001BEF: A4 25 + iny ; ROM $001BF1: C8 + cpy #$14 ; ROM $001BF2: C0 14 + bne Menu_ReadRam007F_DBD3 ; ROM $001BF4: D0 ED + lda $DC ; ROM $001BF6: A5 DC + asl a ; ROM $001BF8: 0A + asl a ; ROM $001BF9: 0A + asl a ; ROM $001BFA: 0A + asl a ; ROM $001BFB: 0A + sta $73 ; ROM $001BFC: 85 73 + lda $DE ; ROM $001BFE: A5 DE + asl a ; ROM $001C00: 0A + asl a ; ROM $001C01: 0A + asl a ; ROM $001C02: 0A + asl a ; ROM $001C03: 0A + ora $DD ; ROM $001C04: 05 DD + sta $58 ; ROM $001C06: 85 58 + rts ; ROM $001C08: 60 +; Routine: Menu_WriteWorkValue_DBF9 +; Global: Reachable code entry at CPU $DBF9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_WriteWorkValue_DBF9: + jsr DisableRendering ; ROM $001C09: 20 57 C2 + jsr Ppu_HandleControl_C2B9 ; ROM $001C0C: 20 B9 C2 + jsr UploadMenuPalette ; ROM $001C0F: 20 27 DF + lda #$06 ; ROM $001C12: A9 06 + jsr Menu_SaveAccumulator_DD04 ; ROM $001C14: 20 04 DD + ldy #$00 ; ROM $001C17: A0 00 + jsr Menu_ReadRamDC53_DC39 ; ROM $001C19: 20 39 DC + jsr Menu_ReadRamDC53_DC39 ; ROM $001C1C: 20 39 DC + jsr Menu_ReadRamDC53_DC39 ; ROM $001C1F: 20 39 DC + jsr Menu_ReadRamDC53_DC39 ; ROM $001C22: 20 39 DC + jsr Menu_ReadRamDC53_DC39 ; ROM $001C25: 20 39 DC + jsr Menu_ReadRamDC53_DC39 ; ROM $001C28: 20 39 DC + jsr Menu_ReadRamDC53_DC39 ; ROM $001C2B: 20 39 DC + lda #$0A ; ROM $001C2E: A9 0A + sta $20 ; ROM $001C30: 85 20 + lda #$00 ; ROM $001C32: A9 00 + sta $1F ; ROM $001C34: 85 1F +; Routine: Menu_IncrementWorkIndex_DC26 +; Global: Reachable code entry at CPU $DC26 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_IncrementWorkIndex_DC26: + lda #$31 ; ROM $001C36: A9 31 + jsr Gameplay_WriteObjectWorkY_CB4E ; ROM $001C38: 20 4E CB + inc $1F ; ROM $001C3B: E6 1F + lda $1F ; ROM $001C3D: A5 1F + cmp #$10 ; ROM $001C3F: C9 10 + bne Menu_IncrementWorkIndex_DC26 ; ROM $001C41: D0 F3 + jsr EnableNmiInPpuControl ; ROM $001C43: 20 B0 C2 + jmp Ppu_CallHelper_C23B ; ROM $001C46: 4C 3B C2 +; Routine: Menu_ReadRamDC53_DC39 +; Global: Reachable code entry at CPU $DC39 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_ReadRamDC53_DC39: + lda $DC53,y ; ROM $001C49: B9 53 DC + iny ; ROM $001C4C: C8 + ldx $DC53,y ; ROM $001C4D: BE 53 DC + iny ; ROM $001C50: C8 +; Routine: Menu_CallHelper_DC41 +; Global: Reachable code entry at CPU $DC41 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_CallHelper_DC41: + jsr SetPpuAddress ; ROM $001C51: 20 96 C1 +; Routine: Menu_TransferVramDataPath_DC44 +; Global: Reachable code entry at CPU $DC44 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DC44: + lda $DC53,y ; ROM $001C54: B9 53 DC + iny ; ROM $001C57: C8 + cmp #$00 ; ROM $001C58: C9 00 + beq Menu_ReturnToCaller_DC52 ; ROM $001C5A: F0 06 + sta PPUDATA ; ROM $001C5C: 8D 07 20 + jmp Menu_TransferVramDataPath_DC44 ; ROM $001C5F: 4C 44 DC +; Routine: Menu_ReturnToCaller_DC52 +; Global: Reachable code entry at CPU $DC52 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_ReturnToCaller_DC52: + rts ; ROM $001C62: 60 + +; Data region: CPU $DC53-$DD03; unreachable by direct recursive trace. +MenuScreenConstructionData: + .byte $20, $88, $43, $4F, $4E, $47, $52, $41, $54, $55, $4C, $41, $54, $49, $4F, $4E ; ROM $001C63: 20 88 43 4F 4E 47 52 41 54 55 4C 41 54 49 4F 4E + .byte $53, $00, $20, $E4, $59, $4F, $55, $3A, $48, $41, $56, $45, $3A, $53, $55, $43 ; ROM $001C73: 53 00 20 E4 59 4F 55 3A 48 41 56 45 3A 53 55 43 + .byte $43, $45, $45, $44, $45, $44, $3A, $49, $4E, $00, $21, $22, $48, $45, $4C, $50 ; ROM $001C83: 43 45 45 44 45 44 3A 49 4E 00 21 22 48 45 4C 50 + .byte $49, $4E, $47, $3A, $42, $4F, $4D, $42, $45, $52, $4D, $41, $4E, $3A, $54, $4F ; ROM $001C93: 49 4E 47 3A 42 4F 4D 42 45 52 4D 41 4E 3A 54 4F + .byte $3A, $42, $45, $43, $4F, $4D, $45, $00, $21, $62, $41, $3A, $48, $55, $4D, $41 ; ROM $001CA3: 3A 42 45 43 4F 4D 45 00 21 62 41 3A 48 55 4D 41 + .byte $4E, $3A, $42, $45, $49, $4E, $47, $00, $21, $A4, $4D, $41, $59, $42, $45, $3A ; ROM $001CB3: 4E 3A 42 45 49 4E 47 00 21 A4 4D 41 59 42 45 3A + .byte $59, $4F, $55, $3A, $43, $41, $4E, $3A, $52, $45, $43, $4F, $47, $4E, $49, $5A ; ROM $001CC3: 59 4F 55 3A 43 41 4E 3A 52 45 43 4F 47 4E 49 5A + .byte $45, $3A, $48, $49, $4D, $00, $21, $E2, $49, $4E, $3A, $41, $4E, $4F, $54, $48 ; ROM $001CD3: 45 3A 48 49 4D 00 21 E2 49 4E 3A 41 4E 4F 54 48 + .byte $45, $52, $3A, $48, $55, $44, $53, $4F, $4E, $3A, $53, $4F, $46, $54, $3A, $47 ; ROM $001CE3: 45 52 3A 48 55 44 53 4F 4E 3A 53 4F 46 54 3A 47 + .byte $41, $4D, $45, $00, $22, $4B, $47, $4F, $4F, $44, $3A, $42, $59, $45, $00, $45 ; ROM $001CF3: 41 4D 45 00 22 4B 47 4F 4F 44 3A 42 59 45 00 45 + .byte $4E, $54, $45, $52, $3A, $53, $45, $43, $52, $45, $54, $3A, $43, $4F, $44, $45 ; ROM $001D03: 4E 54 45 52 3A 53 45 43 52 45 54 3A 43 4F 44 45 + .byte $00 ; ROM $001D13: 00 +; Routine: Menu_SaveAccumulator_DD04 +; Global: Reachable code entry at CPU $DD04 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_SaveAccumulator_DD04: + pha ; ROM $001D14: 48 + jsr WaitForVBlankTransition ; ROM $001D15: 20 8B C2 + lda #$3F ; ROM $001D18: A9 3F + ldx #$1C ; ROM $001D1A: A2 1C + jsr SetPpuAddress ; ROM $001D1C: 20 96 C1 + pla ; ROM $001D1F: 68 + asl a ; ROM $001D20: 0A + asl a ; ROM $001D21: 0A + tax ; ROM $001D22: AA + ldy #$04 ; ROM $001D23: A0 04 +; Routine: Menu_TransferVramDataPath_DD15 +; Global: Reachable code entry at CPU $DD15 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DD15: + lda $DD22,x ; ROM $001D25: BD 22 DD + sta PPUDATA ; ROM $001D28: 8D 07 20 + inx ; ROM $001D2B: E8 + dey ; ROM $001D2C: 88 + bne Menu_TransferVramDataPath_DD15 ; ROM $001D2D: D0 F6 + jmp Ppu_SetVramAddress_C2D6 ; ROM $001D2F: 4C D6 C2 + +; Data region: CPU $DD22-$DD3D; unreachable by direct recursive trace. +StatusScreenAddressTable: + .byte $0F, $00, $00, $00, $0F, $00, $00, $00, $0F, $00, $00, $00, $0F, $00, $00, $00 ; ROM $001D32: 0F 00 00 00 0F 00 00 00 0F 00 00 00 0F 00 00 00 + .byte $0F, $00, $00, $00, $0F, $00, $00, $00, $0F, $15, $36, $21 ; ROM $001D42: 0F 00 00 00 0F 00 00 00 0F 15 36 21 +; Routine: Menu_CallHelper_DD3E +; Global: Reachable code entry at CPU $DD3E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_CallHelper_DD3E: + jsr DisableRendering ; ROM $001D4E: 20 57 C2 + jsr Ppu_HandleControl_C2B9 ; ROM $001D51: 20 B9 C2 + jsr UploadMenuPalette ; ROM $001D54: 20 27 DF + lda #$21 ; ROM $001D57: A9 21 + ldx #$EA ; ROM $001D59: A2 EA + jsr SetPpuAddress ; ROM $001D5B: 20 96 C1 + ldx #$08 ; ROM $001D5E: A2 08 +; Routine: Menu_TransferVramDataPath_DD50 +; Global: Reachable code entry at CPU $DD50 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DD50: + lda $DD62,x ; ROM $001D60: BD 62 DD + sta PPUDATA ; ROM $001D63: 8D 07 20 + dex ; ROM $001D66: CA + bpl Menu_TransferVramDataPath_DD50 ; ROM $001D67: 10 F7 + jsr Gameplay_ReadObjectMode_E2BD ; ROM $001D69: 20 BD E2 + jsr EnableNmiInPpuControl ; ROM $001D6C: 20 B0 C2 + jmp Ppu_CallHelper_C23B ; ROM $001D6F: 4C 3B C2 + +; Data region: CPU $DD62-$DD6A; unreachable by direct recursive trace. +StatusDigitTileTable: + .byte $52, $45, $56, $4F, $3A, $45, $4D, $41, $47 ; ROM $001D72: 52 45 56 4F 3A 45 4D 41 47 +; Routine: Menu_WriteObjectWorkX_DD6B +; Global: Reachable code entry at CPU $DD6B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_WriteObjectWorkX_DD6B: + stx $24 ; ROM $001D7B: 86 24 + sty $25 ; ROM $001D7D: 84 25 + ldx $59 ; ROM $001D7F: A6 59 + bne Menu_ReadObjectWorkX_DDC2 ; ROM $001D81: D0 4F + ldx #$03 ; ROM $001D83: A2 03 + bne Menu_AddToZp61_DD8D ; ROM $001D85: D0 16 +; Routine: Menu_WriteObjectWorkX_DD77 +; Global: Reachable code entry at CPU $DD77 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_WriteObjectWorkX_DD77: + stx $24 ; ROM $001D87: 86 24 + sty $25 ; ROM $001D89: 84 25 + ldx $59 ; ROM $001D8B: A6 59 + bne Menu_ReadObjectWorkX_DDC2 ; ROM $001D8D: D0 43 + ldx #$04 ; ROM $001D8F: A2 04 + bne Menu_AddToZp61_DD8D ; ROM $001D91: D0 0A +; Routine: Menu_WriteObjectWorkX_DD83 +; Global: Reachable code entry at CPU $DD83 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_WriteObjectWorkX_DD83: + stx $24 ; ROM $001D93: 86 24 + sty $25 ; ROM $001D95: 84 25 + ldx $59 ; ROM $001D97: A6 59 + bne Menu_ReadObjectWorkX_DDC2 ; ROM $001D99: D0 37 + ldx #$06 ; ROM $001D9B: A2 06 +; Routine: Menu_AddToZp61_DD8D +; Global: Reachable code entry at CPU $DD8D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_AddToZp61_DD8D: + ldy #$00 ; ROM $001D9D: A0 00 + clc ; ROM $001D9F: 18 + adc $61,x ; ROM $001DA0: 75 61 +; Routine: Menu_WriteZp61_DD92 +; Global: Reachable code entry at CPU $DD92 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_WriteZp61_DD92: + sta $61,x ; ROM $001DA2: 95 61 + lda $61,x ; ROM $001DA4: B5 61 + sec ; ROM $001DA6: 38 + sbc #$0A ; ROM $001DA7: E9 0A + bcc Menu_WriteZp61_DD9E ; ROM $001DA9: 90 03 + iny ; ROM $001DAB: C8 + bne Menu_WriteZp61_DD92 ; ROM $001DAC: D0 F4 +; Routine: Menu_WriteZp61_DD9E +; Global: Reachable code entry at CPU $DD9E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_WriteZp61_DD9E: + cpy #$00 ; ROM $001DAE: C0 00 + beq Menu_HandleControl_DDAA ; ROM $001DB0: F0 08 + tya ; ROM $001DB2: 98 + dex ; ROM $001DB3: CA + bpl Menu_AddToZp61_DD8D ; ROM $001DB4: 10 E7 + lda #$09 ; ROM $001DB6: A9 09 + sta $61 ; ROM $001DB8: 85 61 +; Routine: Menu_HandleControl_DDAA +; Global: Reachable code entry at CPU $DDAA traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DDAA: + ldx #$00 ; ROM $001DBA: A2 00 +; Routine: Menu_ReadZp61_DDAC +; Global: Reachable code entry at CPU $DDAC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_ReadZp61_DDAC: + lda $61,x ; ROM $001DBC: B5 61 + cmp $01,x ; ROM $001DBE: D5 01 + bcc Menu_ReadObjectWorkX_DDC2 ; ROM $001DC0: 90 10 + bne Menu_HandleControl_DDB9 ; ROM $001DC2: D0 05 + inx ; ROM $001DC4: E8 + cpx #$08 ; ROM $001DC5: E0 08 + bne Menu_ReadZp61_DDAC ; ROM $001DC7: D0 F3 +; Routine: Menu_HandleControl_DDB9 +; Global: Reachable code entry at CPU $DDB9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DDB9: + ldx #$06 ; ROM $001DC9: A2 06 +; Routine: Menu_ReadZp61_DDBB +; Global: Reachable code entry at CPU $DDBB traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_ReadZp61_DDBB: + lda $61,x ; ROM $001DCB: B5 61 + sta $01,x ; ROM $001DCD: 95 01 + dex ; ROM $001DCF: CA + bpl Menu_ReadZp61_DDBB ; ROM $001DD0: 10 F9 +; Routine: Menu_ReadObjectWorkX_DDC2 +; Global: Reachable code entry at CPU $DDC2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_ReadObjectWorkX_DDC2: + ldx $24 ; ROM $001DD2: A6 24 + ldy $25 ; ROM $001DD4: A4 25 + rts ; ROM $001DD6: 60 +; Routine: Menu_HandleControl_DDC7 +; Global: Reachable code entry at CPU $DDC7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DDC7: + lda #$20 ; ROM $001DD7: A9 20 + ldx #$00 ; ROM $001DD9: A2 00 + jsr SetPpuAddress ; ROM $001DDB: 20 96 C1 + ldx #$80 ; ROM $001DDE: A2 80 + lda #$3A ; ROM $001DE0: A9 3A +; Routine: Menu_TransferVramDataPath_DDD2 +; Global: Reachable code entry at CPU $DDD2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DDD2: + sta PPUDATA ; ROM $001DE2: 8D 07 20 + dex ; ROM $001DE5: CA + bne Menu_TransferVramDataPath_DDD2 ; ROM $001DE6: D0 FA + lda #$20 ; ROM $001DE8: A9 20 + ldx #$41 ; ROM $001DEA: A2 41 + jsr SetPpuAddress ; ROM $001DEC: 20 96 C1 + ldx #$03 ; ROM $001DEF: A2 03 +; Routine: Menu_TransferVramDataPath_DDE1 +; Global: Reachable code entry at CPU $DDE1 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DDE1: + lda $DE15,x ; ROM $001DF1: BD 15 DE + sta PPUDATA ; ROM $001DF4: 8D 07 20 + dex ; ROM $001DF7: CA + bpl Menu_TransferVramDataPath_DDE1 ; ROM $001DF8: 10 F7 + lda #$3A ; ROM $001DFA: A9 3A + sta PPUDATA ; ROM $001DFC: 8D 07 20 + lda #$20 ; ROM $001DFF: A9 20 + ldx #$52 ; ROM $001E01: A2 52 + jsr SetPpuAddress ; ROM $001E03: 20 96 C1 + lda #$30 ; ROM $001E06: A9 30 + sta PPUDATA ; ROM $001E08: 8D 07 20 + sta PPUDATA ; ROM $001E0B: 8D 07 20 + lda #$20 ; ROM $001E0E: A9 20 + ldx #$58 ; ROM $001E10: A2 58 + jsr SetPpuAddress ; ROM $001E12: 20 96 C1 + ldx #$03 ; ROM $001E15: A2 03 +; Routine: Menu_TransferVramDataPath_DE07 +; Global: Reachable code entry at CPU $DE07 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DE07: + lda $DE19,x ; ROM $001E17: BD 19 DE + sta PPUDATA ; ROM $001E1A: 8D 07 20 + dex ; ROM $001E1D: CA + bpl Menu_TransferVramDataPath_DE07 ; ROM $001E1E: 10 F7 + lda $68 ; ROM $001E20: A5 68 + jmp Menu_HandleControl_DF5D ; ROM $001E22: 4C 5D DF + +; Data region: CPU $DE15-$DE1C; unreachable by direct recursive trace. +StatusScreenTextPointerTable: + .byte $45, $4D, $49, $54, $54, $46, $45, $4C ; ROM $001E25: 45 4D 49 54 54 46 45 4C +; Routine: Menu_WriteZp0E_DE1D +; Global: Reachable code entry at CPU $DE1D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_WriteZp0E_DE1D: + jsr DisableRendering ; ROM $001E2D: 20 57 C2 + jsr Ppu_HandleControl_C2B9 ; ROM $001E30: 20 B9 C2 + lda #$00 ; ROM $001E33: A9 00 + sta $0E ; ROM $001E35: 85 0E + jsr UploadMenuPalette ; ROM $001E37: 20 27 DF + lda #$21 ; ROM $001E3A: A9 21 + ldx #$EA ; ROM $001E3C: A2 EA + jsr SetPpuAddress ; ROM $001E3E: 20 96 C1 + ldx #$04 ; ROM $001E41: A2 04 +; Routine: Menu_TransferVramDataPath_DE33 +; Global: Reachable code entry at CPU $DE33 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DE33: + lda $DE4E,x ; ROM $001E43: BD 4E DE + sta PPUDATA ; ROM $001E46: 8D 07 20 + dex ; ROM $001E49: CA + bpl Menu_TransferVramDataPath_DE33 ; ROM $001E4A: 10 F7 + lda #$21 ; ROM $001E4C: A9 21 + ldx #$F0 ; ROM $001E4E: A2 F0 + jsr SetPpuAddress ; ROM $001E50: 20 96 C1 + lda $58 ; ROM $001E53: A5 58 + jsr Menu_HandleControl_DF5D ; ROM $001E55: 20 5D DF + jsr EnableNmiInPpuControl ; ROM $001E58: 20 B0 C2 + jmp Ppu_CallHelper_C23B ; ROM $001E5B: 4C 3B C2 + +; Data region: CPU $DE4E-$DE52; unreachable by direct recursive trace. +StatusScreenValueAddressTable: + .byte $45, $47, $41, $54, $53 ; ROM $001E5E: 45 47 41 54 53 +; Routine: Menu_WriteZp0E_DE53 +; Global: Reachable code entry at CPU $DE53 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_WriteZp0E_DE53: + jsr DisableRendering ; ROM $001E63: 20 57 C2 + jsr Ppu_HandleControl_C2B9 ; ROM $001E66: 20 B9 C2 + lda #$00 ; ROM $001E69: A9 00 + sta $0E ; ROM $001E6B: 85 0E + jsr UploadMenuPalette ; ROM $001E6D: 20 27 DF + lda #$21 ; ROM $001E70: A9 21 + ldx #$EA ; ROM $001E72: A2 EA + jsr SetPpuAddress ; ROM $001E74: 20 96 C1 + ldx #$0A ; ROM $001E77: A2 0A +; Routine: Menu_TransferVramDataPath_DE69 +; Global: Reachable code entry at CPU $DE69 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DE69: + lda $DE78,x ; ROM $001E79: BD 78 DE + sta PPUDATA ; ROM $001E7C: 8D 07 20 + dex ; ROM $001E7F: CA + bpl Menu_TransferVramDataPath_DE69 ; ROM $001E80: 10 F7 + jsr EnableNmiInPpuControl ; ROM $001E82: 20 B0 C2 + jmp Ppu_CallHelper_C23B ; ROM $001E85: 4C 3B C2 + +; Data region: CPU $DE78-$DE82; unreachable by direct recursive trace. +StatusScreenPaletteAddressTable: + .byte $45, $47, $41, $54, $53, $3A, $53, $55, $4E, $4F, $42 ; ROM $001E88: 45 47 41 54 53 3A 53 55 4E 4F 42 +; Routine: ComposeStatusScreen +; Global: Reachable code entry at CPU $DE83 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +ComposeStatusScreen: + jsr DisableRendering ; ROM $001E93: 20 57 C2 + jsr Ppu_HandleControl_C215 ; ROM $001E96: 20 15 C2 + jsr WaitForVBlankTransition ; ROM $001E99: 20 8B C2 + lda #$3F ; ROM $001E9C: A9 3F + ldx #$00 ; ROM $001E9E: A2 00 + jsr SetPpuAddress ; ROM $001EA0: 20 96 C1 + ldx #$00 ; ROM $001EA3: A2 00 +; Routine: Menu_TransferVramDataPath_DE95 +; Global: Reachable code entry at CPU $DE95 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DE95: + lda $DF90,x ; ROM $001EA5: BD 90 DF + sta PPUDATA ; ROM $001EA8: 8D 07 20 + inx ; ROM $001EAB: E8 + cpx #$10 ; ROM $001EAC: E0 10 + bne Menu_TransferVramDataPath_DE95 ; ROM $001EAE: D0 F5 + jsr Ppu_SetVramAddress_C2D6 ; ROM $001EB0: 20 D6 C2 + jsr RenderEncodedTextRecords ; ROM $001EB3: 20 C0 E1 + lda #$20 ; ROM $001EB6: A9 20 + ldx #$00 ; ROM $001EB8: A2 00 + jsr SetPpuAddress ; ROM $001EBA: 20 96 C1 + ldx #$40 ; ROM $001EBD: A2 40 + lda #$B0 ; ROM $001EBF: A9 B0 +; Routine: Menu_TransferVramDataPath_DEB1 +; Global: Reachable code entry at CPU $DEB1 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DEB1: + sta PPUDATA ; ROM $001EC1: 8D 07 20 + dex ; ROM $001EC4: CA + bne Menu_TransferVramDataPath_DEB1 ; ROM $001EC5: D0 FA + ldx #$00 ; ROM $001EC7: A2 00 +; Routine: Menu_TransferVramDataPath_DEB9 +; Global: Reachable code entry at CPU $DEB9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DEB9: + lda $DFB0,x ; ROM $001EC9: BD B0 DF + sta PPUDATA ; ROM $001ECC: 8D 07 20 + inx ; ROM $001ECF: E8 + bne Menu_TransferVramDataPath_DEB9 ; ROM $001ED0: D0 F7 +; Routine: Menu_TransferVramDataPath_DEC2 +; Global: Reachable code entry at CPU $DEC2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DEC2: + lda $E0B0,x ; ROM $001ED2: BD B0 E0 + sta PPUDATA ; ROM $001ED5: 8D 07 20 + inx ; ROM $001ED8: E8 + bne Menu_TransferVramDataPath_DEC2 ; ROM $001ED9: D0 F7 + lda #$22 ; ROM $001EDB: A9 22 + ldx #$AE ; ROM $001EDD: A2 AE + jsr SetPpuAddress ; ROM $001EDF: 20 96 C1 + ldx #$00 ; ROM $001EE2: A2 00 +; Routine: Menu_TransferVramDataPath_DED4 +; Global: Reachable code entry at CPU $DED4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DED4: + lda $01,x ; ROM $001EE4: B5 01 + bne Menu_TransferVramDataPath_DEE4 ; ROM $001EE6: D0 0C + lda #$3A ; ROM $001EE8: A9 3A + sta PPUDATA ; ROM $001EEA: 8D 07 20 + inx ; ROM $001EED: E8 + cpx #$07 ; ROM $001EEE: E0 07 + bne Menu_TransferVramDataPath_DED4 ; ROM $001EF0: D0 F2 + beq Menu_TransferVramDataPath_DEF1 ; ROM $001EF2: F0 0D +; Routine: Menu_TransferVramDataPath_DEE4 +; Global: Reachable code entry at CPU $DEE4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DEE4: + lda $01,x ; ROM $001EF4: B5 01 + clc ; ROM $001EF6: 18 + adc #$30 ; ROM $001EF7: 69 30 + sta PPUDATA ; ROM $001EF9: 8D 07 20 + inx ; ROM $001EFC: E8 + cpx #$07 ; ROM $001EFD: E0 07 + bne Menu_TransferVramDataPath_DEE4 ; ROM $001EFF: D0 F3 +; Routine: Menu_TransferVramDataPath_DEF1 +; Global: Reachable code entry at CPU $DEF1 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DEF1: + lda #$30 ; ROM $001F01: A9 30 + sta PPUDATA ; ROM $001F03: 8D 07 20 + sta PPUDATA ; ROM $001F06: 8D 07 20 + lda #$23 ; ROM $001F09: A9 23 + ldx #$C0 ; ROM $001F0B: A2 C0 + jsr SetPpuAddress ; ROM $001F0D: 20 96 C1 + ldx #$20 ; ROM $001F10: A2 20 + lda #$00 ; ROM $001F12: A9 00 +; Routine: Menu_TransferVramDataPath_DF04 +; Global: Reachable code entry at CPU $DF04 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DF04: + sta PPUDATA ; ROM $001F14: 8D 07 20 + dex ; ROM $001F17: CA + bne Menu_TransferVramDataPath_DF04 ; ROM $001F18: D0 FA + ldx #$08 ; ROM $001F1A: A2 08 + lda #$50 ; ROM $001F1C: A9 50 +; Routine: Menu_TransferVramDataPath_DF0E +; Global: Reachable code entry at CPU $DF0E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DF0E: + sta PPUDATA ; ROM $001F1E: 8D 07 20 + dex ; ROM $001F21: CA + bne Menu_TransferVramDataPath_DF0E ; ROM $001F22: D0 FA + ldx #$18 ; ROM $001F24: A2 18 + lda #$55 ; ROM $001F26: A9 55 +; Routine: Menu_TransferVramDataPath_DF18 +; Global: Reachable code entry at CPU $DF18 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DF18: + sta PPUDATA ; ROM $001F28: 8D 07 20 + dex ; ROM $001F2B: CA + bne Menu_TransferVramDataPath_DF18 ; ROM $001F2C: D0 FA + jsr CommitPpuStateAndScroll ; ROM $001F2E: 20 96 C2 + jsr EnableNmiInPpuControl ; ROM $001F31: 20 B0 C2 + jmp Ppu_CallHelper_C23B ; ROM $001F34: 4C 3B C2 +; Routine: UploadMenuPalette +; Global: Reachable code entry at CPU $DF27 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +UploadMenuPalette: + lda #$00 ; ROM $001F37: A9 00 + sta $0E ; ROM $001F39: 85 0E + jsr WaitForVBlankTransition ; ROM $001F3B: 20 8B C2 + lda #$3F ; ROM $001F3E: A9 3F + ldx #$00 ; ROM $001F40: A2 00 + jsr SetPpuAddress ; ROM $001F42: 20 96 C1 + ldx #$00 ; ROM $001F45: A2 00 +; Routine: Menu_TransferVramDataPath_DF37 +; Global: Reachable code entry at CPU $DF37 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DF37: + lda $DF8C,x ; ROM $001F47: BD 8C DF + sta PPUDATA ; ROM $001F4A: 8D 07 20 + inx ; ROM $001F4D: E8 + cpx #$10 ; ROM $001F4E: E0 10 + bne Menu_TransferVramDataPath_DF37 ; ROM $001F50: D0 F5 + jsr Ppu_SetVramAddress_C2D6 ; ROM $001F52: 20 D6 C2 + jmp Ppu_HandleControl_C215 ; ROM $001F55: 4C 15 C2 +; Routine: Menu_HandleControl_DF48 +; Global: Reachable code entry at CPU $DF48 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DF48: + ldy #$30 ; ROM $001F58: A0 30 + sec ; ROM $001F5A: 38 +; Routine: Menu_HandleControl_DF4B +; Global: Reachable code entry at CPU $DF4B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DF4B: + sbc #$64 ; ROM $001F5B: E9 64 + bcc Menu_TransferVramDataPath_DF52 ; ROM $001F5D: 90 03 + iny ; ROM $001F5F: C8 + bne Menu_HandleControl_DF4B ; ROM $001F60: D0 F9 +; Routine: Menu_TransferVramDataPath_DF52 +; Global: Reachable code entry at CPU $DF52 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DF52: + adc #$64 ; ROM $001F62: 69 64 + cpy #$30 ; ROM $001F64: C0 30 + bne Menu_TransferVramDataPath_DF76 ; ROM $001F66: D0 1E + ldy #$3A ; ROM $001F68: A0 3A + sty PPUDATA ; ROM $001F6A: 8C 07 20 +; Routine: Menu_HandleControl_DF5D +; Global: Reachable code entry at CPU $DF5D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DF5D: + ldy #$30 ; ROM $001F6D: A0 30 + sec ; ROM $001F6F: 38 +; Routine: Menu_HandleControl_DF60 +; Global: Reachable code entry at CPU $DF60 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DF60: + sbc #$0A ; ROM $001F70: E9 0A + bcc Menu_HandleControl_DF67 ; ROM $001F72: 90 03 + iny ; ROM $001F74: C8 + bne Menu_HandleControl_DF60 ; ROM $001F75: D0 F9 +; Routine: Menu_HandleControl_DF67 +; Global: Reachable code entry at CPU $DF67 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DF67: + adc #$3A ; ROM $001F77: 69 3A + cpy #$30 ; ROM $001F79: C0 30 + bne Menu_TransferVramDataPath_DF6F ; ROM $001F7B: D0 02 + ldy #$3A ; ROM $001F7D: A0 3A +; Routine: Menu_TransferVramDataPath_DF6F +; Global: Reachable code entry at CPU $DF6F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DF6F: + sty PPUDATA ; ROM $001F7F: 8C 07 20 + sta PPUDATA ; ROM $001F82: 8D 07 20 + rts ; ROM $001F85: 60 +; Routine: Menu_TransferVramDataPath_DF76 +; Global: Reachable code entry at CPU $DF76 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DF76: + sty PPUDATA ; ROM $001F86: 8C 07 20 + ldy #$30 ; ROM $001F89: A0 30 + sec ; ROM $001F8B: 38 +; Routine: Menu_HandleControl_DF7C +; Global: Reachable code entry at CPU $DF7C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_HandleControl_DF7C: + sbc #$0A ; ROM $001F8C: E9 0A + bcc Menu_TransferVramDataPath_DF83 ; ROM $001F8E: 90 03 + iny ; ROM $001F90: C8 + bne Menu_HandleControl_DF7C ; ROM $001F91: D0 F9 +; Routine: Menu_TransferVramDataPath_DF83 +; Global: Reachable code entry at CPU $DF83 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Menu_TransferVramDataPath_DF83: + adc #$3A ; ROM $001F93: 69 3A + sty PPUDATA ; ROM $001F95: 8C 07 20 + sta PPUDATA ; ROM $001F98: 8D 07 20 + rts ; ROM $001F9B: 60 + +; Data region: CPU $DF8C-$E1BF; unreachable by direct recursive trace. +MenuPaletteAndScreenData: + .byte $0F, $00, $0F, $30, $0F, $05, $30, $28, $0F, $00, $0F, $30, $0F, $06, $26, $37 ; ROM $001F9C: 0F 00 0F 30 0F 05 30 28 0F 00 0F 30 0F 06 26 37 + .byte $0F, $0F, $0F, $0F, $05, $00, $09, $04, $0D, $07, $02, $06, $0A, $0F, $0C, $03 ; ROM $001FAC: 0F 0F 0F 0F 05 00 09 04 0D 07 02 06 0A 0F 0C 03 + .byte $08, $0B, $0E, $01, $B0, $B0, $DF, $C0, $C1, $C1, $C2, $C0, $C1, $C1, $C1, $C2 ; ROM $001FBC: 08 0B 0E 01 B0 B0 DF C0 C1 C1 C2 C0 C1 C1 C1 C2 + .byte $C0, $B6, $E9, $B8, $C2, $C0, $C1, $C1, $C2, $C0, $C1, $C1, $C2, $C0, $C1, $C1 ; ROM $001FCC: C0 B6 E9 B8 C2 C0 C1 C1 C2 C0 C1 C1 C2 C0 C1 C1 + .byte $C2, $E9, $F8, $B0, $B0, $B0, $DF, $C1, $D9, $D3, $B3, $C1, $D9, $CB, $D3, $B3 ; ROM $001FDC: C2 E9 F8 B0 B0 B0 DF C1 D9 D3 B3 C1 D9 CB D3 B3 + .byte $C1, $C5, $C6, $C1, $B3, $C1, $D9, $D3, $B3, $C1, $D9, $CB, $CB, $C1, $D9, $D3 ; ROM $001FEC: C1 C5 C6 C1 B3 C1 D9 D3 B3 C1 D9 CB CB C1 D9 D3 + .byte $B3, $EE, $F8, $B0, $B0, $B0, $DF, $C1, $D0, $D1, $D2, $C1, $CF, $E9, $C4, $B3 ; ROM $001FFC: B3 EE F8 B0 B0 B0 DF C1 D0 D1 D2 C1 CF E9 C4 B3 + .byte $C1, $D5, $D6, $D7, $B3, $C1, $D0, $D1, $D2, $C1, $D0, $DC, $E9, $C1, $D0, $D1 ; ROM $00200C: C1 D5 D6 D7 B3 C1 D0 D1 D2 C1 D0 DC E9 C1 D0 D1 + .byte $D2, $EB, $F8, $B0, $B0, $B0, $DF, $C1, $E0, $E1, $E2, $C1, $CF, $E9, $C4, $B3 ; ROM $00201C: D2 EB F8 B0 B0 B0 DF C1 E0 E1 E2 C1 CF E9 C4 B3 + .byte $C1, $B7, $E6, $E7, $B3, $C1, $E0, $E1, $E2, $C1, $E0, $F5, $EC, $C1, $E0, $E1 ; ROM $00202C: C1 B7 E6 E7 B3 C1 E0 E1 E2 C1 E0 F5 EC C1 E0 E1 + .byte $E2, $EF, $F8, $B0, $B0, $B0, $DF, $C1, $E8, $DA, $B3, $C1, $CF, $E9, $C4, $B3 ; ROM $00203C: E2 EF F8 B0 B0 B0 DF C1 E8 DA B3 C1 CF E9 C4 B3 + .byte $C1, $CF, $E5, $F0, $B3, $C1, $E8, $DA, $B3, $C1, $E8, $DB, $ED, $C1, $E8, $DA ; ROM $00204C: C1 CF E5 F0 B3 C1 E8 DA B3 C1 E8 DB ED C1 E8 DA + .byte $B3, $EB, $F8, $B0, $B0, $B0, $DF, $C1, $B5, $E3, $B3, $C1, $B5, $E9, $E3, $B3 ; ROM $00205C: B3 EB F8 B0 B0 B0 DF C1 B5 E3 B3 C1 B5 E9 E3 B3 + .byte $C1, $CF, $E9, $C4, $B3, $C1, $B5, $E3, $B3, $C1, $B5, $E9, $E9, $C1, $CF, $C4 ; ROM $00206C: C1 CF E9 C4 B3 C1 B5 E3 B3 C1 B5 E9 E9 C1 CF C4 + .byte $B3, $EB, $F8, $B0, $B0, $B0, $DF, $B1, $C1, $F1, $C3, $C7, $C1, $C1, $F1, $C3 ; ROM $00207C: B3 EB F8 B0 B0 B0 DF B1 C1 F1 C3 C7 C1 C1 F1 C3 + .byte $B4, $CF, $E9, $B2, $C3, $C7, $C1, $F1, $C3, $C7, $C1, $C1, $C3, $B4, $CF, $B2 ; ROM $00208C: B4 CF E9 B2 C3 C7 C1 F1 C3 C7 C1 C1 C3 B4 CF B2 + .byte $C3, $EB, $F8, $B0, $B0, $B0, $DF, $CA, $CB, $CB, $CB, $CE, $CB, $CB, $CB, $CB ; ROM $00209C: C3 EB F8 B0 B0 B0 DF CA CB CB CB CE CB CB CB CB + .byte $CE, $D8, $E9, $E9, $EA, $CE, $CB, $CB, $CB, $CE, $CB, $CB, $CB, $CE, $D8, $E9 ; ROM $0020AC: CE D8 E9 E9 EA CE CB CB CB CE CB CB CB CE D8 E9 + .byte $EA, $CD, $F8, $B0, $B0, $B0, $DF, $E9, $E9, $E9, $E9, $E9, $E9, $E9, $C0, $B6 ; ROM $0020BC: EA CD F8 B0 B0 B0 DF E9 E9 E9 E9 E9 E9 E9 C0 B6 + .byte $E9, $B8, $C2, $C0, $C1, $C1, $C2, $C0, $BC, $E4, $C2, $E9, $E9, $E9, $E9, $E9 ; ROM $0020CC: E9 B8 C2 C0 C1 C1 C2 C0 BC E4 C2 E9 E9 E9 E9 E9 + .byte $E9, $E9, $F8, $B0, $B0, $B0, $DF, $E9, $E9, $E9, $E9, $E9, $E9, $E9, $C1, $C5 ; ROM $0020DC: E9 E9 F8 B0 B0 B0 DF E9 E9 E9 E9 E9 E9 E9 C1 C5 + .byte $C6, $C1, $B3, $C1, $D9, $D3, $B3, $C1, $BD, $C4, $B3, $EE, $FB, $FC, $E9, $E9 ; ROM $0020EC: C6 C1 B3 C1 D9 D3 B3 C1 BD C4 B3 EE FB FC E9 E9 + .byte $E9, $E9, $F8, $B0, $B0, $B0, $DF, $E9, $E9, $E9, $E9, $E9, $E9, $E9, $C1, $D5 ; ROM $0020FC: E9 E9 F8 B0 B0 B0 DF E9 E9 E9 E9 E9 E9 E9 C1 D5 + .byte $D6, $D7, $B3, $C1, $D0, $D1, $B3, $C1, $BE, $F2, $B3, $EB, $E9, $E9, $E9, $E9 ; ROM $00210C: D6 D7 B3 C1 D0 D1 B3 C1 BE F2 B3 EB E9 E9 E9 E9 + .byte $E9, $E9, $F8, $B0, $B0, $B0, $DF, $E9, $E9, $E9, $E9, $E9, $E9, $E9, $C1, $B7 ; ROM $00211C: E9 E9 F8 B0 B0 B0 DF E9 E9 E9 E9 E9 E9 E9 C1 B7 + .byte $E6, $E7, $B3, $C1, $E0, $E1, $B3, $C1, $B9, $BF, $B3, $EB, $E9, $E9, $E9, $E9 ; ROM $00212C: E6 E7 B3 C1 E0 E1 B3 C1 B9 BF B3 EB E9 E9 E9 E9 + .byte $E9, $E9, $F8, $B0, $B0, $B0, $DF, $E9, $E9, $E9, $E9, $E9, $E9, $E9, $C1, $CF ; ROM $00213C: E9 E9 F8 B0 B0 B0 DF E9 E9 E9 E9 E9 E9 E9 C1 CF + .byte $E5, $F0, $B3, $C1, $E8, $DA, $B3, $C1, $BB, $C8, $B3, $EB, $E9, $E9, $E9, $E9 ; ROM $00214C: E5 F0 B3 C1 E8 DA B3 C1 BB C8 B3 EB E9 E9 E9 E9 + .byte $E9, $E9, $F8, $B0, $B0, $B0, $DF, $E9, $E9, $E9, $E9, $E9, $E9, $E9, $C1, $CF ; ROM $00215C: E9 E9 F8 B0 B0 B0 DF E9 E9 E9 E9 E9 E9 E9 C1 CF + .byte $E9, $C4, $B3, $C1, $CF, $C4, $B3, $C1, $C9, $C1, $B3, $EB, $E9, $E9, $E9, $E9 ; ROM $00216C: E9 C4 B3 C1 CF C4 B3 C1 C9 C1 B3 EB E9 E9 E9 E9 + .byte $E9, $E9, $F8, $B0, $B0, $B0, $DF, $E9, $E9, $E9, $E9, $E9, $E9, $E9, $D4, $CF ; ROM $00217C: E9 E9 F8 B0 B0 B0 DF E9 E9 E9 E9 E9 E9 E9 D4 CF + .byte $E9, $B2, $C3, $B4, $CF, $B2, $C3, $B4, $CF, $BA, $C3, $EB, $E9, $E9, $E9, $E9 ; ROM $00218C: E9 B2 C3 B4 CF B2 C3 B4 CF BA C3 EB E9 E9 E9 E9 + .byte $E9, $E9, $F8, $B0, $B0, $B0, $DF, $E9, $E9, $E9, $E9, $E9, $E9, $E9, $CA, $D8 ; ROM $00219C: E9 E9 F8 B0 B0 B0 DF E9 E9 E9 E9 E9 E9 E9 CA D8 + .byte $E9, $E9, $EA, $CE, $D8, $E9, $EA, $CE, $D8, $F3, $CB, $CD, $E9, $E9, $E9, $E9 ; ROM $0021AC: E9 E9 EA CE D8 E9 EA CE D8 F3 CB CD E9 E9 E9 E9 + .byte $E9, $E9, $F8, $B0, $B0, $B0, $F4, $F9, $F9, $F9, $F9, $F9, $F9, $F9, $F9, $F9 ; ROM $0021BC: E9 E9 F8 B0 B0 B0 F4 F9 F9 F9 F9 F9 F9 F9 F9 F9 + .byte $F9, $F9, $F9, $F9 ; ROM $0021CC: F9 F9 F9 F9 +; Routine: RenderEncodedTextRecords +; Global: Reachable code entry at CPU $E1C0 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +RenderEncodedTextRecords: + ldy #$00 ; ROM $0021D0: A0 00 + ldx #$05 ; ROM $0021D2: A2 05 +; Routine: Gameplay_SetVramAddressPath_E1C4 +; Global: Reachable code entry at CPU $E1C4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_SetVramAddressPath_E1C4: + jsr Gameplay_ReadRamE1E5_E1E0 ; ROM $0021D4: 20 E0 E1 + sta PPUADDR ; ROM $0021D7: 8D 06 20 + jsr Gameplay_ReadRamE1E5_E1E0 ; ROM $0021DA: 20 E0 E1 + sta PPUADDR ; ROM $0021DD: 8D 06 20 +; Routine: Gameplay_TransferVramDataPath_E1D0 +; Global: Reachable code entry at CPU $E1D0 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_TransferVramDataPath_E1D0: + jsr Gameplay_ReadRamE1E5_E1E0 ; ROM $0021E0: 20 E0 E1 + cmp #$FF ; ROM $0021E3: C9 FF + beq Gameplay_RetreatIndexX_E1DC ; ROM $0021E5: F0 05 + sta PPUDATA ; ROM $0021E7: 8D 07 20 + bne Gameplay_TransferVramDataPath_E1D0 ; ROM $0021EA: D0 F4 +; Routine: Gameplay_RetreatIndexX_E1DC +; Global: Reachable code entry at CPU $E1DC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_RetreatIndexX_E1DC: + dex ; ROM $0021EC: CA + bne Gameplay_SetVramAddressPath_E1C4 ; ROM $0021ED: D0 E5 + rts ; ROM $0021EF: 60 +; Routine: Gameplay_ReadRamE1E5_E1E0 +; Global: Reachable code entry at CPU $E1E0 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRamE1E5_E1E0: + lda $E1E5,y ; ROM $0021F0: B9 E5 E1 + iny ; ROM $0021F3: C8 + rts ; ROM $0021F4: 60 + +; Data region: CPU $E1E5-$E2BC; unreachable by direct recursive trace. +TitleAndCopyrightText: + .byte $22, $69, $53, $54, $41, $52, $54, $B0, $B0, $B0, $43, $4F, $4E, $54, $49, $4E ; ROM $0021F5: 22 69 53 54 41 52 54 B0 B0 B0 43 4F 4E 54 49 4E + .byte $55, $45, $FF, $22, $AA, $54, $4F, $50, $FF, $22, $E3, $54, $4D, $B0, $41, $4E ; ROM $002205: 55 45 FF 22 AA 54 4F 50 FF 22 E3 54 4D B0 41 4E + .byte $44, $B0, $FE, $B0, $31, $39, $38, $37, $B0, $48, $55, $44, $53, $4F, $4E, $B0 ; ROM $002215: 44 B0 FE B0 31 39 38 37 B0 48 55 44 53 4F 4E B0 + .byte $53, $4F, $46, $54, $FF, $23, $2A, $4C, $49, $43, $45, $4E, $53, $45, $44, $B0 ; ROM $002225: 53 4F 46 54 FF 23 2A 4C 49 43 45 4E 53 45 44 B0 + .byte $42, $59, $FF, $23, $64, $4E, $49, $4E, $54, $45, $4E, $44, $4F, $B0, $4F, $46 ; ROM $002235: 42 59 FF 23 64 4E 49 4E 54 45 4E 44 4F B0 4F 46 + .byte $B0, $41, $4D, $45, $52, $49, $43, $41, $B0, $49, $4E, $43, $FD, $FF, $01, $01 ; ROM $002245: B0 41 4D 45 52 49 43 41 B0 49 4E 43 FD FF 01 01 + .byte $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01 ; ROM $002255: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + .byte $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $00 ; ROM $002265: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 + .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; ROM $002275: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $01, $01, $00 ; ROM $002285: 00 00 00 00 00 00 00 00 00 00 00 00 01 01 01 00 + .byte $01, $00, $01, $00, $01, $00, $01, $00, $01, $00, $01, $00, $01, $00, $01, $00 ; ROM $002295: 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 + .byte $01, $00, $01, $00, $01, $00, $01, $00, $01, $00, $01, $00, $01, $01, $00, $20 ; ROM $0022A5: 01 00 01 00 01 00 01 00 01 00 01 00 01 01 00 20 + .byte $40, $60, $80, $A0, $C0, $E0, $00, $20, $40, $60, $80, $02, $02, $02, $02, $02 ; ROM $0022B5: 40 60 80 A0 C0 E0 00 20 40 60 80 02 02 02 02 02 + .byte $02, $02, $02, $03, $03, $03, $03, $03 ; ROM $0022C5: 02 02 02 03 03 03 03 03 +; Routine: Gameplay_ReadObjectMode_E2BD +; Global: Reachable code entry at CPU $E2BD traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadObjectMode_E2BD: + lda $73 ; ROM $0022CD: A5 73 + lsr a ; ROM $0022CF: 4A + lsr a ; ROM $0022D0: 4A + lsr a ; ROM $0022D1: 4A + lsr a ; ROM $0022D2: 4A + sta $DC ; ROM $0022D3: 85 DC + lda $58 ; ROM $0022D5: A5 58 + and #$0F ; ROM $0022D7: 29 0F + sta $DD ; ROM $0022D9: 85 DD + lda $58 ; ROM $0022DB: A5 58 + lsr a ; ROM $0022DD: 4A + lsr a ; ROM $0022DE: 4A + lsr a ; ROM $0022DF: 4A + lsr a ; ROM $0022E0: 4A + sta $DE ; ROM $0022E1: 85 DE + ldy #$00 ; ROM $0022E3: A0 00 + ldx #$00 ; ROM $0022E5: A2 00 + lda #$03 ; ROM $0022E7: A9 03 + sta $1F ; ROM $0022E9: 85 1F +; Routine: Gameplay_ReadObjectWorkX_E2DB +; Global: Reachable code entry at CPU $E2DB traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadObjectWorkX_E2DB: + jsr Gameplay_WriteWorkValue_E33C ; ROM $0022EB: 20 3C E3 + jsr Gameplay_ReadRamE360_E353 ; ROM $0022EE: 20 53 E3 + lda $24 ; ROM $0022F1: A5 24 + sta ($34),y ; ROM $0022F3: 91 34 + dec $1F ; ROM $0022F5: C6 1F + bne Gameplay_ReadObjectWorkX_E2DB ; ROM $0022F7: D0 F2 + jsr Gameplay_WriteWorkValue_E33C ; ROM $0022F9: 20 3C E3 + lda $99 ; ROM $0022FC: A5 99 + asl a ; ROM $0022FE: 0A + clc ; ROM $0022FF: 18 + adc $24 ; ROM $002300: 65 24 + sta $24 ; ROM $002302: 85 24 + lda $9A ; ROM $002304: A5 9A + asl a ; ROM $002306: 0A + clc ; ROM $002307: 18 + adc $24 ; ROM $002308: 65 24 + sta $24 ; ROM $00230A: 85 24 + lda $9B ; ROM $00230C: A5 9B + asl a ; ROM $00230E: 0A + clc ; ROM $00230F: 18 + adc $24 ; ROM $002310: 65 24 + sta $95 ; ROM $002312: 85 95 + ldy #$00 ; ROM $002314: A0 00 + sty RandomState0 ; ROM $002316: 84 54 + ldx #$00 ; ROM $002318: A2 00 +; Routine: Gameplay_ReadTransferPointer_E30A +; Global: Reachable code entry at CPU $E30A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadTransferPointer_E30A: + jsr Gameplay_ReadRamE360_E353 ; ROM $00231A: 20 53 E3 + lda ($34),y ; ROM $00231D: B1 34 + and #$0F ; ROM $00231F: 29 0F + sec ; ROM $002321: 38 + sbc RandomState0 ; ROM $002322: E5 54 + sec ; ROM $002324: 38 + sbc #$07 ; ROM $002325: E9 07 + and #$0F ; ROM $002327: 29 0F + sta $0180,x ; ROM $002329: 9D 80 01 + sta RandomState0 ; ROM $00232C: 85 54 + cpx #$28 ; ROM $00232E: E0 28 + bne Gameplay_ReadTransferPointer_E30A ; ROM $002330: D0 E8 + lda #$23 ; ROM $002332: A9 23 + ldx #$06 ; ROM $002334: A2 06 + jsr SetPpuAddress ; ROM $002336: 20 96 C1 + ldx #$02 ; ROM $002339: A2 02 +; Routine: Gameplay_TransferVramDataPath_E32B +; Global: Reachable code entry at CPU $E32B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_TransferVramDataPath_E32B: + lda $0180,x ; ROM $00233B: BD 80 01 + tay ; ROM $00233E: A8 + lda $E388,y ; ROM $00233F: B9 88 E3 + sta PPUDATA ; ROM $002342: 8D 07 20 + inx ; ROM $002345: E8 + inx ; ROM $002346: E8 + cpx #$2A ; ROM $002347: E0 2A + bne Gameplay_TransferVramDataPath_E32B ; ROM $002349: D0 F0 + rts ; ROM $00234B: 60 +; Routine: Gameplay_WriteWorkValue_E33C +; Global: Reachable code entry at CPU $E33C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteWorkValue_E33C: + lda #$04 ; ROM $00234C: A9 04 + sta $20 ; ROM $00234E: 85 20 + lda #$00 ; ROM $002350: A9 00 + sta $24 ; ROM $002352: 85 24 +; Routine: Gameplay_ReadTransferPointer_E344 +; Global: Reachable code entry at CPU $E344 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadTransferPointer_E344: + jsr Gameplay_ReadRamE360_E353 ; ROM $002354: 20 53 E3 + lda ($34),y ; ROM $002357: B1 34 + clc ; ROM $002359: 18 + adc $24 ; ROM $00235A: 65 24 + sta $24 ; ROM $00235C: 85 24 + dec $20 ; ROM $00235E: C6 20 + bne Gameplay_ReadTransferPointer_E344 ; ROM $002360: D0 F2 + rts ; ROM $002362: 60 +; Routine: Gameplay_ReadRamE360_E353 +; Global: Reachable code entry at CPU $E353 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRamE360_E353: + lda $E360,x ; ROM $002363: BD 60 E3 + sta $34 ; ROM $002366: 85 34 + inx ; ROM $002368: E8 + lda $E360,x ; ROM $002369: BD 60 E3 + sta $35 ; ROM $00236C: 85 35 + inx ; ROM $00236E: E8 + rts ; ROM $00236F: 60 + +; Data region: CPU $E360-$E397; unreachable by direct recursive trace. +GameplayScoreThresholdTable: + .byte $67, $00, $77, $00, $DD, $00, $61, $00, $99, $00, $66, $00, $DC, $00, $64, $00 ; ROM $002370: 67 00 77 00 DD 00 61 00 99 00 66 00 DC 00 64 00 + .byte $79, $00, $9A, $00, $74, $00, $63, $00, $75, $00, $62, $00, $9B, $00, $65, $00 ; ROM $002380: 79 00 9A 00 74 00 63 00 75 00 62 00 9B 00 65 00 + .byte $94, $00, $DE, $00, $76, $00, $95, $00, $41, $4F, $46, $4B, $43, $50, $47, $45 ; ROM $002390: 94 00 DE 00 76 00 95 00 41 4F 46 4B 43 50 47 45 + .byte $4C, $42, $48, $4D, $4A, $44, $4E, $49 ; ROM $0023A0: 4C 42 48 4D 4A 44 4E 49 +; Routine: Gameplay_ReturnToCaller_E398 +; Global: Reachable code entry at CPU $E398 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReturnToCaller_E398: + rts ; ROM $0023A8: 60 +; Routine: Gameplay_ReadStageProgress_E399 +; Global: Reachable code entry at CPU $E399 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadStageProgress_E399: + lda $9C ; ROM $0023A9: A5 9C + bne Gameplay_ReadPlayerState_E3A7 ; ROM $0023AB: D0 0A + lda $B1 ; ROM $0023AD: A5 B1 + bne Gameplay_ReadPlayerState_E3A7 ; ROM $0023AF: D0 06 + inc $B1 ; ROM $0023B1: E6 B1 + lda #$06 ; ROM $0023B3: A9 06 + sta $DF ; ROM $0023B5: 85 DF +; Routine: Gameplay_ReadPlayerState_E3A7 +; Global: Reachable code entry at CPU $E3A7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadPlayerState_E3A7: + lda $A8 ; ROM $0023B7: A5 A8 + beq Gameplay_ReadObjectType_E3E7 ; ROM $0023B9: F0 3C + cmp #$02 ; ROM $0023BB: C9 02 + beq Gameplay_ReturnToCaller_E398 ; ROM $0023BD: F0 E9 + lda $33 ; ROM $0023BF: A5 33 + and #$01 ; ROM $0023C1: 29 01 + bne Gameplay_ReadZpAA_E3BD ; ROM $0023C3: D0 08 + dec $A9 ; ROM $0023C5: C6 A9 + bne Gameplay_ReadZpAA_E3BD ; ROM $0023C7: D0 04 + lda #$02 ; ROM $0023C9: A9 02 + sta $A8 ; ROM $0023CB: 85 A8 +; Routine: Gameplay_ReadZpAA_E3BD +; Global: Reachable code entry at CPU $E3BD traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadZpAA_E3BD: + jsr Object_ReadStageIndex_CFED ; ROM $0023CD: 20 ED CF + lda $AA ; ROM $0023D0: A5 AA + cmp $28 ; ROM $0023D2: C5 28 + bne Gameplay_ReturnToCaller_E3E6 ; ROM $0023D4: D0 20 + lda $2A ; ROM $0023D6: A5 2A + cmp $AB ; ROM $0023D8: C5 AB + bne Gameplay_ReturnToCaller_E3E6 ; ROM $0023DA: D0 1A + lda #$04 ; ROM $0023DC: A9 04 + sta $DF ; ROM $0023DE: 85 DF + ldx $9D ; ROM $0023E0: A6 9D + lda $E4BC,x ; ROM $0023E2: BD BC E4 + cmp #$64 ; ROM $0023E5: C9 64 + bcc Gameplay_CallHelper_E3DF ; ROM $0023E7: 90 06 + jsr Menu_WriteObjectWorkX_DD6B ; ROM $0023E9: 20 6B DD + jmp Gameplay_WritePlayerState_E3E2 ; ROM $0023EC: 4C E2 E3 +; Routine: Gameplay_CallHelper_E3DF +; Global: Reachable code entry at CPU $E3DF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_CallHelper_E3DF: + jsr Menu_WriteObjectWorkX_DD77 ; ROM $0023EF: 20 77 DD +; Routine: Gameplay_WritePlayerState_E3E2 +; Global: Reachable code entry at CPU $E3E2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WritePlayerState_E3E2: + lda #$02 ; ROM $0023F2: A9 02 + sta $A8 ; ROM $0023F4: 85 A8 +; Routine: Gameplay_ReturnToCaller_E3E6 +; Global: Reachable code entry at CPU $E3E6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReturnToCaller_E3E6: + rts ; ROM $0023F6: 60 +; Routine: Gameplay_ReadObjectType_E3E7 +; Global: Reachable code entry at CPU $E3E7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadObjectType_E3E7: + lda $28 ; ROM $0023F7: A5 28 + cmp #$01 ; ROM $0023F9: C9 01 + bne Gameplay_ReadObjectState_E401 ; ROM $0023FB: D0 14 + lda $2A ; ROM $0023FD: A5 2A + cmp #$01 ; ROM $0023FF: C9 01 + bne Gameplay_IncrementRemoteControl_E3F8 ; ROM $002401: D0 05 + inc $A0 ; ROM $002403: E6 A0 + jmp Gameplay_ReadObjectType_E416 ; ROM $002405: 4C 16 E4 +; Routine: Gameplay_IncrementRemoteControl_E3F8 +; Global: Reachable code entry at CPU $E3F8 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_IncrementRemoteControl_E3F8: + cmp #$0B ; ROM $002408: C9 0B + bne Gameplay_ReadObjectState_E401 ; ROM $00240A: D0 05 + inc $A2 ; ROM $00240C: E6 A2 + jmp Gameplay_ReadObjectType_E416 ; ROM $00240E: 4C 16 E4 +; Routine: Gameplay_ReadObjectState_E401 +; Global: Reachable code entry at CPU $E401 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadObjectState_E401: + cmp #$1D ; ROM $002411: C9 1D + bne Gameplay_ReadObjectType_E416 ; ROM $002413: D0 11 + lda $2A ; ROM $002415: A5 2A + cmp #$01 ; ROM $002417: C9 01 + bne Gameplay_IncrementWallPass_E410 ; ROM $002419: D0 05 + inc $A1 ; ROM $00241B: E6 A1 + jmp Gameplay_ReadObjectType_E416 ; ROM $00241D: 4C 16 E4 +; Routine: Gameplay_IncrementWallPass_E410 +; Global: Reachable code entry at CPU $E410 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_IncrementWallPass_E410: + cmp #$0B ; ROM $002420: C9 0B + bne Gameplay_ReadObjectType_E416 ; ROM $002422: D0 02 + inc $A3 ; ROM $002424: E6 A3 +; Routine: Gameplay_ReadObjectType_E416 +; Global: Reachable code entry at CPU $E416 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadObjectType_E416: + lda $28 ; ROM $002426: A5 28 + cmp #$01 ; ROM $002428: C9 01 + beq Gameplay_ReadStageIndex_E434 ; ROM $00242A: F0 18 + cmp #$1D ; ROM $00242C: C9 1D + beq Gameplay_ReadStageIndex_E434 ; ROM $00242E: F0 14 + lda $2A ; ROM $002430: A5 2A + cmp #$01 ; ROM $002432: C9 01 + beq Gameplay_ReadStageIndex_E434 ; ROM $002434: F0 0E + cmp #$0B ; ROM $002436: C9 0B + beq Gameplay_ReadStageIndex_E434 ; ROM $002438: F0 0A + lda #$00 ; ROM $00243A: A9 00 + sta $A0 ; ROM $00243C: 85 A0 + sta $A1 ; ROM $00243E: 85 A1 + sta $A2 ; ROM $002440: 85 A2 + sta $A3 ; ROM $002442: 85 A3 +; Routine: Gameplay_ReadStageIndex_E434 +; Global: Reachable code entry at CPU $E434 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadStageIndex_E434: + ldx $9D ; ROM $002444: A6 9D + beq Gameplay_ReadPlayerLives_E448 ; ROM $002446: F0 10 + dex ; ROM $002448: CA + beq Gameplay_ReadStageProgress_E468 ; ROM $002449: F0 2D + dex ; ROM $00244B: CA + beq Gameplay_ReadStageProgress_E47D ; ROM $00244C: F0 3F + dex ; ROM $00244E: CA + beq Gameplay_ReadFlamePass_E486 ; ROM $00244F: F0 45 + dex ; ROM $002451: CA + beq Gameplay_ReadBombCapacity_E48D ; ROM $002452: F0 49 + dex ; ROM $002454: CA + beq Gameplay_ReadPlayerLives_E498 ; ROM $002455: F0 51 + rts ; ROM $002457: 60 +; Routine: Gameplay_ReadPlayerLives_E448 +; Global: Reachable code entry at CPU $E448 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadPlayerLives_E448: + lda $9E ; ROM $002458: A5 9E + bne Gameplay_ReturnToCaller_E467 ; ROM $00245A: D0 1B + lda $9F ; ROM $00245C: A5 9F + beq Gameplay_ReturnToCaller_E467 ; ROM $00245E: F0 17 +; Routine: Gameplay_ReadPlayerState_E450 +; Global: Reachable code entry at CPU $E450 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadPlayerState_E450: + lda $A8 ; ROM $002460: A5 A8 + bne Gameplay_ReturnToCaller_E467 ; ROM $002462: D0 13 + lda #$01 ; ROM $002464: A9 01 + sta $A8 ; ROM $002466: 85 A8 + lda #$00 ; ROM $002468: A9 00 + sta $A9 ; ROM $00246A: 85 A9 + jsr Gameplay_WriteObjectWorkX_CACF ; ROM $00246C: 20 CF CA + lda $24 ; ROM $00246F: A5 24 + sta $AA ; ROM $002471: 85 AA + lda $25 ; ROM $002473: A5 25 + sta $AB ; ROM $002475: 85 AB +; Routine: Gameplay_ReturnToCaller_E467 +; Global: Reachable code entry at CPU $E467 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReturnToCaller_E467: + rts ; ROM $002477: 60 +; Routine: Gameplay_ReadStageProgress_E468 +; Global: Reachable code entry at CPU $E468 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadStageProgress_E468: + lda $9C ; ROM $002478: A5 9C + bne Gameplay_ReturnToCaller_E467 ; ROM $00247A: D0 FB + lda $A0 ; ROM $00247C: A5 A0 + beq Gameplay_ReturnToCaller_E467 ; ROM $00247E: F0 F7 + lda $A1 ; ROM $002480: A5 A1 + beq Gameplay_ReturnToCaller_E467 ; ROM $002482: F0 F3 + lda $A2 ; ROM $002484: A5 A2 + beq Gameplay_ReturnToCaller_E467 ; ROM $002486: F0 EF + lda $A3 ; ROM $002488: A5 A3 + bne Gameplay_ReadPlayerState_E450 ; ROM $00248A: D0 D4 + rts ; ROM $00248C: 60 +; Routine: Gameplay_ReadStageProgress_E47D +; Global: Reachable code entry at CPU $E47D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadStageProgress_E47D: + lda $9C ; ROM $00248D: A5 9C + bne Gameplay_ReturnToCaller_E467 ; ROM $00248F: D0 E6 + lda $A4 ; ROM $002491: A5 A4 + beq Gameplay_ReadPlayerState_E450 ; ROM $002493: F0 CB + rts ; ROM $002495: 60 +; Routine: Gameplay_ReadFlamePass_E486 +; Global: Reachable code entry at CPU $E486 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadFlamePass_E486: + lda $A5 ; ROM $002496: A5 A5 + cmp #$F8 ; ROM $002498: C9 F8 + bcs Gameplay_ReadPlayerState_E450 ; ROM $00249A: B0 C4 + rts ; ROM $00249C: 60 +; Routine: Gameplay_ReadBombCapacity_E48D +; Global: Reachable code entry at CPU $E48D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadBombCapacity_E48D: + lda $9F ; ROM $00249D: A5 9F + beq Gameplay_ReturnToCaller_E467 ; ROM $00249F: F0 D6 + lda $A6 ; ROM $0024A1: A5 A6 + cmp #$F8 ; ROM $0024A3: C9 F8 + bcs Gameplay_ReadPlayerState_E450 ; ROM $0024A5: B0 B9 + rts ; ROM $0024A7: 60 +; Routine: Gameplay_ReadPlayerLives_E498 +; Global: Reachable code entry at CPU $E498 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadPlayerLives_E498: + lda $9E ; ROM $0024A8: A5 9E + bne Gameplay_ReturnToCaller_E467 ; ROM $0024AA: D0 CB + lda $58 ; ROM $0024AC: A5 58 + asl a ; ROM $0024AE: 0A + clc ; ROM $0024AF: 18 + adc #$32 ; ROM $0024B0: 69 32 + cmp $A4 ; ROM $0024B2: C5 A4 + beq Gameplay_ReadBonusTimer_E4A8 ; ROM $0024B4: F0 02 + bcs Gameplay_ReturnToCaller_E467 ; ROM $0024B6: B0 BF +; Routine: Gameplay_ReadBonusTimer_E4A8 +; Global: Reachable code entry at CPU $E4A8 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadBonusTimer_E4A8: + lda $A7 ; ROM $0024B8: A5 A7 + cmp #$03 ; ROM $0024BA: C9 03 + beq Gameplay_ReadPlayerState_E450 ; ROM $0024BC: F0 A2 + rts ; ROM $0024BE: 60 +; Routine: Gameplay_ReadZp58_E4AF +; Global: Reachable code entry at CPU $E4AF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadZp58_E4AF: + lda $58 ; ROM $0024BF: A5 58 + and #$07 ; ROM $0024C1: 29 07 + cmp #$06 ; ROM $0024C3: C9 06 + bcc Gameplay_WriteStageIndex_E4B9 ; ROM $0024C5: 90 02 + and #$01 ; ROM $0024C7: 29 01 +; Routine: Gameplay_WriteStageIndex_E4B9 +; Global: Reachable code entry at CPU $E4B9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteStageIndex_E4B9: + sta $9D ; ROM $0024C9: 85 9D + rts ; ROM $0024CB: 60 + +; Data region: CPU $E4BC-$E4C1; unreachable by direct recursive trace. +GameplayPowerupMaskTable: + .byte $01, $02, $64, $32, $03, $C8 ; ROM $0024CC: 01 02 64 32 03 C8 +; Routine: Gameplay_WriteGameMode_E4C2 +; Global: Reachable code entry at CPU $E4C2 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteGameMode_E4C2: + lda #$00 ; ROM $0024D2: A9 00 + sta $B5 ; ROM $0024D4: 85 B5 +; Routine: Gameplay_ReturnToCaller_E4C6 +; Global: Reachable code entry at CPU $E4C6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReturnToCaller_E4C6: + rts ; ROM $0024D6: 60 +; Routine: Gameplay_ReadZpB2_E4C7 +; Global: Reachable code entry at CPU $E4C7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadZpB2_E4C7: + lda $B2 ; ROM $0024D7: A5 B2 + bne Gameplay_ReturnToCaller_E4C6 ; ROM $0024D9: D0 FB + lda $B5 ; ROM $0024DB: A5 B5 + beq Gameplay_ReturnToCaller_E4C6 ; ROM $0024DD: F0 F7 + bmi Gameplay_WriteSoundChannelIndex_E52A ; ROM $0024DF: 30 59 + cmp #$0B ; ROM $0024E1: C9 0B + bcs Gameplay_WriteGameMode_E4C2 ; ROM $0024E3: B0 ED + sta $B4 ; ROM $0024E5: 85 B4 + ora #$80 ; ROM $0024E7: 09 80 + sta $B5 ; ROM $0024E9: 85 B5 + dec $B4 ; ROM $0024EB: C6 B4 + lda $B4 ; ROM $0024ED: A5 B4 + asl a ; ROM $0024EF: 0A + asl a ; ROM $0024F0: 0A + asl a ; ROM $0024F1: 0A + tay ; ROM $0024F2: A8 + ldx #$00 ; ROM $0024F3: A2 00 +; Routine: Gameplay_ReadRamE87C_E4E5 +; Global: Reachable code entry at CPU $E4E5 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadRamE87C_E4E5: + lda $E87C,y ; ROM $0024F5: B9 7C E8 + sta $BC,x ; ROM $0024F8: 95 BC + iny ; ROM $0024FA: C8 + inx ; ROM $0024FB: E8 + cpx #$06 ; ROM $0024FC: E0 06 + bne Gameplay_ReadRamE87C_E4E5 ; ROM $0024FE: D0 F5 + lda $E87C,y ; ROM $002500: B9 7C E8 + sta $D3 ; ROM $002503: 85 D3 + lda $E87D,y ; ROM $002505: B9 7D E8 + sta $D4 ; ROM $002508: 85 D4 + lda #$00 ; ROM $00250A: A9 00 + sta $C4 ; ROM $00250C: 85 C4 + sta $C5 ; ROM $00250E: 85 C5 + sta $C6 ; ROM $002510: 85 C6 + sta $D5 ; ROM $002512: 85 D5 + sta $CD ; ROM $002514: 85 CD + sta $CE ; ROM $002516: 85 CE + sta $CF ; ROM $002518: 85 CF + sta $D0 ; ROM $00251A: 85 D0 + sta $D1 ; ROM $00251C: 85 D1 + sta $D2 ; ROM $00251E: 85 D2 + lda #$01 ; ROM $002520: A9 01 + sta $B6 ; ROM $002522: 85 B6 + sta $B7 ; ROM $002524: 85 B7 + sta $B8 ; ROM $002526: 85 B8 + sta $B9 ; ROM $002528: 85 B9 + sta $BA ; ROM $00252A: 85 BA + sta $BB ; ROM $00252C: 85 BB + sta $D6 ; ROM $00252E: 85 D6 + sta $D7 ; ROM $002530: 85 D7 + sta $D8 ; ROM $002532: 85 D8 + lda #$08 ; ROM $002534: A9 08 + sta $D9 ; ROM $002536: 85 D9 + sta $DA ; ROM $002538: 85 DA +; Routine: Gameplay_WriteSoundChannelIndex_E52A +; Global: Reachable code entry at CPU $E52A traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteSoundChannelIndex_E52A: + lda #$02 ; ROM $00253A: A9 02 + sta $B3 ; ROM $00253C: 85 B3 +; Routine: Gameplay_ReadSoundChannelIndex_E52E +; Global: Reachable code entry at CPU $E52E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadSoundChannelIndex_E52E: + ldx $B3 ; ROM $00253E: A6 B3 + dec $B6,x ; ROM $002540: D6 B6 + beq Gameplay_ReadZpBC_E539 ; ROM $002542: F0 05 +; Routine: Gameplay_DecrementSoundChannelIndex_E534 +; Global: Reachable code entry at CPU $E534 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_DecrementSoundChannelIndex_E534: + dec $B3 ; ROM $002544: C6 B3 + bpl Gameplay_ReadSoundChannelIndex_E52E ; ROM $002546: 10 F6 + rts ; ROM $002548: 60 +; Routine: Gameplay_ReadZpBC_E539 +; Global: Reachable code entry at CPU $E539 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadZpBC_E539: + txa ; ROM $002549: 8A + asl a ; ROM $00254A: 0A + tax ; ROM $00254B: AA + lda $BC,x ; ROM $00254C: B5 BC + sta $C2 ; ROM $00254E: 85 C2 + lda $BD,x ; ROM $002550: B5 BD + sta $C3 ; ROM $002552: 85 C3 + ora $C2 ; ROM $002554: 05 C2 + beq Gameplay_DecrementSoundChannelIndex_E534 ; ROM $002556: F0 EC + jsr Gameplay_ReadSoundChannelIndex_E54E ; ROM $002558: 20 4E E5 + jmp Gameplay_DecrementSoundChannelIndex_E534 ; ROM $00255B: 4C 34 E5 +; Routine: Gameplay_ReadSoundChannelIndex_E54E +; Global: Reachable code entry at CPU $E54E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadSoundChannelIndex_E54E: + ldx $B3 ; ROM $00255E: A6 B3 + ldy $C4,x ; ROM $002560: B4 C4 + lda ($C2),y ; ROM $002562: B1 C2 + sta $B4 ; ROM $002564: 85 B4 + inc $C4,x ; ROM $002566: F6 C4 + lda $B4 ; ROM $002568: A5 B4 + bmi Gameplay_ReadSoundTempo_E5C7 ; ROM $00256A: 30 6B + lda $B9,x ; ROM $00256C: B5 B9 + sta $B6,x ; ROM $00256E: 95 B6 + cpx #$02 ; ROM $002570: E0 02 + beq Gameplay_HandleControl_E56E ; ROM $002572: F0 0A + lsr a ; ROM $002574: 4A + lsr a ; ROM $002575: 4A + cmp #$10 ; ROM $002576: C9 10 + bcc Gameplay_WriteZpD6_E573 ; ROM $002578: 90 09 + lda #$0F ; ROM $00257A: A9 0F + bne Gameplay_WriteZpD6_E573 ; ROM $00257C: D0 05 +; Routine: Gameplay_HandleControl_E56E +; Global: Reachable code entry at CPU $E56E traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_HandleControl_E56E: + asl a ; ROM $00257E: 0A + bpl Gameplay_WriteZpD6_E573 ; ROM $00257F: 10 02 + lda #$7F ; ROM $002581: A9 7F +; Routine: Gameplay_WriteZpD6_E573 +; Global: Reachable code entry at CPU $E573 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_WriteZpD6_E573: + sta $D6,x ; ROM $002583: 95 D6 + lda $D0,x ; ROM $002585: B5 D0 + beq Gameplay_ReadSoundDelay0_E57B ; ROM $002587: F0 02 + lsr $D6,x ; ROM $002589: 56 D6 +; Routine: Gameplay_ReadSoundDelay0_E57B +; Global: Reachable code entry at CPU $E57B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadSoundDelay0_E57B: + ldy $E1,x ; ROM $00258B: B4 E1 + bne Gameplay_ReturnToCaller_E5C6 ; ROM $00258D: D0 47 + lda $B4 ; ROM $00258F: A5 B4 + cmp #$00 ; ROM $002591: C9 00 + beq Gameplay_ReturnToCaller_E5C6 ; ROM $002593: F0 41 + txa ; ROM $002595: 8A + asl a ; ROM $002596: 0A + asl a ; ROM $002597: 0A + tay ; ROM $002598: A8 + lda $CD,x ; ROM $002599: B5 CD + beq Gameplay_ReadZpD6_E59D ; ROM $00259B: F0 10 + bpl Gameplay_HandleControl_E593 ; ROM $00259D: 10 04 + inc $CD,x ; ROM $00259F: F6 CD + beq Gameplay_ReadZpD6_E59D ; ROM $0025A1: F0 0A +; Routine: Gameplay_HandleControl_E593 +; Global: Reachable code entry at CPU $E593 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_HandleControl_E593: + lda #$9F ; ROM $0025A3: A9 9F + cpx #$02 ; ROM $0025A5: E0 02 + bne Gameplay_UpdateAudioChannelPath_E5A1 ; ROM $0025A7: D0 08 + lda #$7F ; ROM $0025A9: A9 7F + bne Gameplay_UpdateAudioChannelPath_E5A1 ; ROM $0025AB: D0 04 +; Routine: Gameplay_ReadZpD6_E59D +; Global: Reachable code entry at CPU $E59D traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadZpD6_E59D: + lda $D6,x ; ROM $0025AD: B5 D6 + ora $D3,x ; ROM $0025AF: 15 D3 +; Routine: Gameplay_UpdateAudioChannelPath_E5A1 +; Global: Reachable code entry at CPU $E5A1 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_UpdateAudioChannelPath_E5A1: + sta APUPULSE1CTRL,y ; ROM $0025B1: 99 00 40 + lda $CD,x ; ROM $0025B4: B5 CD + cmp #$02 ; ROM $0025B6: C9 02 + bne Gameplay_UpdateAudioChannelPath_E5AB ; ROM $0025B8: D0 01 + rts ; ROM $0025BA: 60 +; Routine: Gameplay_UpdateAudioChannelPath_E5AB +; Global: Reachable code entry at CPU $E5AB traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_UpdateAudioChannelPath_E5AB: + cpx #$02 ; ROM $0025BB: E0 02 + bcs Gameplay_UpdateAudioChannelPath_E5B4 ; ROM $0025BD: B0 05 + lda $D9,x ; ROM $0025BF: B5 D9 + sta APUPULSE1SWEEP,y ; ROM $0025C1: 99 01 40 +; Routine: Gameplay_UpdateAudioChannelPath_E5B4 +; Global: Reachable code entry at CPU $E5B4 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_UpdateAudioChannelPath_E5B4: + lda $B4 ; ROM $0025C4: A5 B4 + asl a ; ROM $0025C6: 0A + tax ; ROM $0025C7: AA + lda $E7E2,x ; ROM $0025C8: BD E2 E7 + sta APUPULSE1TIMERLO,y ; ROM $0025CB: 99 02 40 + lda $E7E3,x ; ROM $0025CE: BD E3 E7 + ora #$08 ; ROM $0025D1: 09 08 + sta APUPULSE1TIMERHI,y ; ROM $0025D3: 99 03 40 +; Routine: Gameplay_ReturnToCaller_E5C6 +; Global: Reachable code entry at CPU $E5C6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReturnToCaller_E5C6: + rts ; ROM $0025D6: 60 +; Routine: Gameplay_ReadSoundTempo_E5C7 +; Global: Reachable code entry at CPU $E5C7 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_ReadSoundTempo_E5C7: + and #$F0 ; ROM $0025D7: 29 F0 + cmp #$F0 ; ROM $0025D9: C9 F0 + beq Gameplay_SubtractFromSoundTempo_E5D6 ; ROM $0025DB: F0 09 + lda $B4 ; ROM $0025DD: A5 B4 + and #$7F ; ROM $0025DF: 29 7F + sta $B9,x ; ROM $0025E1: 95 B9 + jmp Gameplay_ReadSoundChannelIndex_E54E ; ROM $0025E3: 4C 4E E5 +; Routine: Gameplay_SubtractFromSoundTempo_E5D6 +; Global: Reachable code entry at CPU $E5D6 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Gameplay_SubtractFromSoundTempo_E5D6: + sec ; ROM $0025E6: 38 + lda #$FF ; ROM $0025E7: A9 FF + sbc $B4 ; ROM $0025E9: E5 B4 + asl a ; ROM $0025EB: 0A + tay ; ROM $0025EC: A8 + lda $E5E7,y ; ROM $0025ED: B9 E7 E5 + pha ; ROM $0025F0: 48 + lda $E5E6,y ; ROM $0025F1: B9 E6 E5 + pha ; ROM $0025F4: 48 + rts ; ROM $0025F5: 60 + +; Data region: CPU $E5E6-$E641; unreachable by direct recursive trace. +GameplayAndSoundDataTables: + .byte $F5, $E5, $FA, $E5, $01, $E6, $0F, $E6, $1A, $E6, $2C, $E6, $33, $E6, $3A, $E6 ; ROM $0025F6: F5 E5 FA E5 01 E6 0F E6 1A E6 2C E6 33 E6 3A E6 + .byte $A9, $00, $85, $B5, $60, $A9, $00, $95, $C4, $4C, $4E, $E5, $B4, $C4, $B1, $C2 ; ROM $002606: A9 00 85 B5 60 A9 00 95 C4 4C 4E E5 B4 C4 B1 C2 + .byte $95, $CA, $C8, $94, $C4, $94, $C7, $4C, $4E, $E5, $D6, $CA, $F0, $04, $B5, $C7 ; ROM $002616: 95 CA C8 94 C4 94 C7 4C 4E E5 D6 CA F0 04 B5 C7 + .byte $95, $C4, $4C, $4E, $E5, $B5, $CD, $F0, $07, $A9, $02, $95, $CD, $4C, $4E, $E5 ; ROM $002626: 95 C4 4C 4E E5 B5 CD F0 07 A9 02 95 CD 4C 4E E5 + .byte $A9, $01, $95, $CD, $4C, $4E, $E5, $A9, $FF, $95, $CD, $4C, $4E, $E5, $A9, $FF ; ROM $002636: A9 01 95 CD 4C 4E E5 A9 FF 95 CD 4C 4E E5 A9 FF + .byte $95, $D0, $4C, $4E, $E5, $A9, $00, $95, $D0, $4C, $4E, $E5 ; ROM $002646: 95 D0 4C 4E E5 A9 00 95 D0 4C 4E E5 +; Routine: InitializeApu +; Global: Reachable code entry at CPU $E642 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +InitializeApu: + lda #$00 ; ROM $002652: A9 00 + sta APUDMCDIRECT ; ROM $002654: 8D 11 40 + sta $E1 ; ROM $002657: 85 E1 + sta $E2 ; ROM $002659: 85 E2 + sta $E3 ; ROM $00265B: 85 E3 + sta APUPULSE1CTRL ; ROM $00265D: 8D 00 40 + sta APUPULSE2CTRL ; ROM $002660: 8D 04 40 + sta APUTRIANGLECTRL ; ROM $002663: 8D 08 40 + sta APUNOISECTRL ; ROM $002666: 8D 0C 40 + lda #$0F ; ROM $002669: A9 0F + sta APUSTATUS ; ROM $00266B: 8D 15 40 + rts ; ROM $00266E: 60 +; Routine: SoundUpdate +; Global: Reachable code entry at CPU $E65F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +SoundUpdate: + ldx #$02 ; ROM $00266F: A2 02 +; Routine: Sound_ReadSoundDelay0_E661 +; Global: Reachable code entry at CPU $E661 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_ReadSoundDelay0_E661: + lda $E1,x ; ROM $002671: B5 E1 + beq Sound_ReadSoundCommandState_E667 ; ROM $002673: F0 02 + dec $E1,x ; ROM $002675: D6 E1 +; Routine: Sound_ReadSoundCommandState_E667 +; Global: Reachable code entry at CPU $E667 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_ReadSoundCommandState_E667: + dex ; ROM $002677: CA + bpl Sound_ReadSoundDelay0_E661 ; ROM $002678: 10 F7 + lda $DF ; ROM $00267A: A5 DF + bmi Sound_ReadRamE6BC_E69C ; ROM $00267C: 30 2E + cmp #$07 ; ROM $00267E: C9 07 + bcs Sound_ReturnToCaller_E6AC ; ROM $002680: B0 3A + cmp #$03 ; ROM $002682: C9 03 + bcs Sound_WriteSoundCommandState_E681 ; ROM $002684: B0 0B + ldx IndirectPtrLo ; ROM $002686: A6 E0 + beq Sound_WriteSoundCommandState_E681 ; ROM $002688: F0 07 + txa ; ROM $00268A: 8A + ora #$80 ; ROM $00268B: 09 80 + sta $DF ; ROM $00268D: 85 DF + bne Sound_ReadRamE6BC_E69C ; ROM $00268F: D0 1B +; Routine: Sound_WriteSoundCommandState_E681 +; Global: Reachable code entry at CPU $E681 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_WriteSoundCommandState_E681: + sta IndirectPtrLo ; ROM $002691: 85 E0 + ora #$80 ; ROM $002693: 09 80 + sta $DF ; ROM $002695: 85 DF + lda #$00 ; ROM $002697: A9 00 + sta IndirectPtrHi ; ROM $002699: 85 E1 + sta $E2 ; ROM $00269B: 85 E2 + sta $E3 ; ROM $00269D: 85 E3 + lda IndirectPtrLo ; ROM $00269F: A5 E0 + asl a ; ROM $0026A1: 0A + tax ; ROM $0026A2: AA + lda $E6AE,x ; ROM $0026A3: BD AE E6 + pha ; ROM $0026A6: 48 + lda $E6AD,x ; ROM $0026A7: BD AD E6 + pha ; ROM $0026AA: 48 + rts ; ROM $0026AB: 60 +; Routine: Sound_ReadRamE6BC_E69C +; Global: Reachable code entry at CPU $E69C traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_ReadRamE6BC_E69C: + lda IndirectPtrLo ; ROM $0026AC: A5 E0 + cmp #$07 ; ROM $0026AE: C9 07 + bcs Sound_ReturnToCaller_E6AC ; ROM $0026B0: B0 0A + asl a ; ROM $0026B2: 0A + tax ; ROM $0026B3: AA + lda $E6BC,x ; ROM $0026B4: BD BC E6 + pha ; ROM $0026B7: 48 + lda $E6BB,x ; ROM $0026B8: BD BB E6 + pha ; ROM $0026BB: 48 +; Routine: Sound_ReturnToCaller_E6AC +; Global: Reachable code entry at CPU $E6AC traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_ReturnToCaller_E6AC: + rts ; ROM $0026BC: 60 + +; Data region: CPU $E6AD-$E6C8; unreachable by direct recursive trace. +SoundDispatchAddressTable: + .byte $41, $E6, $C8, $E6, $CC, $E6, $DE, $E6, $27, $E7, $66, $E7, $92, $E7, $AB, $E6 ; ROM $0026BD: 41 E6 C8 E6 CC E6 DE E6 27 E7 66 E7 92 E7 AB E6 + .byte $AB, $E6, $AB, $E6, $0A, $E7, $33, $E7, $AB, $E6, $9E, $E7 ; ROM $0026CD: AB E6 AB E6 0A E7 33 E7 AB E6 9E E7 +; Routine: ConfigureNoiseEffect +; Global: Reachable code entry at CPU $E6C9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +ConfigureNoiseEffect: + lda #$04 ; ROM $0026D9: A9 04 + bne Sound_UpdateAudioChannelPath_E6CF ; ROM $0026DB: D0 02 +; Routine: Sound_HandleControl_E6CD +; Global: Reachable code entry at CPU $E6CD traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_HandleControl_E6CD: + lda #$0C ; ROM $0026DD: A9 0C +; Routine: Sound_UpdateAudioChannelPath_E6CF +; Global: Reachable code entry at CPU $E6CF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_UpdateAudioChannelPath_E6CF: + sta APUNOISEPERIOD ; ROM $0026DF: 8D 0E 40 + lda #$00 ; ROM $0026E2: A9 00 + sta IndirectPtrLo ; ROM $0026E4: 85 E0 + sta APUNOISECTRL ; ROM $0026E6: 8D 0C 40 + lda #$10 ; ROM $0026E9: A9 10 + sta APUNOISELENGTH ; ROM $0026EB: 8D 0F 40 + rts ; ROM $0026EE: 60 +; Routine: Sound_UpdateAudioChannelPath_E6DF +; Global: Reachable code entry at CPU $E6DF traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_UpdateAudioChannelPath_E6DF: + lda #$10 ; ROM $0026EF: A9 10 + sta $E2 ; ROM $0026F1: 85 E2 + lda #$01 ; ROM $0026F3: A9 01 + sta APUNOISECTRL ; ROM $0026F5: 8D 0C 40 + lda #$0F ; ROM $0026F8: A9 0F + sta APUNOISEPERIOD ; ROM $0026FA: 8D 0E 40 + lda #$10 ; ROM $0026FD: A9 10 + sta APUNOISELENGTH ; ROM $0026FF: 8D 0F 40 + lda #$FF ; ROM $002702: A9 FF + sta APUPULSE2CTRL ; ROM $002704: 8D 04 40 + lda #$84 ; ROM $002707: A9 84 + sta APUPULSE2SWEEP ; ROM $002709: 8D 05 40 + lda #$00 ; ROM $00270C: A9 00 + sta APUPULSE2TIMERLO ; ROM $00270E: 8D 06 40 + lda #$02 ; ROM $002711: A9 02 + sta APUPULSE2TIMERHI ; ROM $002713: 8D 07 40 + lda #$04 ; ROM $002716: A9 04 + sta $E4 ; ROM $002718: 85 E4 + rts ; ROM $00271A: 60 +; Routine: Sound_UpdateAudioChannelPath_E70B +; Global: Reachable code entry at CPU $E70B traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_UpdateAudioChannelPath_E70B: + dec RandomStateAlt ; ROM $00271B: C6 E4 + bne Sound_ReturnToCaller_E727 ; ROM $00271D: D0 18 + lda #$DF ; ROM $00271F: A9 DF + sta APUPULSE2CTRL ; ROM $002721: 8D 04 40 + lda #$84 ; ROM $002724: A9 84 + sta APUPULSE2SWEEP ; ROM $002726: 8D 05 40 + lda #$00 ; ROM $002729: A9 00 + sta APUPULSE2TIMERLO ; ROM $00272B: 8D 06 40 + lda #$81 ; ROM $00272E: A9 81 + sta APUPULSE2TIMERHI ; ROM $002730: 8D 07 40 + lda #$00 ; ROM $002733: A9 00 + sta IndirectPtrLo ; ROM $002735: 85 E0 +; Routine: Sound_ReturnToCaller_E727 +; Global: Reachable code entry at CPU $E727 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_ReturnToCaller_E727: + rts ; ROM $002737: 60 +; Routine: Sound_WriteSoundDelay1_E728 +; Global: Reachable code entry at CPU $E728 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_WriteSoundDelay1_E728: + lda #$FF ; ROM $002738: A9 FF + sta $E2 ; ROM $00273A: 85 E2 + lda #$00 ; ROM $00273C: A9 00 + sta $E4 ; ROM $00273E: 85 E4 + lda #$04 ; ROM $002740: A9 04 + sta $E5 ; ROM $002742: 85 E5 +; Routine: Sound_ReadSoundEnvelopeCounter_E734 +; Global: Reachable code entry at CPU $E734 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_ReadSoundEnvelopeCounter_E734: + lda $E4 ; ROM $002744: A5 E4 + bne Sound_DecrementSoundEnvelopeCounter_E760 ; ROM $002746: D0 28 + lda $E5 ; ROM $002748: A5 E5 + bne Sound_UpdateAudioChannelPath_E743 ; ROM $00274A: D0 07 + lda #$00 ; ROM $00274C: A9 00 + sta IndirectPtrLo ; ROM $00274E: 85 E0 + sta $E2 ; ROM $002750: 85 E2 + rts ; ROM $002752: 60 +; Routine: Sound_UpdateAudioChannelPath_E743 +; Global: Reachable code entry at CPU $E743 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_UpdateAudioChannelPath_E743: + dec $E5 ; ROM $002753: C6 E5 + lda #$84 ; ROM $002755: A9 84 + sta APUPULSE2CTRL ; ROM $002757: 8D 04 40 + lda #$8B ; ROM $00275A: A9 8B + sta APUPULSE2SWEEP ; ROM $00275C: 8D 05 40 + ldx $E5 ; ROM $00275F: A6 E5 + lda SoundHandlerData,x ; ROM $002761: BD 63 E7 + sta APUPULSE2TIMERLO ; ROM $002764: 8D 06 40 + lda #$10 ; ROM $002767: A9 10 + sta APUPULSE2TIMERHI ; ROM $002769: 8D 07 40 + lda #$04 ; ROM $00276C: A9 04 + sta $E4 ; ROM $00276E: 85 E4 +; Routine: Sound_DecrementSoundEnvelopeCounter_E760 +; Global: Reachable code entry at CPU $E760 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_DecrementSoundEnvelopeCounter_E760: + dec $E4 ; ROM $002770: C6 E4 + rts ; ROM $002772: 60 + +; Data region: CPU $E763-$E766; unreachable by direct recursive trace. +SoundHandlerData: + .byte $65, $87, $B4, $F0 ; ROM $002773: 65 87 B4 F0 +; Routine: Sound_UpdateAudioChannelPath_E767 +; Global: Reachable code entry at CPU $E767 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_UpdateAudioChannelPath_E767: + lda #$30 ; ROM $002777: A9 30 + sta $E2 ; ROM $002779: 85 E2 + lda #$09 ; ROM $00277B: A9 09 + sta APUNOISECTRL ; ROM $00277D: 8D 0C 40 + lda #$07 ; ROM $002780: A9 07 + sta APUNOISEPERIOD ; ROM $002782: 8D 0E 40 + lda #$30 ; ROM $002785: A9 30 + sta APUNOISELENGTH ; ROM $002787: 8D 0F 40 + lda #$1F ; ROM $00278A: A9 1F + sta APUPULSE2CTRL ; ROM $00278C: 8D 04 40 + lda #$8F ; ROM $00278F: A9 8F + sta APUPULSE2SWEEP ; ROM $002791: 8D 05 40 + lda #$00 ; ROM $002794: A9 00 + sta APUPULSE2TIMERLO ; ROM $002796: 8D 06 40 + lda #$33 ; ROM $002799: A9 33 + sta APUPULSE2TIMERHI ; ROM $00279B: 8D 07 40 + lda #$00 ; ROM $00279E: A9 00 + sta IndirectPtrLo ; ROM $0027A0: 85 E0 + rts ; ROM $0027A2: 60 +; Routine: Sound_WriteSoundEnvelopeCounter_E793 +; Global: Reachable code entry at CPU $E793 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_WriteSoundEnvelopeCounter_E793: + lda #$1D ; ROM $0027A3: A9 1D + sta $E4 ; ROM $0027A5: 85 E4 + lda #$FF ; ROM $0027A7: A9 FF + sta IndirectPtrHi ; ROM $0027A9: 85 E1 + sta $E2 ; ROM $0027AB: 85 E2 + sta $E3 ; ROM $0027AD: 85 E3 +; Routine: Sound_UpdateAudioChannelPath_E79F +; Global: Reachable code entry at CPU $E79F traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_UpdateAudioChannelPath_E79F: + dec $E4 ; ROM $0027AF: C6 E4 + beq Sound_HandleControl_E7D1 ; ROM $0027B1: F0 2E + lda $E4 ; ROM $0027B3: A5 E4 + and #$03 ; ROM $0027B5: 29 03 + bne Sound_ReturnToCaller_E7D0 ; ROM $0027B7: D0 27 + lda $E4 ; ROM $0027B9: A5 E4 + lsr a ; ROM $0027BB: 4A + lsr a ; ROM $0027BC: 4A + and #$01 ; ROM $0027BD: 29 01 + tax ; ROM $0027BF: AA + lda $E7DE,x ; ROM $0027C0: BD DE E7 + sta APUPULSE1TIMERLO ; ROM $0027C3: 8D 02 40 + lda $E7E0,x ; ROM $0027C6: BD E0 E7 + sta APUPULSE2TIMERLO ; ROM $0027C9: 8D 06 40 + lda #$08 ; ROM $0027CC: A9 08 + sta APUPULSE1CTRL ; ROM $0027CE: 8D 00 40 + sta APUPULSE2CTRL ; ROM $0027D1: 8D 04 40 + sta APUPULSE1SWEEP ; ROM $0027D4: 8D 01 40 + sta APUPULSE2SWEEP ; ROM $0027D7: 8D 05 40 + sta APUPULSE1TIMERHI ; ROM $0027DA: 8D 03 40 + sta APUPULSE2TIMERHI ; ROM $0027DD: 8D 07 40 +; Routine: Sound_ReturnToCaller_E7D0 +; Global: Reachable code entry at CPU $E7D0 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_ReturnToCaller_E7D0: + rts ; ROM $0027E0: 60 +; Routine: Sound_HandleControl_E7D1 +; Global: Reachable code entry at CPU $E7D1 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +Sound_HandleControl_E7D1: + lda #$20 ; ROM $0027E1: A9 20 + sta SoundDelay0 ; ROM $0027E3: 85 E1 + sta SoundDelay1 ; ROM $0027E5: 85 E2 + sta SoundDelay2 ; ROM $0027E7: 85 E3 + lda #$00 ; ROM $0027E9: A9 00 + sta SoundDispatchIndex ; ROM $0027EB: 85 E0 + rts ; ROM $0027ED: 60 + +; Data region: CPU $E7DE-$FFF8; unreachable by direct recursive trace. +SoundSequenceAndPaddingData: + .byte $A9, $A0, $6A, $64, $00, $00, $F0, $07, $7E, $07, $12, $07, $AE, $06, $4E, $06 ; ROM $0027EE: A9 A0 6A 64 00 00 F0 07 7E 07 12 07 AE 06 4E 06 + .byte $F3, $05, $9F, $05, $4D, $05, $01, $05, $B9, $04, $75, $04, $35, $04, $F8, $03 ; ROM $0027FE: F3 05 9F 05 4D 05 01 05 B9 04 75 04 35 04 F8 03 + .byte $BF, $03, $89, $03, $57, $03, $27, $03, $F9, $02, $CF, $02, $A6, $02, $80, $02 ; ROM $00280E: BF 03 89 03 57 03 27 03 F9 02 CF 02 A6 02 80 02 + .byte $5C, $02, $3A, $02, $1A, $02, $FC, $01, $DF, $01, $C4, $01, $AB, $01, $93, $01 ; ROM $00281E: 5C 02 3A 02 1A 02 FC 01 DF 01 C4 01 AB 01 93 01 + .byte $7C, $01, $67, $01, $52, $01, $3F, $01, $2D, $01, $1C, $01, $0C, $01, $FD, $00 ; ROM $00282E: 7C 01 67 01 52 01 3F 01 2D 01 1C 01 0C 01 FD 00 + .byte $EE, $00, $E1, $00, $D4, $00, $C8, $00, $BD, $00, $B2, $00, $A8, $00, $9F, $00 ; ROM $00283E: EE 00 E1 00 D4 00 C8 00 BD 00 B2 00 A8 00 9F 00 + .byte $96, $00, $8D, $00, $85, $00, $7E, $00, $76, $00, $70, $00, $69, $00, $63, $00 ; ROM $00284E: 96 00 8D 00 85 00 7E 00 76 00 70 00 69 00 63 00 + .byte $5E, $00, $58, $00, $53, $00, $4F, $00, $4A, $00, $46, $00, $42, $00, $3E, $00 ; ROM $00285E: 5E 00 58 00 53 00 4F 00 4A 00 46 00 42 00 3E 00 + .byte $3A, $00, $37, $00, $34, $00, $31, $00, $2E, $00, $2B, $00, $29, $00, $27, $00 ; ROM $00286E: 3A 00 37 00 34 00 31 00 2E 00 2B 00 29 00 27 00 + .byte $24, $00, $22, $00, $20, $00, $1E, $00, $1C, $00, $1B, $00, $1A, $00, $17, $EB ; ROM $00287E: 24 00 22 00 20 00 1E 00 1C 00 1B 00 1A 00 17 EB + .byte $85, $EB, $EA, $EB, $80, $80, $BC, $EC, $DC, $EC, $FC, $EC, $40, $40, $00, $00 ; ROM $00288E: 85 EB EA EB 80 80 BC EC DC EC FC EC 40 40 00 00 + .byte $00, $00, $9C, $ED, $80, $80, $4D, $ED, $7B, $ED, $18, $ED, $80, $80, $50, $EC ; ROM $00289E: 00 00 9C ED 80 80 4D ED 7B ED 18 ED 80 80 50 EC + .byte $7E, $EC, $AC, $EC, $80, $80, $27, $EA, $63, $EA, $9F, $EA, $80, $80, $CC, $E8 ; ROM $0028AE: 7E EC AC EC 80 80 27 EA 63 EA 9F EA 80 80 CC E8 + .byte $1C, $E9, $70, $E9, $40, $00, $E1, $EA, $FF, $EA, $00, $00, $80, $80, $A2, $E9 ; ROM $0028BE: 1C E9 70 E9 40 00 E1 EA FF EA 00 00 80 80 A2 E9 + .byte $D5, $E9, $FF, $E9, $80, $80, $03, $E9, $57, $E9, $88, $E9, $40, $00, $B0, $29 ; ROM $0028CE: D5 E9 FF E9 80 80 03 E9 57 E9 88 E9 40 00 B0 29 + .byte $AA, $29, $86, $29, $A4, $30, $86, $30, $35, $F9, $8C, $2E, $F8, $98, $2D, $86 ; ROM $0028DE: AA 29 86 29 A4 30 86 30 35 F9 8C 2E F8 98 2D 86 + .byte $2D, $2E, $8C, $2D, $C8, $2B, $86, $32, $33, $8C, $32, $B0, $30, $8C, $00, $26 ; ROM $0028EE: 2D 2E 8C 2D C8 2B 86 32 33 8C 32 B0 30 8C 00 26 + .byte $28, $B0, $29, $AA, $29, $86, $29, $A4, $30, $86, $30, $35, $F9, $8C, $2E, $F8 ; ROM $0028FE: 28 B0 29 AA 29 86 29 A4 30 86 30 35 F9 8C 2E F8 + .byte $98, $2D, $86, $2D, $2E, $8C, $2D, $2B, $32, $33, $30, $00, $92, $30, $83, $32 ; ROM $00290E: 98 2D 86 2D 2E 8C 2D 2B 32 33 30 00 92 30 83 32 + .byte $34, $8C, $35, $00, $1D, $86, $1D, $1D, $8C, $1D, $00, $98, $00, $FF, $B0, $21 ; ROM $00291E: 34 8C 35 00 1D 86 1D 1D 8C 1D 00 98 00 FF B0 21 + .byte $AA, $21, $86, $21, $A4, $2D, $86, $2D, $30, $F9, $8C, $29, $F8, $98, $29, $86 ; ROM $00292E: AA 21 86 21 A4 2D 86 2D 30 F9 8C 29 F8 98 29 86 + .byte $24, $29, $8C, $24, $C8, $27, $86, $2E, $2B, $8C, $2E, $28, $92, $24, $86, $24 ; ROM $00293E: 24 29 8C 24 C8 27 86 2E 2B 8C 2E 28 92 24 86 24 + .byte $8C, $24, $24, $24, $24, $B0, $21, $AA, $21, $86, $21, $A4, $2D, $86, $2D, $30 ; ROM $00294E: 8C 24 24 24 24 B0 21 AA 21 86 21 A4 2D 86 2D 30 + .byte $F9, $8C, $29, $F8, $98, $29, $86, $24, $29, $8C, $29, $26, $2B, $2E, $28, $00 ; ROM $00295E: F9 8C 29 F8 98 29 86 24 29 8C 29 26 2B 2E 28 00 + .byte $92, $28, $83, $29, $2B, $8C, $2D, $00, $11, $86, $11, $11, $8C, $11, $00, $98 ; ROM $00296E: 92 28 83 29 2B 8C 2D 00 11 86 11 11 8C 11 00 98 + .byte $00, $FF, $F9, $FD, $02, $98, $1D, $1C, $1A, $18, $FC, $1B, $1A, $18, $16, $18 ; ROM $00297E: 00 FF F9 FD 02 98 1D 1C 1A 18 FC 1B 1A 18 16 18 + .byte $18, $1A, $1C, $FD, $02, $1D, $1C, $1A, $18, $FC, $F8, $8C, $1F, $1D, $1B, $2B ; ROM $00298E: 18 1A 1C FD 02 1D 1C 1A 18 FC F8 8C 1F 1D 1B 2B + .byte $18, $00, $92, $18, $83, $18, $18, $8C, $29, $00, $11, $86, $11, $11, $8C, $11 ; ROM $00299E: 18 00 92 18 83 18 18 8C 29 00 11 86 11 11 8C 11 + .byte $00, $98, $00, $FF, $98, $28, $92, $24, $86, $24, $98, $27, $92, $24, $86, $24 ; ROM $0029AE: 00 98 00 FF 98 28 92 24 86 24 98 27 92 24 86 24 + .byte $28, $29, $2A, $2B, $F9, $8C, $28, $24, $F8, $98, $22, $29, $28, $92, $24, $86 ; ROM $0029BE: 28 29 2A 2B F9 8C 28 24 F8 98 22 29 28 92 24 86 + .byte $24, $98, $27, $92, $24, $86, $24, $8C, $22, $84, $21, $20, $1F, $F9, $8C, $22 ; ROM $0029CE: 24 98 27 92 24 86 24 8C 22 84 21 20 1F F9 8C 22 + .byte $23, $F8, $24, $00, $98, $00, $FF, $E0, $00, $86, $1F, $21, $22, $23, $F9, $8C ; ROM $0029DE: 23 F8 24 00 98 00 FF E0 00 86 1F 21 22 23 F9 8C + .byte $1F, $1C, $F8, $98, $1D, $22, $1F, $92, $1C, $86, $1C, $98, $1E, $92, $1B, $86 ; ROM $0029EE: 1F 1C F8 98 1D 22 1F 92 1C 86 1C 98 1E 92 1B 86 + .byte $1E, $8C, $16, $84, $15, $14, $13, $F9, $8C, $16, $17, $F8, $18, $00, $0C, $00 ; ROM $0029FE: 1E 8C 16 84 15 14 13 F9 8C 16 17 F8 18 00 0C 00 + .byte $FF, $8C, $18, $1F, $00, $1F, $18, $1F, $00, $1F, $18, $1F, $00, $1F, $14, $1B ; ROM $002A0E: FF 8C 18 1F 00 1F 18 1F 00 1F 18 1F 00 1F 14 1B + .byte $00, $1B, $18, $1F, $00, $1F, $14, $1B, $00, $1B, $16, $84, $15, $14, $13, $F9 ; ROM $002A1E: 00 1B 18 1F 00 1F 14 1B 00 1B 16 84 15 14 13 F9 + .byte $8C, $16, $17, $F8, $18, $00, $0C, $00, $FF, $94, $00, $85, $2C, $2C, $33, $33 ; ROM $002A2E: 8C 16 17 F8 18 00 0C 00 FF 94 00 85 2C 2C 33 33 + .byte $8A, $33, $00, $85, $2C, $2C, $33, $33, $32, $32, $30, $30, $2E, $2E, $29, $29 ; ROM $002A3E: 8A 33 00 85 2C 2C 33 33 32 32 30 30 2E 2E 29 29 + .byte $26, $26, $24, $24, $94, $22, $00, $85, $31, $31, $36, $36, $8A, $36, $00, $85 ; ROM $002A4E: 26 26 24 24 94 22 00 85 31 31 36 36 8A 36 00 85 + .byte $31, $31, $3A, $3A, $37, $37, $35, $35, $33, $33, $31, $31, $30, $30, $2E, $2E ; ROM $002A5E: 31 31 3A 3A 37 37 35 35 33 33 31 31 30 30 2E 2E + .byte $2C, $2C, $2B, $2B, $FE, $94, $00, $85, $24, $24, $30, $30, $8A, $30, $00, $85 ; ROM $002A6E: 2C 2C 2B 2B FE 94 00 85 24 24 30 30 8A 30 00 85 + .byte $24, $24, $30, $30, $2E, $2E, $2D, $2D, $29, $29, $26, $26, $22, $22, $1D, $1D ; ROM $002A7E: 24 24 30 30 2E 2E 2D 2D 29 29 26 26 22 22 1D 1D + .byte $94, $1A, $00, $85, $2E, $2E, $31, $31, $8A, $31, $00, $85, $2E, $2E, $31, $31 ; ROM $002A8E: 94 1A 00 85 2E 2E 31 31 8A 31 00 85 2E 2E 31 31 + .byte $33, $33, $31, $31, $30, $30, $2E, $2E, $2C, $2C, $2B, $2B, $24, $24, $22, $22 ; ROM $002A9E: 33 33 31 31 30 30 2E 2E 2C 2C 2B 2B 24 24 22 22 + .byte $FE, $85, $14, $14, $20, $20, $2C, $2C, $20, $20, $14, $14, $20, $20, $2C, $2C ; ROM $002AAE: FE 85 14 14 20 20 2C 2C 20 20 14 14 20 20 2C 2C + .byte $20, $20, $16, $16, $22, $22, $2E, $2E, $22, $22, $16, $16, $22, $22, $16, $16 ; ROM $002ABE: 20 20 16 16 22 22 2E 2E 22 22 16 16 22 22 16 16 + .byte $22, $22, $12, $12, $1E, $1E, $2A, $2A, $1E, $1E, $12, $12, $1E, $1E, $2A, $2A ; ROM $002ACE: 22 22 12 12 1E 1E 2A 2A 1E 1E 12 12 1E 1E 2A 2A + .byte $1E, $1E, $0F, $0F, $1B, $1B, $27, $27, $1B, $1B, $0F, $0F, $1B, $1B, $27, $27 ; ROM $002ADE: 1E 1E 0F 0F 1B 1B 27 27 1B 1B 0F 0F 1B 1B 27 27 + .byte $25, $25, $FE, $83, $30, $2B, $24, $1F, $18, $13, $0C, $07, $18, $17, $16, $15 ; ROM $002AEE: 25 25 FE 83 30 2B 24 1F 18 13 0C 07 18 17 16 15 + .byte $14, $15, $16, $17, $92, $18, $86, $18, $F9, $8C, $1B, $1B, $F8, $98, $18, $00 ; ROM $002AFE: 14 15 16 17 92 18 86 18 F9 8C 1B 1B F8 98 18 00 + .byte $FF, $98, $00, $83, $0C, $0B, $0A, $09, $08, $09, $0A, $0B, $92, $0C, $86, $0C ; ROM $002B0E: FF 98 00 83 0C 0B 0A 09 08 09 0A 0B 92 0C 86 0C + .byte $F9, $8C, $0F, $0F, $F8, $98, $0C, $00, $FF, $87, $27, $33, $3F, $33, $36, $37 ; ROM $002B1E: F9 8C 0F 0F F8 98 0C 00 FF 87 27 33 3F 33 36 37 + .byte $33, $31, $27, $33, $3F, $33, $36, $37, $33, $31, $16, $16, $F9, $8E, $16, $F8 ; ROM $002B2E: 33 31 27 33 3F 33 36 37 33 31 16 16 F9 8E 16 F8 + .byte $87, $22, $22, $F9, $8E, $2E, $0D, $0F, $F8, $87, $38, $2E, $33, $38, $FD, $03 ; ROM $002B3E: 87 22 22 F9 8E 2E 0D 0F F8 87 38 2E 33 38 FD 03 + .byte $F9, $8E, $37, $33, $32, $33, $F8, $9C, $2E, $87, $2C, $2E, $2A, $2B, $8E, $00 ; ROM $002B4E: F9 8E 37 33 32 33 F8 9C 2E 87 2C 2E 2A 2B 8E 00 + .byte $3A, $00, $3A, $87, $33, $33, $F9, $8E, $33, $F8, $87, $38, $2E, $33, $38, $FC ; ROM $002B5E: 3A 00 3A 87 33 33 F9 8E 33 F8 87 38 2E 33 38 FC + .byte $F9, $8E, $37, $F8, $87, $32, $33, $2C, $2E, $F9, $8E, $2B, $F8, $87, $2C, $2C ; ROM $002B6E: F9 8E 37 F8 87 32 33 2C 2E F9 8E 2B F8 87 2C 2C + .byte $F9, $8E, $2C, $F8, $87, $2B, $2B, $F9, $8E, $2B, $27, $27, $00, $F8, $87, $25 ; ROM $002B7E: F9 8E 2C F8 87 2B 2B F9 8E 2B 27 27 00 F8 87 25 + .byte $26, $8E, $27, $00, $9C, $00, $FF, $87, $1B, $27, $33, $27, $2A, $2B, $27, $25 ; ROM $002B8E: 26 8E 27 00 9C 00 FF 87 1B 27 33 27 2A 2B 27 25 + .byte $1B, $27, $33, $27, $2A, $2B, $27, $25, $13, $13, $F9, $8E, $13, $F8, $87, $1F ; ROM $002B9E: 1B 27 33 27 2A 2B 27 25 13 13 F9 8E 13 F8 87 1F + .byte $1F, $F9, $8E, $2B, $01, $02, $F8, $87, $2C, $22, $27, $2C, $FD, $03, $F9, $8E ; ROM $002BAE: 1F F9 8E 2B 01 02 F8 87 2C 22 27 2C FD 03 F9 8E + .byte $31, $2E, $2A, $2B, $F8, $9C, $25, $00, $8E, $27, $22, $25, $2C, $9C, $2B, $87 ; ROM $002BBE: 31 2E 2A 2B F8 9C 25 00 8E 27 22 25 2C 9C 2B 87 + .byte $35, $22, $30, $33, $FC, $F9, $8E, $33, $F8, $87, $2A, $2B, $26, $27, $F9, $8E ; ROM $002BCE: 35 22 30 33 FC F9 8E 33 F8 87 2A 2B 26 27 F9 8E + .byte $22, $F8, $87, $27, $27, $F9, $8E, $27, $F8, $87, $27, $27, $F9, $8E, $27, $1F ; ROM $002BDE: 22 F8 87 27 27 F9 8E 27 F8 87 27 27 F9 8E 27 1F + .byte $1F, $00, $F8, $87, $19, $1A, $8E, $1B, $00, $9C, $00, $FF, $87, $1B, $1B, $1B ; ROM $002BEE: 1F 00 F8 87 19 1A 8E 1B 00 9C 00 FF 87 1B 1B 1B + .byte $1B, $9C, $00, $87, $1B, $1B, $1B, $1B, $9C, $00, $87, $19, $19, $F9, $8E, $19 ; ROM $002BFE: 1B 9C 00 87 1B 1B 1B 1B 9C 00 87 19 19 F9 8E 19 + .byte $F8, $87, $25, $25, $F9, $8E, $32, $F8, $B8, $00, $FD, $03, $87, $1B, $1B, $F9 ; ROM $002C0E: F8 87 25 25 F9 8E 32 F8 B8 00 FD 03 87 1B 1B F9 + .byte $8E, $1B, $1E, $F8, $87, $1F, $22, $27, $1B, $1B, $1B, $1E, $F9, $8E, $1F, $F8 ; ROM $002C1E: 8E 1B 1E F8 87 1F 22 27 1B 1B 1B 1E F9 8E 1F F8 + .byte $87, $18, $19, $19, $19, $25, $18, $1A, $8E, $16, $87, $25, $19, $19, $19, $9C ; ROM $002C2E: 87 18 19 19 19 25 18 1A 8E 16 87 25 19 19 19 9C + .byte $00, $FC, $F9, $8E, $2E, $F8, $87, $2D, $2E, $2A, $2B, $27, $22, $9C, $00, $87 ; ROM $002C3E: 00 FC F9 8E 2E F8 87 2D 2E 2A 2B 27 22 9C 00 87 + .byte $23, $23, $F9, $8E, $23, $22, $22, $F8, $00, $87, $19, $1A, $8E, $1B, $00, $9C ; ROM $002C4E: 23 23 F9 8E 23 22 22 F8 00 87 19 1A 8E 1B 00 9C + .byte $00, $FF, $FD, $02, $90, $25, $88, $27, $29, $00, $29, $2B, $00, $FC, $C0, $00 ; ROM $002C5E: 00 FF FD 02 90 25 88 27 29 00 29 2B 00 FC C0 00 + .byte $88, $22, $19, $22, $20, $1F, $19, $1F, $20, $FD, $02, $27, $29, $27, $2A, $00 ; ROM $002C6E: 88 22 19 22 20 1F 19 1F 20 FD 02 27 29 27 2A 00 + .byte $29, $27, $00, $FC, $C0, $00, $88, $20, $17, $20, $1E, $1D, $17, $1D, $1F, $FE ; ROM $002C7E: 29 27 00 FC C0 00 88 20 17 20 1E 1D 17 1D 1F FE + .byte $FD, $02, $90, $22, $88, $24, $26, $00, $26, $27, $00, $FC, $FD, $02, $1B, $13 ; ROM $002C8E: FD 02 90 22 88 24 26 00 26 27 00 FC FD 02 1B 13 + .byte $1B, $19, $18, $13, $18, $19, $FC, $FD, $02, $23, $25, $23, $27, $00, $25, $23 ; ROM $002C9E: 1B 19 18 13 18 19 FC FD 02 23 25 23 27 00 25 23 + .byte $00, $FC, $FD, $02, $19, $11, $19, $17, $16, $11, $16, $19, $FC, $FE, $FD, $04 ; ROM $002CAE: 00 FC FD 02 19 11 19 17 16 11 16 19 FC FE FD 04 + .byte $90, $1B, $1B, $1B, $1B, $FC, $FD, $04, $19, $19, $19, $19, $FC, $FE, $85, $33 ; ROM $002CBE: 90 1B 1B 1B 1B FC FD 04 19 19 19 19 FC FE 85 33 + .byte $00, $32, $33, $32, $33, $32, $33, $2E, $00, $2D, $2E, $2D, $2E, $2D, $2E, $2B ; ROM $002CCE: 00 32 33 32 33 32 33 2E 00 2D 2E 2D 2E 2D 2E 2B + .byte $2C, $2D, $2E, $2B, $2C, $2D, $2E, $2B, $00, $27, $00, $94, $25, $FF, $85, $2B ; ROM $002CDE: 2C 2D 2E 2B 2C 2D 2E 2B 00 27 00 94 25 FF 85 2B + .byte $00, $2A, $2B, $2A, $2B, $2A, $2B, $27, $00, $26, $27, $26, $27, $26, $27, $27 ; ROM $002CEE: 00 2A 2B 2A 2B 2A 2B 27 00 26 27 26 27 26 27 27 + .byte $29, $2A, $2B, $27, $29, $2A, $2B, $27, $00, $1F, $00, $94, $22, $FF, $F9, $8A ; ROM $002CFE: 29 2A 2B 27 29 2A 2B 27 00 1F 00 94 22 FF F9 8A + .byte $1B, $1B, $1F, $22, $1B, $1B, $1F, $22, $F8, $85, $22, $24, $26, $27, $22, $24 ; ROM $002D0E: 1B 1B 1F 22 1B 1B 1F 22 F8 85 22 24 26 27 22 24 + .byte $26, $27, $F9, $8A, $22, $1B, $F8, $94, $16, $FF, $FD, $02, $87, $27, $27, $F9 ; ROM $002D1E: 26 27 F9 8A 22 1B F8 94 16 FF FD 02 87 27 27 F9 + .byte $8E, $30, $31, $F8, $87, $22, $22, $F9, $8E, $2E, $30, $F8, $87, $31, $30, $F9 ; ROM $002D2E: 8E 30 31 F8 87 22 22 F9 8E 2E 30 F8 87 31 30 F9 + .byte $8E, $2E, $F8, $FC, $FD, $02, $87, $25, $25, $F9, $8E, $2E, $2F, $F8, $87, $20 ; ROM $002D3E: 8E 2E F8 FC FD 02 87 25 25 F9 8E 2E 2F F8 87 20 + .byte $20, $F9, $8E, $2C, $2E, $F8, $87, $2F, $2E, $F9, $8E, $2C, $F8, $FC, $FE, $9C ; ROM $002D4E: 20 F9 8E 2C 2E F8 87 2F 2E F9 8E 2C F8 FC FE 9C + .byte $00, $87, $25, $95, $00, $B8, $00, $9C, $00, $95, $27, $87, $27, $F9, $8E, $2C ; ROM $002D5E: 00 87 25 95 00 B8 00 9C 00 95 27 87 27 F9 8E 2C + .byte $2B, $F8, $27, $00, $9C, $00, $87, $23, $95, $00, $B8, $00, $9C, $00, $95, $25 ; ROM $002D6E: 2B F8 27 00 9C 00 87 23 95 00 B8 00 9C 00 95 25 + .byte $87, $25, $F9, $8E, $2A, $F8, $87, $29, $2A, $8E, $25, $00, $FE, $9C, $00, $87 ; ROM $002D7E: 87 25 F9 8E 2A F8 87 29 2A 8E 25 00 FE 9C 00 87 + .byte $1D, $95, $00, $B8, $00, $9C, $00, $87, $1D, $95, $00, $B8, $00, $9C, $00, $87 ; ROM $002D8E: 1D 95 00 B8 00 9C 00 87 1D 95 00 B8 00 9C 00 87 + .byte $1B, $95, $00, $B8, $00, $9C, $00, $87, $1B, $95, $00, $B8, $00, $FE, $87, $27 ; ROM $002D9E: 1B 95 00 B8 00 9C 00 87 1B 95 00 B8 00 FE 87 27 + .byte $27, $33, $27, $F9, $8E, $2A, $F8, $87, $2E, $30, $F9, $8E, $31, $31, $F8, $30 ; ROM $002DAE: 27 33 27 F9 8E 2A F8 87 2E 30 F9 8E 31 31 F8 30 + .byte $00, $87, $25, $25, $31, $25, $F9, $8E, $29, $F8, $87, $2C, $2E, $F9, $8E, $2F ; ROM $002DBE: 00 87 25 25 31 25 F9 8E 29 F8 87 2C 2E F9 8E 2F + .byte $F8, $87, $2E, $2F, $25, $24, $F9, $8E, $25, $F8, $87, $22, $22, $2E, $22, $F9 ; ROM $002DCE: F8 87 2E 2F 25 24 F9 8E 25 F8 87 22 22 2E 22 F9 + .byte $8E, $2C, $F8, $87, $2B, $2C, $F9, $8E, $22, $2E, $F8, $22, $00, $87, $22, $22 ; ROM $002DDE: 8E 2C F8 87 2B 2C F9 8E 22 2E F8 22 00 87 22 22 + .byte $2E, $22, $F9, $8E, $2C, $F8, $87, $2B, $2C, $F9, $8E, $22, $2E, $F8, $87, $22 ; ROM $002DEE: 2E 22 F9 8E 2C F8 87 2B 2C F9 8E 22 2E F8 87 22 + .byte $22, $24, $26, $FE, $3D, $01, $03, $81, $03, $80, $1B, $04, $06, $84, $1B, $04 ; ROM $002DFE: 22 24 26 FE 3D 01 03 81 03 80 1B 04 06 84 1B 04 + .byte $02, $05, $34, $01, $08, $41, $13, $01, $01, $00, $06, $01, $01, $00, $0F, $01 ; ROM $002E0E: 02 05 34 01 08 41 13 01 01 00 06 01 01 00 0F 01 + .byte $01, $00, $03, $01, $01, $00, $11, $01, $06, $81, $1B, $01, $03, $81, $0E, $01 ; ROM $002E1E: 01 00 03 01 01 00 11 01 06 81 1B 01 03 81 0E 01 + .byte $1A, $00, $11, $01, $05, $81, $16, $01, $02, $00, $01, $01, $11, $04, $10, $00 ; ROM $002E2E: 1A 00 11 01 05 81 16 01 02 00 01 01 11 04 10 00 + .byte $10, $40, $10, $00, $02, $04, $01, $00, $01, $04, $01, $00, $0E, $04, $01, $00 ; ROM $002E3E: 10 40 10 00 02 04 01 00 01 04 01 00 0E 04 01 00 + .byte $02, $04, $01, $00, $01, $04, $38, $00, $1A, $04, $03, $00, $04, $02, $01, $00 ; ROM $002E4E: 02 04 01 00 01 04 38 00 1A 04 03 00 04 02 01 00 + .byte $04, $80, $09, $00, $16, $02, $02, $00, $02, $04, $05, $02, $01, $00, $15, $04 ; ROM $002E5E: 04 80 09 00 16 02 02 00 02 04 05 02 01 00 15 04 + .byte $3A, $00, $0A, $40, $17, $00, $0D, $04, $02, $00, $06, $80, $06, $00, $1D, $08 ; ROM $002E6E: 3A 00 0A 40 17 00 0D 04 02 00 06 80 06 00 1D 08 + .byte $01, $00, $0C, $01, $02, $00, $09, $40, $0A, $00, $28, $02, $01, $00, $20, $02 ; ROM $002E7E: 01 00 0C 01 02 00 09 40 0A 00 28 02 01 00 20 02 + .byte $1E, $04, $02, $84, $05, $80, $5D, $01, $06, $00, $1D, $02, $21, $08, $04, $00 ; ROM $002E8E: 1E 04 02 84 05 80 5D 01 06 00 1D 02 21 08 04 00 + .byte $06, $80, $03, $00, $1A, $02, $02, $00, $0F, $08, $02, $00, $09, $40, $08, $00 ; ROM $002E9E: 06 80 03 00 1A 02 02 00 0F 08 02 00 09 40 08 00 + .byte $08, $40, $14, $00, $0F, $08, $01, $00, $0D, $08, $01, $00, $01, $08, $01, $00 ; ROM $002EAE: 08 40 14 00 0F 08 01 00 0D 08 01 00 01 08 01 00 + .byte $11, $08, $02, $00, $1E, $01, $06, $81, $15, $01, $05, $81, $19, $01, $06, $81 ; ROM $002EBE: 11 08 02 00 1E 01 06 81 15 01 05 81 19 01 06 81 + .byte $06, $00, $1C, $04, $06, $84, $01, $81, $01, $01, $03, $00, $1B, $01, $01, $00 ; ROM $002ECE: 06 00 1C 04 06 84 01 81 01 01 03 00 1B 01 01 00 + .byte $0E, $08, $01, $48, $08, $40, $17, $00, $0D, $04, $01, $84, $06, $80, $02, $00 ; ROM $002EDE: 0E 08 01 48 08 40 17 00 0D 04 01 84 06 80 02 00 + .byte $1E, $02, $04, $82, $01, $80, $01, $00, $1F, $04, $05, $84, $1E, $04, $04, $84 ; ROM $002EEE: 1E 02 04 82 01 80 01 00 1F 04 05 84 1E 04 04 84 + .byte $02, $80, $1C, $02, $02, $00, $0F, $08, $01, $00, $09, $40, $11, $00, $0F, $04 ; ROM $002EFE: 02 80 1C 02 02 00 0F 08 01 00 09 40 11 00 0F 04 + .byte $01, $05, $01, $00, $04, $01, $09, $81, $14, $01, $06, $81, $19, $01, $01, $00 ; ROM $002F0E: 01 05 01 00 04 01 09 81 14 01 06 81 19 01 01 00 + .byte $0E, $08, $03, $48, $01, $00, $06, $40, $14, $00, $06, $80, $02, $88, $04, $08 ; ROM $002F1E: 0E 08 03 48 01 00 06 40 14 00 06 80 02 88 04 08 + .byte $01, $00, $08, $08, $01, $00, $03, $08, $02, $88, $01, $00, $02, $88, $01, $00 ; ROM $002F2E: 01 00 08 08 01 00 03 08 02 88 01 00 02 88 01 00 + .byte $14, $08, $05, $88, $04, $08, $02, $00, $1B, $01, $07, $81, $18, $01, $06, $81 ; ROM $002F3E: 14 08 05 88 04 08 02 00 1B 01 07 81 18 01 06 81 + .byte $15, $01, $02, $09, $10, $08, $0A, $40, $1A, $00, $0A, $04, $01, $00, $06, $04 ; ROM $002F4E: 15 01 02 09 10 08 0A 40 1A 00 0A 04 01 00 06 04 + .byte $01, $00, $1E, $02, $06, $00, $10, $08, $03, $84, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002F5E: 01 00 1E 02 06 00 10 08 03 84 FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002F6E: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002F7E: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002F8E: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002F9E: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002FAE: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002FBE: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002FCE: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002FDE: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002FEE: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $002FFE: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FC, $00, $00, $1F, $F0 ; ROM $00300E: FF FF FF FF FF FF FF FF FF FF FF FC 00 00 1F F0 + .byte $00, $1F, $FE, $00, $00, $07, $FF, $FF, $FF, $30, $00, $00, $3F, $FF, $E0, $07 ; ROM $00301E: 00 1F FE 00 00 07 FF FF FF 30 00 00 3F FF E0 07 + .byte $F0, $3F, $F8, $1F, $F0, $1F, $FF, $FF, $C0, $00, $03, $FF, $C0, $FF, $FF, $C0 ; ROM $00302E: F0 3F F8 1F F0 1F FF FF C0 00 03 FF C0 FF FF C0 + .byte $7F, $C7, $FF, $00, $00, $00, $FF, $F0, $00, $1F, $FF, $FE, $00, $00, $00, $00 ; ROM $00303E: 7F C7 FF 00 00 00 FF F0 00 1F FF FE 00 00 00 00 + .byte $00, $00, $00, $7F, $F0, $00, $07, $FF, $FF, $C0, $01, $80, $FF, $00, $02, $80 ; ROM $00304E: 00 00 00 7F F0 00 07 FF FF C0 01 80 FF 00 02 80 + .byte $3F, $FF, $F8, $00, $03, $FF, $FF, $FF, $FE, $00, $00, $1F, $FF, $FF, $F0, $01 ; ROM $00305E: 3F FF F8 00 03 FF FF FF FE 00 00 1F FF FF F0 01 + .byte $FF, $FF, $F0, $00, $0F, $FF, $FF, $FF, $00, $07, $FF, $F0, $00, $FB, $FF, $F8 ; ROM $00306E: FF FF F0 00 0F FF FF FF 00 07 FF F0 00 FB FF F8 + .byte $FF, $FF, $00, $00, $00, $01, $FF, $FF, $FF, $C0, $3F, $F8, $00, $00, $00, $00 ; ROM $00307E: FF FF 00 00 00 01 FF FF FF C0 3F F8 00 00 00 00 + .byte $7F, $FF, $FF, $FF, $FF, $FF, $FE, $00, $00, $00, $00, $0F, $FF, $F0, $00, $03 ; ROM $00308E: 7F FF FF FF FF FF FE 00 00 00 00 0F FF F0 00 03 + .byte $FF, $FF, $FF, $E0, $00, $00, $03, $FF, $FF, $F8, $00, $00, $00, $FF, $FF, $FF ; ROM $00309E: FF FF FF E0 00 00 03 FF FF F8 00 00 00 FF FF FF + .byte $00, $00, $00, $00, $1F, $E0, $00, $00, $07, $FF, $FF, $FE, $00, $00, $01, $FF ; ROM $0030AE: 00 00 00 00 1F E0 00 00 07 FF FF FE 00 00 01 FF + .byte $FE, $00, $00, $07, $FF, $FF, $FF, $F8, $00, $00, $00, $1F, $FF, $FF, $E0, $00 ; ROM $0030BE: FE 00 00 07 FF FF FF F8 00 00 00 1F FF FF E0 00 + .byte $00, $01, $FF, $FF, $FF, $FF, $FF, $C0, $00, $00, $00, $00, $0F, $FF, $FF, $FF ; ROM $0030CE: 00 01 FF FF FF FF FF C0 00 00 00 00 0F FF FF FF + .byte $FE, $00, $00, $07, $E0, $00, $00, $00, $00, $7F, $FF, $EF, $FF, $FF, $FF, $FF ; ROM $0030DE: FE 00 00 07 E0 00 00 00 00 7F FF EF FF FF FF FF + .byte $FF, $80, $00, $00, $3F, $FF, $C0, $00, $00, $00, $0F, $FF, $FF, $FC, $00, $FF ; ROM $0030EE: FF 80 00 00 3F FF C0 00 00 00 0F FF FF FC 00 FF + .byte $FF, $FE, $00, $00, $00, $7F, $FF, $FF, $FF, $C0, $00, $00, $00, $03, $FF, $FF ; ROM $0030FE: FF FE 00 00 00 7F FF FF FF C0 00 00 00 03 FF FF + .byte $FF, $C0, $00, $00, $00, $1F, $FF, $FF, $FF, $FF, $FE, $00, $07, $FF, $00, $00 ; ROM $00310E: FF C0 00 00 00 1F FF FF FF FF FE 00 07 FF 00 00 + .byte $0F, $FF, $FF, $FC, $00, $00, $00, $00, $3F, $FF, $FF, $F0, $00, $00, $00, $0F ; ROM $00311E: 0F FF FF FC 00 00 00 00 3F FF FF F0 00 00 00 0F + .byte $FE, $00, $00, $03, $FF, $FF, $C0, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF ; ROM $00312E: FE 00 00 03 FF FF C0 00 00 00 00 FF FF FF FF FF + .byte $80, $00, $01, $FF, $FF, $FF, $F0, $00, $00, $00, $00, $7F, $FF, $FF, $DA, $2E ; ROM $00313E: 80 00 01 FF FF FF F0 00 00 00 00 7F FF FF DA 2E + .byte $00, $00, $00, $7F, $FF, $FF, $FF, $FE, $00, $00, $FF, $80, $FF, $FC, $00, $00 ; ROM $00314E: 00 00 00 7F FF FF FF FE 00 00 FF 80 FF FC 00 00 + .byte $00, $00, $03, $FF, $FF, $FF, $FF, $FF, $80, $00, $00, $0F, $FF, $FF, $F8, $00 ; ROM $00315E: 00 00 03 FF FF FF FF FF 80 00 00 0F FF FF F8 00 + .byte $00, $00, $03, $FF, $FF, $FF, $C0, $00, $00, $00, $07, $FF, $FF, $FF, $FF, $80 ; ROM $00316E: 00 00 03 FF FF FF C0 00 00 00 07 FF FF FF FF 80 + .byte $00, $00, $01, $FF, $FF, $00, $00, $00, $01, $FF, $FF, $FF, $FF, $FF, $FF, $00 ; ROM $00317E: 00 00 01 FF FF 00 00 00 01 FF FF FF FF FF FF 00 + .byte $3F, $FF, $F0, $00, $00, $00, $07, $FF, $FF, $FF, $FE, $00, $03, $FF, $FE, $00 ; ROM $00318E: 3F FF F0 00 00 00 07 FF FF FF FE 00 03 FF FE 00 + .byte $00, $07, $FF, $FF, $FF, $C0, $00, $00, $00, $00, $7F, $FF, $E0, $00, $00, $00 ; ROM $00319E: 00 07 FF FF FF C0 00 00 00 00 7F FF E0 00 00 00 + .byte $03, $FF, $FF, $FF, $FF, $FF, $00, $00, $7C, $00, $00, $00, $0F, $FF, $FF, $FF ; ROM $0031AE: 03 FF FF FF FF FF 00 00 7C 00 00 00 0F FF FF FF + .byte $FF, $FF, $F8, $00, $00, $00, $3F, $FF, $FF, $FF, $C0, $00, $00, $07, $FF, $F0 ; ROM $0031BE: FF FF F8 00 00 00 3F FF FF FF C0 00 00 07 FF F0 + .byte $00, $00, $7F, $FF, $80, $00, $07, $FC, $00, $FF, $FF, $FF, $FF, $00, $00, $00 ; ROM $0031CE: 00 00 7F FF 80 00 07 FC 00 FF FF FF FF 00 00 00 + .byte $0F, $FF, $FF, $FF, $FE, $00, $00, $00, $3F, $FF, $FF, $F8, $00, $00, $00, $00 ; ROM $0031DE: 0F FF FF FF FE 00 00 00 3F FF FF F8 00 00 00 00 + .byte $3F, $FF, $C0, $00, $00, $FF, $FF, $FF, $E0, $00, $00, $00, $1F, $FF, $FF, $FF ; ROM $0031EE: 3F FF C0 00 00 FF FF FF E0 00 00 00 1F FF FF FF + .byte $FC, $00, $00, $7F, $FF, $FF, $F8, $00, $00, $00, $3F, $FF, $FF, $FF, $00, $00 ; ROM $0031FE: FC 00 00 7F FF FF F8 00 00 00 3F FF FF FF 00 00 + .byte $00, $00, $00, $FF, $FF, $FE, $11, $B0, $3F, $FF, $E0, $00, $00, $00, $00, $07 ; ROM $00320E: 00 00 00 FF FF FE 11 B0 3F FF E0 00 00 00 00 07 + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F8, $00, $00, $00, $00, $00, $00, $00 ; ROM $00321E: FF FF FF FF FF FF FF FF F8 00 00 00 00 00 00 00 + .byte $0F, $FF, $FF, $FF, $FF, $FF, $80, $00, $00, $00, $03, $FF, $FE, $00, $0F, $FF ; ROM $00322E: 0F FF FF FF FF FF 80 00 00 00 03 FF FE 00 0F FF + .byte $FF, $80, $00, $00, $00, $FF, $FF, $FF, $FC, $00, $00, $00, $00, $FF, $FF, $FE ; ROM $00323E: FF 80 00 00 00 FF FF FF FC 00 00 00 00 FF FF FE + .byte $00, $07, $FF, $FF, $FF, $FF, $E0, $00, $00, $00, $00, $0F, $FF, $A0, $BF, $FF ; ROM $00324E: 00 07 FF FF FF FF E0 00 00 00 00 0F FF A0 BF FF + .byte $FF, $FE, $00, $00, $7F, $FC, $00, $00, $00, $7F, $FF, $FF, $E0, $00, $00, $00 ; ROM $00325E: FF FE 00 00 7F FC 00 00 00 7F FF FF E0 00 00 00 + .byte $3F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $80, $00, $00, $00, $07, $F8, $00, $00 ; ROM $00326E: 3F FF FF FF FF FF FF FF 80 00 00 00 07 F8 00 00 + .byte $00, $00, $03, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $01, $FF, $FF ; ROM $00327E: 00 00 03 FF FF FF FF FF 00 00 00 00 00 01 FF FF + .byte $FF, $F0, $00, $07, $FF, $FF, $FC, $00, $00, $00, $00, $3F, $FF, $FF, $FF, $FF ; ROM $00328E: FF F0 00 07 FF FF FC 00 00 00 00 3F FF FF FF FF + .byte $0F, $FF, $FF, $FE, $00, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $F8, $00, $01 ; ROM $00329E: 0F FF FF FE 00 00 00 00 00 FF FF FF FF F8 00 01 + .byte $FF, $FC, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $C0, $00, $00, $00, $00, $03 ; ROM $0032AE: FF FC 00 00 00 00 FF FF FF FF C0 00 00 00 00 03 + .byte $FF, $FF, $80, $00, $00, $00, $00, $3F, $FF, $FF, $FF, $FF, $FF, $C0, $00, $3F ; ROM $0032BE: FF FF 80 00 00 00 00 3F FF FF FF FF FF C0 00 3F + .byte $FF, $FF, $FF, $F8, $00, $00, $02, $00, $00, $00, $00, $00, $07, $FF, $FF, $FF ; ROM $0032CE: FF FF FF F8 00 00 02 00 00 00 00 00 07 FF FF FF + .byte $FF, $FF, $FF, $FF, $E0, $B8, $00, $00, $00, $00, $00, $00, $3F, $FF, $FF, $FF ; ROM $0032DE: FF FF FF FF E0 B8 00 00 00 00 00 00 3F FF FF FF + .byte $FF, $FF, $F8, $00, $00, $00, $00, $1F, $FF, $FF, $FF, $FF, $80, $00, $00, $00 ; ROM $0032EE: FF FF F8 00 00 00 00 1F FF FF FF FF 80 00 00 00 + .byte $00, $0F, $FF, $FF, $FF, $DF, $FF, $00, $00, $0F, $FF, $FF, $80, $00, $00, $00 ; ROM $0032FE: 00 0F FF FF FF DF FF 00 00 0F FF FF 80 00 00 00 + .byte $03, $FF, $FF, $FF, $FF, $FF, $FF, $C0, $00, $00, $00, $01, $FF, $FF, $FF, $00 ; ROM $00330E: 03 FF FF FF FF FF FF C0 00 00 00 01 FF FF FF 00 + .byte $00, $00, $00, $1F, $FF, $FF, $FF, $FF, $FF, $FF, $E0, $00, $FF, $00, $00, $00 ; ROM $00331E: 00 00 00 1F FF FF FF FF FF FF E0 00 FF 00 00 00 + .byte $00, $00, $00, $01, $FF, $FF, $FF, $C0, $00, $00, $03, $FF, $FF, $FF, $FF, $FF ; ROM $00332E: 00 00 00 01 FF FF FF C0 00 00 03 FF FF FF FF FF + .byte $F0, $00, $00, $00, $00, $00, $07, $FF, $FF, $FF, $FF, $FF, $80, $00, $00, $00 ; ROM $00333E: F0 00 00 00 00 00 07 FF FF FF FF FF 80 00 00 00 + .byte $00, $0F, $FF, $FF, $FF, $F0, $00, $3F, $FF, $FF, $00, $00, $17, $FB, $C8, $84 ; ROM $00334E: 00 0F FF FF FF F0 00 3F FF FF 00 00 17 FB C8 84 + .byte $E5, $3F, $FF, $20, $00, $14, $19, $D9, $9F, $F6, $00, $00, $17, $FF, $FF, $FF ; ROM $00335E: E5 3F FF 20 00 14 19 D9 9F F6 00 00 17 FF FF FF + .byte $FF, $FE, $00, $00, $00, $00, $00, $03, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE ; ROM $00336E: FF FE 00 00 00 00 00 03 FF FF FF FF FF FF FF FE + .byte $00, $00, $00, $00, $00, $00, $00, $00, $FF, $FF, $FF, $DC, $80, $00, $26, $FE ; ROM $00337E: 00 00 00 00 00 00 00 00 FF FF FF DC 80 00 26 FE + .byte $57, $FF, $FF, $80, $00, $00, $07, $FC, $C0, $3F, $FF, $FF, $7F, $BD, $C4, $61 ; ROM $00338E: 57 FF FF 80 00 00 07 FC C0 3F FF FF 7F BD C4 61 + .byte $4E, $EE, $67, $20, $46, $64, $EF, $E6, $00, $00, $FD, $A0, $00, $00, $00, $00 ; ROM $00339E: 4E EE 67 20 46 64 EF E6 00 00 FD A0 00 00 00 00 + .byte $07, $FF, $FF, $FF, $FF, $FF, $F0, $00, $00, $00, $00, $00, $7F, $FF, $FF, $FF ; ROM $0033AE: 07 FF FF FF FF FF F0 00 00 00 00 00 7F FF FF FF + .byte $FF, $C0, $00, $00, $00, $00, $0F, $7F, $F8, $DF, $FF, $FF, $C0, $03, $FB, $9F ; ROM $0033BE: FF C0 00 00 00 00 0F 7F F8 DF FF FF C0 03 FB 9F + .byte $AF, $FF, $FF, $80, $00, $00, $02, $F6, $A5, $6F, $FF, $FF, $FC, $00, $3F, $FF ; ROM $0033CE: AF FF FF 80 00 00 02 F6 A5 6F FF FF FC 00 3F FF + .byte $C0, $00, $00, $00, $00, $00, $1F, $FF, $FF, $FF, $FF, $FF, $82, $00, $00, $00 ; ROM $0033DE: C0 00 00 00 00 00 1F FF FF FF FF FF 82 00 00 00 + .byte $00, $00, $00, $03, $FF, $FF, $FF, $FF, $C0, $00, $00, $00, $00, $7F, $FF, $FF ; ROM $0033EE: 00 00 00 03 FF FF FF FF C0 00 00 00 00 7F FF FF + .byte $FF, $FE, $00, $00, $00, $00, $1E, $7B, $FF, $FF, $FF, $FF, $FF, $F8, $00, $BF ; ROM $0033FE: FF FE 00 00 00 00 1E 7B FF FF FF FF FF F8 00 BF + .byte $FF, $FF, $C0, $00, $00, $00, $00, $07, $FF, $FF, $FF, $FF, $FF, $FE, $00, $00 ; ROM $00340E: FF FF C0 00 00 00 00 07 FF FF FF FF FF FE 00 00 + .byte $00, $00, $00, $00, $01, $FF, $FF, $FF, $88, $20, $0D, $FF, $F0, $00, $00, $00 ; ROM $00341E: 00 00 00 00 01 FF FF FF 88 20 0D FF F0 00 00 00 + .byte $03, $FF, $FF, $FF, $FF, $FF, $FF, $F8, $00, $00, $00, $00, $00, $00, $FF, $FF ; ROM $00342E: 03 FF FF FF FF FF FF F8 00 00 00 00 00 00 FF FF + .byte $FF, $FF, $FF, $F8, $00, $00, $3F, $FF, $FF, $80, $00, $00, $00, $00, $00, $01 ; ROM $00343E: FF FF FF F8 00 00 3F FF FF 80 00 00 00 00 00 01 + .byte $FF, $FF, $FF, $FF, $FF, $FE, $00, $00, $00, $07, $FF, $FF, $FF, $FF, $FF, $00 ; ROM $00344E: FF FF FF FF FF FE 00 00 00 07 FF FF FF FF FF 00 + .byte $00, $00, $00, $00, $00, $01, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00 ; ROM $00345E: 00 00 00 00 00 01 FF FF FF FF FF FF 00 00 00 00 + .byte $00, $00, $07, $FF, $FF, $FF, $FF, $F6, $6F, $FF, $E0, $00, $00, $00, $00, $7F ; ROM $00346E: 00 00 07 FF FF FF FF F6 6F FF E0 00 00 00 00 7F + .byte $FF, $FF, $FE, $00, $00, $00, $00, $1F, $FF, $FF, $FF, $FF, $FE, $00, $00, $00 ; ROM $00347E: FF FF FE 00 00 00 00 1F FF FF FF FF FE 00 00 00 + .byte $00, $00, $06, $69, $43, $1A, $ED, $BF, $FF, $FF, $F0, $00, $00, $00, $00, $00 ; ROM $00348E: 00 00 06 69 43 1A ED BF FF FF F0 00 00 00 00 00 + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F0, $00, $00, $00, $00, $1F, $FF, $FF, $FF ; ROM $00349E: FF FF FF FF FF FF FF F0 00 00 00 00 1F FF FF FF + .byte $FF, $C0, $00, $00, $00, $00, $00, $00, $17, $FF, $FF, $FF, $FF, $02, $29, $99 ; ROM $0034AE: FF C0 00 00 00 00 00 00 17 FF FF FF FF 02 29 99 + .byte $DF, $FE, $A4, $26, $75, $AC, $61, $AF, $6D, $84, $44, $50, $9F, $BB, $79, $D9 ; ROM $0034BE: DF FE A4 26 75 AC 61 AF 6D 84 44 50 9F BB 79 D9 + .byte $9B, $EC, $DB, $27, $FE, $00, $00, $00, $00, $07, $FF, $FF, $FF, $FC, $00, $00 ; ROM $0034CE: 9B EC DB 27 FE 00 00 00 00 07 FF FF FF FC 00 00 + .byte $00, $00, $1F, $FF, $FF, $FF, $80, $00, $0F, $FF, $FF, $FF, $00, $00, $00, $00 ; ROM $0034DE: 00 00 1F FF FF FF 80 00 0F FF FF FF 00 00 00 00 + .byte $1F, $FF, $FF, $80, $00, $00, $03, $DC, $DA, $FF, $FF, $FF, $FF, $00, $00, $00 ; ROM $0034EE: 1F FF FF 80 00 00 03 DC DA FF FF FF FF 00 00 00 + .byte $00, $00, $00, $3F, $FF, $FF, $FF, $FF, $FF, $F0, $00, $00, $00, $1F, $FF, $FF ; ROM $0034FE: 00 00 00 3F FF FF FF FF FF F0 00 00 00 1F FF FF + .byte $FF, $FF, $F8, $00, $00, $00, $00, $00, $00, $5E, $FB, $EB, $AC, $C7, $EF, $BB ; ROM $00350E: FF FF F8 00 00 00 00 00 00 5E FB EB AC C7 EF BB + .byte $79, $BF, $FF, $E0, $00, $0F, $F8, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $00351E: 79 BF FF E0 00 0F F8 00 00 00 FF FF FF FF FF FF + .byte $FC, $00, $00, $00, $00, $00, $00, $3F, $FF, $FF, $F7, $FF, $FF, $FF, $FA, $10 ; ROM $00352E: FC 00 00 00 00 00 00 3F FF FF F7 FF FF FF FA 10 + .byte $00, $00, $00, $00, $00, $00, $00, $00, $0F, $FC, $FB, $EE, $FF, $EA, $D9, $DF ; ROM $00353E: 00 00 00 00 00 00 00 00 0F FC FB EE FF EA D9 DF + .byte $CE, $7F, $FF, $FF, $80, $00, $00, $00, $00, $00, $1F, $FF, $FF, $FF, $FF, $FF ; ROM $00354E: CE 7F FF FF 80 00 00 00 00 00 1F FF FF FF FF FF + .byte $FF, $E0, $00, $00, $00, $00, $00, $7F, $FF, $FF, $FF, $F8, $00, $00, $00, $00 ; ROM $00355E: FF E0 00 00 00 00 00 7F FF FF FF F8 00 00 00 00 + .byte $00, $00, $0F, $FF, $FF, $FF, $FF, $FF, $FF, $FC, $00, $00, $00, $00, $00, $00 ; ROM $00356E: 00 00 0F FF FF FF FF FF FF FC 00 00 00 00 00 00 + .byte $00, $3F, $FF, $FF, $FF, $FF, $D3, $24, $25, $33, $CC, $C9, $20, $7F, $FF, $F0 ; ROM $00357E: 00 3F FF FF FF FF D3 24 25 33 CC C9 20 7F FF F0 + .byte $00, $00, $00, $07, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $0F, $FF, $FF, $FF ; ROM $00358E: 00 00 00 07 FF FF FF FF 00 00 00 00 0F FF FF FF + .byte $FF, $FF, $C6, $30, $40, $04, $20, $08, $61, $00, $00, $00, $07, $FF, $FF, $FF ; ROM $00359E: FF FF C6 30 40 04 20 08 61 00 00 00 07 FF FF FF + .byte $FF, $FF, $FC, $00, $00, $00, $00, $00, $00, $00, $00, $01, $FF, $FF, $FF, $FF ; ROM $0035AE: FF FF FC 00 00 00 00 00 00 00 00 01 FF FF FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $62, $01, $00, $00, $80, $00, $00, $77, $5F, $FF ; ROM $0035BE: FF FF FF FF FF FF 62 01 00 00 80 00 00 77 5F FF + .byte $FD, $76, $EB, $5B, $7F, $FF, $FC, $00, $00, $00, $00, $00, $00, $3F, $FF, $FF ; ROM $0035CE: FD 76 EB 5B 7F FF FC 00 00 00 00 00 00 3F FF FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00, $00, $FF ; ROM $0035DE: FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 FF + .byte $FF, $FF, $FF, $FF, $FF, $80, $00, $00, $00, $00, $00, $00, $1F, $FF, $FF, $FF ; ROM $0035EE: FF FF FF FF FF 80 00 00 00 00 00 00 1F FF FF FF + .byte $FF, $00, $80, $00, $85, $11, $9E, $CC, $CD, $DB, $DF, $F6, $DF, $FF, $FF, $C0 ; ROM $0035FE: FF 00 80 00 85 11 9E CC CD DB DF F6 DF FF FF C0 + .byte $00, $00, $00, $00, $00, $0F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $80, $00 ; ROM $00360E: 00 00 00 00 00 0F FF FF FF FF FF FF FF FF 80 00 + .byte $00, $00, $00, $00, $00, $00, $07, $FF, $FF, $FF, $FF, $FF, $FF, $F0, $00, $00 ; ROM $00361E: 00 00 00 00 00 00 07 FF FF FF FF FF FF F0 00 00 + .byte $00, $00, $00, $00, $00, $00, $1F, $FF, $FF, $C0, $00, $07, $FF, $FF, $FF, $FF ; ROM $00362E: 00 00 00 00 00 00 1F FF FF C0 00 07 FF FF FF FF + .byte $F0, $06, $31, $66, $6B, $FD, $FE, $D9, $40, $00, $03, $FF, $FF, $FF, $FF, $FF ; ROM $00363E: F0 06 31 66 6B FD FE D9 40 00 03 FF FF FF FF FF + .byte $80, $00, $00, $00, $00, $00, $00, $00, $07, $FF, $FF, $FF, $FD, $F9, $88, $44 ; ROM $00364E: 80 00 00 00 00 00 00 00 07 FF FF FF FD F9 88 44 + .byte $4A, $61, $4C, $CF, $6C, $E6, $7E, $EE, $69, $98, $4A, $CE, $B2, $61, $04, $66 ; ROM $00365E: 4A 61 4C CF 6C E6 7E EE 69 98 4A CE B2 61 04 66 + .byte $64, $CE, $6D, $FF, $FF, $FE, $00, $00, $00, $00, $00, $01, $FF, $FF, $FF, $FF ; ROM $00366E: 64 CE 6D FF FF FE 00 00 00 00 00 01 FF FF FF FF + .byte $FE, $EF, $FF, $FF, $E6, $20, $80, $00, $00, $00, $00, $00, $00, $00, $01, $DB ; ROM $00367E: FE EF FF FF E6 20 80 00 00 00 00 00 00 00 01 DB + .byte $EF, $FF, $FF, $FF, $FF, $F9, $8A, $99, $8A, $4C, $99, $9B, $39, $BF, $FF, $C0 ; ROM $00368E: EF FF FF FF FF F9 8A 99 8A 4C 99 9B 39 BF FF C0 + .byte $00, $00, $00, $00, $00, $03, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FC, $00, $00 ; ROM $00369E: 00 00 00 00 00 03 FF FF FF FF FF FF FF FC 00 00 + .byte $00, $00, $00, $00, $00, $2F, $FF, $DF, $FF, $FF, $FF, $F0, $00, $00, $00, $00 ; ROM $0036AE: 00 00 00 00 00 2F FF DF FF FF FF F0 00 00 00 00 + .byte $00, $7F, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $3C, $A0, $00 ; ROM $0036BE: 00 7F FF FF FF FF FF FF 00 00 00 00 00 3C A0 00 + .byte $00, $00, $1B, $7F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FC, $A0, $00, $00, $00 ; ROM $0036CE: 00 00 1B 7F FF FF FF FF FF FF FF FC A0 00 00 00 + .byte $FF, $FF, $FE, $61, $00, $00, $00, $00, $00, $00, $00, $3F, $FF, $FF, $FF, $FF ; ROM $0036DE: FF FF FE 61 00 00 00 00 00 00 00 3F FF FF FF FF + .byte $FB, $DF, $FF, $FF, $FF, $CC, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; ROM $0036EE: FB DF FF FF FF CC 00 00 00 00 00 00 00 00 00 00 + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F8, $00, $00, $00, $00, $00, $00 ; ROM $0036FE: FF FF FF FF FF FF FF FF FF F8 00 00 00 00 00 00 + .byte $41, $AD, $26, $EF, $FF, $FF, $FF, $FF, $FF, $E0, $00, $00, $00, $00, $00, $00 ; ROM $00370E: 41 AD 26 EF FF FF FF FF FF E0 00 00 00 00 00 00 + .byte $01, $5A, $FF, $FF, $6F, $FF, $FF, $FF, $00, $00, $00, $05, $FF, $FF, $FF, $FF ; ROM $00371E: 01 5A FF FF 6F FF FF FF 00 00 00 05 FF FF FF FF + .byte $FF, $FA, $28, $88, $10, $40, $00, $02, $10, $94, $66, $73, $36, $F7, $FF, $FF ; ROM $00372E: FF FA 28 88 10 40 00 02 10 94 66 73 36 F7 FF FF + .byte $FC, $00, $00, $00, $00, $FF, $FF, $FF, $FF, $FF, $F8, $00, $00, $00, $0F, $B1 ; ROM $00373E: FC 00 00 00 00 FF FF FF FF FF F8 00 00 00 0F B1 + .byte $44, $10, $00, $00, $65, $33, $DF, $FF, $FF, $F9, $9E, $FF, $FF, $FF, $FF, $FA ; ROM $00374E: 44 10 00 00 65 33 DF FF FF F9 9E FF FF FF FF FA + .byte $E4, $00, $00, $00, $00, $00, $00, $00, $00, $01, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $00375E: E4 00 00 00 00 00 00 00 00 01 FF FF FF FF FF FF + .byte $FF, $80, $00, $00, $00, $02, $FB, $DD, $B6, $B7, $77, $DA, $28, $99, $4A, $BF ; ROM $00376E: FF 80 00 00 00 02 FB DD B6 B7 77 DA 28 99 4A BF + .byte $FF, $C8, $00, $00, $00, $00, $00, $1F, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00 ; ROM $00377E: FF C8 00 00 00 00 00 1F FF FF FF FF FF FF FF 00 + .byte $00, $00, $00, $00, $00, $00, $0F, $FF, $FF, $FF, $FF, $FF, $FF, $C0, $00, $00 ; ROM $00378E: 00 00 00 00 00 00 0F FF FF FF FF FF FF C0 00 00 + .byte $00, $00, $00, $00, $00, $20, $45, $6D, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $00379E: 00 00 00 00 00 20 45 6D FF FF FF FF FF FF FF FF + .byte $F4, $00, $00, $07, $BD, $FF, $BC, $C4, $80, $40, $00, $00, $00, $00, $06, $32 ; ROM $0037AE: F4 00 00 07 BD FF BC C4 80 40 00 00 00 00 06 32 + .byte $EE, $CE, $B6, $DF, $7B, $BF, $BF, $F7, $DC, $EF, $FF, $F2, $00, $00, $00, $00 ; ROM $0037BE: EE CE B6 DF 7B BF BF F7 DC EF FF F2 00 00 00 00 + .byte $00, $00, $0B, $FF, $FF, $FF, $FF, $FF, $FC, $00, $8F, $7F, $76, $CE, $52, $90 ; ROM $0037CE: 00 00 0B FF FF FF FF FF FC 00 8F 7F 76 CE 52 90 + .byte $00, $00, $00, $7B, $62, $00, $00, $00, $00, $32, $23, $7F, $FF, $FF, $FF, $FF ; ROM $0037DE: 00 00 00 7B 62 00 00 00 00 32 23 7F FF FF FF FF + .byte $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $02, $6F, $FF, $FE, $EF, $32 ; ROM $0037EE: FF FF FF FF 00 00 00 00 00 00 02 6F FF FE EF 32 + .byte $98, $8C, $25, $33, $5E, $F7, $BF, $F5, $99, $DF, $FF, $FE, $06, $6C, $48, $C4 ; ROM $0037FE: 98 8C 25 33 5E F7 BF F5 99 DF FF FE 06 6C 48 C4 + .byte $89, $11, $04, $45, $14, $33, $BC, $88, $00, $00, $00, $00, $26, $6B, $5D, $FF ; ROM $00380E: 89 11 04 45 14 33 BC 88 00 00 00 00 26 6B 5D FF + .byte $FF, $FF, $FF, $FF, $FF, $FF, $F0, $04, $00, $00, $00, $08, $88, $C6, $66, $D6 ; ROM $00381E: FF FF FF FF FF FF F0 04 00 00 00 08 88 C6 66 D6 + .byte $DD, $BB, $33, $67, $3B, $BB, $FF, $FD, $0A, $64, $90, $01, $00, $00, $8C, $AB ; ROM $00382E: DD BB 33 67 3B BB FF FD 0A 64 90 01 00 00 8C AB + .byte $BB, $FF, $FF, $FB, $FF, $5D, $CC, $CA, $53, $33, $14, $21, $08, $84, $11, $09 ; ROM $00383E: BB FF FF FB FF 5D CC CA 53 33 14 21 08 84 11 09 + .byte $14, $45, $22, $4C, $66, $6B, $32, $10, $93, $BF, $FF, $FF, $FF, $FF, $FF, $C0 ; ROM $00384E: 14 45 22 4C 66 6B 32 10 93 BF FF FF FF FF FF C0 + .byte $00, $00, $00, $00, $00, $BF, $FB, $F7, $77, $FF, $E4, $20, $42, $4C, $CD, $67 ; ROM $00385E: 00 00 00 00 00 BF FB F7 77 FF E4 20 42 4C CD 67 + .byte $75, $EE, $CE, $7A, $D9, $9D, $B3, $31, $84, $82, $44, $8A, $65, $55, $9D, $B3 ; ROM $00386E: 75 EE CE 7A D9 9D B3 31 84 82 44 8A 65 55 9D B3 + .byte $33, $5F, $B6, $DC, $A0, $00, $00, $00, $00, $03, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $00387E: 33 5F B6 DC A0 00 00 00 00 03 FF FF FF FF FF FF + .byte $F9, $02, $00, $00, $00, $32, $88, $00, $12, $99, $9C, $EE, $F7, $FF, $FF, $FF ; ROM $00388E: F9 02 00 00 00 32 88 00 12 99 9C EE F7 FF FF FF + .byte $84, $00, $00, $04, $50, $8A, $FF, $FF, $FF, $FF, $FC, $00, $86, $7F, $FF, $FF ; ROM $00389E: 84 00 00 04 50 8A FF FF FF FF FC 00 86 7F FF FF + .byte $E0, $00, $00, $00, $00, $3F, $BF, $FB, $AE, $D9, $99, $D7, $28, $00, $00, $00 ; ROM $0038AE: E0 00 00 00 00 3F BF FB AE D9 99 D7 28 00 00 00 + .byte $00, $00, $00, $7D, $FF, $FF, $FF, $FF, $FF, $FF, $E8, $48, $A4, $C6, $4D, $62 ; ROM $0038BE: 00 00 00 7D FF FF FF FF FF FF E8 48 A4 C6 4D 62 + .byte $88, $45, $5F, $6C, $80, $00, $00, $01, $19, $9A, $DB, $BF, $FF, $FE, $FB, $33 ; ROM $0038CE: 88 45 5F 6C 80 00 00 01 19 9A DB BF FF FE FB 33 + .byte $5E, $FF, $BF, $76, $DA, $E6, $64, $D6, $00, $00, $00, $00, $00, $00, $DB, $33 ; ROM $0038DE: 5E FF BF 76 DA E6 64 D6 00 00 00 00 00 00 DB 33 + .byte $14, $22, $8C, $44, $18, $EF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F0, $00, $00 ; ROM $0038EE: 14 22 8C 44 18 EF FF FF FF FF FF FF FF F0 00 00 + .byte $00, $00, $00, $CE, $75, $9D, $9C, $E7, $99, $99, $9A, $6A, $64, $CC, $CC, $CC ; ROM $0038FE: 00 00 00 CE 75 9D 9C E7 99 99 9A 6A 64 CC CC CC + .byte $CD, $6B, $2A, $67, $35, $9B, $33, $19, $8C, $CC, $CC, $CA, $67, $7F, $F2, $00 ; ROM $00390E: CD 6B 2A 67 35 9B 33 19 8C CC CC CA 67 7F F2 00 + .byte $02, $19, $DB, $B7, $5D, $FF, $FF, $FC, $20, $00, $00, $00, $00, $17, $F6, $33 ; ROM $00391E: 02 19 DB B7 5D FF FF FC 20 00 00 00 00 17 F6 33 + .byte $3E, $FF, $FF, $FF, $FE, $F5, $8D, $9F, $4C, $00, $00, $00, $00, $00, $00, $00 ; ROM $00392E: 3E FF FF FF FE F5 8D 9F 4C 00 00 00 00 00 00 00 + .byte $3F, $FF, $FF, $FF, $FF, $FF, $FF, $F4, $80, $00, $00, $00, $00, $7F, $FF, $E6 ; ROM $00393E: 3F FF FF FF FF FF FF F4 80 00 00 00 00 7F FF E6 + .byte $50, $80, $00, $19, $FF, $FF, $FF, $FF, $FF, $EB, $33, $12, $00, $00, $81, $10 ; ROM $00394E: 50 80 00 19 FF FF FF FF FF EB 33 12 00 00 81 10 + .byte $22, $33, $B5, $22, $12, $53, $5B, $5D, $7B, $F7, $EE, $BA, $CC, $CC, $CD, $99 ; ROM $00395E: 22 33 B5 22 12 53 5B 5D 7B F7 EE BA CC CC CD 99 + .byte $98, $C6, $66, $71, $98, $88, $91, $8C, $4C, $FB, $52, $42, $52, $99, $DD, $D9 ; ROM $00396E: 98 C6 66 71 98 88 91 8C 4C FB 52 42 52 99 DD D9 + .byte $9D, $BF, $BF, $CC, $44, $01, $01, $00, $00, $14, $EE, $FF, $FF, $FF, $FF, $FD ; ROM $00397E: 9D BF BF CC 44 01 01 00 00 14 EE FF FF FF FF FD + .byte $77, $7E, $42, $00, $40, $00, $00, $00, $00, $0A, $33, $3D, $FF, $FF, $FF, $FF ; ROM $00398E: 77 7E 42 00 40 00 00 00 00 0A 33 3D FF FF FF FF + .byte $FF, $FE, $66, $62, $22, $08, $41, $02, $13, $31, $84, $10, $09, $AF, $7B, $5C ; ROM $00399E: FF FE 66 62 22 08 41 02 13 31 84 10 09 AF 7B 5C + .byte $CC, $D6, $73, $39, $94, $B3, $BF, $FF, $FF, $FF, $EE, $D6, $66, $28, $A2, $08 ; ROM $0039AE: CC D6 73 39 94 B3 BF FF FF FF EE D6 66 28 A2 08 + .byte $40, $10, $CA, $40, $00, $00, $10, $50, $CC, $CD, $BB, $F7, $F7, $FD, $FF, $7E ; ROM $0039BE: 40 10 CA 40 00 00 10 50 CC CD BB F7 F7 FD FF 7E + .byte $FA, $D5, $98, $C5, $33, $67, $AE, $75, $99, $4A, $10, $40, $81, $01, $00, $90 ; ROM $0039CE: FA D5 98 C5 33 67 AE 75 99 4A 10 40 81 01 00 90 + .byte $51, $8C, $CD, $EF, $F5, $A9, $45, $12, $94, $CC, $C9, $9E, $F7, $FF, $FF, $FF ; ROM $0039DE: 51 8C CD EF F5 A9 45 12 94 CC C9 9E F7 FF FF FF + .byte $FF, $79, $D9, $CC, $E5, $48, $88, $84, $04, $08, $21, $11, $14, $E3, $1C, $D3 ; ROM $0039EE: FF 79 D9 CC E5 48 88 84 04 08 21 11 14 E3 1C D3 + .byte $35, $99, $91, $00, $09, $36, $FF, $FF, $FF, $FD, $6B, $32, $28, $00, $81, $29 ; ROM $0039FE: 35 99 91 00 09 36 FF FF FF FD 6B 32 28 00 81 29 + .byte $B7, $7B, $F7, $EB, $B5, $9B, $19, $4A, $24, $44, $42, $25, $59, $98, $81, $20 ; ROM $003A0E: B7 7B F7 EB B5 9B 19 4A 24 44 42 25 59 98 81 20 + .byte $24, $46, $33, $33, $9E, $EE, $FB, $F7, $FF, $BE, $D9, $9C, $EF, $75, $ED, $EE ; ROM $003A1E: 24 46 33 33 9E EE FB F7 FF BE D9 9C EF 75 ED EE + .byte $D9, $84, $41, $04, $00, $81, $01, $09, $11, $14, $4C, $6A, $6B, $39, $CF, $BA ; ROM $003A2E: D9 84 41 04 00 81 01 09 11 14 4C 6A 6B 39 CF BA + .byte $E6, $B7, $7F, $DF, $66, $22, $00, $04, $65, $D7, $BF, $BE, $FF, $BD, $CE, $66 ; ROM $003A3E: E6 B7 7F DF 66 22 00 04 65 D7 BF BE FF BD CE 66 + .byte $62, $94, $91, $42, $93, $AC, $C4, $00, $40, $20, $04, $08, $CD, $7F, $FF, $FF ; ROM $003A4E: 62 94 91 42 93 AC C4 00 40 20 04 08 CD 7F FF FF + .byte $F7, $FB, $EF, $76, $A4, $88, $84, $11, $23, $18, $C6, $62, $45, $18, $A4, $CC ; ROM $003A5E: F7 FB EF 76 A4 88 84 11 23 18 C6 62 45 18 A4 CC + .byte $D6, $77, $BE, $D9, $89, $21, $08, $A2, $98, $DA, $EB, $DB, $BB, $EF, $DE, $ED ; ROM $003A6E: D6 77 BE D9 89 21 08 A2 98 DA EB DB BB EF DE ED + .byte $99, $8A, $6B, $5B, $5D, $D6, $CC, $CC, $E7, $28, $00, $00, $00, $00, $00, $99 ; ROM $003A7E: 99 8A 6B 5B 5D D6 CC CC E7 28 00 00 00 00 00 99 + .byte $33, $1C, $DB, $DE, $F7, $7F, $BF, $CE, $75, $9A, $CD, $93, $08, $A6, $67, $36 ; ROM $003A8E: 33 1C DB DE F7 7F BF CE 75 9A CD 93 08 A6 67 36 + .byte $B6, $B6, $B3, $9C, $D9, $9B, $24, $10, $21, $02, $11, $46, $4C, $CD, $9C, $D9 ; ROM $003A9E: B6 B6 B3 9C D9 9B 24 10 21 02 11 46 4C CD 9C D9 + .byte $D9, $CE, $BD, $FB, $B9, $94, $24, $22, $46, $32, $66, $6D, $75, $ED, $F7, $76 ; ROM $003AAE: D9 CE BD FB B9 94 24 22 46 32 66 6D 75 ED F7 76 + .byte $CD, $B3, $33, $9A, $DB, $5A, $CD, $67, $30, $84, $21, $11, $04, $22, $10, $A3 ; ROM $003ABE: CD B3 33 9A DB 5A CD 67 30 84 21 11 04 22 10 A3 + .byte $18, $CC, $DA, $D9, $92, $26, $67, $66, $67, $39, $D6, $EB, $D7, $BB, $BB, $9D ; ROM $003ACE: 18 CC DA D9 92 26 67 66 67 39 D6 EB D7 BB BB 9D + .byte $99, $99, $99, $9B, $32, $61, $49, $9D, $B3, $8C, $21, $11, $10, $51, $43, $1B ; ROM $003ADE: 99 99 99 9B 32 61 49 9D B3 8C 21 11 10 51 43 1B + .byte $3D, $FB, $FE, $FD, $EE, $E7, $66, $66, $29, $46, $22, $89, $14, $28, $4A, $14 ; ROM $003AEE: 3D FB FE FD EE E7 66 66 29 46 22 89 14 28 4A 14 + .byte $A6, $53, $3B, $6C, $CC, $44, $08, $46, $67, $5F, $BF, $DF, $77, $BE, $FE, $E6 ; ROM $003AFE: A6 53 3B 6C CC 44 08 46 67 5F BF DF 77 BE FE E6 + .byte $62, $28, $11, $08, $84, $82, $26, $6B, $AF, $7D, $FE, $DD, $66, $66, $33, $18 ; ROM $003B0E: 62 28 11 08 84 82 26 6B AF 7D FE DD 66 66 33 18 + .byte $C5, $28, $C5, $31, $4C, $65, $25, $32, $A9, $99, $32, $66, $66, $66, $B3, $D6 ; ROM $003B1E: C5 28 C5 31 4C 65 25 32 A9 99 32 66 66 66 B3 D6 + .byte $CC, $E7, $6E, $51, $22, $53, $67, $77, $7D, $73, $4A, $22, $96, $6C, $CC, $CA ; ROM $003B2E: CC E7 6E 51 22 53 67 77 7D 73 4A 22 96 6C CC CA + .byte $66, $33, $2C, $CC, $CC, $E6, $6B, $35, $99, $9A, $CB, $33, $32, $51, $24, $CB ; ROM $003B3E: 66 33 2C CC CC E6 6B 35 99 9A CB 33 32 51 24 CB + .byte $39, $D7, $39, $CC, $CC, $C6, $63, $0A, $48, $88, $93, $18, $93, $18, $CC, $CE ; ROM $003B4E: 39 D7 39 CC CC C6 63 0A 48 88 93 18 93 18 CC CE + .byte $73, $9B, $59, $CD, $75, $DD, $EE, $B3, $19, $66, $73, $6B, $67, $59, $CE, $66 ; ROM $003B5E: 73 9B 59 CD 75 DD EE B3 19 66 73 6B 67 59 CE 66 + .byte $66, $E7, $9A, $62, $10, $01, $04, $67, $6D, $99, $33, $33, $9D, $AE, $76, $B6 ; ROM $003B6E: 66 E7 9A 62 10 01 04 67 6D 99 33 33 9D AE 76 B6 + .byte $AC, $CC, $CE, $6C, $CA, $22, $08, $10, $44, $49, $12, $93, $3A, $FF, $7F, $AD ; ROM $003B7E: AC CC CE 6C CA 22 08 10 44 49 12 93 3A FF 7F AD + .byte $5A, $DA, $EB, $6B, $39, $CC, $D9, $99, $93, $26, $29, $29, $31, $46, $31, $94 ; ROM $003B8E: 5A DA EB 6B 39 CC D9 99 93 26 29 29 31 46 31 94 + .byte $CC, $CC, $C6, $53, $99, $99, $AB, $35, $6C, $CE, $66, $CD, $9A, $E6, $CD, $99 ; ROM $003B9E: CC CC C6 53 99 99 AB 35 6C CE 66 CD 9A E6 CD 99 + .byte $CD, $99, $B2, $B2, $99, $4C, $66, $31, $98, $CC, $CC, $CD, $99, $98, $D3, $58 ; ROM $003BAE: CD 99 B2 B2 99 4C 66 31 98 CC CC CD 99 98 D3 58 + .byte $CA, $99, $9A, $DB, $29, $49, $14, $45, $26, $33, $35, $9B, $39, $B5, $DA, $DA ; ROM $003BBE: CA 99 9A DB 29 49 14 45 26 33 35 9B 39 B5 DA DA + .byte $EC, $E6, $CD, $66, $CC, $CC, $C9, $99, $8C, $99, $93, $18, $C9, $8A, $22, $94 ; ROM $003BCE: EC E6 CD 66 CC CC C9 99 8C 99 93 18 C9 8A 22 94 + .byte $CD, $75, $EF, $75, $9A, $51, $14, $44, $89, $25, $29, $AC, $D9, $CC, $E6, $D6 ; ROM $003BDE: CD 75 EF 75 9A 51 14 44 89 25 29 AC D9 CC E6 D6 + .byte $B9, $DB, $5C, $EB, $33, $33, $39, $D7, $6B, $9D, $9C, $E6, $66, $31, $8A, $46 ; ROM $003BEE: B9 DB 5C EB 33 33 39 D7 6B 9D 9C E6 66 31 8A 46 + .byte $14, $48, $A2, $8C, $62, $63, $26, $66, $66, $D7, $66, $32, $64, $CC, $CF, $39 ; ROM $003BFE: 14 48 A2 8C 62 63 26 66 66 D7 66 32 64 CC CF 39 + .byte $CE, $76, $73, $AD, $6B, $39, $B3, $33, $32, $66, $4C, $C9, $98, $CA, $63, $18 ; ROM $003C0E: CE 76 73 AD 6B 39 B3 33 32 66 4C C9 98 CA 63 18 + .byte $CA, $66, $53, $33, $31, $99, $8C, $CC, $CC, $D6, $66, $B3, $33, $33, $39, $B3 ; ROM $003C1E: CA 66 53 33 31 99 8C CC CC D6 66 B3 33 33 39 B3 + .byte $99, $B3, $94, $99, $32, $66, $29, $8C, $67, $5B, $5C, $CC, $CC, $DA, $E7, $5A ; ROM $003C2E: 99 B3 94 99 32 66 29 8C 67 5B 5C CC CC DA E7 5A + .byte $CC, $D6, $66, $63, $26, $31, $26, $56, $67, $3A, $DA, $CE, $66, $66, $4C, $63 ; ROM $003C3E: CC D6 66 63 26 31 26 56 67 3A DA CE 66 66 4C 63 + .byte $18, $C6, $29, $46, $66, $33, $31, $99, $99, $CE, $73, $31, $85, $14, $CC, $D6 ; ROM $003C4E: 18 C6 29 46 66 33 31 99 99 CE 73 31 85 14 CC D6 + .byte $EB, $AE, $EB, $D7, $6D, $6B, $36, $6B, $59, $89, $44, $93, $18, $CA, $52, $91 ; ROM $003C5E: EB AE EB D7 6D 6B 36 6B 59 89 44 93 18 CA 52 91 + .byte $93, $32, $C6, $69, $9A, $CC, $D9, $9A, $CC, $D9, $99, $66, $73, $AD, $6E, $B9 ; ROM $003C6E: 93 32 C6 69 9A CC D9 9A CC D9 99 66 73 AD 6E B9 + .byte $CC, $C6, $24, $44, $44, $89, $28, $A3, $13, $33, $5B, $AE, $EE, $B5, $CE, $75 ; ROM $003C7E: CC C6 24 44 44 89 28 A3 13 33 5B AE EE B5 CE 75 + .byte $9B, $33, $8C, $CC, $B1, $8C, $CC, $66, $4C, $CA, $99, $99, $96, $66, $66, $66 ; ROM $003C8E: 9B 33 8C CC B1 8C CC 66 4C CA 99 99 96 66 66 66 + .byte $6C, $9C, $CC, $CC, $E6, $CE, $73, $32, $52, $63, $4E, $66, $B3, $B7, $5C, $CC ; ROM $003C9E: 6C 9C CC CC E6 CE 73 32 52 63 4E 66 B3 B7 5C CC + .byte $C6, $18, $A2, $52, $99, $CD, $5A, $E7, $6D, $98, $C9, $93, $26, $6B, $36, $63 ; ROM $003CAE: C6 18 A2 52 99 CD 5A E7 6D 98 C9 93 26 6B 36 63 + .byte $18, $92, $28, $8A, $66, $4C, $CA, $73, $39, $D7, $3D, $75, $B6, $73, $33, $36 ; ROM $003CBE: 18 92 28 8A 66 4C CA 73 39 D7 3D 75 B6 73 33 36 + .byte $32, $98, $CC, $66, $66, $65, $33, $32, $99, $33, $33, $33, $33, $99, $9C, $CC ; ROM $003CCE: 32 98 CC 66 66 65 33 32 99 33 33 33 33 99 9C CC + .byte $D9, $66, $D6, $CC, $C9, $8C, $A6, $66, $6B, $35, $9B, $35, $9D, $63, $32, $95 ; ROM $003CDE: D9 66 D6 CC C9 8C A6 66 6B 35 9B 35 9D 63 32 95 + .byte $33, $33, $33, $33, $32, $66, $53, $4C, $A9, $99, $99, $99, $8C, $4A, $63, $35 ; ROM $003CEE: 33 33 33 33 32 66 53 4C A9 99 99 99 8C 4A 63 35 + .byte $9B, $39, $CC, $C6, $63, $32, $66, $66, $59, $99, $9A, $73, $9D, $66, $67, $39 ; ROM $003CFE: 9B 39 CC C6 63 32 66 66 59 99 9A 73 9D 66 67 39 + .byte $CE, $73, $32, $63, $19, $99, $9B, $35, $9A, $D9, $CC, $C6, $14, $8A, $28, $C5 ; ROM $003D0E: CE 73 32 63 19 99 9B 35 9A D9 CC C6 14 8A 28 C5 + .byte $26, $33, $19, $99, $9B, $33, $59, $B3, $AC, $E6, $CE, $67, $33, $99, $B3, $39 ; ROM $003D1E: 26 33 19 99 9B 33 59 B3 AC E6 CE 67 33 99 B3 39 + .byte $99, $99, $99, $99, $94, $C5, $31, $AC, $CE, $6C, $CE, $66, $33, $19, $94, $C9 ; ROM $003D2E: 99 99 99 99 94 C5 31 AC CE 6C CE 66 33 19 94 C9 + .byte $8C, $65, $29, $8C, $C6, $66, $73, $66, $65, $25, $33, $33, $39, $AD, $D6, $D6 ; ROM $003D3E: 8C 65 29 8C C6 66 73 66 65 25 33 33 39 AD D6 D6 + .byte $B3, $59, $99, $99, $9B, $33, $33, $39, $9C, $E6, $C9, $9A, $66, $66, $26, $32 ; ROM $003D4E: B3 59 99 99 9B 33 33 39 9C E6 C9 9A 66 66 26 32 + .byte $B2, $66, $9C, $CC, $CC, $CC, $C9, $93, $29, $8C, $A6, $66, $62, $51, $84, $94 ; ROM $003D5E: B2 66 9C CC CC CC C9 93 29 8C A6 66 62 51 84 94 + .byte $A6, $66, $CE, $75, $B3, $9E, $73, $9C, $E7, $33, $99, $AC, $CB, $33, $33, $33 ; ROM $003D6E: A6 66 CE 75 B3 9E 73 9C E7 33 99 AC CB 33 33 33 + .byte $33, $33, $33, $26, $66, $59, $99, $8C, $CC, $C9, $99, $99, $99, $99, $99, $99 ; ROM $003D7E: 33 33 33 26 66 59 99 8C CC C9 99 99 99 99 99 99 + .byte $9A, $B3, $33, $33, $33, $33, $33, $66, $66, $64, $A6, $33, $33, $33, $26, $55 ; ROM $003D8E: 9A B3 33 33 33 33 33 66 66 64 A6 33 33 33 26 55 + .byte $33, $33, $9C, $E6, $B3, $9A, $AC, $CC, $C6, $66, $66, $69, $99, $99, $99, $98 ; ROM $003D9E: 33 33 9C E6 B3 9A AC CC C6 66 66 69 99 99 99 98 + .byte $CC, $C6, $63, $19, $99, $99, $4C, $CC, $CA, $99, $99, $9C, $CD, $54, $CC, $CC ; ROM $003DAE: CC C6 63 19 99 99 4C CC CA 99 99 9C CD 54 CC CC + .byte $CC, $E6, $73, $39, $AC, $E6, $66, $66, $53, $29, $99, $4C, $CC, $CC, $CE, $66 ; ROM $003DBE: CC E6 73 39 AC E6 66 66 53 29 99 4C CC CC CE 66 + .byte $73, $35, $99, $CC, $CC, $CE, $67, $33, $19, $92, $A4, $CC, $6C, $CE, $73, $59 ; ROM $003DCE: 73 35 99 CC CC CE 67 33 19 92 A4 CC 6C CE 73 59 + .byte $31, $88, $A4, $65, $33, $35, $9B, $33, $32, $6B, $33, $31, $93, $26, $B3, $36 ; ROM $003DDE: 31 88 A4 65 33 35 9B 33 32 6B 33 31 93 26 B3 36 + .byte $67, $3B, $35, $99, $98, $CC, $A6, $55, $99, $CD, $6B, $59, $CC, $CD, $4E, $66 ; ROM $003DEE: 67 3B 35 99 98 CC A6 55 99 CD 6B 59 CC CD 4E 66 + .byte $63, $31, $99, $AC, $CC, $E6, $66, $73, $33, $31, $99, $4C, $A6, $32, $99, $4C ; ROM $003DFE: 63 31 99 AC CC E6 66 73 33 31 99 4C A6 32 99 4C + .byte $99, $8C, $E5, $4C, $C9, $8C, $CC, $CD, $59, $99, $99, $99, $CC, $E6, $73, $39 ; ROM $003E0E: 99 8C E5 4C C9 8C CC CD 59 99 99 99 CC E6 73 39 + .byte $9C, $E7, $33, $99, $4C, $99, $98, $CC, $99, $33, $33, $56, $67, $33, $59, $9B ; ROM $003E1E: 9C E7 33 99 4C 99 98 CC 99 33 33 56 67 33 59 9B + .byte $31, $A9, $99, $94, $CC, $CC, $66, $66, $53, $2A, $66, $4D, $33, $35, $59, $4C ; ROM $003E2E: 31 A9 99 94 CC CC 66 66 53 2A 66 4D 33 35 59 4C + .byte $CC, $CC, $D9, $99, $9A, $67, $36, $6C, $CC, $CC, $CA, $65, $4C, $CC, $CC, $CC ; ROM $003E3E: CC CC D9 99 9A 67 36 6C CC CC CA 65 4C CC CC CC + .byte $CD, $99, $AC, $D9, $9B, $33, $39, $99, $9B, $2A, $66, $54, $CC, $C6, $67, $33 ; ROM $003E4E: CD 99 AC D9 9B 33 39 99 9B 2A 66 54 CC C6 67 33 + .byte $33, $33, $33, $19, $4C, $99, $4C, $94, $C6, $64, $CC, $66, $66, $55, $66, $35 ; ROM $003E5E: 33 33 33 19 4C 99 4C 94 C6 64 CC 66 66 55 66 35 + .byte $99, $9A, $CC, $E7, $36, $67, $35, $66, $6B, $33, $66, $73, $5A, $72, $66, $59 ; ROM $003E6E: 99 9A CC E7 36 67 35 66 6B 33 66 73 5A 72 66 59 + .byte $99, $9C, $E6, $63, $31, $8C, $C6, $33, $29, $99, $99, $54, $CC, $CC, $D9, $99 ; ROM $003E7E: 99 9C E6 63 31 8C C6 33 29 99 99 54 CC CC D9 99 + .byte $99, $99, $99, $9A, $72, $CC, $CC, $CC, $A9, $9B, $26, $63, $14, $C6, $63, $33 ; ROM $003E8E: 99 99 99 9A 72 CC CC CC A9 9B 26 63 14 C6 63 33 + .byte $33, $33, $33, $99, $9C, $D3, $33, $19, $93, $9A, $B3, $59, $99, $99, $9C, $CE ; ROM $003E9E: 33 33 33 99 9C D3 33 19 93 9A B3 59 99 99 9C CE + .byte $66, $67, $33, $59, $9C, $CC, $CE, $66, $66, $6B, $33, $29, $94, $CC, $CC, $D6 ; ROM $003EAE: 66 67 33 59 9C CC CE 66 66 6B 33 29 94 CC CC D6 + .byte $66, $66, $66, $63, $33, $19, $32, $99, $4C, $66, $32, $99, $99, $8C, $CC, $CC ; ROM $003EBE: 66 66 66 63 33 19 32 99 4C 66 32 99 99 8C CC CC + .byte $CC, $CC, $CD, $99, $AC, $E6, $CC, $CC, $AA, $CC, $E6, $6C, $CE, $67, $34, $E5 ; ROM $003ECE: CC CC CD 99 AC E6 CC CC AA CC E6 6C CE 67 34 E5 + .byte $99, $99, $99, $99, $99, $99, $93, $33, $33, $33, $26, $31, $8C, $C6, $66, $66 ; ROM $003EDE: 99 99 99 99 99 99 93 33 33 33 26 31 8C C6 66 66 + .byte $73, $33, $33, $29, $99, $99, $99, $CB, $33, $33, $33, $66, $66, $65, $29, $96 ; ROM $003EEE: 73 33 33 29 99 99 99 CB 33 33 33 66 66 65 29 96 + .byte $33, $99, $99, $9C, $CC, $E6, $66, $66, $66, $66, $66, $CC, $CC, $CC, $66, $4C ; ROM $003EFE: 33 99 99 9C CC E6 66 66 66 66 66 CC CC CC 66 4C + .byte $C9, $99, $99, $66, $66, $67, $33, $66, $66, $CC, $CC, $E6, $66, $71, $AA, $66 ; ROM $003F0E: C9 99 99 66 66 67 33 66 66 CC CC E6 66 71 AA 66 + .byte $65, $8E, $67, $33, $94, $CC, $66, $65, $99, $4C, $CC, $A6, $65, $4C, $CC, $CC ; ROM $003F1E: 65 8E 67 33 94 CC 66 65 99 4C CC A6 65 4C CC CC + .byte $CC, $98, $C6, $4C, $D3, $95, $99, $99, $9C, $CD, $59, $AC, $CD, $99, $99, $B3 ; ROM $003F2E: CC 98 C6 4C D3 95 99 99 9C CD 59 AC CD 99 99 B3 + .byte $39, $AB, $32, $66, $33, $19, $A6, $73, $2C, $CC, $CE, $66, $66, $67, $33, $33 ; ROM $003F3E: 39 AB 32 66 33 19 A6 73 2C CC CE 66 66 67 33 33 + .byte $33, $26, $53, $18, $C9, $99, $99, $B3, $33, $33, $33, $33, $33, $33, $2A, $CC ; ROM $003F4E: 33 26 53 18 C9 99 99 B3 33 33 33 33 33 33 2A CC + .byte $CC, $CC, $CC, $D9, $99, $99, $65, $35, $99, $AC, $CC, $E6, $66, $99, $99, $99 ; ROM $003F5E: CC CC CC D9 99 99 65 35 99 AC CC E6 66 99 99 99 + .byte $98, $C9, $98, $CA, $66, $66, $53, $53, $36, $55, $99, $99, $B3, $33, $33, $1A ; ROM $003F6E: 98 C9 98 CA 66 66 53 53 36 55 99 99 B3 33 33 1A + .byte $66, $66, $66, $66, $66, $6B, $35, $9B, $33, $39, $99, $B3, $59, $99, $9A, $CC ; ROM $003F7E: 66 66 66 66 66 6B 35 9B 33 39 99 B3 59 99 9A CC + .byte $A9, $CC, $66, $64, $CC, $A6, $65, $33, $26, $66, $4C, $C6, $66, $64, $CC, $CC ; ROM $003F8E: A9 CC 66 64 CC A6 65 33 26 66 4C C6 66 64 CC CC + .byte $CC, $CC, $CC, $CC, $CC, $CD, $99, $99, $99, $B3, $33, $33, $39, $99, $99, $B3 ; ROM $003F9E: CC CC CC CC CC CD 99 99 99 B3 33 33 39 99 99 B3 + .byte $33, $33, $39, $99, $9A, $66, $53, $31, $99, $99, $39, $98, $CC, $CC, $CC, $CC ; ROM $003FAE: 33 33 39 99 9A 66 53 31 99 99 39 98 CC CC CC CC + .byte $CE, $66, $67, $35, $99, $93, $32, $99, $99, $99, $9A, $CC, $CC, $CC, $CC, $CC ; ROM $003FBE: CE 66 67 35 99 93 32 99 99 99 9A CC CC CC CC CC + .byte $CC, $B1, $98, $CC, $CC, $66, $66, $66, $66, $66, $66, $66, $66, $66, $69, $A7 ; ROM $003FCE: CC B1 98 CC CC 66 66 66 66 66 66 66 66 66 69 A7 + .byte $33, $33, $33, $39, $99, $99, $CC, $CC, $D3, $54, $CC, $CB, $19, $99, $99, $99 ; ROM $003FDE: 33 33 33 39 99 99 CC CC D3 54 CC CB 19 99 99 99 + .byte $99, $99, $AB, $33, $33, $33, $33, $33, $39, $99, $00, $00, $00, $00, $00, $00 ; ROM $003FEE: 99 99 AB 33 33 33 33 33 39 99 00 00 00 00 00 00 + .byte $00, $00, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; ROM $003FFE: 00 00 FF FF FF FF FF FF FF FF FF +; Routine: IrqHandler +; Global: Reachable code entry at CPU $FFF9 traced from the interrupt-root control-flow graph. +; Local: Performs the instruction sequence below; semantic purpose remains provisional. +; Parameters: Register and memory inputs are caller-dependent. +; Returns: Determined by the terminating RTS, RTI, jump, or branch path. +; Side effects: Registers, flags, memory, and hardware registers written below. +; Confidence: High for reachability and encoding; semantic role provisional. +IrqHandler: + rti ; ROM $004009: 40 + +; Interrupt vectors at CPU $FFFA-$FFFF. +Vectors: + .word NmiHandler ; ROM $00400A: 1A C0 + .word Reset ; ROM $00400C: 00 C0 + .word IrqHandler ; ROM $00400E: F9 FF + diff --git a/Bomberman (U)/copilot/reconstructed.lbl b/Bomberman (U)/copilot/reconstructed.lbl new file mode 100644 index 0000000..eb393fb --- /dev/null +++ b/Bomberman (U)/copilot/reconstructed.lbl @@ -0,0 +1,467 @@ +al 000000 .InesHeader +al 00FFFA .Vectors +al 00FFF9 .IrqHandler +al 00E7DE .SoundSequenceAndPaddingData +al 00E7D0 .Sound_ReturnToCaller_E7D0 +al 00E7D1 .Sound_HandleControl_E7D1 +al 00E79F .Sound_UpdateAudioChannelPath_E79F +al 00E793 .Sound_WriteSoundEnvelopeCounter_E793 +al 00E767 .Sound_UpdateAudioChannelPath_E767 +al 00E763 .SoundHandlerData +al 00E743 .Sound_UpdateAudioChannelPath_E743 +al 00E760 .Sound_DecrementSoundEnvelopeCounter_E760 +al 00E734 .Sound_ReadSoundEnvelopeCounter_E734 +al 00E728 .Sound_WriteSoundDelay1_E728 +al 00E727 .Sound_ReturnToCaller_E727 +al 00E70B .Sound_UpdateAudioChannelPath_E70B +al 00E6DF .Sound_UpdateAudioChannelPath_E6DF +al 00E6CD .Sound_HandleControl_E6CD +al 00E6CF .Sound_UpdateAudioChannelPath_E6CF +al 00E6C9 .ConfigureNoiseEffect +al 00E6AD .SoundDispatchAddressTable +al 00E681 .Sound_WriteSoundCommandState_E681 +al 00E6AC .Sound_ReturnToCaller_E6AC +al 00E69C .Sound_ReadRamE6BC_E69C +al 00E667 .Sound_ReadSoundCommandState_E667 +al 00E661 .Sound_ReadSoundDelay0_E661 +al 00E5E6 .GameplayAndSoundDataTables +al 00E5D6 .Gameplay_SubtractFromSoundTempo_E5D6 +al 00E5B4 .Gameplay_UpdateAudioChannelPath_E5B4 +al 00E5AB .Gameplay_UpdateAudioChannelPath_E5AB +al 00E5A1 .Gameplay_UpdateAudioChannelPath_E5A1 +al 00E593 .Gameplay_HandleControl_E593 +al 00E59D .Gameplay_ReadZpD6_E59D +al 00E5C6 .Gameplay_ReturnToCaller_E5C6 +al 00E57B .Gameplay_ReadSoundDelay0_E57B +al 00E573 .Gameplay_WriteZpD6_E573 +al 00E56E .Gameplay_HandleControl_E56E +al 00E5C7 .Gameplay_ReadSoundTempo_E5C7 +al 00E54E .Gameplay_ReadSoundChannelIndex_E54E +al 00E534 .Gameplay_DecrementSoundChannelIndex_E534 +al 00E539 .Gameplay_ReadZpBC_E539 +al 00E52E .Gameplay_ReadSoundChannelIndex_E52E +al 00E4E5 .Gameplay_ReadRamE87C_E4E5 +al 00E52A .Gameplay_WriteSoundChannelIndex_E52A +al 00E4C6 .Gameplay_ReturnToCaller_E4C6 +al 00E4C2 .Gameplay_WriteGameMode_E4C2 +al 00E4BC .GameplayPowerupMaskTable +al 00E4B9 .Gameplay_WriteStageIndex_E4B9 +al 00E4A8 .Gameplay_ReadBonusTimer_E4A8 +al 00E450 .Gameplay_ReadPlayerState_E450 +al 00E467 .Gameplay_ReturnToCaller_E467 +al 00E498 .Gameplay_ReadPlayerLives_E498 +al 00E48D .Gameplay_ReadBombCapacity_E48D +al 00E486 .Gameplay_ReadFlamePass_E486 +al 00E47D .Gameplay_ReadStageProgress_E47D +al 00E468 .Gameplay_ReadStageProgress_E468 +al 00E448 .Gameplay_ReadPlayerLives_E448 +al 00E434 .Gameplay_ReadStageIndex_E434 +al 00E410 .Gameplay_IncrementWallPass_E410 +al 00E416 .Gameplay_ReadObjectType_E416 +al 00E3F8 .Gameplay_IncrementRemoteControl_E3F8 +al 00E401 .Gameplay_ReadObjectState_E401 +al 00E3E2 .Gameplay_WritePlayerState_E3E2 +al 00E3DF .Gameplay_CallHelper_E3DF +al 00E3E6 .Gameplay_ReturnToCaller_E3E6 +al 00E3BD .Gameplay_ReadZpAA_E3BD +al 00E3E7 .Gameplay_ReadObjectType_E3E7 +al 00E3A7 .Gameplay_ReadPlayerState_E3A7 +al 00E398 .Gameplay_ReturnToCaller_E398 +al 00E360 .GameplayScoreThresholdTable +al 00E344 .Gameplay_ReadTransferPointer_E344 +al 00E32B .Gameplay_TransferVramDataPath_E32B +al 00E30A .Gameplay_ReadTransferPointer_E30A +al 00E33C .Gameplay_WriteWorkValue_E33C +al 00E2DB .Gameplay_ReadObjectWorkX_E2DB +al 00E1E5 .TitleAndCopyrightText +al 00E1DC .Gameplay_RetreatIndexX_E1DC +al 00E1D0 .Gameplay_TransferVramDataPath_E1D0 +al 00E1E0 .Gameplay_ReadRamE1E5_E1E0 +al 00E1C4 .Gameplay_SetVramAddressPath_E1C4 +al 00DF8C .MenuPaletteAndScreenData +al 00DF83 .Menu_TransferVramDataPath_DF83 +al 00DF7C .Menu_HandleControl_DF7C +al 00DF6F .Menu_TransferVramDataPath_DF6F +al 00DF67 .Menu_HandleControl_DF67 +al 00DF60 .Menu_HandleControl_DF60 +al 00DF76 .Menu_TransferVramDataPath_DF76 +al 00DF52 .Menu_TransferVramDataPath_DF52 +al 00DF4B .Menu_HandleControl_DF4B +al 00DF37 .Menu_TransferVramDataPath_DF37 +al 00DF18 .Menu_TransferVramDataPath_DF18 +al 00DF0E .Menu_TransferVramDataPath_DF0E +al 00DF04 .Menu_TransferVramDataPath_DF04 +al 00DEF1 .Menu_TransferVramDataPath_DEF1 +al 00DEE4 .Menu_TransferVramDataPath_DEE4 +al 00DED4 .Menu_TransferVramDataPath_DED4 +al 00DEC2 .Menu_TransferVramDataPath_DEC2 +al 00DEB9 .Menu_TransferVramDataPath_DEB9 +al 00DEB1 .Menu_TransferVramDataPath_DEB1 +al 00E1C0 .RenderEncodedTextRecords +al 00DE95 .Menu_TransferVramDataPath_DE95 +al 00DE78 .StatusScreenPaletteAddressTable +al 00DE69 .Menu_TransferVramDataPath_DE69 +al 00DE4E .StatusScreenValueAddressTable +al 00DE33 .Menu_TransferVramDataPath_DE33 +al 00DE15 .StatusScreenTextPointerTable +al 00DF5D .Menu_HandleControl_DF5D +al 00DE07 .Menu_TransferVramDataPath_DE07 +al 00DDE1 .Menu_TransferVramDataPath_DDE1 +al 00DDD2 .Menu_TransferVramDataPath_DDD2 +al 00DDBB .Menu_ReadZp61_DDBB +al 00DDB9 .Menu_HandleControl_DDB9 +al 00DDAC .Menu_ReadZp61_DDAC +al 00DDAA .Menu_HandleControl_DDAA +al 00DD9E .Menu_WriteZp61_DD9E +al 00DD92 .Menu_WriteZp61_DD92 +al 00DD77 .Menu_WriteObjectWorkX_DD77 +al 00DD8D .Menu_AddToZp61_DD8D +al 00DDC2 .Menu_ReadObjectWorkX_DDC2 +al 00DD6B .Menu_WriteObjectWorkX_DD6B +al 00DD62 .StatusDigitTileTable +al 00E2BD .Gameplay_ReadObjectMode_E2BD +al 00DD50 .Menu_TransferVramDataPath_DD50 +al 00DD22 .StatusScreenAddressTable +al 00DD15 .Menu_TransferVramDataPath_DD15 +al 00DC53 .MenuScreenConstructionData +al 00DC52 .Menu_ReturnToCaller_DC52 +al 00DC44 .Menu_TransferVramDataPath_DC44 +al 00DC26 .Menu_IncrementWorkIndex_DC26 +al 00DC39 .Menu_ReadRamDC53_DC39 +al 00DD04 .Menu_SaveAccumulator_DD04 +al 00E353 .Gameplay_ReadRamE360_E353 +al 00DBD3 .Menu_ReadRam007F_DBD3 +al 00DBCF .Menu_HandleControl_DBCF +al 00DBC0 .Menu_AddToZp8D_DBC0 +al 00DBCC .Menu_Dispatch_DBCC +al 00DB99 .Menu_AddToZp7F_DB99 +al 00DB95 .Menu_HandleControl_DB95 +al 00DB7E .Menu_ReadZp7F_DB7E +al 00DB7A .Menu_HandleControl_DB7A +al 00DB40 .Menu_Dispatch_DB40 +al 00DB3D .Menu_CallHelper_DB3D +al 00DB39 .Menu_WriteWorkValue_DB39 +al 00DB2E .Menu_ReadWorkValue_DB2E +al 00DB1E .Menu_CallHelper_DB1E +al 00DB1A .Menu_WriteWorkValue_DB1A +al 00DB0F .Menu_ReadWorkValue_DB0F +al 00DB24 .Menu_ReadWorkValue_DB24 +al 00DB43 .Menu_TransferVramDataPath_DB43 +al 00DAE9 .Menu_CallHelper_DAE9 +al 00DAF8 .Menu_UpdateAudioChannelPath_DAF8 +al 00DAC9 .Menu_TransferVramDataPath_DAC9 +al 00DAB5 .Menu_TransferVramDataPath_DAB5 +al 00DC41 .Menu_CallHelper_DC41 +al 00DF27 .UploadMenuPalette +al 00D994 .StageLayoutPointerData +al 00D993 .Stage_ReturnToCaller_D993 +al 00D984 .Stage_RotateLeftZp19_D984 +al 00D974 .Stage_ShiftLeftZp1E_D974 +al 00D97C .Stage_WriteZp19_D97C +al 00D93A .Stage_WriteZp17_D93A +al 00D912 .Stage_ReadZp17_D912 +al 00D901 .Stage_ReadZp14_D901 +al 00D708 .GameplayParameterTables +al 00D6E2 .Stage_ReadObjectWorkX_D6E2 +al 00D703 .Stage_AdvanceIndexY_D703 +al 00D6BE .Stage_ReadZp97_D6BE +al 00D6AC .Stage_WriteZp97_D6AC +al 00D6A8 .Stage_HandleControl_D6A8 +al 00D697 .Stage_ToggleRandomState3_D697 +al 00D629 .Stage_ReadZp3F_D629 +al 00D631 .Stage_ReadPositionHi_D631 +al 00D622 .Stage_IncrementZp3E_D622 +al 00D611 .Stage_ReadZp3D_D611 +al 00D207 .ObjectAndStageLookupTables +al 00D124 .ObjectMovementParameterTable +al 00D123 .Object_ReturnToCaller_D123 +al 00D11C .Object_AdvanceIndexX_D11C +al 00D0FA .Object_ReadRamD121_D0FA +al 00D0E3 .Object_WriteObjectWorkX_D0E3 +al 00D0F7 .Object_RestoreAccumulator_D0F7 +al 00D08B .Object_ReturnToCaller_D08B +al 00D08C .Object_WriteZp3D_D08C +al 00D010 .Object_WriteZp3D_D010 +al 00CFED .Object_ReadStageIndex_CFED +al 00CFEC .Object_ReturnToCaller_CFEC +al 00CFE3 .ObjectPositionLimitTable +al 00D1C8 .Object_WriteZp4D_D1C8 +al 00CFCF .Object_ReadRamD245_CFCF +al 00CFC5 .Object_ReadRam05B2_CFC5 +al 00CFE9 .Object_RetreatIndexX_CFE9 +al 00CFBA .Object_ReadRam0576_CFBA +al 00CFAF .Object_ReturnToCaller_CFAF +al 00CFA9 .Object_IncrementZpAC_CFA9 +al 00CFA3 .Object_ReturnToCaller_CFA3 +al 00CFA4 .Object_MergeZp13_CFA4 +al 00CF82 .Object_ReadObjectDirection_CF82 +al 00CF7D .Object_ReadObjectPhase_CF7D +al 00CF7C .Object_ReturnToCaller_CF7C +al 00CF25 .Object_WriteGameMode_CF25 +al 00CF15 .Object_WriteGameMode_CF15 +al 00CF57 .Object_WriteObjectCounter_CF57 +al 00CF4E .Object_WriteObjectSpeed_CF4E +al 00CF45 .Object_WriteObjectDirection_CF45 +al 00CF3C .Object_WriteObjectSubtype_CF3C +al 00CF33 .Object_WriteObjectPhase_CF33 +al 00CF2A .Object_WriteObjectFlags_CF2A +al 00CF1A .Object_ReadObjectMode_CF1A +al 00CF0D .Object_ReadObjectTimer_CF0D +al 00DD83 .Menu_WriteObjectWorkX_DD83 +al 00CED2 .FrameObjectOffsetTable +al 00D5F2 .Stage_WriteZp3F_D5F2 +al 00CE80 .Frame_WriteZp0E_CE80 +al 00CE5A .Frame_ReturnToCaller_CE5A +al 00CE56 .Frame_WriteSoundCommandState_CE56 +al 00CE54 .Frame_HandleControl_CE54 +al 00CE4A .Frame_WriteObjectIndex_CE4A +al 00CE45 .Frame_TestObjectIndex_CE45 +al 00CE59 .Frame_RestoreAccumulator_CE59 +al 00CE2D .Frame_ReturnToCaller_CE2D +al 00CE2A .Frame_IncrementObjectY_CE2A +al 00CE1E .Frame_ReturnToCaller_CE1E +al 00CE1B .Frame_IncrementObjectX_CE1B +al 00CE0F .FrameSingleByteConstant +al 00CE04 .Frame_HandleControl_CE04 +al 00CDDF .Frame_ReadObjectState_CDDF +al 00CE06 .Frame_WriteZp2D_CE06 +al 00CDCF .Frame_HandleControl_CDCF +al 00CDAE .Frame_ReadObjectState_CDAE +al 00CD9C .Frame_HandleControl_CD9C +al 00CD7B .Frame_ReadObjectState_CD7B +al 00CE2E .Frame_ReadZp33_CE2E +al 00CF60 .Object_ReadTransferPointer_CF60 +al 00CD69 .Frame_HandleControl_CD69 +al 00CD44 .Frame_ReadObjectState_CD44 +al 00CD12 .Frame_WriteTransferPointer_CD12 +al 00CD09 .Frame_ReadRam03A0_CD09 +al 00CE1F .Frame_ReadObjectY_CE1F +al 00CE10 .Frame_ReadObjectX_CE10 +al 00CCEE .Frame_ReturnToCaller_CCEE +al 00CCEF .Frame_ReadObjectState_CCEF +al 00CD39 .Frame_ReadObjectY_CD39 +al 00CCD7 .Frame_ReadObjectSubtype_CCD7 +al 00CD70 .Frame_ReadObjectY_CD70 +al 00CCCF .Frame_CopyXToA_CCCF +al 00CDA3 .Frame_ReadObjectX_CDA3 +al 00CCC7 .Frame_CopyXToA_CCC7 +al 00CCBF .Frame_CopyXToA_CCBF +al 00CCB7 .Frame_CopyAToX_CCB7 +al 00CF87 .Object_ReadGameState_CF87 +al 00CCAE .Frame_WriteInvincibilityTimer_CCAE +al 00CCA3 .Frame_ReturnToCaller_CCA3 +al 00CEE9 .Frame_WriteSoundCommandState_CEE9 +al 00CC95 .Frame_IncrementBombCapacity_CC95 +al 00CCA4 .Frame_ReadObjectFlags_CCA4 +al 00CC62 .Frame_ReturnToCaller_CC62 +al 00CC63 .Frame_ReadObjectX_CC63 +al 00CC4C .Frame_ReadZp5C_CC4C +al 00CC04 .FrameAnimationSequenceTable +al 00CBEA .Gameplay_ReturnToCaller_CBEA +al 00CBE2 .Gameplay_RetreatIndexY_CBE2 +al 00CBDB .Gameplay_WriteRam0576_CBDB +al 00CBD1 .Gameplay_WriteRam03E6_CBD1 +al 00CBC9 .Gameplay_WriteRam03A0_CBC9 +al 00CB65 .Gameplay_TransferVramData_CB65 +al 00CB55 .Gameplay_ReadZp17_CB55 +al 00D924 .Stage_WriteZp1A_D924 +al 00DDC7 .Menu_HandleControl_DDC7 +al 00CB38 .Gameplay_IncrementWorkIndex_CB38 +al 00CB4E .Gameplay_WriteObjectWorkY_CB4E +al 00CB2E .Gameplay_HandleControl_CB2E +al 00CB30 .Gameplay_IncrementZp27_CB30 +al 00CB24 .Gameplay_ReadDataPointer_CB24 +al 00CB1B .Gameplay_ReadZp94_CB1B +al 00CB17 .Gameplay_WriteWorkIndex_CB17 +al 00CB05 .Gameplay_ReturnToCaller_CB05 +al 00CADA .Gameplay_WriteObjectWorkY_CADA +al 00CAC9 .Gameplay_DecrementObjectWorkX_CAC9 +al 00CABE .Gameplay_ReadRamE243_CABE +al 00CABA .Gameplay_WriteObjectWorkX_CABA +al 00CA66 .Gameplay_WriteTransferPointer_CA66 +al 00CA47 .GameplayObjectAttributeTable +al 00CA43 .Gameplay_RetreatIndexX_CA43 +al 00CA1D .Gameplay_ReadRam03A0_CA1D +al 00CA11 .GameplayObjectClassTable +al 00CA10 .Gameplay_ReturnToCaller_CA10 +al 00C9DE .GameplayDirectionDeltaTable +al 00C9E3 .Gameplay_TestZp2E_C9E3 +al 00C9B5 .Gameplay_ReturnToCaller_C9B5 +al 00C9A6 .Gameplay_WriteTransferPointer_C9A6 +al 00C999 .Gameplay_ReadFlamePass_C999 +al 00C9B2 .Gameplay_RetreatIndexX_C9B2 +al 00C96C .Gameplay_ReadRam03A0_C96C +al 00CBF6 .Gameplay_WriteDisplayMode_CBF6 +al 00C9B6 .Gameplay_WriteZp2F_C9B6 +al 00C966 .Gameplay_RetreatIndexX_C966 +al 00C93B .Gameplay_ReadRam03A0_C93B +al 00C939 .Gameplay_HandleControl_C939 +al 00CACF .Gameplay_WriteObjectWorkX_CACF +al 00C935 .Gameplay_RetreatIndexY_C935 +al 00C8EF .Gameplay_ReadRam0576_C8EF +al 00C8E9 .Gameplay_RetreatIndexY_C8E9 +al 00C8AF .Gameplay_ReadRam0576_C8AF +al 00C8AC .Gameplay_ReturnToCaller_C8AC +al 00C8A1 .Gameplay_WriteRam04D6_C8A1 +al 00C89E .Gameplay_WriteRam04D6_C89E +al 00CBE5 .Gameplay_ReadRam03E6_CBE5 +al 00C835 .Gameplay_Dispatch_C835 +al 00C8AD .Gameplay_HandleControl_C8AD +al 00C828 .Gameplay_IncrementBonusTimer_C828 +al 00C815 .Gameplay_ReadWorkIndex_C815 +al 00C800 .Gameplay_ReadWorkIndex_C800 +al 00C830 .Gameplay_WriteRam03E6_C830 +al 00C7EE .Gameplay_ReadWorkIndex_C7EE +al 00C7DE .Gameplay_ReadRam04D6_C7DE +al 00C838 .Gameplay_ReadRam0526_C838 +al 00C7CB .Gameplay_ReadTransferPointer_C7CB +al 00CBEB .Gameplay_ReadRamE2A3_CBEB +al 00C8A6 .Gameplay_RetreatIndexX_C8A6 +al 00C7A4 .Gameplay_Dispatch_C7A4 +al 00C7A7 .Gameplay_ReadRam0486_C7A7 +al 00C79F .Gameplay_ReadRam03E6_C79F +al 00C75D .MainStateDispatchTable +al 00C75C .Main_ReturnToCaller_C75C +al 00C74E .Main_RetreatIndexY_C74E +al 00C707 .Main_ReadRam0576_C707 +al 00C705 .Main_HandleControl_C705 +al 00D8FC .Stage_WriteObjectWorkX_D8FC +al 00C753 .Main_CallHelper_C753 +al 00C756 .Main_RetreatIndexX_C756 +al 00C6D6 .Main_ReadRamC764_C6D6 +al 00C6D0 .Main_ReadRam0526_C6D0 +al 00C6B2 .Main_WriteZp32_C6B2 +al 00C6DA .Main_ReadZp5C_C6DA +al 00C688 .Main_ReadRam0436_C688 +al 00C6CD .Main_Dispatch_C6CD +al 00C66E .Main_ReadRam03E6_C66E +al 00CBD7 .Gameplay_HandleControl_CBD7 +al 00C65E .Main_ReturnToCaller_C65E +al 00C62F .Main_WriteSoundCommandState_C62F +al 00C643 .Main_ReturnToCaller_C643 +al 00C610 .Main_Dispatch_C610 +al 00CB06 .Gameplay_WriteWorkValue_CB06 +al 00D69A .Stage_ReadZp58_D69A +al 00C5C3 .Main_WriteZp58_C5C3 +al 00C5BF .Main_ReadGameMode_C5BF +al 00CEA7 .Frame_ReadZp2D_CEA7 +al 00C5AA .Main_WriteStageCounter_C5AA +al 00CDD4 .Frame_ReadObjectX_CDD4 +al 00C5A4 .Main_ReadObjectType_C5A4 +al 00C58F .Main_WriteStageCounter_C58F +al 00DBF9 .Menu_WriteWorkValue_DBF9 +al 00C65F .Main_ReadZp33_C65F +al 00C8ED .Gameplay_HandleControl_C8ED +al 00C55C .Main_WriteGameMode_C55C +al 00C52E .Main_ReadZp93_C52E +al 00CBC5 .Gameplay_HandleControl_CBC5 +al 00CA72 .Gameplay_WriteTransferPointer_CA72 +al 00DE53 .Menu_WriteZp0E_DE53 +al 00C503 .Main_WriteNmiWorkPending_C503 +al 00C4F8 .Main_WriteZp7E_C4F8 +al 00C56C .Main_WriteObjectX_C56C +al 00C4EB .Main_AdvanceIndexY_C4EB +al 00C4D2 .Main_Dispatch_C4D2 +al 00C4D5 .Main_WriteGameMode_C4D5 +al 00C4B8 .Main_HandleControl_C4B8 +al 00C4B4 .Main_WriteGameMode_C4B4 +al 00C4AA .Main_ReadGameMode_C4AA +al 00DD3E .Menu_CallHelper_DD3E +al 00C49F .Main_WriteNmiWorkPending_C49F +al 00C4C3 .Main_WriteGameMode_C4C3 +al 00C66C .Main_HandleControl_C66C +al 00C79D .GameplayUpdate +al 00C4BF .Main_ReadGameState_C4BF +al 00C481 .Main_ReadGameState_C481 +al 00E399 .Gameplay_ReadStageProgress_E399 +al 00C644 .Main_ReadZp33_C644 +al 00CA1B .Gameplay_HandleControl_CA1B +al 00CFB0 .Object_WriteStageProgress_CFB0 +al 00CE5B .Frame_ReadObjectIndex_CE5B +al 00C96A .Gameplay_HandleControl_C96A +al 00CC36 .Frame_ReadZp7D_CC36 +al 00C613 .Main_WriteStageCounter_C613 +al 00C44F .Main_ReadZp5D_C44F +al 00C5FF .Main_CallHelper_C5FF +al 00E4AF .Gameplay_ReadZp58_E4AF +al 00C5CE .Main_WriteObjectType_C5CE +al 00CA4B .Gameplay_WriteTransferPointer_CA4B +al 00C60B .Main_ReadGameMode_C60B +al 00DE1D .Menu_WriteZp0E_DE1D +al 00C410 .Main_WriteZpB1_C410 +al 00C3C2 .Main_WriteZp61_C3C2 +al 00C3C7 .Main_UpdateAudioChannelPath_C3C7 +al 00C40A .Main_WriteObjectDirection_C40A +al 00C3B6 .Main_WriteZp58_C3B6 +al 00DA8E .RunMenuSelectionScreen +al 00C3A3 .Main_WriteScreenState_C3A3 +al 00D670 .AdvanceRandomState +al 00C38B .Main_DecrementSubDelay_C38B +al 00C398 .Main_ReadGameState_C398 +al 00CBFB .WaitForNmiFrameHandoff +al 00C370 .Main_ReadOptionState_C370 +al 00C36C .Main_WriteMainDelay_C36C +al 00C368 .MainGameLoop +al 00DE83 .ComposeStatusScreen +al 00C34A .Main_UpdateAudioChannelPath_C34A +al 00E642 .InitializeApu +al 00C33C .Main_WriteZpDB_C33C +al 00C333 .Main_WriteZp00_C333 +al 00C317 .Main_WriteSoundDispatchIndex_C317 +al 00C307 .WaitForFrameBoundary +al 00C2E7 .SystemPaletteData +al 00C2D6 .Ppu_SetVramAddress_C2D6 +al 00C2CC .Ppu_TransferVramDataPath_C2CC +al 00C2BD .Ppu_UpdatePpuStatePath_C2BD +al 00C290 .Ppu_WaitPpuStatusPath_C290 +al 00C26C .Ppu_WriteRam0700_C26C +al 00C262 .Ppu_HandleControl_C262 +al 00C25F .Ppu_HandleControl_C25F +al 00C2B0 .EnableNmiInPpuControl +al 00C24C .Ppu_TransferSpriteDmaAndReturnA_C24C +al 00C25C .Ppu_UpdatePpuState_C25C +al 00C23B .Ppu_CallHelper_C23B +al 00C234 .Ppu_TransferVramDataPath_C234 +al 00C220 .Ppu_TransferVramDataPath_C220 +al 00C215 .Ppu_HandleControl_C215 +al 00C2C3 .UploadSystemPalette +al 00C28B .WaitForVBlankTransition +al 00C268 .HideAllSprites +al 00C2B9 .Ppu_HandleControl_C2B9 +al 00C257 .DisableRendering +al 00C1F2 .InitializeVideoSystem +al 00C1F0 .Ppu_RetreatIndexY_C1F0 +al 00C1DD .Ppu_ReadControllerPath_C1DD +al 00C1EB .Ppu_HandleControl_C1EB +al 00C1CC .Ppu_ReadControllerPath_C1CC +al 00C1B8 .Ppu_WriteZp13_C1B8 +al 00C1BF .Ppu_ReadControllerAndReturnA_C1BF +al 00C179 .Nmi_ReadPpuStatusPath_C179 +al 00C172 .Nmi_ReadPpuStatusPath_C172 +al 00C18A .Nmi_ToggleZpDB_C18A +al 00C16E .Nmi_ReadNmiWorkPending_C16E +al 00E65F .SoundUpdate +al 00E4C7 .Gameplay_ReadZpB2_E4C7 +al 00C19D .Ppu_WriteZp10_C19D +al 00C13E .Nmi_UpdateAudioChannelPath_C13E +al 00C296 .CommitPpuStateAndScroll +al 00DF48 .Menu_HandleControl_DF48 +al 00C123 .Nmi_CallHelper_C123 +al 00C114 .Nmi_ReadZp93_C114 +al 00C107 .Nmi_TransferVramDataPath_C107 +al 00C0F7 .Nmi_TransferVramDataPath_C0F7 +al 00C126 .Nmi_ReadPpuStatusPath_C126 +al 00C0DE .Nmi_TransferVramDataPath_C0DE +al 00C0CC .Nmi_TransferVramDataPath_C0CC +al 00C196 .SetPpuAddress +al 00C0E4 .Nmi_ReadNmiWorkPending_C0E4 +al 00C0B9 .Nmi_ReadScreenState_C0B9 +al 00C049 .Nmi_TransferVramDataPath_C049 +al 00C0B3 .Nmi_ReadZp14_C0B3 +al 00C03E .Nmi_TransferSpriteDmaPath_C03E +al 00C01A .NmiHandler +al 00C30C .InitializeSystemAndRunMainLoop +al 00C012 .WaitForSecondStartupVBlank +al 00C00D .WaitForFirstStartupVBlank +al 00C000 .Reset +al 004010 .PatternTableGraphics diff --git a/Bomberman (U)/copilot/reconstructed.map b/Bomberman (U)/copilot/reconstructed.map new file mode 100644 index 0000000..83f1965 --- /dev/null +++ b/Bomberman (U)/copilot/reconstructed.map @@ -0,0 +1,32 @@ +Modules list: +------------- +header.o: + HEADER Offs=000000 Size=000010 Align=00001 Fill=0000 +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 +chr.o: + CHR Offs=000000 Size=002000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +HEADER 000000 00000F 000010 00001 +PRG 000010 00400F 004000 00001 +CHR 004010 00600F 002000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/Bomberman (U)/copilot/reconstructed.nes b/Bomberman (U)/copilot/reconstructed.nes new file mode 100644 index 0000000000000000000000000000000000000000..b7e9d48522570288b5d737fd9598d1f48f5da8a1 GIT binary patch literal 24592 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 U_`G`ejeb5Cwg2BKb8wmd3BeZv4gdfE literal 0 HcmV?d00001 diff --git a/Burger Time (U)/copilot/chr.o b/Burger Time (U)/copilot/chr.o new file mode 100644 index 0000000000000000000000000000000000000000..5f8733735c5896c55004472442a1594f10d223a3 GIT binary patch literal 12596 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 literal 0 HcmV?d00001 diff --git a/Burger Time (U)/copilot/chr.s b/Burger Time (U)/copilot/chr.s index 91abab3..f6a8c21 100644 --- a/Burger Time (U)/copilot/chr.s +++ b/Burger Time (U)/copilot/chr.s @@ -1,2 +1,2 @@ .segment "CHR" - .incbin "burger_time.nes", $4010, $2000 + .incbin "chr.bin" \ No newline at end of file diff --git a/Burger Time (U)/copilot/header.bin b/Burger Time (U)/copilot/header.bin new file mode 100644 index 0000000000000000000000000000000000000000..aee36c438eb06284501f97c9f7247d5d3193af17 GIT binary patch literal 16 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 literal 0 HcmV?d00001 diff --git a/Burger Time (U)/copilot/rom.nes b/Burger Time (U)/copilot/rom.nes new file mode 120000 index 0000000..7576474 --- /dev/null +++ b/Burger Time (U)/copilot/rom.nes @@ -0,0 +1 @@ +../Burger Time (U) [!].nes \ No newline at end of file diff --git a/Defender 2 (U)/OVERVIEW.md b/Defender 2 (U)/OVERVIEW.md new file mode 100644 index 0000000..d2ee5c2 --- /dev/null +++ b/Defender 2 (U)/OVERVIEW.md @@ -0,0 +1,254 @@ +# Defender 2 (U) — Game Flow from Power-On + +This document describes the execution flow of the disassembled Defender 2 (U) PRG bank (16 KB, mapped at CPU **$C000–$FFFF**), starting from power-on. It is based entirely on `copilot/prg.s` in the repository. The rebuild is verified **byte-identical** to the original `defender2.nes`. + +--- + +## 1. ROM and Memory Layout + +| Property | Value | +|----------|-------| +| Format | iNES / NES 2.0 | +| PRG | 1 × 16 KB (mapped at CPU $C000–$FFFF) | +| CHR | 1 × 8 KB | +| Mirroring | Vertical | +| PRG bank start | CPU $C000 | +| Source file | `copilot/prg.s` (11,905 lines) | +| Output | `defender2_rebuilt.nes` (24,592 bytes) | + +### Interrupt vectors (CPU $FFFA–$FFFF) + +| Vector | Address | Handler | +|--------|---------|---------| +| NMI | $CAA1 | `NmiHandler` | +| RESET | $C983 | `ResetHandler` | +| IRQ / BRK | $CA9E | `IrqHandler` (self-loop `jmp $CA9E` — unused) | + +--- + +## 2. Build Status + +`make` in `copilot/` assembles `header.s`, `prg.s`, and `chr.s` with `ca65`, links with `ld65`, and verifies against `defender2.nes`. + +**Verification result: BYTE-IDENTICAL** — `defender2_rebuilt.nes` matches `defender2.nes` exactly (headers, CHR, and all PRG bytes). + +### Build fix applied + +The original source referenced `LookupTableEntry_FAF5` at a `bpl` instruction (CPU $FAB4), but the symbol was undefined. The branch target CPU $FAF5 falls in the middle of what the disassembler classified as `lda #$16` (A9 at $FAF4, 16 at $FAF5). The fix: + +- Replaced the symbolic `bpl LookupTableEntry_FAF5` with `bne *-$1B` at CPU $E811, which produces the exact original bytes `d0 e3` (the disassembler had mislabeled `bne` as `bpl`). +- The build now produces a byte-identical ROM. + +--- + +## 3. Reset — CPU $FFFC → $C983 + +**`ResetHandler`** ($C983) + +On power-on or reset: + +1. `sei` — disable maskable interrupts. +2. `cld` — clear decimal mode. +3. `lda #$00 / sta PPUCTRL` — disable PPU rendering and NMI. +4. `dex / txs` — initialize stack pointer to $FF. +5. `UpdateSideScrollingGameplay_C98C` ($C98C): wait for VBlank (poll `PPUSTATUS` bit 7), then clear a block of PPU memory via `ConfigureHudAndPlayfieldPpu_C99D` ($C99D) using zero-page pointers $00/$01 and counter $01. +6. Set PPUCTRL = $00, `PpuControlShadow` ($10) = $00, PPUMASK = $02, `PpuMaskShadow` ($11) = $02. +7. Set scroll registers: `PPUSCROLL` = $00 twice, `HorizontalScroll` ($12) = $00, `VerticalScroll` ($13) = $00. +8. Configure HUD and playfield PPU regions via repeated calls to `ConfigureHudAndPlayfieldPpu_C092` ($C092) with various source/destination parameters — uploads background tiles, HUD elements, and playfield data. +9. Initialize game RAM variables: `Ram_03FB` = $80, `Ram_06AB` = $90, `Ram_06CB` = $94, `Ram_06EB` = $98, `Ram_05C0` = $03, `Ram_0580` = $04, `Ram_060B` = $68, `Ram_064B` = $70. +10. `Zp_1D` ($1D) = $55; `SND_CHN` ($4015) = $0F (enable all APU channels); `Ram_0100` = $0F; `Zp_36` ($36) = $01. +11. Enable NMI: `PpuControlShadow` ($10) \| $80, store to shadow and PPUCTRL. +12. Falls into `UpdateSideScrollingGameplay_CA6A` ($CA6A) — the permanent main loop. + +--- + +## 4. Main Loop — `UpdateSideScrollingGameplay_CA6A` ($CA6A) + +Once NMI is enabled, `ResetHandler` never returns. It enters the main loop: + +``` +UpdateSideScrollingGameplay_CA6A ($CA6A): + jsr UpdateSideScrollingGameplay_C40D ; $CA6A: 20 0D C4 + lda Zp_A2 ; $CA6D: A5 A2 + beq UpdateSideScrollingGameplay_CA6A ; $CA6F: F0 F9 (spin while Zp_A2 == 0) + dec Zp_A2 ; $CA71: C6 A2 + jsr UpdateSideScrollingGameplay_E47A ; $CA73: 20 7A E4 + jsr UpdateSideScrollingGameplay_DC7B ; $CA76: 20 7B DC + jsr UpdateSideScrollingGameplay_E6E1 ; $CA79: 20 E1 E6 + jsr UpdateSideScrollingGameplay_D91A ; $CA7C: 20 1A D9 + jsr UpdateSideScrollingGameplay_E6D5 ; $CA7F: 20 D5 E6 + jsr UpdateSideScrollingGameplay_E7AA ; $CA82: 20 AA E7 + jsr UpdateSideScrollingGameplay_E029 ; $CA85: 20 29 E0 + jsr UpdateSideScrollingGameplay_DE78 ; $CA88: 20 78 DE + jmp UpdateSideScrollingGameplay_CA6A ; $CA8B: 4C 6A CA (loop forever) +``` + +The main loop spins waiting for `Zp_A2` ($A2) to become nonzero (set by the NMI), then decrements it and calls a chain of per-frame update routines covering flying entities, object updates, collisions, scrolling, and rendering. It then loops back to itself. + +--- + +## 5. NMI / Frame Heartbeat — `NmiHandler` ($CAA1) + +The NMI fires once per frame and is the central real-time driver: + +1. **Save registers** (A, X, Y on stack). +2. `ldx #$00` — X = 0 for buffer copy loop. +3. `ConfigureHudAndPlayfieldPpu_CAA8` ($CAA8): copy 16 bytes from zero-page pointer $00,X into PPU registers (PPU command buffer upload), toggling `PpuControlShadow` bit 7. +4. `jsr ConfigureHudAndPlayfieldPpu_D2CF` ($CAB9) — additional PPU configuration. +5. `jsr TransferShipTargetOamBuffer` ($CABC) — OAM DMA: write $00 to OAMADDR ($2003), then $02 to OAMDMA ($4014). +6. `jsr UpdateSideScrollingGameplay_C073` ($CABF) — configure HUD/playfield PPU and reset scroll. +7. Restore PPU mask from `PpuMaskShadow` ($11). +8. `jsr PollShipControllers` ($CAC7) — read controller ports $4016/$4017 into `PreviousControllerButtons` ($19) and `CurrentControllerButtons` ($1B). +9. `jsr TransformFlightState_CEE8` ($CACA) — process ship flight state. +10. If `Zp_3B` ($3B) != 0 → `UpdateSideScrollingGameplay_CAD4`; else → `UpdateSideScrollingGameplay_C3CC` ($CAD1). +11. `UpdateSideScrollingGameplay_CAD4` ($CAD4): `jsr ReadShipControls_F880`, `jsr UpdateSideScrollingGameplay_CBD4`, then `jsr UpdateSideScrollingGameplay_D6D8` ($CADA). +12. `ConfigureHudAndPlayfieldPpu_CADF` ($CADF): pop saved registers (Y, X, A) from the stack — restores the context saved at the start of NMI. +13. Re-enable NMI: `PpuControlShadow` \| $80, store to shadow and PPUCTRL. +14. `pla / rti` — restore A and return from interrupt. + +The NMI is the frame heartbeat: it handles PPU updates, OAM DMA, controller polling, and gameplay state updates, all during VBlank. + +--- + +## 6. PPU / Rendering + +### `ConfigureHudAndPlayfieldPpu_C092` ($C092) +- Reads PPUSTATUS to reset address latch. +- Loads `PpuControlShadow` ($10), ANDs with $FB (disable sprite rendering bit), stores to PPUCTRL and shadow. +- Sets up PPU address and writes tile runs to $2007 — used for HUD and playfield background updates. + +### `TransferShipTargetOamBuffer` ($C087) +- Write $00 to OAMADDR ($2003), then $02 to OAMDMA ($4014) — DMA sprite data from $0200–$02FF. + +### `PollShipControllers` ($C434) +- Reads both controller ports, tracking previous and current button states. + +### `UpdateSideScrollingGameplay_C073` ($C073) +- Configures HUD/playfield PPU upload and resets scroll. Used during NMI and gameplay state transitions. + +--- + +## 7. Zero-Page / RAM Symbols + +| Address | Symbol | Use | +|---------|--------|-----| +| $00–$03 | ScratchValue0–3 | General scratch values | +| $04–$05 | DataPointerLo/Hi | Data pointer | +| $06–$07 | TemporaryPointerLo/Hi | Temporary pointer | +| $08–$0D | Zp_08–Zp_0D | Zero-page scratch | +| $0F | Zp_0F | Zero-page scratch | +| $10 | PpuControlShadow | $2000 mirror | +| $11 | PpuMaskShadow | $2001 mirror | +| $12 | HorizontalScroll | Horizontal scroll value | +| $13 | VerticalScroll | Vertical scroll value | +| $14–$18 | Zp_14–Zp_18 | Zero-page scratch | +| $19 | PreviousControllerButtons | Previous frame controller state | +| $1A | Zp_1A | Zero-page scratch | +| $1B | CurrentControllerButtons | Current frame controller state | +| $1C–$1F | Zp_1C–Zp_1F | Zero-page scratch | +| $20–$3F | Zp_20–Zp_3F | Zero-page scratch (extensive use) | +| $36 | Zp_36 | Game flag | +| $3B | Zp_3B | Gameplay branch flag | +| $3F | Zp_3F | Zero-page scratch | +| $40–$47 | Zp_40–Zp_47 | Zero-page scratch | +| $4C | Zp_4C | Zero-page scratch | +| $54–$5F | Zp_54–Zp_5F | Zero-page scratch | +| $60–$61 | Zp_60–Zp_61 | Zero-page scratch | +| $A0–$A7 | Zp_A0–Zp_A7 | Zero-page scratch ($A2 used as NMI frame sync) | +| $A9–$AB | Zp_A9–Zp_AB | Zero-page scratch | +| $AC–$AF | Zp_AC–Zp_AF | Zero-page scratch | +| $B0–$B9 | Zp_B0–Zp_B9 | Zero-page scratch | +| $BA–$BF | Zp_BA–Zp_BF | Zero-page scratch | +| $C0–$C4 | Zp_C0–Zp_C4 | Zero-page scratch | +| $D0–$D5 | Zp_D0–Zp_D5 | Zero-page scratch | +| $D7–$DF | Zp_D7–Zp_DF | Zero-page scratch | +| $E0–$EF | Zp_E0–Zp_EF | Zero-page scratch | +| $F0–$F7 | Zp_F0–Zp_F7 | Zero-page scratch | +| $FA–$FB | Zp_FA–Zp_FB | Zero-page scratch | +| $FD–$FF | Zp_FD–Zp_FF | Zero-page scratch | +| $0100 | Ram_0100 | APU/channel state | +| $0200 | OamBuffer | Sprite DMA source | +| $0201–$0203 | Ram_0201–Ram_0203 | RAM scratch | +| $0214, $0244, $0299, $029C–$029D, $029F–$02FE | Ram_* | Game state RAM | +| $0330–$0331 | Ram_0330–Ram_0331 | Gameplay state | +| $0380–$03FF | Ram_0380–Ram_07FF | Extensive game state RAM (objects, entities, scores, etc.) | +| $0540–$05FF | Ram_0540–Ram_05FF | Gameplay variables | +| $0600–$06FF | Ram_0600–Ram_06FF | Entity/object arrays | +| $0782–$07F2 | Ram_0782–Ram_07F2 | Late-game state | + +--- + +## 8. Routine Naming Patterns + +The disassembly uses consistent name prefixes that indicate routine purpose: + +| Prefix | Example | Meaning | +|--------|---------|---------| +| `UpdateSideScrollingGameplay_*` | `UpdateSideScrollingGameplay_C073` | Side-scrolling gameplay logic | +| `UpdateGameplayStateField_*` | `UpdateGameplayStateField_C1F7` | Gameplay state field updates | +| `TransformFlightState_*` | `TransformFlightState_C109` | Ship flight/transform state | +| `ConfigureHudAndPlayfieldPpu_*` | `ConfigureHudAndPlayfieldPpu_C092` | PPU HUD/playfield configuration | +| `CalculateMovementAndClamp_*` | `CalculateMovementAndClamp_C183` | Movement calculation with clamping | +| `UpdateFlyingEntity_*` | `UpdateFlyingEntity_CF11` | Flying entity (ship/enemy) updates | +| `ReadShipControls_*` | `ReadShipControls_F880` | Ship controller input | +| `ReadObjectRecord_*` | `ReadObjectRecord_DADA` | Object record reading | +| `ProcessObjectStateRoutine_*` | `ProcessObjectStateRoutine_CBE3` | Object state machine | +| `UpdateObjectBuffer_*` | `UpdateObjectBuffer_DB52` | OAM buffer updates | +| `UpdateObjectRecord_*` | `UpdateObjectRecord_D27D` | Object record maintenance | + +--- + +## 9. Summary of Execution Flow + +``` +Power On / Reset + │ + ▼ +ResetHandler ($C983) ───────────────────────────────┐ + │ sei, cld, disable PPU, stack=$FF │ + │ wait VBlank, clear PPU memory │ + │ set PPUCTRL=$00, PPUMASK=$02, scroll=$00 │ + │ upload HUD/playfield tiles via C092 │ + │ init game RAM, APU channels ($4015=$0F) │ + │ enable NMI (PpuControlShadow \| $80) │ + ▼ │ +jmp UpdateSideScrollingGameplay_CA6A ($CA6A) │ + │ │ + │ Main loop — waits for NMI frame sync: │ + │ wait until Zp_A2 ($A2) != 0 │ + │ dec Zp_A2 │ + │ jsr E47A, DC7B, E6E1, D91A, E6D5, E7AA, │ + │ E029, DE78 │ + │ jmp back to CA6A │ + │ │ + └────────────────────────────────────────────────┘ + │ +NMI ($CAA1) [once per frame] │ + │ │ + ├─ save A, X, Y │ + ├─ PPU command buffer upload ($CAA8) │ + ├─ ConfigureHudAndPlayfieldPpu_D2CF ($CAB9) │ + ├─ OAM DMA ($4014 from $0200) │ + ├─ ConfigureHudAndPlayfieldPpu_C073 ($C073) │ + ├─ restore PPU mask from shadow │ + ├─ PollShipControllers ($CAC7) │ + ├─ TransformFlightState_CEE8 ($CEE8) │ + ├─ branch on Zp_3B: CAD4 or C3CC │ + ├─ CAD4: ReadShipControls_F880, CBD4, D6D8 │ + ├─ restore registers, re-enable NMI │ + └─ rti │ + +IRQ ($CA9E) — self-loop (unused) +``` + +--- + +## 10. Notes + +- **Build verification:** `make` in `copilot/` produces `defender2_rebuilt.nes` that is **byte-identical** to `defender2.nes` and to the PRG bank of `Defender 2 (U).nes`. +- Vectors confirm NMI at $CAA1, RESET at $C983, and IRQ at $CA9E (self-loop, unused). +- The main loop (`CA6A`) is a tight NMI-synchronized loop; all substantive per-frame work happens either in the NMI handler or in the routines called from the main loop after the NMI sets `Zp_A2`. +- Many routines carry address-based names (`UpdateSideScrollingGameplay_C073`, `TransformFlightState_C109`, etc.) reflecting the automated first-pass disassembly; semantic naming is provisional. +- The disassembly includes inline `.byte` data blocks interleaved with code; boundaries are marked as classified by Pass 1. +- `locals.inc` provides zero-page names; `symbols.inc` provides the NES hardware register set. +- One build fix was required: a `bpl` branch to an undefined symbol `LookupTableEntry_FAF5` was replaced with `bne *-$1B` to produce the original `d0 e3` bytes (the disassembler had mislabeled `bne` as `bpl`). \ No newline at end of file diff --git a/Defender 2 (U)/copilot/Makefile b/Defender 2 (U)/copilot/Makefile index 0d008ac..7b0587a 100644 --- a/Defender 2 (U)/copilot/Makefile +++ b/Defender 2 (U)/copilot/Makefile @@ -1,9 +1,25 @@ -CA65?=ca65 -LD65?=ld65 -all: verify -%.o: %.s - $(CA65) -o $@ $< -defender2_rebuilt.nes: header.o prg.o chr.o - $(LD65) -C linker.cfg -o $@ $^ -verify: defender2_rebuilt.nes - cmp defender2.nes $< +CA65 ?= ca65 +LD65 ?= ld65 + +all: reconstructed.nes verify + +prg.o: prg.s symbols.inc locals.inc + $(CA65) -g -o $@ $< + +header.o: header.s + $(CA65) -g -o $@ $< + +chr.o: chr.s + $(CA65) -g -o $@ $< + +reconstructed.nes: header.o prg.o chr.o linker.cfg + $(LD65) -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ header.o prg.o chr.o + +verify: reconstructed.nes + cmp reconstructed.nes rom.nes + @echo "Byte-identical ROM verified." + +clean: + rm -f *.o reconstructed.nes reconstructed.map reconstructed.lbl + +.PHONY: all verify clean \ No newline at end of file diff --git a/Defender 2 (U)/copilot/chr.bin b/Defender 2 (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..672b885da14566decb5244929cfe9c122c08ccd8 GIT binary patch literal 8192 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 UD6C6|`A;4`Rr(UY_H$DDFMS$lod5s; literal 0 HcmV?d00001 diff --git a/Defender 2 (U)/copilot/chr.o b/Defender 2 (U)/copilot/chr.o new file mode 100644 index 0000000000000000000000000000000000000000..b47267ee9d9102a0bf1eb1b274455175b70ef700 GIT binary patch literal 12596 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 literal 0 HcmV?d00001 diff --git a/Defender 2 (U)/copilot/chr.s b/Defender 2 (U)/copilot/chr.s index 564d900..f6a8c21 100644 --- a/Defender 2 (U)/copilot/chr.s +++ b/Defender 2 (U)/copilot/chr.s @@ -1,2 +1,2 @@ .segment "CHR" - .incbin "defender2.nes", $4010, $2000 + .incbin "chr.bin" \ No newline at end of file diff --git a/Defender 2 (U)/copilot/header.bin b/Defender 2 (U)/copilot/header.bin new file mode 100644 index 0000000000000000000000000000000000000000..d5ba8218db5ba4df8527adf5eab9c586d76aaa76 GIT binary patch literal 16 QcmeZs4VGeLWMqH=01o&81ONa4 literal 0 HcmV?d00001 diff --git a/Defender 2 (U)/copilot/header.o b/Defender 2 (U)/copilot/header.o new file mode 100644 index 0000000000000000000000000000000000000000..6bb7a71f8072309500fe4bb2c2a57d19036bcba0 GIT binary patch literal 336 zcmX|*!A`)++qN(na~zTZ!41KeIi!Gg^~R)I=kWu@GIg>}qju2p_J!NdW1EJE%`r)`Fd z*D&yR>~A1gPI<7zvE3oLZ<%?`K7x7s#ax{GPu<|`((m|DHp@-nqr2*KTUBP37xiGC pFEZygjepM8#g{I7re%N8-kiej-?Q~q`5-;?|+=HH^%6#L5S;%+SV)ldKbBmV!* zFJiH|Ws2S29E;5?iejyP9gD55kG$Sw${(iw8h(G{x3O3hMV;7!I`V8xGaU0AV~(MG!hce}@H6G1 zhtM|ecb7Rvx*3lt?%3$~Wyiv-l6U<&8>e{5BFB4<%N>)Bq0d^sUZhFP{hs4;$E0K2 zahYS3RZ{5Jk2;2$^6Ru?%yEq4?^}HYf6_8s;n>+RlsukQa>}m*_V?>L$5$N793#ij zHs;r*+Vu!(l|Ovh0n!Q<`_Aq9b=BAj&h7U78yqA*YuaMC>hh8m-!J_Lm|JU z)44GvboA+F>Xp|cfe~`e{h0o*SiH1DTn9Vw|7&sGemSNh4YH1qSX&C?3C(z$pONZc z;Ag8&nwVpC);tx9S49b(O2nd6f#y6MiwbXR-9yxgC3Nm3hAq&tCu#Y4jeIkv*6Q2B}UH&QUm!p_! zwc)W?G%Kd#Q5b3i8egl4Oq#+EsnJY>UyG@;Zbr__)lk+nN0U0lRIQQ(?#$5GJO2rK zfW7@+boQ=+uibRxp_n@868Ny=yBhgqOjC9F85`yVoiR+cwPZpwnMA$TLqSG2@E_M5 z8#Vt`YYs+*|E{ymV|rJgw6|Wa7FsU{kO95yXcl_e@|5+m24%@8{X$GP96M_M=VL0@ z zFNHbJqd%0g6~A&5`q*@Z|0mF@NDE+6XN{yrWlX)1S-oz&V%@ERD|a0e+Vhah=Ub-z zdnoUw2AEN#Re|e0u#`e+2zHVCn3ll&MvZ%$0S)6{g5G;?#PofwhB>zljmA0!;;P=@ z=VKc4T%c;?Tl{RT-JcS>t-!|F*2>&nDa~V!NyoTjD37wrbL={rh)2c?lxPX+IVsZW z=bTpqAB{zWF--ogiOMoi{979WGBxtB1qMkV}Cmxw!~D5=#Zbb664 zJpQ1?g~vmSRq&1AnbqQmx0nH?i*(|#2Q5xuZ-q^?3;$(99m1dB13y78`s*y3*ijQ+ zLr3wRk#+ge3*Pk4jEIlW=Bc`vh{Xp&{-jr2=S~)cj*h{~T3urP1kk4*jCb=X28gQ+ zZK>BxRAN!5m?nS0nO5_9Xj>oL-g<^_RR8B=YUx<7b#I3HNt|wBqb@#XG8p`{;U;GG zt`@d89E%d#WR^BHnfGqtPIO>9Q}U^Jzr%)6Dz57`cVUG#&LKqH+|U$hLkIK1!!R5p zZ}XS%hF{iEtjoH+1lx;Ljtx}6gxAqBoDNkG`vH1P=4xz#7Y;#--&F=3c~^7c=)2n1 z#&C^!#2lT&FPq>eya_eZrB_1t+nGZ`=bv|;xwOweAC&OPP+^Em;(Eb@3fCDgm8(JM zUNTR|@EJzuB-~L#<6nMIZ#-V8R`W4pNG|@A+pBZoPo7RVe~PJbMTQA2Y5Jh$lBPk* z^N>kvmEyM237sX7b&aXd6AX*LXI40!(bya6Qbhzok&ZD|O^&AHUo*N1qt_Z*y=nP@ z${LKLNL5JrlyTgJnuWYfSj_gJ;$~3v9i3sO^S&)p#JFsfJPm^>39WwVLEY6aQTN-ri5%y>qkEVxm2c1iT68|w zY9Eds)IN+5hrOd=?kY#o6f)1km`3e}{ymNzwHnKY%(L`DXSZ=ugpML?B{aGDgW8i} zA%rf$iBWqFCYRA%bRpl+hC9>Dibf-d97Ch`0A8$7XAnW2W3@6w?1Z7sa|9Cn?tN|J z*RXGCG0NIecSAln8MZ*pdD0;IneA-b`sf2{wqgm)^f;nm=tguqp<8(m?%zT>%0D&iGKjj7VbncW>v4>& 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 literal 0 HcmV?d00001 diff --git a/Defender 2 (U)/copilot/rom.nes b/Defender 2 (U)/copilot/rom.nes new file mode 120000 index 0000000..4a8d59c --- /dev/null +++ b/Defender 2 (U)/copilot/rom.nes @@ -0,0 +1 @@ +../Defender 2 (U).nes \ No newline at end of file diff --git a/Excitebike (JU)/OVERVIEW.md b/Excitebike (JU)/OVERVIEW.md new file mode 100644 index 0000000..3effe8b --- /dev/null +++ b/Excitebike (JU)/OVERVIEW.md @@ -0,0 +1,418 @@ +# Excitebike (JU) — Game Flow from Power-On + +This document describes the execution flow of the disassembled Excitebike (JU) PRG bank (16 KB, mapped at CPU **$C000–$FFFF**), starting from power-on. It is based entirely on `copilot/prg.s` in the repository. The rebuild is verified **byte-identical** to the original `prg.bin`. + +--- + +## 1. ROM and Memory Layout + +| Property | Value | +|----------|-------| +| Format | iNES / NES 2.0 | +| PRG | 1 × 16 KB (mapped at CPU $C000–$FFFF) | +| CHR | 1 × 8 KB | +| Mirroring | Vertical | +| PRG bank start | CPU $C000 | +| Source file | `copilot/prg.s` (14,111 lines) | +| Output | `reconstructed_prg.bin` (16,384 bytes) | + +### Interrupt vectors (CPU $FFFA–$FFFF) + +| Vector | Address | Handler | +|--------|---------|---------| +| NMI | $C23B | `NMI` | +| RESET | $C184 | `Reset` | +| IRQ / BRK | $FFF0 | (`$FFF0` — points into audio data region, unused) | + +--- + +## 2. Build Status + +`make` in `copilot/` assembles `prg.s` with `ca65`, links with `ld65`, and verifies against `prg.bin`. + +**Verification result: BYTE-IDENTICAL** — `reconstructed_prg.bin` matches `prg.bin` exactly (headers, CHR, and all PRG bytes). + +### Build fix applied + +The original source contained a `bpl LookupTableEntry_FAF5` branch at CPU $FAB4 (line 9425 of `prg.s`), but the symbol `LookupTableEntry_FAF5` was undefined. The branch target CPU $FAF5 fell in the middle of what the disassembler classified as `lda #$16` (`A9` at $FAF4, `16` at $FAF5). The fix: + +- Replaced `bpl LookupTableEntry_FAF5` with `bne *-$1B` at CPU $FAB4, producing the exact original bytes `d0 e3` (the disassembler had mislabeled `bne` as `bpl`). + +--- + +## 3. Reset — CPU $FFFC → $C184 + +**`Reset`** ($C184) + +On power-on or reset: + +1. `sei` — disable maskable interrupts. +2. `cld` — clear decimal mode. +3. `lda #$00 / sta PPUCTRL` — disable PPU rendering and NMI. +4. `ldx #$FF / txs` — initialize stack pointer to $FF. +5. **Wait for two VBlanks** — poll `PPUSTATUS` bit 7 twice (`@vblank1`, `@vblank2`). This is the PPU warm-up delay. +6. **Reset magic check** — compare `ResetMagic1` ($05CE) against `$A5` and `ResetMagic2` ($05CF) against `$5A`: + - If both match → warm start: set Y = $04 (preserve more RAM) + - If either mismatches → cold start: set Y = $07 (clear more RAM) +7. **Clear RAM** — clear zero page and one page ($0000–$00FF, or $0000–$06FF depending on warm/cold start) using indirect pointer at $00/$01. +8. **Persistent RAM init** — if reset magic was valid, `jsr InitializePersistentRam` ($C278): + - Copy 31-byte template (`PersistentRecordInitialDataC091` at $C091) to both `PersistentRecord0` ($0580) and `PersistentRecord1` ($05A3) + - Fill `PersistentBuffer` ($06E0) with $40, set byte at $07AF to $09 + - Set reset magic bytes to $A5/$5A + - Zero tail bytes of both persistent records +9. `sta APUDMALOAD` — disable DMC. +10. `lda #$06 / sta PPUMASK / sta $18` — enable background + sprites, set $18. +11. `jsr InitializeRuntimePpuState` — fill OAM shadow with $F8, process PPU entries, zero scroll/render fields. +12. `lda #$90 / jsr SetPpuControl` — set PPUCTRL = $90 (NMI enabled, $2000 base). +13. Falls into **`@main`** ($C1A4) — the permanent main loop. + +--- + +## 4. Main Loop — `@main` ($C1A4) + +After reset, `Reset` never returns. It enters the infinite main loop: + +``` +@main ($C1A4): + jsr ShiftRuntimeState ; $E8BC — shift runtime bytes $18-$1F right + lda NmiSyncState ; $48 + bmi @main ; loop if $FF (NMI_SYNC_PENDING) + beq @main ; loop if $00 + ; NmiSyncState == $01 (NMI_SYNC_COMPLETE): proceed + jsr DisableNmi ; $C362 — clear NMI bit in PPUCTRL + lda NmiSyncState + cmp #NMI_SYNC_COMPLETE ; $01 + bne @alternate ; if not complete, receive instead + jsr TransmitRuntimeDataCode ; $C6C8 — serial transmit runtime data + jmp @finish +@alternate: + jsr ReceiveRuntimeDataCode ; $C739 — serial receive runtime data +@finish: + lda #NMI_SYNC_PENDING ; $FF + sta NmiSyncState ; $48 — reset sync flag for next frame + jsr WaitForVblankEndAndEnableNmi ; wait for VBlank, set NMI bit + jmp @main ; loop forever +``` + +The main loop is **NMI-synchronized**: it blocks until `NmiSyncState` ($48) becomes $01 (set by NMI each frame), then performs serial I/O (transmit or receive runtime data), resets the sync flag to $FF, waits for the next VBlank, enables NMI, and repeats. + +### `ShiftRuntimeState` ($E8BC) + +Shifts runtime state bytes $18–$1F right by one bit. The carry-in is derived from controller bit 1 ($19 bit 2), enabling serial/data shifting tied to controller input. + +--- + +## 5. NMI / Frame Heartbeat — `NMI` ($C23B) + +The NMI fires once per frame and is the central real-time driver: + +1. **`jsr DisableNmi`** ($C362) — clear bit 7 of `PpuControlShadow` ($10), write to PPUCTRL ($2000). NMI is disabled during the handler to prevent re-entry. +2. **PPU mask**: if $45 == 0, `PPUMASK = PpuMaskShadow | $1A` (enable background + sprites); otherwise skip. +3. **OAM DMA**: write $00 to OAMADDR ($2003), then $02 to OAMDMA ($4014) — copy $0200–$02FF to sprite RAM. +4. **`jsr NmiPpuUpdate`** ($C27E) — process one PPU update command stream (indexed by $45), then reset $0300/$0301/$45 and PPU address to $3F00. +5. **Optional rider/lane update**: if $47 != 0, `jsr UpdateRiderLanePositionStates` and `jsr NmiRuntimeUpdate`. +6. **Runtime counters**: if $03B1 | $03B2 == 0, increment $3F and `jsr UpdateRuntimeCounters`. +7. **`jsr ReadControllers`** ($E8E5) — read both controller ports ($4016/$4017), update `Controller1Held` ($14), `Controller1Pressed` ($15), `Controller2Held` ($16), `Controller2Pressed` ($17). +8. **`jsr UpdateAudio`** ($F8DE) — update all four APU channels (Pulse 1, Pulse 2, Noise, Sound Effect) plus sound effects and DMA. +9. **`jsr DispatchNmiState`** ($C2A9) — dispatch to the current NMI state handler (see below). +10. **Read PPUSTATUS** ($2002) to reset the address latch. +11. **`jsr WaitForVblankEndAndEnableNmi`** — wait for VBlank end, set NMI bit in PPUCTRL. +12. **`rti`** — return from interrupt. + +### `NmiPpuUpdate` ($C27E) + +Processes a single PPU update command: +- Load pointer from `PpuUpdatePointerLow/High` ($C0F6/$C111 tables) indexed by $45. +- Call `ProcessPpuUpdateStream` ($D3C1) which reads the command stream and writes bytes to $2007. +- Zero out $0300, $0301, and $45. +- Reset PPU address to $3F00 (four writes to $2006). + +--- + +## 6. NMI State Machine — `DispatchNmiState` ($C2A9) + +The NMI dispatcher supports two modes based on `NmiDispatchMode` ($40): + +### Mode 0 — Direct state dispatch (`DispatchNmiState` @ $C2A9) +If `NmiDispatchMode` == 0: +- Load `NmiState` ($41), double it, use as index into `NmiStateHandlerTable` ($C000–$C01B). +- Jump indirect through zero-page $00/$01 (high byte left in A, stored to $01 by code at $CB36). + +**NMI State Handler Table** ($C000–$C01B) — 14 entries for states $00–$0D: + +| State | Handler Address | Purpose | +|-------|----------------|---------| +| $00 | `NmiState00` | Menu/title — selection handling | +| $01 | $C395 | Menu horizontal input | +| $02 | `UpdateGameplayRuntime` | Main gameplay update | +| $03 | `DispatchNmiSequenceStep` | Sequence step dispatch | +| $04 | `NmiState04_07` | Shared state $04/$07 handler | +| $05 | `UpdateGameplayRuntime` | Main gameplay update | +| $06 | `DispatchNmiSequenceStep` | Sequence step dispatch | +| $07 | `NmiState04_07` | Shared state $04/$07 handler | +| $08 | $C3BD | Menu vertical input | +| $09 | `UpdateRaceRuntime` | Race gameplay update | +| $0A | `UpdateGameplayRuntime` | Main gameplay update | +| $0B | `DispatchNmiSequenceStep` | Sequence step dispatch | +| $0C | $C43D | Serial handshake state $0C | +| $0D | $C41C | Serial handshake state $0D | + +### Mode 1 — Sequence dispatch +If `NmiDispatchMode` != 0: +- Disable PPU rendering. +- Wait until $30 == 0 (not busy). +- Look up sequence pointer from `NmiStateToSequenceIndex` + `NmiSequencePointerLow/High` tables. +- Call the sequence handler at the current `NmiSequenceStep` ($44). +- If step < 0 (after increment/decrement), go to `InitializeRuntimePpuState`. + +**NMI Sequence Pointers** ($C03C–$C07F) — 9 sequences: + +| Index | Address | Handlers | +|-------|---------|----------| +| 0 | $C03C | $C2BD, $C514 | +| 1 | $C040 | `SetSerialUpdateSelector06`, $C3F3, $C514 | +| 2 | $C046 | `SerialUpdateSelectorCluster`, `ClearRuntimeZeroPage`, `InitializeCourseRuntime`, `SetSerialUpdateSelector17`, `SetSerialUpdateSelector0E`, `InitializeGameRuntime` | +| 3 | $C052 | `SetSerialUpdateSelector06`, `SetSerialUpdateSelector04`, `SelectNmiUpdateForState`, `CallC92CWithZero`, `CompareAndUpdateRecord` | +| 4 | $C05C | `SetSerialUpdateSelector06`, `SetSerialUpdateSelector09`, `Prepare0300Structure`, $C514 | +| 5 | $C064 | $C551, `ClearRuntimeZeroPage`, `InitializeCourseRuntime`, `SetSerialUpdateSelector17`, $C562, $C5C2 | +| 6 | $C070 | `SetSerialUpdateSelector06`, $C575, $C514 | +| 7 | $C07A | `ClearRuntimeZeroPage`, `RestoreWorkingRecordFields`, $C518 | +| 8 | $C076 | $C582, $C518 | + +--- + +## 7. Key NMI State Handlers + +### `NmiState00` ($C346) +Title/menu state: +- If $31 == 0: initialize $43, $4A = 0, $03F7 = $0F, `NmiState` = 2 (gameplay). +- Else: `jsr UpdateMenuSelection` with count 3; if no input change, set sprite 0 Y from `MenuInitialYTable`; otherwise handle selection done and advance state. + +### `NmiState01` ($C397) +Menu horizontal input: +- Filter controller buttons, `jsr UpdateMenuSelection` (count 5). +- If input changed, move horizontal marker; else store `MenuSelectionIndex` to $43 and advance to next NMI state, entering sequence mode. + +### `NmiState08` ($C3BD) +Menu vertical input: +- `jsr UpdateMenuSelection` (count 6). +- Based on selection: advance state, jump to sequence entry, or handle choice 5 (reset runtime, preserve selection). + +### `NmiState04_07` ($C465) +Shared handler for states $04/$07: +- If $34 == 0: advance NMI state and enter sequence mode; clamp state to max 7. +- Else: `jsr $C92C`, check bit 4 of $3F, either return or `jmp StateHelperCAFA`. + +### `NmiState0C` / `NmiState0D` ($C41C / $C43D) +Serial handshake states: +- State $0C: if sequence step == 0, set sync complete; else if sync pending, copy record tails and continue handshake. +- State $0D: similar handshake with persistent record synchronization. + +--- + +## 8. Gameplay Runtime + +### `UpdateGameplayRuntime` ($C99A) +Called from NMI states $02, $05, $0A: +- `jsr $CA08` (update four rider slots). +- If $03B1 | $03B2 != 0: jump to PPU update tail. +- Otherwise: `jsr $D918`, `jsr $DD8D`, `jsr UpdateAllRiderScriptStateE733`, `jsr $E927`. +- If $52 != 0: `jsr StateHelperCA9B`. +- If $03F2 != 0: optional updates ($DA9F, $DBC4, $DEBB). +- `jsr UpdateGlobalCounters`, `jsr BuildGlobalDisplayEAC5`, `jsr CompareRuntimeSlots`, `jsr CheckSlotState`. +- `jsr UpdateTriggeredSlots`, `jsr UpdateFourSlots`, `jsr UpdateFourSlotPositionsE96C`, `jsr UpdateDisplayState`, `jsr UpdateFourSlot8CE836`, `jsr BuildFourSlotSpritesEA44`, `jsr ProcessCourseDefinition`, `jsr UpdateSlotPairState`, `jsr UpdateGlobalFC`, `jsr UpdateGlobalDisplay`, `jsr ProcessRuntimeEntries`, `jsr PrepareSortedSlots`, `jsr UpdateRuntimeSlots`, `jsr UpdateRiderCourseStateE70B`, `jsr UpdatePpuState`, `jsr ProcessRiderSlots`, `jmp ProcessSortedSlots`. + +### `UpdateRaceRuntime` ($C8D6) +Race-specific update: +- `jsr $CA1B`, `jsr UpdateGlobalRuntimeEB17`, `jsr UpdateAccumulator`, `jsr UpdateGlobalPosition`, `jsr UpdateRiderCourseStateE70B`, `jsr ProcessCourseDefinition`, `jsr $F68D`, `jsr $F755`, `jsr $C229`, then `jmp UpdatePpuState`. + +--- + +## 9. Audio System + +**`UpdateAudio`** ($F8DE) — called from NMI: +1. `APUFRAMECNT` ($4017) = $C0. +2. `jsr UpdatePulse1Channel`, `jsr UpdatePulse2Channel`, `jsr UpdateNoiseChannel`, `jsr UpdateSoundEffect`. +3. Zero out $FF, $FE, $FD, $FB. +4. If $07FF != 0: `sta APUDMALOAD` ($4011), decrement $07FF. + +Audio channel configuration uses tables at $FF00+ (period tables) and $FF3E+ (mask tables). Audio sequence/data lives at $FF64–$FFE9. + +--- + +## 10. Serial I/O System + +Excitebike uses the controller port $4016 for serial communication (likely the Famicom 3D System or a similar serial peripheral — peripheral identity unknown): + +**Transmit path** (`TransmitRuntimeDataCode` at $C6C8): +- Configure a 64-byte block from $0060, transmit it. +- Configure a 20-byte block from $05E0 (working buffer), transmit it. +- Uses pulse-length encoding: long pulse = 1, short pulse = 0, MSB first. +- Preamble: short pulses, then long pulses, then short pulses, then one long pulse. + +**Receive path** (`ReceiveRuntimeDataCode` at $C739): +- Disable NMI, configure receive blocks, receive data. +- Validate 5-byte header against `ReceiveHeaderTableBaseC17F` ($C17F: $E8). +- If valid: set state variables ($A0–$A3), set $45 = $1A, wait for NMI update. +- Receive second block (working buffer), validate checksum, return success/failure. + +Serial helpers: `TransmitByte` ($C66E), `ReceiveByte` ($C6A5), `TransmitPulseShort` ($C64E), `TransmitPulseLong` ($C653), `ReceiveSerialBit` ($C691), `SerialWaitPulse` ($C639). + +--- + +## 11. Zero-Page / RAM Symbols + +| Address | Symbol | Use | +|---------|--------|-----| +| $00–$01 | TMP00/TMP01 | General scratch / indirect pointer | +| $08–$09 | SerialBitCountLo/Hi | Serial bit counter | +| $0E | SerialBlockPtr | Serial block pointer | +| $0D | SerialBlockLength | Serial block length | +| $10 | PpuControlShadow | $2000 mirror | +| $11 | PpuMaskShadow | $2001 mirror | +| $12–$1F | — | Runtime state bytes (shifted each frame by `ShiftRuntimeState`) | +| $14 | Controller1Held | Controller 1 held buttons | +| $15 | Controller1Pressed | Controller 1 newly pressed | +| $16 | Controller2Held | Controller 2 held buttons | +| $17 | Controller2Pressed | Controller 2 newly pressed | +| $31 | — | Menu/timing state | +| $34 | — | Menu selection state | +| $3F | — | Runtime counter | +| $40 | NmiDispatchMode | NMI dispatch mode (0=direct, 1=sequence) | +| $41 | NmiState | Current NMI state ($00–$0D) | +| $42 | MenuSelectionIndex | Current menu selection | +| $43–$4A | — | State/temp variables | +| $44 | NmiSequenceStep | Current NMI sequence step | +| $45 | — | PPU update index | +| $47 | — | Optional update flag | +| $48 | NmiSyncState | $FF=PENDING, $01=COMPLETE | +| $49 | InputActionLatch | Menu input latch | +| $A4 | RiderMotionState | Rider motion state ($01=disabled, $02=active, $03=transition, $04=complete) | +| $0100 | — | DMA/APU scratch | +| $0200 | OamBuffer | OAM shadow / sprite DMA source | +| $0300–$0301 | — | PPU update command structure pointer | +| $03B1–$03B2 | — | Timed update flag | +| $0580 | PersistentRecord0 | First persistent record (31 bytes + tails) | +| $05A3 | PersistentRecord1 | Second persistent record | +| $05CE–$05CF | ResetMagic1/2 | $A5/$5A warm-start signature | +| $05E0 | WorkingBuffer | Working buffer for serial I/O | +| $06E0 | PersistentBuffer | Persistent buffer (256 bytes) | +| $07FF | — | Audio DMA trigger | + +--- + +## 12. PPU / Rendering + +- **OAM DMA**: Every NMI, DMA from $0200–$02FF via `OAMDMA` ($4014). +- **PPU update streams**: Indexed pointer tables at $C0F6 (low) / $C111 (high), 27 entries. Processed by `ProcessPpuUpdateStream` ($D3C1) during NMI. +- **Scroll**: `PpuControlShadow` ($10) and `PpuMaskShadow` ($11) are software mirrors, updated during NMI and written to $2000/$2001. +- **OAM shadow**: Filled with $F8 (offscreen) by `FillOamShadowWithF8` during runtime PPU init. + +--- + +## 13. Summary of Execution Flow + +``` +Power On / Reset + │ + ▼ +Reset ($C184) ────────────────────────────────────────┐ + │ sei, cld, disable PPU/NMI, stack=$FF │ + │ wait 2× VBlank (PPU warm-up) │ + │ check reset magic ($A5,$5A at $05CE/$05CF) │ + │ valid → warm start (preserve more RAM) │ + │ invalid → cold start (clear more RAM) │ + │ clear RAM ($0000–$00FF or $0000–$06FF) │ + │ if valid: InitializePersistentRam │ + │ (copy template to both persistent records) │ + │ disable DMC, PPUMASK=$06, PPUCTRL=$90 (NMI on) │ + │ InitializeRuntimePpuState │ + │ │ + ▼ │ +@main ($C1A4) ────────────────────────────────────────┤ + │ │ + ├─ jsr ShiftRuntimeState ($E8BC) ──────────────┐ + │ shift $18-$1F right, carry from controller │ + │ │ + ├─ lda NmiSyncState ($48) │ + ├─ bmi @main (if $FF = PENDING, loop) │ + ├─ beq @main (if $00, loop) │ + │ (only proceed when NMI set it to $01) │ + │ │ + ├─ jsr DisableNmi ($C362) │ + ├─ if NmiSyncState == $01: │ + │ jsr TransmitRuntimeDataCode ($C6C8) │ + │ else: │ + │ jsr ReceiveRuntimeDataCode ($C739) │ + │ │ + ├─ lda #NMI_SYNC_PENDING ($FF) │ + │ sta NmiSyncState │ + ├─ jsr WaitForVblankEndAndEnableNmi │ + └─ jmp @main ◄──────────────────────────────────┘ + │ +NMI ($C23B) [once per frame] │ + │ │ + ├─ jsr DisableNmi (PPUCTRL bit7 = 0) │ + ├─ PPUMASK = PpuMaskShadow \| $1A (if $45==0) │ + ├─ OAM DMA ($0200-$02FF → $4014) │ + ├─ jsr NmiPpuUpdate ($C27E) [PPU update stream] │ + ├─ if $47 != 0: │ + │ jsr UpdateRiderLanePositionStates │ + │ jsr NmiRuntimeUpdate ($D14E) │ + ├─ if $03B1|$03B2 == 0: inc $3F, jsr UpdateRuntimeCounters │ + ├─ jsr ReadControllers ($E8E5) │ + ├─ jsr UpdateAudio ($F8DE) [4 channels + SFX] │ + ├─ jsr DispatchNmiState ($C2A9) │ + │ ├─ NmiDispatchMode==0: direct state table │ + │ │ $00=NmiState00 (menu/title) │ + │ │ $01=$C395 (menu horiz) │ + │ │ $02=$C99A (UpdateGameplayRuntime) │ + │ │ $03=DispatchNmiSequenceStep │ + │ │ $04/$07=NmiState04_07 │ + │ │ $05=$C99A (UpdateGameplayRuntime) │ + │ │ $06=DispatchNmiSequenceStep │ + │ │ $07=NmiState04_07 │ + │ │ $08=$C3BD (menu vert) │ + │ │ $09=$C8D6 (UpdateRaceRuntime) │ + │ │ $0A=$C99A (UpdateGameplayRuntime) │ + │ │ $0B=DispatchNmiSequenceStep │ + │ │ $0C=$C43D (serial handshake) │ + │ │ $0D=$C41C (serial handshake) │ + │ └─ NmiDispatchMode!=0: sequence dispatch │ + │ (9 sequences at $C03C-$C07F) │ + │ │ + ├─ read PPUSTATUS │ + ├─ WaitForVblankEndAndEnableNmi │ + │ (set NmiSyncState = $01 implicitly via │ + │ main loop's view of completion) │ + └─ rti │ + +Serial I/O (from main loop, once per frame) + ├─ TransmitRuntimeDataCode ($C6C8) [when sync complete] + │ ├─ 64-byte block from $0060 │ + │ └─ 20-byte block from $05E0 (working buffer)│ + └─ ReceiveRuntimeDataCode ($C739) [alternate] + ├─ validate 5-byte header ($C17F) │ + ├─ receive second block │ + └─ checksum verify │ + +Audio (from NMI via UpdateAudio at $F8DE) + ├─ Pulse 1 channel ($4000-$4003) │ + ├─ Pulse 2 channel ($4004-$4007) │ + ├─ Noise channel ($400C-$400F) │ + ├─ Sound effect │ + └─ DMC load if $07FF != 0 │ +``` + +--- + +## 14. Notes + +- **Build verification:** `make` in `copilot/` produces `reconstructed_prg.bin` that is **byte-identical** to `prg.bin` and to the PRG bank of `rom.nes`. +- Vectors confirm NMI at $C23B, RESET at $C184, IRQ at $FFF0 (points into audio data region — likely a placeholder or unused). +- The main loop (`@main` at $C1A4) is strictly NMI-synchronized via `NmiSyncState` ($48): it loops until the NMI sets the state to $01 (COMPLETE), performs serial I/O, resets to $FF (PENDING), waits for VBlank, and repeats. +- Serial I/O uses controller port $4016 for pulse-length encoded data transmission/reception — likely for the Famicom 3D System or a similar serial peripheral. +- The NMI state machine supports both direct state dispatch (14 states via table at $C000) and sequence dispatch (9 sequences via tables at $C03C–$C07F). +- Many routines carry address-based labels (`NmiState04_07`, `UpdateSideScrollingGameplay_C073`, etc.) reflecting the automated first-pass disassembly; semantic naming is provisional. +- `symbols.inc` (embedded at the top of `prg.s`) provides NES hardware register names and key zero-page symbols. +- One build fix was required: an undefined branch target `LookupTableEntry_FAF5` was replaced with a PC-relative `bne *-$1B` to produce the original `d0 e3` bytes. \ No newline at end of file diff --git a/Excitebike (JU)/copilot/Makefile b/Excitebike (JU)/copilot/Makefile index 3f9ba6f..7b0587a 100644 --- a/Excitebike (JU)/copilot/Makefile +++ b/Excitebike (JU)/copilot/Makefile @@ -1,10 +1,25 @@ -all: reconstructed_prg.bin verify -prg.o: prg.s symbols.inc prg.bin - ca65 -g -o $@ prg.s -reconstructed_prg.bin: prg.o linker.cfg - ld65 -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ prg.o -verify: reconstructed_prg.bin prg.bin - cmp reconstructed_prg.bin prg.bin - @echo BYTE-IDENTICAL +CA65 ?= ca65 +LD65 ?= ld65 + +all: reconstructed.nes verify + +prg.o: prg.s symbols.inc locals.inc + $(CA65) -g -o $@ $< + +header.o: header.s + $(CA65) -g -o $@ $< + +chr.o: chr.s + $(CA65) -g -o $@ $< + +reconstructed.nes: header.o prg.o chr.o linker.cfg + $(LD65) -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ header.o prg.o chr.o + +verify: reconstructed.nes + cmp reconstructed.nes rom.nes + @echo "Byte-identical ROM verified." + clean: - rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl + rm -f *.o reconstructed.nes reconstructed.map reconstructed.lbl + +.PHONY: all verify clean \ No newline at end of file diff --git a/Excitebike (JU)/copilot/chr.o b/Excitebike (JU)/copilot/chr.o new file mode 100644 index 0000000000000000000000000000000000000000..62dcbec0d7b9aa7debea611cf1a155f96b28594e GIT binary patch literal 12596 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

Egetrth;q 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

s6xY97qZ?$w#bENoOfkP24{Kn|#F~ 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

x9!#5y!6k7D3488)ejD=MHi@`2{S_g59%lO|J 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.nes` — original NES ROM image (for reference) + +To rebuild any project: +```bash +cd /home/tmerritt/Projects/disassembly//copilot +make +``` + +To verify byte-identity: +```bash +make verify # (where supported by the Makefile) +``` \ No newline at end of file diff --git a/Pac-Man (USA) (Namco)/OVERVIEW.md b/Pac-Man (USA) (Namco)/OVERVIEW.md new file mode 100644 index 0000000..74392be --- /dev/null +++ b/Pac-Man (USA) (Namco)/OVERVIEW.md @@ -0,0 +1,467 @@ +# Pac-Man (USA) (Namco) — Game Flow from Power-On + +This document describes the execution flow of the disassembled Pac-Man (USA) (Namco) PRG bank (16 KB, mapped at CPU **$C000–$FFFF**), starting from power-on. It is based entirely on `copilot/prg.s` in the repository. The rebuild is verified **byte-identical** to the original `prg.bin`. + +--- + +## 1. ROM and Memory Layout + +| Property | Value | +|----------|-------| +| Format | iNES / NES 2.0 | +| PRG | 1 × 16 KB (mapped at CPU $C000–$FFFF) | +| CHR | 1 × 8 KB | +| Mirroring | Vertical | +| PRG bank start | CPU $C000 | +| Source file | `copilot/prg.s` (14,332 lines) | +| Output | `reconstructed_prg.bin` (16,384 bytes) | + +### Interrupt vectors (CPU $FFFA–$FFFF) + +| Vector | Address | Handler | +|--------|---------|---------| +| NMI | $C10E | `NmiHandler` | +| RESET | $C033 | `Reset` | +| IRQ / BRK | $C17E | `IrqHandler` (just `rti` — unused) | + +Additional ROM data at $FFF6–$FFF9: +- $FFF6/$FFF7 = $ECEC (little-endian), used by `DrawMazeNametable` as a source pointer ($00/$01) +- $FFF8/$FFF9 = $C10E (little-endian) + +--- + +## 2. Build Status + +`make` in `copilot/` assembles `prg.s` with `ca65`, links with `ld65`, and verifies against `prg.bin`. + +**Verification result: BYTE-IDENTICAL** — `reconstructed_prg.bin` matches `prg.bin` exactly (all 16,384 bytes), and `prg.bin` matches the PRG bank of `rom.nes` (skipping the 16-byte iNES header). + +--- + +## 3. Reset — CPU $FFFC → $C033 + +**`Reset`** ($C033) + +On power-on or reset: + +1. `ldx #$00 / stx PPUCTRL` — disable PPU rendering/NMI. +2. `sei / cld` — disable maskable interrupts, clear decimal mode. +3. `dex / txs` — initialize stack pointer to $FF. +4. `nop x3` — three NOP padding bytes. +5. **Wait for two VBlanks** — `@WaitForPpu` loop: set PPUMASK=$06, poll PPUSTATUS bit 7 twice (X counts down from 2). This is the PPU warm-up delay. +6. **Clear low RAM** — `@ClearLowRam`: zero $0000–$003D. +7. **Clear RAM pages** — `@ClearRamPages`: using indirect pointer at $00/$01, clear pages starting at $0100 upward until high byte reaches $08 (effectively clearing $0100–$07FF). +8. `PPUMASK=$06`, scroll=$00 — enable background + sprites, reset scroll. +9. **Warm-start signature check** — `@CheckRamSignature`: compare RAM at $0052 against the 15-byte string `"HIROKI AOYAGI"` plus `$AA,$55` (stored at `RamSignature`, $C354–$C366): + - If all 15 bytes match → warm start: skip full RAM clear, go to `@SignatureAlreadyPresent`. + - If any byte differs → cold start: `@InitializeRamSignature` clears all of zero page, then copies the signature string to $0052–$0060. +10. Set $64=$01 (some flag), set gameState=$00. +11. Set $45=$07, then check cocktail/active-player flags at $46/$47. If both nonzero, perform a 16-byte swap loop (`@SwapLoop`) swapping bytes between $67,y and $77,y for Y=0..15. +12. `APUCTRL=$1F`, `APUFRAMECNT=$C0` — enable all APU channels, set frame counter mode. +13. `jsr InitializeAudioEngine` ($E1F8 region) — clear audio request/channel state. +14. `jsr $EEB4` — audio/sound engine init. +15. Set PPUCTRL=$88, `ppuCtrlShadow`=$88 — enable NMI, $2000 nametable base. +16. Set $48=$FF (gameplay suspended flag), clear $023F and $024B (PPU update buffers). +17. Set $36=$01 (some state flag). +18. `jmp MainEntry` — transfer control to the main program. + +**`RamSignature`** ($C354): `.byte "HIROKI AOYAGI", $AA, $55` — developer credit / warm-start validation signature. + +--- + +## 4. NMI / Frame Heartbeat — `NmiHandler` ($C10E) + +The NMI fires once per frame and is the central real-time driver: + +1. **Save registers** (A, X, Y on stack). +2. **PPUMASK=$1E** — enable background + sprites with specific emphasis settings. +3. **OAM DMA**: write $00 to OAMADDR ($2003), $00 to $40, then `lda $45 / sta OAMDMA` ($4014) — DMA from page $45 (i.e., $4500–$45FF) to sprite RAM. +4. **`jsr FlushGameplayPpuUpdates`** ($DE3B region) — flush pending PPU gameplay update blocks at $023F and $0245. +5. **`jsr ReadNearbyNametableTiles`** — read nametable tile data around Pac-Man (likely for collision/tunnel logic). +6. **`jsr UpdatePalettes`** — upload palette data from RAM buffers $0299 and $02A9 to PPU palette $3F00/$3F10 when those buffers are marked active ($0F marker). +7. **Restore scroll**: write $41 and $42 to PPUSCROLL (two writes — horizontal then vertical). +8. **Construct PPUCTRL**: `lda $47 / and $46 / and #$01 / asl / ora $43` — builds the PPUCTRL value from shadow/flag bits, writes to PPUCTRL. +9. **Controller strobe**: write $01 then $00 to JOY1 ($4016). +10. **Read both controllers** — 8 iterations each: + - Controller 1: read JOY1, mask with #$03, compare with #$01, rotate into $4D (`currentInput`). + - Controller 2: read `APUFRAMECNT` ($4017), mask with #$03, compare with #$01, rotate into $4E. +11. **Select active controller**: X = `currentInput` ($4D) by default; if `cocktailModeFlag` ($46) & `activePlayerFlag` ($47) both nonzero, X = `newlyPressedInput` ($4E). Store X to `previousInput` ($4F). +12. **`inc frameCounter`** ($4B) — increment per-frame counter. +13. **$48 gate**: if $48 (`gameplaySuspended`) != 0, skip to `@NmiDone`. +14. **`jsr InitializeAudioChannels`** — scan and activate audio channel slots. +15. **`@NmiDone`**: restore registers (Y, X, A), `rti`. + +The label `IrqHandler` appears at the `rti` following NMI's register restore — it is the same code address, just an alternate entry label for the IRQ vector (which points to the same `rti`). + +### `UpdatePalettes` +Conditionally uploads 16-byte palette blocks from RAM $0299 (to PPU $3F00) and $02A9 (to PPU $3F10) when the corresponding buffer marker byte equals $0F. After upload, resets the marker and PPU address to $3000. + +--- + +## 5. Main Entry — `MainEntry` ($C573) + +After Reset, control transfers to `MainEntry`. This is the foreground state-machine entry: + +1. **`$40=$01`** — set the NMI sync flag (NMI will clear it each frame). +2. **`@WaitForInitialNmi`** — spin until NMI clears $40 to $00 (synchronize to first VBlank). +3. **PPUCTRL=$88 / ppuCtrlShadow=$88** — enable NMI. +4. **PPUMASK=$00** — disable rendering. +5. **Clear OAM page** — fill $0700–$07FF with 0. +6. `cocktailModeFlag=$00`, then call: + - `jsr ClearGameplayNametables` + - `jsr InitializeNametableAttributes` + - `jsr InitializeNametableData` + - `jsr $E419` — additional init (address-named). +7. **Initialize palette buffers** — copy 32 bytes from `TitleScreenPalette` to RAM $0299–$02B8. +8. Set `actorStatusDisplay` ($6C–$6F) = $2D, set $023F=$FF, `gameplaySuspended`=$FF. +9. Clear $47, $46, $42, $41, `stateTimer` ($4C), $87, $88. +10. **PPUCTRL selection**: if `gameState` ($3F) != 0, use $8A; else use $8A as well (both paths end up with $8A; the `bne` is effectively a no-op in current code). Write to PPUCTRL and `ppuCtrlShadow`. +11. **`MainDispatchLoop`** ($C645): + - `$40=$01`, spin until NMI clears it (`@WaitForNmi`). + - `Y = gameState` ($3F), load 16-bit handler address from `MainStateHandlerTable` ($C267) into $10/$11. + - `jmp ($0010)` — indirect jump to the state handler. + +**`MainStateHandlerTable`** ($C267–$C26E) — 4 entries, indexed by `gameState` as a byte offset (even values $00, $02, $04, $06): + +| Offset | Handler | Description | +|--------|---------|-------------| +| $00 | `InitialStateHandler` | Title/input-wait state | +| $02 | `PlayerSelectionState` | 1P/2P selection | +| $04 | `State04Handler` | Substate dispatch machine | +| $06 | `TimedStateTransition` | Timed state transition | + +--- + +## 6. Main State Handlers + +### `TimedStateTransition` ($C27A) — state offset $06 +- Decrement `$0F` countdown. If nonzero, return to `MainDispatchLoop`. +- When zero: set `gameState`=$02, return to `MainDispatchLoop`. +- This is a timed transitional state: another state places a duration in `$0F` and selects state $06; this handler counts down before advancing to state $02. + +### `InitialStateHandler` ($C27A region, actually at $C27A? No — at $C27A is TimedStateTransition; InitialStateHandler is at $C27A? Let me re-check) + +Actually from the listing: +- `TimedStateTransition` is at $C27A +- `InitialStateHandler` is at $C27A? No. Let me re-read: + +Line 730: `TimedStateTransition:` is at $C27A (based on comment "$C27A-$C2A5: Timed State Transition Handler" — wait, the comment says $C27A but the code shows `dec $0F` at line 731. Then line 740: `; $C27A-$C2A5: Initial/Input State Handler` and line 766: `InitialStateHandler:`. + +So there's a discrepancy in comments. The actual code: +- `TimedStateTransition` = `dec $0F / bne MainDispatchLoop / lda #$02 / sta gameState / jmp MainDispatchLoop` — this is state $06's handler. +- `InitialStateHandler` = checks controller bits $0C; if set → gameState=$06, $0F=$5A, jump MainEntry. Else increment $42; if $42 reaches $F0 → reset $42, ppuCtrlShadow=$88, gameState=$06, $0F=$5A. Otherwise return to MainDispatchLoop. + +### `PlayerSelectionState` ($C546 region) — state offset $02 +- If $87|$88 != 0 → `@AdvanceTimeout` (16-bit timeout counter). +- Else (first entry): copy `PlayerCountSelectionDisplayData` ($C507–$C50E) to RAM $024B until $FF terminator. Capture controller bits $04 and $08 into `pacmanRequestedDirection` ($50) and `pacmanDirection` ($51). +- `@AdvanceTimeout`: increment 16-bit counter at $87/$88. If high byte reaches $02 → reset counter, set gameState=$04, jump MainDispatchLoop. +- `@CheckSelectionInput`: if controller bit $04 changed → store as `pacmanRequestedDirection`, reset counter, set $87=$01, toggle `activePlayerFlag` ($47) between 0/1, update display marker tiles at $024D/$0251 from `PlayerCountSelectionMarkerTiles` ($C50F–$C511). +- `@CheckConfirmInput`: if controller bit $08 changed → store as `pacmanDirection`. If bit $08 now active → clear `gameplaySuspended`, `jsr $EEB4`, jump `GameModeEntry`. + +**`PlayerCountSelectionDisplayData`** ($C507): `$22,$0A,$5C,$00, $22,$4A,$20,$FF` — copied to $024B on entry. +**`PlayerCountSelectionMarkerTiles`** ($C50F): `$5C,$20,$5C` — selection marker toggle data. + +### `State04Handler` ($C52E region) — state offset $04 +- If controller bits $0C set → gameState=$02, jump MainEntry (restart). +- Else: `Y = $87` (substate offset), load 16-bit handler from `State04SubstateTable` ($C52E), jump indirect via $10/$11. + +**`State04SubstateTable`** ($C52E) — 12 entries indexed by even offsets $00–$16: + +| Offset | Handler | +|--------|---------| +| $00 | `State04Initialize` | +| $02–$12 | `State04TimedSubstate` (shared, 6 entries) | +| $14 | `State04LongDelay` | +| $16 | `State04FinalPhase` | + +- `State04Initialize` ($C573): sync to NMI via $40, PPUCTRL=$08, disable rendering, clear $88, call `$C5D8`, `InitializeState04PpuData` ($C608), `LoadState04DisplayData` ($C5A6), advance $87 by 2, PPUCTRL=$88, return to loop. +- `State04TimedSubstate` ($C589): increment $88; at $30 frames → clear $88, call `$C5A6`, advance $87 by 2. +- `State04LongDelay` ($C5A6): increment $88; at $80 frames → advance $87 by 2 to substate $16. +- `State04FinalPhase` ($C5D7): sets $47=$01, tail-jumps to `GameModeEntry`. +- `SetSelectionFlagAndContinue` ($C5D7): `activePlayerFlag=$01`, `jmp GameModeEntry`. + +### `LoadState04DisplayData` ($C5A6) +Uses $87 as offset into `CharacterIntroDisplayDataTable` ($C687), copies $FF-terminated stream to RAM $024B. Optional secondary copy of 16 bytes from `CharacterIntroSpriteData` based on substate offset. + +**`CharacterIntroDisplayDataTable`** ($C687) — 10 pointers to display streams for characters/nicknames (SHADOW, BLINKY, SPEEDY, PINKY, etc.) plus scoring legend. + +--- + +## 7. Game Mode Entry — `GameModeEntry` ($C328) + +Reached from `SetSelectionFlagAndContinue` (state $04 final phase). This transitions from the attract/selection sequence into gameplay: + +1. PPUCTRL=$88, ppuCtrlShadow=$88. +2. Wait for VBlank. +3. PPUMASK=$00, gameState=$00, cocktailModeFlag=$00, $69=$00, $4A=$00. +4. `jsr ClearGameplayNametables`, `jsr DrawGameplayHudLabels`, `jsr DrawGameplayScoreFields`. +5. If `gameplaySuspended` != 0 → roundNumber=$01 (continue existing game). +6. Else → clear 32 bytes starting at roundNumber ($67–$86), set roundNumber=$03, $77=$03, clear $0600/$0601. +7. Common init: roundDisplayValue=$FF, $78=$FF, $0245=$FF, ppuCtrlShadow=$88, PPUCTRL=$88. +8. **`GameModeFrameSync`** ($C360): `$40=$01`, wait for NMI clear ($@WaitForNmi`), then: + - If `gameplaySuspended` != 0 AND controller bits $0C set → gameState=$02, jump MainEntry (restart). + - If `stateTimer` ($4C) != 0 → decrement, return to `@WaitForNextFrame`. + - Else `@DispatchState`: `Y = gameState`, load handler from `GameModeStateTable` ($CAD7) into $10/$11, indirect jump. + +**`GameModeStateTable`** ($CAD7) — 8 entries indexed by even offsets $00–$0E: + +| Offset | Handler | +|--------|---------| +| $00 | `GameModeState00` | +| $02 | `GameModeState02` | +| $04 | `GameModeState04` | +| $06 | `GameModeState06` | +| $08 | `GameModeState08` | +| $0A | `GameModeState0A` | +| $0C | `GameModeState0C` | +| $0E | `InitializeGameplayTransitionState` | + +### `GameModeState04` ($CAE9) — pause/per-frame handler +- If $060F != 0 → return to `GameModeFrameSync`. +- Else: edge-detect controller bit $08 using $49 as previous state. On new press → increment $4A, install pause display commands at $024B, toggle pause display via bit 0 of $4A. +- When not paused and bit 0 of $4A clear → call gameplay helper chain before returning to `GameModeFrameSync`. +- Adjacent data at $CB5B contains tile values for "PAUSE" text — confirms this is the pause-state handler. + +--- + +## 8. PPU / Rendering + +### `DrawMazeNametable` ($E2E4) +Draws the maze nametable using compressed data: +- PPU destination selected based on cocktail mode ($47 & $46): $2000 or $2080. +- Source pointer from `MazeDataPointerBytes` at $FFF6–$FFF7 ($ECEC → points to ROM data). +- Each row: set PPU address, decode 2-bit-run-length-encoded bytes from the source (2 bits = repeat count-1, 6 bits = tile value), write $16 (22) bytes per row. +- Advance PPU destination by $20 per row. + +### `FlushGameplayPpuUpdates` ($DE3B) +- If $48 (`gameplaySuspended`) == 0 → process update block at $023F (6 bytes + terminator to PPU). +- Else → jump to `UpdateAnimatedGameplayPpuFields`. +- Block at $0245 processed similarly if nonzero. + +--- + +## 9. Audio System + +**`InitializeAudioEngine`** ($E1F8): +- Clear audio request pointer ($F0/$F1 = $0006), channel table pointer ($F2/$F3 = $0620), sequence table pointer from ROM $F100/$F101. +- audioWorkValue=$40, APUSTATUS=$1F, APUFRAMECNT=$C0. +- Clear 16 bytes through ($F0), clear 16 entries at 8-byte stride through ($F2). + +**`InitializeAudioChannels`** ($EED0): +- Clear audio channel flags and work values, scan 16 eight-byte slots through ($F2). +- Slots with values $01–$04 activate a channel: copy 4-byte parameters through indirect pointer $F6. +- Falls through to runtime command processing at $EF2D. + +**`UpdateAudioChannels`** ($EF2D): +- For each active slot: decrement countdown, fetch command byte from sequence table, decode command ($F0+ = special, $C0+ = delay, else = note/frequency), update APU registers ($4000–$400F). + +**`UpdateAudio`** ($F8DE): +- APUFRAMECNT=$C0, update Pulse 1, Pulse 2, Noise, Sound Effect channels. +- Clear $FF–$FB; if $07FF != 0 → APUDMALOAD, decrement $07FF. + +Audio data tables at $FF00–$FFF5 (period/mask tables), $FF64–$FFEA (sequences/instruments), $F450–$F49A (runtime command data). + +--- + +## 10. Zero-Page / RAM Symbols + +| Address | Symbol | Use | +|---------|--------|-----| +| $00–$01 | workPtr0/1 | General indirect pointers | +| $02–$09 | workValue0–5 | General scratch values | +| $0A | pathCompareValue | Maze pathfinding | +| $0B | pathFallbackValue | Maze pathfinding | +| $0C | legalDirections | Maze pathfinding | +| $10 | dispatchVector | State dispatch indirect pointer | +| $12–$15 | arithmeticValue/Operand | 16-bit arithmetic | +| $1A–$2D | pacmanMotion–ghost4Motion | Actor motion records (4 bytes each) | +| $2E–$2F | pacmanTargetRow/Column | Pac-Man maze target | +| $32 | pacmanSpriteFrame | Pac-Man sprite frame | +| $33 | ghostSpriteFrames | Ghost sprite frames | +| $39 | ghostDirectionFlags | Ghost direction/control state | +| $3F | gameState | Main gameplay state | +| $40 | — | NMI sync flag ($01=pending, NMI clears to $00) | +| $41 | ppuCtrlShadow | PPUCTRL mirror | +| $42 | — | Second PPUSCROLL write | +| $46 | cocktailModeFlag | Cocktail cabinet mode | +| $47 | activePlayerFlag | Active player (0/1) | +| $48 | gameplaySuspended | Gameplay suspended flag | +| $4B | frameCounter | Per-frame counter | +| $4C | stateTimer | State countdown timer | +| $4D | currentInput | Controller 1 input | +| $4E | newlyPressedInput | Newly pressed input | +| $4F | previousInput | Previous input state | +| $50 | pacmanRequestedDirection | Requested direction | +| $51 | pacmanDirection | Current direction | +| $61 | highScoreDigits | High score digits | +| $67 | roundNumber | Round number | +| $68 | roundDisplayValue | Round display value | +| $6A | pelletsRemaining | Pellets remaining | +| $6B | extraLifeAwarded | Extra life flag | +| $6C–$6F | actorStatusDisplay | Actor status display | +| $70 | playerScoreDigits | Player score digits | +| $F0–$F7 | audioRequestPtr…audioWorkValue | Audio engine pointers/values | +| $F8 | audioChannelFlags | Audio channel flags | +| $FC | audioRequestIndex | Audio request index | +| $FD | audioChannelOffset | Audio channel offset | +| $FE–$FF | audioIndirectPtr | Audio indirect pointer | + +--- + +## 11. Data Tables + +| Label | Address | Description | +|-------|---------|-------------| +| `CopyrightText` | $C004 | "COPYRIGHT 1980 1993 NAMCO LTD. ALL RIGHTS RESERVED" | +| `RamSignature` | $C354 | `"HIROKI AOYAGI" $AA $55` — warm-start signature | +| `MainStateHandlerTable` | $C267 | 4 main state handler pointers | +| `State04SubstateTable` | $C52E | 12 state-$04 substate handler pointers | +| `GameModeStateTable` | $CAD7 | 8 game-mode state handler pointers | +| `CharacterIntroDisplayDataTable` | $C687 | 10 display data pointers for character intro | +| `TitleScreenTileBlock` | $C326 | 6 rows × $17 bytes of title tile data | +| `TitleScreenPpuRecords` | $C3B0 | 9 PPU update records for title screen | +| `TitleScreenPalette` | $C43F | 32-byte initial palette | +| `TitleScreenAttributeData` | $C45F | $18 attribute bytes | +| `PlayerCountSelectionDisplayData` | $C507 | 8 bytes for player-count display | +| `PlayerCountSelectionMarkerTiles` | $C50F | $5C,$20,$5C marker toggle | +| `CharacterIntroPalette` | $C667 | 32-byte character intro palette | +| `CharacterIntroDisplayDataTable` | $C687 | Character intro display pointers | +| `CharacterNicknameHeaderData` | $C69B | "CHARACTER ; NICKNAME" display data | +| `MazeDataPointerBytes` | $FFF6 | $EC,$EC,$0E,$C1 — maze data pointer ($C10E) | +| Audio tables | $FF00–$FFEA | Period/mask tables, sequences, instruments | + +--- + +## 12. Summary of Execution Flow + +``` +Power On / Reset + │ + ▼ +Reset ($C033) ───────────────────────────────────────────────┐ + │ sei, cld, disable PPU, wait 2× VBlank │ + │ clear RAM $0000–$003D, clear pages $0100–$07FF │ + │ PPUMASK=$06, scroll=$00 │ + │ check warm-start signature "HIROKI AOYAGI" + $AA,$55 │ + │ valid → skip full clear; invalid → clear + save sig │ + │ set flags, optional 16-byte swap ($67↔$77) │ + │ APUCTRL=$1F, APUFRAMECNT=$C0 │ + │ jsr InitializeAudioEngine, jsr $EEB4 │ + │ PPUCTRL=$88 (NMI enabled), $48=$FF (suspended) │ + │ jmp MainEntry │ + │ │ +MainEntry ($C573) │ + │ $40=$1, wait for NMI to clear it │ + │ PPUCTRL=$88, PPUMASK=$00, clear OAM │ + │ clear cocktail/player flags, $41/$42/$4C/$87/$88 │ + │ init nametables, attributes, palette buffers │ + │ select PPUCTRL ($8A), set ppuCtrlShadow │ + │ │ +MainDispatchLoop ($C645) ─────────────────────────────────────┤ + │ $40=$1, wait for NMI │ + │ Y = gameState ($3F) │ + │ load handler from MainStateHandlerTable ($C267) │ + │ jmp ($0010) → state handler │ + │ │ + ├─ State $00: InitialStateHandler │ + │ ├─ controller bits $0C → gameState=$06, $0F=$5A │ + │ │ → jump MainEntry (restart sync) │ + │ └─ else inc $42; if $42==$F0 → reset, gameState=$06 │ + │ │ + ├─ State $02: PlayerSelectionState │ + │ ├─ 1P/2P selection via controller bits $04/$08 │ + │ ├─ timeout ($87/$88 reaches $0200) → gameState=$04 │ + │ └─ confirm (bit $08) → clear suspended, jsr $EEB4, │ + │ jmp GameModeEntry │ + │ │ + ├─ State $04: State04Handler │ + │ ├─ controller bits $0C → gameState=$02, restart │ + │ └─ Y=$87 → dispatch via State04SubstateTable ($C52E) │ + │ ├─ $00: State04Initialize (PPU setup, $87+=2) │ + │ ├─ $02–$12: State04TimedSubstate ($30 frames) │ + │ ├─ $14: State04LongDelay ($80 frames) │ + │ └─ $16: State04FinalPhase → $47=$1, │ + │ jmp GameModeEntry │ + │ │ + └─ State $06: TimedStateTransition │ + │ dec $0F; if nonzero → MainDispatchLoop │ + │ else gameState=$02 → MainDispatchLoop │ + │ │ + └─ loop back to MainDispatchLoop │ + │ │ +GameModeEntry ($C328) [from SetSelectionFlagAndContinue] │ + │ │ + ├─ PPUCTRL=$88, wait VBlank, PPUMASK=$00 │ + ├─ clear gameplay state, HUD labels, score fields │ + ├─ if not suspended: clear player state, roundNumber=$3 │ + │ else: roundNumber=$1 │ + ├─ common init: roundDisplayValue=$FF, PPUCTRL=$88 │ + │ │ +GameModeFrameSync ($C360) ────────────────────────────────────┤ + │ $40=$1, wait for NMI │ + │ │ + ├─ if suspended && controller bits $0C → gameState=$02, │ + │ jmp MainEntry (restart) │ + │ │ + ├─ if stateTimer != 0 → dec, return to @WaitForNextFrame │ + │ │ + └─ Y = gameState → dispatch via GameModeStateTable ($CAD7)│ + │ │ + ├─ $00: GameModeState00 │ + ├─ $02: GameModeState02 │ + ├─ $04: GameModeState04 (pause/input handler) │ + │ ├─ $060F != 0 → return to frame sync │ + │ ├─ edge-detect controller bit $08 ($49) │ + │ │ → new press: inc $4A, install pause cmds │ + │ │ → bit 0 of $4A toggles pause display │ + │ └─ not paused, bit0 of $4A clear → gameplay │ + │ helper chain → return to frame sync │ + ├─ $06–$0C: GameModeState06/08/0A/0C │ + └─ $0E: InitializeGameplayTransitionState │ + │ │ + └─ loop back to GameModeFrameSync │ + │ │ + └─ (eventually enters gameplay via $0E handler) │ + │ +NMI ($C10E) [once per frame] │ + │ │ + ├─ save A, X, Y │ + ├─ PPUMASK=$1E │ + ├─ OAM DMA ($4500–$45FF → $0200–$02FF) │ + ├─ jsr FlushGameplayPpuUpdates ($DE3B) │ + ├─ jsr ReadNearbyNametableTiles │ + ├─ jsr UpdatePalettes ($3F00/$3F10 from $0299/$02A9) │ + ├─ restore scroll ($41,$42 → PPUSCROLL) │ + ├─ construct PPUCTRL from $47,$46,$43 │ + ├─ strobe JOY1, read both controllers (8 bits each) │ + │ → $4D (current), $4E (newly pressed) │ + ├─ select active controller → $4F (previousInput) │ + ├─ inc frameCounter ($4B) │ + ├─ if $48==0: jsr InitializeAudioChannels │ + ├─ restore registers, rti │ + │ │ +IrqHandler ($C17E): rti (unused) │ + │ +Audio Engine (from NMI via InitializeAudioChannels/$EEB4) │ + ├─ 16 eight-byte channel slots scanned │ + │ │ values $01–$04 activate a channel │ + │ │ 4-byte parameters copied via $F6 pointer │ + ├─ UpdateAudioChannels ($EF2D): │ + │ │ decrement countdowns, fetch command bytes, │ + │ │ decode ($F0+=special, $C0+=delay, else=note), │ + │ │ write APU registers $4000–$400F │ + └─ UpdateAudio ($F8DE): 4 channels + SFX + DMA trigger │ +``` + +--- + +## 13. Notes + +- **Build verification:** `make` in `copilot/` produces `reconstructed_prg.bin` that is **byte-identical** to `prg.bin` and to the PRG bank of `rom.nes`. +- Vectors confirm NMI at $C10E, RESET at $C033, IRQ at $C17E (a bare `rti`, unused). +- The foreground main loop (`MainDispatchLoop` at $C645) is strictly NMI-synchronized via `$40`: NMI clears it each frame, and the main code spins waiting for it to clear before dispatching to the next state handler. +- `GameModeEntry` ($C328) is a second, separate state machine entered from the state-$04 final phase. It has its own frame sync (`$40`) and its own 8-state dispatch table (`GameModeStateTable` at $CAD7), leading into gameplay initialization. +- State $04 contains a nested secondary state machine (`State04SubstateTable` at $C52E) with 12 substate offsets, implementing a timed character-introduction sequence (GHOST names, nicknames, scoring legend). +- The warm-start signature `"HIROKI AOYAGI"` at $0052 allows the game to preserve RAM across a soft reset. +- Many routine labels are address-based (`State04TimedSubstate`, `LoadState04DisplayData`, etc.) reflecting the automated first-pass disassembly; semantic naming is provisional. +- `symbols.inc` (embedded at the top of `prg.s`) provides NES hardware register names, controller masks, and extensive zero-page symbol definitions. \ No newline at end of file diff --git a/Pac-Man (USA) (Namco)/copilot/Makefile b/Pac-Man (USA) (Namco)/copilot/Makefile index 3f9ba6f..7b0587a 100644 --- a/Pac-Man (USA) (Namco)/copilot/Makefile +++ b/Pac-Man (USA) (Namco)/copilot/Makefile @@ -1,10 +1,25 @@ -all: reconstructed_prg.bin verify -prg.o: prg.s symbols.inc prg.bin - ca65 -g -o $@ prg.s -reconstructed_prg.bin: prg.o linker.cfg - ld65 -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ prg.o -verify: reconstructed_prg.bin prg.bin - cmp reconstructed_prg.bin prg.bin - @echo BYTE-IDENTICAL +CA65 ?= ca65 +LD65 ?= ld65 + +all: reconstructed.nes verify + +prg.o: prg.s symbols.inc locals.inc + $(CA65) -g -o $@ $< + +header.o: header.s + $(CA65) -g -o $@ $< + +chr.o: chr.s + $(CA65) -g -o $@ $< + +reconstructed.nes: header.o prg.o chr.o linker.cfg + $(LD65) -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ header.o prg.o chr.o + +verify: reconstructed.nes + cmp reconstructed.nes rom.nes + @echo "Byte-identical ROM verified." + clean: - rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl + rm -f *.o reconstructed.nes reconstructed.map reconstructed.lbl + +.PHONY: all verify clean \ No newline at end of file diff --git a/Pac-Man (USA) (Namco)/copilot/chr.bin b/Pac-Man (USA) (Namco)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..35814dfe096f4a8fd82f5bf15618403de633afe7 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/Pac-Man (USA) (Namco)/copilot/chr.o b/Pac-Man (USA) (Namco)/copilot/chr.o new file mode 100644 index 0000000000000000000000000000000000000000..aed007caedbe4ac85e8e7191db2a12f2b38f5412 GIT binary patch literal 12596 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

Ly=T$7vE5JY?AWwz^Oi{ew#|1vaF^P5|NR{Z fVh?ZW-}a5W?%vYz_3iiGt8Uub4?kamVwC>?n?8Sh literal 0 HcmV?d00001 diff --git a/Pac-Man (USA) (Namco)/copilot/chr.s b/Pac-Man (USA) (Namco)/copilot/chr.s new file mode 100644 index 0000000..f6a8c21 --- /dev/null +++ b/Pac-Man (USA) (Namco)/copilot/chr.s @@ -0,0 +1,2 @@ +.segment "CHR" + .incbin "chr.bin" \ No newline at end of file diff --git a/Pac-Man (USA) (Namco)/copilot/header.bin b/Pac-Man (USA) (Namco)/copilot/header.bin new file mode 100644 index 0000000000000000000000000000000000000000..aee36c438eb06284501f97c9f7247d5d3193af17 GIT binary patch literal 16 PcmeZs4VGeLWPk$z4(290tYUzXcNkz2T45ePCkYY;6V&m zZajtlTN^j|cK(@vW_D-$OkWYxiioNp1()CrEWsCGa46z8q5vmQ0cW7W1DZ_V5tu!X zNXm#pi2l#}$3Y6NPCmCcr3|-Ik+5L1AfrH`u(DA0zrs4^yswtmt}$^z4huo{Sj7#P z=4lN49rKO60>feKvrJYedz0vwU9FMekf=UTYrX);y+Trvb{#>U8)8-J=XuQiWxYaY|F(*VSD4G#bS diff --git a/Pac-Man (USA) (Namco)/copilot/reconstructed.map b/Pac-Man (USA) (Namco)/copilot/reconstructed.map index aaf7f17..1ad1cc6 100644 --- a/Pac-Man (USA) (Namco)/copilot/reconstructed.map +++ b/Pac-Man (USA) (Namco)/copilot/reconstructed.map @@ -1,13 +1,19 @@ Modules list: ------------- +header.o: + HEADER Offs=000000 Size=000010 Align=00001 Fill=0000 prg.o: PRG Offs=000000 Size=004000 Align=00001 Fill=0000 +chr.o: + CHR Offs=000000 Size=002000 Align=00001 Fill=0000 Segment list: ------------- Name Start End Size Align ---------------------------------------------------- +CHR 000000 001FFF 002000 00001 +HEADER 000000 00000F 000010 00001 PRG 00C000 00FFFF 004000 00001 diff --git a/Pac-Man (USA) (Namco)/copilot/reconstructed.nes b/Pac-Man (USA) (Namco)/copilot/reconstructed.nes new file mode 100644 index 0000000000000000000000000000000000000000..788e1649c1f6596a97ecee9a95d957d3bf829ddb GIT binary patch literal 24592 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­pELCe5S-H2(1cZo$E*jvDf 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

;TYOb{ibt3K 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 literal 0 HcmV?d00001 diff --git a/Tennis (JU)/copilot/chr.o b/Tennis (JU)/copilot/chr.o new file mode 100644 index 0000000000000000000000000000000000000000..212b138cfc44d8e82a4e705068272499a2776361 GIT binary patch literal 12596 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�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\r`_%;T{(+E<$Xo#NlQbyH-a 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�~Gd!+pk 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 bUjCANl7(M>Klz`5y$Rojzbh*Gz2E&mFeS%o literal 200080 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

@(yj2v;or2T*n+B z+WXRaN_+hVW)IQcllE6>dwk*%?Okbql$P6onM<^d(w>lZl+$w>q2){anY8!r@M5+> z$`_=JN@JQAZN0P>(mt#mn|Mpc~kwjYR|fDjpz7UU3*B^2Hl!8 z^ZL@-8d^leP6qrEN7r`~ybOl0~UZKX7ypr`gG#V*y{T^n_U)N{PhNU#HUGMSIIT-rrx zJ=-(qkG4$OBl3MNk=F!hOQron+R!_Bn}D`N+AY%dR_2`p+G1&~rJb+Os|mD4(#rH3 z84Y-WfwoXub-8<=*BnR-B$dip?=;)(88%Uuxv4W)0a&q^t@=cQGame-gSKxloXU10icyzrk*1z^(zq#F{`uY-H4Yx>KaYuf&rS7_nmr0eo=SjbyR)9%+ z6rT*`-D*1~L~-S>oGN#pB5h`x*TRcZe5#*kl$K2Qqg{|TN!pqg?&`dhiBfvDVId*f zIcdK5gO40o-{Lo#MOuXKli(aYP`}EQTMBO;-*9RB>`Dt;Pxij# zsYR_^J=e~E;{z#v(jw#i>Q(2pf2;X!>z+94#$DA0CcfZF-z^tCjXQj-( zJ@$6HrC#TEN^L3iM3TGPA>}(#_B6FkUgx$;t0rwwlf-GQM%B9Pg<_lZ8-nk8mFLEK z+`2JkO3O2;Z+eN_s;jMZb$e?o^#*c_w9B`8%zNEsV?C~$r5z7iBb)Cvb(6GX(#AHn zm%P5bFO8KQ_?^(y)yfzb$q;@whjx?@C=S^^Hc>*B?+eN_#(O?UI%>KALp0 z$vBNEb>&rES(zBySi8Ts9uy%8?VqGBOtPWg(X5x2C2iUrw$*#_b<%z+?cEx-*E^84 z(mG3ftA?HQe11pTH>8biV9)#AUL);hX%nuqsoo2(meyWczxMXJx0kD=-7c*^@5sHa zeOp=;X+08SFDDlH^TbN2wWMyiEjG2rK+p3PQWv!JTq(;PySzj!k=jSMaA~ z=+3+EJ+mOKU{|m!h7~hAX_BT5+`&G9HYue^`nJszXbNeYHq?Na87!8?Y>Sy?izQoR zNw&~JTb5)oS+bvV{r%lEEBU=pxveR8g5kP{bDTaJN{r9DA{H-T<~#%i%CT7DYA_&aoX z%>jKO#G{;YR0C)o=xcL9caHQ{4>$!l<}F@jr}73`rt83~z?*DY0qq)V!JdQhg!h)N zO>4kf!8V*&7Wvx)uw<}Y#_p2N?}Mc|lSunoG@WXYP>?wOzzHd=3XFchmp}6($g7-| zyoa@F-7Cz(%EznylcC61?A=rH< znnfMjng0;wmYtKHqgw6&1 z73f=SHcg7p0sCjL$2M$~1k48eN3bV0ERn7+vcP@-w&y2IYCm=4G!yi@po{LTjpWGy za|X*Y5i;$Ih^B)YfDXDzt5~^yjcd4ULBq@LqRa?o@fPd>rL;7#2}hcKsW%IzB$5i& z3HDS$#z+CF2U)gfLliB^VBKJgrs8SGb=4HPQxbSS_MFX)zR)F94rp( zk&k%SY@F3mk`Duq2T%59qts_8SP=C7#!h@{@XmIZ0yzYnKYPG+->oD)2ZNM?@Mn6v zDX9j5m4U6eO0>m3+T*6`~r=NqFf{og;XOu0^z^uU@y0Qea+9{X}ECRdB z6Obb4e8pb6Wk0CB>AUaOPqBE6G6A)VtXL#nDjb3NgRT3CdS#dc_s zdIR<;uyj)vLD6^s_OGyKriHLBy`*^92Xz5G)E75tg(?cjetY0kcBIiUJ(~S%kU5Z6 z6-%deW*6*ZXw7%V1LViAz(!E-v5MU%jl2YV2*%h1C7~Ul8K6uLp-X*5OUgEA1!%Sz zOQ${97T6zSGVk2k2s!sASTX7iiG>o6W4dVE05yg<{T^(b)UysY2{m8pv25Ba@jFA@ z)$G9vT-jT4YksGWvme5(2E5oNjj{?BjZyAN#izRY>Tq(^74UxqpB03!^pcp%fZqqK z;t%SOewM(}!CtFbDRsIC_D!$}{Z&jNi3;so+vk0Wtrz}itQ z*pf|B*iC_XfaU0tLrj9GKnB&80OjAfpsD+@SPf_6U~ORg=4^@9&@nLnl{H>3jsFfM*>MzX73`fWJ0jWnW0%~H zr(mCy+*QP>+I`~s7kKVL_%unvHH8l>G?2(&Js&FCZ0 zkAuGVXKS!A*N!JNQ$0$8yfXFXv2 zaceHj6eA6HgIrh>d8J}`wCCsoTL3$=6F*VDmbbca-U-eh|K)XK{De)9ZXHfLKp%i6 zDcK0!tmOBuxP~Ud9x-XYWZSsLBSUgRHflpzCdwWfuoSXJD_A_(h!2~i(OSS7!1nmp zGRcz7V7~=B#-(->$N)&NjK3q3*J=dY1Zus?wPf?d&W zt`6uLsL?^#S4>lnwV>Yz?c{F`CoR>08G;#+DjxvI0qXUIgn&G<;eF6OD^l7o*$stA zHP8ysxHVfQ->U+93N|Vh9vTNx<4REe#UtLh-czVh6q6PzK$}6+&4o)Ll&%2FLCZh% z;3{4<7`Ce;`;>vFgJ&AER+?ogSPWP({GbFR7G&X$IMIFAbC%q#82mTjFD0yoEK>yb zGq8vH!l?X`qM{J=d!VI;Y>pO$0zo`i;R;8 z_ARgi3CnciEEnu6U{@;s$ax!ie-5Y%Xo4@Rq>WKFm?hXfQ+7?W&H~d0Ys0OZOpp~z z((k!H8z%qE09yyk@?sY@r%M^046x3-(fBBZIi63C>7dAu z0R1P>F@5p5^L?8lQdv0oufR(Kgfi6{ZMecf{XS50_Ktia6zt<*;Q{Oj8%QwzwGOU| zFfAd+c!B!l`GIF8YtRONRzzz~5SS9Iz?oH&KLvu_T2Si-gCY=dqdIm7EBj8InZ7x zR|Sz?_?=olUJq(+@R}sU6<9M^Fn@%U_9K^IjbO2STTK?e02>7Bb`owqdT6HSpoO6M zxRN{r$pZ=ZVpZgFr(oG&p(-{(_peXD;=zhE!efh6@|R=KUx5z#3pwJ~v>iDD4FY|t z!@{*VI|TbNSer_`<-Fzfj{1EA{zLF-HGU6gNt{Uz3k zCIi+@yM%QxKd>n=>!Rts0INdQnBdQl&`j3Ayub?WSr*B+3MPguZT!oxw9v1B{RAvR zpY@WXErSJswfG6$77r*?mq5oLVJ-jZ5XvNrU^}Q;bBDd5de6ZcP;bCd+-+E9oJO;L z2A&Kah+X^wNG!;(8+%Vle;zCXY+AyKv3mqd1&iVj9(cC7tkLLC!TGluxz2Xngm*5p zr14qMpM&y`;|l0HUny@m`<|x>=z$yg(4XJ2adPYD+AI83;Gp{%|8xcZvI~^wc3x!L^F7sv5#4u`U zp;m?|tmF`jUP}0R9N^~(+xP(>EwsrvQ3_I0&f3`ts;}Mt$ z_4v-SoOJdOECKau%vtdr&icX3Q16*BTctGA2eu1#<;apr&R(!XGmjC3m zjp8iBm5owb?gsk`<`dz?TF9rnz$VZ((Uav-JamHXfGzm3MA{^DfQ^Ek3hWi7$#$?+ zunYci8~I-wSQ}WOnk74M)(RE{c7%@|T0s8cLrXK3ONpl$>}z0I&g_(;unFu_U^R{` zi_&W&7=JRD&uqq-y`t-@2CyzuVo74wLRZ7}VEh+rINQ;%66A3l~ z7OKMr>B1luOpY-o1K3O262yQNqu$pT<*#Uv-+`QJNvag7zWY9rlq;i9@&lA~`mxgTF8kHAql^uxk)Q87vf30NwXulQf$U zFbUXOJz>-35m_}D^jbyQUD9F6Bx4ZRB-o`F+ohZn2&RSBi>|`DO$u!R-%BXQDp9jt z!TPB6JFq0MQ9Bky^4x-jgEeVbHpz1XmJPP+!$K&NzXkg>Sc@mSp}oyD*w4UfErlYR z5sJ1;P%C4SdkuH5FF>Rq&BzMpAPl5N!D7ib&%jQNs9h8P`B{pJQ?M(rSyy&Rx%dQZ z5$pv%{W%7i2PrgV)nvINusN_fefFN>=@9G**aKTOKc*N7#M zPWHhDz%EUNN!bW(;rBpGKySRn={gnu;bgnl;LG3%{_H*N$9BQ8!J2&84Q0GnUdrEH$iLFLaxUQ?RnNge+&A`Nj&2g<9kFo_67LI!51|` z$(;#`vo%n6&^8~TN}5J1{VJ#p=$^L_W|vMquYl@MGKeaK}I{;D<0qAg|jI95eoOLSq3G& z8L$JeQ!z^-bMZ|nH|-2qi~(yQl}>@VfJOPSYueOIf;oUKxUg!P=o2tMuqgvsgUhUE zzE-Q@pmhql*JG3#pfpt}9&mraV#o*+;CkSDo@|tyncwo~Qd}9(R3_xCo`QJ{>;Npn zm&MTHH463yjBi-WX&nAlXx?@mtk8!glWPuxU4vDb2tigkln91E`S-lYfHt&<41(MP z*>M&(dCyto(AWdu+2D~zte(>OBd`>(JvB?C(0>RP1=ip}J@$iq8zfVZo|qOW$91Rg z6l-`{AIiRpvQv9$iTa-Ly#0*HBK6*jvX4-9XerLHp7Ked%^&{|jL+`B!LM9d1f^2` zOaW&<0_$>QvE)o$VBZIebYZci=}s^^uos>zni5zCmF7yvLXw zlXJI$>4Ejyiz~c~O&?QmwSvD^k{)CAgn5eu3ZoWKC2D8+vq1`(X0SrA3Olw%I%@*^ zYp_T9;%(MwK1FpKKh#C9&+zz814s-=7DzovG)SQ(Yaq?lf&C22P0}59mu6lI7J+)N z8OxM#Rs;6GU}JVHggpHLSR5Gtp!B#G1XF=MPzu+s(X^AU0KHL=y0Wa;679Ik!7jmG8M7&J+A^?hutp}X@)`5nB-56H zuYkwcvBzYZ60lh?{xL(Z6K6$WBOjPpE8G9~4-A8R_T-JiW7 zRQaJ}zSkxzUu*yq5~d|5ClAPvk5tj~!x(R5S6z6%znBiXi!GpLXc(wduslD|SptwQ^;ZNR$c ziEWm9ykAN{Hf>&#QQ=CT%v#5Pm4SRL3G6-CrJ1D3*dx~Vimvq%QE-HU3^mIodnJJF zfbpxSRbugAVvL%t%UUVV$AJl8ulVDH4v!4(kpQvazrz}}q$L#E2GU9!1KNyUQ|-lT z9%G&hlt`k%AAm<1vuX0UD6np@LU&=>vW#>R3CiEI!6#Pj$D&ED2(W2*_MDPk(wYJel@yvx)(qa_^_8at)XU96|sv;091ZOdpn3bh zMW3mcj;04&9q8fkncbrz}bFe=L`x~}G_B;df z0?Jdc12@k2;>|~J0Sk0zXXJV(U~;gD54%v1Q9ZKbl)3nYW?yFS7xN}H-P1Up`NUkT=@X39jwe!SXboG`oW*q;v&t1HmD>=iWgo<`XiLS zUZdpqC|R_kHF6i^mmsgr*gOUCE3j{YJ+Nof*mi<_^r44%kn?I^9?oC53IU z?|_v$vn|r@7MLSgP5_%DH`@fW0&C}wbCI)efT_Ud1y(?TwGOtYONt9*Lb^>Httl@+ zrKq{D%i@WxfjvRZ(Et`s60U-M2kbTOH?M&FB}kMZiy|W|gM9_8!-J8cmViD1#J^PX zUd-7d*tfvqY}p+7*K;seF#ZA3DXmcanQyLs71)svOQmV>XU#d|?@r;JJA^bX;^7b^? z&%yRo!fT^G$^iWCE|=!_pgUG9M9JAC*f+uARqTrDJpubWuqc1wz@&_>k{^S99dujH zYG?(T0Q=;J9tCzlYwbAL--7jcvDY-p7?>|us41JFx$u|0aB1wp$~5GZ!yuL*xt^?$ z^5YQL1Wf+Qo`sWqgJ4n*XhF#;X@mi=8a)43e}}~q<6q9ADUY? zSlEYWtGIuV>vw_8%SoCkC$>y0TqjsR*o{g!Fpeuh``+xDSSwfqShPM%rf_HhYXmD&vT*XkX0Ur;{A1DAlmME*3c%WI z*cJt6BUl(%iM{Z#Q;O^cz%OBXonrAz=XgaN30@EWOH_Vo$FgalTCg92-4&CWYe4=Q zq?3QchNkxb?CT#GV~5n+eXy^9wR^L4O7_)YUjw`6!TQJvtH3@D_RfJFklR#(`Gd{a zumLhk1(*j|r3dS#w&h^1V2xJnF=do8u%CVCkH3JHwpFEI8n8|ewn`3C0>)pR#0}cc zpCh5!7K5GP8J!_ZRwQs%1Xh9Dvnl+#jTXH^FkLJa)lxP?$)^D97aHns){ecT4O2eY zQzVsW1skHd-2?O2rh1D;?10A21G55KaA(g+r@3IC0OOC_#NOd72h0Sl&x~EuYLX4+ z2Da9lWq^Gdto)7;qllw%(m`Kok&OJ7|02{Rzo|95U|gE zs3#W+4TDLC!Jw9?$-lC7K|vn`CIwrv6j%AJTHK|P0>MvYr0-rG@tio&qnSUMQLOdKP>ItSyg=jAiv8~;+W z*%??U*oe3Ese6eeToV_NM={Dj=;1T{Dawje>;bV8u-|~y*$UY{(UfhDL4N>xPtN8k zV;q5f7OcvfRmnIz1p68o|7PhhWw|$Cp9HJ+WKSuHAAos)#hXjQ3|19~u1%C*_EF-B zk{xSyN~7gp$V*;=@fSez zdWjaSkNjx|?7Lu1=B%4?$u`(`KD5z%DJ=HRZYuFn6$c zTlUFErdW9aW&-xqm^G2T*T7U@qSdiV) zJeC3Z+a3AbLitlc8qSu$E>ZENgRmQL8^GxzXeMgDlnckcxuomope3OES&g^kyU)PJ z(LP&Ck|2$djhi-;qzfqd6>5*F*%`$Z-}Q2@`ggDq3-*ShWDe}>V5bTeMR%Q^f_)b3 zz)NV)ZHBC3{V$AK^fzg9`2?kJ#iXxQJexBP(h5?H?-PuH@K?<7IzJL`TEv+CC2u(j zS_2w^XTOF)B0yg9muQp!4S@xL-E|PsR2>RV2SNY+19f5V=^}Fg?61HE^n@yp9$I@I zfqn*b!IceC-gpRR3bxN*!A5@652pR0wTzw7O3?>q2NrC`CP=@%U_M~{CPEWgrw8n{ zK=TW87J7ZD!*0N3z*G+*%qWM_co%3R=#33~L5ZLftR8HKyFa;W2UsB3p_(<*zO)_e zH((F_St*4{8`!^rC6QLJuYyIIvRNf(Enx9ry@o7-maS$mE3gz#>8jN;uV&Xe z&mG!AG@;BAW&GO)7v%7bV1{5Nwk(ec|o^ zf?m6^eY#h{UoFmqasq70m*rAem4opgvEZ%ql&p`!p$x1BEQCM6O}Z}y^TpWf`mBIP zE&c(y; z0q27qfZZ6fOG={mz&647H?U`ECV61|rG|Va`<|?kY?2E$0@lIrCsHEI0gC`ru{Cnk zY@jd**Nh!~7Rc{F#;n)`?I1J3{u3;oe#pq*1X=-+^r+0*{v zF31l+N=$?jpC*dVG|;bu-ukmXiuP2nAA`L%X74DYr-1z>82|QM6^)z>_FXXkVsG;J zB%tpA9U8MxN|K3SI!JxH9^zfE6?F~OO#r`xy4)Y1P~G?sT|zf&ci29qq&Toofz2pc zGkI4mm><}zf;E$O#(=qk@w?N#wCF^Gd3;E_=IkNe1>lcPaxdJ$g+~m(Ye{z`BEbs5 zHcVI@**yYG3#>js=yXXU4+#h5?||f1UJ-;&+m~efFwm9{TRuDCtyaH;(@@ZK&=X5x z)iRr+AQ)5!bi|2~NI^ghs+hGTYXySDz}=&rg<-3Hvcfw?qM!4z`5U{a+AY8_z_m4d zL!I4#jlr*5EW~e(OASV8Q}Y)5G3xf1vMS16*I?sdr>-oCEDL+-NTG2IwugGX)@*_n_am?-jB)PC#;ENfSU$#hs$t8NAKrld4lI`68zq|@fc-T* zV#i-^%zW8xL%raAXx-#@*SgyBow(U2obA!_xR08@MC<=xapYoqKtBZvb!2mN4aPr- z;WnuRTamH?a)({8|G`A~4e@DOP+oyue1=zK9cp$??)ehzAJFz8W9yVM_#0|?f8Pg7 z@?*86=xwlXg2lVB6N>OHuo5U?*imwB8?IgMkVRA6L`fP-_#+{8ls-4W=>87>*x!U5 z)2?70jGj{D4>{cto}2ZMoG(C0-~7ER7ObC~ewB;FA8_&%>TUT8j+khLkjg z(IR_C)vx7xFPt9hwOB?7%LX?l(Jl||rcVqn1Ne)HnP{F} zQ$dWgY~G<+XXs9s-M$BZp)M26u`4PF7Q~s374&{tCVI*)2)&a?c9nHbPYvm9v!Yo> z0m$Aegk?W^t+Qx`oe|hE(Vvx$`d?~_48n}-4N9!L{Z{mBErRm=3% zI#&1UrE5RpFuuwoQc>HtZ#TF|=r$tqR>3I=(c@QS|7=Nh=ixu9FmE zU9689&lww(t4nn=+&j&Bv^MOD-TJJC0{WfjBv}@V9+#GPeGd8ijYXZTmnuhC+O!)T z`pp^!tLIz~^tOB{NXx%!P3IkIforQ0ok&#I_}wNvq_RH)K<#@~J@YG!Q& z3Jq)uT{6wu9G7HO`u*;Y-Qv9G>_SXZtZL0~0(ylGw*==+#}?;#-CnJC0eiw-Glv%AG4d$ImBXmll62JbLN`fgz;i}BOO>K5mQ)+eS$u`NO+vM6%(PY%6d+rge{aDg=r@^e?&J-!Cjx|#4Ne}aJ z{r7HB&VLBg-L<%9l&4qVp6K7@KVXref9kvH7w7TDa$cS6Rp#}?^0Dl(BJ9pMWxrb1 zK&_*dh9l|*uYGyCB1fL-wr=p$vr7Be_Ru54JVl&ocp;wFTA(ys!)S44{GRp+WXCCHvAb)K=XclamKnl!fS=98cm2}qk()zh$ zfn$)I<9jTVaH7Jv$!*F#TeGGU%ht7n+-saqltmV++Aj?1{I;DlJsS;@T=tyHX-0W0 zgPJVZsp|bsmEHbLR;^}_?rdru*&OMGd1jkFaf))&Zqd36ly7obIyIU% zm7bXlOD{d%+NII(IV^$jnNnPK=h>Y{-W+AKctT-nakYJy#Wwk77K@X@ao^X9=eukk z?A~_De z)qbbiv__q%-6`MDP0)F7`%34~tMN|0{d3wYg|Yvjs%Jiu8F`RylB$)QCzSn+;EJR2 z@1tGsD;_BxIdq%9vMiGa8qQ04EIM@~?Ydo#DTqSYzf;XbTb*0wnf%oVRpy~SwT5dx zb8gR+{P#Bu3e+oplaP;#R{_AltmROgNHpw*4e8}9<0N0zz1ySg_X6O;-6 z@KY*pF_-n}J#w!wFENkvc}w>F{XY{g6Z96en|#7d5}lF)2J9mp@4CM59#^zkpV1=q zyPr^)Ema1)1`3_pNoJi^UGlrq z`=%|931*XC@lG?2BaVZV?|=ORsyXYeIJ8=F2^DVjN6oTbEBzY0v)FsPM#B@`4WDI_ z=2!nj^)gIUg<9R7Q_iQV=zuG?HQO|!N9s&Xl<$VHWc@}qqnB&_NcB|ro_#6>^DqCA z+T^(_ihW)hzR`MO-Dc3}_SkaX<3?Pke`}hpJ~P|a@Or=a2dbB<&mt)0{?FgjSyzB~ z*MGq639TLf{e2<_`qBZrRhtFdb;n2K_&@(1(KsE&fPBkzTODDa;dJ8`Bu#K{bLcQl zl7~pflw%aV|Mgv}mm!v|+jSX^JI35`-yo;^&%Yx)Z7;rby3(JbMDritA#%@E)^D_> ztk%8IoA*2>W&Z4MiTA6NH;&KUr#(XbS|t6JDF$i!lm6`{6VftelI^B;JZ<3q{cosd ztW2v}>%Go_!;1EZ@s8}0R=I!sHkG6(7{9O1MF09NIxErS&YqFMmN~*h7A7 z9;3Bjxoj41pYOh}_rR}%|K@?{r+-eR%^G=@@qtsFU6N6z!=QVr&y?vax@`Mrx?W{_ zjzYTk0;ScTe1p!r{3O*jD;9UXD<~QK`0K=)T*Nu{p@xT~)E|9~NVtwstLe5wv|q7K zo21$~S=J_fV?HS!GE3JVk*6BOdfjt*?f24&*Z<-Fq55x4#H|LiPG=fU{_md=nO8|d zY)&1M^#>_?{ot#_%B{rHzFodylpO!*D?|$YB_pa>&lLUFbh-DBUm~_>Aij~TX-{f6 z`G+qMx%CoKrrs$u=?JKz)$8v*O*NmZWs81e?olq+iZ#UGNf&&BCx2bL>$;{4mmY5w{X)bO>Qblv|zIQ8jpxu6vH zS05u9YbP(!vFe#HCg11sUcq{HSD8U+c(XRy)_PO8(4w+$)?6`{%ys#Xvl% zt~6dHrF_$sNQt{JBctm@~ z(AE9doT#KQz-ULO*Ev%wR(|bsuI^BkYWJGuvn}gvtLFwiHe>$VE)izU6vqF@k?Qw& zix1r%%L6H9{>+ZZJ*DikkNg@HHCo5g`;-^Hsv$fVAZ_;?P#nwqwX#SrU$G@Rt-~fL zn|;}a&iM0JwX~`Hk~N*Z^O3B(w=17JP0%L!i&7+Od&(MG+&+iz`V1OqMJb>AjeDlsK2g3830Tl?B^Pbbs-t>H`kKJ}vEmiek} zyU=9XF5R|kGJB`JX+GoeQvBRu(5pyq*t68*o$(XrBkg*vK>s$&F8vx!zr5Bj!l%l) z&3{gN(Jsll+|y^t{*AIzw(eWRDy)v}uC?FUy%8STcltzFz45wdSuU-02$E$h(mk&! zraq&hDTW9iHM-sxt}LpR%gS7D^`PyU_Jm=RU4bG_cTHZQZW5pCSJ_n<)XNqff(|9}Wv)qH7e33*#hyv_C#pJWw#ggUS2mmS*NXS53)^U$3)lM|tvch%Yu{Q~ zzwcZB2R@I?&K(X6cddHuGG%k>b(bfOb>7FCLsgQ&BbP&Rn?E%sfldvTk3F}|I(4$t zq5g?Nj%HZBV4o`cJ?}bOzI?!vMrA^ci#TfhSa{#QTM$tYCY_|XL4v)?@^)G z;v4Vq+VlzC#Q9?bs!^t|7}ks%P0vx2aDzE{^PL5n&L{P$EZR_<=r|xu68VH4kpx4@h;-QGt}KLBfIre9w(6i) ztygH&r4y?gFTYghxvtxfJ1i>u6}^R3Z9S2h%WgF%|^7K z-I3C1Boi+g1-Wj~<$r*L$UQH;K-*Qxv`Lxix@n~9$YCnrTrp<Ax^L(`wY3b~#e^t49q7Y^QuzTpLJyKe_?RVtmYIyj$Em{nF*@nri(y z-vWmn@ww`rUz^#P?VRbQRf_GrL6|hpB*wDACQm1f-6d!9Wz@Fij?;zqbLWS;g%0}; z30eH+1pBwuw;6-PTFAKs~mjoJw9?yqU#^HS1z99Ikzc|zGO{MQOe7ao`=f7KGs+yklJ z4A&SFxqX)Y-s72qiCi`G_dd@*O!VQK6Ib5!x3f0!El1YEf0s+-1ikXNk>kt}T6x5O zFptJ@z&y_k=}ZvWn|_wJTjlZyB0DwxeWhlz{5SDL8e=+p$U{&N*&5N`eH!}P#*qH* z^=1{${LI>b&N@7)#7aqjKj&+PAhJ}@-yz&B1d)Xv{hh*NM-Z9o(%*H)!iD9Q7C$%B zq4RJHVNgN8J1H{Nrt`Pvk|VoX<2)b!iH#sK(IU2ZM>tT@j}VH~GCFT@5E`83ocOs) zO6LuZEQkNPuEps5pDj{Y9d2{&hE<@|51BEWWeaGNFlB^ zZpLr;ij*QE@73aN?RXjg8DBx9fQA-y*nR3v--ODaxr@W}dL4R519~d-$e%SMed=my zczM29d@Ku=2QyA|WJHRjvIgyC%UAMQt4Ny>{_BDwxs>>-R8pe%(mhub#(ykOq%9#f zZcdug64T$crmU0yR-Q;E&{>k6Yq-gd<$Y;_>IMH1 zIFUp|B`tQ6Lh}nvvqKNXqKJP^6&T3)yJt7NiRA(x7ec(+}OH# zumv5Hlr2g+)@jek>G(!6D4}DCkZw)K5W{gP9j}FSaxYQHC+KX=F2<3L5$aI~IbX-yNtLQkSo6cQFBx*$M5!E8)J^qy^Dk~P&7#)8%j>9iwzd~nw z9#7s@hP zK1H2AbQWV37iH}jdC4sW^)l^Z=$RDuLURBOZ<>!n7h?u}Xuqx(4vABA+6<`PYwbgQ zI?iepV7zPRK(wFJjPg(yi6Wrk5cRr-YV8;WVn%by_w->cJC+V;(=kaBCD5^m4MBZB zZ$m1|btX7qas!3GRdv%YgTI`EXp}e=1MWMIL+}o}0bk;qR#|Y7d5dwJ;e12@<*E1!L51>Ee9ebeqLGx%xzHHo$_JfAAx>Q~)i`Syj+WqOQ&Sn#}3RG)wsR88$43(gNs-W^T z?MbLOTT+KnqFpjSMLfk}7BfGT{DeBg2tvwNsOZEa@RM}xv_GM3xM&%EmuVIYzkr06^r*g^@~K5@I}i&ftE$~genjqd(cmtYz%g2_1J+> zz0QrWX^>MaYdlTsu21=F`j@vUrAp65w$vYqP|N_>fv?QhIAIClY*4dj6e-_D}p7m9r(}F z^M6^eTc6$tykkO|2W2b^^jn(z7hf=^L61l9_6EBrND)`I^*HX?7Q+xp>QQ(>gK{5p zA9QYaroM;Z^@~PJwj@W1Q7qEpmBAeJmJR9J<@Jy&$gKmOlIpVYF{(YP2}NYpTU9_` z;THKYYO-+xZRqQf#7r zgmyi=sacwV(7yD@f;vx}7ck0QRUka#wc#lG8+Knn`i`)xhBTS#ePo7h!vV-Ks+)~| z-g<0dP6Z~Z=s!yu$wCdGHH|WSHg3 zW*YAM#_B!N>aqD2LZXUqTtuRE!5oxx?r?_lV}m>-iZe9o@*c;X%AqQLG-BO}_ ztS})M;Gw)SYc!d5bjq<=L7wuZEWnOYWhUWRDYg#DU8Z=6GZO90t0zsDol} z4F8HccU{I9eU5QBra7)4>pgUM0gV*epTjJ@wpnnYYv^G>mIiNJuuXvX_*XXMZ6KB1@#7p>%Qlhd%M@P+Q0>=A|BwCRxu6=RosTp_@p zXv*M<<9a<9vt8>{Mzxp4&3u9)QScY&?3wEhe63g&Vo$UN{nw$tgO3y0gG9OJ>zI10 z={wA%M^O*S#^u%UoOl`kxQF-qFZ5p*R-;W!vCH|2Zs&@25m+x^)_KdPaFA!xH`uS7 z!*L%NwONu#@02ITbga@H#}F^%<;Y{p{1>>0FIe!O$>#soAb74S$d2f_5r2&g|2Kqm zJEohANvCMdV5E6z%onJ12^Tc$kgUUb2Z|ck9KdOItS51tu%1KDsj3QC`EU7eb92SO zl?TzHTk{4rUs{(z@)N^ND5Xr%ivT#2jleJ$!a2-%rpiFNd8#N@ldPw@bx_tAoPALwS80}NMQ4$4pJj(AglD<=JxG3J903Qf zHjIQNdNB86>@lY87Lat#teSCUbb?WuEm{zUojQ5YTdo#VZ4dzo*PI72&P#_8#KngF z<|k+#CH5mo9?uYz57iCO#yi7g%plt4G5XH7xQ5Kn%r<$))Fly zB#&{-l)OhgXR!hpDAi*MQao{Az|z>|P)m0cMW=}EJ?m)1NvqW`Za<_VQ?)r!k8jnj zkYvK>3Lal)6b3(i?l6Lp(jCnQd&PxUL6Qg|v9p4pKBDZWI^2ec( zyKen(y>R;mxZJ*N1vWU>mV?L>j}1exhbuLxfonEMo6*;nu<=Fe``T?EvJAU6!1c=Q zh7jT1Hg!0b+ibuEhs=&($!Ps>Sf*a`5d9nr)7*1JqDx3q>(+%tlVs#8N`7K9m1 zId(#}C96*K{?I%Wx$Vkm-hk8-CVvU3nq=b=IZ6 z>K&@9>BBtHBxYEk;7_`9V}FzW`w8iL6nai|YlajdPRnSWXMY#2lw-FKsUoa5A^UU7 zHq804(J1EnUXg<1q~bZU)Ki^8-ls@JxBErW=<>N^9Q-NFCJm-4whqL~wvNm8Sg7=! z`6z^qGHFNmPmDU?sY`lGS~Q7kaSC!mghvicao3^4mH3wFee5UtbnBsvWZ?kLRTZ|ZY^VBfGYDmn6FuU`FSdRk1Vm` zGz3?=YkLgy3>i;iHQSJvV0#*c9#>q$P`kz{4znyl{FR$!BPU$wB%{{0>pbE;NK=ih zJP%c$S{)*T-t5@rOvg2ox3JEAlLbdQ z?^k!CU5`N%eV`~B$M(DcP9Eg>{IgW2$|V-DlpD7nSB5EE!M+JP5WD&lZF(tiMRmpBAs!mDPjP}QuY853G? z3x<20n%{nogc^2v2!-W1Z-0ygFGKGc#`74hOg8WZqWPbr|F=I$EspHxuqMw*=&VVA zevPZ3?ov$#T;ZKf0vtTT<{`FQ@32K%)!LI%KOIP$5vof#@T$iEB-?R&3RUMgEufE5 z+j=-(h}9NcWyGuxnkhFuh3d;p;-UIzb%QlY5^q>4(6NzypAO!&aQ7q47&h5~aE~jO z7SIdL6m}}%1|cxT3!PH>xQ{)oxV%nR))1|_lwl1 z9``(ppzcevc=$)RNj?TRRVE_J7PR-EybJpz^u4X#$52u1r_|jU@>Hnf4Jw5@;1^0n zB?zNFc`A}bk#&td4R--uKGV9ClB{Xs4A?u_p$pomP)A_kW#uz0N@;rSm|==;DTH0a z4r?AZuXV0RD(J9mgGItr*$A&({XL9)D{sSbN*)1Wzr291@^we`Xy|vcC>ZRS<2}Ue z3)^0-j>UR%xMkX$o#a(J;wv=2#2o$jO7OWSG$N59csSg=d)8dfNfS1YKu zH(J;9QMqUiaarcF4Id7&F2k;T!{QX7cdA;npxS-PEX?~{Cs2pZqog-qq+`7MBgmHM zmV_DYI>o_Z_biuT<4lt{EYwpj4aj^wPS7*O&o_Qc33?` zHW@QqM!H%uXvNf$bO#~gBd2*x;jUF5+&R?zHH=uI*9uRVlrO=E=aM2U1Rdg7E+O|x zMDmKq366^%ui(e0_I*&;fOHhb&9uD>e=D?{L_{~4jYEnFgA?SgCPh8GGYT_a)s#Z! zS^k6~sk^~69cJlM^}zHGb%rtHEA7W$qVjR~(NEK{({UK-^#0@r&?($9P6Q5Idbt^ICGk& z1(r{>*wT>Pk+A!UvfG?yd#Xr-1&?*2aVfyxX3lA_I2XqyVI7hChXi!oGJ|T1j+9yAS#3Ty})gQRiGpac;MU+1*&}K$>OCQ_SMNUINzW zTzyjKW8{Dmmv1m@C$`4O&We4#otkojRc8X3ZKT2)6tIEq;yG)J1|}FuKeWFClsC*muEd1C|F6 zb6#DJ)bmJ^3tvj~NWd}7V+&ch#BBhBmbwi4vvNHOPJClO};;kl40`z zQ+sJ~3}36#J4ED#y60gw6_$yxS&&5tW)-OJ)KI%Aqhh3sFvYHf&Ig5g9GeAXO8rSF zvcmZRjuFn!AZxe78WP1lNE~K+fy#4cT@KX8v}y@He5H4YnU89BV#dd^OlZ1J{CQIU z2GrK;I)%J+X-7>bjPp=+L3RyiOc$4;>k6}0h+V9Hjz#^6ZX#T+Sw4#)dbRhpsQryN z6&DjTUm(w#fUpe?cOmAD%^7@Uj6ae_bqt6-juSA|Bb!y2z}?y_4xe5k`|7(N$ce;12x zDFp5`Uq$YCu9J-k?`uUvIh#<+h(ij*iLvR10M*7_|Bt1&j*hj<&O5JEQk9sQi-hes z-Enu@ZpX>@_3h6+E6G|jSxzz&a_o5QWRgr^lC0n?F*7skikX?2nVI1Vub4*X*K_~4 zXVqKhYWyP#R2>f*;ZCbW)o;0pk{2bZJnN32^4C?7 zY@D;sLCk)4Or*cgTG#Q&^Bl`FvP|wyW3f;wImYjvXDne(+g%dYykQw*sbLwm@|@PN zb!$CBU}sjooFv<@(l1#ciT@UW40hxx^o&#UBU)UJX#-0CDm|jO`!tuB{@<(6Lnph{ zhQlNg+}efWY1n#}Tsth&FcN6m1>8CAYh)Sda>VUe2D6u}Gvq?*{P~DazYy%qF}>b> zhBg*ta*D143?FGw)dq=(@<{ey#kyaM6~~_i=0zTvbpCS3TO?Fu<%8s+jXSBlM5A8j zMS1v8*T+s@f#lU{f`FSXFOX`#xi{Nkx6wA0w4gtSczktR=oxi7Pt^IW>lvt(DN2Dl z*J&9EPT8jNWq@S_yRMxLSl@|2;}Kei#SM;z%omulqU}duEAAT@ns=K1kw_@hZiG`q zuaq1v zq%r2?M+-QzUv(29)>yBit`v)ObMg8??;E8Zp!ZJ%Ha*lri28=-C@r+_N}FAB@6voB z&UyD-pnq1U5pRO>fH>RDd(4E%0X;`yYUq3MV!>^j$t|v%ZbB+Wc=gpE#bk-5_~P)V zSE}fnXCt8oIdl+WsKtu-9{#5dP#W^;V$Yj5s{zGV(*rQCmCl34e;xf!`0H^C=OnW4 z8VFdkAHUXKT#wf*V+_~K2K-8mzYv#ymW>Jnoo7+)q~ipx!!0`5#(PY1`S_`hk7Fh& z>ZXsMZx>-rVgFTgih_D_-UEbI^RJMVsQbqIsgg`2axZTK%qp88#z>nuwFuzQa*~d= zX!;B?<@zJYaY8%n*W&$CuL1DOa=rMucs(f}^b})=?HqO0YWxh&w{C&>*_C%tPuo_J zRBXLLJ^W7S4g=GFI`}M>fAJV)dZeNonKU_Fa~HlW6Yt(j)}&&blT=VPsqh}@9?Vu4 zt=fk70cAYkJvk-dve&BrH|J}%IzR28&jO}1`ct6e3u&*~R8kYG);)+e#i)h{#o;{3 z%m@5$=Ds?@yRTLd5FC2lu|>qlV<9QWv4{E?wvEANlFdE-1Fe&xAj~`s2y?U_c;0f) zF0iQHX0Ll!Mv?ic{C9*(!+CKmkDx@GEV3{WV}1>~L&ni`pE~`0(DT&@MP0kD`=sUV zctZ_F*zbV$o54R2k$d{V$%I=Mfxo*1Fs{11GdsopnZQ?UwyDWR>v}ZMYuZfU?b=&N ze#C1KFZ&Mhbln5}3M%|gQ#cvXh=Iy|_cQK)J2{C(qmDD1Sz!KZJ&nqutg;!eE#oPv ze0uAa(F56S=qI7s4V`sLs!Uo-wtu$zgK)I$xefmv?&&0d>spK?eO;3|#pb#M5@wx4 zFwXaFvPm!B=K44HO4`E8i)JDP7@+w84?(I`*j#W7fxTv{D(ZW{tc(UZG_13T=SvzMc#zEE1l9t3_$HrMF=&^85I zOPbN-KKJpJb}{?H=!n_VUXKW(+9QX$4066i%me0M*$R`1@Y%48vOGZ8PlzE0jydB9_;@_uv|r0A+9B` z>#G_Gu_~eK98y*}2A#CXdEFvI5kjFX zNl%O!+P$!`sr5jJ@fwTZo9aI26*Qq!j^$EW7B$j~#eI)PqTWH*%TA+Ucx9K5jY69yY&=;uL2H$2 zi5ku#;|FyUjqJf?6q0966Ct@-{}}{B^}?v76whwvr@Ah2p2$*XW35p209Kcdrzo@A z{L(>W_0?nmq<6HMkXE;3m6JfK!v*&hd-nD20+TG1yDaq*VpzaMrRzHFx{>#P{E*AX7hEa%c*i)1 zt+w5!clr`?fyoYfE-`I+h=u4B#>-sxzQ18(EJkk~j@y$lIZ<+GdBSwoQ^Dq*cEO z@9la8jAeR%OSnxSh70*u`a_d*9_W_aw-EBB(Ydw=Ib2eLwyNpwWiH2HU(K9jBX7Fq zqD~>&`XZZv(NV_)Y~|RGq0bP55frhh8&BBzfPQO#h32m;Ohh;{za!keIDb`$vDl)G zG1%e~=0XfRwZ!!-&3`5)i=UtQwDi5eDUrakU7~TFQ)Lc18G7+_vUVuw1n6hxH$J@2>J4Y&$B$5zF#5^5ArS% zd?#XQVpf7(Bww4Tv=!H)*@+K{ZrkzWr`$gNRWrMo4b<1I0AHbCtByRn)R(LYaoqgPhrYnQWIu>D$8Bq94?|}AJf-d^fXfqN!HjKe0+)K`|t3RwlC!+5smYju&+>gKOA;wKf4X3<9p!Ie;A*>Qb6(pRocE>3goBo!;ka%X8 z$YJ|NuLv8RlJOsetx?b7&mw{vY=yZUQe;E&6@=>V@)c{lPLHIPVe-JXxMr9PfhYQR z6yKV@FXxMGBVp5Dr|l2KSf?5!?ijNH$hp_Kl8NiyTK`c%umCOJJWfz)p89)nv4jub zst|0cOA?gl*`Jd`l~D|3(qvFf@9ftqC5KAS5d<@&K4a(TwoZkRa+6$$xF^PS{VVEs zUbYMZ(~<@V`Ez%12#BPV{JmbVc;i`*fh7rA^m&l5fSdY`A~6- zF2g8o(*BV4R88$HZRa#|LCx2(gBX2Hrs2Fwvz(368*K&K>_ga{ZZTJPITeplGG9I3$bHdu z2&$vh!|>7N)XmyD8-GYFHtoU2qV6<2JUc%ii7yTdV0LTuz_-?7$@0$d6=W~9KYst~ z2j_LA7RQ{Q*jM|U-`SAX+3QX%s_@@oI$BH^EcN2L`?JNSj#L1;a7Tfch z(F#rB-e85Z!f2L5z2vQ$UoYzMznw6yK25uz4fYMC<#KUa@W-6y?g2AR|z7 zlHeMQulQC(0F`YiwW$!2_Qyb#Rz0&KT^lKrO2ct* zJ~im(ru^gg)O_U7<2VPFR}P(&c&$w{jQg7&Gwu(>%QRIS!9*%^IiV!d2O^#NNp0BifNol9SIZb}H%npr8iyew zKX|G0ctGlBw$X&%XmE?G7>ymQtUJDwU=E;mXoVp435@|H{em#2&Ep(JJl>|?un}RH zj39IL<`H0>W(b9R?6rx{JC9A^$o42A;w+~@y4#S&IwHOu$547=rD-h@PHOoe{t3-X=2t0}(3`JIFOZJdU*ju*NZSkwkyQQ1-&Fok zTLWF-xTJLAV?9dMa;6cxF0G#w# zqNTS(U7u|oTl9!oADWCb%Y*1mqjsQ7FiL{(gDqU9zz=P`yj zUz5>>-ZX*KxQCVihW$r=S`G0~h3mAz6V<@daFMp)D>b}ad z8K*J6I&CPXq;Q7zgRf=dM+@P7Q-9h(jQ+9cYWhY)I8&}aV+SFZCe3R-4ifhc0X)wvMI0Vt-@rodt z@YZdAgTkt?nPFMVm~2@@BP=qUMPbnf?L>YfO=o-U;!Y*m?T}exhFN&Xl&yjOmi8{d z9VsZrRr0Ez9y9ExcK5l1ZO&IrTZLm5r3Yc&1aAo6bR~ zp;W{9A&~bQayp{i)w+&1wxX`JW{qgb=Si*j|U99_20k z<=gHORhCsL#W88n$Lw0K0?@g0Ph)e*WmT%OiQE#L_rPYwb_Hdxm_$+uDSEA}F7es{ zlMT;2tbB9-MqcBt^{B{KeMqQmz6RT@3ko!|{6ZMYr zVmvFUvn53_oiE?zlArx}XI;MO0Fe%vBv5H9Xy8`M7Zx)#I`Q488pme=>^vIhu%^zW z#76iGGm4Rk@j%i8QCFJYD0SI&fhX{1JSbTvzChhqs&Gi!K(9!4--n42Wh`oJv#7*o zl+iNtilvc6kf=&0i$O&)k%WNjkkJ8%-s?7iXp8nFJdJy%P;Jq~aqQZPx=PIJsp)8~ zeAs(c@4!}`B9#gma#(N|d0bj=6GOgHxw&{9sDBR{qZ(}p@LvW1Y=g%cW%|Y7n$%Kt zhX8L+%a5^AD-f})xt9=zpPM&gnNrnL1h+1&xLtK~`aM;*2#IXACuXFcN-}b-J*h zEuF${wfh4Ci*=d7evb1Pr4(j$0@$I(r{o#0TS}vTv9IM0;j6K*Hl%ZdwN7a;4kn552^^b=zFp$FS8pCAOruz|*t=-W{{u#Ycp0B_+{h?@f+9c5O7RBFjt& zZ`17{<}CMPsO)ilXWbXwK?6}7>&Rf$a}8vpY`qa|o=H64;T}Q;@ml`i`ZX>2&sd+by36_-AzzsU;5FX(iuJyFoxqzVtwUr} zT6<`7P$LjK3#zJL2=52VWey8p?BW!>Hs5p+RT`>H@oDy(<;@tsqIZ)*p)Ohd(|Tc zvYyl%#Q3T_1-U!L2IH|}hQjcbM<9kW+Z=LFH~vnvvoGkV&hZQS8MoTd5}~zeRxn0t z=Fn_fP*Xf%9?0t0>R*92z@{E(Gp$d7q|hP_T`w6GvsFwO#F1=+egsh0=|+=uwoWxv z?P@eq$I)(4gt_OEM zpwn2-Ux);|G3zbQKz}(l9bg(_mQHxR2JJAPA$@_X0PPaO+R&K&ec_^6na8|ggIZ8O zmqan{N$Ng}lDMGR1Uo)+n>s@vY5G;zjFCQ5(!~y^Air(v2QWu?Q zvraF(hpJ!cpe>3)_LfeUMrtYEITW(e93Su+;~2x(>99m@?Kb_itZ~zIbk=8hLTk!5 zI3unC{Yt9jK>F~TZ(u>=@y|t`!}2NWbkJ#1E%IuFtV!K)G_|dq!Sae}IvFf~{I%te z{jlekVricH0wvvLS&ssIEJ{c}T$%|V`P#v3xOdE+bbq6Sy6ryxBGkv~8JlVNzP8$? z@Aa`}NIUDp{>M!b33fPCI*PfWrdI$ps?))&9_<8X<^Ec{>-(dX&tgpXn8Z_+`w&OD zURf-gU8-uHWNwu!(30YChr)`j$|>Srvk~U^%X;Zx|E>-68(sEj;E^r^p2B>vZ5qqY zEsNyhb&9z^=8o+zct6Xwio#g4zT_jR5T%$^XORekO{PoSSLWJ_t9QnEFm$7z!+5Q~ zg6cYz2QXgaTusAnv2WnvNUe@o6{*!of+_Cpcn)`HA)*({XROp1Ou*ibZi`gR@0BD` z5SgBDz?tY+%DC(>2^Hyfe#BN}T0^P!>;I`>H{i2iAQkL#R9(oU(W#s<->DZ9I}SHU z`^fg5Z-0iu#EDlDv!a~taL{b$2iIXXDL^y-@jK*2VBf47QBI!a86cfmOu=uP&ND&{ zliiTOn&gRA=C6z-;ji|6tgEt&Kr;gtBGRu~!sf7M7b=MG7^8@y6gd=4m1D$@#jGw! z@iP;1WAu6fYDw1{#{XtJ4EoqU@klKgRLV_HsHRCnD6#r1u=(4fv&5p0be8~z!u{Jrqxlw1QsnthykL zO2sQ_+&WhAL^%imo2>FwBB@ecVPR0~_e5+}>FTdXUw~gsEeRFmkmf@t(`3MTi?GCsBT!erQ_F-+*#Shw39TVtH39=5n zbej}#>r;osd<-5ybX#&n-EBBE!b+@ZA}xNIj2AsSu>IyTOWc8WrIFGP-s(nsL6l-n4@4M!I7I42}Xhyj}_<{0VNd5*bW%^aW z7J`Z9y?vKkQj2uFMnKsPSERN;Y9|)sfHz^1LyEV?v(#Fiv=R5M+OMomaEu_-cB^LA zO;~(^v>>Agpr|tNX8$auY5c>FA20v-*GpYgTHeqs77ZhL^Y8qz$k{ED`=$(fd6E4x zQ7oJIldQki6@UeJexc%TRHXLbQ^7F~=ub&$}k#TDE}8Ltv;k6}M-tmwADWvb@C6s}&r6NyFr zT>QUFZ#v|j^AR*!jh0w+qI*gngK6?3# zUApZc->rQ~VZTfMp=hkvoEJKPWy|9m)JDmliT%k!{1Vhp;_nN5YWqPLZTCE3ceqtF z{#3lKarp|srzZ1ABtw6R_IRVUijzmlB^WMyRl-@iWjdDoEy6%$#Aup^J)@WKS=c*r z-}zpQ+irz?spE~FbY;8CxNN(Ll_AS=A+~`p*O|ml5Zkr?dwz_>@lrGJXcDJuysf2 z7a`t9_j_b|YFos)VFir44I|myYV<3>Vo0|SO#gi_w0XOa0l|p+lFE8k9IA!GT&oSj zSk_wtvLb0ON!EBJUPN#6TXPU#oVVcIUO*wA4<)gj^lfI9sA0HKvZ>&ceI{)UHK?+Uk zNBk_wQ+`KSTyq{l4as&d2I6(N?EVKaUU;6v&#rwS??2e)qK+I{CMm{vefuoDq)`z* z&NCb)ePF59s*WgoOt*<>%cKR{m(pQMu-mPeZ*YBq+a0?Ov_DJ@t(%3gw!-v~TiJIi zY2Nq}JZg+4u;e4FW;~K6qQO(+1o&&xk4Fh>Iyuzq204$bH=rxkstNV@TSQ|u#ke1x zj7h{Vx&PD!x2uYHIL*|XA>lFEGhrs!mk?l=Svp^UxMues(|Kans_g$1sQvVSlIe6E z#n!%Jj1QTr<>Jj;^F_$K)@uCl_VJ_pNbK+bJt2lr$l7$Tgsfn0>O`+84rDhonhM z_(|4G`n4GEz1{(+SlvoOwW@KVyio3vScFRgb|Rc|l>+)E2q`je}tffmtJHLUzta%ip zpZW4?1}vW)<$f~Y4gk0>D){&pxqXQx>JO6@c9gUdt1aw8GZrR)+f;Tp*(V!)#X z#lG2$z(lEg6piJ`H3L>#Y@hku(+3n5%nR_6WIhJ=-m)FA?9@aGrhe?AiRkn~?N8)g ziULmIxB5d=*tPQxwz4d~lKq=*GN*t{ZEyG)*X$y~e-l7JuWr6vp41%0<-4>;Dx|Rc zz4(6&xuiK?@ukN&sPLCovGL@1O_1Wb$LseZ^?SD-dZLef6$sz#(&&Xf27a`LU9Wip zuW(I33Ry14YOyZgYC|P_RdC-JLkZXG|6iiR&Ew$4BL}4=TW2#SStn5UC&s&W!oZ;M zDhMPR{BL4WFy4;5Zn(9XhU`k3(7v({(jJXs7$=QB{yxu#fi2x>B%ZEyA`!3eHLk#B z%-!EvygoM_GsKZ>hC}RM5pDtj;l;Cves`kW1$*x4XSDKjVM1! zItV?xS}mHwLYGDk1$jmzKJY9hm^sDx?}~S$6-m^?flD1Qo;#0H#Z&eHw1i!oGT_cI zFJVkG58xwNKgbBvUXTha6Ou|=oVPZnQ;VQy=g}fLg2@MKs+DzgmkjGeS7GD9DwdPdiq0sG2V^abjk03MZ`5ce_!iG) z?vkfaV3zX`WLBClQ2&|wlT=9<7{A)?k^YPI6Z_K%di-Ls&1t5U27D!rfQKE+VpKzV^S=zsL~d}Zfd>(_N+3H>nrBBG^`2N0~%n6P9rg#8||a#BBOm`@iy$HQ!nU# z{1xnve|^v&rp|`mM|lcfk6bpXv=EnFsBE_0ra7&erl6-XlP;{^8KrzDqG@p(rCBGK z?MTJz6-f}FF<)-H{EXZcC9ms@l>sHPNnNm*XsU;m1O&H zLb^0ugp|J&0r(-rIM3|AF0hHh{jRbWk8)UHni> zCsPZpFL3*A6+j-xh6xaVD2u_tJ!?WeH)sTNw%rgoY+49`%_d1;cC23u5zTsw5H~5g z|6X8w?Uo9$t!`7utU;OjV{yIMF&OlQ?QZZEuM^E~636aXiWDEsUtGl8E3*Yek!{uv zPd+Bm_)69DMtY6EIq$>uv^pOku2g4OilYlfS=RHJYc3i384VNLqTAVbf}SpD*mNjj zV;KOeIPhbe3zYlh~v|zW_%QTwGeBNx{-cfCZDBPUY$?zQDt|^9oZxZhZ`jDJZA%Z7bLrs zX`5>fHqKRpw2)?%A7Wcl`VjAi`~l3;O;!-ZhISimA;GPZbuX%7dR6LQ6VZD+AA^Oz z<2>v<+NC4Sdz*K)c)!}}6!AT1?1SrsWg1L^y$bP4XUP z>-*39z`yI(OenE#zChif*dT~f=UK*F=UKo@*N^7r=aQ<4lx?D~PVjH^}G7;mt$LTDLiYtqIwMOuT-R#DdPD@jB<$9^)R46B}BSr5U$)Zoo?XJZxtZnSfBADU@ps;SC5C9vby8n* z3x??l=Y3MGc0L8?blVzKdjP6=7I&anVekzA{Js-5YTSCstwx?j%&ErBw3QWuSh`k| zu8)?O_pY&wLTX$)8IxV(VSG=O1>7Twak-dRXC4Cv2gdcZoeIMs`d9(DmUz}vSKaDO zcFkH+{N@tE(Pv&MEF4>0(+e(49?9;;Eg533Tw8uB-miCAW;;uEhygucyJyt1VY$ag zvi?+atlqP+m_4VnL7N)^u``cp`bML2jOSvR z0{YkQiruypBe}{wigeYflGL-!+n_Pgv?RsP}R@+ zHm3_94>mmJ+f2=fJVhGD_^Mrkl?v@j6!1^8srERpd$5a@uh9V)9n%RS%KQ!<$BYMU zgtJVeR4TkiQi4VfoY$GZy&-q@$uO$LCts#kx{499ptYVW-?|QrdR-}{wBy=>du>p*M7QP6v&!ZJVBOA z&M1sWjU|vu^T=kraxX;C&o+LHJ2nGI+27!a`_?%mS?)T);p@mc00JAVcJaET{{WJ` z(k5#CP%{ZJ^m{x*`?Sj#^Utle5ZuKd(A~TJVS`#8i1ODQ~z$BJ^jIXm+g$qf)dMZuIuO z5JMK_k*vHY!3ISD-o8401E5B`P{_`gEa0Wbs|=D~+?TvWl#{j%B>Zfgfb|)pOLn^$ zoi~6C(tc$0)lU6E%+K-MM|5jWn~V!iMSn$Hud%-(`!M??#(BF!P@rHjzq^zjEy zMHEwZZ-_F`rd~_DPS6Ynm3{d%_M#mch$h$a6uOU1f}l52`wOUrIeRl6Iqm(Hz&1o7 z{!ay&MWb|Ze>2R0w?2aqkj;~9aI(B3uMp1`@D293ruWXMSJ2F(GM9>vH@~6chm8ZV z+HdsC^(pf{%4b+Vl+0eV+v&rJZnr$)2q11B%W&k{Xi-Jnb=r@3Syn%xwGmY>R)+K^ zDWg`MeQkk*zhvb1#JHzu0*7FS4OpAAPlS~teM=$lS}3mf9Afg0A`YSEI(D0h#r=B0 zfM2Qmh0xwzGnqH6$n+5J=h}o5WUyt9i+J5=Hb*~dGkj%TnBJs;xb7?K=DE){fIWEZ z^9b@B;G3OCkVUss7A9*aBZE!FuGz&m9 zg(mBWHAMG+3eYO4vv9jCKq}Omga2fYX2u|oVvH_21j2iQaW<-Hl5A49eadY>JX3gc zFCEP628RlG+t6G_*DrP*KwDy2Y$!r2l9kEC_*D{vwGs(?obwa}PI%TcHhOLW=Au)u zxtM*RSAe#Hq^0zN46kV5NtDl$L$+NJiGDME1I}ENeiWZ>G^i!kf6=UCUB1^iF&`*4 zfdAh5NG;yavzjK#Hp^60+GkOT-(dY{)S9SW3MS9)2dsOuj^KgB2J*PjJ)%~N6v2=i zW%GoUM~g||e$(kC=S#^1WM(+W@S~35AlBk=M{YgRE@G_o@>eV|7~8&*iXq1Ty?E#KVss{$ED>elC+V zhz9duTj65R=z??0GSp5vZU0zYU32sUhH8f}j-MOm$+YnkSr!R4O8&cWS^_rdUOse< zQuP7IM(O%cinSg-@Y=2@1lb1E;A2+K_-L9~XfQ?gQ{mbAgpPga)(ze%ZckjE za`7j?7sqP?Jaz1Xhe7*dPf==%aNK6|01Ux;$3*b%5lXk*RQkZrsB{U=?<5`IoT>SZ zG$R}*8P6Q{vASyi@h1R2@;gNt4bElgImB*_{DO78(Z-E-B`jPK(TU>;F^t>n!da&2 zfR0EgR;vP(vc1ZFB_dt>PF(GGYXR6miwtVw-LM>+QPK#Q``cScJICXV>BDY$6z-;7 zBCO3CU;ZsAW2t{8v8@V)yh)$n35Pit#8 ztiyl2bciOkW;P2;8D_V{*Jv~hOMSBcTNq!3oHDl~;M%ZXpkU*zp3v5$`8>`-OXqvxnR{j&sgJ7Q-(`5#c=9;4htm~bBwVTF^qfW zFB~3saqX>fPN;sKzSvq+M$%bM(RrjGQ*@Gu%^oKIxDpc8B4X7$*WOw8&tzw!s*AO)?;X^-tbvlv38}dm^Z3L5W0UMo}L|}iUYSm#woWiK=!WohR#Vel43eUxQ7PCY?@Vi z1sKkk;m0d3N>F%{Pvb*J!nrWJ+FOh;eF6vsy9 zb=ijkkGEF@)pg+NO|F~ja>!axEMRxsDV$y~W_L+Ub#~8e79rNme2< z+nm$y&Ml&-#XaL>w3%j@gu;(yN7Q)_nub2D=P{TasNk&1=(qf^W)JaHI&*-@)FE zZWyT7sYlTNhFLo`vtdw*-%kBHi73l87y$lX|3Xk!hSD>={D`Ssz4+I~icIww8f~)d zr;dm9{*k!+TQIA*|14fqdL%OUK$TBbOe%u7p*e--37Zfs1Xxzk_}WY(pnJzSA2iCBn(-~4 zy{}N850Y1cnso_-{b}b-y2y&-0-wW`^1LyXYAn_86k_(Fb&k1}&}M4w#|i1i&X25a zZTBhcRoi2^AU2+s=40y3S-Kx7Z)*iH)@p_62oeIc1|(wczY&@5!{vlm0=(?2y4jEd z6j{Vo;rN9O>E6EHMJx%Ts^>H}!J%DKS424Uop|e=8@G8lm^XPwSeu3e5Voq@j+-*C zJb*6pY(f<=Zjrd%P+dZBvHmQEYcy{G)?4|N@jC}Y`)C0*U^(Yji&t-TC^W{Z7NEUV`9`v34q1GvGKbX` z^J8*4G>IdpM8p3_;5I`-onD88vg7#4vlMXXs3`uEXmA z9Za}PvTn>Vk+Hz>nE6k-&Fp~rvfu_s~l;WyUK2uUD~VdRv-HPUDJVl6e;pzXp#~Yn)4oLaco-Z?hHS zwb2VKt;^EcCL@0>uAY0Xz-^C9KV!Q~;cv6bevzA;V;*jeF zh#q z#$xAl^6oRQMH3~)S;#uaFcJi^bZU6?z6V-Kw%H0%K80`+Y*fJ9FNO&e*P;FqYx;Fo zIV||_5z0N+rgW+(Dr6RFa$>Sf1amy=@`8AFO#IkLd2C0kIFAyku;FW7q59xEVsTQrWMOk#zxC^9@BM$-K}f|A>|S8 znlylMQd&Z*$#HrEtz**%X#QrB&4FgXV3$Z=v;r8bwI=D+iRxgT%sM1`PkWZLx z6Gim}KJP7k;bPIehvV0cP8(url66Q0wi`&L(KQd7m#Pdf9#UL_!j$}&{bbX&f&8+p z-zm3n>w7lzT3Ye2SqzcanGR_S#P2jiC1RY^sQ)ZRKaU1JU%Nt4wMIph%7gwDsKn}2 zFkZyih9 z(+;IH+b|B;heQ}C`H9%3r*PEn)j`tBibja2aEc?qef=(y-L;B<%n-|W2#GOFq@D|O z(lNHGx&A8=(5*)U{UpvggnsgBmP(-MhEc3*Fo;7s{@)S4TNYt|RYlWD=bd9AYTvvZ z@fR3ZBj<3f5~{jMBL+ENd7a_S$8#Qd8r&CtSJ+EZtRjP6mnbMJw{66ppT!*6#2DNW zZJeZ*bqVgXP+#WyL^)kMJ}QNs2a6DB`f9jE^n-@i&=aQ;^|=?CGZ+4J^$Ff9&8F%#JNh(0v zttEoV(X7!ByvHM6D}wi;~QNc$e1$p}lkd zTf#=QYcWqWXJD?`yc$$y4Ib$gE3!s9)w#5hK$0|LNwV9cl}JK7!oXwCb&dkaa}FlW zX#}-zkxe|lMqzA2iF&J89hX&LWy<3#1u^L64M(Z=<0=7C8$6F8x+(2)Qvb(47G*n* zfGgZ{zZdgLDbg9M5|sca$#R39v}?A5G8XkuxrKXX4_Q%nGppRPnLVJ2h#K^cKq_Br zjr>|PO@+h{fNRn#gfN>uHi4?iwSwdxadU2Vg3uy#0=a>Brv~R;A`t7Cbsjbnz0#=h z4d(*22=dPIfDY2D(@YNtRL3Fmb9wU5#QTRXam-(Io~9!WIr#wel6x2STU_pF^#!)0 z*bB9~brDdEBK{YhI_Nr;W&>!c{R$6z81wNDNIeO?f zWeFO0=3q&oLG|&cc4NSq-o@>HVSb6G}>3E^U-T zx8ucc?j$_K)MlGv_(-&DKqK)+HAp{9zX21idWUe`=e`V3+3IP4J+&T(^$V*Z$Y??N z?Ivlg%F{amh&bJFDBD+u{z!Oxv5iDc3EC0t9L-uKGI9M>GRFQjXWA>Me0Jx@X?Q?54~%L zFg|OKBAsE+>(4?u>6prqpFqNqNjNQb+xUVktBqD!RU-ZSA`6cWDx%!0h%wbGo1{iP zB9TXi<189YH?4%qdcAWneb-$841e7_n#YnX1?r9@U8I-d8q0X9j-qnroYQ%pxkoHX zCPUW3d5z%+(6nfaSI3$I=u^9bT#NYqK+|bx=dh^l4w*DG>tj?@ zX4Le(Kp>3x_S7+SwhVh8Dlx<+9+fof#?p=VW$ReW^vH&z35QlnqtLP#EQ)m|wS~1Q ziSTi)@r_I-+~2~(O|8JRn7V8+DPU|gnd8p57R1JN&rwN| z?huh=xz)g4vttzqH`{N~T;gmWv07@C!z02PA~}{;d~}PCuYpi=lg_uqk>_xOdS=xz zsCZj-$ocwOF^KZwXyH@V=b&6X*3uE$J)`8N_w*Uf;ySFcP;EZ=hvB6r+UaGR}q;iNdN z?ER@Q-{#^6C8tgyl)I192|%RTt};g2Zs4chIsjQmXm237ERQ;2txow!blJM-!uSj*`dvp|MGRl9dX-{avKR)cAcGuIuF|N3tO&Oo=8w6i zLcqH7ECj?lbWj#GHciBsW8F<7TQIxe)YE{^W1S(2QQkZEaS$&zJ~0-a26Xz6_oK8;SG-=*nqc08 za}~)JIt~1mxPE3A!d>tITUNH|88J*77X1HhL(KU{@hXvG1eLsHp3GE#(^?Dh=79bn z0rkl0=s=0?tKW(1eQw=U%$g#DnyoTPXI{GOKuf&equGUsyF90XJ6T=C{29eOP{up7 zBmPqJY(mO4JS4F`om>*xbH0JZHOrrf?LL-gH^t<%XBP_#Rko?<{MIG`1RG7;38l+q z8myX(tGH=7GWr8y;^gNdt`T`ZU1Q8X5o2?9u?V@_Dv>V!Xn0MnMr!Oa`e-B*cb_7V zVmo&_L1dM7&8*w7T7<@9-F~F{C~ETODINSKUYi+tz7dd||vrq>oxXKOl3@3(8`|{e*GAJsjHW z)nBle;j}?tOfg8IUgxB{;CrC$2S=G2v8)SmU;bX$TXG8o;Z4^Ra>XB^6r_n}=KAJr{*h^wtOgA`S*<%nFot~QUP za%xN;=y_SX89L&6kk+q6#S8#JgnEFc7EB=CPDcRZZPQI4dsg{svES`3@q}wK+r~2QW7ol*%Hd-lGw^~GEE!J=W z^1euiuzI4gM|EB(a){!_GF~C(ADS;A>sx~(NPpBFKsdLWDUkk!Rnv+#$bWI!+*Fv=mr0(`8&~oi)f6G_LVF>w)4eBs7(sY$67~m99~6-Q6>{OJTn+1 z!8P3oI(ji*voQT9Ptup*Ku$L)Hlu6~nOfY>%HqAtojqv=(9?xld|?-~x_@u~p`zI67% z=c8jJdTn#KqAl;+@9=9WhUwgIM)e=J^q)Q%3pJjipCg#NQFOrfyJa^`>=fryh5_aR z{aw9hLs*b?!TN<}C!Brd>a?r}eseW53GH6J_6srlS-A-u!SX^vns*qGiR(9#cIIbj z_Ao!q)t7Nw{Q?xtivFLAd3Ew2AQ`et0Q?a1e=aWnwZAJe2>e0(AN5OdCD6Tx8c%hr z1%nc&&L4~GeU8m+6|XisWbbEuPgQ2>wj-BDopk1vI=TMrMf`GJ)e4qJERt5p}V=kRURhQZQcR_yp^jCJl&SMynZOdhA0G z&z(vAuY{9Dk7EcOR4uY@#<7g-5A1T;d^3#iS?{BL4qAh*Y0S@6W#hL%UQJC5nuQST zpupaV7f0Ik41iS?PPL z279Ie(YsTYn;>G=ROE1=``^Uy`+p`L9PJQRul#_M#wev8=PD*w;po*og|GcRBbHEA z0cqDdex*8ltY=8O+1N&4?E6Q;@S|r2MR4KX@f)uW;_9qPqO}-P4ByxYA0c-}$Da*i zLaG!7N(pdK#rcuHJ+vGL^Cgx?OwM%sL*?Hij(m~|08%e0Gm zR2fS2Ego-hvnKbYFsmHez`VeEh8Us@viLAK9RL@k;Zou2izFNy`N-&x2MMU&tClg( zD-&ie-S_Dymx?d~^K%OG5Q}4M3ZXN{IGp*uUehE};@S*=)v6JyC_<4$0(G_}INy;@ z0#=1)9{Wr)fmg_%N%zKaku>kDVyUHflO`0=YSKx~`I$^n(B}p*(3ztX1)bi~A(@Ek zR`R!nHon1SwcFG0i;I)WC%QqK(Gw_y@_A$^2GVp?Vu24iJb3mHO|?9l920Gp*zc~b z%ZO^$Dik9l=r~ptK5T$cL)C;i5Tu|nKoRo&Zv`}-0xCd;O z5NN02EgaM-0^sh|aR|<;jo$%gPMJr(h4Nd_O)&|@>afuiT=~grB*Oci#uHI|bIZcs zgM8CdT#vP#bQWWZStqP)8C1YVv~-ShQJUJ9&X{hWM1wdn?`M9L*%xGar~egDzUYT= z)O8VPo)gl9yyK^$O1@yA%KnP94{UERP-<4rF`?Boo`9!~o-9NlTl%eLV(ilEAdpPy z1%aQs)qW?gce>p`pub)R)&Er!930YtC*G+8Fa5S7RO++NDLSff3nQIXRTLz6+btrC zE9-2w%PiS3Wc9oIFh05EvhLZnlPCvGkFXb`JA!Nuv<8@0=-x-kWVrUAm2HPRV2m`( zr!>ZpLbF#Khs!zoZ8lrTx?R7E$Y;f@0)ncLS_DDfiUuOwvR($@9Q_+`+0^?N zLSu(yJ*J#ta=crYg91*Us;T7qn z=JIW;?hsA(Y8DZik6SqnuE^z%N%giA-wBq{C}r1tfx2HXDTm-g zqjwb22!OL%`#K_$9IZ&&Ux!D|XYu;lJqz*V%Z~um&#@Do`r7UT$E)=*-kz+E7$2=p zv6?0ot7|2lKZvo@^X~V==%bwfnHU4)zJT6mmq>M`*{l&`s>Kx5)Mz}z2`ddrt!SP@ z+oD$ksD+ga%Of(Jwp>NR`DRDd=(ynko8}&oRBDR3tr{KV6Yi0LP@>&Cu$AQ6 z3UgJ;d$!;XWLxjlPPXd~M{ISS=9&K=TkjoKWt!&ejtMg==8QS@^bi-Up3uEwTQgOq zTkYxYIoG*r(7 zc;5SAeV+*Z2lx6tZw}8JzHcq7Wb88gZjct;==d8ZeW{K0lqm(RoR}oL(2nuBvh_rd z*e0HTY-p2A{o{VeC2LK`<>HACq#3!BU(4{8j=4OJWZivwBpMti)5pQspyj*e#igQ+?hIA$hiQviSS%9x385r#jz|H&u-?HI>t< z<@55i)AE@)?V*iaAEum_bsjUJL>xb%-+C!!OOI!=&M$Y3m$Nsi%h}&BmgzE<%O_^Y zuqXAuA!{wEXRVAzw$pVvU2~<5ebd7Kg*x_6I4eEK85JSDK0mllPTy4>BIWu2ow(SI zA)jO(p7x7&CfEJ0p=N4aBPZ7Z*_@v`y_Z%;Onvej;+DugsBrXVxu?7m7fl~NZ+alUlKp58W7!&l8%VCJndF2Wn@oVDmVTparOI? zS4#UYk6tD-{cKdR{y9(z=!1b7fSkreug`MGQMTf&MQa z^hlm9*T|N4v{$ao+WaH(;r|r}*G<{yc28O>F8H?h5^;;s*0D*M8-e$nE5ANyuXL#|G_KaB?59GWAOwPSFIxcZtt$7E-$bABP^ z?e4Wx1}NMqzbonMJ6)8Cd)eV z&g;duUrx9wTYdc43Yq7tqw;06Yldx=S$j1(O4e*upEOAyIx$4H%re&)Y4qNqIWl_9 z1DnOSUb#fcR(VE7@jzvc*+Mj`B(O#GzKYHp_Is8Tmv$t40Qo$0dSgVU+gIk!gR?ElC!u z_*~Z{StQ%1E|WpKJ@K||Yx%B)QsS%8r)4M47#JpHl=nZ{hc+JQRxX2ZaNg z=|kPfB$C0VGEPTdJE*B4dH==3`Ba|nzaMPtwmgxs+!L^AO#erUqi_pd(x{zNie(tLP1+});gc>%^tX6viB|R zRwGkiH0Fim3m+aL`(LqBu{8JThzeOiSBBS0=PwO;F5VT^yGlMk_4+7NoYMWV3|3gD z9WuRprshcdBBoS}!#tQ2XQK7X#nYQdX3F&39{f;N$g#osvcEhY6eg`Z>wH}Hv=8F3 z%ewrYVb~}gFPM@n{4U~Gl(kN}o;Tv8_*B%0V^Zd}!PzpSp)S{@>#usnNZzWR z(Q=Hhl3T+o2}|p>Pd=M_mdnv_y+@jS?(cC!Hu~izCh^dun=%}iMn%eeR}MTQo>ev= zb^!5*duH|K^FY@Rax=L+ZiRUF&Y{`TqLjfKmj6&?u9-v0IbmyVLcJ?4WBp zB>a|gqNfFW^SROWZp;78w;R2Um-X~`{99R1xuX+hi%;r(zB6fecibSoTP9mo<(NWo zlNZC5iF@7be?`V*lgnu-@usx9xaUeqT|FjM%3L)%O&-L&nZ`z$#>lCK;;&mKrAhVg z$8VP9e{b|*SyVgw9~OVT;Id1;UcVyKm*RXyye+tUjC_`LJ1Cn&Mz_<_;he5+RB>9? zaly#d@({RA4%}UR8)Oqc-zQ3ns_)$-{&RieC-H>aW5Q(q3S|VFx)#Xihpvgz%r_G+ z$jW>^?veCt$Jj*4wROw^@vj=^N_kQ|B+YuM`p=XE*)@DZbjGoJ&`Vj z_t_$ict0Ua?v*97{)ejj9pO8UH$&x?I-h$o)t9V@@#$d~49p14ZBA+MA* z+BBkGF2P%e=E<6@>UB@nT|%!b;ut5oWyv8J=Tst{j2<8hrsub`ELaY-I+@VSvF~IF zrVctKOR03g3#t5C??g#eE)$qN`My!ca%`qdVASY+($rmjmWfv%no=lkQZp_~#x`f< z8(A)^hZoCzXXCJPS-@9@rrIedV``F=8#DQYY&EM!tdmwe8Tdw4K~euxqe&Ox5QW&?bZBC@40O!+^k0!{+qhHGn*5Q4(%Suf)=K*L zEAA zE|(`VY8QK#$>*uw7sWZ3bh{`uUg;7ipPRZA%6QdG+4@WBNgG})tG&|Yy!5QNN0Yem zh7L}&uvi+ieoBp0UODRBR5I-tx?3uJ-S4bawy$@AWIo>`K~~+$j*(Kxzb%(JDId2= zMq|ae+p^PyxvrEx)sNaQGhQ%Yhm6jaKF8%PWP>=)DW@}CsO(k8|H+5@ec4DaOndbk zR@O<`9M(^&lvxfLo+8(!BXWYia9SaKjqVcBk*wQ0gv#fZ4)Kz!e&R=&^VAWyqj|+d&tlJBNE`^(S9+&-*flq202j{d>nnO8c*j-YXNAH8NI)V_DW`GpVe#=T zgP%+OojptB6s_&NNm^MpY`3iBJwrCi=jI^=;!}_0x$u}1b)M-IDH~74_=9p_>~+2T z5A^qzanLH7^982as z0}e~tr7p!X`iJ_gmfpwqu8wqACpYtHM%_jhzVC!>6!%W`S? zmQE+dvnr=N{59pDn0QG(cTGGgD`-Q%OESARrS$7l^W-yc>IxI74^Mh4sV`5wCv%fH z;*-o}bl2NbOJ$eYB%4?+&pjVyY_7O&k@>hkdW$P#v_?k#MUS;DmjYSep_A9iirh4Q zyBw3@;+S7GOXT&*VPh!uqsuAT2ha5@k)3_3bG__o5xrC8{v9W0%k6G^dy_i7Yl;*y z`#)GAVbbX%Q*yC>^hu6j!APi zO+M;IKVD1H#O|vlX;a^|(yy02nq|aZPrV?Y=cnG5O}t=Ws`!4ac)?}aoNGs1oj|oQ zgX-i6e%^Pjlv&>GjW|x-q!?My;iK~9xi&`pxOT_`@!#yhuO^av>EH)a%9cTmvPZmd zDHX5UAZ6X{c2>HO+x3I2*RxJLW!!_MhN4MNrG|T>_Dh)wgP%xiuMCWoArJ1KFZ0{z zbWVmm$vItmwQp*atkLR;A7yUiT<=KRVuluocV_lJEBFD zh5?6VS(VGMrSuGyJt?GPj4a~FaTk5)T+WzKX-K2Xd8sgYQij|^3uIfoI6PnG@z#Ji zxj(&-e;ct=N=O6hs_=N%;?Z0myU`FX>x#;j;)o}-XDHVt`p&XH%TkE^;j*N zMOD`gGBH=3D&^l%Uz5>0(D9;trguCdrJm^E##yyic7l{{Y4X$4ba~XQu+oV=(uueI z_DZ4kUF)P#%^h~hncg5x`84*uTqsICY3R1mx5Q&gMwQ9#dTrzxIq8aqUXk7M@Q@<$ z!n-cZWWQS5r%=B3+a~A2`e|pxf6h#emCsF6vt_vUk1vqAD#w13eIwQ^j+th9 zonj`>)kzn)balv^bYFb+VV6qze9)y>Qh(@pQa+z|d?&7WW6XBx`KD2&vU=-B?2svL z9P(CrTHL2XR`?p3s7*aq$}ffDB~8PSjPcZ&Fz~8uS#`a#WY>u4mno?a_xKMQw%$ad zBa_xhXKE%sl0|uZaFnc(njTxFJ109okS`~4#jlUK?h#KpI6PFI;m?S_EgSS+*3HHK zc`~(cyY3OMPwg7*L>;?26^Os?nw%|lt({aQ1HEi`llaxDuIUoKeA0?v)3QRT>y&Gi z48g5YHB#rj;nmWu%L7AYEtT~@D-N~VCBNk>NGT&~Qld=qw((DXMOhD}rqJP8uC%1c z<*4+kv~#RXWy7=xi7y(KAP$u@VO8T71vA-sN z?S$3h`|n0Qlgf7uST2M6!KFZEeqW!<;+02xhl|Ht@0kD3VAQ7XjsfRicOJXn|tJ`Qq(V% zWzIq;U67`{8GTb0T5PXS3BNP(j4afvvP;^Jd@8-Du;A&iS%0=1tfketFkv zV^_kTbXwAZPt#Lb=@-Wx5{Eo7{IV3EIP8@ae|5-eSq={eK9IFt-6g6!*|IyI5jQ#0 zq4KxbMbjc=rjCxdBzMFogHOo&l}i$PeA+Xa&+QYI%IB5wJLS&xX-vBK!-xLOa{L^U zA%Et4MrQV0k9?`KuuF(^C8YDZmYJ5kNn;<$z!Z#$mkm5d7SgJLw`Eb>cUdNHD({M4 zo$Y->cJL$Jj*4IG8?{GL<+>EeZt|#CmDG^bIYcIVNk<<%Vy~QkFI`uPvo^czk$GwC z`BCO9e{_lzmN06i4Atr($?Vyzy@hU z#(=Y~_+pmiu65oc4!_E2sa#!R#51ptJ~ECniwDF>|5o>3Xx&GG(A#JjfjT`LPctPyKhu60h&~Kx-JtJ ziR@A)ZrRW|LFQ!bs0(tqo*$Vc?prr7OWMDq{{xx$CoY+CUoGk`%^Fo9n@6#5xs34P zDbFS{8kO<}>#%GTk2}1UQqK2plD%?U_b0NZ!n(%En$8>hK@R$2@sCZTm&zC%9CT5} z`Tl?m>Ep-#Z-y}LN1V4wA5ywziJ!f3O_U{6G-8=tRtu$tce)?zNb1}Ut2^*HV=Vr3 zKo;%paZ!@yQ1=xoOg&PIFBA{ID+lL#nTbt9R=N^bCyS+I%wF-e6%)(k7I;)f>Ey_8 zSwc0^-j9P0N-wwdKPSEW=oBeqytd0SSdhIu~vq8r0#ONd$i{cR>vcuky zydQd{$yF#_+V#-sob)AmV!FhZ^m;4nb8oN2{*?H>#~6mHQ5<0erHBe{)K+&GQ0)d9vkF{i#o( zxbha~IvIh~UT>wg;B8&cWYUVkLnFa7|h?H1omm{u+O%4*lGa{YZZ z{FZ#x&sXLaXgva3Fr7ANaz^|(zkv^$44NsSdl4$4HA4GNPLynjIH zSSnjP;Jgfatjlh>E2Q*kmTpJ(D3Q+x-Cs)&?sQ7;O!`$FRaDusW{$g=S#9EHA!j9yWHPIY-C<5)Cq)l||w8FE<`Sk$1c^4T!( zvZTA#<(`Z~^4L$}T<1n_mDPTEM3{UY8u3(4!rd~8r#fwy(%uh=md~0YyQH6&2Az~r zg9jCgU!3n7D=%KMrA^Pe?U!X(Cu4EKX{U@uUgu{r7P~sfNk0>(mdopeyE5Nrh7`-$ z+aOEz#iTXTn^og-B+VY#rJuPr%E-mKUX@*Ln=IFCmo7MZf)9gKDurbasglXPFtAeG zIDdSId`6CskSvE>w##7b?vg0oJk%*n*35+t%VotTcc_2tcFzP8z0 zgmuR6zjY$ycQYl4$~|jN4+3V}=u{V^S!i-bPoFXCtN)ns?HtqBy)ggXHfzpT7Sq>K zs#S&bn7812zm^&A{2vS5+`9jMLEwMQ3<~^ufu^Ph5a9{DfHyGop1E+bB`9#->>vH+ zF8C|fH-3x$tHmOL1z3Si!QBnG_x{E&=*Jlg{R92x&;5EqYioKyFXCqTFIqe==<5Zo z45{ATKz<+K>ugytKPYg)ym|hC)BWeoCCm({%v~z8E9F6r9`3-a$Lt`#Apbc5Kluk@ z8+zFT{eJSdELc20s3pX=&$mAX&~eLxpBB#Z5At_b{V^~8^Pl|#XZich{kflt{@ud4 zs*pvt`F?+z=Ren3h0F;I_~8ftK>IwuANr~q0)xzpgMt>!|JpC;`yczaRH-_;C?F_c z!F&=q|5nv%`aUS&FaDU_Fuz$a*I%{C(*(@@X8NhxgZx|SBCb1$q^#b$njPf7u&34k zrv;yT;N{kLrvLo80rP*5v=rY<)a=E7TBMTqojK3%Xa7KzAuwo0;9UPeX9_pX5BNz& z#iW}uGM`O}HGdgv?mgQ-@Gq*WmNNTlC8?_Z%((XY#(&WwzaLu0+r?qDr2T6CT>t;> zIdeh4{Gi_l%%ATc=xCRO%>I5spnt!XgdU$m`m}^d?@7^D(zT4x%pd(0`FE9ouNSm@ zP7iPqo4)xm@{E>p8P#z|Q@)zpN4eVf4quz|^FsfAlEWIXXrUS<88&S+^)VmN(hB!) z7Eq?c10Ah*|AXrK!hrwwpQi`RT+lM@TEHLMrubu<6drBM@c2X96m84!(97s&_M12F ziYf0i&8hQXpXy?{lI-DHtW2A=5meUP+J_EU>rVBpW@pM(6x`gbYf z57Pr$TVF5e$6o7*YuR#J#j8PTZK=(8X5a$a;y+i7cPm5f*?No`=~l+{0O#2OKg{=^ zYYOOU{Yua^?v`28?HAZYPie++#9`_K3jWn2A%{AA7htCOdFn3}iG=~`T`A9M2; z|CV6cSe!pQ7PI)-lwHhO`MAGqZ(?c_tZfrt&2=HcZ2$jfF`nL1N3WLIAwumMpADIk z-n0C^|1bX_hbMkv{n4c*&M`YJe%=zK`rcA@Z%3r``VU`Nf7BL=xR`ZuploD4W+@kF z@rD*DyI*(N+GYpL_3z&@#cDaWT8I6$wbYWnrS#eU^Ta{f zuQ`wUI8H;;;<*6}EQ|e}tv`J~V{wow>udkN_|NO#68@u~I)l`zlIw)SpJuDAX0A=0 z{ND%lZKYe<+$ul@zu(No^A`Dgv?P}#eP#xzqs27$KNl|wVnMq|O`2E9z3R&#@!Xd7 zXsKHK!x0t~=`fTY_fcwu@S}5BK _@oX9X{sq#ktXv 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 H?|c6b@GTA! diff --git a/Tennis (JU)/copilot/prg.s b/Tennis (JU)/copilot/prg.s index d6d83b8..9a7672b 100644 --- a/Tennis (JU)/copilot/prg.s +++ b/Tennis (JU)/copilot/prg.s @@ -9,6 +9,7 @@ .include "locals.inc" .segment "PRG" +.org $C000 ; ============================================================================= ; Reset diff --git a/Tennis (JU)/copilot/reconstructed.map b/Tennis (JU)/copilot/reconstructed.map index aaf7f17..1ad1cc6 100644 --- a/Tennis (JU)/copilot/reconstructed.map +++ b/Tennis (JU)/copilot/reconstructed.map @@ -1,13 +1,19 @@ Modules list: ------------- +header.o: + HEADER Offs=000000 Size=000010 Align=00001 Fill=0000 prg.o: PRG Offs=000000 Size=004000 Align=00001 Fill=0000 +chr.o: + CHR Offs=000000 Size=002000 Align=00001 Fill=0000 Segment list: ------------- Name Start End Size Align ---------------------------------------------------- +CHR 000000 001FFF 002000 00001 +HEADER 000000 00000F 000010 00001 PRG 00C000 00FFFF 004000 00001 diff --git a/Tennis (JU)/copilot/prg.bin b/Tennis (JU)/copilot/reconstructed.nes similarity index 66% rename from Tennis (JU)/copilot/prg.bin rename to Tennis (JU)/copilot/reconstructed.nes index 5feb337db1843ed3babcdf4bb45736ae93f7eed8..e7ead1edde7aa3fa1d0cb5fdcf15b0851236a159 100644 GIT binary patch delta 8282 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 delta 9 QcmbPmfU%*0aiM?%021c|L;wH) diff --git a/Tennis (JU)/copilot/reconstructed_prg.bin b/Tennis (JU)/copilot/reconstructed_prg.bin deleted file mode 100644 index 5feb337db1843ed3babcdf4bb45736ae93f7eed8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 Ah5!Hn literal 0 HcmV?d00001 diff --git a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.s b/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.s new file mode 100644 index 0000000..c021b92 --- /dev/null +++ b/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.s @@ -0,0 +1,2 @@ +.segment "CHR" + .incbin "dk3.nes", $4010, $2000 diff --git a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/dk3.nes b/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/dk3.nes new file mode 100644 index 0000000000000000000000000000000000000000..7b683e6c5dd4112beb75746baba24bfc2b1933da GIT binary patch literal 24592 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


t_oa@s%nyrG- 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 PQ%%UC7EernA>{u9IpT(v literal 0 HcmV?d00001 diff --git a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/prg.s b/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/prg.s new file mode 100644 index 0000000..dd70b1b --- /dev/null +++ b/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/prg.s @@ -0,0 +1,9952 @@ +.setcpu "6502" +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" + +; Overlapping table aliases. These tables intentionally begin inside encoded +; instruction bytes, so they are expressed as relocatable symbol aliases rather +; than duplicate storage labels. +QueuedPpuTransferDestinationOffsetTable = RunQueuedPpuTransfer + $11 ; CPU $C206 +AudioPitchOrPeriodTable_F970 = Flow_F96F + $01 ; CPU $F970 +AudioSequenceIndexTable_FAB3 = Flow_FA85 + $2E ; CPU $FAB3 + +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C000. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ResetHandler: + cld ; PRG $0000 | CPU $C000 | D8 + sei ; PRG $0001 | CPU $C001 | 78 +; ----------------------------------------------------------------------------- +; Global purpose: Wait For Initial Vblank And Disable Rendering. +; Local behavior: Reads PPUSTATUS, WaitForInitialVblankAndDisableRendering, FrameCounter; mutates PPUCTRL, PPUMASK, WorkPointerOrValueHi, WorkPointerOrValueLo. +; Parameters: PPUSTATUS, WaitForInitialVblankAndDisableRendering, FrameCounter. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +WaitForInitialVblankAndDisableRendering: + lda PPUSTATUS ; PRG $0002 | CPU $C002 | AD 02 20 + bpl WaitForInitialVblankAndDisableRendering ; PRG $0005 | CPU $C005 | 10 FB + ldx #$00 ; PRG $0007 | CPU $C007 | A2 00 + stx PPUCTRL ; PRG $0009 | CPU $C009 | 8E 00 20 + stx PPUMASK ; PRG $000C | CPU $C00C | 8E 01 20 + dex ; PRG $000F | CPU $C00F | CA + txs ; PRG $0010 | CPU $C010 | 9A + ldx FrameCounter ; PRG $0011 | CPU $C011 | A6 27 + ldy #$07 ; PRG $0013 | CPU $C013 | A0 07 + sty WorkPointerOrValueHi ; PRG $0015 | CPU $C015 | 84 02 + ldy #$00 ; PRG $0017 | CPU $C017 | A0 00 + sty WorkPointerOrValueLo ; PRG $0019 | CPU $C019 | 84 01 + lda #$00 ; PRG $001B | CPU $C01B | A9 00 +; ----------------------------------------------------------------------------- +; Global purpose: Clear Cpu Ram Page Loop. +; Local behavior: Reads ClearCpuRamPageLoop, WorkPointerOrValueHi, FinishResetInitialization; mutates WorkPointerOrValueLo, WorkPointerOrValueHi. +; Parameters: ClearCpuRamPageLoop, WorkPointerOrValueHi, FinishResetInitialization. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ClearCpuRamPageLoop: + sta (WorkPointerOrValueLo),y ; PRG $001D | CPU $C01D | 91 01 + dey ; PRG $001F | CPU $C01F | 88 + bne ClearCpuRamPageLoop ; PRG $0020 | CPU $C020 | D0 FB + dec WorkPointerOrValueHi ; PRG $0022 | CPU $C022 | C6 02 + bpl ClearCpuRamPageLoop ; PRG $0024 | CPU $C024 | 10 F7 + txa ; PRG $0026 | CPU $C026 | 8A + bne FinishResetInitialization ; PRG $0027 | CPU $C027 | D0 02 + ldx #$5F ; PRG $0029 | CPU $C029 | A2 5F +; ----------------------------------------------------------------------------- +; Global purpose: Finish Reset Initialization. +; Local behavior: Reads ClearNametable2400WithTileFF, HideAllOamSprites; mutates Ram_06F0, PPUSCROLL, GameMode, SND_CHN, PPUCTRL. +; Parameters: ClearNametable2400WithTileFF, HideAllOamSprites. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +FinishResetInitialization: + stx Ram_06F0 ; PRG $002B | CPU $C02B | 8E F0 06 + jsr ClearNametable2400WithTileFF ; PRG $002E | CPU $C02E | 20 A2 C1 + jsr HideAllOamSprites ; PRG $0031 | CPU $C031 | 20 EA C1 + sty PPUSCROLL ; PRG $0034 | CPU $C034 | 8C 05 20 + sty PPUSCROLL ; PRG $0037 | CPU $C037 | 8C 05 20 + iny ; PRG $003A | CPU $C03A | C8 + sty GameMode ; PRG $003B | CPU $C03B | 84 3A + lda #$0F ; PRG $003D | CPU $C03D | A9 0F + sta SND_CHN ; PRG $003F | CPU $C03F | 8D 15 40 + lda #$90 ; PRG $0042 | CPU $C042 | A9 90 + sta PPUCTRL ; PRG $0044 | CPU $C044 | 8D 00 20 +; ----------------------------------------------------------------------------- +; Global purpose: Select Main Loop Audio Path. +; Local behavior: Reads GameMode, RunAudioOnlyFrame, PlayerModeOrScreenPhase, RunMainGameFrame; mutates no direct memory mutation observed. +; Parameters: GameMode, RunAudioOnlyFrame, PlayerModeOrScreenPhase, RunMainGameFrame. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +SelectMainLoopAudioPath: + lda GameMode ; PRG $0047 | CPU $C047 | A5 3A + beq RunAudioOnlyFrame ; PRG $0049 | CPU $C049 | F0 06 + lda PlayerModeOrScreenPhase ; PRG $004B | CPU $C04B | A5 3C + cmp #$01 ; PRG $004D | CPU $C04D | C9 01 + bne RunMainGameFrame ; PRG $004F | CPU $C04F | D0 03 +; ----------------------------------------------------------------------------- +; Global purpose: Run Audio Only Frame. +; Local behavior: Reads UpdateAudioEngine; mutates no direct memory mutation observed. +; Parameters: UpdateAudioEngine. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +RunAudioOnlyFrame: + jsr UpdateAudioEngine ; PRG $0051 | CPU $C051 | 20 20 F8 +; ----------------------------------------------------------------------------- +; Global purpose: Run Main Game Frame. +; Local behavior: Reads DecrementGameplayTimers, UpdateTitleAndGameplayState, RequestNmiProcessing, SelectMainLoopAudioPath; mutates no direct memory mutation observed. +; Parameters: DecrementGameplayTimers, UpdateTitleAndGameplayState, RequestNmiProcessing, SelectMainLoopAudioPath. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +RunMainGameFrame: + jsr DecrementGameplayTimers ; PRG $0054 | CPU $C054 | 20 B0 C3 + jsr UpdateTitleAndGameplayState ; PRG $0057 | CPU $C057 | 20 BA C0 + jsr RequestNmiProcessing ; PRG $005A | CPU $C05A | 20 5F C0 + beq SelectMainLoopAudioPath ; PRG $005D | CPU $C05D | F0 E8 +; ----------------------------------------------------------------------------- +; Global purpose: Request Nmi Processing. +; Local behavior: Reads implicit CPU state or none observed; mutates NmiFrameDelay. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +RequestNmiProcessing: + lda #$01 ; PRG $005F | CPU $C05F | A9 01 + sta NmiFrameDelay ; PRG $0061 | CPU $C061 | 85 32 +; ----------------------------------------------------------------------------- +; Global purpose: Wait For Frame Ready. +; Local behavior: Reads AdvancePseudoRandomState, FrameReadyFlag, WaitForFrameReady, FrameCounter, NmiFrameDelay; mutates FrameCounter, NmiFrameDelay, FrameReadyFlag. +; Parameters: AdvancePseudoRandomState, FrameReadyFlag, WaitForFrameReady, FrameCounter, NmiFrameDelay. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$00; sta FrameReadyFlag; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +WaitForFrameReady: + jsr AdvancePseudoRandomState ; PRG $0063 | CPU $C063 | 20 2F C4 + lda FrameReadyFlag ; PRG $0066 | CPU $C066 | A5 30 + beq WaitForFrameReady ; PRG $0068 | CPU $C068 | F0 F9 + inc FrameCounter ; PRG $006A | CPU $C06A | E6 27 + dec NmiFrameDelay ; PRG $006C | CPU $C06C | C6 32 + lda #$00 ; PRG $006E | CPU $C06E | A9 00 + sta FrameReadyFlag ; PRG $0070 | CPU $C070 | 85 30 + rts ; PRG $0072 | CPU $C072 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Clear Nmi Work Mode. +; Local behavior: Reads implicit CPU state or none observed; mutates NmiWorkMode. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ClearNmiWorkMode: + lda #$00 ; PRG $0073 | CPU $C073 | A9 00 + sta NmiWorkMode ; PRG $0075 | CPU $C075 | 85 33 + nop ; PRG $0077 | CPU $C077 | EA +; ----------------------------------------------------------------------------- +; Global purpose: Wait For Nmi Work Completion. +; Local behavior: Reads NmiWorkMode, WaitForNmiWorkCompletion; mutates no direct memory mutation observed. +; Parameters: NmiWorkMode, WaitForNmiWorkCompletion. +; Returns: returns to caller; flags/register result depends on final instructions: lda NmiWorkMode; beq WaitForNmiWorkCompletion; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +WaitForNmiWorkCompletion: + lda NmiWorkMode ; PRG $0078 | CPU $C078 | A5 33 + beq WaitForNmiWorkCompletion ; PRG $007A | CPU $C07A | F0 FC + rts ; PRG $007C | CPU $C07C | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Disable Rendering For Nmi Work. +; Local behavior: Reads ClearNmiWorkMode, WritePpuMaskAndReturn; mutates no direct memory mutation observed. +; Parameters: ClearNmiWorkMode, WritePpuMaskAndReturn. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +DisableRenderingForNmiWork: + jsr ClearNmiWorkMode ; PRG $007D | CPU $C07D | 20 73 C0 + lda #$06 ; PRG $0080 | CPU $C080 | A9 06 + bne WritePpuMaskAndReturn ; PRG $0082 | CPU $C082 | D0 05 +; ----------------------------------------------------------------------------- +; Global purpose: Enable Rendering After Nmi Work. +; Local behavior: Reads ClearNmiWorkMode; mutates no direct memory mutation observed. +; Parameters: ClearNmiWorkMode. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EnableRenderingAfterNmiWork: + jsr ClearNmiWorkMode ; PRG $0084 | CPU $C084 | 20 73 C0 + lda #$1E ; PRG $0087 | CPU $C087 | A9 1E +; ----------------------------------------------------------------------------- +; Global purpose: Write Ppu Mask And Return. +; Local behavior: Reads implicit CPU state or none observed; mutates PPUMASK. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: sta PPUMASK; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +WritePpuMaskAndReturn: + sta PPUMASK ; PRG $0089 | CPU $C089 | 8D 01 20 + rts ; PRG $008C | CPU $C08C | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C08D. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +NmiHandler: + pha ; PRG $008D | CPU $C08D | 48 + txa ; PRG $008E | CPU $C08E | 8A + pha ; PRG $008F | CPU $C08F | 48 + tya ; PRG $0090 | CPU $C090 | 98 + pha ; PRG $0091 | CPU $C091 | 48 + lda #$00 ; PRG $0092 | CPU $C092 | A9 00 + sta OAMADDR ; PRG $0094 | CPU $C094 | 8D 03 20 + lda #$02 ; PRG $0097 | CPU $C097 | A9 02 + sta OAMDMA ; PRG $0099 | CPU $C099 | 8D 14 40 + lda NmiFrameDelay ; PRG $009C | CPU $C09C | A5 32 + beq CompleteNmiAndRestoreRegisters ; PRG $009E | CPU $C09E | F0 10 + jsr RunQueuedPpuTransfer ; PRG $00A0 | CPU $C0A0 | 20 F5 C1 + jsr UpdatePpuTransferQueue ; PRG $00A3 | CPU $C0A3 | 20 70 C3 + jsr ResetPpuScroll ; PRG $00A6 | CPU $C0A6 | 20 24 C4 + jsr UpdateControllerState_C328 ; PRG $00A9 | CPU $C0A9 | 20 28 C3 + ldy #$01 ; PRG $00AC | CPU $C0AC | A0 01 + sty FrameReadyFlag ; PRG $00AE | CPU $C0AE | 84 30 +; ----------------------------------------------------------------------------- +; Global purpose: Complete Nmi And Restore Registers. +; Local behavior: Reads implicit CPU state or none observed; mutates NmiWorkMode. +; Parameters: implicit CPU state or none observed. +; Returns: returns from interrupt; restored CPU context. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +CompleteNmiAndRestoreRegisters: + lda #$01 ; PRG $00B0 | CPU $C0B0 | A9 01 + sta NmiWorkMode ; PRG $00B2 | CPU $C0B2 | 85 33 + pla ; PRG $00B4 | CPU $C0B4 | 68 + tay ; PRG $00B5 | CPU $C0B5 | A8 + pla ; PRG $00B6 | CPU $C0B6 | 68 + tax ; PRG $00B7 | CPU $C0B7 | AA + pla ; PRG $00B8 | CPU $C0B8 | 68 + rti ; PRG $00B9 | CPU $C0B9 | 40 +; ----------------------------------------------------------------------------- +; Global purpose: Update Title And Gameplay State. +; Local behavior: Reads GameMode, HandleStartAndPlayerSelection, ControllerButtons, ClearScreenSubstate, ScreenSubstate, DispatchCurrentScreenState, CurrentScreenState, StartGameplayCountdown; mutates ScreenSubstate. +; Parameters: GameMode, HandleStartAndPlayerSelection, ControllerButtons, ClearScreenSubstate, ScreenSubstate, DispatchCurrentScreenState, CurrentScreenState, StartGameplayCountdown. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateTitleAndGameplayState: + lda GameMode ; PRG $00BA | CPU $C0BA | A5 3A + bne HandleStartAndPlayerSelection ; PRG $00BC | CPU $C0BC | D0 6B + lda ControllerButtons ; PRG $00BE | CPU $C0BE | A5 1A + and #$10 ; PRG $00C0 | CPU $C0C0 | 29 10 + beq ClearScreenSubstate ; PRG $00C2 | CPU $C0C2 | F0 40 + ldy ScreenSubstate ; PRG $00C4 | CPU $C0C4 | A4 36 + bne DispatchCurrentScreenState ; PRG $00C6 | CPU $C0C6 | D0 40 + iny ; PRG $00C8 | CPU $C0C8 | C8 + sty ScreenSubstate ; PRG $00C9 | CPU $C0C9 | 84 36 + ldy CurrentScreenState ; PRG $00CB | CPU $C0CB | A4 3B + cpy #$0D ; PRG $00CD | CPU $C0CD | C0 0D + beq StartGameplayCountdown ; PRG $00CF | CPU $C0CF | F0 25 + cpy #$06 ; PRG $00D1 | CPU $C0D1 | C0 06 + bne DispatchCurrentScreenState ; PRG $00D3 | CPU $C0D3 | D0 33 + ldx #$07 ; PRG $00D5 | CPU $C0D5 | A2 07 +; ----------------------------------------------------------------------------- +; Global purpose: Copy Player State Defaults. +; Local behavior: Reads GameplayTimerArray, CopyPlayerStateDefaults, ClearNmiWorkMode, ClearAudioRequestFlags, SelectAlternateAudioMode; mutates SavedGameplayTimerArray, ReturnScreenState, CurrentScreenState, PPUMASK, PPUCTRL. +; Parameters: GameplayTimerArray, CopyPlayerStateDefaults, ClearNmiWorkMode, ClearAudioRequestFlags, SelectAlternateAudioMode. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +CopyPlayerStateDefaults: + lda GameplayTimerArray,x ; PRG $00D7 | CPU $C0D7 | B5 20 + sta SavedGameplayTimerArray,x ; PRG $00D9 | CPU $C0D9 | 95 28 + dex ; PRG $00DB | CPU $C0DB | CA + bpl CopyPlayerStateDefaults ; PRG $00DC | CPU $C0DC | 10 F9 + sty ReturnScreenState ; PRG $00DE | CPU $C0DE | 84 3D + lda #$0D ; PRG $00E0 | CPU $C0E0 | A9 0D + sta CurrentScreenState ; PRG $00E2 | CPU $C0E2 | 85 3B + jsr ClearNmiWorkMode ; PRG $00E4 | CPU $C0E4 | 20 73 C0 + lda #$0E ; PRG $00E7 | CPU $C0E7 | A9 0E + sta PPUMASK ; PRG $00E9 | CPU $C0E9 | 8D 01 20 + lda #$81 ; PRG $00EC | CPU $C0EC | A9 81 + sta PPUCTRL ; PRG $00EE | CPU $C0EE | 8D 00 20 + jsr ClearAudioRequestFlags ; PRG $00F1 | CPU $C0F1 | 20 56 C6 + beq SelectAlternateAudioMode ; PRG $00F4 | CPU $C0F4 | F0 08 +; ----------------------------------------------------------------------------- +; Global purpose: Start Gameplay Countdown. +; Local behavior: Reads implicit CPU state or none observed; mutates GameplayTimer, CurrentScreenState. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +StartGameplayCountdown: + lda #$14 ; PRG $00F6 | CPU $C0F6 | A9 14 + sta GameplayTimer ; PRG $00F8 | CPU $C0F8 | 85 21 + lda #$0C ; PRG $00FA | CPU $C0FA | A9 0C + sta CurrentScreenState ; PRG $00FC | CPU $C0FC | 85 3B +; ----------------------------------------------------------------------------- +; Global purpose: Select Alternate Audio Mode. +; Local behavior: Reads DispatchCurrentScreenState; mutates AudioRequestFlags. +; Parameters: DispatchCurrentScreenState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +SelectAlternateAudioMode: + lda #$02 ; PRG $00FE | CPU $C0FE | A9 02 + sta AudioRequestFlags ; PRG $0100 | CPU $C100 | 85 FB + bne DispatchCurrentScreenState ; PRG $0102 | CPU $C102 | D0 04 +; ----------------------------------------------------------------------------- +; Global purpose: Clear Screen Substate. +; Local behavior: Reads implicit CPU state or none observed; mutates ScreenSubstate. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ClearScreenSubstate: + lda #$00 ; PRG $0104 | CPU $C104 | A9 00 + sta ScreenSubstate ; PRG $0106 | CPU $C106 | 85 36 +; ----------------------------------------------------------------------------- +; Global purpose: Dispatch Current Screen State. +; Local behavior: Reads CurrentScreenState, DispatchScreenStateHandler; mutates no direct memory mutation observed. +; Parameters: CurrentScreenState, DispatchScreenStateHandler. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +DispatchCurrentScreenState: + lda CurrentScreenState ; PRG $0108 | CPU $C108 | A5 3B + jsr DispatchScreenStateHandler ; PRG $010A | CPU $C10A | 20 C6 C3 +ScreenStateHandlerTable: + .byte $63,$C6,$AB,$C6,$D4,$C6,$EB,$C6,$55,$C7,$C2,$C7,$DD,$C7,$C6,$C8 ; PRG $010D | CPU $C10D + .byte $3E,$C9,$4B,$C9,$98,$C9,$AF,$C9,$C7,$C9,$7C,$C0 ; PRG $011D | CPU $C11D +; ----------------------------------------------------------------------------- +; Global purpose: Handle Start And Player Selection. +; Local behavior: Reads ControllerButtons, Flow_C142, ClearAudioRequestFlags; mutates GameMode, CurrentScreenState. +; Parameters: ControllerButtons, Flow_C142, ClearAudioRequestFlags. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +HandleStartAndPlayerSelection: + lda ControllerButtons ; PRG $0129 | CPU $C129 | A5 1A + and #$30 ; PRG $012B | CPU $C12B | 29 30 + cmp #$10 ; PRG $012D | CPU $C12D | C9 10 + bne Flow_C142 ; PRG $012F | CPU $C12F | D0 11 + jsr ClearAudioRequestFlags ; PRG $0131 | CPU $C131 | 20 56 C6 + sta GameMode ; PRG $0134 | CPU $C134 | 85 3A + sta CurrentScreenState ; PRG $0136 | CPU $C136 | 85 3B + ldx #$07 ; PRG $0138 | CPU $C138 | A2 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C13 A. +; Local behavior: Reads Flow_C13A, DisableRenderingForNmiWork; mutates ActorFlags. +; Parameters: Flow_C13A, DisableRenderingForNmiWork. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C13A: + sta ActorFlags,x ; PRG $013A | CPU $C13A | 95 84 + dex ; PRG $013C | CPU $C13C | CA + bpl Flow_C13A ; PRG $013D | CPU $C13D | 10 FB + jmp DisableRenderingForNmiWork ; PRG $013F | CPU $C13F | 4C 7D C0 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C142. +; Local behavior: Reads PlayerModeOrScreenPhase, Flow_C18D, Flow_C167, Flow_C160, StartInputLatch, Flow_C173, SelectedPlayerAndScreenFlags, Flow_C15B; mutates no direct memory mutation observed. +; Parameters: PlayerModeOrScreenPhase, Flow_C18D, Flow_C167, Flow_C160, StartInputLatch, Flow_C173, SelectedPlayerAndScreenFlags, Flow_C15B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C142: + ldx PlayerModeOrScreenPhase ; PRG $0142 | CPU $C142 | A6 3C + beq Flow_C18D ; PRG $0144 | CPU $C144 | F0 47 + cmp #$20 ; PRG $0146 | CPU $C146 | C9 20 + bne Flow_C167 ; PRG $0148 | CPU $C148 | D0 1D + cpx #$01 ; PRG $014A | CPU $C14A | E0 01 + bne Flow_C160 ; PRG $014C | CPU $C14C | D0 12 + lda StartInputLatch ; PRG $014E | CPU $C14E | A5 37 + bne Flow_C173 ; PRG $0150 | CPU $C150 | D0 21 + ldy SelectedPlayerAndScreenFlags ; PRG $0152 | CPU $C152 | A4 38 + iny ; PRG $0154 | CPU $C154 | C8 + cpy #$04 ; PRG $0155 | CPU $C155 | C0 04 + bne Flow_C15B ; PRG $0157 | CPU $C157 | D0 02 + ldy #$00 ; PRG $0159 | CPU $C159 | A0 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C15 B. +; Local behavior: Reads UpdateZp_37_C16F; mutates SelectedPlayerAndScreenFlags. +; Parameters: UpdateZp_37_C16F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C15B: + sty SelectedPlayerAndScreenFlags ; PRG $015B | CPU $C15B | 84 38 + jmp UpdateZp_37_C16F ; PRG $015D | CPU $C15D | 4C 6F C1 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C160. +; Local behavior: Reads ClearAudioRequestFlags, Flow_C18D; mutates PlayerModeOrScreenPhase. +; Parameters: ClearAudioRequestFlags, Flow_C18D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C160: + jsr ClearAudioRequestFlags ; PRG $0160 | CPU $C160 | 20 56 C6 + sta PlayerModeOrScreenPhase ; PRG $0163 | CPU $C163 | 85 3C + beq Flow_C18D ; PRG $0165 | CPU $C165 | F0 26 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C167. +; Local behavior: Reads UpdateZp_37_C16F, Flow_C17D; mutates StartInputLatch. +; Parameters: UpdateZp_37_C16F, Flow_C17D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C167: + cmp #$00 ; PRG $0167 | CPU $C167 | C9 00 + bne UpdateZp_37_C16F ; PRG $0169 | CPU $C169 | D0 04 + sta StartInputLatch ; PRG $016B | CPU $C16B | 85 37 + beq Flow_C17D ; PRG $016D | CPU $C16D | F0 0E +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp 37 C16 F. +; Local behavior: Reads implicit CPU state or none observed; mutates StartInputLatch. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_37_C16F: + lda #$01 ; PRG $016F | CPU $C16F | A9 01 + sta StartInputLatch ; PRG $0171 | CPU $C171 | 85 37 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C173. +; Local behavior: Reads ScreenSelectionPositionOrDelay, Flow_C17D; mutates ScreenSelectionPositionOrDelay. +; Parameters: ScreenSelectionPositionOrDelay, Flow_C17D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C173: + lda ScreenSelectionPositionOrDelay ; PRG $0173 | CPU $C173 | A5 25 + cmp #$25 ; PRG $0175 | CPU $C175 | C9 25 + bcs Flow_C17D ; PRG $0177 | CPU $C177 | B0 04 + lda #$25 ; PRG $0179 | CPU $C179 | A9 25 + sta ScreenSelectionPositionOrDelay ; PRG $017B | CPU $C17B | 85 25 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C17 D. +; Local behavior: Reads Flow_C18D, SelectedPlayerAndScreenFlags; mutates OamBuffer. +; Parameters: Flow_C18D, SelectedPlayerAndScreenFlags. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C17D: + cpx #$01 ; PRG $017D | CPU $C17D | E0 01 + bne Flow_C18D ; PRG $017F | CPU $C17F | D0 0C + lda SelectedPlayerAndScreenFlags ; PRG $0181 | CPU $C181 | A5 38 + asl a ; PRG $0183 | CPU $C183 | 0A + asl a ; PRG $0184 | CPU $C184 | 0A + asl a ; PRG $0185 | CPU $C185 | 0A + asl a ; PRG $0186 | CPU $C186 | 0A + clc ; PRG $0187 | CPU $C187 | 18 + adc #$80 ; PRG $0188 | CPU $C188 | 69 80 + sta OamBuffer ; PRG $018A | CPU $C18A | 8D 00 02 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C18 D. +; Local behavior: Reads PlayerModeOrScreenPhase, DispatchScreenStateHandler; mutates no direct memory mutation observed. +; Parameters: PlayerModeOrScreenPhase, DispatchScreenStateHandler. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C18D: + lda PlayerModeOrScreenPhase ; PRG $018D | CPU $C18D | A5 3C + jsr DispatchScreenStateHandler ; PRG $018F | CPU $C18F | 20 C6 C3 + .byte $EB,$C9,$2B,$CA,$41,$CA,$56,$CA,$5B,$CA,$60,$CA,$6E,$CA,$EB,$CA ; PRG $0192 | CPU $C192 +; ----------------------------------------------------------------------------- +; Global purpose: Clear Nametable2400 With Tile FF. +; Local behavior: Reads FillNametableAndClearAttributes; mutates no direct memory mutation observed. +; Parameters: FillNametableAndClearAttributes. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ClearNametable2400WithTileFF: + lda #$24 ; PRG $01A2 | CPU $C1A2 | A9 24 + ldx #$FF ; PRG $01A4 | CPU $C1A4 | A2 FF + jsr FillNametableAndClearAttributes ; PRG $01A6 | CPU $C1A6 | 20 AD C1 +; ----------------------------------------------------------------------------- +; Global purpose: Clear Nametable2000 With Tile24. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ClearNametable2000WithTile24: + ldx #$24 ; PRG $01A9 | CPU $C1A9 | A2 24 + lda #$20 ; PRG $01AB | CPU $C1AB | A9 20 +; ----------------------------------------------------------------------------- +; Global purpose: Fill Nametable And Clear Attributes. +; Local behavior: Reads PPUSTATUS, WorkPointerOrValueHi, SourceRecordPointerLo; mutates SourceRecordPointerLo, WorkPointerOrValueHi, PPUCTRL, PPUADDR. +; Parameters: PPUSTATUS, WorkPointerOrValueHi, SourceRecordPointerLo. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +FillNametableAndClearAttributes: + stx SourceRecordPointerLo ; PRG $01AD | CPU $C1AD | 86 03 + sta WorkPointerOrValueHi ; PRG $01AF | CPU $C1AF | 85 02 + lda PPUSTATUS ; PRG $01B1 | CPU $C1B1 | AD 02 20 + lda #$90 ; PRG $01B4 | CPU $C1B4 | A9 90 + sta PPUCTRL ; PRG $01B6 | CPU $C1B6 | 8D 00 20 + lda WorkPointerOrValueHi ; PRG $01B9 | CPU $C1B9 | A5 02 + sta PPUADDR ; PRG $01BB | CPU $C1BB | 8D 06 20 + lda #$00 ; PRG $01BE | CPU $C1BE | A9 00 + sta PPUADDR ; PRG $01C0 | CPU $C1C0 | 8D 06 20 + ldx #$04 ; PRG $01C3 | CPU $C1C3 | A2 04 + ldy #$00 ; PRG $01C5 | CPU $C1C5 | A0 00 + lda SourceRecordPointerLo ; PRG $01C7 | CPU $C1C7 | A5 03 +; ----------------------------------------------------------------------------- +; Global purpose: Fill Nametable Tile Bytes. +; Local behavior: Reads FillNametableTileBytes, WorkPointerOrValueHi; mutates PPUDATA, PPUADDR. +; Parameters: FillNametableTileBytes, WorkPointerOrValueHi. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +FillNametableTileBytes: + sta PPUDATA ; PRG $01C9 | CPU $C1C9 | 8D 07 20 + dey ; PRG $01CC | CPU $C1CC | 88 + bne FillNametableTileBytes ; PRG $01CD | CPU $C1CD | D0 FA + dex ; PRG $01CF | CPU $C1CF | CA + bne FillNametableTileBytes ; PRG $01D0 | CPU $C1D0 | D0 F7 + lda WorkPointerOrValueHi ; PRG $01D2 | CPU $C1D2 | A5 02 + clc ; PRG $01D4 | CPU $C1D4 | 18 + adc #$03 ; PRG $01D5 | CPU $C1D5 | 69 03 + sta PPUADDR ; PRG $01D7 | CPU $C1D7 | 8D 06 20 + lda #$C0 ; PRG $01DA | CPU $C1DA | A9 C0 + sta PPUADDR ; PRG $01DC | CPU $C1DC | 8D 06 20 + ldy #$40 ; PRG $01DF | CPU $C1DF | A0 40 + lda #$00 ; PRG $01E1 | CPU $C1E1 | A9 00 +; ----------------------------------------------------------------------------- +; Global purpose: Clear Nametable Attributes. +; Local behavior: Reads ClearNametableAttributes; mutates PPUDATA. +; Parameters: ClearNametableAttributes. +; Returns: returns to caller; flags/register result depends on final instructions: dey; bne ClearNametableAttributes; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ClearNametableAttributes: + sta PPUDATA ; PRG $01E3 | CPU $C1E3 | 8D 07 20 + dey ; PRG $01E6 | CPU $C1E6 | 88 + bne ClearNametableAttributes ; PRG $01E7 | CPU $C1E7 | D0 FA + rts ; PRG $01E9 | CPU $C1E9 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Hide All Oam Sprites. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +HideAllOamSprites: + ldy #$00 ; PRG $01EA | CPU $C1EA | A0 00 + lda #$F4 ; PRG $01EC | CPU $C1EC | A9 F4 +; ----------------------------------------------------------------------------- +; Global purpose: Hide OAM sprites loop. +; Local behavior: Writes $F4 to OamBuffer,Y, decrements Y, and repeats until Y returns to $00. +; Parameters: A = hidden-sprite Y coordinate ($F4); Y = starting OAM byte offset ($00 for full buffer). +; Returns: Falls through to the RTS at $C1F4 after all 64 OAM Y bytes are hidden. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +HideOamSpritesLoop: + sta OamBuffer,y ; PRG $01EE | CPU $C1EE | 99 00 02 + dey ; PRG $01F1 | CPU $C1F1 | 88 + bne HideOamSpritesLoop ; PRG $01F2 | CPU $C1F2 | D0 FA +; ----------------------------------------------------------------------------- +; Global purpose: Flow C1 F4. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C1F4: + rts ; PRG $01F4 | CPU $C1F4 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Run Queued Ppu Transfer. +; Local behavior: Reads QueuedPpuTransferCount, Flow_C1F4, QueuedPpuTransferSourcePageTable, QueuedPpuTransferDestinationOffsetTable, BeginPpuCommandStream; mutates QueuedPpuTransferCount. +; Parameters: QueuedPpuTransferCount, Flow_C1F4, QueuedPpuTransferSourcePageTable, QueuedPpuTransferDestinationOffsetTable, BeginPpuCommandStream. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +RunQueuedPpuTransfer: + ldy QueuedPpuTransferCount ; PRG $01F5 | CPU $C1F5 | A4 34 + beq Flow_C1F4 ; PRG $01F7 | CPU $C1F7 | F0 FB + lda QueuedPpuTransferSourcePageTable,y ; PRG $01F9 | CPU $C1F9 | B9 0A C2 + ldx QueuedPpuTransferDestinationOffsetTable,y ; PRG $01FC | CPU $C1FC | BE 06 C2 + ldy #$00 ; PRG $01FF | CPU $C1FF | A0 00 + sty QueuedPpuTransferCount ; PRG $0201 | CPU $C201 | 84 34 + tay ; PRG $0203 | CPU $C203 | A8 + jmp BeginPpuCommandStream ; PRG $0204 | CPU $C204 | 4C DC C3 + .byte $16,$3A,$5E ; PRG $0207 | CPU $C207 + +QueuedPpuTransferSourcePageTable: + .byte $82,$F0,$F0,$F0,$F0 ; PRG $020A | CPU $C20A +; ----------------------------------------------------------------------------- +; Global purpose: Advance Object Record Pointer. +; Local behavior: Reads ObjectRecordPointerLo, ObjectRecordStride; mutates ObjectRecordPointerLo. +; Parameters: ObjectRecordPointerLo, ObjectRecordStride. +; Returns: returns to caller; flags/register result depends on final instructions: adc ObjectRecordStride; sta ObjectRecordPointerLo; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +AdvanceObjectRecordPointer: + lda ObjectRecordPointerLo ; PRG $020F | CPU $C20F | A5 A8 + clc ; PRG $0211 | CPU $C211 | 18 + adc ObjectRecordStride ; PRG $0212 | CPU $C212 | 65 AA + sta ObjectRecordPointerLo ; PRG $0214 | CPU $C214 | 85 A8 + rts ; PRG $0216 | CPU $C216 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C217. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +LoadObjectSpriteRenderState: + ldy #$0A ; PRG $0217 | CPU $C217 | A0 0A + lda (ObjectRecordPointerLo),y ; PRG $0219 | CPU $C219 | B1 A8 + tax ; PRG $021B | CPU $C21B | AA + dey ; PRG $021C | CPU $C21C | 88 + lda (ObjectRecordPointerLo),y ; PRG $021D | CPU $C21D | B1 A8 + sta ObjectScreenX ; PRG $021F | CPU $C21F | 85 B9 + dey ; PRG $0221 | CPU $C221 | 88 + lda (ObjectRecordPointerLo),y ; PRG $0222 | CPU $C222 | B1 A8 + sta ObjectScreenY ; PRG $0224 | CPU $C224 | 85 B8 + dey ; PRG $0226 | CPU $C226 | 88 + lda (ObjectRecordPointerLo),y ; PRG $0227 | CPU $C227 | B1 A8 + sta SpriteAttributes ; PRG $0229 | CPU $C229 | 85 B7 + dey ; PRG $022B | CPU $C22B | 88 + lda (ObjectRecordPointerLo),y ; PRG $022C | CPU $C22C | B1 A8 + asl a ; PRG $022E | CPU $C22E | 0A + tay ; PRG $022F | CPU $C22F | A8 + lda AnimationBaseTileTable,y ; PRG $0230 | CPU $C230 | B9 B0 F6 + sta CurrentSpriteTileId ; PRG $0233 | CPU $C233 | 85 11 + lda AnimationLayoutIndexTable,y ; PRG $0235 | CPU $C235 | B9 AF F6 + asl a ; PRG $0238 | CPU $C238 | 0A + tay ; PRG $0239 | CPU $C239 | A8 + lda MetaspriteLayoutPointerTable,y ; PRG $023A | CPU $C23A | B9 57 F7 + sta MetaspriteLayoutPointerLo ; PRG $023D | CPU $C23D | 85 14 + lda MetaspriteLayoutPointerTableHi,y ; PRG $023F | CPU $C23F | B9 58 F7 + sta MetaspriteLayoutPointerHi ; PRG $0242 | CPU $C242 | 85 15 + ldy #$00 ; PRG $0244 | CPU $C244 | A0 00 + beq AdvanceMetaspriteLayout ; PRG $0246 | CPU $C246 | F0 46 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C248. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +RenderMetaspriteEntry: + lda (MetaspriteLayoutPointerLo),y ; PRG $0248 | CPU $C248 | B1 14 + asl a ; PRG $024A | CPU $C24A | 0A + bcc EmitOamSprite ; PRG $024B | CPU $C24B | 90 06 + lsr a ; PRG $024D | CPU $C24D | 4A + eor FrameCounter ; PRG $024E | CPU $C24E | 45 27 + lsr a ; PRG $0250 | CPU $C250 | 4A + bcs SkipFlickerSprite ; PRG $0251 | CPU $C251 | B0 34 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C253. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EmitOamSprite: + iny ; PRG $0253 | CPU $C253 | C8 + lda (MetaspriteLayoutPointerLo),y ; PRG $0254 | CPU $C254 | B1 14 + iny ; PRG $0256 | CPU $C256 | C8 + clc ; PRG $0257 | CPU $C257 | 18 + adc ObjectScreenY ; PRG $0258 | CPU $C258 | 65 B8 + adc #$FF ; PRG $025A | CPU $C25A | 69 FF + sta OamBuffer,x ; PRG $025C | CPU $C25C | 9D 00 02 + inx ; PRG $025F | CPU $C25F | E8 + lda CurrentSpriteTileId ; PRG $0260 | CPU $C260 | A5 11 + sta OamBuffer,x ; PRG $0262 | CPU $C262 | 9D 00 02 + inc CurrentSpriteTileId ; PRG $0265 | CPU $C265 | E6 11 + inx ; PRG $0267 | CPU $C267 | E8 + lda SpriteAttributes ; PRG $0268 | CPU $C268 | A5 B7 + sta OamBuffer,x ; PRG $026A | CPU $C26A | 9D 00 02 + inx ; PRG $026D | CPU $C26D | E8 + lda (MetaspriteLayoutPointerLo),y ; PRG $026E | CPU $C26E | B1 14 + bit SpriteAttributes ; PRG $0270 | CPU $C270 | 24 B7 + bvs MirrorSpriteXOffset ; PRG $0272 | CPU $C272 | 70 03 + clc ; PRG $0274 | CPU $C274 | 18 + bcc StoreSpriteX ; PRG $0275 | CPU $C275 | 90 06 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C277. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +MirrorSpriteXOffset: + eor #$FF ; PRG $0277 | CPU $C277 | 49 FF + sec ; PRG $0279 | CPU $C279 | 38 + sbc #$08 ; PRG $027A | CPU $C27A | E9 08 + sec ; PRG $027C | CPU $C27C | 38 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C27D. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +StoreSpriteX: + adc ObjectScreenX ; PRG $027D | CPU $C27D | 65 B9 + iny ; PRG $027F | CPU $C27F | C8 + sta OamBuffer,x ; PRG $0280 | CPU $C280 | 9D 00 02 + inx ; PRG $0283 | CPU $C283 | E8 + jmp AdvanceMetaspriteLayout ; PRG $0284 | CPU $C284 | 4C 8E C2 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C287. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +SkipFlickerSprite: + iny ; PRG $0287 | CPU $C287 | C8 + iny ; PRG $0288 | CPU $C288 | C8 + iny ; PRG $0289 | CPU $C289 | C8 + inc CurrentSpriteTileId ; PRG $028A | CPU $C28A | E6 11 + inc SkippedSpriteCount ; PRG $028C | CPU $C28C | E6 0D +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C28E. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +AdvanceMetaspriteLayout: + lda (MetaspriteLayoutPointerLo),y ; PRG $028E | CPU $C28E | B1 14 + and #$10 ; PRG $0290 | CPU $C290 | 29 10 + beq RenderMetaspriteEntry ; PRG $0292 | CPU $C292 | F0 B4 + lda (MetaspriteLayoutPointerLo),y ; PRG $0294 | CPU $C294 | B1 14 + and #$0F ; PRG $0296 | CPU $C296 | 29 0F + beq ReturnFromMetaspriteRender ; PRG $0298 | CPU $C298 | F0 0D + tay ; PRG $029A | CPU $C29A | A8 + lda #$F4 ; PRG $029B | CPU $C29B | A9 F4 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C29D. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +HideUnusedMetaspriteSlots: + sta OamBuffer,x ; PRG $029D | CPU $C29D | 9D 00 02 + inx ; PRG $02A0 | CPU $C2A0 | E8 + inx ; PRG $02A1 | CPU $C2A1 | E8 + inx ; PRG $02A2 | CPU $C2A2 | E8 + inx ; PRG $02A3 | CPU $C2A3 | E8 + dey ; PRG $02A4 | CPU $C2A4 | 88 + bne HideUnusedMetaspriteSlots ; PRG $02A5 | CPU $C2A5 | D0 F6 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C2A7. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ReturnFromMetaspriteRender: + rts ; PRG $02A7 | CPU $C2A7 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Decrement Object Timer. +; Local behavior: Reads ObjectRecordPointerLo, Flow_C2B3; mutates ObjectRecordPointerLo. +; Parameters: ObjectRecordPointerLo, Flow_C2B3. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +DecrementObjectTimer: + ldy #$03 ; PRG $02A8 | CPU $C2A8 | A0 03 + lda (ObjectRecordPointerLo),y ; PRG $02AA | CPU $C2AA | B1 A8 + beq Flow_C2B3 ; PRG $02AC | CPU $C2AC | F0 05 + sec ; PRG $02AE | CPU $C2AE | 38 + sbc #$01 ; PRG $02AF | CPU $C2AF | E9 01 + sta (ObjectRecordPointerLo),y ; PRG $02B1 | CPU $C2B1 | 91 A8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C2 B3. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C2B3: + rts ; PRG $02B3 | CPU $C2B3 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch C2 B4. +; Local behavior: Reads DecrementObjectTimer, Flow_C2B3, ObjectRecordPointerLo, ObjectRecordPointerHi, Flow_C2D0, Flow_C2EF, Flow_C30F; mutates no direct memory mutation observed. +; Parameters: DecrementObjectTimer, Flow_C2B3, ObjectRecordPointerLo, ObjectRecordPointerHi, Flow_C2D0, Flow_C2EF, Flow_C30F. +; Returns: returns to caller; flags/register result depends on final instructions: cmp #$06; beq Flow_C30F; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_C2B4: + jsr DecrementObjectTimer ; PRG $02B4 | CPU $C2B4 | 20 A8 C2 + bne Flow_C2B3 ; PRG $02B7 | CPU $C2B7 | D0 FA + ldx ObjectRecordPointerLo ; PRG $02B9 | CPU $C2B9 | A6 A8 + lda ObjectRecordPointerHi ; PRG $02BB | CPU $C2BB | A5 A9 + cmp #$03 ; PRG $02BD | CPU $C2BD | C9 03 + beq Flow_C2D0 ; PRG $02BF | CPU $C2BF | F0 0F + cmp #$04 ; PRG $02C1 | CPU $C2C1 | C9 04 + beq Flow_C2EF ; PRG $02C3 | CPU $C2C3 | F0 2A + cmp #$06 ; PRG $02C5 | CPU $C2C5 | C9 06 + beq Flow_C30F ; PRG $02C7 | CPU $C2C7 | F0 46 + rts ; PRG $02C9 | CPU $C2C9 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C2 CA. +; Local behavior: Reads IndexedGameplayLookupTable_F5D4; mutates Ram_0305. +; Parameters: IndexedGameplayLookupTable_F5D4. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C2CA: + lda IndexedGameplayLookupTable_F5D4,y ; PRG $02CA | CPU $C2CA | B9 D4 F5 + sta Ram_0305,x ; PRG $02CD | CPU $C2CD | 9D 05 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C2 D0. +; Local behavior: Reads Ram_0305, IndexedGameplayLookupTable_F5D4, Flow_C2CA, Ram_0302; mutates Ram_0306, Ram_0303, Ram_0305. +; Parameters: Ram_0305, IndexedGameplayLookupTable_F5D4, Flow_C2CA, Ram_0302. +; Returns: returns to caller; flags/register result depends on final instructions: tya; sta Ram_0305,x; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C2D0: + ldy Ram_0305,x ; PRG $02D0 | CPU $C2D0 | BC 05 03 + lda IndexedGameplayLookupTable_F5D4,y ; PRG $02D3 | CPU $C2D3 | B9 D4 F5 + iny ; PRG $02D6 | CPU $C2D6 | C8 + cmp #$FF ; PRG $02D7 | CPU $C2D7 | C9 FF + beq Flow_C2CA ; PRG $02D9 | CPU $C2D9 | F0 EF + sta Ram_0306,x ; PRG $02DB | CPU $C2DB | 9D 06 03 + lda Ram_0302,x ; PRG $02DE | CPU $C2DE | BD 02 03 + sta Ram_0303,x ; PRG $02E1 | CPU $C2E1 | 9D 03 03 + tya ; PRG $02E4 | CPU $C2E4 | 98 + sta Ram_0305,x ; PRG $02E5 | CPU $C2E5 | 9D 05 03 + rts ; PRG $02E8 | CPU $C2E8 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C2 E9. +; Local behavior: Reads IndexedGameplayLookupTable_F60D; mutates Ram_0405. +; Parameters: IndexedGameplayLookupTable_F60D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C2E9: + lda IndexedGameplayLookupTable_F60D,y ; PRG $02E9 | CPU $C2E9 | B9 0D F6 + sta Ram_0405,x ; PRG $02EC | CPU $C2EC | 9D 05 04 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C2 EF. +; Local behavior: Reads Ram_0405, IndexedGameplayLookupTable_F60D, Flow_C2E9; mutates Ram_0406, Ram_0403, Ram_0405. +; Parameters: Ram_0405, IndexedGameplayLookupTable_F60D, Flow_C2E9. +; Returns: returns to caller; flags/register result depends on final instructions: tya; sta Ram_0405,x; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C2EF: + ldy Ram_0405,x ; PRG $02EF | CPU $C2EF | BC 05 04 + lda IndexedGameplayLookupTable_F60D,y ; PRG $02F2 | CPU $C2F2 | B9 0D F6 + iny ; PRG $02F5 | CPU $C2F5 | C8 + cmp #$FF ; PRG $02F6 | CPU $C2F6 | C9 FF + beq Flow_C2E9 ; PRG $02F8 | CPU $C2F8 | F0 EF + sta Ram_0406,x ; PRG $02FA | CPU $C2FA | 9D 06 04 + lda IndexedGameplayLookupTable_F60D,y ; PRG $02FD | CPU $C2FD | B9 0D F6 + sta Ram_0403,x ; PRG $0300 | CPU $C300 | 9D 03 04 + iny ; PRG $0303 | CPU $C303 | C8 + tya ; PRG $0304 | CPU $C304 | 98 + sta Ram_0405,x ; PRG $0305 | CPU $C305 | 9D 05 04 + rts ; PRG $0308 | CPU $C308 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C309. +; Local behavior: Reads IndexedGameplayLookupTable_F68B; mutates Ram_0605. +; Parameters: IndexedGameplayLookupTable_F68B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C309: + lda IndexedGameplayLookupTable_F68B,y ; PRG $0309 | CPU $C309 | B9 8B F6 + sta Ram_0605,x ; PRG $030C | CPU $C30C | 9D 05 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C30 F. +; Local behavior: Reads Ram_0605, IndexedGameplayLookupTable_F68B, Flow_C309, Ram_0602; mutates Ram_0606, Ram_0603, Ram_0605. +; Parameters: Ram_0605, IndexedGameplayLookupTable_F68B, Flow_C309, Ram_0602. +; Returns: returns to caller; flags/register result depends on final instructions: tya; sta Ram_0605,x; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C30F: + ldy Ram_0605,x ; PRG $030F | CPU $C30F | BC 05 06 + lda IndexedGameplayLookupTable_F68B,y ; PRG $0312 | CPU $C312 | B9 8B F6 + iny ; PRG $0315 | CPU $C315 | C8 + cmp #$FF ; PRG $0316 | CPU $C316 | C9 FF + beq Flow_C309 ; PRG $0318 | CPU $C318 | F0 EF + sta Ram_0606,x ; PRG $031A | CPU $C31A | 9D 06 06 + lda Ram_0602,x ; PRG $031D | CPU $C31D | BD 02 06 + sta Ram_0603,x ; PRG $0320 | CPU $C320 | 9D 03 06 + tya ; PRG $0323 | CPU $C323 | 98 + sta Ram_0605,x ; PRG $0324 | CPU $C324 | 9D 05 06 + rts ; PRG $0327 | CPU $C327 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Controller State C328. +; Local behavior: Reads ReadControllerPorts; mutates JOY1. +; Parameters: ReadControllerPorts. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateControllerState_C328: + ldx #$01 ; PRG $0328 | CPU $C328 | A2 01 + stx JOY1 ; PRG $032A | CPU $C32A | 8E 16 40 + dex ; PRG $032D | CPU $C32D | CA + txa ; PRG $032E | CPU $C32E | 8A + sta JOY1 ; PRG $032F | CPU $C32F | 8D 16 40 + jsr ReadControllerPorts ; PRG $0332 | CPU $C332 | 20 36 C3 + inx ; PRG $0335 | CPU $C335 | E8 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C336. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ReadControllerPorts: + ldy #$08 ; PRG $0336 | CPU $C336 | A0 08 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C338. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ShiftControllerBits: + pha ; PRG $0338 | CPU $C338 | 48 + lda JOY1,x ; PRG $0339 | CPU $C339 | BD 16 40 + sta WorkPointerOrValueLo ; PRG $033C | CPU $C33C | 85 01 + lsr a ; PRG $033E | CPU $C33E | 4A + ora WorkPointerOrValueLo ; PRG $033F | CPU $C33F | 05 01 + lsr a ; PRG $0341 | CPU $C341 | 4A + pla ; PRG $0342 | CPU $C342 | 68 + rol a ; PRG $0343 | CPU $C343 | 2A + dey ; PRG $0344 | CPU $C344 | 88 + bne ShiftControllerBits ; PRG $0345 | CPU $C345 | D0 F1 + stx WorkPointerOrValueLo ; PRG $0347 | CPU $C347 | 86 01 + asl WorkPointerOrValueLo ; PRG $0349 | CPU $C349 | 06 01 + ldx WorkPointerOrValueLo ; PRG $034B | CPU $C34B | A6 01 + ldy ControllerButtons,x ; PRG $034D | CPU $C34D | B4 1A + sty WorkPointerOrValueLo ; PRG $034F | CPU $C34F | 84 01 + sta ControllerButtons,x ; PRG $0351 | CPU $C351 | 95 1A + sta ControllerPressedOrScriptInput,x ; PRG $0353 | CPU $C353 | 95 1B + and #$FF ; PRG $0355 | CPU $C355 | 29 FF + bpl Flow_C361 ; PRG $0357 | CPU $C357 | 10 08 + bit WorkPointerOrValueLo ; PRG $0359 | CPU $C359 | 24 01 + bpl Flow_C361 ; PRG $035B | CPU $C35B | 10 04 + and #$7F ; PRG $035D | CPU $C35D | 29 7F + sta ControllerPressedOrScriptInput,x ; PRG $035F | CPU $C35F | 95 1B +; ----------------------------------------------------------------------------- +; Global purpose: Flow C361. +; Local behavior: Reads WorkPointerOrValueHi, Flow_C36F, WorkPointerOrValueLo; mutates WorkPointerOrValueHi, ControllerPressedOrScriptInput. +; Parameters: WorkPointerOrValueHi, Flow_C36F, WorkPointerOrValueLo. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C361: + sta WorkPointerOrValueHi ; PRG $0361 | CPU $C361 | 85 02 + bit WorkPointerOrValueHi ; PRG $0363 | CPU $C363 | 24 02 + bvc Flow_C36F ; PRG $0365 | CPU $C365 | 50 08 + bit WorkPointerOrValueLo ; PRG $0367 | CPU $C367 | 24 01 + bvc Flow_C36F ; PRG $0369 | CPU $C369 | 50 04 + and #$BF ; PRG $036B | CPU $C36B | 29 BF + sta ControllerPressedOrScriptInput,x ; PRG $036D | CPU $C36D | 95 1B +; ----------------------------------------------------------------------------- +; Global purpose: Flow C36 F. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C36F: + rts ; PRG $036F | CPU $C36F | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ppu Transfer Queue. +; Local behavior: Reads CollisionResultFlag, Flow_C3AF, PPUSTATUS, Flow_C3A1; mutates WorkPointerOrValueLo, WorkPointerOrValueHi, PPUCTRL. +; Parameters: CollisionResultFlag, Flow_C3AF, PPUSTATUS, Flow_C3A1. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdatePpuTransferQueue: + lda CollisionResultFlag ; PRG $0370 | CPU $C370 | A5 31 + beq Flow_C3AF ; PRG $0372 | CPU $C372 | F0 3B + lda #$01 ; PRG $0374 | CPU $C374 | A9 01 + sta WorkPointerOrValueLo ; PRG $0376 | CPU $C376 | 85 01 + lda #$07 ; PRG $0378 | CPU $C378 | A9 07 + sta WorkPointerOrValueHi ; PRG $037A | CPU $C37A | 85 02 + lda #$90 ; PRG $037C | CPU $C37C | A9 90 + sta PPUCTRL ; PRG $037E | CPU $C37E | 8D 00 20 + ldx PPUSTATUS ; PRG $0381 | CPU $C381 | AE 02 20 + ldy #$00 ; PRG $0384 | CPU $C384 | A0 00 + beq Flow_C3A1 ; PRG $0386 | CPU $C386 | F0 19 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C388. +; Local behavior: Reads WorkPointerOrValueLo; mutates PPUADDR. +; Parameters: WorkPointerOrValueLo. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C388: + sta PPUADDR ; PRG $0388 | CPU $C388 | 8D 06 20 + iny ; PRG $038B | CPU $C38B | C8 + lda (WorkPointerOrValueLo),y ; PRG $038C | CPU $C38C | B1 01 + sta PPUADDR ; PRG $038E | CPU $C38E | 8D 06 20 + iny ; PRG $0391 | CPU $C391 | C8 + lda (WorkPointerOrValueLo),y ; PRG $0392 | CPU $C392 | B1 01 + and #$3F ; PRG $0394 | CPU $C394 | 29 3F + tax ; PRG $0396 | CPU $C396 | AA +; ----------------------------------------------------------------------------- +; Global purpose: Flow C397. +; Local behavior: Reads WorkPointerOrValueLo, Flow_C397; mutates PPUDATA. +; Parameters: WorkPointerOrValueLo, Flow_C397. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C397: + iny ; PRG $0397 | CPU $C397 | C8 + lda (WorkPointerOrValueLo),y ; PRG $0398 | CPU $C398 | B1 01 + sta PPUDATA ; PRG $039A | CPU $C39A | 8D 07 20 + dex ; PRG $039D | CPU $C39D | CA + bne Flow_C397 ; PRG $039E | CPU $C39E | D0 F7 + iny ; PRG $03A0 | CPU $C3A0 | C8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C3 A1. +; Local behavior: Reads WorkPointerOrValueLo, Flow_C388; mutates Ram_0700, Ram_0701, CollisionResultFlag. +; Parameters: WorkPointerOrValueLo, Flow_C388. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C3A1: + lda (WorkPointerOrValueLo),y ; PRG $03A1 | CPU $C3A1 | B1 01 + bne Flow_C388 ; PRG $03A3 | CPU $C3A3 | D0 E3 + lda #$00 ; PRG $03A5 | CPU $C3A5 | A9 00 + sta Ram_0700 ; PRG $03A7 | CPU $C3A7 | 8D 00 07 + sta Ram_0701 ; PRG $03AA | CPU $C3AA | 8D 01 07 + sta CollisionResultFlag ; PRG $03AD | CPU $C3AD | 85 31 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C3 AF. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C3AF: + rts ; PRG $03AF | CPU $C3AF | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Decrement Gameplay Timers. +; Local behavior: Reads GameplayTimerArray, Flow_C3BC; mutates GameplayTimerArray. +; Parameters: GameplayTimerArray, Flow_C3BC. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +DecrementGameplayTimers: + ldx #$03 ; PRG $03B0 | CPU $C3B0 | A2 03 + dec GameplayTimerArray ; PRG $03B2 | CPU $C3B2 | C6 20 + bpl Flow_C3BC ; PRG $03B4 | CPU $C3B4 | 10 06 + lda #$0A ; PRG $03B6 | CPU $C3B6 | A9 0A + sta GameplayTimerArray ; PRG $03B8 | CPU $C3B8 | 85 20 + ldx #$05 ; PRG $03BA | CPU $C3BA | A2 05 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C3 BC. +; Local behavior: Reads GameplayTimer, Flow_C3C2; mutates GameplayTimer. +; Parameters: GameplayTimer, Flow_C3C2. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C3BC: + lda GameplayTimer,x ; PRG $03BC | CPU $C3BC | B5 21 + beq Flow_C3C2 ; PRG $03BE | CPU $C3BE | F0 02 + dec GameplayTimer,x ; PRG $03C0 | CPU $C3C0 | D6 21 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C3 C2. +; Local behavior: Reads Flow_C3BC; mutates no direct memory mutation observed. +; Parameters: Flow_C3BC. +; Returns: returns to caller; flags/register result depends on final instructions: dex; bpl Flow_C3BC; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C3C2: + dex ; PRG $03C2 | CPU $C3C2 | CA + bpl Flow_C3BC ; PRG $03C3 | CPU $C3C3 | 10 F7 + rts ; PRG $03C5 | CPU $C3C5 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C3C6. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +DispatchScreenStateHandler: + asl a ; PRG $03C6 | CPU $C3C6 | 0A + tay ; PRG $03C7 | CPU $C3C7 | A8 + iny ; PRG $03C8 | CPU $C3C8 | C8 + pla ; PRG $03C9 | CPU $C3C9 | 68 + sta MetaspriteLayoutPointerLo ; PRG $03CA | CPU $C3CA | 85 14 + pla ; PRG $03CC | CPU $C3CC | 68 + sta MetaspriteLayoutPointerHi ; PRG $03CD | CPU $C3CD | 85 15 + lda (MetaspriteLayoutPointerLo),y ; PRG $03CF | CPU $C3CF | B1 14 + tax ; PRG $03D1 | CPU $C3D1 | AA + iny ; PRG $03D2 | CPU $C3D2 | C8 + lda (MetaspriteLayoutPointerLo),y ; PRG $03D3 | CPU $C3D3 | B1 14 + sta MetaspriteLayoutPointerHi ; PRG $03D5 | CPU $C3D5 | 85 15 + stx MetaspriteLayoutPointerLo ; PRG $03D7 | CPU $C3D7 | 86 14 + jmp (MetaspriteLayoutPointerLo) ; PRG $03D9 | CPU $C3D9 | 6C 14 00 +; ----------------------------------------------------------------------------- +; Global purpose: Begin Ppu Command Stream. +; Local behavior: Reads FinishPpuCommandStreamAndRestoreScroll; mutates WorkPointerOrValueLo, WorkPointerOrValueHi. +; Parameters: FinishPpuCommandStreamAndRestoreScroll. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +BeginPpuCommandStream: + stx WorkPointerOrValueLo ; PRG $03DC | CPU $C3DC | 86 01 + sty WorkPointerOrValueHi ; PRG $03DE | CPU $C3DE | 84 02 + jmp FinishPpuCommandStreamAndRestoreScroll ; PRG $03E0 | CPU $C3E0 | 4C 1B C4 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C3 E3. +; Local behavior: Reads WorkPointerOrValueLo, Flow_C3F7; mutates PPUADDR. +; Parameters: WorkPointerOrValueLo, Flow_C3F7. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C3E3: + sta PPUADDR ; PRG $03E3 | CPU $C3E3 | 8D 06 20 + iny ; PRG $03E6 | CPU $C3E6 | C8 + lda (WorkPointerOrValueLo),y ; PRG $03E7 | CPU $C3E7 | B1 01 + sta PPUADDR ; PRG $03E9 | CPU $C3E9 | 8D 06 20 + iny ; PRG $03EC | CPU $C3EC | C8 + lda (WorkPointerOrValueLo),y ; PRG $03ED | CPU $C3ED | B1 01 + asl a ; PRG $03EF | CPU $C3EF | 0A + pha ; PRG $03F0 | CPU $C3F0 | 48 + lda #$94 ; PRG $03F1 | CPU $C3F1 | A9 94 + bcs Flow_C3F7 ; PRG $03F3 | CPU $C3F3 | B0 02 + and #$FB ; PRG $03F5 | CPU $C3F5 | 29 FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow C3 F7. +; Local behavior: Reads Flow_C401; mutates PPUCTRL. +; Parameters: Flow_C401. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C3F7: + sta PPUCTRL ; PRG $03F7 | CPU $C3F7 | 8D 00 20 + pla ; PRG $03FA | CPU $C3FA | 68 + asl a ; PRG $03FB | CPU $C3FB | 0A + bcc Flow_C401 ; PRG $03FC | CPU $C3FC | 90 03 + ora #$02 ; PRG $03FE | CPU $C3FE | 09 02 + iny ; PRG $0400 | CPU $C400 | C8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C401. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C401: + lsr a ; PRG $0401 | CPU $C401 | 4A + lsr a ; PRG $0402 | CPU $C402 | 4A + tax ; PRG $0403 | CPU $C403 | AA +; ----------------------------------------------------------------------------- +; Global purpose: Flow C404. +; Local behavior: Reads Flow_C407; mutates no direct memory mutation observed. +; Parameters: Flow_C407. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C404: + bcs Flow_C407 ; PRG $0404 | CPU $C404 | B0 01 + iny ; PRG $0406 | CPU $C406 | C8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C407. +; Local behavior: Reads WorkPointerOrValueLo, Flow_C404, WorkPointerOrValueHi; mutates PPUDATA, WorkPointerOrValueLo, WorkPointerOrValueHi. +; Parameters: WorkPointerOrValueLo, Flow_C404, WorkPointerOrValueHi. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C407: + lda (WorkPointerOrValueLo),y ; PRG $0407 | CPU $C407 | B1 01 + sta PPUDATA ; PRG $0409 | CPU $C409 | 8D 07 20 + dex ; PRG $040C | CPU $C40C | CA + bne Flow_C404 ; PRG $040D | CPU $C40D | D0 F5 + sec ; PRG $040F | CPU $C40F | 38 + tya ; PRG $0410 | CPU $C410 | 98 + adc WorkPointerOrValueLo ; PRG $0411 | CPU $C411 | 65 01 + sta WorkPointerOrValueLo ; PRG $0413 | CPU $C413 | 85 01 + lda #$00 ; PRG $0415 | CPU $C415 | A9 00 + adc WorkPointerOrValueHi ; PRG $0417 | CPU $C417 | 65 02 + sta WorkPointerOrValueHi ; PRG $0419 | CPU $C419 | 85 02 +; ----------------------------------------------------------------------------- +; Global purpose: Finish Ppu Command Stream And Restore Scroll. +; Local behavior: Reads PPUSTATUS, WorkPointerOrValueLo, Flow_C3E3; mutates no direct memory mutation observed. +; Parameters: PPUSTATUS, WorkPointerOrValueLo, Flow_C3E3. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +FinishPpuCommandStreamAndRestoreScroll: + ldx PPUSTATUS ; PRG $041B | CPU $C41B | AE 02 20 + ldy #$00 ; PRG $041E | CPU $C41E | A0 00 + lda (WorkPointerOrValueLo),y ; PRG $0420 | CPU $C420 | B1 01 + bne Flow_C3E3 ; PRG $0422 | CPU $C422 | D0 BF +; ----------------------------------------------------------------------------- +; Global purpose: Reset Ppu Scroll. +; Local behavior: Reads implicit CPU state or none observed; mutates PPUSCROLL. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: sta PPUSCROLL; pla; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ResetPpuScroll: + pha ; PRG $0424 | CPU $C424 | 48 + lda #$00 ; PRG $0425 | CPU $C425 | A9 00 + sta PPUSCROLL ; PRG $0427 | CPU $C427 | 8D 05 20 + sta PPUSCROLL ; PRG $042A | CPU $C42A | 8D 05 20 + pla ; PRG $042D | CPU $C42D | 68 + rts ; PRG $042E | CPU $C42E | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Advance Pseudo Random State. +; Local behavior: Reads Ram_06F0, Ram_06F1, Flow_C447; mutates Ram_06F0, Ram_06F1. +; Parameters: Ram_06F0, Ram_06F1, Flow_C447. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +AdvancePseudoRandomState: + lda Ram_06F0 ; PRG $042F | CPU $C42F | AD F0 06 + clc ; PRG $0432 | CPU $C432 | 18 + adc #$0F ; PRG $0433 | CPU $C433 | 69 0F + sta Ram_06F0 ; PRG $0435 | CPU $C435 | 8D F0 06 + lda Ram_06F1 ; PRG $0438 | CPU $C438 | AD F1 06 + adc #$11 ; PRG $043B | CPU $C43B | 69 11 + sta Ram_06F1 ; PRG $043D | CPU $C43D | 8D F1 06 + eor Ram_06F0 ; PRG $0440 | CPU $C440 | 4D F0 06 + clc ; PRG $0443 | CPU $C443 | 18 + bpl Flow_C447 ; PRG $0444 | CPU $C444 | 10 01 + sec ; PRG $0446 | CPU $C446 | 38 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C447. +; Local behavior: Reads Ram_06F2, Ram_06F3, Ram_06F0; mutates Ram_06F2, Ram_06F3. +; Parameters: Ram_06F2, Ram_06F3, Ram_06F0. +; Returns: returns to caller; flags/register result depends on final instructions: ror Ram_06F3; lda Ram_06F0; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C447: + ror Ram_06F2 ; PRG $0447 | CPU $C447 | 6E F2 06 + ror Ram_06F3 ; PRG $044A | CPU $C44A | 6E F3 06 + lda Ram_06F0 ; PRG $044D | CPU $C44D | AD F0 06 + rts ; PRG $0450 | CPU $C450 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Expand Packed Score Or Hud Data. +; Local behavior: Reads SourceRecordPointerLo, Ram_0700; mutates CollisionResultFlag, RecordFieldCount, LoopCounter05. +; Parameters: SourceRecordPointerLo, Ram_0700. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ExpandPackedScoreOrHudData: + lda #$01 ; PRG $0451 | CPU $C451 | A9 01 + sta CollisionResultFlag ; PRG $0453 | CPU $C453 | 85 31 + ldy #$00 ; PRG $0455 | CPU $C455 | A0 00 + lda (SourceRecordPointerLo),y ; PRG $0457 | CPU $C457 | B1 03 + and #$0F ; PRG $0459 | CPU $C459 | 29 0F + sta RecordFieldCount ; PRG $045B | CPU $C45B | 85 06 + lda (SourceRecordPointerLo),y ; PRG $045D | CPU $C45D | B1 03 + lsr a ; PRG $045F | CPU $C45F | 4A + lsr a ; PRG $0460 | CPU $C460 | 4A + lsr a ; PRG $0461 | CPU $C461 | 4A + lsr a ; PRG $0462 | CPU $C462 | 4A + sta LoopCounter05 ; PRG $0463 | CPU $C463 | 85 05 + ldx Ram_0700 ; PRG $0465 | CPU $C465 | AE 00 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C468. +; Local behavior: Reads WorkPointerOrValueHi, AppendHudTileByte, WorkPointerOrValueLo, RecordFieldCount; mutates RecordRepeatCount. +; Parameters: WorkPointerOrValueHi, AppendHudTileByte, WorkPointerOrValueLo, RecordFieldCount. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C468: + lda WorkPointerOrValueHi ; PRG $0468 | CPU $C468 | A5 02 + jsr AppendHudTileByte ; PRG $046A | CPU $C46A | 20 D5 C4 + lda WorkPointerOrValueLo ; PRG $046D | CPU $C46D | A5 01 + jsr AppendHudTileByte ; PRG $046F | CPU $C46F | 20 D5 C4 + lda RecordFieldCount ; PRG $0472 | CPU $C472 | A5 06 + sta RecordRepeatCount ; PRG $0474 | CPU $C474 | 85 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C476. +; Local behavior: Reads AppendHudTileByte, SourceRecordPointerLo, RecordRepeatCount, Flow_C476, WorkPointerOrValueLo, WorkPointerOrValueHi, LoopCounter05, Flow_C468; mutates RecordRepeatCount, Ram_0700, WorkPointerOrValueLo, WorkPointerOrValueHi, LoopCounter05. +; Parameters: AppendHudTileByte, SourceRecordPointerLo, RecordRepeatCount, Flow_C476, WorkPointerOrValueLo, WorkPointerOrValueHi, LoopCounter05, Flow_C468. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C476: + jsr AppendHudTileByte ; PRG $0476 | CPU $C476 | 20 D5 C4 + iny ; PRG $0479 | CPU $C479 | C8 + lda (SourceRecordPointerLo),y ; PRG $047A | CPU $C47A | B1 03 + dec RecordRepeatCount ; PRG $047C | CPU $C47C | C6 07 + bne Flow_C476 ; PRG $047E | CPU $C47E | D0 F6 + jsr AppendHudTileByte ; PRG $0480 | CPU $C480 | 20 D5 C4 + stx Ram_0700 ; PRG $0483 | CPU $C483 | 8E 00 07 + clc ; PRG $0486 | CPU $C486 | 18 + lda #$20 ; PRG $0487 | CPU $C487 | A9 20 + adc WorkPointerOrValueLo ; PRG $0489 | CPU $C489 | 65 01 + sta WorkPointerOrValueLo ; PRG $048B | CPU $C48B | 85 01 + lda #$00 ; PRG $048D | CPU $C48D | A9 00 + adc WorkPointerOrValueHi ; PRG $048F | CPU $C48F | 65 02 + sta WorkPointerOrValueHi ; PRG $0491 | CPU $C491 | 85 02 + dec LoopCounter05 ; PRG $0493 | CPU $C493 | C6 05 + bne Flow_C468 ; PRG $0495 | CPU $C495 | D0 D1 + beq Flow_C4C0 ; PRG $0497 | CPU $C497 | F0 27 +; ----------------------------------------------------------------------------- +; Global purpose: Select Digit Glyph Table. +; Local behavior: Reads HudDigitGlyphPointerTableLo, HudDigitGlyphPointerTableHi, MetaspriteLayoutPointerLo, Ram_0700; mutates MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi, CurrentSpriteTileId, CollisionResultFlag. +; Parameters: HudDigitGlyphPointerTableLo, HudDigitGlyphPointerTableHi, MetaspriteLayoutPointerLo, Ram_0700. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +SelectDigitGlyphTable: + asl a ; PRG $0499 | CPU $C499 | 0A + tay ; PRG $049A | CPU $C49A | A8 + lda HudDigitGlyphPointerTableLo,y ; PRG $049B | CPU $C49B | B9 7C EF + sta MetaspriteLayoutPointerLo ; PRG $049E | CPU $C49E | 85 14 + lda HudDigitGlyphPointerTableHi,y ; PRG $04A0 | CPU $C4A0 | B9 7D EF + sta MetaspriteLayoutPointerHi ; PRG $04A3 | CPU $C4A3 | 85 15 + ldy #$00 ; PRG $04A5 | CPU $C4A5 | A0 00 + lda (MetaspriteLayoutPointerLo),y ; PRG $04A7 | CPU $C4A7 | B1 14 + sta CurrentSpriteTileId ; PRG $04A9 | CPU $C4A9 | 85 11 + iny ; PRG $04AB | CPU $C4AB | C8 + lda #$01 ; PRG $04AC | CPU $C4AC | A9 01 + sta CollisionResultFlag ; PRG $04AE | CPU $C4AE | 85 31 + ldx Ram_0700 ; PRG $04B0 | CPU $C4B0 | AE 00 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C4 B3. +; Local behavior: Reads MetaspriteLayoutPointerLo, AppendHudTileByte, CurrentSpriteTileId, Flow_C4B3; mutates CurrentSpriteTileId. +; Parameters: MetaspriteLayoutPointerLo, AppendHudTileByte, CurrentSpriteTileId, Flow_C4B3. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C4B3: + lda (MetaspriteLayoutPointerLo),y ; PRG $04B3 | CPU $C4B3 | B1 14 + jsr AppendHudTileByte ; PRG $04B5 | CPU $C4B5 | 20 D5 C4 + iny ; PRG $04B8 | CPU $C4B8 | C8 + dec CurrentSpriteTileId ; PRG $04B9 | CPU $C4B9 | C6 11 + bne Flow_C4B3 ; PRG $04BB | CPU $C4BB | D0 F6 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation C4 BD. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_0700. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_C4BD: + stx Ram_0700 ; PRG $04BD | CPU $C4BD | 8E 00 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C4 C0. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_0701. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C4C0: + lda #$00 ; PRG $04C0 | CPU $C4C0 | A9 00 + sta Ram_0701,x ; PRG $04C2 | CPU $C4C2 | 9D 01 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C4 C5. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C4C5: + rts ; PRG $04C5 | CPU $C4C5 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Transform Packed Value C4 C6. +; Local behavior: Reads AppendHudTileByte, PackedHudOrObjectValue; mutates PackedHudOrObjectValue. +; Parameters: AppendHudTileByte, PackedHudOrObjectValue. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +TransformPackedValue_C4C6: + sta PackedHudOrObjectValue ; PRG $04C6 | CPU $C4C6 | 85 16 + and #$F0 ; PRG $04C8 | CPU $C4C8 | 29 F0 + lsr a ; PRG $04CA | CPU $C4CA | 4A + lsr a ; PRG $04CB | CPU $C4CB | 4A + lsr a ; PRG $04CC | CPU $C4CC | 4A + lsr a ; PRG $04CD | CPU $C4CD | 4A + jsr AppendHudTileByte ; PRG $04CE | CPU $C4CE | 20 D5 C4 + lda PackedHudOrObjectValue ; PRG $04D1 | CPU $C4D1 | A5 16 + and #$0F ; PRG $04D3 | CPU $C4D3 | 29 0F +; ----------------------------------------------------------------------------- +; Global purpose: Append Hud Tile Byte. +; Local behavior: Reads Flow_C4E8, Ram_0700; mutates Ram_0701. +; Parameters: Flow_C4E8, Ram_0700. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +AppendHudTileByte: + sta Ram_0701,x ; PRG $04D5 | CPU $C4D5 | 9D 01 07 + inx ; PRG $04D8 | CPU $C4D8 | E8 + txa ; PRG $04D9 | CPU $C4D9 | 8A + cmp #$4F ; PRG $04DA | CPU $C4DA | C9 4F + bcc Flow_C4E8 ; PRG $04DC | CPU $C4DC | 90 0A + ldx Ram_0700 ; PRG $04DE | CPU $C4DE | AE 00 07 + lda #$00 ; PRG $04E1 | CPU $C4E1 | A9 00 + sta Ram_0701,x ; PRG $04E3 | CPU $C4E3 | 9D 01 07 + pla ; PRG $04E6 | CPU $C4E6 | 68 + pla ; PRG $04E7 | CPU $C4E7 | 68 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C4 E8. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C4E8: + rts ; PRG $04E8 | CPU $C4E8 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Evaluate Collision State C4 E9. +; Local behavior: Reads WorkPointerOrValueLo, UpdateActorCoordinates_C4F9; mutates CollisionResultFlag. +; Parameters: WorkPointerOrValueLo, UpdateActorCoordinates_C4F9. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EvaluateCollisionState_C4E9: + lda #$01 ; PRG $04E9 | CPU $C4E9 | A9 01 + sta CollisionResultFlag ; PRG $04EB | CPU $C4EB | 85 31 + ldx WorkPointerOrValueLo ; PRG $04ED | CPU $C4ED | A6 01 + jsr UpdateActorCoordinates_C4F9 ; PRG $04EF | CPU $C4EF | 20 F9 C4 + lda WorkPointerOrValueLo ; PRG $04F2 | CPU $C4F2 | A5 01 + lsr a ; PRG $04F4 | CPU $C4F4 | 4A + lsr a ; PRG $04F5 | CPU $C4F5 | 4A + lsr a ; PRG $04F6 | CPU $C4F6 | 4A + lsr a ; PRG $04F7 | CPU $C4F7 | 4A + tax ; PRG $04F8 | CPU $C4F8 | AA +; ----------------------------------------------------------------------------- +; Global purpose: Update Actor Coordinates C4 F9. +; Local behavior: Reads Flow_C4C5, SelectDigitGlyphTable, SourceRecordPointerLo, PlayerOrActorX, TransformPackedValue_C4C6, PlayerOrActorY; mutates SourceRecordPointerLo. +; Parameters: Flow_C4C5, SelectDigitGlyphTable, SourceRecordPointerLo, PlayerOrActorX, TransformPackedValue_C4C6, PlayerOrActorY. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateActorCoordinates_C4F9: + inx ; PRG $04F9 | CPU $C4F9 | E8 + txa ; PRG $04FA | CPU $C4FA | 8A + and #$0F ; PRG $04FB | CPU $C4FB | 29 0F + cmp #$09 ; PRG $04FD | CPU $C4FD | C9 09 + bcs Flow_C4C5 ; PRG $04FF | CPU $C4FF | B0 C4 + sta SourceRecordPointerLo ; PRG $0501 | CPU $C501 | 85 03 + jsr SelectDigitGlyphTable ; PRG $0503 | CPU $C503 | 20 99 C4 + lda SourceRecordPointerLo ; PRG $0506 | CPU $C506 | A5 03 + asl a ; PRG $0508 | CPU $C508 | 0A + asl a ; PRG $0509 | CPU $C509 | 0A + tay ; PRG $050A | CPU $C50A | A8 + lda PlayerOrActorX,y ; PRG $050B | CPU $C50B | B9 81 00 + jsr TransformPackedValue_C4C6 ; PRG $050E | CPU $C50E | 20 C6 C4 + lda PlayerOrActorY,y ; PRG $0511 | CPU $C511 | B9 82 00 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation C514. +; Local behavior: Reads TransformPackedValue_C4C6, AppendHudTileByte; mutates no direct memory mutation observed. +; Parameters: TransformPackedValue_C4C6, AppendHudTileByte. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_C514: + jsr TransformPackedValue_C4C6 ; PRG $0514 | CPU $C514 | 20 C6 C4 + lda #$00 ; PRG $0517 | CPU $C517 | A9 00 + jsr AppendHudTileByte ; PRG $0519 | CPU $C519 | 20 D5 C4 + lda #$00 ; PRG $051C | CPU $C51C | A9 00 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation C51 E. +; Local behavior: Reads AppendHudTileByte, Continuation_C4BD; mutates no direct memory mutation observed. +; Parameters: AppendHudTileByte, Continuation_C4BD. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_C51E: + jsr AppendHudTileByte ; PRG $051E | CPU $C51E | 20 D5 C4 + jmp Continuation_C4BD ; PRG $0521 | CPU $C521 | 4C BD C4 +; ----------------------------------------------------------------------------- +; Global purpose: Transform Packed Value C524. +; Local behavior: Reads SelectDigitGlyphTable, SelectedActorIndex, ActorAnimationFrame, Continuation_C51E; mutates no direct memory mutation observed. +; Parameters: SelectDigitGlyphTable, SelectedActorIndex, ActorAnimationFrame, Continuation_C51E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +TransformPackedValue_C524: + lda #$03 ; PRG $0524 | CPU $C524 | A9 03 + jsr SelectDigitGlyphTable ; PRG $0526 | CPU $C526 | 20 99 C4 + lda SelectedActorIndex ; PRG $0529 | CPU $C529 | A5 43 + asl a ; PRG $052B | CPU $C52B | 0A + asl a ; PRG $052C | CPU $C52C | 0A + tay ; PRG $052D | CPU $C52D | A8 + lda ActorAnimationFrame,y ; PRG $052E | CPU $C52E | B9 92 00 + jmp Continuation_C51E ; PRG $0531 | CPU $C531 | 4C 1E C5 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch C534. +; Local behavior: Reads SelectDigitGlyphTable, ActiveActorState, TransformPackedValue_C4C6, Continuation_C4BD; mutates no direct memory mutation observed. +; Parameters: SelectDigitGlyphTable, ActiveActorState, TransformPackedValue_C4C6, Continuation_C4BD. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_C534: + lda #$05 ; PRG $0534 | CPU $C534 | A9 05 + jsr SelectDigitGlyphTable ; PRG $0536 | CPU $C536 | 20 99 C4 + lda ActiveActorState ; PRG $0539 | CPU $C539 | A5 61 + jsr TransformPackedValue_C4C6 ; PRG $053B | CPU $C53B | 20 C6 C4 + jmp Continuation_C4BD ; PRG $053E | CPU $C53E | 4C BD C4 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation C541. +; Local behavior: Reads SelectDigitGlyphTable, ScreenEffectState, Continuation_C514; mutates no direct memory mutation observed. +; Parameters: SelectDigitGlyphTable, ScreenEffectState, Continuation_C514. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_C541: + lda #$04 ; PRG $0541 | CPU $C541 | A9 04 + jsr SelectDigitGlyphTable ; PRG $0543 | CPU $C543 | 20 99 C4 + lda ScreenEffectState ; PRG $0546 | CPU $C546 | A5 4E + jmp Continuation_C514 ; PRG $0548 | CPU $C548 | 4C 14 C5 +; ----------------------------------------------------------------------------- +; Global purpose: Update Actor Coordinates C54 B. +; Local behavior: Reads GameMode, Flow_C56D, SelectedActorIndex, ActorY, AddPackedMovementDelta, ActorX; mutates PackedCoordinateOrValue, ActorY, ActorX, PendingObstacleInteraction. +; Parameters: GameMode, Flow_C56D, SelectedActorIndex, ActorY, AddPackedMovementDelta, ActorX. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateActorCoordinates_C54B: + ldx GameMode ; PRG $054B | CPU $C54B | A6 3A + bne Flow_C56D ; PRG $054D | CPU $C54D | D0 1E + sta PackedCoordinateOrValue ; PRG $054F | CPU $C54F | 85 04 + lda SelectedActorIndex ; PRG $0551 | CPU $C551 | A5 43 + asl a ; PRG $0553 | CPU $C553 | 0A + asl a ; PRG $0554 | CPU $C554 | 0A + tax ; PRG $0555 | CPU $C555 | AA + clc ; PRG $0556 | CPU $C556 | 18 + lda ActorY,x ; PRG $0557 | CPU $C557 | B5 86 + jsr AddPackedMovementDelta ; PRG $0559 | CPU $C559 | 20 6E C5 + sta ActorY,x ; PRG $055C | CPU $C55C | 95 86 + lda ActorX,x ; PRG $055E | CPU $C55E | B5 85 + sta PackedCoordinateOrValue ; PRG $0560 | CPU $C560 | 85 04 + lda #$00 ; PRG $0562 | CPU $C562 | A9 00 + jsr AddPackedMovementDelta ; PRG $0564 | CPU $C564 | 20 6E C5 + sta ActorX,x ; PRG $0567 | CPU $C567 | 95 85 + lda #$01 ; PRG $0569 | CPU $C569 | A9 01 + sta PendingObstacleInteraction ; PRG $056B | CPU $C56B | 85 46 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C56 D. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C56D: + rts ; PRG $056D | CPU $C56D | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C56E. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +AddPackedMovementDelta: + jsr DecodePackedMovementDelta ; PRG $056E | CPU $C56E | 20 B1 C5 + adc WorkPointerOrValueHi ; PRG $0571 | CPU $C571 | 65 02 + cmp #$0A ; PRG $0573 | CPU $C573 | C9 0A + bcc Flow_C579 ; PRG $0575 | CPU $C575 | 90 02 + adc #$05 ; PRG $0577 | CPU $C577 | 69 05 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C579. +; Local behavior: Reads SourceRecordPointerLo, PackedCoordinateOrValue, Flow_C58A; mutates SourceRecordPointerLo. +; Parameters: SourceRecordPointerLo, PackedCoordinateOrValue, Flow_C58A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C579: + clc ; PRG $0579 | CPU $C579 | 18 + adc SourceRecordPointerLo ; PRG $057A | CPU $C57A | 65 03 + sta SourceRecordPointerLo ; PRG $057C | CPU $C57C | 85 03 + lda PackedCoordinateOrValue ; PRG $057E | CPU $C57E | A5 04 + and #$F0 ; PRG $0580 | CPU $C580 | 29 F0 + adc SourceRecordPointerLo ; PRG $0582 | CPU $C582 | 65 03 + bcc Flow_C58A ; PRG $0584 | CPU $C584 | 90 04 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C586. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: adc #$5F; sec; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C586: + adc #$5F ; PRG $0586 | CPU $C586 | 69 5F + sec ; PRG $0588 | CPU $C588 | 38 + rts ; PRG $0589 | CPU $C589 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C58 A. +; Local behavior: Reads Flow_C586; mutates no direct memory mutation observed. +; Parameters: Flow_C586. +; Returns: returns to caller; flags/register result depends on final instructions: cmp #$A0; bcs Flow_C586; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C58A: + cmp #$A0 ; PRG $058A | CPU $C58A | C9 A0 + bcs Flow_C586 ; PRG $058C | CPU $C58C | B0 F8 + rts ; PRG $058E | CPU $C58E | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Calculate And Clamp Value C58 F. +; Local behavior: Reads DecodePackedMovementDelta, WorkPointerOrValueHi, Flow_C5A2, SourceRecordPointerLo; mutates WorkPointerOrValueHi, SourceRecordPointerLo. +; Parameters: DecodePackedMovementDelta, WorkPointerOrValueHi, Flow_C5A2, SourceRecordPointerLo. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +CalculateAndClampValue_C58F: + jsr DecodePackedMovementDelta ; PRG $058F | CPU $C58F | 20 B1 C5 + sbc WorkPointerOrValueHi ; PRG $0592 | CPU $C592 | E5 02 + sta WorkPointerOrValueHi ; PRG $0594 | CPU $C594 | 85 02 + bcs Flow_C5A2 ; PRG $0596 | CPU $C596 | B0 0A + adc #$0A ; PRG $0598 | CPU $C598 | 69 0A + sta WorkPointerOrValueHi ; PRG $059A | CPU $C59A | 85 02 + lda SourceRecordPointerLo ; PRG $059C | CPU $C59C | A5 03 + adc #$0F ; PRG $059E | CPU $C59E | 69 0F + sta SourceRecordPointerLo ; PRG $05A0 | CPU $C5A0 | 85 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C5 A2. +; Local behavior: Reads PackedCoordinateOrValue, SourceRecordPointerLo, Flow_C5AE; mutates no direct memory mutation observed. +; Parameters: PackedCoordinateOrValue, SourceRecordPointerLo, Flow_C5AE. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C5A2: + lda PackedCoordinateOrValue ; PRG $05A2 | CPU $C5A2 | A5 04 + and #$F0 ; PRG $05A4 | CPU $C5A4 | 29 F0 + sec ; PRG $05A6 | CPU $C5A6 | 38 + sbc SourceRecordPointerLo ; PRG $05A7 | CPU $C5A7 | E5 03 + bcs Flow_C5AE ; PRG $05A9 | CPU $C5A9 | B0 03 + adc #$A0 ; PRG $05AB | CPU $C5AB | 69 A0 + clc ; PRG $05AD | CPU $C5AD | 18 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C5 AE. +; Local behavior: Reads WorkPointerOrValueHi; mutates no direct memory mutation observed. +; Parameters: WorkPointerOrValueHi. +; Returns: returns to caller; flags/register result depends on final instructions: ora WorkPointerOrValueHi; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C5AE: + ora WorkPointerOrValueHi ; PRG $05AE | CPU $C5AE | 05 02 + rts ; PRG $05B0 | CPU $C5B0 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C5B1. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +DecodePackedMovementDelta: + pha ; PRG $05B1 | CPU $C5B1 | 48 + and #$0F ; PRG $05B2 | CPU $C5B2 | 29 0F + sta WorkPointerOrValueHi ; PRG $05B4 | CPU $C5B4 | 85 02 + pla ; PRG $05B6 | CPU $C5B6 | 68 + and #$F0 ; PRG $05B7 | CPU $C5B7 | 29 F0 + sta SourceRecordPointerLo ; PRG $05B9 | CPU $C5B9 | 85 03 + lda PackedCoordinateOrValue ; PRG $05BB | CPU $C5BB | A5 04 + and #$0F ; PRG $05BD | CPU $C5BD | 29 0F +; ----------------------------------------------------------------------------- +; Global purpose: Flow C5 BF. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C5BF: + rts ; PRG $05BF | CPU $C5BF | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C5C0. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateActorObstacleInteraction: + lda GameMode ; PRG $05C0 | CPU $C5C0 | A5 3A + bne Flow_C5BF ; PRG $05C2 | CPU $C5C2 | D0 FB + lda Ram_0700 ; PRG $05C4 | CPU $C5C4 | AD 00 07 + cmp #$20 ; PRG $05C7 | CPU $C5C7 | C9 20 + bcs Flow_C5BF ; PRG $05C9 | CPU $C5C9 | B0 F4 + lda PendingObstacleInteraction ; PRG $05CB | CPU $C5CB | A5 46 + beq Flow_C5BF ; PRG $05CD | CPU $C5CD | F0 F0 + lda #$00 ; PRG $05CF | CPU $C5CF | A9 00 + sta PendingObstacleInteraction ; PRG $05D1 | CPU $C5D1 | 85 46 + jsr SelectNearestActorOrObstacle ; PRG $05D3 | CPU $C5D3 | 20 01 C6 + lda SelectedActorIndex ; PRG $05D6 | CPU $C5D6 | A5 43 + ora #$F0 ; PRG $05D8 | CPU $C5D8 | 09 F0 + sta WorkPointerOrValueLo ; PRG $05DA | CPU $C5DA | 85 01 + jsr EvaluateCollisionState_C4E9 ; PRG $05DC | CPU $C5DC | 20 E9 C4 + lda SelectedActorIndex ; PRG $05DF | CPU $C5DF | A5 43 + asl a ; PRG $05E1 | CPU $C5E1 | 0A + asl a ; PRG $05E2 | CPU $C5E2 | 0A + tax ; PRG $05E3 | CPU $C5E3 | AA + ldy ActorAnimationTimer,x ; PRG $05E4 | CPU $C5E4 | B4 90 + dey ; PRG $05E6 | CPU $C5E6 | 88 + tya ; PRG $05E7 | CPU $C5E7 | 98 + sta ActorAnimationFrame,x ; PRG $05E8 | CPU $C5E8 | 95 92 + lda ActorInteractionState,x ; PRG $05EA | CPU $C5EA | B5 91 + bne Flow_C5FE ; PRG $05EC | CPU $C5EC | D0 10 + lda ActorX,x ; PRG $05EE | CPU $C5EE | B5 85 + cmp #$05 ; PRG $05F0 | CPU $C5F0 | C9 05 + bne Flow_C5FE ; PRG $05F2 | CPU $C5F2 | D0 0A + sta ActorInteractionState,x ; PRG $05F4 | CPU $C5F4 | 95 91 + inc ActorAnimationTimer,x ; PRG $05F6 | CPU $C5F6 | F6 90 + inc ActorAnimationFrame,x ; PRG $05F8 | CPU $C5F8 | F6 92 + lda #$02 ; PRG $05FA | CPU $C5FA | A9 02 + sta AudioRequestFlags ; PRG $05FC | CPU $C5FC | 85 FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow C5 FE. +; Local behavior: Reads TransformPackedValue_C524; mutates no direct memory mutation observed. +; Parameters: TransformPackedValue_C524. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C5FE: + jmp TransformPackedValue_C524 ; PRG $05FE | CPU $C5FE | 4C 24 C5 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C601. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +SelectNearestActorOrObstacle: + lda SelectedActorIndex ; PRG $0601 | CPU $C601 | A5 43 + asl a ; PRG $0603 | CPU $C603 | 0A + asl a ; PRG $0604 | CPU $C604 | 0A + tax ; PRG $0605 | CPU $C605 | AA + sec ; PRG $0606 | CPU $C606 | 38 + lda PlayerOrActorY ; PRG $0607 | CPU $C607 | A5 82 + sta PackedCoordinateOrValue ; PRG $0609 | CPU $C609 | 85 04 + lda ActorY,x ; PRG $060B | CPU $C60B | B5 86 + jsr CalculateAndClampValue_C58F ; PRG $060D | CPU $C60D | 20 8F C5 + lda PlayerOrActorX ; PRG $0610 | CPU $C610 | A5 81 + sta PackedCoordinateOrValue ; PRG $0612 | CPU $C612 | 85 04 + lda ActorX,x ; PRG $0614 | CPU $C614 | B5 85 + jsr CalculateAndClampValue_C58F ; PRG $0616 | CPU $C616 | 20 8F C5 + bcs CopySelectedActorCoordinates ; PRG $0619 | CPU $C619 | B0 08 + lda ActorX,x ; PRG $061B | CPU $C61B | B5 85 + sta PlayerOrActorX ; PRG $061D | CPU $C61D | 85 81 + lda ActorY,x ; PRG $061F | CPU $C61F | B5 86 + sta PlayerOrActorY ; PRG $0621 | CPU $C621 | 85 82 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C623. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +CopySelectedActorCoordinates: + rts ; PRG $0623 | CPU $C623 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Evaluate Collision State C624. +; Local behavior: Reads ScreenCollisionState, CopySelectedActorCoordinates, SelectedScreenVariant, ScreenEffectTimer; mutates ScreenEffectTimer. +; Parameters: ScreenCollisionState, CopySelectedActorCoordinates, SelectedScreenVariant, ScreenEffectTimer. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EvaluateCollisionState_C624: + ldy ScreenCollisionState ; PRG $0624 | CPU $C624 | A4 44 + dey ; PRG $0626 | CPU $C626 | 88 + bne CopySelectedActorCoordinates ; PRG $0627 | CPU $C627 | D0 FA + lda SelectedScreenVariant ; PRG $0629 | CPU $C629 | A5 41 + lsr a ; PRG $062B | CPU $C62B | 4A + lda ScreenEffectTimer ; PRG $062C | CPU $C62C | A5 4F + adc #$03 ; PRG $062E | CPU $C62E | 69 03 + sta ScreenEffectTimer ; PRG $0630 | CPU $C630 | 85 4F + bcc CopySelectedActorCoordinates ; PRG $0632 | CPU $C632 | 90 EF +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp 04 C634. +; Local behavior: Reads ScreenEffectState, CalculateAndClampValue_C58F, Continuation_C541; mutates PackedCoordinateOrValue, ScreenEffectState. +; Parameters: ScreenEffectState, CalculateAndClampValue_C58F, Continuation_C541. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_04_C634: + lda ScreenEffectState ; PRG $0634 | CPU $C634 | A5 4E + sta PackedCoordinateOrValue ; PRG $0636 | CPU $C636 | 85 04 + lda #$01 ; PRG $0638 | CPU $C638 | A9 01 + jsr CalculateAndClampValue_C58F ; PRG $063A | CPU $C63A | 20 8F C5 + sta ScreenEffectState ; PRG $063D | CPU $C63D | 85 4E + jmp Continuation_C541 ; PRG $063F | CPU $C63F | 4C 41 C5 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation C642. +; Local behavior: Reads implicit CPU state or none observed; mutates CurrentSpriteTileId. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_C642: + ldy #$04 ; PRG $0642 | CPU $C642 | A0 04 + sty CurrentSpriteTileId ; PRG $0644 | CPU $C644 | 84 11 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C646. +; Local behavior: Reads CurrentSpriteTileId, ActorStateArray, Flow_C651, ComputeOrDispatch_EC43; mutates no direct memory mutation observed. +; Parameters: CurrentSpriteTileId, ActorStateArray, Flow_C651, ComputeOrDispatch_EC43. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C646: + ldy CurrentSpriteTileId ; PRG $0646 | CPU $C646 | A4 11 + lda ActorStateArray,y ; PRG $0648 | CPU $C648 | B9 70 00 + beq Flow_C651 ; PRG $064B | CPU $C64B | F0 04 + tya ; PRG $064D | CPU $C64D | 98 + jsr ComputeOrDispatch_EC43 ; PRG $064E | CPU $C64E | 20 43 EC +; ----------------------------------------------------------------------------- +; Global purpose: Flow C651. +; Local behavior: Reads CurrentSpriteTileId, Flow_C646; mutates CurrentSpriteTileId. +; Parameters: CurrentSpriteTileId, Flow_C646. +; Returns: returns to caller; flags/register result depends on final instructions: dec CurrentSpriteTileId; bpl Flow_C646; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C651: + dec CurrentSpriteTileId ; PRG $0651 | CPU $C651 | C6 11 + bpl Flow_C646 ; PRG $0653 | CPU $C653 | 10 F1 + rts ; PRG $0655 | CPU $C655 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Clear Audio Request Flags. +; Local behavior: Reads implicit CPU state or none observed; mutates AudioChannelRequest, AudioEffectRequest, AudioPendingFlags, AudioModeOrEffectIndex, AudioRequestFlags. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: sta AudioModeOrEffectIndex; sta AudioRequestFlags; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ClearAudioRequestFlags: + lda #$00 ; PRG $0656 | CPU $C656 | A9 00 + sta AudioChannelRequest ; PRG $0658 | CPU $C658 | 85 FF + sta AudioEffectRequest ; PRG $065A | CPU $C65A | 85 FE + sta AudioPendingFlags ; PRG $065C | CPU $C65C | 85 FD + sta AudioModeOrEffectIndex ; PRG $065E | CPU $C65E | 85 FC + sta AudioRequestFlags ; PRG $0660 | CPU $C660 | 85 FB + rts ; PRG $0662 | CPU $C662 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C663. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +InitializeGameplayActors: + lda SelectedPlayerAndScreenFlags ; PRG $0663 | CPU $C663 | A5 38 + and #$02 ; PRG $0665 | CPU $C665 | 29 02 + lsr a ; PRG $0667 | CPU $C667 | 4A + sta SelectedPlayerIndex ; PRG $0668 | CPU $C668 | 85 40 + lda SelectedPlayerAndScreenFlags ; PRG $066A | CPU $C66A | A5 38 + and #$01 ; PRG $066C | CPU $C66C | 29 01 + sta SelectedScreenVariant ; PRG $066E | CPU $C66E | 85 41 + asl a ; PRG $0670 | CPU $C670 | 0A + tay ; PRG $0671 | CPU $C671 | A8 + lda PlayerStartXTable,y ; PRG $0672 | CPU $C672 | B9 8C 00 + sta PlayerOrActorX ; PRG $0675 | CPU $C675 | 85 81 + lda PlayerStartYTable,y ; PRG $0677 | CPU $C677 | B9 8D 00 + sta PlayerOrActorY ; PRG $067A | CPU $C67A | 85 82 + lda #$00 ; PRG $067C | CPU $C67C | A9 00 + sta PlayerMotionState ; PRG $067E | CPU $C67E | 85 83 + sta ActorInteractionState ; PRG $0680 | CPU $C680 | 85 91 + sta ObstacleInteractionState ; PRG $0682 | CPU $C682 | 85 95 + lda #$03 ; PRG $0684 | CPU $C684 | A9 03 + sta ActorAnimationTimer ; PRG $0686 | CPU $C686 | 85 90 + sta ObstacleAnimationTimer ; PRG $0688 | CPU $C688 | 85 94 + sta ActorAnimationFrame ; PRG $068A | CPU $C68A | 85 92 + sta ObstacleAnimationFrame ; PRG $068C | CPU $C68C | 85 96 + lda #$00 ; PRG $068E | CPU $C68E | A9 00 + ldx #$3F ; PRG $0690 | CPU $C690 | A2 3F +; ----------------------------------------------------------------------------- +; Global purpose: Flow C692. +; Local behavior: Reads Flow_C692, CurrentScreenState; mutates Ram_0580, SelectedActorIndex, Ram_0584, Ram_05A4, QueuedPpuTransferCount, AudioRequestFlags, CurrentScreenState. +; Parameters: Flow_C692, CurrentScreenState. +; Returns: returns to caller; flags/register result depends on final instructions: sta AudioRequestFlags; inc CurrentScreenState; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C692: + sta Ram_0580,x ; PRG $0692 | CPU $C692 | 9D 80 05 + dex ; PRG $0695 | CPU $C695 | CA + bpl Flow_C692 ; PRG $0696 | CPU $C696 | 10 FA + sta SelectedActorIndex ; PRG $0698 | CPU $C698 | 85 43 + lda #$01 ; PRG $069A | CPU $C69A | A9 01 + sta Ram_0584 ; PRG $069C | CPU $C69C | 8D 84 05 + sta Ram_05A4 ; PRG $069F | CPU $C69F | 8D A4 05 + sta QueuedPpuTransferCount ; PRG $06A2 | CPU $C6A2 | 85 34 + lda #$05 ; PRG $06A4 | CPU $C6A4 | A9 05 + sta AudioRequestFlags ; PRG $06A6 | CPU $C6A6 | 85 FB + inc CurrentScreenState ; PRG $06A8 | CPU $C6A8 | E6 3B + rts ; PRG $06AA | CPU $C6AA | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C6AB. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +InitializeScreenState1: + jsr DisableRenderingForNmiWork ; PRG $06AB | CPU $C6AB | 20 7D C0 + jsr ClearNametable2000WithTile24 ; PRG $06AE | CPU $C6AE | 20 A9 C1 + jsr HideAllOamSprites ; PRG $06B1 | CPU $C6B1 | 20 EA C1 + lda SelectedActorIndex ; PRG $06B4 | CPU $C6B4 | A5 43 + asl a ; PRG $06B6 | CPU $C6B6 | 0A + asl a ; PRG $06B7 | CPU $C6B7 | 0A + asl a ; PRG $06B8 | CPU $C6B8 | 0A + asl a ; PRG $06B9 | CPU $C6B9 | 0A + asl a ; PRG $06BA | CPU $C6BA | 0A + tay ; PRG $06BB | CPU $C6BB | A8 + ldx #$00 ; PRG $06BC | CPU $C6BC | A2 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C6 BE. +; Local behavior: Reads Ram_0580, Flow_C6BE, CurrentScreenState; mutates ActiveActorType, ObjectSpawnType, GameplayObjectAnimation, CurrentScreenState. +; Parameters: Ram_0580, Flow_C6BE, CurrentScreenState. +; Returns: returns to caller; flags/register result depends on final instructions: sta GameplayObjectAnimation; inc CurrentScreenState; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C6BE: + lda Ram_0580,y ; PRG $06BE | CPU $C6BE | B9 80 05 + sta ActiveActorType,x ; PRG $06C1 | CPU $C6C1 | 95 60 + iny ; PRG $06C3 | CPU $C6C3 | C8 + inx ; PRG $06C4 | CPU $C6C4 | E8 + cpx #$20 ; PRG $06C5 | CPU $C6C5 | E0 20 + bne Flow_C6BE ; PRG $06C7 | CPU $C6C7 | D0 F5 + lda #$01 ; PRG $06C9 | CPU $C6C9 | A9 01 + sta ObjectSpawnType ; PRG $06CB | CPU $C6CB | 85 48 + lda #$00 ; PRG $06CD | CPU $C6CD | A9 00 + sta GameplayObjectAnimation ; PRG $06CF | CPU $C6CF | 85 55 + inc CurrentScreenState ; PRG $06D1 | CPU $C6D1 | E6 3B + rts ; PRG $06D3 | CPU $C6D3 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C6D4. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +InitializeScreenState2: + ldy #$03 ; PRG $06D4 | CPU $C6D4 | A0 03 + lda SelectedPlayerIndex ; PRG $06D6 | CPU $C6D6 | A5 40 + beq Flow_C6E4 ; PRG $06D8 | CPU $C6D8 | F0 0A + lda SelectedActorIndex ; PRG $06DA | CPU $C6DA | A5 43 + clc ; PRG $06DC | CPU $C6DC | 18 + adc #$06 ; PRG $06DD | CPU $C6DD | 69 06 + jsr SelectDigitGlyphTable ; PRG $06DF | CPU $C6DF | 20 99 C4 + ldy #$08 ; PRG $06E2 | CPU $C6E2 | A0 08 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C6 E4. +; Local behavior: Reads CurrentScreenState, EnableRenderingAfterNmiWork; mutates ScreenSelectionPositionOrDelay, CurrentScreenState. +; Parameters: CurrentScreenState, EnableRenderingAfterNmiWork. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C6E4: + sty ScreenSelectionPositionOrDelay ; PRG $06E4 | CPU $C6E4 | 84 25 + inc CurrentScreenState ; PRG $06E6 | CPU $C6E6 | E6 3B + jmp EnableRenderingAfterNmiWork ; PRG $06E8 | CPU $C6E8 | 4C 84 C0 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C6EB. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateActiveScreenObjects: + lda ScreenSelectionPositionOrDelay ; PRG $06EB | CPU $C6EB | A5 25 + bne Flow_C70B ; PRG $06ED | CPU $C6ED | D0 1C + jsr DisableRenderingForNmiWork ; PRG $06EF | CPU $C6EF | 20 7D C0 + lda ScreenObjectTrigger ; PRG $06F2 | CPU $C6F2 | A5 64 + beq Flow_C709 ; PRG $06F4 | CPU $C6F4 | F0 13 + lda #$00 ; PRG $06F6 | CPU $C6F6 | A9 00 + sta ScreenObjectTrigger ; PRG $06F8 | CPU $C6F8 | 85 64 + jsr PrepareScreenObjectUpdate ; PRG $06FA | CPU $C6FA | 20 10 C7 + clc ; PRG $06FD | CPU $C6FD | 18 + lda ActiveActorState ; PRG $06FE | CPU $C6FE | A5 61 + sta PackedCoordinateOrValue ; PRG $0700 | CPU $C700 | 85 04 + lda #$01 ; PRG $0702 | CPU $C702 | A9 01 + jsr AddPackedMovementDelta ; PRG $0704 | CPU $C704 | 20 6E C5 + sta ActiveActorState ; PRG $0707 | CPU $C707 | 85 61 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C709. +; Local behavior: Reads CurrentScreenState; mutates CurrentScreenState. +; Parameters: CurrentScreenState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C709: + inc CurrentScreenState ; PRG $0709 | CPU $C709 | E6 3B +; ----------------------------------------------------------------------------- +; Global purpose: Flow C70 B. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C70B: + rts ; PRG $070B | CPU $C70B | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C70 C. +; Local behavior: Reads implicit CPU state or none observed; mutates ActiveActorType. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C70C: + lda #$7E ; PRG $070C | CPU $C70C | A9 7E + sta ActiveActorType ; PRG $070E | CPU $C70E | 85 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C710. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +PrepareScreenObjectUpdate: + ldy ActiveActorType ; PRG $0710 | CPU $C710 | A4 60 + lda ActorCollisionOrStateTable_EC69,y ; PRG $0712 | CPU $C712 | B9 69 EC + cmp #$AA ; PRG $0715 | CPU $C715 | C9 AA + beq Flow_C70C ; PRG $0717 | CPU $C717 | F0 F3 + sta ScreenObjectMode ; PRG $0719 | CPU $C719 | 85 62 + iny ; PRG $071B | CPU $C71B | C8 + lda ActorCollisionOrStateTable_EC69,y ; PRG $071C | CPU $C71C | B9 69 EC + sta ScreenObjectTimer ; PRG $071F | CPU $C71F | 85 63 + iny ; PRG $0721 | CPU $C721 | C8 + ldx #$00 ; PRG $0722 | CPU $C722 | A2 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C724. +; Local behavior: Reads ActorCollisionOrStateTable_EC69, Flow_C724; mutates ActorTimerArray, ActiveActorType, ActorTableIndex, ActorAnimationStep. +; Parameters: ActorCollisionOrStateTable_EC69, Flow_C724. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C724: + lda ActorCollisionOrStateTable_EC69,y ; PRG $0724 | CPU $C724 | B9 69 EC + sta ActorTimerArray,x ; PRG $0727 | CPU $C727 | 95 68 + iny ; PRG $0729 | CPU $C729 | C8 + inx ; PRG $072A | CPU $C72A | E8 + cpx #$07 ; PRG $072B | CPU $C72B | E0 07 + bne Flow_C724 ; PRG $072D | CPU $C72D | D0 F5 + sty ActiveActorType ; PRG $072F | CPU $C72F | 84 60 + lda #$20 ; PRG $0731 | CPU $C731 | A9 20 + sta ActorTableIndex ; PRG $0733 | CPU $C733 | 85 6F + lda #$05 ; PRG $0735 | CPU $C735 | A9 05 + sta ActorAnimationStep ; PRG $0737 | CPU $C737 | 85 75 + ldy #$04 ; PRG $0739 | CPU $C739 | A0 04 + lda #$01 ; PRG $073B | CPU $C73B | A9 01 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C73 D. +; Local behavior: Reads Flow_C73D, ActiveActorState, SelectedScreenVariant, ScreenVariantInitialStateTable; mutates ActorStateArray, ScreenVariantInitialState. +; Parameters: Flow_C73D, ActiveActorState, SelectedScreenVariant, ScreenVariantInitialStateTable. +; Returns: returns to caller; flags/register result depends on final instructions: lda ScreenVariantInitialStateTable,y; sta ScreenVariantInitialState; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C73D: + sta ActorStateArray,y ; PRG $073D | CPU $C73D | 99 70 00 + dey ; PRG $0740 | CPU $C740 | 88 + bpl Flow_C73D ; PRG $0741 | CPU $C741 | 10 FA + lda ActiveActorState ; PRG $0743 | CPU $C743 | A5 61 + cmp #$06 ; PRG $0745 | CPU $C745 | C9 06 + lda SelectedScreenVariant ; PRG $0747 | CPU $C747 | A5 41 + asl a ; PRG $0749 | CPU $C749 | 0A + tay ; PRG $074A | CPU $C74A | A8 + lda ScreenVariantInitialStateTable,y ; PRG $074B | CPU $C74B | B9 51 C7 + sta ScreenVariantInitialState ; PRG $074E | CPU $C74E | 85 78 + rts ; PRG $0750 | CPU $C750 | 60 + +ScreenVariantInitialStateTable: + .byte $00,$03,$03,$05 ; PRG $0751 | CPU $C751 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C755. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateScreenGameplayState4: + jsr ClearNametable2000WithTile24 ; PRG $0755 | CPU $C755 | 20 A9 C1 + jsr HideAllOamSprites ; PRG $0758 | CPU $C758 | 20 EA C1 + jsr ComputeOrDispatch_C76F ; PRG $075B | CPU $C75B | 20 6F C7 + jsr UpdateZp_01_C7B0 ; PRG $075E | CPU $C75E | 20 B0 C7 + jsr TransformPackedValue_C524 ; PRG $0761 | CPU $C761 | 20 24 C5 + jsr ComputeOrDispatch_C534 ; PRG $0764 | CPU $C764 | 20 34 C5 + jsr RequestNmiProcessing ; PRG $0767 | CPU $C767 | 20 5F C0 + inc CurrentScreenState ; PRG $076A | CPU $C76A | E6 3B + jmp Continuation_C642 ; PRG $076C | CPU $C76C | 4C 42 C6 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch C76 F. +; Local behavior: Reads BeginPpuCommandStream, ScreenObjectMode, Flow_C784; mutates no direct memory mutation observed. +; Parameters: BeginPpuCommandStream, ScreenObjectMode, Flow_C784. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_C76F: + ldx #$03 ; PRG $076F | CPU $C76F | A2 03 + ldy #$F2 ; PRG $0771 | CPU $C771 | A0 F2 + jsr BeginPpuCommandStream ; PRG $0773 | CPU $C773 | 20 DC C3 + ldx #$5C ; PRG $0776 | CPU $C776 | A2 5C + ldy #$F2 ; PRG $0778 | CPU $C778 | A0 F2 + lda ScreenObjectMode ; PRG $077A | CPU $C77A | A5 62 + cmp #$02 ; PRG $077C | CPU $C77C | C9 02 + bne Flow_C784 ; PRG $077E | CPU $C77E | D0 04 + ldx #$06 ; PRG $0780 | CPU $C780 | A2 06 + ldy #$F4 ; PRG $0782 | CPU $C782 | A0 F4 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C784. +; Local behavior: Reads BeginPpuCommandStream, ClearNmiWorkMode, ScreenObjectMode, Flow_C797; mutates no direct memory mutation observed. +; Parameters: BeginPpuCommandStream, ClearNmiWorkMode, ScreenObjectMode, Flow_C797. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C784: + jsr BeginPpuCommandStream ; PRG $0784 | CPU $C784 | 20 DC C3 + jsr ClearNmiWorkMode ; PRG $0787 | CPU $C787 | 20 73 C0 + lda ScreenObjectMode ; PRG $078A | CPU $C78A | A5 62 + cmp #$01 ; PRG $078C | CPU $C78C | C9 01 + bne Flow_C797 ; PRG $078E | CPU $C78E | D0 07 + ldx #$AF ; PRG $0790 | CPU $C790 | A2 AF + ldy #$F5 ; PRG $0792 | CPU $C792 | A0 F5 + jsr BeginPpuCommandStream ; PRG $0794 | CPU $C794 | 20 DC C3 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C797. +; Local behavior: Reads BeginPpuCommandStream, SelectedPlayerIndex, Flow_C7A9; mutates no direct memory mutation observed. +; Parameters: BeginPpuCommandStream, SelectedPlayerIndex, Flow_C7A9. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C797: + ldx #$C1 ; PRG $0797 | CPU $C797 | A2 C1 + ldy #$F5 ; PRG $0799 | CPU $C799 | A0 F5 + jsr BeginPpuCommandStream ; PRG $079B | CPU $C79B | 20 DC C3 + lda SelectedPlayerIndex ; PRG $079E | CPU $C79E | A5 40 + beq Flow_C7A9 ; PRG $07A0 | CPU $C7A0 | F0 07 + ldx #$CE ; PRG $07A2 | CPU $C7A2 | A2 CE + ldy #$F5 ; PRG $07A4 | CPU $C7A4 | A0 F5 + jsr BeginPpuCommandStream ; PRG $07A6 | CPU $C7A6 | 20 DC C3 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C7 A9. +; Local behavior: Reads ScreenObjectMode, QueuedPpuTransferCount; mutates QueuedPpuTransferCount. +; Parameters: ScreenObjectMode, QueuedPpuTransferCount. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C7A9: + lda ScreenObjectMode ; PRG $07A9 | CPU $C7A9 | A5 62 + sta QueuedPpuTransferCount ; PRG $07AB | CPU $C7AB | 85 34 + inc QueuedPpuTransferCount ; PRG $07AD | CPU $C7AD | E6 34 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C7 AF. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C7AF: + rts ; PRG $07AF | CPU $C7AF | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp 01 C7 B0. +; Local behavior: Reads EvaluateCollisionState_C4E9, SelectedPlayerIndex, Flow_C7AF; mutates WorkPointerOrValueLo. +; Parameters: EvaluateCollisionState_C4E9, SelectedPlayerIndex, Flow_C7AF. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_01_C7B0: + lda #$F0 ; PRG $07B0 | CPU $C7B0 | A9 F0 + sta WorkPointerOrValueLo ; PRG $07B2 | CPU $C7B2 | 85 01 + jsr EvaluateCollisionState_C4E9 ; PRG $07B4 | CPU $C7B4 | 20 E9 C4 + lda SelectedPlayerIndex ; PRG $07B7 | CPU $C7B7 | A5 40 + beq Flow_C7AF ; PRG $07B9 | CPU $C7B9 | F0 F4 + lda #$A1 ; PRG $07BB | CPU $C7BB | A9 A1 + sta WorkPointerOrValueLo ; PRG $07BD | CPU $C7BD | 85 01 + jmp EvaluateCollisionState_C4E9 ; PRG $07BF | CPU $C7BF | 4C E9 C4 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C7C2. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateScreenGameplayState5: + jsr UpdateRam_0300_CB2B ; PRG $07C2 | CPU $C7C2 | 20 2B CB + jsr UpdateZp_04_E7C5 ; PRG $07C5 | CPU $C7C5 | 20 C5 E7 + jsr EnableRenderingAfterNmiWork ; PRG $07C8 | CPU $C7C8 | 20 84 C0 + lda #$80 ; PRG $07CB | CPU $C7CB | A9 80 + sta ScreenEffectState ; PRG $07CD | CPU $C7CD | 85 4E + lda #$00 ; PRG $07CF | CPU $C7CF | A9 00 + sta ScreenEffectTimer ; PRG $07D1 | CPU $C7D1 | 85 4F + sta ObjectSpawnDelay ; PRG $07D3 | CPU $C7D3 | 85 47 + sta ScreenCollisionState ; PRG $07D5 | CPU $C7D5 | 85 44 + sta Ram_03A0 ; PRG $07D7 | CPU $C7D7 | 8D A0 03 + inc CurrentScreenState ; PRG $07DA | CPU $C7DA | E6 3B + rts ; PRG $07DC | CPU $C7DC | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C7DD. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateScreenGameplayState6: + jsr UpdateObjectScreenY_D1D7 ; PRG $07DD | CPU $C7DD | 20 D7 D1 + jsr UpdateZp_A8_CB89 ; PRG $07E0 | CPU $C7E0 | 20 89 CB + jsr UpdateZp_A8_CEA9 ; PRG $07E3 | CPU $C7E3 | 20 A9 CE + jsr TransformPackedValue_D023 ; PRG $07E6 | CPU $C7E6 | 20 23 D0 + jsr UpdateZp_A8_D2F2 ; PRG $07E9 | CPU $C7E9 | 20 F2 D2 + jsr EvaluateCollisionState_E86A ; PRG $07EC | CPU $C7EC | 20 6A E8 + jsr EvaluateCollisionState_DF94 ; PRG $07EF | CPU $C7EF | 20 94 DF + jsr UpdateZp_A8_EBC6 ; PRG $07F2 | CPU $C7F2 | 20 C6 EB + jsr EvaluateCollisionState_DED5 ; PRG $07F5 | CPU $C7F5 | 20 D5 DE + jsr UpdateRam_0371_D75A ; PRG $07F8 | CPU $C7F8 | 20 5A D7 + jsr EvaluateCollisionState_DD71 ; PRG $07FB | CPU $C7FB | 20 71 DD + jsr EvaluateCollisionState_DE2E ; PRG $07FE | CPU $C7FE | 20 2E DE + jsr UpdateZp_A8_E9F6 ; PRG $0801 | CPU $C801 | 20 F6 E9 + jsr UpdateZp_A8_EB06 ; PRG $0804 | CPU $C804 | 20 06 EB + jsr EvaluateCollisionState_C624 ; PRG $0807 | CPU $C807 | 20 24 C6 + jsr UpdateActorObstacleInteraction ; PRG $080A | CPU $C80A | 20 C0 C5 + ldy ScreenCollisionState ; PRG $080D | CPU $C80D | A4 44 + beq LoadScreenCollisionState ; PRG $080F | CPU $C80F | F0 1E + dey ; PRG $0811 | CPU $C811 | 88 + beq Flow_C837 ; PRG $0812 | CPU $C812 | F0 23 + lda #$00 ; PRG $0814 | CPU $C814 | A9 00 + sta AudioModeOrEffectIndex ; PRG $0816 | CPU $C816 | 85 FC + lda ObjectSpawnDelay ; PRG $0818 | CPU $C818 | A5 47 + beq Flow_C82E ; PRG $081A | CPU $C81A | F0 12 + inc CurrentScreenState ; PRG $081C | CPU $C81C | E6 3B + inc PlayerModeOrScreenPhase ; PRG $081E | CPU $C81E | E6 3C + lda #$10 ; PRG $0820 | CPU $C820 | A9 10 + sta ScreenSelectionPositionOrDelay ; PRG $0822 | CPU $C822 | 85 25 + lda #$00 ; PRG $0824 | CPU $C824 | A9 00 + ldy ScreenObjectCounter ; PRG $0826 | CPU $C826 | A4 65 + beq Flow_C82C ; PRG $0828 | CPU $C828 | F0 02 + lda #$02 ; PRG $082A | CPU $C82A | A9 02 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C82 C. +; Local behavior: Reads implicit CPU state or none observed; mutates ObjectSpawnX. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C82C: + sta ObjectSpawnX ; PRG $082C | CPU $C82C | 85 49 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C82 E. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C82E: + rts ; PRG $082E | CPU $C82E | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C82F. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +LoadScreenCollisionState: + lda Ram_0360 ; PRG $082F | CPU $C82F | AD 60 03 + sta ScreenCollisionState ; PRG $0832 | CPU $C832 | 85 44 + sta PendingObstacleInteraction ; PRG $0834 | CPU $C834 | 85 46 + rts ; PRG $0836 | CPU $C836 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C837. +; Local behavior: Reads ScreenObjectMode, Flow_C840; mutates no direct memory mutation observed. +; Parameters: ScreenObjectMode, Flow_C840. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C837: + ldx #$01 ; PRG $0837 | CPU $C837 | A2 01 + lda ScreenObjectMode ; PRG $0839 | CPU $C839 | A5 62 + cmp #$02 ; PRG $083B | CPU $C83B | C9 02 + bne Flow_C840 ; PRG $083D | CPU $C83D | D0 01 + inx ; PRG $083F | CPU $C83F | E8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C840. +; Local behavior: Reads ScreenObjectMode, Flow_C84A; mutates no direct memory mutation observed. +; Parameters: ScreenObjectMode, Flow_C84A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C840: + ldy #$B8 ; PRG $0840 | CPU $C840 | A0 B8 + lda ScreenObjectMode ; PRG $0842 | CPU $C842 | A5 62 + cmp #$02 ; PRG $0844 | CPU $C844 | C9 02 + bne Flow_C84A ; PRG $0846 | CPU $C846 | D0 02 + ldy #$9C ; PRG $0848 | CPU $C848 | A0 9C +; ----------------------------------------------------------------------------- +; Global purpose: Flow C84 A. +; Local behavior: Reads Ram_0371, Flow_C853, Flow_C871; mutates no direct memory mutation observed. +; Parameters: Ram_0371, Flow_C853, Flow_C871. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C84A: + cpy Ram_0371 ; PRG $084A | CPU $C84A | CC 71 03 + bcs Flow_C853 ; PRG $084D | CPU $C84D | B0 04 + ldx #$06 ; PRG $084F | CPU $C84F | A2 06 + bne Flow_C871 ; PRG $0851 | CPU $C851 | D0 1E +; ----------------------------------------------------------------------------- +; Global purpose: Flow C853. +; Local behavior: Reads ScreenEffectState, Flow_C85D, Flow_C871; mutates no direct memory mutation observed. +; Parameters: ScreenEffectState, Flow_C85D, Flow_C871. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C853: + lda ScreenEffectState ; PRG $0853 | CPU $C853 | A5 4E + cmp #$10 ; PRG $0855 | CPU $C855 | C9 10 + bcs Flow_C85D ; PRG $0857 | CPU $C857 | B0 04 + ldx #$06 ; PRG $0859 | CPU $C859 | A2 06 + bne Flow_C871 ; PRG $085B | CPU $C85B | D0 14 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C85 D. +; Local behavior: Reads GameplayObjectAnimation, Flow_C865, Flow_C871; mutates no direct memory mutation observed. +; Parameters: GameplayObjectAnimation, Flow_C865, Flow_C871. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C85D: + lda GameplayObjectAnimation ; PRG $085D | CPU $C85D | A5 55 + beq Flow_C865 ; PRG $085F | CPU $C85F | F0 04 + ldx #$05 ; PRG $0861 | CPU $C861 | A2 05 + bne Flow_C871 ; PRG $0863 | CPU $C863 | D0 0C +; ----------------------------------------------------------------------------- +; Global purpose: Flow C865. +; Local behavior: Reads Ram_03A0, Flow_C871, Ram_03A1; mutates no direct memory mutation observed. +; Parameters: Ram_03A0, Flow_C871, Ram_03A1. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C865: + lda Ram_03A0 ; PRG $0865 | CPU $C865 | AD A0 03 + beq Flow_C871 ; PRG $0868 | CPU $C868 | F0 07 + lda Ram_03A1 ; PRG $086A | CPU $C86A | AD A1 03 + bne Flow_C871 ; PRG $086D | CPU $C86D | D0 02 + ldx #$04 ; PRG $086F | CPU $C86F | A2 04 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C871. +; Local behavior: Reads ActorTableIndex, Flow_C887; mutates AudioModeOrEffectIndex, AudioRequestFlags, ScreenObjectTrigger, Ram_0360, ScreenCollisionState. +; Parameters: ActorTableIndex, Flow_C887. +; Returns: returns to caller; flags/register result depends on final instructions: sta Ram_0360; sta ScreenCollisionState; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C871: + stx AudioModeOrEffectIndex ; PRG $0871 | CPU $C871 | 86 FC + lda ActorTableIndex ; PRG $0873 | CPU $C873 | A5 6F + bne Flow_C887 ; PRG $0875 | CPU $C875 | D0 10 + lda #$07 ; PRG $0877 | CPU $C877 | A9 07 + sta AudioRequestFlags ; PRG $0879 | CPU $C879 | 85 FB + lda #$01 ; PRG $087B | CPU $C87B | A9 01 + sta ScreenObjectTrigger ; PRG $087D | CPU $C87D | 85 64 + lda #$02 ; PRG $087F | CPU $C87F | A9 02 + sta Ram_0360 ; PRG $0881 | CPU $C881 | 8D 60 03 + sta ScreenCollisionState ; PRG $0884 | CPU $C884 | 85 44 + rts ; PRG $0886 | CPU $C886 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C887. +; Local behavior: Reads Ram_0360, Flow_C898, Flow_C89D, Flow_C8B9; mutates no direct memory mutation observed. +; Parameters: Ram_0360, Flow_C898, Flow_C89D, Flow_C8B9. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C887: + lda Ram_0360 ; PRG $0887 | CPU $C887 | AD 60 03 + cmp #$02 ; PRG $088A | CPU $C88A | C9 02 + beq Flow_C898 ; PRG $088C | CPU $C88C | F0 0A + cmp #$03 ; PRG $088E | CPU $C88E | C9 03 + beq Flow_C898 ; PRG $0890 | CPU $C890 | F0 06 + cmp #$04 ; PRG $0892 | CPU $C892 | C9 04 + bne Flow_C89D ; PRG $0894 | CPU $C894 | D0 07 + beq Flow_C8B9 ; PRG $0896 | CPU $C896 | F0 21 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C898. +; Local behavior: Reads implicit CPU state or none observed; mutates ScreenCollisionState. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$03; sta ScreenCollisionState; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C898: + lda #$03 ; PRG $0898 | CPU $C898 | A9 03 + sta ScreenCollisionState ; PRG $089A | CPU $C89A | 85 44 + rts ; PRG $089C | CPU $C89C | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C89 D. +; Local behavior: Reads Ram_0300, Flow_C8B0; mutates ScreenCollisionState, Ram_0360, GameplayStateFlags. +; Parameters: Ram_0300, Flow_C8B0. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$20; sta GameplayStateFlags; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C89D: + lda Ram_0300 ; PRG $089D | CPU $C89D | AD 00 03 + cmp #$02 ; PRG $08A0 | CPU $C8A0 | C9 02 + bne Flow_C8B0 ; PRG $08A2 | CPU $C8A2 | D0 0C + lda #$06 ; PRG $08A4 | CPU $C8A4 | A9 06 + sta ScreenCollisionState ; PRG $08A6 | CPU $C8A6 | 85 44 + sta Ram_0360 ; PRG $08A8 | CPU $C8A8 | 8D 60 03 + lda #$20 ; PRG $08AB | CPU $C8AB | A9 20 + sta GameplayStateFlags ; PRG $08AD | CPU $C8AD | 85 23 + rts ; PRG $08AF | CPU $C8AF | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C8 B0. +; Local behavior: Reads ScreenEffectState, Flow_C8C5; mutates Ram_0360. +; Parameters: ScreenEffectState, Flow_C8C5. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C8B0: + lda ScreenEffectState ; PRG $08B0 | CPU $C8B0 | A5 4E + bne Flow_C8C5 ; PRG $08B2 | CPU $C8B2 | D0 11 + lda #$05 ; PRG $08B4 | CPU $C8B4 | A9 05 + sta Ram_0360 ; PRG $08B6 | CPU $C8B6 | 8D 60 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C8 B9. +; Local behavior: Reads implicit CPU state or none observed; mutates ScreenCollisionState, Ram_0300, Ram_0301. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C8B9: + sta ScreenCollisionState ; PRG $08B9 | CPU $C8B9 | 85 44 + lda #$02 ; PRG $08BB | CPU $C8BB | A9 02 + sta Ram_0300 ; PRG $08BD | CPU $C8BD | 8D 00 03 + lda #$00 ; PRG $08C0 | CPU $C8C0 | A9 00 + sta Ram_0301 ; PRG $08C2 | CPU $C8C2 | 8D 01 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C8 C5. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C8C5: + rts ; PRG $08C5 | CPU $C8C5 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C8C6. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateScreenGameplayState7: + ldy ObjectSpawnX ; PRG $08C6 | CPU $C8C6 | A4 49 + beq Flow_C8D4 ; PRG $08C8 | CPU $C8C8 | F0 0A + dey ; PRG $08CA | CPU $C8CA | 88 + beq Flow_C8FC ; PRG $08CB | CPU $C8CB | F0 2F + lda GameplayTimer ; PRG $08CD | CPU $C8CD | A5 21 + bne Flow_C8D3 ; PRG $08CF | CPU $C8CF | D0 02 + inc CurrentScreenState ; PRG $08D1 | CPU $C8D1 | E6 3B +; ----------------------------------------------------------------------------- +; Global purpose: Flow C8 D3. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C8D3: + rts ; PRG $08D3 | CPU $C8D3 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C8 D4. +; Local behavior: Reads ScreenSelectionPositionOrDelay, Flow_C8D3, FrameCounter, ScreenEffectState, Flow_C8F1, UpdateZp_04_C634, UpdateActorCoordinates_C54B, UpdateActorObstacleInteraction; mutates AudioEffectRequest. +; Parameters: ScreenSelectionPositionOrDelay, Flow_C8D3, FrameCounter, ScreenEffectState, Flow_C8F1, UpdateZp_04_C634, UpdateActorCoordinates_C54B, UpdateActorObstacleInteraction. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C8D4: + lda ScreenSelectionPositionOrDelay ; PRG $08D4 | CPU $C8D4 | A5 25 + bne Flow_C8D3 ; PRG $08D6 | CPU $C8D6 | D0 FB + lda FrameCounter ; PRG $08D8 | CPU $C8D8 | A5 27 + lsr a ; PRG $08DA | CPU $C8DA | 4A + bcs Flow_C8D3 ; PRG $08DB | CPU $C8DB | B0 F6 + lda ScreenEffectState ; PRG $08DD | CPU $C8DD | A5 4E + beq Flow_C8F1 ; PRG $08DF | CPU $C8DF | F0 10 + lda #$20 ; PRG $08E1 | CPU $C8E1 | A9 20 + sta AudioEffectRequest ; PRG $08E3 | CPU $C8E3 | 85 FE + sec ; PRG $08E5 | CPU $C8E5 | 38 + jsr UpdateZp_04_C634 ; PRG $08E6 | CPU $C8E6 | 20 34 C6 + lda #$01 ; PRG $08E9 | CPU $C8E9 | A9 01 + jsr UpdateActorCoordinates_C54B ; PRG $08EB | CPU $C8EB | 20 4B C5 + jmp UpdateActorObstacleInteraction ; PRG $08EE | CPU $C8EE | 4C C0 C5 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C8 F1. +; Local behavior: Reads ObjectSpawnX; mutates ObjectSpawnX, GameplayTimer, CollisionTableIndex. +; Parameters: ObjectSpawnX. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$00; sta CollisionTableIndex; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C8F1: + inc ObjectSpawnX ; PRG $08F1 | CPU $C8F1 | E6 49 + lda #$18 ; PRG $08F3 | CPU $C8F3 | A9 18 + sta GameplayTimer ; PRG $08F5 | CPU $C8F5 | 85 21 + lda #$00 ; PRG $08F7 | CPU $C8F7 | A9 00 + sta CollisionTableIndex ; PRG $08F9 | CPU $C8F9 | 85 C8 + rts ; PRG $08FB | CPU $C8FB | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C8 FC. +; Local behavior: Reads GameplayTimer, Flow_C923, FrameCounter, CollisionTableIndex, Flow_C924, ActorStateArray, ComputeOrDispatch_EC49, UpdateActorCoordinates_C54B; mutates CollisionTableIndex, AudioRequestFlags. +; Parameters: GameplayTimer, Flow_C923, FrameCounter, CollisionTableIndex, Flow_C924, ActorStateArray, ComputeOrDispatch_EC49, UpdateActorCoordinates_C54B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C8FC: + lda GameplayTimer ; PRG $08FC | CPU $C8FC | A5 21 + bne Flow_C923 ; PRG $08FE | CPU $C8FE | D0 23 + lda FrameCounter ; PRG $0900 | CPU $C900 | A5 27 + and #$0F ; PRG $0902 | CPU $C902 | 29 0F + bne Flow_C923 ; PRG $0904 | CPU $C904 | D0 1D + ldy CollisionTableIndex ; PRG $0906 | CPU $C906 | A4 C8 + inc CollisionTableIndex ; PRG $0908 | CPU $C908 | E6 C8 + cpy #$05 ; PRG $090A | CPU $C90A | C0 05 + beq Flow_C924 ; PRG $090C | CPU $C90C | F0 16 + lda ActorStateArray,y ; PRG $090E | CPU $C90E | B9 70 00 + beq Flow_C923 ; PRG $0911 | CPU $C911 | F0 10 + tya ; PRG $0913 | CPU $C913 | 98 + jsr ComputeOrDispatch_EC49 ; PRG $0914 | CPU $C914 | 20 49 EC + lda #$05 ; PRG $0917 | CPU $C917 | A9 05 + jsr UpdateActorCoordinates_C54B ; PRG $0919 | CPU $C919 | 20 4B C5 + jsr UpdateActorObstacleInteraction ; PRG $091C | CPU $C91C | 20 C0 C5 + lda #$01 ; PRG $091F | CPU $C91F | A9 01 + sta AudioRequestFlags ; PRG $0921 | CPU $C921 | 85 FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow C923. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C923: + rts ; PRG $0923 | CPU $C923 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C924. +; Local behavior: Reads ActorAnimationStep, Flow_C937, UpdateActorCoordinates_C54B, UpdateActorObstacleInteraction, SelectDigitGlyphTable; mutates no direct memory mutation observed. +; Parameters: ActorAnimationStep, Flow_C937, UpdateActorCoordinates_C54B, UpdateActorObstacleInteraction, SelectDigitGlyphTable. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C924: + lda ActorAnimationStep ; PRG $0924 | CPU $C924 | A5 75 + cmp #$05 ; PRG $0926 | CPU $C926 | C9 05 + bne Flow_C937 ; PRG $0928 | CPU $C928 | D0 0D + lda #$30 ; PRG $092A | CPU $C92A | A9 30 + jsr UpdateActorCoordinates_C54B ; PRG $092C | CPU $C92C | 20 4B C5 + jsr UpdateActorObstacleInteraction ; PRG $092F | CPU $C92F | 20 C0 C5 + lda #$0B ; PRG $0932 | CPU $C932 | A9 0B + jsr SelectDigitGlyphTable ; PRG $0934 | CPU $C934 | 20 99 C4 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C937. +; Local behavior: Reads ObjectSpawnX; mutates ObjectSpawnX, GameplayTimer. +; Parameters: ObjectSpawnX. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$80; sta GameplayTimer; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C937: + inc ObjectSpawnX ; PRG $0937 | CPU $C937 | E6 49 + lda #$80 ; PRG $0939 | CPU $C939 | A9 80 + sta GameplayTimer ; PRG $093B | CPU $C93B | 85 21 + rts ; PRG $093D | CPU $C93D | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C93E. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateScreenGameplayState8: + ldy #$03 ; PRG $093E | CPU $C93E | A0 03 + lda ScreenObjectCounter ; PRG $0940 | CPU $C940 | A5 65 + beq Flow_C948 ; PRG $0942 | CPU $C942 | F0 04 + dec ScreenObjectCounter ; PRG $0944 | CPU $C944 | C6 65 + ldy #$09 ; PRG $0946 | CPU $C946 | A0 09 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C948. +; Local behavior: Reads implicit CPU state or none observed; mutates CurrentScreenState. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: sty CurrentScreenState; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C948: + sty CurrentScreenState ; PRG $0948 | CPU $C948 | 84 3B + rts ; PRG $094A | CPU $C94A | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C94B. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateScreenGameplayState9: + lda SelectedActorIndex ; PRG $094B | CPU $C94B | A5 43 + asl a ; PRG $094D | CPU $C94D | 0A + asl a ; PRG $094E | CPU $C94E | 0A + sta PackedHudOrObjectValue ; PRG $094F | CPU $C94F | 85 16 + asl a ; PRG $0951 | CPU $C951 | 0A + asl a ; PRG $0952 | CPU $C952 | 0A + asl a ; PRG $0953 | CPU $C953 | 0A + tay ; PRG $0954 | CPU $C954 | A8 + ldx #$00 ; PRG $0955 | CPU $C955 | A2 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C957. +; Local behavior: Reads ActiveActorType, Flow_C957, SelectedPlayerIndex, Flow_C975, SelectedActorIndex, ActorAnimationTimer; mutates Ram_0580, SelectedActorIndex. +; Parameters: ActiveActorType, Flow_C957, SelectedPlayerIndex, Flow_C975, SelectedActorIndex, ActorAnimationTimer. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C957: + lda ActiveActorType,x ; PRG $0957 | CPU $C957 | B5 60 + sta Ram_0580,y ; PRG $0959 | CPU $C959 | 99 80 05 + iny ; PRG $095C | CPU $C95C | C8 + inx ; PRG $095D | CPU $C95D | E8 + cpx #$20 ; PRG $095E | CPU $C95E | E0 20 + bne Flow_C957 ; PRG $0960 | CPU $C960 | D0 F5 + lda SelectedPlayerIndex ; PRG $0962 | CPU $C962 | A5 40 + beq Flow_C975 ; PRG $0964 | CPU $C964 | F0 0F + lda SelectedActorIndex ; PRG $0966 | CPU $C966 | A5 43 + eor #$01 ; PRG $0968 | CPU $C968 | 49 01 + tax ; PRG $096A | CPU $C96A | AA + asl a ; PRG $096B | CPU $C96B | 0A + asl a ; PRG $096C | CPU $C96C | 0A + tay ; PRG $096D | CPU $C96D | A8 + lda ActorAnimationTimer,y ; PRG $096E | CPU $C96E | B9 90 00 + beq Flow_C975 ; PRG $0971 | CPU $C971 | F0 02 + stx SelectedActorIndex ; PRG $0973 | CPU $C973 | 86 43 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C975. +; Local behavior: Reads PackedHudOrObjectValue, ActorAnimationTimer, Flow_C993, SelectDigitGlyphTable, SelectedPlayerIndex, Flow_C991, Flow_C98E; mutates ActorAnimationTimer. +; Parameters: PackedHudOrObjectValue, ActorAnimationTimer, Flow_C993, SelectDigitGlyphTable, SelectedPlayerIndex, Flow_C991, Flow_C98E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C975: + ldy #$01 ; PRG $0975 | CPU $C975 | A0 01 + ldx PackedHudOrObjectValue ; PRG $0977 | CPU $C977 | A6 16 + dec ActorAnimationTimer,x ; PRG $0979 | CPU $C979 | D6 90 + bne Flow_C993 ; PRG $097B | CPU $C97B | D0 16 + lda #$08 ; PRG $097D | CPU $C97D | A9 08 + jsr SelectDigitGlyphTable ; PRG $097F | CPU $C97F | 20 99 C4 + lda SelectedPlayerIndex ; PRG $0982 | CPU $C982 | A5 40 + beq Flow_C991 ; PRG $0984 | CPU $C984 | F0 0B + lda #$06 ; PRG $0986 | CPU $C986 | A9 06 + ldy PackedHudOrObjectValue ; PRG $0988 | CPU $C988 | A4 16 + beq Flow_C98E ; PRG $098A | CPU $C98A | F0 02 + lda #$07 ; PRG $098C | CPU $C98C | A9 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C98 E. +; Local behavior: Reads SelectDigitGlyphTable; mutates no direct memory mutation observed. +; Parameters: SelectDigitGlyphTable. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C98E: + jsr SelectDigitGlyphTable ; PRG $098E | CPU $C98E | 20 99 C4 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C991. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C991: + ldy #$20 ; PRG $0991 | CPU $C991 | A0 20 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C993. +; Local behavior: Reads CurrentScreenState; mutates ScreenSelectionPositionOrDelay, CurrentScreenState. +; Parameters: CurrentScreenState. +; Returns: returns to caller; flags/register result depends on final instructions: sty ScreenSelectionPositionOrDelay; inc CurrentScreenState; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C993: + sty ScreenSelectionPositionOrDelay ; PRG $0993 | CPU $C993 | 84 25 + inc CurrentScreenState ; PRG $0995 | CPU $C995 | E6 3B + rts ; PRG $0997 | CPU $C997 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C998. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateScreenGameplayState10: + lda ScreenSelectionPositionOrDelay ; PRG $0998 | CPU $C998 | A5 25 + bne Flow_C9AE ; PRG $099A | CPU $C99A | D0 12 + ldy #$01 ; PRG $099C | CPU $C99C | A0 01 + lda ActorAnimationTimer ; PRG $099E | CPU $C99E | A5 90 + bne Flow_C9AC ; PRG $09A0 | CPU $C9A0 | D0 0A + lda SelectedPlayerIndex ; PRG $09A2 | CPU $C9A2 | A5 40 + beq Flow_C9AA ; PRG $09A4 | CPU $C9A4 | F0 04 + lda ObstacleAnimationTimer ; PRG $09A6 | CPU $C9A6 | A5 94 + bne Flow_C9AC ; PRG $09A8 | CPU $C9A8 | D0 02 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C9 AA. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C9AA: + ldy #$0B ; PRG $09AA | CPU $C9AA | A0 0B +; ----------------------------------------------------------------------------- +; Global purpose: Flow C9 AC. +; Local behavior: Reads implicit CPU state or none observed; mutates CurrentScreenState. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C9AC: + sty CurrentScreenState ; PRG $09AC | CPU $C9AC | 84 3B +; ----------------------------------------------------------------------------- +; Global purpose: Flow C9 AE. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C9AE: + rts ; PRG $09AE | CPU $C9AE | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C9AF. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateScreenGameplayState11: + lda SelectedScreenVariant ; PRG $09AF | CPU $C9AF | A5 41 + asl a ; PRG $09B1 | CPU $C9B1 | 0A + tay ; PRG $09B2 | CPU $C9B2 | A8 + lda PlayerOrActorX ; PRG $09B3 | CPU $C9B3 | A5 81 + sta PlayerStartXTable,y ; PRG $09B5 | CPU $C9B5 | 99 8C 00 + lda PlayerOrActorY ; PRG $09B8 | CPU $C9B8 | A5 82 + sta PlayerStartYTable,y ; PRG $09BA | CPU $C9BA | 99 8D 00 + lda #$01 ; PRG $09BD | CPU $C9BD | A9 01 + sta GameMode ; PRG $09BF | CPU $C9BF | 85 3A + jsr ClearAudioRequestFlags ; PRG $09C1 | CPU $C9C1 | 20 56 C6 + sta PlayerModeOrScreenPhase ; PRG $09C4 | CPU $C9C4 | 85 3C + rts ; PRG $09C6 | CPU $C9C6 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Pass 2 control-flow entry at CPU $C9C7. +; Local behavior: Executes the decoded instruction sequence at this entry point. +; Parameters: Determined by callers; refined in Pass 3. +; Returns: According to the decoded control flow. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateScreenGameplayState12: + lda GameplayTimer ; PRG $09C7 | CPU $C9C7 | A5 21 + beq Flow_C9DD ; PRG $09C9 | CPU $C9C9 | F0 12 + cmp #$0A ; PRG $09CB | CPU $C9CB | C9 0A + bne Flow_C9EA ; PRG $09CD | CPU $C9CD | D0 1B + jsr ClearNmiWorkMode ; PRG $09CF | CPU $C9CF | 20 73 C0 + lda #$1E ; PRG $09D2 | CPU $C9D2 | A9 1E + sta PPUMASK ; PRG $09D4 | CPU $C9D4 | 8D 01 20 + lda #$90 ; PRG $09D7 | CPU $C9D7 | A9 90 + sta PPUCTRL ; PRG $09D9 | CPU $C9D9 | 8D 00 20 + rts ; PRG $09DC | CPU $C9DC | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C9 DD. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C9DD: + ldx #$07 ; PRG $09DD | CPU $C9DD | A2 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow C9 DF. +; Local behavior: Reads SavedGameplayTimerArray, Flow_C9DF, ReturnScreenState; mutates GameplayTimerArray, CurrentScreenState. +; Parameters: SavedGameplayTimerArray, Flow_C9DF, ReturnScreenState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C9DF: + lda SavedGameplayTimerArray,x ; PRG $09DF | CPU $C9DF | B5 28 + sta GameplayTimerArray,x ; PRG $09E1 | CPU $C9E1 | 95 20 + dex ; PRG $09E3 | CPU $C9E3 | CA + bpl Flow_C9DF ; PRG $09E4 | CPU $C9E4 | 10 F9 + lda ReturnScreenState ; PRG $09E6 | CPU $C9E6 | A5 3D + sta CurrentScreenState ; PRG $09E8 | CPU $C9E8 | 85 3B +; ----------------------------------------------------------------------------- +; Global purpose: Flow C9 EA. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: .byte $85,$B0,$85,$B3,$85,$B7,$A9,$68,$85,$B8,$A9,$2C,$85,$B9,$A9,$10; .byte $85,$BA,$A9,$18,$85,$B2,$60,$A9,$B0,$85,$A8,$A9,$00,$85,$A9,$C6; .byte $B3,$D0,$0A,$A5,$B2,$85,$B3,$A5,$B7,$49,$40,$85,$B7,$4C,$17,$C2. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_C9EA: + rts ; PRG $09EA | CPU $C9EA | 60 + .byte $20,$7D,$C0,$20,$A2,$C1,$20,$EA,$C1,$20,$73,$C0,$A2,$9E,$A0,$F0 ; PRG $09EB | CPU $C9EB + .byte $20,$DC,$C3,$A9,$04,$85,$34,$20,$F5,$CA,$A9,$01,$85,$37,$A0,$03 ; PRG $09FB | CPU $C9FB + .byte $B9,$FC,$F7,$99,$00,$02,$88,$10,$F7,$E6,$3C,$A4,$39,$D0,$08,$A0 ; PRG $0A0B | CPU $CA0B + .byte $03,$84,$39,$A9,$2F,$D0,$04,$C6,$39,$A9,$25,$85,$25,$4C,$84,$C0 ; PRG $0A1B | CPU $CA1B + .byte $A4,$25,$F0,$0F,$C0,$2B,$D0,$08,$A9,$05,$85,$FB,$A0,$28,$84,$25 ; PRG $0A2B | CPU $CA2B + .byte $4C,$12,$CB,$E6,$3C,$60,$20,$63,$C6,$A9,$01,$85,$41,$20,$AB,$C6 ; PRG $0A3B | CPU $CA3B + .byte $A0,$00,$84,$92,$A9,$2D,$85,$60,$E6,$3C,$60,$E6,$3C,$4C,$EB,$C6 ; PRG $0A4B | CPU $CA4B + .byte $E6,$3C,$4C,$55,$C7,$20,$C2,$C7,$A9,$00,$85,$3F,$85,$3E,$85,$27 ; PRG $0A5B | CPU $CA5B + .byte $E6,$3C,$60,$A5,$1A,$2A,$2A,$65,$1C,$65,$27,$8D,$F0,$06,$A5,$3E ; PRG $0A6B | CPU $CA6B + .byte $F0,$0C,$C6,$3E,$AD,$10,$03,$29,$7F,$85,$1B,$4C,$9D,$CA,$A4,$3F ; PRG $0A7B | CPU $CA7B + .byte $B9,$AE,$CA,$C9,$AA,$F0,$15,$85,$1B,$C8,$B9,$AE,$CA,$85,$3E,$C8 ; PRG $0A8B | CPU $CA8B + .byte $84,$3F,$20,$DD,$C7,$A5,$3C,$C9,$07,$F0,$03,$60,$E6,$3C,$A9,$08 ; PRG $0A9B | CPU $CA9B + .byte $85,$25,$60,$00,$D0,$C8,$60,$80,$20,$C8,$98,$C4,$82,$80,$03,$C1 ; PRG $0AAB | CPU $CAAB + .byte $38,$02,$38,$88,$20,$80,$38,$C1,$38,$C2,$53,$C1,$08,$C8,$10,$C1 ; PRG $0ABB | CPU $CABB + .byte $20,$C4,$10,$C2,$30,$C8,$80,$C1,$30,$C4,$14,$C1,$20,$C0,$FF,$C0 ; PRG $0ACB | CPU $CACB + .byte $80,$C2,$14,$C8,$FF,$C8,$80,$C4,$60,$C1,$10,$C2,$14,$C0,$FF,$AA ; PRG $0ADB | CPU $CADB + .byte $A5,$25,$D0,$05,$20,$56,$C6,$85,$3C,$60,$A9,$4A,$85,$B6,$A9,$01 ; PRG $0AEB | CPU $CAEB + .byte $85,$B0,$85,$B3,$85,$B7,$A9,$68,$85,$B8,$A9,$2C,$85,$B9,$A9,$10 ; PRG $0AFB | CPU $CAFB + .byte $85,$BA,$A9,$18,$85,$B2,$60,$A9,$B0,$85,$A8,$A9,$00,$85,$A9,$C6 ; PRG $0B0B | CPU $CB0B + .byte $B3,$D0,$0A,$A5,$B2,$85,$B3,$A5,$B7,$49,$40,$85,$B7,$4C,$17,$C2 ; PRG $0B1B | CPU $CB1B +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 0300 CB2 B. +; Local behavior: Reads ScreenObjectMode, Flow_CB5F; mutates Ram_0300, Ram_0307, Ram_0302, Ram_0305, Ram_030E, Ram_0301, Ram_0306, Ram_0312. +; Parameters: ScreenObjectMode, Flow_CB5F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_0300_CB2B: + lda #$01 ; PRG $0B2B | CPU $CB2B | A9 01 + sta Ram_0300 ; PRG $0B2D | CPU $CB2D | 8D 00 03 + sta Ram_0307 ; PRG $0B30 | CPU $CB30 | 8D 07 03 + lda #$04 ; PRG $0B33 | CPU $CB33 | A9 04 + sta Ram_0302 ; PRG $0B35 | CPU $CB35 | 8D 02 03 + lda #$26 ; PRG $0B38 | CPU $CB38 | A9 26 + sta Ram_0305 ; PRG $0B3A | CPU $CB3A | 8D 05 03 + lda #$00 ; PRG $0B3D | CPU $CB3D | A9 00 + sta Ram_030E ; PRG $0B3F | CPU $CB3F | 8D 0E 03 + sta Ram_0301 ; PRG $0B42 | CPU $CB42 | 8D 01 03 + sta Ram_0306 ; PRG $0B45 | CPU $CB45 | 8D 06 03 + sta Ram_0312 ; PRG $0B48 | CPU $CB48 | 8D 12 03 + lda #$C8 ; PRG $0B4B | CPU $CB4B | A9 C8 + sta Ram_0308 ; PRG $0B4D | CPU $CB4D | 8D 08 03 + lda #$80 ; PRG $0B50 | CPU $CB50 | A9 80 + sta Ram_0309 ; PRG $0B52 | CPU $CB52 | 8D 09 03 + ldy #$98 ; PRG $0B55 | CPU $CB55 | A0 98 + lda ScreenObjectMode ; PRG $0B57 | CPU $CB57 | A5 62 + cmp #$02 ; PRG $0B59 | CPU $CB59 | C9 02 + bne Flow_CB5F ; PRG $0B5B | CPU $CB5B | D0 02 + ldy #$88 ; PRG $0B5D | CPU $CB5D | A0 88 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CB5 F. +; Local behavior: Reads TransformPackedValue_D263, UpdateRam_036C_D6F3, ComputeOrDispatch_CE77, UpdateRam_0380_DDFD, UpdateZp_50_DE62; mutates Ram_030A, Ram_030D, Ram_0340, Ram_0350, Ram_034A, Ram_035A. +; Parameters: TransformPackedValue_D263, UpdateRam_036C_D6F3, ComputeOrDispatch_CE77, UpdateRam_0380_DDFD, UpdateZp_50_DE62. +; Returns: returns to caller; flags/register result depends on final instructions: jsr UpdateRam_0380_DDFD; jsr UpdateZp_50_DE62; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CB5F: + sty Ram_030A ; PRG $0B5F | CPU $CB5F | 8C 0A 03 + lda #$0A ; PRG $0B62 | CPU $CB62 | A9 0A + sta Ram_030D ; PRG $0B64 | CPU $CB64 | 8D 0D 03 + lda #$00 ; PRG $0B67 | CPU $CB67 | A9 00 + sta Ram_0340 ; PRG $0B69 | CPU $CB69 | 8D 40 03 + sta Ram_0350 ; PRG $0B6C | CPU $CB6C | 8D 50 03 + lda #$10 ; PRG $0B6F | CPU $CB6F | A9 10 + sta Ram_034A ; PRG $0B71 | CPU $CB71 | 8D 4A 03 + lda #$20 ; PRG $0B74 | CPU $CB74 | A9 20 + sta Ram_035A ; PRG $0B76 | CPU $CB76 | 8D 5A 03 + jsr TransformPackedValue_D263 ; PRG $0B79 | CPU $CB79 | 20 63 D2 + jsr UpdateRam_036C_D6F3 ; PRG $0B7C | CPU $CB7C | 20 F3 D6 + jsr ComputeOrDispatch_CE77 ; PRG $0B7F | CPU $CB7F | 20 77 CE + jsr UpdateRam_0380_DDFD ; PRG $0B82 | CPU $CB82 | 20 FD DD + jsr UpdateZp_50_DE62 ; PRG $0B85 | CPU $CB85 | 20 62 DE + rts ; PRG $0B88 | CPU $CB88 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp A8 CB89. +; Local behavior: Reads ControllerPressedOrScriptInput, SelectedActorIndex, Flow_CB99, SecondControllerPressed; mutates ObjectRecordPointerLo, ObjectRecordPointerHi. +; Parameters: ControllerPressedOrScriptInput, SelectedActorIndex, Flow_CB99, SecondControllerPressed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_A8_CB89: + lda #$00 ; PRG $0B89 | CPU $CB89 | A9 00 + sta ObjectRecordPointerLo ; PRG $0B8B | CPU $CB8B | 85 A8 + lda #$03 ; PRG $0B8D | CPU $CB8D | A9 03 + sta ObjectRecordPointerHi ; PRG $0B8F | CPU $CB8F | 85 A9 + lda ControllerPressedOrScriptInput ; PRG $0B91 | CPU $CB91 | A5 1B + ldy SelectedActorIndex ; PRG $0B93 | CPU $CB93 | A4 43 + beq Flow_CB99 ; PRG $0B95 | CPU $CB95 | F0 02 + lda SecondControllerPressed ; PRG $0B97 | CPU $CB97 | A5 1D +; ----------------------------------------------------------------------------- +; Global purpose: Flow CB99. +; Local behavior: Reads ScreenCollisionState, Flow_CBB7, Flow_CBA8, UpdateZp_54_CFB1; mutates CollisionExtent, Ram_0310. +; Parameters: ScreenCollisionState, Flow_CBB7, Flow_CBA8, UpdateZp_54_CFB1. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CB99: + sta CollisionExtent ; PRG $0B99 | CPU $CB99 | 85 C0 + sta Ram_0310 ; PRG $0B9B | CPU $CB9B | 8D 10 03 + ldy ScreenCollisionState ; PRG $0B9E | CPU $CB9E | A4 44 + beq Flow_CBB7 ; PRG $0BA0 | CPU $CBA0 | F0 15 + dey ; PRG $0BA2 | CPU $CBA2 | 88 + bne Flow_CBA8 ; PRG $0BA3 | CPU $CBA3 | D0 03 + jsr UpdateZp_54_CFB1 ; PRG $0BA5 | CPU $CBA5 | 20 B1 CF +; ----------------------------------------------------------------------------- +; Global purpose: Flow CBA8. +; Local behavior: Reads UpdateRam_0312_CBB8, ComputeOrDispatch_CC65, ComputeOrDispatch_C2B4, UpdateRam_0304_CDAC, LoadObjectSpriteRenderState; mutates no direct memory mutation observed. +; Parameters: UpdateRam_0312_CBB8, ComputeOrDispatch_CC65, ComputeOrDispatch_C2B4, UpdateRam_0304_CDAC, LoadObjectSpriteRenderState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CBA8: + jsr UpdateRam_0312_CBB8 ; PRG $0BA8 | CPU $CBA8 | 20 B8 CB + jsr ComputeOrDispatch_CC65 ; PRG $0BAB | CPU $CBAB | 20 65 CC + jsr ComputeOrDispatch_C2B4 ; PRG $0BAE | CPU $CBAE | 20 B4 C2 + jsr UpdateRam_0304_CDAC ; PRG $0BB1 | CPU $CBB1 | 20 AC CD + jsr LoadObjectSpriteRenderState ; PRG $0BB4 | CPU $CBB4 | 20 17 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CBB7. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CBB7: + rts ; PRG $0BB7 | CPU $CBB7 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 0312 CBB8. +; Local behavior: Reads Ram_0300, Flow_CBF5, Ram_0312, Flow_CBD1, SelectedScreenVariant, Flow_CBCF; mutates Ram_0312. +; Parameters: Ram_0300, Flow_CBF5, Ram_0312, Flow_CBD1, SelectedScreenVariant, Flow_CBCF. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_0312_CBB8: + lda Ram_0300 ; PRG $0BB8 | CPU $CBB8 | AD 00 03 + cmp #$01 ; PRG $0BBB | CPU $CBBB | C9 01 + bne Flow_CBF5 ; PRG $0BBD | CPU $CBBD | D0 36 + lda Ram_0312 ; PRG $0BBF | CPU $CBBF | AD 12 03 + beq Flow_CBD1 ; PRG $0BC2 | CPU $CBC2 | F0 0D + dec Ram_0312 ; PRG $0BC4 | CPU $CBC4 | CE 12 03 + lda #$74 ; PRG $0BC7 | CPU $CBC7 | A9 74 + ldy SelectedScreenVariant ; PRG $0BC9 | CPU $CBC9 | A4 41 + beq Flow_CBCF ; PRG $0BCB | CPU $CBCB | F0 02 + lda #$74 ; PRG $0BCD | CPU $CBCD | A9 74 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CBCF. +; Local behavior: Reads implicit CPU state or none observed; mutates GameplayObjectAnimation. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CBCF: + sta GameplayObjectAnimation ; PRG $0BCF | CPU $CBCF | 85 55 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CBD1. +; Local behavior: Reads FrameCounter, Flow_CBDD, GameplayObjectAnimation; mutates GameplayObjectAnimation. +; Parameters: FrameCounter, Flow_CBDD, GameplayObjectAnimation. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CBD1: + lda FrameCounter ; PRG $0BD1 | CPU $CBD1 | A5 27 + and #$07 ; PRG $0BD3 | CPU $CBD3 | 29 07 + bne Flow_CBDD ; PRG $0BD5 | CPU $CBD5 | D0 06 + lda GameplayObjectAnimation ; PRG $0BD7 | CPU $CBD7 | A5 55 + beq Flow_CBDD ; PRG $0BD9 | CPU $CBD9 | F0 02 + dec GameplayObjectAnimation ; PRG $0BDB | CPU $CBDB | C6 55 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CBDD. +; Local behavior: Reads Ram_030E, Flow_CBF5; mutates Ram_030E, ScreenObjectCounter, Ram_0301, Ram_0300. +; Parameters: Ram_030E, Flow_CBF5. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CBDD: + lda Ram_030E ; PRG $0BDD | CPU $CBDD | AD 0E 03 + beq Flow_CBF5 ; PRG $0BE0 | CPU $CBE0 | F0 13 + lda #$00 ; PRG $0BE2 | CPU $CBE2 | A9 00 + sta Ram_030E ; PRG $0BE4 | CPU $CBE4 | 8D 0E 03 + lda #$01 ; PRG $0BE7 | CPU $CBE7 | A9 01 + sta ScreenObjectCounter ; PRG $0BE9 | CPU $CBE9 | 85 65 + lda #$00 ; PRG $0BEB | CPU $CBEB | A9 00 + sta Ram_0301 ; PRG $0BED | CPU $CBED | 8D 01 03 + lda #$02 ; PRG $0BF0 | CPU $CBF0 | A9 02 + sta Ram_0300 ; PRG $0BF2 | CPU $CBF2 | 8D 00 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CBF5. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CBF5: + rts ; PRG $0BF5 | CPU $CBF5 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CBF6. +; Local behavior: Reads CoordinateValue, Ram_0303; mutates Ram_0308, Ram_0301, Ram_030B, Ram_030C, Ram_0303. +; Parameters: CoordinateValue, Ram_0303. +; Returns: returns to caller; flags/register result depends on final instructions: sta Ram_030C; inc Ram_0303; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CBF6: + lda CoordinateValue ; PRG $0BF6 | CPU $CBF6 | A5 13 + sta Ram_0308 ; PRG $0BF8 | CPU $CBF8 | 8D 08 03 + lda #$00 ; PRG $0BFB | CPU $CBFB | A9 00 + sta Ram_0301 ; PRG $0BFD | CPU $CBFD | 8D 01 03 + sta Ram_030B ; PRG $0C00 | CPU $CC00 | 8D 0B 03 + sta Ram_030C ; PRG $0C03 | CPU $CC03 | 8D 0C 03 + inc Ram_0303 ; PRG $0C06 | CPU $CC06 | EE 03 03 + rts ; PRG $0C09 | CPU $CC09 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CC0 A. +; Local behavior: Reads Flow_CC22; mutates no direct memory mutation observed. +; Parameters: Flow_CC22. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CC0A: + lda #$80 ; PRG $0C0A | CPU $CC0A | A9 80 + ldx #$00 ; PRG $0C0C | CPU $CC0C | A2 00 + ldy #$08 ; PRG $0C0E | CPU $CC0E | A0 08 + bne Flow_CC22 ; PRG $0C10 | CPU $CC10 | D0 10 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch CC12. +; Local behavior: Reads Flow_CC19; mutates no direct memory mutation observed. +; Parameters: Flow_CC19. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_CC12: + lda #$00 ; PRG $0C12 | CPU $CC12 | A9 00 + beq Flow_CC19 ; PRG $0C14 | CPU $CC14 | F0 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CC16. +; Local behavior: Reads Ram_0301; mutates no direct memory mutation observed. +; Parameters: Ram_0301. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CC16: + lda Ram_0301 ; PRG $0C16 | CPU $CC16 | AD 01 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CC19. +; Local behavior: Reads Ram_0308; mutates Ram_0308. +; Parameters: Ram_0308. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CC19: + inc Ram_0308 ; PRG $0C19 | CPU $CC19 | EE 08 03 + ora #$40 ; PRG $0C1C | CPU $CC1C | 09 40 + ldx #$12 ; PRG $0C1E | CPU $CC1E | A2 12 + ldy #$10 ; PRG $0C20 | CPU $CC20 | A0 10 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CC22. +; Local behavior: Reads implicit CPU state or none observed; mutates AudioEffectRequest, Ram_0301, Ram_030B, Ram_0303. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$01; sta Ram_0303; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CC22: + sty AudioEffectRequest ; PRG $0C22 | CPU $CC22 | 84 FE + sta Ram_0301 ; PRG $0C24 | CPU $CC24 | 8D 01 03 + stx Ram_030B ; PRG $0C27 | CPU $CC27 | 8E 0B 03 + lda #$01 ; PRG $0C2A | CPU $CC2A | A9 01 + sta Ram_0303 ; PRG $0C2C | CPU $CC2C | 8D 03 03 + rts ; PRG $0C2F | CPU $CC2F | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CC30. +; Local behavior: Reads ComputeOrDispatch_CC12; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_CC12. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CC30: + jsr ComputeOrDispatch_CC12 ; PRG $0C30 | CPU $CC30 | 20 12 CC +; ----------------------------------------------------------------------------- +; Global purpose: Flow CC33. +; Local behavior: Reads CalculateAndClampValue_CDF6, Flow_CBF6, Ram_0301, Flow_CC45, Flow_CC4D; mutates no direct memory mutation observed. +; Parameters: CalculateAndClampValue_CDF6, Flow_CBF6, Ram_0301, Flow_CC45, Flow_CC4D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CC33: + jsr CalculateAndClampValue_CDF6 ; PRG $0C33 | CPU $CC33 | 20 F6 CD + bcc Flow_CBF6 ; PRG $0C36 | CPU $CC36 | 90 BE + ldy #$01 ; PRG $0C38 | CPU $CC38 | A0 01 + lda Ram_0301 ; PRG $0C3A | CPU $CC3A | AD 01 03 + lsr a ; PRG $0C3D | CPU $CC3D | 4A + bcs Flow_CC45 ; PRG $0C3E | CPU $CC3E | B0 05 + lsr a ; PRG $0C40 | CPU $CC40 | 4A + bcc Flow_CC4D ; PRG $0C41 | CPU $CC41 | 90 0A + ldy #$FF ; PRG $0C43 | CPU $CC43 | A0 FF +; ----------------------------------------------------------------------------- +; Global purpose: Flow CC45. +; Local behavior: Reads Ram_0309; mutates Ram_0309. +; Parameters: Ram_0309. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CC45: + tya ; PRG $0C45 | CPU $CC45 | 98 + clc ; PRG $0C46 | CPU $CC46 | 18 + adc Ram_0309 ; PRG $0C47 | CPU $CC47 | 6D 09 03 + sta Ram_0309 ; PRG $0C4A | CPU $CC4A | 8D 09 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CC4 D. +; Local behavior: Reads Ram_030B, IndexedGameplayLookupTable_CD85, Flow_CC30, Ram_0308, Ram_0303; mutates Ram_030B, Ram_0308, Ram_0303. +; Parameters: Ram_030B, IndexedGameplayLookupTable_CD85, Flow_CC30, Ram_0308, Ram_0303. +; Returns: returns to caller; flags/register result depends on final instructions: sta Ram_0308; inc Ram_0303; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CC4D: + ldy Ram_030B ; PRG $0C4D | CPU $CC4D | AC 0B 03 + inc Ram_030B ; PRG $0C50 | CPU $CC50 | EE 0B 03 + lda IndexedGameplayLookupTable_CD85,y ; PRG $0C53 | CPU $CC53 | B9 85 CD + cmp #$AA ; PRG $0C56 | CPU $CC56 | C9 AA + beq Flow_CC30 ; PRG $0C58 | CPU $CC58 | F0 D6 + clc ; PRG $0C5A | CPU $CC5A | 18 + adc Ram_0308 ; PRG $0C5B | CPU $CC5B | 6D 08 03 + sta Ram_0308 ; PRG $0C5E | CPU $CC5E | 8D 08 03 + inc Ram_0303 ; PRG $0C61 | CPU $CC61 | EE 03 03 + rts ; PRG $0C64 | CPU $CC64 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch CC65. +; Local behavior: Reads Ram_0300, Flow_CC6F, Continuation_CD2E; mutates no direct memory mutation observed. +; Parameters: Ram_0300, Flow_CC6F, Continuation_CD2E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_CC65: + lda Ram_0300 ; PRG $0C65 | CPU $CC65 | AD 00 03 + cmp #$01 ; PRG $0C68 | CPU $CC68 | C9 01 + beq Flow_CC6F ; PRG $0C6A | CPU $CC6A | F0 03 + jmp Continuation_CD2E ; PRG $0C6C | CPU $CC6C | 4C 2E CD +; ----------------------------------------------------------------------------- +; Global purpose: Flow CC6 F. +; Local behavior: Reads Ram_0301, Flow_CC4D, Flow_CC33, CollisionExtent, Flow_CC0A, Flow_CC89, Ram_0308, ComputeOrDispatch_CC12; mutates no direct memory mutation observed. +; Parameters: Ram_0301, Flow_CC4D, Flow_CC33, CollisionExtent, Flow_CC0A, Flow_CC89, Ram_0308, ComputeOrDispatch_CC12. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CC6F: + bit Ram_0301 ; PRG $0C6F | CPU $CC6F | 2C 01 03 + bmi Flow_CC4D ; PRG $0C72 | CPU $CC72 | 30 D9 + bvs Flow_CC33 ; PRG $0C74 | CPU $CC74 | 70 BD + lda CollisionExtent ; PRG $0C76 | CPU $CC76 | A5 C0 + and #$0C ; PRG $0C78 | CPU $CC78 | 29 0C + cmp #$08 ; PRG $0C7A | CPU $CC7A | C9 08 + beq Flow_CC0A ; PRG $0C7C | CPU $CC7C | F0 8C + cmp #$04 ; PRG $0C7E | CPU $CC7E | C9 04 + bne Flow_CC89 ; PRG $0C80 | CPU $CC80 | D0 07 + lda Ram_0308 ; PRG $0C82 | CPU $CC82 | AD 08 03 + cmp #$C8 ; PRG $0C85 | CPU $CC85 | C9 C8 + bne ComputeOrDispatch_CC12 ; PRG $0C87 | CPU $CC87 | D0 89 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CC89. +; Local behavior: Reads CalculateAndClampValue_CDF6, Flow_CC16, CollisionExtent, Flow_CCF6, Ram_0301, Flow_CCA3, ObjectSlotOrFieldIndex, Flow_CCA8; mutates ObjectSlotOrFieldIndex. +; Parameters: CalculateAndClampValue_CDF6, Flow_CC16, CollisionExtent, Flow_CCF6, Ram_0301, Flow_CCA3, ObjectSlotOrFieldIndex, Flow_CCA8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CC89: + jsr CalculateAndClampValue_CDF6 ; PRG $0C89 | CPU $CC89 | 20 F6 CD + bcs Flow_CC16 ; PRG $0C8C | CPU $CC8C | B0 88 + lda CollisionExtent ; PRG $0C8E | CPU $CC8E | A5 C0 + and #$03 ; PRG $0C90 | CPU $CC90 | 29 03 + sta ObjectSlotOrFieldIndex ; PRG $0C92 | CPU $CC92 | 85 0E + beq Flow_CCF6 ; PRG $0C94 | CPU $CC94 | F0 60 + lda Ram_0301 ; PRG $0C96 | CPU $CC96 | AD 01 03 + and #$03 ; PRG $0C99 | CPU $CC99 | 29 03 + beq Flow_CCA3 ; PRG $0C9B | CPU $CC9B | F0 06 + and ObjectSlotOrFieldIndex ; PRG $0C9D | CPU $CC9D | 25 0E + bne Flow_CCA8 ; PRG $0C9F | CPU $CC9F | D0 07 + bne Flow_CCF2 ; PRG $0CA1 | CPU $CCA1 | D0 4F +; ----------------------------------------------------------------------------- +; Global purpose: Flow CCA3. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_0303. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CCA3: + lda #$01 ; PRG $0CA3 | CPU $CCA3 | A9 01 + sta Ram_0303 ; PRG $0CA5 | CPU $CCA5 | 8D 03 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CCA8. +; Local behavior: Reads Ram_030B, Flow_CCBB; mutates Ram_030C, Ram_030B. +; Parameters: Ram_030B, Flow_CCBB. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CCA8: + lda #$00 ; PRG $0CA8 | CPU $CCA8 | A9 00 + sta Ram_030C ; PRG $0CAA | CPU $CCAA | 8D 0C 03 + ldy #$03 ; PRG $0CAD | CPU $CCAD | A0 03 + lda Ram_030B ; PRG $0CAF | CPU $CCAF | AD 0B 03 + cmp #$05 ; PRG $0CB2 | CPU $CCB2 | C9 05 + beq Flow_CCBB ; PRG $0CB4 | CPU $CCB4 | F0 05 + inc Ram_030B ; PRG $0CB6 | CPU $CCB6 | EE 0B 03 + ldy #$01 ; PRG $0CB9 | CPU $CCB9 | A0 01 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CCBB. +; Local behavior: Reads SignedOffsetAccumulator, Flow_CCC9, FrameCounter; mutates SignedOffsetAccumulator. +; Parameters: SignedOffsetAccumulator, Flow_CCC9, FrameCounter. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CCBB: + sty SignedOffsetAccumulator ; PRG $0CBB | CPU $CCBB | 84 10 + lsr SignedOffsetAccumulator ; PRG $0CBD | CPU $CCBD | 46 10 + bcc Flow_CCC9 ; PRG $0CBF | CPU $CCBF | 90 08 + lda FrameCounter ; PRG $0CC1 | CPU $CCC1 | A5 27 + and #$01 ; PRG $0CC3 | CPU $CCC3 | 29 01 + bne Flow_CCC9 ; PRG $0CC5 | CPU $CCC5 | D0 02 + inc SignedOffsetAccumulator ; PRG $0CC7 | CPU $CCC7 | E6 10 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CCC9. +; Local behavior: Reads CollisionExtent, Flow_CCD7, Ram_0309, SignedOffsetAccumulator, Continuation_CCDD; mutates no direct memory mutation observed. +; Parameters: CollisionExtent, Flow_CCD7, Ram_0309, SignedOffsetAccumulator, Continuation_CCDD. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CCC9: + lda CollisionExtent ; PRG $0CC9 | CPU $CCC9 | A5 C0 + lsr a ; PRG $0CCB | CPU $CCCB | 4A + bcc Flow_CCD7 ; PRG $0CCC | CPU $CCCC | 90 09 + lda Ram_0309 ; PRG $0CCE | CPU $CCCE | AD 09 03 + clc ; PRG $0CD1 | CPU $CCD1 | 18 + adc SignedOffsetAccumulator ; PRG $0CD2 | CPU $CCD2 | 65 10 + jmp Continuation_CCDD ; PRG $0CD4 | CPU $CCD4 | 4C DD CC +; ----------------------------------------------------------------------------- +; Global purpose: Flow CCD7. +; Local behavior: Reads Ram_0309, SignedOffsetAccumulator; mutates no direct memory mutation observed. +; Parameters: Ram_0309, SignedOffsetAccumulator. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CCD7: + lda Ram_0309 ; PRG $0CD7 | CPU $CCD7 | AD 09 03 + sec ; PRG $0CDA | CPU $CCDA | 38 + sbc SignedOffsetAccumulator ; PRG $0CDB | CPU $CCDB | E5 10 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation CCDD. +; Local behavior: Reads UpdateZp_13_CDCE, Flow_CCF2, FrameCounter, Flow_CD28; mutates Ram_0309, AudioPendingFlags. +; Parameters: UpdateZp_13_CDCE, Flow_CCF2, FrameCounter, Flow_CD28. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_CCDD: + tay ; PRG $0CDD | CPU $CCDD | A8 + jsr UpdateZp_13_CDCE ; PRG $0CDE | CPU $CCDE | 20 CE CD + bcs Flow_CCF2 ; PRG $0CE1 | CPU $CCE1 | B0 0F + sty Ram_0309 ; PRG $0CE3 | CPU $CCE3 | 8C 09 03 + lda FrameCounter ; PRG $0CE6 | CPU $CCE6 | A5 27 + and #$07 ; PRG $0CE8 | CPU $CCE8 | 29 07 + bne Flow_CD28 ; PRG $0CEA | CPU $CCEA | D0 3C + lda #$08 ; PRG $0CEC | CPU $CCEC | A9 08 + sta AudioPendingFlags ; PRG $0CEE | CPU $CCEE | 85 FD + bne Flow_CD28 ; PRG $0CF0 | CPU $CCF0 | D0 36 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CCF2. +; Local behavior: Reads implicit CPU state or none observed; mutates ObjectSlotOrFieldIndex. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CCF2: + ldx #$00 ; PRG $0CF2 | CPU $CCF2 | A2 00 + stx ObjectSlotOrFieldIndex ; PRG $0CF4 | CPU $CCF4 | 86 0E +; ----------------------------------------------------------------------------- +; Global purpose: Flow CCF6. +; Local behavior: Reads Ram_0303, Ram_030C, Flow_CD10; mutates Ram_030B, Ram_0303, Ram_030C, Ram_0306. +; Parameters: Ram_0303, Ram_030C, Flow_CD10. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CCF6: + lda #$00 ; PRG $0CF6 | CPU $CCF6 | A9 00 + sta Ram_030B ; PRG $0CF8 | CPU $CCF8 | 8D 0B 03 + inc Ram_0303 ; PRG $0CFB | CPU $CCFB | EE 03 03 + inc Ram_030C ; PRG $0CFE | CPU $CCFE | EE 0C 03 + lda Ram_030C ; PRG $0D01 | CPU $CD01 | AD 0C 03 + cmp #$80 ; PRG $0D04 | CPU $CD04 | C9 80 + bne Flow_CD10 ; PRG $0D06 | CPU $CD06 | D0 08 + dec Ram_030C ; PRG $0D08 | CPU $CD08 | CE 0C 03 + lda #$08 ; PRG $0D0B | CPU $CD0B | A9 08 + sta Ram_0306 ; PRG $0D0D | CPU $CD0D | 8D 06 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CD10. +; Local behavior: Reads Ram_0304, Flow_CD28, Ram_0306, Flow_CD23; mutates Ram_0303. +; Parameters: Ram_0304, Flow_CD28, Ram_0306, Flow_CD23. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CD10: + lda Ram_0304 ; PRG $0D10 | CPU $CD10 | AD 04 03 + cmp #$08 ; PRG $0D13 | CPU $CD13 | C9 08 + bne Flow_CD28 ; PRG $0D15 | CPU $CD15 | D0 11 + lda Ram_0306 ; PRG $0D17 | CPU $CD17 | AD 06 03 + cmp #$08 ; PRG $0D1A | CPU $CD1A | C9 08 + bne Flow_CD23 ; PRG $0D1C | CPU $CD1C | D0 05 + lda #$01 ; PRG $0D1E | CPU $CD1E | A9 01 + sta Ram_0303 ; PRG $0D20 | CPU $CD20 | 8D 03 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CD23. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_030C. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CD23: + lda #$00 ; PRG $0D23 | CPU $CD23 | A9 00 + sta Ram_030C ; PRG $0D25 | CPU $CD25 | 8D 0C 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CD28. +; Local behavior: Reads ObjectSlotOrFieldIndex; mutates Ram_0301. +; Parameters: ObjectSlotOrFieldIndex. +; Returns: returns to caller; flags/register result depends on final instructions: lda ObjectSlotOrFieldIndex; sta Ram_0301; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CD28: + lda ObjectSlotOrFieldIndex ; PRG $0D28 | CPU $CD28 | A5 0E + sta Ram_0301 ; PRG $0D2A | CPU $CD2A | 8D 01 03 + rts ; PRG $0D2D | CPU $CD2D | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation CD2 E. +; Local behavior: Reads Ram_0301, Flow_CD40, Flow_CD5B, Flow_CD64, Flow_CD68, Flow_CD7B; mutates no direct memory mutation observed. +; Parameters: Ram_0301, Flow_CD40, Flow_CD5B, Flow_CD64, Flow_CD68, Flow_CD7B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_CD2E: + ldx #$00 ; PRG $0D2E | CPU $CD2E | A2 00 + ldy Ram_0301 ; PRG $0D30 | CPU $CD30 | AC 01 03 + beq Flow_CD40 ; PRG $0D33 | CPU $CD33 | F0 0B + dey ; PRG $0D35 | CPU $CD35 | 88 + beq Flow_CD5B ; PRG $0D36 | CPU $CD36 | F0 23 + dey ; PRG $0D38 | CPU $CD38 | 88 + beq Flow_CD64 ; PRG $0D39 | CPU $CD39 | F0 29 + dey ; PRG $0D3B | CPU $CD3B | 88 + beq Flow_CD68 ; PRG $0D3C | CPU $CD3C | F0 2A + bne Flow_CD7B ; PRG $0D3E | CPU $CD3E | D0 3B +; ----------------------------------------------------------------------------- +; Global purpose: Flow CD40. +; Local behavior: Reads Ram_0301; mutates Ram_0303, Ram_0305, Ram_030C, Ram_0301, AudioChannelRequest, AudioRequestFlags. +; Parameters: Ram_0301. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$04; sta AudioRequestFlags; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CD40: + lda #$01 ; PRG $0D40 | CPU $CD40 | A9 01 + sta Ram_0303 ; PRG $0D42 | CPU $CD42 | 8D 03 03 + lda #$32 ; PRG $0D45 | CPU $CD45 | A9 32 + sta Ram_0305 ; PRG $0D47 | CPU $CD47 | 8D 05 03 + lda #$40 ; PRG $0D4A | CPU $CD4A | A9 40 + sta Ram_030C ; PRG $0D4C | CPU $CD4C | 8D 0C 03 + inc Ram_0301 ; PRG $0D4F | CPU $CD4F | EE 01 03 + lda #$01 ; PRG $0D52 | CPU $CD52 | A9 01 + sta AudioChannelRequest ; PRG $0D54 | CPU $CD54 | 85 FF + lda #$04 ; PRG $0D56 | CPU $CD56 | A9 04 + sta AudioRequestFlags ; PRG $0D58 | CPU $CD58 | 85 FB + rts ; PRG $0D5A | CPU $CD5A | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CD5 B. +; Local behavior: Reads Ram_030C, Flow_CD63, UpdateRam_0301_CEE5; mutates Ram_030C. +; Parameters: Ram_030C, Flow_CD63, UpdateRam_0301_CEE5. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CD5B: + dec Ram_030C ; PRG $0D5B | CPU $CD5B | CE 0C 03 + bne Flow_CD63 ; PRG $0D5E | CPU $CD5E | D0 03 + jsr UpdateRam_0301_CEE5 ; PRG $0D60 | CPU $CD60 | 20 E5 CE +; ----------------------------------------------------------------------------- +; Global purpose: Flow CD63. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CD63: + rts ; PRG $0D63 | CPU $CD63 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CD64. +; Local behavior: Reads UpdateRam_030C_CEF2; mutates no direct memory mutation observed. +; Parameters: UpdateRam_030C_CEF2. +; Returns: returns to caller; flags/register result depends on final instructions: jsr UpdateRam_030C_CEF2; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CD64: + jsr UpdateRam_030C_CEF2 ; PRG $0D64 | CPU $CD64 | 20 F2 CE + rts ; PRG $0D67 | CPU $CD67 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CD68. +; Local behavior: Reads Ram_0301; mutates Ram_0305, Ram_030C, Ram_0308, Ram_0301. +; Parameters: Ram_0301. +; Returns: returns to caller; flags/register result depends on final instructions: sta Ram_0308; inc Ram_0301; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CD68: + lda #$36 ; PRG $0D68 | CPU $CD68 | A9 36 + sta Ram_0305 ; PRG $0D6A | CPU $CD6A | 8D 05 03 + lda #$C0 ; PRG $0D6D | CPU $CD6D | A9 C0 + sta Ram_030C ; PRG $0D6F | CPU $CD6F | 8D 0C 03 + lda #$C8 ; PRG $0D72 | CPU $CD72 | A9 C8 + sta Ram_0308 ; PRG $0D74 | CPU $CD74 | 8D 08 03 + inc Ram_0301 ; PRG $0D77 | CPU $CD77 | EE 01 03 + rts ; PRG $0D7A | CPU $CD7A | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CD7 B. +; Local behavior: Reads Ram_030C, Flow_CD84; mutates Ram_030C, ObjectSpawnDelay. +; Parameters: Ram_030C, Flow_CD84. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CD7B: + dec Ram_030C ; PRG $0D7B | CPU $CD7B | CE 0C 03 + bne Flow_CD84 ; PRG $0D7E | CPU $CD7E | D0 04 + lda #$01 ; PRG $0D80 | CPU $CD80 | A9 01 + sta ObjectSpawnDelay ; PRG $0D82 | CPU $CD82 | 85 47 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CD84. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CD84: + rts ; PRG $0D84 | CPU $CD84 | 60 + +IndexedGameplayLookupTable_CD85: + .byte $FD,$FE,$FE,$FE,$FE,$FF,$FF,$FE,$FF,$FF,$FF,$FF,$00,$FF,$00,$FF ; PRG $0D85 | CPU $CD85 + .byte $00,$AA,$00,$01,$00,$01,$00,$01,$01,$01,$01,$02,$01,$01,$02,$02 ; PRG $0D95 | CPU $CD95 + .byte $02,$03,$02,$03,$02,$03,$AA ; PRG $0DA5 | CPU $CDA5 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 0304 CDAC. +; Local behavior: Reads Ram_0300, Flow_CDCD, Ram_0304, Ram_0306, Flow_CDC8, Flow_CDCA; mutates Ram_0304. +; Parameters: Ram_0300, Flow_CDCD, Ram_0304, Ram_0306, Flow_CDC8, Flow_CDCA. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_0304_CDAC: + lda Ram_0300 ; PRG $0DAC | CPU $CDAC | AD 00 03 + cmp #$01 ; PRG $0DAF | CPU $CDAF | C9 01 + bne Flow_CDCD ; PRG $0DB1 | CPU $CDB1 | D0 1A + ldy Ram_0304 ; PRG $0DB3 | CPU $CDB3 | AC 04 03 + beq Flow_CDCD ; PRG $0DB6 | CPU $CDB6 | F0 15 + lda Ram_0306 ; PRG $0DB8 | CPU $CDB8 | AD 06 03 + dec Ram_0304 ; PRG $0DBB | CPU $CDBB | CE 04 03 + beq Flow_CDC8 ; PRG $0DBE | CPU $CDBE | F0 08 + cpy #$08 ; PRG $0DC0 | CPU $CDC0 | C0 08 + bne Flow_CDCD ; PRG $0DC2 | CPU $CDC2 | D0 09 + ora #$04 ; PRG $0DC4 | CPU $CDC4 | 09 04 + bne Flow_CDCA ; PRG $0DC6 | CPU $CDC6 | D0 02 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CDC8. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CDC8: + and #$FB ; PRG $0DC8 | CPU $CDC8 | 29 FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow CDCA. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_0306. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CDCA: + sta Ram_0306 ; PRG $0DCA | CPU $CDCA | 8D 06 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CDCD. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CDCD: + rts ; PRG $0DCD | CPU $CDCD | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp 13 CDCE. +; Local behavior: Reads Ram_0308; mutates CoordinateValue. +; Parameters: Ram_0308. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_13_CDCE: + lda Ram_0308 ; PRG $0DCE | CPU $CDCE | AD 08 03 + sta CoordinateValue ; PRG $0DD1 | CPU $CDD1 | 85 13 + ldx #$00 ; PRG $0DD3 | CPU $CDD3 | A2 00 +; ----------------------------------------------------------------------------- +; Global purpose: Update Current Sprite Tile Id CDD5. +; Local behavior: Reads implicit CPU state or none observed; mutates CurrentSpriteTileId. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateCurrentSpriteTileId_CDD5: + lda #$04 ; PRG $0DD5 | CPU $CDD5 | A9 04 + sta CurrentSpriteTileId ; PRG $0DD7 | CPU $CDD7 | 85 11 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CDD9. +; Local behavior: Reads CoordinateValue, Flow_CDE9, CurrentSpriteTileId, Flow_CDD9; mutates CurrentSpriteTileId. +; Parameters: CoordinateValue, Flow_CDE9, CurrentSpriteTileId, Flow_CDD9. +; Returns: returns to caller; flags/register result depends on final instructions: bne Flow_CDD9; sec; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CDD9: + lda $CE3B,x ; PRG $0DD9 | CPU $CDD9 | BD 3B CE + cmp CoordinateValue ; PRG $0DDC | CPU $CDDC | C5 13 + beq Flow_CDE9 ; PRG $0DDE | CPU $CDDE | F0 09 + inx ; PRG $0DE0 | CPU $CDE0 | E8 + inx ; PRG $0DE1 | CPU $CDE1 | E8 + inx ; PRG $0DE2 | CPU $CDE2 | E8 + dec CurrentSpriteTileId ; PRG $0DE3 | CPU $CDE3 | C6 11 + bne Flow_CDD9 ; PRG $0DE5 | CPU $CDE5 | D0 F2 + sec ; PRG $0DE7 | CPU $CDE7 | 38 + rts ; PRG $0DE8 | CPU $CDE8 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CDE9. +; Local behavior: Reads Flow_CDF4, Flow_CDF5; mutates no direct memory mutation observed. +; Parameters: Flow_CDF4, Flow_CDF5. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CDE9: + tya ; PRG $0DE9 | CPU $CDE9 | 98 + cmp $CE3C,x ; PRG $0DEA | CPU $CDEA | DD 3C CE + bcc Flow_CDF4 ; PRG $0DED | CPU $CDED | 90 05 + cmp $CE3D,x ; PRG $0DEF | CPU $CDEF | DD 3D CE + bcc Flow_CDF5 ; PRG $0DF2 | CPU $CDF2 | 90 01 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CDF4. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CDF4: + sec ; PRG $0DF4 | CPU $CDF4 | 38 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CDF5. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CDF5: + rts ; PRG $0DF5 | CPU $CDF5 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Calculate And Clamp Value CDF6. +; Local behavior: Reads Ram_0308, ScreenObjectMode, Flow_CE0A; mutates CoordinateValue. +; Parameters: Ram_0308, ScreenObjectMode, Flow_CE0A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +CalculateAndClampValue_CDF6: + lda Ram_0308 ; PRG $0DF6 | CPU $CDF6 | AD 08 03 + clc ; PRG $0DF9 | CPU $CDF9 | 18 + adc #$03 ; PRG $0DFA | CPU $CDFA | 69 03 + and #$FC ; PRG $0DFC | CPU $CDFC | 29 FC + sta CoordinateValue ; PRG $0DFE | CPU $CDFE | 85 13 + ldx #$0C ; PRG $0E00 | CPU $CE00 | A2 0C + lda ScreenObjectMode ; PRG $0E02 | CPU $CE02 | A5 62 + cmp #$02 ; PRG $0E04 | CPU $CE04 | C9 02 + bne Flow_CE0A ; PRG $0E06 | CPU $CE06 | D0 02 + ldx #$18 ; PRG $0E08 | CPU $CE08 | A2 18 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CE0 A. +; Local behavior: Reads Ram_0309; mutates no direct memory mutation observed. +; Parameters: Ram_0309. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CE0A: + ldy Ram_0309 ; PRG $0E0A | CPU $CE0A | AC 09 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CE0 D. +; Local behavior: Reads UpdateCurrentSpriteTileId_CDD5, Flow_CDF4, ScreenObjectMode, Flow_CE25, CoordinateValue; mutates no direct memory mutation observed. +; Parameters: UpdateCurrentSpriteTileId_CDD5, Flow_CDF4, ScreenObjectMode, Flow_CE25, CoordinateValue. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CE0D: + jsr UpdateCurrentSpriteTileId_CDD5 ; PRG $0E0D | CPU $CE0D | 20 D5 CD + bcs Flow_CDF4 ; PRG $0E10 | CPU $CE10 | B0 E2 + ldx ScreenObjectMode ; PRG $0E12 | CPU $CE12 | A6 62 + dex ; PRG $0E14 | CPU $CE14 | CA + bne Flow_CE25 ; PRG $0E15 | CPU $CE15 | D0 0E + lda #$A8 ; PRG $0E17 | CPU $CE17 | A9 A8 + cmp CoordinateValue ; PRG $0E19 | CPU $CE19 | C5 13 + bne Flow_CE25 ; PRG $0E1B | CPU $CE1B | D0 08 + cpy #$6F ; PRG $0E1D | CPU $CE1D | C0 6F + bcc Flow_CE25 ; PRG $0E1F | CPU $CE1F | 90 04 + cpy #$93 ; PRG $0E21 | CPU $CE21 | C0 93 + bcc Flow_CDF4 ; PRG $0E23 | CPU $CE23 | 90 CF +; ----------------------------------------------------------------------------- +; Global purpose: Flow CE25. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: clc; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CE25: + clc ; PRG $0E25 | CPU $CE25 | 18 + rts ; PRG $0E26 | CPU $CE26 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Calculate And Clamp Value CE27. +; Local behavior: Reads Ram_0608, ScreenObjectMode, Flow_CE0D; mutates CoordinateValue. +; Parameters: Ram_0608, ScreenObjectMode, Flow_CE0D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +CalculateAndClampValue_CE27: + lda Ram_0608,x ; PRG $0E27 | CPU $CE27 | BD 08 06 + clc ; PRG $0E2A | CPU $CE2A | 18 + adc #$FC ; PRG $0E2B | CPU $CE2B | 69 FC + sta CoordinateValue ; PRG $0E2D | CPU $CE2D | 85 13 + ldx #$24 ; PRG $0E2F | CPU $CE2F | A2 24 + lda ScreenObjectMode ; PRG $0E31 | CPU $CE31 | A5 62 + cmp #$02 ; PRG $0E33 | CPU $CE33 | C9 02 + bne Flow_CE0D ; PRG $0E35 | CPU $CE35 | D0 D6 + ldx #$30 ; PRG $0E37 | CPU $CE37 | A2 30 + bne Flow_CE0D ; PRG $0E39 | CPU $CE39 | D0 D2 + tya ; PRG $0E3B | CPU $CE3B | 98 + lsr a ; PRG $0E3C | CPU $CE3C | 4A + clv ; PRG $0E3D | CPU $CE3D | B8 + tay ; PRG $0E3E | CPU $CE3E | A8 + .byte $3A,$C8,$B8,$2A,$D8,$C8,$1A,$E8,$98,$4A,$B8,$A8,$3A,$C8,$B8,$2A ; PRG $0E3F | CPU $CE3F + .byte $D8,$C8,$00,$FF,$98,$FF,$00,$A8,$3B,$C7,$B8,$2B,$D7,$C8,$00,$FF ; PRG $0E4F | CPU $CE4F + .byte $98,$48,$B8,$A8,$38,$C8,$B8,$28,$D8,$C8,$20,$E0,$68,$20,$E0,$70 ; PRG $0E5F | CPU $CE5F + .byte $20,$E0,$78,$20,$E0,$80,$20,$E0 ; PRG $0E6F | CPU $CE6F +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch CE77. +; Local behavior: Reads ScreenObjectMode, Flow_CE81; mutates no direct memory mutation observed. +; Parameters: ScreenObjectMode, Flow_CE81. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_CE77: + ldy #$90 ; PRG $0E77 | CPU $CE77 | A0 90 + lda ScreenObjectMode ; PRG $0E79 | CPU $CE79 | A5 62 + cmp #$02 ; PRG $0E7B | CPU $CE7B | C9 02 + bne Flow_CE81 ; PRG $0E7D | CPU $CE7D | D0 02 + ldy #$80 ; PRG $0E7F | CPU $CE7F | A0 80 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CE81. +; Local behavior: Reads ObjectSpawnType, Flow_CEA8; mutates Ram_032A, ObjectSpawnType, Ram_0320, Ram_0326, Ram_0327, Ram_0328, Ram_0329, Ram_0321. +; Parameters: ObjectSpawnType, Flow_CEA8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CE81: + sty Ram_032A ; PRG $0E81 | CPU $CE81 | 8C 2A 03 + lda ObjectSpawnType ; PRG $0E84 | CPU $CE84 | A5 48 + beq Flow_CEA8 ; PRG $0E86 | CPU $CE86 | F0 20 + dec ObjectSpawnType ; PRG $0E88 | CPU $CE88 | C6 48 + lda #$01 ; PRG $0E8A | CPU $CE8A | A9 01 + sta Ram_0320 ; PRG $0E8C | CPU $CE8C | 8D 20 03 + lda #$0E ; PRG $0E8F | CPU $CE8F | A9 0E + sta Ram_0326 ; PRG $0E91 | CPU $CE91 | 8D 26 03 + lda #$02 ; PRG $0E94 | CPU $CE94 | A9 02 + sta Ram_0327 ; PRG $0E96 | CPU $CE96 | 8D 27 03 + lda #$30 ; PRG $0E99 | CPU $CE99 | A9 30 + sta Ram_0328 ; PRG $0E9B | CPU $CE9B | 8D 28 03 + lda #$96 ; PRG $0E9E | CPU $CE9E | A9 96 + sta Ram_0329 ; PRG $0EA0 | CPU $CEA0 | 8D 29 03 + lda #$00 ; PRG $0EA3 | CPU $CEA3 | A9 00 + sta Ram_0321 ; PRG $0EA5 | CPU $CEA5 | 8D 21 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CEA8. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CEA8: + rts ; PRG $0EA8 | CPU $CEA8 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp A8 CEA9. +; Local behavior: Reads Ram_0320, Flow_CEBE, ComputeOrDispatch_CEBF, LoadObjectSpriteRenderState; mutates ObjectRecordPointerLo, ObjectRecordPointerHi. +; Parameters: Ram_0320, Flow_CEBE, ComputeOrDispatch_CEBF, LoadObjectSpriteRenderState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_A8_CEA9: + lda Ram_0320 ; PRG $0EA9 | CPU $CEA9 | AD 20 03 + beq Flow_CEBE ; PRG $0EAC | CPU $CEAC | F0 10 + lda #$20 ; PRG $0EAE | CPU $CEAE | A9 20 + sta ObjectRecordPointerLo ; PRG $0EB0 | CPU $CEB0 | 85 A8 + lda #$03 ; PRG $0EB2 | CPU $CEB2 | A9 03 + sta ObjectRecordPointerHi ; PRG $0EB4 | CPU $CEB4 | 85 A9 + ldx #$20 ; PRG $0EB6 | CPU $CEB6 | A2 20 + jsr ComputeOrDispatch_CEBF ; PRG $0EB8 | CPU $CEB8 | 20 BF CE + jsr LoadObjectSpriteRenderState ; PRG $0EBB | CPU $CEBB | 20 17 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CEBE. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CEBE: + rts ; PRG $0EBE | CPU $CEBE | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch CEBF. +; Local behavior: Reads Ram_0301, Flow_CECD, UpdateRam_030C_CEF2, Flow_CF33, UpdateRam_032E_CF6D; mutates no direct memory mutation observed. +; Parameters: Ram_0301, Flow_CECD, UpdateRam_030C_CEF2, Flow_CF33, UpdateRam_032E_CF6D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_CEBF: + ldy Ram_0301,x ; PRG $0EBF | CPU $CEBF | BC 01 03 + beq Flow_CECD ; PRG $0EC2 | CPU $CEC2 | F0 09 + dey ; PRG $0EC4 | CPU $CEC4 | 88 + beq UpdateRam_030C_CEF2 ; PRG $0EC5 | CPU $CEC5 | F0 2B + dey ; PRG $0EC7 | CPU $CEC7 | 88 + beq Flow_CF33 ; PRG $0EC8 | CPU $CEC8 | F0 69 + jmp UpdateRam_032E_CF6D ; PRG $0ECA | CPU $CECA | 4C 6D CF +; ----------------------------------------------------------------------------- +; Global purpose: Flow CECD. +; Local behavior: Reads Ram_0368, Ram_0328, UpdateRam_0301_CEE5, Flow_CEE4; mutates Ram_0329. +; Parameters: Ram_0368, Ram_0328, UpdateRam_0301_CEE5, Flow_CEE4. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CECD: + lda Ram_0368 ; PRG $0ECD | CPU $CECD | AD 68 03 + sec ; PRG $0ED0 | CPU $CED0 | 38 + sbc #$1C ; PRG $0ED1 | CPU $CED1 | E9 1C + sbc Ram_0328 ; PRG $0ED3 | CPU $CED3 | ED 28 03 + bcc UpdateRam_0301_CEE5 ; PRG $0ED6 | CPU $CED6 | 90 0D + cmp #$06 ; PRG $0ED8 | CPU $CED8 | C9 06 + bcs Flow_CEE4 ; PRG $0EDA | CPU $CEDA | B0 08 + and #$01 ; PRG $0EDC | CPU $CEDC | 29 01 + asl a ; PRG $0EDE | CPU $CEDE | 0A + adc #$96 ; PRG $0EDF | CPU $CEDF | 69 96 + sta Ram_0329 ; PRG $0EE1 | CPU $CEE1 | 8D 29 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CEE4. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CEE4: + rts ; PRG $0EE4 | CPU $CEE4 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 0301 CEE5. +; Local behavior: Reads Ram_0301; mutates Ram_0301, Ram_030B, Ram_030C. +; Parameters: Ram_0301. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_0301_CEE5: + inc Ram_0301,x ; PRG $0EE5 | CPU $CEE5 | FE 01 03 + lda #$00 ; PRG $0EE8 | CPU $CEE8 | A9 00 + sta Ram_030B,x ; PRG $0EEA | CPU $CEEA | 9D 0B 03 + lda #$01 ; PRG $0EED | CPU $CEED | A9 01 + sta Ram_030C,x ; PRG $0EEF | CPU $CEEF | 9D 0C 03 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 030 C CEF2. +; Local behavior: Reads Ram_030C, Flow_CF0C, Ram_030B, IndexedGameplayLookupTable_CF84; mutates Ram_030C, Ram_0304, Ram_030B. +; Parameters: Ram_030C, Flow_CF0C, Ram_030B, IndexedGameplayLookupTable_CF84. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_030C_CEF2: + dec Ram_030C,x ; PRG $0EF2 | CPU $CEF2 | DE 0C 03 + bne Flow_CF0C ; PRG $0EF5 | CPU $CEF5 | D0 15 + ldy Ram_030B,x ; PRG $0EF7 | CPU $CEF7 | BC 0B 03 + lda IndexedGameplayLookupTable_CF84,y ; PRG $0EFA | CPU $CEFA | B9 84 CF + sta Ram_030C,x ; PRG $0EFD | CPU $CEFD | 9D 0C 03 + iny ; PRG $0F00 | CPU $CF00 | C8 + lda IndexedGameplayLookupTable_CF84,y ; PRG $0F01 | CPU $CF01 | B9 84 CF + sta Ram_0304,x ; PRG $0F04 | CPU $CF04 | 9D 04 03 + iny ; PRG $0F07 | CPU $CF07 | C8 + tya ; PRG $0F08 | CPU $CF08 | 98 + sta Ram_030B,x ; PRG $0F09 | CPU $CF09 | 9D 0B 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CF0 C. +; Local behavior: Reads Flow_CF14; mutates no direct memory mutation observed. +; Parameters: Flow_CF14. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CF0C: + lda #$C4 ; PRG $0F0C | CPU $CF0C | A9 C4 + cpx #$A0 ; PRG $0F0E | CPU $CF0E | E0 A0 + bne Flow_CF14 ; PRG $0F10 | CPU $CF10 | D0 02 + lda #$D4 ; PRG $0F12 | CPU $CF12 | A9 D4 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CF14. +; Local behavior: Reads Ram_0308, Ram_0304, PackedHudOrObjectValue, UpdateRam_032E_CF6D, Ram_0301; mutates PackedHudOrObjectValue, Ram_0308, Ram_0301, Ram_030B. +; Parameters: Ram_0308, Ram_0304, PackedHudOrObjectValue, UpdateRam_032E_CF6D, Ram_0301. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CF14: + sta PackedHudOrObjectValue ; PRG $0F14 | CPU $CF14 | 85 16 + lda Ram_0308,x ; PRG $0F16 | CPU $CF16 | BD 08 03 + clc ; PRG $0F19 | CPU $CF19 | 18 + adc Ram_0304,x ; PRG $0F1A | CPU $CF1A | 7D 04 03 + sta Ram_0308,x ; PRG $0F1D | CPU $CF1D | 9D 08 03 + cmp PackedHudOrObjectValue ; PRG $0F20 | CPU $CF20 | C5 16 + bcc UpdateRam_032E_CF6D ; PRG $0F22 | CPU $CF22 | 90 49 + inc Ram_0301,x ; PRG $0F24 | CPU $CF24 | FE 01 03 + lda PackedHudOrObjectValue ; PRG $0F27 | CPU $CF27 | A5 16 + adc #$03 ; PRG $0F29 | CPU $CF29 | 69 03 + sta Ram_0308,x ; PRG $0F2B | CPU $CF2B | 9D 08 03 + lda #$00 ; PRG $0F2E | CPU $CF2E | A9 00 + sta Ram_030B,x ; PRG $0F30 | CPU $CF30 | 9D 0B 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CF33. +; Local behavior: Reads FrameCounter, UpdateRam_032E_CF6D, Ram_030B, IndexedGameplayLookupTable_CF8C, Flow_CF6A, Ram_0308, Flow_CF58; mutates Ram_0308, Ram_030B. +; Parameters: FrameCounter, UpdateRam_032E_CF6D, Ram_030B, IndexedGameplayLookupTable_CF8C, Flow_CF6A, Ram_0308, Flow_CF58. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CF33: + lda FrameCounter ; PRG $0F33 | CPU $CF33 | A5 27 + lsr a ; PRG $0F35 | CPU $CF35 | 4A + bcc UpdateRam_032E_CF6D ; PRG $0F36 | CPU $CF36 | 90 35 + ldy Ram_030B,x ; PRG $0F38 | CPU $CF38 | BC 0B 03 + lda IndexedGameplayLookupTable_CF8C,y ; PRG $0F3B | CPU $CF3B | B9 8C CF + cmp #$AA ; PRG $0F3E | CPU $CF3E | C9 AA + beq Flow_CF6A ; PRG $0F40 | CPU $CF40 | F0 28 + clc ; PRG $0F42 | CPU $CF42 | 18 + adc Ram_0308,x ; PRG $0F43 | CPU $CF43 | 7D 08 03 + sta Ram_0308,x ; PRG $0F46 | CPU $CF46 | 9D 08 03 + inc Ram_030B,x ; PRG $0F49 | CPU $CF49 | FE 0B 03 + cpx #$A0 ; PRG $0F4C | CPU $CF4C | E0 A0 + beq Flow_CF58 ; PRG $0F4E | CPU $CF4E | F0 08 + cpx #$60 ; PRG $0F50 | CPU $CF50 | E0 60 + beq Flow_CF58 ; PRG $0F52 | CPU $CF52 | F0 04 + cpx #$80 ; PRG $0F54 | CPU $CF54 | E0 80 + bne UpdateRam_032E_CF6D ; PRG $0F56 | CPU $CF56 | D0 15 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CF58. +; Local behavior: Reads Flow_CF64, UpdateRam_032E_CF6D; mutates no direct memory mutation observed. +; Parameters: Flow_CF64, UpdateRam_032E_CF6D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CF58: + cpy #$00 ; PRG $0F58 | CPU $CF58 | C0 00 + beq Flow_CF64 ; PRG $0F5A | CPU $CF5A | F0 08 + cpy #$23 ; PRG $0F5C | CPU $CF5C | C0 23 + beq Flow_CF64 ; PRG $0F5E | CPU $CF5E | F0 04 + cpy #$16 ; PRG $0F60 | CPU $CF60 | C0 16 + bne UpdateRam_032E_CF6D ; PRG $0F62 | CPU $CF62 | D0 09 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CF64. +; Local behavior: Reads UpdateRam_032E_CF6D; mutates AudioPendingFlags. +; Parameters: UpdateRam_032E_CF6D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CF64: + lda #$04 ; PRG $0F64 | CPU $CF64 | A9 04 + sta AudioPendingFlags ; PRG $0F66 | CPU $CF66 | 85 FD + bne UpdateRam_032E_CF6D ; PRG $0F68 | CPU $CF68 | D0 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CF6 A. +; Local behavior: Reads Ram_0301; mutates Ram_0301. +; Parameters: Ram_0301. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CF6A: + inc Ram_0301,x ; PRG $0F6A | CPU $CF6A | FE 01 03 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 032 E CF6 D. +; Local behavior: Reads Flow_CF83, Ram_032E; mutates Ram_032E, Ram_0320, Ram_0326. +; Parameters: Flow_CF83, Ram_032E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_032E_CF6D: + cpx #$20 ; PRG $0F6D | CPU $CF6D | E0 20 + bne Flow_CF83 ; PRG $0F6F | CPU $CF6F | D0 12 + lda Ram_032E ; PRG $0F71 | CPU $CF71 | AD 2E 03 + beq Flow_CF83 ; PRG $0F74 | CPU $CF74 | F0 0D + dec Ram_032E ; PRG $0F76 | CPU $CF76 | CE 2E 03 + lda #$00 ; PRG $0F79 | CPU $CF79 | A9 00 + sta Ram_0320 ; PRG $0F7B | CPU $CF7B | 8D 20 03 + lda #$48 ; PRG $0F7E | CPU $CF7E | A9 48 + sta Ram_0326 ; PRG $0F80 | CPU $CF80 | 8D 26 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CF83. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CF83: + rts ; PRG $0F83 | CPU $CF83 | 60 + +IndexedGameplayLookupTable_CF84: + .byte $06,$01,$0A,$02,$0E,$03,$80,$04 ; PRG $0F84 | CPU $CF84 + +IndexedGameplayLookupTable_CF8C: + .byte $FD,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$00,$FF,$00,$01,$00,$01,$01 ; PRG $0F8C | CPU $CF8C + .byte $01,$02,$02,$02,$03,$03,$03,$FE,$FE,$FF,$FF,$00,$FF,$00,$01,$00 ; PRG $0F9C | CPU $CF9C + .byte $01,$01,$02,$02,$AA ; PRG $0FAC | CPU $CFAC +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp 54 CFB1. +; Local behavior: Reads GameplayObjectFlags, Flow_CFB8; mutates GameplayObjectFlags. +; Parameters: GameplayObjectFlags, Flow_CFB8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_54_CFB1: + ldy GameplayObjectFlags ; PRG $0FB1 | CPU $CFB1 | A4 54 + beq Flow_CFB8 ; PRG $0FB3 | CPU $CFB3 | F0 03 + dec GameplayObjectFlags ; PRG $0FB5 | CPU $CFB5 | C6 54 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CFB7. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CFB7: + rts ; PRG $0FB7 | CPU $CFB7 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CFB8. +; Local behavior: Reads CollisionExtent, Flow_CFB7, Ram_0340, Flow_CFCC, Ram_0350, Flow_D019; mutates no direct memory mutation observed. +; Parameters: CollisionExtent, Flow_CFB7, Ram_0340, Flow_CFCC, Ram_0350, Flow_D019. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CFB8: + lda CollisionExtent ; PRG $0FB8 | CPU $CFB8 | A5 C0 + and #$C0 ; PRG $0FBA | CPU $CFBA | 29 C0 + beq Flow_CFB7 ; PRG $0FBC | CPU $CFBC | F0 F9 + ldx #$00 ; PRG $0FBE | CPU $CFBE | A2 00 + lda Ram_0340 ; PRG $0FC0 | CPU $CFC0 | AD 40 03 + beq Flow_CFCC ; PRG $0FC3 | CPU $CFC3 | F0 07 + lda Ram_0350 ; PRG $0FC5 | CPU $CFC5 | AD 50 03 + bne Flow_D019 ; PRG $0FC8 | CPU $CFC8 | D0 4F + ldx #$10 ; PRG $0FCA | CPU $CFCA | A2 10 +; ----------------------------------------------------------------------------- +; Global purpose: Flow CFCC. +; Local behavior: Reads Ram_0308, Ram_0309, GameplayObjectAnimation, Flow_D003; mutates GameplayObjectFlags, Ram_0304, Ram_0340, Ram_034C, Ram_0343, Ram_0342, Ram_0348, Ram_0349. +; Parameters: Ram_0308, Ram_0309, GameplayObjectAnimation, Flow_D003. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_CFCC: + lda #$08 ; PRG $0FCC | CPU $CFCC | A9 08 + sta GameplayObjectFlags ; PRG $0FCE | CPU $CFCE | 85 54 + lda #$08 ; PRG $0FD0 | CPU $CFD0 | A9 08 + sta Ram_0304 ; PRG $0FD2 | CPU $CFD2 | 8D 04 03 + lda #$01 ; PRG $0FD5 | CPU $CFD5 | A9 01 + sta Ram_0340,x ; PRG $0FD7 | CPU $CFD7 | 9D 40 03 + sta Ram_034C,x ; PRG $0FDA | CPU $CFDA | 9D 4C 03 + sta Ram_0343,x ; PRG $0FDD | CPU $CFDD | 9D 43 03 + sta Ram_0342,x ; PRG $0FE0 | CPU $CFE0 | 9D 42 03 + lda Ram_0308 ; PRG $0FE3 | CPU $CFE3 | AD 08 03 + sec ; PRG $0FE6 | CPU $CFE6 | 38 + sbc #$06 ; PRG $0FE7 | CPU $CFE7 | E9 06 + sta Ram_0348,x ; PRG $0FE9 | CPU $CFE9 | 9D 48 03 + lda Ram_0309 ; PRG $0FEC | CPU $CFEC | AD 09 03 + sec ; PRG $0FEF | CPU $CFEF | 38 + sbc #$02 ; PRG $0FF0 | CPU $CFF0 | E9 02 + sta Ram_0349,x ; PRG $0FF2 | CPU $CFF2 | 9D 49 03 + ldy #$00 ; PRG $0FF5 | CPU $CFF5 | A0 00 + lda GameplayObjectAnimation ; PRG $0FF7 | CPU $CFF7 | A5 55 + beq Flow_D003 ; PRG $0FF9 | CPU $CFF9 | F0 08 + ldy #$03 ; PRG $0FFB | CPU $CFFB | A0 03 + cmp #$08 ; PRG $0FFD | CPU $CFFD | C9 08 + bcc Flow_D003 ; PRG $0FFF | CPU $CFFF | 90 02 + ldy #$06 ; PRG $1001 | CPU $D001 | A0 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D003. +; Local behavior: Reads ObjectSpawnXTable, ObjectSpawnYTable, ObjectSpawnTypeTable; mutates Ram_034F, Ram_034B, Ram_0347, AudioPendingFlags. +; Parameters: ObjectSpawnXTable, ObjectSpawnYTable, ObjectSpawnTypeTable. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D003: + lda ObjectSpawnXTable,y ; PRG $1003 | CPU $D003 | B9 1A D0 + sta Ram_034F,x ; PRG $1006 | CPU $D006 | 9D 4F 03 + lda ObjectSpawnYTable,y ; PRG $1009 | CPU $D009 | B9 1B D0 + sta Ram_034B,x ; PRG $100C | CPU $D00C | 9D 4B 03 + lda ObjectSpawnTypeTable,y ; PRG $100F | CPU $D00F | B9 1C D0 + sta Ram_0347,x ; PRG $1012 | CPU $D012 | 9D 47 03 + lda #$02 ; PRG $1015 | CPU $D015 | A9 02 + sta AudioPendingFlags ; PRG $1017 | CPU $D017 | 85 FD +; ----------------------------------------------------------------------------- +; Global purpose: Flow D019. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D019: + rts ; PRG $1019 | CPU $D019 | 60 + +ObjectSpawnXTable: + .byte $01 ; PRG $101A | CPU $D01A + +ObjectSpawnYTable: + .byte $00 ; PRG $101B | CPU $D01B + +ObjectSpawnTypeTable: + .byte $01,$02,$19,$01,$02,$32,$00 ; PRG $101C | CPU $D01C +; ----------------------------------------------------------------------------- +; Global purpose: Transform Packed Value D023. +; Local behavior: Reads FrameCounter, Flow_D03B, AdvanceObjectRecordPointer; mutates ObjectRecordPointerLo, ObjectRecordPointerHi, ObjectRecordStride. +; Parameters: FrameCounter, Flow_D03B, AdvanceObjectRecordPointer. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +TransformPackedValue_D023: + lda #$40 ; PRG $1023 | CPU $D023 | A9 40 + sta ObjectRecordPointerLo ; PRG $1025 | CPU $D025 | 85 A8 + lda #$03 ; PRG $1027 | CPU $D027 | A9 03 + sta ObjectRecordPointerHi ; PRG $1029 | CPU $D029 | 85 A9 + lda #$10 ; PRG $102B | CPU $D02B | A9 10 + sta ObjectRecordStride ; PRG $102D | CPU $D02D | 85 AA + ldx #$00 ; PRG $102F | CPU $D02F | A2 00 + lda FrameCounter ; PRG $1031 | CPU $D031 | A5 27 + lsr a ; PRG $1033 | CPU $D033 | 4A + bcs Flow_D03B ; PRG $1034 | CPU $D034 | B0 05 + jsr AdvanceObjectRecordPointer ; PRG $1036 | CPU $D036 | 20 0F C2 + ldx #$10 ; PRG $1039 | CPU $D039 | A2 10 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D03 B. +; Local behavior: Reads Ram_0340, Flow_D04E, UpdateObjectScreenY_D108, UpdateRam_034E_D04F, ComputeOrDispatch_C2B4, LoadObjectSpriteRenderState; mutates OamBufferWriteOffset. +; Parameters: Ram_0340, Flow_D04E, UpdateObjectScreenY_D108, UpdateRam_034E_D04F, ComputeOrDispatch_C2B4, LoadObjectSpriteRenderState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D03B: + stx OamBufferWriteOffset ; PRG $103B | CPU $D03B | 86 AB + lda Ram_0340,x ; PRG $103D | CPU $D03D | BD 40 03 + beq Flow_D04E ; PRG $1040 | CPU $D040 | F0 0C + jsr UpdateObjectScreenY_D108 ; PRG $1042 | CPU $D042 | 20 08 D1 + jsr UpdateRam_034E_D04F ; PRG $1045 | CPU $D045 | 20 4F D0 + jsr ComputeOrDispatch_C2B4 ; PRG $1048 | CPU $D048 | 20 B4 C2 + jsr LoadObjectSpriteRenderState ; PRG $104B | CPU $D04B | 20 17 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D04 E. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D04E: + rts ; PRG $104E | CPU $D04E | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 034 E D04 F. +; Local behavior: Reads OamBufferWriteOffset, Ram_034E, Flow_D06C, Ram_034F, Flow_D0A6, Flow_D071; mutates Ram_034E, Ram_034B. +; Parameters: OamBufferWriteOffset, Ram_034E, Flow_D06C, Ram_034F, Flow_D0A6, Flow_D071. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_034E_D04F: + ldx OamBufferWriteOffset ; PRG $104F | CPU $D04F | A6 AB + ldy Ram_034E,x ; PRG $1051 | CPU $D051 | BC 4E 03 + beq Flow_D06C ; PRG $1054 | CPU $D054 | F0 16 + lda #$00 ; PRG $1056 | CPU $D056 | A9 00 + sta Ram_034E,x ; PRG $1058 | CPU $D058 | 9D 4E 03 + lda Ram_034F,x ; PRG $105B | CPU $D05B | BD 4F 03 + cmp #$01 ; PRG $105E | CPU $D05E | C9 01 + beq Flow_D0A6 ; PRG $1060 | CPU $D060 | F0 44 + dey ; PRG $1062 | CPU $D062 | 88 + bne Flow_D0A6 ; PRG $1063 | CPU $D063 | D0 41 + lda #$4B ; PRG $1065 | CPU $D065 | A9 4B + sta Ram_034B,x ; PRG $1067 | CPU $D067 | 9D 4B 03 + bne Flow_D071 ; PRG $106A | CPU $D06A | D0 05 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D06 C. +; Local behavior: Reads Ram_034C, Flow_D098; mutates Ram_034C. +; Parameters: Ram_034C, Flow_D098. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D06C: + dec Ram_034C,x ; PRG $106C | CPU $D06C | DE 4C 03 + bne Flow_D098 ; PRG $106F | CPU $D06F | D0 27 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D071. +; Local behavior: Reads Ram_034B, CodeOrDataPointerTable_D0B4, Flow_D0A6; mutates Ram_034C, Ram_0344, Ram_0345, Ram_034D, Ram_034B. +; Parameters: Ram_034B, CodeOrDataPointerTable_D0B4, Flow_D0A6. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D071: + ldy Ram_034B,x ; PRG $1071 | CPU $D071 | BC 4B 03 + lda CodeOrDataPointerTable_D0B4,y ; PRG $1074 | CPU $D074 | B9 B4 D0 + cmp #$AA ; PRG $1077 | CPU $D077 | C9 AA + beq Flow_D0A6 ; PRG $1079 | CPU $D079 | F0 2B + sta Ram_034C,x ; PRG $107B | CPU $D07B | 9D 4C 03 + iny ; PRG $107E | CPU $D07E | C8 + lda CodeOrDataPointerTable_D0B4,y ; PRG $107F | CPU $D07F | B9 B4 D0 + sta Ram_0344,x ; PRG $1082 | CPU $D082 | 9D 44 03 + iny ; PRG $1085 | CPU $D085 | C8 + lda CodeOrDataPointerTable_D0B4,y ; PRG $1086 | CPU $D086 | B9 B4 D0 + sta Ram_0345,x ; PRG $1089 | CPU $D089 | 9D 45 03 + iny ; PRG $108C | CPU $D08C | C8 + lda CodeOrDataPointerTable_D0B4,y ; PRG $108D | CPU $D08D | B9 B4 D0 + sta Ram_034D,x ; PRG $1090 | CPU $D090 | 9D 4D 03 + iny ; PRG $1093 | CPU $D093 | C8 + tya ; PRG $1094 | CPU $D094 | 98 + sta Ram_034B,x ; PRG $1095 | CPU $D095 | 9D 4B 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D098. +; Local behavior: Reads Ram_0344, Ram_0348, Flow_D0B3; mutates Ram_0348. +; Parameters: Ram_0344, Ram_0348, Flow_D0B3. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D098: + lda Ram_0344,x ; PRG $1098 | CPU $D098 | BD 44 03 + clc ; PRG $109B | CPU $D09B | 18 + adc Ram_0348,x ; PRG $109C | CPU $D09C | 7D 48 03 + sta Ram_0348,x ; PRG $109F | CPU $D09F | 9D 48 03 + cmp #$24 ; PRG $10A2 | CPU $D0A2 | C9 24 + bcs Flow_D0B3 ; PRG $10A4 | CPU $D0A4 | B0 0D +; ----------------------------------------------------------------------------- +; Global purpose: Flow D0 A6. +; Local behavior: Reads Ram_0343; mutates Ram_0340, Ram_0346, Ram_0343. +; Parameters: Ram_0343. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D0A6: + lda #$00 ; PRG $10A6 | CPU $D0A6 | A9 00 + sta Ram_0340,x ; PRG $10A8 | CPU $D0A8 | 9D 40 03 + lda #$47 ; PRG $10AB | CPU $D0AB | A9 47 + sta Ram_0346,x ; PRG $10AD | CPU $D0AD | 9D 46 03 + inc Ram_0343,x ; PRG $10B0 | CPU $D0B0 | FE 43 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D0 B3. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D0B3: + rts ; PRG $10B3 | CPU $D0B3 | 60 + +CodeOrDataPointerTable_D0B4: + .byte $03,$FB,$00,$02,$03,$FB,$05,$02,$04,$FC,$0A,$02,$04,$FC,$0F,$04 ; PRG $10B4 | CPU $D0B4 + .byte $04,$FD,$14,$04,$02,$FE,$17,$04,$AA,$03,$FA,$00,$02,$04,$FA,$05 ; PRG $10C4 | CPU $D0C4 + .byte $04,$05,$FB,$0A,$04,$05,$FB,$1A,$06,$06,$FC,$1F,$06,$03,$FD,$23 ; PRG $10D4 | CPU $D0D4 + .byte $06,$AA,$03,$F9,$00,$02,$04,$FA,$05,$04,$05,$FA,$0A,$04,$06,$FB ; PRG $10E4 | CPU $D0E4 + .byte $1A,$06,$06,$FC,$1F,$06,$04,$FC,$23,$06,$AA,$03,$FD,$1F,$06,$01 ; PRG $10F4 | CPU $D0F4 + .byte $FE,$23,$06,$AA ; PRG $1104 | CPU $D104 +; ----------------------------------------------------------------------------- +; Global purpose: Update Object Screen Y D108. +; Local behavior: Reads OamBufferWriteOffset, Ram_0348, Ram_0349, Ram_034D; mutates ObjectScreenY, ObjectScreenX, MovementStepIndex, MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi, CurrentSpriteTileId. +; Parameters: OamBufferWriteOffset, Ram_0348, Ram_0349, Ram_034D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateObjectScreenY_D108: + ldx OamBufferWriteOffset ; PRG $1108 | CPU $D108 | A6 AB + lda Ram_0348,x ; PRG $110A | CPU $D10A | BD 48 03 + sta ObjectScreenY ; PRG $110D | CPU $D10D | 85 B8 + lda Ram_0349,x ; PRG $110F | CPU $D10F | BD 49 03 + sta ObjectScreenX ; PRG $1112 | CPU $D112 | 85 B9 + lda Ram_034D,x ; PRG $1114 | CPU $D114 | BD 4D 03 + sta MovementStepIndex ; PRG $1117 | CPU $D117 | 85 BD + lda #$00 ; PRG $1119 | CPU $D119 | A9 00 + sta MetaspriteLayoutPointerLo ; PRG $111B | CPU $D11B | 85 14 + lda #$06 ; PRG $111D | CPU $D11D | A9 06 + sta MetaspriteLayoutPointerHi ; PRG $111F | CPU $D11F | 85 15 + lda #$05 ; PRG $1121 | CPU $D121 | A9 05 + sta CurrentSpriteTileId ; PRG $1123 | CPU $D123 | 85 11 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D125. +; Local behavior: Reads CalculateAndClampValue_D17F, Flow_D15E, ComputeOrDispatch_D171, CurrentSpriteTileId, Flow_D125; mutates CurrentSpriteTileId, MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi. +; Parameters: CalculateAndClampValue_D17F, Flow_D15E, ComputeOrDispatch_D171, CurrentSpriteTileId, Flow_D125. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D125: + jsr CalculateAndClampValue_D17F ; PRG $1125 | CPU $D125 | 20 7F D1 + bcs Flow_D15E ; PRG $1128 | CPU $D128 | B0 34 + jsr ComputeOrDispatch_D171 ; PRG $112A | CPU $D12A | 20 71 D1 + dec CurrentSpriteTileId ; PRG $112D | CPU $D12D | C6 11 + bne Flow_D125 ; PRG $112F | CPU $D12F | D0 F4 + lda #$00 ; PRG $1131 | CPU $D131 | A9 00 + sta MetaspriteLayoutPointerLo ; PRG $1133 | CPU $D133 | 85 14 + lda #$04 ; PRG $1135 | CPU $D135 | A9 04 + sta MetaspriteLayoutPointerHi ; PRG $1137 | CPU $D137 | 85 15 + lda #$05 ; PRG $1139 | CPU $D139 | A9 05 + sta CurrentSpriteTileId ; PRG $113B | CPU $D13B | 85 11 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D13 D. +; Local behavior: Reads CalculateAndClampValue_D17F, Flow_D15E, ComputeOrDispatch_D171, CurrentSpriteTileId, Flow_D13D, Flow_D157; mutates CurrentSpriteTileId, MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi. +; Parameters: CalculateAndClampValue_D17F, Flow_D15E, ComputeOrDispatch_D171, CurrentSpriteTileId, Flow_D13D, Flow_D157. +; Returns: returns to caller; flags/register result depends on final instructions: jsr CalculateAndClampValue_D17F; bcs Flow_D157; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D13D: + jsr CalculateAndClampValue_D17F ; PRG $113D | CPU $D13D | 20 7F D1 + bcs Flow_D15E ; PRG $1140 | CPU $D140 | B0 1C + jsr ComputeOrDispatch_D171 ; PRG $1142 | CPU $D142 | 20 71 D1 + dec CurrentSpriteTileId ; PRG $1145 | CPU $D145 | C6 11 + bne Flow_D13D ; PRG $1147 | CPU $D147 | D0 F4 + lda #$60 ; PRG $1149 | CPU $D149 | A9 60 + sta MetaspriteLayoutPointerLo ; PRG $114B | CPU $D14B | 85 14 + lda #$03 ; PRG $114D | CPU $D14D | A9 03 + sta MetaspriteLayoutPointerHi ; PRG $114F | CPU $D14F | 85 15 + jsr CalculateAndClampValue_D17F ; PRG $1151 | CPU $D151 | 20 7F D1 + bcs Flow_D157 ; PRG $1154 | CPU $D154 | B0 01 + rts ; PRG $1156 | CPU $D156 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D157. +; Local behavior: Reads ComputeOrDispatch_E9C6, Flow_D160; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_E9C6, Flow_D160. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D157: + jsr ComputeOrDispatch_E9C6 ; PRG $1157 | CPU $D157 | 20 C6 E9 + lda #$02 ; PRG $115A | CPU $D15A | A9 02 + bne Flow_D160 ; PRG $115C | CPU $D15C | D0 02 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D15 E. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D15E: + lda #$01 ; PRG $115E | CPU $D15E | A9 01 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D160. +; Local behavior: Reads OamBufferWriteOffset, Ram_034F; mutates Ram_034E, MetaspriteLayoutPointerLo. +; Parameters: OamBufferWriteOffset, Ram_034F. +; Returns: returns to caller; flags/register result depends on final instructions: ldy #$0E; sta (MetaspriteLayoutPointerLo),y; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D160: + ldx OamBufferWriteOffset ; PRG $1160 | CPU $D160 | A6 AB + sta Ram_034E,x ; PRG $1162 | CPU $D162 | 9D 4E 03 + lda Ram_034F,x ; PRG $1165 | CPU $D165 | BD 4F 03 + ldy #$0E ; PRG $1168 | CPU $D168 | A0 0E + sta (MetaspriteLayoutPointerLo),y ; PRG $116A | CPU $D16A | 91 14 + rts ; PRG $116C | CPU $D16C | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch D16 D. +; Local behavior: Reads Flow_D173; mutates no direct memory mutation observed. +; Parameters: Flow_D173. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_D16D: + lda #$10 ; PRG $116D | CPU $D16D | A9 10 + bne Flow_D173 ; PRG $116F | CPU $D16F | D0 02 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch D171. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_D171: + lda #$20 ; PRG $1171 | CPU $D171 | A9 20 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D173. +; Local behavior: Reads MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi; mutates MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi. +; Parameters: MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi. +; Returns: returns to caller; flags/register result depends on final instructions: adc #$00; sta MetaspriteLayoutPointerHi; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D173: + clc ; PRG $1173 | CPU $D173 | 18 + adc MetaspriteLayoutPointerLo ; PRG $1174 | CPU $D174 | 65 14 + sta MetaspriteLayoutPointerLo ; PRG $1176 | CPU $D176 | 85 14 + lda MetaspriteLayoutPointerHi ; PRG $1178 | CPU $D178 | A5 15 + adc #$00 ; PRG $117A | CPU $D17A | 69 00 + sta MetaspriteLayoutPointerHi ; PRG $117C | CPU $D17C | 85 15 + rts ; PRG $117E | CPU $D17E | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Calculate And Clamp Value D17 F. +; Local behavior: Reads MetaspriteLayoutPointerLo, Flow_D1C5, MovementStepIndex, IndexedGameplayLookupTable_D1C7, IndexedGameplayLookupTable_D1C8, ObjectScreenY, Flow_D1AE; mutates CoordinateValue, CoordinateLimit. +; Parameters: MetaspriteLayoutPointerLo, Flow_D1C5, MovementStepIndex, IndexedGameplayLookupTable_D1C7, IndexedGameplayLookupTable_D1C8, ObjectScreenY, Flow_D1AE. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +CalculateAndClampValue_D17F: + ldy #$00 ; PRG $117F | CPU $D17F | A0 00 + lda (MetaspriteLayoutPointerLo),y ; PRG $1181 | CPU $D181 | B1 14 + cmp #$01 ; PRG $1183 | CPU $D183 | C9 01 + bne Flow_D1C5 ; PRG $1185 | CPU $D185 | D0 3E + ldy #$0D ; PRG $1187 | CPU $D187 | A0 0D + lda (MetaspriteLayoutPointerLo),y ; PRG $1189 | CPU $D189 | B1 14 + tax ; PRG $118B | CPU $D18B | AA + ldy MovementStepIndex ; PRG $118C | CPU $D18C | A4 BD + lda IndexedGameplayLookupTable_D1C7,x ; PRG $118E | CPU $D18E | BD C7 D1 + clc ; PRG $1191 | CPU $D191 | 18 + adc IndexedGameplayLookupTable_D1C7,y ; PRG $1192 | CPU $D192 | 79 C7 D1 + sta CoordinateValue ; PRG $1195 | CPU $D195 | 85 13 + lda IndexedGameplayLookupTable_D1C8,x ; PRG $1197 | CPU $D197 | BD C8 D1 + clc ; PRG $119A | CPU $D19A | 18 + adc IndexedGameplayLookupTable_D1C8,y ; PRG $119B | CPU $D19B | 79 C8 D1 + sta CoordinateLimit ; PRG $119E | CPU $D19E | 85 12 + ldy #$08 ; PRG $11A0 | CPU $D1A0 | A0 08 + lda (MetaspriteLayoutPointerLo),y ; PRG $11A2 | CPU $D1A2 | B1 14 + sec ; PRG $11A4 | CPU $D1A4 | 38 + sbc ObjectScreenY ; PRG $11A5 | CPU $D1A5 | E5 B8 + bpl Flow_D1AE ; PRG $11A7 | CPU $D1A7 | 10 05 + eor #$FF ; PRG $11A9 | CPU $D1A9 | 49 FF + clc ; PRG $11AB | CPU $D1AB | 18 + adc #$01 ; PRG $11AC | CPU $D1AC | 69 01 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D1 AE. +; Local behavior: Reads CoordinateValue, Flow_D1C5, MetaspriteLayoutPointerLo, ObjectScreenX, Flow_D1BF; mutates no direct memory mutation observed. +; Parameters: CoordinateValue, Flow_D1C5, MetaspriteLayoutPointerLo, ObjectScreenX, Flow_D1BF. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D1AE: + cmp CoordinateValue ; PRG $11AE | CPU $D1AE | C5 13 + bcs Flow_D1C5 ; PRG $11B0 | CPU $D1B0 | B0 13 + iny ; PRG $11B2 | CPU $D1B2 | C8 + lda (MetaspriteLayoutPointerLo),y ; PRG $11B3 | CPU $D1B3 | B1 14 + sec ; PRG $11B5 | CPU $D1B5 | 38 + sbc ObjectScreenX ; PRG $11B6 | CPU $D1B6 | E5 B9 + bpl Flow_D1BF ; PRG $11B8 | CPU $D1B8 | 10 05 + eor #$FF ; PRG $11BA | CPU $D1BA | 49 FF + clc ; PRG $11BC | CPU $D1BC | 18 + adc #$01 ; PRG $11BD | CPU $D1BD | 69 01 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D1 BF. +; Local behavior: Reads CoordinateLimit, Flow_D1C5; mutates no direct memory mutation observed. +; Parameters: CoordinateLimit, Flow_D1C5. +; Returns: returns to caller; flags/register result depends on final instructions: bcs Flow_D1C5; sec; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D1BF: + cmp CoordinateLimit ; PRG $11BF | CPU $D1BF | C5 12 + bcs Flow_D1C5 ; PRG $11C1 | CPU $D1C1 | B0 02 + sec ; PRG $11C3 | CPU $D1C3 | 38 + rts ; PRG $11C4 | CPU $D1C4 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D1 C5. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: clc; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D1C5: + clc ; PRG $11C5 | CPU $D1C5 | 18 + rts ; PRG $11C6 | CPU $D1C6 | 60 + +IndexedGameplayLookupTable_D1C7: + .byte $03 ; PRG $11C7 | CPU $D1C7 + +IndexedGameplayLookupTable_D1C8: + .byte $03,$04,$04,$06,$06,$07,$08,$08,$0A,$04,$04,$03,$04,$02,$01 ; PRG $11C8 | CPU $D1C8 +; ----------------------------------------------------------------------------- +; Global purpose: Update Object Screen Y D1 D7. +; Local behavior: Reads Ram_0308, Ram_0309, Ram_030D, CalculateAndClampValue_D17F, Flow_D1FB; mutates ObjectScreenY, ObjectScreenX, MovementStepIndex, MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi, Ram_032E, Ram_0312. +; Parameters: Ram_0308, Ram_0309, Ram_030D, CalculateAndClampValue_D17F, Flow_D1FB. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateObjectScreenY_D1D7: + lda Ram_0308 ; PRG $11D7 | CPU $D1D7 | AD 08 03 + sta ObjectScreenY ; PRG $11DA | CPU $D1DA | 85 B8 + lda Ram_0309 ; PRG $11DC | CPU $D1DC | AD 09 03 + sta ObjectScreenX ; PRG $11DF | CPU $D1DF | 85 B9 + lda Ram_030D ; PRG $11E1 | CPU $D1E1 | AD 0D 03 + sta MovementStepIndex ; PRG $11E4 | CPU $D1E4 | 85 BD + lda #$20 ; PRG $11E6 | CPU $D1E6 | A9 20 + sta MetaspriteLayoutPointerLo ; PRG $11E8 | CPU $D1E8 | 85 14 + lda #$03 ; PRG $11EA | CPU $D1EA | A9 03 + sta MetaspriteLayoutPointerHi ; PRG $11EC | CPU $D1EC | 85 15 + jsr CalculateAndClampValue_D17F ; PRG $11EE | CPU $D1EE | 20 7F D1 + bcc Flow_D1FB ; PRG $11F1 | CPU $D1F1 | 90 08 + lda #$01 ; PRG $11F3 | CPU $D1F3 | A9 01 + sta Ram_032E ; PRG $11F5 | CPU $D1F5 | 8D 2E 03 + sta Ram_0312 ; PRG $11F8 | CPU $D1F8 | 8D 12 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D1 FB. +; Local behavior: Reads implicit CPU state or none observed; mutates MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi, CurrentSpriteTileId. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D1FB: + lda #$00 ; PRG $11FB | CPU $D1FB | A9 00 + sta MetaspriteLayoutPointerLo ; PRG $11FD | CPU $D1FD | 85 14 + lda #$06 ; PRG $11FF | CPU $D1FF | A9 06 + sta MetaspriteLayoutPointerHi ; PRG $1201 | CPU $D201 | 85 15 + lda #$05 ; PRG $1203 | CPU $D203 | A9 05 + sta CurrentSpriteTileId ; PRG $1205 | CPU $D205 | 85 11 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D207. +; Local behavior: Reads MetaspriteLayoutPointerLo, Flow_D212, CalculateAndClampValue_D17F, Flow_D257; mutates no direct memory mutation observed. +; Parameters: MetaspriteLayoutPointerLo, Flow_D212, CalculateAndClampValue_D17F, Flow_D257. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D207: + ldy #$11 ; PRG $1207 | CPU $D207 | A0 11 + lda (MetaspriteLayoutPointerLo),y ; PRG $1209 | CPU $D209 | B1 14 + bne Flow_D212 ; PRG $120B | CPU $D20B | D0 05 + jsr CalculateAndClampValue_D17F ; PRG $120D | CPU $D20D | 20 7F D1 + bcs Flow_D257 ; PRG $1210 | CPU $D210 | B0 45 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D212. +; Local behavior: Reads ComputeOrDispatch_D171, CurrentSpriteTileId, Flow_D207; mutates CurrentSpriteTileId, MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi. +; Parameters: ComputeOrDispatch_D171, CurrentSpriteTileId, Flow_D207. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D212: + jsr ComputeOrDispatch_D171 ; PRG $1212 | CPU $D212 | 20 71 D1 + dec CurrentSpriteTileId ; PRG $1215 | CPU $D215 | C6 11 + bne Flow_D207 ; PRG $1217 | CPU $D217 | D0 EE + lda #$C0 ; PRG $1219 | CPU $D219 | A9 C0 + sta MetaspriteLayoutPointerLo ; PRG $121B | CPU $D21B | 85 14 + lda #$03 ; PRG $121D | CPU $D21D | A9 03 + sta MetaspriteLayoutPointerHi ; PRG $121F | CPU $D21F | 85 15 + lda #$04 ; PRG $1221 | CPU $D221 | A9 04 + sta CurrentSpriteTileId ; PRG $1223 | CPU $D223 | 85 11 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D225. +; Local behavior: Reads CalculateAndClampValue_D17F, Flow_D257, ComputeOrDispatch_D16D, CurrentSpriteTileId, Flow_D225; mutates CurrentSpriteTileId. +; Parameters: CalculateAndClampValue_D17F, Flow_D257, ComputeOrDispatch_D16D, CurrentSpriteTileId, Flow_D225. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D225: + jsr CalculateAndClampValue_D17F ; PRG $1225 | CPU $D225 | 20 7F D1 + bcs Flow_D257 ; PRG $1228 | CPU $D228 | B0 2D + jsr ComputeOrDispatch_D16D ; PRG $122A | CPU $D22A | 20 6D D1 + dec CurrentSpriteTileId ; PRG $122D | CPU $D22D | C6 11 + bne Flow_D225 ; PRG $122F | CPU $D22F | D0 F4 + lda #$05 ; PRG $1231 | CPU $D231 | A9 05 + sta CurrentSpriteTileId ; PRG $1233 | CPU $D233 | 85 11 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D235. +; Local behavior: Reads CalculateAndClampValue_D17F, Flow_D257, ComputeOrDispatch_D171, CurrentSpriteTileId, Flow_D235; mutates CurrentSpriteTileId. +; Parameters: CalculateAndClampValue_D17F, Flow_D257, ComputeOrDispatch_D171, CurrentSpriteTileId, Flow_D235. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D235: + jsr CalculateAndClampValue_D17F ; PRG $1235 | CPU $D235 | 20 7F D1 + bcs Flow_D257 ; PRG $1238 | CPU $D238 | B0 1D + jsr ComputeOrDispatch_D171 ; PRG $123A | CPU $D23A | 20 71 D1 + dec CurrentSpriteTileId ; PRG $123D | CPU $D23D | C6 11 + bne Flow_D235 ; PRG $123F | CPU $D23F | D0 F4 + lda #$04 ; PRG $1241 | CPU $D241 | A9 04 + sta CurrentSpriteTileId ; PRG $1243 | CPU $D243 | 85 11 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D245. +; Local behavior: Reads CalculateAndClampValue_D17F, Flow_D257, ComputeOrDispatch_D16D, CurrentSpriteTileId, Flow_D245; mutates CurrentSpriteTileId. +; Parameters: CalculateAndClampValue_D17F, Flow_D257, ComputeOrDispatch_D16D, CurrentSpriteTileId, Flow_D245. +; Returns: returns to caller; flags/register result depends on final instructions: jsr CalculateAndClampValue_D17F; bcs Flow_D257; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D245: + jsr CalculateAndClampValue_D17F ; PRG $1245 | CPU $D245 | 20 7F D1 + bcs Flow_D257 ; PRG $1248 | CPU $D248 | B0 0D + jsr ComputeOrDispatch_D16D ; PRG $124A | CPU $D24A | 20 6D D1 + dec CurrentSpriteTileId ; PRG $124D | CPU $D24D | C6 11 + bne Flow_D245 ; PRG $124F | CPU $D24F | D0 F4 + jsr CalculateAndClampValue_D17F ; PRG $1251 | CPU $D251 | 20 7F D1 + bcs Flow_D257 ; PRG $1254 | CPU $D254 | B0 01 + rts ; PRG $1256 | CPU $D256 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D257. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_030E, MetaspriteLayoutPointerLo. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: ldy #$0E; sta (MetaspriteLayoutPointerLo),y; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D257: + lda #$01 ; PRG $1257 | CPU $D257 | A9 01 + sta Ram_030E ; PRG $1259 | CPU $D259 | 8D 0E 03 + lda #$80 ; PRG $125C | CPU $D25C | A9 80 + ldy #$0E ; PRG $125E | CPU $D25E | A0 0E + sta (MetaspriteLayoutPointerLo),y ; PRG $1260 | CPU $D260 | 91 14 + rts ; PRG $1262 | CPU $D262 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Transform Packed Value D263. +; Local behavior: Reads ScreenObjectTimer, ScreenObjectMode, PackedHudOrObjectValue; mutates CurrentSpriteTileId, PackedHudOrObjectValue. +; Parameters: ScreenObjectTimer, ScreenObjectMode, PackedHudOrObjectValue. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +TransformPackedValue_D263: + lda ScreenObjectTimer ; PRG $1263 | CPU $D263 | A5 63 + sta CurrentSpriteTileId ; PRG $1265 | CPU $D265 | 85 11 + lda ScreenObjectMode ; PRG $1267 | CPU $D267 | A5 62 + asl a ; PRG $1269 | CPU $D269 | 0A + sta PackedHudOrObjectValue ; PRG $126A | CPU $D26A | 85 16 + asl a ; PRG $126C | CPU $D26C | 0A + asl a ; PRG $126D | CPU $D26D | 0A + clc ; PRG $126E | CPU $D26E | 18 + adc PackedHudOrObjectValue ; PRG $126F | CPU $D26F | 65 16 + tay ; PRG $1271 | CPU $D271 | A8 + ldx #$00 ; PRG $1272 | CPU $D272 | A2 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D274. +; Local behavior: Reads PackedHudOrObjectValue, ScreenObjectMode, Flow_D292; mutates Ram_0600, Ram_0602, PackedHudOrObjectValue. +; Parameters: PackedHudOrObjectValue, ScreenObjectMode, Flow_D292. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D274: + lda #$00 ; PRG $1274 | CPU $D274 | A9 00 + sta Ram_0600,x ; PRG $1276 | CPU $D276 | 9D 00 06 + lda #$02 ; PRG $1279 | CPU $D279 | A9 02 + sta Ram_0602,x ; PRG $127B | CPU $D27B | 9D 02 06 + txa ; PRG $127E | CPU $D27E | 8A + lsr a ; PRG $127F | CPU $D27F | 4A + lsr a ; PRG $1280 | CPU $D280 | 4A + sta PackedHudOrObjectValue ; PRG $1281 | CPU $D281 | 85 16 + lda #$C8 ; PRG $1283 | CPU $D283 | A9 C8 + sec ; PRG $1285 | CPU $D285 | 38 + sbc PackedHudOrObjectValue ; PRG $1286 | CPU $D286 | E5 16 + pha ; PRG $1288 | CPU $D288 | 48 + lda ScreenObjectMode ; PRG $1289 | CPU $D289 | A5 62 + cmp #$02 ; PRG $128B | CPU $D28B | C9 02 + pla ; PRG $128D | CPU $D28D | 68 + bcc Flow_D292 ; PRG $128E | CPU $D28E | 90 02 + sbc #$10 ; PRG $1290 | CPU $D290 | E9 10 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D292. +; Local behavior: Reads ScreenObjectMode, Flow_D2A6, AdvancePseudoRandomState; mutates Ram_060A, PackedHudOrObjectValue. +; Parameters: ScreenObjectMode, Flow_D2A6, AdvancePseudoRandomState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D292: + sta Ram_060A,x ; PRG $1292 | CPU $D292 | 9D 0A 06 + lda #$00 ; PRG $1295 | CPU $D295 | A9 00 + sta PackedHudOrObjectValue ; PRG $1297 | CPU $D297 | 85 16 + lda ScreenObjectMode ; PRG $1299 | CPU $D299 | A5 62 + cmp #$02 ; PRG $129B | CPU $D29B | C9 02 + bne Flow_D2A6 ; PRG $129D | CPU $D29D | D0 07 + jsr AdvancePseudoRandomState ; PRG $129F | CPU $D29F | 20 2F C4 + and #$80 ; PRG $12A2 | CPU $D2A2 | 29 80 + sta PackedHudOrObjectValue ; PRG $12A4 | CPU $D2A4 | 85 16 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D2 A6. +; Local behavior: Reads IndexedGameplayLookupTable_D2D4, PackedHudOrObjectValue, CurrentSpriteTileId, Flow_D274; mutates Ram_060F, Ram_0618, CurrentSpriteTileId. +; Parameters: IndexedGameplayLookupTable_D2D4, PackedHudOrObjectValue, CurrentSpriteTileId, Flow_D274. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D2A6: + lda IndexedGameplayLookupTable_D2D4,y ; PRG $12A6 | CPU $D2A6 | B9 D4 D2 + eor PackedHudOrObjectValue ; PRG $12A9 | CPU $D2A9 | 45 16 + iny ; PRG $12AB | CPU $D2AB | C8 + sta Ram_060F,x ; PRG $12AC | CPU $D2AC | 9D 0F 06 + lda IndexedGameplayLookupTable_D2D4,y ; PRG $12AF | CPU $D2AF | B9 D4 D2 + iny ; PRG $12B2 | CPU $D2B2 | C8 + sta Ram_0618,x ; PRG $12B3 | CPU $D2B3 | 9D 18 06 + txa ; PRG $12B6 | CPU $D2B6 | 8A + clc ; PRG $12B7 | CPU $D2B7 | 18 + adc #$20 ; PRG $12B8 | CPU $D2B8 | 69 20 + tax ; PRG $12BA | CPU $D2BA | AA + dec CurrentSpriteTileId ; PRG $12BB | CPU $D2BB | C6 11 + bne Flow_D274 ; PRG $12BD | CPU $D2BD | D0 B5 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation D2 BF. +; Local behavior: Reads Flow_D2D3, Continuation_D2BF; mutates Ram_0600, Ram_0618. +; Parameters: Flow_D2D3, Continuation_D2BF. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_D2BF: + cpx #$A0 ; PRG $12BF | CPU $D2BF | E0 A0 + beq Flow_D2D3 ; PRG $12C1 | CPU $D2C1 | F0 10 + lda #$00 ; PRG $12C3 | CPU $D2C3 | A9 00 + sta Ram_0600,x ; PRG $12C5 | CPU $D2C5 | 9D 00 06 + sta Ram_0618,x ; PRG $12C8 | CPU $D2C8 | 9D 18 06 + txa ; PRG $12CB | CPU $D2CB | 8A + clc ; PRG $12CC | CPU $D2CC | 18 + adc #$20 ; PRG $12CD | CPU $D2CD | 69 20 + tax ; PRG $12CF | CPU $D2CF | AA + jmp Continuation_D2BF ; PRG $12D0 | CPU $D2D0 | 4C BF D2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D2 D3. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D2D3: + rts ; PRG $12D3 | CPU $D2D3 | 60 + +IndexedGameplayLookupTable_D2D4: + .byte $00,$10,$81,$20,$02,$30,$83,$40,$FF,$FF,$00,$10,$81,$20,$01,$20 ; PRG $12D4 | CPU $D2D4 + .byte $02,$30,$83,$40,$04,$05,$85,$06,$06,$07,$87,$08,$84,$05 ; PRG $12E4 | CPU $D2E4 +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp A8 D2 F2. +; Local behavior: Reads implicit CPU state or none observed; mutates ObjectRecordPointerLo, ObjectRecordPointerHi, ObjectRecordStride. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_A8_D2F2: + lda #$00 ; PRG $12F2 | CPU $D2F2 | A9 00 + sta ObjectRecordPointerLo ; PRG $12F4 | CPU $D2F4 | 85 A8 + lda #$06 ; PRG $12F6 | CPU $D2F6 | A9 06 + sta ObjectRecordPointerHi ; PRG $12F8 | CPU $D2F8 | 85 A9 + lda #$20 ; PRG $12FA | CPU $D2FA | A9 20 + sta ObjectRecordStride ; PRG $12FC | CPU $D2FC | 85 AA + lda #$00 ; PRG $12FE | CPU $D2FE | A9 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D300. +; Local behavior: Reads TransformPackedValue_D32E, OamBufferWriteOffset, Ram_0600, Flow_D321, FrameCounter, EvaluateCollisionState_D3EC, ComputeOrDispatch_C2B4, LoadObjectSpriteRenderState; mutates OamBufferWriteOffset. +; Parameters: TransformPackedValue_D32E, OamBufferWriteOffset, Ram_0600, Flow_D321, FrameCounter, EvaluateCollisionState_D3EC, ComputeOrDispatch_C2B4, LoadObjectSpriteRenderState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D300: + sta OamBufferWriteOffset ; PRG $1300 | CPU $D300 | 85 AB + jsr TransformPackedValue_D32E ; PRG $1302 | CPU $D302 | 20 2E D3 + ldx OamBufferWriteOffset ; PRG $1305 | CPU $D305 | A6 AB + lda Ram_0600,x ; PRG $1307 | CPU $D307 | BD 00 06 + beq Flow_D321 ; PRG $130A | CPU $D30A | F0 15 + txa ; PRG $130C | CPU $D30C | 8A + lsr a ; PRG $130D | CPU $D30D | 4A + lsr a ; PRG $130E | CPU $D30E | 4A + lsr a ; PRG $130F | CPU $D30F | 4A + lsr a ; PRG $1310 | CPU $D310 | 4A + lsr a ; PRG $1311 | CPU $D311 | 4A + eor FrameCounter ; PRG $1312 | CPU $D312 | 45 27 + and #$03 ; PRG $1314 | CPU $D314 | 29 03 + bne Flow_D321 ; PRG $1316 | CPU $D316 | D0 09 + jsr EvaluateCollisionState_D3EC ; PRG $1318 | CPU $D318 | 20 EC D3 + jsr ComputeOrDispatch_C2B4 ; PRG $131B | CPU $D31B | 20 B4 C2 + jsr LoadObjectSpriteRenderState ; PRG $131E | CPU $D31E | 20 17 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D321. +; Local behavior: Reads AdvanceObjectRecordPointer, OamBufferWriteOffset, Flow_D300; mutates no direct memory mutation observed. +; Parameters: AdvanceObjectRecordPointer, OamBufferWriteOffset, Flow_D300. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D321: + jsr AdvanceObjectRecordPointer ; PRG $1321 | CPU $D321 | 20 0F C2 + lda OamBufferWriteOffset ; PRG $1324 | CPU $D324 | A5 AB + clc ; PRG $1326 | CPU $D326 | 18 + adc #$20 ; PRG $1327 | CPU $D327 | 69 20 + cmp #$A0 ; PRG $1329 | CPU $D329 | C9 A0 + bne Flow_D300 ; PRG $132B | CPU $D32B | D0 D3 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D32 D. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D32D: + rts ; PRG $132D | CPU $D32D | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Transform Packed Value D32 E. +; Local behavior: Reads FrameCounter, Flow_D32D, OamBufferWriteOffset, Ram_0600, Flow_D3B4, Ram_0618, Ram_060F, IndexedGameplayLookupTable_D3B5; mutates Ram_0618, Ram_0600, Ram_0611, Ram_0612, Ram_060E, PackedHudOrObjectValue, Ram_0608. +; Parameters: FrameCounter, Flow_D32D, OamBufferWriteOffset, Ram_0600, Flow_D3B4, Ram_0618, Ram_060F, IndexedGameplayLookupTable_D3B5. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +TransformPackedValue_D32E: + lda FrameCounter ; PRG $132E | CPU $D32E | A5 27 + and #$1F ; PRG $1330 | CPU $D330 | 29 1F + bne Flow_D32D ; PRG $1332 | CPU $D332 | D0 F9 + ldx OamBufferWriteOffset ; PRG $1334 | CPU $D334 | A6 AB + lda Ram_0600,x ; PRG $1336 | CPU $D336 | BD 00 06 + bne Flow_D3B4 ; PRG $1339 | CPU $D339 | D0 79 + lda Ram_0618,x ; PRG $133B | CPU $D33B | BD 18 06 + beq Flow_D3B4 ; PRG $133E | CPU $D33E | F0 74 + dec Ram_0618,x ; PRG $1340 | CPU $D340 | DE 18 06 + bne Flow_D3B4 ; PRG $1343 | CPU $D343 | D0 6F + lda #$01 ; PRG $1345 | CPU $D345 | A9 01 + sta Ram_0600,x ; PRG $1347 | CPU $D347 | 9D 00 06 + lda #$00 ; PRG $134A | CPU $D34A | A9 00 + sta Ram_0611,x ; PRG $134C | CPU $D34C | 9D 11 06 + sta Ram_0612,x ; PRG $134F | CPU $D34F | 9D 12 06 + sta Ram_060E,x ; PRG $1352 | CPU $D352 | 9D 0E 06 + lda Ram_060F,x ; PRG $1355 | CPU $D355 | BD 0F 06 + sta PackedHudOrObjectValue ; PRG $1358 | CPU $D358 | 85 16 + and #$07 ; PRG $135A | CPU $D35A | 29 07 + asl a ; PRG $135C | CPU $D35C | 0A + asl a ; PRG $135D | CPU $D35D | 0A + tay ; PRG $135E | CPU $D35E | A8 + lda IndexedGameplayLookupTable_D3B5,y ; PRG $135F | CPU $D35F | B9 B5 D3 + sta Ram_0608,x ; PRG $1362 | CPU $D362 | 9D 08 06 + lda IndexedGameplayLookupTable_D3B6,y ; PRG $1365 | CPU $D365 | B9 B6 D3 + bit PackedHudOrObjectValue ; PRG $1368 | CPU $D368 | 24 16 + bpl Flow_D371 ; PRG $136A | CPU $D36A | 10 05 + eor #$FF ; PRG $136C | CPU $D36C | 49 FF + clc ; PRG $136E | CPU $D36E | 18 + adc #$01 ; PRG $136F | CPU $D36F | 69 01 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D371. +; Local behavior: Reads IndexedGameplayLookupTable_D3B7, IndexedGameplayLookupTable_D3B8, PackedHudOrObjectValue, Flow_D388; mutates Ram_0609, Ram_060B, Ram_0601. +; Parameters: IndexedGameplayLookupTable_D3B7, IndexedGameplayLookupTable_D3B8, PackedHudOrObjectValue, Flow_D388. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D371: + sta Ram_0609,x ; PRG $1371 | CPU $D371 | 9D 09 06 + lda IndexedGameplayLookupTable_D3B7,y ; PRG $1374 | CPU $D374 | B9 B7 D3 + sta Ram_060B,x ; PRG $1377 | CPU $D377 | 9D 0B 06 + lda IndexedGameplayLookupTable_D3B8,y ; PRG $137A | CPU $D37A | B9 B8 D3 + sta Ram_0601,x ; PRG $137D | CPU $D37D | 9D 01 06 + lda #$01 ; PRG $1380 | CPU $D380 | A9 01 + bit PackedHudOrObjectValue ; PRG $1382 | CPU $D382 | 24 16 + bmi Flow_D388 ; PRG $1384 | CPU $D384 | 30 02 + lda #$FF ; PRG $1386 | CPU $D386 | A9 FF +; ----------------------------------------------------------------------------- +; Global purpose: Flow D388. +; Local behavior: Reads PackedHudOrObjectValue, Flow_D393; mutates Ram_060C. +; Parameters: PackedHudOrObjectValue, Flow_D393. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D388: + sta Ram_060C,x ; PRG $1388 | CPU $D388 | 9D 0C 06 + lda #$00 ; PRG $138B | CPU $D38B | A9 00 + bit PackedHudOrObjectValue ; PRG $138D | CPU $D38D | 24 16 + bpl Flow_D393 ; PRG $138F | CPU $D38F | 10 02 + lda #$06 ; PRG $1391 | CPU $D391 | A9 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D393. +; Local behavior: Reads Ram_060F, Flow_D3B0; mutates Ram_0605, Ram_0603, Ram_0607, Ram_060D. +; Parameters: Ram_060F, Flow_D3B0. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D393: + sta Ram_0605,x ; PRG $1393 | CPU $D393 | 9D 05 06 + lda #$01 ; PRG $1396 | CPU $D396 | A9 01 + sta Ram_0603,x ; PRG $1398 | CPU $D398 | 9D 03 06 + sta Ram_0607,x ; PRG $139B | CPU $D39B | 9D 07 06 + lda #$0C ; PRG $139E | CPU $D39E | A9 0C + sta Ram_060D,x ; PRG $13A0 | CPU $D3A0 | 9D 0D 06 + ldy #$30 ; PRG $13A3 | CPU $D3A3 | A0 30 + lda Ram_060F,x ; PRG $13A5 | CPU $D3A5 | BD 0F 06 + and #$0F ; PRG $13A8 | CPU $D3A8 | 29 0F + cmp #$02 ; PRG $13AA | CPU $D3AA | C9 02 + bcs Flow_D3B0 ; PRG $13AC | CPU $D3AC | B0 02 + ldy #$38 ; PRG $13AE | CPU $D3AE | A0 38 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D3 B0. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_0615. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D3B0: + tya ; PRG $13B0 | CPU $D3B0 | 98 + sta Ram_0615,x ; PRG $13B1 | CPU $D3B1 | 9D 15 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D3 B4. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D3B4: + rts ; PRG $13B4 | CPU $D3B4 | 60 + +IndexedGameplayLookupTable_D3B5: + .byte $3C ; PRG $13B5 | CPU $D3B5 + +IndexedGameplayLookupTable_D3B6: + .byte $F8 ; PRG $13B6 | CPU $D3B6 + +IndexedGameplayLookupTable_D3B7: + .byte $00 ; PRG $13B7 | CPU $D3B7 + +IndexedGameplayLookupTable_D3B8: + .byte $00,$3C,$F8,$00,$00,$5C,$F8,$5F,$00,$5C,$F8,$5F,$00,$6C,$D8,$00 ; PRG $13B8 | CPU $D3B8 + .byte $04,$74,$D8,$00,$04,$7C,$D8,$00,$04,$84,$D8,$00,$04 ; PRG $13C8 | CPU $D3C8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D3 D5. +; Local behavior: Reads GameplayStateFlags, Flow_D3E8, OamBufferWriteOffset; mutates Ram_0606, Ram_0600, Ram_0618. +; Parameters: GameplayStateFlags, Flow_D3E8, OamBufferWriteOffset. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D3D5: + lda GameplayStateFlags ; PRG $13D5 | CPU $D3D5 | A5 23 + bne Flow_D3E8 ; PRG $13D7 | CPU $D3D7 | D0 0F + ldx OamBufferWriteOffset ; PRG $13D9 | CPU $D3D9 | A6 AB + lda #$48 ; PRG $13DB | CPU $D3DB | A9 48 + sta Ram_0606,x ; PRG $13DD | CPU $D3DD | 9D 06 06 + lda #$00 ; PRG $13E0 | CPU $D3E0 | A9 00 + sta Ram_0600,x ; PRG $13E2 | CPU $D3E2 | 9D 00 06 + sta Ram_0618,x ; PRG $13E5 | CPU $D3E5 | 9D 18 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D3 E8. +; Local behavior: Reads Ram_0603; mutates Ram_0603. +; Parameters: Ram_0603. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D3E8: + inc Ram_0603,x ; PRG $13E8 | CPU $D3E8 | FE 03 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D3 EB. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D3EB: + rts ; PRG $13EB | CPU $D3EB | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Evaluate Collision State D3 EC. +; Local behavior: Reads ScreenCollisionState, Flow_D3D5, OamBufferWriteOffset, Ram_060F, Ram_060E, Flow_D440, Flow_D40A, Flow_D47A; mutates CollisionMask, Ram_060E. +; Parameters: ScreenCollisionState, Flow_D3D5, OamBufferWriteOffset, Ram_060F, Ram_060E, Flow_D440, Flow_D40A, Flow_D47A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EvaluateCollisionState_D3EC: + lda ScreenCollisionState ; PRG $13EC | CPU $D3EC | A5 44 + cmp #$02 ; PRG $13EE | CPU $D3EE | C9 02 + bcs Flow_D3D5 ; PRG $13F0 | CPU $D3F0 | B0 E3 + ldx OamBufferWriteOffset ; PRG $13F2 | CPU $D3F2 | A6 AB + lda Ram_060F,x ; PRG $13F4 | CPU $D3F4 | BD 0F 06 + sta CollisionMask ; PRG $13F7 | CPU $D3F7 | 85 BF + ldy Ram_060E,x ; PRG $13F9 | CPU $D3F9 | BC 0E 06 + beq Flow_D440 ; PRG $13FC | CPU $D3FC | F0 42 + dec Ram_060E,x ; PRG $13FE | CPU $D3FE | DE 0E 06 + beq Flow_D40A ; PRG $1401 | CPU $D401 | F0 07 + dec Ram_060E,x ; PRG $1403 | CPU $D403 | DE 0E 06 + beq Flow_D47A ; PRG $1406 | CPU $D406 | F0 72 + bne Flow_D3EB ; PRG $1408 | CPU $D408 | D0 E1 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D40 A. +; Local behavior: Reads ComputeOrDispatch_E9C6, OamBufferWriteOffset, Ram_0611, Flow_D41F; mutates AudioEffectRequest. +; Parameters: ComputeOrDispatch_E9C6, OamBufferWriteOffset, Ram_0611, Flow_D41F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D40A: + lda #$02 ; PRG $140A | CPU $D40A | A9 02 + sta AudioEffectRequest ; PRG $140C | CPU $D40C | 85 FE + jsr ComputeOrDispatch_E9C6 ; PRG $140E | CPU $D40E | 20 C6 E9 + ldx OamBufferWriteOffset ; PRG $1411 | CPU $D411 | A6 AB + lda Ram_0611,x ; PRG $1413 | CPU $D413 | BD 11 06 + clc ; PRG $1416 | CPU $D416 | 18 + adc #$20 ; PRG $1417 | CPU $D417 | 69 20 + cmp #$D8 ; PRG $1419 | CPU $D419 | C9 D8 + bcc Flow_D41F ; PRG $141B | CPU $D41B | 90 02 + lda #$D8 ; PRG $141D | CPU $D41D | A9 D8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D41 F. +; Local behavior: Reads Ram_0601, Flow_D433, Flow_D438, Flow_D43D, UpdateZp_BC_D5EA, Flow_D440; mutates Ram_0611. +; Parameters: Ram_0601, Flow_D433, Flow_D438, Flow_D43D, UpdateZp_BC_D5EA, Flow_D440. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D41F: + sta Ram_0611,x ; PRG $141F | CPU $D41F | 9D 11 06 + ldy Ram_0601,x ; PRG $1422 | CPU $D422 | BC 01 06 + dey ; PRG $1425 | CPU $D425 | 88 + beq Flow_D433 ; PRG $1426 | CPU $D426 | F0 0B + dey ; PRG $1428 | CPU $D428 | 88 + beq Flow_D438 ; PRG $1429 | CPU $D429 | F0 0D + dey ; PRG $142B | CPU $D42B | 88 + beq Flow_D43D ; PRG $142C | CPU $D42C | F0 0F + jsr UpdateZp_BC_D5EA ; PRG $142E | CPU $D42E | 20 EA D5 + bne Flow_D440 ; PRG $1431 | CPU $D431 | D0 0D +; ----------------------------------------------------------------------------- +; Global purpose: Flow D433. +; Local behavior: Reads ComputeOrDispatch_D5D1, Flow_D440; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_D5D1, Flow_D440. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D433: + jsr ComputeOrDispatch_D5D1 ; PRG $1433 | CPU $D433 | 20 D1 D5 + bne Flow_D440 ; PRG $1436 | CPU $D436 | D0 08 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D438. +; Local behavior: Reads ComputeOrDispatch_D603, Flow_D440; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_D603, Flow_D440. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D438: + jsr ComputeOrDispatch_D603 ; PRG $1438 | CPU $D438 | 20 03 D6 + bne Flow_D440 ; PRG $143B | CPU $D43B | D0 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D43 D. +; Local behavior: Reads UpdateZp_0F_D60D; mutates no direct memory mutation observed. +; Parameters: UpdateZp_0F_D60D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D43D: + jsr UpdateZp_0F_D60D ; PRG $143D | CPU $D43D | 20 0D D6 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D440. +; Local behavior: Reads Ram_0611, Flow_D498, Flow_D464, Flow_D461, Ram_0601, Flow_D45E, UpdateZp_BC_D5DB; mutates Ram_0611. +; Parameters: Ram_0611, Flow_D498, Flow_D464, Flow_D461, Ram_0601, Flow_D45E, UpdateZp_BC_D5DB. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D440: + lda Ram_0611,x ; PRG $1440 | CPU $D440 | BD 11 06 + beq Flow_D498 ; PRG $1443 | CPU $D443 | F0 53 + dec Ram_0611,x ; PRG $1445 | CPU $D445 | DE 11 06 + beq Flow_D464 ; PRG $1448 | CPU $D448 | F0 1A + cmp #$10 ; PRG $144A | CPU $D44A | C9 10 + bne Flow_D461 ; PRG $144C | CPU $D44C | D0 13 + lda Ram_0601,x ; PRG $144E | CPU $D44E | BD 01 06 + cmp #$03 ; PRG $1451 | CPU $D451 | C9 03 + beq Flow_D45E ; PRG $1453 | CPU $D453 | F0 09 + cmp #$04 ; PRG $1455 | CPU $D455 | C9 04 + bne Flow_D461 ; PRG $1457 | CPU $D457 | D0 08 + jsr UpdateZp_BC_D5DB ; PRG $1459 | CPU $D459 | 20 DB D5 + bne Flow_D461 ; PRG $145C | CPU $D45C | D0 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D45 E. +; Local behavior: Reads ComputeOrDispatch_D5D1; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_D5D1. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D45E: + jsr ComputeOrDispatch_D5D1 ; PRG $145E | CPU $D45E | 20 D1 D5 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D461. +; Local behavior: Reads Continuation_D500; mutates no direct memory mutation observed. +; Parameters: Continuation_D500. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D461: + jmp Continuation_D500 ; PRG $1461 | CPU $D461 | 4C 00 D5 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D464. +; Local behavior: Reads Ram_0601, Flow_D477, Flow_D474, ComputeOrDispatch_D5C0; mutates no direct memory mutation observed. +; Parameters: Ram_0601, Flow_D477, Flow_D474, ComputeOrDispatch_D5C0. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D464: + lda Ram_0601,x ; PRG $1464 | CPU $D464 | BD 01 06 + cmp #$03 ; PRG $1467 | CPU $D467 | C9 03 + bcs Flow_D477 ; PRG $1469 | CPU $D469 | B0 0C + cmp #$02 ; PRG $146B | CPU $D46B | C9 02 + beq Flow_D474 ; PRG $146D | CPU $D46D | F0 05 + jsr ComputeOrDispatch_D5C0 ; PRG $146F | CPU $D46F | 20 C0 D5 + bne Flow_D477 ; PRG $1472 | CPU $D472 | D0 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D474. +; Local behavior: Reads ComputeOrDispatch_D5F9; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_D5F9. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D474: + jsr ComputeOrDispatch_D5F9 ; PRG $1474 | CPU $D474 | 20 F9 D5 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D477. +; Local behavior: Reads Flow_D498; mutates no direct memory mutation observed. +; Parameters: Flow_D498. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D477: + jmp Flow_D498 ; PRG $1477 | CPU $D477 | 4C 98 D4 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D47 A. +; Local behavior: Reads ComputeOrDispatch_E9C6, OamBufferWriteOffset; mutates Ram_0618, AudioEffectRequest. +; Parameters: ComputeOrDispatch_E9C6, OamBufferWriteOffset. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D47A: + lda #$04 ; PRG $147A | CPU $D47A | A9 04 + sta Ram_0618,x ; PRG $147C | CPU $D47C | 9D 18 06 + lda #$02 ; PRG $147F | CPU $D47F | A9 02 + sta AudioEffectRequest ; PRG $1481 | CPU $D481 | 85 FE + jsr ComputeOrDispatch_E9C6 ; PRG $1483 | CPU $D483 | 20 C6 E9 + ldx OamBufferWriteOffset ; PRG $1486 | CPU $D486 | A6 AB +; ----------------------------------------------------------------------------- +; Global purpose: Continuation D488. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_0600, Ram_0606, Ram_0603. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$02; sta Ram_0603,x; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_D488: + lda #$00 ; PRG $1488 | CPU $D488 | A9 00 + sta Ram_0600,x ; PRG $148A | CPU $D48A | 9D 00 06 + lda #$48 ; PRG $148D | CPU $D48D | A9 48 + sta Ram_0606,x ; PRG $148F | CPU $D48F | 9D 06 06 + lda #$02 ; PRG $1492 | CPU $D492 | A9 02 + sta Ram_0603,x ; PRG $1494 | CPU $D494 | 9D 03 06 + rts ; PRG $1497 | CPU $D497 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D498. +; Local behavior: Reads Ram_0601, Flow_D4CA, Flow_D4A6, Continuation_D59E; mutates no direct memory mutation observed. +; Parameters: Ram_0601, Flow_D4CA, Flow_D4A6, Continuation_D59E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D498: + lda Ram_0601,x ; PRG $1498 | CPU $D498 | BD 01 06 + cmp #$02 ; PRG $149B | CPU $D49B | C9 02 + beq Flow_D4CA ; PRG $149D | CPU $D49D | F0 2B + cmp #$04 ; PRG $149F | CPU $D49F | C9 04 + bne Flow_D4A6 ; PRG $14A1 | CPU $D4A1 | D0 03 + jmp Continuation_D59E ; PRG $14A3 | CPU $D4A3 | 4C 9E D5 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D4 A6. +; Local behavior: Reads Ram_060B, Flow_D4B4, Flow_D559; mutates Ram_060B. +; Parameters: Ram_060B, Flow_D4B4, Flow_D559. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D4A6: + ldy Ram_060B,x ; PRG $14A6 | CPU $D4A6 | BC 0B 06 + inc Ram_060B,x ; PRG $14A9 | CPU $D4A9 | FE 0B 06 + lda $D617,y ; PRG $14AC | CPU $D4AC | B9 17 D6 + bmi Flow_D4B4 ; PRG $14AF | CPU $D4AF | 30 03 + jmp Flow_D559 ; PRG $14B1 | CPU $D4B1 | 4C 59 D5 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D4 B4. +; Local behavior: Reads Flow_D4C2, ComputeOrDispatch_D5C0, Flow_D498; mutates Ram_0601. +; Parameters: Flow_D4C2, ComputeOrDispatch_D5C0, Flow_D498. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D4B4: + and #$07 ; PRG $14B4 | CPU $D4B4 | 29 07 + sta Ram_0601,x ; PRG $14B6 | CPU $D4B6 | 9D 01 06 + cmp #$02 ; PRG $14B9 | CPU $D4B9 | C9 02 + beq Flow_D4C2 ; PRG $14BB | CPU $D4BB | F0 05 + jsr ComputeOrDispatch_D5C0 ; PRG $14BD | CPU $D4BD | 20 C0 D5 + bne Flow_D498 ; PRG $14C0 | CPU $D4C0 | D0 D6 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D4 C2. +; Local behavior: Reads ComputeOrDispatch_D5F9; mutates Ram_0614. +; Parameters: ComputeOrDispatch_D5F9. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D4C2: + lda #$00 ; PRG $14C2 | CPU $D4C2 | A9 00 + sta Ram_0614,x ; PRG $14C4 | CPU $D4C4 | 9D 14 06 + jsr ComputeOrDispatch_D5F9 ; PRG $14C7 | CPU $D4C7 | 20 F9 D5 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D4 CA. +; Local behavior: Reads Ram_060B, Ram_0614, Ram_0615, Flow_D4E6; mutates Ram_060B, Ram_0614. +; Parameters: Ram_060B, Ram_0614, Ram_0615, Flow_D4E6. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D4CA: + ldy Ram_060B,x ; PRG $14CA | CPU $D4CA | BC 0B 06 + inc Ram_060B,x ; PRG $14CD | CPU $D4CD | FE 0B 06 + inc Ram_0614,x ; PRG $14D0 | CPU $D4D0 | FE 14 06 + lda Ram_0614,x ; PRG $14D3 | CPU $D4D3 | BD 14 06 + cmp Ram_0615,x ; PRG $14D6 | CPU $D4D6 | DD 15 06 + beq Flow_D4E6 ; PRG $14D9 | CPU $D4D9 | F0 0B + and #$07 ; PRG $14DB | CPU $D4DB | 29 07 + bne Flow_D4E6 ; PRG $14DD | CPU $D4DD | D0 07 + tya ; PRG $14DF | CPU $D4DF | 98 + sec ; PRG $14E0 | CPU $D4E0 | 38 + sbc #$07 ; PRG $14E1 | CPU $D4E1 | E9 07 + sta Ram_060B,x ; PRG $14E3 | CPU $D4E3 | 9D 0B 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D4 E6. +; Local behavior: Reads Flow_D559, CollisionMask, CodeOrDataPointerTable_D6EF, ComputeOrDispatch_D5D1, Flow_D4A6; mutates Ram_0601, Ram_060B. +; Parameters: Flow_D559, CollisionMask, CodeOrDataPointerTable_D6EF, ComputeOrDispatch_D5D1, Flow_D4A6. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D4E6: + lda $D617,y ; PRG $14E6 | CPU $D4E6 | B9 17 D6 + bpl Flow_D559 ; PRG $14E9 | CPU $D4E9 | 10 6E + lda #$03 ; PRG $14EB | CPU $D4EB | A9 03 + sta Ram_0601,x ; PRG $14ED | CPU $D4ED | 9D 01 06 + lda CollisionMask ; PRG $14F0 | CPU $D4F0 | A5 BF + and #$7F ; PRG $14F2 | CPU $D4F2 | 29 7F + tay ; PRG $14F4 | CPU $D4F4 | A8 + lda CodeOrDataPointerTable_D6EF,y ; PRG $14F5 | CPU $D4F5 | B9 EF D6 + sta Ram_060B,x ; PRG $14F8 | CPU $D4F8 | 9D 0B 06 + jsr ComputeOrDispatch_D5D1 ; PRG $14FB | CPU $D4FB | 20 D1 D5 + bne Flow_D4A6 ; PRG $14FE | CPU $D4FE | D0 A6 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation D500. +; Local behavior: Reads Ram_0601, Flow_D50C, Flow_D52A; mutates no direct memory mutation observed. +; Parameters: Ram_0601, Flow_D50C, Flow_D52A. +; Returns: returns to caller; flags/register result depends on final instructions: cmp #$02; beq Flow_D52A; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_D500: + lda Ram_0601,x ; PRG $1500 | CPU $D500 | BD 01 06 + cmp #$01 ; PRG $1503 | CPU $D503 | C9 01 + beq Flow_D50C ; PRG $1505 | CPU $D505 | F0 05 + cmp #$02 ; PRG $1507 | CPU $D507 | C9 02 + beq Flow_D52A ; PRG $1509 | CPU $D509 | F0 1F + rts ; PRG $150B | CPU $D50B | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D50 C. +; Local behavior: Reads Ram_060B, Flow_D55D, Ram_0611, Continuation_D488; mutates Ram_060B, Ram_0618, Ram_0601. +; Parameters: Ram_060B, Flow_D55D, Ram_0611, Continuation_D488. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D50C: + dec Ram_060B,x ; PRG $150C | CPU $D50C | DE 0B 06 + ldy Ram_060B,x ; PRG $150F | CPU $D50F | BC 0B 06 + lda $D617,y ; PRG $1512 | CPU $D512 | B9 17 D6 + bpl Flow_D55D ; PRG $1515 | CPU $D515 | 10 46 + lda Ram_0611,x ; PRG $1517 | CPU $D517 | BD 11 06 + lsr a ; PRG $151A | CPU $D51A | 4A + lsr a ; PRG $151B | CPU $D51B | 4A + lsr a ; PRG $151C | CPU $D51C | 4A + adc #$01 ; PRG $151D | CPU $D51D | 69 01 + sta Ram_0618,x ; PRG $151F | CPU $D51F | 9D 18 06 + lda #$00 ; PRG $1522 | CPU $D522 | A9 00 + sta Ram_0601,x ; PRG $1524 | CPU $D524 | 9D 01 06 + jmp Continuation_D488 ; PRG $1527 | CPU $D527 | 4C 88 D4 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D52 A. +; Local behavior: Reads Ram_0614, Flow_D544, Ram_0615, Ram_060B; mutates Ram_0614, Ram_060B. +; Parameters: Ram_0614, Flow_D544, Ram_0615, Ram_060B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D52A: + lda Ram_0614,x ; PRG $152A | CPU $D52A | BD 14 06 + beq Flow_D544 ; PRG $152D | CPU $D52D | F0 15 + dec Ram_0614,x ; PRG $152F | CPU $D52F | DE 14 06 + cmp Ram_0615,x ; PRG $1532 | CPU $D532 | DD 15 06 + beq Flow_D544 ; PRG $1535 | CPU $D535 | F0 0D + and #$07 ; PRG $1537 | CPU $D537 | 29 07 + bne Flow_D544 ; PRG $1539 | CPU $D539 | D0 09 + lda Ram_060B,x ; PRG $153B | CPU $D53B | BD 0B 06 + clc ; PRG $153E | CPU $D53E | 18 + adc #$08 ; PRG $153F | CPU $D53F | 69 08 + sta Ram_060B,x ; PRG $1541 | CPU $D541 | 9D 0B 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D544. +; Local behavior: Reads Ram_060B, Flow_D55D, ComputeOrDispatch_D5D1, Flow_D50C; mutates Ram_060B, Ram_0601. +; Parameters: Ram_060B, Flow_D55D, ComputeOrDispatch_D5D1, Flow_D50C. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D544: + dec Ram_060B,x ; PRG $1544 | CPU $D544 | DE 0B 06 + ldy Ram_060B,x ; PRG $1547 | CPU $D547 | BC 0B 06 + lda $D617,y ; PRG $154A | CPU $D54A | B9 17 D6 + bpl Flow_D55D ; PRG $154D | CPU $D54D | 10 0E + lda #$01 ; PRG $154F | CPU $D54F | A9 01 + sta Ram_0601,x ; PRG $1551 | CPU $D551 | 9D 01 06 + jsr ComputeOrDispatch_D5D1 ; PRG $1554 | CPU $D554 | 20 D1 D5 + bne Flow_D50C ; PRG $1557 | CPU $D557 | D0 B3 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D559. +; Local behavior: Reads Flow_D55F; mutates no direct memory mutation observed. +; Parameters: Flow_D55F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D559: + ldy #$00 ; PRG $1559 | CPU $D559 | A0 00 + beq Flow_D55F ; PRG $155B | CPU $D55B | F0 02 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D55 D. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D55D: + ldy #$80 ; PRG $155D | CPU $D55D | A0 80 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D55 F. +; Local behavior: Reads CurrentSpriteTileId, Flow_D570; mutates CurrentSpriteTileId, CoordinateLimit. +; Parameters: CurrentSpriteTileId, Flow_D570. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D55F: + sty CurrentSpriteTileId ; PRG $155F | CPU $D55F | 84 11 + sta CoordinateLimit ; PRG $1561 | CPU $D561 | 85 12 + and #$70 ; PRG $1563 | CPU $D563 | 29 70 + lsr a ; PRG $1565 | CPU $D565 | 4A + lsr a ; PRG $1566 | CPU $D566 | 4A + lsr a ; PRG $1567 | CPU $D567 | 4A + lsr a ; PRG $1568 | CPU $D568 | 4A + ldy CurrentSpriteTileId ; PRG $1569 | CPU $D569 | A4 11 + beq Flow_D570 ; PRG $156B | CPU $D56B | F0 03 + eor #$FF ; PRG $156D | CPU $D56D | 49 FF + sec ; PRG $156F | CPU $D56F | 38 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D570. +; Local behavior: Reads Ram_0608, CoordinateLimit, Flow_D584; mutates Ram_0608, CoordinateLimit. +; Parameters: Ram_0608, CoordinateLimit, Flow_D584. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D570: + adc Ram_0608,x ; PRG $1570 | CPU $D570 | 7D 08 06 + sta Ram_0608,x ; PRG $1573 | CPU $D573 | 9D 08 06 + ldy #$00 ; PRG $1576 | CPU $D576 | A0 00 + lda CoordinateLimit ; PRG $1578 | CPU $D578 | A5 12 + and #$0F ; PRG $157A | CPU $D57A | 29 0F + sta CoordinateLimit ; PRG $157C | CPU $D57C | 85 12 + and #$08 ; PRG $157E | CPU $D57E | 29 08 + beq Flow_D584 ; PRG $1580 | CPU $D580 | F0 02 + ldy #$F0 ; PRG $1582 | CPU $D582 | A0 F0 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D584. +; Local behavior: Reads CoordinateLimit, CollisionMask, CurrentSpriteTileId, Flow_D596; mutates no direct memory mutation observed. +; Parameters: CoordinateLimit, CollisionMask, CurrentSpriteTileId, Flow_D596. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D584: + tya ; PRG $1584 | CPU $D584 | 98 + ora CoordinateLimit ; PRG $1585 | CPU $D585 | 05 12 + tay ; PRG $1587 | CPU $D587 | A8 + clc ; PRG $1588 | CPU $D588 | 18 + lda CollisionMask ; PRG $1589 | CPU $D589 | A5 BF + and #$80 ; PRG $158B | CPU $D58B | 29 80 + eor CurrentSpriteTileId ; PRG $158D | CPU $D58D | 45 11 + bpl Flow_D596 ; PRG $158F | CPU $D58F | 10 05 + tya ; PRG $1591 | CPU $D591 | 98 + eor #$FF ; PRG $1592 | CPU $D592 | 49 FF + sec ; PRG $1594 | CPU $D594 | 38 + tay ; PRG $1595 | CPU $D595 | A8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D596. +; Local behavior: Reads Ram_0609; mutates Ram_0609. +; Parameters: Ram_0609. +; Returns: returns to caller; flags/register result depends on final instructions: adc Ram_0609,x; sta Ram_0609,x; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D596: + tya ; PRG $1596 | CPU $D596 | 98 + adc Ram_0609,x ; PRG $1597 | CPU $D597 | 7D 09 06 + sta Ram_0609,x ; PRG $159A | CPU $D59A | 9D 09 06 + rts ; PRG $159D | CPU $D59D | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation D59 E. +; Local behavior: Reads Ram_0609, Ram_060C, CalculateAndClampValue_CE27, OamBufferWriteOffset, Flow_D5B2; mutates Ram_0609. +; Parameters: Ram_0609, Ram_060C, CalculateAndClampValue_CE27, OamBufferWriteOffset, Flow_D5B2. +; Returns: returns to caller; flags/register result depends on final instructions: tya; sta Ram_0609,x; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_D59E: + lda Ram_0609,x ; PRG $159E | CPU $D59E | BD 09 06 + clc ; PRG $15A1 | CPU $D5A1 | 18 + adc Ram_060C,x ; PRG $15A2 | CPU $D5A2 | 7D 0C 06 + tay ; PRG $15A5 | CPU $D5A5 | A8 + jsr CalculateAndClampValue_CE27 ; PRG $15A6 | CPU $D5A6 | 20 27 CE + ldx OamBufferWriteOffset ; PRG $15A9 | CPU $D5A9 | A6 AB + bcs Flow_D5B2 ; PRG $15AB | CPU $D5AB | B0 05 + tya ; PRG $15AD | CPU $D5AD | 98 + sta Ram_0609,x ; PRG $15AE | CPU $D5AE | 9D 09 06 + rts ; PRG $15B1 | CPU $D5B1 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D5 B2. +; Local behavior: Reads Ram_060C, UpdateZp_BC_D5DB; mutates Ram_060C. +; Parameters: Ram_060C, UpdateZp_BC_D5DB. +; Returns: returns to caller; flags/register result depends on final instructions: sta Ram_060C,x; jsr UpdateZp_BC_D5DB; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D5B2: + lda Ram_060C,x ; PRG $15B2 | CPU $D5B2 | BD 0C 06 + eor #$FF ; PRG $15B5 | CPU $D5B5 | 49 FF + adc #$00 ; PRG $15B7 | CPU $D5B7 | 69 00 + sta Ram_060C,x ; PRG $15B9 | CPU $D5B9 | 9D 0C 06 + jsr UpdateZp_BC_D5DB ; PRG $15BC | CPU $D5BC | 20 DB D5 + rts ; PRG $15BF | CPU $D5BF | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch D5 C0. +; Local behavior: Reads CollisionMask, Flow_D5C8; mutates no direct memory mutation observed. +; Parameters: CollisionMask, Flow_D5C8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_D5C0: + lda #$00 ; PRG $15C0 | CPU $D5C0 | A9 00 + bit CollisionMask ; PRG $15C2 | CPU $D5C2 | 24 BF + bpl Flow_D5C8 ; PRG $15C4 | CPU $D5C4 | 10 02 + lda #$06 ; PRG $15C6 | CPU $D5C6 | A9 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D5 C8. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_0605, Ram_0603. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$01; sta Ram_0603,x; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D5C8: + sta Ram_0605,x ; PRG $15C8 | CPU $D5C8 | 9D 05 06 + lda #$01 ; PRG $15CB | CPU $D5CB | A9 01 + sta Ram_0603,x ; PRG $15CD | CPU $D5CD | 9D 03 06 + rts ; PRG $15D0 | CPU $D5D0 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch D5 D1. +; Local behavior: Reads CollisionMask, Flow_D5C8; mutates no direct memory mutation observed. +; Parameters: CollisionMask, Flow_D5C8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_D5D1: + lda #$00 ; PRG $15D1 | CPU $D5D1 | A9 00 + bit CollisionMask ; PRG $15D3 | CPU $D5D3 | 24 BF + bmi Flow_D5C8 ; PRG $15D5 | CPU $D5D5 | 30 F1 + lda #$06 ; PRG $15D7 | CPU $D5D7 | A9 06 + bne Flow_D5C8 ; PRG $15D9 | CPU $D5D9 | D0 ED +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp BC D5 DB. +; Local behavior: Reads Ram_060C, MovementDirectionFlags, Flow_D5C8; mutates MovementDirectionFlags. +; Parameters: Ram_060C, MovementDirectionFlags, Flow_D5C8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_BC_D5DB: + lda Ram_060C,x ; PRG $15DB | CPU $D5DB | BD 0C 06 + sta MovementDirectionFlags ; PRG $15DE | CPU $D5DE | 85 BC + lda #$00 ; PRG $15E0 | CPU $D5E0 | A9 00 + bit MovementDirectionFlags ; PRG $15E2 | CPU $D5E2 | 24 BC + bmi Flow_D5C8 ; PRG $15E4 | CPU $D5E4 | 30 E2 + lda #$06 ; PRG $15E6 | CPU $D5E6 | A9 06 + bne Flow_D5C8 ; PRG $15E8 | CPU $D5E8 | D0 DE +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp BC D5 EA. +; Local behavior: Reads Ram_060C, MovementDirectionFlags, Flow_D5C8; mutates MovementDirectionFlags. +; Parameters: Ram_060C, MovementDirectionFlags, Flow_D5C8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_BC_D5EA: + lda Ram_060C,x ; PRG $15EA | CPU $D5EA | BD 0C 06 + sta MovementDirectionFlags ; PRG $15ED | CPU $D5ED | 85 BC + lda #$18 ; PRG $15EF | CPU $D5EF | A9 18 + bit MovementDirectionFlags ; PRG $15F1 | CPU $D5F1 | 24 BC + bmi Flow_D5C8 ; PRG $15F3 | CPU $D5F3 | 30 D3 + lda #$1E ; PRG $15F5 | CPU $D5F5 | A9 1E + bne Flow_D5C8 ; PRG $15F7 | CPU $D5F7 | D0 CF +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch D5 F9. +; Local behavior: Reads CollisionMask, Flow_D5C8; mutates no direct memory mutation observed. +; Parameters: CollisionMask, Flow_D5C8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_D5F9: + lda #$0C ; PRG $15F9 | CPU $D5F9 | A9 0C + bit CollisionMask ; PRG $15FB | CPU $D5FB | 24 BF + bpl Flow_D5C8 ; PRG $15FD | CPU $D5FD | 10 C9 + lda #$12 ; PRG $15FF | CPU $D5FF | A9 12 + bne Flow_D5C8 ; PRG $1601 | CPU $D601 | D0 C5 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch D603. +; Local behavior: Reads CollisionMask, Flow_D5C8; mutates no direct memory mutation observed. +; Parameters: CollisionMask, Flow_D5C8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_D603: + lda #$18 ; PRG $1603 | CPU $D603 | A9 18 + bit CollisionMask ; PRG $1605 | CPU $D605 | 24 BF + bpl Flow_D5C8 ; PRG $1607 | CPU $D607 | 10 BF + lda #$1E ; PRG $1609 | CPU $D609 | A9 1E + bne Flow_D5C8 ; PRG $160B | CPU $D60B | D0 BB +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp 0 F D60 D. +; Local behavior: Reads CollisionMask, Flow_D5C8; mutates IndirectStorePointer. +; Parameters: CollisionMask, Flow_D5C8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_0F_D60D: + lda #$18 ; PRG $160D | CPU $D60D | A9 18 + bit CollisionMask ; PRG $160F | CPU $D60F | 24 BF + bmi Flow_D5C8 ; PRG $1611 | CPU $D611 | 30 B5 + lda #$1E ; PRG $1613 | CPU $D613 | A9 1E + bne Flow_D5C8 ; PRG $1615 | CPU $D615 | D0 B1 + sta (IndirectStorePointer,x) ; PRG $1617 | CPU $D617 | 81 0F + .byte $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; PRG $1619 | CPU $D619 + .byte $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; PRG $1629 | CPU $D629 + .byte $0F,$1F,$0F,$0F,$1F,$0F,$0F,$1F,$0F,$0F,$1F,$0F,$1F,$1F,$1F,$10 ; PRG $1639 | CPU $D639 + .byte $0F,$1F,$1F,$10,$0F,$1F,$10,$1F,$1F,$1F,$0F,$10,$1F,$1F,$10,$1F ; PRG $1649 | CPU $D649 + .byte $10,$1F,$10,$1F,$10,$1F,$10,$10,$1F,$10,$10,$10,$1F,$10,$10,$10 ; PRG $1659 | CPU $D659 + .byte $1F,$10,$10,$82,$10,$10,$10,$10,$10,$10,$10,$10,$83,$81,$0F,$0F ; PRG $1669 | CPU $D669 + .byte $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; PRG $1679 | CPU $D679 + .byte $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$1F,$0F,$0F,$1F,$0F,$0F,$1F,$0F ; PRG $1689 | CPU $D689 + .byte $0F,$1F,$0F,$1F,$1F,$1F,$10,$0F,$10,$1F,$1F,$10,$1F,$10,$1F,$10 ; PRG $1699 | CPU $D699 + .byte $1F,$10,$1F,$10,$10,$1F,$10,$10,$10,$1F,$10,$10,$10,$1F,$10,$10 ; PRG $16A9 | CPU $D6A9 + .byte $82,$10,$10,$10,$10,$10,$10,$10,$10,$83,$00,$11,$10,$11,$10,$11 ; PRG $16B9 | CPU $D6B9 + .byte $10,$11,$10,$11,$10,$11,$10,$11,$10,$11,$10,$01,$01,$01,$01,$01 ; PRG $16C9 | CPU $D6C9 + .byte $01,$01,$01,$00,$11,$10,$11,$10,$11,$10,$11,$10,$11,$10,$11,$10 ; PRG $16D9 | CPU $D6D9 + .byte $11,$10,$11,$10,$00,$84 ; PRG $16E9 | CPU $D6E9 + +CodeOrDataPointerTable_D6EF: + .byte $D6,$C5,$C5,$AC ; PRG $16EF | CPU $D6EF +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 036 C D6 F3. +; Local behavior: Reads ScreenObjectMode, Flow_D739; mutates Ram_036C, Ram_0360, Ram_0361, Ram_036B, Ram_0372, Ram_0373, Ram_0374, Ram_0375. +; Parameters: ScreenObjectMode, Flow_D739. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_036C_D6F3: + lda #$01 ; PRG $16F3 | CPU $D6F3 | A9 01 + sta Ram_036C ; PRG $16F5 | CPU $D6F5 | 8D 6C 03 + lda #$00 ; PRG $16F8 | CPU $D6F8 | A9 00 + sta Ram_0360 ; PRG $16FA | CPU $D6FA | 8D 60 03 + sta Ram_0361 ; PRG $16FD | CPU $D6FD | 8D 61 03 + sta Ram_036B ; PRG $1700 | CPU $D700 | 8D 6B 03 + sta Ram_0372 ; PRG $1703 | CPU $D703 | 8D 72 03 + sta Ram_0373 ; PRG $1706 | CPU $D706 | 8D 73 03 + sta Ram_0374 ; PRG $1709 | CPU $D709 | 8D 74 03 + sta Ram_0375 ; PRG $170C | CPU $D70C | 8D 75 03 + sta Ram_0377 ; PRG $170F | CPU $D70F | 8D 77 03 + lda #$80 ; PRG $1712 | CPU $D712 | A9 80 + sta Ram_0369 ; PRG $1714 | CPU $D714 | 8D 69 03 + lda #$70 ; PRG $1717 | CPU $D717 | A9 70 + sta Ram_0368 ; PRG $1719 | CPU $D719 | 8D 68 03 + lda #$08 ; PRG $171C | CPU $D71C | A9 08 + sta Ram_036D ; PRG $171E | CPU $D71E | 8D 6D 03 + lda #$9C ; PRG $1721 | CPU $D721 | A9 9C + sta Ram_0371 ; PRG $1723 | CPU $D723 | 8D 71 03 + lda ScreenObjectMode ; PRG $1726 | CPU $D726 | A5 62 + cmp #$02 ; PRG $1728 | CPU $D728 | C9 02 + bne Flow_D739 ; PRG $172A | CPU $D72A | D0 0D + ldx #$00 ; PRG $172C | CPU $D72C | A2 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D72 E. +; Local behavior: Reads CodeOrDataPointerTable_D73A, Flow_D72E; mutates Ram_02E0. +; Parameters: CodeOrDataPointerTable_D73A, Flow_D72E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D72E: + lda CodeOrDataPointerTable_D73A,x ; PRG $172E | CPU $D72E | BD 3A D7 + sta Ram_02E0,x ; PRG $1731 | CPU $D731 | 9D E0 02 + inx ; PRG $1734 | CPU $D734 | E8 + cpx #$20 ; PRG $1735 | CPU $D735 | E0 20 + bne Flow_D72E ; PRG $1737 | CPU $D737 | D0 F5 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D739. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D739: + rts ; PRG $1739 | CPU $D739 | 60 + +CodeOrDataPointerTable_D73A: + .byte $6F,$E5,$03,$70,$6F,$E6,$03,$88,$6F,$E6,$03,$78,$6F,$E5,$03,$80 ; PRG $173A | CPU $D73A + .byte $77,$E5,$03,$70,$77,$E7,$03,$88,$77,$E7,$03,$78,$77,$E5,$03,$80 ; PRG $174A | CPU $D74A +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 0371 D75 A. +; Local behavior: Reads Ram_0360, Flow_D77A, Flow_D77D, Flow_D785, Flow_D78B, Flow_D788, Flow_D78E, Ram_0371; mutates Ram_0371. +; Parameters: Ram_0360, Flow_D77A, Flow_D77D, Flow_D785, Flow_D78B, Flow_D788, Flow_D78E, Ram_0371. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_0371_D75A: + ldy Ram_0360 ; PRG $175A | CPU $D75A | AC 60 03 + beq Flow_D77A ; PRG $175D | CPU $D75D | F0 1B + dey ; PRG $175F | CPU $D75F | 88 + beq Flow_D77D ; PRG $1760 | CPU $D760 | F0 1B + dey ; PRG $1762 | CPU $D762 | 88 + beq Flow_D785 ; PRG $1763 | CPU $D763 | F0 20 + dey ; PRG $1765 | CPU $D765 | 88 + beq Flow_D78B ; PRG $1766 | CPU $D766 | F0 23 + dey ; PRG $1768 | CPU $D768 | 88 + beq Flow_D788 ; PRG $1769 | CPU $D769 | F0 1D + dey ; PRG $176B | CPU $D76B | 88 + bne Flow_D78E ; PRG $176C | CPU $D76C | D0 20 + lda Ram_0371 ; PRG $176E | CPU $D76E | AD 71 03 + clc ; PRG $1771 | CPU $D771 | 18 + adc #$04 ; PRG $1772 | CPU $D772 | 69 04 + sta Ram_0371 ; PRG $1774 | CPU $D774 | 8D 71 03 + jmp Flow_D84A ; PRG $1777 | CPU $D777 | 4C 4A D8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D77 A. +; Local behavior: Reads Continuation_D7B1; mutates no direct memory mutation observed. +; Parameters: Continuation_D7B1. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D77A: + jmp Continuation_D7B1 ; PRG $177A | CPU $D77A | 4C B1 D7 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D77 D. +; Local behavior: Reads FrameCounter, Flow_D78E, Continuation_D80A; mutates no direct memory mutation observed. +; Parameters: FrameCounter, Flow_D78E, Continuation_D80A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D77D: + lda FrameCounter ; PRG $177D | CPU $D77D | A5 27 + lsr a ; PRG $177F | CPU $D77F | 4A + bcs Flow_D78E ; PRG $1780 | CPU $D780 | B0 0C + jmp Continuation_D80A ; PRG $1782 | CPU $D782 | 4C 0A D8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D785. +; Local behavior: Reads Continuation_D78F; mutates no direct memory mutation observed. +; Parameters: Continuation_D78F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D785: + jmp Continuation_D78F ; PRG $1785 | CPU $D785 | 4C 8F D7 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D788. +; Local behavior: Reads Continuation_D8D7; mutates no direct memory mutation observed. +; Parameters: Continuation_D8D7. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D788: + jmp Continuation_D8D7 ; PRG $1788 | CPU $D788 | 4C D7 D8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D78 B. +; Local behavior: Reads Continuation_D952; mutates no direct memory mutation observed. +; Parameters: Continuation_D952. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D78B: + jmp Continuation_D952 ; PRG $178B | CPU $D78B | 4C 52 D9 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D78 E. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D78E: + rts ; PRG $178E | CPU $D78E | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation D78 F. +; Local behavior: Reads FrameCounter, Flow_D7A9, Ram_0372, Flow_D7AC, ComputeOrDispatch_DDF8; mutates Ram_0372. +; Parameters: FrameCounter, Flow_D7A9, Ram_0372, Flow_D7AC, ComputeOrDispatch_DDF8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_D78F: + lda FrameCounter ; PRG $178F | CPU $D78F | A5 27 + and #$07 ; PRG $1791 | CPU $D791 | 29 07 + bne Flow_D7A9 ; PRG $1793 | CPU $D793 | D0 14 + lda Ram_0372 ; PRG $1795 | CPU $D795 | AD 72 03 + and #$3F ; PRG $1798 | CPU $D798 | 29 3F + sec ; PRG $179A | CPU $D79A | 38 + sbc #$01 ; PRG $179B | CPU $D79B | E9 01 + sta Ram_0372 ; PRG $179D | CPU $D79D | 8D 72 03 + beq Flow_D7AC ; PRG $17A0 | CPU $D7A0 | F0 0A + cmp #$0F ; PRG $17A2 | CPU $D7A2 | C9 0F + bne Flow_D7A9 ; PRG $17A4 | CPU $D7A4 | D0 03 + jsr ComputeOrDispatch_DDF8 ; PRG $17A6 | CPU $D7A6 | 20 F8 DD +; ----------------------------------------------------------------------------- +; Global purpose: Flow D7 A9. +; Local behavior: Reads Flow_D7ED; mutates no direct memory mutation observed. +; Parameters: Flow_D7ED. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D7A9: + jmp Flow_D7ED ; PRG $17A9 | CPU $D7A9 | 4C ED D7 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D7 AC. +; Local behavior: Reads implicit CPU state or none observed; mutates ObjectSpawnDelay. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$01; sta ObjectSpawnDelay; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D7AC: + lda #$01 ; PRG $17AC | CPU $D7AC | A9 01 + sta ObjectSpawnDelay ; PRG $17AE | CPU $D7AE | 85 47 + rts ; PRG $17B0 | CPU $D7B0 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation D7 B1. +; Local behavior: Reads Ram_036C, Flow_D7F0, Ram_036B; mutates Ram_036C. +; Parameters: Ram_036C, Flow_D7F0, Ram_036B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_D7B1: + dec Ram_036C ; PRG $17B1 | CPU $D7B1 | CE 6C 03 + bne Flow_D7F0 ; PRG $17B4 | CPU $D7B4 | D0 3A + ldy Ram_036B ; PRG $17B6 | CPU $D7B6 | AC 6B 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D7 B9. +; Local behavior: Reads IndexedGameplayLookupTable_D968, Flow_D7F1, Flow_D7D1, Flow_D7CC; mutates no direct memory mutation observed. +; Parameters: IndexedGameplayLookupTable_D968, Flow_D7F1, Flow_D7D1, Flow_D7CC. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D7B9: + lda IndexedGameplayLookupTable_D968,y ; PRG $17B9 | CPU $D7B9 | B9 68 D9 + cmp #$AA ; PRG $17BC | CPU $D7BC | C9 AA + beq Flow_D7F1 ; PRG $17BE | CPU $D7BE | F0 31 + and #$C0 ; PRG $17C0 | CPU $D7C0 | 29 C0 + beq Flow_D7D1 ; PRG $17C2 | CPU $D7C2 | F0 0D + ldx #$00 ; PRG $17C4 | CPU $D7C4 | A2 00 + and #$FF ; PRG $17C6 | CPU $D7C6 | 29 FF + bmi Flow_D7CC ; PRG $17C8 | CPU $D7C8 | 30 02 + ldx #$10 ; PRG $17CA | CPU $D7CA | A2 10 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D7 CC. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_038E. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D7CC: + lda #$01 ; PRG $17CC | CPU $D7CC | A9 01 + sta Ram_038E,x ; PRG $17CE | CPU $D7CE | 9D 8E 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D7 D1. +; Local behavior: Reads IndexedGameplayLookupTable_D968, Ram_0361, Flow_D7ED, UpdateZp_03_DADD; mutates Ram_036C, Ram_0372, Ram_036B. +; Parameters: IndexedGameplayLookupTable_D968, Ram_0361, Flow_D7ED, UpdateZp_03_DADD. +; Returns: returns to caller; flags/register result depends on final instructions: bne Flow_D7ED; jsr UpdateZp_03_DADD; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D7D1: + lda IndexedGameplayLookupTable_D968,y ; PRG $17D1 | CPU $D7D1 | B9 68 D9 + and #$3F ; PRG $17D4 | CPU $D7D4 | 29 3F + sta Ram_036C ; PRG $17D6 | CPU $D7D6 | 8D 6C 03 + iny ; PRG $17D9 | CPU $D7D9 | C8 + lda IndexedGameplayLookupTable_D968,y ; PRG $17DA | CPU $D7DA | B9 68 D9 + sta Ram_0372 ; PRG $17DD | CPU $D7DD | 8D 72 03 + iny ; PRG $17E0 | CPU $D7E0 | C8 + sty Ram_036B ; PRG $17E1 | CPU $D7E1 | 8C 6B 03 + ldy Ram_0361 ; PRG $17E4 | CPU $D7E4 | AC 61 03 + bne Flow_D7ED ; PRG $17E7 | CPU $D7E7 | D0 04 + jsr UpdateZp_03_DADD ; PRG $17E9 | CPU $D7E9 | 20 DD DA + rts ; PRG $17EC | CPU $D7EC | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D7 ED. +; Local behavior: Reads TransformPackedValue_D9D3; mutates no direct memory mutation observed. +; Parameters: TransformPackedValue_D9D3. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D7ED: + jsr TransformPackedValue_D9D3 ; PRG $17ED | CPU $D7ED | 20 D3 D9 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D7 F0. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D7F0: + rts ; PRG $17F0 | CPU $D7F0 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D7 F1. +; Local behavior: Reads Ram_0361, Flow_D7FC, Flow_D7B9; mutates Ram_0361. +; Parameters: Ram_0361, Flow_D7FC, Flow_D7B9. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D7F1: + lda Ram_0361 ; PRG $17F1 | CPU $D7F1 | AD 61 03 + bne Flow_D7FC ; PRG $17F4 | CPU $D7F4 | D0 06 + inc Ram_0361 ; PRG $17F6 | CPU $D7F6 | EE 61 03 + iny ; PRG $17F9 | CPU $D7F9 | C8 + bne Flow_D7B9 ; PRG $17FA | CPU $D7FA | D0 BD +; ----------------------------------------------------------------------------- +; Global purpose: Flow D7 FC. +; Local behavior: Reads Ram_0360; mutates Ram_0360, Ram_0361, Ram_038D. +; Parameters: Ram_0360. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$01; sta Ram_038D; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D7FC: + inc Ram_0360 ; PRG $17FC | CPU $D7FC | EE 60 03 + lda #$00 ; PRG $17FF | CPU $D7FF | A9 00 + sta Ram_0361 ; PRG $1801 | CPU $D801 | 8D 61 03 + lda #$01 ; PRG $1804 | CPU $D804 | A9 01 + sta Ram_038D ; PRG $1806 | CPU $D806 | 8D 8D 03 + rts ; PRG $1809 | CPU $D809 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation D80 A. +; Local behavior: Reads Ram_0377, Flow_D815, Flow_D84A; mutates Ram_0377. +; Parameters: Ram_0377, Flow_D815, Flow_D84A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_D80A: + lda Ram_0377 ; PRG $180A | CPU $D80A | AD 77 03 + beq Flow_D815 ; PRG $180D | CPU $D80D | F0 06 + dec Ram_0377 ; PRG $180F | CPU $D80F | CE 77 03 + jmp Flow_D84A ; PRG $1812 | CPU $D812 | 4C 4A D8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D815. +; Local behavior: Reads Ram_036E, Flow_D83E, Flow_D824, Ram_0371; mutates Ram_0371. +; Parameters: Ram_036E, Flow_D83E, Flow_D824, Ram_0371. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D815: + lda Ram_036E ; PRG $1815 | CPU $D815 | AD 6E 03 + beq Flow_D83E ; PRG $1818 | CPU $D818 | F0 24 + cmp #$01 ; PRG $181A | CPU $D81A | C9 01 + beq Flow_D824 ; PRG $181C | CPU $D81C | F0 06 + dec Ram_0371 ; PRG $181E | CPU $D81E | CE 71 03 + dec Ram_0371 ; PRG $1821 | CPU $D821 | CE 71 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D824. +; Local behavior: Reads Ram_0371, SelectedScreenVariant, Flow_D834; mutates Ram_0371. +; Parameters: Ram_0371, SelectedScreenVariant, Flow_D834. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D824: + dec Ram_0371 ; PRG $1824 | CPU $D824 | CE 71 03 + dec Ram_0371 ; PRG $1827 | CPU $D827 | CE 71 03 + dec Ram_0371 ; PRG $182A | CPU $D82A | CE 71 03 + lda SelectedScreenVariant ; PRG $182D | CPU $D82D | A5 41 + bne Flow_D834 ; PRG $182F | CPU $D82F | D0 03 + dec Ram_0371 ; PRG $1831 | CPU $D831 | CE 71 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D834. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_036E, Ram_0376. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D834: + lda #$00 ; PRG $1834 | CPU $D834 | A9 00 + sta Ram_036E ; PRG $1836 | CPU $D836 | 8D 6E 03 + lda #$06 ; PRG $1839 | CPU $D839 | A9 06 + sta Ram_0376 ; PRG $183B | CPU $D83B | 8D 76 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D83 E. +; Local behavior: Reads FrameCounter, Flow_D84A, Ram_0371; mutates Ram_0371. +; Parameters: FrameCounter, Flow_D84A, Ram_0371. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D83E: + lda FrameCounter ; PRG $183E | CPU $D83E | A5 27 + and #$1F ; PRG $1840 | CPU $D840 | 29 1F + bne Flow_D84A ; PRG $1842 | CPU $D842 | D0 06 + inc Ram_0371 ; PRG $1844 | CPU $D844 | EE 71 03 + inc Ram_0371 ; PRG $1847 | CPU $D847 | EE 71 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D84 A. +; Local behavior: Reads Ram_0371, Flow_D8AC, ScreenObjectMode, Flow_D85E, Flow_D8BB; mutates no direct memory mutation observed. +; Parameters: Ram_0371, Flow_D8AC, ScreenObjectMode, Flow_D85E, Flow_D8BB. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D84A: + lda Ram_0371 ; PRG $184A | CPU $D84A | AD 71 03 + cmp #$40 ; PRG $184D | CPU $D84D | C9 40 + bcc Flow_D8AC ; PRG $184F | CPU $D84F | 90 5B + lda ScreenObjectMode ; PRG $1851 | CPU $D851 | A5 62 + cmp #$02 ; PRG $1853 | CPU $D853 | C9 02 + bne Flow_D85E ; PRG $1855 | CPU $D855 | D0 07 + lda Ram_0371 ; PRG $1857 | CPU $D857 | AD 71 03 + cmp #$50 ; PRG $185A | CPU $D85A | C9 50 + bcc Flow_D8BB ; PRG $185C | CPU $D85C | 90 5D +; ----------------------------------------------------------------------------- +; Global purpose: Flow D85 E. +; Local behavior: Reads ScreenObjectMode, Flow_D868; mutates no direct memory mutation observed. +; Parameters: ScreenObjectMode, Flow_D868. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D85E: + ldy #$CC ; PRG $185E | CPU $D85E | A0 CC + lda ScreenObjectMode ; PRG $1860 | CPU $D860 | A5 62 + cmp #$02 ; PRG $1862 | CPU $D862 | C9 02 + bne Flow_D868 ; PRG $1864 | CPU $D864 | D0 02 + ldy #$AC ; PRG $1866 | CPU $D866 | A0 AC +; ----------------------------------------------------------------------------- +; Global purpose: Flow D868. +; Local behavior: Reads Ram_0371, Flow_D8CD, Ram_0376, Flow_D88B; mutates PackedHudOrObjectValue, Ram_0372, Ram_0376. +; Parameters: Ram_0371, Flow_D8CD, Ram_0376, Flow_D88B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D868: + cpy Ram_0371 ; PRG $1868 | CPU $D868 | CC 71 03 + bcc Flow_D8CD ; PRG $186B | CPU $D86B | 90 60 + lda Ram_0371 ; PRG $186D | CPU $D86D | AD 71 03 + sec ; PRG $1870 | CPU $D870 | 38 + sbc #$40 ; PRG $1871 | CPU $D871 | E9 40 + sta PackedHudOrObjectValue ; PRG $1873 | CPU $D873 | 85 16 + lsr a ; PRG $1875 | CPU $D875 | 4A + lsr a ; PRG $1876 | CPU $D876 | 4A + lsr a ; PRG $1877 | CPU $D877 | 4A + clc ; PRG $1878 | CPU $D878 | 18 + adc #$10 ; PRG $1879 | CPU $D879 | 69 10 + sta Ram_0372 ; PRG $187B | CPU $D87B | 8D 72 03 + ldy Ram_0376 ; PRG $187E | CPU $D87E | AC 76 03 + beq Flow_D88B ; PRG $1881 | CPU $D881 | F0 08 + dec Ram_0376 ; PRG $1883 | CPU $D883 | CE 76 03 + ora #$80 ; PRG $1886 | CPU $D886 | 09 80 + sta Ram_0372 ; PRG $1888 | CPU $D888 | 8D 72 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D88 B. +; Local behavior: Reads PackedHudOrObjectValue, Ram_0377, Flow_D8A5, Ram_0374; mutates Ram_0368. +; Parameters: PackedHudOrObjectValue, Ram_0377, Flow_D8A5, Ram_0374. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D88B: + lda PackedHudOrObjectValue ; PRG $188B | CPU $D88B | A5 16 + lsr a ; PRG $188D | CPU $D88D | 4A + adc #$3C ; PRG $188E | CPU $D88E | 69 3C + sta Ram_0368 ; PRG $1890 | CPU $D890 | 8D 68 03 + ldy #$00 ; PRG $1893 | CPU $D893 | A0 00 + lda Ram_0377 ; PRG $1895 | CPU $D895 | AD 77 03 + beq Flow_D8A5 ; PRG $1898 | CPU $D898 | F0 0B + ldy Ram_0374 ; PRG $189A | CPU $D89A | AC 74 03 + cmp #$20 ; PRG $189D | CPU $D89D | C9 20 + bne Flow_D8A5 ; PRG $189F | CPU $D89F | D0 04 + tya ; PRG $18A1 | CPU $D8A1 | 98 + ora #$C0 ; PRG $18A2 | CPU $D8A2 | 09 C0 + tay ; PRG $18A4 | CPU $D8A4 | A8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D8 A5. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_0374. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D8A5: + sty Ram_0374 ; PRG $18A5 | CPU $D8A5 | 8C 74 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D8 A8. +; Local behavior: Reads TransformPackedValue_D9D3; mutates no direct memory mutation observed. +; Parameters: TransformPackedValue_D9D3. +; Returns: returns to caller; flags/register result depends on final instructions: jsr TransformPackedValue_D9D3; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D8A8: + jsr TransformPackedValue_D9D3 ; PRG $18A8 | CPU $D8A8 | 20 D3 D9 + rts ; PRG $18AB | CPU $D8AB | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D8 AC. +; Local behavior: Reads Flow_D8A8; mutates AudioRequestFlags, Ram_0360, ScreenObjectTrigger. +; Parameters: Flow_D8A8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D8AC: + lda #$07 ; PRG $18AC | CPU $D8AC | A9 07 + sta AudioRequestFlags ; PRG $18AE | CPU $D8AE | 85 FB + lda #$02 ; PRG $18B0 | CPU $D8B0 | A9 02 + sta Ram_0360 ; PRG $18B2 | CPU $D8B2 | 8D 60 03 + lda #$01 ; PRG $18B5 | CPU $D8B5 | A9 01 + sta ScreenObjectTrigger ; PRG $18B7 | CPU $D8B7 | 85 64 + bne Flow_D8A8 ; PRG $18B9 | CPU $D8B9 | D0 ED +; ----------------------------------------------------------------------------- +; Global purpose: Flow D8 BB. +; Local behavior: Reads Flow_D8A8; mutates Ram_0360, AudioRequestFlags, Ram_036C, ScreenObjectTrigger. +; Parameters: Flow_D8A8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D8BB: + lda #$03 ; PRG $18BB | CPU $D8BB | A9 03 + sta Ram_0360 ; PRG $18BD | CPU $D8BD | 8D 60 03 + sta AudioRequestFlags ; PRG $18C0 | CPU $D8C0 | 85 FB + lda #$A0 ; PRG $18C2 | CPU $D8C2 | A9 A0 + sta Ram_036C ; PRG $18C4 | CPU $D8C4 | 8D 6C 03 + lda #$01 ; PRG $18C7 | CPU $D8C7 | A9 01 + sta ScreenObjectTrigger ; PRG $18C9 | CPU $D8C9 | 85 64 + bne Flow_D8A8 ; PRG $18CB | CPU $D8CB | D0 DB +; ----------------------------------------------------------------------------- +; Global purpose: Flow D8 CD. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_0360, ScreenObjectCounter. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$01; sta ScreenObjectCounter; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D8CD: + lda #$04 ; PRG $18CD | CPU $D8CD | A9 04 + sta Ram_0360 ; PRG $18CF | CPU $D8CF | 8D 60 03 + lda #$01 ; PRG $18D2 | CPU $D8D2 | A9 01 + sta ScreenObjectCounter ; PRG $18D4 | CPU $D8D4 | 85 65 + rts ; PRG $18D6 | CPU $D8D6 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation D8 D7. +; Local behavior: Reads Ram_0361, Flow_D8E2, Flow_D925, Flow_D91D; mutates no direct memory mutation observed. +; Parameters: Ram_0361, Flow_D8E2, Flow_D925, Flow_D91D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_D8D7: + ldy Ram_0361 ; PRG $18D7 | CPU $D8D7 | AC 61 03 + beq Flow_D8E2 ; PRG $18DA | CPU $D8DA | F0 06 + cpy #$03 ; PRG $18DC | CPU $D8DC | C0 03 + beq Flow_D925 ; PRG $18DE | CPU $D8DE | F0 45 + bne Flow_D91D ; PRG $18E0 | CPU $D8E0 | D0 3B +; ----------------------------------------------------------------------------- +; Global purpose: Flow D8 E2. +; Local behavior: Reads ScreenObjectMode, Flow_D8F1; mutates Ram_0366. +; Parameters: ScreenObjectMode, Flow_D8F1. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D8E2: + lda #$4A ; PRG $18E2 | CPU $D8E2 | A9 4A + sta Ram_0366 ; PRG $18E4 | CPU $D8E4 | 8D 66 03 + ldy #$A8 ; PRG $18E7 | CPU $D8E7 | A0 A8 + lda ScreenObjectMode ; PRG $18E9 | CPU $D8E9 | A5 62 + cmp #$02 ; PRG $18EB | CPU $D8EB | C9 02 + bne Flow_D8F1 ; PRG $18ED | CPU $D8ED | D0 02 + ldy #$98 ; PRG $18EF | CPU $D8EF | A0 98 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D8 F1. +; Local behavior: Reads ScreenObjectMode, Flow_D912; mutates Ram_036A, Ram_0368, Ram_0365, Ram_0363, Ram_0362. +; Parameters: ScreenObjectMode, Flow_D912. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D8F1: + sty Ram_036A ; PRG $18F1 | CPU $D8F1 | 8C 6A 03 + lda #$80 ; PRG $18F4 | CPU $D8F4 | A9 80 + sta Ram_0368 ; PRG $18F6 | CPU $D8F6 | 8D 68 03 + lda #$C0 ; PRG $18F9 | CPU $D8F9 | A9 C0 + sta Ram_0365 ; PRG $18FB | CPU $D8FB | 8D 65 03 + lda #$01 ; PRG $18FE | CPU $D8FE | A9 01 + sta Ram_0363 ; PRG $1900 | CPU $D900 | 8D 63 03 + lda #$10 ; PRG $1903 | CPU $D903 | A9 10 + sta Ram_0362 ; PRG $1905 | CPU $D905 | 8D 62 03 + lda #$20 ; PRG $1908 | CPU $D908 | A9 20 + ldx ScreenObjectMode ; PRG $190A | CPU $D90A | A6 62 + cpx #$02 ; PRG $190C | CPU $D90C | E0 02 + bne Flow_D912 ; PRG $190E | CPU $D90E | D0 02 + lda #$24 ; PRG $1910 | CPU $D910 | A9 24 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D912. +; Local behavior: Reads UpdateZp_03_DADD, UpdateRam_0301_CEE5, UpdateZp_A8_D941; mutates no direct memory mutation observed. +; Parameters: UpdateZp_03_DADD, UpdateRam_0301_CEE5, UpdateZp_A8_D941. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D912: + jsr UpdateZp_03_DADD ; PRG $1912 | CPU $D912 | 20 DD DA + ldx #$60 ; PRG $1915 | CPU $D915 | A2 60 + jsr UpdateRam_0301_CEE5 ; PRG $1917 | CPU $D917 | 20 E5 CE + jmp UpdateZp_A8_D941 ; PRG $191A | CPU $D91A | 4C 41 D9 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D91 D. +; Local behavior: Reads ComputeOrDispatch_CEBF, UpdateZp_A8_D941; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_CEBF, UpdateZp_A8_D941. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D91D: + ldx #$60 ; PRG $191D | CPU $D91D | A2 60 + jsr ComputeOrDispatch_CEBF ; PRG $191F | CPU $D91F | 20 BF CE + jmp UpdateZp_A8_D941 ; PRG $1922 | CPU $D922 | 4C 41 D9 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D925. +; Local behavior: Reads Ram_0365, Flow_D94D, Ram_0363, UpdateZp_A8_D941, Ram_0362, Ram_0367; mutates Ram_0365, Ram_0363, Ram_0367, AudioPendingFlags. +; Parameters: Ram_0365, Flow_D94D, Ram_0363, UpdateZp_A8_D941, Ram_0362, Ram_0367. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D925: + dec Ram_0365 ; PRG $1925 | CPU $D925 | CE 65 03 + beq Flow_D94D ; PRG $1928 | CPU $D928 | F0 23 + dec Ram_0363 ; PRG $192A | CPU $D92A | CE 63 03 + bne UpdateZp_A8_D941 ; PRG $192D | CPU $D92D | D0 12 + lda Ram_0362 ; PRG $192F | CPU $D92F | AD 62 03 + sta Ram_0363 ; PRG $1932 | CPU $D932 | 8D 63 03 + lda Ram_0367 ; PRG $1935 | CPU $D935 | AD 67 03 + eor #$40 ; PRG $1938 | CPU $D938 | 49 40 + sta Ram_0367 ; PRG $193A | CPU $D93A | 8D 67 03 + lda #$04 ; PRG $193D | CPU $D93D | A9 04 + sta AudioPendingFlags ; PRG $193F | CPU $D93F | 85 FD +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp A8 D941. +; Local behavior: Reads LoadObjectSpriteRenderState; mutates ObjectRecordPointerLo, ObjectRecordPointerHi. +; Parameters: LoadObjectSpriteRenderState. +; Returns: returns to caller; flags/register result depends on final instructions: sta ObjectRecordPointerHi; jsr LoadObjectSpriteRenderState; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_A8_D941: + lda #$60 ; PRG $1941 | CPU $D941 | A9 60 + sta ObjectRecordPointerLo ; PRG $1943 | CPU $D943 | 85 A8 + lda #$03 ; PRG $1945 | CPU $D945 | A9 03 + sta ObjectRecordPointerHi ; PRG $1947 | CPU $D947 | 85 A9 + jsr LoadObjectSpriteRenderState ; PRG $1949 | CPU $D949 | 20 17 C2 + rts ; PRG $194C | CPU $D94C | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D94 D. +; Local behavior: Reads implicit CPU state or none observed; mutates ObjectSpawnDelay. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$01; sta ObjectSpawnDelay; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D94D: + lda #$01 ; PRG $194D | CPU $D94D | A9 01 + sta ObjectSpawnDelay ; PRG $194F | CPU $D94F | 85 47 + rts ; PRG $1951 | CPU $D951 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation D952. +; Local behavior: Reads Ram_036C, Flow_D94D, Flow_D967; mutates Ram_036C, AudioRequestFlags, Ram_03B8. +; Parameters: Ram_036C, Flow_D94D, Flow_D967. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_D952: + dec Ram_036C ; PRG $1952 | CPU $D952 | CE 6C 03 + beq Flow_D94D ; PRG $1955 | CPU $D955 | F0 F6 + lda Ram_036C ; PRG $1957 | CPU $D957 | AD 6C 03 + cmp #$58 ; PRG $195A | CPU $D95A | C9 58 + bne Flow_D967 ; PRG $195C | CPU $D95C | D0 09 + lda #$07 ; PRG $195E | CPU $D95E | A9 07 + sta AudioRequestFlags ; PRG $1960 | CPU $D960 | 85 FB + lda #$32 ; PRG $1962 | CPU $D962 | A9 32 + sta Ram_03B8 ; PRG $1964 | CPU $D964 | 8D B8 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D967. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D967: + rts ; PRG $1967 | CPU $D967 | 60 + +IndexedGameplayLookupTable_D968: + .byte $08,$00,$08,$04,$88,$14,$08,$10,$08,$14,$88,$10,$08,$14,$10,$00 ; PRG $1968 | CPU $D968 + .byte $08,$0C,$48,$1C,$08,$18,$08,$1C,$48,$18,$08,$1C,$08,$08,$AA,$06 ; PRG $1978 | CPU $D978 + .byte $16,$06,$17,$06,$18,$06,$19,$06,$1A,$AA ; PRG $1988 | CPU $D988 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D992. +; Local behavior: Reads CollisionFlags, Flow_D99E, PackedHudOrObjectValue, Continuation_D9B3; mutates PackedHudOrObjectValue. +; Parameters: CollisionFlags, Flow_D99E, PackedHudOrObjectValue, Continuation_D9B3. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D992: + lda CollisionFlags ; PRG $1992 | CPU $D992 | A5 C4 + bpl Flow_D99E ; PRG $1994 | CPU $D994 | 10 08 + lsr a ; PRG $1996 | CPU $D996 | 4A + rol PackedHudOrObjectValue ; PRG $1997 | CPU $D997 | 26 16 + lda PackedHudOrObjectValue ; PRG $1999 | CPU $D999 | A5 16 + jmp Continuation_D9B3 ; PRG $199B | CPU $D99B | 4C B3 D9 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D99 E. +; Local behavior: Reads UpdateRam_0375_D9CD, Flow_D9FF; mutates no direct memory mutation observed. +; Parameters: UpdateRam_0375_D9CD, Flow_D9FF. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D99E: + jsr UpdateRam_0375_D9CD ; PRG $199E | CPU $D99E | 20 CD D9 + jmp Flow_D9FF ; PRG $19A1 | CPU $D9A1 | 4C FF D9 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D9 A4. +; Local behavior: Reads CollisionFlags, PackedHudOrObjectValue; mutates PackedHudOrObjectValue. +; Parameters: CollisionFlags, PackedHudOrObjectValue. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D9A4: + lda CollisionFlags ; PRG $19A4 | CPU $D9A4 | A5 C4 + lsr a ; PRG $19A6 | CPU $D9A6 | 4A + rol PackedHudOrObjectValue ; PRG $19A7 | CPU $D9A7 | 26 16 + asl a ; PRG $19A9 | CPU $D9A9 | 0A + asl a ; PRG $19AA | CPU $D9AA | 0A + asl a ; PRG $19AB | CPU $D9AB | 0A + rol PackedHudOrObjectValue ; PRG $19AC | CPU $D9AC | 26 16 + lda PackedHudOrObjectValue ; PRG $19AE | CPU $D9AE | A5 16 + clc ; PRG $19B0 | CPU $D9B0 | 18 + adc #$02 ; PRG $19B1 | CPU $D9B1 | 69 02 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation D9 B3. +; Local behavior: Reads IndexedGameplayLookupTable_DBC2, IndexedGameplayLookupTable_DBC3, IndexedGameplayLookupTable_DBC4, IndexedGameplayLookupTable_DBC5, TransformPackedValue_DB15, ExpandPackedScoreOrHudData; mutates SourceRecordPointerLo, PackedCoordinateOrValue. +; Parameters: IndexedGameplayLookupTable_DBC2, IndexedGameplayLookupTable_DBC3, IndexedGameplayLookupTable_DBC4, IndexedGameplayLookupTable_DBC5, TransformPackedValue_DB15, ExpandPackedScoreOrHudData. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_D9B3: + asl a ; PRG $19B3 | CPU $D9B3 | 0A + asl a ; PRG $19B4 | CPU $D9B4 | 0A + tax ; PRG $19B5 | CPU $D9B5 | AA + lda IndexedGameplayLookupTable_DBC2,x ; PRG $19B6 | CPU $D9B6 | BD C2 DB + sta SourceRecordPointerLo ; PRG $19B9 | CPU $D9B9 | 85 03 + lda IndexedGameplayLookupTable_DBC3,x ; PRG $19BB | CPU $D9BB | BD C3 DB + sta PackedCoordinateOrValue ; PRG $19BE | CPU $D9BE | 85 04 + ldy IndexedGameplayLookupTable_DBC4,x ; PRG $19C0 | CPU $D9C0 | BC C4 DB + lda IndexedGameplayLookupTable_DBC5,x ; PRG $19C3 | CPU $D9C3 | BD C5 DB + tax ; PRG $19C6 | CPU $D9C6 | AA + jsr TransformPackedValue_DB15 ; PRG $19C7 | CPU $D9C7 | 20 15 DB + jsr ExpandPackedScoreOrHudData ; PRG $19CA | CPU $D9CA | 20 51 C4 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 0375 D9 CD. +; Local behavior: Reads CollisionFlags; mutates Ram_0375. +; Parameters: CollisionFlags. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_0375_D9CD: + lda CollisionFlags ; PRG $19CD | CPU $D9CD | A5 C4 + sta Ram_0375 ; PRG $19CF | CPU $D9CF | 8D 75 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow D9 D2. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D9D2: + rts ; PRG $19D2 | CPU $D9D2 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Transform Packed Value D9 D3. +; Local behavior: Reads Ram_0372, Ram_0374, Ram_0375, Flow_D992, CollisionFlags, Flow_D9A4, CollisionCoordinate, Flow_D9FC; mutates PackedHudOrObjectValue, CollisionCoordinate, CollisionFlags. +; Parameters: Ram_0372, Ram_0374, Ram_0375, Flow_D992, CollisionFlags, Flow_D9A4, CollisionCoordinate, Flow_D9FC. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +TransformPackedValue_D9D3: + lda #$00 ; PRG $19D3 | CPU $D9D3 | A9 00 + sta PackedHudOrObjectValue ; PRG $19D5 | CPU $D9D5 | 85 16 + lda Ram_0372 ; PRG $19D7 | CPU $D9D7 | AD 72 03 + sta CollisionCoordinate ; PRG $19DA | CPU $D9DA | 85 C2 + lda Ram_0374 ; PRG $19DC | CPU $D9DC | AD 74 03 + sta CollisionFlags ; PRG $19DF | CPU $D9DF | 85 C4 + eor Ram_0375 ; PRG $19E1 | CPU $D9E1 | 4D 75 03 + asl a ; PRG $19E4 | CPU $D9E4 | 0A + bcs Flow_D992 ; PRG $19E5 | CPU $D9E5 | B0 AB + bit CollisionFlags ; PRG $19E7 | CPU $D9E7 | 24 C4 + bmi Flow_D9A4 ; PRG $19E9 | CPU $D9E9 | 30 B9 + lda CollisionCoordinate ; PRG $19EB | CPU $D9EB | A5 C2 + cmp #$10 ; PRG $19ED | CPU $D9ED | C9 10 + bcc Flow_D9FC ; PRG $19EF | CPU $D9EF | 90 0B + eor Ram_0373 ; PRG $19F1 | CPU $D9F1 | 4D 73 03 + asl a ; PRG $19F4 | CPU $D9F4 | 0A + bne Flow_D9FF ; PRG $19F5 | CPU $D9F5 | D0 08 + bcc Flow_D9D2 ; PRG $19F7 | CPU $D9F7 | 90 D9 + jmp Continuation_DABC ; PRG $19F9 | CPU $D9F9 | 4C BC DA +; ----------------------------------------------------------------------------- +; Global purpose: Flow D9 FC. +; Local behavior: Reads Continuation_DA8B; mutates no direct memory mutation observed. +; Parameters: Continuation_DA8B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D9FC: + jmp Continuation_DA8B ; PRG $19FC | CPU $D9FC | 4C 8B DA +; ----------------------------------------------------------------------------- +; Global purpose: Flow D9 FF. +; Local behavior: Reads TransformPackedValue_DB15, TransformPackedValue_DAF5, ScreenObjectMode, Flow_DA13; mutates no direct memory mutation observed. +; Parameters: TransformPackedValue_DB15, TransformPackedValue_DAF5, ScreenObjectMode, Flow_DA13. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_D9FF: + ldx #$20 ; PRG $19FF | CPU $D9FF | A2 20 + ldy #$8D ; PRG $1A01 | CPU $DA01 | A0 8D + jsr TransformPackedValue_DB15 ; PRG $1A03 | CPU $DA03 | 20 15 DB + jsr TransformPackedValue_DAF5 ; PRG $1A06 | CPU $DA06 | 20 F5 DA + ldy #$0B ; PRG $1A09 | CPU $DA09 | A0 0B + lda ScreenObjectMode ; PRG $1A0B | CPU $DA0B | A5 62 + cmp #$02 ; PRG $1A0D | CPU $DA0D | C9 02 + bne Flow_DA13 ; PRG $1A0F | CPU $DA0F | D0 02 + ldy #$09 ; PRG $1A11 | CPU $DA11 | A0 09 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DA13. +; Local behavior: Reads CollisionCoordinate, CoordinateDelta, UpdateRam_0373_DA82, Flow_DA30; mutates CoordinateDelta, CollisionCoordinate, CurrentSpriteTileId. +; Parameters: CollisionCoordinate, CoordinateDelta, UpdateRam_0373_DA82, Flow_DA30. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DA13: + sty CoordinateDelta ; PRG $1A13 | CPU $DA13 | 84 17 + lda CollisionCoordinate ; PRG $1A15 | CPU $DA15 | A5 C2 + and #$7F ; PRG $1A17 | CPU $DA17 | 29 7F + sta CollisionCoordinate ; PRG $1A19 | CPU $DA19 | 85 C2 + lsr a ; PRG $1A1B | CPU $DA1B | 4A + sec ; PRG $1A1C | CPU $DA1C | 38 + sbc CoordinateDelta ; PRG $1A1D | CPU $DA1D | E5 17 + bcc UpdateRam_0373_DA82 ; PRG $1A1F | CPU $DA1F | 90 61 + beq UpdateRam_0373_DA82 ; PRG $1A21 | CPU $DA21 | F0 5F + sta CurrentSpriteTileId ; PRG $1A23 | CPU $DA23 | 85 11 + ldx #$2A ; PRG $1A25 | CPU $DA25 | A2 2A + ldy #$0B ; PRG $1A27 | CPU $DA27 | A0 0B + lda CollisionCoordinate ; PRG $1A29 | CPU $DA29 | A5 C2 + lsr a ; PRG $1A2B | CPU $DA2B | 4A + bcc Flow_DA30 ; PRG $1A2C | CPU $DA2C | 90 02 + ldy #$17 ; PRG $1A2E | CPU $DA2E | A0 17 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DA30. +; Local behavior: Reads CodeOrDataPointerTable_DB88, CurrentSpriteTileId, Flow_DA30, ScreenObjectMode, UpdateRam_0373_DA82, CollisionCoordinate; mutates Ram_06C0, CurrentSpriteTileId. +; Parameters: CodeOrDataPointerTable_DB88, CurrentSpriteTileId, Flow_DA30, ScreenObjectMode, UpdateRam_0373_DA82, CollisionCoordinate. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DA30: + lda CodeOrDataPointerTable_DB88,y ; PRG $1A30 | CPU $DA30 | B9 88 DB + sta Ram_06C0,x ; PRG $1A33 | CPU $DA33 | 9D C0 06 + dey ; PRG $1A36 | CPU $DA36 | 88 + dex ; PRG $1A37 | CPU $DA37 | CA + dex ; PRG $1A38 | CPU $DA38 | CA + dex ; PRG $1A39 | CPU $DA39 | CA + dex ; PRG $1A3A | CPU $DA3A | CA + dex ; PRG $1A3B | CPU $DA3B | CA + lda CodeOrDataPointerTable_DB88,y ; PRG $1A3C | CPU $DA3C | B9 88 DB + sta Ram_06C0,x ; PRG $1A3F | CPU $DA3F | 9D C0 06 + dey ; PRG $1A42 | CPU $DA42 | 88 + dex ; PRG $1A43 | CPU $DA43 | CA + dec CurrentSpriteTileId ; PRG $1A44 | CPU $DA44 | C6 11 + bne Flow_DA30 ; PRG $1A46 | CPU $DA46 | D0 E8 + lda ScreenObjectMode ; PRG $1A48 | CPU $DA48 | A5 62 + cmp #$02 ; PRG $1A4A | CPU $DA4A | C9 02 + bne UpdateRam_0373_DA82 ; PRG $1A4C | CPU $DA4C | D0 34 + lda CollisionCoordinate ; PRG $1A4E | CPU $DA4E | A5 C2 + lsr a ; PRG $1A50 | CPU $DA50 | 4A + sec ; PRG $1A51 | CPU $DA51 | 38 + sbc #$0C ; PRG $1A52 | CPU $DA52 | E9 0C + bcc UpdateRam_0373_DA82 ; PRG $1A54 | CPU $DA54 | 90 2C + sta CurrentSpriteTileId ; PRG $1A56 | CPU $DA56 | 85 11 + asl a ; PRG $1A58 | CPU $DA58 | 0A + tay ; PRG $1A59 | CPU $DA59 | A8 + iny ; PRG $1A5A | CPU $DA5A | C8 + inc CurrentSpriteTileId ; PRG $1A5B | CPU $DA5B | E6 11 + ldx #$2A ; PRG $1A5D | CPU $DA5D | A2 2A +; ----------------------------------------------------------------------------- +; Global purpose: Flow DA5 F. +; Local behavior: Reads IndexedGameplayLookupTable_DBA0, CurrentSpriteTileId, Flow_DA5F, CollisionCoordinate, UpdateRam_0373_DA82; mutates Ram_06C0, CurrentSpriteTileId. +; Parameters: IndexedGameplayLookupTable_DBA0, CurrentSpriteTileId, Flow_DA5F, CollisionCoordinate, UpdateRam_0373_DA82. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DA5F: + lda IndexedGameplayLookupTable_DBA0,y ; PRG $1A5F | CPU $DA5F | B9 A0 DB + sta Ram_06C0,x ; PRG $1A62 | CPU $DA62 | 9D C0 06 + dey ; PRG $1A65 | CPU $DA65 | 88 + dex ; PRG $1A66 | CPU $DA66 | CA + dex ; PRG $1A67 | CPU $DA67 | CA + dex ; PRG $1A68 | CPU $DA68 | CA + dex ; PRG $1A69 | CPU $DA69 | CA + dex ; PRG $1A6A | CPU $DA6A | CA + lda IndexedGameplayLookupTable_DBA0,y ; PRG $1A6B | CPU $DA6B | B9 A0 DB + sta Ram_06C0,x ; PRG $1A6E | CPU $DA6E | 9D C0 06 + dey ; PRG $1A71 | CPU $DA71 | 88 + dex ; PRG $1A72 | CPU $DA72 | CA + dec CurrentSpriteTileId ; PRG $1A73 | CPU $DA73 | C6 11 + bne Flow_DA5F ; PRG $1A75 | CPU $DA75 | D0 E8 + lda CollisionCoordinate ; PRG $1A77 | CPU $DA77 | A5 C2 + cmp #$1D ; PRG $1A79 | CPU $DA79 | C9 1D + bne UpdateRam_0373_DA82 ; PRG $1A7B | CPU $DA7B | D0 05 + lda #$66 ; PRG $1A7D | CPU $DA7D | A9 66 + sta Ram_06C0 ; PRG $1A7F | CPU $DA7F | 8D C0 06 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 0373 DA82. +; Local behavior: Reads ExpandPackedScoreOrHudData, CollisionCoordinate; mutates Ram_0373. +; Parameters: ExpandPackedScoreOrHudData, CollisionCoordinate. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_0373_DA82: + jsr ExpandPackedScoreOrHudData ; PRG $1A82 | CPU $DA82 | 20 51 C4 + lda CollisionCoordinate ; PRG $1A85 | CPU $DA85 | A5 C2 + sta Ram_0373 ; PRG $1A87 | CPU $DA87 | 8D 73 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DA8 A. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DA8A: + rts ; PRG $1A8A | CPU $DA8A | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation DA8 B. +; Local behavior: Reads Flow_DA8A, SignedOffsetAccumulator, TransformPackedValue_DAF5; mutates SignedOffsetAccumulator, CurrentSpriteTileId. +; Parameters: Flow_DA8A, SignedOffsetAccumulator, TransformPackedValue_DAF5. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_DA8B: + cmp #$05 ; PRG $1A8B | CPU $DA8B | C9 05 + bcc Flow_DA8A ; PRG $1A8D | CPU $DA8D | 90 FB + lsr a ; PRG $1A8F | CPU $DA8F | 4A + sta SignedOffsetAccumulator ; PRG $1A90 | CPU $DA90 | 85 10 + lda #$08 ; PRG $1A92 | CPU $DA92 | A9 08 + sec ; PRG $1A94 | CPU $DA94 | 38 + sbc SignedOffsetAccumulator ; PRG $1A95 | CPU $DA95 | E5 10 + sta CurrentSpriteTileId ; PRG $1A97 | CPU $DA97 | 85 11 + jsr TransformPackedValue_DAF5 ; PRG $1A99 | CPU $DA99 | 20 F5 DA +; ----------------------------------------------------------------------------- +; Global purpose: Flow DA9 C. +; Local behavior: Reads SourceRecordPointerLo, CurrentSpriteTileId, Flow_DA9C, UpdateRam_0373_DA82; mutates SourceRecordPointerLo, CurrentSpriteTileId, WorkPointerOrValueHi, WorkPointerOrValueLo. +; Parameters: SourceRecordPointerLo, CurrentSpriteTileId, Flow_DA9C, UpdateRam_0373_DA82. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DA9C: + ldy #$00 ; PRG $1A9C | CPU $DA9C | A0 00 + lda (SourceRecordPointerLo),y ; PRG $1A9E | CPU $DA9E | B1 03 + sec ; PRG $1AA0 | CPU $DAA0 | 38 + sbc #$10 ; PRG $1AA1 | CPU $DAA1 | E9 10 + tax ; PRG $1AA3 | CPU $DAA3 | AA + lda SourceRecordPointerLo ; PRG $1AA4 | CPU $DAA4 | A5 03 + clc ; PRG $1AA6 | CPU $DAA6 | 18 + adc #$06 ; PRG $1AA7 | CPU $DAA7 | 69 06 + sta SourceRecordPointerLo ; PRG $1AA9 | CPU $DAA9 | 85 03 + txa ; PRG $1AAB | CPU $DAAB | 8A + sta (SourceRecordPointerLo),y ; PRG $1AAC | CPU $DAAC | 91 03 + dec CurrentSpriteTileId ; PRG $1AAE | CPU $DAAE | C6 11 + bne Flow_DA9C ; PRG $1AB0 | CPU $DAB0 | D0 EA + lda #$20 ; PRG $1AB2 | CPU $DAB2 | A9 20 + sta WorkPointerOrValueHi ; PRG $1AB4 | CPU $DAB4 | 85 02 + lda #$8D ; PRG $1AB6 | CPU $DAB6 | A9 8D + sta WorkPointerOrValueLo ; PRG $1AB8 | CPU $DAB8 | 85 01 + bne UpdateRam_0373_DA82 ; PRG $1ABA | CPU $DABA | D0 C6 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation DABC. +; Local behavior: Reads CollisionCoordinate, PackedHudOrObjectValue, IndexedGameplayLookupTable_DBA6, IndexedGameplayLookupTable_DBA7, TransformPackedValue_DB15, UpdateRam_0373_DA82; mutates PackedHudOrObjectValue, SourceRecordPointerLo, PackedCoordinateOrValue. +; Parameters: CollisionCoordinate, PackedHudOrObjectValue, IndexedGameplayLookupTable_DBA6, IndexedGameplayLookupTable_DBA7, TransformPackedValue_DB15, UpdateRam_0373_DA82. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_DABC: + lda CollisionCoordinate ; PRG $1ABC | CPU $DABC | A5 C2 + asl a ; PRG $1ABE | CPU $DABE | 0A + rol PackedHudOrObjectValue ; PRG $1ABF | CPU $DABF | 26 16 + lsr a ; PRG $1AC1 | CPU $DAC1 | 4A + lsr a ; PRG $1AC2 | CPU $DAC2 | 4A + rol PackedHudOrObjectValue ; PRG $1AC3 | CPU $DAC3 | 26 16 + lda PackedHudOrObjectValue ; PRG $1AC5 | CPU $DAC5 | A5 16 + asl a ; PRG $1AC7 | CPU $DAC7 | 0A + tax ; PRG $1AC8 | CPU $DAC8 | AA + lda IndexedGameplayLookupTable_DBA6,x ; PRG $1AC9 | CPU $DAC9 | BD A6 DB + sta SourceRecordPointerLo ; PRG $1ACC | CPU $DACC | 85 03 + lda IndexedGameplayLookupTable_DBA7,x ; PRG $1ACE | CPU $DACE | BD A7 DB + sta PackedCoordinateOrValue ; PRG $1AD1 | CPU $DAD1 | 85 04 + ldx #$20 ; PRG $1AD3 | CPU $DAD3 | A2 20 + ldy #$AF ; PRG $1AD5 | CPU $DAD5 | A0 AF + jsr TransformPackedValue_DB15 ; PRG $1AD7 | CPU $DAD7 | 20 15 DB + jmp UpdateRam_0373_DA82 ; PRG $1ADA | CPU $DADA | 4C 82 DA +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp 03 DADD. +; Local behavior: Reads IndexedGameplayLookupTable_DC24, IndexedGameplayLookupTable_DC25, IndexedGameplayLookupTable_DC26, IndexedGameplayLookupTable_DC27, ExpandPackedScoreOrHudData; mutates SourceRecordPointerLo, PackedCoordinateOrValue, WorkPointerOrValueLo, WorkPointerOrValueHi. +; Parameters: IndexedGameplayLookupTable_DC24, IndexedGameplayLookupTable_DC25, IndexedGameplayLookupTable_DC26, IndexedGameplayLookupTable_DC27, ExpandPackedScoreOrHudData. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_03_DADD: + tax ; PRG $1ADD | CPU $DADD | AA + lda IndexedGameplayLookupTable_DC24,x ; PRG $1ADE | CPU $DADE | BD 24 DC + sta SourceRecordPointerLo ; PRG $1AE1 | CPU $DAE1 | 85 03 + lda IndexedGameplayLookupTable_DC25,x ; PRG $1AE3 | CPU $DAE3 | BD 25 DC + sta PackedCoordinateOrValue ; PRG $1AE6 | CPU $DAE6 | 85 04 + lda IndexedGameplayLookupTable_DC26,x ; PRG $1AE8 | CPU $DAE8 | BD 26 DC + sta WorkPointerOrValueLo ; PRG $1AEB | CPU $DAEB | 85 01 + lda IndexedGameplayLookupTable_DC27,x ; PRG $1AED | CPU $DAED | BD 27 DC + sta WorkPointerOrValueHi ; PRG $1AF0 | CPU $DAF0 | 85 02 + jmp ExpandPackedScoreOrHudData ; PRG $1AF2 | CPU $DAF2 | 4C 51 C4 +; ----------------------------------------------------------------------------- +; Global purpose: Transform Packed Value DAF5. +; Local behavior: Reads CollisionCoordinate, Flow_DAFE; mutates no direct memory mutation observed. +; Parameters: CollisionCoordinate, Flow_DAFE. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +TransformPackedValue_DAF5: + ldy #$00 ; PRG $1AF5 | CPU $DAF5 | A0 00 + lda CollisionCoordinate ; PRG $1AF7 | CPU $DAF7 | A5 C2 + lsr a ; PRG $1AF9 | CPU $DAF9 | 4A + bcc Flow_DAFE ; PRG $1AFA | CPU $DAFA | 90 02 + ldy #$25 ; PRG $1AFC | CPU $DAFC | A0 25 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DAFE. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DAFE: + ldx #$00 ; PRG $1AFE | CPU $DAFE | A2 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DB00. +; Local behavior: Reads IndexedGameplayLookupTable_DB38, Flow_DB00; mutates Ram_06C0, SourceRecordPointerLo, PackedCoordinateOrValue. +; Parameters: IndexedGameplayLookupTable_DB38, Flow_DB00. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$06; sta PackedCoordinateOrValue; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DB00: + lda IndexedGameplayLookupTable_DB38,y ; PRG $1B00 | CPU $DB00 | B9 38 DB + sta Ram_06C0,x ; PRG $1B03 | CPU $DB03 | 9D C0 06 + iny ; PRG $1B06 | CPU $DB06 | C8 + inx ; PRG $1B07 | CPU $DB07 | E8 + cpx #$30 ; PRG $1B08 | CPU $DB08 | E0 30 + bne Flow_DB00 ; PRG $1B0A | CPU $DB0A | D0 F4 + lda #$C0 ; PRG $1B0C | CPU $DB0C | A9 C0 + sta SourceRecordPointerLo ; PRG $1B0E | CPU $DB0E | 85 03 + lda #$06 ; PRG $1B10 | CPU $DB10 | A9 06 + sta PackedCoordinateOrValue ; PRG $1B12 | CPU $DB12 | 85 04 + rts ; PRG $1B14 | CPU $DB14 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Transform Packed Value DB15. +; Local behavior: Reads CollisionCoordinate, WorkPointerOrValueHi, MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi; mutates MetaspriteLayoutPointerHi, MetaspriteLayoutPointerLo, WorkPointerOrValueHi, WorkPointerOrValueLo. +; Parameters: CollisionCoordinate, WorkPointerOrValueHi, MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi. +; Returns: returns to caller; flags/register result depends on final instructions: adc MetaspriteLayoutPointerHi; sta WorkPointerOrValueHi; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +TransformPackedValue_DB15: + stx MetaspriteLayoutPointerHi ; PRG $1B15 | CPU $DB15 | 86 15 + sty MetaspriteLayoutPointerLo ; PRG $1B17 | CPU $DB17 | 84 14 + lda #$00 ; PRG $1B19 | CPU $DB19 | A9 00 + sta WorkPointerOrValueHi ; PRG $1B1B | CPU $DB1B | 85 02 + lda CollisionCoordinate ; PRG $1B1D | CPU $DB1D | A5 C2 + and #$3E ; PRG $1B1F | CPU $DB1F | 29 3E + sec ; PRG $1B21 | CPU $DB21 | 38 + sbc #$10 ; PRG $1B22 | CPU $DB22 | E9 10 + asl a ; PRG $1B24 | CPU $DB24 | 0A + asl a ; PRG $1B25 | CPU $DB25 | 0A + asl a ; PRG $1B26 | CPU $DB26 | 0A + rol WorkPointerOrValueHi ; PRG $1B27 | CPU $DB27 | 26 02 + asl a ; PRG $1B29 | CPU $DB29 | 0A + rol WorkPointerOrValueHi ; PRG $1B2A | CPU $DB2A | 26 02 + clc ; PRG $1B2C | CPU $DB2C | 18 + adc MetaspriteLayoutPointerLo ; PRG $1B2D | CPU $DB2D | 65 14 + sta WorkPointerOrValueLo ; PRG $1B2F | CPU $DB2F | 85 01 + lda WorkPointerOrValueHi ; PRG $1B31 | CPU $DB31 | A5 02 + adc MetaspriteLayoutPointerHi ; PRG $1B33 | CPU $DB33 | 65 15 + sta WorkPointerOrValueHi ; PRG $1B35 | CPU $DB35 | 85 02 + rts ; PRG $1B37 | CPU $DB37 | 60 + +IndexedGameplayLookupTable_DB38: + .byte $66,$90,$91,$92,$93,$24,$8C,$94,$95,$A7,$A8,$98,$99,$8B,$9A,$A9 ; PRG $1B38 | CPU $DB38 + .byte $AA,$9D,$9E,$8B,$9F,$A0,$A1,$A2,$8C,$8B,$A3,$A4,$A5,$A6,$8C,$8B ; PRG $1B48 | CPU $DB48 + .byte $24,$F1,$F2,$24,$8C,$76,$8B,$24,$24,$24,$24,$8C,$AB,$AC,$AD,$AE ; PRG $1B58 | CPU $DB58 + .byte $AF,$B0,$B1,$B2,$13,$14,$B5,$B6,$8B,$B7,$B8,$B9,$BA,$8C,$8B,$BB ; PRG $1B68 | CPU $DB68 + .byte $BC,$BD,$BE,$8C,$8B,$24,$24,$24,$24,$8C,$8B,$24,$24,$24,$24,$8C ; PRG $1B78 | CPU $DB78 + +CodeOrDataPointerTable_DB88: + .byte $F3,$F5,$24,$F6,$24,$24,$24,$24,$24,$24,$24,$24,$AB,$F9,$F7,$FA ; PRG $1B88 | CPU $DB88 + .byte $F8,$24,$24,$24,$24,$24,$24,$24 ; PRG $1B98 | CPU $DB98 + +IndexedGameplayLookupTable_DBA0: + .byte $81,$7E,$82,$7E,$81,$7E ; PRG $1BA0 | CPU $DBA0 + +IndexedGameplayLookupTable_DBA6: + .byte $AE ; PRG $1BA6 | CPU $DBA6 + +IndexedGameplayLookupTable_DBA7: + .byte $DB,$B3,$DB,$B8,$DB,$BD,$DB,$22,$A7,$A8,$A9,$AA,$22,$AD,$AE,$13 ; PRG $1BA7 | CPU $DBA7 + .byte $14,$22,$96,$97,$9B,$9C,$22,$AD,$AE,$B3,$B4 ; PRG $1BB7 | CPU $DBB7 + +IndexedGameplayLookupTable_DBC2: + .byte $DA ; PRG $1BC2 | CPU $DBC2 + +IndexedGameplayLookupTable_DBC3: + .byte $DB ; PRG $1BC3 | CPU $DBC3 + +IndexedGameplayLookupTable_DBC4: + .byte $8D ; PRG $1BC4 | CPU $DBC4 + +IndexedGameplayLookupTable_DBC5: + .byte $20,$FF,$DB,$8D,$20,$04,$DD,$AE,$20,$09,$DD,$AE,$20,$0E,$DD,$B1 ; PRG $1BC5 | CPU $DBC5 + .byte $20,$13,$DD,$B1,$20,$66,$8B,$24,$24,$24,$24,$8C,$8B,$BF,$C0,$C1 ; PRG $1BD5 | CPU $DBD5 + .byte $C2,$C3,$8B,$C4,$C5,$C6,$C7,$C8,$8B,$C9,$CA,$CB,$CC,$24,$8B,$24 ; PRG $1BE5 | CPU $DBE5 + .byte $CD,$CE,$CF,$D0,$8B,$24,$D1,$D2,$D3,$D4,$66,$8B,$24,$24,$24,$24 ; PRG $1BF5 | CPU $DBF5 + .byte $8C,$DC,$DB,$DA,$D9,$D8,$8C,$E1,$E0,$DF,$DE,$DD,$8C,$24,$E5,$E4 ; PRG $1C05 | CPU $DC05 + .byte $E3,$E2,$8C,$E9,$E8,$E7,$E6,$24,$8C,$ED,$EC,$EB,$EA,$24,$8C ; PRG $1C15 | CPU $DC15 + +IndexedGameplayLookupTable_DC24: + .byte $4C ; PRG $1C24 | CPU $DC24 + +IndexedGameplayLookupTable_DC25: + .byte $DC ; PRG $1C25 | CPU $DC25 + +IndexedGameplayLookupTable_DC26: + .byte $EA ; PRG $1C26 | CPU $DC26 + +IndexedGameplayLookupTable_DC27: + .byte $20,$7A,$DC,$EA,$20,$A8,$DC,$ED,$20,$D6,$DC,$ED,$20,$04,$DD,$EA ; PRG $1C27 | CPU $DC27 + .byte $20,$09,$DD,$EA,$20,$0E,$DD,$F5,$20,$13,$DD,$F5,$20,$18,$DD,$AD ; PRG $1C37 | CPU $DC37 + .byte $21,$31,$DD,$6D,$21,$59,$24,$24,$24,$AB,$AC,$AD,$AE,$AF,$B0,$24 ; PRG $1C47 | CPU $DC47 + .byte $24,$24,$B1,$B2,$B3,$B4,$B5,$B6,$24,$24,$24,$8B,$B7,$B8,$B9,$BA ; PRG $1C57 | CPU $DC57 + .byte $8C,$24,$24,$24,$8B,$BB,$BC,$BD,$BE,$8C,$24,$24,$24,$8B,$24,$24 ; PRG $1C67 | CPU $DC67 + .byte $24,$24,$8C,$59,$BF,$C0,$C1,$C2,$C3,$24,$24,$24,$8C,$C4,$C5,$C6 ; PRG $1C77 | CPU $DC77 + .byte $C7,$C8,$24,$24,$24,$8C,$C9,$CA,$CB,$CC,$24,$24,$24,$24,$8C,$24 ; PRG $1C87 | CPU $DC87 + .byte $CD,$CE,$CF,$D0,$24,$24,$24,$8C,$24,$D1,$D2,$D3,$D4,$24,$24,$24 ; PRG $1C97 | CPU $DC97 + .byte $8C,$59,$AB,$AC,$AD,$AE,$AF,$B0,$24,$24,$24,$B1,$B2,$B3,$B4,$B5 ; PRG $1CA7 | CPU $DCA7 + .byte $B6,$24,$24,$24,$8B,$B7,$B8,$B9,$BA,$8C,$24,$24,$24,$8B,$BB,$BC ; PRG $1CB7 | CPU $DCB7 + .byte $BD,$BE,$8C,$24,$24,$24,$8B,$24,$24,$24,$24,$8C,$24,$24,$24,$59 ; PRG $1CC7 | CPU $DCC7 + .byte $8B,$24,$24,$24,$DC,$DB,$DA,$D9,$D8,$8B,$24,$24,$24,$E1,$E0,$DF ; PRG $1CD7 | CPU $DCD7 + .byte $DE,$DD,$8B,$24,$24,$24,$24,$E5,$E4,$E3,$E2,$8B,$24,$24,$24,$E9 ; PRG $1CE7 | CPU $DCE7 + .byte $E8,$E7,$E6,$24,$8B,$24,$24,$24,$ED,$EC,$EB,$EA,$24,$41,$BF,$C4 ; PRG $1CF7 | CPU $DCF7 + .byte $C9,$24,$41,$24,$D5,$D6,$D7,$41,$D8,$DD,$E2,$24,$41,$24,$EE,$EF ; PRG $1D07 | CPU $DD07 + .byte $F0,$46,$8B,$24,$24,$24,$24,$8C,$24,$24,$24,$24,$24,$24,$24,$24 ; PRG $1D17 | CPU $DD17 + .byte $24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$46,$8B,$24,$24,$24,$24 ; PRG $1D27 | CPU $DD27 + .byte $8C,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$24,$81,$24,$24 ; PRG $1D37 | CPU $DD37 + .byte $24,$24,$7E ; PRG $1D47 | CPU $DD47 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DD4 A. +; Local behavior: Reads Ram_0381, Flow_DD57, UpdateRam_0398_DD60, Flow_DD5D; mutates no direct memory mutation observed. +; Parameters: Ram_0381, Flow_DD57, UpdateRam_0398_DD60, Flow_DD5D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DD4A: + ldx #$80 ; PRG $1D4A | CPU $DD4A | A2 80 + ldy Ram_0381 ; PRG $1D4C | CPU $DD4C | AC 81 03 + beq Flow_DD57 ; PRG $1D4F | CPU $DD4F | F0 06 + cpy #$03 ; PRG $1D51 | CPU $DD51 | C0 03 + beq UpdateRam_0398_DD60 ; PRG $1D53 | CPU $DD53 | F0 0B + bne Flow_DD5D ; PRG $1D55 | CPU $DD55 | D0 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DD57. +; Local behavior: Reads UpdateRam_0301_CEE5, UpdateRam_0398_DD60; mutates no direct memory mutation observed. +; Parameters: UpdateRam_0301_CEE5, UpdateRam_0398_DD60. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DD57: + jsr UpdateRam_0301_CEE5 ; PRG $1D57 | CPU $DD57 | 20 E5 CE + jmp UpdateRam_0398_DD60 ; PRG $1D5A | CPU $DD5A | 4C 60 DD +; ----------------------------------------------------------------------------- +; Global purpose: Flow DD5 D. +; Local behavior: Reads ComputeOrDispatch_CEBF; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_CEBF. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DD5D: + jsr ComputeOrDispatch_CEBF ; PRG $1D5D | CPU $DD5D | 20 BF CE +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 0398 DD60. +; Local behavior: Reads LoadObjectSpriteRenderState, Ram_0388, AdvanceObjectRecordPointer; mutates Ram_0398. +; Parameters: LoadObjectSpriteRenderState, Ram_0388, AdvanceObjectRecordPointer. +; Returns: returns to caller; flags/register result depends on final instructions: jsr AdvanceObjectRecordPointer; jsr LoadObjectSpriteRenderState; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_0398_DD60: + jsr LoadObjectSpriteRenderState ; PRG $1D60 | CPU $DD60 | 20 17 C2 + lda Ram_0388 ; PRG $1D63 | CPU $DD63 | AD 88 03 + sta Ram_0398 ; PRG $1D66 | CPU $DD66 | 8D 98 03 + jsr AdvanceObjectRecordPointer ; PRG $1D69 | CPU $DD69 | 20 0F C2 + jsr LoadObjectSpriteRenderState ; PRG $1D6C | CPU $DD6C | 20 17 C2 + rts ; PRG $1D6F | CPU $DD6F | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DD70. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DD70: + rts ; PRG $1D70 | CPU $DD70 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Evaluate Collision State DD71. +; Local behavior: Reads Ram_0380, Flow_DD70, ScreenCollisionState, Flow_DD8D, Flow_DD4A; mutates ObjectRecordPointerLo, ObjectRecordPointerHi, ObjectRecordStride, OamBufferWriteOffset. +; Parameters: Ram_0380, Flow_DD70, ScreenCollisionState, Flow_DD8D, Flow_DD4A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EvaluateCollisionState_DD71: + lda Ram_0380 ; PRG $1D71 | CPU $DD71 | AD 80 03 + beq Flow_DD70 ; PRG $1D74 | CPU $DD74 | F0 FA + lda #$80 ; PRG $1D76 | CPU $DD76 | A9 80 + sta ObjectRecordPointerLo ; PRG $1D78 | CPU $DD78 | 85 A8 + lda #$03 ; PRG $1D7A | CPU $DD7A | A9 03 + sta ObjectRecordPointerHi ; PRG $1D7C | CPU $DD7C | 85 A9 + lda #$10 ; PRG $1D7E | CPU $DD7E | A9 10 + sta ObjectRecordStride ; PRG $1D80 | CPU $DD80 | 85 AA + ldx #$00 ; PRG $1D82 | CPU $DD82 | A2 00 + stx OamBufferWriteOffset ; PRG $1D84 | CPU $DD84 | 86 AB + ldy ScreenCollisionState ; PRG $1D86 | CPU $DD86 | A4 44 + beq Flow_DD8D ; PRG $1D88 | CPU $DD88 | F0 03 + dey ; PRG $1D8A | CPU $DD8A | 88 + bne Flow_DD4A ; PRG $1D8B | CPU $DD8B | D0 BD +; ----------------------------------------------------------------------------- +; Global purpose: Flow DD8 D. +; Local behavior: Reads OamBufferWriteOffset, Ram_0380, Flow_DDCD, Ram_038E, Flow_DDA1; mutates Ram_038E, Ram_038B. +; Parameters: OamBufferWriteOffset, Ram_0380, Flow_DDCD, Ram_038E, Flow_DDA1. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DD8D: + ldx OamBufferWriteOffset ; PRG $1D8D | CPU $DD8D | A6 AB + lda Ram_0380,x ; PRG $1D8F | CPU $DD8F | BD 80 03 + beq Flow_DDCD ; PRG $1D92 | CPU $DD92 | F0 39 + lda Ram_038E,x ; PRG $1D94 | CPU $DD94 | BD 8E 03 + beq Flow_DDA1 ; PRG $1D97 | CPU $DD97 | F0 08 + dec Ram_038E,x ; PRG $1D99 | CPU $DD99 | DE 8E 03 + lda #$0A ; PRG $1D9C | CPU $DD9C | A9 0A + sta Ram_038B,x ; PRG $1D9E | CPU $DD9E | 9D 8B 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DDA1. +; Local behavior: Reads Ram_038B, Flow_DDC5, Flow_DDB2; mutates Ram_038B, AudioPendingFlags. +; Parameters: Ram_038B, Flow_DDC5, Flow_DDB2. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DDA1: + lda Ram_038B,x ; PRG $1DA1 | CPU $DDA1 | BD 8B 03 + beq Flow_DDC5 ; PRG $1DA4 | CPU $DDA4 | F0 1F + dec Ram_038B,x ; PRG $1DA6 | CPU $DDA6 | DE 8B 03 + pha ; PRG $1DA9 | CPU $DDA9 | 48 + and #$04 ; PRG $1DAA | CPU $DDAA | 29 04 + bne Flow_DDB2 ; PRG $1DAC | CPU $DDAC | D0 04 + lda #$08 ; PRG $1DAE | CPU $DDAE | A9 08 + sta AudioPendingFlags ; PRG $1DB0 | CPU $DDB0 | 85 FD +; ----------------------------------------------------------------------------- +; Global purpose: Flow DDB2. +; Local behavior: Reads Flow_DDBF; mutates PackedHudOrObjectValue. +; Parameters: Flow_DDBF. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DDB2: + pla ; PRG $1DB2 | CPU $DDB2 | 68 + and #$02 ; PRG $1DB3 | CPU $DDB3 | 29 02 + sta PackedHudOrObjectValue ; PRG $1DB5 | CPU $DDB5 | 85 16 + lda #$48 ; PRG $1DB7 | CPU $DDB7 | A9 48 + cpx #$00 ; PRG $1DB9 | CPU $DDB9 | E0 00 + beq Flow_DDBF ; PRG $1DBB | CPU $DDBB | F0 02 + lda #$B8 ; PRG $1DBD | CPU $DDBD | A9 B8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DDBF. +; Local behavior: Reads PackedHudOrObjectValue; mutates Ram_0389. +; Parameters: PackedHudOrObjectValue. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DDBF: + clc ; PRG $1DBF | CPU $DDBF | 18 + adc PackedHudOrObjectValue ; PRG $1DC0 | CPU $DDC0 | 65 16 + sta Ram_0389,x ; PRG $1DC2 | CPU $DDC2 | 9D 89 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DDC5. +; Local behavior: Reads Ram_038D, Flow_DDCD, UpdateRam_038D_DDDF; mutates no direct memory mutation observed. +; Parameters: Ram_038D, Flow_DDCD, UpdateRam_038D_DDDF. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DDC5: + lda Ram_038D ; PRG $1DC5 | CPU $DDC5 | AD 8D 03 + beq Flow_DDCD ; PRG $1DC8 | CPU $DDC8 | F0 03 + jsr UpdateRam_038D_DDDF ; PRG $1DCA | CPU $DDCA | 20 DF DD +; ----------------------------------------------------------------------------- +; Global purpose: Flow DDCD. +; Local behavior: Reads LoadObjectSpriteRenderState, AdvanceObjectRecordPointer, OamBufferWriteOffset, Flow_DD8D; mutates OamBufferWriteOffset. +; Parameters: LoadObjectSpriteRenderState, AdvanceObjectRecordPointer, OamBufferWriteOffset, Flow_DD8D. +; Returns: returns to caller; flags/register result depends on final instructions: cmp #$20; bne Flow_DD8D; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DDCD: + jsr LoadObjectSpriteRenderState ; PRG $1DCD | CPU $DDCD | 20 17 C2 + jsr AdvanceObjectRecordPointer ; PRG $1DD0 | CPU $DDD0 | 20 0F C2 + lda OamBufferWriteOffset ; PRG $1DD3 | CPU $DDD3 | A5 AB + clc ; PRG $1DD5 | CPU $DDD5 | 18 + adc #$10 ; PRG $1DD6 | CPU $DDD6 | 69 10 + sta OamBufferWriteOffset ; PRG $1DD8 | CPU $DDD8 | 85 AB + cmp #$20 ; PRG $1DDA | CPU $DDDA | C9 20 + bne Flow_DD8D ; PRG $1DDC | CPU $DDDC | D0 AF + rts ; PRG $1DDE | CPU $DDDE | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 038 D DDDF. +; Local behavior: Reads SelectDigitGlyphTable; mutates Ram_038D, Ram_0380, Ram_0390, Ram_0386, Ram_0396. +; Parameters: SelectDigitGlyphTable. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$09; jsr SelectDigitGlyphTable; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_038D_DDDF: + lda #$00 ; PRG $1DDF | CPU $DDDF | A9 00 + sta Ram_038D ; PRG $1DE1 | CPU $DDE1 | 8D 8D 03 + sta Ram_0380 ; PRG $1DE4 | CPU $DDE4 | 8D 80 03 + sta Ram_0390 ; PRG $1DE7 | CPU $DDE7 | 8D 90 03 + lda #$47 ; PRG $1DEA | CPU $DDEA | A9 47 + sta Ram_0386 ; PRG $1DEC | CPU $DDEC | 8D 86 03 + sta Ram_0396 ; PRG $1DEF | CPU $DDEF | 8D 96 03 + lda #$09 ; PRG $1DF2 | CPU $DDF2 | A9 09 + jsr SelectDigitGlyphTable ; PRG $1DF4 | CPU $DDF4 | 20 99 C4 + rts ; PRG $1DF7 | CPU $DDF7 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch DDF8. +; Local behavior: Reads SelectDigitGlyphTable; mutates no direct memory mutation observed. +; Parameters: SelectDigitGlyphTable. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_DDF8: + lda #$0A ; PRG $1DF8 | CPU $DDF8 | A9 0A + jsr SelectDigitGlyphTable ; PRG $1DFA | CPU $DDFA | 20 99 C4 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 0380 DDFD. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_0380, Ram_0390, Ram_0386, Ram_0396, Ram_0388, Ram_0398, Ram_0389, Ram_0399. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: dey; sty Ram_0381; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_0380_DDFD: + ldy #$01 ; PRG $1DFD | CPU $DDFD | A0 01 + sty Ram_0380 ; PRG $1DFF | CPU $DDFF | 8C 80 03 + sty Ram_0390 ; PRG $1E02 | CPU $DE02 | 8C 90 03 + lda #$4E ; PRG $1E05 | CPU $DE05 | A9 4E + sta Ram_0386 ; PRG $1E07 | CPU $DE07 | 8D 86 03 + sta Ram_0396 ; PRG $1E0A | CPU $DE0A | 8D 96 03 + lda #$38 ; PRG $1E0D | CPU $DE0D | A9 38 + sta Ram_0388 ; PRG $1E0F | CPU $DE0F | 8D 88 03 + sta Ram_0398 ; PRG $1E12 | CPU $DE12 | 8D 98 03 + lda #$48 ; PRG $1E15 | CPU $DE15 | A9 48 + sta Ram_0389 ; PRG $1E17 | CPU $DE17 | 8D 89 03 + lda #$B8 ; PRG $1E1A | CPU $DE1A | A9 B8 + sta Ram_0399 ; PRG $1E1C | CPU $DE1C | 8D 99 03 + lda #$B0 ; PRG $1E1F | CPU $DE1F | A9 B0 + sta Ram_038A ; PRG $1E21 | CPU $DE21 | 8D 8A 03 + lda #$C0 ; PRG $1E24 | CPU $DE24 | A9 C0 + sta Ram_039A ; PRG $1E26 | CPU $DE26 | 8D 9A 03 + dey ; PRG $1E29 | CPU $DE29 | 88 + sty Ram_0381 ; PRG $1E2A | CPU $DE2A | 8C 81 03 + rts ; PRG $1E2D | CPU $DE2D | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Evaluate Collision State DE2 E. +; Local behavior: Reads ScreenObjectMode, Flow_DE61, ScreenCollisionState, Flow_DE5E; mutates ObjectRecordPointerLo, ObjectRecordPointerHi, Ram_03B0, Ram_03B6, Ram_03B7, Ram_03B8, Ram_03B9, Ram_03BA. +; Parameters: ScreenObjectMode, Flow_DE61, ScreenCollisionState, Flow_DE5E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EvaluateCollisionState_DE2E: + lda ScreenObjectMode ; PRG $1E2E | CPU $DE2E | A5 62 + cmp #$02 ; PRG $1E30 | CPU $DE30 | C9 02 + bne Flow_DE61 ; PRG $1E32 | CPU $DE32 | D0 2D + lda #$B0 ; PRG $1E34 | CPU $DE34 | A9 B0 + sta ObjectRecordPointerLo ; PRG $1E36 | CPU $DE36 | 85 A8 + lda #$03 ; PRG $1E38 | CPU $DE38 | A9 03 + sta ObjectRecordPointerHi ; PRG $1E3A | CPU $DE3A | 85 A9 + lda ScreenCollisionState ; PRG $1E3C | CPU $DE3C | A5 44 + bne Flow_DE5E ; PRG $1E3E | CPU $DE3E | D0 1E + lda #$01 ; PRG $1E40 | CPU $DE40 | A9 01 + sta Ram_03B0 ; PRG $1E42 | CPU $DE42 | 8D B0 03 + lda #$4F ; PRG $1E45 | CPU $DE45 | A9 4F + sta Ram_03B6 ; PRG $1E47 | CPU $DE47 | 8D B6 03 + lda #$00 ; PRG $1E4A | CPU $DE4A | A9 00 + sta Ram_03B7 ; PRG $1E4C | CPU $DE4C | 8D B7 03 + lda #$28 ; PRG $1E4F | CPU $DE4F | A9 28 + sta Ram_03B8 ; PRG $1E51 | CPU $DE51 | 8D B8 03 + lda #$80 ; PRG $1E54 | CPU $DE54 | A9 80 + sta Ram_03B9 ; PRG $1E56 | CPU $DE56 | 8D B9 03 + lda #$60 ; PRG $1E59 | CPU $DE59 | A9 60 + sta Ram_03BA ; PRG $1E5B | CPU $DE5B | 8D BA 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DE5 E. +; Local behavior: Reads LoadObjectSpriteRenderState; mutates no direct memory mutation observed. +; Parameters: LoadObjectSpriteRenderState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DE5E: + jsr LoadObjectSpriteRenderState ; PRG $1E5E | CPU $DE5E | 20 17 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DE61. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DE61: + rts ; PRG $1E61 | CPU $DE61 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp 50 DE62. +; Local behavior: Reads ScreenObjectMode, Flow_DE77, ScreenVariantInitialState; mutates GameplayObjectState, GameplayObjectX, Ram_04E0, GameplayObjectTimer. +; Parameters: ScreenObjectMode, Flow_DE77, ScreenVariantInitialState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_50_DE62: + lda ScreenObjectMode ; PRG $1E62 | CPU $DE62 | A5 62 + cmp #$02 ; PRG $1E64 | CPU $DE64 | C9 02 + bne Flow_DE77 ; PRG $1E66 | CPU $DE66 | D0 0F + lda ScreenVariantInitialState ; PRG $1E68 | CPU $DE68 | A5 78 + sta GameplayObjectState ; PRG $1E6A | CPU $DE6A | 85 50 + lda #$00 ; PRG $1E6C | CPU $DE6C | A9 00 + sta GameplayObjectX ; PRG $1E6E | CPU $DE6E | 85 52 + sta Ram_04E0 ; PRG $1E70 | CPU $DE70 | 8D E0 04 + lda #$20 ; PRG $1E73 | CPU $DE73 | A9 20 + sta GameplayObjectTimer ; PRG $1E75 | CPU $DE75 | 85 51 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DE77. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DE77: + rts ; PRG $1E77 | CPU $DE77 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Evaluate Collision State DE78. +; Local behavior: Reads ScreenCollisionState, Flow_DECC, FrameCounter, GameplayObjectTimer, GameplayObjectState, ActorCollisionOrStateTable_DECD, Ram_0371, Flow_DEBA; mutates GameplayObjectTimer, Ram_04EF, Ram_04E5, Ram_04E2, Ram_04E0, Ram_04E3, Ram_04E1, Ram_04EE. +; Parameters: ScreenCollisionState, Flow_DECC, FrameCounter, GameplayObjectTimer, GameplayObjectState, ActorCollisionOrStateTable_DECD, Ram_0371, Flow_DEBA. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EvaluateCollisionState_DE78: + lda ScreenCollisionState ; PRG $1E78 | CPU $DE78 | A5 44 + cmp #$01 ; PRG $1E7A | CPU $DE7A | C9 01 + bne Flow_DECC ; PRG $1E7C | CPU $DE7C | D0 4E + lda FrameCounter ; PRG $1E7E | CPU $DE7E | A5 27 + and #$0F ; PRG $1E80 | CPU $DE80 | 29 0F + bne Flow_DECC ; PRG $1E82 | CPU $DE82 | D0 48 + dec GameplayObjectTimer ; PRG $1E84 | CPU $DE84 | C6 51 + bne Flow_DECC ; PRG $1E86 | CPU $DE86 | D0 44 + ldy GameplayObjectState ; PRG $1E88 | CPU $DE88 | A4 50 + lda ActorCollisionOrStateTable_DECD,y ; PRG $1E8A | CPU $DE8A | B9 CD DE + sta GameplayObjectTimer ; PRG $1E8D | CPU $DE8D | 85 51 + lda Ram_0371 ; PRG $1E8F | CPU $DE8F | AD 71 03 + cmp #$6E ; PRG $1E92 | CPU $DE92 | C9 6E + bcs Flow_DEBA ; PRG $1E94 | CPU $DE94 | B0 24 + lda ScreenEffectState ; PRG $1E96 | CPU $DE96 | A5 4E + cmp #$03 ; PRG $1E98 | CPU $DE98 | C9 03 + bcc Flow_DEBA ; PRG $1E9A | CPU $DE9A | 90 1E + lda GameplayObjectX ; PRG $1E9C | CPU $DE9C | A5 52 + sta Ram_04EF ; PRG $1E9E | CPU $DE9E | 8D EF 04 + ldy #$74 ; PRG $1EA1 | CPU $DEA1 | A0 74 + sty Ram_04E5 ; PRG $1EA3 | CPU $DEA3 | 8C E5 04 + ldy #$02 ; PRG $1EA6 | CPU $DEA6 | A0 02 + sty Ram_04E2 ; PRG $1EA8 | CPU $DEA8 | 8C E2 04 + ldy #$01 ; PRG $1EAB | CPU $DEAB | A0 01 + sty Ram_04E0 ; PRG $1EAD | CPU $DEAD | 8C E0 04 + sty Ram_04E3 ; PRG $1EB0 | CPU $DEB0 | 8C E3 04 + dey ; PRG $1EB3 | CPU $DEB3 | 88 + sty Ram_04E1 ; PRG $1EB4 | CPU $DEB4 | 8C E1 04 + sty Ram_04EE ; PRG $1EB7 | CPU $DEB7 | 8C EE 04 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DEBA. +; Local behavior: Reads GameplayObjectX, Flow_DECC, GameplayObjectState; mutates GameplayObjectX, GameplayObjectState. +; Parameters: GameplayObjectX, Flow_DECC, GameplayObjectState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DEBA: + ldy GameplayObjectX ; PRG $1EBA | CPU $DEBA | A4 52 + iny ; PRG $1EBC | CPU $DEBC | C8 + tya ; PRG $1EBD | CPU $DEBD | 98 + and #$03 ; PRG $1EBE | CPU $DEBE | 29 03 + sta GameplayObjectX ; PRG $1EC0 | CPU $DEC0 | 85 52 + bne Flow_DECC ; PRG $1EC2 | CPU $DEC2 | D0 08 + lda GameplayObjectState ; PRG $1EC4 | CPU $DEC4 | A5 50 + cmp #$08 ; PRG $1EC6 | CPU $DEC6 | C9 08 + beq Flow_DECC ; PRG $1EC8 | CPU $DEC8 | F0 02 + inc GameplayObjectState ; PRG $1ECA | CPU $DECA | E6 50 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DECC. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DECC: + rts ; PRG $1ECC | CPU $DECC | 60 + +ActorCollisionOrStateTable_DECD: + .byte $24,$20,$1C,$18,$14,$10,$0E,$0C ; PRG $1ECD | CPU $DECD +; ----------------------------------------------------------------------------- +; Global purpose: Evaluate Collision State DED5. +; Local behavior: Reads ScreenObjectMode, Flow_DECC, ScreenCollisionState, EvaluateCollisionState_DE78, Ram_04E0, Ram_04E1, Flow_DEFD, Flow_DF24; mutates ObjectRecordPointerLo, ObjectRecordPointerHi. +; Parameters: ScreenObjectMode, Flow_DECC, ScreenCollisionState, EvaluateCollisionState_DE78, Ram_04E0, Ram_04E1, Flow_DEFD, Flow_DF24. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EvaluateCollisionState_DED5: + lda ScreenObjectMode ; PRG $1ED5 | CPU $DED5 | A5 62 + cmp #$02 ; PRG $1ED7 | CPU $DED7 | C9 02 + bne Flow_DECC ; PRG $1ED9 | CPU $DED9 | D0 F1 + lda ScreenCollisionState ; PRG $1EDB | CPU $DEDB | A5 44 + beq Flow_DECC ; PRG $1EDD | CPU $DEDD | F0 ED + jsr EvaluateCollisionState_DE78 ; PRG $1EDF | CPU $DEDF | 20 78 DE + lda Ram_04E0 ; PRG $1EE2 | CPU $DEE2 | AD E0 04 + beq Flow_DECC ; PRG $1EE5 | CPU $DEE5 | F0 E5 + lda #$E0 ; PRG $1EE7 | CPU $DEE7 | A9 E0 + sta ObjectRecordPointerLo ; PRG $1EE9 | CPU $DEE9 | 85 A8 + lda #$04 ; PRG $1EEB | CPU $DEEB | A9 04 + sta ObjectRecordPointerHi ; PRG $1EED | CPU $DEED | 85 A9 + ldy Ram_04E1 ; PRG $1EEF | CPU $DEEF | AC E1 04 + beq Flow_DEFD ; PRG $1EF2 | CPU $DEF2 | F0 09 + dey ; PRG $1EF4 | CPU $DEF4 | 88 + beq Flow_DF24 ; PRG $1EF5 | CPU $DEF5 | F0 2D + dey ; PRG $1EF7 | CPU $DEF7 | 88 + beq Flow_DF51 ; PRG $1EF8 | CPU $DEF8 | F0 57 + dey ; PRG $1EFA | CPU $DEFA | 88 + beq Flow_DF66 ; PRG $1EFB | CPU $DEFB | F0 69 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DEFD. +; Local behavior: Reads Ram_04EF, Flow_DF1C; mutates Ram_04EA, Ram_04E6, Ram_04E8, Ram_04ED. +; Parameters: Ram_04EF, Flow_DF1C. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DEFD: + lda #$40 ; PRG $1EFD | CPU $DEFD | A9 40 + sta Ram_04EA ; PRG $1EFF | CPU $DEFF | 8D EA 04 + lda #$0C ; PRG $1F02 | CPU $DF02 | A9 0C + sta Ram_04E6 ; PRG $1F04 | CPU $DF04 | 8D E6 04 + lda #$28 ; PRG $1F07 | CPU $DF07 | A9 28 + sta Ram_04E8 ; PRG $1F09 | CPU $DF09 | 8D E8 04 + lda #$0A ; PRG $1F0C | CPU $DF0C | A9 0A + sta Ram_04ED ; PRG $1F0E | CPU $DF0E | 8D ED 04 + lda Ram_04EF ; PRG $1F11 | CPU $DF11 | AD EF 04 + lsr a ; PRG $1F14 | CPU $DF14 | 4A + lsr a ; PRG $1F15 | CPU $DF15 | 4A + ldx #$70 ; PRG $1F16 | CPU $DF16 | A2 70 + bcs Flow_DF1C ; PRG $1F18 | CPU $DF18 | B0 02 + ldx #$90 ; PRG $1F1A | CPU $DF1A | A2 90 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DF1 C. +; Local behavior: Reads Ram_04E1, Flow_DF84; mutates Ram_04E9, Ram_04E1. +; Parameters: Ram_04E1, Flow_DF84. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DF1C: + stx Ram_04E9 ; PRG $1F1C | CPU $DF1C | 8E E9 04 + inc Ram_04E1 ; PRG $1F1F | CPU $DF1F | EE E1 04 + bne Flow_DF84 ; PRG $1F22 | CPU $DF22 | D0 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DF24. +; Local behavior: Reads Ram_04E8, Ram_0368, Flow_DF84, Ram_04E1, Ram_04EF, Flow_DF4C; mutates Ram_04E8, Ram_04E1, Ram_04EB, Ram_0377. +; Parameters: Ram_04E8, Ram_0368, Flow_DF84, Ram_04E1, Ram_04EF, Flow_DF4C. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DF24: + inc Ram_04E8 ; PRG $1F24 | CPU $DF24 | EE E8 04 + inc Ram_04E8 ; PRG $1F27 | CPU $DF27 | EE E8 04 + lda Ram_0368 ; PRG $1F2A | CPU $DF2A | AD 68 03 + sec ; PRG $1F2D | CPU $DF2D | 38 + sbc #$12 ; PRG $1F2E | CPU $DF2E | E9 12 + cmp Ram_04E8 ; PRG $1F30 | CPU $DF30 | CD E8 04 + bcs Flow_DF84 ; PRG $1F33 | CPU $DF33 | B0 4F + inc Ram_04E1 ; PRG $1F35 | CPU $DF35 | EE E1 04 + lda #$30 ; PRG $1F38 | CPU $DF38 | A9 30 + sta Ram_04EB ; PRG $1F3A | CPU $DF3A | 8D EB 04 + lda #$38 ; PRG $1F3D | CPU $DF3D | A9 38 + sta Ram_0377 ; PRG $1F3F | CPU $DF3F | 8D 77 03 + ldy #$80 ; PRG $1F42 | CPU $DF42 | A0 80 + lda Ram_04EF ; PRG $1F44 | CPU $DF44 | AD EF 04 + lsr a ; PRG $1F47 | CPU $DF47 | 4A + lsr a ; PRG $1F48 | CPU $DF48 | 4A + bcs Flow_DF4C ; PRG $1F49 | CPU $DF49 | B0 01 + iny ; PRG $1F4B | CPU $DF4B | C8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DF4 C. +; Local behavior: Reads Flow_DF84; mutates Ram_0374. +; Parameters: Flow_DF84. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DF4C: + sty Ram_0374 ; PRG $1F4C | CPU $DF4C | 8C 74 03 + bne Flow_DF84 ; PRG $1F4F | CPU $DF4F | D0 33 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DF51. +; Local behavior: Reads Ram_04EB, Flow_DF84, Ram_04E1, UpdateRam_04A4_EA9F; mutates Ram_04EB, AudioEffectRequest, Ram_04E1. +; Parameters: Ram_04EB, Flow_DF84, Ram_04E1, UpdateRam_04A4_EA9F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DF51: + dec Ram_04EB ; PRG $1F51 | CPU $DF51 | CE EB 04 + bne Flow_DF84 ; PRG $1F54 | CPU $DF54 | D0 2E + lda #$04 ; PRG $1F56 | CPU $DF56 | A9 04 + sta AudioEffectRequest ; PRG $1F58 | CPU $DF58 | 85 FE + inc Ram_04E1 ; PRG $1F5A | CPU $DF5A | EE E1 04 + ldx #$40 ; PRG $1F5D | CPU $DF5D | A2 40 + lda #$03 ; PRG $1F5F | CPU $DF5F | A9 03 + jsr UpdateRam_04A4_EA9F ; PRG $1F61 | CPU $DF61 | 20 9F EA + bne Flow_DF84 ; PRG $1F64 | CPU $DF64 | D0 1E +; ----------------------------------------------------------------------------- +; Global purpose: Flow DF66. +; Local behavior: Reads Ram_04EE, Flow_DF88, CalculateAndClampValue_EB36, Ram_04E0, Flow_DF81; mutates no direct memory mutation observed. +; Parameters: Ram_04EE, Flow_DF88, CalculateAndClampValue_EB36, Ram_04E0, Flow_DF81. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DF66: + lda Ram_04EE ; PRG $1F66 | CPU $DF66 | AD EE 04 + bne Flow_DF88 ; PRG $1F69 | CPU $DF69 | D0 1D + ldx #$40 ; PRG $1F6B | CPU $DF6B | A2 40 + jsr CalculateAndClampValue_EB36 ; PRG $1F6D | CPU $DF6D | 20 36 EB + lda Ram_04E0 ; PRG $1F70 | CPU $DF70 | AD E0 04 + bne Flow_DF81 ; PRG $1F73 | CPU $DF73 | D0 0C +; ----------------------------------------------------------------------------- +; Global purpose: Flow DF75. +; Local behavior: Reads Flow_DF84; mutates Ram_04E0, Ram_04E6. +; Parameters: Flow_DF84. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DF75: + lda #$00 ; PRG $1F75 | CPU $DF75 | A9 00 + sta Ram_04E0 ; PRG $1F77 | CPU $DF77 | 8D E0 04 + lda #$47 ; PRG $1F7A | CPU $DF7A | A9 47 + sta Ram_04E6 ; PRG $1F7C | CPU $DF7C | 8D E6 04 + bne Flow_DF84 ; PRG $1F7F | CPU $DF7F | D0 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DF81. +; Local behavior: Reads ComputeOrDispatch_C2B4; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_C2B4. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DF81: + jsr ComputeOrDispatch_C2B4 ; PRG $1F81 | CPU $DF81 | 20 B4 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DF84. +; Local behavior: Reads LoadObjectSpriteRenderState; mutates no direct memory mutation observed. +; Parameters: LoadObjectSpriteRenderState. +; Returns: returns to caller; flags/register result depends on final instructions: jsr LoadObjectSpriteRenderState; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DF84: + jsr LoadObjectSpriteRenderState ; PRG $1F84 | CPU $DF84 | 20 17 C2 + rts ; PRG $1F87 | CPU $DF87 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DF88. +; Local behavior: Reads ScreenCollisionState, Flow_DF84, GameplayStateFlags, Flow_DF75; mutates no direct memory mutation observed. +; Parameters: ScreenCollisionState, Flow_DF84, GameplayStateFlags, Flow_DF75. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DF88: + lda ScreenCollisionState ; PRG $1F88 | CPU $DF88 | A5 44 + cmp #$01 ; PRG $1F8A | CPU $DF8A | C9 01 + beq Flow_DF84 ; PRG $1F8C | CPU $DF8C | F0 F6 + lda GameplayStateFlags ; PRG $1F8E | CPU $DF8E | A5 23 + beq Flow_DF75 ; PRG $1F90 | CPU $DF90 | F0 E3 + bne Flow_DF84 ; PRG $1F92 | CPU $DF92 | D0 F0 +; ----------------------------------------------------------------------------- +; Global purpose: Evaluate Collision State DF94. +; Local behavior: Reads ScreenCollisionState, Flow_DFDB; mutates ObjectRecordPointerLo, ObjectRecordPointerHi, ObjectRecordStride, ObjectSlotOrFieldIndex, OamBufferWriteOffset. +; Parameters: ScreenCollisionState, Flow_DFDB. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EvaluateCollisionState_DF94: + lda ScreenCollisionState ; PRG $1F94 | CPU $DF94 | A5 44 + beq Flow_DFDB ; PRG $1F96 | CPU $DF96 | F0 43 + lda #$00 ; PRG $1F98 | CPU $DF98 | A9 00 + sta ObjectRecordPointerLo ; PRG $1F9A | CPU $DF9A | 85 A8 + lda #$04 ; PRG $1F9C | CPU $DF9C | A9 04 + sta ObjectRecordPointerHi ; PRG $1F9E | CPU $DF9E | 85 A9 + lda #$20 ; PRG $1FA0 | CPU $DFA0 | A9 20 + sta ObjectRecordStride ; PRG $1FA2 | CPU $DFA2 | 85 AA + lda #$00 ; PRG $1FA4 | CPU $DFA4 | A9 00 + sta ObjectSlotOrFieldIndex ; PRG $1FA6 | CPU $DFA6 | 85 0E + lda #$05 ; PRG $1FA8 | CPU $DFA8 | A9 05 + sta OamBufferWriteOffset ; PRG $1FAA | CPU $DFAA | 85 AB +; ----------------------------------------------------------------------------- +; Global purpose: Flow DFAC. +; Local behavior: Reads ObjectSlotOrFieldIndex, Ram_0401, Flow_DFBB, ScreenCollisionState, Flow_DFDC; mutates no direct memory mutation observed. +; Parameters: ObjectSlotOrFieldIndex, Ram_0401, Flow_DFBB, ScreenCollisionState, Flow_DFDC. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DFAC: + ldx ObjectSlotOrFieldIndex ; PRG $1FAC | CPU $DFAC | A6 0E + lda Ram_0401,x ; PRG $1FAE | CPU $DFAE | BD 01 04 + cmp #$0B ; PRG $1FB1 | CPU $DFB1 | C9 0B + beq Flow_DFBB ; PRG $1FB3 | CPU $DFB3 | F0 06 + lda ScreenCollisionState ; PRG $1FB5 | CPU $DFB5 | A5 44 + cmp #$01 ; PRG $1FB7 | CPU $DFB7 | C9 01 + bne Flow_DFDC ; PRG $1FB9 | CPU $DFB9 | D0 21 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DFBB. +; Local behavior: Reads UpdateRam_0402_E000, ObjectSlotOrFieldIndex, Ram_0400, Flow_DFCD, ComputeOrDispatch_C2B4; mutates no direct memory mutation observed. +; Parameters: UpdateRam_0402_E000, ObjectSlotOrFieldIndex, Ram_0400, Flow_DFCD, ComputeOrDispatch_C2B4. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DFBB: + jsr UpdateRam_0402_E000 ; PRG $1FBB | CPU $DFBB | 20 00 E0 + ldx ObjectSlotOrFieldIndex ; PRG $1FBE | CPU $DFBE | A6 0E + lda Ram_0400,x ; PRG $1FC0 | CPU $DFC0 | BD 00 04 + cmp #$01 ; PRG $1FC3 | CPU $DFC3 | C9 01 + bne Flow_DFCD ; PRG $1FC5 | CPU $DFC5 | D0 06 + jsr ComputeOrDispatch_C2B4 ; PRG $1FC7 | CPU $DFC7 | 20 B4 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DFCA. +; Local behavior: Reads LoadObjectSpriteRenderState; mutates no direct memory mutation observed. +; Parameters: LoadObjectSpriteRenderState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DFCA: + jsr LoadObjectSpriteRenderState ; PRG $1FCA | CPU $DFCA | 20 17 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DFCD. +; Local behavior: Reads AdvanceObjectRecordPointer, ObjectSlotOrFieldIndex, OamBufferWriteOffset, Flow_DFAC; mutates ObjectSlotOrFieldIndex, OamBufferWriteOffset. +; Parameters: AdvanceObjectRecordPointer, ObjectSlotOrFieldIndex, OamBufferWriteOffset, Flow_DFAC. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DFCD: + jsr AdvanceObjectRecordPointer ; PRG $1FCD | CPU $DFCD | 20 0F C2 + lda ObjectSlotOrFieldIndex ; PRG $1FD0 | CPU $DFD0 | A5 0E + clc ; PRG $1FD2 | CPU $DFD2 | 18 + adc #$20 ; PRG $1FD3 | CPU $DFD3 | 69 20 + sta ObjectSlotOrFieldIndex ; PRG $1FD5 | CPU $DFD5 | 85 0E + dec OamBufferWriteOffset ; PRG $1FD7 | CPU $DFD7 | C6 AB + bne Flow_DFAC ; PRG $1FD9 | CPU $DFD9 | D0 D1 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DFDB. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DFDB: + rts ; PRG $1FDB | CPU $DFDB | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DFDC. +; Local behavior: Reads GameplayStateFlags, Flow_DFCA, ObjectSlotOrFieldIndex, Ram_0415, Flow_DFF4, ScreenCollisionState, Flow_DFF1; mutates no direct memory mutation observed. +; Parameters: GameplayStateFlags, Flow_DFCA, ObjectSlotOrFieldIndex, Ram_0415, Flow_DFF4, ScreenCollisionState, Flow_DFF1. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DFDC: + lda GameplayStateFlags ; PRG $1FDC | CPU $DFDC | A5 23 + bne Flow_DFCA ; PRG $1FDE | CPU $DFDE | D0 EA + ldx ObjectSlotOrFieldIndex ; PRG $1FE0 | CPU $DFE0 | A6 0E + lda Ram_0415,x ; PRG $1FE2 | CPU $DFE2 | BD 15 04 + bpl Flow_DFF4 ; PRG $1FE5 | CPU $DFE5 | 10 0D + lda #$02 ; PRG $1FE7 | CPU $DFE7 | A9 02 + ldy ScreenCollisionState ; PRG $1FE9 | CPU $DFE9 | A4 44 + cpy #$03 ; PRG $1FEB | CPU $DFEB | C0 03 + bne Flow_DFF1 ; PRG $1FED | CPU $DFED | D0 02 + lda #$01 ; PRG $1FEF | CPU $DFEF | A9 01 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DFF1. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_03AE. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DFF1: + sta Ram_03AE ; PRG $1FF1 | CPU $DFF1 | 8D AE 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow DFF4. +; Local behavior: Reads Flow_DFCA; mutates Ram_0400, Ram_0406. +; Parameters: Flow_DFCA. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_DFF4: + lda #$00 ; PRG $1FF4 | CPU $DFF4 | A9 00 + sta Ram_0400,x ; PRG $1FF6 | CPU $DFF6 | 9D 00 04 + lda #$47 ; PRG $1FF9 | CPU $DFF9 | A9 47 + sta Ram_0406,x ; PRG $1FFB | CPU $DFFB | 9D 06 04 + bpl Flow_DFCA ; PRG $1FFE | CPU $DFFE | 10 CA +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 0402 E000. +; Local behavior: Reads ObjectSlotOrFieldIndex, Ram_0400, Flow_DFDB, Ram_0402, Ram_040E, Flow_E012, Continuation_E0D2; mutates Ram_0402. +; Parameters: ObjectSlotOrFieldIndex, Ram_0400, Flow_DFDB, Ram_0402, Ram_040E, Flow_E012, Continuation_E0D2. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_0402_E000: + ldx ObjectSlotOrFieldIndex ; PRG $2000 | CPU $E000 | A6 0E + lda Ram_0400,x ; PRG $2002 | CPU $E002 | BD 00 04 + beq Flow_DFDB ; PRG $2005 | CPU $E005 | F0 D4 + inc Ram_0402,x ; PRG $2007 | CPU $E007 | FE 02 04 + lda Ram_040E,x ; PRG $200A | CPU $E00A | BD 0E 04 + bne Flow_E012 ; PRG $200D | CPU $E00D | D0 03 + jmp Continuation_E0D2 ; PRG $200F | CPU $E00F | 4C D2 E0 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E012. +; Local behavior: Reads Flow_E01F, Ram_0415, Flow_E01E; mutates Ram_03AE. +; Parameters: Flow_E01F, Ram_0415, Flow_E01E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E012: + bpl Flow_E01F ; PRG $2012 | CPU $E012 | 10 0B + lda Ram_0415,x ; PRG $2014 | CPU $E014 | BD 15 04 + bpl Flow_E01E ; PRG $2017 | CPU $E017 | 10 05 + lda #$01 ; PRG $2019 | CPU $E019 | A9 01 + sta Ram_03AE ; PRG $201B | CPU $E01B | 8D AE 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E01 E. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E01E: + rts ; PRG $201E | CPU $E01E | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E01 F. +; Local behavior: Reads Ram_0400, Flow_E029, Continuation_E0D2; mutates no direct memory mutation observed. +; Parameters: Ram_0400, Flow_E029, Continuation_E0D2. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E01F: + lda Ram_0400,x ; PRG $201F | CPU $E01F | BD 00 04 + cmp #$02 ; PRG $2022 | CPU $E022 | C9 02 + bne Flow_E029 ; PRG $2024 | CPU $E024 | D0 03 + jmp Continuation_E0D2 ; PRG $2026 | CPU $E026 | 4C D2 E0 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E029. +; Local behavior: Reads Ram_040F, Flow_E037, Ram_041D; mutates no direct memory mutation observed. +; Parameters: Ram_040F, Flow_E037, Ram_041D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E029: + ldy Ram_040F,x ; PRG $2029 | CPU $E029 | BC 0F 04 + cpy #$01 ; PRG $202C | CPU $E02C | C0 01 + bne Flow_E037 ; PRG $202E | CPU $E02E | D0 07 + lda Ram_041D,x ; PRG $2030 | CPU $E030 | BD 1D 04 + clc ; PRG $2033 | CPU $E033 | 18 + adc #$08 ; PRG $2034 | CPU $E034 | 69 08 + tay ; PRG $2036 | CPU $E036 | A8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E037. +; Local behavior: Reads IndexedGameplayLookupTable_E0F0, UpdateActorCoordinates_C54B, ComputeOrDispatch_E9C6, ObjectSlotOrFieldIndex, Ram_040F, Flow_E0BD, Flow_E07E; mutates Ram_0401, AudioPendingFlags. +; Parameters: IndexedGameplayLookupTable_E0F0, UpdateActorCoordinates_C54B, ComputeOrDispatch_E9C6, ObjectSlotOrFieldIndex, Ram_040F, Flow_E0BD, Flow_E07E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E037: + lda IndexedGameplayLookupTable_E0F0,y ; PRG $2037 | CPU $E037 | B9 F0 E0 + jsr UpdateActorCoordinates_C54B ; PRG $203A | CPU $E03A | 20 4B C5 + jsr ComputeOrDispatch_E9C6 ; PRG $203D | CPU $E03D | 20 C6 E9 + ldx ObjectSlotOrFieldIndex ; PRG $2040 | CPU $E040 | A6 0E + lda Ram_040F,x ; PRG $2042 | CPU $E042 | BD 0F 04 + beq Flow_E0BD ; PRG $2045 | CPU $E045 | F0 76 + cmp #$01 ; PRG $2047 | CPU $E047 | C9 01 + bne Flow_E07E ; PRG $2049 | CPU $E049 | D0 33 + lda #$0B ; PRG $204B | CPU $E04B | A9 0B + sta Ram_0401,x ; PRG $204D | CPU $E04D | 9D 01 04 + lda #$01 ; PRG $2050 | CPU $E050 | A9 01 + sta AudioPendingFlags ; PRG $2052 | CPU $E052 | 85 FD + ldy #$00 ; PRG $2054 | CPU $E054 | A0 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E056. +; Local behavior: Reads Ram_0408, Ram_0409, Flow_E056, Flow_E090; mutates Ram_03C0, Ram_03C6, Ram_03CE, Ram_03C8, Ram_03C9. +; Parameters: Ram_0408, Ram_0409, Flow_E056, Flow_E090. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E056: + lda #$01 ; PRG $2056 | CPU $E056 | A9 01 + sta Ram_03C0,y ; PRG $2058 | CPU $E058 | 99 C0 03 + lda #$50 ; PRG $205B | CPU $E05B | A9 50 + sta Ram_03C6,y ; PRG $205D | CPU $E05D | 99 C6 03 + lda #$00 ; PRG $2060 | CPU $E060 | A9 00 + sta Ram_03CE,y ; PRG $2062 | CPU $E062 | 99 CE 03 + lda Ram_0408,x ; PRG $2065 | CPU $E065 | BD 08 04 + sta Ram_03C8,y ; PRG $2068 | CPU $E068 | 99 C8 03 + lda Ram_0409,x ; PRG $206B | CPU $E06B | BD 09 04 + sta Ram_03C9,y ; PRG $206E | CPU $E06E | 99 C9 03 + tya ; PRG $2071 | CPU $E071 | 98 + clc ; PRG $2072 | CPU $E072 | 18 + adc #$10 ; PRG $2073 | CPU $E073 | 69 10 + tay ; PRG $2075 | CPU $E075 | A8 + cmp #$40 ; PRG $2076 | CPU $E076 | C9 40 + bne Flow_E056 ; PRG $2078 | CPU $E078 | D0 DC + lda #$02 ; PRG $207A | CPU $E07A | A9 02 + bpl Flow_E090 ; PRG $207C | CPU $E07C | 10 12 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E07 E. +; Local behavior: Reads Flow_E08A, Ram_041D; mutates Ram_041D. +; Parameters: Flow_E08A, Ram_041D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E07E: + cmp #$02 ; PRG $207E | CPU $E07E | C9 02 + bne Flow_E08A ; PRG $2080 | CPU $E080 | D0 08 + lda Ram_041D,x ; PRG $2082 | CPU $E082 | BD 1D 04 + beq Flow_E08A ; PRG $2085 | CPU $E085 | F0 03 + dec Ram_041D ; PRG $2087 | CPU $E087 | CE 1D 04 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E08 A. +; Local behavior: Reads implicit CPU state or none observed; mutates AudioEffectRequest. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E08A: + lda #$01 ; PRG $208A | CPU $E08A | A9 01 + sta AudioEffectRequest ; PRG $208C | CPU $E08C | 85 FE + lda #$00 ; PRG $208E | CPU $E08E | A9 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E090. +; Local behavior: Reads Ram_041B, Ram_0415, Flow_E0AD; mutates Ram_0400, Ram_040E, Ram_0500, Ram_0406, Ram_03AE. +; Parameters: Ram_041B, Ram_0415, Flow_E0AD. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E090: + sta Ram_0400,x ; PRG $2090 | CPU $E090 | 9D 00 04 + lda #$00 ; PRG $2093 | CPU $E093 | A9 00 + sta Ram_040E,x ; PRG $2095 | CPU $E095 | 9D 0E 04 + ldy Ram_041B,x ; PRG $2098 | CPU $E098 | BC 1B 04 + sta Ram_0500,y ; PRG $209B | CPU $E09B | 99 00 05 + lda #$47 ; PRG $209E | CPU $E09E | A9 47 + sta Ram_0406,x ; PRG $20A0 | CPU $E0A0 | 9D 06 04 + lda Ram_0415,x ; PRG $20A3 | CPU $E0A3 | BD 15 04 + bpl Flow_E0AD ; PRG $20A6 | CPU $E0A6 | 10 05 + lda #$01 ; PRG $20A8 | CPU $E0A8 | A9 01 + sta Ram_03AE ; PRG $20AA | CPU $E0AA | 8D AE 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E0 AD. +; Local behavior: Reads Ram_040F, ActorTimerArray, ActorTableIndex, Flow_E0BA; mutates ActorTimerArray, ActorTableIndex. +; Parameters: Ram_040F, ActorTimerArray, ActorTableIndex, Flow_E0BA. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E0AD: + lda Ram_040F,x ; PRG $20AD | CPU $E0AD | BD 0F 04 + tax ; PRG $20B0 | CPU $E0B0 | AA + dec ActorTimerArray,x ; PRG $20B1 | CPU $E0B1 | D6 68 + ldy ActorTableIndex ; PRG $20B3 | CPU $E0B3 | A4 6F + beq Flow_E0BA ; PRG $20B5 | CPU $E0B5 | F0 03 + dey ; PRG $20B7 | CPU $E0B7 | 88 + sty ActorTableIndex ; PRG $20B8 | CPU $E0B8 | 84 6F +; ----------------------------------------------------------------------------- +; Global purpose: Flow E0 BA. +; Local behavior: Reads LoadObjectSpriteRenderState; mutates no direct memory mutation observed. +; Parameters: LoadObjectSpriteRenderState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E0BA: + jmp LoadObjectSpriteRenderState ; PRG $20BA | CPU $E0BA | 4C 17 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E0 BD. +; Local behavior: Reads ActorTimerArray, ActorSequenceStep, Ram_040F; mutates ActorTimerArray, ActorSequenceStep, Ram_040F, AudioChannelRequest, Ram_040E, Ram_0407. +; Parameters: ActorTimerArray, ActorSequenceStep, Ram_040F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E0BD: + dec ActorTimerArray ; PRG $20BD | CPU $E0BD | C6 68 + inc ActorSequenceStep ; PRG $20BF | CPU $E0BF | E6 69 + inc Ram_040F,x ; PRG $20C1 | CPU $E0C1 | FE 0F 04 + lda #$08 ; PRG $20C4 | CPU $E0C4 | A9 08 + sta AudioChannelRequest ; PRG $20C6 | CPU $E0C6 | 85 FF + lda #$00 ; PRG $20C8 | CPU $E0C8 | A9 00 + sta Ram_040E,x ; PRG $20CA | CPU $E0CA | 9D 0E 04 + lda #$02 ; PRG $20CD | CPU $E0CD | A9 02 + sta Ram_0407,x ; PRG $20CF | CPU $E0CF | 9D 07 04 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation E0 D2. +; Local behavior: Reads Ram_0401, DispatchScreenStateHandler, GameplayTimerArray; mutates GameplayTimerArray. +; Parameters: Ram_0401, DispatchScreenStateHandler, GameplayTimerArray. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_E0D2: + lda Ram_0401,x ; PRG $20D2 | CPU $E0D2 | BD 01 04 + jsr DispatchScreenStateHandler ; PRG $20D5 | CPU $E0D5 | 20 C6 C3 + cld ; PRG $20D8 | CPU $E0D8 | D8 + inc GameplayTimerArray ; PRG $20D9 | CPU $E0D9 | E6 20 + .byte $E7,$D3,$E2,$25,$E3,$C9,$E3,$D6,$E3,$1D,$E4,$30,$E7,$20,$E7,$3C ; PRG $20DB | CPU $E0DB + .byte $E7,$35,$E5,$10,$E1 ; PRG $20EB | CPU $E0EB + +IndexedGameplayLookupTable_E0F0: + .byte $00,$04,$01,$03,$07,$02,$05,$07,$04,$07,$10,$00,$10,$00,$10,$0A ; PRG $20F0 | CPU $E0F0 + .byte $00,$1E,$00,$28,$00,$14,$20,$32,$20,$00,$02,$01,$01,$00,$02,$00 ; PRG $2100 | CPU $E100 + .byte $A6,$0E,$A5,$27,$29,$03,$F0,$78,$A5,$A8,$85,$01,$A5,$A9,$85,$02 ; PRG $2110 | CPU $E110 + .byte $A9,$C0,$85,$A8,$A9,$03,$85,$A9,$A9,$10,$85,$AA,$A9,$03,$85,$04 ; PRG $2120 | CPU $E120 + .byte $A2,$00,$86,$03,$86,$0F,$BD,$C0,$03,$F0,$2E,$A9,$01,$85,$03,$BD ; PRG $2130 | CPU $E130 + .byte $CE,$03,$D0,$4D,$A9,$50,$9D,$C6,$03,$BD,$C8,$03,$C9,$D0,$B0,$41 ; PRG $2140 | CPU $E140 + .byte $18,$7D,$CB,$03,$9D,$C8,$03,$BD,$C9,$03,$C9,$F0,$B0,$33,$C9,$10 ; PRG $2150 | CPU $E150 + .byte $90,$2F,$18,$7D,$CC,$03,$9D,$C9,$03,$20,$17,$C2,$20,$0F,$C2,$A5 ; PRG $2160 | CPU $E160 + .byte $0F,$18,$69,$10,$AA,$C6,$04,$10,$BB,$A5,$01,$85,$A8,$A5,$02,$85 ; PRG $2170 | CPU $E170 + .byte $A9,$A9,$20,$85,$AA,$A5,$03,$D0,$07,$A6,$0E,$A9,$00,$9D,$00,$04 ; PRG $2180 | CPU $E180 + .byte $60,$A9,$00,$9D,$C0,$03,$9D,$CE,$03,$A9,$49,$9D,$C6,$03,$10,$C9 ; PRG $2190 | CPU $E190 + .byte $A9,$50,$BC,$1C,$04,$F0,$02,$A9,$B0,$9D,$19,$04,$A9,$88,$9D,$1A ; PRG $21A0 | CPU $E1A0 + .byte $04,$BD,$15,$04,$09,$08,$9D,$15,$04,$60,$BD,$0F,$04,$C9,$02,$90 ; PRG $21B0 | CPU $E1B0 + .byte $DF,$C9,$05,$B0,$37,$A5,$75,$F0,$34,$A9,$05,$85,$06,$20,$2F,$C4 ; PRG $21C0 | CPU $E1C0 + .byte $C6,$06,$18,$69,$34,$90,$F9,$A4,$06,$B9,$70,$00,$D0,$07,$88,$10 ; PRG $21D0 | CPU $E1D0 + .byte $F8,$A0,$04,$F0,$F4,$98,$9D,$1E,$04,$A9,$D8,$9D,$1A,$04,$B9,$0B ; PRG $21E0 | CPU $E1E0 + .byte $E2,$9D,$19,$04,$BD,$15,$04,$09,$04,$9D,$15,$04,$60,$AD,$08,$03 ; PRG $21F0 | CPU $E1F0 + .byte $9D,$1A,$04,$AD,$09,$03,$9D,$19,$04,$D0,$E9,$40,$60,$80,$A0,$C0 ; PRG $2200 | CPU $E200 + .byte $BD,$19,$04,$38,$FD,$09,$04,$10,$03,$20,$95,$E6,$C9,$10,$B0,$71 ; PRG $2210 | CPU $E210 + .byte $BD,$1A,$04,$38,$FD,$08,$04,$10,$03,$20,$95,$E6,$C9,$10,$B0,$61 ; PRG $2220 | CPU $E220 + .byte $BD,$15,$04,$29,$10,$F0,$10,$A9,$07,$9D,$01,$04,$BD,$15,$04,$10 ; PRG $2230 | CPU $E230 + .byte $05,$A9,$02,$8D,$AE,$03,$60,$A9,$38,$9D,$1A,$04,$A9,$B8,$BC,$1C ; PRG $2240 | CPU $E240 + .byte $04,$F0,$02,$A9,$48,$9D,$19,$04,$BD,$15,$04,$29,$D9,$09,$10,$9D ; PRG $2250 | CPU $E250 + .byte $15,$04,$BD,$0F,$04,$C9,$02,$90,$28,$C9,$05,$B0,$24,$BD,$1D,$04 ; PRG $2260 | CPU $E260 + .byte $D0,$1F,$BC,$1E,$04,$B9,$70,$00,$F0,$17,$AD,$A0,$03,$D0,$12,$A9 ; PRG $2270 | CPU $E270 + .byte $00,$99,$70,$00,$BD,$15,$04,$09,$80,$9D,$15,$04,$20,$8E,$EB,$A6 ; PRG $2280 | CPU $E280 + .byte $0E,$60,$A5,$27,$4A,$90,$FA,$BD,$0F,$04,$C9,$03,$F0,$05,$C9,$04 ; PRG $2290 | CPU $E290 + .byte $F0,$01,$60,$BC,$04,$04,$B9,$CA,$E2,$C9,$AA,$D0,$07,$A9,$00,$9D ; PRG $22A0 | CPU $E2A0 + .byte $04,$04,$F0,$EF,$DD,$02,$04,$B0,$06,$FE,$04,$04,$FE,$04,$04,$B9 ; PRG $22B0 | CPU $E2B0 + .byte $CB,$E2,$18,$7D,$08,$04,$9D,$08,$04,$60,$40,$01,$60,$00,$A0,$FF ; PRG $22C0 | CPU $E2C0 + .byte $FE,$00,$AA,$A6,$0E,$BD,$0F,$04,$0A,$A8,$B9,$FB,$E0,$9D,$05,$04 ; PRG $22D0 | CPU $E2D0 + .byte $B9,$FC,$E0,$9D,$11,$04,$A9,$0C,$9D,$10,$04,$BD,$15,$04,$29,$1C ; PRG $22E0 | CPU $E2E0 + .byte $F0,$03,$4C,$7C,$E3,$BD,$0F,$04,$C9,$02,$90,$0D,$C9,$05,$F0,$11 ; PRG $22F0 | CPU $E2F0 + .byte $C9,$06,$F0,$0D,$BD,$1D,$04,$D0,$0F,$20,$BA,$E1,$FE,$01,$04,$10 ; PRG $2300 | CPU $E300 + .byte $6B,$A9,$04,$9D,$01,$04,$10,$64,$C9,$02,$F0,$05,$A9,$01,$9D,$1F ; PRG $2310 | CPU $E310 + .byte $04,$A9,$0A,$10,$EE,$A6,$0E,$BD,$0F,$04,$C9,$05,$B0,$37,$DE,$0C ; PRG $2320 | CPU $E320 + .byte $04,$D0,$32,$A5,$6F,$A0,$00,$D9,$AB,$E4,$B0,$03,$C8,$10,$F8,$A5 ; PRG $2330 | CPU $E330 + .byte $41,$F0,$05,$98,$18,$69,$0C,$A8,$B9,$AF,$E4,$9D,$0C,$04,$BD,$08 ; PRG $2340 | CPU $E340 + .byte $04,$CD,$08,$03,$B0,$0F,$D9,$B3,$E4,$90,$0A,$D9,$B7,$E4,$B0,$05 ; PRG $2350 | CPU $E350 + .byte $20,$61,$EA,$A6,$0E,$BD,$0F,$04,$C9,$02,$B0,$05,$A5,$27,$4A,$B0 ; PRG $2360 | CPU $E360 + .byte $57,$20,$10,$E2,$20,$92,$E2,$20,$ED,$E5,$90,$4C,$BD,$10,$04,$4A ; PRG $2370 | CPU $E370 + .byte $4A,$85,$12,$C9,$02,$90,$0B,$20,$C7,$E4,$B0,$0E,$20,$19,$E5,$4C ; PRG $2380 | CPU $E380 + .byte $9A,$E3,$20,$F0,$E4,$B0,$03,$20,$27,$E5,$05,$12,$9D,$10,$04,$0A ; PRG $2390 | CPU $E390 + .byte $18,$7D,$11,$04,$A8,$B9,$1B,$ED,$85,$14,$B9,$1C,$ED,$85,$15,$A0 ; PRG $23A0 | CPU $E3A0 + .byte $00,$B1,$14,$9D,$12,$04,$E8,$C8,$C0,$03,$D0,$F5,$A6,$0E,$BD,$15 ; PRG $23B0 | CPU $E3B0 + .byte $04,$29,$FE,$11,$14,$9D,$15,$04,$60,$A6,$0E,$BD,$15,$04,$09,$02 ; PRG $23C0 | CPU $E3C0 + .byte $9D,$15,$04,$FE,$01,$04,$A6,$0E,$20,$ED,$E5,$A5,$27,$29,$03,$D0 ; PRG $23D0 | CPU $E3D0 + .byte $09,$BD,$08,$04,$18,$69,$01,$9D,$08,$04,$BD,$08,$04,$CD,$08,$03 ; PRG $23E0 | CPU $E3E0 + .byte $90,$2A,$FE,$01,$04,$A9,$10,$85,$FF,$A9,$00,$9D,$1D,$04,$9D,$1F ; PRG $23F0 | CPU $E3F0 + .byte $04,$BC,$0F,$04,$C0,$06,$D0,$02,$A9,$1E,$9D,$1E,$04,$A9,$00,$BC ; PRG $2400 | CPU $E400 + .byte $09,$04,$CC,$09,$03,$90,$02,$A9,$FF,$9D,$0B,$04,$60,$A6,$0E,$BC ; PRG $2410 | CPU $E410 + .byte $1D,$04,$B9,$89,$E4,$C9,$80,$D0,$05,$A9,$00,$9D,$1D,$04,$18,$7D ; PRG $2420 | CPU $E420 + .byte $08,$04,$9D,$08,$04,$FE,$1D,$04,$A6,$0E,$BC,$1F,$04,$B9,$9E,$E4 ; PRG $2430 | CPU $E430 + .byte $C9,$FF,$F0,$20,$DD,$1E,$04,$B0,$06,$FE,$1F,$04,$FE,$1F,$04,$B9 ; PRG $2440 | CPU $E440 + .byte $9F,$E4,$BC,$0B,$04,$10,$03,$20,$95,$E6,$18,$7D,$09,$04,$9D,$09 ; PRG $2450 | CPU $E450 + .byte $04,$FE,$1E,$04,$A9,$30,$BC,$0B,$04,$10,$09,$DD,$09,$04,$90,$18 ; PRG $2460 | CPU $E460 + .byte $A9,$02,$B0,$09,$A9,$D0,$DD,$09,$04,$B0,$0D,$A9,$06,$20,$9C,$E3 ; PRG $2470 | CPU $E470 + .byte $A9,$03,$9D,$01,$04,$4C,$47,$E2,$60,$01,$01,$00,$01,$00,$00,$FF ; PRG $2480 | CPU $E480 + .byte $00,$FF,$FF,$FF,$FF,$00,$FF,$00,$00,$01,$00,$01,$01,$80,$20,$00 ; PRG $2490 | CPU $E490 + .byte $28,$01,$30,$02,$36,$03,$48,$04,$7F,$02,$FF,$18,$0C,$02,$00,$FF ; PRG $24A0 | CPU $E4A0 + .byte $FF,$FF,$E8,$40,$40,$40,$40,$78,$78,$88,$90,$80,$80,$60,$40,$40 ; PRG $24B0 | CPU $E4B0 + .byte $40,$40,$40,$80,$80,$88,$90,$BD,$0F,$04,$C9,$02,$90,$0D,$BD,$09 ; PRG $24C0 | CPU $E4C0 + .byte $04,$C9,$20,$90,$17,$18,$69,$20,$B0,$0E,$60,$BD,$09,$04,$C9,$40 ; PRG $24D0 | CPU $E4D0 + .byte $90,$0A,$18,$69,$40,$B0,$01,$60,$A9,$04,$38,$60,$A9,$00,$38,$60 ; PRG $24E0 | CPU $E4E0 + .byte $BD,$0F,$04,$C9,$02,$90,$0D,$BD,$08,$04,$C9,$20,$90,$17,$18,$69 ; PRG $24F0 | CPU $E4F0 + .byte $34,$B0,$0E,$60,$BD,$08,$04,$C9,$60,$90,$0A,$18,$69,$90,$B0,$01 ; PRG $2500 | CPU $E500 + .byte $60,$A9,$08,$38,$60,$A9,$0C,$38,$60,$BD,$19,$04,$DD,$09,$04,$90 ; PRG $2510 | CPU $E510 + .byte $03,$A9,$00,$60,$A9,$04,$60,$BD,$1A,$04,$DD,$08,$04,$90,$03,$A9 ; PRG $2520 | CPU $E520 + .byte $0C,$60,$A9,$08,$60,$A6,$0E,$AD,$00,$04,$D0,$10,$BD,$15,$04,$09 ; PRG $2530 | CPU $E530 + .byte $40,$9D,$15,$04,$A9,$03,$9D,$01,$04,$4C,$47,$E2,$A5,$27,$4A,$B0 ; PRG $2540 | CPU $E540 + .byte $E3,$BC,$1F,$04,$B9,$B9,$E5,$85,$01,$BD,$1E,$04,$0A,$A8,$84,$0C ; PRG $2550 | CPU $E550 + .byte $BD,$1F,$04,$C9,$01,$F0,$05,$C9,$02,$F0,$01,$C8,$B9,$BD,$E5,$C9 ; PRG $2560 | CPU $E560 + .byte $FF,$D0,$11,$BC,$1F,$04,$B9,$B9,$E5,$9D,$1F,$04,$A0,$00,$98,$9D ; PRG $2570 | CPU $E570 + .byte $1E,$04,$F0,$DA,$46,$01,$90,$03,$20,$95,$E6,$18,$6D,$09,$04,$9D ; PRG $2580 | CPU $E580 + .byte $09,$04,$A6,$0E,$A4,$0C,$BD,$1F,$04,$C9,$00,$F0,$05,$C9,$03,$F0 ; PRG $2590 | CPU $E590 + .byte $01,$C8,$B9,$BD,$E5,$46,$01,$B0,$03,$20,$95,$E6,$18,$6D,$08,$04 ; PRG $25A0 | CPU $E5A0 + .byte $9D,$08,$04,$A6,$0E,$FE,$1E,$04,$60,$02,$00,$03,$01,$00,$10,$01 ; PRG $25B0 | CPU $E5B0 + .byte $10,$02,$0F,$03,$0F,$04,$0F,$05,$0E,$06,$0E,$07,$0E,$08,$0D,$09 ; PRG $25C0 | CPU $E5C0 + .byte $0D,$0A,$0C,$0B,$0B,$0C,$0A,$0D,$09,$0D,$08,$0E,$07,$0E,$06,$0E ; PRG $25D0 | CPU $E5D0 + .byte $05,$0F,$04,$0F,$03,$0F,$02,$10,$01,$10,$00,$FF,$FF,$BD,$15,$04 ; PRG $25E0 | CPU $E5E0 + .byte $29,$02,$D0,$08,$BD,$12,$04,$F0,$49,$DE,$12,$04,$FE,$13,$04,$D0 ; PRG $25F0 | CPU $E5F0 + .byte $03,$FE,$14,$04,$BD,$13,$04,$85,$14,$BD,$14,$04,$85,$15,$A0,$00 ; PRG $2600 | CPU $E600 + .byte $B1,$14,$C9,$FF,$D0,$14,$C8,$B1,$14,$9D,$13,$04,$85,$16,$C8,$B1 ; PRG $2610 | CPU $E610 + .byte $14,$9D,$14,$04,$85,$15,$A5,$16,$85,$14,$A0,$00,$B1,$14,$85,$16 ; PRG $2620 | CPU $E620 + .byte $BD,$15,$04,$29,$01,$F0,$06,$A5,$16,$49,$80,$85,$16,$20,$44,$E6 ; PRG $2630 | CPU $E630 + .byte $18,$60,$38,$60,$BD,$15,$04,$29,$02,$D0,$24,$BD,$15,$04,$29,$10 ; PRG $2640 | CPU $E640 + .byte $F0,$1D,$BD,$09,$04,$DD,$19,$04,$D0,$15,$BD,$08,$04,$38,$FD,$1A ; PRG $2650 | CPU $E650 + .byte $04,$B0,$08,$20,$95,$E6,$49,$FF,$18,$69,$01,$C9,$20,$90,$03,$20 ; PRG $2660 | CPU $E660 + .byte $9B,$E6,$BD,$15,$04,$29,$10,$F0,$18,$BD,$08,$04,$DD,$1A,$04,$D0 ; PRG $2670 | CPU $E670 + .byte $10,$BD,$09,$04,$38,$FD,$19,$04,$B0,$03,$20,$95,$E6,$C9,$20,$90 ; PRG $2680 | CPU $E680 + .byte $03,$20,$BD,$E6,$60 ; PRG $2690 | CPU $E690 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch E695. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: .byte $01,$01,$91,$01,$01,$01,$01,$01,$01,$01,$01,$91,$01,$90,$01,$90; .byte $91,$90,$90,$09,$90,$99,$00,$90,$09,$99,$09,$90,$09,$19,$09,$19; .byte $09,$19,$09,$09,$19,$09,$09,$19,$09,$09. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_E695: + eor #$FF ; PRG $2695 | CPU $E695 | 49 FF + clc ; PRG $2697 | CPU $E697 | 18 + adc #$01 ; PRG $2698 | CPU $E698 | 69 01 + rts ; PRG $269A | CPU $E69A | 60 + .byte $A5,$16,$4A,$4A,$4A,$4A,$A8,$29,$08,$F0,$0A,$98,$29,$07,$20,$95 ; PRG $269B | CPU $E69B + .byte $E6,$A8,$4C,$B4,$E6,$98,$29,$07,$A8,$98,$18,$7D,$09,$04,$9D,$09 ; PRG $26AB | CPU $E6AB + .byte $04,$60,$A5,$16,$29,$08,$D0,$06,$A5,$16,$29,$07,$10,$07,$A5,$16 ; PRG $26BB | CPU $E6BB + .byte $29,$07,$20,$95,$E6,$18,$7D,$08,$04,$9D,$08,$04,$60,$A6,$0E,$A9 ; PRG $26CB | CPU $E6CB + .byte $3C,$9D,$05,$04,$BC,$0F,$04,$B9,$09,$E1,$9D,$07,$04,$A9,$30,$9D ; PRG $26DB | CPU $E6DB + .byte $08,$04,$A9,$48,$BC,$1C,$04,$D0,$02,$A9,$B8,$9D,$09,$04,$A0,$00 ; PRG $26EB | CPU $E6EB + .byte $B9,$5C,$E7,$85,$14,$B9,$5D,$E7,$85,$15,$20,$AF,$E3,$BD,$1D,$04 ; PRG $26FB | CPU $E6FB + .byte $F0,$08,$AD,$15,$04,$9D,$15,$04,$10,$08,$20,$2F,$C4,$29,$01,$9D ; PRG $270B | CPU $E70B + .byte $15,$04,$FE,$01,$04,$A5,$27,$4A,$90,$0A,$A6,$0E,$20,$ED,$E5,$90 ; PRG $271B | CPU $E71B + .byte $03,$FE,$01,$04,$60,$A6,$0E,$A9,$54,$9D,$05,$04,$A0,$02,$4C,$FB ; PRG $272B | CPU $E72B + .byte $E6,$A6,$0E,$BC,$1B,$04,$A9,$01,$99,$00,$05,$BD,$0F,$04,$99,$01 ; PRG $273B | CPU $E73B + .byte $05,$A9,$00,$9D,$00,$04,$9D,$01,$04,$A9,$47,$9D,$06,$04,$4C,$17 ; PRG $274B | CPU $E74B + .byte $C2,$60,$E7,$64,$E7,$3A,$68,$E7,$00,$22,$A2,$E7,$01,$09,$19,$09 ; PRG $275B | CPU $E75B + .byte $19,$09,$19,$19,$19,$19,$19,$10,$10,$19,$10,$10,$10,$10,$11,$10 ; PRG $276B | CPU $E76B + .byte $11,$11,$10,$11,$01,$11,$01,$01,$11,$01,$01,$01,$01,$01,$01,$91 ; PRG $277B | CPU $E77B + .byte $01,$01,$01,$01,$91,$01,$91,$01,$91,$01,$91,$01,$91,$01,$01,$91 ; PRG $278B | CPU $E78B + .byte $01,$01,$91,$01,$01,$01,$01,$01,$01,$01,$01,$91,$01,$90,$01,$90 ; PRG $279B | CPU $E79B + .byte $91,$90,$90,$09,$90,$99,$00,$90,$09,$99,$09,$90,$09,$19,$09,$19 ; PRG $27AB | CPU $E7AB + .byte $09,$19,$09,$09,$19,$09,$09,$19,$09,$09 ; PRG $27BB | CPU $E7BB +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp 04 E7 C5. +; Local behavior: Reads implicit CPU state or none observed; mutates PackedCoordinateOrValue. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_04_E7C5: + lda #$03 ; PRG $27C5 | CPU $E7C5 | A9 03 + sta PackedCoordinateOrValue ; PRG $27C7 | CPU $E7C7 | 85 04 + ldx #$00 ; PRG $27C9 | CPU $E7C9 | A2 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E7 CB. +; Local behavior: Reads PackedCoordinateOrValue, ScreenObjectInitialXTable, ScreenObjectInitialYTable, ScreenObjectInitialStateTable, Flow_E7CB, ComputeOrDispatch_E9BE; mutates Ram_03C0, Ram_03C6, Ram_03C7, Ram_03CD, Ram_03CA, Ram_03CB, Ram_03CC, PackedCoordinateOrValue. +; Parameters: PackedCoordinateOrValue, ScreenObjectInitialXTable, ScreenObjectInitialYTable, ScreenObjectInitialStateTable, Flow_E7CB, ComputeOrDispatch_E9BE. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E7CB: + lda #$00 ; PRG $27CB | CPU $E7CB | A9 00 + sta Ram_03C0,x ; PRG $27CD | CPU $E7CD | 9D C0 03 + lda #$50 ; PRG $27D0 | CPU $E7D0 | A9 50 + sta Ram_03C6,x ; PRG $27D2 | CPU $E7D2 | 9D C6 03 + lda #$02 ; PRG $27D5 | CPU $E7D5 | A9 02 + sta Ram_03C7,x ; PRG $27D7 | CPU $E7D7 | 9D C7 03 + lda #$0E ; PRG $27DA | CPU $E7DA | A9 0E + sta Ram_03CD,x ; PRG $27DC | CPU $E7DC | 9D CD 03 + lda PackedCoordinateOrValue ; PRG $27DF | CPU $E7DF | A5 04 + asl a ; PRG $27E1 | CPU $E7E1 | 0A + clc ; PRG $27E2 | CPU $E7E2 | 18 + adc PackedCoordinateOrValue ; PRG $27E3 | CPU $E7E3 | 65 04 + tay ; PRG $27E5 | CPU $E7E5 | A8 + lda ScreenObjectInitialXTable,y ; PRG $27E6 | CPU $E7E6 | B9 5E E8 + sta Ram_03CA,x ; PRG $27E9 | CPU $E7E9 | 9D CA 03 + lda ScreenObjectInitialYTable,y ; PRG $27EC | CPU $E7EC | B9 5F E8 + sta Ram_03CB,x ; PRG $27EF | CPU $E7EF | 9D CB 03 + lda ScreenObjectInitialStateTable,y ; PRG $27F2 | CPU $E7F2 | B9 60 E8 + sta Ram_03CC,x ; PRG $27F5 | CPU $E7F5 | 9D CC 03 + txa ; PRG $27F8 | CPU $E7F8 | 8A + clc ; PRG $27F9 | CPU $E7F9 | 18 + adc #$10 ; PRG $27FA | CPU $E7FA | 69 10 + tax ; PRG $27FC | CPU $E7FC | AA + dec PackedCoordinateOrValue ; PRG $27FD | CPU $E7FD | C6 04 + bpl Flow_E7CB ; PRG $27FF | CPU $E7FF | 10 CA + lda #$00 ; PRG $2801 | CPU $E801 | A9 00 + sta ObjectRecordPointerLo ; PRG $2803 | CPU $E803 | 85 A8 + lda #$05 ; PRG $2805 | CPU $E805 | A9 05 + sta ObjectRecordPointerHi ; PRG $2807 | CPU $E807 | 85 A9 + ldy #$80 ; PRG $2809 | CPU $E809 | A0 80 + jsr ComputeOrDispatch_E9BE ; PRG $280B | CPU $E80B | 20 BE E9 + lda #$00 ; PRG $280E | CPU $E80E | A9 00 + sta ObjectRecordPointerLo ; PRG $2810 | CPU $E810 | 85 A8 + lda #$04 ; PRG $2812 | CPU $E812 | A9 04 + sta ObjectRecordPointerHi ; PRG $2814 | CPU $E814 | 85 A9 + ldy #$E0 ; PRG $2816 | CPU $E816 | A0 E0 + jsr ComputeOrDispatch_E9BE ; PRG $2818 | CPU $E818 | 20 BE E9 + ldx #$00 ; PRG $281B | CPU $E81B | A2 00 + stx RecordFieldCount ; PRG $281D | CPU $E81D | 86 06 + stx ObjectScanIndex ; PRG $281F | CPU $E81F | 86 08 + lda #$07 ; PRG $2821 | CPU $E821 | A9 07 + sta WorkPointerOrValueLo ; PRG $2823 | CPU $E823 | 85 01 + ldy #$00 ; PRG $2825 | CPU $E825 | A0 00 + sty MetaspriteLayoutOffset ; PRG $2827 | CPU $E827 | 84 0C +; ----------------------------------------------------------------------------- +; Global purpose: Flow E829. +; Local behavior: Reads MetaspriteLayoutOffset, ActorTimerArray; mutates WorkPointerOrValueHi. +; Parameters: MetaspriteLayoutOffset, ActorTimerArray. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E829: + ldy MetaspriteLayoutOffset ; PRG $2829 | CPU $E829 | A4 0C + lda ActorTimerArray,y ; PRG $282B | CPU $E82B | B9 68 00 + sta WorkPointerOrValueHi ; PRG $282E | CPU $E82E | 85 02 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation E830. +; Local behavior: Reads Flow_E855, ObjectScanIndex; mutates LoopCounter05. +; Parameters: Flow_E855, ObjectScanIndex. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_E830: + beq Flow_E855 ; PRG $2830 | CPU $E830 | F0 23 + lda ObjectScanIndex ; PRG $2832 | CPU $E832 | A5 08 + asl a ; PRG $2834 | CPU $E834 | 0A + asl a ; PRG $2835 | CPU $E835 | 0A + tay ; PRG $2836 | CPU $E836 | A8 + lda #$04 ; PRG $2837 | CPU $E837 | A9 04 + sta LoopCounter05 ; PRG $2839 | CPU $E839 | 85 05 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E83 B. +; Local behavior: Reads IndexedGameplayLookupTable_ED03, LoopCounter05, Flow_E83B, RecordFieldCount, WorkPointerOrValueHi, Continuation_E830; mutates Ram_0500, LoopCounter05, Ram_04FE, RecordFieldCount, WorkPointerOrValueHi. +; Parameters: IndexedGameplayLookupTable_ED03, LoopCounter05, Flow_E83B, RecordFieldCount, WorkPointerOrValueHi, Continuation_E830. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E83B: + lda IndexedGameplayLookupTable_ED03,y ; PRG $283B | CPU $E83B | B9 03 ED + sta Ram_0500,x ; PRG $283E | CPU $E83E | 9D 00 05 + inx ; PRG $2841 | CPU $E841 | E8 + iny ; PRG $2842 | CPU $E842 | C8 + dec LoopCounter05 ; PRG $2843 | CPU $E843 | C6 05 + bne Flow_E83B ; PRG $2845 | CPU $E845 | D0 F4 + lda RecordFieldCount ; PRG $2847 | CPU $E847 | A5 06 + and #$01 ; PRG $2849 | CPU $E849 | 29 01 + sta Ram_04FE,x ; PRG $284B | CPU $E84B | 9D FE 04 + inc RecordFieldCount ; PRG $284E | CPU $E84E | E6 06 + dec WorkPointerOrValueHi ; PRG $2850 | CPU $E850 | C6 02 + jmp Continuation_E830 ; PRG $2852 | CPU $E852 | 4C 30 E8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E855. +; Local behavior: Reads MetaspriteLayoutOffset, ObjectScanIndex, WorkPointerOrValueLo, Flow_E829; mutates MetaspriteLayoutOffset, ObjectScanIndex, WorkPointerOrValueLo. +; Parameters: MetaspriteLayoutOffset, ObjectScanIndex, WorkPointerOrValueLo, Flow_E829. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E855: + inc MetaspriteLayoutOffset ; PRG $2855 | CPU $E855 | E6 0C + inc ObjectScanIndex ; PRG $2857 | CPU $E857 | E6 08 + dec WorkPointerOrValueLo ; PRG $2859 | CPU $E859 | C6 01 + bne Flow_E829 ; PRG $285B | CPU $E85B | D0 CC +; ----------------------------------------------------------------------------- +; Global purpose: Flow E85 D. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E85D: + rts ; PRG $285D | CPU $E85D | 60 + +ScreenObjectInitialXTable: + .byte $3C ; PRG $285E | CPU $E85E + +ScreenObjectInitialYTable: + .byte $02 ; PRG $285F | CPU $E85F + +ScreenObjectInitialStateTable: + .byte $02,$38,$03,$01,$34,$03,$FF,$30,$02,$FE ; PRG $2860 | CPU $E860 +; ----------------------------------------------------------------------------- +; Global purpose: Evaluate Collision State E86 A. +; Local behavior: Reads ScreenCollisionState, Flow_E85D, ActorTableIndex, GameplayStateBackup, FrameCounter, ScreenObjectMode, Flow_E8AA, Ram_0400; mutates ObjectRecordPointerLo, ObjectRecordPointerHi, WorkPointerOrValueLo, WorkPointerOrValueHi, Ram_0502, ObjectSpawnState, ActorTableIndex. +; Parameters: ScreenCollisionState, Flow_E85D, ActorTableIndex, GameplayStateBackup, FrameCounter, ScreenObjectMode, Flow_E8AA, Ram_0400. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +EvaluateCollisionState_E86A: + lda ScreenCollisionState ; PRG $286A | CPU $E86A | A5 44 + cmp #$01 ; PRG $286C | CPU $E86C | C9 01 + bne Flow_E85D ; PRG $286E | CPU $E86E | D0 ED + lda ActorTableIndex ; PRG $2870 | CPU $E870 | A5 6F + beq Flow_E85D ; PRG $2872 | CPU $E872 | F0 E9 + lda GameplayStateBackup ; PRG $2874 | CPU $E874 | A5 22 + bne Flow_E85D ; PRG $2876 | CPU $E876 | D0 E5 + lda FrameCounter ; PRG $2878 | CPU $E878 | A5 27 + and #$7F ; PRG $287A | CPU $E87A | 29 7F + cmp #$20 ; PRG $287C | CPU $E87C | C9 20 + bcs Flow_E85D ; PRG $287E | CPU $E87E | B0 DD + lda #$00 ; PRG $2880 | CPU $E880 | A9 00 + sta ObjectRecordPointerLo ; PRG $2882 | CPU $E882 | 85 A8 + lda #$04 ; PRG $2884 | CPU $E884 | A9 04 + sta ObjectRecordPointerHi ; PRG $2886 | CPU $E886 | 85 A9 + lda #$00 ; PRG $2888 | CPU $E888 | A9 00 + sta WorkPointerOrValueLo ; PRG $288A | CPU $E88A | 85 01 + sta WorkPointerOrValueHi ; PRG $288C | CPU $E88C | 85 02 + lda ScreenObjectMode ; PRG $288E | CPU $E88E | A5 62 + cmp #$02 ; PRG $2890 | CPU $E890 | C9 02 + bne Flow_E8AA ; PRG $2892 | CPU $E892 | D0 16 + lda Ram_0400 ; PRG $2894 | CPU $E894 | AD 00 04 + bne Flow_E8C9 ; PRG $2897 | CPU $E897 | D0 30 + lda ObjectSpawnState ; PRG $2899 | CPU $E899 | A5 4B + sta Ram_0502 ; PRG $289B | CPU $E89B | 8D 02 05 + eor #$01 ; PRG $289E | CPU $E89E | 49 01 + sta ObjectSpawnState ; PRG $28A0 | CPU $E8A0 | 85 4B + ldx #$20 ; PRG $28A2 | CPU $E8A2 | A2 20 + stx ActorTableIndex ; PRG $28A4 | CPU $E8A4 | 86 6F + ldx #$00 ; PRG $28A6 | CPU $E8A6 | A2 00 + beq Flow_E912 ; PRG $28A8 | CPU $E8A8 | F0 68 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E8 AA. +; Local behavior: Reads ActiveActorState, Flow_E8B8; mutates ObjectRecordStride. +; Parameters: ActiveActorState, Flow_E8B8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E8AA: + lda #$20 ; PRG $28AA | CPU $E8AA | A9 20 + sta ObjectRecordStride ; PRG $28AC | CPU $E8AC | 85 AA + lda #$04 ; PRG $28AE | CPU $E8AE | A9 04 + ldy ActiveActorState ; PRG $28B0 | CPU $E8B0 | A4 61 + cpy #$01 ; PRG $28B2 | CPU $E8B2 | C0 01 + bne Flow_E8B8 ; PRG $28B4 | CPU $E8B4 | D0 02 + lda #$03 ; PRG $28B6 | CPU $E8B6 | A9 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E8 B8. +; Local behavior: Reads implicit CPU state or none observed; mutates OamBufferWriteOffset. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E8B8: + sta OamBufferWriteOffset ; PRG $28B8 | CPU $E8B8 | 85 AB +; ----------------------------------------------------------------------------- +; Global purpose: Flow E8 BA. +; Local behavior: Reads ObjectRecordPointerLo, Flow_E8CA; mutates no direct memory mutation observed. +; Parameters: ObjectRecordPointerLo, Flow_E8CA. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E8BA: + ldy #$00 ; PRG $28BA | CPU $E8BA | A0 00 + lda (ObjectRecordPointerLo),y ; PRG $28BC | CPU $E8BC | B1 A8 + beq Flow_E8CA ; PRG $28BE | CPU $E8BE | F0 0A +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp 01 E8 C0. +; Local behavior: Reads AdvanceObjectRecordPointer, WorkPointerOrValueLo, OamBufferWriteOffset, Flow_E8BA; mutates WorkPointerOrValueLo, OamBufferWriteOffset. +; Parameters: AdvanceObjectRecordPointer, WorkPointerOrValueLo, OamBufferWriteOffset, Flow_E8BA. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_01_E8C0: + jsr AdvanceObjectRecordPointer ; PRG $28C0 | CPU $E8C0 | 20 0F C2 + inc WorkPointerOrValueLo ; PRG $28C3 | CPU $E8C3 | E6 01 + dec OamBufferWriteOffset ; PRG $28C5 | CPU $E8C5 | C6 AB + bpl Flow_E8BA ; PRG $28C7 | CPU $E8C7 | 10 F1 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E8 C9. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E8C9: + rts ; PRG $28C9 | CPU $E8C9 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E8 CA. +; Local behavior: Reads WorkPointerOrValueLo, Flow_E8D7, Flow_E94A; mutates no direct memory mutation observed. +; Parameters: WorkPointerOrValueLo, Flow_E8D7, Flow_E94A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E8CA: + lda WorkPointerOrValueLo ; PRG $28CA | CPU $E8CA | A5 01 + bne Flow_E8D7 ; PRG $28CC | CPU $E8CC | D0 09 + lda #$E8 ; PRG $28CE | CPU $E8CE | A9 E8 + pha ; PRG $28D0 | CPU $E8D0 | 48 + lda #$BF ; PRG $28D1 | CPU $E8D1 | A9 BF + pha ; PRG $28D3 | CPU $E8D3 | 48 + jmp Flow_E94A ; PRG $28D4 | CPU $E8D4 | 4C 4A E9 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E8 D7. +; Local behavior: Reads WorkPointerOrValueHi, Flow_E94A, AdvancePseudoRandomState; mutates ObjectScanIndex. +; Parameters: WorkPointerOrValueHi, Flow_E94A, AdvancePseudoRandomState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E8D7: + lda WorkPointerOrValueHi ; PRG $28D7 | CPU $E8D7 | A5 02 + bne Flow_E94A ; PRG $28D9 | CPU $E8D9 | D0 6F + jsr AdvancePseudoRandomState ; PRG $28DB | CPU $E8DB | 20 2F C4 + and #$7C ; PRG $28DE | CPU $E8DE | 29 7C + sta ObjectScanIndex ; PRG $28E0 | CPU $E8E0 | 85 08 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E8 E2. +; Local behavior: Reads Ram_0500, Flow_E8F1, Ram_0501, Flow_E912; mutates no direct memory mutation observed. +; Parameters: Ram_0500, Flow_E8F1, Ram_0501, Flow_E912. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E8E2: + tax ; PRG $28E2 | CPU $E8E2 | AA + ldy Ram_0500,x ; PRG $28E3 | CPU $E8E3 | BC 00 05 + cpy #$01 ; PRG $28E6 | CPU $E8E6 | C0 01 + bne Flow_E8F1 ; PRG $28E8 | CPU $E8E8 | D0 07 + ldy Ram_0501,x ; PRG $28EA | CPU $E8EA | BC 01 05 + cpy #$02 ; PRG $28ED | CPU $E8ED | C0 02 + bcs Flow_E912 ; PRG $28EF | CPU $E8EF | B0 21 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E8 F1. +; Local behavior: Reads ObjectScanIndex, Flow_E8C9, Flow_E8E2; mutates no direct memory mutation observed. +; Parameters: ObjectScanIndex, Flow_E8C9, Flow_E8E2. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E8F1: + txa ; PRG $28F1 | CPU $E8F1 | 8A + clc ; PRG $28F2 | CPU $E8F2 | 18 + adc #$04 ; PRG $28F3 | CPU $E8F3 | 69 04 + cmp ObjectScanIndex ; PRG $28F5 | CPU $E8F5 | C5 08 + beq Flow_E8C9 ; PRG $28F7 | CPU $E8F7 | F0 D0 + ora #$00 ; PRG $28F9 | CPU $E8F9 | 09 00 + bpl Flow_E8E2 ; PRG $28FB | CPU $E8FB | 10 E5 + lda #$00 ; PRG $28FD | CPU $E8FD | A9 00 + cmp ObjectScanIndex ; PRG $28FF | CPU $E8FF | C5 08 + beq Flow_E8C9 ; PRG $2901 | CPU $E901 | F0 C6 + bne Flow_E8E2 ; PRG $2903 | CPU $E903 | D0 DD +; ----------------------------------------------------------------------------- +; Global purpose: Flow E905. +; Local behavior: Reads ComputeOrDispatch_E9BC, WorkPointerOrValueHi, Flow_E915; mutates SignedOffsetAccumulator, ObjectRecordPointerLo. +; Parameters: ComputeOrDispatch_E9BC, WorkPointerOrValueHi, Flow_E915. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E905: + jsr ComputeOrDispatch_E9BC ; PRG $2905 | CPU $E905 | 20 BC E9 + ldy #$1D ; PRG $2908 | CPU $E908 | A0 1D + lda WorkPointerOrValueHi ; PRG $290A | CPU $E90A | A5 02 + sta (SignedOffsetAccumulator),y ; PRG $290C | CPU $E90C | 91 10 + sta (ObjectRecordPointerLo),y ; PRG $290E | CPU $E90E | 91 A8 + bpl Flow_E915 ; PRG $2910 | CPU $E910 | 10 03 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E912. +; Local behavior: Reads ComputeOrDispatch_E9BC; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_E9BC. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E912: + jsr ComputeOrDispatch_E9BC ; PRG $2912 | CPU $E912 | 20 BC E9 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E915. +; Local behavior: Reads WorkPointerOrValueLo, Ram_0501, Ram_0502; mutates ObjectRecordPointerLo, Ram_0500, GameplayStateBackup. +; Parameters: WorkPointerOrValueLo, Ram_0501, Ram_0502. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$14; sta GameplayStateBackup; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E915: + ldy #$0A ; PRG $2915 | CPU $E915 | A0 0A + lda WorkPointerOrValueLo ; PRG $2917 | CPU $E917 | A5 01 + asl a ; PRG $2919 | CPU $E919 | 0A + asl a ; PRG $291A | CPU $E91A | 0A + asl a ; PRG $291B | CPU $E91B | 0A + asl a ; PRG $291C | CPU $E91C | 0A + clc ; PRG $291D | CPU $E91D | 18 + adc #$30 ; PRG $291E | CPU $E91E | 69 30 + sta (ObjectRecordPointerLo),y ; PRG $2920 | CPU $E920 | 91 A8 + ldy #$1B ; PRG $2922 | CPU $E922 | A0 1B + txa ; PRG $2924 | CPU $E924 | 8A + sta (ObjectRecordPointerLo),y ; PRG $2925 | CPU $E925 | 91 A8 + ldy #$00 ; PRG $2927 | CPU $E927 | A0 00 + tya ; PRG $2929 | CPU $E929 | 98 + sta (ObjectRecordPointerLo),y ; PRG $292A | CPU $E92A | 91 A8 + ldy #$0F ; PRG $292C | CPU $E92C | A0 0F + lda Ram_0501,x ; PRG $292E | CPU $E92E | BD 01 05 + sta (ObjectRecordPointerLo),y ; PRG $2931 | CPU $E931 | 91 A8 + lda #$02 ; PRG $2933 | CPU $E933 | A9 02 + sta Ram_0500,x ; PRG $2935 | CPU $E935 | 9D 00 05 + ldy #$1C ; PRG $2938 | CPU $E938 | A0 1C + lda Ram_0502,x ; PRG $293A | CPU $E93A | BD 02 05 + sta (ObjectRecordPointerLo),y ; PRG $293D | CPU $E93D | 91 A8 + ldy #$00 ; PRG $293F | CPU $E93F | A0 00 + lda #$01 ; PRG $2941 | CPU $E941 | A9 01 + sta (ObjectRecordPointerLo),y ; PRG $2943 | CPU $E943 | 91 A8 + lda #$14 ; PRG $2945 | CPU $E945 | A9 14 + sta GameplayStateBackup ; PRG $2947 | CPU $E947 | 85 22 + rts ; PRG $2949 | CPU $E949 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E94 A. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E94A: + ldx #$00 ; PRG $294A | CPU $E94A | A2 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E94 C. +; Local behavior: Reads Ram_0500, Flow_E974, WorkPointerOrValueHi, Flow_E967, Ram_0501, Ram_0502, SourceRecordPointerLo, Flow_E905; mutates no direct memory mutation observed. +; Parameters: Ram_0500, Flow_E974, WorkPointerOrValueHi, Flow_E967, Ram_0501, Ram_0502, SourceRecordPointerLo, Flow_E905. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E94C: + lda Ram_0500,x ; PRG $294C | CPU $E94C | BD 00 05 + cmp #$01 ; PRG $294F | CPU $E94F | C9 01 + bne Flow_E974 ; PRG $2951 | CPU $E951 | D0 21 + lda WorkPointerOrValueHi ; PRG $2953 | CPU $E953 | A5 02 + beq Flow_E967 ; PRG $2955 | CPU $E955 | F0 10 + lda Ram_0501,x ; PRG $2957 | CPU $E957 | BD 01 05 + cmp #$02 ; PRG $295A | CPU $E95A | C9 02 + bne Flow_E974 ; PRG $295C | CPU $E95C | D0 16 + lda Ram_0502,x ; PRG $295E | CPU $E95E | BD 02 05 + cmp SourceRecordPointerLo ; PRG $2961 | CPU $E961 | C5 03 + beq Flow_E905 ; PRG $2963 | CPU $E963 | F0 A0 + bne Flow_E974 ; PRG $2965 | CPU $E965 | D0 0D +; ----------------------------------------------------------------------------- +; Global purpose: Flow E967. +; Local behavior: Reads Ram_0501, Flow_E97B, FrameCounter, Flow_E97C; mutates no direct memory mutation observed. +; Parameters: Ram_0501, Flow_E97B, FrameCounter, Flow_E97C. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E967: + lda Ram_0501,x ; PRG $2967 | CPU $E967 | BD 01 05 + cmp #$02 ; PRG $296A | CPU $E96A | C9 02 + bcs Flow_E97B ; PRG $296C | CPU $E96C | B0 0D + lda FrameCounter ; PRG $296E | CPU $E96E | A5 27 + and #$7F ; PRG $2970 | CPU $E970 | 29 7F + beq Flow_E97C ; PRG $2972 | CPU $E972 | F0 08 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E974. +; Local behavior: Reads Flow_E94C; mutates no direct memory mutation observed. +; Parameters: Flow_E94C. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E974: + txa ; PRG $2974 | CPU $E974 | 8A + clc ; PRG $2975 | CPU $E975 | 18 + adc #$04 ; PRG $2976 | CPU $E976 | 69 04 + tax ; PRG $2978 | CPU $E978 | AA + bpl Flow_E94C ; PRG $2979 | CPU $E979 | 10 D1 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E97 B. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E97B: + rts ; PRG $297B | CPU $E97B | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E97 C. +; Local behavior: Reads ComputeOrDispatch_E9BC, Ram_0502, Ram_0501, ObjectRecordPointerLo, ObjectRecordPointerHi, WorkPointerOrValueHi, UpdateZp_01_E8C0; mutates ObjectRecordPointerLo, Ram_0500, SourceRecordPointerLo, SignedOffsetAccumulator, CurrentSpriteTileId, WorkPointerOrValueHi. +; Parameters: ComputeOrDispatch_E9BC, Ram_0502, Ram_0501, ObjectRecordPointerLo, ObjectRecordPointerHi, WorkPointerOrValueHi, UpdateZp_01_E8C0. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$00; sta WorkPointerOrValueHi; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E97C: + jsr ComputeOrDispatch_E9BC ; PRG $297C | CPU $E97C | 20 BC E9 + ldy #$1B ; PRG $297F | CPU $E97F | A0 1B + txa ; PRG $2981 | CPU $E981 | 8A + sta (ObjectRecordPointerLo),y ; PRG $2982 | CPU $E982 | 91 A8 + ldy #$0A ; PRG $2984 | CPU $E984 | A0 0A + lda #$30 ; PRG $2986 | CPU $E986 | A9 30 + sta (ObjectRecordPointerLo),y ; PRG $2988 | CPU $E988 | 91 A8 + lda #$02 ; PRG $298A | CPU $E98A | A9 02 + sta Ram_0500,x ; PRG $298C | CPU $E98C | 9D 00 05 + ldy #$1C ; PRG $298F | CPU $E98F | A0 1C + lda Ram_0502,x ; PRG $2991 | CPU $E991 | BD 02 05 + sta (ObjectRecordPointerLo),y ; PRG $2994 | CPU $E994 | 91 A8 + sta SourceRecordPointerLo ; PRG $2996 | CPU $E996 | 85 03 + ldy #$00 ; PRG $2998 | CPU $E998 | A0 00 + lda #$01 ; PRG $299A | CPU $E99A | A9 01 + sta (ObjectRecordPointerLo),y ; PRG $299C | CPU $E99C | 91 A8 + ldy #$0F ; PRG $299E | CPU $E99E | A0 0F + lda Ram_0501,x ; PRG $29A0 | CPU $E9A0 | BD 01 05 + sta (ObjectRecordPointerLo),y ; PRG $29A3 | CPU $E9A3 | 91 A8 + lda ObjectRecordPointerLo ; PRG $29A5 | CPU $E9A5 | A5 A8 + sta SignedOffsetAccumulator ; PRG $29A7 | CPU $E9A7 | 85 10 + lda ObjectRecordPointerHi ; PRG $29A9 | CPU $E9A9 | A5 A9 + sta CurrentSpriteTileId ; PRG $29AB | CPU $E9AB | 85 11 + inc WorkPointerOrValueHi ; PRG $29AD | CPU $E9AD | E6 02 + jsr UpdateZp_01_E8C0 ; PRG $29AF | CPU $E9AF | 20 C0 E8 + inc WorkPointerOrValueHi ; PRG $29B2 | CPU $E9B2 | E6 02 + jsr UpdateZp_01_E8C0 ; PRG $29B4 | CPU $E9B4 | 20 C0 E8 + lda #$00 ; PRG $29B7 | CPU $E9B7 | A9 00 + sta WorkPointerOrValueHi ; PRG $29B9 | CPU $E9B9 | 85 02 + rts ; PRG $29BB | CPU $E9BB | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch E9 BC. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_E9BC: + ldy #$20 ; PRG $29BC | CPU $E9BC | A0 20 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch E9 BE. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_E9BE: + lda #$00 ; PRG $29BE | CPU $E9BE | A9 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E9 C0. +; Local behavior: Reads Flow_E9C0; mutates ObjectRecordPointerLo. +; Parameters: Flow_E9C0. +; Returns: returns to caller; flags/register result depends on final instructions: sta (ObjectRecordPointerLo),y; bne Flow_E9C0; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E9C0: + dey ; PRG $29C0 | CPU $E9C0 | 88 + sta (ObjectRecordPointerLo),y ; PRG $29C1 | CPU $E9C1 | 91 A8 + bne Flow_E9C0 ; PRG $29C3 | CPU $E9C3 | D0 FB + rts ; PRG $29C5 | CPU $E9C5 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch E9 C6. +; Local behavior: Reads CollisionCandidateIndex, Flow_E9CE; mutates no direct memory mutation observed. +; Parameters: CollisionCandidateIndex, Flow_E9CE. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_E9C6: + ldx #$00 ; PRG $29C6 | CPU $E9C6 | A2 00 + lda CollisionCandidateIndex ; PRG $29C8 | CPU $E9C8 | A5 45 + beq Flow_E9CE ; PRG $29CA | CPU $E9CA | F0 02 + ldx #$10 ; PRG $29CC | CPU $E9CC | A2 10 +; ----------------------------------------------------------------------------- +; Global purpose: Flow E9 CE. +; Local behavior: Reads ObjectRecordPointerLo; mutates CollisionCandidateIndex, Ram_06A0, Ram_06A3, Ram_06A4, Ram_06A5, Ram_06A8, Ram_06A9. +; Parameters: ObjectRecordPointerLo. +; Returns: returns to caller; flags/register result depends on final instructions: lda (ObjectRecordPointerLo),y; sta Ram_06A9,x; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_E9CE: + eor #$01 ; PRG $29CE | CPU $E9CE | 49 01 + sta CollisionCandidateIndex ; PRG $29D0 | CPU $E9D0 | 85 45 + lda #$01 ; PRG $29D2 | CPU $E9D2 | A9 01 + sta Ram_06A0,x ; PRG $29D4 | CPU $E9D4 | 9D A0 06 + lda #$05 ; PRG $29D7 | CPU $E9D7 | A9 05 + sta Ram_06A3,x ; PRG $29D9 | CPU $E9D9 | 9D A3 06 + ldy #$06 ; PRG $29DC | CPU $E9DC | A0 06 + lda (ObjectRecordPointerLo),y ; PRG $29DE | CPU $E9DE | B1 A8 + sta Ram_06A4,x ; PRG $29E0 | CPU $E9E0 | 9D A4 06 + iny ; PRG $29E3 | CPU $E9E3 | C8 + lda (ObjectRecordPointerLo),y ; PRG $29E4 | CPU $E9E4 | B1 A8 + sta Ram_06A5,x ; PRG $29E6 | CPU $E9E6 | 9D A5 06 + iny ; PRG $29E9 | CPU $E9E9 | C8 + lda (ObjectRecordPointerLo),y ; PRG $29EA | CPU $E9EA | B1 A8 + sta Ram_06A8,x ; PRG $29EC | CPU $E9EC | 9D A8 06 + iny ; PRG $29EF | CPU $E9EF | C8 + lda (ObjectRecordPointerLo),y ; PRG $29F0 | CPU $E9F0 | B1 A8 + sta Ram_06A9,x ; PRG $29F2 | CPU $E9F2 | 9D A9 06 + rts ; PRG $29F5 | CPU $E9F5 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp A8 E9 F6. +; Local behavior: Reads ScreenObjectMode, Flow_EA14; mutates ObjectRecordPointerLo, ObjectRecordPointerHi, ObjectRecordStride, OamBufferWriteOffset. +; Parameters: ScreenObjectMode, Flow_EA14. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_A8_E9F6: + lda #$A0 ; PRG $29F6 | CPU $E9F6 | A9 A0 + sta ObjectRecordPointerLo ; PRG $29F8 | CPU $E9F8 | 85 A8 + lda #$06 ; PRG $29FA | CPU $E9FA | A9 06 + sta ObjectRecordPointerHi ; PRG $29FC | CPU $E9FC | 85 A9 + lda #$10 ; PRG $29FE | CPU $E9FE | A9 10 + sta ObjectRecordStride ; PRG $2A00 | CPU $EA00 | 85 AA + lda #$02 ; PRG $2A02 | CPU $EA02 | A9 02 + sta OamBufferWriteOffset ; PRG $2A04 | CPU $EA04 | 85 AB + ldx #$D0 ; PRG $2A06 | CPU $EA06 | A2 D0 + ldy #$E0 ; PRG $2A08 | CPU $EA08 | A0 E0 + lda ScreenObjectMode ; PRG $2A0A | CPU $EA0A | A5 62 + cmp #$02 ; PRG $2A0C | CPU $EA0C | C9 02 + bne Flow_EA14 ; PRG $2A0E | CPU $EA0E | D0 04 + ldx #$C0 ; PRG $2A10 | CPU $EA10 | A2 C0 + ldy #$D0 ; PRG $2A12 | CPU $EA12 | A0 D0 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EA14. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_06AA, Ram_06BA. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EA14: + stx Ram_06AA ; PRG $2A14 | CPU $EA14 | 8E AA 06 + sty Ram_06BA ; PRG $2A17 | CPU $EA17 | 8C BA 06 + ldx #$00 ; PRG $2A1A | CPU $EA1A | A2 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EA1 C. +; Local behavior: Reads Ram_06A0, Flow_EA45, Ram_06A3, Flow_EA4F, Flow_EA37, Ram_06A4, Ram_06A5; mutates WorkPointerOrValueLo. +; Parameters: Ram_06A0, Flow_EA45, Ram_06A3, Flow_EA4F, Flow_EA37, Ram_06A4, Ram_06A5. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EA1C: + lda Ram_06A0,x ; PRG $2A1C | CPU $EA1C | BD A0 06 + beq Flow_EA45 ; PRG $2A1F | CPU $EA1F | F0 24 + ldy Ram_06A3,x ; PRG $2A21 | CPU $EA21 | BC A3 06 + bmi Flow_EA4F ; PRG $2A24 | CPU $EA24 | 30 29 + lda #$01 ; PRG $2A26 | CPU $EA26 | A9 01 + sta WorkPointerOrValueLo ; PRG $2A28 | CPU $EA28 | 85 01 + lda $EA5B,y ; PRG $2A2A | CPU $EA2A | B9 5B EA + bpl Flow_EA37 ; PRG $2A2D | CPU $EA2D | 10 08 + lda Ram_06A4,x ; PRG $2A2F | CPU $EA2F | BD A4 06 + ldy Ram_06A5,x ; PRG $2A32 | CPU $EA32 | BC A5 06 + sty WorkPointerOrValueLo ; PRG $2A35 | CPU $EA35 | 84 01 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EA37. +; Local behavior: Reads WorkPointerOrValueLo, Ram_06A3; mutates Ram_06A6, Ram_06A7, Ram_06A3. +; Parameters: WorkPointerOrValueLo, Ram_06A3. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EA37: + sta Ram_06A6,x ; PRG $2A37 | CPU $EA37 | 9D A6 06 + lda WorkPointerOrValueLo ; PRG $2A3A | CPU $EA3A | A5 01 + sta Ram_06A7,x ; PRG $2A3C | CPU $EA3C | 9D A7 06 + dec Ram_06A3,x ; PRG $2A3F | CPU $EA3F | DE A3 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EA42. +; Local behavior: Reads LoadObjectSpriteRenderState; mutates no direct memory mutation observed. +; Parameters: LoadObjectSpriteRenderState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EA42: + jsr LoadObjectSpriteRenderState ; PRG $2A42 | CPU $EA42 | 20 17 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EA45. +; Local behavior: Reads AdvanceObjectRecordPointer, OamBufferWriteOffset, Flow_EA1C; mutates OamBufferWriteOffset. +; Parameters: AdvanceObjectRecordPointer, OamBufferWriteOffset, Flow_EA1C. +; Returns: returns to caller; flags/register result depends on final instructions: dec OamBufferWriteOffset; bne Flow_EA1C; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EA45: + jsr AdvanceObjectRecordPointer ; PRG $2A45 | CPU $EA45 | 20 0F C2 + ldx #$10 ; PRG $2A48 | CPU $EA48 | A2 10 + dec OamBufferWriteOffset ; PRG $2A4A | CPU $EA4A | C6 AB + bne Flow_EA1C ; PRG $2A4C | CPU $EA4C | D0 CE + rts ; PRG $2A4E | CPU $EA4E | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EA4 F. +; Local behavior: Reads Flow_EA42, GameplayConstantTable_FF4C; mutates Ram_06A0, Ram_06A6. +; Parameters: Flow_EA42, GameplayConstantTable_FF4C. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EA4F: + lda #$00 ; PRG $2A4F | CPU $EA4F | A9 00 + sta Ram_06A0,x ; PRG $2A51 | CPU $EA51 | 9D A0 06 + lda #$47 ; PRG $2A54 | CPU $EA54 | A9 47 + sta Ram_06A6,x ; PRG $2A56 | CPU $EA56 | 9D A6 06 + bpl Flow_EA42 ; PRG $2A59 | CPU $EA59 | 10 E7 + eor GameplayConstantTable_FF4C ; PRG $2A5B | CPU $EA5B | 4D 4C FF + .byte $4B,$FF,$4B,$A0,$00,$A9,$03,$85,$11,$B9,$A0,$04,$F0,$0A,$98,$18 ; PRG $2A5E | CPU $EA5E + .byte $69,$10,$A8,$C6,$11,$10,$F2,$60,$A9,$01,$99,$A0,$04,$BD,$08,$04 ; PRG $2A6E | CPU $EA6E + .byte $99,$A8,$04,$BD,$09,$04,$99,$A9,$04,$98,$AA,$4A,$4A,$9D,$AA,$04 ; PRG $2A7E | CPU $EA7E + .byte $A9,$24,$9D,$A6,$04,$A9,$00,$9D,$A7,$04,$A9,$0E,$9D,$AD,$04,$A9 ; PRG $2A8E | CPU $EA8E + .byte $01 ; PRG $2A9E | CPU $EA9E +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 04 A4 EA9 F. +; Local behavior: Reads CalculateAndClampValue_EABE, WorkPointerOrValueHi, Flow_EABD, Ram_04AC; mutates Ram_04A4, Ram_04AC, Ram_04AB. +; Parameters: CalculateAndClampValue_EABE, WorkPointerOrValueHi, Flow_EABD, Ram_04AC. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_04A4_EA9F: + sta Ram_04A4,x ; PRG $2A9F | CPU $EA9F | 9D A4 04 + jsr CalculateAndClampValue_EABE ; PRG $2AA2 | CPU $EAA2 | 20 BE EA + sta Ram_04AC,x ; PRG $2AA5 | CPU $EAA5 | 9D AC 04 + lda WorkPointerOrValueHi ; PRG $2AA8 | CPU $EAA8 | A5 02 + sta Ram_04AB,x ; PRG $2AAA | CPU $EAAA | 9D AB 04 + cpx #$40 ; PRG $2AAD | CPU $EAAD | E0 40 + beq Flow_EABD ; PRG $2AAF | CPU $EAAF | F0 0C + lda Ram_04AC,x ; PRG $2AB1 | CPU $EAB1 | BD AC 04 + cmp #$03 ; PRG $2AB4 | CPU $EAB4 | C9 03 + bcc Flow_EABD ; PRG $2AB6 | CPU $EAB6 | 90 05 + lda #$02 ; PRG $2AB8 | CPU $EAB8 | A9 02 + sta Ram_04AC,x ; PRG $2ABA | CPU $EABA | 9D AC 04 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EABD. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EABD: + rts ; PRG $2ABD | CPU $EABD | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Calculate And Clamp Value EABE. +; Local behavior: Reads Ram_04A8, Ram_0308, Ram_0309, Ram_04A9, Flow_EADB, WorkPointerOrValueHi, ComputeOrDispatch_E695; mutates WorkPointerOrValueHi, SignedOffsetAccumulator, WorkPointerOrValueLo. +; Parameters: Ram_04A8, Ram_0308, Ram_0309, Ram_04A9, Flow_EADB, WorkPointerOrValueHi, ComputeOrDispatch_E695. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +CalculateAndClampValue_EABE: + lda #$00 ; PRG $2ABE | CPU $EABE | A9 00 + sta WorkPointerOrValueHi ; PRG $2AC0 | CPU $EAC0 | 85 02 + sta SignedOffsetAccumulator ; PRG $2AC2 | CPU $EAC2 | 85 10 + lda Ram_04A8,x ; PRG $2AC4 | CPU $EAC4 | BD A8 04 + sec ; PRG $2AC7 | CPU $EAC7 | 38 + sbc Ram_0308 ; PRG $2AC8 | CPU $EAC8 | ED 08 03 + sta WorkPointerOrValueLo ; PRG $2ACB | CPU $EACB | 85 01 + lda Ram_0309 ; PRG $2ACD | CPU $EACD | AD 09 03 + sec ; PRG $2AD0 | CPU $EAD0 | 38 + sbc Ram_04A9,x ; PRG $2AD1 | CPU $EAD1 | FD A9 04 + bcs Flow_EADB ; PRG $2AD4 | CPU $EAD4 | B0 05 + inc WorkPointerOrValueHi ; PRG $2AD6 | CPU $EAD6 | E6 02 + jsr ComputeOrDispatch_E695 ; PRG $2AD8 | CPU $EAD8 | 20 95 E6 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EADB. +; Local behavior: Reads Ram_04A4; mutates PackedHudOrObjectValue. +; Parameters: Ram_04A4. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EADB: + sta PackedHudOrObjectValue ; PRG $2ADB | CPU $EADB | 85 16 + ldy Ram_04A4,x ; PRG $2ADD | CPU $EADD | BC A4 04 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EAE0. +; Local behavior: Reads PackedHudOrObjectValue, Flow_EAE7, SignedOffsetAccumulator; mutates SignedOffsetAccumulator. +; Parameters: PackedHudOrObjectValue, Flow_EAE7, SignedOffsetAccumulator. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EAE0: + clc ; PRG $2AE0 | CPU $EAE0 | 18 + adc PackedHudOrObjectValue ; PRG $2AE1 | CPU $EAE1 | 65 16 + bcc Flow_EAE7 ; PRG $2AE3 | CPU $EAE3 | 90 02 + inc SignedOffsetAccumulator ; PRG $2AE5 | CPU $EAE5 | E6 10 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EAE7. +; Local behavior: Reads Flow_EAE0, SignedOffsetAccumulator, ComputeOrDispatch_EAF5; mutates SignedOffsetAccumulator. +; Parameters: Flow_EAE0, SignedOffsetAccumulator, ComputeOrDispatch_EAF5. +; Returns: returns to caller; flags/register result depends on final instructions: jsr ComputeOrDispatch_EAF5; tya; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EAE7: + dey ; PRG $2AE7 | CPU $EAE7 | 88 + bne Flow_EAE0 ; PRG $2AE8 | CPU $EAE8 | D0 F6 + asl a ; PRG $2AEA | CPU $EAEA | 0A + rol SignedOffsetAccumulator ; PRG $2AEB | CPU $EAEB | 26 10 + asl a ; PRG $2AED | CPU $EAED | 0A + rol SignedOffsetAccumulator ; PRG $2AEE | CPU $EAEE | 26 10 + jsr ComputeOrDispatch_EAF5 ; PRG $2AF0 | CPU $EAF0 | 20 F5 EA + tya ; PRG $2AF3 | CPU $EAF3 | 98 + rts ; PRG $2AF4 | CPU $EAF4 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch EAF5. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_EAF5: + ldy #$00 ; PRG $2AF5 | CPU $EAF5 | A0 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EAF7. +; Local behavior: Reads WorkPointerOrValueLo, Flow_EB00, SignedOffsetAccumulator, Flow_EB05; mutates SignedOffsetAccumulator. +; Parameters: WorkPointerOrValueLo, Flow_EB00, SignedOffsetAccumulator, Flow_EB05. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EAF7: + sec ; PRG $2AF7 | CPU $EAF7 | 38 + sbc WorkPointerOrValueLo ; PRG $2AF8 | CPU $EAF8 | E5 01 + bcs Flow_EB00 ; PRG $2AFA | CPU $EAFA | B0 04 + dec SignedOffsetAccumulator ; PRG $2AFC | CPU $EAFC | C6 10 + bmi Flow_EB05 ; PRG $2AFE | CPU $EAFE | 30 05 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EB00. +; Local behavior: Reads Flow_EAF7; mutates no direct memory mutation observed. +; Parameters: Flow_EAF7. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EB00: + iny ; PRG $2B00 | CPU $EB00 | C8 + cpy #$08 ; PRG $2B01 | CPU $EB01 | C0 08 + bne Flow_EAF7 ; PRG $2B03 | CPU $EB03 | D0 F2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EB05. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EB05: + rts ; PRG $2B05 | CPU $EB05 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp A8 EB06. +; Local behavior: Reads implicit CPU state or none observed; mutates ObjectRecordPointerLo, ObjectRecordPointerHi, ObjectRecordStride, OamBufferWriteOffset, ObjectSlotOrFieldIndex. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_A8_EB06: + lda #$A0 ; PRG $2B06 | CPU $EB06 | A9 A0 + sta ObjectRecordPointerLo ; PRG $2B08 | CPU $EB08 | 85 A8 + lda #$04 ; PRG $2B0A | CPU $EB0A | A9 04 + sta ObjectRecordPointerHi ; PRG $2B0C | CPU $EB0C | 85 A9 + lda #$10 ; PRG $2B0E | CPU $EB0E | A9 10 + sta ObjectRecordStride ; PRG $2B10 | CPU $EB10 | 85 AA + lda #$03 ; PRG $2B12 | CPU $EB12 | A9 03 + sta OamBufferWriteOffset ; PRG $2B14 | CPU $EB14 | 85 AB + lda #$00 ; PRG $2B16 | CPU $EB16 | A9 00 + sta ObjectSlotOrFieldIndex ; PRG $2B18 | CPU $EB18 | 85 0E +; ----------------------------------------------------------------------------- +; Global purpose: Flow EB1 A. +; Local behavior: Reads ObjectSlotOrFieldIndex, Ram_04A0, Flow_EB27, CalculateAndClampValue_EB36, LoadObjectSpriteRenderState; mutates no direct memory mutation observed. +; Parameters: ObjectSlotOrFieldIndex, Ram_04A0, Flow_EB27, CalculateAndClampValue_EB36, LoadObjectSpriteRenderState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EB1A: + ldx ObjectSlotOrFieldIndex ; PRG $2B1A | CPU $EB1A | A6 0E + lda Ram_04A0,x ; PRG $2B1C | CPU $EB1C | BD A0 04 + beq Flow_EB27 ; PRG $2B1F | CPU $EB1F | F0 06 + jsr CalculateAndClampValue_EB36 ; PRG $2B21 | CPU $EB21 | 20 36 EB + jsr LoadObjectSpriteRenderState ; PRG $2B24 | CPU $EB24 | 20 17 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EB27. +; Local behavior: Reads AdvanceObjectRecordPointer, ObjectSlotOrFieldIndex, OamBufferWriteOffset, Flow_EB1A; mutates ObjectSlotOrFieldIndex, OamBufferWriteOffset. +; Parameters: AdvanceObjectRecordPointer, ObjectSlotOrFieldIndex, OamBufferWriteOffset, Flow_EB1A. +; Returns: returns to caller; flags/register result depends on final instructions: dec OamBufferWriteOffset; bpl Flow_EB1A; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EB27: + jsr AdvanceObjectRecordPointer ; PRG $2B27 | CPU $EB27 | 20 0F C2 + lda ObjectSlotOrFieldIndex ; PRG $2B2A | CPU $EB2A | A5 0E + clc ; PRG $2B2C | CPU $EB2C | 18 + adc #$10 ; PRG $2B2D | CPU $EB2D | 69 10 + sta ObjectSlotOrFieldIndex ; PRG $2B2F | CPU $EB2F | 85 0E + dec OamBufferWriteOffset ; PRG $2B31 | CPU $EB31 | C6 AB + bpl Flow_EB1A ; PRG $2B33 | CPU $EB33 | 10 E5 + rts ; PRG $2B35 | CPU $EB35 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Calculate And Clamp Value EB36. +; Local behavior: Reads Ram_04AE, Flow_EB80, Ram_04A8, Ram_04A4, Ram_04AC, RecordRepeatCount, Flow_EB5A, FrameCounter; mutates Ram_04A8, RecordRepeatCount. +; Parameters: Ram_04AE, Flow_EB80, Ram_04A8, Ram_04A4, Ram_04AC, RecordRepeatCount, Flow_EB5A, FrameCounter. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +CalculateAndClampValue_EB36: + lda Ram_04AE,x ; PRG $2B36 | CPU $EB36 | BD AE 04 + bne Flow_EB80 ; PRG $2B39 | CPU $EB39 | D0 45 + lda Ram_04A8,x ; PRG $2B3B | CPU $EB3B | BD A8 04 + clc ; PRG $2B3E | CPU $EB3E | 18 + adc Ram_04A4,x ; PRG $2B3F | CPU $EB3F | 7D A4 04 + sta Ram_04A8,x ; PRG $2B42 | CPU $EB42 | 9D A8 04 + cmp #$D0 ; PRG $2B45 | CPU $EB45 | C9 D0 + bcs Flow_EB80 ; PRG $2B47 | CPU $EB47 | B0 37 + lda Ram_04AC,x ; PRG $2B49 | CPU $EB49 | BD AC 04 + sta RecordRepeatCount ; PRG $2B4C | CPU $EB4C | 85 07 + lsr RecordRepeatCount ; PRG $2B4E | CPU $EB4E | 46 07 + bcc Flow_EB5A ; PRG $2B50 | CPU $EB50 | 90 08 + lda FrameCounter ; PRG $2B52 | CPU $EB52 | A5 27 + and #$02 ; PRG $2B54 | CPU $EB54 | 29 02 + bne Flow_EB5A ; PRG $2B56 | CPU $EB56 | D0 02 + inc RecordRepeatCount ; PRG $2B58 | CPU $EB58 | E6 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EB5 A. +; Local behavior: Reads RecordRepeatCount, Flow_EB66, FrameCounter; mutates RecordRepeatCount. +; Parameters: RecordRepeatCount, Flow_EB66, FrameCounter. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EB5A: + lsr RecordRepeatCount ; PRG $2B5A | CPU $EB5A | 46 07 + bcc Flow_EB66 ; PRG $2B5C | CPU $EB5C | 90 08 + lda FrameCounter ; PRG $2B5E | CPU $EB5E | A5 27 + and #$01 ; PRG $2B60 | CPU $EB60 | 29 01 + bne Flow_EB66 ; PRG $2B62 | CPU $EB62 | D0 02 + inc RecordRepeatCount ; PRG $2B64 | CPU $EB64 | E6 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EB66. +; Local behavior: Reads RecordRepeatCount, Ram_04AB, Flow_EB70, ComputeOrDispatch_E695; mutates no direct memory mutation observed. +; Parameters: RecordRepeatCount, Ram_04AB, Flow_EB70, ComputeOrDispatch_E695. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EB66: + lda RecordRepeatCount ; PRG $2B66 | CPU $EB66 | A5 07 + ldy Ram_04AB,x ; PRG $2B68 | CPU $EB68 | BC AB 04 + beq Flow_EB70 ; PRG $2B6B | CPU $EB6B | F0 03 + jsr ComputeOrDispatch_E695 ; PRG $2B6D | CPU $EB6D | 20 95 E6 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EB70. +; Local behavior: Reads Ram_04A9, Flow_EB80; mutates Ram_04A9. +; Parameters: Ram_04A9, Flow_EB80. +; Returns: returns to caller; flags/register result depends on final instructions: cmp #$10; bcc Flow_EB80; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EB70: + clc ; PRG $2B70 | CPU $EB70 | 18 + adc Ram_04A9,x ; PRG $2B71 | CPU $EB71 | 7D A9 04 + sta Ram_04A9,x ; PRG $2B74 | CPU $EB74 | 9D A9 04 + cmp #$F0 ; PRG $2B77 | CPU $EB77 | C9 F0 + bcs Flow_EB80 ; PRG $2B79 | CPU $EB79 | B0 05 + cmp #$10 ; PRG $2B7B | CPU $EB7B | C9 10 + bcc Flow_EB80 ; PRG $2B7D | CPU $EB7D | 90 01 + rts ; PRG $2B7F | CPU $EB7F | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EB80. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_04A0, Ram_04AE, Ram_04A6. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: .byte $A9,$03,$8D,$A7,$03,$8D,$A2,$03,$A9,$2C,$8D,$A5,$03,$A0,$80,$A5; .byte $62,$C9,$02,$D0,$02,$A0,$70,$8C,$AA,$03,$8E,$AD,$03,$BD,$1E,$04; .byte $8D,$AF,$03,$C6,$75,$4C,$49,$EC. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EB80: + lda #$00 ; PRG $2B80 | CPU $EB80 | A9 00 + sta Ram_04A0,x ; PRG $2B82 | CPU $EB82 | 9D A0 04 + sta Ram_04AE,x ; PRG $2B85 | CPU $EB85 | 9D AE 04 + lda #$49 ; PRG $2B88 | CPU $EB88 | A9 49 + sta Ram_04A6,x ; PRG $2B8A | CPU $EB8A | 9D A6 04 + rts ; PRG $2B8D | CPU $EB8D | 60 + .byte $A9,$00,$8D,$A1,$03,$8D,$AE,$03,$A9,$01,$8D,$A0,$03,$8D,$A3,$03 ; PRG $2B8E | CPU $EB8E + .byte $A9,$03,$8D,$A7,$03,$8D,$A2,$03,$A9,$2C,$8D,$A5,$03,$A0,$80,$A5 ; PRG $2B9E | CPU $EB9E + .byte $62,$C9,$02,$D0,$02,$A0,$70,$8C,$AA,$03,$8E,$AD,$03,$BD,$1E,$04 ; PRG $2BAE | CPU $EBAE + .byte $8D,$AF,$03,$C6,$75,$4C,$49,$EC ; PRG $2BBE | CPU $EBBE +; ----------------------------------------------------------------------------- +; Global purpose: Update Zp A8 EBC6. +; Local behavior: Reads Ram_03A0, Flow_EC34, Ram_03A1, Flow_EBE4, Flow_EC1D, ComputeOrDispatch_CEBF, Continuation_EC2E; mutates ObjectRecordPointerLo, ObjectRecordPointerHi. +; Parameters: Ram_03A0, Flow_EC34, Ram_03A1, Flow_EBE4, Flow_EC1D, ComputeOrDispatch_CEBF, Continuation_EC2E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateZp_A8_EBC6: + lda Ram_03A0 ; PRG $2BC6 | CPU $EBC6 | AD A0 03 + beq Flow_EC34 ; PRG $2BC9 | CPU $EBC9 | F0 69 + lda #$A0 ; PRG $2BCB | CPU $EBCB | A9 A0 + sta ObjectRecordPointerLo ; PRG $2BCD | CPU $EBCD | 85 A8 + lda #$03 ; PRG $2BCF | CPU $EBCF | A9 03 + sta ObjectRecordPointerHi ; PRG $2BD1 | CPU $EBD1 | 85 A9 + ldy Ram_03A1 ; PRG $2BD3 | CPU $EBD3 | AC A1 03 + beq Flow_EBE4 ; PRG $2BD6 | CPU $EBD6 | F0 0C + cpy #$03 ; PRG $2BD8 | CPU $EBD8 | C0 03 + beq Flow_EC1D ; PRG $2BDA | CPU $EBDA | F0 41 + ldx #$A0 ; PRG $2BDC | CPU $EBDC | A2 A0 + jsr ComputeOrDispatch_CEBF ; PRG $2BDE | CPU $EBDE | 20 BF CE + jmp Continuation_EC2E ; PRG $2BE1 | CPU $EBE1 | 4C 2E EC +; ----------------------------------------------------------------------------- +; Global purpose: Flow EBE4. +; Local behavior: Reads Ram_03AE, Flow_EC08, Flow_EC02, UpdateActorCoordinates_C54B, UpdateRam_0301_CEE5, Continuation_EC2E; mutates Ram_03AE, AudioEffectRequest. +; Parameters: Ram_03AE, Flow_EC08, Flow_EC02, UpdateActorCoordinates_C54B, UpdateRam_0301_CEE5, Continuation_EC2E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EBE4: + ldy Ram_03AE ; PRG $2BE4 | CPU $EBE4 | AC AE 03 + beq Flow_EC08 ; PRG $2BE7 | CPU $EBE7 | F0 1F + lda #$00 ; PRG $2BE9 | CPU $EBE9 | A9 00 + sta Ram_03AE ; PRG $2BEB | CPU $EBEB | 8D AE 03 + dey ; PRG $2BEE | CPU $EBEE | 88 + bne Flow_EC02 ; PRG $2BEF | CPU $EBEF | D0 11 + lda #$03 ; PRG $2BF1 | CPU $EBF1 | A9 03 + jsr UpdateActorCoordinates_C54B ; PRG $2BF3 | CPU $EBF3 | 20 4B C5 + lda #$04 ; PRG $2BF6 | CPU $EBF6 | A9 04 + sta AudioEffectRequest ; PRG $2BF8 | CPU $EBF8 | 85 FE + ldx #$A0 ; PRG $2BFA | CPU $EBFA | A2 A0 + jsr UpdateRam_0301_CEE5 ; PRG $2BFC | CPU $EBFC | 20 E5 CE + jmp Continuation_EC2E ; PRG $2BFF | CPU $EBFF | 4C 2E EC +; ----------------------------------------------------------------------------- +; Global purpose: Flow EC02. +; Local behavior: Reads UpdateRam_03A6_EC35, Continuation_EC2E; mutates no direct memory mutation observed. +; Parameters: UpdateRam_03A6_EC35, Continuation_EC2E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EC02: + jsr UpdateRam_03A6_EC35 ; PRG $2C02 | CPU $EC02 | 20 35 EC + jmp Continuation_EC2E ; PRG $2C05 | CPU $EC05 | 4C 2E EC +; ----------------------------------------------------------------------------- +; Global purpose: Flow EC08. +; Local behavior: Reads Ram_03AD, Ram_0408, Ram_0409, Continuation_EC2E; mutates Ram_03A8, Ram_03A9. +; Parameters: Ram_03AD, Ram_0408, Ram_0409, Continuation_EC2E. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EC08: + ldy Ram_03AD ; PRG $2C08 | CPU $EC08 | AC AD 03 + lda Ram_0408,y ; PRG $2C0B | CPU $EC0B | B9 08 04 + clc ; PRG $2C0E | CPU $EC0E | 18 + adc #$06 ; PRG $2C0F | CPU $EC0F | 69 06 + sta Ram_03A8 ; PRG $2C11 | CPU $EC11 | 8D A8 03 + lda Ram_0409,y ; PRG $2C14 | CPU $EC14 | B9 09 04 + sta Ram_03A9 ; PRG $2C17 | CPU $EC17 | 8D A9 03 + jmp Continuation_EC2E ; PRG $2C1A | CPU $EC1A | 4C 2E EC +; ----------------------------------------------------------------------------- +; Global purpose: Flow EC1 D. +; Local behavior: Reads Ram_03AF, ComputeOrDispatch_EC43, ActorAnimationStep, UpdateRam_03A6_EC35; mutates ActorStateArray, ActorAnimationStep. +; Parameters: Ram_03AF, ComputeOrDispatch_EC43, ActorAnimationStep, UpdateRam_03A6_EC35. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EC1D: + ldy Ram_03AF ; PRG $2C1D | CPU $EC1D | AC AF 03 + lda #$01 ; PRG $2C20 | CPU $EC20 | A9 01 + sta ActorStateArray,y ; PRG $2C22 | CPU $EC22 | 99 70 00 + tya ; PRG $2C25 | CPU $EC25 | 98 + jsr ComputeOrDispatch_EC43 ; PRG $2C26 | CPU $EC26 | 20 43 EC + inc ActorAnimationStep ; PRG $2C29 | CPU $EC29 | E6 75 + jsr UpdateRam_03A6_EC35 ; PRG $2C2B | CPU $EC2B | 20 35 EC +; ----------------------------------------------------------------------------- +; Global purpose: Continuation EC2 E. +; Local behavior: Reads ComputeOrDispatch_C2B4, LoadObjectSpriteRenderState; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_C2B4, LoadObjectSpriteRenderState. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_EC2E: + jsr ComputeOrDispatch_C2B4 ; PRG $2C2E | CPU $EC2E | 20 B4 C2 + jsr LoadObjectSpriteRenderState ; PRG $2C31 | CPU $EC31 | 20 17 C2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow EC34. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EC34: + rts ; PRG $2C34 | CPU $EC34 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 03 A6 EC35. +; Local behavior: Reads Ram_03A3; mutates Ram_03A6, Ram_03A3, Ram_03A0. +; Parameters: Ram_03A3. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$00; sta Ram_03A0; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_03A6_EC35: + lda #$47 ; PRG $2C35 | CPU $EC35 | A9 47 + sta Ram_03A6 ; PRG $2C37 | CPU $EC37 | 8D A6 03 + inc Ram_03A3 ; PRG $2C3A | CPU $EC3A | EE A3 03 + lda #$00 ; PRG $2C3D | CPU $EC3D | A9 00 + sta Ram_03A0 ; PRG $2C3F | CPU $EC3F | 8D A0 03 + rts ; PRG $2C42 | CPU $EC42 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch EC43. +; Local behavior: Reads Flow_EC4D; mutates no direct memory mutation observed. +; Parameters: Flow_EC4D. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_EC43: + ldx #$5F ; PRG $2C43 | CPU $EC43 | A2 5F + ldy #$EC ; PRG $2C45 | CPU $EC45 | A0 EC + bne Flow_EC4D ; PRG $2C47 | CPU $EC47 | D0 04 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch EC49. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_EC49: + ldx #$64 ; PRG $2C49 | CPU $EC49 | A2 64 + ldy #$EC ; PRG $2C4B | CPU $EC4B | A0 EC +; ----------------------------------------------------------------------------- +; Global purpose: Flow EC4 D. +; Local behavior: Reads ExpandPackedScoreOrHudData; mutates SourceRecordPointerLo, PackedCoordinateOrValue, WorkPointerOrValueLo, WorkPointerOrValueHi. +; Parameters: ExpandPackedScoreOrHudData. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_EC4D: + stx SourceRecordPointerLo ; PRG $2C4D | CPU $EC4D | 86 03 + sty PackedCoordinateOrValue ; PRG $2C4F | CPU $EC4F | 84 04 + asl a ; PRG $2C51 | CPU $EC51 | 0A + asl a ; PRG $2C52 | CPU $EC52 | 0A + clc ; PRG $2C53 | CPU $EC53 | 18 + adc #$47 ; PRG $2C54 | CPU $EC54 | 69 47 + sta WorkPointerOrValueLo ; PRG $2C56 | CPU $EC56 | 85 01 + lda #$23 ; PRG $2C58 | CPU $EC58 | A9 23 + sta WorkPointerOrValueHi ; PRG $2C5A | CPU $EC5A | 85 02 + jmp ExpandPackedScoreOrHudData ; PRG $2C5C | CPU $EC5C | 4C 51 C4 + .byte $22,$46,$48,$47,$49,$22,$4C,$4C,$4C,$4C ; PRG $2C5F | CPU $EC5F + +ActorCollisionOrStateTable_EC69: + .byte $00,$01,$00,$00,$20,$00,$00,$00,$00,$02,$03,$00,$00,$20,$00,$00 ; PRG $2C69 | CPU $EC69 + .byte $00,$00,$00,$02,$04,$00,$1C,$00,$00,$00,$00,$01,$03,$04,$00,$1C ; PRG $2C79 | CPU $EC79 + .byte $00,$00,$00,$00,$02,$03,$00,$00,$20,$00,$00,$00,$00,$00,$04,$04 ; PRG $2C89 | CPU $EC89 + .byte $00,$18,$00,$00,$04,$00,$01,$05,$04,$00,$14,$00,$00,$08,$00,$02 ; PRG $2C99 | CPU $EC99 + .byte $04,$00,$00,$20,$00,$00,$00,$00,$00,$04,$04,$00,$00,$14,$00,$08 ; PRG $2CA9 | CPU $ECA9 + .byte $00,$01,$05,$08,$00,$00,$10,$00,$08,$00,$02,$04,$00,$00,$00,$20 ; PRG $2CB9 | CPU $ECB9 + .byte $00,$00,$00,$00,$04,$04,$00,$00,$14,$00,$00,$08,$01,$05,$08,$00 ; PRG $2CC9 | CPU $ECC9 + .byte $00,$10,$00,$00,$08,$02,$04,$00,$00,$00,$20,$00,$00,$00,$00,$04 ; PRG $2CD9 | CPU $ECD9 + .byte $04,$00,$00,$0A,$0A,$00,$08,$01,$05,$08,$00,$00,$08,$08,$00,$08 ; PRG $2CE9 | CPU $ECE9 + .byte $02,$04,$00,$00,$00,$00,$20,$00,$00,$AA ; PRG $2CF9 | CPU $ECF9 + +IndexedGameplayLookupTable_ED03: + .byte $01,$00,$00,$00,$01,$01,$00,$00,$01,$02,$00,$00,$01,$03,$00,$00 ; PRG $2D03 | CPU $ED03 + .byte $01,$04,$00,$00,$01,$05,$00,$00,$01,$06,$00,$00,$67,$ED,$6F,$ED ; PRG $2D13 | CPU $ED13 + .byte $00,$00,$00,$00,$6B,$ED,$73,$ED,$57,$ED,$5F,$ED,$87,$ED,$8F,$ED ; PRG $2D23 | CPU $ED23 + .byte $5B,$ED,$63,$ED,$8B,$ED,$93,$ED,$77,$ED,$7F,$ED,$A7,$ED,$AF,$ED ; PRG $2D33 | CPU $ED33 + .byte $7B,$ED,$83,$ED,$AB,$ED,$B3,$ED,$97,$ED,$9F,$ED,$00,$00,$00,$00 ; PRG $2D43 | CPU $ED43 + .byte $9B,$ED,$A3,$ED,$20,$F7,$ED,$01,$20,$B7,$ED,$00,$20,$F7,$ED,$00 ; PRG $2D53 | CPU $ED53 + .byte $20,$B7,$ED,$01,$20,$17,$EE,$00,$20,$17,$EE,$01,$20,$D7,$ED,$01 ; PRG $2D63 | CPU $ED63 + .byte $20,$D7,$ED,$00,$38,$AA,$EE,$01,$38,$3A,$EE,$00,$38,$AA,$EE,$00 ; PRG $2D73 | CPU $ED73 + .byte $38,$3A,$EE,$01,$38,$E2,$EE,$00,$38,$E2,$EE,$01,$38,$72,$EE,$01 ; PRG $2D83 | CPU $ED83 + .byte $38,$72,$EE,$00,$17,$4B,$EF,$01,$17,$1D,$EF,$00,$17,$4B,$EF,$00 ; PRG $2D93 | CPU $ED93 + .byte $17,$1D,$EF,$01,$17,$62,$EF,$00,$17,$62,$EF,$01,$17,$34,$EF,$01 ; PRG $2DA3 | CPU $EDA3 + .byte $17,$34,$EF,$00,$10,$10,$00,$11,$10,$00,$10,$11,$00,$10,$11,$00 ; PRG $2DB3 | CPU $EDB3 + .byte $11,$01,$00,$11,$01,$00,$01,$11,$00,$01,$01,$00,$11,$01,$00,$01 ; PRG $2DC3 | CPU $EDC3 + .byte $01,$00,$01,$00,$10,$01,$00,$01,$01,$00,$91,$01,$00,$01,$91,$00 ; PRG $2DD3 | CPU $EDD3 + .byte $01,$91,$00,$91,$91,$00,$90,$91,$00,$90,$90,$00,$91,$90,$00,$90 ; PRG $2DE3 | CPU $EDE3 + .byte $90,$00,$90,$00,$90,$90,$00,$99,$90,$00,$90,$99,$00,$90,$99,$00 ; PRG $2DF3 | CPU $EDF3 + .byte $99,$09,$00,$99,$09,$00,$09,$99,$00,$09,$09,$00,$99,$09,$00,$09 ; PRG $2E03 | CPU $EE03 + .byte $09,$00,$09,$00,$10,$09,$00,$09,$09,$00,$19,$09,$00,$09,$19,$00 ; PRG $2E13 | CPU $EE13 + .byte $09,$19,$00,$19,$19,$00,$10,$19,$00,$10,$10,$00,$19,$10,$00,$10 ; PRG $2E23 | CPU $EE23 + .byte $10,$00,$10,$00,$FF,$B7,$ED,$10,$10,$10,$00,$10,$10,$10,$00,$11 ; PRG $2E33 | CPU $EE33 + .byte $10,$10,$00,$11,$10,$11,$00,$10,$11,$10,$00,$11,$10,$11,$00,$11 ; PRG $2E43 | CPU $EE43 + .byte $11,$11,$00,$11,$11,$11,$00,$11,$11,$01,$00,$11,$11,$01,$00,$11 ; PRG $2E53 | CPU $EE53 + .byte $01,$11,$00,$01,$01,$01,$00,$11,$01,$01,$00,$01,$01,$01,$00,$01 ; PRG $2E63 | CPU $EE63 + .byte $01,$01,$00,$01,$01,$91,$00,$01,$01,$01,$00,$91,$01,$91,$00,$01 ; PRG $2E73 | CPU $EE73 + .byte $91,$91,$00,$01,$91,$91,$00,$91,$91,$91,$00,$91,$91,$91,$00,$90 ; PRG $2E83 | CPU $EE83 + .byte $91,$90,$00,$91,$90,$91,$00,$90,$91,$90,$00,$90,$90,$91,$00,$90 ; PRG $2E93 | CPU $EE93 + .byte $90,$99,$00,$90,$90,$90,$00,$90,$90,$90,$00,$90,$90,$90,$00,$99 ; PRG $2EA3 | CPU $EEA3 + .byte $90,$90,$00,$99,$90,$99,$00,$90,$99,$90,$00,$99,$90,$99,$00,$99 ; PRG $2EB3 | CPU $EEB3 + .byte $99,$99,$00,$99,$99,$99,$00,$99,$99,$09,$00,$99,$99,$09,$00,$99 ; PRG $2EC3 | CPU $EEC3 + .byte $09,$99,$00,$09,$09,$09,$00,$99,$09,$09,$00,$09,$09,$09,$00,$09 ; PRG $2ED3 | CPU $EED3 + .byte $09,$09,$00,$09,$09,$19,$00,$09,$09,$09,$00,$19,$09,$19,$00,$09 ; PRG $2EE3 | CPU $EEE3 + .byte $19,$19,$00,$09,$19,$19,$00,$19,$19,$19,$00,$19,$19,$19,$00,$10 ; PRG $2EF3 | CPU $EEF3 + .byte $19,$10,$00,$19,$10,$19,$00,$10,$19,$10,$00,$10,$10,$19,$00,$10 ; PRG $2F03 | CPU $EF03 + .byte $10,$10,$00,$10,$10,$10,$00,$FF,$3A,$EE,$10,$10,$10,$10,$11,$10 ; PRG $2F13 | CPU $EF13 + .byte $10,$10,$11,$10,$10,$01,$10,$10,$01,$10,$01,$10,$01,$01,$10,$01 ; PRG $2F23 | CPU $EF23 + .byte $01,$01,$01,$90,$01,$01,$90,$01,$90,$01,$90,$90,$01,$90,$90,$91 ; PRG $2F33 | CPU $EF33 + .byte $90,$90,$90,$91,$90,$90,$90,$90,$90,$90,$90,$90,$99,$90,$90,$90 ; PRG $2F43 | CPU $EF43 + .byte $99,$90,$90,$09,$90,$90,$09,$90,$09,$90,$09,$09,$90,$09,$09,$09 ; PRG $2F53 | CPU $EF53 + .byte $09,$10,$09,$09,$10,$09,$10,$09,$10,$10,$09,$10,$10,$19,$10,$10 ; PRG $2F63 | CPU $EF63 + .byte $10,$19,$10,$10,$10,$10,$FF,$1D,$EF ; PRG $2F73 | CPU $EF73 + +HudDigitGlyphPointerTableLo: + .byte $94 ; PRG $2F7C | CPU $EF7C + +HudDigitGlyphPointerTableHi: + .byte $EF,$98,$EF,$9C,$EF,$A0,$EF,$A4,$EF,$A8,$EF,$AC,$EF,$BC,$EF,$CC ; PRG $2F7D | CPU $EF7D + .byte $EF,$DC,$EF,$F1,$EF,$06,$F0,$03,$20,$6F,$06,$03,$20,$64,$06,$03 ; PRG $2F8D | CPU $EF8D + .byte $20,$78,$06,$03,$20,$A4,$01,$03,$20,$BA,$04,$03,$20,$84,$02,$0F ; PRG $2F9D | CPU $EF9D + .byte $22,$0A,$0C,$24,$24,$19,$15,$0A,$22,$0E,$1B,$24,$45,$24,$24,$0F ; PRG $2FAD | CPU $EFAD + .byte $22,$0A,$0C,$24,$24,$19,$15,$0A,$22,$0E,$1B,$24,$4D,$24,$24,$0F ; PRG $2FBD | CPU $EFBD + .byte $22,$4A,$0C,$24,$10,$0A,$16,$0E,$24,$24,$18,$1F,$0E,$1B,$24,$14 ; PRG $2FCD | CPU $EFCD + .byte $20,$C8,$02,$85,$87,$20,$E8,$02,$86,$88,$20,$D6,$02,$85,$87,$20 ; PRG $2FDD | CPU $EFDD + .byte $F6,$02,$86,$88,$14,$20,$C8,$02,$24,$24,$20,$E8,$02,$24,$24,$20 ; PRG $2FED | CPU $EFED + .byte $D6,$02,$24,$24,$20,$F6,$02,$24,$24,$0F,$22,$0A,$0C,$19,$0E,$1B ; PRG $2FFD | CPU $EFFD + .byte $0F,$0E,$0C,$1D,$24,$03,$00,$00,$00,$3F,$00,$20,$0F,$30,$27,$06 ; PRG $300D | CPU $F00D + .byte $0F,$30,$22,$12,$0F,$30,$2A,$1A,$0F,$2A,$16,$02,$0F,$30,$27,$06 ; PRG $301D | CPU $F01D + .byte $0F,$12,$30,$27,$0F,$2A,$30,$02,$0F,$16,$2A,$1A,$00,$3F,$00,$20 ; PRG $302D | CPU $F02D + .byte $0F,$30,$27,$06,$0F,$30,$10,$00,$0F,$30,$16,$26,$0F,$2A,$16,$02 ; PRG $303D | CPU $F03D + .byte $0F,$30,$27,$06,$0F,$12,$30,$27,$0F,$2A,$30,$02,$0F,$16,$2A,$1A ; PRG $304D | CPU $F04D + .byte $00,$3F,$00,$20,$0F,$30,$27,$06,$0F,$30,$28,$18,$0F,$30,$2A,$1A ; PRG $305D | CPU $F05D + .byte $0F,$2A,$16,$02,$0F,$30,$27,$06,$0F,$12,$30,$27,$0F,$2A,$30,$02 ; PRG $306D | CPU $F06D + .byte $0F,$16,$2A,$1A,$00,$3F,$00,$18,$0F,$2B,$21,$27,$0F,$30,$30,$0F ; PRG $307D | CPU $F07D + .byte $0F,$0F,$30,$30,$0F,$30,$30,$30,$0F,$27,$27,$27,$0F,$30,$27,$06 ; PRG $308D | CPU $F08D + .byte $00,$20,$63,$12,$FD,$5F,$FC,$FB,$5F,$FC,$FD,$24,$FE,$FD,$24,$FE ; PRG $309D | CPU $F09D + .byte $FD,$5F,$FE,$FD,$24,$FE,$20,$83,$12,$FD,$24,$FE,$FD,$24,$FE,$FD ; PRG $30AD | CPU $F0AD + .byte $FC,$FE,$FD,$FB,$5E,$FD,$24,$24,$FD,$24,$FE,$20,$A3,$12,$FD,$24 ; PRG $30BD | CPU $F0BD + .byte $FE,$FD,$24,$FE,$FD,$5F,$FE,$FD,$5F,$FC,$FD,$5F,$FE,$8F,$5F,$5E ; PRG $30CD | CPU $F0CD + .byte $20,$C3,$11,$FD,$24,$FE,$FD,$24,$FE,$FD,$8F,$FE,$FD,$8F,$FE,$FD ; PRG $30DD | CPU $F0DD + .byte $24,$24,$24,$5F,$20,$E3,$11,$FD,$5F,$5E,$8F,$5F,$5E,$FD,$24,$FE ; PRG $30ED | CPU $F0ED + .byte $FD,$24,$FE,$FD,$5F,$FE,$24,$5F,$21,$29,$0C,$FD,$24,$FE,$FB,$5F ; PRG $30FD | CPU $F0FD + .byte $FC,$FD,$24,$FE,$FB,$5F,$FC,$21,$49,$0C,$FD,$FB,$5E,$FD,$24,$FE ; PRG $310D | CPU $F10D + .byte $FD,$FC,$FE,$FD,$24,$FE,$21,$69,$0A,$FD,$5F,$FC,$FD,$24,$FE,$FD ; PRG $311D | CPU $F11D + .byte $5F,$FE,$FD,$21,$89,$0C,$FD,$8F,$FE,$FD,$24,$FE,$FD,$8F,$FE,$FD ; PRG $312D | CPU $F12D + .byte $FF,$FE,$21,$A9,$0C,$FD,$24,$FE,$8F,$5F,$5E,$FD,$24,$FE,$8F,$5F ; PRG $313D | CPU $F13D + .byte $FE,$20,$77,$8B,$28,$3D,$3D,$3D,$24,$24,$24,$3D,$3D,$3D,$2E,$20 ; PRG $314D | CPU $F14D + .byte $78,$C4,$3D,$21,$58,$C4,$3D,$20,$79,$83,$3D,$3D,$2A,$21,$79,$83 ; PRG $315D | CPU $F15D + .byte $2C,$3D,$3D,$20,$7A,$8B,$3D,$3D,$2B,$2D,$3D,$3D,$2B,$24,$2D,$3D ; PRG $316D | CPU $F16D + .byte $3D,$20,$7B,$CB,$3D,$20,$7C,$8B,$29,$3D,$3D,$3D,$2F,$29,$3D,$3D ; PRG $317D | CPU $F17D + .byte $3D,$3D,$2F,$22,$09,$0F,$01,$24,$19,$15,$0A,$22,$0E,$1B,$24,$10 ; PRG $318D | CPU $F18D + .byte $0A,$16,$0E,$24,$0A,$22,$49,$0F,$01,$24,$19,$15,$0A,$22,$0E,$1B ; PRG $319D | CPU $F19D + .byte $24,$10,$0A,$16,$0E,$24,$0B,$22,$89,$0F,$02,$24,$19,$15,$0A,$22 ; PRG $31AD | CPU $F1AD + .byte $0E,$1B,$24,$10,$0A,$16,$0E,$24,$0A,$22,$C9,$0F,$02,$24,$19,$15 ; PRG $31BD | CPU $F1BD + .byte $0A,$22,$0E,$1B,$24,$10,$0A,$16,$0E,$24,$0B,$23,$25,$16,$25,$01 ; PRG $31CD | CPU $F1CD + .byte $09,$08,$04,$24,$17,$12,$17,$1D,$0E,$17,$0D,$18,$24,$0C,$18,$27 ; PRG $31DD | CPU $F1DD + .byte $15,$1D,$0D,$25,$23,$F1,$06,$05,$05,$05,$05,$05,$09,$25,$CD,$05 ; PRG $31ED | CPU $F1ED + .byte $FA,$FB,$FC,$FD,$E4,$00,$23,$40,$60,$4C,$23,$60,$60,$4C,$23,$80 ; PRG $31FD | CPU $F1FD + .byte $60,$3D,$23,$A0,$60,$3D,$23,$4A,$01,$4B,$23,$69,$01,$4B,$23,$55 ; PRG $320D | CPU $F20D + .byte $01,$4E,$23,$76,$01,$4E,$23,$88,$01,$4A,$23,$A7,$01,$4A,$23,$97 ; PRG $321D | CPU $F21D + .byte $01,$4F,$23,$B8,$01,$4F,$20,$81,$06,$58,$1B,$5C,$24,$24,$5A,$20 ; PRG $322D | CPU $F22D + .byte $99,$06,$58,$1D,$12,$16,$0E,$5A,$20,$A1,$06,$59,$5D,$5C,$24,$24 ; PRG $323D | CPU $F23D + .byte $5B,$20,$B9,$06,$59,$08,$00,$00,$00,$5B,$23,$F8,$48,$FF,$00,$22 ; PRG $324D | CPU $F24D + .byte $88,$10,$38,$3A,$30,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$32 ; PRG $325D | CPU $F25D + .byte $41,$43,$22,$A8,$03,$39,$3B,$31,$22,$B5,$03,$33,$42,$44,$22,$C6 ; PRG $326D | CPU $F26D + .byte $14,$38,$3A,$34,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F ; PRG $327D | CPU $F27D + .byte $3E,$3F,$36,$41,$43,$22,$E6,$03,$39,$3B,$35,$22,$F7,$03,$37,$42 ; PRG $328D | CPU $F28D + .byte $44,$23,$04,$18,$38,$3A,$3C,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$3E ; PRG $329D | CPU $F29D + .byte $3F,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$40,$41,$43,$23,$24,$03,$39 ; PRG $32AD | CPU $F2AD + .byte $3B,$3D,$23,$39,$03,$3D,$42,$44,$21,$00,$07,$69,$6C,$6C,$6C,$6C ; PRG $32BD | CPU $F2BD + .byte $6D,$70,$21,$19,$07,$68,$69,$6C,$6C,$6C,$6C,$6D,$21,$20,$46,$6E ; PRG $32CD | CPU $F2CD + .byte $21,$3A,$46,$6A,$21,$40,$46,$6F,$21,$5A,$46,$6B,$21,$06,$89,$70 ; PRG $32DD | CPU $F2DD + .byte $5F,$74,$75,$24,$72,$73,$74,$75,$21,$19,$89,$68,$5F,$64,$62,$24 ; PRG $32ED | CPU $F2ED + .byte $66,$65,$64,$62,$21,$27,$8D,$71,$5F,$74,$75,$24,$24,$76,$77,$77 ; PRG $32FD | CPU $F2FD + .byte $78,$78,$78,$78,$21,$38,$8D,$67,$5F,$64,$62,$24,$24,$63,$61,$61 ; PRG $330D | CPU $F30D + .byte $60,$60,$60,$60,$21,$48,$84,$72,$73,$74,$75,$21,$57,$84,$66,$65 ; PRG $331D | CPU $F31D + .byte $64,$62,$21,$89,$88,$76,$77,$77,$78,$78,$78,$78,$78,$21,$96,$88 ; PRG $332D | CPU $F32D + .byte $63,$61,$61,$60,$60,$60,$60,$60,$21,$80,$44,$6C,$21,$A0,$45,$6E ; PRG $333D | CPU $F33D + .byte $21,$C0,$45,$6F,$21,$9C,$44,$6C,$21,$BB,$45,$6A,$21,$DB,$45,$6B ; PRG $334D | CPU $F34D + .byte $21,$84,$01,$6D,$21,$9B,$01,$69,$21,$85,$84,$70,$5F,$74,$75,$21 ; PRG $335D | CPU $F35D + .byte $9A,$84,$68,$5F,$64,$62,$22,$00,$04,$6C,$6C,$6D,$70,$22,$1C,$09 ; PRG $336D | CPU $F36D + .byte $68,$69,$6C,$6C,$6E,$6E,$6E,$5F,$72,$22,$3B,$0A,$66,$5F,$6A,$6A ; PRG $337D | CPU $F37D + .byte $6A,$6F,$6F,$6F,$74,$73,$22,$5B,$05,$65,$64,$6B,$6B,$6B,$22,$63 ; PRG $338D | CPU $F38D + .byte $03,$75,$74,$76,$22,$7A,$03,$63,$64,$62,$22,$84,$02,$75,$77,$22 ; PRG $339D | CPU $F39D + .byte $9A,$02,$61,$62,$20,$8B,$02,$89,$8A,$20,$93,$02,$8D,$8E,$20,$A9 ; PRG $33AD | CPU $F3AD + .byte $02,$89,$8A,$20,$B5,$02,$8D,$8E,$20,$8D,$CA,$8B,$20,$92,$CA,$8C ; PRG $33BD | CPU $F3BD + .byte $23,$C8,$02,$0D,$07,$23,$CE,$02,$0D,$07,$23,$D0,$18,$AA,$AA,$20 ; PRG $33CD | CPU $F3CD + .byte $00,$00,$80,$AA,$AA,$AA,$AA,$22,$00,$00,$88,$AA,$AA,$AA,$AA,$22 ; PRG $33DD | CPU $F3DD + .byte $00,$00,$88,$AA,$AA,$23,$E8,$10,$00,$4A,$55,$55,$55,$55,$1A,$00 ; PRG $33ED | CPU $F3ED + .byte $F5,$F5,$F5,$F5,$F5,$F5,$F5,$F5,$00,$22,$C7,$12,$3F,$55,$34,$3E ; PRG $33FD | CPU $F3FD + .byte $3F,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$36,$57,$3E,$22,$E8 ; PRG $340D | CPU $F40D + .byte $02,$56,$35,$22,$F6,$02,$37,$56,$23,$05,$16,$3F,$55,$3C,$3E,$3F ; PRG $341D | CPU $F41D + .byte $3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$3E,$3F,$40,$57 ; PRG $342D | CPU $F42D + .byte $3E,$23,$26,$02,$56,$3D,$23,$38,$02,$3D,$56,$21,$C0,$86,$7A,$7A ; PRG $343D | CPU $F43D + .byte $24,$7A,$7A,$7A,$21,$A1,$87,$79,$7B,$7B,$7D,$7B,$7B,$83,$21,$C2 ; PRG $344D | CPU $F44D + .byte $86,$7C,$7C,$24,$7C,$7C,$7C,$21,$A3,$85,$7A,$7A,$24,$7A,$7A,$21 ; PRG $345D | CPU $F45D + .byte $84,$86,$79,$7B,$7B,$7D,$7B,$83,$21,$A5,$85,$7C,$80,$7E,$80,$80 ; PRG $346D | CPU $F46D + .byte $21,$BA,$85,$7A,$7F,$7E,$7F,$7F,$21,$9B,$86,$79,$7B,$7B,$7D,$7B ; PRG $347D | CPU $F47D + .byte $83,$21,$BC,$85,$7C,$7C,$24,$7C,$7C,$21,$DD,$86,$7A,$7A,$24,$7A ; PRG $348D | CPU $F48D + .byte $7A,$7A,$21,$BE,$87,$79,$7B,$7B,$7D,$7B,$7B,$83,$21,$DF,$86,$7C ; PRG $349D | CPU $F49D + .byte $7C,$24,$7C,$7C,$7C,$22,$81,$C6,$84,$22,$44,$C8,$84,$22,$5B,$C8 ; PRG $34AD | CPU $F4AD + .byte $84,$22,$9E,$C6,$84,$21,$C6,$14,$7E,$81,$7E,$81,$7E,$81,$7E,$81 ; PRG $34BD | CPU $F4BD + .byte $24,$24,$24,$24,$7E,$81,$7E,$81,$7E,$81,$7E,$81,$21,$E6,$14,$7E ; PRG $34CD | CPU $F4CD + .byte $82,$7E,$82,$7E,$82,$7E,$82,$24,$24,$24,$24,$7E,$82,$7E,$82,$7E ; PRG $34DD | CPU $F4DD + .byte $82,$7E,$82,$22,$06,$14,$7E,$81,$7E,$81,$7E,$81,$7E,$81,$7E,$81 ; PRG $34ED | CPU $F4ED + .byte $7E,$81,$7E,$81,$7E,$81,$7E,$81,$7E,$81,$22,$26,$14,$7E,$82,$7E ; PRG $34FD | CPU $F4FD + .byte $82,$7E,$82,$7E,$82,$7E,$82,$7E,$82,$7E,$82,$7E,$82,$7E,$82,$7E ; PRG $350D | CPU $F50D + .byte $82,$20,$88,$10,$50,$51,$52,$51,$52,$51,$52,$24,$24,$51,$52,$51 ; PRG $351D | CPU $F51D + .byte $52,$51,$52,$50,$20,$A7,$02,$50,$53,$20,$B7,$02,$54,$50,$20,$C6 ; PRG $352D | CPU $F52D + .byte $02,$50,$53,$20,$D8,$02,$54,$50,$20,$E5,$02,$50,$53,$20,$F9,$02 ; PRG $353D | CPU $F53D + .byte $54,$50,$21,$04,$02,$50,$53,$21,$1A,$02,$54,$50,$21,$23,$02,$50 ; PRG $354D | CPU $F54D + .byte $53,$21,$3B,$02,$54,$50,$21,$40,$04,$52,$51,$52,$53,$21,$5C,$04 ; PRG $355D | CPU $F55D + .byte $54,$51,$52,$51,$20,$AD,$C7,$8B,$20,$B2,$C7,$8C,$23,$C8,$0A,$0D ; PRG $356D | CPU $F56D + .byte $57,$05,$05,$05,$05,$5D,$07,$55,$55,$23,$D6,$1A,$55,$55,$AA,$AA ; PRG $357D | CPU $F57D + .byte $A0,$20,$80,$A0,$AA,$AA,$AA,$5A,$0A,$0A,$0A,$0A,$5A,$AA,$55,$55 ; PRG $358D | CPU $F58D + .byte $55,$55,$55,$55,$55,$55,$23,$F0,$08,$F5,$F5,$F5,$F5,$F5,$F5,$F5 ; PRG $359D | CPU $F59D + .byte $F5,$00,$22,$CD,$06,$55,$24,$24,$24,$24,$57,$22,$ED,$01,$56,$22 ; PRG $35AD | CPU $F5AD + .byte $F2,$01,$56,$00,$20,$62,$02,$1A,$11,$20,$6B,$04,$20,$21,$23,$11 ; PRG $35BD | CPU $F5BD + .byte $00,$20,$76,$02,$1E,$11,$00 ; PRG $35CD | CPU $F5CD + +IndexedGameplayLookupTable_F5D4: + .byte $10,$11,$12,$FF,$00,$11,$12,$13,$FF,$05,$12,$13,$14,$FF,$0A,$14 ; PRG $35D4 | CPU $F5D4 + .byte $15,$16,$FF,$0F,$15,$FF,$14,$15,$FF,$17,$14,$17,$18,$FF,$1A,$17 ; PRG $35E4 | CPU $F5E4 + .byte $18,$FF,$1F,$18,$FF,$23,$00,$01,$02,$03,$FF,$26,$51,$52,$53,$52 ; PRG $35F4 | CPU $F5F4 + .byte $FF,$2C,$09,$0A,$FF,$32,$0B,$FF,$36 ; PRG $3604 | CPU $F604 + +IndexedGameplayLookupTable_F60D: + .byte $1F,$02,$20,$02,$21,$02,$20,$02,$FF,$00,$19,$02,$1A,$02,$1B,$02 ; PRG $360D | CPU $F60D + .byte $1A,$02,$FF,$0A,$1C,$02,$1D,$02,$1E,$02,$1D,$02,$FF,$14,$28,$02 ; PRG $361D | CPU $F61D + .byte $29,$02,$2A,$02,$29,$02,$FF,$1E,$2B,$02,$2C,$02,$2D,$02,$2C,$02 ; PRG $362D | CPU $F62D + .byte $FF,$28,$25,$02,$26,$02,$27,$02,$26,$02,$FF,$32,$2E,$14,$2F,$10 ; PRG $363D | CPU $F63D + .byte $30,$0E,$31,$02,$33,$02,$31,$02,$33,$02,$31,$02,$33,$02,$32,$02 ; PRG $364D | CPU $F64D + .byte $34,$02,$FF,$4E,$34,$02,$32,$02,$34,$02,$32,$02,$34,$02,$32,$02 ; PRG $365D | CPU $F65D + .byte $33,$02,$31,$02,$33,$02,$31,$02,$33,$02,$31,$02,$30,$0E,$2F,$10 ; PRG $366D | CPU $F66D + .byte $2E,$14,$FF,$70,$0D,$02,$0F,$02,$22,$02,$23,$02,$FF,$74 ; PRG $367D | CPU $F67D + +IndexedGameplayLookupTable_F68B: + .byte $35,$36,$37,$36,$FF,$00,$38,$39,$3A,$39,$FF,$06,$3B,$3C,$3D,$3C ; PRG $368B | CPU $F68B + .byte $FF,$0C,$3E,$3F,$40,$3F,$FF,$12,$43,$42,$41,$42,$FF,$18,$46,$45 ; PRG $369B | CPU $F69B + .byte $44,$45,$FF,$1E ; PRG $36AB | CPU $F6AB + +AnimationLayoutIndexTable: + .byte $00 ; PRG $36AF | CPU $F6AF + +AnimationBaseTileTable: + .byte $00,$00,$04,$00,$08,$00,$0C,$00,$10,$00,$14,$00,$18,$00,$1C,$00 ; PRG $36B0 | CPU $F6B0 + .byte $20,$00,$24,$00,$28,$00,$2C,$00,$5C,$00,$60,$07,$94,$00,$64,$01 ; PRG $36C0 | CPU $F6C0 + .byte $30,$02,$31,$02,$33,$02,$35,$03,$37,$03,$3A,$03,$3D,$00,$40,$00 ; PRG $36D0 | CPU $F6D0 + .byte $44,$08,$A7,$09,$AA,$09,$AD,$08,$B0,$09,$B3,$09,$B6,$00,$B9,$00 ; PRG $36E0 | CPU $F6E0 + .byte $BD,$00,$C1,$00,$68,$00,$6C,$0A,$9F,$08,$C5,$09,$C8,$09,$CB,$08 ; PRG $36F0 | CPU $F6F0 + .byte $CE,$09,$D1,$09,$D4,$00,$D7,$00,$DB,$00,$DF,$01,$A0,$01,$A1,$01 ; PRG $3700 | CPU $F700 + .byte $A2,$01,$A3,$01,$A4,$01,$A5,$01,$A6,$06,$70,$06,$72,$06,$74,$06 ; PRG $3710 | CPU $F710 + .byte $76,$06,$78,$06,$7A,$04,$7C,$04,$7E,$04,$80,$04,$82,$04,$84,$04 ; PRG $3720 | CPU $F720 + .byte $86,$04,$88,$04,$8A,$04,$8C,$04,$8E,$04,$90,$04,$92,$0B,$00,$0C ; PRG $3730 | CPU $F730 + .byte $00,$0D,$00,$05,$E8,$00,$48,$00,$4C,$00,$50,$00,$54,$00,$58,$0A ; PRG $3740 | CPU $F740 + .byte $A2,$00,$96,$02,$9A,$03,$9C ; PRG $3750 | CPU $F750 + +MetaspriteLayoutPointerTable: + .byte $73 ; PRG $3757 | CPU $F757 + +MetaspriteLayoutPointerTableHi: + .byte $F7,$80,$F7,$84,$F7,$8B,$F7,$95,$F7,$9C,$F7,$D3,$F7,$DA,$F7,$E1 ; PRG $3758 | CPU $F758 + .byte $F7,$EB,$F7,$F5,$F7,$F9,$F7,$FA,$F7,$FB,$F7,$00,$F7,$F8,$00,$F7 ; PRG $3768 | CPU $F768 + .byte $00,$00,$00,$F8,$00,$00,$00,$10,$00,$FB,$FC,$13,$00,$F7,$FC,$00 ; PRG $3778 | CPU $F778 + .byte $00,$FC,$12,$00,$F7,$F8,$00,$F7,$00,$00,$00,$FC,$11,$00,$F3,$FC ; PRG $3788 | CPU $F788 + .byte $00,$FB,$FC,$10,$00,$DF,$F0,$00,$DF,$F8,$00,$DF,$00,$00,$E7,$F0 ; PRG $3798 | CPU $F798 + .byte $00,$E7,$F8,$00,$E7,$00,$00,$E7,$08,$00,$EF,$F0,$00,$EF,$F8,$00 ; PRG $37A8 | CPU $F7A8 + .byte $EF,$00,$00,$EF,$08,$00,$F7,$F8,$00,$F7,$00,$00,$F7,$08,$00,$00 ; PRG $37B8 | CPU $F7B8 + .byte $F0,$00,$00,$F8,$00,$00,$00,$00,$00,$08,$10,$00,$FB,$F8,$00,$FB ; PRG $37C8 | CPU $F7C8 + .byte $00,$10,$00,$F7,$FC,$00,$00,$FC,$10,$00,$F7,$FC,$80,$00,$F8,$81 ; PRG $37D8 | CPU $F7D8 + .byte $00,$00,$10,$80,$F7,$F8,$81,$F7,$00,$00,$00,$FC,$10,$00,$FB,$FC ; PRG $37E8 | CPU $F7E8 + .byte $10,$14,$12,$11,$F4,$FE,$00,$38,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA ; PRG $37F8 | CPU $F7F8 + .byte $EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA ; PRG $3808 | CPU $F808 + .byte $EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA ; PRG $3818 | CPU $F818 +; ----------------------------------------------------------------------------- +; Global purpose: Update Audio Engine. +; Local behavior: Reads TransformPackedValue_F8B9; mutates JOY2, AudioChannelRequest, AudioEffectRequest, AudioPendingFlags, AudioRequestFlags. +; Parameters: TransformPackedValue_F8B9. +; Returns: returns to caller; flags/register result depends on final instructions: sta AudioRequestFlags; rts; .byte $A2,$00. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateAudioEngine: + nop ; PRG $3820 | CPU $F820 | EA + lda #$C0 ; PRG $3821 | CPU $F821 | A9 C0 + sta JOY2 ; PRG $3823 | CPU $F823 | 8D 17 40 + jsr TransformPackedValue_F8B9 ; PRG $3826 | CPU $F826 | 20 B9 F8 + lda #$00 ; PRG $3829 | CPU $F829 | A9 00 + sta AudioChannelRequest ; PRG $382B | CPU $F82B | 85 FF + sta AudioEffectRequest ; PRG $382D | CPU $F82D | 85 FE + sta AudioPendingFlags ; PRG $382F | CPU $F82F | 85 FD + sta AudioRequestFlags ; PRG $3831 | CPU $F831 | 85 FB + rts ; PRG $3833 | CPU $F833 | 60 + .byte $A2,$00 ; PRG $3834 | CPU $F834 +; ----------------------------------------------------------------------------- +; Global purpose: Start Sound Effect. +; Local behavior: Reads Flow_F840; mutates no direct memory mutation observed. +; Parameters: Flow_F840. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$10; sta $4000,x; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +StartSoundEffect: + cmp #$7E ; PRG $3836 | CPU $F836 | C9 7E + bne Flow_F840 ; PRG $3838 | CPU $F838 | D0 06 + lda #$10 ; PRG $383A | CPU $F83A | A9 10 + sta $4000,x ; PRG $383C | CPU $F83C | 9D 00 40 + rts ; PRG $383F | CPU $F83F | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F840. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_07FF. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F840: + pha ; PRG $3840 | CPU $F840 | 48 + ldy #$00 ; PRG $3841 | CPU $F841 | A0 00 + sty Ram_07FF ; PRG $3843 | CPU $F843 | 8C FF 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F846. +; Local behavior: Reads Ram_07FF, Flow_F846, IndexedGameplayLookupTable_FFE2, IndexedGameplayLookupTable_FFE3; mutates Ram_07FF, WorkPointerOrValueLo, ControllerSerialBits. +; Parameters: Ram_07FF, Flow_F846, IndexedGameplayLookupTable_FFE2, IndexedGameplayLookupTable_FFE3. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F846: + tay ; PRG $3846 | CPU $F846 | A8 + sec ; PRG $3847 | CPU $F847 | 38 + sbc #$18 ; PRG $3848 | CPU $F848 | E9 18 + inc Ram_07FF ; PRG $384A | CPU $F84A | EE FF 07 + bcs Flow_F846 ; PRG $384D | CPU $F84D | B0 F7 + lda IndexedGameplayLookupTable_FFE2,y ; PRG $384F | CPU $F84F | B9 E2 FF + sta WorkPointerOrValueLo ; PRG $3852 | CPU $F852 | 85 01 + lda IndexedGameplayLookupTable_FFE3,y ; PRG $3854 | CPU $F854 | B9 E3 FF + sta ControllerSerialBits ; PRG $3857 | CPU $F857 | 85 00 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F859. +; Local behavior: Reads ControllerSerialBits, WorkPointerOrValueLo, Ram_07FF, Flow_F859, Flow_F869; mutates ControllerSerialBits, WorkPointerOrValueLo, Ram_07FF. +; Parameters: ControllerSerialBits, WorkPointerOrValueLo, Ram_07FF, Flow_F859, Flow_F869. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F859: + lsr ControllerSerialBits ; PRG $3859 | CPU $F859 | 46 00 + ror WorkPointerOrValueLo ; PRG $385B | CPU $F85B | 66 01 + dec Ram_07FF ; PRG $385D | CPU $F85D | CE FF 07 + bne Flow_F859 ; PRG $3860 | CPU $F860 | D0 F7 + pla ; PRG $3862 | CPU $F862 | 68 + cmp #$38 ; PRG $3863 | CPU $F863 | C9 38 + bcc Flow_F869 ; PRG $3865 | CPU $F865 | 90 02 + dec WorkPointerOrValueLo ; PRG $3867 | CPU $F867 | C6 01 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F869. +; Local behavior: Reads WorkPointerOrValueLo, ControllerSerialBits; mutates no direct memory mutation observed. +; Parameters: WorkPointerOrValueLo, ControllerSerialBits. +; Returns: returns to caller; flags/register result depends on final instructions: ora #$08; sta $4003,x; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F869: + lda WorkPointerOrValueLo ; PRG $3869 | CPU $F869 | A5 01 + sta $4002,x ; PRG $386B | CPU $F86B | 9D 02 40 + lda ControllerSerialBits ; PRG $386E | CPU $F86E | A5 00 + ora #$08 ; PRG $3870 | CPU $F870 | 09 08 + sta $4003,x ; PRG $3872 | CPU $F872 | 9D 03 40 + rts ; PRG $3875 | CPU $F875 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch F876. +; Local behavior: Reads StartSoundEffect; mutates no direct memory mutation observed. +; Parameters: StartSoundEffect. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_F876: + ldx #$04 ; PRG $3876 | CPU $F876 | A2 04 + bne StartSoundEffect ; PRG $3878 | CPU $F878 | D0 BC +; ----------------------------------------------------------------------------- +; Global purpose: Flow F87 A. +; Local behavior: Reads implicit CPU state or none observed; mutates AudioFrameCounter, AudioNoteIndex, Ram_07B1. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F87A: + sty AudioFrameCounter ; PRG $387A | CPU $F87A | 84 F1 + lda #$48 ; PRG $387C | CPU $F87C | A9 48 + sta AudioNoteIndex ; PRG $387E | CPU $F87E | 85 F6 + lda #$91 ; PRG $3880 | CPU $F880 | A9 91 + sta Ram_07B1 ; PRG $3882 | CPU $F882 | 8D B1 07 + ldx #$0F ; PRG $3885 | CPU $F885 | A2 0F + ldy #$18 ; PRG $3887 | CPU $F887 | A0 18 + stx $4002 ; PRG $3889 | CPU $F889 | 8E 02 40 + sty $4006 ; PRG $388C | CPU $F88C | 8C 06 40 + lda #$08 ; PRG $388F | CPU $F88F | A9 08 + sta $4003 ; PRG $3891 | CPU $F891 | 8D 03 40 + sta $4007 ; PRG $3894 | CPU $F894 | 8D 07 40 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F897. +; Local behavior: Reads Ram_07B1, Flow_F8A7; mutates Ram_07B1. +; Parameters: Ram_07B1, Flow_F8A7. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F897: + lda Ram_07B1 ; PRG $3897 | CPU $F897 | AD B1 07 + sta $4000 ; PRG $389A | CPU $F89A | 8D 00 40 + sta $4004 ; PRG $389D | CPU $F89D | 8D 04 40 + cmp #$9F ; PRG $38A0 | CPU $F8A0 | C9 9F + beq Flow_F8A7 ; PRG $38A2 | CPU $F8A2 | F0 03 + inc Ram_07B1 ; PRG $38A4 | CPU $F8A4 | EE B1 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F8 A7. +; Local behavior: Reads AudioNoteIndex, Flow_F8B1, Flow_F91B; mutates no direct memory mutation observed. +; Parameters: AudioNoteIndex, Flow_F8B1, Flow_F91B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F8A7: + lda AudioNoteIndex ; PRG $38A7 | CPU $F8A7 | A5 F6 + and #$07 ; PRG $38A9 | CPU $F8A9 | 29 07 + bne Flow_F8B1 ; PRG $38AB | CPU $F8AB | D0 04 + lda #$83 ; PRG $38AD | CPU $F8AD | A9 83 + bne Flow_F91B ; PRG $38AF | CPU $F8AF | D0 6A +; ----------------------------------------------------------------------------- +; Global purpose: Flow F8 B1. +; Local behavior: Reads Flow_F921, Flow_F91B; mutates no direct memory mutation observed. +; Parameters: Flow_F921, Flow_F91B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F8B1: + and #$03 ; PRG $38B1 | CPU $F8B1 | 29 03 + bne Flow_F921 ; PRG $38B3 | CPU $F8B3 | D0 6C + lda #$CB ; PRG $38B5 | CPU $F8B5 | A9 CB + bne Flow_F91B ; PRG $38B7 | CPU $F8B7 | D0 62 +; ----------------------------------------------------------------------------- +; Global purpose: Transform Packed Value F8 B9. +; Local behavior: Reads AudioChannelRequest, AudioFrameCounter, Flow_F87A, Flow_F897, Flow_F8DB, Flow_F8EB, Flow_F936, Flow_F957; mutates AudioChannelRequest. +; Parameters: AudioChannelRequest, AudioFrameCounter, Flow_F87A, Flow_F897, Flow_F8DB, Flow_F8EB, Flow_F936, Flow_F957. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +TransformPackedValue_F8B9: + ldy AudioChannelRequest ; PRG $38B9 | CPU $F8B9 | A4 FF + lda AudioFrameCounter ; PRG $38BB | CPU $F8BB | A5 F1 + lsr AudioChannelRequest ; PRG $38BD | CPU $F8BD | 46 FF + bcs Flow_F87A ; PRG $38BF | CPU $F8BF | B0 B9 + lsr a ; PRG $38C1 | CPU $F8C1 | 4A + bcs Flow_F897 ; PRG $38C2 | CPU $F8C2 | B0 D3 + lsr a ; PRG $38C4 | CPU $F8C4 | 4A + lsr AudioChannelRequest ; PRG $38C5 | CPU $F8C5 | 46 FF + lsr a ; PRG $38C7 | CPU $F8C7 | 4A + lsr AudioChannelRequest ; PRG $38C8 | CPU $F8C8 | 46 FF + lsr AudioChannelRequest ; PRG $38CA | CPU $F8CA | 46 FF + bcs Flow_F8DB ; PRG $38CC | CPU $F8CC | B0 0D + lsr a ; PRG $38CE | CPU $F8CE | 4A + bcs Flow_F8EB ; PRG $38CF | CPU $F8CF | B0 1A + lsr AudioChannelRequest ; PRG $38D1 | CPU $F8D1 | 46 FF + bcs Flow_F936 ; PRG $38D3 | CPU $F8D3 | B0 61 + lsr a ; PRG $38D5 | CPU $F8D5 | 4A + bcs Flow_F957 ; PRG $38D6 | CPU $F8D6 | B0 7F +; ----------------------------------------------------------------------------- +; Global purpose: Flow F8 D8. +; Local behavior: Reads Continuation_F9FD; mutates no direct memory mutation observed. +; Parameters: Continuation_F9FD. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F8D8: + jmp Continuation_F9FD ; PRG $38D8 | CPU $F8D8 | 4C FD F9 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F8 DB. +; Local behavior: Reads Flow_F8F0; mutates AudioFrameCounter, AudioNoteIndex. +; Parameters: Flow_F8F0. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F8DB: + sty AudioFrameCounter ; PRG $38DB | CPU $F8DB | 84 F1 + lda #$07 ; PRG $38DD | CPU $F8DD | A9 07 + sta AudioNoteIndex ; PRG $38DF | CPU $F8DF | 85 F6 + lda #$02 ; PRG $38E1 | CPU $F8E1 | A9 02 + sta $4000 ; PRG $38E3 | CPU $F8E3 | 8D 00 40 + sta $4004 ; PRG $38E6 | CPU $F8E6 | 8D 04 40 + bne Flow_F8F0 ; PRG $38E9 | CPU $F8E9 | D0 05 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F8 EB. +; Local behavior: Reads Ram_07B1, Flow_F8D8; mutates Ram_07B1. +; Parameters: Ram_07B1, Flow_F8D8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F8EB: + dec Ram_07B1 ; PRG $38EB | CPU $F8EB | CE B1 07 + bne Flow_F8D8 ; PRG $38EE | CPU $F8EE | D0 E8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F8 F0. +; Local behavior: Reads AudioNoteIndex, Flow_F96F, AudioPitchOrPeriodTable_F970, IndexedGameplayLookupTable_F97B, IndexedGameplayLookupTable_F97C, Flow_F916; mutates no direct memory mutation observed. +; Parameters: AudioNoteIndex, Flow_F96F, AudioPitchOrPeriodTable_F970, IndexedGameplayLookupTable_F97B, IndexedGameplayLookupTable_F97C, Flow_F916. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F8F0: + lda AudioNoteIndex ; PRG $38F0 | CPU $F8F0 | A5 F6 + asl a ; PRG $38F2 | CPU $F8F2 | 0A + tay ; PRG $38F3 | CPU $F8F3 | A8 + lda Flow_F96F,y ; PRG $38F4 | CPU $F8F4 | B9 6F F9 + sta $4002 ; PRG $38F7 | CPU $F8F7 | 8D 02 40 + lda AudioPitchOrPeriodTable_F970,y ; PRG $38FA | CPU $F8FA | B9 70 F9 + sta $4003 ; PRG $38FD | CPU $F8FD | 8D 03 40 + lda IndexedGameplayLookupTable_F97B,y ; PRG $3900 | CPU $F900 | B9 7B F9 + sta $4006 ; PRG $3903 | CPU $F903 | 8D 06 40 + lda IndexedGameplayLookupTable_F97C,y ; PRG $3906 | CPU $F906 | B9 7C F9 + sta $4007 ; PRG $3909 | CPU $F909 | 8D 07 40 + ldy #$05 ; PRG $390C | CPU $F90C | A0 05 + lda AudioNoteIndex ; PRG $390E | CPU $F90E | A5 F6 + cmp #$02 ; PRG $3910 | CPU $F910 | C9 02 + bne Flow_F916 ; PRG $3912 | CPU $F912 | D0 02 + ldy #$0A ; PRG $3914 | CPU $F914 | A0 0A +; ----------------------------------------------------------------------------- +; Global purpose: Flow F916. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F916: + lda #$86 ; PRG $3916 | CPU $F916 | A9 86 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F918. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_07B1. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F918: + sty Ram_07B1 ; PRG $3918 | CPU $F918 | 8C B1 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F91 B. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F91B: + sta $4001 ; PRG $391B | CPU $F91B | 8D 01 40 + sta $4005 ; PRG $391E | CPU $F91E | 8D 05 40 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F921. +; Local behavior: Reads AudioNoteIndex; mutates AudioNoteIndex. +; Parameters: AudioNoteIndex. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F921: + dec AudioNoteIndex ; PRG $3921 | CPU $F921 | C6 F6 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F923. +; Local behavior: Reads Flow_F8D8, UpdateApuChannelState_FBD6, AudioFrameCounter, Flow_F930; mutates AudioFrameCounter, AudioRequestFlags. +; Parameters: Flow_F8D8, UpdateApuChannelState_FBD6, AudioFrameCounter, Flow_F930. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F923: + bne Flow_F8D8 ; PRG $3923 | CPU $F923 | D0 B3 + jsr UpdateApuChannelState_FBD6 ; PRG $3925 | CPU $F925 | 20 D6 FB + dec AudioFrameCounter ; PRG $3928 | CPU $F928 | C6 F1 + bne Flow_F930 ; PRG $392A | CPU $F92A | D0 04 + lda #$04 ; PRG $392C | CPU $F92C | A9 04 + sta AudioRequestFlags ; PRG $392E | CPU $F92E | 85 FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow F930. +; Local behavior: Reads Flow_F8D8; mutates AudioFrameCounter. +; Parameters: Flow_F8D8. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F930: + lda #$00 ; PRG $3930 | CPU $F930 | A9 00 + sta AudioFrameCounter ; PRG $3932 | CPU $F932 | 85 F1 + beq Flow_F8D8 ; PRG $3934 | CPU $F934 | F0 A2 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F936. +; Local behavior: Reads ComputeOrDispatch_F876, Flow_F96F; mutates AudioFrameCounter, AudioNoteIndex. +; Parameters: ComputeOrDispatch_F876, Flow_F96F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F936: + sty AudioFrameCounter ; PRG $3936 | CPU $F936 | 84 F1 + lda #$09 ; PRG $3938 | CPU $F938 | A9 09 + sta AudioNoteIndex ; PRG $393A | CPU $F93A | 85 F6 + lda #$5F ; PRG $393C | CPU $F93C | A9 5F + sta $4000 ; PRG $393E | CPU $F93E | 8D 00 40 + sta $4004 ; PRG $3941 | CPU $F941 | 8D 04 40 + lda #$D4 ; PRG $3944 | CPU $F944 | A9 D4 + sta $4002 ; PRG $3946 | CPU $F946 | 8D 02 40 + lda #$0D ; PRG $3949 | CPU $F949 | A9 0D + sta $4003 ; PRG $394B | CPU $F94B | 8D 03 40 + lda #$00 ; PRG $394E | CPU $F94E | A9 00 + jsr ComputeOrDispatch_F876 ; PRG $3950 | CPU $F950 | 20 76 F8 + lda #$92 ; PRG $3953 | CPU $F953 | A9 92 + bne Flow_F96F ; PRG $3955 | CPU $F955 | D0 18 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F957. +; Local behavior: Reads Ram_07B1, Flow_F96D, Flow_F923; mutates Ram_07B1. +; Parameters: Ram_07B1, Flow_F96D, Flow_F923. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F957: + dec Ram_07B1 ; PRG $3957 | CPU $F957 | CE B1 07 + beq Flow_F96D ; PRG $395A | CPU $F95A | F0 11 + lda Ram_07B1 ; PRG $395C | CPU $F95C | AD B1 07 + cmp #$03 ; PRG $395F | CPU $F95F | C9 03 + bne Flow_F923 ; PRG $3961 | CPU $F961 | D0 C0 + lda #$93 ; PRG $3963 | CPU $F963 | A9 93 + sta $4001 ; PRG $3965 | CPU $F965 | 8D 01 40 + sta $4005 ; PRG $3968 | CPU $F968 | 8D 05 40 + bne Flow_F923 ; PRG $396B | CPU $F96B | D0 B6 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F96 D. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F96D: + lda #$9A ; PRG $396D | CPU $F96D | A9 9A +; ----------------------------------------------------------------------------- +; Global purpose: Flow F96 F. +; Local behavior: Reads Flow_F918; mutates no direct memory mutation observed. +; Parameters: Flow_F918. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F96F: + ldy #$06 ; PRG $396F | CPU $F96F | A0 06 + bne Flow_F918 ; PRG $3971 | CPU $F971 | D0 A5 + .byte $44,$09,$8F,$09,$7C,$09,$3F,$09 ; PRG $3973 | CPU $F973 + +IndexedGameplayLookupTable_F97B: + .byte $EE ; PRG $397B | CPU $F97B + +IndexedGameplayLookupTable_F97C: + .byte $08,$9F,$48,$5C,$09,$67,$09,$1C,$09,$EE,$08,$C8,$08,$A8,$48 ; PRG $397C | CPU $F97C +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch F98 B. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_F98B: + ldx #$81 ; PRG $398B | CPU $F98B | A2 81 +; ----------------------------------------------------------------------------- +; Global purpose: Configure Sound Channel. +; Local behavior: Reads implicit CPU state or none observed; mutates AudioSequenceDelay, Ram_07B3. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$08; sta $400B; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ConfigureSoundChannel: + stx $4008 ; PRG $398D | CPU $F98D | 8E 08 40 + sty AudioSequenceDelay ; PRG $3990 | CPU $F990 | 84 F2 + sta Ram_07B3 ; PRG $3992 | CPU $F992 | 8D B3 07 + lda #$08 ; PRG $3995 | CPU $F995 | A9 08 + sta $400B ; PRG $3997 | CPU $F997 | 8D 0B 40 + rts ; PRG $399A | CPU $F99A | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F99 B. +; Local behavior: Reads ComputeOrDispatch_F98B, Flow_F9CD; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_F98B, Flow_F9CD. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F99B: + lda #$07 ; PRG $399B | CPU $F99B | A9 07 + jsr ComputeOrDispatch_F98B ; PRG $399D | CPU $F99D | 20 8B F9 + lda #$30 ; PRG $39A0 | CPU $F9A0 | A9 30 + bne Flow_F9CD ; PRG $39A2 | CPU $F9A2 | D0 29 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F9 A4. +; Local behavior: Reads Ram_07B5, Ram_07B4, Flow_F9C4, Flow_FA2F; mutates Ram_07B5, Ram_07B4. +; Parameters: Ram_07B5, Ram_07B4, Flow_F9C4, Flow_FA2F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F9A4: + lda Ram_07B5 ; PRG $39A4 | CPU $F9A4 | AD B5 07 + tay ; PRG $39A7 | CPU $F9A7 | A8 + clc ; PRG $39A8 | CPU $F9A8 | 18 + sbc #$05 ; PRG $39A9 | CPU $F9A9 | E9 05 + and #$0F ; PRG $39AB | CPU $F9AB | 29 0F + sta Ram_07B5 ; PRG $39AD | CPU $F9AD | 8D B5 07 + tya ; PRG $39B0 | CPU $F9B0 | 98 + and #$F0 ; PRG $39B1 | CPU $F9B1 | 29 F0 + ora Ram_07B5 ; PRG $39B3 | CPU $F9B3 | 0D B5 07 + sta Ram_07B5 ; PRG $39B6 | CPU $F9B6 | 8D B5 07 + sta $400A ; PRG $39B9 | CPU $F9B9 | 8D 0A 40 + dec Ram_07B4 ; PRG $39BC | CPU $F9BC | CE B4 07 + beq Flow_F9C4 ; PRG $39BF | CPU $F9BF | F0 03 + jmp Flow_FA2F ; PRG $39C1 | CPU $F9C1 | 4C 2F FA +; ----------------------------------------------------------------------------- +; Global purpose: Flow F9 C4. +; Local behavior: Reads Ram_07B5; mutates no direct memory mutation observed. +; Parameters: Ram_07B5. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F9C4: + lda Ram_07B5 ; PRG $39C4 | CPU $F9C4 | AD B5 07 + lsr a ; PRG $39C7 | CPU $F9C7 | 4A + lsr a ; PRG $39C8 | CPU $F9C8 | 4A + clc ; PRG $39C9 | CPU $F9C9 | 18 + adc Ram_07B5 ; PRG $39CA | CPU $F9CA | 6D B5 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F9 CD. +; Local behavior: Reads Flow_F9EC; mutates Ram_07B4. +; Parameters: Flow_F9EC. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F9CD: + ldy #$03 ; PRG $39CD | CPU $F9CD | A0 03 + sty Ram_07B4 ; PRG $39CF | CPU $F9CF | 8C B4 07 + bne Flow_F9EC ; PRG $39D2 | CPU $F9D2 | D0 18 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F9 D4. +; Local behavior: Reads ComputeOrDispatch_F98B, Flow_F9EC; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_F98B, Flow_F9EC. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F9D4: + lda #$17 ; PRG $39D4 | CPU $F9D4 | A9 17 + jsr ComputeOrDispatch_F98B ; PRG $39D6 | CPU $F9D6 | 20 8B F9 + lda #$A0 ; PRG $39D9 | CPU $F9D9 | A9 A0 + bne Flow_F9EC ; PRG $39DB | CPU $F9DB | D0 0F +; ----------------------------------------------------------------------------- +; Global purpose: Flow F9 DD. +; Local behavior: Reads Ram_07B3, Flow_F9EF, Ram_06F0; mutates Ram_07B3. +; Parameters: Ram_07B3, Flow_F9EF, Ram_06F0. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F9DD: + lda Ram_07B3 ; PRG $39DD | CPU $F9DD | AD B3 07 + and #$07 ; PRG $39E0 | CPU $F9E0 | 29 07 + bne Flow_F9EF ; PRG $39E2 | CPU $F9E2 | D0 0B + dec Ram_07B3 ; PRG $39E4 | CPU $F9E4 | CE B3 07 + lda Ram_06F0 ; PRG $39E7 | CPU $F9E7 | AD F0 06 + ora #$80 ; PRG $39EA | CPU $F9EA | 09 80 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F9 EC. +; Local behavior: Reads UpdateRam_07B5_FA7F; mutates no direct memory mutation observed. +; Parameters: UpdateRam_07B5_FA7F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F9EC: + jmp UpdateRam_07B5_FA7F ; PRG $39EC | CPU $F9EC | 4C 7F FA +; ----------------------------------------------------------------------------- +; Global purpose: Flow F9 EF. +; Local behavior: Reads Ram_07B5, Flow_F9F7; mutates Ram_07B5. +; Parameters: Ram_07B5, Flow_F9F7. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F9EF: + inc Ram_07B5 ; PRG $39EF | CPU $F9EF | EE B5 07 + bne Flow_F9F7 ; PRG $39F2 | CPU $F9F2 | D0 03 + dec Ram_07B5 ; PRG $39F4 | CPU $F9F4 | CE B5 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow F9 F7. +; Local behavior: Reads Ram_07B5, UpdateApuChannelState_FA82; mutates no direct memory mutation observed. +; Parameters: Ram_07B5, UpdateApuChannelState_FA82. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_F9F7: + lda Ram_07B5 ; PRG $39F7 | CPU $F9F7 | AD B5 07 + jmp UpdateApuChannelState_FA82 ; PRG $39FA | CPU $F9FA | 4C 82 FA +; ----------------------------------------------------------------------------- +; Global purpose: Continuation F9 FD. +; Local behavior: Reads AudioEnvelopeOrSequenceIndex, Flow_FA2F, AudioEffectRequest, AudioSequenceDelay, Flow_F99B, Flow_F9A4, Flow_F9D4, Flow_F9DD; mutates AudioEffectRequest. +; Parameters: AudioEnvelopeOrSequenceIndex, Flow_FA2F, AudioEffectRequest, AudioSequenceDelay, Flow_F99B, Flow_F9A4, Flow_F9D4, Flow_F9DD. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_F9FD: + ldx AudioEnvelopeOrSequenceIndex ; PRG $39FD | CPU $F9FD | A6 F8 + bne Flow_FA2F ; PRG $39FF | CPU $F9FF | D0 2E + ldy AudioEffectRequest ; PRG $3A01 | CPU $FA01 | A4 FE + lda AudioSequenceDelay ; PRG $3A03 | CPU $FA03 | A5 F2 + lsr AudioEffectRequest ; PRG $3A05 | CPU $FA05 | 46 FE + bcs Flow_F99B ; PRG $3A07 | CPU $FA07 | B0 92 + lsr a ; PRG $3A09 | CPU $FA09 | 4A + bcs Flow_F9A4 ; PRG $3A0A | CPU $FA0A | B0 98 + lsr AudioEffectRequest ; PRG $3A0C | CPU $FA0C | 46 FE + bcs Flow_F9D4 ; PRG $3A0E | CPU $FA0E | B0 C4 + lsr a ; PRG $3A10 | CPU $FA10 | 4A + bcs Flow_F9DD ; PRG $3A11 | CPU $FA11 | B0 CA + lsr AudioEffectRequest ; PRG $3A13 | CPU $FA13 | 46 FE + bcs Flow_FA32 ; PRG $3A15 | CPU $FA15 | B0 1B + lsr a ; PRG $3A17 | CPU $FA17 | 4A + bcs Flow_FA3C ; PRG $3A18 | CPU $FA18 | B0 22 + lsr AudioEffectRequest ; PRG $3A1A | CPU $FA1A | 46 FE + bcs Flow_FA61 ; PRG $3A1C | CPU $FA1C | B0 43 + lsr a ; PRG $3A1E | CPU $FA1E | 4A + bcs Flow_FA6F ; PRG $3A1F | CPU $FA1F | B0 4E + lsr AudioEffectRequest ; PRG $3A21 | CPU $FA21 | 46 FE + bcs Flow_FA93 ; PRG $3A23 | CPU $FA23 | B0 6E + lsr a ; PRG $3A25 | CPU $FA25 | 4A + bcs Flow_FA9C ; PRG $3A26 | CPU $FA26 | B0 74 + lsr a ; PRG $3A28 | CPU $FA28 | 4A + bcs Flow_FA85 ; PRG $3A29 | CPU $FA29 | B0 5A + lsr AudioEffectRequest ; PRG $3A2B | CPU $FA2B | 46 FE + bcs Flow_FAA4 ; PRG $3A2D | CPU $FA2D | B0 75 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FA2 F. +; Local behavior: Reads Continuation_FB9A; mutates no direct memory mutation observed. +; Parameters: Continuation_FB9A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FA2F: + jmp Continuation_FB9A ; PRG $3A2F | CPU $FA2F | 4C 9A FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow FA32. +; Local behavior: Reads ComputeOrDispatch_F98B; mutates Ram_07B5. +; Parameters: ComputeOrDispatch_F98B. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FA32: + lda #$48 ; PRG $3A32 | CPU $FA32 | A9 48 + jsr ComputeOrDispatch_F98B ; PRG $3A34 | CPU $FA34 | 20 8B F9 + lda #$25 ; PRG $3A37 | CPU $FA37 | A9 25 + sta Ram_07B5 ; PRG $3A39 | CPU $FA39 | 8D B5 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FA3 C. +; Local behavior: Reads Ram_07B3, Flow_FA4F, Ram_07B5, ControllerSerialBits, UpdateApuChannelState_FA82; mutates ControllerSerialBits. +; Parameters: Ram_07B3, Flow_FA4F, Ram_07B5, ControllerSerialBits, UpdateApuChannelState_FA82. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FA3C: + lda Ram_07B3 ; PRG $3A3C | CPU $FA3C | AD B3 07 + and #$07 ; PRG $3A3F | CPU $FA3F | 29 07 + sta ControllerSerialBits ; PRG $3A41 | CPU $FA41 | 85 00 + lsr a ; PRG $3A43 | CPU $FA43 | 4A + bcs Flow_FA4F ; PRG $3A44 | CPU $FA44 | B0 09 + lda Ram_07B5 ; PRG $3A46 | CPU $FA46 | AD B5 07 + and #$F8 ; PRG $3A49 | CPU $FA49 | 29 F8 + ora ControllerSerialBits ; PRG $3A4B | CPU $FA4B | 05 00 + bne UpdateApuChannelState_FA82 ; PRG $3A4D | CPU $FA4D | D0 33 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FA4 F. +; Local behavior: Reads Ram_07B5, UpdateRam_07B5_FA7F, UpdateApuChannelState_FA82; mutates no direct memory mutation observed. +; Parameters: Ram_07B5, UpdateRam_07B5_FA7F, UpdateApuChannelState_FA82. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FA4F: + lda Ram_07B5 ; PRG $3A4F | CPU $FA4F | AD B5 07 + lsr a ; PRG $3A52 | CPU $FA52 | 4A + lsr a ; PRG $3A53 | CPU $FA53 | 4A + lsr a ; PRG $3A54 | CPU $FA54 | 4A + lsr a ; PRG $3A55 | CPU $FA55 | 4A + clc ; PRG $3A56 | CPU $FA56 | 18 + adc Ram_07B5 ; PRG $3A57 | CPU $FA57 | 6D B5 07 + bcc UpdateRam_07B5_FA7F ; PRG $3A5A | CPU $FA5A | 90 23 + lda Ram_07B5 ; PRG $3A5C | CPU $FA5C | AD B5 07 + bne UpdateApuChannelState_FA82 ; PRG $3A5F | CPU $FA5F | D0 21 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FA61. +; Local behavior: Reads ComputeOrDispatch_F98B, UpdateApuChannelState_FA82; mutates Ram_07B5. +; Parameters: ComputeOrDispatch_F98B, UpdateApuChannelState_FA82. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FA61: + lda #$19 ; PRG $3A61 | CPU $FA61 | A9 19 + jsr ComputeOrDispatch_F98B ; PRG $3A63 | CPU $FA63 | 20 8B F9 + lda #$F0 ; PRG $3A66 | CPU $FA66 | A9 F0 + sta Ram_07B5 ; PRG $3A68 | CPU $FA68 | 8D B5 07 + lda #$FF ; PRG $3A6B | CPU $FA6B | A9 FF + bne UpdateApuChannelState_FA82 ; PRG $3A6D | CPU $FA6D | D0 13 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FA6 F. +; Local behavior: Reads Ram_07B5; mutates Ram_07B5. +; Parameters: Ram_07B5. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FA6F: + lda Ram_07B5 ; PRG $3A6F | CPU $FA6F | AD B5 07 + tay ; PRG $3A72 | CPU $FA72 | A8 + lsr a ; PRG $3A73 | CPU $FA73 | 4A + lsr a ; PRG $3A74 | CPU $FA74 | 4A + lsr a ; PRG $3A75 | CPU $FA75 | 4A + lsr a ; PRG $3A76 | CPU $FA76 | 4A + sta Ram_07B5 ; PRG $3A77 | CPU $FA77 | 8D B5 07 + tya ; PRG $3A7A | CPU $FA7A | 98 + clc ; PRG $3A7B | CPU $FA7B | 18 + sbc Ram_07B5 ; PRG $3A7C | CPU $FA7C | ED B5 07 +; ----------------------------------------------------------------------------- +; Global purpose: Update Ram 07 B5 FA7 F. +; Local behavior: Reads implicit CPU state or none observed; mutates Ram_07B5. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateRam_07B5_FA7F: + sta Ram_07B5 ; PRG $3A7F | CPU $FA7F | 8D B5 07 +; ----------------------------------------------------------------------------- +; Global purpose: Update Apu Channel State FA82. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateApuChannelState_FA82: + sta $400A ; PRG $3A82 | CPU $FA82 | 8D 0A 40 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FA85. +; Local behavior: Reads Ram_07B3, Flow_FA2F; mutates Ram_07B3, AudioSequenceDelay. +; Parameters: Ram_07B3, Flow_FA2F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FA85: + dec Ram_07B3 ; PRG $3A85 | CPU $FA85 | CE B3 07 + bne Flow_FA2F ; PRG $3A88 | CPU $FA88 | D0 A5 + lda #$00 ; PRG $3A8A | CPU $FA8A | A9 00 + sta AudioSequenceDelay ; PRG $3A8C | CPU $FA8C | 85 F2 + sta $4008 ; PRG $3A8E | CPU $FA8E | 8D 08 40 + beq Flow_FA2F ; PRG $3A91 | CPU $FA91 | F0 9C +; ----------------------------------------------------------------------------- +; Global purpose: Flow FA93. +; Local behavior: Reads ComputeOrDispatch_F98B, UpdateRam_07B5_FA7F; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_F98B, UpdateRam_07B5_FA7F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FA93: + lda #$18 ; PRG $3A93 | CPU $FA93 | A9 18 + jsr ComputeOrDispatch_F98B ; PRG $3A95 | CPU $FA95 | 20 8B F9 + lda #$50 ; PRG $3A98 | CPU $FA98 | A9 50 + bne UpdateRam_07B5_FA7F ; PRG $3A9A | CPU $FA9A | D0 E3 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FA9 C. +; Local behavior: Reads Ram_07B5, UpdateRam_07B5_FA7F; mutates no direct memory mutation observed. +; Parameters: Ram_07B5, UpdateRam_07B5_FA7F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FA9C: + lda Ram_07B5 ; PRG $3A9C | CPU $FA9C | AD B5 07 + clc ; PRG $3A9F | CPU $FA9F | 18 + adc #$02 ; PRG $3AA0 | CPU $FAA0 | 69 02 + bne UpdateRam_07B5_FA7F ; PRG $3AA2 | CPU $FAA2 | D0 DB +; ----------------------------------------------------------------------------- +; Global purpose: Flow FAA4. +; Local behavior: Reads ConfigureSoundChannel, StartSoundEffect, Flow_FA85, LookupTableEntry_FAF5; mutates no direct memory mutation observed. +; Parameters: ConfigureSoundChannel, StartSoundEffect, Flow_FA85, LookupTableEntry_FAF5. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FAA4: + lda #$04 ; PRG $3AA4 | CPU $FAA4 | A9 04 + ldx #$06 ; PRG $3AA6 | CPU $FAA6 | A2 06 + jsr ConfigureSoundChannel ; PRG $3AA8 | CPU $FAA8 | 20 8D F9 + lda #$72 ; PRG $3AAB | CPU $FAAB | A9 72 + ldx #$08 ; PRG $3AAD | CPU $FAAD | A2 08 + jsr StartSoundEffect ; PRG $3AAF | CPU $FAAF | 20 36 F8 + bne Flow_FA85 ; PRG $3AB2 | CPU $FAB2 | D0 D1 + bpl LookupTableEntry_FAF5 ; PRG $3AB4 | CPU $FAB4 | 10 3F + .byte $3F,$3F,$30,$3F,$30,$3F,$3F,$3F,$3F,$30,$30,$30,$3F,$3F,$3F,$3F ; PRG $3AB6 | CPU $FAB6 + .byte $30,$30,$3F,$3F,$30,$3F,$3F,$3F,$30,$3F,$3F,$30,$30,$30 ; PRG $3AC6 | CPU $FAC6 + +IndexedGameplayLookupTable_FAD4: + .byte $30,$3F,$0F,$0A,$0B,$0A,$0A,$0D,$0C,$0E,$0C,$0F,$0B,$0F,$0E,$0F ; PRG $3AD4 | CPU $FAD4 + .byte $0F,$0F,$0B,$0F,$0B,$0F,$0B,$0D,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F ; PRG $3AE4 | CPU $FAE4 + .byte $0F ; PRG $3AF4 | CPU $FAF4 + +; Relative branch target; this byte is also the final entry of the preceding lookup table. +LookupTableEntry_FAF5: + .byte $0F ; PRG $3AF5 | CPU $FAF5 + +IndexedGameplayLookupTable_FAF6: + .byte $00,$10,$31,$31,$31,$31,$32,$32,$32,$32,$33,$33,$33,$33,$34,$34 ; PRG $3AF6 | CPU $FAF6 + .byte $34,$34,$35,$35,$37,$37,$37,$3B,$3D,$3E,$3D,$3F,$3F,$3F,$3F,$3F ; PRG $3B06 | CPU $FB06 + .byte $3F ; PRG $3B16 | CPU $FB16 + +IndexedGameplayLookupTable_FB17: + .byte $3E,$3F,$02,$02,$02,$02,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03 ; PRG $3B17 | CPU $FB17 + .byte $03,$03,$04,$04,$04,$04,$04,$04,$04,$05,$05,$06,$08,$08,$06,$04 ; PRG $3B27 | CPU $FB27 + .byte $02,$00,$00 ; PRG $3B37 | CPU $FB37 +; ----------------------------------------------------------------------------- +; Global purpose: Compute Or Dispatch FB3 A. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +ComputeOrDispatch_FB3A: + ldx #$08 ; PRG $3B3A | CPU $FB3A | A2 08 +; ----------------------------------------------------------------------------- +; Global purpose: Update Apu Channel State FB3 C. +; Local behavior: Reads implicit CPU state or none observed; mutates AudioSequencePosition, Ram_07B6. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: sty AudioSequencePosition; sta Ram_07B6; rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateApuChannelState_FB3C: + stx $400F ; PRG $3B3C | CPU $FB3C | 8E 0F 40 + sty AudioSequencePosition ; PRG $3B3F | CPU $FB3F | 84 F3 + sta Ram_07B6 ; PRG $3B41 | CPU $FB41 | 8D B6 07 + rts ; PRG $3B44 | CPU $FB44 | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FB45. +; Local behavior: Reads ComputeOrDispatch_FB3A; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_FB3A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FB45: + lda #$21 ; PRG $3B45 | CPU $FB45 | A9 21 + jsr ComputeOrDispatch_FB3A ; PRG $3B47 | CPU $FB47 | 20 3A FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow FB4 A. +; Local behavior: Reads Ram_07B6, AudioSequenceIndexTable_FAB3, IndexedGameplayLookupTable_FAD4, Flow_FB63; mutates no direct memory mutation observed. +; Parameters: Ram_07B6, AudioSequenceIndexTable_FAB3, IndexedGameplayLookupTable_FAD4, Flow_FB63. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FB4A: + ldy Ram_07B6 ; PRG $3B4A | CPU $FB4A | AC B6 07 + ldx AudioSequenceIndexTable_FAB3,y ; PRG $3B4D | CPU $FB4D | BE B3 FA + lda IndexedGameplayLookupTable_FAD4,y ; PRG $3B50 | CPU $FB50 | B9 D4 FA + bne Flow_FB63 ; PRG $3B53 | CPU $FB53 | D0 0E +; ----------------------------------------------------------------------------- +; Global purpose: Flow FB55. +; Local behavior: Reads ComputeOrDispatch_FB3A; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_FB3A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FB55: + lda #$21 ; PRG $3B55 | CPU $FB55 | A9 21 + jsr ComputeOrDispatch_FB3A ; PRG $3B57 | CPU $FB57 | 20 3A FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow FB5 A. +; Local behavior: Reads Ram_07B6, IndexedGameplayLookupTable_FAF6, IndexedGameplayLookupTable_FB17; mutates no direct memory mutation observed. +; Parameters: Ram_07B6, IndexedGameplayLookupTable_FAF6, IndexedGameplayLookupTable_FB17. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FB5A: + ldy Ram_07B6 ; PRG $3B5A | CPU $FB5A | AC B6 07 + ldx IndexedGameplayLookupTable_FAF6,y ; PRG $3B5D | CPU $FB5D | BE F6 FA + lda IndexedGameplayLookupTable_FB17,y ; PRG $3B60 | CPU $FB60 | B9 17 FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow FB63. +; Local behavior: Reads Ram_07B6, Flow_FBBA; mutates Ram_07B6, AudioSequencePosition. +; Parameters: Ram_07B6, Flow_FBBA. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FB63: + stx $400C ; PRG $3B63 | CPU $FB63 | 8E 0C 40 + sta $400E ; PRG $3B66 | CPU $FB66 | 8D 0E 40 + dec Ram_07B6 ; PRG $3B69 | CPU $FB69 | CE B6 07 + bne Flow_FBBA ; PRG $3B6C | CPU $FB6C | D0 4C + lda #$00 ; PRG $3B6E | CPU $FB6E | A9 00 + sta AudioSequencePosition ; PRG $3B70 | CPU $FB70 | 85 F3 + beq Flow_FBBA ; PRG $3B72 | CPU $FB72 | F0 46 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FB74. +; Local behavior: Reads ComputeOrDispatch_FB3A; mutates no direct memory mutation observed. +; Parameters: ComputeOrDispatch_FB3A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FB74: + lda #$10 ; PRG $3B74 | CPU $FB74 | A9 10 + jsr ComputeOrDispatch_FB3A ; PRG $3B76 | CPU $FB76 | 20 3A FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow FB79. +; Local behavior: Reads Ram_07B6, Flow_FB86; mutates no direct memory mutation observed. +; Parameters: Ram_07B6, Flow_FB86. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FB79: + lda Ram_07B6 ; PRG $3B79 | CPU $FB79 | AD B6 07 + clc ; PRG $3B7C | CPU $FB7C | 18 + adc #$FF ; PRG $3B7D | CPU $FB7D | 69 FF + asl a ; PRG $3B7F | CPU $FB7F | 0A + cmp #$0F ; PRG $3B80 | CPU $FB80 | C9 0F + bcc Flow_FB86 ; PRG $3B82 | CPU $FB82 | 90 02 + lda #$0F ; PRG $3B84 | CPU $FB84 | A9 0F +; ----------------------------------------------------------------------------- +; Global purpose: Flow FB86. +; Local behavior: Reads Flow_FB63; mutates no direct memory mutation observed. +; Parameters: Flow_FB63. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FB86: + ora #$10 ; PRG $3B86 | CPU $FB86 | 09 10 + tax ; PRG $3B88 | CPU $FB88 | AA + lda #$0E ; PRG $3B89 | CPU $FB89 | A9 0E + bne Flow_FB63 ; PRG $3B8B | CPU $FB8B | D0 D6 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FB8 D. +; Local behavior: Reads UpdateApuChannelState_FB3C; mutates no direct memory mutation observed. +; Parameters: UpdateApuChannelState_FB3C. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FB8D: + lda #$05 ; PRG $3B8D | CPU $FB8D | A9 05 + ldx #$18 ; PRG $3B8F | CPU $FB8F | A2 18 + jsr UpdateApuChannelState_FB3C ; PRG $3B91 | CPU $FB91 | 20 3C FB +; ----------------------------------------------------------------------------- +; Global purpose: Flow FB94. +; Local behavior: Reads Flow_FB63; mutates no direct memory mutation observed. +; Parameters: Flow_FB63. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FB94: + ldx #$1B ; PRG $3B94 | CPU $FB94 | A2 1B + lda #$08 ; PRG $3B96 | CPU $FB96 | A9 08 + bne Flow_FB63 ; PRG $3B98 | CPU $FB98 | D0 C9 +; ----------------------------------------------------------------------------- +; Global purpose: Continuation FB9 A. +; Local behavior: Reads AudioPendingFlags, AudioSequencePosition, Flow_FB4A, Flow_FB45, Flow_FB55, Flow_FB5A, Flow_FB74, Flow_FB79; mutates AudioPendingFlags. +; Parameters: AudioPendingFlags, AudioSequencePosition, Flow_FB4A, Flow_FB45, Flow_FB55, Flow_FB5A, Flow_FB74, Flow_FB79. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Continuation_FB9A: + ldy AudioPendingFlags ; PRG $3B9A | CPU $FB9A | A4 FD + lda AudioSequencePosition ; PRG $3B9C | CPU $FB9C | A5 F3 + lsr a ; PRG $3B9E | CPU $FB9E | 4A + bcs Flow_FB4A ; PRG $3B9F | CPU $FB9F | B0 A9 + lsr AudioPendingFlags ; PRG $3BA1 | CPU $FBA1 | 46 FD + bcs Flow_FB45 ; PRG $3BA3 | CPU $FBA3 | B0 A0 + lsr AudioPendingFlags ; PRG $3BA5 | CPU $FBA5 | 46 FD + bcs Flow_FB55 ; PRG $3BA7 | CPU $FBA7 | B0 AC + lsr a ; PRG $3BA9 | CPU $FBA9 | 4A + bcs Flow_FB5A ; PRG $3BAA | CPU $FBAA | B0 AE + lsr AudioPendingFlags ; PRG $3BAC | CPU $FBAC | 46 FD + bcs Flow_FB74 ; PRG $3BAE | CPU $FBAE | B0 C4 + lsr a ; PRG $3BB0 | CPU $FBB0 | 4A + bcs Flow_FB79 ; PRG $3BB1 | CPU $FBB1 | B0 C6 + lsr a ; PRG $3BB3 | CPU $FBB3 | 4A + bcs Flow_FB94 ; PRG $3BB4 | CPU $FBB4 | B0 DE + lsr AudioPendingFlags ; PRG $3BB6 | CPU $FBB6 | 46 FD + bcs Flow_FB8D ; PRG $3BB8 | CPU $FBB8 | B0 D3 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FBBA. +; Local behavior: Reads AudioRequestFlags, Flow_FBC6, Flow_FBEB; mutates AudioEffectIndex. +; Parameters: AudioRequestFlags, Flow_FBC6, Flow_FBEB. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FBBA: + lda AudioRequestFlags ; PRG $3BBA | CPU $FBBA | A5 FB + beq Flow_FBC6 ; PRG $3BBC | CPU $FBBC | F0 08 + clc ; PRG $3BBE | CPU $FBBE | 18 + adc #$07 ; PRG $3BBF | CPU $FBBF | 69 07 + sta AudioEffectIndex ; PRG $3BC1 | CPU $FBC1 | 85 F5 + tay ; PRG $3BC3 | CPU $FBC3 | A8 + bne Flow_FBEB ; PRG $3BC4 | CPU $FBC4 | D0 25 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FBC6. +; Local behavior: Reads AudioEffectIndex, Flow_FC23, AudioModeOrEffectIndex, Flow_FBDF, Ram_07A8, Flow_FBDE; mutates Ram_07A8. +; Parameters: AudioEffectIndex, Flow_FC23, AudioModeOrEffectIndex, Flow_FBDF, Ram_07A8, Flow_FBDE. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FBC6: + lda AudioEffectIndex ; PRG $3BC6 | CPU $FBC6 | A5 F5 + bne Flow_FC23 ; PRG $3BC8 | CPU $FBC8 | D0 59 + lda AudioModeOrEffectIndex ; PRG $3BCA | CPU $FBCA | A5 FC + bne Flow_FBDF ; PRG $3BCC | CPU $FBCC | D0 11 + ldy Ram_07A8 ; PRG $3BCE | CPU $FBCE | AC A8 07 + beq Flow_FBDE ; PRG $3BD1 | CPU $FBD1 | F0 0B + sta Ram_07A8 ; PRG $3BD3 | CPU $FBD3 | 8D A8 07 +; ----------------------------------------------------------------------------- +; Global purpose: Update Apu Channel State FBD6. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateApuChannelState_FBD6: + lda #$90 ; PRG $3BD6 | CPU $FBD6 | A9 90 + sta $4000 ; PRG $3BD8 | CPU $FBD8 | 8D 00 40 + sta $4004 ; PRG $3BDB | CPU $FBDB | 8D 04 40 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FBDE. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FBDE: + rts ; PRG $3BDE | CPU $FBDE | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FBDF. +; Local behavior: Reads Ram_07A8, Flow_FC23; mutates no direct memory mutation observed. +; Parameters: Ram_07A8, Flow_FC23. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FBDF: + eor Ram_07A8 ; PRG $3BDF | CPU $FBDF | 4D A8 07 + beq Flow_FC23 ; PRG $3BE2 | CPU $FBE2 | F0 3F +; ----------------------------------------------------------------------------- +; Global purpose: Flow FBE4. +; Local behavior: Reads AudioModeOrEffectIndex, UpdateApuChannelState_FBD6; mutates Ram_07A8. +; Parameters: AudioModeOrEffectIndex, UpdateApuChannelState_FBD6. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FBE4: + ldy AudioModeOrEffectIndex ; PRG $3BE4 | CPU $FBE4 | A4 FC + beq UpdateApuChannelState_FBD6 ; PRG $3BE6 | CPU $FBE6 | F0 EE + sty Ram_07A8 ; PRG $3BE8 | CPU $FBE8 | 8C A8 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FBEB. +; Local behavior: Reads IndexedGameplayLookupTable_FDA4, IndexedGameplayLookupTable_FDA5, IndexedGameplayLookupTable_FDA6, IndexedGameplayLookupTable_FDA7, IndexedGameplayLookupTable_FDA8, IndexedGameplayLookupTable_FDA9, IndexedGameplayLookupTable_FDAA, IndexedGameplayLookupTable_FDAB; mutates AudioPeriodBase, AudioSequencePointerLo, AudioSequencePointerHi, AudioCommandValue, AudioEnvelopeOrSequenceIndex, Ram_07F0, Ram_07F4, AudioChannelStateArray. +; Parameters: IndexedGameplayLookupTable_FDA4, IndexedGameplayLookupTable_FDA5, IndexedGameplayLookupTable_FDA6, IndexedGameplayLookupTable_FDA7, IndexedGameplayLookupTable_FDA8, IndexedGameplayLookupTable_FDA9, IndexedGameplayLookupTable_FDAA, IndexedGameplayLookupTable_FDAB. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FBEB: + lda IndexedGameplayLookupTable_FDA4,y ; PRG $3BEB | CPU $FBEB | B9 A4 FD + tay ; PRG $3BEE | CPU $FBEE | A8 + lda IndexedGameplayLookupTable_FDA5,y ; PRG $3BEF | CPU $FBEF | B9 A5 FD + sta AudioPeriodBase ; PRG $3BF2 | CPU $FBF2 | 85 F7 + lda IndexedGameplayLookupTable_FDA6,y ; PRG $3BF4 | CPU $FBF4 | B9 A6 FD + sta AudioSequencePointerLo ; PRG $3BF7 | CPU $FBF7 | 85 F9 + lda IndexedGameplayLookupTable_FDA7,y ; PRG $3BF9 | CPU $FBF9 | B9 A7 FD + sta AudioSequencePointerHi ; PRG $3BFC | CPU $FBFC | 85 FA + lda IndexedGameplayLookupTable_FDA8,y ; PRG $3BFE | CPU $FBFE | B9 A8 FD + sta AudioCommandValue ; PRG $3C01 | CPU $FC01 | 85 F4 + lda IndexedGameplayLookupTable_FDA9,y ; PRG $3C03 | CPU $FC03 | B9 A9 FD + sta AudioEnvelopeOrSequenceIndex ; PRG $3C06 | CPU $FC06 | 85 F8 + lda IndexedGameplayLookupTable_FDAA,y ; PRG $3C08 | CPU $FC08 | B9 AA FD + sta Ram_07F0 ; PRG $3C0B | CPU $FC0B | 8D F0 07 + lda IndexedGameplayLookupTable_FDAB,y ; PRG $3C0E | CPU $FC0E | B9 AB FD + sta Ram_07F4 ; PRG $3C11 | CPU $FC11 | 8D F4 07 + lda #$00 ; PRG $3C14 | CPU $FC14 | A9 00 + sta AudioChannelStateArray ; PRG $3C16 | CPU $FC16 | 85 F0 + lda #$01 ; PRG $3C18 | CPU $FC18 | A9 01 + sta Ram_0792 ; PRG $3C1A | CPU $FC1A | 8D 92 07 + sta Ram_0796 ; PRG $3C1D | CPU $FC1D | 8D 96 07 + sta Ram_079A ; PRG $3C20 | CPU $FC20 | 8D 9A 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FC23. +; Local behavior: Reads Ram_0796, Flow_FC35, UpdateApuChannelState_FC6A; mutates Ram_0796. +; Parameters: Ram_0796, Flow_FC35, UpdateApuChannelState_FC6A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FC23: + dec Ram_0796 ; PRG $3C23 | CPU $FC23 | CE 96 07 + bne Flow_FC35 ; PRG $3C26 | CPU $FC26 | D0 0D + ldx #$04 ; PRG $3C28 | CPU $FC28 | A2 04 + jsr UpdateApuChannelState_FC6A ; PRG $3C2A | CPU $FC2A | 20 6A FC + bne Flow_FC35 ; PRG $3C2D | CPU $FC2D | D0 06 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FC2 F. +; Local behavior: Reads Flow_FBE4; mutates AudioEffectIndex, AudioEnvelopeOrSequenceIndex. +; Parameters: Flow_FBE4. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FC2F: + sta AudioEffectIndex ; PRG $3C2F | CPU $FC2F | 85 F5 + sta AudioEnvelopeOrSequenceIndex ; PRG $3C31 | CPU $FC31 | 85 F8 + beq Flow_FBE4 ; PRG $3C33 | CPU $FC33 | F0 AF +; ----------------------------------------------------------------------------- +; Global purpose: Flow FC35. +; Local behavior: Reads Ram_0792, Flow_FC41, UpdateApuChannelState_FC6A, Flow_FC2F; mutates Ram_0792. +; Parameters: Ram_0792, Flow_FC41, UpdateApuChannelState_FC6A, Flow_FC2F. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FC35: + dec Ram_0792 ; PRG $3C35 | CPU $FC35 | CE 92 07 + bne Flow_FC41 ; PRG $3C38 | CPU $FC38 | D0 07 + ldx #$00 ; PRG $3C3A | CPU $FC3A | A2 00 + jsr UpdateApuChannelState_FC6A ; PRG $3C3C | CPU $FC3C | 20 6A FC + beq Flow_FC2F ; PRG $3C3F | CPU $FC3F | F0 EE +; ----------------------------------------------------------------------------- +; Global purpose: Flow FC41. +; Local behavior: Reads AudioEnvelopeOrSequenceIndex, Flow_FC5D, Ram_079A, UpdateApuChannelState_FC6A, Flow_FC5A; mutates Ram_079A. +; Parameters: AudioEnvelopeOrSequenceIndex, Flow_FC5D, Ram_079A, UpdateApuChannelState_FC6A, Flow_FC5A. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FC41: + ldy AudioEnvelopeOrSequenceIndex ; PRG $3C41 | CPU $FC41 | A4 F8 + beq Flow_FC5D ; PRG $3C43 | CPU $FC43 | F0 18 + dec Ram_079A ; PRG $3C45 | CPU $FC45 | CE 9A 07 + bne Flow_FC5D ; PRG $3C48 | CPU $FC48 | D0 13 + ldx #$08 ; PRG $3C4A | CPU $FC4A | A2 08 + jsr UpdateApuChannelState_FC6A ; PRG $3C4C | CPU $FC4C | 20 6A FC + clc ; PRG $3C4F | CPU $FC4F | 18 + adc #$FF ; PRG $3C50 | CPU $FC50 | 69 FF + asl a ; PRG $3C52 | CPU $FC52 | 0A + asl a ; PRG $3C53 | CPU $FC53 | 0A + cmp #$38 ; PRG $3C54 | CPU $FC54 | C9 38 + bcc Flow_FC5A ; PRG $3C56 | CPU $FC56 | 90 02 + lda #$38 ; PRG $3C58 | CPU $FC58 | A9 38 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FC5 A. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FC5A: + sta $4008 ; PRG $3C5A | CPU $FC5A | 8D 08 40 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FC5 D. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: rts. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FC5D: + rts ; PRG $3C5D | CPU $FC5D | 60 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FC5 E. +; Local behavior: Reads AudioPeriodBase, IndexedGameplayLookupTable_FFC3; mutates Ram_0790. +; Parameters: AudioPeriodBase, IndexedGameplayLookupTable_FFC3. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FC5E: + and #$07 ; PRG $3C5E | CPU $FC5E | 29 07 + clc ; PRG $3C60 | CPU $FC60 | 18 + adc AudioPeriodBase ; PRG $3C61 | CPU $FC61 | 65 F7 + tay ; PRG $3C63 | CPU $FC63 | A8 + lda IndexedGameplayLookupTable_FFC3,y ; PRG $3C64 | CPU $FC64 | B9 C3 FF + sta Ram_0790,x ; PRG $3C67 | CPU $FC67 | 9D 90 07 +; ----------------------------------------------------------------------------- +; Global purpose: Update Apu Channel State FC6 A. +; Local behavior: Reads AudioChannelStateArray, AudioSequencePointerLo, Flow_FC5E, Flow_FC92, Flow_FC89, AudioFrameCounter, Flow_FC8C, Ram_07F0; mutates AudioChannelStateArray. +; Parameters: AudioChannelStateArray, AudioSequencePointerLo, Flow_FC5E, Flow_FC92, Flow_FC89, AudioFrameCounter, Flow_FC8C, Ram_07F0. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +UpdateApuChannelState_FC6A: + ldy AudioChannelStateArray,x ; PRG $3C6A | CPU $FC6A | B4 F0 + inc AudioChannelStateArray,x ; PRG $3C6C | CPU $FC6C | F6 F0 + lda (AudioSequencePointerLo),y ; PRG $3C6E | CPU $FC6E | B1 F9 + bmi Flow_FC5E ; PRG $3C70 | CPU $FC70 | 30 EC + beq Flow_FC92 ; PRG $3C72 | CPU $FC72 | F0 1E + cpx #$08 ; PRG $3C74 | CPU $FC74 | E0 08 + beq Flow_FC89 ; PRG $3C76 | CPU $FC76 | F0 11 + ldy AudioFrameCounter ; PRG $3C78 | CPU $FC78 | A4 F1 + bne Flow_FC8C ; PRG $3C7A | CPU $FC7A | D0 10 + pha ; PRG $3C7C | CPU $FC7C | 48 + lda Ram_07F0,x ; PRG $3C7D | CPU $FC7D | BD F0 07 + sta $4000,x ; PRG $3C80 | CPU $FC80 | 9D 00 40 + lda #$7F ; PRG $3C83 | CPU $FC83 | A9 7F + sta $4001,x ; PRG $3C85 | CPU $FC85 | 9D 01 40 + pla ; PRG $3C88 | CPU $FC88 | 68 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FC89. +; Local behavior: Reads StartSoundEffect; mutates no direct memory mutation observed. +; Parameters: StartSoundEffect. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FC89: + jsr StartSoundEffect ; PRG $3C89 | CPU $FC89 | 20 36 F8 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FC8 C. +; Local behavior: Reads Ram_0790; mutates Ram_0792. +; Parameters: Ram_0790. +; Returns: continues or transfers control; no independent return. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FC8C: + lda Ram_0790,x ; PRG $3C8C | CPU $FC8C | BD 90 07 + sta Ram_0792,x ; PRG $3C8F | CPU $FC8F | 9D 92 07 +; ----------------------------------------------------------------------------- +; Global purpose: Flow FC92. +; Local behavior: Reads implicit CPU state or none observed; mutates no direct memory mutation observed. +; Parameters: implicit CPU state or none observed. +; Returns: returns to caller; flags/register result depends on final instructions: .byte $7E,$42,$52,$7E,$4C,$7E,$44,$3A,$7E,$44,$7E,$52,$7E,$4C,$44,$3A; .byte $7E,$44,$4A,$86,$7E,$81,$7E,$62,$6E,$84,$68,$62,$64,$83,$6E,$6A; .byte $68. +; Clobbers: Determined by the instructions below; refined in Pass 3. +; ----------------------------------------------------------------------------- +Flow_FC92: + rts ; PRG $3C92 | CPU $FC92 | 60 + .byte $80,$48,$7E,$60,$7E,$52,$7E,$52,$00,$80,$48,$7E,$48,$7E,$60,$7E ; PRG $3C93 | CPU $FC93 + .byte $60,$80,$60,$56,$60,$56,$60,$56,$60,$83,$56,$00,$80,$7E,$7E,$5E ; PRG $3CA3 | CPU $FCA3 + .byte $56,$5A,$50,$64,$50,$7E,$5E,$56,$5A,$50,$4C,$50,$00,$80,$7E,$7E ; PRG $3CB3 | CPU $FCB3 + .byte $5C,$54,$58,$4E,$4A,$4E,$7E,$5C,$54,$58,$4E,$4A,$4E,$80,$56,$58 ; PRG $3CC3 | CPU $FCC3 + .byte $84,$7E,$7E,$81,$7E,$7E,$83,$08,$16,$82,$12,$10,$80,$1C,$10,$1C ; PRG $3CD3 | CPU $FCD3 + .byte $02,$1C,$10,$1C,$02,$1C,$00,$81,$7E,$83,$20,$2E,$82,$2A,$28,$80 ; PRG $3CE3 | CPU $FCE3 + .byte $34,$28,$34,$28,$34,$28,$34,$28,$34,$7E,$7E,$83,$4E,$4C,$4A,$48 ; PRG $3CF3 | CPU $FCF3 + .byte $46,$44,$44,$85,$7E,$81,$3A,$83,$3C,$85,$3C,$81,$3A,$83,$3C,$3C ; PRG $3D03 | CPU $FD03 + .byte $46,$82,$3C,$36,$83,$2E,$7E,$00,$83,$46,$44,$42,$40,$3E,$3C,$3A ; PRG $3D13 | CPU $FD13 + .byte $85,$7E,$81,$2A,$83,$2C,$85,$2E,$81,$30,$83,$32,$2C,$3C,$82,$36 ; PRG $3D23 | CPU $FD23 + .byte $46,$83,$24,$7E,$84,$7E,$7E,$7E,$7E,$82,$54,$5C,$58,$5E,$5C,$62 ; PRG $3D33 | CPU $FD33 + .byte $6C,$54,$66,$5E,$54,$50,$84,$4E,$81,$5A,$7E,$50,$7E,$4A,$42,$7E ; PRG $3D43 | CPU $FD43 + .byte $4A,$7E,$5A,$7E,$50,$4A,$42,$7E,$4A,$5A,$7E,$52,$7E,$4C,$44,$7E ; PRG $3D53 | CPU $FD53 + .byte $4C,$7E,$5A,$7E,$52,$4C,$44,$7E,$4C,$50,$86,$7E,$81,$7E,$68,$62 ; PRG $3D63 | CPU $FD63 + .byte $00,$81,$50,$7E,$4A,$7E,$42,$38,$7E,$42,$7E,$50,$7E,$4A,$42,$38 ; PRG $3D73 | CPU $FD73 + .byte $7E,$42,$52,$7E,$4C,$7E,$44,$3A,$7E,$44,$7E,$52,$7E,$4C,$44,$3A ; PRG $3D83 | CPU $FD83 + .byte $7E,$44,$4A,$86,$7E,$81,$7E,$62,$6E,$84,$68,$62,$64,$83,$6E,$6A ; PRG $3D93 | CPU $FD93 + .byte $68 ; PRG $3DA3 | CPU $FDA3 + +IndexedGameplayLookupTable_FDA4: + .byte $7E ; PRG $3DA4 | CPU $FDA4 + +IndexedGameplayLookupTable_FDA5: + .byte $0F ; PRG $3DA5 | CPU $FDA5 + +IndexedGameplayLookupTable_FDA6: + .byte $16 ; PRG $3DA6 | CPU $FDA6 + +IndexedGameplayLookupTable_FDA7: + .byte $0F ; PRG $3DA7 | CPU $FDA7 + +IndexedGameplayLookupTable_FDA8: + .byte $1D ; PRG $3DA8 | CPU $FDA8 + +IndexedGameplayLookupTable_FDA9: + .byte $24 ; PRG $3DA9 | CPU $FDA9 + +IndexedGameplayLookupTable_FDAA: + .byte $2B ; PRG $3DAA | CPU $FDAA + +IndexedGameplayLookupTable_FDAB: + .byte $24,$32,$39,$40,$47,$4E,$4E,$55,$55,$08,$01,$FE,$02,$00,$14,$94 ; PRG $3DAB | CPU $FDAB + .byte $08,$55,$FE,$42,$00,$81,$01,$00,$B8,$FE,$02,$00,$1B,$9B,$10,$CC ; PRG $3DBB | CPU $FDBB + .byte $FE,$63,$00,$84,$04,$08,$60,$FF,$32,$00,$00,$80,$00,$93,$FC,$09 ; PRG $3DCB | CPU $FDCB + .byte $00,$81,$53,$18,$A4,$FC,$00,$00,$84,$90,$10,$AF,$FC,$11,$21,$80 ; PRG $3DDB | CPU $FDDB + .byte $00,$18,$D6,$FC,$14,$14,$1F,$5F,$00,$FE,$FC,$1D,$39,$80,$00,$08 ; PRG $3DEB | CPU $FDEB + .byte $4B,$FD,$29,$51,$80,$00,$80,$7E,$81,$34,$32,$30,$2E,$2C,$2A,$28 ; PRG $3DFB | CPU $FDFB + .byte $26,$2A,$28,$26,$24,$22,$24,$26,$28,$2A,$28,$26,$24,$22,$24,$26 ; PRG $3E0B | CPU $FE0B + .byte $28,$2A,$28,$26,$24,$22,$24,$26,$28,$2A,$28,$26,$24,$22,$24,$26 ; PRG $3E1B | CPU $FE1B + .byte $28,$2A,$2C,$2E,$30,$32,$34,$36,$38,$34,$32,$30,$2E,$2C,$2E,$30 ; PRG $3E2B | CPU $FE2B + .byte $32,$34,$32,$30,$2E,$2C,$2E,$30,$32,$34,$32,$30,$2E,$2C,$2E,$30 ; PRG $3E3B | CPU $FE3B + .byte $32,$34,$32,$30,$2E,$2C,$2E,$30,$32,$00,$81,$28,$7E,$32,$7E,$36 ; PRG $3E4B | CPU $FE4B + .byte $32,$7E,$3C,$7E,$7E,$3A,$7E,$36,$32,$7E,$7E,$28,$7E,$32,$7E,$36 ; PRG $3E5B | CPU $FE5B + .byte $32,$7E,$3C,$7E,$7E,$3A,$7E,$36,$32,$7E,$7E,$2A,$7E,$34,$7E,$38 ; PRG $3E6B | CPU $FE6B + .byte $34,$7E,$3E,$7E,$7E,$3C,$7E,$38,$34,$7E,$7E,$2A,$7E,$34,$7E,$38 ; PRG $3E7B | CPU $FE7B + .byte $34,$7E,$3E,$7E,$7E,$3C,$7E,$38,$34,$7E,$7E,$00,$82,$1A,$22,$0A ; PRG $3E8B | CPU $FE8B + .byte $22,$1E,$24,$14,$2C,$1A,$22,$0A,$22,$1E,$24,$14,$2C,$1C,$24,$0C ; PRG $3E9B | CPU $FE9B + .byte $24,$20,$26,$16,$2E,$1C,$24,$0C,$24,$20,$26,$16,$2E,$81,$7E,$82 ; PRG $3EAB | CPU $FEAB + .byte $50,$48,$4E,$46,$4C,$44,$4A,$42,$48,$40,$46,$3E,$44,$3C,$42,$3A ; PRG $3EBB | CPU $FEBB + .byte $00,$80,$42,$3C,$42,$7E,$3C,$34,$3C,$7E,$42,$3C,$42,$7E,$46,$3E ; PRG $3ECB | CPU $FECB + .byte $46,$7E,$42,$3C,$42,$7E,$3C,$34,$3C,$7E,$42,$3C,$42,$3C,$42,$3C ; PRG $3EDB | CPU $FEDB + .byte $42,$3C,$3E,$38,$3E,$7E,$38,$30,$38,$7E,$3E,$38,$3E,$7E,$42,$3A ; PRG $3EEB | CPU $FEEB + .byte $42,$7E,$3E,$38,$3E,$7E,$38,$30,$38,$7E,$3E,$38,$3E,$38,$3E,$38 ; PRG $3EFB | CPU $FEFB + .byte $3E,$38,$81,$5A,$54,$4C,$42,$3E,$3C,$38,$34,$38,$3C,$42,$46,$4C ; PRG $3F0B | CPU $FF0B + .byte $50,$54,$5A,$56,$50,$48,$3E,$3A,$38,$34,$38,$3E,$48,$4C,$50,$56 ; PRG $3F1B | CPU $FF1B + .byte $5A,$60,$5A,$00,$82,$1C,$16,$12,$16,$1C,$16,$12,$16,$18,$12,$0E ; PRG $3F2B | CPU $FF2B + .byte $12,$18,$12,$0E,$12,$34,$2E,$2A,$26,$24,$20,$1C,$20,$30,$20,$22 ; PRG $3F3B | CPU $FF3B + .byte $24 ; PRG $3F4B | CPU $FF4B + +GameplayConstantTable_FF4C: + .byte $26,$2A,$2E,$30,$34,$1C,$20,$24,$2A,$2E,$34,$38,$30,$18,$1C,$20 ; PRG $3F4C | CPU $FF4C + .byte $26,$2A,$30,$34,$81,$50,$7E,$4C,$48,$7E,$44,$40,$7E,$44,$48,$7E ; PRG $3F5C | CPU $FF5C + .byte $4C,$50,$7E,$4C,$48,$7E,$44,$40,$7E,$44,$48,$7E,$4C,$58,$7E,$54 ; PRG $3F6C | CPU $FF6C + .byte $50,$7E,$4C,$48,$7E,$4C,$50,$7E,$54,$58,$7E,$54,$50,$7E,$4C,$48 ; PRG $3F7C | CPU $FF7C + .byte $7E,$4C,$50,$7E,$54,$00,$81,$44,$7E,$40,$54,$7E,$38,$34,$7E,$38 ; PRG $3F8C | CPU $FF8C + .byte $54,$7E,$40,$44,$7E,$40,$54,$7E,$38,$34,$7E,$38,$54,$7E,$40,$4C ; PRG $3F9C | CPU $FF9C + .byte $7E,$48,$44,$7E,$40,$3C,$7E,$40,$44,$7E,$48,$4C,$7E,$48,$44,$7E ; PRG $3FAC | CPU $FFAC + .byte $40,$3C,$7E,$40,$44,$7E,$48 ; PRG $3FBC | CPU $FFBC + +IndexedGameplayLookupTable_FFC3: + .byte $02,$04,$08,$10,$20,$0C,$18,$06,$03,$06,$0C,$18,$30,$12,$24,$09 ; PRG $3FC3 | CPU $FFC3 + .byte $04,$08,$10,$20,$40,$18,$30,$0C,$05,$0A,$14,$28,$50,$1E,$3C ; PRG $3FD3 | CPU $FFD3 + +IndexedGameplayLookupTable_FFE2: + .byte $5C ; PRG $3FE2 | CPU $FFE2 + +IndexedGameplayLookupTable_FFE3: + .byte $0D,$9C,$0C,$E6,$0B,$3C,$0B,$9A,$0A,$02,$0A,$72,$09,$EA,$08,$6A ; PRG $3FE3 | CPU $FFE3 + .byte $08,$F0,$07,$7E,$07,$12,$07 ; PRG $3FF3 | CPU $FFF3 + +.segment "VECTORS" + .word NmiHandler ; PRG $3FFA | CPU $FFFA | 8D C0 + .word ResetHandler ; PRG $3FFC | CPU $FFFC | 00 C0 + .word ResetHandler ; PRG $3FFE | CPU $FFFE | 00 C0 diff --git a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/symbols.inc b/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/symbols.inc new file mode 100644 index 0000000..76ddb55 --- /dev/null +++ b/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/symbols.inc @@ -0,0 +1,12 @@ +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 +OAMDMA = $4014 +SND_CHN = $4015 +JOY1 = $4016 +JOY2 = $4017 diff --git a/_wip/Donkey Kong 3 (JUE)/chr.bin b/_wip/Donkey Kong 3 (JUE)/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..87b88f5156476c5f42ed6dc89c73d07fb6805da4 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/_wip/Donkey Kong 3 (JUE)/dk3.nes.txt b/_wip/Donkey Kong 3 (JUE)/dk3.nes.txt new file mode 100644 index 0000000000000000000000000000000000000000..7b683e6c5dd4112beb75746baba24bfc2b1933da GIT binary patch literal 24592 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 N>6jbDXZ5r2{|AK9O