From 9aef41042458c4effeb03eeaa6334c2e5fa19221 Mon Sep 17 00:00:00 2001 From: Trevor Merritt Date: Fri, 16 Oct 2026 13:20:30 -0400 Subject: [PATCH] Promotes Donkey Kong Jr Adds remaining NROM as _wip Update gitignore to not keep object files Adds AGENTS.md as this is an AI helped project --- .gitignore | 4 +- AGENTS.md | 36 + Balloon Fight (JU)/copilot/reconstructed.lbl | 905 + Balloon Fight (JU)/copilot/reconstructed.map | 32 + Balloon Fight (JU)/copilot/reconstructed.nes | Bin 0 -> 24592 bytes Baseball (UE)/copilot/chr.o | Bin 12596 -> 0 bytes Baseball (UE)/copilot/header.o | Bin 336 -> 0 bytes Baseball (UE)/copilot/prg.o | Bin 209979 -> 0 bytes Baseball (UE)/copilot/prg.s | 16 +- Bomberman (U)/copilot/chr.o | Bin 53833 -> 0 bytes Bomberman (U)/copilot/header.o | Bin 3118 -> 0 bytes Bomberman (U)/copilot/prg.o | Bin 161659 -> 0 bytes Burger Time (U)/copilot/chr.o | Bin 12596 -> 0 bytes Burger Time (U)/copilot/header.o | Bin 336 -> 0 bytes Burger Time (U)/copilot/prg.o | Bin 181701 -> 0 bytes Clu Clu Land (JU) | 1 - Clu Clu Land (JU)/OVERVIEW.md | 320 + Clu Clu Land (JU)/copilot/Makefile | 25 + Clu Clu Land (JU)/copilot/Prompt.md | 5 + Clu Clu Land (JU)/copilot/chr.bin | Bin 0 -> 8192 bytes Clu Clu Land (JU)/copilot/chr.s | 2 + Clu Clu Land (JU)/copilot/header.bin | Bin 0 -> 16 bytes Clu Clu Land (JU)/copilot/header.s | 2 + Clu Clu Land (JU)/copilot/linker.cfg | 10 + Clu Clu Land (JU)/copilot/locals.inc | 231 + Clu Clu Land (JU)/copilot/prg.bin | Bin 0 -> 16384 bytes Clu Clu Land (JU)/copilot/prg.s | 9150 +++++++++++ Clu Clu Land (JU)/copilot/reconstructed.lbl | 770 + Clu Clu Land (JU)/copilot/reconstructed.map | 32 + Clu Clu Land (JU)/copilot/reconstructed.nes | Bin 0 -> 24592 bytes .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes Clu Clu Land (JU)/copilot/rom.nes | 1 + Clu Clu Land (JU)/copilot/symbols.inc | 35 + Clu Clu Land (JU)/rom.nes | Bin 0 -> 24592 bytes Defender 2 (U)/copilot/chr.o | Bin 12596 -> 0 bytes Defender 2 (U)/copilot/header.o | Bin 336 -> 0 bytes Defender 2 (U)/copilot/prg.o | Bin 212738 -> 0 bytes .../Donkey Kong 3 (JUE).nes | Bin .../chr.bin | Bin Donkey Kong 3 (JUE)/copilot/Makefile | 25 + Donkey Kong 3 (JUE)/copilot/chr.bin | Bin 0 -> 8192 bytes Donkey Kong 3 (JUE)/copilot/chr.s | 2 + Donkey Kong 3 (JUE)/copilot/header.s | 2 + Donkey Kong 3 (JUE)/copilot/linker.cfg | 10 + .../copilot}/locals.inc | 22 +- .../copilot}/prg.s | 346 +- Donkey Kong 3 (JUE)/copilot/reconstructed.lbl | 697 + Donkey Kong 3 (JUE)/copilot/reconstructed.map | 32 + .../copilot/reconstructed.nes | Bin 24592 -> 24592 bytes Donkey Kong 3 (JUE)/copilot/rom.nes | 1 + .../copilot}/symbols.inc | 0 .../header.bin | Bin .../Donkey Kong Jr. (JU).nes | Bin Donkey Kong Jr. (JU)/OVERVIEW.md | 324 + .../copilot/Donkey Kong Jr. (JU).nes | Bin 0 -> 24592 bytes Donkey Kong Jr. (JU)/copilot/Makefile | 29 + Donkey Kong Jr. (JU)/copilot/chr.s | 8 + Donkey Kong Jr. (JU)/copilot/header.s | 2 + Donkey Kong Jr. (JU)/copilot/linker.cfg | 10 + Donkey Kong Jr. (JU)/copilot/locals.inc | 272 + Donkey Kong Jr. (JU)/copilot/prg.s | 13634 ++++++++++++++++ .../copilot/reconstructed.lbl | 1035 ++ .../copilot/reconstructed.map | 32 + .../copilot/reconstructed.nes | Bin 0 -> 24592 bytes Donkey Kong Jr. (JU)/copilot/rom.nes | Bin 0 -> 24592 bytes Donkey Kong Jr. (JU)/copilot/symbols.inc | 54 + Excitebike (JU)/copilot/chr.o | Bin 12596 -> 0 bytes Excitebike (JU)/copilot/header.o | Bin 336 -> 0 bytes Excitebike (JU)/copilot/prg.o | Bin 211433 -> 0 bytes OVERVIEW.md | 67 +- PROMPTS.md | 4 +- Pac-Man (USA) (Namco)/copilot/chr.o | Bin 12596 -> 0 bytes Pac-Man (USA) (Namco)/copilot/header.o | Bin 336 -> 0 bytes Pac-Man (USA) (Namco)/copilot/prg.o | Bin 183348 -> 0 bytes README.md | 7 - Tennis (JU)/copilot/chr.o | Bin 12596 -> 0 bytes Tennis (JU)/copilot/header.o | Bin 336 -> 0 bytes Tennis (JU)/copilot/prg.o | Bin 193601 -> 0 bytes _ROMS/Wild Gunman (U).nes | Bin 24592 -> 0 bytes {_ROMS => _wip/CIRCUS}/CIRCUS.NES | Bin _wip/CIRCUS/OVERVIEW.md | 53 + _wip/CIRCUS/copilot/Makefile | 10 + _wip/CIRCUS/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/CIRCUS/copilot/header.bin | Bin 0 -> 16 bytes _wip/CIRCUS/copilot/linker.cfg | 6 + _wip/CIRCUS/copilot/locals.inc | 2 + _wip/CIRCUS/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/CIRCUS/copilot/prg.s | 12 + _wip/CIRCUS/copilot/reconstructed.lbl | 0 _wip/CIRCUS/copilot/reconstructed.map | 26 + _wip/CIRCUS/copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/CIRCUS/copilot/symbols.inc | 108 + .../Donkey Kong (JU)}/Donkey Kong (JU).nes | Bin _wip/Donkey Kong (JU)/OVERVIEW.md | 55 + _wip/Donkey Kong (JU)/copilot/Makefile | 10 + _wip/Donkey Kong (JU)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Donkey Kong (JU)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Donkey Kong (JU)/copilot/linker.cfg | 6 + _wip/Donkey Kong (JU)/copilot/locals.inc | 2 + _wip/Donkey Kong (JU)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Donkey Kong (JU)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Donkey Kong (JU)/copilot/symbols.inc | 108 + .../Makefile | 9 - .../DonkeyKong3_ZeroPageSemanticNames/chr.o | Bin 12582 -> 0 bytes .../DonkeyKong3_ZeroPageSemanticNames/chr.s | 2 - .../DonkeyKong3_ZeroPageSemanticNames/dk3.nes | Bin 24592 -> 0 bytes .../header.o | Bin 322 -> 0 bytes .../header.s | 2 - .../linker.cfg | 2 - .../DonkeyKong3_ZeroPageSemanticNames/prg.o | Bin 131573 -> 0 bytes .../Donkey Kong Jr. Math (U).nes | Bin _wip/Donkey Kong Jr. Math (U)/OVERVIEW.md | 53 + .../Donkey Kong Jr. Math (U)/copilot/Makefile | 10 + _wip/Donkey Kong Jr. Math (U)/copilot/chr.bin | Bin 0 -> 8192 bytes .../copilot/header.bin | Bin 0 -> 16 bytes .../copilot/linker.cfg | 6 + .../copilot/locals.inc | 2 + _wip/Donkey Kong Jr. Math (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Donkey Kong Jr. Math (U)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes .../copilot/symbols.inc | 108 + .../Duck Hunt (JUE)}/Duck Hunt (JUE).nes | Bin _wip/Duck Hunt (JUE)/OVERVIEW.md | 53 + _wip/Duck Hunt (JUE)/copilot/Makefile | 10 + _wip/Duck Hunt (JUE)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Duck Hunt (JUE)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Duck Hunt (JUE)/copilot/linker.cfg | 6 + _wip/Duck Hunt (JUE)/copilot/locals.inc | 2 + _wip/Duck Hunt (JUE)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Duck Hunt (JUE)/copilot/prg.s | 12 + .../Duck Hunt (JUE)/copilot/reconstructed.lbl | 0 .../Duck Hunt (JUE)/copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Duck Hunt (JUE)/copilot/symbols.inc | 108 + {_ROMS => _wip/Golf (JU)}/Golf (JU).nes | Bin _wip/Golf (JU)/OVERVIEW.md | 53 + _wip/Golf (JU)/copilot/Makefile | 10 + _wip/Golf (JU)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Golf (JU)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Golf (JU)/copilot/linker.cfg | 6 + _wip/Golf (JU)/copilot/locals.inc | 2 + _wip/Golf (JU)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Golf (JU)/copilot/prg.s | 12 + _wip/Golf (JU)/copilot/reconstructed.lbl | 0 _wip/Golf (JU)/copilot/reconstructed.map | 26 + _wip/Golf (JU)/copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Golf (JU)/copilot/symbols.inc | 108 + .../Hogan's Alley (JU).nes | Bin _wip/Hogan's Alley (JU)/OVERVIEW.md | 53 + _wip/Hogan's Alley (JU)/copilot/Makefile | 10 + _wip/Hogan's Alley (JU)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Hogan's Alley (JU)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Hogan's Alley (JU)/copilot/linker.cfg | 6 + _wip/Hogan's Alley (JU)/copilot/locals.inc | 2 + _wip/Hogan's Alley (JU)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Hogan's Alley (JU)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Hogan's Alley (JU)/copilot/symbols.inc | 108 + .../Ice Climber (JE)}/Ice Climber (JE).nes | Bin _wip/Ice Climber (JE)/OVERVIEW.md | 55 + _wip/Ice Climber (JE)/copilot/Makefile | 10 + _wip/Ice Climber (JE)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Ice Climber (JE)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Ice Climber (JE)/copilot/linker.cfg | 6 + _wip/Ice Climber (JE)/copilot/locals.inc | 2 + _wip/Ice Climber (JE)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Ice Climber (JE)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Ice Climber (JE)/copilot/symbols.inc | 108 + .../Ice Climber (U)}/Ice Climber (U).nes | Bin _wip/Ice Climber (U)/OVERVIEW.md | 55 + _wip/Ice Climber (U)/copilot/Makefile | 10 + _wip/Ice Climber (U)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Ice Climber (U)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Ice Climber (U)/copilot/linker.cfg | 6 + _wip/Ice Climber (U)/copilot/locals.inc | 2 + _wip/Ice Climber (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Ice Climber (U)/copilot/prg.s | 12 + .../Ice Climber (U)/copilot/reconstructed.lbl | 0 .../Ice Climber (U)/copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Ice Climber (U)/copilot/symbols.inc | 108 + .../Joypad Test Cartridge (U).nes | Bin _wip/Joypad Test Cartridge (U)/OVERVIEW.md | 53 + .../copilot/Makefile | 10 + .../Joypad Test Cartridge (U)/copilot/chr.bin | Bin 0 -> 8192 bytes .../copilot/header.bin | Bin 0 -> 16 bytes .../copilot/linker.cfg | 6 + .../copilot/locals.inc | 2 + .../Joypad Test Cartridge (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Joypad Test Cartridge (U)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes .../copilot/symbols.inc | 108 + .../Lode Runner (U)}/Lode Runner (U).nes | Bin _wip/Lode Runner (U)/OVERVIEW.md | 53 + _wip/Lode Runner (U)/copilot/Makefile | 10 + _wip/Lode Runner (U)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Lode Runner (U)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Lode Runner (U)/copilot/linker.cfg | 6 + _wip/Lode Runner (U)/copilot/locals.inc | 2 + _wip/Lode Runner (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Lode Runner (U)/copilot/prg.s | 12 + .../Lode Runner (U)/copilot/reconstructed.lbl | 0 .../Lode Runner (U)/copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Lode Runner (U)/copilot/symbols.inc | 108 + .../Lunar Pool (U)}/Lunar Pool (U).nes | Bin _wip/Lunar Pool (U)/OVERVIEW.md | 53 + _wip/Lunar Pool (U)/copilot/Makefile | 10 + _wip/Lunar Pool (U)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Lunar Pool (U)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Lunar Pool (U)/copilot/linker.cfg | 6 + _wip/Lunar Pool (U)/copilot/locals.inc | 2 + _wip/Lunar Pool (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Lunar Pool (U)/copilot/prg.s | 12 + _wip/Lunar Pool (U)/copilot/reconstructed.lbl | 0 _wip/Lunar Pool (U)/copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Lunar Pool (U)/copilot/symbols.inc | 108 + .../MUSCLE (U)}/M.U.S.C.L.E. (U).nes | Bin _wip/MUSCLE (U)/OVERVIEW.md | 53 + _wip/MUSCLE (U)/copilot/Makefile | 10 + _wip/MUSCLE (U)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/MUSCLE (U)/copilot/header.bin | Bin 0 -> 16 bytes _wip/MUSCLE (U)/copilot/linker.cfg | 6 + _wip/MUSCLE (U)/copilot/locals.inc | 2 + _wip/MUSCLE (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/MUSCLE (U)/copilot/prg.s | 12 + _wip/MUSCLE (U)/copilot/reconstructed.lbl | 0 _wip/MUSCLE (U)/copilot/reconstructed.map | 26 + _wip/MUSCLE (U)/copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/MUSCLE (U)/copilot/symbols.inc | 108 + .../Mario Bros (JU)}/Mario Bros (JU).nes | Bin _wip/Mario Bros (JU)/OVERVIEW.md | 53 + _wip/Mario Bros (JU)/copilot/Makefile | 10 + _wip/Mario Bros (JU)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Mario Bros (JU)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Mario Bros (JU)/copilot/linker.cfg | 6 + _wip/Mario Bros (JU)/copilot/locals.inc | 2 + _wip/Mario Bros (JU)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Mario Bros (JU)/copilot/prg.s | 12 + .../Mario Bros (JU)/copilot/reconstructed.lbl | 0 .../Mario Bros (JU)/copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Mario Bros (JU)/copilot/symbols.inc | 108 + .../Millipede (U)}/Millipede (U).nes | Bin _wip/Millipede (U)/OVERVIEW.md | 53 + _wip/Millipede (U)/copilot/Makefile | 10 + _wip/Millipede (U)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Millipede (U)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Millipede (U)/copilot/linker.cfg | 6 + _wip/Millipede (U)/copilot/locals.inc | 2 + _wip/Millipede (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Millipede (U)/copilot/prg.s | 12 + _wip/Millipede (U)/copilot/reconstructed.lbl | 0 _wip/Millipede (U)/copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Millipede (U)/copilot/symbols.inc | 108 + .../NES PowerPad Test Cart (U) [!].nes | Bin _wip/NES PowerPad Test Card (U)/OVERVIEW.md | 53 + .../copilot/Makefile | 10 + .../copilot/chr.bin | Bin 0 -> 8192 bytes .../copilot/header.bin | Bin 0 -> 16 bytes .../copilot/linker.cfg | 6 + .../copilot/locals.inc | 2 + .../copilot/prg.bin | Bin 0 -> 16384 bytes _wip/NES PowerPad Test Card (U)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes .../copilot/symbols.inc | 108 + _wip/Pac-Man (Tengen) (U)/OVERVIEW.md | 55 + .../Pac-Man (Tengen) (U) [!].nes | Bin _wip/Pac-Man (Tengen) (U)/copilot/Makefile | 10 + _wip/Pac-Man (Tengen) (U)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Pac-Man (Tengen) (U)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Pac-Man (Tengen) (U)/copilot/linker.cfg | 6 + _wip/Pac-Man (Tengen) (U)/copilot/locals.inc | 2 + _wip/Pac-Man (Tengen) (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Pac-Man (Tengen) (U)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Pac-Man (Tengen) (U)/copilot/symbols.inc | 108 + _wip/Pac-Man (U)/OVERVIEW.md | 55 + .../Pac-Man (U)}/Pac-Man (U) [!].nes | Bin _wip/Pac-Man (U)/copilot/Makefile | 10 + _wip/Pac-Man (U)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Pac-Man (U)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Pac-Man (U)/copilot/linker.cfg | 6 + _wip/Pac-Man (U)/copilot/locals.inc | 2 + _wip/Pac-Man (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Pac-Man (U)/copilot/prg.s | 12 + _wip/Pac-Man (U)/copilot/reconstructed.lbl | 0 _wip/Pac-Man (U)/copilot/reconstructed.map | 26 + .../Pac-Man (U)/copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Pac-Man (U)/copilot/symbols.inc | 108 + _wip/Pinball (JU)/OVERVIEW.md | 53 + {_ROMS => _wip/Pinball (JU)}/Pinball (JU).nes | Bin _wip/Pinball (JU)/copilot/Makefile | 10 + _wip/Pinball (JU)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Pinball (JU)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Pinball (JU)/copilot/linker.cfg | 6 + _wip/Pinball (JU)/copilot/locals.inc | 2 + _wip/Pinball (JU)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Pinball (JU)/copilot/prg.s | 12 + _wip/Pinball (JU)/copilot/reconstructed.lbl | 0 _wip/Pinball (JU)/copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Pinball (JU)/copilot/symbols.inc | 108 + _wip/Popeye (JU) (PRG 0)/OVERVIEW.md | 55 + .../Popeye (JU) (PRG 0).nes | Bin _wip/Popeye (JU) (PRG 0)/copilot/Makefile | 10 + _wip/Popeye (JU) (PRG 0)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Popeye (JU) (PRG 0)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Popeye (JU) (PRG 0)/copilot/linker.cfg | 6 + _wip/Popeye (JU) (PRG 0)/copilot/locals.inc | 2 + .../Popeye (JU) (PRG 0)/copilot/prg.bin | Bin 24719 -> 16384 bytes _wip/Popeye (JU) (PRG 0)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Popeye (JU) (PRG 0)/copilot/symbols.inc | 108 + _wip/Popeye (JU) (PRG 1)/OVERVIEW.md | 55 + .../Popeye (JU) (PRG 1) [!].nes | Bin _wip/Popeye (JU) (PRG 1)/copilot/Makefile | 10 + _wip/Popeye (JU) (PRG 1)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Popeye (JU) (PRG 1)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Popeye (JU) (PRG 1)/copilot/linker.cfg | 6 + _wip/Popeye (JU) (PRG 1)/copilot/locals.inc | 2 + _wip/Popeye (JU) (PRG 1)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Popeye (JU) (PRG 1)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Popeye (JU) (PRG 1)/copilot/symbols.inc | 108 + _wip/Pyramid (U)/OVERVIEW.md | 53 + .../Pyramid (U)}/Pyramid (U) (Sachen).nes | Bin _wip/Pyramid (U)/copilot/Makefile | 10 + _wip/Pyramid (U)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Pyramid (U)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Pyramid (U)/copilot/linker.cfg | 6 + _wip/Pyramid (U)/copilot/locals.inc | 2 + _wip/Pyramid (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Pyramid (U)/copilot/prg.s | 12 + _wip/Pyramid (U)/copilot/reconstructed.lbl | 0 _wip/Pyramid (U)/copilot/reconstructed.map | 26 + .../Pyramid (U)/copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Pyramid (U)/copilot/symbols.inc | 108 + .../OVERVIEW.md | 55 + .../Raid on Bungeling Bay (U) [a2].nes | Bin .../copilot/Makefile | 10 + .../copilot/chr.bin | Bin 0 -> 8192 bytes .../copilot/header.bin | Bin 0 -> 16 bytes .../copilot/linker.cfg | 6 + .../copilot/locals.inc | 2 + .../copilot/prg.bin | Bin 0 -> 16384 bytes .../copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes .../copilot/symbols.inc | 108 + _wip/Raid on Bungeling Bay (U)/OVERVIEW.md | 53 + .../Raid on Bungeling Bay (U).nes | Bin .../copilot/Makefile | 10 + .../Raid on Bungeling Bay (U)/copilot/chr.bin | Bin 0 -> 8192 bytes .../copilot/header.bin | Bin 0 -> 16 bytes .../copilot/linker.cfg | 6 + .../copilot/locals.inc | 2 + .../Raid on Bungeling Bay (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Raid on Bungeling Bay (U)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes .../copilot/symbols.inc | 108 + _wip/Urban Champion (JU)/OVERVIEW.md | 53 + .../Urban Champion (JU).nes | Bin _wip/Urban Champion (JU)/copilot/Makefile | 10 + _wip/Urban Champion (JU)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Urban Champion (JU)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Urban Champion (JU)/copilot/linker.cfg | 6 + _wip/Urban Champion (JU)/copilot/locals.inc | 2 + _wip/Urban Champion (JU)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Urban Champion (JU)/copilot/prg.s | 12 + .../copilot/reconstructed.lbl | 0 .../copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Urban Champion (JU)/copilot/symbols.inc | 108 + _wip/Wild Gunman (U)/OVERVIEW.md | 53 + .../Wild Gunman (U)}/Wild Gunman (U) [!].nes | Bin _wip/Wild Gunman (U)/copilot/Makefile | 10 + _wip/Wild Gunman (U)/copilot/chr.bin | Bin 0 -> 8192 bytes _wip/Wild Gunman (U)/copilot/header.bin | Bin 0 -> 16 bytes _wip/Wild Gunman (U)/copilot/linker.cfg | 6 + _wip/Wild Gunman (U)/copilot/locals.inc | 2 + _wip/Wild Gunman (U)/copilot/prg.bin | Bin 0 -> 16384 bytes _wip/Wild Gunman (U)/copilot/prg.s | 12 + .../Wild Gunman (U)/copilot/reconstructed.lbl | 0 .../Wild Gunman (U)/copilot/reconstructed.map | 26 + .../copilot/reconstructed_prg.bin | Bin 0 -> 16384 bytes _wip/Wild Gunman (U)/copilot/symbols.inc | 108 + 412 files changed, 33427 insertions(+), 221 deletions(-) create mode 100644 AGENTS.md create mode 100644 Balloon Fight (JU)/copilot/reconstructed.lbl create mode 100644 Balloon Fight (JU)/copilot/reconstructed.map create mode 100644 Balloon Fight (JU)/copilot/reconstructed.nes delete mode 100644 Baseball (UE)/copilot/chr.o delete mode 100644 Baseball (UE)/copilot/header.o delete mode 100644 Baseball (UE)/copilot/prg.o delete mode 100644 Bomberman (U)/copilot/chr.o delete mode 100644 Bomberman (U)/copilot/header.o delete mode 100644 Bomberman (U)/copilot/prg.o delete mode 100644 Burger Time (U)/copilot/chr.o delete mode 100644 Burger Time (U)/copilot/header.o delete mode 100644 Burger Time (U)/copilot/prg.o delete mode 160000 Clu Clu Land (JU) create mode 100644 Clu Clu Land (JU)/OVERVIEW.md create mode 100644 Clu Clu Land (JU)/copilot/Makefile create mode 100644 Clu Clu Land (JU)/copilot/Prompt.md create mode 100644 Clu Clu Land (JU)/copilot/chr.bin create mode 100644 Clu Clu Land (JU)/copilot/chr.s create mode 100644 Clu Clu Land (JU)/copilot/header.bin create mode 100644 Clu Clu Land (JU)/copilot/header.s create mode 100644 Clu Clu Land (JU)/copilot/linker.cfg create mode 100644 Clu Clu Land (JU)/copilot/locals.inc create mode 100644 Clu Clu Land (JU)/copilot/prg.bin create mode 100644 Clu Clu Land (JU)/copilot/prg.s create mode 100644 Clu Clu Land (JU)/copilot/reconstructed.lbl create mode 100644 Clu Clu Land (JU)/copilot/reconstructed.map create mode 100644 Clu Clu Land (JU)/copilot/reconstructed.nes create mode 100644 Clu Clu Land (JU)/copilot/reconstructed_prg.bin create mode 120000 Clu Clu Land (JU)/copilot/rom.nes create mode 100644 Clu Clu Land (JU)/copilot/symbols.inc create mode 100644 Clu Clu Land (JU)/rom.nes delete mode 100644 Defender 2 (U)/copilot/chr.o delete mode 100644 Defender 2 (U)/copilot/header.o delete mode 100644 Defender 2 (U)/copilot/prg.o rename {_wip/Donkey Kong 3 (JUE) => Donkey Kong 3 (JUE)}/Donkey Kong 3 (JUE).nes (100%) rename {_wip/Donkey Kong 3 (JUE) => Donkey Kong 3 (JUE)}/chr.bin (100%) create mode 100644 Donkey Kong 3 (JUE)/copilot/Makefile create mode 100644 Donkey Kong 3 (JUE)/copilot/chr.bin create mode 100644 Donkey Kong 3 (JUE)/copilot/chr.s create mode 100644 Donkey Kong 3 (JUE)/copilot/header.s create mode 100644 Donkey Kong 3 (JUE)/copilot/linker.cfg rename {_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames => Donkey Kong 3 (JUE)/copilot}/locals.inc (95%) rename {_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames => Donkey Kong 3 (JUE)/copilot}/prg.s (97%) create mode 100644 Donkey Kong 3 (JUE)/copilot/reconstructed.lbl create mode 100644 Donkey Kong 3 (JUE)/copilot/reconstructed.map rename _wip/Donkey Kong 3 (JUE)/dk3.nes.txt => Donkey Kong 3 (JUE)/copilot/reconstructed.nes (99%) create mode 120000 Donkey Kong 3 (JUE)/copilot/rom.nes rename {_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames => Donkey Kong 3 (JUE)/copilot}/symbols.inc (100%) rename {_wip/Donkey Kong 3 (JUE) => Donkey Kong 3 (JUE)}/header.bin (100%) rename {_ROMS => Donkey Kong Jr. (JU)}/Donkey Kong Jr. (JU).nes (100%) create mode 100644 Donkey Kong Jr. (JU)/OVERVIEW.md create mode 100644 Donkey Kong Jr. (JU)/copilot/Donkey Kong Jr. (JU).nes create mode 100644 Donkey Kong Jr. (JU)/copilot/Makefile create mode 100644 Donkey Kong Jr. (JU)/copilot/chr.s create mode 100644 Donkey Kong Jr. (JU)/copilot/header.s create mode 100644 Donkey Kong Jr. (JU)/copilot/linker.cfg create mode 100644 Donkey Kong Jr. (JU)/copilot/locals.inc create mode 100644 Donkey Kong Jr. (JU)/copilot/prg.s create mode 100644 Donkey Kong Jr. (JU)/copilot/reconstructed.lbl create mode 100644 Donkey Kong Jr. (JU)/copilot/reconstructed.map create mode 100644 Donkey Kong Jr. (JU)/copilot/reconstructed.nes create mode 100644 Donkey Kong Jr. (JU)/copilot/rom.nes create mode 100644 Donkey Kong Jr. (JU)/copilot/symbols.inc delete mode 100644 Excitebike (JU)/copilot/chr.o delete mode 100644 Excitebike (JU)/copilot/header.o delete mode 100644 Excitebike (JU)/copilot/prg.o delete mode 100644 Pac-Man (USA) (Namco)/copilot/chr.o delete mode 100644 Pac-Man (USA) (Namco)/copilot/header.o delete mode 100644 Pac-Man (USA) (Namco)/copilot/prg.o delete mode 100644 Tennis (JU)/copilot/chr.o delete mode 100644 Tennis (JU)/copilot/header.o delete mode 100644 Tennis (JU)/copilot/prg.o delete mode 100644 _ROMS/Wild Gunman (U).nes rename {_ROMS => _wip/CIRCUS}/CIRCUS.NES (100%) create mode 100644 _wip/CIRCUS/OVERVIEW.md create mode 100644 _wip/CIRCUS/copilot/Makefile create mode 100644 _wip/CIRCUS/copilot/chr.bin create mode 100644 _wip/CIRCUS/copilot/header.bin create mode 100644 _wip/CIRCUS/copilot/linker.cfg create mode 100644 _wip/CIRCUS/copilot/locals.inc create mode 100644 _wip/CIRCUS/copilot/prg.bin create mode 100644 _wip/CIRCUS/copilot/prg.s create mode 100644 _wip/CIRCUS/copilot/reconstructed.lbl create mode 100644 _wip/CIRCUS/copilot/reconstructed.map create mode 100644 _wip/CIRCUS/copilot/reconstructed_prg.bin create mode 100644 _wip/CIRCUS/copilot/symbols.inc rename {_ROMS => _wip/Donkey Kong (JU)}/Donkey Kong (JU).nes (100%) create mode 100644 _wip/Donkey Kong (JU)/OVERVIEW.md create mode 100644 _wip/Donkey Kong (JU)/copilot/Makefile create mode 100644 _wip/Donkey Kong (JU)/copilot/chr.bin create mode 100644 _wip/Donkey Kong (JU)/copilot/header.bin create mode 100644 _wip/Donkey Kong (JU)/copilot/linker.cfg create mode 100644 _wip/Donkey Kong (JU)/copilot/locals.inc create mode 100644 _wip/Donkey Kong (JU)/copilot/prg.bin create mode 100644 _wip/Donkey Kong (JU)/copilot/prg.s create mode 100644 _wip/Donkey Kong (JU)/copilot/reconstructed.lbl create mode 100644 _wip/Donkey Kong (JU)/copilot/reconstructed.map create mode 100644 _wip/Donkey Kong (JU)/copilot/reconstructed_prg.bin create mode 100644 _wip/Donkey Kong (JU)/copilot/symbols.inc delete mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/Makefile delete mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.o delete mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.s delete mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/dk3.nes delete mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/header.o delete mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/header.s delete mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/linker.cfg delete mode 100644 _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/prg.o rename {_ROMS => _wip/Donkey Kong Jr. Math (U)}/Donkey Kong Jr. Math (U).nes (100%) create mode 100644 _wip/Donkey Kong Jr. Math (U)/OVERVIEW.md create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/Makefile create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/chr.bin create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/header.bin create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/linker.cfg create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/locals.inc create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/prg.bin create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/prg.s create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/reconstructed.lbl create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/reconstructed.map create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Donkey Kong Jr. Math (U)/copilot/symbols.inc rename {_ROMS => _wip/Duck Hunt (JUE)}/Duck Hunt (JUE).nes (100%) create mode 100644 _wip/Duck Hunt (JUE)/OVERVIEW.md create mode 100644 _wip/Duck Hunt (JUE)/copilot/Makefile create mode 100644 _wip/Duck Hunt (JUE)/copilot/chr.bin create mode 100644 _wip/Duck Hunt (JUE)/copilot/header.bin create mode 100644 _wip/Duck Hunt (JUE)/copilot/linker.cfg create mode 100644 _wip/Duck Hunt (JUE)/copilot/locals.inc create mode 100644 _wip/Duck Hunt (JUE)/copilot/prg.bin create mode 100644 _wip/Duck Hunt (JUE)/copilot/prg.s create mode 100644 _wip/Duck Hunt (JUE)/copilot/reconstructed.lbl create mode 100644 _wip/Duck Hunt (JUE)/copilot/reconstructed.map create mode 100644 _wip/Duck Hunt (JUE)/copilot/reconstructed_prg.bin create mode 100644 _wip/Duck Hunt (JUE)/copilot/symbols.inc rename {_ROMS => _wip/Golf (JU)}/Golf (JU).nes (100%) create mode 100644 _wip/Golf (JU)/OVERVIEW.md create mode 100644 _wip/Golf (JU)/copilot/Makefile create mode 100644 _wip/Golf (JU)/copilot/chr.bin create mode 100644 _wip/Golf (JU)/copilot/header.bin create mode 100644 _wip/Golf (JU)/copilot/linker.cfg create mode 100644 _wip/Golf (JU)/copilot/locals.inc create mode 100644 _wip/Golf (JU)/copilot/prg.bin create mode 100644 _wip/Golf (JU)/copilot/prg.s create mode 100644 _wip/Golf (JU)/copilot/reconstructed.lbl create mode 100644 _wip/Golf (JU)/copilot/reconstructed.map create mode 100644 _wip/Golf (JU)/copilot/reconstructed_prg.bin create mode 100644 _wip/Golf (JU)/copilot/symbols.inc rename {_ROMS => _wip/Hogan's Alley (JU)}/Hogan's Alley (JU).nes (100%) create mode 100644 _wip/Hogan's Alley (JU)/OVERVIEW.md create mode 100644 _wip/Hogan's Alley (JU)/copilot/Makefile create mode 100644 _wip/Hogan's Alley (JU)/copilot/chr.bin create mode 100644 _wip/Hogan's Alley (JU)/copilot/header.bin create mode 100644 _wip/Hogan's Alley (JU)/copilot/linker.cfg create mode 100644 _wip/Hogan's Alley (JU)/copilot/locals.inc create mode 100644 _wip/Hogan's Alley (JU)/copilot/prg.bin create mode 100644 _wip/Hogan's Alley (JU)/copilot/prg.s create mode 100644 _wip/Hogan's Alley (JU)/copilot/reconstructed.lbl create mode 100644 _wip/Hogan's Alley (JU)/copilot/reconstructed.map create mode 100644 _wip/Hogan's Alley (JU)/copilot/reconstructed_prg.bin create mode 100644 _wip/Hogan's Alley (JU)/copilot/symbols.inc rename {_ROMS => _wip/Ice Climber (JE)}/Ice Climber (JE).nes (100%) create mode 100644 _wip/Ice Climber (JE)/OVERVIEW.md create mode 100644 _wip/Ice Climber (JE)/copilot/Makefile create mode 100644 _wip/Ice Climber (JE)/copilot/chr.bin create mode 100644 _wip/Ice Climber (JE)/copilot/header.bin create mode 100644 _wip/Ice Climber (JE)/copilot/linker.cfg create mode 100644 _wip/Ice Climber (JE)/copilot/locals.inc create mode 100644 _wip/Ice Climber (JE)/copilot/prg.bin create mode 100644 _wip/Ice Climber (JE)/copilot/prg.s create mode 100644 _wip/Ice Climber (JE)/copilot/reconstructed.lbl create mode 100644 _wip/Ice Climber (JE)/copilot/reconstructed.map create mode 100644 _wip/Ice Climber (JE)/copilot/reconstructed_prg.bin create mode 100644 _wip/Ice Climber (JE)/copilot/symbols.inc rename {_ROMS => _wip/Ice Climber (U)}/Ice Climber (U).nes (100%) create mode 100644 _wip/Ice Climber (U)/OVERVIEW.md create mode 100644 _wip/Ice Climber (U)/copilot/Makefile create mode 100644 _wip/Ice Climber (U)/copilot/chr.bin create mode 100644 _wip/Ice Climber (U)/copilot/header.bin create mode 100644 _wip/Ice Climber (U)/copilot/linker.cfg create mode 100644 _wip/Ice Climber (U)/copilot/locals.inc create mode 100644 _wip/Ice Climber (U)/copilot/prg.bin create mode 100644 _wip/Ice Climber (U)/copilot/prg.s create mode 100644 _wip/Ice Climber (U)/copilot/reconstructed.lbl create mode 100644 _wip/Ice Climber (U)/copilot/reconstructed.map create mode 100644 _wip/Ice Climber (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Ice Climber (U)/copilot/symbols.inc rename {_ROMS => _wip/Joypad Test Cartridge (U)}/Joypad Test Cartridge (U).nes (100%) create mode 100644 _wip/Joypad Test Cartridge (U)/OVERVIEW.md create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/Makefile create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/chr.bin create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/header.bin create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/linker.cfg create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/locals.inc create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/prg.bin create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/prg.s create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/reconstructed.lbl create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/reconstructed.map create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Joypad Test Cartridge (U)/copilot/symbols.inc rename {_ROMS => _wip/Lode Runner (U)}/Lode Runner (U).nes (100%) create mode 100644 _wip/Lode Runner (U)/OVERVIEW.md create mode 100644 _wip/Lode Runner (U)/copilot/Makefile create mode 100644 _wip/Lode Runner (U)/copilot/chr.bin create mode 100644 _wip/Lode Runner (U)/copilot/header.bin create mode 100644 _wip/Lode Runner (U)/copilot/linker.cfg create mode 100644 _wip/Lode Runner (U)/copilot/locals.inc create mode 100644 _wip/Lode Runner (U)/copilot/prg.bin create mode 100644 _wip/Lode Runner (U)/copilot/prg.s create mode 100644 _wip/Lode Runner (U)/copilot/reconstructed.lbl create mode 100644 _wip/Lode Runner (U)/copilot/reconstructed.map create mode 100644 _wip/Lode Runner (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Lode Runner (U)/copilot/symbols.inc rename {_ROMS => _wip/Lunar Pool (U)}/Lunar Pool (U).nes (100%) create mode 100644 _wip/Lunar Pool (U)/OVERVIEW.md create mode 100644 _wip/Lunar Pool (U)/copilot/Makefile create mode 100644 _wip/Lunar Pool (U)/copilot/chr.bin create mode 100644 _wip/Lunar Pool (U)/copilot/header.bin create mode 100644 _wip/Lunar Pool (U)/copilot/linker.cfg create mode 100644 _wip/Lunar Pool (U)/copilot/locals.inc create mode 100644 _wip/Lunar Pool (U)/copilot/prg.bin create mode 100644 _wip/Lunar Pool (U)/copilot/prg.s create mode 100644 _wip/Lunar Pool (U)/copilot/reconstructed.lbl create mode 100644 _wip/Lunar Pool (U)/copilot/reconstructed.map create mode 100644 _wip/Lunar Pool (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Lunar Pool (U)/copilot/symbols.inc rename {_ROMS => _wip/MUSCLE (U)}/M.U.S.C.L.E. (U).nes (100%) create mode 100644 _wip/MUSCLE (U)/OVERVIEW.md create mode 100644 _wip/MUSCLE (U)/copilot/Makefile create mode 100644 _wip/MUSCLE (U)/copilot/chr.bin create mode 100644 _wip/MUSCLE (U)/copilot/header.bin create mode 100644 _wip/MUSCLE (U)/copilot/linker.cfg create mode 100644 _wip/MUSCLE (U)/copilot/locals.inc create mode 100644 _wip/MUSCLE (U)/copilot/prg.bin create mode 100644 _wip/MUSCLE (U)/copilot/prg.s create mode 100644 _wip/MUSCLE (U)/copilot/reconstructed.lbl create mode 100644 _wip/MUSCLE (U)/copilot/reconstructed.map create mode 100644 _wip/MUSCLE (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/MUSCLE (U)/copilot/symbols.inc rename {_ROMS => _wip/Mario Bros (JU)}/Mario Bros (JU).nes (100%) create mode 100644 _wip/Mario Bros (JU)/OVERVIEW.md create mode 100644 _wip/Mario Bros (JU)/copilot/Makefile create mode 100644 _wip/Mario Bros (JU)/copilot/chr.bin create mode 100644 _wip/Mario Bros (JU)/copilot/header.bin create mode 100644 _wip/Mario Bros (JU)/copilot/linker.cfg create mode 100644 _wip/Mario Bros (JU)/copilot/locals.inc create mode 100644 _wip/Mario Bros (JU)/copilot/prg.bin create mode 100644 _wip/Mario Bros (JU)/copilot/prg.s create mode 100644 _wip/Mario Bros (JU)/copilot/reconstructed.lbl create mode 100644 _wip/Mario Bros (JU)/copilot/reconstructed.map create mode 100644 _wip/Mario Bros (JU)/copilot/reconstructed_prg.bin create mode 100644 _wip/Mario Bros (JU)/copilot/symbols.inc rename {_ROMS => _wip/Millipede (U)}/Millipede (U).nes (100%) create mode 100644 _wip/Millipede (U)/OVERVIEW.md create mode 100644 _wip/Millipede (U)/copilot/Makefile create mode 100644 _wip/Millipede (U)/copilot/chr.bin create mode 100644 _wip/Millipede (U)/copilot/header.bin create mode 100644 _wip/Millipede (U)/copilot/linker.cfg create mode 100644 _wip/Millipede (U)/copilot/locals.inc create mode 100644 _wip/Millipede (U)/copilot/prg.bin create mode 100644 _wip/Millipede (U)/copilot/prg.s create mode 100644 _wip/Millipede (U)/copilot/reconstructed.lbl create mode 100644 _wip/Millipede (U)/copilot/reconstructed.map create mode 100644 _wip/Millipede (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Millipede (U)/copilot/symbols.inc rename {_ROMS => _wip/NES PowerPad Test Card (U)}/NES PowerPad Test Cart (U) [!].nes (100%) create mode 100644 _wip/NES PowerPad Test Card (U)/OVERVIEW.md create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/Makefile create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/chr.bin create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/header.bin create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/linker.cfg create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/locals.inc create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/prg.bin create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/prg.s create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/reconstructed.lbl create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/reconstructed.map create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/NES PowerPad Test Card (U)/copilot/symbols.inc create mode 100644 _wip/Pac-Man (Tengen) (U)/OVERVIEW.md rename {_ROMS => _wip/Pac-Man (Tengen) (U)}/Pac-Man (Tengen) (U) [!].nes (100%) create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/Makefile create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/chr.bin create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/header.bin create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/linker.cfg create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/locals.inc create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/prg.bin create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/prg.s create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/reconstructed.lbl create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/reconstructed.map create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Pac-Man (Tengen) (U)/copilot/symbols.inc create mode 100644 _wip/Pac-Man (U)/OVERVIEW.md rename {_ROMS => _wip/Pac-Man (U)}/Pac-Man (U) [!].nes (100%) create mode 100644 _wip/Pac-Man (U)/copilot/Makefile create mode 100644 _wip/Pac-Man (U)/copilot/chr.bin create mode 100644 _wip/Pac-Man (U)/copilot/header.bin create mode 100644 _wip/Pac-Man (U)/copilot/linker.cfg create mode 100644 _wip/Pac-Man (U)/copilot/locals.inc create mode 100644 _wip/Pac-Man (U)/copilot/prg.bin create mode 100644 _wip/Pac-Man (U)/copilot/prg.s create mode 100644 _wip/Pac-Man (U)/copilot/reconstructed.lbl create mode 100644 _wip/Pac-Man (U)/copilot/reconstructed.map create mode 100644 _wip/Pac-Man (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Pac-Man (U)/copilot/symbols.inc create mode 100644 _wip/Pinball (JU)/OVERVIEW.md rename {_ROMS => _wip/Pinball (JU)}/Pinball (JU).nes (100%) create mode 100644 _wip/Pinball (JU)/copilot/Makefile create mode 100644 _wip/Pinball (JU)/copilot/chr.bin create mode 100644 _wip/Pinball (JU)/copilot/header.bin create mode 100644 _wip/Pinball (JU)/copilot/linker.cfg create mode 100644 _wip/Pinball (JU)/copilot/locals.inc create mode 100644 _wip/Pinball (JU)/copilot/prg.bin create mode 100644 _wip/Pinball (JU)/copilot/prg.s create mode 100644 _wip/Pinball (JU)/copilot/reconstructed.lbl create mode 100644 _wip/Pinball (JU)/copilot/reconstructed.map create mode 100644 _wip/Pinball (JU)/copilot/reconstructed_prg.bin create mode 100644 _wip/Pinball (JU)/copilot/symbols.inc create mode 100644 _wip/Popeye (JU) (PRG 0)/OVERVIEW.md rename {_ROMS => _wip/Popeye (JU) (PRG 0)}/Popeye (JU) (PRG 0).nes (100%) create mode 100644 _wip/Popeye (JU) (PRG 0)/copilot/Makefile create mode 100644 _wip/Popeye (JU) (PRG 0)/copilot/chr.bin create mode 100644 _wip/Popeye (JU) (PRG 0)/copilot/header.bin create mode 100644 _wip/Popeye (JU) (PRG 0)/copilot/linker.cfg create mode 100644 _wip/Popeye (JU) (PRG 0)/copilot/locals.inc rename _ROMS/Popeye (JU) (PRG 0) [a1].nes => _wip/Popeye (JU) (PRG 0)/copilot/prg.bin (61%) create mode 100644 _wip/Popeye (JU) (PRG 0)/copilot/prg.s create mode 100644 _wip/Popeye (JU) (PRG 0)/copilot/reconstructed.lbl create mode 100644 _wip/Popeye (JU) (PRG 0)/copilot/reconstructed.map create mode 100644 _wip/Popeye (JU) (PRG 0)/copilot/reconstructed_prg.bin create mode 100644 _wip/Popeye (JU) (PRG 0)/copilot/symbols.inc create mode 100644 _wip/Popeye (JU) (PRG 1)/OVERVIEW.md rename {_ROMS => _wip/Popeye (JU) (PRG 1)}/Popeye (JU) (PRG 1) [!].nes (100%) create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/Makefile create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/chr.bin create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/header.bin create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/linker.cfg create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/locals.inc create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/prg.bin create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/prg.s create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/reconstructed.lbl create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/reconstructed.map create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/reconstructed_prg.bin create mode 100644 _wip/Popeye (JU) (PRG 1)/copilot/symbols.inc create mode 100644 _wip/Pyramid (U)/OVERVIEW.md rename {_ROMS => _wip/Pyramid (U)}/Pyramid (U) (Sachen).nes (100%) create mode 100644 _wip/Pyramid (U)/copilot/Makefile create mode 100644 _wip/Pyramid (U)/copilot/chr.bin create mode 100644 _wip/Pyramid (U)/copilot/header.bin create mode 100644 _wip/Pyramid (U)/copilot/linker.cfg create mode 100644 _wip/Pyramid (U)/copilot/locals.inc create mode 100644 _wip/Pyramid (U)/copilot/prg.bin create mode 100644 _wip/Pyramid (U)/copilot/prg.s create mode 100644 _wip/Pyramid (U)/copilot/reconstructed.lbl create mode 100644 _wip/Pyramid (U)/copilot/reconstructed.map create mode 100644 _wip/Pyramid (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Pyramid (U)/copilot/symbols.inc create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/OVERVIEW.md rename {_ROMS => _wip/Raid on Bungeling Bay (U) [a2]}/Raid on Bungeling Bay (U) [a2].nes (100%) create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/Makefile create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/chr.bin create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/header.bin create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/linker.cfg create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/locals.inc create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/prg.bin create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/prg.s create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/reconstructed.lbl create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/reconstructed.map create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/reconstructed_prg.bin create mode 100644 _wip/Raid on Bungeling Bay (U) [a2]/copilot/symbols.inc create mode 100644 _wip/Raid on Bungeling Bay (U)/OVERVIEW.md rename {_ROMS => _wip/Raid on Bungeling Bay (U)}/Raid on Bungeling Bay (U).nes (100%) create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/Makefile create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/chr.bin create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/header.bin create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/linker.cfg create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/locals.inc create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/prg.bin create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/prg.s create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/reconstructed.lbl create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/reconstructed.map create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Raid on Bungeling Bay (U)/copilot/symbols.inc create mode 100644 _wip/Urban Champion (JU)/OVERVIEW.md rename {_ROMS => _wip/Urban Champion (JU)}/Urban Champion (JU).nes (100%) create mode 100644 _wip/Urban Champion (JU)/copilot/Makefile create mode 100644 _wip/Urban Champion (JU)/copilot/chr.bin create mode 100644 _wip/Urban Champion (JU)/copilot/header.bin create mode 100644 _wip/Urban Champion (JU)/copilot/linker.cfg create mode 100644 _wip/Urban Champion (JU)/copilot/locals.inc create mode 100644 _wip/Urban Champion (JU)/copilot/prg.bin create mode 100644 _wip/Urban Champion (JU)/copilot/prg.s create mode 100644 _wip/Urban Champion (JU)/copilot/reconstructed.lbl create mode 100644 _wip/Urban Champion (JU)/copilot/reconstructed.map create mode 100644 _wip/Urban Champion (JU)/copilot/reconstructed_prg.bin create mode 100644 _wip/Urban Champion (JU)/copilot/symbols.inc create mode 100644 _wip/Wild Gunman (U)/OVERVIEW.md rename {_ROMS => _wip/Wild Gunman (U)}/Wild Gunman (U) [!].nes (100%) create mode 100644 _wip/Wild Gunman (U)/copilot/Makefile create mode 100644 _wip/Wild Gunman (U)/copilot/chr.bin create mode 100644 _wip/Wild Gunman (U)/copilot/header.bin create mode 100644 _wip/Wild Gunman (U)/copilot/linker.cfg create mode 100644 _wip/Wild Gunman (U)/copilot/locals.inc create mode 100644 _wip/Wild Gunman (U)/copilot/prg.bin create mode 100644 _wip/Wild Gunman (U)/copilot/prg.s create mode 100644 _wip/Wild Gunman (U)/copilot/reconstructed.lbl create mode 100644 _wip/Wild Gunman (U)/copilot/reconstructed.map create mode 100644 _wip/Wild Gunman (U)/copilot/reconstructed_prg.bin create mode 100644 _wip/Wild Gunman (U)/copilot/symbols.inc diff --git a/.gitignore b/.gitignore index 1e74e49..f67c9b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -ROMS/* \ No newline at end of file +ROMS/* +**/*.o + diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..684fa35 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,36 @@ +# AGENTS.md + +## What this repo is + +Eleven AI-generated disassemblies of NES ROMs. The contract (stated in `PROMPTS.md` and verified by `make` in every `copilot/` folder) is **byte-identical rebuilds**: `reconstructed.nes` must match the original ROM exactly. Not for distribution (`README.md`). + +## Layout + +- Each project owns a folder with a `copilot/` build dir (`prg.s`, `header.s`, `chr.s`, `linker.cfg`, `symbols.inc`, `locals.inc`, `Makefile`, and a copy/symlink `rom.nes`) and a per-project `OVERVIEW.md` at the folder root (power-on flow analysis). +- Root `OVERVIEW.md` is the index: vectors, build fixes, and summary for all 11 projects. **Keep it in sync** when a project changes — its DK Jr. entries drifted badly before being corrected. +- `PROMPTS.md` is the workflow contract. `default_project.tar.gz` is the empty-project skeleton (prg.s, symbols.inc, linker.cfg, Makefile, locals.inc). `_ROMS/` is the master ROM store; `_tools/` has `splitnes.py` and `chr2gif.py`. + +## Commands + +```bash +cd "/copilot" && make # builds reconstructed.nes, then cmp vs rom.nes +``` + +`make`'s default target includes the byte-identity `cmp` — a build that doesn't print "Byte-identical ROM verified." is a failure. Requires `ca65`/`ld65` on PATH. + +## Irreversible conventions (do not "clean up" past these) + +- Every instruction carries a trailing `; PRG:$xxxx AA BB` comment with PRG offset and exact emitted bytes. This is the byte-identity audit trail — preserve it even while renaming labels or restructuring files. +- Unreached/unresolved bytes stay as data (`Label_/Data/` `.byte` or `.incbin` blocks with ROM provenance), never deleted or reformatted. +- Routine headers follow the template in `prg.s`: global + local description, parameters, returns, clobbers. +- Two separate symbol files: `symbols.inc` = NES hardware constants only; `locals.inc` = zero-page and forward references. Unresolved zero-page bytes keep neutral `ZpXX` names rather than speculative names. +- Pass discipline: Pass 1 = code/data split (stop for review), Pass 2 = label replacement, Pass 3 = semantic naming of data tables/structures. Do not skip straight to guessy rewrites. + +## Hard-won quirks (details in root `OVERVIEW.md` per-project "Build fix") + +- The flat disassembler mislabels `bne` as `bpl`; fixes use `bne *-$XX` to reproduce the original bytes (Clu Clu Land, Defender 2, Excitebike). +- Zero pages are reused across modes; aliases may be required in `locals.inc` (e.g. `RandomStateAlt = $E4` beside `RandomState0 = $54`). +- Donkey Kong Jr. is architecturally different: reset entry is $C66E, the reset path idles forever in an LFSR loop, and the entire frame state machine runs inside NMI. Its `DeferredTaskHandlerTable` entry 0 deliberately mirrors the IRQ vector word at $BFFE. +- IRQ vectors often point at unused/data targets in these games — verify before assuming a handler is broken. +- ROM filenames contain spaces; builds `incbin` a space-free `rom.nes` inside `copilot/`. Keep that copy/symlink working and don't rename it. +- `.gitignore` contains `ROMS/*` but the actual directory is `_ROMS` — the pattern matches nothing, so ROM binaries stay tracked. Check before committing large blobs. diff --git a/Balloon Fight (JU)/copilot/reconstructed.lbl b/Balloon Fight (JU)/copilot/reconstructed.lbl new file mode 100644 index 0000000..d280557 --- /dev/null +++ b/Balloon Fight (JU)/copilot/reconstructed.lbl @@ -0,0 +1,905 @@ +al 00FFFA .InterruptVectors +al 00FBAC .Sound_FBAC +al 00FBAF .Sound_FBAF +al 00FB8D .Sound_FB8D +al 00FB86 .Sound_FB86 +al 00FB6D .Sound_FB6D +al 00FB49 .Sound_FB49 +al 00FB52 .Sound_FB52 +al 00FB58 .Sound_FB58 +al 00FB69 .Sound_FB69 +al 00FB7C .Sound_FB7C +al 00FB4C .Sound_FB4C +al 00FB82 .Sound_FB82 +al 00FB5E .Sound_FB5E +al 00FBC1 .Sound_FBC1 +al 00FB1E .Sound_FB1E +al 00FB10 .Sound_FB10 +al 00FB04 .Sound_FB04 +al 00FAD9 .Sound_FAD9 +al 00FAE2 .Sound_FAE2 +al 00FB17 .Sound_FB17 +al 00FABA .Sound_FABA +al 00FB00 .Sound_FB00 +al 00FAD8 .Sound_FAD8 +al 00FA96 .UpdateTriangleEffects +al 00FA8A .Data_FA8A +al 00FBA5 .Sound_FBA5 +al 00FA64 .Sound_FA64 +al 00FA83 .Sound_FA83 +al 00FA63 .Sound_FA63 +al 00FA42 .Sound_FA42 +al 00FA27 .Sound_FA27 +al 00FA0C .Sound_FA0C +al 00FA7F .Sound_FA7F +al 00F9F9 .Sound_F9F9 +al 00FA26 .Sound_FA26 +al 00F9E9 .UpdateSoundEnvelopes +al 00F9CD .Data_F9CD +al 00F9BD .Sound_F9BD +al 00F9B1 .Sound_F9B1 +al 00F9CA .Sound_F9CA +al 00F98F .Sound_F98F +al 00F993 .Sound_F993 +al 00F94F .Sound_F94F +al 00F977 .Sound_F977 +al 00F94B .Sound_F94B +al 00F965 .Sound_F965 +al 00F952 .Sound_F952 +al 00F94E .Sound_F94E +al 00F91B .Sound_F91B +al 00F907 .Sound_F907 +al 00F8DD .Sound_F8DD +al 00F8CA .Sound_F8CA +al 00F8BF .Sound_F8BF +al 00F8E8 .Sound_F8E8 +al 00F8A6 .Sound_F8A6 +al 00F8A2 .Sound_F8A2 +al 00F8A1 .Sound_F8A1 +al 00F87D .Sound_F87D +al 00F85C .Sound_F85C +al 00F85F .Sound_F85F +al 00F83B .Sound_F83B +al 00F821 .Sound_F821 +al 00F89B .Sound_F89B +al 00F85B .Sound_F85B +al 00F814 .Sound_F814 +al 00F800 .Sound_F800 +al 00F7EF .Sound_F7EF +al 00F7E0 .Sound_F7E0 +al 00F7D9 .Sound_F7D9 +al 00F7D3 .Sound_F7D3 +al 00F7B4 .Sound_F7B4 +al 00F7C7 .Sound_F7C7 +al 00F7A5 .ResetAllSoundState +al 00F798 .InitializeSoundDataPointers +al 00F79F .Sound_F79F +al 00F78F .UpdateSoundRequests +al 00F879 .Sound_F879 +al 00F77C .Sound_F77C +al 00F824 .ProcessSoundEffectRequests +al 00FAAC .UpdateNoiseEffects +al 00FA38 .UpdatePulseEffects +al 00F90A .ProcessMusicRequest +al 00FB25 .UpdateSoundPriority +al 00F758 .Sound_F758 +al 00F77B .Sound_F77B +al 00F749 .Sound_F749 +al 00F736 .Sound_F736 +al 00F725 .UpdateMusicTempo +al 00F745 .Sound_F745 +al 00F71F .Sound_F71F +al 00F71A .InitializeApuChannelState +al 00F712 .SilencePulseChannels +al 00F6E5 .Data_F6E5 +al 00F6C4 .Label_F6C4 +al 00FBCA .SoundSequencePointerTable +al 00F6BE .Label_F6BE +al 00F6A8 .InitializeSoundSequence +al 00F69D .Label_F69D +al 00F68F .CopyFourBytesToApuShadow +al 00F68B .SelectTriangleOffset +al 00F687 .SelectPulse2Offset +al 00F691 .Label_F691 +al 00F683 .SelectSoundChannelOffset +al 00F600 .ApuPeriodTable +al 00F5F9 .Label_F5F9 +al 00F5D9 .Label_F5D9 +al 00F5CE .Label_F5CE +al 00F5B2 .Label_F5B2 +al 00F5AC .Label_F5AC +al 00F5AA .Label_F5AA +al 00F599 .Label_F599 +al 00F587 .Label_F587 +al 00F5B9 .Label_F5B9 +al 00F5E1 .Label_F5E1 +al 00F575 .Label_F575 +al 00F5C4 .Label_F5C4 +al 00F660 .SoundCommandMaskTable +al 00F57B .Label_F57B +al 00F55E .Label_F55E +al 00F561 .Label_F561 +al 00F553 .Label_F553 +al 00F547 .Label_F547 +al 00F531 .Label_F531 +al 00F50E .Label_F50E +al 00F50B .Label_F50B +al 00F51B .Label_F51B +al 00F504 .ProcessSoundChannels +al 00F503 .Label_F503 +al 00F500 .UpdateSoundEngine +al 00F4A5 .InitializeGameplayGlobals +al 00F4A2 .Label_F4A2 +al 00F489 .Label_F489 +al 00F470 .WaitForStartPress +al 00F46F .Label_F46F +al 00F469 .WaitForFrameCounter +al 00F45E .DelayFramesLoop +al 00F45C .DelayFrames +al 00F43F .StatusPanelTileData +al 00F43D .StatusPanelAddressHiTable +al 00F43B .StatusPanelAddressLoTable +al 00F42F .Label_F42F +al 00F41E .Label_F41E +al 00F410 .Label_F410 +al 00F465 .WaitOneFrame +al 00F40B .DrawRoundStatusPanel +al 00F3F5 .RoundInitAttributeTable +al 00F3D4 .Label_F3D4 +al 00F3EE .Label_F3EE +al 00F3CC .LoadRoundScreenData +al 00F3B0 .ActivateSpawnedObject +al 00F3A1 .Label_F3A1 +al 00F3AE .ObjectSpawnStateTable +al 00F3AD .Label_F3AD +al 00F383 .Label_F383 +al 00F375 .Label_F375 +al 00F361 .Label_F361 +al 00F34C .Label_F34C +al 00F338 .Label_F338 +al 00F32F .Label_F32F +al 00F329 .Label_F329 +al 00F366 .Label_F366 +al 00F318 .Label_F318 +al 00F327 .Label_F327 +al 00F326 .Label_F326 +al 00F30D .Label_F30D +al 00F2E4 .Label_F2E4 +al 00F2C5 .Label_F2C5 +al 00F2B9 .Label_F2B9 +al 00F2B3 .Label_F2B3 +al 00F2A2 .Label_F2A2 +al 00F29B .Label_F29B +al 00F28E .Label_F28E +al 00F386 .ResetObjectMotion +al 00F278 .Label_F278 +al 00F26F .Label_F26F +al 00F23A .Label_F23A +al 00F238 .Label_F238 +al 00F3C3 .RoundObjectPositionTable +al 00F3BA .RoundObjectTypeTable +al 00F221 .Label_F221 +al 00F213 .Label_F213 +al 00F20D .Label_F20D +al 00F1FA .Label_F1FA +al 00F1F2 .InitializeRoundObjects +al 00F1D9 .Label_F1D9 +al 00F1D4 .Label_F1D4 +al 00F1B7 .Label_F1B7 +al 00F1B3 .NextRandomByte +al 00F1A8 .Label_F1A8 +al 00F1A6 .ShiftInputVectorRight4 +al 00F18C .ScaleVerticalVelocity +al 00F172 .ScaleHorizontalVelocity +al 00F16C .Label_F16C +al 00F14F .Label_F14F +al 00F143 .MultiplyUnsigned16By8 +al 00F119 .MultiplySignedValue +al 00F107 .NegateVerticalMotion +al 00F0DE .NegateHorizontalMotion +al 00F0DD .Label_F0DD +al 00F0BD .TestPairCollisionEligibility +al 00F0B4 .SwapObjectIndexes +al 00F0A6 .SubtractVerticalVelocityPair +al 00F098 .SubtractHorizontalVelocityPair +al 00F097 .Label_F097 +al 00F08E .AbsoluteDifferenceA +al 00F052 .Label_F052 +al 00F082 .CollisionEventTable +al 00F076 .CollisionScoreTable +al 00F023 .Label_F023 +al 00F06A .CollisionSoundTable +al 00F011 .Label_F011 +al 00F05E .ObjectStateTransitionTable +al 00EFE2 .Label_EFE2 +al 00EFE0 .Label_EFE0 +al 00EFCE .Label_EFCE +al 00EFEA .Label_EFEA +al 00EFB7 .Label_EFB7 +al 00F053 .CollisionResultStateTable +al 00EFC0 .Label_EFC0 +al 00EF97 .Label_EF97 +al 00EF7F .Label_EF7F +al 00EF72 .Label_EF72 +al 00EF61 .Label_EF61 +al 00EF56 .Label_EF56 +al 00EF4F .Label_EF4F +al 00F043 .Label_F043 +al 00EF42 .Label_EF42 +al 00EF36 .Label_EF36 +al 00EF30 .Label_EF30 +al 00EF37 .ResolveObjectCollisionPair +al 00EF1A .Label_EF1A +al 00EF1E .Label_EF1E +al 00EF03 .Label_EF03 +al 00EEFA .Label_EEFA +al 00EEED .Label_EEED +al 00EEF1 .Label_EEF1 +al 00EED6 .Label_EED6 +al 00EECD .Label_EECD +al 00EEBC .Label_EEBC +al 00EEAA .Label_EEAA +al 00EE8F .Label_EE8F +al 00EE7C .Label_EE7C +al 00EE6A .Label_EE6A +al 00EEC0 .Label_EEC0 +al 00EF2A .Label_EF2A +al 00EE2E .Label_EE2E +al 00EE31 .Label_EE31 +al 00EE27 .Label_EE27 +al 00EE25 .CheckObjectInteractions +al 00EE08 .Label_EE08 +al 00EDFF .Label_EDFF +al 00EE24 .Label_EE24 +al 00EDF0 .Label_EDF0 +al 00EDF4 .Label_EDF4 +al 00EDD6 .Label_EDD6 +al 00EDC0 .Label_EDC0 +al 00EDC1 .Label_EDC1 +al 00EDB4 .Label_EDB4 +al 00EDA0 .Label_EDA0 +al 00ED85 .Label_ED85 +al 00ED78 .Label_ED78 +al 00ED89 .Label_ED89 +al 00ED69 .Label_ED69 +al 00ED5B .Label_ED5B +al 00EDB6 .Label_EDB6 +al 00ED44 .Label_ED44 +al 00EDE1 .Label_EDE1 +al 00ED40 .Label_ED40 +al 00ED2D .Label_ED2D +al 00ED2E .Label_ED2E +al 00ED28 .ResolveStageCollision +al 00ED22 .Label_ED22 +al 00ECDF .Label_ECDF +al 00ECDB .Label_ECDB +al 00ED27 .Label_ED27 +al 00ECBA .UpdateSpecialObjectState +al 00EC93 .Label_EC93 +al 00EC7E .Label_EC7E +al 00EC75 .Label_EC75 +al 00ECAD .Label_ECAD +al 00EC5C .Label_EC5C +al 00EC61 .Label_EC61 +al 00EC49 .Label_EC49 +al 00EC2F .Label_EC2F +al 00ECAE .EnvironmentStateTable +al 00EC37 .Label_EC37 +al 00EBFE .Label_EBFE +al 00EBF7 .Label_EBF7 +al 00EBFD .Label_EBFD +al 00EC38 .Label_EC38 +al 00EBD6 .Label_EBD6 +al 00EBE3 .Label_EBE3 +al 00EBC4 .UpdateObjectEnvironmentState +al 00EBBB .ApplyVerticalCollisionResponse +al 00EBB2 .ApplyHorizontalCollisionResponse +al 00EB84 .Label_EB84 +al 00EB8D .Label_EB8D +al 00EB60 .Label_EB60 +al 00EB5A .Label_EB5A +al 00EB62 .Label_EB62 +al 00EB8E .IntegrateHorizontalPosition +al 00EB3F .Label_EB3F +al 00EB21 .Label_EB21 +al 00EB4B .Label_EB4B +al 00EB30 .Label_EB30 +al 00EB05 .Label_EB05 +al 00EB0D .Label_EB0D +al 00EBA0 .IntegrateVerticalPosition +al 00EAD0 .Label_EAD0 +al 00EAB2 .Label_EAB2 +al 00EADC .Label_EADC +al 00EAC1 .Label_EAC1 +al 00EA9E .Label_EA9E +al 00EA8B .Label_EA8B +al 00EA8C .Label_EA8C +al 00EA60 .Label_EA60 +al 00EA58 .ApplyObjectVerticalMotion +al 00EA57 .Label_EA57 +al 00EA47 .Label_EA47 +al 00EA3E .Label_EA3E +al 00EA44 .Label_EA44 +al 00EA2C .Label_EA2C +al 00EA18 .ApplyObjectHorizontalMotion +al 00EA15 .Label_EA15 +al 00EA13 .Label_EA13 +al 00EA17 .Label_EA17 +al 00E9F3 .Label_E9F3 +al 00E9FD .Label_E9FD +al 00E9F2 .Label_E9F2 +al 00E9A4 .Label_E9A4 +al 00E99A .Label_E99A +al 00E9B6 .Label_E9B6 +al 00E983 .UpdateObjectFacingAndState +al 00E976 .Label_E976 +al 00E968 .Label_E968 +al 00E963 .Label_E963 +al 00E982 .Label_E982 +al 00E93E .Label_E93E +al 00E929 .Label_E929 +al 00E8EC .Label_E8EC +al 00E8D1 .Label_E8D1 +al 00E951 .Label_E951 +al 00E907 .Label_E907 +al 00E8C7 .Label_E8C7 +al 00E901 .Label_E901 +al 00E8A6 .Label_E8A6 +al 00E8B8 .Label_E8B8 +al 00E87C .Label_E87C +al 00E874 .Label_E874 +al 00E87F .Label_E87F +al 00E864 .Label_E864 +al 00E850 .Label_E850 +al 00E845 .Label_E845 +al 00E854 .Label_E854 +al 00E82E .Label_E82E +al 00E829 .Label_E829 +al 00E821 .Label_E821 +al 00E832 .Label_E832 +al 00E80D .Label_E80D +al 00E802 .Label_E802 +al 00E811 .Label_E811 +al 00E7EF .Label_E7EF +al 00E7B1 .UpdateObjectVelocity +al 00E7E8 .Label_E7E8 +al 00E79A .Label_E79A +al 00E7A3 .Label_E7A3 +al 00E796 .UpdateObjectMotionState +al 00E776 .Label_E776 +al 00E76A .ReadControllerPort +al 00E768 .PollControllers +al 00E765 .ObjectAnimationBasePeriodTable +al 00E75B .Label_E75B +al 00E74D .Label_E74D +al 00E749 .Label_E749 +al 00E765 .ControllerBitMaskTable +al 00E762 .ObjectAnimationPeriodTable +al 00E712 .Label_E712 +al 00E704 .Label_E704 +al 00E6F8 .Label_E6F8 +al 00E705 .Label_E705 +al 00E6E9 .UpdatePlayerInputState +al 00E6CE .Label_E6CE +al 00E6D9 .Label_E6D9 +al 00E6B8 .Label_E6B8 +al 00E6E2 .Label_E6E2 +al 00E6A4 .Label_E6A4 +al 00E696 .Label_E696 +al 00E691 .UpdateAllObjects +al 00E685 .ObjectMotionTableD +al 00E679 .ObjectMotionTableC +al 00E66D .ObjectMotionTableB +al 00E661 .ObjectMotionTableA +al 00E655 .ObjectVelocityTableF +al 00E649 .ObjectVelocityTableE +al 00E63D .ObjectVelocityTableD +al 00E631 .ObjectVelocityTableC +al 00E625 .ObjectVelocityTableB +al 00E619 .ObjectVelocityTableA +al 00E60D .ObjectAccelerationTableB +al 00E601 .ObjectAccelerationTableA +al 00E5AD .Label_E5AD +al 00E5A7 .Label_E5A7 +al 00E599 .Label_E599 +al 00E5CA .OverlaySpriteStreamHiTable +al 00E5C5 .OverlaySpriteStreamLoTable +al 00E5C4 .Label_E5C4 +al 00E587 .CopyOverlaySpriteStream +al 00E584 .Label_E584 +al 00E54A .Label_E54A +al 00E550 .Label_E550 +al 00E553 .Label_E553 +al 00E50D .Label_E50D +al 00E4CA .Label_E4CA +al 00E4B1 .Label_E4B1 +al 00E49A .Label_E49A +al 00E494 .Label_E494 +al 00E486 .Label_E486 +al 00E47C .Label_E47C +al 00E465 .Label_E465 +al 00E463 .Label_E463 +al 00E459 .Label_E459 +al 00E44B .Label_E44B +al 00E43C .Label_E43C +al 00E444 .Label_E444 +al 00E429 .Label_E429 +al 00E408 .Label_E408 +al 00E41B .Label_E41B +al 00E3C4 .Label_E3C4 +al 00E4D5 .RenderLargeObjectSprites +al 00E3C2 .Label_E3C2 +al 00E3CF .Label_E3CF +al 00E3B3 .Label_E3B3 +al 00E3A4 .RenderObjectSprites +al 00E39B .StageSetupPointerHiTable +al 00E392 .StageSetupPointerLoTable +al 00E38B .StageObjectDataTableE +al 00E384 .StageObjectDataTableD +al 00E352 .StageObjectDataTableC +al 00E34F .StageObjectDataTableB +al 00E34C .StageObjectDataTableA +al 00E320 .StageObjectAttributeData +al 00E2F4 .StageObjectYData +al 00E2EC .StageObjectXData +al 00E2E4 .StageObjectTypeData +al 00E298 .StageBoundaryDataB +al 00E24C .StageBoundaryDataA +al 00E03D .StageObjectPointerData +al 00DD39 .StagePpuLayoutData +al 00DCAE .NametableHeaderPatternData +al 00DC2B .StagePpuData_Common +al 00DC17 .StageStream_0D_Target +al 00DC17 .StageStream_0B +al 00DC03 .StageStream_09_Target +al 00DC01 .StageStream_0A +al 00DBF2 .StageStream_02_Target +al 00DBEE .StageStream_09 +al 00DBE1 .StageStream_0E_Target +al 00DBE1 .StageStream_06_Target +al 00DBDF .StageStream_08 +al 00DBCA .StageStream_0A_Target +al 00DBCA .StageStream_07 +al 00DBAE .StageStream_06 +al 00DBAD .StageStream_0C_Target +al 00DB9D .StageStream_05 +al 00DB99 .StageStream_08_Target +al 00DB8B .StageStream_04 +al 00DB88 .StageStream_05_Target +al 00DB77 .StageStream_04_Target +al 00DB77 .StageStream_03 +al 00DB6C .StageStream_0F_Target +al 00DB6C .StageStream_0B_Target +al 00DB6C .StageStream_07_Target +al 00DB6C .StageStream_03_Target +al 00DB6C .StageStream_02 +al 00DB59 .StageStream_01_Target +al 00DB59 .StageStream_01 +al 00DB4A .StageStream_00_Target +al 00DB4A .StageStream_00 +al 00DB27 .GameModeInitialStageTable +al 00DB27 .StageDataPointerTableLo +al 00DB05 .GameModePlayerCountTable +al 00DAED .Label_DAED +al 00DAF0 .Label_DAF0 +al 00DB08 .ApplySelectedGameMode +al 00DAF1 .Label_DAF1 +al 00DACB .Label_DACB +al 00DAC1 .RunTitleMenuLoop +al 00D92C .TitleScreenPpuData +al 00D90F .Label_D90F +al 00D901 .Label_D901 +al 00D8FF .ClearBonusResultSprites +al 00D8FB .Label_D8FB +al 00D8DF .Label_D8DF +al 00D8DD .UpdateBonusResultSprites +al 00D8D7 .BonusSpriteTileTableB +al 00D8D1 .BonusSpriteTileTableA +al 00D88C .Label_D88C +al 00D879 .Label_D879 +al 00D871 .CreateBonusResultSprites +al 00D86C .BonusDigitOffsetTable +al 00D856 .Label_D856 +al 00D84B .BonusLabelTiles +al 00D841 .Label_D841 +al 00D834 .Label_D834 +al 00D82C .Label_D82C +al 00D828 .Label_D828 +al 00D83B .Label_D83B +al 00D83A .Label_D83A +al 00D826 .DrawBonusMeter +al 00D7F5 .Label_D7F5 +al 00D802 .Label_D802 +al 00D854 .DrawBonusValueDigits +al 00D7D1 .Label_D7D1 +al 00D7B1 .Label_D7B1 +al 00D805 .Label_D805 +al 00D7A0 .Label_D7A0 +al 00D798 .DrawBonusResultScreen +al 00D794 .Label_D794 +al 00D782 .Label_D782 +al 00D778 .Label_D778 +al 00D767 .Label_D767 +al 00D75B .Label_D75B +al 00D752 .Label_D752 +al 00D765 .Label_D765 +al 00D746 .Label_D746 +al 00D78F .ClampDecimalDigit +al 00D779 .BonusScoreWeightTable +al 00D77C .DivideBonusValue +al 00D6E4 .Label_D6E4 +al 00D6E5 .Label_D6E5 +al 00D6DE .AccumulatePlayerBonusScore +al 00D6DC .UpdateBonusScoreTotals +al 00D65C .NametableAddressPairTable +al 00D64C .NametableTileClassTable +al 00D632 .Label_D632 +al 00D63A .Label_D63A +al 00D60D .Label_D60D +al 00D63B .Label_D63B +al 00D60C .Label_D60C +al 00D5F1 .ClassifyNametableTile +al 00D651 .GetNametableAddressForIndex +al 00D5DB .Label_D5DB +al 00D5D9 .ScanNametableTiles +al 00D5CB .Label_D5CB +al 00D5C9 .WriteAttributeQuadrants +al 00D5B1 .FillPpuBytes +al 00D59B .Label_D59B +al 00D5B8 .WriteNametableAttributePattern +al 00D593 .WriteNametableHeaderPattern +al 00D572 .Label_D572 +al 00D56C .InitializeNametablePatterns +al 00D568 .AttributeSetMaskTable +al 00D564 .AttributeClearMaskTable +al 00D53C .ReadModifyAttributeByte +al 00D51C .SetTileAddressFromCoordinates +al 00D4FB .Label_D4FB +al 00D4FA .Label_D4FA +al 00D4EF .Label_D4EF +al 00D4DB .Label_D4DB +al 00D4CC .Label_D4CC +al 00D4D8 .Label_D4D8 +al 00D4F0 .ReadPpuStreamByte +al 00D4A4 .Label_D4A4 +al 00D4E4 .Label_D4E4 +al 00D4E5 .ReadStageStreamByte +al 00D497 .DecodePpuCommandStream +al 00D493 .StreamPointerAdjustmentTable +al 00D492 .Label_D492 +al 00D48C .AddOffsetToStreamPointer +al 00D42D .Label_D42D +al 00D421 .Label_D421 +al 00D40D .Label_D40D +al 00D404 .Label_D404 +al 00D410 .Label_D410 +al 00D437 .StagePaletteAndTileData +al 00D3EF .Label_D3EF +al 00D3ED .BuildStagePpuCommands +al 00D39A .Label_D39A +al 00D3BA .Label_D3BA +al 00D399 .Label_D399 +al 00D37E .Label_D37E +al 00D327 .Label_D327 +al 00D2CB .Label_D2CB +al 00D2C1 .Label_D2C1 +al 00D322 .Label_D322 +al 00D2B1 .Label_D2B1 +al 00DB3A .StageStreamPointerHiTable +al 00DB2A .StageStreamPointerLoTable +al 00D2A0 .Label_D2A0 +al 00D293 .LoadStageObjectData +al 00D28C .Label_D28C +al 00D279 .Label_D279 +al 00D268 .Label_D268 +al 00D275 .ClearNametable +al 00D246 .ClearPpuAndOamBuffers +al 00D232 .Label_D232 +al 00D238 .Label_D238 +al 00D243 .Label_D243 +al 00D213 .DecrementDecimalDigits +al 00D212 .Label_D212 +al 00D208 .Label_D208 +al 00D200 .Label_D200 +al 00D1FB .Label_D1FB +al 00D1ED .Label_D1ED +al 00D1FE .Label_D1FE +al 00D1D5 .Label_D1D5 +al 00D1CB .Label_D1CB +al 00D1C9 .ConvertValueToDecimalDigits +al 00D1C2 .Label_D1C2 +al 00D1DC .AddParticleResultDigits +al 00D1A2 .Label_D1A2 +al 00D1A0 .DrawParticleBonusResults +al 00D19E .PlayerStartXTable +al 00D184 .PlayerStartYTable +al 00D13E .ParticleResultsPpuTemplate +al 00D12B .ParticleResultsData +al 00D121 .SumParticleHitCounts +al 00D104 .Label_D104 +al 00D11C .ParticleSequenceValueTableC +al 00D117 .ParticleSequenceValueTableB +al 00D112 .ParticleSequenceValueTableA +al 00D10D .ParticleSequenceIndexTable +al 00D0DC .Label_D0DC +al 00D0D6 .Label_D0D6 +al 00D0C0 .Label_D0C0 +al 00D0CE .Label_D0CE +al 00D0A8 .Label_D0A8 +al 00D08E .Label_D08E +al 00D070 .Label_D070 +al 00D04F .Label_D04F +al 00D068 .Label_D068 +al 00D02E .Label_D02E +al 00D01D .Label_D01D +al 00D013 .Label_D013 +al 00CFE8 .Label_CFE8 +al 00CFB5 .Label_CFB5 +al 00CF7E .Label_CF7E +al 00CF51 .Label_CF51 +al 00CF47 .Label_CF47 +al 00CF34 .Label_CF34 +al 00CF26 .Label_CF26 +al 00CF1F .Label_CF1F +al 00D0E2 .LoadParticleSequenceData +al 00CF13 .RunParticleBonusSequence +al 00CF12 .Label_CF12 +al 00CF0F .Label_CF0F +al 00CED0 .Label_CED0 +al 00CEBD .ParticleAnimationAttributeMaskTable +al 00CEB5 .ParticleAnimationTileTable +al 00CE99 .Label_CE99 +al 00CEB2 .ParticleAttributeTable +al 00CE2E .Label_CE2E +al 00CECE .TestParticlePlayerOverlap +al 00CE2F .DrawParticleSprites +al 00CE1D .Label_CE1D +al 00CE0B .Label_CE0B +al 00CDFC .Label_CDFC +al 00CE22 .Label_CE22 +al 00CDAC .Label_CDAC +al 00CDAA .UpdateParticleSystem +al 00CDA2 .Label_CDA2 +al 00CEAE .ParticleInitialVelocityTable +al 00CD74 .Label_CD74 +al 00CD6B .Label_CD6B +al 00CD60 .Label_CD60 +al 00CD5A .SpawnTimedParticle +al 00CD4C .Label_CD4C +al 00CD25 .Label_CD25 +al 00CD46 .BonusHudRow2Tile2Table +al 00CD42 .BonusHudRow2Tile1Table +al 00CD3E .BonusHudRow2Tile0Table +al 00CD3A .BonusHudRow1Tile2Table +al 00CD36 .BonusHudRow1Tile1Table +al 00CD32 .BonusHudRow1Tile0Table +al 00CD0F .AdvanceHudCommandAddress +al 00CD2E .BonusHudRow0Tile2Table +al 00CD2A .BonusHudRow0Tile1Table +al 00CD26 .BonusHudRow0Tile0Table +al 00CCBE .Label_CCBE +al 00CCA2 .Label_CCA2 +al 00CCBF .TriggerBonusObjectEffect +al 00CC73 .Label_CC73 +al 00CCB8 .Label_CCB8 +al 00CC20 .Label_CC20 +al 00CC33 .RequestCollisionSound +al 00CC0B .Label_CC0B +al 00CBFC .Label_CBFC +al 00CBC1 .Label_CBC1 +al 00CC2F .Label_CC2F +al 00CC3A .TestBonusObjectCollection +al 00CBB2 .TestBonusObjectPlayerOverlap +al 00CCCB .DrawBonusObjectHud +al 00CBA4 .Label_CBA4 +al 00CBA8 .FindActiveBonusObject +al 00CB79 .Label_CB79 +al 00CBA7 .Label_CBA7 +al 00CB74 .UpdateBonusObjectSystem +al 00CB70 .Label_CB70 +al 00CB1E .Label_CB1E +al 00CB18 .Label_CB18 +al 00CB0C .Label_CB0C +al 00CB00 .Label_CB00 +al 00CAF4 .Label_CAF4 +al 00CAE7 .Label_CAE7 +al 00CAE1 .Label_CAE1 +al 00CAE8 .Label_CAE8 +al 00CADB .Label_CADB +al 00CAC8 .Label_CAC8 +al 00CAA9 .Label_CAA9 +al 00CAA2 .Label_CAA2 +al 00CAAD .Label_CAAD +al 00CA92 .Label_CA92 +al 00CA82 .Label_CA82 +al 00CADD .Label_CADD +al 00CA69 .Label_CA69 +al 00C9B5 .Label_C9B5 +al 00C9AC .Label_C9AC +al 00C9DD .RoundObjectTileTable +al 00CB1C .ResolveGameplayObjectInteraction +al 00CA67 .TestGameplayObjectAgainstBounds +al 00C976 .Label_C976 +al 00CA4F .BounceGameplayObjectX +al 00C962 .Label_C962 +al 00C958 .Label_C958 +al 00CA37 .BounceGameplayObjectY +al 00C94E .Label_C94E +al 00C9B6 .IntegrateGameplayObjectPosition +al 00C937 .Label_C937 +al 00CA33 .RoundObjectAttributeTable +al 00CA29 .RoundObjectTileBottomTable +al 00CA1F .RoundObjectTileMiddleTable +al 00CA15 .RoundObjectTileTopTable +al 00C8FF .Label_C8FF +al 00CA05 .RoundObjectVerticalSpacingTable +al 00C9F5 .RoundObjectYOffsetTable +al 00C9E5 .RoundObjectXOffsetTable +al 00C941 .Label_C941 +al 00C9AF .Label_C9AF +al 00C8C1 .Label_C8C1 +al 00C8B9 .Label_C8B9 +al 00C8B7 .UpdateRoundObjectSpritesAndPhysics +al 00C883 .AppendRoundHudValue +al 00C88B .RoundHudTileTable +al 00C846 .Label_C846 +al 00C88A .Label_C88A +al 00C831 .UpdateRoundHud +al 00C821 .Label_C821 +al 00CA55 .NegateGameplayObjectVelocityX +al 00C819 .Label_C819 +al 00C893 .SpawnFlipXTable +al 00CA3D .NegateGameplayObjectVelocityY +al 00C811 .Label_C811 +al 00C88F .SpawnFlipYTable +al 00C89B .SpawnYOffsetTable +al 00C897 .SpawnXOffsetTable +al 00C8B1 .SpawnVelocityXTable +al 00C8A5 .SpawnVelocityYTable +al 00C8AB .SpawnPositionHiTable +al 00C89F .SpawnParameterTable +al 00C7B4 .Label_C7B4 +al 00C7AD .Label_C7AD +al 00C796 .Label_C796 +al 00C797 .Label_C797 +al 00C790 .UpdateRoundSpawner +al 00C784 .Label_C784 +al 00C77E .Label_C77E +al 00C781 .Label_C781 +al 00C77A .ChooseRoundSpawnIndex +al 00C856 .ConfigureRoundPresentation +al 00C761 .RoundDelayTable +al 00C748 .RoundObjectCountTable +al 00C72E .Label_C72E +al 00C726 .InitializeRoundPresentation +al 00C718 .Label_C718 +al 00C716 .InitializeRoundObjectPools +al 00C709 .Label_C709 +al 00C70D .Label_C70D +al 00C6F9 .UpdateCarrierSequence +al 00C6EE .Label_C6EE +al 00C6E0 .Label_C6E0 +al 00C6F8 .Label_C6F8 +al 00C6C4 .BeginCarrierTargetSequence +al 00C6B3 .Label_C6B3 +al 00C6B7 .Label_C6B7 +al 00C6B8 .CarrierAnimationSequenceTable +al 00C6A3 .Label_C6A3 +al 00C671 .Label_C671 +al 00C66F .Label_C66F +al 00C658 .UpdateCarrierArrivalSequence +al 00C657 .Label_C657 +al 00C64B .AdvanceCarrierTargetX +al 00C62F .Label_C62F +al 00C62B .Label_C62B +al 00C61B .Label_C61B +al 00C614 .FindEligiblePlayerForCarrier +al 00C607 .Label_C607 +al 00C602 .Label_C602 +al 00C610 .Label_C610 +al 00C5F4 .Label_C5F4 +al 00C613 .Label_C613 +al 00C5D8 .Label_C5D8 +al 00C5D5 .Label_C5D5 +al 00C5C3 .UpdateCarrierObjectDisplay +al 00C5BB .AlternateDisplayModeTable +al 00C5B7 .NormalDisplayModeTable +al 00C5AE .Label_C5AE +al 00C5A1 .Label_C5A1 +al 00C5AC .Label_C5AC +al 00C579 .InsertRecordIntoSortedTable +al 00C559 .Label_C559 +al 00C563 .Label_C563 +al 00C54B .Label_C54B +al 00C53D .Label_C53D +al 00C539 .FindSortedRecordPosition +al 00C527 .AdvanceRoundSeed +al 00C4AD .RoundSpawnCommandStream +al 00C491 .@InitializeSlot +al 00C488 .@FindFreeSlot +al 00C486 .AllocateGameplayObject +al 00C476 .@InitializeSlot +al 00C46D .@FindFreeSlot +al 00C43A .SpawnSelectorAdjustmentTable +al 00C439 .Label_C439 +al 00C40C .SpawnRandomObject +al 00C46B .AllocateEffectObject +al 00C3EC .Label_C3EC +al 00C3F6 .Label_C3F6 +al 00C3D3 .Label_C3D3 +al 00C45E .SpawnPatternNoneAlt +al 00C45F .InitializeSpecialObject +al 00C43E .SpawnPatternNone +al 00C3F7 .SpawnAtRandomPosition +al 00C3C9 .SpawnFromCommandStream +al 00C3A1 .Label_C3A1 +al 00C378 .Label_C378 +al 00C36F .Label_C36F +al 00C32D .Label_C32D +al 00C30D .Label_C30D +al 00C314 .Label_C314 +al 00C317 .Label_C317 +al 00C2F7 .Label_C2F7 +al 00C2EF .Label_C2EF +al 00C2D2 .Label_C2D2 +al 00C3B2 .DispatchSpawnPattern +al 00C3B5 .SpawnPatternHandlerTable +al 00C3BF .SpawnPatternIndexTable +al 00C2BC .Label_C2BC +al 00C289 .Label_C289 +al 00C272 .Label_C272 +al 00C26D .Label_C26D +al 00C24F .Label_C24F +al 00C247 .Label_C247 +al 00C24D .Label_C24D +al 00C231 .Label_C231 +al 00C227 .RunGameplayFrame +al 00C2D0 .Label_C2D0 +al 00C21E .Label_C21E +al 00C216 .Label_C216 +al 00C209 .Label_C209 +al 00C1FC .Label_C1FC +al 00CD4A .InitializeParticleSlots +al 00C1C5 .Label_C1C5 +al 00C1BE .Label_C1BE +al 00C19E .Label_C19E +al 00C193 .FlushPpuCommandBuffer +al 00C188 .PreserveXYAndFinalizePpuCommand +al 00C163 .AppendPpuAddressAndLength +al 00C144 .Label_C144 +al 00C139 .AppendLengthPrefixedPpuData +al 00C131 .AppendBytesToPpuBuffer +al 00C12D .CopyBytesToPpuBuffer +al 00C11E .Label_C11E +al 00C154 .BuildPpuCommand +al 00C119 .WaitForFrameAndSetPpuMask +al 00C115 .SetPpuMask +al 00C10C .Label_C10C +al 00C10A .SetPpuControl +al 00C104 .EnableNmi +al 00C0FE .Label_C0FE +al 00C0FA .DisableNmi +al 00C0F7 .IrqHandler +al 00C0DA .Label_C0DA +al 00C0D1 .Label_C0D1 +al 00C0F1 .Label_C0F1 +al 00FFF7 .UpdateAudioFrame +al 00C17C .FlushPpuCommandPreserved +al 00C0AC .Label_C0AC +al 00C094 .NmiHandler +al 00C085 .ResetInitializationData +al 00C082 .WarmStartSignature +al 00C07F .EnterMainInitialization +al 00C06E .CopySavedSignature +al 00C060 .ClearLocalVariables +al 00C055 .CopyInitializationData +al 00C043 .InitializeBlockLoop +al 00C037 .ClearZeroPageAndStackPage +al 00C077 .SavedSignatureValid +al 00C034 .InitializeMemory +al 00C027 .CheckSavedSignature +al 00C020 .ClearZeroPage +al 00C012 .WaitForSecondVBlank +al 00C00D .WaitForVBlankClear +al 00C008 .WaitForVBlankSet +al 00C000 .Reset diff --git a/Balloon Fight (JU)/copilot/reconstructed.map b/Balloon Fight (JU)/copilot/reconstructed.map new file mode 100644 index 0000000..1ad1cc6 --- /dev/null +++ b/Balloon Fight (JU)/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/Balloon Fight (JU)/copilot/reconstructed.nes b/Balloon Fight (JU)/copilot/reconstructed.nes new file mode 100644 index 0000000000000000000000000000000000000000..21af62f9279bc5842b5f1a53736b85af12987ccd GIT binary patch literal 24592 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 M*q5!!>%Z{+55K4gi2wiq literal 0 HcmV?d00001 diff --git a/Baseball (UE)/copilot/chr.o b/Baseball (UE)/copilot/chr.o deleted file mode 100644 index 49313150da01babaf64b73566e91d4c11972cdc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12596 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 QbW`lw8$YW=5*SALKST7Ay8r+H diff --git a/Baseball (UE)/copilot/header.o b/Baseball (UE)/copilot/header.o deleted file mode 100644 index 271ce51deb45355b06df8dd79a254e74f1c1167e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmX|*!A`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 diff --git a/Baseball (UE)/copilot/prg.o b/Baseball (UE)/copilot/prg.o deleted file mode 100644 index 6ecea6cebf770e5d2f430f0f4e94b54701aa7f6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209979 zcmagHd3crAb?<+^??FNmlgwZfk1yER20JkxVw1E@oTPRgqBKccr@a}~B#w<+CvDT4 zq`r?^rX$24kQv1w5JE?A1OhQ5Kv+yd64POxXApxJ#5{}pSxf1!`Q72UfAC#;r@hx+ z^WN`%5AS~btG|CJqDXcm5=rM@KmI+!zyAE2`m7>PJ}0h5B2WE+hS161jzl*6t0Hgg zk3^dPGKgIMC=$7}GKh5Kz7?Er3sqGR`SR}~kst`(Y%X8FJ2k3JZMJ=Qq4bND? z!*-6Jb9~IPyJK4wwvOmw$BuvWchvvx;MiLe+eg&RG1KvXI};?1Yg_k7^um`?l-D&9 z)b-b*b`gE3F|YW+sn8DMX%Y2N)e|lEZT(zC*(&T1(K{-8BogGb(`V60Fc_gd7m1b! zp;o>g2@-*}zZ!|=b$(OH?vbDl3Ei)bi=VpR}s-3!)Q787C+oV%Q{D*6X9rb)SkV7sOzq(HT~vvFXKDQxBEh>4 z>DCjG;EP>U)-4i@>!RgBBpCaU)*#V(9egyROs&IUuNVeBGqta)sdge_!QO2APwHFN z&7sF4YHb+Ap3o&m8M~xis4PoEo{R)j);TF|qtBi)F;qVt33@d;i9e-MI!J0Ss(sNh z)Zv#RK}MqyrD#EV1QR!0Z5R|sbgrAV^5FB{ijjsB3hmTU2J`Q=PD(py0k;j)!k#wT zg>8-TIPAAF3>If<*$a_iQD+TB+_6sD)*1_cL@OCWDT8L{!;}wav$TK)nsgg+wlcIw zFTx;?mbK&2&bo-u26xp|+AC?Vvfi}NPP0=Y`ar{x)SIg0DcBzN48HUgRi;6{s!6z1 zPN>f?+fY;6`iLQjalkVX{lamLp=oY4t`Vy2As?}k;@-NBGgW;xRRtJ$lSVMKG{fj& z&Ru-PWV(u{qK=`qJ|79XG#Wv(dHYqB=(F&oP>8U`mmpR)uMaKv_h0r4@-q=>$r0Sni)JS~F)Hkgy zAXg_tYwAWf9{ST19mPotp=TbpruN#|KTFY^r#TB<-`S*aiO%b_n%I}AK`t=R6gA}y zlXg8WQNPwn@yj|3*P&_|5a)~(|4gG1V5plYl5>z~`9G$pP8O+_W9U)GEG4ms=hrwX zil~&v`)C+yFVHOneBmEbRQ@`y4;}rYoxSi1XKCra#Xjf&Vn-j%@sVsJZe8e?qPfJ* zJm`KzTA&Jx+#fRP&qvf(w=F<%^wUW6SKM;vQJ34)$KWq5MOSglOvN#6Ip%5vy=LeR z;*GV|;8(4|RS2k;?qM3SG~ME$kM0oN%Uh=?KO+*HYONi{9ETNjX3ef8K%C-U3^0$w zg)N;{Kg(58&sMA^Q;P%Z)G${U5m1K4ms$B#Aa58|nRG7@b^Tjv;8JA_z+x{^AIW2QQW8v1G^_(q)(ls}({^qo2* zaJwLctv^Xof=F;SL$_cjQ+F|(48v%7Mv6ud7BaQ4JEf3e@XZH0!wr43juG-qNoZMj z2hw|MskXW=-b7Uy0)zP1H5#!bHKC`mV;E|{iyk^4qW*!;zj9pT_<`p4Vw6ku8J?P< zf!KPey^R0u(?)RET*4m?Yoz#DjqFHJ`npEZWvFH{&(a1brC--k0(8B$yl!|7i%6=F zv0OK_M}|{&W@%|lYewQf(uPMYJTw!Z-Zu>54|D<%&Bdlyb9gkW21b~#YowcW!yp}Z z!h+@^cpM~CV-ZJS7^J_cD`*OZO=KuAhrE6RbNFqAW-$0}hS9=9QO&d9^t$fjMujV) zI!3rG`GQvB&WYb@2KlHu)LBMQp}eOfYHt`Mey8mSy}F~;GR_KJ!;8}lgT(JuLW-$Q z(>YkG&?eU%7$p8p1Bsf26Qjz1$#^q`VFiGb}$U7A($Fw>d28n;skv87>2w3F`%(XWR62H+D^jMvuPcexKZN;n7 z41>hKYB`Qu9o0G?}SW|$%T`nx=yD={+U!sO=@BYoeV8%Uc%~&{!YcuFb*E7r&+2O8BGk-VwMIqDM+h`Z#TO{ zqPL+N;5SoSd;3Vi0?o#XOSK@*yH+1Wf^`I1%FTS8 z!!q|88efw;!2-{&Mm2pk2OoH^PFGN6nO5W8RV$+!PN^1qU87PtJWP3u#AAIl`wb4U zy?We>A??89LhZ+z|Ho-3be)Te>9q!l)#_6`DPIY+a?~)0Z_rxL4G7DqgVc0|s%j2)3Kl zEo`&BVUWPqNjb(>Bk|*mPC0i&L;D+NJ) zyT2syBA^eo+k#bpRWlOK6)}bnRg9=hsH{k%pHLPYgcd>zaXac0WK?~T_JSvYu3mnilt9Tp_6-Y7P_3X*;@HbM8DT; zl(<))VgZTP+DvaT=^A!Sr?ZLfg9#;GV&Hn8Ms(~Cld_v|o~t{^CaKNX{w>3xMp}ue zGj$%BTyqTdKO({W4WQ5*Q-ps!>x8Jc8KWB6S%ivr8l7O~ zbGWao3dn-#PpgFVQv8O_U=Ky9YGw%|R6XYU$T=gF3KJPh5ACI$|3999wI2HaFkp(- z$OFt*QSo0k8sXqR`H!BBP&aKSxySBnk0pW)s)`yPS4nK}v7W#PA6sAtJ}Luy_!2F_ z2LwKj@k6Rd zOrZub8cYYm!KW}j=&TVAPSE_%&lzE|T|n5o<``=3%U)nYxN8zVN$F`M(O>5thY8Bf ziIhi_czYOMsA1gy`?E$k7{aK&Tk9nDn&S9ks3jN)=Zvg>O$+I&Nfk)twqX$aqN=TY zx}>r<%q`{-M_)Fy40jT#_9Ymv{CUEK>m@YuDmy;C4W-rIFHSA?E7LfQ;jcsLj-p7W%hKs{hR~^Ef6D&%! zp_lWTi}H)oG{akrVYGNNgaMs=(e$ylb3|PnGaS1+w$T92XE=8GFSH&fBBoFi(HuP* zK`5J17HbhSn{F5shdPf*^wnfMGGD(j_5X&`Z)zqEm2+R)J6R(aaVWF|;h+rtwW@Q1 zaH=!8?=1~#4f%zZVB0yr)IpL#&W|(%+pgD0=F%ezn6Z<|M@~#p9Qll#l%i7VwULuq zhVU*bNzU(Ym61e5CkPFps*yNyHG*7En68lP4RnND_gmapq&*~*P^aL6Q9?L4&XvdN zoWNkC@$xfmMjI%Va^BVi;%FkOn?&tUt2QU3Xj@0Pj)^0vy1ohgFf-<#~TzALNG>13TJ)}A=B(=l691P;`>#qnf zA7~V&U!f^H5p~Q`1Bv5ijS+Z1$Kd)UoxuAHDj<{OO)L*dj>ZB)-6D?Q)kaFP)qt-w zX%=dTI)*xePZZZWiD&CPbxq3KI?~Z@+ZkF~0fV>S*4Uob+BPCK4hv!F{XVY#JI9@l zs0e*=8KMqakC_Z`+~FAN0D&NLw-K5;h^s!k%?awvC6ML3rv~gK=f~Pa63F?9E?^-! zKhTKPma>)5eBZ-eWztRO${Ew7)2=eb*_Z%cgxv-ZLQ!V}E4ALeXG3VFHH&U$4 zSVhiC-KHuU`KuI_Scg+pM;JY$T{v^jcrC)Ub0+8vO35kEbT5L(wD+U|f#-7AW4!{x z!N)$v$IXC(e>9i$=5w70EzfI-bWy6z@F3=_I8Fo?gUQnD4smq+AF zYVt#7qhK^^`Fb^5P1H^U-K58(b4G2XsDqAqOv!}@&KXH$Xw$>S!*V(&dKihnt&MKe zg%mjL1e)_LK}w|B2Uv5N&JYxKe@}NfU`B_>wKBA{F@gv&?t7YwRl#MWGk!J2*aM?k zCF`}w>xD+djBt!JysB;ZCVkZ5&Lph(vnI;zxbw@7q55OoNXQ78ZVMwzDxY%T9}S~f zzg(}y=%SUX5mBmRnj=$k&a~AL6xiM|(~;#5&U98aV}IE3Nk`%>XS!=%5YaP^&pJNj z*hP2H$|H`Sb9}<_DcyjVo`yDy5~G*F3GbEg;sRs*50{pc5; zgpe&iMIX72>kQ4PV(2yYO-*S@{1e>7j-x$H%t*~Qb%8{h)Pr>MK+rPYL1u_~h~YL1 z2v&)FN{Wg-sarlZ-}HH}b&YWA9L%3mxe#-0ctYjW4G3%<4o3lenKnaJASVi7BZ(f` z2cw~OGoIL4BODa+5Opv_d76W}-*Utq>4FOoPToZ?)sB=2ut~vdgt{q*^#tR#*|H$q zp22u=fI@;9qN^w5*1V}Z7%R%Xw7NcptCDb`giESPzgj5K;{( z0g-(JHkn7nSobitYgv0UwyWMS)|L_rm`Ol5n1&srTnKJ^p5}8M*BM5$%GT)$?H6~} zrcPG>T?x&;t|Ns)R&Dk%s-x|61dUf{0!GN{9>q`Lh^S^D(0VT7u|GzoH^cys}rdZrF;?{XmD&MrH46ZDvKS zkeAVg*zgBBkE?uBn#dr^gi?5Z87%Ys3`!|`{xt0r-VU^ybxM1FClj^8yMdYsp4mFc zgP{`GE4F1MeoWUe=rWxm8!hUj19;3^-@?E>sJFAVk3-haE86tBmBe4SiuhBPfnlv~ zAo}W5%|J%^8h}^=LtFfq!n~xfHsRIzIzZxJO%h}cmf%1ghdl&_K@o48=wj?Enu>i5 z(_!3(G2SLxmgxjH7ibc}W7jJxCa*MU0-D`x7?d7UlA2|4Cru#gWvbw{h_)IAHQx|6 zlcmMn^MvH0i99SfDLL z$N3Qr$H!t(HIa{ssE7y<^8=mWDXMVfNJu4b!~@06HzKW6L>+%dOQ_xBQ7vY7hMlay zIM3(=dgkF~ye&fq1H%a*@5m70dx4G;cIbEsF)&}FDN9Zn1`SbNfb$9sY|Rp%VNldc zd$GrC9l&RKjXno)6R?_)Nr5IKT8g3t9%{E@uq<5|sq3$SsPwnr(I|{1SDW#Oq=w;1 zHylG%B4KVe!p-xEP`~}Qc2c(1YX_Rl)M;w+(~j9{Alnjr_A~sRtSk~9%QT3Lu=v}` zN1VMiiBfSV-(ar)h7%cvdws6o_O+=zx&7iHM4#3zw$0nVi_o$&Uc^!w(&~zMj zaF&`-5Uu(hFcG@tMg(Q&SP$?<|?wl?EMHEaN3vDFyg*WGR_pv&EkjgHxxfKu_P z$rPe_sjM*DWcrO14Z%+GK46-P@nmZ`{D%4(dapB#P?k_vLCzBTAW4ihTc^-9GZRek z=XFlFQcNU)?59wMe1->Q>w&j6fk!c8NOUBN%sZ{HV_EqsBgLMJ?d{N)Ib^K0YQVZV zx%631QvBUPakVPNhdH?$7qOT3MffOdMC5f&uCrZ1yyrYf=&e-=V<)|JGxiRV)ae!y z9mxXuDc+FT3-e(pj^|cew|!Ey!@Hf2op7?mWWl?d1rJ$cCtJGx3(oO&e+iyXugIDk zXFkKp4^wohr=47bVzRXY#ZaK)Q}hb)74@2yK~A?s$CyVEdfDfMCTL_Q+p!86`54qy zt948?IC+lMghEEX@$+_aHl1ec0t@lw4173T*0FBMLW6C97}A_g(i!A#Z^lnT??a17g{(c{up3W1sqU{vI6E6rjF^$BBE0v{ z9Q$YjY?Z@nF0bP5L-#Y-Sz2pnVRmGcv(U3%Jggy^(4-NXtiUd4a`x-ixQvg-*c=aDvB^oIJ6Vga4F&XC)vUMV&fsCf`qZCc$#Y-X6@`J3{g)GvZ zri==iYLCV-8-AiCBuVbx%t&HCQVt=CsD#dG@GgNYTa7Tp4GDNQ70zU=O&Ue)K|NN? za&8AgAzIIYFLRB>IN(T3XChWP0`n-NCt6r(%feXJG*)iRlop$XVJSn*v+%IXwjhLu zP3Qz;KhlX_*853<7`r7lV_`{+C+@W}3=(f@m1Ur29mjy!CUKM5fQfblcHLWX3Yy0a zt>0QqwvRS4>{K!3()o=>NC$_|=MBeDGsqKc1cA6+ z7Eut?MRkrL=Ib&cV6|Zo|EW&(w84xdvUW2xLCj-(NzHlLW|p8^=n@J?#>}~NM^-QB znwlKK#B@7`JHv6aW0s~N!HRk#u(^WKa4!T?TZMLKIBs^#(sVK=_d>Y$A~}_NA?y&i zhg>H(Zgvbc6kQ+$BM9NT3+5z!Aq5E1Tu=RRwvSHQ5+5d6g~4pbVs|pA3N6NYTNws* z-_<4xo_zJEqqBx?u~%>(v*3SoQ_bsWMcgs^qKGpR&(Uu8?RD7gPXw9_G3At>Xso~0 zd^@7Q)7z2g9GpBKcQE(f+ua5>12e-1A#mAD+&G)2$vpFpPV!!O6CON?cY|gKC&`Me zCz}nDH4s5B-9Tt%I+S9`dox+(BW|CbTKK?5Da)B+Jw^+Wfp>5YN@`P3QUKyH19-!}U5B*8faXk!n(T>9+D>n4$Yb z@z}p;3QgjXKSa(HNhe744Xiyfpe$`COrPB3q#;|)SX#~7s>Qoa8V^W=y|q8EJZebQ z`jD#}LIGNc*JL?va?I9zB*2954ZjJ3+im9*-GKB0W~&5cvY`n9wV?cO>Q!=Ud61$j zm__Wbbqm>*N7=H4smK0ClPrwC%JR1@y1uJQ)`!bqV}S$rjD25&J$8;KR`5Q}NHGrP z=kh57KiMcF?2j9XNwC_{a?VKc&$P?W-6D5#pONBFSFxa+zt=e;N2mlwPqRk2eE^=t zOC%D`x{XGV5R%*kSO;IVi|1jPi$>t1s=J*lpdRL&k($5PY}ASp11lsAn=}u9 z>2hqliXga{=HF2rbCOIgC;Q1USHtnY0&jMi8jIiC;t0@945u-xq08GR)N|m?%&)8LTiR zMJssn1H}nXy|f+w{R-!nV2toQ9C7y2JOZqpthU_UigkX%X%&t($X=?W`hO@(SELKYU=pU zH2_bmYo!^~1zqHj!qN|o;ZJ`!n zp$}~}5-n%V=aM&c4;Iq}MlW)13}WL=KP~`25Z1OodnuwnaopsXt;^W(#rb>)KrrQX z+92^2hrnU)f0>H=+i)p7yRGX)45ex@=KQ>cwN z+tXW}BvLh^X>*!|4>kQN{uOe7SbPa_S#kjJt@RM=~)jKqJzDxSAC zT-I7OZMHKE65r4^)XqyH;??)IIzj&XNS+j|Ekc5DP)7XgzQu@ZdI~8csj&o;bVJwl zMI4faG)xywL(uei0>LuJO^(^xLgi`tJWaeybXJiU2kTHE;)VFN8_SkR|3Su*YsOOWGLhV6Ph}wvW60x9|QjC~=o>a5#4Xxub7$B21B+lIs4wj%L z#0KG@ga+Q)YJ|RrA@TIhPIwV=7X>$IF~-T#ft%=Lf zJ6%IEE&m$cbYx~kKYxs@ZO~4JqyHTwzOLyW?Z%-^x?0KjHqBZ+KXa(xdbN@I0K65rBjo4nHPa1@Vy^ml#D=73uu(Qsy+ z8i^5sE@C=N-AGFie&>yyWE8NIq zMSR6T^z5oR@D=JZ@rK1;BPIW&ZRoI4_n(Udk8UyIOTg!;2Xl28(eSRhr!7Yr_ErrB zx81R~1`w~hIlk)njN|JXjO?Cs{E}lYL#u7hqH*T+571r1TiQhYFM3Fuka4IO-BW59 zA?4+f1+r9+sCzX!;o)WsD)wtlCN^PL1@Om2mzGeZky1X;BW9lLr=b{BlMWCRE<4ui z2x83Cd>Rc5{YxJ7T*X&AB^VjsRS}084TGEy)kq#`__fYayjCUnTm+i8oKn$s{XJL3 z_n5YE>NB{l#tD%_QX>c-9SwtcKfML7A8HaIlI6zn0pUGUaGbA$ME5jD-Xvk|FB{rM zkllF5`VX`cyUJHF+4}`UE8xeW!0J@p3#^xO=s7SnG3B5@_QTf@my&43u7I|Ndy-P4 z`s>U5K>rlB&>f>9S5QYlqf&54)LmNiW*J2!j)Wre!89|myGOX7{T_UWT8NQH+pJ_#ae7%Tx-) zF$^0*13NL^SvrYwDwRYYbz6+Mb+5q z;QwEElTh11hRguKCmp*u_HcZhm4k?$aD2?Mqhn{s_Kv&?B;a>-eA4j=$CmT|iK7^3 z8yRLecKIXh;eYqg`CcXr!wg4W%kp<;$Cj&)>n`f)==g{u-{5eji(`97UhOfK9*%7s zGaMgxZ0{IVQM%n@*v2u#@o~rYj_p*QYWEnnapda){_gTe*j5V|5ic^q497zaWXzV{0)!`9x> ze%!W9`*1OKpB;lu=1WAcFK;!1EpEg`%QVR<%@@>YmMaaTXbW|hW-wVJiMgtyd@1A& z+zx7$Yz^Z^>giidz1h}^p?`0y6Z*LC=kAdNIA>XG%s)-#;K7$AzaIuyESzN3W=!GpG7dqLp*>b{v zsOv;y*f7Gk3RSdK`AoHTPahrJgV=iEA++An$u=f z@2Q6|w}K%4MAAv@ms(8mPOHn1&pX-$4%1!Sudh}Sr9RXsqUDD=KrsAJmr+{3u{uZn zP^N0emS93*aWv3+lppFId5K{|(DwkIVG;tdoyB zbO7=8(HJJXd|tQ-PWbR19xJpC9o#Vt`ekTeXiwZD)^*h$WDN7?p27A$ui;oh5idiW z`%Ty*9t0s~jK-6DXbC0JALEz&%$E&=_&;k2K8F$AhiTrWql|Pzt8E*B3`ui>%;s1tN8cf5~`9=sd`;)B;o$Pa5&JY#XqrO06V(mL`q(TefNB zgkf5Y{q@xm4|;PjluAuxqB1>c#J|Pcicl+ckOqsBM&PM{>=QMN7FI-ckzp3-5_NdL z)~Z9_d~rmrx5+VEMMxx7yNE^~Yb0HMtXe|)W?gySYEr{2ea0YfIi{%@3;kFtY4l?) z!j~c%f(hJn;Oh5v|AdZaTKrK-OPA)?5_&vC2Va zbX>jTNP$Siz3CWeQ4rCuw2@-wFLa9bd4s}OTCiI4h`~1;Tj?Gx{5R!s&qEr9CL$U@ zFD=+zn;7p+$M!k^|3B1D+&E3Ui764?@A9Acj+)_z`8h}lNnbzIHKunj=`1a*!H3L|@oOhU4QJz^MBv9|=b^6)Pf!fY%+-6@Sa|Ngc$B z-ly`kduCyfym9Yk`xOi$nh%F86M;-(>E(Uh_dCa8+z}0RPFnB+y+0zu?%K_G-&caC zSn(&lM3e(wbBt&%ymfSZMvEA4Kjk`~_q^r)$f1)ABPz#!DAGW-1JOc14ddB}2Dde= z?9KX(Bbx;}*`0>G-X)4AB05G^iN&>)ccJxBo9W2T75+ZuctLku5~Jap@D0kbm1C+7<0}-xAO$j* z=9sQK$Sk57to2dH{*IFzs~wpWp?Tgaf@zL_bS8**&d2xlE6uEtK-e%f z1|DxZ?l3foUu4Dy(d}utUbvf^TaI zI^_dT*X&rN&o|`cp~OQP!XtSL*!IXJ-U3jwu#v||>^Hhja_p-bOtr6e!9>b$G=kKT zeoq^zsJUSRRbW#4h>>ZA(Jf2)86=)%-|0$98TLSCL@Xm2;hn~I3h+E`DWeKtCV2+g zhZ;sO<`yFjztMW^D5*^^v%$hJdXd`~v0!O7Hk8ry)-8I=G_(!sXStEDdaxIofcX7G z+xWG$7(}S|{nGm_yxl|_p>|^8}Uz9Bp_n}P)K8DaWeL>^x>O~XjU)oDr+x$|`ziLrbQ)~f*%$W#N( z+;sdYfn zMQQbFqV7HPt!{LI&GBFP=YXw~0r(=2=VQ{|D)DwO}QDGvRN(DFPO6g{Hp{&L_b+W%#vAoRY1QXDx!I4Gg?M6?j1%sJxDe#hO0_WEK4ncpm6 z2~`^VuNT8tsCup;LWryHj;Wh_O6jGpgC^m3`I^Y^FB=B&ZW>2OXR{XJqpzlMs%KO~ zv86JNLU2`@h8oMZJK@(6?(k%&3QA{WWF);whiLP@POlhGTAv&->|W@mS?z;=c~{8R134(9SM{{p-py|1Cf=uG8e z_^FP4HI_)-SBnWHN!25Vz|hpWmkyXzV7mD#BNebChK*AfdG&gR&{d&a#7`q&U+pHO zv56J~Z*3Ue!d;8(Eek*TK)6Maqu2&zJ6(?9sdaaBk)AU30IS|=7$ja&oh?|Sx!a)) zY!z?4kN}AjUdU{R4++wWAKj|2JwNq@S>esL=xqftO#Vqt+bk28*Yu6uYiV(*lB2g;rxv zHw}Y^|IlT#o=oMVD)i0B+ZhJ&X{uuu%A3prI8SN}EwiB*Wcv(33jT~R!99$~`IwvM z14FZv2h8em{8_KyU^NXNC*H-_`LG+=BO(a*H4*h@ zJDzaN)}&<6w#e5aQu;kZ`+bF67%pZqfzR`%f>rOP9Yzqq5xSNmd)Q!r zZ3MhM|EL4ooZxVlwj=r2T-`?7!?ce~`B5hOFNoo>d8((mPz-_1Ry0$lTy#>MtqStm zS!pNEnyDN&MZ;m5Nbs(P1w4Z5$FR5FYCuyNhCzI;Zm_(PN8b+^ReYW%l3erXFUHjp zHVaWUFp7;hcBLA7MS`n4jL^w#gwBTqV7(S%Qe9QgT>hgsQ?wobpQYOF*8Mfs0zUd0 zKOcdCmg%@LTdi&Q@7Y`0i0Ni(H(t!<4RDwm8Dw>lCJ?C4-c$+Z+FMI8msG>(2-?mi z@s6au6&>I!RSh(ON~!56ts&8@fjcxAGh_KHw70c}kw0KFF_if)_`s2miT?A9Evt^i z{bHjvlP5woqCGY+8A-6&5h=tvDG$DDM(aLLB{jE)&6EuJU=*(=E*a_BL3ePix;7dM z`xQ!{@|%XXN|WFUUF2ccyguR_VIJaXaUWdQ>mrvjbrsp&Gz=O>s|s#H-Lv?D`Eu`(2~aNc$`-Vc+?h5w(m421om7sSmQbXN1jmhLr#9oKYjl>Kr4< z)P0(~ZRm3D;zGFOwM7}uf}D*Y=TBMWLC%-Z1ke7niTMQHf88-lw;42X5<)*$pZB2} z>DgMNvEF{IRL&g;curt#2a69Ye=khS73dXbu8=i{Hw!H}D)D!j;N#rT6^o0=8|L zW91-AIv8ykU?D3yL|&4_pBlsc@i}sY5$-6)b7OfLX^VEeryzvJMrhIJ?Z(-G%h(9< zXc`{ET$IRg+t5PZZ8NmC+K8Gj(n&FAsT;0)LOt`0jRg$iL)0IWtz(jpA2sPXqx_m< zs54||>;_{D*yG z^B>r8o<_AZHt#+cAYCX~p5_xQVIU8U_tsGibemyx3lE<)dkZv~d`S^YOUM@DBROLUj|^Z|Fn}8< zTuJI#Q+H|*2Eg3qDE7}M>aE?#AkjlryEHD{T;m#IZ0%UD6+UxZ{)VmDfI-dx&1alV zx=$#dYZ$O`bPUeN?jkgga~kRSl=9de@X4}Wijl)&BQ*#+F3!*yc#h|3GL{s}RWYvC zq~hmoy~r?B0VN7;KnNB~*uQaT%Pvht?)f@Ok9QnH)!?1nW~8Td1A%<9c9(V$i)QH< z=2cATMof#3)Otj~IAP-5GfoDN(hOAh4zJQp^<%B%9HDKNUodGLnIG?C!q-bh^p~O2 z7)XY8F=pQFnZ@!o6OU6eVJom;gwd|TpWe&Y05T{ZvbU4pcoh}G$vnS*GB?5kgg7;q za_|FPCD?_%>a~>HYjQLdTjO_Oa_!+}o#;VMZl&2?NyBKPoWmXbRi}%7$@CB z)I%2-Y;VVdj-l4TGM6EIQ9K=GvSAzCXlTZBoFp2m2=QP%MiOsoAWg!+Wemog;?yIU z64MFptWc78*xu0nZaTta;;|gVx{@qQ3qWheTKRNPn?5rFdV~&a|qsC0RI;p_c`)Yt5`0VAylPPQPLhqj0MML)}M#R zvsm|f#CS5&P^=m>o~1I__>hncPt_VpeR9+>;`pXx_8-oC2KV2RVa#!*W0Rvao`J9^ z1g1N(>yN)XIzFuP=&GyZY`qB}1=tJm}cy zc-_!OSV>Na{Z_|aTC1=fY{E$V*V;?X)9yEHizSw{`&YKy5^mZtd%DK9ymr4Okdr3c z{f=*V?D+R=0=DCSBW>bH?LH|jeTj;PsjdB{P92L9XG(D`X%Y;852+xlxH zP2X~C`8#5N+wX2|HNhaLT*5)(JBpz;lTUqb=XSOo!tF{6Ak%f2x}dnNmbr7TBkoc{ z8cDR$&CHfDoXIeLr-wEM(8sU_?wd3O=GYMkb2f%62&+k>5fv-0WK{c>hZvdEG;&&J zLm$JRnBXrz?INXR_7Z}K6ihP=5>F^6118b=QmYHzRjsKURhJMdVQe!7mxpk#yvPuW zwDDzzz`lYs^W}30k0BT#a5eF!$V5JZ#K>o&2tM7=+1-xKHR%dcZe?ifE+QNxwI5w{ zHgtAN;Vn&rc$EE9q(c@y!TyeZ#`s-mTaB>QNhafWwS>*9W}++2k^?QbPlDj$C$KwB zSBPKO|2~&^IROfGjU*ykXLB?pdAV0a*;?`fC!f>-Iu13Rd`XNl!i_`HXo~e>Cf(dI z6OW4hUVn$H{a#I3-q3nkVHqG@Be8-CjUZG% z?bt^LsqO80u|wRJp0W;*8F}W)@UX8B}RUMy6`4eNow3kyeQLDJg$$D%mDc! zhM}JAuOnPwZiuZgPa?vdMHN^VH9exPX2)AwyE2sM&OC1rRTf*a$c=$v&@e>PFm1>t zEXZa6+q$)MKZ`gJ>OKNz24JK*Tl(sb&4Aefo!s_Aolq0HH``& zsUsx5$%aW<|sf~=QlVK1athofDOwELW4u;WCo78|K zv*rFE57o8ODjYqjL7x1;py5}lVu1E34jM};7X}_RjD{a?(tQNMmhs_mUq@O-9;`rO z(GMBgLkT8S7|nKHkhwuAf>{|Mso{hX z4h}N{OWLH~hqMe)?{VDaNC8PRT!yeMYc~<7%yExnmi{&p3_ogEdQ3wt3cR9bGDzY4 z6y;%>q4uLtxQ0Z_$$q8GPb}-5Vcu@p?gj&}ELV=7@OzZBf5y<7yF-RKOgjh32T7gu zOQ0>NU3Mp}B#a;`BNSyr&H zcGM86f^cx=gcDd=QwV63^f>2;4%cwY{zi- zIPP-9I53+JF%DuwSFK^d?`_m5Wc7|l;-h@ug~Jf+Ae6O}smW&PA`+-j5$ru|=)aEo z05RK6;nR$9pQ^BvZ|pU~jptvmOl`PNN09OxdyQ~mBa1nyj+I)6g1G?kANrjM2bKC1 z|NjoZp-C{v(s;5A5{Ky9I!ht)UB|z6{J!Il^l55DfA9FHlB9foa0N5uQ+~3 z^@#ni9N%^PJI5buIg#P#j*mO?yGNYqp&ZPkr{l|xuQ{gb2=VTJ$8^m>tf~J8oJCEL zs{aN3726Di(pxJD0jZ8`MZ?rkAcUMY8#NAg-0K)Bj|ms{1c}-!-%H4+x5kqkC}6=* zCn&^u9zqVkgn$M+?sW{6kA3hwBw9|1k?)3Bi|$ip80t`qYeOhw{>dH(_8Meq9+?H} zfpFsmmRvsAZzS40E=9jKhdYgxFx7HXt|DM8J0J)*51@uYokrsSq0yX6YAemW=*Sm7 zgnB~hh=y}!;{5q@y*8^=_}R8X5_|r zjUl|oKhhbZaZ)?cZAU}<2747o(WFWEMY^H=#9J|;h+S4_fwy3;iw3x$7YMz4h5@s8 z-OV_s#bzL=@-)W0+c8UrC?y;AIf?&5dq}pVgfn#9q&%dQ=@=^6k~)mUi`9%%CAFL` z+Zq~sm(%Q#C71{Q9|p(*Gr0?1AhdE1A@L*JARmq}$-{ae(X6$5bq`_33svuPzP;S> zs=#PgY_A@8(Qz0(p?!!u_Z*k!Y(#MIgpBZheIu+k=^9OZ)e+l8o>&J2R;Cdiunq_Z z71TsnhY=)w7ace0C~7(4$T}h3Yb~Rr0?o#{`sy_Kw_htAf{{}nX*g9`hSpK`tv{w= z2q9ndVf$|#dG&%MQXP>2^1|LAbiCuWh}j#2gIk0O>@91+4n191!Ag&_S(O!%^6Z_UIuUUdvL0``y# zgeT@>XUN3}me3?G2$L90llG$Tc7{R2d$Q}i&Vx(7;zK;G4WnV{R_)*t;cp_LF7}=d z5KlrKLv%0&;o#GjK|?qgj2SR!2m-9<=5)tU6JBwlLAdL1X2gUBiDqrur-kmH4_aa` z1aoR;k(WdO;r1lmVJi@~mDAk8+giAM!?0zNj(k!zsFlsoRw5pLh6Zf;`#wc_S$M0mVzouXK(E2&%A=W@vsl8*gaRTB;gH3kxF|8ZU=2 zrt^lD1bCc`aF3M-O9fkfb>}v*g6<%6cY*up&Iq?}<%OXI@r8l4w3c2o9a-VVttOo` z!b3~Y4I_b|!3V^d#~fK9BTOO|Bed2`O0aHsxM1RV0q$j_TAGJGo78}s4jS56ixF8; zqh2+`HVjqX#cdfvKRb}y4nq$fM=ejhzfW6Q@$4~8q0-=GFAXuDI|ui()XXVtDa#!A((e~)c*R| zfFC(P$=`SUw&TZ+NEU~L1qdumAQ|`82ITRAp?$%Blp>2a?qy874;7^77P3q#hny_O zTCJktdQ}h~GPNHczG)a#2O5BI*|O)RYKVy4LC0~K9wGF2nmp56JL$KRW41N~CYdr4 zI5$DK=_=CbtJyXU{1@G~t%P{yFciTG%rUkL6;cs2*()c0Ut+L3(mq1-j^i@I%r)s= zw-!ATM}kS^$#bq1|0YMgDNFZwkceU=o})og8}wZU-P)0uM%aWs2&$>` zkxZj}7&lq99As;uk90aQgu5UNqTKWTA{4Y&hJ6(yQmvn=1?VTKEA-pNFev$z<`65J zbb%6JjiK{9m$w#H`b>l2kgS@ACNeby`7JQ?dp>1Xl2yOw-R|ySckzGMA{5l5J;)`~ z&~_j0LLE)2de#=`45?)a1+Z#_*FxhE_?J{^G3$U4ZZ1SE{Nf*W9cR}Z`pVFL57=DtoQ&I-5R zIEDuU5biyUv~N0gRV8&yqQACai`lw|8oTNqL*gSAxC}KFS)fJ;{GFwbzFLD}WvGtm z*N-20rzT+KWgTPX{Scpom`^YEUdoX29f8r6oI8O3QB_Sx!WBA(96LJ>QzahBoQeeB zFI9I;^vCoWVYx|VgpIb2Wg37%R`DZHYe|bunvZJu$-K@qnX2nOO){s+l!#q z7Q!GF(8(7J?RpLiAXWSl&>EQGe?sWk!tEh9o{99@OH<+E9j$xa+L^;>X$QhG#CjO1 zP$|qlZWtWxqLWx7FZOT*Ua2P$!z^vE4p@>n@hTn(orsO?(=`mC`G66c7>^QC9C`Uf zl)Z7l2p85;52ZR*s){Jb1&A+AjAX{c3xvZSPKS24)rck7-=mJ-b$rtC`zm2D&pH0J zBmXM~XTGEF8{@!V8H5IZr#TF{r{lYhJq+Ee36}O_Dn~<;(-w*XGx8nq|8H7JcS!w)WXWE(TGdonQyUXcf!Dh4@T{=GvYtR*93T*2EpO)$^bcn%LRFo5-h9 zVFJ=0ma?_1w-q{kO5M##;R+4yFcL`vznVQLhMNwzXA_A}#eG}#q&(~)!S_C@=Gp!7R zqK+!*W|6A`|Hv>5>R9dRU~%Lk34s4_kR%t6Yaq(uC%9j?*a_Oo+5w{K;8N|RTw#-Y zrS+4hIrwGHGBwcLN-ampxd)9fjuo)Q3L%7p1C%usY(`3#=?d|O?;jCPrdH#Y{C@#> zZBd%mz~bO#nnGAzrD80I)*v)64>?ReZUk}Vr`fJc!$Xdtj$nqgZ=__IhENpeY9Wy< zQ#;V|1;;Fv5`##N5X3Qp=)?cO@{q}6fwvz7^8;Ss)Ds)DkIF#((u0l*BS5~O{3z&%@86(F#_|Yp+(3IsVoOZiUgfb z2|@!S(9H9vjBv0MTg5CO2%!-M`W`aEm4nFY9kz-+YzOODo};>ha4?okvh#=$p1EZP ze8>q=ej?@d(XLvBg;!`04x4Uh32-28x41-c1l*)Mgc`P=f%Te8*GXN%Xl@$@@r2Hh zw@7lk5owcZ@itb!z)&AK7a!S)6~sdNg`kS1c-Ji5Zrh@Y8lrT8iV38qii70btn&vo z5X&Wye}+%s8OR+6Fv8SianxCyikIyw(INb(NoQzexMRHr67`b00He1JgVLX9I>yIK z6GZU1VNm*!YGF62cP+5K3nS+?YCnCk5uEds^B`~Tkk;PAPLS4i9z0p1yBJlIrs668 zY#5wOXd->_KdK_EOhXgO2#+^AF~+}=A#+4Dm~iCle#C)-AoOy9Sw4;gp^I0M(#-{i(^caM`2F}vJu(cxt+m5Vu9k>+_pl%+Vk@!vXQzz7 z-dbct8U_ixi~+-hM6IE=46t5zd|hw^ z-hNwPu&zWq@kAb{k+@;7E}vs(; zpU?7px6t|T1iJV(F$qX~MH{HY=kRlkwKUYE8qz=;Lz7z}Z02eg?v_*?jiwp~iLYrR z92EUT(>!cnup@G<97b%Nq;CosrrKxg1AGjz)td2f?Kjt0nAd2esM?$2N!XSH;x*izpb=+>97+R zJIv=j#@JE6)=(rA>+EA-+?`^uX=$5aSC3T9vf{qh%ro`=4VX z=Pa(qJBjiTuAHK3#+e{Kh&5yY3?va6E6sHKrlIkD6R~1U1KbH}h;FR}T12{xUXwaT z3R_|5*0h0unP7&;)Wg(!6$`-*Rua}LG=!nIH8k6)Vm0az&bSu)WSNQR#s67})$mIX z8}JqL(?Z&Ufr%IlSqaCW{5Qh695x=9y{sbp@MDTt%~OUZx|!HBqMPg)>j38voe@Mg z1*tQABRmbfZ8N@reK~!WL3ii!6mKI9*+@19R)BV97(3cMD zF3rH!z}H(?fU7>*&Z5YDg5n8gbM{-jb?6WNR^dT?be$=Q{R(g;LCk)j_o!JpF=+_p z3=PfaUer5{=*WL}Mg-wMkVWG};IR~T*(xE75S-CuwpJ6Rcx0aWBtPz8p4U|am^D{u zB%%up{lA-_=~#`{JZBG`!@;pEB;4_c5e`=N@WKPaK|PZs3J(Z3H>5}SZ)j$bfd1N% z%-W8&7U(8HuUt3L>)$vsMMk?wdLW&YtBj`JbtH7sI=NsyQZLs+CLZ5+j2N1}3b>H1 z#k~oWOm)U!d$d21EdaL9WG39u>S&~HKdijo9$BPStS;MTmm`dV7M7zXrr@n2(eSw= z|C6@&0I%ve^Z)f;3F(3{#uzYe@ufEx+}TvwiL(w%67Oz`H&xjL$1T~!$!48w5>q6B zsiKQ&8IX`<)4`_N^j<_Srid=O00CD*!2k1pk1QYOhTVPs&+~iq=yPYjGiS~@)6bka zGd4}RW(I8_ohkn*m}cE6AQ_g&15}JmF*cRoFCMT;id^0j$ks)C@J@ZkE3bx06gB7_zLDh0#oaBJGL~cgs0vb?epzSn zzy)oi(wdNDrzotPw=XqA_ADDpt}C}3%J@;SuU%8~{61~<oVam4 zR?Oy#@xTuq)bTV`eQg^dcT2T6cU)*!XoOy}$)s>M#=yC#4C_NX!A{&n1rbkFaB0IS zL(MFYe9jYXKd;l;+43g*bhKkssNCsR;$lLYmEp0AU8OhrVmo^);`exzK$%1Xo7p>b z?7MZeU3I18Ptsd zE3JSFP7?WqnsDeT;XHU`FSFH@6k>M(Ewjh&HBQ^fj#9OK)ft&R z+y;|1OY9v|KSk_oBXF)~lUumnhnxMe*u_TD4Ch!C3E9~h$y#dVF;A#zjXj~Z5>U)? za3G=hp%NUy5llI!-s2U-WR=4;L{CR^vKSU^2NmLeT5Lu_xE~fNCj(7dYQwy;UuKu^ zR*%f@cQ?mxf$5otcw1B1s?>(lN&C09rFMt{+0Yh{SNIB&havaVmsdAFX1;>loNL3m zpAI&FYvDB*Nxz6GcR1AJ3l(>+XyeX@$#;d;$15)a?M3RASbq*_;f$S*(E%(^G#y`30`LNsqOfZnpnuOshF#s$&2nQwIdOat&KD#dH30SRPr&) zD)=`>0 z1`GM&Zwa^hu6S6CSvJ)Sr|_R5mT(~pP)p6GrK6(A!A3=~N}Zp6l&voqbeEx|1Eu3_ zvi`gc2W$)RnfDdjN!M{79m_Rj;f6MwTA8JMsG{@IZ85Da4PBhv!Ygc8Y;jJ)Q_L|v zJ$ENlv6KMJwfO|&Pby2u??pegIo!QB*geU(e8iEj&SFn;5_jr91Ur(Pz;03GielT` zM!{a;PN!QwxtG;x>BjJh^;K_E3HK6NpP`M@jCgpsi&DLP>`myjkN#71hpnYb_lock zC+ljP8pzFm@>1+186b11?c=bR&7!g<(fPr0inL(FksmC16weKi`YU%YYb5Fv!=fFAWr!Hilj(&MkXz@v6SLIcAl8wB>+7!mLq{YJaPIA z+fFx`3U4NLD6<;LGKIFAnHBSxt6q&0j}Pbkbvc*Jk0xZnrNNz$Fj@E^u(x^rn6R`i&=EZ_tb0e;8@c@$fk(e;#> ztYtQkU>P*Gw{*W>^Kq1~ky5wWYVL+A=LwCw@`I&kik`^%A?*%xJWu5O;8IO4q%z_M zOEJ|HIiDXaLmnog5BpDY*M6lon?bE9M0hsWRc<}0J{yUBY&WOKwIX7yo?W3mrrB6T z*>5%c!Y$uUZ{EhHFq4qR(-l7-jq?Y+zF%&>W+SJ4fdN}kVR ze>burpB%nNoMu05{kh(SHl4gO{E&VMmRbQ_k7icjkxz*mz=Q8!)*Y}VRBzAOJLD~1 zI#JEc<3X+;qqTood%&{EiG?;w&j}NWwPKsCyt$Q@?v^t1pB1S#hxUt&1C?Q*U(7kG z$^55{Y|k^vP<{#+Xy7K-+C@&s{$k{k?aoL6Q}qacp%svQxmJF-wZ0Uh6dOz1(7?{n z>2GLdL@NxC>3Hy&MS!Fxx6KYl{!@@@#at^ZRrBnAE1%_2FLt&A?SeZmBkmzj6V6JYi}A)9|l;(%gxm3c8tX8U`L2PEI%j7l57E~$T&84+1XZ7 zxcupOGjH>JucBU5Abf0}L;ua6lJ_x);R6o4D2l05Z3*$y!LrDySYA_LL%4$s`;c0N zn(>;aBM&y@S0A3Z;Hxw;5|LTg{p==M@beb6i@&0sL+f474&udMC|7Ww^bTkYI#@5_ z;W;~`QZY7oMavJ3W?oBAo*BeALoUR4X%j0z>R=bh+PtEjOFLR<>o~i=qWyq-@K>~1 z+~{sAc`zx`{ILHJL^kIkf5Y8YMH710VgJFQC(fzjJo}hZfdfB!MLUQ_W}fvUCEBwS zCMm(Q64$_B|7B7=!=_WC#(XT9AiCNBl9Vc%AN!g0ZS5PYI)5QPA^ylFQHy>-49uNn z{<)QtTOJo*6rU1*Y@6`^B{496US_6zQ)eWS-RdcTsba|NZGQzRNFQShMXR2jp_}H@ z1$KAv;y$p2=U3-iDu#cX+X;@n=5GJ^f$Vh zoR)s>5=trAYdk#xYQ>YBFKdKdB$={CS}qwSE7z_P$>p|(vVEJ=+v(lZaeZtuLC~0V z^*(YwnLS4LcmQoiL%YmKw)3T-?o!Y*d?9Q^z%x%p0(#r56oj1(-h zLDaqeh%kU8?P9CEG%{64mFihC)+B?GV@qv5DTw!x^gXCJH`5;-$5H)VU1~EUMC9u> zkoTEBb?Owcn_)v$-&IqCjXP@mP=*H6aL|79gJm;8{q(5+P=W6x-=;c~WAxeP5`5Qb zhwU8c=zX?zLY|YP7o5*x1@Al1YOY|MI|McjXLP=)Tj228~;n{LLDMEcx zL0gbvJAx6*w02~3xArA8k?@?1A(l2{!wM?z)>T=2ukiR9;0kxvvc2c*Q+ znxB_BDyG{C(v%e(;9@Z;fq@^EwZsn}I@kAmaR%m_@e@DGXhGuUV>A^yC=Xx{RXM$3~LQxz>k{SUnrA{?lG+heFHcX)wc9r;(xX zJB4~B*EZ7fF)636a}`zI%Z;rZ3zO046VU4$p*ph%)xqNib>tdKL9VUlTpZ)AVSPKv zL*dI`v)<%R4yF5EL@$;TFmDC6aq7?w)PK1)igvu7ji454&rWyLSua0sm#MEy`11}G zldvrmwX4qsZm<+q(72PyD%H6P9(GuFqhBh2;CYIS1Iw+H7SUCaY^9V@ysG%+9 zu1s8QGg7>J(vwT3+v`8X$u7D;MM?Gw7NUTh!hLKY3uNuEnIr?(wZhxlowk5T3;&!!C4sKWGKi;XP4kwyEV3f!^fU_y#xt2p5dpB^UBKI<}=G!7}Yn`Os9E*r3 zPQI9Q(UzY6%g$n_iAUenak6`VnLeZr9?Y2u|1^yW3DBKR{x}j~7nj8)46(c zAWAcAJ@58nJincx5@=?N>bka-*oe`bkMy#~iRLkq;I}r?ZsE1i-2bj##I z+nZe>UYVUpw&_M*;zEn<97Th5`j`3$2;pp`lxNsJbz%E*MJ!M<(t9U+Z3(S^{#`bN zD){Sn+gu9HD>j1grrUmcHY^|upR?0MPyXFDpPs`v`dDd44rR?@f_urP&;k8ML;H|R z$-0Y(Vz^_kjiCxDu^Hrz6JmxPC4**mw4TIV_5*gEx-P4oU8ej|EOxcT*4~ETC98w2 zp)^j2S~ZvXVmsTZ*#DU8y49S`Y&Q3q-`-}E6uh9i?zhq2cGg2=S=|W>rnJwdtoc{(%(CtB6N?aA%6fdhCY!Wxp?I9~+XeGyn5m1WL16o4`LO`>) z_BQQoJ{4_hdpl3CZ3vxGKix7(?}Dc`%ybf!E?{cc_4Ss8>#K{H`{z((!1x))c2VW z+hQ7x>`r#Bwc3^&G=Ho)L4V`{XYzaWHuqEcPo zdzf`?6=}=+M+$ZRM!Wu4a9!iM-DWnvsW%5($;92(TYpMGq4gqZ``U0i65Te~sP=y7 z3F-*eNg(Ar+ZlTQNBJt+Gwp-cN1nHHnMWVBEd1#{glYKSY`(+|0!)@aVlX(qv#>t;*8`!X&1S= zaSM~}JZETbo*;IkciK#Z&yek7I!52Q=E~! zyKGqsuS+7fh$zY0XO-kJR+5=aOwY3eq{YvU>u2~XTTguUv6);D6P(En4ecxy!WFTz zog{@atc1=u5BW5OO~k<5IKlj&lo#w2)y$W~A>tPCs#qaL?IeC~71^f@b90d;>@Ytg zHWhO%pQO4X?h&)a{}3Z$Ju9U0D74Z3mMV$GY$-2UNj8{{$~>avA~&36wwhJ~pYX*TZK?>&s$>?Npz2F&X|=gFeoEiNk0~Ieo6}52Q^T z-Px{Ey}iuqIr1?Z&kzMKSwDZ;NV1g-S}<@-MYPs-AZ2&7;a(Ro{epsAlw^x&pJ>|8qOMoTfxnIK73Mpi(=7>+5R+2)Lmg!5ndVGz}&7v$olJvR3AHdxu2hjpYpr zXZFXoTQUD3nTihu&JtfS+fJZ+%KV3P$mMF7hfAzhi5XT-Fy6zbZY8=VdbZtZ8~GvZ zWt@=QdpgChWD8YsLkfjIK|{ZiN;-pmjJ%P#+eY}q%{H4%Es|?%$?wmyv>p-0%%{2d z<`UoLOkCnD!YQ*#Qi)5PPrS#hgdEQ$@`L3NQ58MmKZM##5)MiwRVZzlfB30k>z4`f=lKq`Qa+x zqiixonixLkj7-{TD`-ua3`bJsG5Ej_-+LYM8`x&!Xo#7jOYN5|uC{eFQAFo?E|r)p z_4;$0_2;U%oI>geuJIxX8?z1EE)nHF`Fm^%HSDvy?TB~5_Sh1FWnMoPu8SY8>p1m0 z({vv3kHewI)C!6cr`m|d=Hhg{h{_u=kIF^l@xFG1$Rj3qa%6@Ta|zkoET7aQH>@K< zNycm5gW;PcGDVqfAq1{&7^%*e9%O+>PWTV!uA)X~9DpoXCGuL04pu`eXzf`U`enRJ zYs9S{CoXcWkPF}`mZKw1cc0~jY`YC6=WyoU+%IRIKo+E?X{s}4QHaRnT%qT2ep2_? zOagDS+j?{EKDL@@DX~jj?PaIO!6_)~ z(bdtF93~Hw_*)6O;A6`sXuja&7MVi=`FvHi#X2%-iJhQot9C}ZZL`A>uhgcJ(@3!k z{BTjMxX|1iq%xD)mpvviqvY!ik z&W=&gxUo#HP_|j$AeN32XN0?x0>n!u?vk-USY~r6*o3@}cJUP}p^9E>`Q+siTTM+- z<@BVv6jXULx#E{B&K;37D~Qt!8_UB)?BnA$nyE{%OUJF0oSR|!L_|@N9rf{!Bqp9S zyfA?Q>`qCmR3)ypw@3;WNGC$B zh#9t-%IzgvN?9qk3-oDTvTNLLp=EKS+%=geE6F~VLl*TU{h*J?4@|YD9M3-CKlDUa zwe&*26sa4XYRVPIZ06)Sc7R|a&d4#dag5c!mV{So+Fa{Pt^b^D!ra#;5;xBo^;I78 zIBBV75DZz6YK^YrYFj{lLs~=@Uu_d;@iOcNk61C@svh9R>3hwkzQsomvcYg(s*sEf zj6LCL-GjV9Pw2=)e&+>*a9QN-WvY@Zr;az^#8(H~M^tyP?YxcfBq5?REQ=>NKg}dM zuguyavTk$wAjS|1CQ-hOI-}U$<~rGYgqtyuN|R`!14vcft)&gXQfw0`FS$0;3uG(X zLR*{F%EmE^V?b)m%JG=p(t43S24a1SxG3OlEjN;3)4i^1ZN2=J28nx=%gnG6M!#aE zEGI-RS$NSHwP+L)F1q#!y{k*yh_k zT?Y~z12z1R{2M*R+gMi2EpMk`Y0LXnrP2oCeMTEQ&FlniNUnWIINjRVd9Jh22Kg{-icN2T*47TT_DqpO6p&fC z=jW`PLo)0=t~!$$8k~*z-$tdM$v{25fk|Js`Mfh9MQziQd+lrMc-S8mVRv;pbNRga z=RP{v#E7$mr0ihR7`hvk%y-`ena@ijdi`wO0Fb3YCR|{CAO0M_LNhpyOx?}wQV47XGCo*S=W=iHZmQNZyXX}Y}Dw6J;xP$E>xDK{kT+0KBXU%Ke0x!>LGZ@Uog^9Cmy^e+c z)V2bL)z*_#W#J5Ji7xgY#kANqlJwJU0J@2*ZKtOqPyf6=^-Ob$ij{t{x*DgIRL<2l z4yBn*COvcQ?fOInofuA)6}906+?VMRXmxEVg^+m2VjyyAgq8m&c_h$aT6fN|vaUzV zTZFOL>EnM_n|pFzq|9a>vGY%O_M1oOOatQwO9hP)>zng~r9XvW93PTW!^K`ZVf(%O zQzK>*6|HO~^+!u*B>#x@!Vlj%Wpbh^JOv^Oy;rY*o9Kk|2w zxO>VlHP&LkfEhpB5zslKxI+hnGx#NIez z6Nr-{nmsDv7$1Tr`I}Y$L7PZOyt1X>qw$m6^_Jx)M0(C5BaUo-Xcd$^app~28!JgHxPj_k~`+%)f_h^6av7GAQs zq|7KHX#r(3$Ii7(;&rey!v?4M6>j5VVm~}(E2xhOcvC`pQg|2e9(o*+)r+iNz_(~> zewLFM^$n^EaD_Uav6!tK?}d5?y%l^G5@@--Lk6sNx{pl8Big@do2cU5;~t`Otqmc* zvkzG{Rn{V+e-i~K>!9r;gBRKdRG@USb11x{t(=j>d0hWeV&*wJz*OFO+*_|yx5bJ5 z4BO0u1eg2{9*S)n-4&0JA&-0QJ%*gYHUh+Rl{1oc$YxL+%j`OLn|;vUZ_b(cl%6)z z@Ad=Ybgj)*nx5oR=yyQYyN!8F4W~$wmeaU8((){Mu`4-$Ati2yohPF)ryb4^SBW2r zOU38KWRXYs_P%I>^La5@4D|bDE)*l;SFD;VXe$KE4+J5TFJ4J?Z zF_()>o5%dLm?D;nYitDd%hMt+@G+N(YZLTxDeLSUEyB}cwHO!IC+I0s%I!K;@CNZ| zkx?oX(g89m3j@7cX4YyZ!)+3u7OTa$$fyCXVV%8WNa!+gv-q@FEtZR0KBMm-Z?TIb z+$ugTR*U80wvb+7V~MxR;&$ z>`Oz)ytt*tIwU?V^5r`UlQrSt1U>M7B&1h|{4>7GQ9(F?9=AnQ=lexwJ7TUD=~H8_ zBbJHzV!9Z(viuN!@)GnQ%y(+^iKNk0bC!t(V!9X?%f*QaI$N#O9`$y}wOZ!js60DM zXE0q%664}KA^ob%<>JJU9{6O9dqOA^Cx={v(8_H+d4SItV7izj#>JwLUL|vxSRB#= zpFue9Cg}9!X)(&gDPp>qB(l#Pu7wGDTuM<$uaY?kXKF}~+f+g*7vB}r#Xx746s{M= zB_UTHxph^}Wg(rD|gJ*3BFULl74UzD;Wq*utCDxS8}gg;G87gNNz$l}AehV{Vz%#dC! zbA>o7L9ezfdN8xabTLpWWS$e!1BLzu{!fe3LauyMh93BN|1 zD?txjXD8@^|2ZMO!p_nnq==`*55#mk!Wnsb*4dqNWe)UenJdJ333}iB>u0shCRT{0;+h(L2|cQ6bC!u~ zMH2&^#e{HOm!QX`tWVHWqy$H8uuF9MOso*g#El`nTIOM-Eu_;g!slf>Lg#H`-4D^pfdVQH$abEoy=iZQOwamd$`)c$Yo+_%% z85j49CI)($%m+exip<&PGM9^a33}lAPDsCIBt@B{z`;BB8kDfmR;znEsUS$c!KKYht-LF{B5sOa;JCnK(J*8iW=c#r_ra zGKd4n-PE!uq+gerxWTnJqz6Y4H|Xys=)@>G{eAjMQ$(h!VvdVEA7EwyRT$O-*P@Vq zUFIO1sUbZ$iWO|Q$9Kh~5cvoW{j@kVqz6iwlx1SNSRn?X4U;(tt-{9fY!nw)i0NXW zUzB-CNUxTeCFwZoe8@FP=HRGfGA|R!Z46>mi)Y2J#d|EgX((t&T6qjoD*$H~!e@;kGkvYYR=}DayKM={|C>0@nZb+{V zxz0<_1K0VV(H9akd^rfq#RVcCX(`5>tP2enhV(!Q{47e)1J{pg^lOiK{C~>DA#l*kE^ngY7f%1v-y3EYk!CV~DlVmOzPbBDpYf8w^OERa6 zJQH*E0biCmJ*4m?jq6LIKMnew{;mJ8&PojUC=*{1)2$z)BXO}@d{qqVf$M7tdYKfK zWG4jHNULQK&aZ2f6N(=vJt_DfBK@XXJyqs1@fDGtSFL|~UYK7^(1Xxkv%h#p4a6N~ zj#nH>wJ3MftF=}+$g__9)L$Lp7F$ZM9Ak2)c!rMc7T;_ni67(`Dxgq_!P1T5rvyse6A@cNyJ}{&Nt~^iH z9(6~^HSiyh59{&6=)c-PXPL~oVxV7_xm;`<(!)m$Nzm&^IWLa1g_O2*k@AhXQv7Rz zenLuaNUxIlyx1_LQy%EjBoz?ETA^uSNA1f2;nxaNlRDw%oS zpcmUnv{1nqS+b7$m1ew9Af^f7}ifnc{8LZ$$Vbyo}dTe^r+EK)c0KE{|9p(5WYIeKVv7p#|X#u=m?~|J9i!#>IgNdL1dOOoGorA=kivz?=lV z%rdDH-V{wt63fNG33^=0kOZ9%CJ84v>aCD#+(td>G2mn?Y-k~+T;_fuomW1!{`)8B zb)=jZ{~|IQz*ZH&<7nvZ8 zGB`mGT!$p+d|ib9z;%?&Cen{1U$Wd394(qi-w>r-923&%8`k2d4|W8XL2|ur1MOU!ZSP^Tch`<#^Bpw)hf>MGPAxWX4Yzl zeB=tt#ovf55rC2;#>L+z=w(t~w*ehJ=AChot#B~^E2v59x84>9wK%SArh6zLB8Uv3GbvJ}>@Jd|KpX9D1errv&|k zl-EOgT;?F0|Ne|#*2u$g{#krljEjs@pqGi6BBL89fh*$_n6nb}z%{!@AI_VnxH-$k z-Xh* zu7UqbDSt}PPe^$^q_YIw10Ig^zeTpj#2o0AGXFV2PmxkC{!k43$7K%qqZ)l#3y*nc zx%gv|_XQ{c1J|E~lt53B5*+nInbSjlf}?(9mGoQEMe?coHqIZ1^tj9cf0CfH)?4jS zKb1KM=aZujkS-bKWG#Bgy7Z7WqTtU$df4^f6Li*(tUc=IAy?`R^@N?jkePY|Gqp`E zyCvwsQ7?w{@KL|~j9#kT;w(4k&&6~xDhB#5LOP>@_>7C)67<0Ti#7To;w5gM@|QBF zhm;hV%f+vW{-*M?M-5NV1OH#Qk5vzR%D9vf33`eY=FZ|jJ>(kr5BPL~&UQrje@09S zF)s60LrUP9A|*KLYa!Rbf52xyqxYugQ*O?$i%B8IW&X#I61cKt3;xfGBSWr%|4J!; zt=77Bt^fD=I zu~_RrIEtABD2)>IAe@1g-_*nZlzfhh!t&wpj*uRgIbcqLUMA(ukRF6tZgk!oJD50A zgSeZ9)LP|G$F1ibBOU3ru9a^3Ye*|&ZpsOBzA2`Qv}q{k#fAww?I*515_H;6blORH zdyVTE-lOq+19>Wfy~K1e(92}zc?j1)4}3BS9i>r%9=Hyy(VKg~ppK*5afc(_k>rqT z&S$kUx4v1c$%~F{Y{ifJ!OnPyLlX2lQrJ5NpG`upj9t|p``ZM)%*HWx`nt$SFJ{Jm zA-fd8qX~N8`uhZ(5#ZXRnuJ`LXT>;DT>OKWE(Us;%&&*^z-PG>7B%76z<;0zeB(3v z`z<}Lo#(|ris>RxjOdl(pAz&FQeF?~JSEnKbF4;>^S&i+&PwsmV!9aUtYLyHUoOHX zB1hC775MpWg3kA4_<7xmNS&k*nahK6G^7NsEM1HK`vjetLFmCzO+v1L|F~`7j{YDr zKM8Z7@Ldb$*F$>X$`^C!tThe;C4AHy2|Ay{-sdsz{G-VGJj`*C1tBs2DM3FW<@Jyr z92JCf>@)gk`s+8T7^#;m-6idoyGaoDmc5!oF4KM9QDlvz1-H(yZV-x zF2+Orc7o2Q!|IJWpO=|8)0o3Y{qtw^5fAtii1S}W7Qw+BkhyZ0|23opdR)qP5_FdL z!GCbn^EIv;@9?vK%J0g|oVi-POy++H>49sxlz&aogV4TLqkpKYb*7lJT+9?%#~mde zVpf74_|FdM;iG!nQF;=Tm|CXD92dVYri+1IF7pc^JvcV-|8IXszm}S0KQL#y$a@OR zsUq((FrO47V&EF^RD#Ys5&WMH>3oIK*yH3=Mr023xXfq8upan7AJU^TGk3Q(w39Wi z`|EiOe@eC=MTvwI-d~`c4(Yt(K;dmjEd&379)xzb#($DWKVZ(be>Vyuj;JHWQSPX4 zJmX-!sTy4RtXAW18^J})$)^ka$HhxxSWl5sE?yR&5d;4LuO#U7pC9#E5zdIn$2*wm zKf@~tI$x=w2S=R@xd#3NvWr!1XpC>S@$%|CEk;B}zfl+!hi4M>;Ha|+df@+DNRQeK z#=%lVcB8{wE%Hq==6HzL67;}7OFZE-@XuW0+M{mN=%?vNaP5#8VCqvinFj`+5d(9; z$^^YUC?5ZWjH=Q9Q#F=vvPBC?G*N|pGG7!UDkf*$rC4lQm4^fj-Fe0hnPnGrBB zm&?p%cPJ)Si@{O%CFtR!K3C(qnOQs4=8TK?i!7{Bt4Cxm7h?&o!BNc<^iPf|;%VYu zb27siGQ$|sn}GKv=xjEEPVWPLF2OZ8>i*B@6Yv=^XSo;?pBAgdxY#^F4r(v3&3TXbv{)@h#B#BzXky?R9Cc@c z9zLp>E#y5EyC}nIk+)r#?@G`kQh3LX>)i>i!BO`l=)_@EF%MhGoFo$SD8wObouG%0 zYLVa?9M!T$KbPiL?u>|xLSz1t$T!=yu8cxs{&IpIJ}U74*`tbhdu-;UUku5gkbDTq zhqdOgEBO#TSq$spqf%;I*VF&1HYYQNVI7g##xJY&dy)2Iwcf*wAK=T2IjfYmbdOo{Tv1fAU}(0LMt?ZiL{AJslV$B#x=oNZ(d z6pljST(E6|9zLo=f@^S8#~OWo2agRWISP^w;R7Kha3vq2KbWA0k9sJKZ z5t-$Wk}NXUAM+z(*flun(VOUxh4d7=*3PfoN$(Xt98#Fkh(hlbc1qC0M?Ie48XWb6 z&E&ld%e261kqxq@>>5_Li$&0^p6=gzG2QM#a<%4I28JC zwR&<$XY3UHy7-j1Or-yYPHzwf`d6)xnkp_{7oQS)iOe9x^>Rp04(TRyrPx^vT(8L- zxH5uDU-2JAmV3v1O=R3v{Y>ZQL#}~;#$#)B#%wV&S_=c$z<;kA<@YXw&pVbm7`5;! z8_3~FH$`e4Wcqs!HQJTt-tTk9#fVrbJ{3}kef-=A=}Tn}j$&ClT(65?5QA{4?JD&X zJvR82kU1uEC$X7$x5%#L_zZLl>Fq-LZ6O_>q*y?7%nyk8uhrQw7jxT?684{{-yZUR zo6XVnINQnGBBXSbd9ld0T=+>61HJSndYSZy$YS!eHZ8=CBJb@{B4VQJCF#i_*J7E& zAsm+Sj96@o8u^#J&QdW$-exJc&3Vh3@($d)7cnJ&%}-xueJ3&an_CE{{12;r1XV5F~}I9;Uohca9IK%6fw z6zP@Yx>O8&E|7Pz*y+2p!8;#@IM0)8ZAS%ThCO2B$D&q(kyyG9wE>ha@T zDhB3&E2MN3yNXe9h8XynBlF4-mxWwc*mdTov#=xlmB?4em}iKsZ^GcH_HzA}$k(78 zwN6|w@~tS!MmxZp!1m&=Mb>IS*(A0Nu|(#;=RlbQpPOagB5oD8iGk1mva!6gVCgM* zUA!S45KF~1;##r2m@D$tCr2F=4~d7xBjPTxy-jTE-yAvXh)2a^;&GAh4RJjo2L5-+ z%y)(8Ys8b{DKYTbPUfk0`WB4@!0j^c5O<2Z#CGCFkud{&?iTlmAB%g%z$f31;U_9y zwdIV6REyWded2!cx_CqUhS*;GxtJ=h5?70-#WUh3VGelQ)7RNcWIhXKwkU*W#d9L> zoKen;f&Ymz2mUX}d{L|rFNv3JeFG2Qxm-*UFNjw}dV;vF76YF=&7jZ|gsc$wH?GY; z<9djCc(pm(i_eG=ag`W$J$@6{4$`B4$93NWzI=wWy~y6Dm{*Cb#lW@8|LFSaO^H=~&-Y~hB!phHFaKmtwlRUd zL}uAw{({(1WQFNk*IQ&}gKreJV}`-86J=g0vYe0frSzF5(YE-Pv(DCH2QmL9`XT9G z6WfSk|4XHKd*v<5fHdEa#`&DsS`73jZ=!!ML61r4BC-_|}`{;yE~cQ$8CTr6gYuY~kcncoy&6`PCq zi!UbVKa}#1_A%==yeh`T)gn)a=>IA{FEXbFCGfLO<}M<0YHIcEG6%;#BlB-8_Yt2} z=ZuMEVzT%h@p+M*(`)^(SsvytV(XB8N#@|#!2fS-8@-X=i_OKlA}cbX|Fift@mVqO zQ(xxi#IJ|+#xe)T{$q`w$@P+qS%k2;*iLLHepmb#@q6O;#XH4DA@hAQHwY=W%G}I$ zQa}Hf_y>`<&M5yWHW!~2* z_$~3-9%DYmh_?R}*4Q)bKDLVQ+?h`$#9LkwKMDRZh= zEWRra6bFfgR@$5qd$EQ1ZzAt!(7z>qTMS%(DRU$7HSt$sn-Gg-ez!)sz_T+;;=!@v zcrj1{vQ81MMG1OWDc=-ZhI>P_2#YuLKr@R8Og*Zs$EeHBI@oh119WFB)J>i-s zP7uE>27ZcU4*cZv^%wK2#b1dn#MvSn$>Z8pd`Fxp27cDb%+B)o`L*~TA=j-nt^;uW zmN~yIwh+&Vsp4zmuf#SX(huRNZ;Gt2h`E87BIbxgZ74Ov2yv9yQhZ2E5eJLI#F64? zG4S~N&e4CXL{{e58xl>39ySBQC-u5Q?C*ka;r*xY+Zx=g>EycwmU*6)%+!Pq- zCuL@XXOvMPow+Y4&x*x0`e3e~FD&8n;teq-P7?oBoEp;EO9}sBopueS)!)&3P?NlD z&gaCbVso)b{6>O)LdsVY^ot4pW44lFK^Ch|Qz`nr(bT;?~#6(K$FKUvCiVrwyGXBp2tEr-O%#Vv-NYFb=VXyhW@gL}I6ZEc9+S>YtXE9OFlzyjphZy*0BYTbt>*-SX@*cgnO>OS;^_|_thGJM>ETv3j^Lm~O z{$Fw$wfYVFf5$xT^oITaW~6Ab^a% zYi5t8TJya%=7|)|`sQSjCU`AmJ{vM0l$mJ+3_O2dWY;;&OfrChxgccjUSrO`(&rQp$5a8OmTqU76Wsakon6s=A{hP#LUUYvyfGtVPmnKc&pf4 zOtmrO%``DE*O$4O*hy?Cwi2JSle{iw3nO^re`jPuj!ovGORPJ+th!E@hLH!^hKFIY z2F^$x-!rkIZhvDX7`Cb!n3Qfys68@lH%s*5_#yjP^{>MuewI8Rn38Tg$yXWH-PaVZ zpKhyJhJIj!bUVRT3~T~&hV63u-^Lo1Tw;cO%-X`46eX6e&c0wP8~Ta&ka?1w$+1_e zY?SXA#{!E{;?xe^nUp+_LHR+qd9Kf)19Xcsd0d2L16kjGUJ?gzQFWu%o%PYjCG)i* z$(><6S(`ZayDGcLirW)XtX~^H(R;Uh2MYS$KR1{=gG9@9Sj@F^L_-%lL!s(o%Q&Em zU84`o=2#?H7u(O41X)SO^KyxeCquC9Co8=lV_CKbd_jzlx!%rJ!Sc#S$)xn5GHfOn zU2K~=`lxmRci-2>wD9r!y}ZThVCTr{jA|1}EMUBrRBvYNIMMC0Rgg4=Hix*K*M)^e zc$i=ZV^63%Z7V*C8d*8ZPRFuY_JgzKW!gKOn&jh78apEsK4(2x7rBTv+*oGYJx(Xq z^RjG^(s?M8BI+89OlWH#vW_yllpm)8bC26t_B=1!E)hyTt97%;e0z4|Y3h-`gYRP^ z&Pd(>o6Q2#6MkSlu;pK{aV(C#rmM}nh9Un1g7c1osr`ucP!R5}#*KgPv^1^f* zKrJ~>>|$kixU!jxWhH!)9Z%z^Fs9oel6{fLTO871x|Ox2&*F4X{mF#W?J9YAiP*(f zvRXe5O9-lqor}2hX-*e&x36Pl%1pbgSIhMh@ zrFO(N3$@bnWHI}j*vqhnqXF_9JiH+Sm%6)SHQfI&C++5p2 zC?xxGQlH2lOG2(`Xj>lj(+wi;u$&jUg+zLb5wI@ShnuOJWAn+l#kSOo1%>Q1t=-BC zb`kH)zUFqei6xdv9J5L|aZD*)!J&EMY-pgoxqwqBYER(B*|1_r)Vv2cSa^%w8P{G zB4yD-UbgzP$o{hzZ5HXs9(1s=Gm@8Yv&q;5J<@|_y?JgY$Nub9?Vp3{YfyU+c_9TZ z%^4|r&d#xl{)Ac9kHy+!{i|#z*Go)HA{o0{6?M^G6hF;SaBvX@vX3Bbbj#3BiFO}Tn8S%l3Y z$Rb4#*(R1ckCEZ|ydyGUobBKO^Lp8&2Nd{Z7HnU`QuoS6{i%o|20h_tQ{k<-+pdsd z$a4?-X`NkcCdo!pmy&ObZ3;QIt6kwt->udUcXWjNE4tTKQjKs&tLf`dn~d=)BiG*J zw0R@!pl=#5ku7m_yYr*|N(DwHjJ2MDk7L-lc`x(LY@bTUAkJ0KpjRGcx|UO<>2y0x zC{d?hS1$r9wo?y!)SM?_ek^vequgAM4Wan{!09d09EvIFMl62M8JTq5CR0;URaALZ zao&1RzzeS0Au&?lWy#e z`M5ll)^TYSm$gtNBr4SDc7d?(a(YM$an7;b+!}Mjh&`fot#7_l$0o5c08zS(GCAQZ zc7<(d&t6NjdES5I_YghyE;fvYBFC0%P8y6%c-|J0#j-EihKIPROLjKRy=^3dy4WP{ ztc!g>(d%}}PIK>BmuyihkLK>wHT5h`-WiaZZX4=(Gg8u?QkQITcK#iZmTuI}c|B|z zg@bbxc)_f&57+@?4O@_qIyqKwo97y5GuupVc=_8lf|D295-%3Co4LgA$_mS;PJ+R{$W$Ru_YZSI!tB_bXIJ?lX@ zxDe*&oe@gR*19h3BDva$Y;a5o>tw6R!#{Akr$P#6C)>iQz981KT_iy#+eo{@&N7rw zJdMD)lP#cj`JPCdpU5o)$X_n8P5(Bu@`2<(g z&<^>QOZC%j1@&rIn@b#axaL1tE|SQNulY}Me-7B^@lw}zQb`Ypr`cTJapeiCA|vPB zYoo}HB{qiIjxHP>B!4=XM}BN(Jt*HVH?(p;J>p2cu9!mZ-o!iwx;7s4aq22+lleSW zc+geUBy5FV%o*~SV(;5>)JwNYRQfaH=@t#Vh1v7$Qqn(~Zs#bi+}6t8tSkd(iR|grp05O*I^zki^BUQB-%ASbyV#l~FV&`V`$b=|jbvk501|tzGkFR= zmQsbUX<$9cntb0+xEGy~HB7MQHrXJGd|c{`5*rbNLNtVXuyyH_QPazxhRp}c+rlIMl!s=q>^fA~=R{ACK4BfR%vR|RS!zN1e z>R+?&v~Lp{*h1e<=1)~Nls${i5>ghsx8(Ewj+2zwKng{wGkHoyn$03pmDqmjpU1@v z%cbn(@pASlFDJPVdCfD{yj$$-V{cJ7OKdKMqRN?kmOyq;g=ALSCQ@v%*$&DUC6%kB zq;h7G{)i`iwe6;3Jum&bt)`l#Ur9ljz&tqm9@%Vz>bHPfcS`f{%eILMVYO``eb^n8 z;7i#roeSs8l$}e?NRinXb{QT}&Rb~m)PVD8w*MY}FQnOdGUB8vn?p`!30rc>x15oD zzP@PVf$XJ1t>;Xh!ck{wM%YaKElyct{irRHo$4l)QIs~~WfljN*qORs?qTE@TisDx z&$wba$^NQgEvZ}InH*bDW!-&K_={;ai6)QBD5Ub|fU%?)2aKb1#0FK_3=S!=d1T5I zr|);Rk4_BRSdhwhI=x@JlopoD-o(9^+bXW@c4uV5*KG;4#1u|)&YQoe?IsgWw;fdM zbd4!+6P~dler%=fZRMfPB%zt&PYpYPH@`fg#9pehU1SswV}{2Yw>g?hp0lk{?!87` zSI=Pb6ry-MS&K;OPQsVi`#2>#lViWAvX4mCjd&^1b4(um2ZNDGSM5VC;TVZaH;`K& zMsk+eVD9f0XC&*YRd~;{$|@e2qkTpO9nwNGBes$cMK(y+;!#M{sBF&_~wcA*ThrRpvWI_9H^SS8Oh}5!vdU zQu(TQU2G!8#K1K$-;mPIc9V_ji%dMlyj#2xQUX2TKieYmKhxOZuf+}`)7Vki(7D#N zfz0?N{dlm3C&lYxeKG8sU*kH){DVMe2azTcGrJ$dz#Q-eDS5VuO#Xrx6H`LwK*^9& zAZAzz_t-{E37G@sMJc^SQVgHZ+Bm9(Fmt86AvP0JLT2{VCaqr(CyQBPir7;O{Pd8y zv-PALu*ElQCbBV0tvOJ7gp{84K3O^@_7Izi-9vgx$Q-lbWXB$2V9pMi*+Lc9M&c*t zePn1Ru|jG=*hoxNK5@O=&iy+ZijBlXx(NzdJ-rvh%7`*J=#p1 zE50D!OuyGo5qqB#*>4VW8?i&kyi(@w;umev6CVEGGSI^e{Cv>{Q@u4yV4#QjiJyVw zpD&v8^I~W5$&fkF13$fNC3PiFV=!0b)gtD@;xENEA--Z8DDS@(!{(JzlEhqbuK0qT zq-A>}fq~90#JGmd1$Kq_=OZNeg4irXrWvBgLVVFyQ6Afb_?pZQgt$^>x@ao7?>y}B z`6=I!xpRmwgj}21AoBkkV&@QFkU4M-m@8$K&E(PQVKFe@D)T1sj*z*(%zbPJ&krlb z(t_>jNUKLM>EDMKnRAl-t=Hnt0dNCig_jnfG zCuWHsi}#5K#5^%uoN8~=PiEgz_^^0f{E~Q3+$Uy<*KCiTsh#^|X6hj3uZel$FG9*B z+eeLaT+9;piT8xeFUtHi@kJ}A1^Svup8<1LNa-!}Ga)_Q`twBHTl}(^DKg$tt2Yhl zjV(@?y~Rc$b3>W4#FUWEa`vV#pirBM8DWH$i!<=6h89Bh*Q;dkc z#inAG4W(vbniK3HGDWIZ37Z*(M&DHqJW(DNu-D0*_SKKG|5s!%l;#@1Gqa6{Mp7+0+|HUfFCrRQBd#k?pnf~v**4X|3 z-#Lr+k{!_hZ;X6>v2Ec=h0Q>xGT!oKejZCoIu&gfNxBxjej_P~r@Ckow(4lLYS@O|kEc{!;eM_cNA(eMj_h z*|++52lnmJ`m*=9laUha+oIR1J!W>_?SnLtq^;3X?6&7o9}##=|N5c2! z=qCAITQ_A&y?wVAxB9@-q$Ijn>IarQ=E=qPFK>XhDcV@)>G?22bJ#aVJIH?iF~;q% zZ;1BRF?*tnd|_W7y(s(QI~WSYzAkF=f3hi~h1l0dcgTHfW5yG)uZbQB&Ur6Gj@Va6 zXUjhB2_KY=PR?_KAIYbfoOVTQN$CeOdGo z**|!aA!6)Hqo0#K|1r;`OQMg-wv>s!elv@s8M3cvkbJ7y?oNm9Li;Fs^{PkgpyrIY zWB)K3m%XA6L-W`dMUTk7&KUH@zA*ZN!r1o+BmCGGM7PR)#bb@%b9$lk9N!}r){M2G3RjwUBp-9O|0 zlYXt!qr>H=e_Q)A)@jikSxfHYg%b9u(Xp~mz9o74lkeWX&=X)v^i65yjd??b{k`Z& z+2^+4^%nMbqc>z#iI$NC(Lwj1OpHdPe8@~_ zzxfH#%T=DpbD!W{EcSPzr)BTWs-b?>dC{Y?Gl+ZDGsWA{gR&2)&r4D4|>&vWIs<=(QB^J(G{{^yN4k+?4zO|$-bg( zp#Z}J?uHrL9!3)7}-;2hL`q1 z(QGNR>!p-Lrq|!rYQNw8!04Z(&WJE*JUIMd%x%_ z!4a(^qwYWLxu9?KB`KM87}>-AR`d_Dk7~+f3haHNzmWahBaGQ$?;ZV>?0ecU{{nk< zG(+~`4iRP9{HF7;=Vb!5zkJuj3ib~HK z`_+hdkDih3@a>U(O(wL${YF|HWu>_hCOu)lmXrp&DY>oKv)spN)8uFBL+rPXeNWmT*)KS(8* z#J(%-E!q1vwf$|e?@W75_6<$!E$^J{NSi48q}I0bA?(}J+Q>fYAsgq%Z%eyV_Gu}8 zM_beC$#$u!?evbzmb5yu4{6F)^w>A2MP%QhR4PfUKH>MXOnGEeTA6HX+t^Hx`Hg9% zvUjg4#ziFH%m2s|0UZd0D?S0@1{Sa6Rl z?^1=hp0!9G^)Z(xd(e2=Yhd z!RKV$t#$^^v}4yDWPDxi3H;_1o2Jsxr8WXiGGP%UT&LOsxI*qHt9PhhKOik7TCiI3 zsdlvr{r#?Nfh^jleu(~LXZDczuc^0zx6If!C8<{R8gQL2Tc+_>)x*G3+UzCC+oJ9P zzV6P_DG@fS+kmgiFY}|a(xh$yKJ+I&H>v}0_77MBF*m5|(D_E6wNWL#qK*N+Xu&FI zLr|{{1#Z=6Cz6co)V~HkAISE|Aug+b0-PhUUUJ`BwFahd*Wg#hho)<&*6L4zr@@Qm zl8aWW1A$}YH|tQ%sZu)u*TB}5>Up3LV_{lz+;r4sn(TH-Z4GL;7E95RafR9dxZ9Q8 zr%)?bbHKL)*&1c)GWF3WDSe)?7bI7y`X#XZ+0F848JDP^0^cy?F8a2RRK@E1pxo4C zx5!fZwIIgnAZ)$akdA{4UzKPo!ImT0Y+>TjWUO`AO-hsaQW4Y)^OjZ_IQ zsNVu^z!h1#`YceMJIkPym8K2?jW>3`h|A&T$fM)b z{va$ku?6zjShYQHwEQVA87D?<2z)nC>T;PlHNmBbd4{DVShQLTJ)81}t)#{%^{aIf zy@6--P+;n%dZTk zTo|hU3viAj3#QAT5cO%`>!-PD(>_Wx!DesQ%BSWS|p{B~f5Jm2!bg9k^PTQPSHJ z>F=QATe5iym2D{)xW$!4kOOW>Rlx0DQu~=SyGhSIuTkzi)x*cqCzQE7xdf*tq_0O( z5GYrCSw3m>q2viXug793>>fxuz?WQEDDiJfmcTQC+-si&y2ja%Bv88jS%iy>*Cj{b zPBS)6BkoHEz`+Lc3wLC^CY7#|w(ejDvnuJLLXUg19y;HO6ocM&XO=-8u`FrBBVPJ) zQ|eIi_9ZDD9I=61opu>%=$`abP}Y6ryS_5MD}5KZ!iFVNGFX(p20RzU4rz@G(hq=Z z^te#tN%FIKDI7Aco?$7praRI{z%hTCy)DBzNdztKUd}yL)Wr{(pgY;J-J2SXQZV8Nf(qzXI4uh-IPX_Y0(?L z>;lD9zhr{`R5L!x@xD5aXg8!5@HA+!LT?%ONzZ|6d0}1qwf^9#Hrhq?N)@2CYq2$o z^B$=b_$ANH+8t30bxWC`tjJFQPz+p`_JAXugqtpnp0j>S6nR~e8WP-;zYavBIwdEp zazOqpjBtk(jZrBAOQ*BHh9nVvJZg%}_77qrVk9^*YHBCf z@4H_md(}wh;5hHa?vaJ7B~9Q>`7)pKb(M6oq>}A9gPV<&(jm|*T)kY9_JN+ck|rvo zU7%*{Q_JNiIceN051~RV3rzBECS8|FPr-8)w;4;N$3SBkQ6lvL#p2dwvD67PEPoM; z{H#c725xX?yHqXd(o)iN#CqFksp_ePg z0q=UV6N-(C(qDmp%96;Ha->ov#mG0dX|il77~Rv_?1)a6CH)+@_#7K>mT{)^58!l1 zR!r$TL;5SmKhR)RbQ9--^fC0W+p|{`YUz?Y@PWiGQ-VyBjDS-ESR|=ERT6=7wO9i6 zr$`6)NS$c`>@sDBWN8{W+?u;AUKC_Xl2i`LJ^A~#q_9M(5?Fp>CX#|VK}rFB<;D6b z1;7Dx#&QphP*d zF(VmAN#|hneffDMQgWp94*LJXN{Br|`Y!zMK!;tzUP1a4x>rxJJ{le_odRwOJ(JQTkP_8wbyLIL+$97p%G zAB!W+y%KK#*LkvQG~I#N2;6GKddao+#UDen`@U?9iq)QYi1~&+g#pV*vjy=YHVk4E zMui~IUWkc6eO@eu(!#D73_Rq_MF!T92Rs))0A)ar4Uz}$hy%ctmh3j!|CzW1e8ZH> zGm4}+o{DogZ_*D?(D zqrd1X_pFK@;7#!r zNj+m?26|_-STzOQE%6=->|Grx#`(7Hg5f&1=Dt8VXH-lE=ae@)PsMUX%mHV+2Y=b} zmd!dXXIT6rc!uQf?@+W2iBZ50o%n0UMY`*>WgQgX1#Qfab(6~sh~EXCRr7V?6Rk`# z;!W`@pjGOy70Q48VgPW;StP4rx3tV!BzjC&W>m{vsh_#^A zSh0HAt+k7nfj2mA#iR1HOlcDnK-tt{l@wmr#6JUnpNliQN2Y8Q!$G)X&lR34rM=Wu zF%*6s1k#XF+@J%17%B>W9<*t5K{2 zE$kd?rL@%``T;-lXC0)nE20l@o)0%`kV~`Fi{_wQ(__ymz0`?&^Q5Llb9P9Mcv+l+ zx$iU0JKlXBznMIhYcwb>IvrUi(+O(D0kF3jvu*N@8nG9+UYmPn5lNesYOxWNkkc%J zCae-`fg2?@PdTwtoCfaT_?xG1do|LY`I1-wS|2tU72-vpO5B<)7lVP~BsM@{RwjNH z0;V~N8v$4|?zI*-! zI&E4H&pbF&<1!dD>XqWZNZPm{{v2~g$)D>`>P{CkfX|=e=KK~(pK0Q|pfsFf%cPrB z@dv=0YVMlp5hbw{@g0TY&zjH4I9dEI@W~k#Pw|!{ZU8?t;_s^K{mR{CTB7(d&?Ypw z?6Ws1iW9`QKzR_vAG_WbyU2F&;*X%!%kE;k{f7I{sd%$t(oCG_4c=0Tosjd!ioXHh zln=W@v&V?$=ufa`o0Nm1#YDw=+I+Upfl)H{KcWPl6OlEL_9I0d;CXM>M;4C|A7jpZ z8-B;8E~uV-`n<6atHAf1MZFXqVh@%n6pN=B$yinFhr zX2)dr5V0L2iUjGB{eANl%@dtLyKOpWu(*hk`9@r>bcu9%A`F2tq|f?Dmv4j{zJG0q z(_-Brhm61y_K@b-72+|bM-B*D{Bt1#_<= zP<7uHeg?ea%-YG6Tf+B%kFfE3EPNU0_$*5%^F0#I0arV6OD=sBEDr^5P+r=xEpHh= z5IzmOsm(e_o=qVDIMtae2pFaj8-f8SvAA!wE<8YpkNL7Xa-I9a)-1VJr~FJXrQJ2* z3h0RL$pe^`w!>7tgkVWAPD8*`4M5Fx-h0nTt^(NrAggqJfUXvkT1oi0CSg-5{A@|*d{<7R{h zz)?I~qWU{6+*kVD+4Ddd-xd~t+i*cTB@6@27_oVhcT#8pu5;!tx<02}(}a)%+mYBFDf5=_E#Mw&;RaviwG+@xjy)Ij%$41WqyJO1wg7&(6gOlh!K%1L#CE%1Fa_8&65ESLaxII~?!3ble7_`rZ&qMBJF98HmK z>TFo8tBk9K1K?Cxu1a_S6l%oH=(f;;D}`ZD_N~|}@{miyE^yNs_LyR!Lg)s5t;t20 zY*11t7qUPp31Ca4{W9Sh@Sw_dwp70)Um>s)Iw|#Sk z4+9_IL$r&+$AB)XSu=6x2(KndLzk?%t<&X{53+@QP*xndA){2{$r2VoX*0&KY zxC2~ez@{lLWe8rF^MxzhC5bKwUFa{C-<(Slqzku!6U^8I?Ge(1E5L(>T&3R{`FN^O z1IklQfxl)Rd2ueW^OQr}<7Gi<#+p#D*XOeIpxW=1RlAaTVe*rh@aZv$7WV;06 zpP<|n8=<^?!WRMG^JRCa{|z4t zJdRKGj`=?T-S=b{D2pHQKL_5z$4`g+kAXT*u|f*O*ZdEFvwhi9+L68DzXAN*i&aqn z0sjTyIR}<-TXRpPOaXZ+zf>3AIp<|+RIr~$WSpYYp2!Po$7^BX{Wcno8UUjmxK zP0Yvq9MBQ6`6GS;s1s%VAwL9kUwK4>?*+P!2R%0VcAyoE+u)lNP7hkcI$sMkj5FNl z%Yl+`wY0_;0L?(oRX!W&f(gr%zuKr;;frL<8eQ0;{H<2iGG9pWkYic$ceYeZd>O%d zE!Iwt=-lH=2@c6$EFk8)d8E?q&xwnN7CbP;ri|20^f@G_p)Dx( z)UFgq;XBSZgX^XjdqLZZG5-6&O)l&XrNLYLN0eFQm&lX5kMb745B%92C7dK&`rDdfAmP7jnjsxi*HBoWu6^U=ymedz{?2Z z4!#zsld(w(#CEeEVj)V$A9d8BP@4=4gBJnc+a+K_IbedfznQQqc zz;*JEi_@;4hTj4%^ke;$`l|U3;C=Zg7y@Nn#g_nQA^0o#OrUW*>vM_!Cs5;Awocwx z!G9U}r7OEcW6SwZ0Y~7esxtm9pltbx81k}G-Vb;}-XKsCFX6p`=a9OJc@LmG*tv*z z1*(Ld3wbA?bbQKFz<(9!dJua+#VDV*P%vc7SP5+kb9fFM6^`r$StOeu93c&MAdO}5tw2$ySs|@4lfMeQ>&()~UKzX-^q+N# ztMq6lueiW_Vg6bRE>|~}Y?jVfV$84=H|Tqv&Y8yl1C%iNr^pDW@*l$E8huVuy?dxr zr|U!Q>w&Lm+m*sQW41#bZrE~#ESSuH2VD;YJ=R-0Gvv7! zVEV{w*X%n%x&v7frL|!GU%;z+e3D0^#{ntxg!?dPA!^R@ zGHq4faDE_+da!vKbj;nyVrnIR(ktBHF%3H6?7&m#&Ly3V*OV!T+*weP^;jE;_nJEc ze8ZOSbNOsO)%jQ4%^_M-*%{VE!E?YB0`K~>QVPUEJ!cE}z(oELDR zCTk&kJ>yORhsnRbKmqWSa|VvG=BlM9dNSn+Hw^c@z)N{tk5RFcG z-)c~x7frg@;;s+ULK|H92(i;+k3@RRm4i0oqxIP3g=411wAqyZHQ#4uA1!0oNbQff zpMW9Flp8snM5XW{_urt@!LK*D^FR;m*;{hw2KN!bbyF6PPi(kTz%NbN8p&{%j8sSZ>pP z^B&g^e9MtbaSNp@*SlQyLz-aEOe@wS!|$%vg@8=mCF_!)eE(Kyn)bwtTs_82oMsnA z882`Zz-i_zllJlRTnX^J4|_rOzr$q#hX$}hUm4GFg}{S0+=@XA`S&dMJ5WYXu|rBT zGu+1?kql`;+Ffi%2=+X*F?{KG-CXB*=oa?$tr@f@XGRQ^8xCY>mKvqZY zb&CrFt_tLC8CFuTj&fs22qjwVgzEMP_YZIs2eMSURvzZgLzy%7Y=#_oh&zY=L3?&W z)*a+DfIHOOBp*uqr~z)IpJXWD*e)seCU*n)jtiG-Jw{o-pDP7rFOcO>-oC*l1BW}Y z7+Pf?SBAt^s>u&HJPw+oS$es6@N^sUnXYfN9{J0(9_|CshER*Txt~3z^LE;r)LULK zjM7>^ofUN3|GfLM6mR#+H^p<#?6pm?TdPZfO`Aog?FH{va-Zwm3g*b?*dDE~i~A*T zu@&2=+izdRFEs*!NbC%!_JI!v>K&^x4Y2xj|BvpP`-DRqhwqGwz&WkI2zlxP5SMda@0D88>q~;JzzxQ;ru&cTL

WM`2>nmnvl6mr19uJmOJ~^|a?C5-SE0+7E@DkUq|K^Nw)YY7)pOQ}x8g+#k@pY{C8{!z%7i zfOYWx^L52EzR=a)|v_g!Yn@^p&XAtSzs~&SmI9+91 z;2CNiZ=C10&5{G!X?>TtUqQ1Qetbs2b?$&Jt}D18$hBz7HprIc+|PiQbht>ViL777 zd4UpZ!KNr0N;x|PV_#Il#X>1-2CU6f?k(mXz}EZn4Sw>4BJM71k)X+q`aYqYT*!SF z9O;a`Aw?B%Cw*l7ep{ADi720Y2^=24a;aA3aa+J`My#LGe=etk^S`oYmx=!(cMJW& zrmT*lFNgaI=1()?Bh8yluh7b~xxXP|*RA=OfGy1;GG7+gig9(g{LJ8fg5;DT@@ql4 zb~TjJE^uKO6(N7cj%=3BRboW7J$p`NCymR64WIf6omwNlEn0D;(NyjNxUL$rb=r}o zaQ_9a1uOL)^wv|cxQVI=n@bJ5_PlYe}UJT8g*5_oTD3X6tMZFjx8C}SmZ z%G2=0);dFePYusI<@j}(C;C_WmD!cp+|n2kD~KzB`y9p&26#X8JofGKo;NuVYdnMH zHz{7yY*$AIToJ!oAJE39n-!crFWd>-)UDzkSX?~a>9ysPra5mP>=1u8$?b{NgmJOo zxWo3@INew73yw?9uTD>yuKPVDQ^a$hfVh_p*#vEwC-*w%bjQF}wP}JEY2J?$=Q5Lmwg9I?TJy@*ZtXqqus^P^icLDZ@z4 z4AXCk+^GK+`C^3p%~LvImnWNJGCt28^%AZ*!@{Uugma6)spr^p%I#s?6mX&Z=pkjI zQ10bA@h2OaUNF6AzHL5srq%tneU)F9MxA4-ca_$YphZ?J?s^=kSM@V}`}tl+hbn9$v$j> zyyzu6?4h&u$d6{z=H&(ZF#3o6*h8w2yQ~s;ERd`A>Z2HX&c67HMno`{NbA{Q8<=6q zm-Uk#pRt#~S5LENbjGLb9&oh>yCBN=2^#`#br9!0Yfjf_k8uZ-iMQD-==THIC{>m% zmc9Y~%Qwm>+dO6k=I2g?%2qDZ1RgUk2%AnVkb= z%ZWA6T9(*HfCmHFA?1d9?8_(;DMnJgW^F*tsT95EMz6@j?y^s#C*4$vKAmlxs<&zU z_Z?2|SY)P{;+7dJrIRkONo;95?6_d_V*1o)o;~X(rM8%`CK_>vjRPN_J|79}6EGq#=xf{DiQ98qh;1Gua{E*{-&OW7i`DYrz6N@Xg+w7k}JBIA@a_1C# zA23ssMbo+_*$;rb0$3Q?XoCF`xhTxkJ|ZYeYLQMfn%q|c;!h0(?YUHW<+E_3C%TC` zuQZRp1jN zc8R?G7W+K#ku__k>ORU$aqc{xjggOyu(#1a>&nGhbehVPVRjCbJtx*p(Ky7MfZw6u z8e|p#&n($1a{U3O1>9oGN@@C=>;q)91o@MB+RXGbEu1dg$M@c;Je?4qj=)H_meZrQ z6T+&&KkgWeSkCL_+t)j^IX^M!GHf~5tM$-2*lW`}+ON-l({kFa4gRvu0}!S<-9ML@v)iM049Y*FVmn+brB;&+?Z1vItcbdqa#zr}S3? zo}69x-gIAc-SNNSmEaa1DB9elwG*lI;^~xH+BR65Av2+LJ&9drBZ! zOLN+`DX8+?p7*W5T+e>zh5&k>rK+5*QFoE4;1DaWNtfl9ys65Rhv83bXnZMKA%<%X zZ@n-d7aDDs^^;7~_)g<#jcAY8CZ*>R&cv9yjJdoybJ6UEM~e4ti!Rf6A;RIdI?Hax zpoyRKO;pbYrW>^QM>*ZmJh9$)&vJ<{3k|9_yX<#xdWLNa7mW^`LJX1uQ+*G(44-2$ zI_S?Yf;Jtl+gv);;?jLU!j?&x6eo5=eshPanBif$A^G*{^6QRN zMGTKfUYGbg+LJEj^4lp?g$$40jTx#}b%*#J%~1VUK2xW|Ik~HV;W>jTBU)uXL*~lX zBap|C?^b-JJDyDeEt)yT&)vID%N@B4dw@0rp*OJlbO%48DHAWU7LqAlP>;EGNwc0! zrt>Z-fe*-lIqWiZg`bs%yt90Rjl#6oZ3^TUs;IJAEp=quXuLAmJC)?nZU1Zi4XtkZ z?Q^OuR!UuaXM`4=2b!ULtNfxmRVFJUV!0+iYT3`;$nOeLWw1gb9msDYkYC%Oy1)tu zzR+XC)SJ%o2@X0)J9;r5Wu}7$&kUZ+uMAS9v0UoN){rjghFVql4`>WoR5;5WsVt2; zV)eKRjSKQiXjCaIg$Vm+G|L^1o#O*KbRIc9wfaLf*GHB}X35l>XwGiS?=Mj$u_S`q zc0!C-h}Eu3m;7=aRU%6yVx2xK_L5-&OCZ?j%!PT}kY8w`if8den6}hRaIf=9)E)4y zcg#7PYnE%ZKy${iIO;Ao6dQdnJ4`tA`nQpSVp$ZCi;TFx70GYIQ^l}I!WoX@q(hNS zFw3_ck>41iie?c+4tEx#gc<)luh;Hj#2v-LiQMPIb$ZsyFSAocvM?fC5cm=QRz8u2 zMzByK9a?G3T5bEh)SflD?$j+tocfjAcbl?er~3CFiI(alU347Qzvy{vv1F4#uVVS&4@5sP<(oCCSS%Ux zU%w|xj~<(Fk1`ljHq}&B-sOQvLI{L~Yg9+;-`(=wpw}t2O(Ca-&G^ zM)~zIs(<{3dLNo;C74GT40}JYK6HyclX~{VrATK$e*KQ>@4uq{M*`QObwVoq+b;

c3gNys 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 S|D&zl;C}EIVzGbp3;!Q6sd6g- diff --git a/Baseball (UE)/copilot/prg.s b/Baseball (UE)/copilot/prg.s index b54cdc5..322103e 100644 --- a/Baseball (UE)/copilot/prg.s +++ b/Baseball (UE)/copilot/prg.s @@ -14262,7 +14262,7 @@ GetCurrentGeometryRecordOffset: ; $E46B ; ; Each entry selects: ; -; Y = offset into the geometry data beginning at $E413 +; Y = offset into the geometry data beginning at GeometryParameterData ; A = geometry parameter stored in $C6 ; ; The entries at $E474 and $E481 preserve parameters $0F and $05 by branching @@ -14478,7 +14478,7 @@ StoreGeometryParameter: ; $E4B5 ; ---------------------------------------------------------------------------- ; Contract: ; Description: Implements Select Geometry Record From Object. -; Entry: Registers: A; Memory: currentobjectindex, $e413, $e414, $e415, $e416 +; Entry: Registers: A; Memory: currentobjectindex, GeometryParameterData, $e414, $e415, $e416 ; Returns/products: Registers/clobbers: A, Y ; Clobbers: A, X, Y, and processor flags as indicated by the instructions below. ; Memory effects: $b2, $b3, $b4, $b5 @@ -14503,7 +14503,7 @@ SelectGeometryRecordFromObject: ; $E4B8 ; Load a four-byte geometry record into $B2-$B5. ; ; Entry: -; Y = byte offset into the geometry data beginning at $E413 +; Y = byte offset into the geometry data beginning at GeometryParameterData ; ; Exit: ; $B2 = byte at $E413+Y @@ -14518,7 +14518,7 @@ SelectGeometryRecordFromObject: ; $E4B8 ; ---------------------------------------------------------------------------- ; Contract: ; Description: Implements Load Geometry Record. -; Entry: Registers: A; Memory: $e413, $e414, $e415, $e416 +; Entry: Registers: A; Memory: GeometryParameterData, $e414, $e415, $e416 ; Returns/products: Registers/clobbers: A ; Clobbers: A, X, Y, and processor flags as indicated by the instructions below. ; Memory effects: $b2, $b3, $b4, $b5 @@ -14527,16 +14527,16 @@ SelectGeometryRecordFromObject: ; $E4B8 ; Validation: Inferred from annotated instructions and call sites; call sites: 6. ; ---------------------------------------------------------------------------- LoadGeometryRecord: ; $E4C2 - lda $E413,y ; $E4C2: B9 13 E4 + lda GeometryParameterData,y ; $E4C2: B9 13 E4 sta $B2 ; $E4C5: 85 B2 - lda $E414,y ; $E4C7: B9 14 E4 + lda GeometryParameterData+1,y ; $E4C7: B9 14 E4 sta $B3 ; $E4CA: 85 B3 - lda $E415,y ; $E4CC: B9 15 E4 + lda GeometryParameterData+2,y ; $E4CC: B9 15 E4 sta $B4 ; $E4CF: 85 B4 - lda $E416,y ; $E4D1: B9 16 E4 + lda GeometryParameterData+3,y ; $E4D1: B9 16 E4 sta $B5 ; $E4D4: 85 B5 rts ; $E4D6: 60 diff --git a/Bomberman (U)/copilot/chr.o b/Bomberman (U)/copilot/chr.o deleted file mode 100644 index 6ad76dd431e5684cbcb832ddcc87abe99626532c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53833 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 diff --git a/Bomberman (U)/copilot/prg.o b/Bomberman (U)/copilot/prg.o deleted file mode 100644 index 4e3cad5c6e7698cf61bd8aea744f9d187966e522..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161659 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 M{K=d-oqqCv07NQaK>z>% diff --git a/Burger Time (U)/copilot/chr.o b/Burger Time (U)/copilot/chr.o deleted file mode 100644 index 5f8733735c5896c55004472442a1594f10d223a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12596 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 diff --git a/Burger Time (U)/copilot/header.o b/Burger Time (U)/copilot/header.o deleted file mode 100644 index 55bcadda40dcdfccfade0b5004dceef8ac84de3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmX|*!A`kWn#6qwR@X(YDc@z%ri5c=V_k- zN!TP1WZy#|AprtmQv)J9BoN@RDtkZ(i!6tImHgh<=cal()OpSC^?UvP;GLU$``*iS zU-xw{-|zX(|Nh<2u8&xxAQFkR;NNTf`#k@;@^5u#i+tlLBQz3u;qu=X`CIhONMzSQ zi*%Y8iQM*hH1h4gi$wnE)oA2p;%&tLYW^JN7A?ntaSl4<$;uch_5i~m`stga z36c}HNi9EZrAaN_=TN$QZp|XWp>+58vpkN(@c47Y@~!+vd9;t>QGO$B@m=el8;MQ5 zBhv=tL}F7~W!iX3(4(D=XibgU+vL26W!p*0Sa!*lT}8Vru%UMnql5LK)e9f8a$2#{ z>hmJe=^bo2Ppz{VQJU23=yl%8mC=ZO-WjdWvgx!;(smQ;HfOXxY6q!I($?J*vAdm~ z%R59~+Rl2>J~h^jkThqsD$PDr%Z{P1zG%)mD~&73qWiqb8|aKXou12wly7N!+eG>r zd%tzWPC307rjl{OhLgUP(<86_e8f81N2ELuwG-Fs`TK5*Scz?D5wZQwXjPUixZP8J zK=)ne^px}XPe)78YNR|yoAS(kcY4bAk+QAMXjRnq(L)I^k*zp+7Oh<|3I1>p|p}&S-f%TR=0`cd~g@Hfc$olID!o z_p;Y1a>C9MIl~#Pidi*T7d>F};~tVAvoxodZzT06S>hi>6Z6Fory#|@Rf>OGxkK6ycC4L~Li3`LKXG)5Hj@-x+Ii#j-d)fa4HSJ{1G%-ia5}y-IY?b2w zN4b$dQss*wZHOQIr^vtAc51|z->Y_$iYULACN|sBk}i1OPPrm^(2gU6ahsT}XbErL ziP`S6`8N4TRcuDi!1-rnXJhMthX2On9!e^Zxa*C1B!fa3*3jczw z(m36LfZc2`TK=L9rn!^$emr7FoSvovrAuz3DQnUm^?*m^UxKjbMQwvr#sNz4cLqI0 zcl20`s5O(2rz8;VxD5!JagVFY0Z1_|If_Tpgc}fM2ID=SHrNgd9=GbKe572f87mBo zdbRfATNH42gsc|(h%uY)<2v8A@kB<++o&Nj-p&8Y-m$`)Jh$y(uyoBP(RLp!X*NLx z>y`IuZoL>3`BoQ`kCb>_Ob@Q1l62JF3Q&K{yIT+5e7hdJOcK>6rFZ)1sfFRGs&(NP zJ&#STmB%a>l}(hhY@s#WhT1=66Yll!!PhAKCZCiBdj+nyBD5x5vxe}bO<_8SI-_Mb z*xxf(GEH|;QO?tZG5O)(w{b-%EfI)uJV`Co8i;@Fq^5lpDse6 znEXdGVHFc|2>o03Q(KI-i`$x@64iWbTo*-cKrF;tO)aWwYNDA)u><3ceaW{PdaS5y2$ z=&%(35GVK-r1;;TlIm3}r6hqUcH9y14=MhSruhFc#s97p|E?+i?Na=E*>Ps%KZ@veq}gBugDLL_Gdpw9z^n27L7JUq(qd2z zVxmXxg0fSej%U#3+p0VDMD^(^qBh-Rqfry(H`!@qIWN;rX1ca|3oR29^Q~9Vi%Qaq z28`R<>y^nl*P&|}2yyEll*D>0f86d<7vgmN0zP$$(>)B!+jH^hu3>rcX65sC9G{D_ zYWD?O;Ff#v*{3ROxKDAWqGoKveUvoc3h(z3xUWUTu69PtA~u8RpRxIt#^z}>Y1Ck} z%xuV25$j_`D#50pQDjhTig_sqd_lP{yq??#1mzOU^!YdAGY@SVx8g8je(z>_v6RD} zphTa&6`wsfdYs=YoA=%0_x}HlVcvPY6&@Qk@08r7C_lRmpAspB8KGToxeuQiYS&Rg zDWG>FHVS(yZuOysZn+nqdaq-?RmQ#cl}JlWj9X*q)8=#{HQpJCRlkyET{Y>PCfmmi z#;SjjX2qI1Mxy8MGUyGq6rGT;kqqu@ozbRSZ8$PW=FnX?I9s%cJ7deUd>Hdc}2bz2|WUi0mG z4^OvIbXLMPknk#}SN8}#m$a@Fno3b$68OUn1~G#G}S*wXn_+{CT_#RszH)J z46T)Ko5JXm7;o~`7LuC9n4z&o^Isk{PNH9k;>Ml<5i!^ck%3s7wr@}Ght;2-0e;;&K&yj zt{>77UaES8>Vz{|{zH3@Qn$73Jn(j>NA5wJwzTD>Zz0BQRF2A4?GG8HZW|rCt&L0D zXbqV~!DguSIE!R6Yz=XK;Irq}(DiRHz7w_)C3Lsb3y@^ezUv28&1h(Az3z+{Yawse zA6O+`Eo}z1$#!}hZgpGfo7O{vsWc2^wP7g(Ip2ndL7M4h7|ygt_N!^7mbQRQT8MGm z7Dk*ZvrQxJXqcEE@yZ+}e%ubHROYZM)8_^?fhyC-#e!a9eO>gTeMKcZ=eEZ;ZMrf% z6eeit_(SL+R{2+b+TXpA@3{TDJk+`W?q%;Dl%C4oT}p36n704efntrIPq4x=l}Ll7 z8aZV}9?UOUFg3oqdC7({7!!6B0lZg?TXU9@{k_+(nZZ~3Q`^TNEquy`%Z8gCx>wW9 zban5g@E{o`m#8MS9e|+3ttpgJ%Cm{7ht*ga z)$H@>ntb~>n38I-kEtxC*$z#3!%{5UVYEfQy&XoeWZ`We#mzP}Ojo0B#bS(P*he?> z_u33QK@*i;V@c-l(bTgIf3C~0>2&9Q8&6aAGUibl^eofQX|cc-(dR`it@w-Rut?la zp`r?GXf~eL+s7GrQv3$0USMZvJTzhu;|kX@!w}>0>+O4V-#(iq_1F;Rv{T-O4Vu#q zhGmZu97M)RP?yJwBFDy(VZJR2va>_OUa}J=JxQ&GY40G$Q~i;>QRh`}+WFRAmL0*$ z`M{Izz{)9GYU`1u(m&X8P1G}k_WobK@}J2kmSE}Mysy118TQ!;R$N;ZobHCX=CW|7G3Q_iF8F6Piof+R5}vZ(`T^$ z*2pFw!)`1OU}J8b$}%L#r$+P;1d|c{9y1{$dIfV}!VYRSfWDWwg+KL48^=77w7HZ# z+Zio?!U}29q%CDCyC^2?BAu|$>A{B)jimKO$Syj)6sO3GGVS%kylmBOR@B%U_3ZLs zB&r6>J>V9bMA4Ax?Z{rgbkHbUGA!x&a`7P1}0<3=c8 zR~VnF?Jl~O+D^pO$;-02sKSJONS%&5J;^j4R@B*k2cNLDEai%xw3X`8enE7Ve?KPl z9Gem*`9W0bl_%|j56dU*ATmTgr%|@AJYj>q3QyQJ`l>!^6>2c_jy-SC;MU8JH5=u(R^QLkA$Q}FWD+Dnb{&2 zjLtSkGCd_Ica5PbkWG3 zp&t1~8-T_rJ7(3?y!4XIm%d*S49N$5dtwERR(9M@d3bxP(lp!<2ED=?e5d@leMAqI z-e=7%T>2VYY5r1pBMHl5)*H!>Teo0(JmML5V_=k}*?Vjy#ckDP3&aCfA$4Wxwt^z( z+o7PNl;RM(@JIeJ&BoI`Xr}pS6gM&^|yutB^ecuM*zf@$80e5ThK`}1AD2C9^a)(sU%KehqEdEjq zx%HL1we=^@b|MQ?+%JmxVrTLD;#g1Y- zF@!!NcW3e2Dee&ZY>LmfQsRWr@7P|1^;=?R@k?S{{JQuJ@o6!HX3HHIVg}~RKcour zpS8D9WZw|KB?g~on{7sXo=x%jR!W@BayL6; z)z_xk8Yam4t~Q2=Az^D#2r)6=76#o}oPj1>i0;JNsFFV4M5J>DeRio~-eAtY6!qle znAxLZ(q^%M{10cWn$5B$m{1(r5bITug3`}9~^Ancim^O)bF^Ueh<6PIHvikt8Al8lbVqD?g#-jY|0*C>#m6d zhid-r!x+VunZ(>%f1Q=6DY`QO#mpJE1;N@}<(V#!wb>L59hJTbQ<-V(0H#>njs;U# zHp4MYVVdYT;WW`~1R!BaX4_|-v1;}VC(=j>>rVA|IK9d4|94$x+G#?k!n5L<;&C!T06B|X!jL(hYt74sKDL%n}MT-9) zQbHS2{Qqd1DJ${eYLR?!cTMq6r1R_APK2EdkzJbx+-bEU# zGHs39g%8<2WQ0w#V2($8BWIJFrZzMJx$vH@W*I5FqY{8B8F|EZ`24?SBvB2hFj*(~@ z&*kx5T{5{D;TCOs+u%iSv|21r9={h&LD*u98y(m56FZ4U~ez?M-JO1zh5q{LI)Y-CT7)e4VI1X=lj4yiL1qj(*r;FNfdANga; zd$}IAHmw_mTT#KeBVb(`dAO* z499mY+e3A>iAGJ>Yy|tL$i)__%_DdF7IZu7>)L>%n5788dP-jwwXs^SFAU4H&6yD< z6OWc|(=bkn#;Juzn~h$K+t^^7D%w~Vn~T=N*GkB@KPk<6vS~)5BHvwz*oRaV%Y6cW zXohu60GsVnm;l(qiQx7E@1(#PVx65}4YR_k5w(O(zt1mcIFmMBkB6S^2%3&;zZ|hz zI~q1JmEBQFJfNM;S7R(^mRMo)>F|V&C66;sZ;T#PXmDE_OKJ976n8xQ@9P_gO1 z#KYRy3he!24$e>doWaKYTa<(?&^ekXy5Fy9RrjpA-|vI306+7d=3`Hi6lm9~&F zQNaU9M4k24rb9DjzF;ug)ZUgLu`8^f*5`$^!U=O0*nC8jOpc=-CRr1c>*#2jy^APw zgM};`&)KPLZ-951iO-4!wg>@x#txDFv*Od@3r?Q~i`jHjmAqobIM-RDB4s;>>?3y8g6IjE-` z`PM-J+Fk76F^`9NUmK9e5jhsfdob1$wu6ka#kiFRJ4va^DSY`i?JV_7*fcslCbA6@ zR(tA%LP9zCy;BeC zCQBSwzn03f174= z&Ff*d_XwCmTQ! zin-M`jk@O8@HCQTSs6y`Z}BXlZHn7u+WV;PTALCY@B5x?iknGXf?Mbr$C)Z=w=(X= zp>NnS9K;p5(V1yBgic;zXQ+5fn@szjcY3@%KHZvaC;T8AeZ=mVW?Sy|*oV+UEv>4J zD<0^vk1{RMg)`DT_7M)TM?Z-?AfWDzkK68`wRgIx??!t27(T$kmqSP24E^sJqbhU$aNTx-w^KaC;JP#Nxh4>_atla?~L4JrFj>UUcz2fJ%+q@~|O?3`cN#;|+>)l5JDM&Q@zL$Q0LC z-?I_4YJnZVHke|iJnUVuLF}92R%o=W-Uj(}^&K0gjjO3)>g??E-c)7|T5vw%J&%F2 z+SdS|w}Cvk#10}0Tz~X#z1dEaw9-D%l4f)$yEf2AQ}$lgMAW49rzt-t=GX_mMv2=h z#?Noj2Bm1vV*d8@mgKQMJ|gLM!0*ZOw;KYPu-8eyPb{$h2<7)|KSES5a(Ik8E-n^L zoG9klMHecw_b_5!Vb9NJyY_Y@Oqr*!m|kgTA0wyO2R-Sy99tD8kB><9%0o8N4UvcJ z-5`n+`11<)Gf@_pd&xO+&mbwKBbXg~aAyS(;a2Jy3@omm ze(W2K_gVu=oBOEkU2Uxlg7${@=1Qcrs;#}wi1CASzi20Dv4r)D z`wao;+sE4x6}FF0k|f`jhSDg>Qc6RXD`~sZ9Gk9=UmZ?=6uuf^EwCD7tNd9jMWFMZ zur)Eye=9}0)#;DiqoU77;aqJnT9I$>AWBJ_gI3CP`cuxj_+;8d_2~Stq|sC6V^kGb zPkN4o7m(Sct$-Jto^UXIP?~GIFdg#kWEj#)c#`U|H!&Wa%gUER+~D*Q&6b_EnF?nb z^hQ{mt43H&WQrHYwQ_j}!;q(Z=ucsOYVBRtE2Vh7RJ;vTC~nik$&D1sbRNj|Z?G1m zAqFv;8Z+!Y64Y2T!5zgumP8!0Z93guX`8Ut8(DG?DQUxKjF!%5quJ|doSrR&iflTqEZHY;3&`d>aL%<`pD2Rl!FYwdX0OZrz2IPL@OA$t#9 z!Cj9r$PB}7j4x;qS(l)8wqEMJTbOeaK3cm`f&v?b|36wI&x+gjsJorP{ZA?GU#7T! zpW^-Q8MPVHc=nX{nvL+n+W(oCc`#hHJiT z3dW&2ugMovf3|&Y3NpfdNfEcH{=bK8xC`}*wi-=8`v*1*LFe9cIA&SyO*0!o8*eM= ztQBIK$i62&e-b(5!Cm3>a&7fNyuc=@6e~l0RIZg8gVTe3rgBYpgXcf24&#<`b@d+S zs)hI7LspFFQm#I9+3X+LG702I_eguGTpuw?7u$H+eTB&BjQYU&N4ZU$=5%%VujC%J z8edR6Y^zXARgc(i1_p9-`fmP*HHRm1bI$9*#tw}}zaMSkEi&-3(eM2}kfA`ymSXw1 znYx$Rw3lsX2x6x0<>@8%CIXfv4zs?9Zb$1$8cg4n6uQ#(!+bjv7Am{Fkv9Nn9Fveu@D!=T6AXq?U@M_G%Iu3GCJjL=RV(A}G_y-h{2mU6G%RRX3jHDirj z!vDDZ-;aUEb}qch85_-tzXHRu&Svqn{kD`k^szzAuz4{XfPB@*Y%rxv*l|Yj5plou zCr_HGxpl~3tCZG=AZN{9jS((q5!=hQoK|RJ=wk7ek!wa+}DD2gKyGmNiSJxL@oga?p(b8F7O6lvp745wkyo zljL72vYCvQD;GP6qs2SLOmY8b5KD`+3Gt*jL3~OqaQc44LMGfEKd^fK*W-tF4BbY* zR?>F!Y)`rd!moWXxrbgWdczuAc>7v6gtw^Jdi%&qw{y%gML)8&9_7b2FVEG-5}qBk zkH{w`ritm!Xw$Q{ivh=sxP+9-rS(whu9yJ(k`kHM=vYMW=<;>&Nzh?LF z^VovFNwXr1`B$E^GK8_{IXlbXDX@`DrDbjG82S{&@F7DvZnMIM;IDi@&2p3AJ9fk; zQHG5#(lXcqc`eHZ`x*?-EsUaNo$M&XHDQg+q)D;B2BHApvE`Xq zdLmczaJLcb#SF1QY%ezdZJ%h_K|AjT%St9udi61zP5Tx;Zu^)xOWDn$^9nmz2|ZEX z$(Azpamxc%S`*QyKW1Zm0(-^=W2dlxohHBC$nzvyL2V{HV*}JErD5AxjZ!LudqL2g zYK8@LM^h*3PnJAoCu6og%jRjCIm>LkhjHq?hOnHsA$YG8V`77Nb&C6@6nCo>_d_Y} z=TqFTq_{t}cThYl#SAen?iXX?VsVMMR17g2QrsccN%@3S%j8~eQ?VuL#OuTcF+-5}nP;=Wn#T=8Du$8fTAu_KHp7KI_5Y*)4u3z9=?`H;K98tKtpf{{I0FD9%BvVJPnZ|G-z3 zwn4l}Y$Mi-H&|iRPjUbM<0gh$Gd=8E?9RB22&!Eh2qTzbSJ++_41MekLbL4*I#>iHmAy^Wl@K~-+Lo0CKASl+czM;35G0e$duvwMkA@suv>&B$s$JU~pvuyze zQQ6}*6-88f+$xx5$gzZ-5ON%fGR(Jg!PZcY=d=;HE9~CrYT_;wera3V!dnr2BXQ#f zAL{B2G#J*$2A`8U*b%a+vlYRQl4IR%Mdg=9Y`&|o4z~X;St%3AJZU3P3HLZ%)2$$P zPHNvH6_;k~U9&%I3yGI)AMvC~wvPcg&kDmj^?+BpkVYX=5t6sx2BPZc+0MH(2`G3c z&%zoUg*8>iQpM+-bX$TFq}peh^r&`ME#uCFU4pxOC+7?S<Nb z1j`0{H5fp8qo>*ppc*@@4G|7Lv8D^`d7m}wTKiFV5lh6Q zVxE{3yZjX!5yoP3M#Xe-l2|In#42%|I6&k$l~i@&3X%C6pYvkA*latncUFm2VwzYi zM#XfoObnqR<~aG3iZOA3*iNhyS6CTKAg=zy^J2c(EUpr(#Hd)D;!c;lRE&us=6JaW zi0!Nr+pA8j5+{fQ#1P7>Da2_OSBW8Jn%u=A$56yc7fVH6V!@}%-bLoei37xTVx1U5 z$N#sX6aL%KaaNBK8z8n5^TlRym6#_c#V(&g&RWT*N{oudm)$j(NgN5lQZXi0iDSh9 zVmq-;451-@YG_=cL&eo%jvY}eIpcB%{)^nJ#T6nu#>Ckp^7ahws2Ji@$=yW^Ib44^ zbWnz?S|Mb_EmoNi;$ zNTnjD>$quoI8+=UwiD~bGBHgIF~`V#Wy}@w=TdxHwc?Elv=h z68X3UaZ*{B5{hPHO^tSfaq-vUY7t$B|4gw#M4NpQzf5k9gz)Jnq62ZG_h6CO(Pm=k zmW#nXK<;*8o!FETxuQMhiRIM3&3U(d(Jmu`D+Gc26gJ8*8EpOWj}LToBov2OCEm$*|2BYPV z+7PDnjy8^^;ejkWjOD=D3a!L^?Mw7WZ4Sz=i@nZrx{D2H;jF@Rire9E)WmjL1UIeG z(LTmjVuynw=hzt*nVhjq#iV)VA)DqV)k8*46xfn9tS39c@$AE5smKQe@ZrM(@SntX z;(!!)FS)Bkt_l1%G1+sWS`Ukq$oDoLwppy`3m>u5bQb5I-Tdg}8@Ab7;Tu*#bSh5! zUvx$*9=1ZtJc08KnykQf(j-0X07ZXTL~LZOW=MgcQZnYfq){@|$pJZglZFbZ}WE(BX9w>Vc2|G;| zr^S5R7fevSDX|X|wBlA<#!f)_i}nUHZ_>u0Iit>KMH^c{Z}zd$EU(`X%;qYLSl`xL zZS&ns-(o-UvP}twXVTwgnc{{gUo^m6Ce}Fmw)CJq=qmX_xYM9m7m$zZtT(HQT=5?9 z^J4ICEB8ahu&_|7BFq`2H1pFon45CyGZ*EAGW~#oS@E>}AD72V zjK^$S&nAD5r)`CASUqL4*m&ckMT1x#_2^`){CwgMwhCD;U1RUlZ29(PnrfKot?(v` zzC!NUu|>&kw<`9ha_lt!q1Mf8#J|$cy3v-Ec9c#)^83?Gue7&8sK!aQ0NE|DYTDyZ z_7*v>5l5uB-$`+AN^ze|ao->}ui2AB+Y~o9*6|7czp+8|aYAHk{1bO&ihEg#`#}mJ*wZdBzSoH9Vy;*sM#ZPaXT|FuB&qA78o3o`D6~88aU91+@h-qRQahqu3 zA#s-Y*D(jOnA&4b6IY9K#WiBOm@6j4sQ4A}NpZ1wW&ETaXKOhsJ|T7%SBh)IG_j4i zO*HY4xK6w>=AO$j6U@&I=G-i<5jo|=Coa~AQSmA98F80*WqfYblQzVE+Kw>#pA`>? zYs56Mjo2WXctqq2P^7vt=7yA*Ard zQNSlPe((wLpHOIL@vfBkX?9d)c5aiKPm$q1BHk}@gBqXIn0w?CVm8RlJrLrAnCWuo zihr;Pl27M&xhIH^iyVpLpDyN#C1O+@E0&5+iy=N&XGzsY++efNH|S{Jq>EX1d(DDLzrT$BL!mzuPoz={UK(40FY#7!}8h z6U6@%xdlp0-sXU9#BHL94Pp;5VSA*Xoo(daBbwMC7K#} zTfmtxXH*<3mWrdr5Sk`;8?iyO6!!$V|2pOewEqTk@^t~&AWjzfdL2ILVy<|z7!}8g zrQ%HS%J>gkx2TudIbNI~&J`14n%G9%D4N(_TqIr@bNl6({}QqG2I?INN4g`|QR9d@ z#yciB);j)6JpEVk#@c(BPo?5!F(GoF75_HkHj(>n_%w)(;*~M?{MVS#9v!VKrd;8p zRvh>FV{N!ks$KoHXpn5{hCNYfXSowzd&gSa=?lAdHkzSWXM=c=)ICRXOM$BbyRp|w zS?giTvP*vnLybEE^XM>c{~@@ooUv8jef*Et%~_$Oi*+_v3*o^$kQaf&WwP@vBix5Nv5x2ariElx|f-M(O%U}uO~oX+X1uTvl8C<;Tf zqfOItbtEg>zq2=(@z#ourMQ2X;(j&7-7UradWyS3?p*PgVr%g?wvNSWu6R7f-BIq= z;@K2;v)oN0m#0a4w-|D$NO2#!9A_`~(QnL|D^5vq-!C`1kkH^C+`J0%N&Fcp?&B%$ zf0mp0j1S_#;O;0l&%)=ADeiYt+|6=Vh#^%|iu;h3JpCSL?R&KuT>C1A3bx%Dz6=mbBCkN`KYi*owUu0S*hFB-7 zVpUoGk}YL*lWlM7R@KCCYNj>N#1_8YHI_bFE6z-DSEjhx0#wgBv74ZYi^OSS$RRam z@5?dY`ka5m&H0wNR^)vVd|HdVsf*jh5Obc~SH|p}5_6He^)~4c)~9Xl$G&UzV|=b* z7Gb5-);?foB__7C4fuRhEU=ZV{kS`|&hH*PU}IP?a^YwYIwffv=%}ZivFh(p85Vj8 z8%@a5PQL>-if1M5F#A3CI%CB|>y8Sm;?k2}sORDRIfbnLewtm>*w_Saes8ZDlG>cM}#I<%L+?oAn zFTxSjZlzW7+V3j9OE;1!CuuZGu7gb!L^9hFh+($vM2&Ip%=ax{NV65ZyID<&3*0EF z=bb9bp0oorQJT{?CAuPp+~}fju5w zc-etBU}AmAe<>9oX5APdd`^wzoJ6s+)|cKp!z-~W0ZNc>53w1L>GanVPBHQDo=zL> zCcJPX)jW>v&h|GuHC#mZorg^8N?kc^2$zBXueZfuB!PQpMCC3IS+ulL6j30PHg28+ zgZoOKzr;L^2xgcwOJsi!cUp=&_yqD1JVH}_=8KUzmExxTqhUz}-n~5O(NSQY#FeO=yyYeavW%iTSoQWLfDcw~{40 z=L7uxNaXKhzgPE+y+>)vpSA_)ulh_Ymy()@;%Z?q+VqTV!ouRu8Xj2wjBR8r`I|$h zxe@6dGD!7&o5m%t_p!qAp0xLoY$l8)s4%Z@6J?~&wh>s*szeR^0RuF{pzo2LV9&fo z)aY7LZQ$ZFe(&&{;ZZ&p$badU6EtMPwqQ9u=Jb;6M7r`CZ4#YS|D<(i>?Q4#_MD+B zm#ygH7H02K49{sJ!s4$?ee5m!j1{4@s(BS^g$u-EHj_Jg)zs@f23*nOwi?5TQ{+O+yX_h{2!;#_=>xSBBDc0Bk+AqWDvFbea<2D-Utg$T&k1VH} zZx9Vu{-uL10`ea*uHsYH;ru<^-AUFTjxDk~nbG6rM5P0jwad8SefYTk&B_U1W=>ld2Zgkf2tT#zZmzOXd zG(BeZnDo485eCWvZ{ej#ipN{x68V@-Kwy?VX5Bcppi>vnRbJqJZ0u6t1@ssN{(v5* z!0#Z130s7Sr#rpCCtU0(@RrNEswabkF5V{vH89hs7pN|Mhxx?IT!To{r6pX)_AY%V z?iz704SCAyX~^|9Cd0?4bAxzWiu=J7_bIvm=kZ%9e%#(<_HQKyH#^+;u=5JJ&iaY_ zv;1#VoMtg6#eMZw`T;^qZDM!Q?+z7^mM?n^1|;PY{c51&)vMzIU#G0n4Un4!BE z*W=-0hF2FGiIr4o!zgvFtqXVa{?!Nhx~mu?9jre>TWgcUA@09j=Hi}htnAZ3}94^MhOfiHu%3UnB zNeL~GyIkah5Nc;%osc92UgkZXCcjTk~P%ke1}+l%$$ZDNghtr+rY zCHHWVsWIy1cQ&TDImy812C-O-UlDpuivR6$ZxTb=tjnPvu~K~6oEya|k&Bx66pOrV zkDFIKV1ZaJwio$S9RA-EOT=r%5a)YVihda`vLwRIG7L7RxD#^UAQp@9D?+bH@xNE@ zO=7|h(RW!Qx0G@7O$fMAtP)vC<5MhVh-qSh7!~=zGjVFgn3yRR*&*hu$Hhhwe|(bS zEn>MC;^fIqc|M7g{TXpW4lS$_o8oG5xX2O~pG>hpEEgXa^F$WA#0hD+nu+_f)6Qqc zdEA_N;&o!Zc(qs~-k##m4h->we{hGiS@KVc!Ch|MT6_M^JTWP@5VJ&f&k1Fp9e!5) zVujuzW{NrDYc^2^ud`V0HX`rI;!_}&i;s&rVo23e?xK{?gxm+jLh&g(5=WbeoQC4& zQXpjO0~U!LMNU2O!SsfO;%BAhtTZL<81jmnvyZq*EEV~N3jWi@4r0C7EGETQ#E#+t zkq;%1sz_uf9~)q)*j`MEH;Ns_17cK6jaeg~Ofg4%O^k_uiP;A$p~jpUV%-(Ym(LV& zqgXCJDi(?D#gKNo-25sNc~;m_*3M6hjUpeLz$Yoj#2oQ8k#kT&mx{bs`AN(#$Xz4u z73;+5w(p*Zbr3s>2gH_QqnIhOKpL8)K5D0l85LSp! zi&bJoEU;tDO%ueY#0v3gu}W+fL(D?CL(Cp>r^dwoA-5ut?-tzm8ML#$11MCd3|M zTzpSlEv^vzh-KnW#ZvLO$nT7hPYB&4cie_#MeIFswYWm;BbJH37E8tBV!jwcH_6>Y z>>w73ysJpg*;dXvGe>+yWJeL7q7-+P+(<3{Ar3!H_eq@KE=`FuUG9(%FKJ>u@gfwQ zE_M(ZPxu5kBLnwCVu4dL3jJm3G=G(!r-~TQD-Is$b?6`oKtIeIK zI7z@AlE2H=$PrFQir7Z0=LQoa5Iu#&qs7=?sc&KD*gQ+xG8RB>oYDI0Z9ET1+F2~C z2c6OSFW6$HE0hAu+9#aR`quWQMq4FTw9iIrb=7r{kapTUuC(4X0k7JJ?Xur^n(p|=?QB@IE8nwhKGxcpbd{ci2h0Lm+w)yPNP(^LZ?ceY zGmHK%HlDS8rCrGIH2uQG(0}qY{pgaoEeh`{E8j)buhuq)m-&i3&Sp+WJl{cd37=qN zCyl$(>%DR4+DmK^RIwS!rn#R~_4A!lPPW(rsNf@A?BH$skuBs8$7p3t-3-Za9=7=j zaxP?3bnuU?7rk80FD%IX?SnMM%*iK-!*1V1f5o343*zZ-v#;pKTazR=zx7uSeoNv9 zEXlSfCweoOJ`z^U>BmW@POa)x?rH}0owkR3Q+dC9?iG2LoOVxTTt2PDJFPDzNag+V zxmV;BU7nIkzH@<3EAf!cl1YH8XGn9F)3?-@_!s{8g4qV&31>V0 zAS>~>?Fxcj;bO51!7i}j?6dm*{9;b%*o3V`EPQ`{r0)SeZhK9cO=D+h6`9SWMUu7% zDQw~NecCbXL$mq54Vf*m1ogUJ%(so<1&3w+sEzFK61OK?yTnbRE%?1N%s75<)6Wih zo}Z39ZXfyxpfDTgsRCQgm?^MA>XvV7?$J0Y$sxBjY)pCO2XNrQLD6}JY|{D>?Ud8c z8J8djEVUR3$DFZh&TRRW8`|*z(*IgZtEZ9J@ml0MffL3VJf0n|CK|bn4Jw92Y1EqT zVvE0n&E`)bUlrjPr<5@Eko*2N%}$|WI1oxw?W8TGLhGIWKE|?K_Zr7|O*nn?dW4^6 zChc{p&kvAr4!9u)W8wO?YPF3D)Y*sBoKHQYw#j{H9?74wgVdv=ooCDb0KeHnk1T6% z{VC(p_I8jV$srlKlAFL3w26;iAusus47%rw-d;)il7QbR#SSt{+CaK6%jp3n3~%xp zh?-2;cEs^_PJhaqMC)ZmG!~^<kQd%tShvwplpf2?GN$+1!N3Sqm+8zs!#(#2-q>t`^hm{W$?LW-7W zwyU*QbQcBuiZeEk&YnW!(M9{27PxnWnDhPsT8*FcJBr4-jTrASrH70Ko!z|x6glS-+cku>9tHA0|0ChHs)~vIh z)B!hxj8_(E#C+QuM1rP>;8y>RSHRohHrAV-(c7E{dV7p?k-g54<%AtZ8y|9dX^zm) ztV8aJ*aD{-zh~TAdL{aVmZp11--GsKT3Lc*<`_pZf5xwZitM+;WYEhRbcA}5Y|a^U zi(m>WmLWs8tamEsT12Lct)k;6*<_l7Tqe?T)Sb?ujuZSuD8}oTbX?r_ zgm!+;e-Lj^II3QRKI1-JIR}s2J!|0FLTx4=Qly3QO0A4WWeQ^$-Y*WbH>gFny+JEw z+YsE9HVZxOJMZ1lT{%|G$=7RHww6L|XW`P1LBnN!+U7Q=Ymn|<3xXc^=xvEjv0U-; zJ_-4i*m}C?dZ#wY^z~VR9ZDxAiM#;L$o_G ztQN)Ztx@b{Yn5T6>4B=4ExwEY-kxE@{2Bz}u?L+?wF>Ewj#iDV9AG#i6xmkE$jG)g zX_su9Ps7#o72Y=9RFfEY2&wCi9#%}bbJ%F2BmU9;H+kQdVO5A{fh~8vMIC0*RY}{3 z+POhw6Ex_A&$~`2ZB5S2HjNR@=M9K@l^D0~;fQybH%@o@K5ldF)C76Jedf^aaa$YS z7JAGxT1%mm_7*aEKxB8CLQiGCRU%X*9;?D@? z;T-Gk7ZS2;2!5oR?nCFxb_#vLe3HaGPgpH2Q}2vbBP@kfzTye%kE-xr@2bYiITB%^ zPGe!IGQ(2gOP9;Ki0b&bAqi9RLP|alIhsueF(?H4T`m8X+ zZR)gi8%+LwWp$z7WX(voIm~pl{T450C!2*M@iuG|hxyA-F>v8ChnC$(E{S)PW!VW}z{7u9QdvPY= z1vU-kPoXBc9d)%$_bzS87XT3%|8=yJRBOKtN957ibaTQ6km|HEwwfW)FPBHPwM_^p zdTRu&!zZn(n1x*~wsIKh1Ga?8V!t&YRD6kyxr&PeQxQVmhM?3ZMP3qR;L*V6N#if? zPUXKS`wPs<^yDOp<8RxJql5kJ+6&x~^S5h!)d=h#eapka29DfhR0y0|+7X_9TA5$D;aur|&0A2HqJ zBKSkDjx)c`W2;5d^miUI(Chmn4qNHzdG=vcA&+{Iuu#LDv>o-E;LRP=eHXY4Db|6-9sE>Ee6h-caguJ_)q6^UTKyTTRhS+;9EpmwC1*m{p(itQYx> z#YgyEQnhh$XyaBMQtWN~HRKqH<#3lFaGlLV_+ug~E8KtasU!|ZLGU_}!=X=nxS@*J z#jYT)M^KMc@@fS>fic^Y>8YH|YA{X2p!vjy*F=I2=oO(M<`r>tk@x`e*4EB2?f${(HzD_rr3Z5&zc_Cl&~C|A{B) zi@}lp#sqdwHHw94dK}t0iTwD|%E^Wu@{AExNdBCMF(gll`8F>s{P>(WB7`7b;sFQI zU;Aw=BG|`vQ@j>&Yr-0LLuv|(A?(e!nGP{e_cNS^b6Im71M>(2bgl0|@pmgam@Sma zzVhe4b@AlX1oJlL;87KqT>N4jrxTn~sY$bQ#kK_(a z_5ZB+eHB0OFYzn0BGzD^@_xBniBrT;PRU*g7HC^Li|)9|>EhGX)gWEAgULOQpK`(A z;6f$SE?3ih4kKu>U*F`TEL19CtEf(f$lg54tTDsh!W>H2+gKro#RA(x5BIw+&3e!S zenIFoJy6^dnWSy{Sbuav6_|?yL z_8z08e!G>SC2FiUb@+iZTHnf+&~YU;g3P}v#%)?y1HBxltEQoZ6SkW|KJIkWw;z>Y z3kDg(O~vb@>-hmABr#!A zX|a36xJ?c7TPJ_`RHQj!Q;^MUF>db%Gq;t8zArO(DbjVdIr%V0NPEABZXqpZH2#@l z+(w4&<;FV*9m(+Hw>zZ@oNNP7s}9cCRNDRk)1vp@{>y6umI$Ny?@Fo@x5@WOl&|rh zNS}-kcO}E}<=x}P>`S9P! z4CFTx4^T9Iwlx@n%5f3)f~V_=g79?JKGym00g~0?NqYyC<>?Ni2|U(X7IASKn65JF zTKmAumD)mM=i9KbADs(MH<}02PQF^RpQLaCB#*RF|3js)YHGj{cjp}c- zuC!-~)gb42PPZT?pgP?$Scv*7OSjGZcOH}TX{K@}(mgygY3o}1iWTbq`3VxTk2wiX zK9G$pUhjSBy!_*De~^( z1D0s+Z0m!ZSK3=NOYObettZJ3pK=9MH>mnmpq_5 z63%tP1of`9!(j{m0S`FrtHg(_f_5x_)Q;26*|v^iasi)O^Nj_h@!cEwT@A#Sm-%)u z!;HS3AwquaA6{e|Xf*9v@2j+kZFV93T$(-0>_?izOlqFC5j&f-wan@*t&Vm|cY1;( z0x_Bxr;&gH+dxx2Y<-BfUHtnL_xEfgO|adz(5Rio;C?B^{o@ojTQ|hyCyk_soLJ(Y zxI^fbKD-S@8Te&F7)xQM-03MkA@oY0)KtM8^8Abc5oDOR@?o>c2dr=h@{1$5TZq@B z`17GE`~ySU;0`&2_@BR=b`>)HIfI(a3bR~(vF2_BK5qN6NzxDXv5eWy)yS}11_{E} z4~b&0v@4T*(xyVbii$Q|O_ar$kS%REYp`QtflXja?_=G05>g`ZT!DV9v=eABpQ5&+ zZxGMzF0D*aOilH-+A(B2Vg2aDbZ4}xm7PLUxam-X@FBJ1SO?9^V+PFgLQFx1`SlnS z(+>QmAeg)cl_`mS?RErr8pYx=Vi-l8;`of!6Xv12&YF|2@Z>7KrnuS6RJ{1kkUinl z`N4V@{;%75bgCa2^k(5w#JL>0t(uD0G03y6So2bKnh%EUwA#B!|4ypQ-aid+t;kv< z+kH;a($|W;Y%Qs|V1fd=M2O629cM;XxjTkPFuoSV~Y>d zjR-)#tqL!Oophg7G}<{yU{62 zJJ=Q`${L$Z4tyXPCT%@~^Kr4n&M>cZa{5E-5GxXHAa8Qp&%{Y?72y#LvXHtese5^RS!SJG~u;`MiD6PP#Co>HO@Xoh8xHcy2?_lG_p_uEd5R8~2KQ zRh{0=6KiZ8!{|Pz=hlY?Az?S_MsBstqU4sKvGAPiFS~TGVq~SnDo|2)h)LVSR2LU( ztbx#6kSE^?ne)Dd|KaW=cpM#VWE%#Rc9 zbDTEGx8h(nWV`iL+}eF+1Y1AXeP$r3d_yzD>F7R2e^7)2__ z@-(%9p0pgvOj;Ro_@o%OL*Y#VmGY1@)VuW8)RFYX3a{T057zv7hfsw#<7fN`87`I75 zQuVA!l#MYAuMv4x_+1dyV!Q-n>YZ*}I^%XcEC^JK;|L6GO?mh-BIG-Wcc~{-k}^!H ze4D_0(mkWwWbdsB<~i&L?WU*ipj7Ne&?{%fxRr++J$ib%W{-u8(i7&4TaR$Yr+W2Z zdgd?y9ueaLHD)*hLNRm zu4IDX$K=Upn;5rqDN=P#X=gA3-Zy95`i7CAlJwQcScF8bGiScd4|P;Y=4&)m1U;qr z6^w(VjY0-ih4Q{k>RAhPk9~|8K*&WsTLQ~JairTKPd7F zTZ)|Ymz)%ZSy0a^VirtVGxf?7@gM)5YDF;ip_hjT;V@}3K zN^AC2YYs;fXPGl@3qq($vOuAm(LphD=38@UYxPYt+X_D0O~TBnVo#FYAzz3c#EPqG zY1>&2jK+!{&UuB$I!az~D{i5BYW^&4;W%oox+OGR|xf(EG$PC(G-(x zIR`2`I9@2nWcNse7(m%ZTV>lCTAgkOtcnVtr=h6X&Hzx#ce|9 zZar)Q-JP&gw7^wPJ*+6*H%Z^b%zn+R+vTT?_UcCXoUlJ_EGPK>wBxLX{b^IN9eLU) z;X87MpFe$tDs2rw8qQ(NW)o1dAgMxE0Jy)k81Ix?Z4b4%Vo&z2tz^XcDSY5 zo<30Y^}Yj_Z5xPIVqKBBYn^_nX>Oj2YIj=XDyOF@MS8G}dS&v6t8K8`(e14fvxv&9 zWW7;fwQK{>k@MA#Gu>WqXRFx*Dtg3rlB)a>Th1biVlLu;^(UV=xKJ*%{=#g9?#BWk?fO=W+QL-Rn60{{^S- zJRaaNOy79%!$$6vusS-iz_z=&{fMpi^#L=NKc=niAzspEBU0H;xAR`7Yk6IcIV!^$ ztuL{GGIWlij-m#m^$Tn-|0%G&Xs#Z%no>R~7K)w4DPmOQ7Z{0CEA9{*#bWUv#1N-k z?hay+_=GK^mczujcwSsBmWv@yk=z}`DlsAk|9)~$5Ic(%;*(a{BEovhd6mctaAw6DoUzrU?@1?e z84XQ+jZ^0hXQ^M@)`xtaxsH6+lMmuH$+x-t*?eiLabafAR_r*n{@V<@cWo&1zyk3d z@k*ae`E%Y%%ycnLjD5;j@wrU%V^XtbKixmi1_rvX_!5^GE)VirX1I>lgHOzWM ze3rvJ|LV*|4(9!4z!5vka4r5g)ApkSd=sSpKK_3p^Z%jk-Q%+=&wTG(&yxdBKoSv5 zG#(xlG{Lr$sdkzUotoV}oyo`7x0B9cZ+1H~&Fq|!spSAAuTI)Vo z6O}-*?dD}J&%-ZM+Uw6Ta+54xW5*~EtatGsPrq$^Wb!vOtc%YJx1|LC?6v;sXg-gI z{X^_&5`~x7L%eGUef?EM!z<)+B5OU*MfE>tTUQ?IALMTbPg9+Yb$NxJ0`FYtSDIL3 zwN#6g&O4}Hc|)_0Tj?ZY^Oo34dN*}SCnIR)bE7<@zR44lhw?J@1;yrZl8=`o+|EsQ zj8buv?c%Cd+Gdil%T9-ma<#uLKke^PzG2Uf@dMLB+Wo)}Orrp?8^_DMC;A`XV6Gb> z-eS!}?p`}g(^xMCyCt&sMD_);-xj|e+1JY6Cr%baIG@|~WV^}c+$;Wr__nwtvbRL` ziO60gd!KlV7{Ym1cBehgg9StFU_vYt8Jvca5(~v9G4@PLX%*iQKNNp1W}jEyrfT}R zIr$eG#iSTKQ?hx>p9vv8db8~%f8HYQ6{|o>(R_tbn7v;&HJv z(iv{R(coDiyJ^r-$`?HjN)4oZLCP1Td_l?=tQ09<*s&*{T~YRlA)KV_IGjQ|sH)P* z>spu=|Btv|>=c<-$kBwD62rMogO0MyJD#_Qd+jx@p+)?jSSBXLUh%ld{1`lg&PZ77 z;8`HMY0%N&pJn%{=5eNESBquhkHsc2_Ux6iPwW(vVnPh(7Rv6m0UD9vVp^Ob?iV}7 zq{tXhJX2z!*d)eB8On~&E#h9W#h#%R`JPxNCdFRyxY!x#jPk`lc+zplZW?qn`12Nz zqpY}1Nlb|~Vww2A#3nII44$m?jsHHeQ)FQ}lyEehTPP)X4!1d@J zRCXAKDY0E_5?S{YJt6jr`@~K$DTbqEvJ1uFIb1d`v5A=}A}iZscZv*O!e(d^Oo@C; z#%>bhqrA{YzeU_Dwus*o*)E74NmA?;kBgm=&g@Zqf@gv3ra?!8f0p#%pOW2epYWVe zCcY##iF~?6Pl!AjV($|>#iSUHhI0$01W!H`;hz@&kL~3FZNEsXflX@yX*FO=^X>nlEZlf;h6_1OZV$c(^%S3j5z_V%4(csU=1=W7elMWjxd;#0GJU*eS+GnUsa+ zVUZz!*iB+MH?U0#!%8zplQxgvVwwkJGACs6Pew_}=F=}q)1aeiDQ}DW#J0#M9Q}b! zr3OAMro}ztJCX8p*$2g&#aqO^VyBoZCd8)5W~Ag8@1HyWr?^jKC>F}q;x@5STq$;m zNil>_Cc8jf`h}x=ay&JiY^?|Ph-{&U&6azRndIRhfnbAjO?IH zij?3V^gv$b@~Y$(aj(eu5ENcXWSAp6Au@#+Jt_XjJfG%SV1_v>#ZHkm@%4=0oGF`8 z@z~)gD^6yP7R#O_hO^3KpAe}Pd2XV%%y6dc?~2rr=+uyzqtuGn)Tofvwc%mW#4RE< zFnYsz``pzUj0z{2+r$jakGMrP)#S6rl;}}#iu~n=Qvqhfd@Z>oUTBM)(g5ASg0XDIPH;83ofyirl^uG{0MFs?-urV&& zEM6}L&+p3)p1HCU_BL>I=_VoGcm|4^hZ$A`KchI7kgGrbWd_@`wzi40>& zxTlkMRFLmB8HIOL*o>2d>=K@_gTmV>l;3m~JCEzE8MJK7LWBe2e-b;zY%w9G#6q!2 zjE~Nc@?Eh}WLW{ioMgv&)?x8%xKcbTCL*R~SBbksc3{B&yJDx9D~7Y!ERdt0hx`!z zktTC8QczEa&NkWkVp_aL>=wh(bFyn9h1llYpb&2g?S-)(|IT7@k~l=%B{IT3Ub(jMC_HFD|SY9@EPpiCLcx-6HYjqlpXweE5o~Orfxyr;=q(R zAo3RHOGndE-WKpK|WVN#2Mlrh!tX|n22~- z_Aqg#_#JV!m~Xpz_Y>GEyG8tt*d#K%3ZFc2x%dYnON^jDF1{l!6NCRe*%NIYbt5Cs zA$xd0MzCj;^2p{*A$q0AJ4NiE9FpBHGJOd>96c)gA-jh@&P0*n9N4T&2Copi#BYcP z#I*PWkrm1CY!s`+5E?6Ke1O3Y!z$7E|G0m(X+*w;xb$y z_Iy4q`>>&A>OdA;;XPKac*s^U7^6Se&d~%i8i2~;Q?bUjll-%-k4H{szKwQ1%Y#g- zwJ=H9zo;KUqw;4wHA`STz*q3iU$^bNf@!ceJ|MmCOdKw@`xxNMk^9ivZ71Ek15ORr z*+jAy+x>jcCWOUY@8;{R5v{?deZ@yJLJ#3AgM~QK$KAHuZm#e(r*7vg_ncym7xSfk zAk%#eeOX>@jSPe8%p#!~&a!2Q9lpkc+|2V%!s+W5JVjP*wMY0q-`R4&USh0(Z_Ux; z(`E|nLvD;WZ#M{NG;?Kpuar$V2dwen$ z7y8WAK3snm_rf?1pZ3n6urZzhvj{g=JY+90WQdemrS3K0IGq*69hcoZw{#xy2s;N#p8OD{3 z@H0;`42d%r6T`FZ7(JVOThDc~*-f6G@R5&M`nt{bMJp&O2e{jtZE+ZD+3C@~m_Z&M ze~mbnePl}+i{e+nLe2k&isMGbrr* zOQx(5r-%(ALqF(){CDwR#RVc4k=A9wzmxrM;=6W;aTH!gf9Pquox{aW&1~5b?)yO> zbH>b;v&1iDb1y^4mXSBl-_#2X=3-z+AC=C4P4RpH4p|2!jBN1A5RdKGNRne>jWznv zuE}{*gD-`*bTadMc+cV1>^a=WbI#LrJk+H(ZF`Rn$eO58Rg z;gG?^VaB2{{)Qt>WXX2hOPPM#sWSU1;T78)Dve1w_6g(ED48E|#SL~pciiXnHMDl} z6JBP?0qyoO=WKT>diojOmtxQ>nYfgR8^m2=w|G!wIa2N+DW=5+v0rQvS^XcMUE;Ii zLGeF!?j~YqmpPvo4~p!tfx<9Om=+tvez8ToK@8_IN*m9A@7zN?_%xWaUu+SXc7w7@ z>=O@)!E>bS)#7lGxwrV2i3MUxthGJk{Pmb~xXAQt>^AY77>?dJ=qN9k@l1=?h}~k1 z7{bZ10ooZ}Xh2rCfxOnpaER{&UglWn3M}dK8$npVv$eZ*u!ilWrFP`G8``Z zvOx;t9q|bqAv^tLMY;HCuOjJX`6R4bd!JlOhb+(MF2Uq#a`I6s7v|07_^czCd=YIi z)ubOg7KXUK$a`(pGvYb^YNrl;KqEx8e44z>OfN!YSTD6l+YNR?HNfnAZ^xid*{k!B zajfRoLF-yNYyhmNO@uQFPrtijI{9Px;~^S1}@vkQrt~sY*JNAO0N! zleyL!`^38rKcPFv153HJapga7>VA*p=ziDnXAAqmQRgs3F5$17oHf=#&9SV+p7T{v zxxr;rDsS4(FbeJGJ|J-?g=fGzshn9T5N@@Hsj>>Ki$;(Mf;8wJLGPqIutqMCO?JZY z^m;#gfV$OhbRkEIt%v%F8-1E_b$+9#yb7Tw$v9%a(N1~;exna?*u&h%V8hwAnq+1C z0vCRf)7MjJq}h1whjt(Ri?u(rZNy00ddH}F(At~547^+PL)+v-AkW!idKLA=&U@5p zH`|HOs!jHbJ3;#N7h4z26|3V=fY>Y8MD!pu~cN`1CCaRm131xElvn+8)Y|(tzx^_A$E(bE`?{WctSiY zR@pA}KNSD}u|Ff0{?MFN;%~Pr<@0T^LcGD5Xqji-zC^LvYHP@iUDgq%{(Q?lJ19tW7@nbP(q#v7lp}8R0|&_dG~D-+6@0vP8#6qEGx&Cn4;`i_&g=jm zSbGPfZhc_wD(@YCX!Yj@*4`HG@;$Fz7*~6Y+M?K&dS9NUC%j-XuJ(X0y<~Qrsmnf& zcM)T8eH`!mRGQ87yg0}^W(L^S|82I_bE605*?MxpdYcwztLb{DCH#7~hFM78_v_ut z{iW^G;PV4lKBcEmfqp7CEAi=H+C6mgSxomfB9KARVUq4cH{$jHslj5ppV2!_+e={% zpjOU(iJ6~m7uqs9L22u|PEn)c+IO87*Oxh=*6!yP2eUoWC)ieMnJMCAu~e)SCyJ-+ zJu3Ax;#rY_xZIG5330H(R$5dUIbyEUv*82O)3fa^F0slM6KJC?p)%zaG8KOdiv_Db zs^^N>c>vyQN0YiUDpMXN$TvjUDsF1Mb%*?sHI4(_WgNKP-lBnHH1s^`Kz38zM#45z z*ON&7Oj{>Yv3w%sX^1n?%<|j>*PpWG{0`4rlq;UK$RW*zb}Kj6Wlx7*{3rg?Pjf3P zt(i)^rP>bCIiJC@W+ct5Z`)pyZss3YhhM|DZ7CV0sg_&mG^@Q9-d4HC* zQD{?ot&Il$6Q_^EUQAoC{JZvEsNv`H#7g};R=534UnBV#&o12dTnfQ@TX(Gv=(g8g z%WwVEKA`d3Rl|T@suG@L$q*yNUR%rK&KPH+7CO5DQmOeMF4BpYpG9Vw8uWx0yS zTRno8Q3fg2?fhcez9wBI>1+Oi=K*S|R%>I3356lgbHN7UxyF{_&3a+nWucfB%f;$Q z9~B*~jE)AMEZabCPKv=Uk$suSG9w&i<8;V&>o6^j7B3V>h!=??#ZltLVv#*a_AVAL z5ib=l7cUY=ilfAfMV;k~JshE`^oQ3IBs^WmnM4#_$Hz%Q*5`q&mjbuilSE9Roh34k ziA;oHMFfAEKT2xwz`uyh+iQRBw+e2yk3#aT_R{+iwY6_VdK*uke#%D_<1Ljomx_Va z3dsz=?@Vl|U~rmC&yV#Q1Nt1C-Q;5?^pn{C#hKVrYU}B*Fe{%r<}#;G(*BGjV`&5$ zp+2YXsmXh-NqdVHv(KKD72@~k{H zR8dSz&cgPydPA6`tiTht~ z3qlp5z!%Uc`Add}_*tf^hsmP~@)ah?c#w~Wd)h#3x7s{1I>XdMkUKrdjS8|gbTAZT zD@ECZWP%_;&I~&HsyI=IUkw4? z%8&D&IaHwvaQFFl1{>+S65v5%v(@Has#?4ln zuisLTwRC1?@j8IXD}Jd<=@bz1t7Ms#_5s)L6ATBuT4jG&x>s zahS*ouqY!%_JY8^%+_#$6U514ovor2{ZRZTk@ayYOMfZ;vpCo4iI~3@|3#c<-}QVB zjyjIn8Tug%3xGUOLDmC=GsN$T%fuY9OUx5lwGB^(7r3|L5E|FoWC=6iDutN4>ks+$+o5kzJcJU=~l2|Bi zwhl7E^@uXtP+bNWuojKMapE^@mY;h#z#KQ=Y0;7 z3Tbn8h~vcyv0D65q%iFY&)^e|mP<*AL8+2ma$b38w7+k2ro>=RkX;ff3={a0&%{AK zlLz@svH$Lu1F9Xhj#TE~Mz?-_wE2riJN(}tIVL*F9r^YmC7?!}AQp+WVyVbh$oK@M zTy`o_s$`c$O7$0fZX+cpm~*^X8_AaAT%Z_~}N-2qaCJ*wN@&%tYiUDWJob6(rSQ04> zvSXh{DdQub=0QFkc9Kecyx1d77Jn2e4YKpaZZVuyB)eZM6+<{dDVLJ6?KCC~5r#@dckd z=#;To4orzGMu=S{j*paT*|E<=DJ5csSUyOpw7ahID|c3i)nZX(m&#`QSA4?Ja@na! z3FpQ>A!M$H{Li&Pt{HMY871hk&xAofHBw?9?u!tL&WE#tE?1p7i^OWNRV)!Fisj~uJPyrvL?Hg@2GLqIevY#!T&9C)H+HXC7FNA-6Eaob=HccGd6i4 zqg2X{eX0ieR1fl*@CBcPJi^zQlaJl7R-7o7M9O5@vCou2KH=Qhr_N^6)|QC1VuP59 zlt$UHPxBz3Rw?77v)D3`kW=;?wO6g!BaRmv#d0xUY!Iu&*r$4s&qOJ_!Y1TK>q`3s zW#@P?D7CUnBBfb&k=QPlis7uFluJoPK2_E;*5k+7E>?@FNSPoz_Nf`yf z3X6ylva?Yv5`)6hfav4J9W;FJPC7v27`pBQ%=1hszVvkr7DZR2|pT5XvqU>^Uh*%?5 z+3Yc@-{3^q)gm=jMyZj_TCpg>o+5ilr1Z$94$Pd@E1My^yep({4g16*u~sY{q%a*H zPx|FB_*BZK@19YrzTh*B$Lwlzro>utf>;tMynOnS&%{AKlLz@sv0mOyUn{a_8Fo;L zWY>xetwfKNJ}D()qgXBu5koi=&nw+LQ8$>gM=TK=#a=OA3_g9bi^O)ZRQzV7RLBnD zu)ZU$Or@9-gTk9KwQJ6xR1fl*Af+feYvQ1@CfgSE)ST_Ir-=#Q#@-uo+%4O5; zXOxOTK9z%fs;u`a|8-}-SS_X^WrA$-PsWEl^QE(zrNn2op7&WyFRS02?P5v{3ai(k z^TihyiD|JkQmO|jwO>%?()Z+zKjiIz`k~JLNGXxc8wB)nF(`bT_>xjPNNKl^__9$h zmWcggg_si4gOut)O6?#egv=mhUQVXOelaK|k{y|O%jm(UeUQ>0Db$Pjhma@OTz(}b zl0Mk6Li&73A?3fMkn$OYbjIfG6RZ(Y=toQxQPih!5;BaH#z9I?q!h_ciy^e2RNF>= zYof@~D%iD=QY5>5kkTJ1C9>1vWHBfqvD0EWHz-U%L64P*b}MOJE0&0jgA_LW`;t$8q@-l0 zMRrWXvq-Eyue?P&Tx8B#u}%z1d!(df_eV;J?6lY*2BrE7N~dy*v%#DtV!IeC{gJ{F zHh8ARMlmSWgOpn9;f@+bo>8!QYWb4VA1OSwa5O08vd@WsET+X$k!Ke?Yi$m_j8gHB z#r8-kk_x5=^3Q-M+!@O;2+Mauyx$&H${fqV+W;3cI_agJyP;zcSlM}HiPjq z;gr~;dWLpZ$_`4q?4bNecF!QCKT`f!c3P|wQ(~<(=6L1kOo{E0QX)GoGO8)#6O;*3 zVxO8pKJ==%a@t#%7U`p5({g5%I@#Y8>6f9?0z+D082n?UJ@P5ByXlFyi#6gm#d2|? zSR~d)N=kM(EBNF~=^o_6w31w}-<&04TAUmyOe^7NP;QakGe`;H1Rp-=;~&DAVl%nN zA!4~0l$7l1NGXzCJ4k7dloHuN37+4y1AL+?7wg0#u{KgtvfCr2M0Q$i5Q7qYf)dUm zCr}m|#czt`ky0ePHd4rA_>;#nXWb$@gwrfLoE3ap?M|K`*?JRpi$O`r?vIoo$!?Dr zl;9Kea8_DAePYT!$oK1U_K8Ep?nntf{gHA`c9B>umPShL7nA`?O}jZu#UimkQc7eq z2v5Kh`o@wJ%6EMQ8kj+7$VwUH8h+9Rbzb~vk2_IR;TthA$i z+enGkVwG4V)(%qoBc()kI4f|xl!=jEV!J2{wPLkcB({r;3RJms1|{}M>*xfL#ZB-D zM`NYdrc#$q5P2_x%{!8e!dnpR;8PQi(kiCJ_DK1r?CwY@kzFkY&!B{GVkOw^ zwt~3&rkEBx#FWUl1dhf^?I0zD5PTRpfxn4-Z@{jyQ=@&ffU{hjC}u|rC7q)zd6V(! zkX;ZdeX<#+hfj@ID(2eGGFO~aL^hkuC@dm_&5|)0r9(Cg$7GZ~*(NrKrD6!V!M0Me zs>EzDC=7)}Pee+G?1D(?lWk(RSSsd5N|iM+bc7YNVYfI@OhihZ?1D(?lYLG!u|_Nv z*@u+Sf>L2CX<2f`8nH@b1#k4AOpqP>OdRAhMM_R|R-NpGEg0+JI2*-+Na>SpB4hRN zDHU@fr9yUgq*TeyJ+FMq6U_v3vV9Y55GRT`kupVgZlu)7W@qlqS&gy_BBjrE)4rS& zO=PebN~xF|DHXDlky0f)5h)X8Gb@b{LO8AVAT@)DHDalljFbx5>_LQQ@R=Z+o#iu1 z2&W)Y`ed7Z)1w5GI+B@xr?{1y`M1%nMCRXCw+b@<_PM2?x^3@J56hV=2Bk_ii^ZV_ zWrA!Lj>{+$WwYpLM&a!?_BqkSa_i<9op+QlTMSB->_ntYkX;ZdQ)DymgLA`Kjk0qh zh2?EEMAum^yF+9F&y3P1+r%2NRLqH#3fU~($yvc?g6sm@teV5wD%(Vc2BVaUY*&sQ zlnU7l8O|sZWQTBqPaICSttYoKIuYiGL8+3>#BcPVOpsj=DN|%yq%_LTj+9nwBt;Tp zx7Z;TL`t9Rb0Uii;ZL6$viA^V0iujjA)CdBGD?-L;VWaVSS~Vz4JA8LCd!U|rbuD8 zYdphQjIY2>L<*xRP?*G;=RVFp(Zm|DRLqT(3fXL9hJWy>lFf?o8D+v3eD2g+KPR(2 zVU0LN%#D;f*@;MLlwA-h^zjM7#0HT#RLVLVWD|$j>>Hm^cpCna&jcyV4$b&XlucS> zlqs@v?S1N=2C+_L)$NSZD7zq1`ed8fEtZPONU4w=LhiPE=t(i19%hR{nIJnSQkb-l zPi~}48RSzZg^il=4B<4|THX;Ch}~kJcuq92T&xh2kupJccBD*^orsi1J5cK3JIlpB z(Zm|DR7^%nmF(nsu~f{C6u$ZpPBKy^+5+OARvmVWELWuz`L#l;j&e?m)gDA zK6cVsA|4fUMfUMS|64IBju5{gmWyM=-+b0>MSfLZ=2xX06>~+tzT^2XBFmp*j}X5h zmW#h9hO=^Hb4R4|KZ@KDcBxn<{<*zG470D)Ratx;bOt*|_7U;>k$rpQ^JJv6voqi4 zemgI-sf?`r?VQ5zd%ye3Y>ku$?J?@8_2Tp5+{g|`e<9_lcxPlk8QC92_7K@0i{tDy z()45T?<4!R$Yw$8jL&P4{WaN4JLl;C9oZ~|giOBMRxGv86CY! ztP^>HM~Tl0N~`p67Mlgo5><&EVy)OJ9ugbGVlnu%M@sNHCnY^dr^J!g#Ui^!Vpm4W zgh-hp`;f?tbUdrXa8^)SBcB@C#r9E-&#-q+7FlcnyF=tV9CnphCpL(&PjloG&gzbQ z>TEZ?V0!2F3MoKt0D6P?1)sfF3dyBNL5v#-rkupVghd5abK0)D& z2j|9THApEICx|HY{aVFCVzY=3IzBKcu}}LTpPu3Kok&sf?5k z*^IKv_ynaUQo>o2Bc;PSsK;tWW`}89xs%cNFjktSw2G`w!BG|l%J`Hyn;-oGg|EtHok*LZnQQ-67V9RbpMF z#NkYqPA$jx$qC|Qaf;X>){0ePU8Jyj3TGV>8^k!ApnM+A(rY}2JFCP)V!O!9TJ#B# zGDUV>q_oQJ5YLI>thDS(t5q5~Yh<^Jf zoLBmJI%_s(tC$vR#O^^#-ynri+?-n+>5Re6D5Uk(9uLlPF;>Vq=(MM>QVdFUsPL#ml8SHB5!80h6 zrPPX5BKx-L3!Ae_cBNP?2Bk*!G`0f#qvn0 zlpQ>SPw;P$9vJ+CXM?>&4NxuCh(VbwyH;!!nc0qKd8Aaz4(A4+5JEUND7AJUz32w9 zTPznVBc)n)O{7eg9nS5OofgBnK?xyL+a%8*pvKYQIOiyKq#fm%e=FVUbyPWY#$>mq zIOJDpXLuTJ6`5^?9V^vRY9b%zR^ihSDa@oo=@q-hv>5b0TSQr8zevbdIq;lV73tNH zQX{(|QkrGAi{WSpE!eEu!Ltr4b--qkwL7pYMOJmf4odK8h?L;pE+y#Yva2J7{xU63 zvq&Eqn?5frkCaN;!87>ON}<<`Cp~4z9@Ov-@t8BQ>;ap|>`oqhSx9W@@8sAanv|_J z7qYj{m@GTxOf0*|)-uI*X%?d&#<{~P%6*}2OuGY2){m;RX+>xpp@n-A!a~9A4(#Y%hidWd6#7eUT-5Iti|oi@3?2PI#t% zoevqs&g4@=a_mW#>Y7KiKh6z4^%Wj^{eLpn2UqidR*s!z5u$ksy88+K=k@7!mK>Ou zthBp{h?{H`zt~_8lzE6S`BW;$9%5qiylkow588S)Sgt`8Cxs}$z ztv;2^vAs+}pO;r@YpD8evU^BX8d>gigfrQhpJQ8mF`^-rwv*+BIOA(oV7r zP-hMSa7pz;`2jLUXKs$Y;QtS+v@RwTcMfG~c5bbHI6vsCk`3c6hp#YFP-%-q3G=vlS8W5c^gXurv#g@u zV-M>>klBy1u#sQE&hx*}M;`07E|MzSsg!-1F)lTBo394LPrSly57>Hm%Be*AL=o~l ziPml>DOV$%$<=qWqz3CJr5NhMuhx@x+kG$8g*mpA6YEKn;vFn-QI>79xig-VcxoK!Os>8s#~$%(WRRSfR?==dA+K)Cu?>XmiT4m| z4z6y>u^oP##OtL<)L4rz&C+1U$y~kmF)fpc^sBg9T2rzyS=QIM8)4_T4PMHU_juI` zYwTg7bgO-g>ujsXHQzp>8fmrLcv-?88eyZ#W#6J)O!Z9@Z?|?vSajN}VP5pnyADlPa2Vq5kfACu11F}Oh@@n*X>Y#9A*KYB0G;}yy&Us#dqp^a;1V@}FZsWaI%BFB~x3uUw~WU*fR>?)5{ zDEFRmo=YDKOJzOb0X{~~Xt%Qzm`lVOdwVohp6w^oE)#Ra0r4V{1uHrFg!rl0E)ExK zoQeJldok@7FrAoWb6+BT*-vdIG1hA@kv<7$Vp)Z?Q%dG>N6UQG7ixd1bK>k%ug< zqo;_19&6&F2)NmO3UcgiqO8aEvnM9vCg1nBFvngby=$zSxSwn@XkCUm6U__l74A1} zGeXT?SwXzb@LGY=f1JWm&oyvkH8zzx%Pa5MVTkYNo2{p=YMvWbXz-%A#i&`Q>i@YtKpPtiT5 zqTum|EB`}hqB&uc6@ObPfPS^Llq&9bj>k+(jx8cP^w>U@+Cbb$v9Di2p(Q9{hSm(o*vzY3dz3|V@H^;r>;~!xvQv+-mMYrIUR8Co^{OxCM7ojC z^$+COTK}ELxMU)$ek0$Vhw`_Tw$Y2p+8paAt?M`C*x!@5G-;0!2kcH0wgA7$v+Pcm zlOep9z36jKuThzJ3Or65Tw^Opyb3$cDrtw!-tcm|*p_kRCOedLzQ9x4O}3sDJZ3V` zg^O=lY-@aBi#+S)Wi?CAa!yO54G=ZF_29^)q@88S65N}q8dzgAtPZu?FXbc)mn?6z zIjm9fySLjJIupgVjdI6Yd{i2IV}{HKqh@1Vb*}fp=5l?NA|t1<3&kNKs{^30#S=8A z-{x75S(@-Y+-}!JL>EC0*aM_=wlld0?JhM22gnm$WbLPXHQw9pPXCuoy^wrGowSH- zINMH>k&EqlVsO$(n@02gOUhBp7=GfLIrag0dEW2k*k|I(EkDedE2_%rxl{kA*MPgY`$l_$63*K+^88P3x1;1lu4fJfyk&viNwJ@l zWt%-|7T7c77b@(u?-2$S=yvM%rQFpH5_UD0b(}hqej9gnc%B0~ANEA$Puk%B+i)XD*c>_dK0unsq|R*StQ?=HeJVOxgHlg0T~%fTzTxR7jo@ z)40p7B-K2P!hn(et^mnBD4$S@I%&%XsK*9uHFydIyXf?6x!NP~ z{c%KM((VpLffn#)dnPQ{a;M+zGsKZQ@1|$aMBtC|i#66jDQTu*;%3MW_Yy~i_AC)T z%Bd8aN?}Rc(_s-FWrL@w#h60Gg%sNxwDKg&lXM@5jBYPq3+y#&B2wix>IS0ZW%3ct zV2Jo7ekmW2&Yr_w_KNQ7;AboBP9l}k zzlzT9Qle_*`TB={>#xtT2T1b=NumrQizafQWb57EAS$gix!vEA+q3JuB}FE~fMTD^g;J56z?%@4is*?wd`SMnl3PUq&?P@S94b0)u! z_fAsiXLf)bb+gruRlfbqqpy~1;y3#wP33BCb^#ZXZ~a71tGz-lUCpt_iL|DLtn)^n zbTwhEBQ={A5s4ITFL!O!6%{s}9DX=uEo5mgcUz4}C8xgZRp;%tjmm-DL0I@{lG$_g zSC^9Q&rsu##M8(yB=JdtTT1S)OM7N&q2RS;*>hZ%M|vGGIbcsv7T$CwW-PM%`O}tT zZ&F>%ywgsRc+D5sljI>zdyf)+`yzXvK1H3?QWF;1JhIMdXJYvxHW~8YIKXZ8*kZ~o z`E{K)6ZE=1BD?gECne7Iz{!NZ4l2h!W34N)W*@CWbC$hN3NQhgSbvCEXd-TV>`p3U z0^3GZ`5iWTCcfR4QsE!6d;QrIv5y;M-y?$N=9iEFE^y;=d*0vNcI@88+~o;8_Ahxv#p=3$7Q`l<`Qs9yzNm)yEt(0|z9o5PHQA57kRBMSOrnPL03~uolYLBCo@gJ_ zNKLd2zPu^VliUg$l3pv{-}ekPho9@QXF_W~_x#Nr&Gnlbz`4hEP_=Zkq&;`hYp2Mn zpNKW~T&e%=-cV^y^9;S0EJb9#OZo9A+DI(+*zft3u2DtuXZl&W{uyzD%hM!YjeW?Y zXWEX2T0)195+#K6FjZZ#og^K8iSwHCSGSaw)2rR-p{iLzf5Y?PS+Y%!^>fpVQPkuA zYtgm6MqAiLAWsp0^dsmW9=YA#_QnSBAbG+=+{n)!<_qfioc#{b&|~YlcHYuaQ}@`@ z^!%4)*}D{cF7NmdPN#ONRlfX;2I!FW5tIExY#rI7*V^GHVvU{PCW*}uMThCqFQtm< zp}Od?`$*;*drEn!k4FrGUcnVDr4rktPFo%1rbzT2dx9pUi&LNCM~khFpQ8#|Np0%k z%|YZjl>**lXZ%qD?HC!IPP^Bg!)zUOgFD_wNvp9r6li+EcN24I+Zi55)E(XFwKILN z&-gL#gWaFG5?D`0M7!%%AZ;@>370jA+!Fe80???2D>)Wm;MHOd8Ds8Z$CoZ ze`3xPVr;WjNJfwCj!54W*>6Sm=l;);TQ-^Vgc#eOM0&RDlj5+*9{K-a&nDrnH0Mci zTx93lZKQsyt)Y~6+S;&)S%sITwcdm-vbTuhPFoxb$G7~zVy`dmw5P~Q&GfRox}gH! zNhS0@7G>EBX;1t^v3N^!l#w&$JSpyvY~F>SpAv^e_VCCa8QHsKhj1=EuTL+fu{I~QE=-H3 zMBeeC1p6N&JN923={=F%ci#R}4<1nRXxSX69OE6Q9eWc4%R zt>PXrORN-sD#kv$2l*@<A|s)(7mC4ik!(gkqx0+p*;EMrN-ToTLj+R7r2q7G0d>o#XRh}b%B{qq_5L1yJlpCci5f_Rh#6{vT zu~1}1`AnE2?J?@DUx^8kH(V$qL>~S!M@L0=w(Q^^Ldc7b7DYClWU5&kxKN^yyJhnOo46Gw=Qf5CH% z$oLoR8Zjv@6ocm?*=!$8ER7V|fExQ3;{PN5N^BG-i=)Kg&lcAB2cMtI{wFbnd5P>_ z*sTeFN9_ES_|Ia2m=`e|4gQx%XD&BqF_#-=iNU8ycJLf(bE(sQB~BJ^6qkq##S!8n zku@Um4?aQXeG$r!Mcx--2Zk{J*-lZ)Mv2Vy!~U_jL|iD25EqHV#KMT-=twCcoG)^K zKHy0EHAlz}ER=ntc%`^RyhCKK4bEln3>f^2Wseb=!HCXN(RJR-a4r-_h>OHLF+bu^ z*@2C+=>c+XpvewQ$S$xtYB@G-gefs7jk4Lm5&gIOPy9i+oNRBRO4 zK?UVE={zrSlm`nK?BG9GpDv$-&B2qWG5I@rca*Vb$eu0+&nDUVkq<8`@n_-v%vr(b z^Kd%peKJ2E=7D#0M7G4>-06}1W7(gFFfhbBAI{U_LXo_IvPfi) z73}lD2YrZ?lo)JQ+~(ZiAM~JH zX?tjEMu}`lj?JT2MhQo!OJQSk^gJ=>v45=0kk3@{k8C};_q2G2m@BfGAo>WgSR5mk zi#6g9aiJJ|7Re6hPL}=8wvZm{FT{U~?4VDU68l^xWr?^@940Oj*&>C|ri-~^mVLxy z1uKEW8Dgx&cA<_g5f_TX#6@DB_`k#}#o)>KJ5rfZdoWA<-N+6~Og^yTxglbFG`17+ zskhg74U#8jiEQDDQYSK=4ts)lNn{7lm`NSIFXHD%Z>0^Qb;yuaJg{ep)5WC7x*i#y z;9nalu^o=)oi8 zj&6`WKT_gw@}uff!J9zla@SN zKjS6+26N6Ac~ZfSIbBLYq&LV;h%EGve^7!QI79j@Yr5Lw#7QfaA@f+Vlj1;R2cO)? zbA#;pkrIb9-FEUuh`GIx4|ni(F%{YQvS*01#5ytf2lCb_6T;}oX0JD%jdH~e5$DSe zM`KQxo*x|zp4n0oVo-w3?8gyalR0OJ)5WA%C-S_?(cjMCKjh!>T*JVHzc6Q7%o6j& z8R9IF*?0Jaqk+|t@`K0@N14kf|BlgF3^sAzDrODhbSXn3eZK63$mamg4GOEEV+Uo1 z>{&L8+*KzML&}-X0of+TcJN`-$&BX)+4CbM4rjVG)0oixe_pwLtcUPx zCS=!(DX~3L@*^cFdxkh&4CmI#{yfZPy$f-YB44tDk}Eyf8)TCQGX6miBv+u$B4KCU0`GEZ6DKA7uqv) zQBFIhJ{M6K(XO z+53CuSP`%gXO z*LJV&=k2fw*K}9jrk~9>rZD72*MF1`dTp25!xT~`4}{=YoiYpCv&VgWG~~MWUQ0B6 zW_5gOYp%ELx$b-*?D{p};U3`r$V=48%TsW;5cJx6WV^#+jV)#X@3OQta#@Ta zqs?Uu898@Zsl9%cU)S?#UFm*Lo9BH%2DJjGr|q4P8-Mm44!pxPHS?O2kEmRC1L-l_ z7WgOsytLKv24X8E(!>9l=r|?T*?Z)qUOUG3kKFkXsov=Kpq6aroaBzEAq!Q>5a|3+&eG$V3;~Nro7B_40bc?{5v_Ota;D_+}u? zDn6>uy|~iqNQ*jS`yc&xmgHYH#1`j}uQ>Q5S^j6Xf(nd7r+j4M{H?a0FPpt~fSY>HnP_1p4z6|ulc`DK z0Xwej023`qJH(UsO1qm7Z?ZFlev@q&>s*BEO*X*yu$f=8$M|QqJxW5b^UzE_d(ZqG zo8jN?nJ-R~l?}7o$wN86W8u*4eDSC;RSwUE0iUWIp5qhnJfdzZ0|Vyrw}q>%u}>*; zB>fr!C+T}hSyJvqNU~WTk$JY11n#lrq$bIDKXvTPA$CuhYoGX-M1}+U*SnPMAb0iH z3Iar1PDnHJ?HG5q(w1`{%Tx9lja1rZhpI+dd^Wq&@q2eOj^dF#TZ`M4b2jH1kERpk z_uq9Uwy@DUS$x2@rM+HuR@l9iio;ZL6i3fhk8ry^_5gQ&v%NG%IeU?3#h1qTPre+Y zL1o}&@J64LW zs+Ux+v8|yT9w+)qjAn+uHM3dOP*RB5`Xny#I-g|VDyI=UJ@!7;jK{yXhC}Q%m8|!< z5VYHT2qPWf9tv8IJxgvwtoLS^!2z@AdvG=l0OCrW?d*YXUR&-lJ*RZM2lG$ zcYKo_Cd;^-m;%z7>JKpSjUwfvK=Xf^;kkfneHZlVtbOj#HmM!&TbwV zNV)+#N2Df2mW50xA{E-Bd^`5gmQo5Cxd zP+~krwy3ceXf01kRMPUQkJ@`|KwrCH!j z7h@Bbv49f|-K>P2B$7Dv2Ju#7v+-;GYuiA*u_eoHqxKoFcc?LVwL>H~|BWpmF({Vr z@y9bG*FgVbHkol2L;FaL*>;FzxXF%j>P=RgbiTu{-el(zp7qY~+a%wuBnFw1#K^b( zgr9Fua5&%YA*5#fC>_OiKgI6nO#DzhoCrfkwVB}w0=YfMx`uded4terTOU_~?=eDQ zP-xhrO}=xf7w~)BKKNr2yyi!Qm3uI%4=dI$> zsM2o5x54(1K?_Azh+^>1;e0zyu}>9}c{wR*tG%7z4J{|JIbz39Pq3%RNf*g;&==H z@OnJq(mE<}n$R}t7p{0GxsU;cYq?f>Gq~kBJ%7D4R6qJQzmQ7VHZ?rksHiwp`xOsp zrl-;n+v6h!a~LtswYIULAFZ(e+ec+kV*^BdmfgkWo%<4%6u|{Lz z?M-R-NV{(gnFnpRG`}8l=(SuE+8fetl2*q%+$+#tmsSzN%cE{U+a+zhv^Pdjg`o9G zyF%I>!>P>Bc1rWAEX$5ul{j{<+JERp#d(Nne(O#9-MjOMJni85y zv{$4(FKt~BEh^e}Y2HF+*@u_YN}|0i&D$sH%u8vb(0Zl)g|z-l=(?c2B&|x?j%(-v zp}i>WMrp^cqw|FJg0u>0JFlTDg!a6&d}*IvK%Wn7o3x~~kBjMCqHUG7kJM(+P+{WZ zoMXkPTco}w_5DleQKR)p>yY-!wRFGHo|E=~v=bwEP(XWDnm-3-**AC;MA|IrdPxsn z$ulR~Gt#~$ZRh1Yo1#4}&9fWtr-mi&9{H*N@FuA~dMV48RXcgky1{UxY8wMn3OJ^wO&fLl*Q&gPf9t#6pt)>>mtVF zp*5BjHE<+RN5+Ow_faCYosifvP_pxkAV`qRLaJ&?$a)1k(AD> z?M9@BCDlqgscU^m%1@*`q0?4N`BNze3p}6)rQ9TC?=_6LMO!89a%s|!uH z>QbrK$n%q-%$`8ITUtum{Z}*T0qrhnN10KQWv>rmS_j$^X>Ulol|6pFu56O#Gf%SY zgNvAbg4QVQ5ow!P>Cvxnv9!OFwm6$)d8%VqKr+9GLxA#Kl9%uzyHD9uNA zX4#Y1CTEnMxoW2u*gK^AxM3pbn&gZzJBJs%mxxb#!G%<4kBUD_~dZ;WR07g~cf zpL3RF_g~ArGqm~AvZYa%e|8nxJZTq7+kahRU*Xy7Q0t}o6gUR-T*)*zw7JsuGEtR} z1XnOw4sDJ!pGe2+o&=NW&}K{9Ex*$jG35^JHfcU*k4!L%d3$Je(w0ek=_)4qq1`HN zgU)?CJMrX2?|XKhCACB91EZK@h{p2+*=minrTnsA;S6bur9GF+Y)Q1~(*8}_otH5u z6K$Hbzm(Qp#0*ZfsnV*XEgHteQM6iV*GPLdn+dLH=W_jbFO+u2P^QtMot5?}Jt_L(%F*2{~H!sLrrZYk~ZB63Fh4*9k+hRC(k()y$w8OD@hG}4ye@!7^~s(v{$ zj?qp^+bF+jS2If)?S!=bN`YTlHOg@*Yvk2`5%ZqWK9%Nkq_b?*80JZ%eIo4v`8~<| zQg7jpNqbbk%3ZDYb3YE6{MII!u#I+9n)e-PBueN%q8*VoL)y|yZKId80crmx?cocV zJdXB}G+ttG?%~nwV~qBpG~Xzhg{-b(vt+anr1^f#@ss2alxLh#Kv%v;)%Sl(K;}+97E_k@n$5 zY=@0@P}*J6?zx6tv(XMnW3OAnTYoK^Yoom*?HAIv54U>nOzfBD+jeK!BYbLizkSlK zm$o9;{v7FTNn<5FJUVaR=%b@vDVjNE_l33jk9f}5tK(%l{`h5VB97KC?J{XkF}~hw zfVZS=QIEgplH}UU=M9^C0s0>4Yo))RooKu45iezLO8u^SU5{UAyS%>GEp56yAHKla z3eet=_KCFHFSV!rmtL3l3uzBtoj5&ivzMM-QnPeTca2SUm#w>Yi`UbA(g);y_f?6b z$pv1|@09x2Qs2MS>fQ4-Y5r`*tGv?O2QHa8c46s>;d3vq;@}P)^v%V2mv?dE)5M3~ z&v{kq_oeO{YFj;hUXk`aY42TQO`f*frBzAWJvz}`Hq9&Jm!;k)^_@%XKn_~3v~NjU zf1!1F_IgQLg|t(ba?WKNQ%_FVVE2bBu{k^o?ud-)6(w>)A zFRhIsSzc*ullJ@4-cDMlYg?uLT-uHz+o=wtw695h4c zl~=s&{f14_ufNvsd(DX4rcv82+goyf`sJbf{OCp<{g#fNOxqNsZb@H}w71A!^Sr%5 zT7|UrLu|X(7f(sMSlXg7_OjPgUD8HKn?A%&`o*r7_R%$d0Ug5=?_71pYpN%u4wvV) zOKqhWx+kRVm*=xr*;-GcPHCs5Z5?HeUQu*N+aPV>l{U-U#>b^~N_)B_Icvn$OBQ=_ zu9MCiVt)PP5c|kW+GEn#RtoL0(YDzm;!$Zoly>yOoVJlWFPrw2-6Og^>@_-8qhtM- z+ee-(k4XCqX`fwUZ+cRTO0W@nT__4v}$QPM%!u6I;*99 zMcNZg-SY4rly;G{uA#Qt3&<*I`_mpCPieg#M=PbZDd~BE|A5yUZPIqi@8Lvp-_WL_ zH@&TEl|Enksj)-45^vK>5CFXeG?q|NsjrwSy){+YCS*yGTs z)6xD^+VpIz^_W^Ntwh@LQTBiyC_yE2O_-jK3Go+p+`tJfI*EF8Ha;N^4 zwDzlQySI1s(tapy>lKN%3wL?0pDXphN?lZFjh=VsNc(eXcNAFHwP>@Y{Xp8WqQq@i zuJM$*P3reUnAg};kBB;H|ChAWBkZ{MQ*V`4CGFWO?Gv{jecTCWXfO1oa# z`-QgIQ+|fD(b9IakG=N@_^iwQ6-Zk++*-Vjm?n*hV#M~LV(an}H&q%RfY6>Blh{}M zg7+$GrSgIs^{8bZAG(7V!}oe#KgVRg+^MhV$odkS=XKv%X}!{3z0MALI(#OLjkgG) zezbk!DSJlRR%y$wvuS=!r=?BOb#5MF4|~2lC2fiP&SWRLE?n++bW-Y4sk}~n&}*&} z(i)`gEwg!^=Z{PK-_jmQCtpcEbj|A?>Zj6gkzRkPJ>)6=iL`%^w&*%*%0)XS?O&zc zQ)qtSA4~cjN!!cp15b#f(!M5bae+l`MWYhuhJNA+$%{K8cZ1ZXapv*(fus&epB5yZxcHdI+WS&jpoJixPTF=aa_>oF zlLNFC))Mxd|E{zrrFCCw?S46jrM)Aq>B2;P!A7qW4oSU0ZNQRCldHzvm%ZOZJt+NO zv#2Y2S+70U%2GL zlV0HVNxw`%Y{|V~XW_1b=dzz4b#%xhL+6&P82)k5hnK!Ly7}6<{&R23cf7(_GSVLO z+uJMc+d6-1S>mDV?)CWYm--cXzC12_UTW#(cZ~bYs|TtMQsU2aJ(DPF(4B8l~*aO)jr&v<`hyR<3N9%7!f-^|O>CP`~4vZ-F?d!_xQ zw7ZIJrzg@&(w>mE;L_~l1urHJrMtZBy{IFX>BxN-TYUoU1!)&a;~8_4|2i{tiS~rF zHEDa%uX39-zG85d{n!1!Bz*^5R!w^Ene+C-+jtwiFK?s6ZnkDO$tIg`zb)V9-Xxo3 zbN8lfb~kmCo8FU~a#0izr3n^#Rf?!oDM}R(0TDrw-lPeFG!aDb&h!8L`D5Ps&&)H= zJZ127K z9P0tbZ+CMn+sVpk{_h6%^Ju#j%3cu9UBEsIER)~NC+XY=<^|SnW}_5?I)VKr=*2nN zYl;RVced{nrBf?x(dw*&@lJ23R-h{R6v8p|2WHHK6aX_cZfX0pgF4aB4>ZtbwF` z8yNq{B*)%_v!_Ij+cO`_k1*;>8Zp^-jokMp(4V5_WHehQij}}pfYoRvH}xCtLUQ06 zz;l2Xn%F#H6~NMf^(w{ezyY#QetZJ&>&mC7nN5>+_}&i3qJceii(Be+;sOb15*JTu(C1ghaVQiTfec5qa6XHG$yq7|27bx}hkgst`DjU^_OFx33i;7O93KB=8qvC0JQFlT{bT{}cV0s1EUjcidVzDHn%fS8v*bi6}34@=o!8`sb zpjA0LO<^Ge*uMZ<^sqnXP&y#~DPzvbh)H_NbkTaC=_LETh>}10v?Q2~(#j|e*q4Ca zFtRdQN2LPu0`svxTE?UR(gR9XvIBCcWMIcu>gc{d>mkJ?0pkY>aqJ=ga42R`|9}eX5;$Pq9*n)|5(@f3p;&ZGCSVst(#iA2fF|chl+a_~34eUGU zV=0(zk>XDQ<7e@3dZ|{nN%D^Y_HER=;bWKS@_?VX!TVT5z4ai;4{xc{$-eoy931`; zU>=d*QS|4hcW~@ifyG3#G_r>Gz`g_QjhB&I9svpgblac3A?zKn-v*YfmQ2`BStn@n zI0SA4&gbJX(#ip_1AcdwZ!+)`6X~MvEiisSBggo&TazT6eP9cyx6hvtBExJW7PKvPvLn*U4zM<0X_4ZTZQM~#M)T_neR(rKLA$hVP)jmtH8bvEY-taQdC(1 z_G`fIM@TfY);OAqmI40*;6DDT8nW~yV1EHD$I77r+$2Zbq{W zlKld(0AQ#24G5|?56lIuz#w}Xo@;&Odl7k?#50GoK_f|fN6p44vdsc}1Z>K~{(wW% zfaHL9B)v&&P61N`OBdN)!X|+^fweeU3hkLr0DEVkE+#_QZIZ?~uti{59(I$YHU{il zdaB1C>>VLvcn<8BfjQVdS@tNP-v+c~lDu}D1bm?BC!i8QB^owIgXsX44y@R~9@7le4vZcQlDfzxO(Gdo8}R=?UH&vfHHF4j zV1Eg$O3xN4j%|>y78(CtpuhM(fXN^T_oi+0$Tv~PwXwtE)9Sl06K^g>mBQ40rfzKFrX(A@suW=T)qzI zKcjA^mF>{NwHDYv0ZVkTIucP0u-^ez=o3q#pHhUY2Kob_gI4izz*(}tDxkjw^o!zE z?FEwiZGis>a3_j=AX)OO0Isx1VAuGQ8srf-fqfoWbr^d`^(uksfYmw0X8%4ijvGMr zKrgCTJxx9pzyg6i(XvSzcsa0b6-l=xiX~IHE(1mn2=m7kg5*=-y^2KnS$D6jinLUU z(yM6kPR+)HId&ab2C%{a7Dpy~4cK{LCr;K+%ajseKLqyJ#op62Sp@92KgIZClO(!A zU|$1vhQG@~7~h}e^7sW{-DulnJa9(ku3p3`9409+Uj90*?oN#wreI ziYUhMJLH_(Sx{(>W(yRKE(6O%_{e4~MZvL4z@8~d*2P-3K<1PIj6aRYu^N8sj`Wlc ztPNPBk(JZvF9NFv_J}{OM%<(U`(1d(BYss(8cPNCePBbuER8%U1=z0vo71sc3jN8z zJ^@x>Wb-7QBw+vcDKBAcik1-6LuEZS3s{Ki2ZL4 zodJ}9;8N~pwG?UjHalnUGpLrW5NEu%DGZ$kItA5jXvBH%dFna_D1Q`{i+|pq-J_`b zK|<}PfW6@#o~5o&fbrv0sh&ZM{mdDvc?`4?=$eJ~QBD3J7;jw&tjnL})1Z%lwE(*u z!HUT|-vP@7b~}*G(xiF_Y!_H=xOk#^O`<&jnhJC)f>jg6x4_1MJqwp~=<+>hNL~BD ze+YbtA8Jli-vIl@r*(bmTb^otrhmU;(Nn$?oTSspU(BXZz6DG`z0z>WsAVWTn?l7V@Hy1&31U}h z+Sma0kHBUOESqS)0`~X7wxU@bVe7zt3~b!U-jQ*y0lNh3Hh<}#WXn&etss2DZsqEIH5$urC2Ch?2ybMhq9p*_MHCd`i4D!9a)P)z%J|AD247BU@BmHPWFVbDPUiPl@ECor(};JUxiOapV#e$t`hA@lz#!` z547q&zX8Xbb4J_k8VqbR?Rgrb5@){{FB~Ez==hEOOZE|`~osyU4+tHUupHG3u0N)K} zFR+dSMo)qB^MA~Wb73o?rREy@6ZKGN9R=HAl>aH(R7A21q=P5Gehlo$%DPDdL%@C& zSeBl>r?~JK*k1rUR!9z`)}(i-Pky1m`J-35`0WO*I2*V?Ht+~2f9Z&$T{iJbKqYzO z0MMgP`;TT-bk))ijGkrZ=U^Lj*^b<(4Cit{b;K2Ad-wz2OU0b*uCrZJtnZ=PeW=}m zIQBMz-6u&r1olsun)fv7T0^(|Y2cIa<)BH`xzKho$Nv(^u@|-IWi1886`2@+Xn$}!Jrg_x~$)yWr^qv}jj4N8w zX+PzEkyfmH!=AUH*Wm;=BT6-C67?@R>uw~c69*bCsXp;YtgKkB11c{ zQebC{tbpvh4cH}M{O;Q}$+{KT{{wa^fK|{G+5+s~fHjAUH=`1i9K8qhf6AyAz9sa5 zF#fb2=Q9^I<0IK?(rNRjt-nn5#vIZtY0xWgDy=t~Q1Dd{IHwR_N6wNdHv;`lkhp1O z?GzdsfPD+t<7iex*d1U$0QQc*aYG@EKUc)N|2>4iF@MQqK%(i022cmQ33V?su`_&w zoU0aSF#5j{B<2Pb5n2QEChA_~kGR^WNHNtwBY~dS*#io0Rlt4$ScR8OlVRKj_IY4; zeXNM;-2(RKz(!@_d{hDjp_@PzK%Y6p%!pWW?nSLXu@jG(>`g4jcH)I4A_;TRA9 z7zT|y_tSb&gw1k0p+0he{b3MceA-A2|#+7}{xm zWi01d2C)AEmKecSNZskcZiP|Xd>?yC>bnRm5X0S2u@y3wG++%Ls&`w(-ji5Tfw^!~ z?!d)jDMq9Ki@`SeSfto%yh92}20DUW!21C#g`6)5*x{!Oz(Dqd7Rwia{SG)h;%gL& z>F0q(0ZR`SIC2h1FCy=bpI94llSa&61K<**S84eJgGy;}WM#ln&@!z8;!)DZsAM6E zRZ>rJz$|dzq!96v-+doP&jPIjjS{zP)Yl}f3cRl0A*G!`Sp}%X2N55!Kw>c0TBXy` zkL6dROGwbCQ9!Sm3anC8rkT$~pEzF08&r4AafSi%-BYOXuON2H$!4fk46xq?*6qiB zoG(S9tjzfK*wkZjp@y+*GvLzI@I3f-3NbL^&s)1Fdd6fd2MV>S*%P zp}N7=Es2&4zegbnvQfvs9AUAFD!&HRoj0;&3i@w=?edQJD?s6Fh(^8#>?N=Xes&m{ z$1bqfzz)1(T;Kr(_#L3pm@;pLD&ERRCCj$Us`==%)@`D+jdFVNl2doKF07X354@(e2fCl-ZWA*w&Sp_*{DgdORN-B%6So=%Dl)2Q-&M95P%$vH=b z;RDHJ3i#h(c)MnnM|zqBMnQw$sMWLYacCS6*)-pc^5^FXaBNhJ{*I+EBpws65hSjv&+*s2gva800*=gLp6&*JF;N&4j|e!75Hr~xe{oBA zB)%iy4HGBBF7bC%g#q!9fYm_Jb)LThCiII3l%Lm2%8WhX>HIY{p-&7U=tGFCRQ}NK zMNpzOkH4WNJQRZoZZe3^`Kx6d=oNhgtf*y6&STG7&}v92f9p(mAbJVjXR5mBeQ&E@ zhT^U_TOD2!^p3w}CiI9NDlL#p@B1ZaPP`NR-BqDmbQ9RBQl{B&ho`y5o@WZa zhsW2NqKgXqLS^?Np7Kvnywf%D_w0oGVi3V`VX95d6zkJJvNnX>mp}D1nlt!YheD_5 zq~e(%Rk5;z)kmdU&$(*C&)H9ci%GT}qJxSnw32+edXB&4C$x)!gyd;iBT2GN44~{Y zr!+32+`mtgK_hMz?F3e3bNp?LEup z`TK#wJyE182~3jW|ICv?GU5-Q6Eqd79Q6K=WAn1#E!CVm-k!~0>l66vo>X?|Z~xW9 z=yAV`-Y!dW*tq&6>Xk7++P_Nmm=)X3%5tNdtev)f&5CtYb61&SQ%Go4{1!Y1E;}T@J0s;^`{3(Q@hKrKT4}F(#GK~f-$&pJQgML5 zt8%eX$xk=uYf-V2fCnP`DbH1k9h7^crH{Pu#i!U#*=JgO5=N*H+bDbANnefOOHGk~ zaD+c?A4Fe(;j2uMAJ)nrwC8W=lFUoRTFO55(syV0+ET2cY^;kuO~aRzVi{%QjPw;5 zzLFIAsSEtkF9UsSMih!g{)!~$lJ6ptn-_`KC_ABLm-su!LZMhf*<+VUjq*z2n=UvM4ns`O8ZA|kvI>tE~$)9ZFOGz=0 z3Nxee{VE|>%%$uL7e0_BP+*ykQWjBivfJWD1LBnoUa|lpQYlCXvuX=w~v2Rf-fD#FB4QNkt9Sv59QyG;44S* zO9V{^%Sxl}gv843hVf5L@WrF}MS>>{;x*|53M$Fs=LvWfA?;VTDPOzkGYmqK_&EaC zjP$KPzGf6ZOWC(}ao9-TbrQ~tpCRDAN}P4@4?gj&OVOWzv=GU~plsK(NDiG7O$41| zk}NSVfPSg{$6fRjXv>NF9F~V6< zM^L9szH40dFL(7uWvlqdm-vEF)KWoxG<^_`uNFlOWnUZVdvSb?D5@!&$)A5B|2ieA zD7(p@Z6%Y75tWp!vncL5mc?F6tMa^Z&&Rj5}Q?zNb$!^MnEl-O!#%!`B&`tl8{LW%JEYy1YFYn;lto5)v(Av4ZxR%OhP4< zD#Z)`8q0iWx$TXjL!>XG2=ACkMFU}qroaPPrLG}*Kl+KA4lWQ58Ka^)W-UOl(=vSe)!pF>ok|VJ-NcGr0ti0f#;E8pf1a-KU zfbW#D4}4#Su!~TwdolyBDTWQE`?R7(YbPrM5W`9csmwnPS^|E^VQd$OE0MjK(Q$4?p)p6h6gSf>g9CHoTsf1Q8N ztjN7aR=>*rn2;@rbU+&CA0LoJ0d|G`5rNkNW$~^j`bkBvVUlcWnf)QbQz6n?*M^}j zWQj;Fv7ZpQ6V1lR3KkjdwXtV@Y=Oq|g8hiH?Gnjz-D$}hF}A?|fS~R`$urlr@GbuO zy)e&yNKmiHhG|4|?Dr`5@WZRCSyF-s?MKi;Gm*6y|>b>Tz zs@a)km{lhGe~20|q)~vHX1_zlH~kd(vRKDGLz8_$T4C&^XfVZogNlj+ST_k_l6{Y| z{LPg;#?eKkHqx)sVO~Zz^ z%avuRw5R*$DjtxVjl1t}CjI$>C+zTjqY!<^a=EQHH-Y&h;|*VMx6EiFqQlM|stIU(xH=V{VFQ z(@Y0c1ibcEsxy?aim9L-X(ml7{Y*y^NccC@_TdE8}|Fb+cI9K zkNHuZ9<97BJVo8FxhFfTI3X20WC|*%a0g!wY?jo9FKZ{k3*79x*=g@pB^XvJZ5TRLZxp zn9$5lD6>sXgeG=OnN_~0z=THjo-#MQlxbjxlsOefnLF%&GDZCQiwX7Y4P}n_jujK? z7;OfyeGg@7*$!oDY4t4Bux-jb3a3mp+oDVlf6#;pRg5+USPS0@j8b`Q{H3uCYPNoC~2$3427DNq)DJ3B|0RGUrK!LJ{ku%o2Yl zi3x@5A!QPxC{w_CC=-YAmCD-ty~cCgieq%Ful)Cgd>MpkSN)=}IPK zvqs81;8(&-$YS-BxeI}0GTMOPm*P}%l~qyZ5R6`7rIdMvAzWtHD06^*F0m5IoHy}5 zLIx|Q%zM6h$AolNNSPhO7t zqO0@lB4y%&wcXZB-pj@=dx;op9(6u(omPyxvO@Xyub7a?(x}n}Nl2BcN51c0;Oz`L zukTR&q&H$k_ayMW{<8I)-%iMR-x*Jvf4=vwrrpu+cSoA&8M_+;=UJH>=^Xhkj-f)q)Q?E z*g+=5vt%kB43@Nc+b#F_c|SrNOCspR!p=qT>{)h!viT0_Df6uS=ccI@KdPOu%QA5w zIEx=TB*d}=0&ZFOAK^5Mqs$^K`xJ|z%o;K=?7t{;0lxMB{+)j3L0kX*cl5gq+WxOU zr{51{{EzUTKc(N}O8WgDe@4HTjFQu~ji^C>>XPt({}eSPl3%&3m{fA$-~WVw=i!pe zk`l!`s`77tOh}oFb@5|zgn#`b%DoI=_56$^;a~oca-*TFgrCkM{PRyJ*UhBW(oIW} zv4fwJBmC2k30w1*TzBS#uJiM8gn#@IAr%(MBYT>7*29s1_ya-`Mb^Sk!4dxchm?C` zQuXMc$a35r-XeQ~KF@tld(4j=68`S@sr1AwOJ%K5Tdu*#ZGKXe@VCE5Xls~XabUAN zPI@!6EcB}Gp{dZ;@9uPTsy1~A{OB;@Z+?erP4V~U`4*7y*Z-SxgJIHJx>#?S?F?Df zU;Tiv36m_}xE{Rhy=j@|2TKWm`M(HV^YK5z|M@NYeMX~7^dC`OF;@lcC?07R{cBX+ z#K&L!CY8R9Qm*Ubf~sZBfd`=-fsYiK{HP`2&wqo;o@v~doR1^!M088v1b@9lmKId+ zmu*OMJy*6lceRW9defjO(bz3JuN`J--T~9q@T+01@*A?1h!pFE$Sq>>r{5z&B}&zi z>W%*+$92C{TdZa%@OsGmFkbp+zfPqaqHH|sx+ybsKbTHn68`kp2px2?H>Bi0p{+cY z;q}{BPWkmjo%u|eXVX}yX!JWW9Gi~)j&L}W@W=myYTYu*ibE$$@JGKw z=xLd3M0-X%V!i54RB`kVzf0($M)JU26nQ|%Pd*{!j*?B28T|M=XcfY8_~AstkG@U0 z?Lg(Ox`53ay9|3FtKt)73Mu#xzC~rXT<%om2kRwCnx;=xBuVwF3vUe{^*&ZTlRvl3 zy3U&S4Kwz~VqWl?rro{k$+G4+JE9KE+oo7nXMU&LA}{>mH;K}@NW*{hnJ+{vg|)MN zTd{Rab|&(jr_p!cROyi>hwx|Qneh7`Q_XuGeWtrz{m{N@9`TLo>TC}^Ysy*Gyt%`C zBhTgQu;T!5zWd$63Fj5d&f+tTgAW4nP(%hD=1?CHKLIirdv_2c?M;f`dr(DWr{O|t))oWB)>Vxx)3)VPg zvFp0G*7-Q7*OVIlP+8(R71C~P^3N0FLsGo8wyf}56xDv~=c(1E+>qse-hE=dY-+YA zc_!I4(?C?G`KA3>*&wM5$qw1!$5#oz`Eyja)}!9mwCYPu$C?<~ZOvj(n(mW1H81{+ zuTpWoR`=T08hJbHZty?ni2J(Rwq9qEbXM`eJ}(_1Nq_GvR4pycZ{D-)d=NPsa-z($ zKML-!o^_N4*Qw9gpHTex^`E6$Wv0Mu#ud|jw(n?HG`q9??>UbhH{`?mR{r_qq^QZr z+xCd_s!d0d`MRnnBr{;cT;t=Hl1%tD++99v`BI|vfvi#NjCvt`Vr%h^>ZjR~XTkNx z)2V9+9ur?k*8INo-qGxO=hv)@3EYfc4IS5&y5EFc^Y!afqI0zMp<9|Ok&ksl=J%ct z@`;F5+hy^+vrFHkPLfSqo_ebzFS0Y_48Qs%;&)s3wHuM6;VU8c>^H=x_WxWAsZ@;E z4^?M_y8O!Jo3^*^*V@*A8xe=*TamXVSE6II<(7=71=~*evMR-I&Au7-S2M~~Z+hTG z`J$mX>a72~sW7~pT@No~1p#y3_K16$tF|%KyydlhEHpoSSbNo48Zk=__dmZ#{ZG2S zf5)2TOK_|NwR`3yXMBc6-nrz8FB-wCY(47q!wzo-MT8_ix z4FzF^`ibBk%YN8dG1YNwPYrq+>^v|eM4XDqHJt<=@be^h^l{<+uCv-YU1z|6v)b>1 zIYpXn%u;uRwTg#qQ8S}%(oNg9yhHlI&=<~H^RT1P+!A!fn`l1et&~>UGDEr~xuNTZ zN_{`AGXBRGh~Wjbtc&fqpN1{?HG4SvE1xIyj)UcsNq_fql*`u`|D?@x5SFej3Tt(g zhF%HnF;Syk z`kkticRH{6UAOo7kA$?7r+t&p4Sc198RBCv{jS3AZ+Pf;GpELckKFWo3cr7uFSPmg zNEqQ?chK*3t^7gg75PP7m%Linqu}^2@%f%V(jQHAevz;B_;LV~_}A?8J4-_NFYr|x zzugf|zkl9Jzq?K1c?%ueaS%JD<(~f&Qo9W)JQn?MLl6@{4W!} zz?*U*8KiSzSrIGI{J=mae4dMsuT)%go-7kSr={E#i1BCmU%n>cf?~pF)%5$WPO_() zFwzO1!e>;3wCQBe?8n;HhBo&_Z=$rm6%02OxX)uJ&Qxw9b)T||x{}IBt-1$W3Rm4QCI!b+g)=Aw> z6F)PM385mD9EEA`I4dKIWCQjA`C;fI>5TiLY*gD6Ls#-F4bZGs#h36dSFbbTw?0QNCF!uKRkazClX) zMXC5WxSIOYODJD&5p#?!bj7U`DL>;cPKl3cfvC)etdE zQq(9s9C_~0Oa!dk$BeW3RDGv=JG5R*2wDx|=iQ2eT23_%9P)Hkd+0UgyU0E*Kh#$g zR5HSI!ldQlRqE@qG2%}tC2WOXRq;DQ68gQ%pTsB0$wkVQn54Vm_hreEbaJL3V}w0b z$S>OleFNd|L(hluvz0}@M?iSCM44t8H@z`-Y8JygG*@)|cz13tj0rI@e4`@d>}Otm znHwViTT~uR!V!+!`K%a zP!(yBmoanqHKc9$IIze45Xfdf8DcMSK@d%58Vbk@~z7+DiG#~v!Suvt|h zFZm|%^a8w8du~I>>CPC?8Vr1nZK8C37AVo2Fm{4wnW5EA`5Da~c-oS!VgG4R%mAH> zp6y?v^0%%P@L1{^0FO0}Zfp`hw`D<1tCnU+YR^BxOI$pMbPN3kKcUvIgVVv|2U!kw zuNql8(gp^N%W5F~3u>-i9=OhbliED>HvT-NtIqz9DXsM0KzhNu0nTbYeHhuRz(h!C z$j}NSOT_kGoje(uOq5K3%8s-7i$rDAzKGhVjSs z`Z6?{(Orgt4oecT)3?v2Kqbd@7m8{!^1J<{RvUFxt4X4{QrO1c=`-bZ7~q=t8cG`x z`!UE_{!#*$V=+cLZzxC8bDCEgB2gy$Yf2*fp_x~~cmhe7`V4`6mfk2zm(4fBD1B|} zfR&UQj%j`sHbH*PUIfZ>hBL6hN<}_J4t`UC{;on!1CABg`nc*H_H>JscfLgwulTZP zX&?-uv{#h}#%n}=&OLAY7`{0hP=dg)W9)+`Kh>6^cC~7VW>TT<8}xVMmxS;?@c)&RQkX}r5pMw2)jam0a{DcjY1aJHQC_mNHGH|X_nmmh+3V2O=sE4A&uLX z0*pS{@Pd}b!p$#W1ok^WLusA$3S{-j{052|F{X)x|ML&&uctngl6uoF3ZEFOA+i<2 z9So&WRSGlhkjFtO@1%1Oz!d)WewW&ohfI8j(%RrAm|$Vh2t?c9I1Mq~33y4XIH6Wg zwUQLcsQtm02ZwxR8Ai|T#smyKPPYVMu4p&V^NRdATryjp3l7f7a7QTY2c(B1*v6TV z7vG@{?t*Ym@B%b=!&eK*&%5(}i8>y1y#re_jycGu!kz&6T(_=(kxSMEh+@L@+)4H4 z{a(Q1)-?y;p!~Kc5!#+JK8J|j7^WbiQB^A<(y(j~{kH^9pubgDA+(ZWCGMzO;}mc=A=x80hXB#t<)d0xQwqJL5|T=&>;tw$h>BfI}YXy3v1|Dh`6( zl4pZnMo5O5_#KiaFiL;%26RQw)dqoxnO@Bw={5PFlu%%|p9-o*6ArVpM zz4kwe#OJHvHx>9h2dVD6pP=`C)qWUNx$55l={1;2ze)Ky@AI!wx)O8|HaQH7U9`o4 zgD(9I1k`Np0_?m-vjtO$2`qyVk=UkQ$vjUBJCdt+fdO5-F>M3h2|Pm^g(`z1wfm* z4XWNSG=cq6-3d(Qy(=9w`-A3C?~b_&!rd{Qg(`o(hqeTS1=!DZStio6GX9|o{%=jB z;pDN0ko2Uj`g4R{gq#z#1(4$_Wh@ANbq%I^H+T_geef_Ql?in_Otep)2U#`q)6a?M z*YClyu7$M0-{ykrXd6QqM^Edv7x1Hp);nPKz{GC{^F~vKN)@FA(i>l=G}FD0@X#8x zjcMo5S&f*NqCX8G#OV4FyZI;AxhlIL;$gHbb5CQc$#o?mJr0@yrCUMsu-ztS7HqG= zv<$1Q^4mqvZPF{Sni0ts=(M`4(LT*J5ltK=SOy{HI`bGjtjD;H;V;Px;nCf)_wb|x z>BhIH{vF>o=(M>HFoKw%I!tek$|rIveWuORn)@XQe-QT?p3CPPnVyD6k~lWu#dCG zSfmdP)t^wW3m8L}e*yG=2F(8@4YCC`%6BbcZhN+QnA-#EJ5(uyrFOAwc5?J$X_ zvWGGfPPe!Z;XE~#!0+SK)!-%*hB5A}MQkYyd=BMzTgoxG8~)QU$U{jF9I7;=`McEn zdkFAs$XSHees=|Uxav+oH0TX_g)z*ib})gBI>sQ0HCrCWbXvZLzT=_XB+o-Q=i<*1 zpZA;(p^OgGIFylMs)f^~=?@SXYP3zXvnpJ~f~m{?4i3?7E`VWIDNiu!9T|OpKoHW= zLz<@^e3Ux+!>Mg2jA=L^?z5Dug1p8w&k*shDBg&~M>+d_B5(k4j9R*p-nGm?S?>+0 z@QFCX62FKSgd8I^d9Nry=UuYfnBCVABDY-+;kzHqqwtG8-6W#MG0b3_o&OkZJ)>Z1 zIbaqMq1>+qX@*}a($juJ@bqE%E7b4yzQ>T}9P_Z@qriCB`jIsIn?!HQdxTl66rRwg zn2aDkH=)#Cf4Yblo_?{qpCcAd+vXvx4~APF$}j3G;D&k95(J%9u@dau^1p!cKK&qU zZAbD1;yd>Z>f{ux_KL9zWs8!V;3L_)2W!7$PlRO^*m@DVnqWIkrbF0FgT4s1e@8qE zyX+3S2D`kix}_kFE=v9%C0~kzO*eybwzm+roZ`-cXG}P2VTY$oPocgY-6Vp4ldc*5 zdQp=De>&lhw-T}Ek{l>t+Pelijqb+?t@ki5FPK-M#s&EyID01YR}r`nmmuXk!IR&H zqfwJ?oqjtrQ_L|`V` ztytqwKT$f&d*r5#KAL<*;QvVKflmlD}nu>^C#KD;c$(h6gGrLTtxr0X})W&%#Wrl|n? zXB3ydOKp=wX1_t{k_Qr1jzN&~zEg0CCf7amKWH03Pgliuq#5ElnA5|c=TOgWXI>~# zxn&wcFRPkfm|3T48fMlc;a~sYBL5!!>4VgZeRt5sQ`a;|)H^rO)mz&lys*!jj%asY zTZ9SnJ9L9mh=CqwtPAkaROM6uNDcNOW&m8sHil6cZ#Ku_F#s5E6e z19pn6Wzg!3J_!@Zp=<^wwZM)s+qy#sT5?u$e8ybxH5N#&AZ88Tnh&V#9% zkZ$yx=Uc`+If}(jQNSX+y~ce5tuq6!0>8iy?w}#0`QQI^%MJpolILK0NRYjfQR$GF zB&GC_@A?uawct6!`wZfH;Ti+2l7Jdm+?KVB-=7eK4hZM2{~qjZ#*_?UE*fhw#zNh7 zk!YS~RdfeW$V2p*3+#uUvo*KnRJtzG$9cFdf0J?#y-(=Ah!6{L&nmCOJ!AMoX;k`^ z9%y$|{Ud5o`W?bjgKMDL631hxcEg;E@vfQ*pvpwQRJw`5pVFc>)1aHCN&}m7Z2XX;VYmN^S{KBlJ!MED{H z>xoubGhF1l^sk6!1gyeYj!A10##rmjLVDtO{w1nX98e4Yc+47LI#+#5=;uv9zJbac z6gg0TjJN@X@4EP1a*i+P-{JaUUpo2`Xzr@I5xPiF7R#xhA`CrF zOhel@h>GXUV;De|q5}e0lCHp(v)S8^sLcQ@V#041UVNk}N81`$z`FMwczYgr9fNPQ zwP7uKSJ_K9yoC{X!#FJMtsx#3cvhE-an>s?!sinVbI6Y=HZkrB**0j#ItD;<#+HJf zA86K;L^A{GK5(?d7j8L55GFgUmEe9(ngKO+`x+qWddm{jyQ@!tkG#_^;yyqwEV)`- zfQ|myMTol7^%z9frMs}1*uZtL@WxgPQEm8N2C=95Ef;C*M7M_YKv#%Rb5?!_wvr{e z2OFOXios%F1JsTKGNHgyOmA1Tc%?-+3*GkwAHq#LgA<|9Icq7b_&(bOgMXU^skcDt zo8Dqf731#PkU^ni4N>!zwnIy7J(HbB?QPWh;Le4_PC4f=m>t^+B=*R<2OFtV=YsiD z@;>N2nVlf24g`LHEw$*c!Q!@+d(iEeau_ysQArPh2x;G-E+2Rvz#H03x8OB(#v1IK zS75AJ+G?maN!E!4;Rb~NMC9Ll6NE3(pH;LPH12?Omhuwx@I*QcUo7+N{UY^J=Q<9d zKDS{|DaIYhXp?`Qk4k@>gHfk_L{;8F@JFz?hq@_rUm!aT^~6cCQF=Lwnhls+Fs>%$ z6-al?+XT6-xaU4g<;m6@$RSZ*2WmyS5AcX%zbUMe_na+|=Ur+WF$L$XXc@vW$=&~@CJ7NTHC3kwgd9h z=;My;0eIeUw;*z?1RkQVE0()3%DX21&^WJOr-*^2@5y#x54U6spkL&gg@n4TdvNna zb1}w{W+*{_J=$3-wVzd2g6BJ`dC(hI6hL3e?#t+RDsUE-)UUh`?Osx3gU=RuB1W}{ zIkqk+9a`(Qx1yI4LknyoTYunBTEjijd#EyIzl(jr0aUCp#KW|DgO^~w&!O}r>mv-Z z+cXF=CHgZE=$>L8f`24VV{rGa%}`vUu?B-0(9#ro`(fOmXzK? z5~MT!38=ND9)n#i%I<;M zmN?3&)$j2=crKO^kev6N#UNigGT~OU2L6R&{%;k|lp~Iz$q)I{@4QJB{4D$Zh~%xWQl`Lh4O+cn z97d?f@mq(fzEB^+$(z)dVSwU&8nI6UKq_RGOT-=NYNPb((ZnV@R)b;%iz zblq_bIri(GfNH6G@-tNbq2)eSr?ZguS#tv(L3!+9<&UB-!t?ph>P12 zdh|o+{g^W4-g#7h>u!WaHLLnzlvhOlNDKcr0n%mqV~jd3qz3s^{V}9*rm8yrvOHi5iml}vk8MfD%>+X zhLh!MhG5=v0gD((vta{4WJz%XF;9rKAQ{i{px)EYdyq_pIUZ?}`LT=WZRn2tDa}=# zMnKq?o&PT7FNE|!2(R3);VC1I2bk`c%uf;jX0&mjyXI(zJDyltVbU@FZ@_1|@j6y8 z{FDh!tyNu54~+@SFwEP&L!d9!r7+k@$vCu7FPTEXI1n3P=(q4U3+_DWO@O-{1kFQ( z)j^M-`5S>5kWxZGH#|01Jq1h2QM^N7>ygHz&jjBlr25M93Sng5_8xNRG~b3{zx404 z6Q>KB3vkf|YYE1&U^opPdnBol=RfgJ$8t-FhmaCN_ThO6jtopRX&`yU{1&3f^zQ&G z>56PD$DT_MzC&Gf1iyucb-Pm_!d=G*hW%FjGLgOjaLbW|$W(01hkla`3-q)ce<_bh z{6!hoYP*;h79h+8b?nDf;Vd{B30%N15^Nu!o?Pn@c5(u^w{{baz$S3_%sRTQG;(gdkanKHI+)422n4gTm)J(Q2OCRZo8W5;9(dwjLYZ4b z9Vhux;m9$r_7EZ&XL^M|^iEfb0p#kgz?RBYeHh3s$trxUA!HJc&}4WE7CvZj>@WY8 z9#Q!qmZSGXZxim*l*4JKB}EYEfB%@&Tm^B?xGSLEWak+e--)dc#ua1j#1lbh5XD>l zHZbGDGHiwLwrL2g!|@XJuUISKcYW$B@a_@meW>TQ^f|^^<|{>i)9!~b>J{@{j3-~R z0HR0U)Nc^yJ)Tl--u2obbsvVhK)W8ID)Ys+vXvJ+j^YSCGeLX_`iAt zlN7}gG?FiWhBQ+i4_Q}1JZZt>kokhI8QNZTk6{n-0faW~dIpS2 z=c#~sEI6xwmhk+*O$_uT;3e9{n`6*LnW7YfIWO-A3*D++Xt&mtfjc54n9jDb)Z2xp zzh?BZu}}|YGM&R9yAZGerJXlEfUGn9+N9KNx;TMGGwdhSh#uq>#y+N!Chu$5W_Xrs9u79xt-D{nv8E!`pnyi@;jDftgrXXsTj|mV-p(L@*9R2vRv0-7Y(*N#HJ}- z-gl|}m5>gMqR2b@5n0Gna9QErLhX09S%_@`hTUs@fIg1RHL%rH{W& z`oQUpkc$}EzT+5S{m{OQ5w806;t8GvSX`O%SExx00@f*C4{T`4^8hL;4NAk!pYssq zl4%Ss!Vg1(NMiK+*b=RQ8>9!9enfodde+cwr?U!ahVvD=U$tL`Yc5*LBdFdB|8n$s z(N}|Z1)dc+O21zwK|t`6pLbv7x_fruyc55Qxt zz6T;6RQwYSk6sB8M!!wMUBflQK4|aQyWo^H<_*a6zV2hHT?NO<3#<<$MjvZ8?Ue3o z(h%)C)a3|cxzbmN%RT-@VC;7_fN z73P%heS=Y-4a|USCv!mUn;vtX_zFa?2q$+8GH=ri8JxG(6tpp!=u zVtJg6e?sX_a0h(45gN&H)6a+QEL=H`bn2TmWsLfjk^R2PqjBKG8-NhZR&N}cY<-8@$~)@oj~~*|7_sNVDaBmg=or5}za4|Rr@V^kW88ZI!E+RXT97@0psFR^ zh?|q1QK)m#^#s&2UAK@XyB6TJ?STsr;ZDGPm{pTy8eV%te*wJjsp~P~LuCrm7s^ZY z78F1Fm3SK9Um&HlmQ7$RyTKK3zO0~DOg=-l2bis2Vf+PR0n#(#ER?qkhrJhk7vs%$ zCIEehmhWxJaJw^xQ&83izbO;-Tc@P{RwdP-lq5cbIi#@zID3}=NeGn}nBF4IHT4El zzSX$uq;$>iIcBF!MLYW1hf7U31~8{=pvU`$7{u*XeFcnaPFIFDrxk68dk^L7(D^la z8YJE#JMam`c-R^vaEp4<+~du0Y)P1Ndw8ywN$o0+>ptHrq`3 zo2oWM@*C2>r$(Egv?^~wk7@EAjtTs%6Dn(fyDqsK;Ck20v*6;`a0Ubtr1dC&;a-9S z`i%|HXNm@V1hjmCy34meg|wG#ZJ=_~+yw1k(I=wzj(Qqnx}@^*U2fDLu0l4X) zoX-6b4&lfzR8OFaY1wN;fg7?`2~{5Er@K+D0Yv2m*AOC5oud-IP-7kXh(>w^yru+g z!zNAz=0ay}+7zTs+N!S;tvvTQTDLgf!4DhtyBOOkeL7Uq<@}y1NC};&;wK<27 zRyvbFyG4Bt_Vh@a0vGI;EJOMO)=4}sFa+n=)L(?g#&o6VWhnSHINkEiLMr*L^RW35 zXGJ*mR_Q;4`kT7BAj-GuULxkrE9ks5;R6~U_|Aaw52*4;*8@Wz^P9k3iUB-0`v@+x zYq$nSPw^YYeYOfa5gpbH!$f1?&vBm7&k}mUdK*(juK5-Gxk@{ZuAeBDAk_Mxi%@Wx z@iwSD*Nj7fxw0NPwcinwF{G2A91Lm7`2;cTcHmX;GGjP`7j4LI!l?5d*$~mVz6nEK z(VauT=d|;<$XbTmURK_Lm=~m(-=tn9ymw&+g$90*6wkku%pqhidrB}JPPiAKCVqGu z%(T*W6V%Q^a;?5i#I6gr*XZ+Dw}UaRDPm!?@zOY$dc1D|vZ?aK;L`0bXg#vsg=5W| zKR{C5=4AwpVdXpUu@)a&ga|%k|YR-qGS~bA|N0^0YwxQP*IU2qGCpZU;-2rZ@phx?9t6!{@|^(*7H8$ z_xzsceb=gja=Q3E5!o4sDSW%9Y@lq@tQx@Ytl~NIYR$GWzLv*f{iG(B4!c!7{wHGo zcIOhdOw$fG@v_JK(SH)>n|+43p5T0r@wL-E?2Ib;1lM6!@;*}3qKdO3)T%P$!AlzxTgXiEQEKOa`J0a|d-4zP!mh~m9OWFrC4d7v2kK&#`|38R{%spyqYI{SbKA zCxP+2&nv58{6; zhIp?cGFaf01=b~wg;+RadBRGpc(1{zTYd-|=S-R@(|pecFxn%_WK5Ga>V@t09APC8zK5gm>x{z87Qz41FzjAMy)31hnT0q{+<+|L+qd4sHESzPA{QZuM0 znK#hz$7MP1SU{sb?soz#p1agwqt>w%-&!4((A8%7hyY6zt?UF|!@eiRZ( z0Z1CmQlUy(z(MkS$9D{RKK9;&e2;pbybn0%QKAE6Kg028fY6%gu!v(@y|%-KIm>fo zt;6Cm#lPS5A{(;(w1hNu2N1M6b^=(M`6%1FakE%*8~P$rMDvtDy4*X#?Ul=kKNhC$ zIaR>rn>O2cs~{VknoTGkTfIOag~ub=OwV#3p!~Kv_tTbcs=9%DpJfry)tHxIyT|MT zpZ+ZSsW6?$bGp+Yv)gPGBqqFPX#`!KiQJ;sfp4+X0T6gln#$NQ1|5c2DSg z=WMzGFw1;`qIv3dkT<-?(Q?luna+~z^%Mj%T}J?^%7 z_O$@!{}R7;1LUGdF%+zGy+I`mILu>zM)`!^(GO=a%qgeM8IQE(YEDFm&HUXP&mef3e$EVJpR%JZ#_A5AfO zIYRtL{0|d8?NIr$1drcoon6}QcVj~7k+QHU?$E;ZqxLUx?U-dO98HjKhi)mda_a4Gia~mpdlh9_X6;e<6PKCsr6L226DgRfL&{54XV7%tl2#Isu`nf4?C&J_Q zqqtgSbrx8+n{O1RGU3J!k5g1ppW7=K6sMZP*|##N5+4olzE9CxLWCSI_Esb3g_cL6xZh+s~8_Rmh)J5 zKk4kTyw6Hq>V2AjLUV!8k}c9 z3cl%)hum4W^W?9?`I?tN^);W6Uu15%=>q)i@PC5MY4r^G7;s7AGcY9-T#_P}U5=t6OtNg~Z*&TE2%ymGq)qZ)0DZ}b~2ZWh0~ z`6&8jGS}cyh2RCZBKlUcI`7YfhvUwzIB?AQI=v{vqLUi9pxjI5xBFbD+Dfep8I!Ch z$mV62Js*krSpjeVN{ny3@1g&>TMk+8QXlgb=Zo#O0$PXdac*PsZHwH*`R%H$WbCw6 z1*}OkeMn&WCMO7_%H}Enlvq6=qeaR>l5p6y6}|iHUYiL$*Gw-*iLuW2HQ;X5+@Qi= zQ+;1g;N-D@d(fxBD~EBrR{?1n^=#*j;u0W9SGTg(W?N1|o*A<;TuU+iQds!oyAXBC zZz~mj!M6lp3qAHRJ5^l|y0AFsKogk9(fFpG0-JT7U$sV^%Z$AoaaMbkGw${( z;l^Y32O^Lj$0XkRP4E{-`S!zTXtFDe6vyW^^(20;PZLFRz9Rp?TAIP=pvOtbaoMfrheCSXu@Fzn9bZx83)Z9f zS><(z>-QZ;@ad>sCFB{iO@uUws(47#Y1QI{PZq}AuJNahCN}ETN^`jFv<%gb+ny&= z&wX>rL7Zy=p?#;_MXMKYnJ#pDQu{y#*a-*XqI9;p6S9BlhY9Hay!<9@Ht8K5gw z?cjmXB(onH|G&PFDl_?!n3D8UanR*|kiPT)@8j+F(h#Q1w=(6hNe*rg`QBi`OLaa5 zFUpGK%w zwfRiYL>{R7u@&cB0+O#4gEXs7=U(ozs>sEdjPLtecM(pUvlt?KnY5*o-d*Hm*e#1J z&cnBP>m_6#Sd`Nu_W@Cs>I_`oW%U~Y$`r1&_+0tE2rJd`EyV7WeJ(COAz9UKi};u8 z+~Y5VPTHq3?z7)04!?H~PsBebUpM^|5oSD2wRvYl|5C>;plXnpLcDFJ`N-bkS`YEms^5LFZh%dj$8ux{&dlbqB?A+bSRC95RmsuCubE zFm6z@L_)?q_Hs8+NrS3&Nde-$&coj$oeuFlI!uSF7xdy>so!-xI^x-j2PYjXk*#;g z3J}*H+P{DjTWz;niQ_o4x5Sl8i%aoufdJ1PkF%oewjSnuoqq<1C-}tC0{6H+2Hc&_ zW9*=-q0s~1lTc$+J&djG4*Nb5Hu3`YM2Ruh_a45rc|HQAmu};%2idG@N0hBBqZtb0 zmuVS)Dyf1*lNLP4_a6cAr=BCUzN7BlAbZ%Zln+4kH%;RB zqFoaA`1O3Obbz3bxQnk`F#a_K)qGoVlRn>ObCep{t9k&b9$P)eYMlHGWWDaa57-kt z$AEp-?G6-Ju(?1l-fufY8+&0pMH_mAmM2!?|8K85Py4>>l}X+YxW=c@ zYYNLnms20J`V~z|m?SfPtC10;X_IZRJ;m>#zc{{VpNwtru$cO(IQQB=m4z$StK-kb z@x04PxX|L5NPuUpa?pKLVf^mY5T zg3WcWd^Q;g>TN`N%lQs9-D{pH7jjD`S@_fA{~DMVZHHj&3DDbPorUgLQg%jm6t?I3 z-=*H_d=7(0hwC&Az13+al{H~MkIy}La>#cYOeZy`8Lw$Nn03|lAg%O>#W_3}_rC$w zjh+V>lRXczEvkk-g{oz$cTs&Cdd%DOFuT*@Jd{qdxWId6E$F)L-%9?jc^{=yReJP8 zu6u4%R9>HR84-=hZYcx`i>6(FDaJkC@u1e}HAi+%c*Wt%1CNtG6xUxlz66(6>+3Ac zGxFm<5$8)Z`Ly*6w+Y@x7zFDymqK`Q)#)vDe8*uKpC4H~VfG98xKeO(3f7F9JOI6& z#(&E!bXHl8nTYYT8vszP>gSEhEZWd(vnSN!fax8CHVl6xWa|Rj$RC@)nUfE&rC*Gz@hT_(owMKf}+8v-A;InCO0 zSbiD5M@=p;4x5xQo-*0R{-Ofj?NH~#??)~VK>mXBe!|(IN@8PK51u=%KNmnO8-%$9 zzneJS?z@eo9d~;GxRq{`z?$oF1gG~oHB#;m{lu&U`*~n%w(JFw|5^@5cllf)v$@`# zL|*Ih6dpZR@A!e3cEE8j{o$0Vg%;UonawtQQTYnCKGW=iNoTx!eT963U6ZRAw_7Ds zM-}E}F~ao*y6^+{6nN6_IOs2=I_;lPt1ql~qOC`h3tx6?mdN#9hx=%2wCaL~&rSPy zOQRTHb3IDIFhiaGeWC54LkoWaaMO5TyxAlt;UY0rkhQ?;9F6ZdX*y)H0LA0whoHhv zzgz<8_MTuzv|pLV68lzu2r}N1*Mi%B?g#uv-vuH{@u(mPJ#J;(@DzeVs@*)OJyGT3 z_e0Y|NS$}fCay>J_lUp8ei6ABs*@PGCm+Gc|D6der>rL^*G2zsHWKrI(QZ}Dm}Hel zxl~znK)7o8E{xqaorY+SOe!d^L8o(MzSwe+R#0d$z@G4#&k_;8^6sFhZ+jKn2^gD| zFNwU-Y)LDQd)#m1&0XszHZ0>1wbyxxr&u|(#eUnn5VhKR8IO|#<|(L4p0`NVX^&?F ze8v6(TaG`7v^0X?L-$IuxKrIq&0Tbzq8p4l6cE-Pc`^)L@ET=-I|dK0ST<4&gMLW_ zbJ1rPhIV^wL+g-x6Gd>qDT8#U+f=DVF#T4OJcL-lz000knU(I5ND0Nc)!=4>{r?og ze_9PSa{R8bUrKU*!kROwc!g(Y<@qr}EY1HaK-IaAQ9Jk42Y)2aA9mTp8y^*vVJQvi znCX6GE~rbWk0a)3^ppj&cVFf;O{~@4S#`hf*%`k&%J`E+=Sor~p!K-r8R*$=kqVub<)=VC zEmF)qr8z;RAJEMGiI|%X?j`o6N^vzy_6o~gK6jw#tam56PFS3e5Z5O?Z{f)qmy2|% zcE{aB@X|tjpWV9NkA%?SfCkdD%fEw4pO%$lvQU!_TzBmUsH0M=H?*`e^ZP0>?~&PM z#!<6VIG$s62dYi_Jpk?#o-@FD$n89-yrr%K-g)OVYT%73A7`sAu0!Z)*L0|u?R1Ch zRo2h2+iEpOvYWi0L&9N?E70h$`&r~0oL)n>8ATEPoHFZTTRVo;AxziXtR+3ps* z!D`!^)bOBk8(r*~;yHkxl>Ki3%qtw8Q&+;SF`Hx@-EXlMF4me4=tVAC$bP$RI_x{V)|dA?-)(B)+;ttfY#`?4e4UnZq}_SG~cv1%)YRib$l9j#maUlgq0?e zv)lg?8J+R$@)Ku=3H6>?7La6n6tFr@xb(Bv*-5kMvu&iw4Epyn_p#?K_?Y07?=N)J z(&nC}un8nTzuoPKz+`n*C(}ysYd5xC&VVQKu7K ziEA6W-!09`DUA!)Y&7;TDYHLnT1xlNc6I)P<_bw z$X|><9wcYYzNd-#p!*0GCfv5UiObtmcj&-X>Ug5eb1ehUF~>CeMW0$ms&T8bDh46Y~d52 zXuJ9uE;Xt<(9`Zx$yzq-G)%ghoL)lN8|E*m-F@b%w5ao5aX{Q;c8$a|%GybLw&@6n zR`(*;X9>vGF5+~Dc@mMImp9;Crs;nXxW)yDWQ^IzlioO+a=p;{ z23n5V57INrtQsL+mf2x?+FjWk_TE_a!1f%)mqOJe!n))#^gW^SlEWa4XRo#R7OQnj zbh8(Ji%|5KrXS?)d0o>8dpBv%_cX8AsOMod&MFZE-n!l;fJ^4dAXKYdfU=_=GY}=+ zeh1^Q-D|Q^YJLwCes=|UXMkxK+SK@L#q4RX4C?Wj#{wo=)Jgmm=t*DUd70e;p0`-{ zfMbbYK9Bar_e2^${13GnZHr-XhUzrr%C~%FBj!#iW@)dr-g~gHsgRH;gCQww%XjG*6vtNp!=TU6`3nDeGaWEOwJQwFC?9E znr0oIv92P|WAX~dQTa5nxBA?n{+_y}Q)fet7lFCZY7jzQws^)fp(W@yY}yLQ)gC)Y z@f)*R3lYZw`9zc$Px~e@E@;Z>BR70vkx%uwjPFf0-S~dZvW)pDiZM!~O@^3bH+}q| zR~fx^)V7=scG+Ki`;hTdE5zHNm{AB@TV>P4yU*k%iCuq|urCu<6Y+(>S)P62cDnvyMh$$L-VdTJGvH0OYqqY*&;3@DPPx z1Ts6^7XMWEe9id{sU0!B{}C|-{I!_y4CLbj8Ys;DnzLl4%qx=`h_lWGuvp_)$cRZT zibv#NQ!2|yzwcGj|HP*hU$4o|K;hRx%b|3I|TF{GwV}84l zIpN9Ot1~xxy1Nt`(ZA3k2 zeT#MPxO+F~v^)2)_wB>~{Z{=n*DiDMtwievVuZaK|AUYq*XuR65@V!(MDd)awdDDT zW;sWJKd`(G0L`){z#0VFDxWtPz2KfkYEHV1@d1+|vRZC=n`mde50QX6mtLwU-sJ&n zU7GWRukhof-7XTCZF3gZ)XS3@)8su=>voebgwqdT@VtKxO3!+qqVtw{?xloN)a8IV z?b1XGn6gb~cQ{6#3QWZ}uC05^yIbeLGsFA@3UB#mps?NhIxYN#`x9`_w>T3eyespa z1CKYJw{_z9jK>^3;i>up^;I2E0aa@3D~V>0T@4%`v^oY-HAoc)l+rPJ{dV%HjU(vZ z>6;3*7rmBoewXVTkQ#NFAgNQang3ozX`Yw*wniVhc2iR3208)!qf4y zushF8e1GUV@y(s(G?*~T9 z#{Y1H!)?BA;B%YiG!DOX$t9%^o$s7~4nIoBmJ?s#nlD#l4+- z&~lJ!SH5PgJFGZmE`%P-3h{nl6gW{3$J{Hx=dsH$H&We1)ZwrdVkgOW;`zVSMGFNJ zzR&2A&%6>C&v+gAzBvEFp_opv&AOV!pbIb$`tN{Ar~SIvu8f8V*$THA*muUR0aEm; z_QITGt1_HEp{(HXRSsbE6Y*#~@z0 z%>eAYZ9Rm4`>baHq*9T=xM=o_3Yk&AW?rjp2|lzcV+4zL!=PQ7ewdTua_t8qfYXlE zl+A!uAuhEm_L&PjOK@Ze-cpw_pmUlZiKYL4@rKF=u8Mb9T(Kcdc~=&}O}$-<;d z4Q18fQU>>PRH=lUAwNb*AM)sidDmUvAivY~5=-;6(=B|trpSO>t!BxvW7M>n)-mjV zAwc+e6BsJ2Pa%ClaUB>66$hBrWj0I1O`1c%a#g+TEh0{^T>{2e)-QQ%wU0*IZF!HU zFo}4WA}@zy*JTOtbDOL>Qp~-oInD>(wz2`ZhPN|L#~5!pZS@l}-FBzBFFcMnS&Cb% zY%hGC5c7b?1Wh>8xq*t9u-$=I!!{#${lKi-OlUb{n#zNLCKj;We$7yH$m=QDdSx{W z60re2jFbM!Q2L5*Hdc0d^gzQrtJl=1#~tmSTq z|58y%bakdTDW->h&6H8T+YwNC>6Ah_y|o>OX%nh^;@E1HiJp^|JK5UhlB>PMa@ji@ z+^^XsLiZZwNo?&<)|0~rGVyhi>jvrnr4TpUXNa&4dydjJTHJGSf6`%q@JcNQfbEjS zVZz)SaG5Y~YWhj$Q=dlW=Xx$e{Nw6ZtVP52w{f@5D%DcJa7nHbmA8w|nBd(+zbqxf zY`X?}_JVmiA7(oME=NtL!TpW@A@F|Ue3ABX4~E}VY-g>gH%Y<#V~>m<3NzOnOR0nm z>m&6446|mKeU~1hkK+Y&i*2)98x6^@NM%BG?dDY zm#=^vqlAJY-%9@X!z*iXRHaBq zG8=w%`n93G(61WAvOM>a@ErF6=4|8L?mpJg*D!3_@-Q~7GUTWwOX+lz1Wz9smU>{|sGj~xy%>!tlE#$<;UI^up+9q%=6Wv;zI z^dSUT@E?O|b3TVr@Wf#f3fxy5VLYRFOCY`O%eZyJWjjTgE3pVoxH~Tv`|FD-a7$k!6P?Jz&P#7?6s z4aPsW%%XiAH#?yd*K0gpQ_%U&slc<%=D&*I2IxBXy$Y%NEVqXUr8{3k=@o~2>@+T$ z|0f}Q2;r+2vBK%q7PPX3g2pLYOx`SNV|63#6}k#L_XUjeklk zyh||oQ-SO(NX>bt&@SG{CqZc1I-N$bteU0h7Oala4KpoAk=tt)3r*W$=$QXO#yx`KLBp`MwAhQVH%m z=o}R;b9nwlvkw%HxK@H{yz&avxnc4GkE)`@toy#5NRMdlg2y4tHpZQnN&K~BHCyuC z9|_safVWX1+oQyA(xU)GD(!drimNGhd&v4*%ULp!XORh_ZDx}!mxsKI|5D68PAvO8 z8}UBJcNbokyKen~&{F7Fi`FLlQf7CX?KBtXFUxMwHRjzZ%%hR2Jspnu7x62@P! z9>DfCiy5-?P&otR8a3UF<(eb(oI>?&ZYN$LU0`tpTbInHOogqzCgPj0*QEgK3Ag7Y z@|4dG2z1JOJVFR9cyM^Bv2QJ1;aiSVmOo`Kynnnqg9R)UL_Q zRgPL6qKVv+y&-4weiaZr%P*ZmdZT&x7ee2RS04c-yUg;S;3^qxmbZcMu)2ZF?RQG0 zT(;TfL;nQp2gtR^2cUnJ$yQjnO*4VFmz@veiJxRSNulYPk&$ z)8$LpsxUqLLt*=oV;cNQvFQSbgTDRPuGC!MuDAyl&f3-B|7Gh|svy<;7Pd>wa#$Sh zQfp7V>#3!C?&G|Hkbu{xZHus+CqIhCr;Y_+mS}w%1|IOAWHCx7Z(DuJLHdgN9{HS= z|BG<*Puj3Ef{(4fN%)wqd5i3l`Vf2mt3MW^hrEt(A5aRLnq6zi=X2*F9>EUN&d%DO zhvjv4k3qD-HUqj2*klpsY3n}h83aAg5!?;$qY!c2a~noas~-_glG7=O81Fca$`f{T z0Di(M1E3d8N@c>W4wC|$Pw>4&prt-L{!*Ne^M1x6a^AC@vBYzbX7Rvnn1+?;oQ2Ef z_8I7%w-kRSY5ZymlU=0dx?MKQ%Q-Vql6kn@iKSBCay-7}Ijj>i+B}Z)lcwi2)g+%O8bb3?-?R9(T z$b5;lK`DYQ2d-4lM%YvCQ33D!)Oo0lS1*F_aqC)O%=B&{;G-@nq$}BGNhShu66;ix zK{z_(H-TuS_b@6d)zx_X%((6Du=2VwVUKqrY8`nl-C>MG2W^|m^|Rv?zWees?xFFUO2bY{NKdzqq~?o z=dqJoc?dP;-7es8nfg4nQHPC(c6r?BFOk^iUS-H+svo1b%ke5f-B76om|K4;w0HU! z>4hViw17mPc0`Xk_VZk1H;h}hTy_z%GnQw`Nt{IjEB`Swf1&8bkHy8~UITb`->roO z=BV=sZNJYUk@ObWU#EzU+0B{?`2!|NoG-L5=6t%{Z5nu~SqpvRv_ZHPPg_mVWRj-0 zUdcq(<#me44yeyz>$r109q+lr5-oZ`ehFM>3F?GTJk39wU=}T#*e`CkY+!rVsk{#m zbN;n#%Zl7zdkX&+tq-E>hP;w)bk?LaN_ezPHtu?CrC4%Zj{{h<<5jelSng$vvn=F| z_;lvhnUqqpA9Z2sk$(f@fPb-Gn9B4^`y(;#aH=3dJ*qy~HtW;E&B=Laf5>wWT$^*+ z1J?#^n~}bvIzX^3I9BDc1T-hq*^oZV<{05zwZ1~T>{bd()v}+9%xxoc+q@Rl;^bD< zBEGj;raFn^Qj1i&=LGcU7xdBOW^D z6JD;(9#|7^wn_MS99(buAIHnbz6q$9(>z1P5$|iz<(%_FH{sV|)jc|4k)qppxNco8 ztHMK}VPZ@S4GS?TpmqzRo=cax2)s&lx%)uIpEM|_u| z@Nvxn@>Aq7i~N*&j@6;SVUDJC)cOiFb;Ilkl(}SbEK*n>((J`fyypOa2)31$w$Ejc zpSXI{?kr1fIf>h5`54=KEK*3^b45SQn8ET@k9Jmv8rHgdHjCuwzC}9#W}EHhnbC7H zR$$)Figwy`5v!TtR_1(^IV~3Zz%4yd`Gc%?)wydPh78Yc!aOJ9Y%e`ai#5j{=v+VkC+{>5GuxG_ja(lu0BEPFS|aX)3@6d z(~`Qaez0_#3cM^eSd7S!lp=8134Qz_HJ&sEqrb&Q0ht!BiDruUw=qAqz z7L&ZsaTurz-D5Gl+qD(m9=CYR+)*qQcqcHv@OlH+>fLHtCZ^%#eart>m=Au=wOY3q zgz`lFhDsQ9J^;UNI*w?B*sSeKwHRYn`{7x=`7l5>$Zpa2f4fNY90$#p{-+u5`9Cm- zNi%-u*;L&2o~EqI6?rtALHRI2rCB_tL@UisG4HN_3Y*6?To`nGiit0Z@T|)DCB3-a z>F^JP@;b-2;FoBdNI#m_Y~yzKh+=}Cd_w*TC!YDmlZPIkbci$H8AlSE+@3?29rlfk zlXeG)u)(|^XZI*_+0Uk+eNj^gL8=|f!R3Z+0VEzX7rrdX%BkAZCf9&to|--5lR}pE zx+e4ZtDUf3I>zCDf#Y^EJZq6jXIfAmqtv>UedxMr(hDdv{#zmbl3yx*x4R{fxmdRg zkgnct9DnyKCXrwAZ;BK?^=ncYJ2cIB(e3(zPLuDFN`c*Xc+0bp>!hIAtOo`SQNjn+ zE%>&>@)kY~DYNB5=d#IdO8&6s9B8yVWW%Y`mOJT}C(V|XLhiI|2Kf@xQ>5_kT5!3@ zZ8xqQbbWyO8q2%zV3$P=ytpH;gZw2Pw^{iu~ z|2?p0(B~R$vd;50u3dM@V0DYNehd2big?;kpZhZWcx`(IWCkoR^Iq#dI9VvigyJ!r zI_KMmCl#6=!mjtogdro27Z4j%rGw&2lN-pN@U6m!OwZde;fY%;&FYqYmA^o}-agh( zH0K&Pc}KRFpxaCiMT@KVd=s#iswrZ-eN!vWwz>D9YsBp|y0$qaQw_a#`9OT$`!I~i zRqvw;4?8zgg{4llpjPiV023}c)RW3N^K7hNlASOU`cIk0u|~c^OPhKx9DMAY2TH@X zZAhIoo!1M`PZGxo`vzZe^w?Br*l)6g-z}O>lE2?46Hg!5x6z{WY)2v0W7m7ks-gw= zTK7;jhy0hYpNE%~4nt%sUtunYu=gWjAUB}aAjT_xkMv@!_pAGfFn1pdptnxcWK3uM#n{9pH{pfleLP1p9;B){@Zx-Y7F;kY!hK& zkL-X_SjdCRJ>EsGLN?LrJSp34nv2B*s_KzP4<9E?Al>KfuHn^Hi*m3_MP|n15ItkJ zTN3)u%e2DfMfmgFuNpH~y^s0|Gevd>q2hV#9bi+hY-C51p$rt0PE!%3>MRm{-SGuA zKcmVZXXmWmklT38TM~B9BN<5B+-69`4Tmf|xF{+>`b6lRI5Z>J}-AX9S>Rcf56w?z3;J9}+cV|sl>~)*Q)5GdVAd_T2jfXF+rpd%Z z#Td=@fY~Vu=B@L64Bk)}rZ^`NY!4yG;XAFU`C2t32o(~`Zh&%*mi^fE3GaO;1$IsR8GowGhUS!5lpXF z8$@{J+(!~CRdZ~tM$FGMwwu493;aLONPZVo6~e1Z0=nyaFj9nYNi&80arHUu?zSp` z>TgZbng5eAIJDCz3A5+CZo=2cZmGDRb)=H78n#7>LbSr>7B z&~hB_?(thE-Wa{nGL=m2lQ`7*Cqq=lILCK{y@nya!Id zQY7&=ZkJ(e1`VnPPe+~Zqwk^WGMO5;>U9$Kx-3TMadWbAGjZH%dM!qb_5PiVrT!NQ zs>b&=Sx9nyOEo_?JM&{9SL*c|f6lw7Fm89x2IYt5@h~7+wiE82sTIfR;T<4hlSUG{m&)AB*w9R5_hRsgm z8aJnk)q4Yk!N>OFlv}@f7Hrxj9|pw>ruWg&MAZy>UBSX#*M8QO3l2}|n9r@}!M4kH z2SwPaUepNQ55ka}mKErD!g?|9J&DXi^#qppICS_556bP*8MoT)!~0{(0@l*!WT(xm zj6Xf^f+nFH9N<@SN*zbnLQ8r@ke z*=zZTJPnv<$i(pxlVVdb{#!Lgdf&4E^6qdyLL6sYALCrV%YcUvE4D6VdbRlpBI;5! zG4FxrIQ;9ize-WuG8-_8uUmH;>5Jw&d9G1|$sUsy60?f{uG&83>|>J`XnO5A7$Pj~ zcRNEtFFGYquFa|*&`-3uiREF%8OpNEe-~q-e=7iFd%vYTb6itsP-D(p@hsQ=G;fvf zAeXN!udrL0<7v$>?X^bp2n`3lt4UCyS0+^6DW3=8t@3*KlI^<{f*n%cwG=V#!2c$b zmpbA14UaPDd09OOg5$0a@F&f+oWu+`CHw#+9nZs%I-3RJd#Xys-`mdJ#J%j4hx}!y z!_fS-eLux8YWapG;WqVOAJB}JQk!~^K5BjgbcPiFO}Lg#U|E_)l6cJ}0|@V$p9lwH z&r>A3!o7;?^)89Hw%73t)p^{Z6J@=Mr_|p)9Ngh@nhv{5`G!C!?1%H(gb zzw09rQ$5!foYNTZI9CDFh*JTpRi0BUZ(J^6t;M#F5+1XDPRgc~hglU~!1;qFei5a20H;rL5eII#bueCWyGB{G_g2PM?+RQ= z^Q`d`(#yDc(WZ$E6sa-^_o>BMY){DJLAgtoL)w%4Z!x>s^C97%_sHWD4m+r*ar*?c zB&f!qUai$*uphH%r^zbB64L^{gX$`Rykpx%?-;h!34Tzj{3a@@c&1s{TK0TS}$}q`Asr5_{~AwW#3~I z&qJTu?~ChC9V&?-PgM`fB>~0ougmWWc$WL5GRFF}L68=g7nD)9{W*=mvzgh&s!Z7S z%~qVa3Ruk^$DnYt{oe{pUIme2!hO2q74y58YY1or=p6qCK+tBlQz3-MOowp0!tXS0 zCODo4;(V*ykYJy8E{S>V(G2}BxmD7u7n~-!PdkE>kL>PK;}5M5W3}0QnTA=etfTPK z6>*GnW(lkxd%q`a*E%%gOQGF;((%mp29P}P>t(#!=hDQN4QR$q| zc+hzo-*-FSfmCl~M~H34G?6xt=+%vvGj`Xp^Tc+7DtT;n|0lwaBbwb2VjS{3jNE;@ zd9^rRwkpNzZHgiaq1LsBo#qbnHe=e?t@9JvFN+eQ+kCSl#n`RM;9h*6nK)`Ry-F@S zT*i3vk&5|l+guZIRsWP|20gCf^$Xccxj0>F8b@cVF{x!EKLT|pyt-IZ-?*ee$xNpy zV$N}F1jBs01j_TQ{}cMgIrqn4)9<{EvDo<%A1i7K5H{i+O372B`D1KNm<)i#Aa*vr*WOTCs06!B5ZB6`+@xvxNA5dyXOZKH+~+}d!k(rNH}!c?zAHdq`s zE#N)Sq8M>D!~ZFG&1&X3KIwmwaN->EFtKDYM1^0mxCoJUD<>iRZO}gDdl*6#`dlN} zX7^fyc<`;=NfjI3bX%n87(iV@)zoIpxb4a$m~wrCx~{@I;&*U z=sxX!gmIsH6Y=G_P5qfrmFLpM>>9gQbh<8^Rz8FB6#wfj7of^s^LDmdX~0}-;w}8U z4y*6^O#xh^UkZ)lvd>M{&jt7L9|{Av9gFZk3#{*(FDS&>cv&X!<~WU0aTC@%7(1

M~9fAMzE`~v%GT3V3)C#z3XLcr8wTDMwVsmB&S3c8zW}E@|yv}qkhHkdfNVhjW|E1 z7$?!EkSg&{A+i*&C)7}e>n(gdZnMlEGQ_bdI19DPeIFv*>~#hDb~`-v5E>h-udr}U z%jez^k$8@IzJ(MGZY9)BqiZr_k!u>3?zl{X-4&NI7Lv0K z=7Rx?AfD=8hi9i<`$2TOW2r`HK8)RM%4gI^xrv!DRKfcf_X32#4jk!~9gY_2#(nSn zr5N{n$MXa;jmqh2Q z1d|4fCf0~O3SsD;X*aPuiX}daCweDHRI%>?dcY2!5r5AD1Ko&`WM2$l-GVzndmtLV6_2dzG!;>bH%5`R6 zZ~onnzH$F-eVA7B_rX633fKIZM!(^=8`poSF&;(yS+LbN|N6ymzuNT8k2Ze!nex}a z{=4YkeEf4U{vz^||7>9#Klx4MZ~pER<*y=t5vkXIEJl6gZz8!8{qe7Ujx1MCb=m zOGD(x3SRz-;iI2f{PI^n`@|ron!kJX^IxsJ_~>Wm`d>tU8uPK?Zpw() z_2rh$Uv2v2_v=6Z>R+slCw{U1n}2$DB!q&39bz`G|6)V*SAP(me7s@PSL;7l{rgi$ zX{~>;e&d%vH41*RW&M^7oYV0e&w}tQ2+xA>EC|nnVuVa^Aisn79n9|#els_iS-}R* zARiLwgq5FtxpB+J^_w>S+qW@=Fg=9nA)#VQh?d`B{Klma)P~?v2+BinDFl~7^hjbZ z1aqOd7m9nK=nqAIDEdRuABz4^^oOE96#b!*<^q&oeD(PT8}TCYvn?C{d4tG+y)lH} z8DV{w6miD(*PGV=>xRwx4ePi3UK~3_|6%jy4PS0~cY2i?S{%{hh!*2ojB7Ej#kiKR zw1lN4EG=Pa2}?^@VT2WiwlK7X5mp#sg`qhN&0%N`L$i)qI)c-oGn_NwNQNU5j@@wV zhQE_B*!_CLm!EI^@^>)jH%5v%uAKP9NUYC|FnqE8%g+V!5jYfqLlL3&`iIYhZ2+GBM1J!M7OvkHLo+X2sw` z3=qelIR*_eF&4jC|3%av{_!6-Y&QRR{TH7G1_uU7FM_2PAuBH;1K+&}30!#*`t6IA zS)qX|vqA$`W`zcZzMB;qsFhxXNiTHL3%&HhAiaoLc@ZSp3X)6&NhX3M6G4)R;E0u3 z!P4{)X?locD<@-R#?8YUSHlZ=K*M#ChdVUkguWK<^^HArV-q**c2 zteBNqS}Ds~i5pre%UUVRS}Ds~Da+cxl`LxmSA5n6u0W>^T!Bs-xDtgna3urRmXXeB^h&uz~Nw##7EuCabw`wbRC1hRjO31q4m5_D8D~RcWS3=gsNJe8MqcM`v7|CeNN`N}4 zcyv0|MZ8if3yC#n>Ku^4+{F=gg!X@Jqbftq}E03irA}2>lm}me)NrT z(;|yC(Y!Y!IxsLu7Hh3>{&r)-j_O~(*|On_Z=8R<`K!-1eDlrfChOB^U6^5wvr*a* z)h8RateRGTvgNDI8`fBET~{=IxHMbDZ2Ib7K8+3xjh0@8Xr))7;dUPxSL#h0ezS4Q zrgxjYHC)ie=+-zJ9u(zn_)@?Zwf?hz`rT%+@<)F8`6pj*-neDMH!Bu`Lqa55VLItm zM3nR@a@CWlVCh^$nDi<-NO~0&BfW|Vv;2qk8@I%Kwb{4{w*7d+dgE?`E$^lcnF7MyK^!6&=^^)oyO@M1S^@?yoC%qL~q)#e)BJlo4hR|#Nfcdz%?+4 z(CHk%o&B|O$H(Lqn?Yex06|*GdQgNxx~i3Y3)1O4jEwq^p!E9q4_~s;`s81~{OtFe zzxq;ak;SI#)9A?XK$my+|J`mA7i`}5e+}PtK@#{uQ889OH{J;RdcE<^oa_Yy{iL~mOE#n;?7eX7^#L%ush z9}&I=*oL5>HR{6<7_|mD4aOGqUA@K{mcS3zt&ku(SQqhKNqtas&>CmMqGG;#HaaS7 zjkEfwQ0;eR^-=mYywyjC2d^Qk4_m_rL*$x~>GW%16CM<~Lbl+@H7rDHjT_8&-67Z@ z)nBk)B5iQgDq7L2dh}8k3D!&W4UUoKh6GA8LIR_{8<8O}I`YH13J(liaUmp7Y7ik| z;nKN~)vFXmBw*mxJRVYBf*#K@}1KYYINtMA&3)&_^D->-#lo75WOI_;_* zt<;D@LPI5gv}>d!+PL?y|GTe07wi^J7{2`7#xFNWGa~eBSkZ<`Eigp48mmr9Mo5HI znIVz7f46+R+w^?0>8mYLrwfVJI~o^<4{!YK-ktmQ-rsJeXBq|n{YG^58aQB4AIGAEj24P!vZB|!vZBzg@sEUC~UP6 zhlNX)!q(~t(P0tMYrq#4wdPsFs{YkAI4pFnE)W*ID!EF$uvI9-bW%SE)2-2~qr(h= zvRDf#QsahEirFCHrwf$mtP7Un(}jet5s5BTvZd3m6_akY=jb8=-`{NMVkBnhBBXG1 zQLC>aR~1LDsn{T;UANlcbcRS-tX#8(n~|$B;lXQZiwc)&Iy^*5cSK<1cSsT)ZusuG z)rBcsD?u5)x>E>WO-p!~)Iq{^@9$J&fM;g1_cele4!4irQLEpYwV^NJZL>b--CpscH zSQe|0I2p0JbVP(mphajyWwFY&k{h9wR=9}pRp|(c%MlUb*6*5Ybe-Yx}Ze{OOQwEBtb@7SRzMtOcNL}dr(MIaDD{VP) z%a+X>fBT0m#+|%)qAZKGk}!yjmIxlXy3$7)-iIwFI3(&l&BhZF7Lltvg{Yv&_k@hw z9|@)?U6lK`n{%Qc195v!&nSM^A3OdlNeejC(>7_{%Z9%5L@j(&ANtPhD?X+HYk z80l3=&`Lh_AyU5dA;FSAA)%6%5NT^-l#~1pF}z>C#*kM!u0A9@`h9;wzttphNgom= zrV zTD_!{eeZr_T=mVwU zS`Xv)b@PTV#M>~&XBHbiHy&>MV*Mul#@}t+B1IzgV7+dwdnV&q2}Rv1{<_r~(ng-1xQbTLxW!==5UK0HW5I6QczrRu{YR{FN_m4tP8gv9soaLGn^nC?5B zA##;-;gR2Jkun=D^(1|GwDvztRYa)7`EY~ONg{$Is}a%~rjH1fEJWxeZbd|_(c$!w zL2I2guB+eO0_Y>wYW4a^X+76RtmYyzNJ1Nycq%b0- zO{YH6@Zqf0N{BRkK-eg0&!Uf%Zjbd*fx+)HGAihUs)<@{+)+^y+)>hoL?0#H^XQ{K z*z@V5qCTjPs1KW6RCM5X7!qwTt_h~nnh+)JVT?~Hq;3^ukhm7L8iw&UWTjT3wQDTJ zhQQSpZ@e>>B-h#~8v>>Mg+4lD&F2NHa73?l=VAy9j&^ysMy%W#i+8I()yEj5GBZ9? z{VuHxL4guQq770RMn_2mijG(fZ?#0Cqogv3UR_S2qa|pf^^z8S@CS>baUpp><;GQH z1rlQ?kzPrg54~O|d7;;>>RfFadg;zaZ)E<;T*GQI^wKU}uU}o<^{cH%ua{Dx*GqHt zG18KyUv2J&RZ1IHo4Y}}fz%sT*DAwmV=ze1GK^Ox+8DG_vofqMkOr;PA`H?q7QI0$ zWny)+r8k60o*KfWR%?(p;Ce%(gpeUxYGsDi3N=V~f%=%$jZe&K95EqM7GqYo88NFi zVx&7SeayGkR&!*C30#wEF;d7e($i{v%&Lnq60C+msXrO3W5sRbtCc_vfs$!Mpw!U~ zfonY}G=xV+tl@@XbrWcONGd4}3VwfuGz4kiUm=YrR#&avhYJ4RH9v&o}3tycZ9w>zx9=Ix}liUxN)-gkPutD|lS6_%v>wIbm zmmYl>!b9HQu^7Uor#HqYS}U|Rgs;L85%T^f*$@%(eqS)2_#kfMLi=8$Ff#uA?VIt$ z8aEk+2<`t@$DIdsz20}CPtGx>O;4IO&C<*yon~p1PH&p!ES{5gruFnl=g!S~l1%T+ z+&gPBleFoUbb9BeOGFSv+&9D(L{St`L=Z$}6#+#+Hc>&5O~4HiR1}@(^;FKxNu57< z`F=m2&-crYKY??;@R9HnkiYuw5C69hX~NFa57Gs%CH&Nf!2H?o*DMG>%J``lVD=%( zg4bSs@%`WY?hnEbT*LPd!w)0={x_BW{tM88*Ji(Au;8`XN0s4w)U)rOxBiv8VEz|p zKd|P%^`4qP|LLdyg8B1i--`2Joqg}kpZz(}g8AXwdH?H=>lVyk@b(9c;o$9mlP;M5 z#!tVdKlSg(u<=u`@ccJ^>YW^ZW9{!>$%L2YJ$;1|UV8Nz-?&P6>9uD(j81sz^%wu) zKVcGHe*NhOV8Tn!`o2fPyxFg;;reI%voj%lHqE|NvtM!&UY>oZlkn0TPrt^6^z;p$ z@bc_e+3;oW=_gY{_$mF;3ZV_s_x?-=|+A5?)>~`|`Xp`=B7Oqlo9yK3I-U-1d^ zX1`Az((IdX-t1>x!mG1i0Tbpec>5Qbgzyclw|&}#gQs7}6T*+gpS~1t{re-~t$%-n zH_bEOU@t%G!|~Nup7AZYgjZ+3H&GGqug-tgC)ca9f1if=GrrxL@apT& z__srNUBCE@Prg@w|Cz7D??2;lY{IM0`W9xwtFvDgLwe@({rt0Dhu1#;te5cmMM3A8_Hp=+k%l8!x{2q5t`7 z3E@lnUw;4T?|RNI%>Iip;f=RG#ou^i_6x-u3uZqK!$bI|S1g!)z?Bfb!!~>N;?oBM z32!}IOjt1c03%_+>;v17X1`P|n0-*4uweevzXuW$zA*cVnh<^n|A&6P;LY#;dHB7` z?|#S6v-|??)905k`yH%=gxT-(hBW)qgs->n3BNS(_P0sG?9by95@x^AlaMg`kNEKT zZT1CASP*^!{?3oj`TeiGv0(0-U-L`M&%gf7Z_W{Z=HD!M^J`z9{|5`^eD&L3{_^u* zfAbIC^+KZGIZu4zSI!&fg#Wev3yJ;@m~S0ydEtdb|LcUe4l+OTLgM=W^`PljUr6-J z@^5XdpHu#+@Lz_Ve{SwO-+SS?xj+B>JLdjkc>2I|@0k0c@aIRupZ_@g`77biUky*6 z2>I9E`Hs229`a|xpT80Q{LS$6+3@ta@brc7^kR5=IXuk^Pp^gj-w98@8+Ly$^w-1F z8{sJ-JpGIC^e@BHm&5EUUV^WN^7ZiaW_bEmxabeVpZ_{M{o9cLU3mJB;psc!>A!}v z?}tBs5T5=lo_-vj{wAFLZTRyi;m?Kd3}F$Hk%A>yie*@V zRak>{*znG9ZHAPI&De_V$VLu!VYlTy(q81F00(ghhpiM#M^J`x97hGJP=k{=_0I5G zHcDrtW~miz=s*{`aS=VZj6U>Z5W^V37;fMe#xddcQ__9uAs)Z;7w$hdcg1tu7A<(r zd+NY*VR-1duzMIKD0Nnj6R1KhPMJ1HXV9#+q75DBLN_j=2ba-@ehgw5BN)RC+`>2} zFo}Df(X{jkkJZHI1If>anj)o1=~#}HSdF!&8>EfWW^7Zlq#S7%cB^}_9|xTs!eRA@ zREBaKM}3sR4CS-L6>NW&P#4QIEcJD7alJ8bbBu8;1T z^RA`O&)qvG4EN(8ispo?iltJNaE17rL!n!ev}_HXsd4BN)RC+%mW$-Nh8{V;Ya} z*h=EuKr&M2hO;!Jt1F~cSc7%gfQ{IME!c)ESL7fUdB`^?z(E|sVU(a0M{x`%Tv3Hu zwGQ>_X`DqX+6_8!9v5)Q;4-da5Z5qu2<6D)dnsLAgRDOE~CI+kN4 zR%0#JBg670Y*n`-TiuD>*o*x*h$57r%yPMO0##}aPO9}dtu{$5XnS|~P;N(uL6>x1 zx?tL)_NrIZesw?^b~b`B^(MyE2~4W@@eq%lE&Q2~l71$n#Yk0`O3Sc9T`jG}dUd0; z30u_d*rD!3u9}B@9KazIqtwb#9K#7`RZ8{q9OrxQ}UPGg$bufux@eXN#pJ(o!tL3ar8!tiuL-nLiue3!Bs}*oG|Z zz)s|15B4J8We21}6rtEzsdN;_Z~~R6MlI@4k4BuqS=Y9r9bL}4aS=VZj6U>Z5W^V3 zn9FWrT%Euq?%@F*Vg^r;_?|%0d%_hd(h@9HmrEg6btwOC@hkEri&Z;dqr*^!@-(-W)$>`#ri+{I8cSVb%C!-zF!RX}A zy{G5-xlevB+-A`W;fBdbc_Gv^DILqP605Nm>#b~*Hc4BNrS6b+VGs79z~G=%gc6iF zE5~tEIIG4<^_0{ooxxeOIBSzS(4}5Lk9rw>>Hvl@>g+mhs^ijxH1$IGfWD_bz(dU7 ziRq&EhLrr?kW#S}%ikNWSYfbAT`R4ZHcFeY1>2Bikn>*egQEBT?5*eL9&>sEm8eE7 z>QIkH*EC7ZXhj=3(1mVXM33bw(p3zo!(PH`>L{+OH>6t_#{?#E4-fDVGj6c(=R;cL zpE!%9)SnMGSRyUOGIhDMQd%Xg!8&!llz~ia##U@M&60Ltr@BkpjXZU)l#c@SfK(_Q zk`AK;rOwK5R6T|hsB~5()!-yfp#i5&&q!y{f^%p`C(h#nE_wAYyW)z}k0Etf8kNTE z-H>idw{Zt|F@^hzi+mI~J0KOJ2*o&pGL+*uDo}+QoWvXj}_ zedt#Qq#^APG6YraoIA`uX{ehiFc%ml$LLdo?e<7SLLAtseE7dhv zkB!)jZKhe+q3)7)BTvo80ksfCYKc@Tl}pE^O4OjvSv?xnCbX#M(2h=L-O@#=_ZPzJ zby@90zdC?Hby&J)Zwxmv?(B}~T}OfAQ8R5+_Nt&wV-)uA4Z&Q6=2m71Nkq75Ae=MB2m zi)ycQMe3IZrE3_&O^h2%NK?{%=^-8?@%@41_lH3WmS8ECVFgxUjlK2Qh|TX0FUA&W zyJ@z%8`K7RzE-jZ< zNo%kU8?X_Zu*J%D?7%K(yOD=|&I(Y7!_G=jilfesOBGVJREs*bK{_p+MXTC|4s@X# z7fpMADZGN0)jsq)8_QTgEEvG9K&&(a8`+G)S?dcXv7(u zMGMZM9i2Fj3%G<{&#h1DmxiQk7{ztm#BI|FFTvdp_*T~B2Y#+(&fJ9`45vvS45!H- z3`;3es+5Lw(-l~)uEly}AQPLh)k@X}eZcS5^RUlh0SeV36ypfWP>$nPD&xhc^ah+p z6PnSAHgup1-LAVN^-6tS^sDLshSXtPQ%9vSdpD(9xQ%gVcdblG52S~f!4o8YD3FB3 zzBRn$L*cSCEJeD(a;(H^XKSQ&mNT$P-6Cx_%~E$rIUkCTB%?LaHnR?Np&J)n*(+Va zRSaMV*D&gCV;}N2>@9s96PUz3JitTDxZ%PN2a-M<>SCmRINV{0v=qxsS4yj~R^4DF zL(RlyY&FP|c3`Kv8+$G9bGBbSC>_FKgW?arP%~$4m0p9BIE4nBMiZKCx1d#RLxnq<)U#;8IkcnGv|GA}9`y?P)j{c+yNrCqTkk}Orv2l%AI*!FMH`~s(UItbXxc~P{zrYh?D}YUF?J&l`>-DeJ{n%M zLmv$CbXc@#UWMT`pV+VGb?nWN=IV(UR4m&H6%5V%7&ZvoUAiSw@LmM)@4?UkzYTS?R zj2@2GM%$wU(Yw*)kH`J!&gkK2ZL~c)@bU2C4dL3y!z(oQ@$fQU#|`zi!5wu%ol@^( z8jtW83qKL2NuLO5@h8G^3R0admC_BCtE;3nSf^%4nbH<%8?s!H{RuC5VYDjR8tsdY zM-xB!^SyKCuKZ-UW;NDgJu;Aq&Di?MaK~+*49_L|lkv9EDhIXZby9P7UZSEQ>LP={S{?Nc5lj(o~@x$b<*7oW#wiN6-MlKdzw!hT z9tMl0RHPvt%drxxvDV%OX(Kja3$`H(JFpYEmh+IW7D$CskyIj;;wX;c1S(ODTGXK) zjX2}lW~o(bN0-`-i)t_WFyL%R8j;3ufJd%)jD?>LEJE_9 z!`@;k6=|Oid&`_HmsVjdHkfY2CTzhrWSQnjyQDqRUTME{KsqEHMu}R6W9kW1qT1O> z=@c4p8ck?6J%Xvt^Zm-?=`CqHAe z?lV69nm-e+Kj+s@+R%;;bfU}j!e_$sxg=ed`V6k39|IUPy=FQp-H>iccQ6^B-&A}F zQhp=8OwrtENwhB786ApFMN|H1+>ho)OQLnr&gf8dDw^_}aX*?HEs54eJEKFHtt7rqa~m9cC7epctxu}8(!~P)Ts?PgJzsFXh$c`;{qegrQ@hnt5J(OXARP6G@;qqId^H3I-Q-z z1zbX}L7$bYzvY)MhNIV`1ge}gt zV+VG*B3H^Y-6s`D2XRO(mX4qdPvk_?wH*gE%n82i!`_eQX;V~9|KClSMNcnu&OZ$Ad{ZgbmTaK0LDrpVYVFNZ| zlgqYB+mVeN?80v3VV}F?O9eQHLpW?uEFD1^%5mJ_gj6Y2p&B*LPT~|AoHgP!&Nw@Z z7B5cV++5j8W>7Fz#Ju;nxqu4W?#yRh3}uPgQ;-&p|;s)eS9rDBvAl;S9k znN}E7qRLqfP8!rZYe1v3GtQcEPHji0+AUp_dZjB;KZew67{zsGx1@1Qxbt01VhZ=H zOiK@~%%}^$7}6pne=*e5FNWz7bt#r%g~4irHR?KSaF!`;##U@cHgd2FyOD=|t|*WW z;*eVGrX^Atj-kS|N~*;vEA`T8oK>6AqP9ux=s+jB3@)GtSJ3aKgVHsOsW&X&lx|Do zxPu92lemWm&ZebDu6?2|d@-b?7sJ_NX^FHH%hZ)vgZ0ibUJO@klr~`twjm2UuoJo1 z7}{)>#YAscljRy3mb_=yBN< z>8dn{Ypxh^Hm2T`ZsU$RDc!>Z^^x>gN_;7hj8rUrDGZijg}NH+kl`#7o7HVn7IwT8 zo^K9zs=3l`>{0h3U)?VqK%sg_I*bzah*TyWm5$+rXHUwN+mg#J>v;|uYvZQQjCw5~m_TwOmTvjZVq8uksg<71l(jc92zb2e@*5a&9 z>OdE|aS=VZj6PRfwLGW}OQX)l)Enw;>5epMFs0tdw6huM2@+ok(?zd@v&C3~bgVE~ z`O2K|ee<=ictEl-<}ER2zv5rL`=e#ildh?MCET$QXK)rR25sn6&*K6vIlGLj7<4v_ z5%s!s6Sut}_QT9CcPc@42pb%{@NP_cANzdC1)|&yRq*Y+UdHTtctf zC-q}cy(W#~x;x#FZed)#V`UQe@zB{L%-}Je7%X}+l$ z6SiO*vaka?k&8Xpi+tA}kP4;4Qi)V1l}jh2N>r;SQLi>iO=v-zvkr8j+u0>tR{PMe z4q*h>am!#F6Y3Nm;1Ql+(Q9Fvj1(++Eu5ueg}MrBu+CYAlqqeIwjoQ+k#=FXx>w4V z4oHQsg*W>lwHT#pnL#;@qr#wCs+CSj4bmCQO*o5Yw4l{W8#>fZbm2U@4KBJtuX-6* z(1)uAgVK<_YwDPE!`V&Ta(2hrUFn|mKzbxSmJ+`dQW6$_DO{0)R4n;Yn5G*nmsUw@ zr1esUva@EA|5Ec)%RlKk5trAlc?$8u+@q&3odDMQ+Xt;lk=L)sGE3w+%I%KGs(iUl(lr7~*xzZkK9}3iiQjt_Fl}bmY<5GoG zjg#srsZly3HA}5hyVNOl8yrt&=jOOlga>P0GejHCM`$_DKcOL8(Y8mP%2s9+xVmYU!kON@|qONX zwo6@7w{%JBmHMQ9X$T|gm~>ORElo(1(tT-Kn!&=~4Rz7)hO}5pm6l4&q?OWYX&o}u zOlga>P0E&Xq+Dr_v=0U9L8(Y8mP%2M6R1KhPFZR2U&=MAO=wYDaSm-(Itxsjr7Ynz~F~uCByttTotRkfCN`GqyV0CS_U4K`!!~?K91n3UJV%NGg^} zrK8euslsw4s!)v@(>l|7>9o`&wY=_OMCdcr@{i zxF5}q7DlV0tdcrd5Q3!_!h)@WaJJersg_oLa-!e~{rHQE;)k0$;>+>d5Q z3!_!h)@WaJJev3~;(jzcS{SX0wnqD+D?1lB}1L^s*mY_`o-mXssylJ-b@k*^+*3Q^>; z!%_)K)iS9Z$JG<4Kqac&pjJ9*E!}*uJF5SW%^)9B=2hu~#;0Y4H z9!UCnn5KL^y!@$Znz~F{A+5$bb%T^?Z-7%v=h15VePbkS3-3c&N@u3*QWB(VHPHeluK~qApR>rRCBptX0<| zL)|28k+x$8b~)RPJnVB;ARUy7q++SmGb(%2e=blFJ^7~Zan;9sHs)5#ZT8yHflhQ8 zbmO91^-5QyerXWH7{M5B;1ySRsGE03(qs0+UxNJ0wIu!O{}q3BdJYg6rGBu{HM4d&5f2s>!O{}q3BdJ zy${5u|@AN!6kJEy+mFNmgSTeLfFjzk|s z)4uCInbEvxS+pVA9UX~2h^GCQxF5}nmPH$)-O-WggJ{}+jr-BOXj!x&+8rH8qs8>Svn`RyFrI~ z9v9V12EA$@1~80K+`w&2V9FKuT=77CgeO?^M}fsyf^@9F>OTrstofsG#X2%EtQVq7*05=KqabBjT$$ovr;demYUFvR%h+#QoE%~Qm@p90Sr4Ek*-TOaa*0h zlzQKDd+^6T>63pDdJ2|cDVAZy55o3pX)V^P8>LOs)*pmBY?HFF6T7k3O1^Z!%0cyz zTCA3+rE0l)Og({0XEmrpgK4AGWZH~Yw4noCrWd43=vDhLfMJZf%b4j6+`_oQU1>^s zU}ai;q&`s>{z<5d{v_1Je-dhnxW zpvQL{jK{_p+kRdluO5*RZ7*URZp4LtBq=t)GVEo+R>?YOBd0jUO~S)C|#3A z-D(Wi)td(6xQlz3Hh3gG!JP-$8t)w--sZIDh&XVHpwbQyF@mvC9_Lq7(c zU304ubxge}-Nqe*3EVZfhiS}U;h%?5btEj2Au%heN7C8|-2I@F^PXI#-FHKSEMhc>mtUCyiB>P7T8 zyCPl1fa##KYto3bG4-Z&+u68!SDJKoPn}jD;*t79TKE?sB_ZW6!rl@oU0N=!lGb3| zUxelL*nkXdw6a;+g01$pJKG`cbhZn*>K=oAYQ9>a7OIC(I`Tu0)Nfk3h1;&3aKB0EzBG+T>Ju#bQP@jDG8X?R zOjD&LNW;<}d2Z=H^4vE6$iH@X#FLzOQWUL;wnh7+6VarHmxS(VS>ev?kgX?T=1Glm2_$ zkLE;+qBYUBXn%Afn)Lt2{b)|KC|VP3i}pt+qDeoF`_Y^qdpqy^ad?yOLhg^l`(n?J z!#imo3Q*{*NGg#^rE=*wDo}+QgF30+ts2xbXvR5%c7qOdI_q|JQR#9@OHl;Wtf<5GpaO0`C+l}<_Z(rM`onk+XRy-aQ}^S5vqR2`q!MSPQn|BZ>ItbrsxqimPpYS+dZ|%5Ej6JTt!P7s zX(zgH9^JTLdP(Y$E~5|q7{o9}tc-f*H*gyh&hDB{;XbDE2#-ylNQr+NNc!7Qlcf|a zQPZS!ELT@ZtNu3Jd9Ab_8OX$DY{hoVS<(*6yVP7M5BchT6ySipLKLAGM^J`xE61c0 zs6;htQD=HeYH;T>Xm-}(>>S$BiSxLCOICWM%ji?DN&{{%tX@+`)f?(f^|m@8P2wIN zm`>xNI)f+b!oLe?(cguXgk&s63Q|qe{w~~a8CE)5Zi>K^yY!(Qw|KK7%)-a#C~VU!pgk;+hxP7V6GWyVuK@8iwCXGsC(haZHZRw6QX)yJZ bIpHVH(?5Cc>bvJYiaw6MW8uPgzT=Co{1UeO%j5}%`k7AxIiP69oI>ACQRl{2->Vv8qg|K>^6dlh@7la zg#puGsF``j*`?C5*ekXY-Uh}iMOB)j;9dGhRxS3UUd65C#HhRJB7y2@P4WJbWga-- z=X#jC-?{JIHxrsPQV;OHbMCq4o^yYnx%d=S(@F>TE|=8qb$br(J#gT_;R3~~KU9S+Ab zK*#Q{KhOSsn3Mf&2VwVSvpr)TkD`@0V|$+>T)MHicvnnb*TWZYEyCYn zjs}2tk*@RV*(zuHI7b72sAtTvXP<2ky|4#1**kHv62En85n+3r@DDrQWt??>_G}el z>rVLN&@0-vZ!Hq0_ujYxV_wn}5Bd&N$=zlG&71Gn z>otC4aBvD9;1?vvUzZHi?PA>o4Vz;Y(aDp;R&5L-s5X4^B$ZLMKSoq{*t|$!4i66_ zKHJ_FOlN(3ehcXL?yXzD#wR$RyKv!Y&cC*G>u&1*(-$txaX#_+mbM0mM_+I6K0YzQ zEz>M;zOT2pucT?bV44<6F?#t*C0`*-Bof3{@)*Gi1VY9FimGZG3BBHq4o!>ic_=h#iv`zxA77EtMXf#=<7>vc^KrRQ4PuL#__*N1hX!YGgNE8{%RRj*_Dp&(L@uQM6lD(yk3dkHm~0wOzIMG{`!1@KtSS3^@;BLahkRS)&g6V3_o%2;ltav z6B1!d`#9&B6Tm6X&tq>J|A|XcVy*VSIa(Q4D-~c~?mx6Is8tDzrN+Vz22`zBte?K_ zV7Pku&hIvF4lw2WwOW6_)@7J|>#tn-@sA1p{?1Me{&;Er4c1w+p6s2!O6_}?pM|{l zs|wCL9#)h9Ek><9)vu`cd%-3mEEi4WZ`SDsOIem#L1BIRc-gYH5y)U3B3isR)}Y?7X2VTha&)hQ^c~s<1b^d7UM`f8c^v=14+IG z`R#V-?8g-%?g2~$Gf1Qgkpz94$jAH<9A^$;k>WU!5@8~eLk+hi6x0*000zFHbc?`5 zs7#U`LCKZHbg)PSrhY$I6!<|9 zBZ$N)m-S@1tfwMp#g`wTU*--QBi!}dmHp#Ltb<5nwFL|4f)FRpeqe|%>!#5c;JudAARM~haP&gQUCfo zARN~XO0Y~3`C(>fv2)WvwK~VK>=@F&flZx%Gs#%tAXa^W(Y^&qGh2cf{AMwWH73e4 zjJ-bhKXbPx7j4<8{5m!jDh7+Q$dWie^cc#4#Ukp1u%z1VV*#(%7id}8x%s=e(HMJh zB8@#5k+rjK|ABmZ=c#kGZn?)#81YTeyHoOi9QH1HB**`6MyjWNOyw$2Ono*v|p zLM9{%g)qWRm`vKTgN7lr%*Ibkw#Ge|6ONpB5$T7>Qzb%yYl!xfKv^u&v5S8SaYPH* z#yl=6Iv^xc-?Bn4(J>~V;Ut^=APj|qTJ(}jzv_|~4thxFNWvwGU(&#U&;jZCtfQF-KJbtr;?ltu% z-Mvl;Jly5BR~FRN-n|~rSDM;Ox8LLG=xVf&{(>6giO!`Fu-hK#JG%eQm7(uy_II>f z8(eC#x8t36>r?B^?L)YCaH`s*|BA=Bl^EKv6QM7crssH#zOyt&I+j*79m7nv| z`S1f*R#l!}!bj5b!rbKCf;db>(L{OZ=umlr^V-tFwdqU4xQxNgSI7SK;oW}$nwgy~ zPk@LgBA$r&-5sN&#FuAhXNL`=a>J@|Ig+eo;40P%T-SsjzyFQDC!2b`R3aN>i1?Wr zjWB%M@nROCtDTov)fpOb`Qp03A3>~+B+xKJ+=KfTlp@7NC3abcF`q*9nG+QBbWRYu1vNSN%N z*&dKD=TJS!jQkkA7*g9r7QEJq5LV6>gu*aw;%lA%ir6M=OQZ;J2w5!58pa>X-`t^?n-4S z4cq>`FMsgh?T|HnES8}(4Efjm^yOdCy&F(s(RQmAp6|Z=>W?7P^Tf%Iesy_zzM!e? z(U>^YfAs3*?)h*H4;d-(`@!|EL=w+D``i}SzZvxZ?6>>AD*bPH?%8J&SS-^2SNHw) zXUGH_{uMP<*!^;kRg2H8`!D!M`0)>~^+^9cFYhj-&;jYc=i2+>n8+iMA%ieJot>Et z8-##y0@v9oZaJZkIr>#Gs(|uUP5Nw{x)$wR8(+~9P~utAx2%Y-mG+o!WQNhsb*kS- z?+m2(h17LYj}}u-`|DFq`|F$9@9(3bigv!#H#S-^`})a#bgb_sX;1GFq`wL@@LoZB z;8k0X_Z1bh!BqGs#Hz9cqCR2F(Z|+x3Vq7ar>=GieKbSwC?bBm2Lm&%zm)KsY4m?( zE9sl!&C?3eFnYqjK=@CQY;|4*-aQ^}{7E~0cRUq)Jl+1AcK>O(h&DJBkK>0C-ZNIO zMq1s{(gGF*@i7*C}R9h z_8QKH%;j`ZBtE*6^XR!;qfm0RuZgD0bGg%|_X`CB`nMsWhM?i)07hrx^ zpeI15B>cC^H#uF%sNta8`W_!nbOVLHnopp?xh9-xhCs7on6!Woa{Y7zjqH@B}g$WKV zF=HMN(sj(3m`xmQVm7_b5r;ZF*iLuZT!ZS2M0z520tBu$cC-C z+0#GG_P)q#7nf$HhEBb>d+nK%7b{j7$p*h%vv&{%LpFrn6VE)+`(hxLJh*jc=u|$R zFXCVR)TvWN{3H7f(IjKA-&NWe3&4<`XjnB8K@*WGGiuRf993jG5A2Tg>5pBo~3SzNwTC!PrZbLj{Ysm#@DC7YcsHxfA2q0+>xP?mRTcBSSo@@0$6| zo40I9ee2h!DTe7|lp*RYTND|h!7k#d0C|VCftE+j`np4uFB0j92(AE*KQ)=p`4pz* zXOOLzwEC~@9@eRGkmDZyZTDnl%8hC*E@BT0T6Ac>Vz0wRJa0*Im!9zHIF?GFI#ZSD iJ+C?>)zukQvI4*8J?@L%JLP=*sVIZF+g_I6jsFk9&Gx(i literal 0 HcmV?d00001 diff --git a/Clu Clu Land (JU)/copilot/chr.s b/Clu Clu Land (JU)/copilot/chr.s new file mode 100644 index 0000000..f6a8c21 --- /dev/null +++ b/Clu Clu Land (JU)/copilot/chr.s @@ -0,0 +1,2 @@ +.segment "CHR" + .incbin "chr.bin" \ No newline at end of file diff --git a/Clu Clu Land (JU)/copilot/header.bin b/Clu Clu Land (JU)/copilot/header.bin new file mode 100644 index 0000000000000000000000000000000000000000..aee36c438eb06284501f97c9f7247d5d3193af17 GIT binary patch literal 16 PcmeZs4VGeLWPk$z4(^B@KRIdt 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 A5dZ)H literal 0 HcmV?d00001 diff --git a/Clu Clu Land (JU)/copilot/prg.s b/Clu Clu Land (JU)/copilot/prg.s new file mode 100644 index 0000000..14b8cb2 --- /dev/null +++ b/Clu Clu Land (JU)/copilot/prg.s @@ -0,0 +1,9150 @@ +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" + +;------------------------------------------------------------ +; Initial PRG data +; CPU $C000-$C195 +; PRG $0000-$0195 +; +; Pointer tables, title/credit text, resource descriptors, and +; startup lookup data. Boundaries below are conservative Pass-1 +; classifications; uncertain structures remain explicit bytes. +;------------------------------------------------------------ + +; Embedded developer credit: "T.SAWANO". +DeveloperCreditText: + .byte $54, $2E, $53, $41, $57, $41, $4E, $4F ; PRG:$0000 Bytes:54 2E 53 41 57 41 4E 4F + +; Pointers into the upper-PRG resource/script area. +ResourceScriptPointerTable: + .word $E75D, $E79A, $E7E1, $E826 ; PRG:$0008 Bytes:5D E7 9A E7 E1 E7 26 E8 + .word $E869, $E8A6, $E8DF, $E916 ; PRG:$0010 Bytes:69 E8 A6 E8 DF E8 16 E9 + .word $E949, $E988, $E9CD, $EA10 ; PRG:$0018 Bytes:49 E9 88 E9 CD E9 10 EA + .word $EA4F, $EA96, $EAE7, $EB32 ; PRG:$0020 Bytes:4F EA 96 EA E7 EA 32 EB + .word $EB7B, $EBB0, $EBE7, $EC1E ; PRG:$0028 Bytes:7B EB B0 EB E7 EB 1E EC + .word $EC56, $ECF3, $ED1E, $ED5E ; PRG:$0030 Bytes:56 EC F3 EC 1E ED 5E ED + .word $EDAF, $EE27, $EE90, $EF91 ; PRG:$0038 Bytes:AF ED 27 EE 90 EE 91 EF + .word $F117, $F11D ; PRG:$0040 Bytes:17 F1 1D F1 + +; Encoded title/message tile values; not ASCII text at runtime. +TitleOrMessageTileString: + .byte $28, $32, $33, $31, $34, $32, $30, $30, $29, $32, $29, $29, $31, $34, $34, $32 ; PRG:$0044 Bytes:28 32 33 31 34 32 30 30 29 32 29 29 31 34 34 32 + .byte $22, $24, $23, $24 ; PRG:$0054 Bytes:22 24 23 24 + +; Variable-length resource descriptor records. +ResourceDescriptorData_C058: + .byte $66, $00, $01, $20, $00, $07, $29, $F2, $06, $00, $28, $EF, $06, $00, $2A, $AF ; PRG:$0058 Bytes:66 00 01 20 00 07 29 F2 06 00 28 EF 06 00 2A AF + .byte $06, $00, $20, $54, $03, $00, $29, $B6, $02, $00, $29, $49, $03, $01, $2B, $09 ; PRG:$0068 Bytes:06 00 20 54 03 00 29 B6 02 00 29 49 03 01 2B 09 + .byte $03, $01, $20, $4D, $02, $00, $00, $01, $04, $0C, $07, $22, $10, $03, $00, $00 ; PRG:$0078 Bytes:03 01 20 4D 02 00 00 01 04 0C 07 22 10 03 00 00 + .byte $01, $04, $0C, $07, $29, $E8, $03, $00, $00, $01, $0C, $00, $07, $22, $CE, $06 ; PRG:$0088 Bytes:01 04 0C 07 29 E8 03 00 00 01 0C 00 07 22 CE 06 + .byte $00, $23, $06, $06, $00, $23, $13, $06, $00, $0F, $E4, $00, $18, $0F, $E5, $00 ; PRG:$0098 Bytes:00 23 06 06 00 23 13 06 00 0F E4 00 18 0F E5 00 + .byte $28, $0F, $E4, $01, $D0, $0F, $E5, $01, $E0, $FF, $FF, $FF ; PRG:$00A8 Bytes:28 0F E4 01 D0 0F E5 01 E0 FF FF FF + +; Small direction, coordinate, and signed-offset lookup tables. +DirectionAndCoordinateTables_C0B4: + .byte $FF, $00, $00, $00, $01, $A0, $80, $40, $00, $60, $80, $C0, $00, $64, $3C, $2C ; PRG:$00B4 Bytes:FF 00 00 00 01 A0 80 40 00 60 80 C0 00 64 3C 2C + .byte $1C, $44, $3C, $34, $2C, $80, $50, $30, $10, $40, $30, $20, $10, $02, $02, $04 ; PRG:$00C4 Bytes:1C 44 3C 34 2C 80 50 30 10 40 30 20 10 02 02 04 + .byte $04, $01, $01, $01, $01, $01, $02, $02, $02, $00, $80, $B8, $D8, $F4, $14, $34 ; PRG:$00D4 Bytes:04 01 01 01 01 01 02 02 02 00 80 B8 D8 F4 14 34 + .byte $54, $40, $02, $10, $00 ; PRG:$00E4 Bytes:54 40 02 10 00 + +; Startup object/template records and compact lookup data. +StartupObjectTemplateData_C0E9: + .byte $04, $01, $00, $00, $00, $00, $00, $04, $00, $00, $00, $22, $00, $05, $05, $0B ; PRG:$00E9 Bytes:04 01 00 00 00 00 00 04 00 00 00 22 00 05 05 0B + .byte $0B, $10, $06, $0C, $20, $04, $01, $00, $00, $00, $00, $00, $01, $EE, $00, $00 ; PRG:$00F9 Bytes:0B 10 06 0C 20 04 01 00 00 00 00 00 01 EE 00 00 + .byte $11, $10, $20, $08, $11, $00, $05, $01, $00, $00, $00, $00, $00, $02, $A0, $00 ; PRG:$0109 Bytes:11 10 20 08 11 00 05 01 00 00 00 00 00 02 A0 00 + .byte $03, $00, $68, $00, $00, $00, $00, $00, $20, $04, $11, $80, $04, $01, $00, $00 ; PRG:$0119 Bytes:03 00 68 00 00 00 00 00 20 04 11 80 04 01 00 00 + .byte $00, $00, $00, $04, $7C, $00, $03, $22, $28, $02, $02, $0E, $0E, $00, $00, $01 ; PRG:$0129 Bytes:00 00 00 04 7C 00 03 22 28 02 02 0E 0E 00 00 01 + .byte $06, $F6, $03, $08, $E6, $00, $02, $24, $E0, $20, $08, $11, $00, $06, $80, $00 ; PRG:$0139 Bytes:06 F6 03 08 E6 00 02 24 E0 20 08 11 00 06 80 00 + .byte $00, $00, $00, $00, $02, $D0, $00, $00, $21, $A8, $04, $00, $0C, $08, $00, $10 ; PRG:$0149 Bytes:00 00 00 00 02 D0 00 00 21 A8 04 00 0C 08 00 10 + .byte $04, $0D, $C0, $03, $01, $00, $00, $00, $00, $00, $02, $C8, $00, $03, $12, $C0 ; PRG:$0159 Bytes:04 0D C0 03 01 00 00 00 00 00 02 C8 00 03 12 C0 + .byte $00, $40, $02, $0C, $00, $04, $00, $30, $00, $2C, $00, $00, $06, $70, $00, $00 ; PRG:$0169 Bytes:00 40 02 0C 00 04 00 30 00 2C 00 00 06 70 00 00 + .byte $23, $68, $20, $02, $0A, $80, $04, $00, $4A, $00, $30, $00, $00, $04, $7C, $00 ; PRG:$0179 Bytes:23 68 20 02 0A 80 04 00 4A 00 30 00 00 04 7C 00 + .byte $03, $00, $01, $07, $E7, $00, $13, $2E, $24, $2F, $14, $0F, $30 ; PRG:$0189 Bytes:03 00 01 07 E7 00 13 2E 24 2F 14 0F 30 + +;------------------------------------------------------------ +; ResetEntry / IRQHandler +; +; Global: +; RESET and IRQ/BRK vector target. Initializes CPU, RAM, PPU, +; APU, startup resources, and enables NMI before entering the +; permanent main-program loop at $C1EB. +; +; Parameters: +; None. +; +; Returns: +; Never returns. +;------------------------------------------------------------ +ResetEntry: + CLD ; PRG:$0196 Bytes:D8 + LDA #$00 ; PRG:$0197 Bytes:A9 00 + STA PPUCTRL ; PRG:$0199 Bytes:8D 00 20 + SEI ; PRG:$019C Bytes:78 + LDX #$FF ; PRG:$019D Bytes:A2 FF + TXS ; PRG:$019F Bytes:9A + LDX #$02 ; PRG:$01A0 Bytes:A2 02 +InterruptPathLoop_C1A2: + LDA PPUSTATUS ; PRG:$01A2 Bytes:AD 02 20 + BPL InterruptPathLoop_C1A2 ; PRG:$01A5 Bytes:10 FB + DEX ; PRG:$01A7 Bytes:CA + BNE InterruptPathLoop_C1A2 ; PRG:$01A8 Bytes:D0 F8 + LDY #$24 ; PRG:$01AA Bytes:A0 24 + LDA StartupPreserveFlag0 ; PRG:$01AC Bytes:A5 48 + BNE InterruptPathOnNonZero_C1B4 ; PRG:$01AE Bytes:D0 04 + LDA StartupPreserveFlag1 ; PRG:$01B0 Bytes:A5 49 + BEQ InterruptPathOnZero_C1B6 ; PRG:$01B2 Bytes:F0 02 +InterruptPathOnNonZero_C1B4: + LDY #$18 ; PRG:$01B4 Bytes:A0 18 +InterruptPathOnZero_C1B6: + LDA #$00 ; PRG:$01B6 Bytes:A9 00 +InterruptPathLoop_C1B8: + STA $0000,Y ; PRG:$01B8 Bytes:99 00 00 + INY ; PRG:$01BB Bytes:C8 + BNE InterruptPathLoop_C1B8 ; PRG:$01BC Bytes:D0 FA + LDY #$07 ; PRG:$01BE Bytes:A0 07 + LDX #$06 ; PRG:$01C0 Bytes:A2 06 + JSR RunGameTaskRoutine_CBA6 ; PRG:$01C2 Bytes:20 A6 CB + LDA #$55 ; PRG:$01C5 Bytes:A9 55 + STA FrameShiftRegister0 ; PRG:$01C7 Bytes:85 10 + LDA #$12 ; PRG:$01C9 Bytes:A9 12 + STA PPUCTRL ; PRG:$01CB Bytes:8D 00 20 + STA ShadowPPUCTRL ; PRG:$01CE Bytes:85 40 + LDA #$06 ; PRG:$01D0 Bytes:A9 06 + STA PPUMASK ; PRG:$01D2 Bytes:8D 01 20 + STA ShadowPPUMASK ; PRG:$01D5 Bytes:85 41 + LDA #$0F ; PRG:$01D7 Bytes:A9 0F + STA APUSTATUS ; PRG:$01D9 Bytes:8D 15 40 + STA $0100 ; PRG:$01DC Bytes:8D 00 01 + JSR RunGameTaskRoutine_C3E4 ; PRG:$01DF Bytes:20 E4 C3 + LDA ShadowPPUCTRL ; PRG:$01E2 Bytes:A5 40 + ORA #$80 ; PRG:$01E4 Bytes:09 80 + STA ShadowPPUCTRL ; PRG:$01E6 Bytes:85 40 + STA PPUCTRL ; PRG:$01E8 Bytes:8D 00 20 +InterruptPathDispatch_C1EB: + JSR EnginePath_F58D ; PRG:$01EB Bytes:20 8D F5 + JMP InterruptPathDispatch_C1EB ; PRG:$01EE Bytes:4C EB C1 +;------------------------------------------------------------ +; NMIHandler +; +; Global: +; Saves A and $00, performs OAM DMA and frame services, +; restores PPU state, then returns with RTI. +; +; Parameters: +; None. +; +; Returns: +; RTI. +;------------------------------------------------------------ +NMIHandler: + PHA ; PRG:$01F1 Bytes:48 + LDA WorkPtr0Lo ; PRG:$01F2 Bytes:A5 00 + PHA ; PRG:$01F4 Bytes:48 + LDA ShadowPPUCTRL ; PRG:$01F5 Bytes:A5 40 + AND #$7F ; PRG:$01F7 Bytes:29 7F + STA ShadowPPUCTRL ; PRG:$01F9 Bytes:85 40 + STA PPUCTRL ; PRG:$01FB Bytes:8D 00 20 + LDA ShadowPPUMASK ; PRG:$01FE Bytes:A5 41 + AND #$E7 ; PRG:$0200 Bytes:29 E7 + STA ShadowPPUMASK ; PRG:$0202 Bytes:85 41 + STA PPUMASK ; PRG:$0204 Bytes:8D 01 20 + JSR UpdateGameStateRoutine_C996 ; PRG:$0207 Bytes:20 96 C9 + LDA #$00 ; PRG:$020A Bytes:A9 00 + STA OAMADDR ; PRG:$020C Bytes:8D 03 20 + LDA #$02 ; PRG:$020F Bytes:A9 02 + STA OAMDMA ; PRG:$0211 Bytes:8D 14 40 + JSR ResourceAndLevelData ; PRG:$0214 Bytes:20 0B F2 + JSR ObjectPath_E113 ; PRG:$0217 Bytes:20 13 E1 + LDA ShadowPPUCTRL ; PRG:$021A Bytes:A5 40 + STA PPUCTRL ; PRG:$021C Bytes:8D 00 20 + LDA ShadowPPUMASK ; PRG:$021F Bytes:A5 41 + ORA #$18 ; PRG:$0221 Bytes:09 18 + STA ShadowPPUMASK ; PRG:$0223 Bytes:85 41 + STA PPUMASK ; PRG:$0225 Bytes:8D 01 20 + JSR AudioDriverCode ; PRG:$0228 Bytes:20 C1 F7 + JSR EnginePath_F5AE ; PRG:$022B Bytes:20 AE F5 + JSR ObjectPath_DDC1 ; PRG:$022E Bytes:20 C1 DD + JSR RunGameTaskRoutine_C368 ; PRG:$0231 Bytes:20 68 C3 +NMIReadPPUStatus_C234: + LDA PPUSTATUS ; PRG:$0234 Bytes:AD 02 20 + LDA ShadowPPUCTRL ; PRG:$0237 Bytes:A5 40 + ORA #$80 ; PRG:$0239 Bytes:09 80 + STA ShadowPPUCTRL ; PRG:$023B Bytes:85 40 + STA PPUCTRL ; PRG:$023D Bytes:8D 00 20 + PLA ; PRG:$0240 Bytes:68 + STA WorkPtr0Lo ; PRG:$0241 Bytes:85 00 + PLA ; PRG:$0243 Bytes:68 + RTI ; PRG:$0244 Bytes:40 + +;------------------------------------------------------------ +; CoreGameCode +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +CoreGameCode: + JSR RunGameTaskRoutine_CBB9 ; PRG:$0245 Bytes:20 B9 CB + JSR ObjectPath_D34E ; PRG:$0248 Bytes:20 4E D3 + BCS ProcessCurrentObjectContinue_C264 ; PRG:$024B Bytes:B0 17 + JSR UpdateObjectRecord_D27D ; PRG:$024D Bytes:20 7D D2 + BCS ProcessCurrentObjectContinue_C264 ; PRG:$0250 Bytes:B0 12 + LDY #$00 ; PRG:$0252 Bytes:A0 00 + LDA (CurrentObjectPtrLo),Y ; PRG:$0254 Bytes:B1 08 + BNE ProcessCurrentObjectContinue_C264 ; PRG:$0256 Bytes:D0 0C + JSR ProcessCurrentObjectRoutine_CBE3 ; PRG:$0258 Bytes:20 E3 CB + JSR ReadObjectRecord_DADA ; PRG:$025B Bytes:20 DA DA + JSR ReadObjectRecord_CD7B ; PRG:$025E Bytes:20 7B CD + JSR ReadObjectRecord_D11E ; PRG:$0261 Bytes:20 1E D1 +ProcessCurrentObjectContinue_C264: + JSR ObjectPath_D06D ; PRG:$0264 Bytes:20 6D D0 + JSR RunGameTaskRoutine_CBC6 ; PRG:$0267 Bytes:20 C6 CB + JSR ObjectPath_D34E ; PRG:$026A Bytes:20 4E D3 + BCS CorePathContinue_C286 ; PRG:$026D Bytes:B0 17 + JSR UpdateObjectRecord_D27D ; PRG:$026F Bytes:20 7D D2 + BCS CorePathContinue_C286 ; PRG:$0272 Bytes:B0 12 + LDY #$00 ; PRG:$0274 Bytes:A0 00 + LDA (CurrentObjectPtrLo),Y ; PRG:$0276 Bytes:B1 08 + BNE CorePathContinue_C286 ; PRG:$0278 Bytes:D0 0C + JSR ProcessCurrentObjectRoutine_CBE3 ; PRG:$027A Bytes:20 E3 CB + JSR ReadObjectRecord_DADA ; PRG:$027D Bytes:20 DA DA + JSR ReadObjectRecord_CD7B ; PRG:$0280 Bytes:20 7B CD + JSR ReadObjectRecord_D11E ; PRG:$0283 Bytes:20 1E D1 +CorePathContinue_C286: + JSR ObjectPath_D08F ; PRG:$0286 Bytes:20 8F D0 + JSR ObjectPath_DD10 ; PRG:$0289 Bytes:20 10 DD + JSR ObjectPath_DC5A ; PRG:$028C Bytes:20 5A DC + JSR UpdateObjectBuffer_DB52 ; PRG:$028F Bytes:20 52 DB + JSR ObjectPath_D856 ; PRG:$0292 Bytes:20 56 D8 + JSR ObjectPath_D8BA ; PRG:$0295 Bytes:20 BA D8 + JSR UpdateObjectBuffer_D64F ; PRG:$0298 Bytes:20 4F D6 + JSR ObjectPath_D97B ; PRG:$029B Bytes:20 7B D9 + JSR UpdateObjectBuffer_D0C8 ; PRG:$029E Bytes:20 C8 D0 + JSR ObjectPath_CFA1 ; PRG:$02A1 Bytes:20 A1 CF + JSR ObjectPath_D0B1 ; PRG:$02A4 Bytes:20 B1 D0 + JSR ProcessObjectStateRoutine_E6F3 ; PRG:$02A7 Bytes:20 F3 E6 + JSR ObjectPath_DA91 ; PRG:$02AA Bytes:20 91 DA + JSR UpdateObjectBuffer_DBC7 ; PRG:$02AD Bytes:20 C7 DB + JSR ObjectPath_D0DF ; PRG:$02B0 Bytes:20 DF D0 + JSR ObjectPath_D1D6 ; PRG:$02B3 Bytes:20 D6 D1 + JSR UpdateObjectBuffer_DD8F ; PRG:$02B6 Bytes:20 8F DD + JSR UpdateObjectBuffer_D0F6 ; PRG:$02B9 Bytes:20 F6 D0 + JSR UpdateGameStateRoutine_C47A ; PRG:$02BC Bytes:20 7A C4 + JSR ObjectPath_D209 ; PRG:$02BF Bytes:20 09 D2 + RTS ; PRG:$02C2 Bytes:60 +CorePathLoop_C2C3: + JSR RunGameTaskRoutine_C84B ; PRG:$02C3 Bytes:20 4B C8 + LDA #$00 ; PRG:$02C6 Bytes:A9 00 + LDY #$1F ; PRG:$02C8 Bytes:A0 1F +CorePathLoop_C2CA: + STA a:$0080,Y ; PRG:$02CA Bytes:99 80 00 + DEY ; PRG:$02CD Bytes:88 + BPL CorePathLoop_C2CA ; PRG:$02CE Bytes:10 FA + STA RoundOrSubstate ; PRG:$02D0 Bytes:85 88 + LDX ContextIndex ; PRG:$02D2 Bytes:A6 4A +InitializePlayerAndGameState: + STX PreviousContextIndex ; PRG:$02D4 Bytes:86 87 + INX ; PRG:$02D6 Bytes:E8 + CPX #$05 ; PRG:$02D7 Bytes:E0 05 + BNE UpdateGameStateOnNonZero_C2DD ; PRG:$02D9 Bytes:D0 02 + LDX #$00 ; PRG:$02DB Bytes:A2 00 +UpdateGameStateOnNonZero_C2DD: + STX $4A ; PRG:$02DD Bytes:86 4A + LDA $87 ; PRG:$02DF Bytes:A5 87 + ASL A ; PRG:$02E1 Bytes:0A + ASL A ; PRG:$02E2 Bytes:0A + ORA $88 ; PRG:$02E3 Bytes:05 88 + STA $89 ; PRG:$02E5 Bytes:85 89 + LDA #$01 ; PRG:$02E7 Bytes:A9 01 + STA $4C ; PRG:$02E9 Bytes:85 4C + STA $8D ; PRG:$02EB Bytes:85 8D + STA $80 ; PRG:$02ED Bytes:85 80 + STA $81 ; PRG:$02EF Bytes:85 81 +UpdateGameStateDispatch_C2F1: + STA $8A ; PRG:$02F1 Bytes:85 8A + LDA #$02 ; PRG:$02F3 Bytes:A9 02 + STA $8B ; PRG:$02F5 Bytes:85 8B + RTS ; PRG:$02F7 Bytes:60 +CorePathLoop_C2F8: + LDA $7D ; PRG:$02F8 Bytes:A5 7D + BEQ CorePathLoop_C2C3 ; PRG:$02FA Bytes:F0 C7 + LDA $44 ; PRG:$02FC Bytes:A5 44 + AND #$20 ; PRG:$02FE Bytes:29 20 + BEQ UpdatePlayerStateContinue_C310 ; PRG:$0300 Bytes:F0 0E + LDA $4F ; PRG:$0302 Bytes:A5 4F + BNE UpdatePlayerStateContinue_C310 ; PRG:$0304 Bytes:D0 0A + LDA $4B ; PRG:$0306 Bytes:A5 4B + EOR #$01 ; PRG:$0308 Bytes:49 01 + STA $4B ; PRG:$030A Bytes:85 4B + LDA #$40 ; PRG:$030C Bytes:A9 40 + STA $7D ; PRG:$030E Bytes:85 7D +UpdatePlayerStateContinue_C310: + STA $4F ; PRG:$0310 Bytes:85 4F + LDA #$90 ; PRG:$0312 Bytes:A9 90 + LDX $4B ; PRG:$0314 Bytes:A6 4B + STX $4C ; PRG:$0316 Bytes:86 4C + BEQ CorePathOnZero_C31C ; PRG:$0318 Bytes:F0 02 + LDA #$A0 ; PRG:$031A Bytes:A9 A0 +CorePathOnZero_C31C: + STA $0200 ; PRG:$031C Bytes:8D 00 02 + LDA #$E5 ; PRG:$031F Bytes:A9 E5 + STA $0201 ; PRG:$0321 Bytes:8D 01 02 + LDA #$00 ; PRG:$0324 Bytes:A9 00 + STA $0202 ; PRG:$0326 Bytes:8D 02 02 + LDA #$40 ; PRG:$0329 Bytes:A9 40 + STA $0203 ; PRG:$032B Bytes:8D 03 02 + LDA $44 ; PRG:$032E Bytes:A5 44 + AND #$10 ; PRG:$0330 Bytes:29 10 + BEQ CorePathContinue_C365 ; PRG:$0332 Bytes:F0 31 + LDA $4E ; PRG:$0334 Bytes:A5 4E + BNE CorePathContinue_C365 ; PRG:$0336 Bytes:D0 2D + LDY #$1B ; PRG:$0338 Bytes:A0 1B +CorePathLoop_C33A: + STA a:$0024,Y ; PRG:$033A Bytes:99 24 00 + DEY ; PRG:$033D Bytes:88 + BPL CorePathLoop_C33A ; PRG:$033E Bytes:10 FA + LDY #$1F ; PRG:$0340 Bytes:A0 1F +UpdatePlayerStateLoop_C342: + STA a:$0080,Y ; PRG:$0342 Bytes:99 80 00 + DEY ; PRG:$0345 Bytes:88 + BPL UpdatePlayerStateLoop_C342 ; PRG:$0346 Bytes:10 FA + JSR RunGameTaskRoutine_C84B ; PRG:$0348 Bytes:20 4B C8 + LDA #$05 ; PRG:$034B Bytes:A9 05 + STA $80 ; PRG:$034D Bytes:85 80 + LDX $4C ; PRG:$034F Bytes:A6 4C + BNE UpdateGameStateOnNonZero_C359 ; PRG:$0351 Bytes:D0 06 + LDX #$01 ; PRG:$0353 Bytes:A2 01 + STX $91 ; PRG:$0355 Bytes:86 91 + LDA #$00 ; PRG:$0357 Bytes:A9 00 +UpdateGameStateOnNonZero_C359: + STA $81 ; PRG:$0359 Bytes:85 81 + LDA #$02 ; PRG:$035B Bytes:A9 02 + STA $8B ; PRG:$035D Bytes:85 8B + LDA #$01 ; PRG:$035F Bytes:A9 01 + STA $8A ; PRG:$0361 Bytes:85 8A + STA $33 ; PRG:$0363 Bytes:85 33 +CorePathContinue_C365: + STA $4E ; PRG:$0365 Bytes:85 4E + RTS ; PRG:$0367 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_C368 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C368: + LDA $92 ; PRG:$0368 Bytes:A5 92 + BNE CorePathOnNonZero_C3CD ; PRG:$036A Bytes:D0 61 + LDA $B0 ; PRG:$036C Bytes:A5 B0 + BNE UpdateGameStateOnNonZero_C373 ; PRG:$036E Bytes:D0 03 + JSR ProcessResourceStateRoutine_F577 ; PRG:$0370 Bytes:20 77 F5 +UpdateGameStateOnNonZero_C373: + LDA $8A ; PRG:$0373 Bytes:A5 8A + BEQ CorePathLoop_C2F8 ; PRG:$0375 Bytes:F0 81 + LDA $8D ; PRG:$0377 Bytes:A5 8D + BEQ CorePathOnZero_C38D ; PRG:$0379 Bytes:F0 12 + LDA $90 ; PRG:$037B Bytes:A5 90 + CMP #$01 ; PRG:$037D Bytes:C9 01 + BNE CorePathOnNonZero_C387 ; PRG:$037F Bytes:D0 06 + LDA $91 ; PRG:$0381 Bytes:A5 91 + CMP #$01 ; PRG:$0383 Bytes:C9 01 + BEQ RunGameTaskRoutine_C3E4 ; PRG:$0385 Bytes:F0 5D +CorePathOnNonZero_C387: + LDA $44 ; PRG:$0387 Bytes:A5 44 + AND #$30 ; PRG:$0389 Bytes:29 30 + BNE RunGameTaskRoutine_C3E4 ; PRG:$038B Bytes:D0 57 +CorePathOnZero_C38D: + LDA $44 ; PRG:$038D Bytes:A5 44 + AND #$10 ; PRG:$038F Bytes:29 10 + BEQ UpdateGameStateContinue_C3A9 ; PRG:$0391 Bytes:F0 16 + LDA $4E ; PRG:$0393 Bytes:A5 4E + BNE UpdateGameStateContinue_C3A9 ; PRG:$0395 Bytes:D0 12 + LDA #$01 ; PRG:$0397 Bytes:A9 01 + EOR $B0 ; PRG:$0399 Bytes:45 B0 + STA $B0 ; PRG:$039B Bytes:85 B0 + BNE CorePathOnNonZero_C3A3 ; PRG:$039D Bytes:D0 04 + LDA #$06 ; PRG:$039F Bytes:A9 06 + STA $92 ; PRG:$03A1 Bytes:85 92 +CorePathOnNonZero_C3A3: + LDA #$20 ; PRG:$03A3 Bytes:A9 20 + STA $FB ; PRG:$03A5 Bytes:85 FB + LDA #$01 ; PRG:$03A7 Bytes:A9 01 +UpdateGameStateContinue_C3A9: + STA $4E ; PRG:$03A9 Bytes:85 4E + LDA $92 ; PRG:$03AB Bytes:A5 92 + BNE CorePathLoop_C3CC ; PRG:$03AD Bytes:D0 1D + LDA $B0 ; PRG:$03AF Bytes:A5 B0 + BNE CorePathLoop_C3CC ; PRG:$03B1 Bytes:D0 19 + LDA $8A ; PRG:$03B3 Bytes:A5 8A + CMP #$02 ; PRG:$03B5 Bytes:C9 02 + BEQ CorePathOnZero_C3E0 ; PRG:$03B7 Bytes:F0 27 + JSR CoreGameCode ; PRG:$03B9 Bytes:20 45 C2 +;------------------------------------------------------------ +; UpdateGameStateRoutine_C3BC +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateGameStateRoutine_C3BC: + LDA $8D ; PRG:$03BC Bytes:A5 8D + BEQ CorePathLoop_C3CC ; PRG:$03BE Bytes:F0 0C + LDA #$00 ; PRG:$03C0 Bytes:A9 00 + STA $FB ; PRG:$03C2 Bytes:85 FB + STA $FC ; PRG:$03C4 Bytes:85 FC + STA $FD ; PRG:$03C6 Bytes:85 FD + STA $FE ; PRG:$03C8 Bytes:85 FE + STA $FF ; PRG:$03CA Bytes:85 FF +CorePathLoop_C3CC: + RTS ; PRG:$03CC Bytes:60 +CorePathOnNonZero_C3CD: + CMP #$01 ; PRG:$03CD Bytes:C9 01 + BEQ CorePathOnZero_C400 ; PRG:$03CF Bytes:F0 2F + DEC $93 ; PRG:$03D1 Bytes:C6 93 + BPL CorePathContinue_C3DF ; PRG:$03D3 Bytes:10 0A + LDA #$0A ; PRG:$03D5 Bytes:A9 0A + STA $93 ; PRG:$03D7 Bytes:85 93 + LDA $92 ; PRG:$03D9 Bytes:A5 92 + BEQ CorePathContinue_C3DF ; PRG:$03DB Bytes:F0 02 + DEC $92 ; PRG:$03DD Bytes:C6 92 +CorePathContinue_C3DF: + RTS ; PRG:$03DF Bytes:60 +CorePathOnZero_C3E0: + JSR RunGameTaskRoutine_C6BE ; PRG:$03E0 Bytes:20 BE C6 + RTS ; PRG:$03E3 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_C3E4 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C3E4: + LDX $4D ; PRG:$03E4 Bytes:A6 4D + BNE CorePathOnNonZero_C3EE ; PRG:$03E6 Bytes:D0 06 + LDA #$01 ; PRG:$03E8 Bytes:A9 01 + STA $FB ; PRG:$03EA Bytes:85 FB + LDX #$04 ; PRG:$03EC Bytes:A2 04 +CorePathOnNonZero_C3EE: + DEX ; PRG:$03EE Bytes:CA + STX $4D ; PRG:$03EF Bytes:86 4D + LDA #$40 ; PRG:$03F1 Bytes:A9 40 + STA $7D ; PRG:$03F3 Bytes:85 7D + LDA #$01 ; PRG:$03F5 Bytes:A9 01 + STA $4F ; PRG:$03F7 Bytes:85 4F + STA $4E ; PRG:$03F9 Bytes:85 4E + LDA #$00 ; PRG:$03FB Bytes:A9 00 + JMP UpdateGameStateDispatch_C2F1 ; PRG:$03FD Bytes:4C F1 C2 +CorePathOnZero_C400: + DEC $92 ; PRG:$0400 Bytes:C6 92 +;------------------------------------------------------------ +; UpdateGameStateRoutine_C402 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateGameStateRoutine_C402: + LDA $8A ; PRG:$0402 Bytes:A5 8A + CMP #$01 ; PRG:$0404 Bytes:C9 01 + BNE CorePathLoop_C3CC ; PRG:$0406 Bytes:D0 C4 + LDA $78 ; PRG:$0408 Bytes:A5 78 + BNE CorePathLoop_C3CC ; PRG:$040A Bytes:D0 C0 + LDX #$10 ; PRG:$040C Bytes:A2 10 + LDA $8F ; PRG:$040E Bytes:A5 8F + BNE CorePathContinue_C41C ; PRG:$0410 Bytes:D0 0A + LDX #$08 ; PRG:$0412 Bytes:A2 08 + LDA $2E ; PRG:$0414 Bytes:A5 2E + CMP #$02 ; PRG:$0416 Bytes:C9 02 + BCC CorePathContinue_C41C ; PRG:$0418 Bytes:90 02 + LDX #$04 ; PRG:$041A Bytes:A2 04 +CorePathContinue_C41C: + STX $FB ; PRG:$041C Bytes:86 FB + JMP UpdateGameStateRoutine_C3BC ; PRG:$041E Bytes:4C BC C3 +CorePathLoop_C421: + LDA $55 ; PRG:$0421 Bytes:A5 55 + BNE CorePathOnNonZero_C437 ; PRG:$0423 Bytes:D0 12 + LDA #$04 ; PRG:$0425 Bytes:A9 04 + STA $55 ; PRG:$0427 Bytes:85 55 + LDA #$01 ; PRG:$0429 Bytes:A9 01 + EOR $A7 ; PRG:$042B Bytes:45 A7 + STA $A7 ; PRG:$042D Bytes:85 A7 + BEQ CorePathLoop_C432 ; PRG:$042F Bytes:F0 01 + INY ; PRG:$0431 Bytes:C8 +CorePathLoop_C432: + LDX #$08 ; PRG:$0432 Bytes:A2 08 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$0434 Bytes:20 AE D1 +CorePathOnNonZero_C437: + RTS ; PRG:$0437 Bytes:60 +CorePathLoop_C438: + LDX #$01 ; PRG:$0438 Bytes:A2 01 +UpdatePlayerStateLoop_C43A: + LDA $90,X ; PRG:$043A Bytes:B5 90 + CMP #$02 ; PRG:$043C Bytes:C9 02 + BCS CorePathOnCarry_C475 ; PRG:$043E Bytes:B0 35 + DEX ; PRG:$0440 Bytes:CA + BPL UpdatePlayerStateLoop_C43A ; PRG:$0441 Bytes:10 F7 + LDX $43 ; PRG:$0443 Bytes:A6 43 + LDA $40 ; PRG:$0445 Bytes:A5 40 + AND #$02 ; PRG:$0447 Bytes:29 02 + BEQ CorePathOnZero_C45A ; PRG:$0449 Bytes:F0 0F + LDA $40 ; PRG:$044B Bytes:A5 40 + AND #$FD ; PRG:$044D Bytes:29 FD + STA $40 ; PRG:$044F Bytes:85 40 + LDY #$14 ; PRG:$0451 Bytes:A0 14 + LDX #$0C ; PRG:$0453 Bytes:A2 0C + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$0455 Bytes:20 AE D1 + LDX #$FF ; PRG:$0458 Bytes:A2 FF +CorePathOnZero_C45A: + INX ; PRG:$045A Bytes:E8 + INX ; PRG:$045B Bytes:E8 + INX ; PRG:$045C Bytes:E8 + CPX #$F2 ; PRG:$045D Bytes:E0 F2 + BEQ RunGameTaskRoutine_C463 ; PRG:$045F Bytes:F0 02 + STX $43 ; PRG:$0461 Bytes:86 43 +;------------------------------------------------------------ +; RunGameTaskRoutine_C463 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C463: + LDY #$1F ; PRG:$0463 Bytes:A0 1F + LDA #$F4 ; PRG:$0465 Bytes:A9 F4 +CorePathLoop_C467: + STA $02E0,Y ; PRG:$0467 Bytes:99 E0 02 + DEY ; PRG:$046A Bytes:88 + BPL CorePathLoop_C467 ; PRG:$046B Bytes:10 FA + RTS ; PRG:$046D Bytes:60 +CorePathLoop_C46E: + JSR UpdatePlayerStateRoutine_C504 ; PRG:$046E Bytes:20 04 C5 + JSR ProcessObjectStateRoutine_DA26 ; PRG:$0471 Bytes:20 26 DA + RTS ; PRG:$0474 Bytes:60 +CorePathOnCarry_C475: + LDA #$0A ; PRG:$0475 Bytes:A9 0A + STA $78 ; PRG:$0477 Bytes:85 78 + RTS ; PRG:$0479 Bytes:60 +;------------------------------------------------------------ +; UpdateGameStateRoutine_C47A +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateGameStateRoutine_C47A: + JSR ProcessObjectStateRoutine_D1CE ; PRG:$047A Bytes:20 CE D1 + LDA $78 ; PRG:$047D Bytes:A5 78 + BEQ CorePathLoop_C46E ; PRG:$047F Bytes:F0 ED + CMP #$22 ; PRG:$0481 Bytes:C9 22 + BCS CorePathLoop_C4B3 ; PRG:$0483 Bytes:B0 2E + CMP #$0B ; PRG:$0485 Bytes:C9 0B + BEQ CorePathLoop_C432 ; PRG:$0487 Bytes:F0 A9 + BCS CorePathLoop_C421 ; PRG:$0489 Bytes:B0 96 + CMP #$01 ; PRG:$048B Bytes:C9 01 + BNE CorePathLoop_C438 ; PRG:$048D Bytes:D0 A9 + DEC $78 ; PRG:$048F Bytes:C6 78 + LDA #$02 ; PRG:$0491 Bytes:A9 02 + STA $8A ; PRG:$0493 Bytes:85 8A + LDA #$00 ; PRG:$0495 Bytes:A9 00 + STA $76 ; PRG:$0497 Bytes:85 76 + STA $D0 ; PRG:$0499 Bytes:85 D0 + STA $D1 ; PRG:$049B Bytes:85 D1 + LDA $90 ; PRG:$049D Bytes:A5 90 + BNE UpdatePlayerStateOnNonZero_C4A3 ; PRG:$049F Bytes:D0 02 + INC $80 ; PRG:$04A1 Bytes:E6 80 +UpdatePlayerStateOnNonZero_C4A3: + LDA $91 ; PRG:$04A3 Bytes:A5 91 + BNE CorePathOnNonZero_C4A9 ; PRG:$04A5 Bytes:D0 02 + INC $81 ; PRG:$04A7 Bytes:E6 81 +CorePathOnNonZero_C4A9: + LDA #$87 ; PRG:$04A9 Bytes:A9 87 + LDX #$C0 ; PRG:$04AB Bytes:A2 C0 + JSR ProcessResourceStateRoutine_F77D ; PRG:$04AD Bytes:20 7D F7 + JMP ProcessObjectStateDispatch_DD48 ; PRG:$04B0 Bytes:4C 48 DD +CorePathLoop_C4B3: + LDA #$21 ; PRG:$04B3 Bytes:A9 21 + LDX $AF ; PRG:$04B5 Bytes:A6 AF + BEQ CorePathOnZero_C4BF ; PRG:$04B7 Bytes:F0 06 + LDA #$FF ; PRG:$04B9 Bytes:A9 FF + STA $55 ; PRG:$04BB Bytes:85 55 + LDA #$17 ; PRG:$04BD Bytes:A9 17 +CorePathOnZero_C4BF: + STA $78 ; PRG:$04BF Bytes:85 78 + LDA #$F0 ; PRG:$04C1 Bytes:A9 F0 +CorePathLoop_C4C3: + TAY ; PRG:$04C3 Bytes:A8 + LDA #$01 ; PRG:$04C4 Bytes:A9 01 + STA $03F0,Y ; PRG:$04C6 Bytes:99 F0 03 + TYA ; PRG:$04C9 Bytes:98 + SEC ; PRG:$04CA Bytes:38 + SBC #$10 ; PRG:$04CB Bytes:E9 10 + BNE CorePathLoop_C4C3 ; PRG:$04CD Bytes:D0 F4 + LDA #$F0 ; PRG:$04CF Bytes:A9 F0 +CorePathLoop_C4D1: + TAY ; PRG:$04D1 Bytes:A8 + LDA #$00 ; PRG:$04D2 Bytes:A9 00 + STA $0600,Y ; PRG:$04D4 Bytes:99 00 06 + LDX $05F0,Y ; PRG:$04D7 Bytes:BE F0 05 + BNE CorePathOnNonZero_C4E1 ; PRG:$04DA Bytes:D0 05 + LDA #$01 ; PRG:$04DC Bytes:A9 01 + STA $05F0,Y ; PRG:$04DE Bytes:99 F0 05 +CorePathOnNonZero_C4E1: + TYA ; PRG:$04E1 Bytes:98 + SEC ; PRG:$04E2 Bytes:38 + SBC #$20 ; PRG:$04E3 Bytes:E9 20 + CMP #$F0 ; PRG:$04E5 Bytes:C9 F0 + BNE CorePathLoop_C4D1 ; PRG:$04E7 Bytes:D0 E8 + LDA #$80 ; PRG:$04E9 Bytes:A9 80 +CorePathLoop_C4EB: + TAY ; PRG:$04EB Bytes:A8 + LDA #$00 ; PRG:$04EC Bytes:A9 00 + STA $0470,Y ; PRG:$04EE Bytes:99 70 04 + TYA ; PRG:$04F1 Bytes:98 + SEC ; PRG:$04F2 Bytes:38 + SBC #$20 ; PRG:$04F3 Bytes:E9 20 + BNE CorePathLoop_C4EB ; PRG:$04F5 Bytes:D0 F4 + LDA #$40 ; PRG:$04F7 Bytes:A9 40 + STA $FB ; PRG:$04F9 Bytes:85 FB + JSR RunGameTaskRoutine_C7F3 ; PRG:$04FB Bytes:20 F3 C7 + LDA #$83 ; PRG:$04FE Bytes:A9 83 + JSR ProcessResourceStateRoutine_F31A ; PRG:$0500 Bytes:20 1A F3 + RTS ; PRG:$0503 Bytes:60 +;------------------------------------------------------------ +; UpdatePlayerStateRoutine_C504 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdatePlayerStateRoutine_C504: + LDA $90 ; PRG:$0504 Bytes:A5 90 + CMP #$01 ; PRG:$0506 Bytes:C9 01 + BNE CorePathOnNonZero_C51A ; PRG:$0508 Bytes:D0 10 + LDA $91 ; PRG:$050A Bytes:A5 91 + CMP #$01 ; PRG:$050C Bytes:C9 01 + BNE CorePathOnNonZero_C51A ; PRG:$050E Bytes:D0 0A + LDA #$01 ; PRG:$0510 Bytes:A9 01 + STA $AF ; PRG:$0512 Bytes:85 AF + LDA #$23 ; PRG:$0514 Bytes:A9 23 + STA $78 ; PRG:$0516 Bytes:85 78 + BNE CorePathLoop_C4B3 ; PRG:$0518 Bytes:D0 99 +CorePathOnNonZero_C51A: + RTS ; PRG:$051A Bytes:60 + .byte $12, $F5, $F6, $1C, $0B, $18, $17, $1E, $1C, $24, $24, $02, $00, $00, $00, $AD ; PRG:$051B Bytes:12 F5 F6 1C 0B 18 17 1E 1C 24 24 02 00 00 00 AD + .byte $29, $2B, $1D, $19, $0E, $1B, $0F, $0E, $0C, $1D, $24, $03, $00, $00, $00, $AD ; PRG:$052B Bytes:29 2B 1D 19 0E 1B 0F 0E 0C 1D 24 03 00 00 00 AD +RunGameTaskDispatch_C53B: + LDA $3F ; PRG:$053B Bytes:A5 3F + BNE CorePathOnNonZero_C581 ; PRG:$053D Bytes:D0 42 + LDA #$01 ; PRG:$053F Bytes:A9 01 + STA $0F ; PRG:$0541 Bytes:85 0F + LDA #$2A ; PRG:$0543 Bytes:A9 2A + LDX #$EE ; PRG:$0545 Bytes:A2 EE +UpdatePlayerStateLoop_C547: + STX $00 ; PRG:$0547 Bytes:86 00 + STA $01 ; PRG:$0549 Bytes:85 01 + LDX $0F ; PRG:$054B Bytes:A6 0F + LDA $90,X ; PRG:$054D Bytes:B5 90 + CMP #$01 ; PRG:$054F Bytes:C9 01 + BEQ CorePathOnZero_C56B ; PRG:$0551 Bytes:F0 18 + LDA #$2D ; PRG:$0553 Bytes:A9 2D + STA $02 ; PRG:$0555 Bytes:85 02 + LDA #$C5 ; PRG:$0557 Bytes:A9 C5 + STA $03 ; PRG:$0559 Bytes:85 03 + JSR UpdateCommandBufferRoutine_F3A1 ; PRG:$055B Bytes:20 A1 F3 + LDA $0F ; PRG:$055E Bytes:A5 0F + ORA #$80 ; PRG:$0560 Bytes:09 80 + STA $01 ; PRG:$0562 Bytes:85 01 + LDA #$30 ; PRG:$0564 Bytes:A9 30 + STA $00 ; PRG:$0566 Bytes:85 00 + JSR ProcessResourceStateRoutine_F40C ; PRG:$0568 Bytes:20 0C F4 +CorePathOnZero_C56B: + LDA #$29 ; PRG:$056B Bytes:A9 29 + LDX #$2E ; PRG:$056D Bytes:A2 2E + DEC $0F ; PRG:$056F Bytes:C6 0F + BPL UpdatePlayerStateLoop_C547 ; PRG:$0571 Bytes:10 D4 + JSR RunGameTaskRoutine_C7EF ; PRG:$0573 Bytes:20 EF C7 + LDA #$02 ; PRG:$0576 Bytes:A9 02 + STA $FE ; PRG:$0578 Bytes:85 FE + JSR RunGameTaskRoutine_C809 ; PRG:$057A Bytes:20 09 C8 + INC $AC ; PRG:$057D Bytes:E6 AC + LDA #$18 ; PRG:$057F Bytes:A9 18 +CorePathOnNonZero_C581: + JMP RunGameTaskDispatch_C7EA ; PRG:$0581 Bytes:4C EA C7 +CorePathLoop_C584: + LDA $A1 ; PRG:$0584 Bytes:A5 A1 + BNE CorePathContinue_C5C5 ; PRG:$0586 Bytes:D0 3D + LDA $2E ; PRG:$0588 Bytes:A5 2E + BNE CorePathOnNonZero_C590 ; PRG:$058A Bytes:D0 04 + LDA $2F ; PRG:$058C Bytes:A5 2F + BEQ CorePathContinue_C5C5 ; PRG:$058E Bytes:F0 35 +CorePathOnNonZero_C590: + LDA #$01 ; PRG:$0590 Bytes:A9 01 + STA $0F ; PRG:$0592 Bytes:85 0F +UpdatePlayerStateLoop_C594: + LDA #$10 ; PRG:$0594 Bytes:A9 10 + STA $00 ; PRG:$0596 Bytes:85 00 + LDX $0F ; PRG:$0598 Bytes:A6 0F + LDA $90,X ; PRG:$059A Bytes:B5 90 + CMP #$01 ; PRG:$059C Bytes:C9 01 + BEQ CorePathOnZero_C5A5 ; PRG:$059E Bytes:F0 05 + STX $01 ; PRG:$05A0 Bytes:86 01 + JSR ProcessResourceStateRoutine_F40C ; PRG:$05A2 Bytes:20 0C F4 +CorePathOnZero_C5A5: + DEC $0F ; PRG:$05A5 Bytes:C6 0F + BPL UpdatePlayerStateLoop_C594 ; PRG:$05A7 Bytes:10 EB + JSR RunGameTaskRoutine_C7EF ; PRG:$05A9 Bytes:20 EF C7 + LDA #$10 ; PRG:$05AC Bytes:A9 10 + STA $00 ; PRG:$05AE Bytes:85 00 + LDA #$02 ; PRG:$05B0 Bytes:A9 02 + STA $01 ; PRG:$05B2 Bytes:85 01 + JSR ProcessResourceStateRoutine_F408 ; PRG:$05B4 Bytes:20 08 F4 + LDA $2F ; PRG:$05B7 Bytes:A5 2F + AND #$F0 ; PRG:$05B9 Bytes:29 F0 + STA $2F ; PRG:$05BB Bytes:85 2F + LDA #$82 ; PRG:$05BD Bytes:A9 82 + JSR ProcessResourceStateRoutine_F31A ; PRG:$05BF Bytes:20 1A F3 + JMP RunGameTaskRoutine_C809 ; PRG:$05C2 Bytes:4C 09 C8 +CorePathContinue_C5C5: + JMP RunGameTaskDispatch_C7E5 ; PRG:$05C5 Bytes:4C E5 C7 +CorePathLoop_C5C8: + JMP RunGameTaskDispatch_C53B ; PRG:$05C8 Bytes:4C 3B C5 +CorePathLoop_C5CB: + LDA $8F ; PRG:$05CB Bytes:A5 8F + BNE CorePathLoop_C5C8 ; PRG:$05CD Bytes:D0 F9 + LDA #$7B ; PRG:$05CF Bytes:A9 7B + LDX #$C1 ; PRG:$05D1 Bytes:A2 C1 + JSR ProcessResourceStateRoutine_F77D ; PRG:$05D3 Bytes:20 7D F7 + LDA #$BA ; PRG:$05D6 Bytes:A9 BA + STA $04A1 ; PRG:$05D8 Bytes:8D A1 04 + LDX $4C ; PRG:$05DB Bytes:A6 4C + BNE CorePathOnNonZero_C5E4 ; PRG:$05DD Bytes:D0 05 + LDX #$01 ; PRG:$05DF Bytes:A2 01 + STX $04A0 ; PRG:$05E1 Bytes:8E A0 04 +CorePathOnNonZero_C5E4: + JSR RunGameTaskRoutine_C81A ; PRG:$05E4 Bytes:20 1A C8 + LDA #$20 ; PRG:$05E7 Bytes:A9 20 + JMP RunGameTaskDispatch_C7EA ; PRG:$05E9 Bytes:4C EA C7 +UpdatePlayerStateDispatch_C5EC: + LDA $AF ; PRG:$05EC Bytes:A5 AF + BEQ CorePathLoop_C584 ; PRG:$05EE Bytes:F0 94 + LDA #$90 ; PRG:$05F0 Bytes:A9 90 +RunGameTaskDispatch_C5F2: + STA $51 ; PRG:$05F2 Bytes:85 51 + INC $AC ; PRG:$05F4 Bytes:E6 AC + RTS ; PRG:$05F6 Bytes:60 +RunGameTaskDispatch_C5F7: + LDA $D6 ; PRG:$05F7 Bytes:A5 D6 + BNE CorePathOnNonZero_C5FF ; PRG:$05F9 Bytes:D0 04 + LDA $D7 ; PRG:$05FB Bytes:A5 D7 + BEQ CorePathOnZero_C61E ; PRG:$05FD Bytes:F0 1F +CorePathOnNonZero_C5FF: + LDX #$01 ; PRG:$05FF Bytes:A2 01 +CorePathLoop_C601: + STX $0F ; PRG:$0601 Bytes:86 0F + LDA $D6,X ; PRG:$0603 Bytes:B5 D6 + BEQ CorePathOnZero_C60E ; PRG:$0605 Bytes:F0 07 + DEC $D6,X ; PRG:$0607 Bytes:D6 D6 + LDA #$05 ; PRG:$0609 Bytes:A9 05 + JSR RunGameTaskRoutine_C830 ; PRG:$060B Bytes:20 30 C8 +CorePathOnZero_C60E: + LDX $0F ; PRG:$060E Bytes:A6 0F + DEX ; PRG:$0610 Bytes:CA + BPL CorePathLoop_C601 ; PRG:$0611 Bytes:10 EE + JSR RunGameTaskRoutine_C7EF ; PRG:$0613 Bytes:20 EF C7 + JSR RunGameTaskRoutine_C824 ; PRG:$0616 Bytes:20 24 C8 + LDA #$18 ; PRG:$0619 Bytes:A9 18 + JMP RunGameTaskDispatch_C80B ; PRG:$061B Bytes:4C 0B C8 +CorePathOnZero_C61E: + JMP RunGameTaskDispatch_C7E5 ; PRG:$061E Bytes:4C E5 C7 +RunGameTaskDispatch_C621: + LDA $AF ; PRG:$0621 Bytes:A5 AF + BEQ CorePathLoop_C5CB ; PRG:$0623 Bytes:F0 A6 + JSR RunGameTaskRoutine_C809 ; PRG:$0625 Bytes:20 09 C8 + LDA #$FF ; PRG:$0628 Bytes:A9 FF + JMP RunGameTaskDispatch_C5F2 ; PRG:$062A Bytes:4C F2 C5 +RunGameTaskDispatch_C62D: + LDA #$82 ; PRG:$062D Bytes:A9 82 + JSR ProcessResourceStateRoutine_F31A ; PRG:$062F Bytes:20 1A F3 + LDA #$6A ; PRG:$0632 Bytes:A9 6A + LDX #$C1 ; PRG:$0634 Bytes:A2 C1 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0636 Bytes:20 7D F7 + LDA #$A0 ; PRG:$0639 Bytes:A9 A0 + STA $0441 ; PRG:$063B Bytes:8D 41 04 + LDA #$01 ; PRG:$063E Bytes:A9 01 + STA $0449 ; PRG:$0640 Bytes:8D 49 04 + LDA #$C0 ; PRG:$0643 Bytes:A9 C0 + STA $044B ; PRG:$0645 Bytes:8D 4B 04 + LDX #$00 ; PRG:$0648 Bytes:A2 00 + JSR ProcessObjectStateRoutine_D44A ; PRG:$064A Bytes:20 4A D4 + LDX $4C ; PRG:$064D Bytes:A6 4C + BEQ CorePathOnZero_C682 ; PRG:$064F Bytes:F0 31 + JSR ProcessObjectStateRoutine_D44A ; PRG:$0651 Bytes:20 4A D4 +CorePathLoop_C654: + LDX #$00 ; PRG:$0654 Bytes:A2 00 + LDA $4C ; PRG:$0656 Bytes:A5 4C + BEQ CorePathOnZero_C670 ; PRG:$0658 Bytes:F0 16 + LDA $D5 ; PRG:$065A Bytes:A5 D5 + BMI CorePathLoop_C66A ; PRG:$065C Bytes:30 0C + SEC ; PRG:$065E Bytes:38 + LDY $D4 ; PRG:$065F Bytes:A4 D4 + BMI CorePathOnNegative_C667 ; PRG:$0661 Bytes:30 04 + CMP $D4 ; PRG:$0663 Bytes:C5 D4 + BEQ CorePathLoop_C66B ; PRG:$0665 Bytes:F0 04 +CorePathOnNegative_C667: + INX ; PRG:$0667 Bytes:E8 + BCC CorePathLoop_C66B ; PRG:$0668 Bytes:90 01 +CorePathLoop_C66A: + INX ; PRG:$066A Bytes:E8 +CorePathLoop_C66B: + STX $AE ; PRG:$066B Bytes:86 AE + JMP RunGameTaskDispatch_C7E8 ; PRG:$066D Bytes:4C E8 C7 +CorePathOnZero_C670: + LDA $2E ; PRG:$0670 Bytes:A5 2E + CMP $A8 ; PRG:$0672 Bytes:C5 A8 + BCS CorePathLoop_C66A ; PRG:$0674 Bytes:B0 F4 + BCC CorePathLoop_C66B ; PRG:$0676 Bytes:90 F3 +CorePathLoop_C678: + LDA $AF ; PRG:$0678 Bytes:A5 AF + BEQ CorePathOnZero_C67F ; PRG:$067A Bytes:F0 03 + JMP RunGameTaskRoutine_C3E4 ; PRG:$067C Bytes:4C E4 C3 +CorePathOnZero_C67F: + JMP RunGameTaskDispatch_C5F7 ; PRG:$067F Bytes:4C F7 C5 +CorePathOnZero_C682: + LDA #$01 ; PRG:$0682 Bytes:A9 01 + STA $0440 ; PRG:$0684 Bytes:8D 40 04 + BNE CorePathLoop_C654 ; PRG:$0687 Bytes:D0 CB +CorePathLoop_C689: + LDA #$00 ; PRG:$0689 Bytes:A9 00 + LDX $0405 ; PRG:$068B Bytes:AE 05 04 + BNE CorePathOnNonZero_C6A2 ; PRG:$068E Bytes:D0 12 + LDA $54 ; PRG:$0690 Bytes:A5 54 + BNE CorePathOnNonZero_C6A8 ; PRG:$0692 Bytes:D0 14 + LDA #$10 ; PRG:$0694 Bytes:A9 10 + STA $54 ; PRG:$0696 Bytes:85 54 + LDA #$04 ; PRG:$0698 Bytes:A9 04 + STA $FC ; PRG:$069A Bytes:85 FC + LDA $AD ; PRG:$069C Bytes:A5 AD + EOR #$40 ; PRG:$069E Bytes:49 40 + STA $AD ; PRG:$06A0 Bytes:85 AD +CorePathOnNonZero_C6A2: + STA $0408 ; PRG:$06A2 Bytes:8D 08 04 + STA $0448 ; PRG:$06A5 Bytes:8D 48 04 +CorePathOnNonZero_C6A8: + JSR ProcessObjectStateRoutine_D083 ; PRG:$06A8 Bytes:20 83 D0 + JSR ProcessObjectStateRoutine_D0A5 ; PRG:$06AB Bytes:20 A5 D0 + JSR UpdateObjectBuffer_D0C8 ; PRG:$06AE Bytes:20 C8 D0 + JSR ObjectPath_D1D6 ; PRG:$06B1 Bytes:20 D6 D1 + RTS ; PRG:$06B4 Bytes:60 +CorePathLoop_C6B5: + JMP UpdatePlayerStateDispatch_C5EC ; PRG:$06B5 Bytes:4C EC C5 +CorePathLoop_C6B8: + JMP RunGameTaskDispatch_C621 ; PRG:$06B8 Bytes:4C 21 C6 +CorePathLoop_C6BB: + JMP RunGameTaskDispatch_C62D ; PRG:$06BB Bytes:4C 2D C6 +;------------------------------------------------------------ +; RunGameTaskRoutine_C6BE +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C6BE: + LDA $51 ; PRG:$06BE Bytes:A5 51 + BNE CorePathLoop_C689 ; PRG:$06C0 Bytes:D0 C7 + LDX $AC ; PRG:$06C2 Bytes:A6 AC + BEQ CorePathLoop_C6BB ; PRG:$06C4 Bytes:F0 F5 + DEX ; PRG:$06C6 Bytes:CA + BEQ CorePathLoop_C6B5 ; PRG:$06C7 Bytes:F0 EC + DEX ; PRG:$06C9 Bytes:CA + BEQ CorePathLoop_C6B8 ; PRG:$06CA Bytes:F0 EC + DEX ; PRG:$06CC Bytes:CA + BEQ CorePathLoop_C678 ; PRG:$06CD Bytes:F0 A9 + DEX ; PRG:$06CF Bytes:CA + BEQ CorePathOnZero_C740 ; PRG:$06D0 Bytes:F0 6E + DEX ; PRG:$06D2 Bytes:CA + BEQ CorePathOnZero_C73A ; PRG:$06D3 Bytes:F0 65 + DEX ; PRG:$06D5 Bytes:CA + BEQ CorePathOnZero_C73D ; PRG:$06D6 Bytes:F0 65 + LDA #$00 ; PRG:$06D8 Bytes:A9 00 + LDX $87 ; PRG:$06DA Bytes:A6 87 + INX ; PRG:$06DC Bytes:E8 + STX $87 ; PRG:$06DD Bytes:86 87 + CPX #$05 ; PRG:$06DF Bytes:E0 05 + BNE CorePathOnNonZero_C6E5 ; PRG:$06E1 Bytes:D0 02 + LDA #$01 ; PRG:$06E3 Bytes:A9 01 +CorePathOnNonZero_C6E5: + STA $8F ; PRG:$06E5 Bytes:85 8F + CPX #$06 ; PRG:$06E7 Bytes:E0 06 + BNE CorePathOnNonZero_C703 ; PRG:$06E9 Bytes:D0 18 + LDX #$01 ; PRG:$06EB Bytes:A2 01 + STX $87 ; PRG:$06ED Bytes:86 87 + LDA $88 ; PRG:$06EF Bytes:A5 88 + INC $88 ; PRG:$06F1 Bytes:E6 88 + CMP #$03 ; PRG:$06F3 Bytes:C9 03 + BNE CorePathOnNonZero_C703 ; PRG:$06F5 Bytes:D0 0C + STX $8C ; PRG:$06F7 Bytes:86 8C + STX $84 ; PRG:$06F9 Bytes:86 84 + LDA #$00 ; PRG:$06FB Bytes:A9 00 + STA $82 ; PRG:$06FD Bytes:85 82 + STA $83 ; PRG:$06FF Bytes:85 83 + STA $88 ; PRG:$0701 Bytes:85 88 +CorePathOnNonZero_C703: + LDA $87 ; PRG:$0703 Bytes:A5 87 + ASL A ; PRG:$0705 Bytes:0A + ASL A ; PRG:$0706 Bytes:0A + ORA $88 ; PRG:$0707 Bytes:05 88 + STA $89 ; PRG:$0709 Bytes:85 89 + LDX $8C ; PRG:$070B Bytes:A6 8C + LDA $8F ; PRG:$070D Bytes:A5 8F + BEQ UpdateGameStateOnZero_C713 ; PRG:$070F Bytes:F0 02 + LDX #$00 ; PRG:$0711 Bytes:A2 00 +UpdateGameStateOnZero_C713: + STX $8E ; PRG:$0713 Bytes:86 8E + LDA #$02 ; PRG:$0715 Bytes:A9 02 + STA $8B ; PRG:$0717 Bytes:85 8B + DEC $84 ; PRG:$0719 Bytes:C6 84 + BPL CorePathContinue_C72E ; PRG:$071B Bytes:10 11 + LDA #$02 ; PRG:$071D Bytes:A9 02 + STA $84 ; PRG:$071F Bytes:85 84 + LDA $82 ; PRG:$0721 Bytes:A5 82 + CMP #$07 ; PRG:$0723 Bytes:C9 07 + BEQ CorePathContinue_C72E ; PRG:$0725 Bytes:F0 07 + INC $82 ; PRG:$0727 Bytes:E6 82 + LDA $82 ; PRG:$0729 Bytes:A5 82 + LSR A ; PRG:$072B Bytes:4A + STA $83 ; PRG:$072C Bytes:85 83 +CorePathContinue_C72E: + LDA #$01 ; PRG:$072E Bytes:A9 01 + STA $00 ; PRG:$0730 Bytes:85 00 + LDA #$03 ; PRG:$0732 Bytes:A9 03 + STA $01 ; PRG:$0734 Bytes:85 01 + JSR ProcessResourceStateRoutine_F40C ; PRG:$0736 Bytes:20 0C F4 + RTS ; PRG:$0739 Bytes:60 +CorePathOnZero_C73A: + JMP RunGameTaskDispatch_C772 ; PRG:$073A Bytes:4C 72 C7 +CorePathOnZero_C73D: + JMP RunGameTaskDispatch_C7AD ; PRG:$073D Bytes:4C AD C7 +CorePathOnZero_C740: + LDA #$01 ; PRG:$0740 Bytes:A9 01 + STA $0480 ; PRG:$0742 Bytes:8D 80 04 + STA $04A0 ; PRG:$0745 Bytes:8D A0 04 + LDA #$46 ; PRG:$0748 Bytes:A9 46 + STA $00 ; PRG:$074A Bytes:85 00 + LDA #$29 ; PRG:$074C Bytes:A9 29 + STA $01 ; PRG:$074E Bytes:85 01 + LDA #$1B ; PRG:$0750 Bytes:A9 1B + STA $02 ; PRG:$0752 Bytes:85 02 + LDA #$C5 ; PRG:$0754 Bytes:A9 C5 + STA $03 ; PRG:$0756 Bytes:85 03 + JSR UpdateCommandBufferRoutine_F3A1 ; PRG:$0758 Bytes:20 A1 F3 + LDX $4C ; PRG:$075B Bytes:A6 4C + BEQ CorePathOnZero_C76A ; PRG:$075D Bytes:F0 0B + LDA #$06 ; PRG:$075F Bytes:A9 06 + STA $00 ; PRG:$0761 Bytes:85 00 + LDA #$2B ; PRG:$0763 Bytes:A9 2B + STA $01 ; PRG:$0765 Bytes:85 01 + JSR UpdateCommandBufferRoutine_F3A1 ; PRG:$0767 Bytes:20 A1 F3 +CorePathOnZero_C76A: + JSR RunGameTaskRoutine_C81A ; PRG:$076A Bytes:20 1A C8 + LDA #$20 ; PRG:$076D Bytes:A9 20 + JMP RunGameTaskDispatch_C7EA ; PRG:$076F Bytes:4C EA C7 +RunGameTaskDispatch_C772: + LDA $D4 ; PRG:$0772 Bytes:A5 D4 + BNE CorePathOnNonZero_C77A ; PRG:$0774 Bytes:D0 04 + LDA $D5 ; PRG:$0776 Bytes:A5 D5 + BEQ RunGameTaskDispatch_C7E5 ; PRG:$0778 Bytes:F0 6B +CorePathOnNonZero_C77A: + LDX #$01 ; PRG:$077A Bytes:A2 01 +CorePathLoop_C77C: + STX $0F ; PRG:$077C Bytes:86 0F + LDA $D4,X ; PRG:$077E Bytes:B5 D4 + BEQ RunGameTaskDispatch_C78B ; PRG:$0780 Bytes:F0 09 + BMI CorePathOnNegative_C79B ; PRG:$0782 Bytes:30 17 + DEC $D4,X ; PRG:$0784 Bytes:D6 D4 + LDA #$01 ; PRG:$0786 Bytes:A9 01 + JSR RunGameTaskRoutine_C830 ; PRG:$0788 Bytes:20 30 C8 +RunGameTaskDispatch_C78B: + LDX $0F ; PRG:$078B Bytes:A6 0F + DEX ; PRG:$078D Bytes:CA + BPL CorePathLoop_C77C ; PRG:$078E Bytes:10 EC + JSR RunGameTaskRoutine_C7EF ; PRG:$0790 Bytes:20 EF C7 + JSR RunGameTaskRoutine_C824 ; PRG:$0793 Bytes:20 24 C8 + LDA #$05 ; PRG:$0796 Bytes:A9 05 + JMP RunGameTaskDispatch_C80B ; PRG:$0798 Bytes:4C 0B C8 +CorePathOnNegative_C79B: + INC $D4,X ; PRG:$079B Bytes:F6 D4 + LDA #$01 ; PRG:$079D Bytes:A9 01 + STA $00 ; PRG:$079F Bytes:85 00 + INX ; PRG:$07A1 Bytes:E8 + INX ; PRG:$07A2 Bytes:E8 + INX ; PRG:$07A3 Bytes:E8 + INX ; PRG:$07A4 Bytes:E8 + STX $01 ; PRG:$07A5 Bytes:86 01 + JSR ProcessResourceStateRoutine_F408 ; PRG:$07A7 Bytes:20 08 F4 + JMP RunGameTaskDispatch_C78B ; PRG:$07AA Bytes:4C 8B C7 +RunGameTaskDispatch_C7AD: + LDX $AE ; PRG:$07AD Bytes:A6 AE + BEQ CorePathOnZero_C7DD ; PRG:$07AF Bytes:F0 2C + DEX ; PRG:$07B1 Bytes:CA + LDA $FFF8,X ; PRG:$07B2 Bytes:BD F8 FF + STA $00 ; PRG:$07B5 Bytes:85 00 + LDA $C52B,X ; PRG:$07B7 Bytes:BD 2B C5 + STA $01 ; PRG:$07BA Bytes:85 01 + LDA #$1E ; PRG:$07BC Bytes:A9 1E + STA $02 ; PRG:$07BE Bytes:85 02 + LDA #$C5 ; PRG:$07C0 Bytes:A9 C5 + STA $03 ; PRG:$07C2 Bytes:85 03 + JSR UpdateCommandBufferRoutine_F3A1 ; PRG:$07C4 Bytes:20 A1 F3 + DEC $AE ; PRG:$07C7 Bytes:C6 AE + LDA $AE ; PRG:$07C9 Bytes:A5 AE + ORA #$08 ; PRG:$07CB Bytes:09 08 + STA $01 ; PRG:$07CD Bytes:85 01 + LDA #$20 ; PRG:$07CF Bytes:A9 20 + STA $00 ; PRG:$07D1 Bytes:85 00 + JSR ProcessResourceStateRoutine_F40C ; PRG:$07D3 Bytes:20 0C F4 + JSR RunGameTaskRoutine_C7EF ; PRG:$07D6 Bytes:20 EF C7 + LDA #$02 ; PRG:$07D9 Bytes:A9 02 + STA $FE ; PRG:$07DB Bytes:85 FE +CorePathOnZero_C7DD: + JSR RunGameTaskRoutine_C809 ; PRG:$07DD Bytes:20 09 C8 + LDA #$FF ; PRG:$07E0 Bytes:A9 FF + JMP RunGameTaskDispatch_C7EA ; PRG:$07E2 Bytes:4C EA C7 +RunGameTaskDispatch_C7E5: + JSR RunGameTaskRoutine_C816 ; PRG:$07E5 Bytes:20 16 C8 +RunGameTaskDispatch_C7E8: + LDA #$20 ; PRG:$07E8 Bytes:A9 20 +RunGameTaskDispatch_C7EA: + STA $51 ; PRG:$07EA Bytes:85 51 + INC $AC ; PRG:$07EC Bytes:E6 AC + RTS ; PRG:$07EE Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_C7EF +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C7EF: + LDA #$01 ; PRG:$07EF Bytes:A9 01 + STA $FE ; PRG:$07F1 Bytes:85 FE +;------------------------------------------------------------ +; RunGameTaskRoutine_C7F3 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C7F3: + LDA #$F9 ; PRG:$07F3 Bytes:A9 F9 + STA $00 ; PRG:$07F5 Bytes:85 00 + JSR ProcessResourceStateRoutine_F500 ; PRG:$07F7 Bytes:20 00 F5 + LDA #$0F ; PRG:$07FA Bytes:A9 0F + JSR ProcessResourceStateRoutine_F31A ; PRG:$07FC Bytes:20 1A F3 + LDX $4C ; PRG:$07FF Bytes:A6 4C + BEQ CorePathOnZero_C808 ; PRG:$0801 Bytes:F0 05 + LDA #$81 ; PRG:$0803 Bytes:A9 81 + JSR ProcessResourceStateRoutine_F31A ; PRG:$0805 Bytes:20 1A F3 +CorePathOnZero_C808: + RTS ; PRG:$0808 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_C809 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C809: + LDA #$04 ; PRG:$0809 Bytes:A9 04 +RunGameTaskDispatch_C80B: + STA $51 ; PRG:$080B Bytes:85 51 + LDA #$01 ; PRG:$080D Bytes:A9 01 +CorePathLoop_C80F: + STA $0405 ; PRG:$080F Bytes:8D 05 04 + STA $0445 ; PRG:$0812 Bytes:8D 45 04 + RTS ; PRG:$0815 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_C816 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C816: + LDA #$00 ; PRG:$0816 Bytes:A9 00 + BEQ CorePathLoop_C80F ; PRG:$0818 Bytes:F0 F5 +;------------------------------------------------------------ +; RunGameTaskRoutine_C81A +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C81A: + LDY #$07 ; PRG:$081A Bytes:A0 07 + LDA #$00 ; PRG:$081C Bytes:A9 00 +CorePathLoop_C81E: + STA a:$0034,Y ; PRG:$081E Bytes:99 34 00 + DEY ; PRG:$0821 Bytes:88 + BPL CorePathLoop_C81E ; PRG:$0822 Bytes:10 FA +;------------------------------------------------------------ +; RunGameTaskRoutine_C824 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C824: + LDA #$48 ; PRG:$0824 Bytes:A9 48 + LDX $4C ; PRG:$0826 Bytes:A6 4C + BEQ CorePathOnZero_C82C ; PRG:$0828 Bytes:F0 02 + LDA #$45 ; PRG:$082A Bytes:A9 45 +CorePathOnZero_C82C: + JSR ProcessResourceStateRoutine_F31A ; PRG:$082C Bytes:20 1A F3 + RTS ; PRG:$082F Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_C830 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C830: + PHA ; PRG:$0830 Bytes:48 + INX ; PRG:$0831 Bytes:E8 + INX ; PRG:$0832 Bytes:E8 + INX ; PRG:$0833 Bytes:E8 + INX ; PRG:$0834 Bytes:E8 + STX $01 ; PRG:$0835 Bytes:86 01 + LDA #$01 ; PRG:$0837 Bytes:A9 01 + STA $00 ; PRG:$0839 Bytes:85 00 + JSR ProcessResourceStateRoutine_F40C ; PRG:$083B Bytes:20 0C F4 + PLA ; PRG:$083E Bytes:68 + STA $00 ; PRG:$083F Bytes:85 00 + LDA #$08 ; PRG:$0841 Bytes:A9 08 + ORA $0F ; PRG:$0843 Bytes:05 0F + STA $01 ; PRG:$0845 Bytes:85 01 + JSR ProcessResourceStateRoutine_F40C ; PRG:$0847 Bytes:20 0C F4 + RTS ; PRG:$084A Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_C84B +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C84B: + LDA #$05 ; PRG:$084B Bytes:A9 05 + STA $01 ; PRG:$084D Bytes:85 01 + LDY #$13 ; PRG:$084F Bytes:A0 13 +CorePathLoop_C851: + TYA ; PRG:$0851 Bytes:98 + AND #$FC ; PRG:$0852 Bytes:29 FC + STA $0720,Y ; PRG:$0854 Bytes:99 20 07 + DEY ; PRG:$0857 Bytes:88 + BPL CorePathLoop_C851 ; PRG:$0858 Bytes:10 F7 + LDA #$20 ; PRG:$085A Bytes:A9 20 + STA $04 ; PRG:$085C Bytes:85 04 + LDA #$07 ; PRG:$085E Bytes:A9 07 + STA $05 ; PRG:$0860 Bytes:85 05 +CorePathLoop_C862: + LDA $10 ; PRG:$0862 Bytes:A5 10 + AND #$03 ; PRG:$0864 Bytes:29 03 + LDY #$03 ; PRG:$0866 Bytes:A0 03 + ORA ($04),Y ; PRG:$0868 Bytes:11 04 +CorePathLoop_C86A: + STA ($04),Y ; PRG:$086A Bytes:91 04 + DEY ; PRG:$086C Bytes:88 + BPL CorePathLoop_C86A ; PRG:$086D Bytes:10 FB + LDX #$02 ; PRG:$086F Bytes:A2 02 + STX $03 ; PRG:$0871 Bytes:86 03 +CorePathLoop_C873: + LDY $14 ; PRG:$0873 Bytes:A4 14 +CorePathLoop_C875: + JSR EnginePath_F58D ; PRG:$0875 Bytes:20 8D F5 + DEY ; PRG:$0878 Bytes:88 + BNE CorePathLoop_C875 ; PRG:$0879 Bytes:D0 FA + LDA $11 ; PRG:$087B Bytes:A5 11 + AND #$03 ; PRG:$087D Bytes:29 03 + STA $02 ; PRG:$087F Bytes:85 02 + LDY #$03 ; PRG:$0881 Bytes:A0 03 + LDA ($04),Y ; PRG:$0883 Bytes:B1 04 + AND #$FC ; PRG:$0885 Bytes:29 FC + ORA $02 ; PRG:$0887 Bytes:05 02 +CorePathLoop_C889: + CMP ($04),Y ; PRG:$0889 Bytes:D1 04 + BEQ CorePathLoop_C873 ; PRG:$088B Bytes:F0 E6 + DEY ; PRG:$088D Bytes:88 + BPL CorePathLoop_C889 ; PRG:$088E Bytes:10 F9 + LDY $03 ; PRG:$0890 Bytes:A4 03 + STA ($04),Y ; PRG:$0892 Bytes:91 04 + DEC $03 ; PRG:$0894 Bytes:C6 03 + BPL CorePathLoop_C873 ; PRG:$0896 Bytes:10 DB + CLC ; PRG:$0898 Bytes:18 + LDA #$04 ; PRG:$0899 Bytes:A9 04 + ADC $04 ; PRG:$089B Bytes:65 04 + STA $04 ; PRG:$089D Bytes:85 04 + LDA #$00 ; PRG:$089F Bytes:A9 00 + ADC $05 ; PRG:$08A1 Bytes:65 05 + STA $05 ; PRG:$08A3 Bytes:85 05 + DEC $01 ; PRG:$08A5 Bytes:C6 01 + BNE CorePathLoop_C862 ; PRG:$08A7 Bytes:D0 B9 + RTS ; PRG:$08A9 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_C8AA +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C8AA: + LDA $85 ; PRG:$08AA Bytes:A5 85 + ASL A ; PRG:$08AC Bytes:0A + TAX ; PRG:$08AD Bytes:AA + LDA $C008,X ; PRG:$08AE Bytes:BD 08 C0 + STA $04 ; PRG:$08B1 Bytes:85 04 + LDA $C009,X ; PRG:$08B3 Bytes:BD 09 C0 + STA $05 ; PRG:$08B6 Bytes:85 05 + RTS ; PRG:$08B8 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_C8B9 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C8B9: + LDY #$10 ; PRG:$08B9 Bytes:A0 10 + LDX $83 ; PRG:$08BB Bytes:A6 83 + LDA $C0D1,X ; PRG:$08BD Bytes:BD D1 C0 + STA $0F ; PRG:$08C0 Bytes:85 0F + LDA #$80 ; PRG:$08C2 Bytes:A9 80 + STA $00 ; PRG:$08C4 Bytes:85 00 + LDA #$04 ; PRG:$08C6 Bytes:A9 04 + STA $01 ; PRG:$08C8 Bytes:85 01 +CorePathLoop_C8CA: + LDA #$01 ; PRG:$08CA Bytes:A9 01 + STA ($00),Y ; PRG:$08CC Bytes:91 00 + LDX #$00 ; PRG:$08CE Bytes:A2 00 + JSR RunGameTaskRoutine_CBD3 ; PRG:$08D0 Bytes:20 D3 CB + BNE CorePathLoop_C8CA ; PRG:$08D3 Bytes:D0 F5 + RTS ; PRG:$08D5 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_C8D6 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C8D6: + JSR RunGameTaskRoutine_C463 ; PRG:$08D6 Bytes:20 63 C4 + LDY #$0F ; PRG:$08D9 Bytes:A0 0F + LDA $4C ; PRG:$08DB Bytes:A5 4C + BNE CorePathLoop_C8E1 ; PRG:$08DD Bytes:D0 02 + LDY #$07 ; PRG:$08DF Bytes:A0 07 +CorePathLoop_C8E1: + LDA $C0A1,Y ; PRG:$08E1 Bytes:B9 A1 C0 + STA $02E0,Y ; PRG:$08E4 Bytes:99 E0 02 + DEY ; PRG:$08E7 Bytes:88 + BPL CorePathLoop_C8E1 ; PRG:$08E8 Bytes:10 F7 + RTS ; PRG:$08EA Bytes:60 + .byte $1C, $34, $4C, $64, $94, $AC, $C4, $DC, $20, $38, $50, $68, $80, $98, $B0, $C8 ; PRG:$08EB Bytes:1C 34 4C 64 94 AC C4 DC 20 38 50 68 80 98 B0 C8 +;------------------------------------------------------------ +; RunGameTaskRoutine_C8FB +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_C8FB: + LDA #$07 ; PRG:$08FB Bytes:A9 07 + STA $0E ; PRG:$08FD Bytes:85 0E + LDA #$00 ; PRG:$08FF Bytes:A9 00 + STA $04 ; PRG:$0901 Bytes:85 04 + LDA #$06 ; PRG:$0903 Bytes:A9 06 + STA $05 ; PRG:$0905 Bytes:85 05 +CorePathLoop_C907: + LDA $16 ; PRG:$0907 Bytes:A5 16 + AND #$07 ; PRG:$0909 Bytes:29 07 + TAX ; PRG:$090B Bytes:AA + LDA $C8EB,X ; PRG:$090C Bytes:BD EB C8 + STA $01 ; PRG:$090F Bytes:85 01 + LDA $17 ; PRG:$0911 Bytes:A5 17 + AND #$07 ; PRG:$0913 Bytes:29 07 + TAX ; PRG:$0915 Bytes:AA + LDA $C8F3,X ; PRG:$0916 Bytes:BD F3 C8 + STA $00 ; PRG:$0919 Bytes:85 00 + JSR UpdateObjectBufferRoutine_E0DF ; PRG:$091B Bytes:20 DF E0 + LDA #$00 ; PRG:$091E Bytes:A9 00 + JSR ProcessObjectStateRoutine_E0B2 ; PRG:$0920 Bytes:20 B2 E0 + JSR ObjectPath_E113 ; PRG:$0923 Bytes:20 13 E1 + LDA #$00 ; PRG:$0926 Bytes:A9 00 + JSR ProcessObjectStateRoutine_E0B2 ; PRG:$0928 Bytes:20 B2 E0 + CMP #$24 ; PRG:$092B Bytes:C9 24 + BEQ CorePathContinue_C941 ; PRG:$092D Bytes:F0 12 + CMP #$4E ; PRG:$092F Bytes:C9 4E + BCS CorePathLoop_C937 ; PRG:$0931 Bytes:B0 04 + CMP #$49 ; PRG:$0933 Bytes:C9 49 + BCS CorePathContinue_C941 ; PRG:$0935 Bytes:B0 0A +CorePathLoop_C937: + LDX $10 ; PRG:$0937 Bytes:A6 10 +CorePathLoop_C939: + JSR EnginePath_F58D ; PRG:$0939 Bytes:20 8D F5 + DEX ; PRG:$093C Bytes:CA + BNE CorePathLoop_C939 ; PRG:$093D Bytes:D0 FA + BEQ CorePathLoop_C907 ; PRG:$093F Bytes:F0 C6 +CorePathContinue_C941: + LDA #$07 ; PRG:$0941 Bytes:A9 07 + STA $0F ; PRG:$0943 Bytes:85 0F + LDA #$00 ; PRG:$0945 Bytes:A9 00 + STA $06 ; PRG:$0947 Bytes:85 06 + LDA #$06 ; PRG:$0949 Bytes:A9 06 + STA $07 ; PRG:$094B Bytes:85 07 +CorePathLoop_C94D: + LDY #$01 ; PRG:$094D Bytes:A0 01 + LDA ($06),Y ; PRG:$094F Bytes:B1 06 + CMP $00 ; PRG:$0951 Bytes:C5 00 + BNE CorePathOnNonZero_C95D ; PRG:$0953 Bytes:D0 08 + LDY #$03 ; PRG:$0955 Bytes:A0 03 + LDA ($06),Y ; PRG:$0957 Bytes:B1 06 + CMP $01 ; PRG:$0959 Bytes:C5 01 + BEQ CorePathLoop_C937 ; PRG:$095B Bytes:F0 DA +CorePathOnNonZero_C95D: + LDX #$06 ; PRG:$095D Bytes:A2 06 + JSR RunGameTaskRoutine_CBD3 ; PRG:$095F Bytes:20 D3 CB + BPL CorePathLoop_C94D ; PRG:$0962 Bytes:10 E9 + LDY #$01 ; PRG:$0964 Bytes:A0 01 + LDA #$00 ; PRG:$0966 Bytes:A9 00 + LDX $8F ; PRG:$0968 Bytes:A6 8F + BNE CorePathContinue_C974 ; PRG:$096A Bytes:D0 08 + LDX $11 ; PRG:$096C Bytes:A6 11 + CPX #$3C ; PRG:$096E Bytes:E0 3C + BCS CorePathContinue_C974 ; PRG:$0970 Bytes:B0 02 + LDA WorkPtr0Lo ; PRG:$0972 Bytes:A5 00 +CorePathContinue_C974: + STA ($04),Y ; PRG:$0974 Bytes:91 04 + LDA ($04),Y ; PRG:$0976 Bytes:B1 04 + BEQ CorePathContinue_C986 ; PRG:$0978 Bytes:F0 0C + LDX $12 ; PRG:$097A Bytes:A6 12 + CPX #$40 ; PRG:$097C Bytes:E0 40 + BCS CorePathContinue_C986 ; PRG:$097E Bytes:B0 06 + LDY #$10 ; PRG:$0980 Bytes:A0 10 + LDA #$01 ; PRG:$0982 Bytes:A9 01 + STA ($04),Y ; PRG:$0984 Bytes:91 04 +CorePathContinue_C986: + LDY #$03 ; PRG:$0986 Bytes:A0 03 + LDA WorkPtr0Hi ; PRG:$0988 Bytes:A5 01 + STA ($04),Y ; PRG:$098A Bytes:91 04 + LDX #$04 ; PRG:$098C Bytes:A2 04 + JSR RunGameTaskRoutine_CBD3 ; PRG:$098E Bytes:20 D3 CB + DEC $0E ; PRG:$0991 Bytes:C6 0E + BPL CorePathLoop_C937 ; PRG:$0993 Bytes:10 A2 + RTS ; PRG:$0995 Bytes:60 +;------------------------------------------------------------ +; UpdateGameStateRoutine_C996 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateGameStateRoutine_C996: + LDA $8B ; PRG:$0996 Bytes:A5 8B + BNE UpdateGameStateOnNonZero_C99B ; PRG:$0998 Bytes:D0 01 + RTS ; PRG:$099A Bytes:60 +UpdateGameStateOnNonZero_C99B: + DEC $8B ; PRG:$099B Bytes:C6 8B + BEQ CorePathOnZero_C9DA ; PRG:$099D Bytes:F0 3B + LDA #$24 ; PRG:$099F Bytes:A9 24 + STA $00 ; PRG:$09A1 Bytes:85 00 + LDA #$01 ; PRG:$09A3 Bytes:A9 01 + STA $01 ; PRG:$09A5 Bytes:85 01 + JSR ProcessResourceStateRoutine_F257 ; PRG:$09A7 Bytes:20 57 F2 + LDA #$03 ; PRG:$09AA Bytes:A9 03 + STA $01 ; PRG:$09AC Bytes:85 01 + JSR ProcessResourceStateRoutine_F257 ; PRG:$09AE Bytes:20 57 F2 + LDY #$1C ; PRG:$09B1 Bytes:A0 1C + LDA $4C ; PRG:$09B3 Bytes:A5 4C + BEQ UpdateGameStateOnZero_C9B8 ; PRG:$09B5 Bytes:F0 01 + INY ; PRG:$09B7 Bytes:C8 +UpdateGameStateOnZero_C9B8: + STY $85 ; PRG:$09B8 Bytes:84 85 + JSR RunGameTaskRoutine_CB8C ; PRG:$09BA Bytes:20 8C CB + LDA #$1B ; PRG:$09BD Bytes:A9 1B + LDX #$14 ; PRG:$09BF Bytes:A2 14 + LDY $8A ; PRG:$09C1 Bytes:A4 8A + BEQ CorePathOnZero_C9D3 ; PRG:$09C3 Bytes:F0 0E + LDA $87 ; PRG:$09C5 Bytes:A5 87 + CLC ; PRG:$09C7 Bytes:18 + ADC #$15 ; PRG:$09C8 Bytes:69 15 + CMP #$1A ; PRG:$09CA Bytes:C9 1A + BEQ CorePathOnZero_C9D3 ; PRG:$09CC Bytes:F0 05 + LDY $89 ; PRG:$09CE Bytes:A4 89 + LDX $0720,Y ; PRG:$09D0 Bytes:BE 20 07 +CorePathOnZero_C9D3: + STA $85 ; PRG:$09D3 Bytes:85 85 + STX $86 ; PRG:$09D5 Bytes:86 86 + JMP RunGameTaskDispatch_CB87 ; PRG:$09D7 Bytes:4C 87 CB +CorePathOnZero_C9DA: + JSR RunGameTaskRoutine_CB8C ; PRG:$09DA Bytes:20 8C CB + LDA $86 ; PRG:$09DD Bytes:A5 86 + ASL A ; PRG:$09DF Bytes:0A + TAX ; PRG:$09E0 Bytes:AA + LDA $C008,X ; PRG:$09E1 Bytes:BD 08 C0 + STA $00 ; PRG:$09E4 Bytes:85 00 + LDA $C009,X ; PRG:$09E6 Bytes:BD 09 C0 + STA $01 ; PRG:$09E9 Bytes:85 01 + JSR ObjectPath_DF2F ; PRG:$09EB Bytes:20 2F DF + LDA $85 ; PRG:$09EE Bytes:A5 85 + CMP #$1B ; PRG:$09F0 Bytes:C9 1B + BEQ CorePathOnZero_CA09 ; PRG:$09F2 Bytes:F0 15 + JSR ProcessObjectStateRoutine_D211 ; PRG:$09F4 Bytes:20 11 D2 + JSR ProcessObjectStateRoutine_D211 ; PRG:$09F7 Bytes:20 11 D2 + JSR ProcessObjectStateRoutine_D211 ; PRG:$09FA Bytes:20 11 D2 + JSR ProcessObjectStateRoutine_D211 ; PRG:$09FD Bytes:20 11 D2 + JSR ResourceAndLevelData ; PRG:$0A00 Bytes:20 0B F2 + JSR ObjectPath_DE15 ; PRG:$0A03 Bytes:20 15 DE + JSR UpdateObjectBuffer_DF5E ; PRG:$0A06 Bytes:20 5E DF +CorePathOnZero_CA09: + LDY #$06 ; PRG:$0A09 Bytes:A0 06 + LDX #$04 ; PRG:$0A0B Bytes:A2 04 + JSR RunGameTaskRoutine_CBA6 ; PRG:$0A0D Bytes:20 A6 CB + LDY #$02 ; PRG:$0A10 Bytes:A0 02 + LDX #$01 ; PRG:$0A12 Bytes:A2 01 + LDA #$F4 ; PRG:$0A14 Bytes:A9 F4 + JSR RunGameTaskRoutine_CBA8 ; PRG:$0A16 Bytes:20 A8 CB + LDY #$50 ; PRG:$0A19 Bytes:A0 50 + LDA #$00 ; PRG:$0A1B Bytes:A9 00 +CorePathLoop_CA1D: + STA a:$009F,Y ; PRG:$0A1D Bytes:99 9F 00 + DEY ; PRG:$0A20 Bytes:88 + BNE CorePathLoop_CA1D ; PRG:$0A21 Bytes:D0 FA + LDY #$28 ; PRG:$0A23 Bytes:A0 28 +UpdateGameStateLoop_CA25: + STA a:$0053,Y ; PRG:$0A25 Bytes:99 53 00 + DEY ; PRG:$0A28 Bytes:88 + BNE UpdateGameStateLoop_CA25 ; PRG:$0A29 Bytes:D0 FA + LDA $40 ; PRG:$0A2B Bytes:A5 40 + ORA #$02 ; PRG:$0A2D Bytes:09 02 + STA $40 ; PRG:$0A2F Bytes:85 40 + LDA #$EF ; PRG:$0A31 Bytes:A9 EF + STA $43 ; PRG:$0A33 Bytes:85 43 + LDA $8A ; PRG:$0A35 Bytes:A5 8A + BNE CorePathOnNonZero_CA4D ; PRG:$0A37 Bytes:D0 14 + LDA #$90 ; PRG:$0A39 Bytes:A9 90 + LDX #$C0 ; PRG:$0A3B Bytes:A2 C0 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0A3D Bytes:20 7D F7 + LDA #$0F ; PRG:$0A40 Bytes:A9 0F + JSR ProcessResourceStateRoutine_F31A ; PRG:$0A42 Bytes:20 1A F3 + LDA #$81 ; PRG:$0A45 Bytes:A9 81 + JSR ProcessResourceStateRoutine_F31A ; PRG:$0A47 Bytes:20 1A F3 + JMP RunGameTaskDispatch_CB87 ; PRG:$0A4A Bytes:4C 87 CB +CorePathOnNonZero_CA4D: + LDY $86 ; PRG:$0A4D Bytes:A4 86 + LDA $C044,Y ; PRG:$0A4F Bytes:B9 44 C0 + STA $3F ; PRG:$0A52 Bytes:85 3F + LDA #$FA ; PRG:$0A54 Bytes:A9 FA + LDX #$C0 ; PRG:$0A56 Bytes:A2 C0 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0A58 Bytes:20 7D F7 + LDA #$E5 ; PRG:$0A5B Bytes:A9 E5 + LDX #$C0 ; PRG:$0A5D Bytes:A2 C0 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0A5F Bytes:20 7D F7 + LDA #$F2 ; PRG:$0A62 Bytes:A9 F2 + STA $0437 ; PRG:$0A64 Bytes:8D 37 04 + STA $0477 ; PRG:$0A67 Bytes:8D 77 04 + LDA #$01 ; PRG:$0A6A Bytes:A9 01 + STA $0449 ; PRG:$0A6C Bytes:8D 49 04 + STA $0469 ; PRG:$0A6F Bytes:8D 69 04 + STA $0479 ; PRG:$0A72 Bytes:8D 79 04 + LDA #$D8 ; PRG:$0A75 Bytes:A9 D8 + STA $043B ; PRG:$0A77 Bytes:8D 3B 04 + LDA #$14 ; PRG:$0A7A Bytes:A9 14 + STA $044B ; PRG:$0A7C Bytes:8D 4B 04 + LDA #$24 ; PRG:$0A7F Bytes:A9 24 + STA $046B ; PRG:$0A81 Bytes:8D 6B 04 + LDA #$DC ; PRG:$0A84 Bytes:A9 DC + STA $047B ; PRG:$0A86 Bytes:8D 7B 04 + LDA #$0B ; PRG:$0A89 Bytes:A9 0B + LDX #$C1 ; PRG:$0A8B Bytes:A2 C1 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0A8D Bytes:20 7D F7 + LDA #$70 ; PRG:$0A90 Bytes:A9 70 + STA $052B ; PRG:$0A92 Bytes:8D 2B 05 + LDA #$78 ; PRG:$0A95 Bytes:A9 78 + STA $054B ; PRG:$0A97 Bytes:8D 4B 05 + LDA #$80 ; PRG:$0A9A Bytes:A9 80 + STA $056B ; PRG:$0A9C Bytes:8D 6B 05 + LDA #$88 ; PRG:$0A9F Bytes:A9 88 + STA $058B ; PRG:$0AA1 Bytes:8D 8B 05 + LDA #$90 ; PRG:$0AA4 Bytes:A9 90 + STA $05AB ; PRG:$0AA6 Bytes:8D AB 05 + LDA #$98 ; PRG:$0AA9 Bytes:A9 98 + STA $05CB ; PRG:$0AAB Bytes:8D CB 05 + LDA #$A0 ; PRG:$0AAE Bytes:A9 A0 + STA $05EB ; PRG:$0AB0 Bytes:8D EB 05 + LDA #$21 ; PRG:$0AB3 Bytes:A9 21 + LDX #$C1 ; PRG:$0AB5 Bytes:A2 C1 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0AB7 Bytes:20 7D F7 + LDA #$38 ; PRG:$0ABA Bytes:A9 38 + STA $04AB ; PRG:$0ABC Bytes:8D AB 04 + LDA #$48 ; PRG:$0ABF Bytes:A9 48 + STA $04CB ; PRG:$0AC1 Bytes:8D CB 04 + LDA #$58 ; PRG:$0AC4 Bytes:A9 58 + STA $04EB ; PRG:$0AC6 Bytes:8D EB 04 + LDA #$42 ; PRG:$0AC9 Bytes:A9 42 + LDX #$C1 ; PRG:$0ACB Bytes:A2 C1 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0ACD Bytes:20 7D F7 + LDX #$05 ; PRG:$0AD0 Bytes:A2 05 + LDY #$07 ; PRG:$0AD2 Bytes:A0 07 +CorePathLoop_CAD4: + TYA ; PRG:$0AD4 Bytes:98 + STA $0600,X ; PRG:$0AD5 Bytes:9D 00 06 + TXA ; PRG:$0AD8 Bytes:8A + CLC ; PRG:$0AD9 Bytes:18 + ADC #$20 ; PRG:$0ADA Bytes:69 20 + TAX ; PRG:$0ADC Bytes:AA + DEY ; PRG:$0ADD Bytes:88 + BNE CorePathLoop_CAD4 ; PRG:$0ADE Bytes:D0 F4 + LDA #$01 ; PRG:$0AE0 Bytes:A9 01 + STA $0629 ; PRG:$0AE2 Bytes:8D 29 06 + STA $0649 ; PRG:$0AE5 Bytes:8D 49 06 + STA $06E9 ; PRG:$0AE8 Bytes:8D E9 06 + JSR RunGameTaskRoutine_C8FB ; PRG:$0AEB Bytes:20 FB C8 + LDA #$58 ; PRG:$0AEE Bytes:A9 58 + LDX #$C1 ; PRG:$0AF0 Bytes:A2 C1 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0AF2 Bytes:20 7D F7 + LDA #$C8 ; PRG:$0AF5 Bytes:A9 C8 + STA $03DB ; PRG:$0AF7 Bytes:8D DB 03 + LDA #$D0 ; PRG:$0AFA Bytes:A9 D0 + STA $03EB ; PRG:$0AFC Bytes:8D EB 03 + LDA #$37 ; PRG:$0AFF Bytes:A9 37 + LDX #$C1 ; PRG:$0B01 Bytes:A2 C1 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0B03 Bytes:20 7D F7 + LDA #$01 ; PRG:$0B06 Bytes:A9 01 + STA $8A ; PRG:$0B08 Bytes:85 8A + LDA #$02 ; PRG:$0B0A Bytes:A9 02 + LDY $8F ; PRG:$0B0C Bytes:A4 8F + BNE UpdateGameStateOnNonZero_CB15 ; PRG:$0B0E Bytes:D0 05 + LDA #$08 ; PRG:$0B10 Bytes:A9 08 + SEC ; PRG:$0B12 Bytes:38 + SBC $83 ; PRG:$0B13 Bytes:E5 83 +UpdateGameStateOnNonZero_CB15: + STA $2E ; PRG:$0B15 Bytes:85 2E + SEC ; PRG:$0B17 Bytes:38 + SBC #$03 ; PRG:$0B18 Bytes:E9 03 + STA $A8 ; PRG:$0B1A Bytes:85 A8 + LDA #$00 ; PRG:$0B1C Bytes:A9 00 + STA $2F ; PRG:$0B1E Bytes:85 2F + STA $2C ; PRG:$0B20 Bytes:85 2C + LDA #$8A ; PRG:$0B22 Bytes:A9 8A + LDX #$C1 ; PRG:$0B24 Bytes:A2 C1 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0B26 Bytes:20 7D F7 + LDA #$59 ; PRG:$0B29 Bytes:A9 59 + LDX #$C0 ; PRG:$0B2B Bytes:A2 C0 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0B2D Bytes:20 7D F7 + LDA #$26 ; PRG:$0B30 Bytes:A9 26 + LDY $8F ; PRG:$0B32 Bytes:A4 8F + BEQ UpdatePlayerStateOnZero_CB3F ; PRG:$0B34 Bytes:F0 09 + LDA #$7E ; PRG:$0B36 Bytes:A9 7E + LDX #$C0 ; PRG:$0B38 Bytes:A2 C0 + JSR ProcessResourceStateRoutine_F77D ; PRG:$0B3A Bytes:20 7D F7 + LDA #$28 ; PRG:$0B3D Bytes:A9 28 +UpdatePlayerStateOnZero_CB3F: + JSR ProcessResourceStateRoutine_F31A ; PRG:$0B3F Bytes:20 1A F3 + LDX #$00 ; PRG:$0B42 Bytes:A2 00 + JSR ProcessObjectStateRoutine_D42C ; PRG:$0B44 Bytes:20 2C D4 + LDX $4C ; PRG:$0B47 Bytes:A6 4C + JSR ProcessObjectStateRoutine_D42C ; PRG:$0B49 Bytes:20 2C D4 + LDX #$11 ; PRG:$0B4C Bytes:A2 11 + LDA $90 ; PRG:$0B4E Bytes:A5 90 + CMP #$01 ; PRG:$0B50 Bytes:C9 01 + BEQ UpdatePlayerStateOnZero_CB56 ; PRG:$0B52 Bytes:F0 02 + STX $90 ; PRG:$0B54 Bytes:86 90 +UpdatePlayerStateOnZero_CB56: + LDA $91 ; PRG:$0B56 Bytes:A5 91 + CMP #$01 ; PRG:$0B58 Bytes:C9 01 + BEQ UpdateGameStateOnZero_CB5E ; PRG:$0B5A Bytes:F0 02 + STX $91 ; PRG:$0B5C Bytes:86 91 +UpdateGameStateOnZero_CB5E: + JSR RunGameTaskRoutine_C8D6 ; PRG:$0B5E Bytes:20 D6 C8 + JSR RunGameTaskRoutine_C8B9 ; PRG:$0B61 Bytes:20 B9 C8 + LDA #$08 ; PRG:$0B64 Bytes:A9 08 + STA $0495 ; PRG:$0B66 Bytes:8D 95 04 + LDA #$18 ; PRG:$0B69 Bytes:A9 18 + STA $04B5 ; PRG:$0B6B Bytes:8D B5 04 + LDA #$28 ; PRG:$0B6E Bytes:A9 28 + STA $04D5 ; PRG:$0B70 Bytes:8D D5 04 + LDA #$38 ; PRG:$0B73 Bytes:A9 38 + STA $04F5 ; PRG:$0B75 Bytes:8D F5 04 + LDA #$02 ; PRG:$0B78 Bytes:A9 02 + STA $FB ; PRG:$0B7A Bytes:85 FB + JSR UpdateGameStateRoutine_C3BC ; PRG:$0B7C Bytes:20 BC C3 + LDA $8D ; PRG:$0B7F Bytes:A5 8D + BNE CorePathOnNonZero_CB85 ; PRG:$0B81 Bytes:D0 02 + LDA #$21 ; PRG:$0B83 Bytes:A9 21 +CorePathOnNonZero_CB85: + STA $92 ; PRG:$0B85 Bytes:85 92 +RunGameTaskDispatch_CB87: + PLA ; PRG:$0B87 Bytes:68 + PLA ; PRG:$0B88 Bytes:68 + JMP NMIReadPPUStatus_C234 ; PRG:$0B89 Bytes:4C 34 C2 +;------------------------------------------------------------ +; RunGameTaskRoutine_CB8C +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_CB8C: + JSR RunGameTaskRoutine_C8AA ; PRG:$0B8C Bytes:20 AA C8 + LDY #$01 ; PRG:$0B8F Bytes:A0 01 + LDA ($04),Y ; PRG:$0B91 Bytes:B1 04 + CLC ; PRG:$0B93 Bytes:18 + ADC $04 ; PRG:$0B94 Bytes:65 04 + STA $00 ; PRG:$0B96 Bytes:85 00 + LDA #$00 ; PRG:$0B98 Bytes:A9 00 + ADC $05 ; PRG:$0B9A Bytes:65 05 + STA $01 ; PRG:$0B9C Bytes:85 01 + JSR ProcessResourceStateDispatch_F2EA ; PRG:$0B9E Bytes:20 EA F2 + INY ; PRG:$0BA1 Bytes:C8 + JSR ObjectPath_DF2F ; PRG:$0BA2 Bytes:20 2F DF + RTS ; PRG:$0BA5 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_CBA6 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_CBA6: + LDA #$00 ; PRG:$0BA6 Bytes:A9 00 +;------------------------------------------------------------ +; RunGameTaskRoutine_CBA8 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_CBA8: + STY $01 ; PRG:$0BA8 Bytes:84 01 + LDY #$00 ; PRG:$0BAA Bytes:A0 00 + STY $00 ; PRG:$0BAC Bytes:84 00 +CorePathLoop_CBAE: + STA ($00),Y ; PRG:$0BAE Bytes:91 00 + DEY ; PRG:$0BB0 Bytes:88 + BNE CorePathLoop_CBAE ; PRG:$0BB1 Bytes:D0 FB + DEC $01 ; PRG:$0BB3 Bytes:C6 01 + DEX ; PRG:$0BB5 Bytes:CA + BNE CorePathLoop_CBAE ; PRG:$0BB6 Bytes:D0 F6 + RTS ; PRG:$0BB8 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_CBB9 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_CBB9: + LDA #$00 ; PRG:$0BB9 Bytes:A9 00 + STA $08 ; PRG:$0BBB Bytes:85 08 + LDA #$04 ; PRG:$0BBD Bytes:A9 04 + STA $09 ; PRG:$0BBF Bytes:85 09 + LDA #$00 ; PRG:$0BC1 Bytes:A9 00 + STA $0A ; PRG:$0BC3 Bytes:85 0A + RTS ; PRG:$0BC5 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_CBC6 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_CBC6: + LDA #$40 ; PRG:$0BC6 Bytes:A9 40 + STA $08 ; PRG:$0BC8 Bytes:85 08 + LDA #$04 ; PRG:$0BCA Bytes:A9 04 + STA $09 ; PRG:$0BCC Bytes:85 09 + LDA #$01 ; PRG:$0BCE Bytes:A9 01 + STA $0A ; PRG:$0BD0 Bytes:85 0A + RTS ; PRG:$0BD2 Bytes:60 +;------------------------------------------------------------ +; RunGameTaskRoutine_CBD3 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +RunGameTaskRoutine_CBD3: + CLC ; PRG:$0BD3 Bytes:18 + LDA #$20 ; PRG:$0BD4 Bytes:A9 20 + ADC $00,X ; PRG:$0BD6 Bytes:75 00 + STA $00,X ; PRG:$0BD8 Bytes:95 00 + LDA #$00 ; PRG:$0BDA Bytes:A9 00 + ADC $01,X ; PRG:$0BDC Bytes:75 01 + STA $01,X ; PRG:$0BDE Bytes:95 01 + DEC $0F ; PRG:$0BE0 Bytes:C6 0F + RTS ; PRG:$0BE2 Bytes:60 +;------------------------------------------------------------ +; ProcessCurrentObjectRoutine_CBE3 +; +; Global: +; First-pass core-game entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Game state, object pointers, and frame state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessCurrentObjectRoutine_CBE3: + LDY #$10 ; PRG:$0BE3 Bytes:A0 10 + LDA (CurrentObjectPtrLo),Y ; PRG:$0BE5 Bytes:B1 08 + STA $06 ; PRG:$0BE7 Bytes:85 06 + LDA $06 ; PRG:$0BE9 Bytes:A5 06 + BPL CorePathOnPositive_CBFA ; PRG:$0BEB Bytes:10 0D + LDX $0A ; PRG:$0BED Bytes:A6 0A + LDA #$00 ; PRG:$0BEF Bytes:A9 00 + STA $90,X ; PRG:$0BF1 Bytes:95 90 + JSR UpdateObjectBufferRoutine_E468 ; PRG:$0BF3 Bytes:20 68 E4 + JSR ReadObjectRecordRoutine_E539 ; PRG:$0BF6 Bytes:20 39 E5 + RTS ; PRG:$0BF9 Bytes:60 +CorePathOnPositive_CBFA: + CMP #$30 ; PRG:$0BFA Bytes:C9 30 + BCS CorePathOnCarry_CC23 ; PRG:$0BFC Bytes:B0 25 + JSR ReadObjectRecordRoutine_E06A ; PRG:$0BFE Bytes:20 6A E0 + LDA $0A ; PRG:$0C01 Bytes:A5 0A + JSR ReadObjectRecordRoutine_E5AA ; PRG:$0C03 Bytes:20 AA E5 + BCS CorePathContinue_CC10 ; PRG:$0C06 Bytes:B0 08 + JSR ProcessObjectStateRoutine_E17F ; PRG:$0C08 Bytes:20 7F E1 + BCC CorePathContinue_CC10 ; PRG:$0C0B Bytes:90 03 + JSR ProcessObjectStateRoutine_E1BF ; PRG:$0C0D Bytes:20 BF E1 +CorePathContinue_CC10: + JSR PrepareObjectMovementContext ; PRG:$0C10 Bytes:20 A8 CC + JSR ReadObjectRecordRoutine_E351 ; PRG:$0C13 Bytes:20 51 E3 + BCC CorePathOnNoCarry_CC22 ; PRG:$0C16 Bytes:90 0A + JSR UpdateObjectRecordRoutine_E3A7 ; PRG:$0C18 Bytes:20 A7 E3 + LDA #$04 ; PRG:$0C1B Bytes:A9 04 + STA $FC ; PRG:$0C1D Bytes:85 FC +RunGameTaskDispatch_CC1F: + JSR PrepareObjectMovementContext ; PRG:$0C1F Bytes:20 A8 CC +CorePathOnNoCarry_CC22: + RTS ; PRG:$0C22 Bytes:60 +CorePathOnCarry_CC23: + JSR ProcessObjectStateRoutine_E28F ; PRG:$0C23 Bytes:20 8F E2 + JSR ReadObjectRecordRoutine_E06A ; PRG:$0C26 Bytes:20 6A E0 + JMP RunGameTaskDispatch_CC1F ; PRG:$0C29 Bytes:4C 1F CC + .byte $00, $00, $02, $02, $00, $00, $00, $00, $02, $02, $02, $02, $00, $80, $40, $00 ; PRG:$0C2C Bytes:00 00 02 02 00 00 00 00 02 02 02 02 00 80 40 00 + .byte $00, $40, $80, $C0 ; PRG:$0C3C Bytes:00 40 80 C0 + +;------------------------------------------------------------ +; Movement tables and object-engine setup +; CPU $CC40-$CCB7 +; PRG $0C40-$0CB7 +;------------------------------------------------------------ + +MovementTables: + .byte $00, $80, $40, $C0, $80, $00, $00, $40, $00, $80, $40, $00, $00, $40, $80, $C0 ; PRG:$0C40 Bytes:00 80 40 C0 80 00 00 40 00 80 40 00 00 40 80 C0 + .byte $00, $80, $40, $C0, $C0, $40, $80, $C0, $00, $00, $00, $00, $04, $04, $04, $04 ; PRG:$0C50 Bytes:00 80 40 C0 C0 40 80 C0 00 00 00 00 04 04 04 04 + .byte $10, $F8, $10, $F8, $00, $08, $F8, $F8, $00, $00, $00, $00, $0F, $F9, $0F, $F9 ; PRG:$0C60 Bytes:10 F8 10 F8 00 08 F8 F8 00 00 00 00 0F F9 0F F9 + .byte $04, $04, $04, $04, $F8, $F8, $00, $08, $00, $00, $00, $00, $00, $00, $00, $00 ; PRG:$0C70 Bytes:04 04 04 04 F8 F8 00 08 00 00 00 00 00 00 00 00 + .byte $01, $01, $01, $01, $F8, $10, $04, $04, $F8, $F8, $10, $10, $04, $04, $04, $04 ; PRG:$0C80 Bytes:01 01 01 01 F8 10 04 04 F8 F8 10 10 04 04 04 04 + .byte $00, $08, $10, $10, $04, $04, $F8, $10, $04, $04, $04, $04, $10, $10, $F8, $F8 ; PRG:$0C90 Bytes:00 08 10 10 04 04 F8 10 04 04 04 04 10 10 F8 F8 + .byte $10, $10, $00, $08, $04, $05, $08, $09 ; PRG:$0CA0 Bytes:10 10 00 08 04 05 08 09 + +;------------------------------------------------------------ +; PrepareObjectMovementContext +; +; Global: +; Prepares an index and object-state selector before falling +; through into ObjectEngineCodeAndTables at CPU $CCB8. +; +; Parameters: +; $06 supplies a two-bit selector. +; +; Returns: +; X = $03 normally, or $0C when the selector is at least two. +; Y = $10. +; $00 = $06 & $03. +;------------------------------------------------------------ +PrepareObjectMovementContext: + LDX #$03 ; PRG:$0CA8 Bytes:A2 03 + LDA $06 ; PRG:$0CAA Bytes:A5 06 + AND #$03 ; PRG:$0CAC Bytes:29 03 + STA $00 ; PRG:$0CAE Bytes:85 00 + CMP #$02 ; PRG:$0CB0 Bytes:C9 02 + BCC @SetObjectFieldOffset ; PRG:$0CB2 Bytes:90 02 + LDX #$0C ; PRG:$0CB4 Bytes:A2 0C +@SetObjectFieldOffset: + LDY #$10 ; PRG:$0CB6 Bytes:A0 10 + +; Falls through to ObjectEngineCodeAndTables at CPU $CCB8. + +;------------------------------------------------------------ +; Object engine code with embedded lookup tables +; CPU $CCB8-$E77F +; PRG $0CB8-$277F +; +; Pass 1 recursively traced from verified entry roots in this region. +; Direct branches, jumps, and subroutine calls are decoded. +; Bytes not reached by that trace remain explicit .byte data. +;------------------------------------------------------------ + +;------------------------------------------------------------ +; ObjectEngineCodeAndTables +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectEngineCodeAndTables: + LDA (CurrentObjectPtrLo),Y ; PRG:$0CB8 Bytes:B1 08 + BMI ObjectPathContinue_CCCC ; PRG:$0CBA Bytes:30 10 + LDY #$1B ; PRG:$0CBC Bytes:A0 1B + LDA (CurrentObjectPtrLo),Y ; PRG:$0CBE Bytes:B1 08 + CMP #$50 ; PRG:$0CC0 Bytes:C9 50 + BCS ObjectPathContinue_CCE9 ; PRG:$0CC2 Bytes:B0 25 + CMP #$40 ; PRG:$0CC4 Bytes:C9 40 + BCS ObjectPathContinue_CCCC ; PRG:$0CC6 Bytes:B0 04 + CMP #$30 ; PRG:$0CC8 Bytes:C9 30 + BCS ObjectPathOnCarry_CCEF ; PRG:$0CCA Bytes:B0 23 +ObjectPathContinue_CCCC: + TXA ; PRG:$0CCC Bytes:8A + LDY $0A ; PRG:$0CCD Bytes:A4 0A + AND a:$0046,Y ; PRG:$0CCF Bytes:39 46 00 + BEQ ObjectPathContinue_CCE9 ; PRG:$0CD2 Bytes:F0 15 + JSR ProcessObjectStateRoutine_CD54 ; PRG:$0CD4 Bytes:20 54 CD + STX $07 ; PRG:$0CD7 Bytes:86 07 +ObjectPathLoop_CCD9: + JSR UpdateObjectRecordRoutine_CCF7 ; PRG:$0CD9 Bytes:20 F7 CC + LDA #$00 ; PRG:$0CDC Bytes:A9 00 +UpdateObjectRecordLoop_CCDE: + LDY #$20 ; PRG:$0CDE Bytes:A0 20 + STA (CurrentObjectPtrLo),Y ; PRG:$0CE0 Bytes:91 08 + JSR UpdateObjectRecordRoutine_CD1E ; PRG:$0CE2 Bytes:20 1E CD + JSR UpdateObjectRecordRoutine_CD45 ; PRG:$0CE5 Bytes:20 45 CD + RTS ; PRG:$0CE8 Bytes:60 +ObjectPathContinue_CCE9: + LDX $00 ; PRG:$0CE9 Bytes:A6 00 + LDA #$01 ; PRG:$0CEB Bytes:A9 01 + BNE UpdateObjectRecordLoop_CCDE ; PRG:$0CED Bytes:D0 EF +ObjectPathOnCarry_CCEF: + AND #$03 ; PRG:$0CEF Bytes:29 03 + CLC ; PRG:$0CF1 Bytes:18 + ADC #$0C ; PRG:$0CF2 Bytes:69 0C + TAX ; PRG:$0CF4 Bytes:AA + BNE ObjectPathLoop_CCD9 ; PRG:$0CF5 Bytes:D0 E2 +;------------------------------------------------------------ +; UpdateObjectRecordRoutine_CCF7 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecordRoutine_CCF7: + CLC ; PRG:$0CF7 Bytes:18 + LDY #$01 ; PRG:$0CF8 Bytes:A0 01 + LDA $CC58,X ; PRG:$0CFA Bytes:BD 58 CC + ADC (CurrentObjectPtrLo),Y ; PRG:$0CFD Bytes:71 08 + LDY #$21 ; PRG:$0CFF Bytes:A0 21 + STA (CurrentObjectPtrLo),Y ; PRG:$0D01 Bytes:91 08 + CLC ; PRG:$0D03 Bytes:18 + LDY #$03 ; PRG:$0D04 Bytes:A0 03 + LDA $CC68,X ; PRG:$0D06 Bytes:BD 68 CC + ADC (CurrentObjectPtrLo),Y ; PRG:$0D09 Bytes:71 08 + LDY #$23 ; PRG:$0D0B Bytes:A0 23 + STA (CurrentObjectPtrLo),Y ; PRG:$0D0D Bytes:91 08 + LDY #$25 ; PRG:$0D0F Bytes:A0 25 + LDA $CC78,X ; PRG:$0D11 Bytes:BD 78 CC + STA (CurrentObjectPtrLo),Y ; PRG:$0D14 Bytes:91 08 + LDY #$28 ; PRG:$0D16 Bytes:A0 28 + LDA $CC38,X ; PRG:$0D18 Bytes:BD 38 CC + STA (CurrentObjectPtrLo),Y ; PRG:$0D1B Bytes:91 08 + RTS ; PRG:$0D1D Bytes:60 +;------------------------------------------------------------ +; UpdateObjectRecordRoutine_CD1E +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecordRoutine_CD1E: + CLC ; PRG:$0D1E Bytes:18 + LDY #$01 ; PRG:$0D1F Bytes:A0 01 + LDA $CC84,X ; PRG:$0D21 Bytes:BD 84 CC + ADC (CurrentObjectPtrLo),Y ; PRG:$0D24 Bytes:71 08 + LDY #$31 ; PRG:$0D26 Bytes:A0 31 + STA (CurrentObjectPtrLo),Y ; PRG:$0D28 Bytes:91 08 + CLC ; PRG:$0D2A Bytes:18 + LDY #$03 ; PRG:$0D2B Bytes:A0 03 + LDA $CC94,X ; PRG:$0D2D Bytes:BD 94 CC + ADC (CurrentObjectPtrLo),Y ; PRG:$0D30 Bytes:71 08 + LDY #$33 ; PRG:$0D32 Bytes:A0 33 + STA (CurrentObjectPtrLo),Y ; PRG:$0D34 Bytes:91 08 + LDY #$35 ; PRG:$0D36 Bytes:A0 35 + LDA $CC2C,X ; PRG:$0D38 Bytes:BD 2C CC + STA (CurrentObjectPtrLo),Y ; PRG:$0D3B Bytes:91 08 + LDY #$38 ; PRG:$0D3D Bytes:A0 38 + LDA $CC48,X ; PRG:$0D3F Bytes:BD 48 CC + STA (CurrentObjectPtrLo),Y ; PRG:$0D42 Bytes:91 08 + RTS ; PRG:$0D44 Bytes:60 +;------------------------------------------------------------ +; UpdateObjectRecordRoutine_CD45 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecordRoutine_CD45: + LDY #$05 ; PRG:$0D45 Bytes:A0 05 + LDA $CC2C,X ; PRG:$0D47 Bytes:BD 2C CC + STA (CurrentObjectPtrLo),Y ; PRG:$0D4A Bytes:91 08 + LDY #$08 ; PRG:$0D4C Bytes:A0 08 + LDA $CC38,X ; PRG:$0D4E Bytes:BD 38 CC + STA (CurrentObjectPtrLo),Y ; PRG:$0D51 Bytes:91 08 + RTS ; PRG:$0D53 Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_CD54 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_CD54: + LDX #$00 ; PRG:$0D54 Bytes:A2 00 + CMP #$04 ; PRG:$0D56 Bytes:C9 04 + BCC ObjectPathOnNoCarry_CD5C ; PRG:$0D58 Bytes:90 02 + LDX #$03 ; PRG:$0D5A Bytes:A2 03 +ObjectPathOnNoCarry_CD5C: + CPX $00 ; PRG:$0D5C Bytes:E4 00 + BEQ ObjectPathOnZero_CD62 ; PRG:$0D5E Bytes:F0 02 + ORA #$10 ; PRG:$0D60 Bytes:09 10 +ObjectPathOnZero_CD62: + LDY #$FF ; PRG:$0D62 Bytes:A0 FF +ObjectPathLoop_CD64: + LSR A ; PRG:$0D64 Bytes:4A + INY ; PRG:$0D65 Bytes:C8 + BCC ObjectPathLoop_CD64 ; PRG:$0D66 Bytes:90 FC + LDX $CCA4,Y ; PRG:$0D68 Bytes:BE A4 CC + TAY ; PRG:$0D6B Bytes:A8 + BEQ ObjectPathOnZero_CD70 ; PRG:$0D6C Bytes:F0 02 + INX ; PRG:$0D6E Bytes:E8 + INX ; PRG:$0D6F Bytes:E8 +ObjectPathOnZero_CD70: + RTS ; PRG:$0D70 Bytes:60 + .byte $21, $24, $24, $12, $24, $24, $71, $74, $CD, $CD ; PRG:$0D71 Bytes:21 24 24 12 24 24 71 74 CD CD +;------------------------------------------------------------ +; ReadObjectRecord_CD7B +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ReadObjectRecord_CD7B: + LDX $0A ; PRG:$0D7B Bytes:A6 0A + LDA $5A,X ; PRG:$0D7D Bytes:B5 5A + BNE ObjectPathContinue_CDCD ; PRG:$0D7F Bytes:D0 4C + CLC ; PRG:$0D81 Bytes:18 + LDY #$01 ; PRG:$0D82 Bytes:A0 01 + LDA #$06 ; PRG:$0D84 Bytes:A9 06 + ADC (CurrentObjectPtrLo),Y ; PRG:$0D86 Bytes:71 08 + STA $00 ; PRG:$0D88 Bytes:85 00 + CLC ; PRG:$0D8A Bytes:18 + LDY #$03 ; PRG:$0D8B Bytes:A0 03 + LDA #$06 ; PRG:$0D8D Bytes:A9 06 + ADC (CurrentObjectPtrLo),Y ; PRG:$0D8F Bytes:71 08 + STA $01 ; PRG:$0D91 Bytes:85 01 + JSR UpdateObjectBufferRoutine_E0DF ; PRG:$0D93 Bytes:20 DF E0 + LDA $0A ; PRG:$0D96 Bytes:A5 0A + CLC ; PRG:$0D98 Bytes:18 + ADC #$04 ; PRG:$0D99 Bytes:69 04 + JSR ProcessObjectStateRoutine_E0B2 ; PRG:$0D9B Bytes:20 B2 E0 + BCS ObjectPathContinue_CDCD ; PRG:$0D9E Bytes:B0 2D + LDY #$00 ; PRG:$0DA0 Bytes:A0 00 + LDX #$80 ; PRG:$0DA2 Bytes:A2 80 + CMP #$FB ; PRG:$0DA4 Bytes:C9 FB + BEQ ObjectPathContinue_CDCE ; PRG:$0DA6 Bytes:F0 26 + INY ; PRG:$0DA8 Bytes:C8 + CMP #$FA ; PRG:$0DA9 Bytes:C9 FA + BEQ ObjectPathContinue_CDCE ; PRG:$0DAB Bytes:F0 21 + DEY ; PRG:$0DAD Bytes:88 + LDX #$00 ; PRG:$0DAE Bytes:A2 00 + CMP #$D2 ; PRG:$0DB0 Bytes:C9 D2 + BCS ObjectPathOnCarry_CDBE ; PRG:$0DB2 Bytes:B0 0A + CMP #$D0 ; PRG:$0DB4 Bytes:C9 D0 + BCS ObjectPathContinue_CDCE ; PRG:$0DB6 Bytes:B0 16 + INY ; PRG:$0DB8 Bytes:C8 + CMP #$CE ; PRG:$0DB9 Bytes:C9 CE + BCS ObjectPathContinue_CDCE ; PRG:$0DBB Bytes:B0 11 + DEY ; PRG:$0DBD Bytes:88 +ObjectPathOnCarry_CDBE: + LDX #$04 ; PRG:$0DBE Bytes:A2 04 + CMP #$F9 ; PRG:$0DC0 Bytes:C9 F9 + BCS ObjectPathContinue_CDCD ; PRG:$0DC2 Bytes:B0 09 + CMP #$F7 ; PRG:$0DC4 Bytes:C9 F7 + BCS ObjectPathContinue_CDCE ; PRG:$0DC6 Bytes:B0 06 + INY ; PRG:$0DC8 Bytes:C8 + CMP #$F5 ; PRG:$0DC9 Bytes:C9 F5 + BCS ObjectPathContinue_CDCE ; PRG:$0DCB Bytes:B0 01 +ObjectPathContinue_CDCD: + RTS ; PRG:$0DCD Bytes:60 +ObjectPathContinue_CDCE: + STY $0D ; PRG:$0DCE Bytes:84 0D + STX $0E ; PRG:$0DD0 Bytes:86 0E + LDX $0A ; PRG:$0DD2 Bytes:A6 0A + LDA #$08 ; PRG:$0DD4 Bytes:A9 08 + STA $5A,X ; PRG:$0DD6 Bytes:95 5A + LDX #$01 ; PRG:$0DD8 Bytes:A2 01 + LDA $8F ; PRG:$0DDA Bytes:A5 8F + BNE UpdateObjectBufferContinue_CDE4 ; PRG:$0DDC Bytes:D0 06 + LDA $0E ; PRG:$0DDE Bytes:A5 0E + BPL UpdateObjectBufferContinue_CDE4 ; PRG:$0DE0 Bytes:10 02 + LDX #$28 ; PRG:$0DE2 Bytes:A2 28 +UpdateObjectBufferContinue_CDE4: + STX $07 ; PRG:$0DE4 Bytes:86 07 + JSR ProcessObjectStateRoutine_CE50 ; PRG:$0DE6 Bytes:20 50 CE + BCS ObjectPathContinue_CE33 ; PRG:$0DE9 Bytes:B0 48 + LDA WorkPtr1Lo ; PRG:$0DEB Bytes:A5 02 + STA $01 ; PRG:$0DED Bytes:85 01 + LDA $03 ; PRG:$0DEF Bytes:A5 03 + STA $00 ; PRG:$0DF1 Bytes:85 00 + LDY $0D ; PRG:$0DF3 Bytes:A4 0D + LDA $CD77,Y ; PRG:$0DF5 Bytes:B9 77 CD + STA $02 ; PRG:$0DF8 Bytes:85 02 + LDA $CD79,Y ; PRG:$0DFA Bytes:B9 79 CD + STA $03 ; PRG:$0DFD Bytes:85 03 + JSR UpdateCommandBufferRoutine_F3A1 ; PRG:$0DFF Bytes:20 A1 F3 + LDA #$80 ; PRG:$0E02 Bytes:A9 80 + STA $FF ; PRG:$0E04 Bytes:85 FF + LDX $0A ; PRG:$0E06 Bytes:A6 0A + LDA #$01 ; PRG:$0E08 Bytes:A9 01 + STA $00 ; PRG:$0E0A Bytes:85 00 + LDA $0E ; PRG:$0E0C Bytes:A5 0E + CMP #$04 ; PRG:$0E0E Bytes:C9 04 + BEQ ObjectPathOnZero_CE34 ; PRG:$0E10 Bytes:F0 22 + INC $D4,X ; PRG:$0E12 Bytes:F6 D4 + LDA #$06 ; PRG:$0E14 Bytes:A9 06 + STA $01 ; PRG:$0E16 Bytes:85 01 + JSR ProcessResourceStateRoutine_F408 ; PRG:$0E18 Bytes:20 08 F4 + LDA $3F ; PRG:$0E1B Bytes:A5 3F + BNE ProcessObjectStateDispatch_CE2A ; PRG:$0E1D Bytes:D0 0B + LDA $8D ; PRG:$0E1F Bytes:A5 8D + BEQ ObjectPathOnZero_CE26 ; PRG:$0E21 Bytes:F0 03 + JMP RunGameTaskRoutine_C3E4 ; PRG:$0E23 Bytes:4C E4 C3 +ObjectPathOnZero_CE26: + LDA #$23 ; PRG:$0E26 Bytes:A9 23 + STA $78 ; PRG:$0E28 Bytes:85 78 +ProcessObjectStateDispatch_CE2A: + LDA $8F ; PRG:$0E2A Bytes:A5 8F + BNE ObjectPathContinue_CE33 ; PRG:$0E2C Bytes:D0 05 + LDA #$68 ; PRG:$0E2E Bytes:A9 68 + JSR ProcessResourceStateRoutine_F31A ; PRG:$0E30 Bytes:20 1A F3 +ObjectPathContinue_CE33: + RTS ; PRG:$0E33 Bytes:60 +ObjectPathOnZero_CE34: + LDA $8E ; PRG:$0E34 Bytes:A5 8E + BEQ ObjectPathOnZero_CE41 ; PRG:$0E36 Bytes:F0 09 + DEC $D4,X ; PRG:$0E38 Bytes:D6 D4 + LDA #$06 ; PRG:$0E3A Bytes:A9 06 + STA $01 ; PRG:$0E3C Bytes:85 01 + JSR ProcessResourceStateRoutine_F40C ; PRG:$0E3E Bytes:20 0C F4 +ObjectPathOnZero_CE41: + JMP ProcessObjectStateDispatch_CE2A ; PRG:$0E41 Bytes:4C 2A CE + .byte $21, $00, $00, $10, $08, $12, $00, $00, $08, $10, $40, $80 ; PRG:$0E44 Bytes:21 00 00 10 08 12 00 00 08 10 40 80 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_CE50 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_CE50: + LDA #$00 ; PRG:$0E50 Bytes:A9 00 + STA $04 ; PRG:$0E52 Bytes:85 04 + STA $0B ; PRG:$0E54 Bytes:85 0B + LDA #$05 ; PRG:$0E56 Bytes:A9 05 + STA $05 ; PRG:$0E58 Bytes:85 05 + STA $0C ; PRG:$0E5A Bytes:85 0C + LDA #$07 ; PRG:$0E5C Bytes:A9 07 + STA $0F ; PRG:$0E5E Bytes:85 0F +ObjectPathLoop_CE60: + LDY #$10 ; PRG:$0E60 Bytes:A0 10 + LDA ($04),Y ; PRG:$0E62 Bytes:B1 04 + BEQ ObjectPathOnZero_CE6F ; PRG:$0E64 Bytes:F0 09 + LDX #$04 ; PRG:$0E66 Bytes:A2 04 + JSR RunGameTaskRoutine_CBD3 ; PRG:$0E68 Bytes:20 D3 CB + BPL ObjectPathLoop_CE60 ; PRG:$0E6B Bytes:10 F3 +ObjectPathLoop_CE6D: + SEC ; PRG:$0E6D Bytes:38 + RTS ; PRG:$0E6E Bytes:60 +ObjectPathOnZero_CE6F: + LDA WorkPtr1Lo ; PRG:$0E6F Bytes:A5 02 + BEQ ObjectPathOnZero_CE9D ; PRG:$0E71 Bytes:F0 2A + JSR UpdateObjectBufferRoutine_E0F9 ; PRG:$0E73 Bytes:20 F9 E0 + LDA #$07 ; PRG:$0E76 Bytes:A9 07 + STA $0F ; PRG:$0E78 Bytes:85 0F +ObjectPathLoop_CE7A: + LDY #$10 ; PRG:$0E7A Bytes:A0 10 + LDA ($0B),Y ; PRG:$0E7C Bytes:B1 0B + BEQ ObjectPathContinue_CE96 ; PRG:$0E7E Bytes:F0 16 + LDY #$12 ; PRG:$0E80 Bytes:A0 12 + LDA ($0B),Y ; PRG:$0E82 Bytes:B1 0B + BEQ ObjectPathContinue_CE96 ; PRG:$0E84 Bytes:F0 10 + LDY #$01 ; PRG:$0E86 Bytes:A0 01 + LDA ($0B),Y ; PRG:$0E88 Bytes:B1 0B + CMP $00 ; PRG:$0E8A Bytes:C5 00 + BNE ObjectPathContinue_CE96 ; PRG:$0E8C Bytes:D0 08 + LDY #$03 ; PRG:$0E8E Bytes:A0 03 + LDA ($0B),Y ; PRG:$0E90 Bytes:B1 0B + CMP $01 ; PRG:$0E92 Bytes:C5 01 + BEQ ObjectPathLoop_CE6D ; PRG:$0E94 Bytes:F0 D7 +ObjectPathContinue_CE96: + LDX #$0B ; PRG:$0E96 Bytes:A2 0B + JSR RunGameTaskRoutine_CBD3 ; PRG:$0E98 Bytes:20 D3 CB + BPL ObjectPathLoop_CE7A ; PRG:$0E9B Bytes:10 DD +ObjectPathOnZero_CE9D: + LDY #$00 ; PRG:$0E9D Bytes:A0 00 + LDA #$00 ; PRG:$0E9F Bytes:A9 00 + STA ($04),Y ; PRG:$0EA1 Bytes:91 04 + INY ; PRG:$0EA3 Bytes:C8 + LDA WorkPtr0Lo ; PRG:$0EA4 Bytes:A5 00 + STA ($04),Y ; PRG:$0EA6 Bytes:91 04 + INY ; PRG:$0EA8 Bytes:C8 + LDA #$00 ; PRG:$0EA9 Bytes:A9 00 + STA ($04),Y ; PRG:$0EAB Bytes:91 04 + INY ; PRG:$0EAD Bytes:C8 + LDA WorkPtr0Hi ; PRG:$0EAE Bytes:A5 01 + STA ($04),Y ; PRG:$0EB0 Bytes:91 04 + INY ; PRG:$0EB2 Bytes:C8 + LDA #$00 ; PRG:$0EB3 Bytes:A9 00 + STA ($04),Y ; PRG:$0EB5 Bytes:91 04 + LDY #$14 ; PRG:$0EB7 Bytes:A0 14 + LDA $0E ; PRG:$0EB9 Bytes:A5 0E + STA ($04),Y ; PRG:$0EBB Bytes:91 04 + AND #$0F ; PRG:$0EBD Bytes:29 0F + LDX #$00 ; PRG:$0EBF Bytes:A2 00 + LDY $0D ; PRG:$0EC1 Bytes:A4 0D + BEQ ObjectPathOnZero_CECA ; PRG:$0EC3 Bytes:F0 05 + CLC ; PRG:$0EC5 Bytes:18 + ADC #$0A ; PRG:$0EC6 Bytes:69 0A + LDX #$05 ; PRG:$0EC8 Bytes:A2 05 +ObjectPathOnZero_CECA: + LDY #$05 ; PRG:$0ECA Bytes:A0 05 + STA ($04),Y ; PRG:$0ECC Bytes:91 04 + LDY #$0A ; PRG:$0ECE Bytes:A0 0A + LDA $CE44,X ; PRG:$0ED0 Bytes:BD 44 CE + STA ($04),Y ; PRG:$0ED3 Bytes:91 04 + LDY #$0C ; PRG:$0ED5 Bytes:A0 0C +ObjectPathLoop_CED7: + INX ; PRG:$0ED7 Bytes:E8 + LDA $CE44,X ; PRG:$0ED8 Bytes:BD 44 CE + STA ($04),Y ; PRG:$0EDB Bytes:91 04 + INY ; PRG:$0EDD Bytes:C8 + CPY #$10 ; PRG:$0EDE Bytes:C0 10 + BNE ObjectPathLoop_CED7 ; PRG:$0EE0 Bytes:D0 F5 + LDY #$10 ; PRG:$0EE2 Bytes:A0 10 + LDA $08 ; PRG:$0EE4 Bytes:A5 08 + STA $00 ; PRG:$0EE6 Bytes:85 00 + LDA $09 ; PRG:$0EE8 Bytes:A5 09 + STA $01 ; PRG:$0EEA Bytes:85 01 + JSR ProcessObjectStateRoutine_D94D ; PRG:$0EEC Bytes:20 4D D9 + ORA #$10 ; PRG:$0EEF Bytes:09 10 + STA ($04),Y ; PRG:$0EF1 Bytes:91 04 + AND #$01 ; PRG:$0EF3 Bytes:29 01 + BEQ ObjectPathContinue_CF02 ; PRG:$0EF5 Bytes:F0 0B + LDA #$00 ; PRG:$0EF7 Bytes:A9 00 + LDY $02 ; PRG:$0EF9 Bytes:A4 02 + BNE ObjectPathContinue_CF02 ; PRG:$0EFB Bytes:D0 05 + LDY $0D ; PRG:$0EFD Bytes:A4 0D + LDA $CE4E,Y ; PRG:$0EFF Bytes:B9 4E CE +ObjectPathContinue_CF02: + LDY #$08 ; PRG:$0F02 Bytes:A0 08 + STA ($04),Y ; PRG:$0F04 Bytes:91 04 + LDY #$11 ; PRG:$0F06 Bytes:A0 11 + LDA $07 ; PRG:$0F08 Bytes:A5 07 + STA ($04),Y ; PRG:$0F0A Bytes:91 04 + LDA WorkPtr1Lo ; PRG:$0F0C Bytes:A5 02 + BEQ ObjectPathContinue_CF1E ; PRG:$0F0E Bytes:F0 0E + LDA #$0D ; PRG:$0F10 Bytes:A9 0D + LDX $8E ; PRG:$0F12 Bytes:A6 8E + BNE ObjectPathContinue_CF1E ; PRG:$0F14 Bytes:D0 08 + LDX $0E ; PRG:$0F16 Bytes:A6 0E + CPX #$04 ; PRG:$0F18 Bytes:E0 04 + BNE ObjectPathContinue_CF1E ; PRG:$0F1A Bytes:D0 02 + LDA #$09 ; PRG:$0F1C Bytes:A9 09 +ObjectPathContinue_CF1E: + INY ; PRG:$0F1E Bytes:C8 + STA ($04),Y ; PRG:$0F1F Bytes:91 04 + INY ; PRG:$0F21 Bytes:C8 + LDA #$02 ; PRG:$0F22 Bytes:A9 02 + STA ($04),Y ; PRG:$0F24 Bytes:91 04 + CLC ; PRG:$0F26 Bytes:18 + RTS ; PRG:$0F27 Bytes:60 + .byte $21, $D0, $D1, $12, $CE, $CF, $21, $F7, $F8, $12, $F5, $F6, $02, $FD, $02, $FD ; PRG:$0F28 Bytes:21 D0 D1 12 CE CF 21 F7 F8 12 F5 F6 02 FD 02 FD + .byte $60, $A0, $60, $A0 ; PRG:$0F38 Bytes:60 A0 60 A0 +ReadObjectRecordDispatch_CF3C: + LDY #$01 ; PRG:$0F3C Bytes:A0 01 + LDA (CurrentObjectPtrLo),Y ; PRG:$0F3E Bytes:B1 08 + STA WorkPtr0Lo ; PRG:$0F40 Bytes:85 00 + LDY #$03 ; PRG:$0F42 Bytes:A0 03 + LDA (CurrentObjectPtrLo),Y ; PRG:$0F44 Bytes:B1 08 + STA WorkPtr0Hi ; PRG:$0F46 Bytes:85 01 + JSR UpdateObjectBufferRoutine_E0DF ; PRG:$0F48 Bytes:20 DF E0 + LDY #$05 ; PRG:$0F4B Bytes:A0 05 + LDA (CurrentObjectPtrLo),Y ; PRG:$0F4D Bytes:B1 08 + LDX #$28 ; PRG:$0F4F Bytes:A2 28 + LDY #$CF ; PRG:$0F51 Bytes:A0 CF + CMP #$00 ; PRG:$0F53 Bytes:C9 00 + BEQ UpdateObjectRecordOnZero_CF6B ; PRG:$0F55 Bytes:F0 14 + LDX #$2B ; PRG:$0F57 Bytes:A2 2B + LDY #$CF ; PRG:$0F59 Bytes:A0 CF + CMP #$0A ; PRG:$0F5B Bytes:C9 0A + BEQ UpdateObjectRecordOnZero_CF6B ; PRG:$0F5D Bytes:F0 0C + LDX #$2E ; PRG:$0F5F Bytes:A2 2E + LDY #$CF ; PRG:$0F61 Bytes:A0 CF + CMP #$04 ; PRG:$0F63 Bytes:C9 04 + BEQ UpdateObjectRecordOnZero_CF6B ; PRG:$0F65 Bytes:F0 04 + LDX #$31 ; PRG:$0F67 Bytes:A2 31 + LDY #$CF ; PRG:$0F69 Bytes:A0 CF +UpdateObjectRecordOnZero_CF6B: + LDA WorkPtr1Lo ; PRG:$0F6B Bytes:A5 02 + STA WorkPtr0Hi ; PRG:$0F6D Bytes:85 01 + LDA WorkPtr1Hi ; PRG:$0F6F Bytes:A5 03 + STA WorkPtr0Lo ; PRG:$0F71 Bytes:85 00 + STX WorkPtr1Lo ; PRG:$0F73 Bytes:86 02 + STY WorkPtr1Hi ; PRG:$0F75 Bytes:84 03 + JSR UpdateCommandBufferRoutine_F3A1 ; PRG:$0F77 Bytes:20 A1 F3 + LDY #$05 ; PRG:$0F7A Bytes:A0 05 + LDA (CurrentObjectPtrLo),Y ; PRG:$0F7C Bytes:B1 08 + CMP #$05 ; PRG:$0F7E Bytes:C9 05 + LDA #$14 ; PRG:$0F80 Bytes:A9 14 + STA (CurrentObjectPtrLo),Y ; PRG:$0F82 Bytes:91 08 + BCS UpdateObjectRecordOnCarry_CF96 ; PRG:$0F84 Bytes:B0 10 + LDY #$01 ; PRG:$0F86 Bytes:A0 01 + LDA (CurrentObjectPtrLo),Y ; PRG:$0F88 Bytes:B1 08 + ADC #$04 ; PRG:$0F8A Bytes:69 04 + STA (CurrentObjectPtrLo),Y ; PRG:$0F8C Bytes:91 08 + LDY #$03 ; PRG:$0F8E Bytes:A0 03 + LDA (CurrentObjectPtrLo),Y ; PRG:$0F90 Bytes:B1 08 + SBC #$03 ; PRG:$0F92 Bytes:E9 03 + STA (CurrentObjectPtrLo),Y ; PRG:$0F94 Bytes:91 08 +UpdateObjectRecordOnCarry_CF96: + LDY #$0A ; PRG:$0F96 Bytes:A0 0A + LDA #$12 ; PRG:$0F98 Bytes:A9 12 + STA (CurrentObjectPtrLo),Y ; PRG:$0F9A Bytes:91 08 + BNE UpdateObjectRecordLoop_CFAD ; PRG:$0F9C Bytes:D0 0F +ObjectPathLoop_CF9E: + JMP ReadObjectRecordDispatch_CF3C ; PRG:$0F9E Bytes:4C 3C CF +;------------------------------------------------------------ +; ObjectPath_CFA1 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_CFA1: + LDA #$00 ; PRG:$0FA1 Bytes:A9 00 + STA CurrentObjectPtrLo ; PRG:$0FA3 Bytes:85 08 + LDA #$05 ; PRG:$0FA5 Bytes:A9 05 + STA CurrentObjectPtrHi ; PRG:$0FA7 Bytes:85 09 + LDA #$07 ; PRG:$0FA9 Bytes:A9 07 + STA LoopCounter ; PRG:$0FAB Bytes:85 0F +UpdateObjectRecordLoop_CFAD: + LDY #$10 ; PRG:$0FAD Bytes:A0 10 + LDA (CurrentObjectPtrLo),Y ; PRG:$0FAF Bytes:B1 08 + BEQ ProcessObjectStateDispatch_CFFA ; PRG:$0FB1 Bytes:F0 47 + STA WorkPtr0Lo ; PRG:$0FB3 Bytes:85 00 + LDY #$12 ; PRG:$0FB5 Bytes:A0 12 + LDA (CurrentObjectPtrLo),Y ; PRG:$0FB7 Bytes:B1 08 + BEQ UpdateObjectRecordOnZero_D004 ; PRG:$0FB9 Bytes:F0 49 + INY ; PRG:$0FBB Bytes:C8 + LDA (CurrentObjectPtrLo),Y ; PRG:$0FBC Bytes:B1 08 + SEC ; PRG:$0FBE Bytes:38 + SBC #$01 ; PRG:$0FBF Bytes:E9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$0FC1 Bytes:91 08 + BNE ProcessObjectStateDispatch_CFFA ; PRG:$0FC3 Bytes:D0 35 + LDA #$03 ; PRG:$0FC5 Bytes:A9 03 + STA (CurrentObjectPtrLo),Y ; PRG:$0FC7 Bytes:91 08 + DEY ; PRG:$0FC9 Bytes:88 + LDA (CurrentObjectPtrLo),Y ; PRG:$0FCA Bytes:B1 08 + SEC ; PRG:$0FCC Bytes:38 + SBC #$01 ; PRG:$0FCD Bytes:E9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$0FCF Bytes:91 08 + BEQ ObjectPathLoop_CF9E ; PRG:$0FD1 Bytes:F0 CB + LDA WorkPtr0Lo ; PRG:$0FD3 Bytes:A5 00 + AND #$01 ; PRG:$0FD5 Bytes:29 01 + BNE ReadObjectRecordOnNonZero_CFDB ; PRG:$0FD7 Bytes:D0 02 + LDA #$FF ; PRG:$0FD9 Bytes:A9 FF +ReadObjectRecordOnNonZero_CFDB: + LDX #$07 ; PRG:$0FDB Bytes:A2 07 + LDY #$05 ; PRG:$0FDD Bytes:A0 05 + CLC ; PRG:$0FDF Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$0FE0 Bytes:71 08 + BMI UpdateObjectRecordContinue_CFF7 ; PRG:$0FE2 Bytes:30 13 + LDX #$00 ; PRG:$0FE4 Bytes:A2 00 + CMP #$08 ; PRG:$0FE6 Bytes:C9 08 + BEQ UpdateObjectRecordContinue_CFF7 ; PRG:$0FE8 Bytes:F0 0D + LDX #$11 ; PRG:$0FEA Bytes:A2 11 + CMP #$09 ; PRG:$0FEC Bytes:C9 09 + BEQ UpdateObjectRecordContinue_CFF7 ; PRG:$0FEE Bytes:F0 07 + LDX #$0A ; PRG:$0FF0 Bytes:A2 0A + CMP #$12 ; PRG:$0FF2 Bytes:C9 12 + BEQ UpdateObjectRecordContinue_CFF7 ; PRG:$0FF4 Bytes:F0 01 + TAX ; PRG:$0FF6 Bytes:AA +UpdateObjectRecordContinue_CFF7: + TXA ; PRG:$0FF7 Bytes:8A + STA (CurrentObjectPtrLo),Y ; PRG:$0FF8 Bytes:91 08 +ProcessObjectStateDispatch_CFFA: + LDX #$08 ; PRG:$0FFA Bytes:A2 08 + JSR RunGameTaskRoutine_CBD3 ; PRG:$0FFC Bytes:20 D3 CB + BPL UpdateObjectRecordLoop_CFAD ; PRG:$0FFF Bytes:10 AC + DEC $A5 ; PRG:$1001 Bytes:C6 A5 + RTS ; PRG:$1003 Bytes:60 +UpdateObjectRecordOnZero_D004: + DEY ; PRG:$1004 Bytes:88 + LDA (CurrentObjectPtrLo),Y ; PRG:$1005 Bytes:B1 08 + SEC ; PRG:$1007 Bytes:38 + SBC #$01 ; PRG:$1008 Bytes:E9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$100A Bytes:91 08 + BEQ UpdateObjectRecordOnZero_D052 ; PRG:$100C Bytes:F0 44 + CMP #$23 ; PRG:$100E Bytes:C9 23 + BCS UpdateObjectRecordOnCarry_D01A ; PRG:$1010 Bytes:B0 08 + LDY #$05 ; PRG:$1012 Bytes:A0 05 + LDA (CurrentObjectPtrLo),Y ; PRG:$1014 Bytes:B1 08 + CMP #$14 ; PRG:$1016 Bytes:C9 14 + BCS ProcessObjectStateDispatch_D04F ; PRG:$1018 Bytes:B0 35 +UpdateObjectRecordOnCarry_D01A: + LDA WorkPtr0Lo ; PRG:$101A Bytes:A5 00 + AND #$03 ; PRG:$101C Bytes:29 03 + TAX ; PRG:$101E Bytes:AA + LDY $E17B,X ; PRG:$101F Bytes:BC 7B E1 + INY ; PRG:$1022 Bytes:C8 + CLC ; PRG:$1023 Bytes:18 + LDA $CF38,X ; PRG:$1024 Bytes:BD 38 CF + ADC (CurrentObjectPtrLo),Y ; PRG:$1027 Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$1029 Bytes:91 08 + DEY ; PRG:$102B Bytes:88 + LDA $CF34,X ; PRG:$102C Bytes:BD 34 CF + ADC (CurrentObjectPtrLo),Y ; PRG:$102F Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$1031 Bytes:91 08 + LDY #$05 ; PRG:$1033 Bytes:A0 05 + LDA (CurrentObjectPtrLo),Y ; PRG:$1035 Bytes:B1 08 + CMP #$14 ; PRG:$1037 Bytes:C9 14 + BCS ProcessObjectStateDispatch_D04F ; PRG:$1039 Bytes:B0 14 + LDX #$08 ; PRG:$103B Bytes:A2 08 + LDA WorkPtr0Lo ; PRG:$103D Bytes:A5 00 + AND #$02 ; PRG:$103F Bytes:29 02 + BNE ObjectPathOnNonZero_D045 ; PRG:$1041 Bytes:D0 02 + LDX #$12 ; PRG:$1043 Bytes:A2 12 +ObjectPathOnNonZero_D045: + LDA $A5 ; PRG:$1045 Bytes:A5 A5 + AND #$01 ; PRG:$1047 Bytes:29 01 + BEQ UpdateObjectRecordOnZero_D04C ; PRG:$1049 Bytes:F0 01 + INX ; PRG:$104B Bytes:E8 +UpdateObjectRecordOnZero_D04C: + TXA ; PRG:$104C Bytes:8A + STA (CurrentObjectPtrLo),Y ; PRG:$104D Bytes:91 08 +ProcessObjectStateDispatch_D04F: + JMP ProcessObjectStateDispatch_CFFA ; PRG:$104F Bytes:4C FA CF +UpdateObjectRecordOnZero_D052: + DEY ; PRG:$1052 Bytes:88 + STA (CurrentObjectPtrLo),Y ; PRG:$1053 Bytes:91 08 + LDY #$00 ; PRG:$1055 Bytes:A0 00 + LDA #$01 ; PRG:$1057 Bytes:A9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$1059 Bytes:91 08 + LDY #$05 ; PRG:$105B Bytes:A0 05 + LDA (CurrentObjectPtrLo),Y ; PRG:$105D Bytes:B1 08 + CMP #$14 ; PRG:$105F Bytes:C9 14 + BCS ProcessObjectStateDispatch_D04F ; PRG:$1061 Bytes:B0 EC + LDY #$15 ; PRG:$1063 Bytes:A0 15 + LDA (CurrentObjectPtrLo),Y ; PRG:$1065 Bytes:B1 08 + TAX ; PRG:$1067 Bytes:AA + DEC $DA,X ; PRG:$1068 Bytes:D6 DA + JMP ProcessObjectStateDispatch_D04F ; PRG:$106A Bytes:4C 4F D0 +;------------------------------------------------------------ +; ObjectPath_D06D +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_D06D: + LDA #$20 ; PRG:$106D Bytes:A9 20 + STA $00 ; PRG:$106F Bytes:85 00 + LDA #$04 ; PRG:$1071 Bytes:A9 04 + STA $01 ; PRG:$1073 Bytes:85 01 + JSR ProcessResourceStateRoutine_F601 ; PRG:$1075 Bytes:20 01 F6 + LDA #$30 ; PRG:$1078 Bytes:A9 30 + STA $00 ; PRG:$107A Bytes:85 00 + LDA #$04 ; PRG:$107C Bytes:A9 04 + STA $01 ; PRG:$107E Bytes:85 01 + JSR ProcessResourceStateRoutine_F601 ; PRG:$1080 Bytes:20 01 F6 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_D083 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_D083: + LDA #$00 ; PRG:$1083 Bytes:A9 00 + STA $00 ; PRG:$1085 Bytes:85 00 + LDA #$04 ; PRG:$1087 Bytes:A9 04 + STA $01 ; PRG:$1089 Bytes:85 01 + JSR ProcessResourceStateRoutine_F601 ; PRG:$108B Bytes:20 01 F6 + RTS ; PRG:$108E Bytes:60 +;------------------------------------------------------------ +; ObjectPath_D08F +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_D08F: + LDA #$60 ; PRG:$108F Bytes:A9 60 + STA $00 ; PRG:$1091 Bytes:85 00 + LDA #$04 ; PRG:$1093 Bytes:A9 04 + STA $01 ; PRG:$1095 Bytes:85 01 + JSR ProcessResourceStateRoutine_F601 ; PRG:$1097 Bytes:20 01 F6 + LDA #$70 ; PRG:$109A Bytes:A9 70 + STA $00 ; PRG:$109C Bytes:85 00 + LDA #$04 ; PRG:$109E Bytes:A9 04 + STA $01 ; PRG:$10A0 Bytes:85 01 + JSR ProcessResourceStateRoutine_F601 ; PRG:$10A2 Bytes:20 01 F6 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_D0A5 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_D0A5: + LDA #$40 ; PRG:$10A5 Bytes:A9 40 + STA $00 ; PRG:$10A7 Bytes:85 00 + LDA #$04 ; PRG:$10A9 Bytes:A9 04 + STA $01 ; PRG:$10AB Bytes:85 01 + JSR ProcessResourceStateRoutine_F601 ; PRG:$10AD Bytes:20 01 F6 + RTS ; PRG:$10B0 Bytes:60 +;------------------------------------------------------------ +; ObjectPath_D0B1 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_D0B1: + LDA #$00 ; PRG:$10B1 Bytes:A9 00 + STA $00 ; PRG:$10B3 Bytes:85 00 + LDA #$05 ; PRG:$10B5 Bytes:A9 05 + STA $01 ; PRG:$10B7 Bytes:85 01 + LDA #$07 ; PRG:$10B9 Bytes:A9 07 + STA $0F ; PRG:$10BB Bytes:85 0F +ObjectPathLoop_D0BD: + JSR ProcessResourceStateRoutine_F601 ; PRG:$10BD Bytes:20 01 F6 + LDX #$00 ; PRG:$10C0 Bytes:A2 00 + JSR RunGameTaskRoutine_CBD3 ; PRG:$10C2 Bytes:20 D3 CB + BPL ObjectPathLoop_D0BD ; PRG:$10C5 Bytes:10 F6 + RTS ; PRG:$10C7 Bytes:60 +;------------------------------------------------------------ +; UpdateObjectBuffer_D0C8 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBuffer_D0C8: + LDA #$80 ; PRG:$10C8 Bytes:A9 80 + STA $00 ; PRG:$10CA Bytes:85 00 + LDA #$04 ; PRG:$10CC Bytes:A9 04 + STA $01 ; PRG:$10CE Bytes:85 01 + LDA #$03 ; PRG:$10D0 Bytes:A9 03 + STA $0F ; PRG:$10D2 Bytes:85 0F +ObjectPathLoop_D0D4: + JSR ProcessResourceStateRoutine_F601 ; PRG:$10D4 Bytes:20 01 F6 + LDX #$00 ; PRG:$10D7 Bytes:A2 00 + JSR RunGameTaskRoutine_CBD3 ; PRG:$10D9 Bytes:20 D3 CB + BPL ObjectPathLoop_D0D4 ; PRG:$10DC Bytes:10 F6 + RTS ; PRG:$10DE Bytes:60 +;------------------------------------------------------------ +; ObjectPath_D0DF +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_D0DF: + LDA #$00 ; PRG:$10DF Bytes:A9 00 + STA $00 ; PRG:$10E1 Bytes:85 00 + LDA #$06 ; PRG:$10E3 Bytes:A9 06 + STA $01 ; PRG:$10E5 Bytes:85 01 + LDA #$07 ; PRG:$10E7 Bytes:A9 07 + STA $0F ; PRG:$10E9 Bytes:85 0F +ObjectPathLoop_D0EB: + JSR ProcessResourceStateRoutine_F601 ; PRG:$10EB Bytes:20 01 F6 + LDX #$00 ; PRG:$10EE Bytes:A2 00 + JSR RunGameTaskRoutine_CBD3 ; PRG:$10F0 Bytes:20 D3 CB + BPL ObjectPathLoop_D0EB ; PRG:$10F3 Bytes:10 F6 + RTS ; PRG:$10F5 Bytes:60 +;------------------------------------------------------------ +; UpdateObjectBuffer_D0F6 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBuffer_D0F6: + LDA #$C0 ; PRG:$10F6 Bytes:A9 C0 + STA $00 ; PRG:$10F8 Bytes:85 00 + LDA #$03 ; PRG:$10FA Bytes:A9 03 + STA $01 ; PRG:$10FC Bytes:85 01 + LDA #$02 ; PRG:$10FE Bytes:A9 02 + STA $0F ; PRG:$1100 Bytes:85 0F +ObjectPathLoop_D102: + JSR ProcessResourceStateRoutine_F601 ; PRG:$1102 Bytes:20 01 F6 + JSR ProcessObjectStateRoutine_DDB2 ; PRG:$1105 Bytes:20 B2 DD + DEC $0F ; PRG:$1108 Bytes:C6 0F + BPL ObjectPathLoop_D102 ; PRG:$110A Bytes:10 F6 + RTS ; PRG:$110C Bytes:60 + .byte $02, $03, $07, $0E, $0F, $11, $0A, $0B, $0B, $0C, $11, $0D, $0E, $0F, $0F, $10 ; PRG:$110D Bytes:02 03 07 0E 0F 11 0A 0B 0B 0C 11 0D 0E 0F 0F 10 + .byte $0D ; PRG:$111D Bytes:0D +;------------------------------------------------------------ +; ReadObjectRecord_D11E +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ReadObjectRecord_D11E: + LDY #$10 ; PRG:$111E Bytes:A0 10 + LDA (CurrentObjectPtrLo),Y ; PRG:$1120 Bytes:B1 08 + STA $06 ; PRG:$1122 Bytes:85 06 + BMI ObjectPathContinue_D132 ; PRG:$1124 Bytes:30 0C + LDY #$1B ; PRG:$1126 Bytes:A0 1B + LDA (CurrentObjectPtrLo),Y ; PRG:$1128 Bytes:B1 08 + CMP #$10 ; PRG:$112A Bytes:C9 10 + BCC ObjectPathContinue_D132 ; PRG:$112C Bytes:90 04 + CMP #$40 ; PRG:$112E Bytes:C9 40 + BCC ObjectPathOnNoCarry_D14F ; PRG:$1130 Bytes:90 1D +ObjectPathContinue_D132: + LDA $54 ; PRG:$1132 Bytes:A5 54 + BNE UpdateObjectRecordOnNonZero_D13A ; PRG:$1134 Bytes:D0 04 + LDA #$09 ; PRG:$1136 Bytes:A9 09 + STA $54 ; PRG:$1138 Bytes:85 54 +UpdateObjectRecordOnNonZero_D13A: + CMP #$05 ; PRG:$113A Bytes:C9 05 + BCC ObjectPathOnNoCarry_D14E ; PRG:$113C Bytes:90 10 + LDY #$35 ; PRG:$113E Bytes:A0 35 + LDA #$01 ; PRG:$1140 Bytes:A9 01 + EOR (CurrentObjectPtrLo),Y ; PRG:$1142 Bytes:51 08 + STA (CurrentObjectPtrLo),Y ; PRG:$1144 Bytes:91 08 + LDY #$05 ; PRG:$1146 Bytes:A0 05 + LDA #$01 ; PRG:$1148 Bytes:A9 01 + EOR (CurrentObjectPtrLo),Y ; PRG:$114A Bytes:51 08 + STA (CurrentObjectPtrLo),Y ; PRG:$114C Bytes:91 08 +ObjectPathOnNoCarry_D14E: + RTS ; PRG:$114E Bytes:60 +ObjectPathOnNoCarry_D14F: + LDX #$00 ; PRG:$114F Bytes:A2 00 + LDY $0A ; PRG:$1151 Bytes:A4 0A + LDA a:$0058,Y ; PRG:$1153 Bytes:B9 58 00 + LDY #$04 ; PRG:$1156 Bytes:A0 04 +ObjectPathLoop_D158: + CMP $D10D,Y ; PRG:$1158 Bytes:D9 0D D1 + BCS ObjectPathOnCarry_D161 ; PRG:$115B Bytes:B0 04 + INX ; PRG:$115D Bytes:E8 + DEY ; PRG:$115E Bytes:88 + BPL ObjectPathLoop_D158 ; PRG:$115F Bytes:10 F7 +ObjectPathOnCarry_D161: + LDA $06 ; PRG:$1161 Bytes:A5 06 + AND #$03 ; PRG:$1163 Bytes:29 03 + CMP #$02 ; PRG:$1165 Bytes:C9 02 + TXA ; PRG:$1167 Bytes:8A + BCC UpdateObjectRecordOnNoCarry_D16D ; PRG:$1168 Bytes:90 03 + CLC ; PRG:$116A Bytes:18 + ADC #$06 ; PRG:$116B Bytes:69 06 +UpdateObjectRecordOnNoCarry_D16D: + TAX ; PRG:$116D Bytes:AA + CLC ; PRG:$116E Bytes:18 + ADC #$06 ; PRG:$116F Bytes:69 06 + LDY #$05 ; PRG:$1171 Bytes:A0 05 + STA (CurrentObjectPtrLo),Y ; PRG:$1173 Bytes:91 08 + LDA $D112,X ; PRG:$1175 Bytes:BD 12 D1 + LDY #$25 ; PRG:$1178 Bytes:A0 25 + STA (CurrentObjectPtrLo),Y ; PRG:$117A Bytes:91 08 + SEC ; PRG:$117C Bytes:38 + SBC #$04 ; PRG:$117D Bytes:E9 04 + LDY #$35 ; PRG:$117F Bytes:A0 35 + STA (CurrentObjectPtrLo),Y ; PRG:$1181 Bytes:91 08 + RTS ; PRG:$1183 Bytes:60 + .byte $27, $16, $27, $1A, $27, $26, $27, $2A, $27, $17, $17, $17, $25, $05, $05, $25 ; PRG:$1184 Bytes:27 16 27 1A 27 26 27 2A 27 17 17 17 25 05 05 25 + .byte $2A, $0A, $0A, $2A, $21, $01, $01, $21, $23, $03, $03, $23, $27, $07, $07, $27 ; PRG:$1194 Bytes:2A 0A 0A 2A 21 01 01 21 23 03 03 23 27 07 07 27 + .byte $25, $05, $05, $25, $21, $11, $11, $11, $21, $0F ; PRG:$11A4 Bytes:25 05 05 25 21 11 11 11 21 0F +;------------------------------------------------------------ +; UpdateObjectBufferRoutine_D1AE +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBufferRoutine_D1AE: + STX $00 ; PRG:$11AE Bytes:86 00 + LDX #$3F ; PRG:$11B0 Bytes:A2 3F + STX $01 ; PRG:$11B2 Bytes:86 01 + TYA ; PRG:$11B4 Bytes:98 + ASL A ; PRG:$11B5 Bytes:0A + TAY ; PRG:$11B6 Bytes:A8 + LDA $D184,Y ; PRG:$11B7 Bytes:B9 84 D1 + STA $EE ; PRG:$11BA Bytes:85 EE + INY ; PRG:$11BC Bytes:C8 + LDA $D184,Y ; PRG:$11BD Bytes:B9 84 D1 + STA $EF ; PRG:$11C0 Bytes:85 EF + LDA #$EB ; PRG:$11C2 Bytes:A9 EB + STA $02 ; PRG:$11C4 Bytes:85 02 + LDA #$00 ; PRG:$11C6 Bytes:A9 00 + STA $03 ; PRG:$11C8 Bytes:85 03 + JSR UpdateCommandBufferRoutine_F3A1 ; PRG:$11CA Bytes:20 A1 F3 + RTS ; PRG:$11CD Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_D1CE +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_D1CE: + LDA $87 ; PRG:$11CE Bytes:A5 87 + ASL A ; PRG:$11D0 Bytes:0A + CLC ; PRG:$11D1 Bytes:18 + ADC #$06 ; PRG:$11D2 Bytes:69 06 + TAY ; PRG:$11D4 Bytes:A8 + RTS ; PRG:$11D5 Bytes:60 +;------------------------------------------------------------ +; ObjectPath_D1D6 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_D1D6: + LDA $62 ; PRG:$11D6 Bytes:A5 62 + BNE ObjectPathOnNonZero_D1F4 ; PRG:$11D8 Bytes:D0 1A + LDA #$06 ; PRG:$11DA Bytes:A9 06 + STA $62 ; PRG:$11DC Bytes:85 62 + LDY #$04 ; PRG:$11DE Bytes:A0 04 + LDA $8F ; PRG:$11E0 Bytes:A5 8F + BEQ ObjectPathOnZero_D1E6 ; PRG:$11E2 Bytes:F0 02 + LDY #$12 ; PRG:$11E4 Bytes:A0 12 +ObjectPathOnZero_D1E6: + LDA #$01 ; PRG:$11E6 Bytes:A9 01 + EOR $A2 ; PRG:$11E8 Bytes:45 A2 + STA $A2 ; PRG:$11EA Bytes:85 A2 + BEQ ObjectPathOnZero_D1EF ; PRG:$11EC Bytes:F0 01 + INY ; PRG:$11EE Bytes:C8 +ObjectPathOnZero_D1EF: + LDX #$04 ; PRG:$11EF Bytes:A2 04 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$11F1 Bytes:20 AE D1 +ObjectPathOnNonZero_D1F4: + RTS ; PRG:$11F4 Bytes:60 + .byte $22, $5C, $5D, $5E, $5F, $22, $58, $59, $5A, $5B, $22, $54, $55, $56, $57, $22 ; PRG:$11F5 Bytes:22 5C 5D 5E 5F 22 58 59 5A 5B 22 54 55 56 57 22 + .byte $50, $51, $52, $53 ; PRG:$1205 Bytes:50 51 52 53 +;------------------------------------------------------------ +; ObjectPath_D209 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_D209: + LDA $57 ; PRG:$1209 Bytes:A5 57 + BNE ObjectPathContinue_D254 ; PRG:$120B Bytes:D0 47 + LDA #$02 ; PRG:$120D Bytes:A9 02 + STA $57 ; PRG:$120F Bytes:85 57 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_D211 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_D211: + LDA $A3 ; PRG:$1211 Bytes:A5 A3 + LDY $A4 ; PRG:$1213 Bytes:A4 A4 + CPY #$FF ; PRG:$1215 Bytes:C0 FF + BNE UpdateObjectBufferOnNonZero_D222 ; PRG:$1217 Bytes:D0 09 + SEC ; PRG:$1219 Bytes:38 + SBC #$05 ; PRG:$121A Bytes:E9 05 + BPL ObjectPathOnPositive_D220 ; PRG:$121C Bytes:10 02 + LDA #$0F ; PRG:$121E Bytes:A9 0F +ObjectPathOnPositive_D220: + STA $A3 ; PRG:$1220 Bytes:85 A3 +UpdateObjectBufferOnNonZero_D222: + CLC ; PRG:$1222 Bytes:18 + ADC #$F5 ; PRG:$1223 Bytes:69 F5 + STA $02 ; PRG:$1225 Bytes:85 02 + LDA #$00 ; PRG:$1227 Bytes:A9 00 + ADC #$D1 ; PRG:$1229 Bytes:69 D1 + STA $03 ; PRG:$122B Bytes:85 03 + JSR RunGameTaskRoutine_C8AA ; PRG:$122D Bytes:20 AA C8 + INC $A4 ; PRG:$1230 Bytes:E6 A4 + INC $A4 ; PRG:$1232 Bytes:E6 A4 + LDA $A4 ; PRG:$1234 Bytes:A5 A4 + BMI ObjectPathOnNegative_D23A ; PRG:$1236 Bytes:30 02 + LDA #$F9 ; PRG:$1238 Bytes:A9 F9 +ObjectPathOnNegative_D23A: + STA $A4 ; PRG:$123A Bytes:85 A4 + LDY #$00 ; PRG:$123C Bytes:A0 00 + CLC ; PRG:$123E Bytes:18 + ADC ($04),Y ; PRG:$123F Bytes:71 04 + TAY ; PRG:$1241 Bytes:A8 + CMP #$01 ; PRG:$1242 Bytes:C9 01 + BEQ ObjectPathContinue_D254 ; PRG:$1244 Bytes:F0 0E + BMI ObjectPathContinue_D254 ; PRG:$1246 Bytes:30 0C + LDA ($04),Y ; PRG:$1248 Bytes:B1 04 + STA $00 ; PRG:$124A Bytes:85 00 + DEY ; PRG:$124C Bytes:88 + LDA ($04),Y ; PRG:$124D Bytes:B1 04 + STA $01 ; PRG:$124F Bytes:85 01 + JSR UpdateCommandBufferRoutine_F3A1 ; PRG:$1251 Bytes:20 A1 F3 +ObjectPathContinue_D254: + RTS ; PRG:$1254 Bytes:60 + .byte $02, $03, $00, $00, $00, $00, $00, $01, $10, $14 ; PRG:$1255 Bytes:02 03 00 00 00 00 00 01 10 14 +ObjectPathLoop_D25F: + LDY $0A ; PRG:$125F Bytes:A4 0A + LDX $D25D,Y ; PRG:$1261 Bytes:BE 5D D2 + LDA $63 ; PRG:$1264 Bytes:A5 63 + BEQ ObjectPathOnZero_D277 ; PRG:$1266 Bytes:F0 0F + CMP #$08 ; PRG:$1268 Bytes:C9 08 + BEQ ObjectPathOnZero_D272 ; PRG:$126A Bytes:F0 06 + INY ; PRG:$126C Bytes:C8 + INY ; PRG:$126D Bytes:C8 + CMP #$01 ; PRG:$126E Bytes:C9 01 + BNE ObjectPathLoop_D275 ; PRG:$1270 Bytes:D0 03 +ObjectPathOnZero_D272: + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$1272 Bytes:20 AE D1 +ObjectPathLoop_D275: + SEC ; PRG:$1275 Bytes:38 + RTS ; PRG:$1276 Bytes:60 +ObjectPathOnZero_D277: + LDA #$10 ; PRG:$1277 Bytes:A9 10 + STA $63 ; PRG:$1279 Bytes:85 63 + BNE ObjectPathLoop_D275 ; PRG:$127B Bytes:D0 F8 +;------------------------------------------------------------ +; UpdateObjectRecord_D27D +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecord_D27D: + LDA $78 ; PRG:$127D Bytes:A5 78 + BNE ObjectPathLoop_D275 ; PRG:$127F Bytes:D0 F4 + LDX $0A ; PRG:$1281 Bytes:A6 0A + LDA $D0,X ; PRG:$1283 Bytes:B5 D0 + BEQ ObjectPathOnZero_D2CE ; PRG:$1285 Bytes:F0 47 + CMP #$02 ; PRG:$1287 Bytes:C9 02 + BEQ ObjectPathOnZero_D2D0 ; PRG:$1289 Bytes:F0 45 + LDA $46,X ; PRG:$128B Bytes:B5 46 + AND #$0F ; PRG:$128D Bytes:29 0F + BEQ ObjectPathLoop_D25F ; PRG:$128F Bytes:F0 CE + DEC $D0,X ; PRG:$1291 Bytes:D6 D0 + TAX ; PRG:$1293 Bytes:AA + LDA $D254,X ; PRG:$1294 Bytes:BD 54 D2 + LDY #$10 ; PRG:$1297 Bytes:A0 10 + STA (CurrentObjectPtrLo),Y ; PRG:$1299 Bytes:91 08 + PHA ; PRG:$129B Bytes:48 + TAX ; PRG:$129C Bytes:AA + LDY $E16F,X ; PRG:$129D Bytes:BC 6F E1 + LDX $82 ; PRG:$12A0 Bytes:A6 82 + LDA $C0DD,X ; PRG:$12A2 Bytes:BD DD C0 + STA (CurrentObjectPtrLo),Y ; PRG:$12A5 Bytes:91 08 + DEY ; PRG:$12A7 Bytes:88 + LDA $C0D5,X ; PRG:$12A8 Bytes:BD D5 C0 + STA (CurrentObjectPtrLo),Y ; PRG:$12AB Bytes:91 08 + PLA ; PRG:$12AD Bytes:68 + AND #$01 ; PRG:$12AE Bytes:29 01 + BEQ UpdateObjectRecordOnZero_D2B5 ; PRG:$12B0 Bytes:F0 03 + JSR UpdateObjectRecordRoutine_E325 ; PRG:$12B2 Bytes:20 25 E3 +UpdateObjectRecordOnZero_D2B5: + LDY #$30 ; PRG:$12B5 Bytes:A0 30 + LDA #$00 ; PRG:$12B7 Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$12B9 Bytes:91 08 + LDY $0A ; PRG:$12BB Bytes:A4 0A + LDX $D25D,Y ; PRG:$12BD Bytes:BE 5D D2 + LDA a:$0075,Y ; PRG:$12C0 Bytes:B9 75 00 + BEQ ObjectPathOnZero_D2C7 ; PRG:$12C3 Bytes:F0 02 + INY ; PRG:$12C5 Bytes:C8 + INY ; PRG:$12C6 Bytes:C8 +ObjectPathOnZero_D2C7: + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$12C7 Bytes:20 AE D1 + LDA #$04 ; PRG:$12CA Bytes:A9 04 + STA $FF ; PRG:$12CC Bytes:85 FF +ObjectPathOnZero_D2CE: + CLC ; PRG:$12CE Bytes:18 + RTS ; PRG:$12CF Bytes:60 +ObjectPathOnZero_D2D0: + DEC $D0,X ; PRG:$12D0 Bytes:D6 D0 + JSR RunGameTaskRoutine_C8AA ; PRG:$12D2 Bytes:20 AA C8 + LDY #$00 ; PRG:$12D5 Bytes:A0 00 + LDA ($04),Y ; PRG:$12D7 Bytes:B1 04 + TAY ; PRG:$12D9 Bytes:A8 + LDX $0A ; PRG:$12DA Bytes:A6 0A + BEQ UpdateObjectRecordOnZero_D2E0 ; PRG:$12DC Bytes:F0 02 + INY ; PRG:$12DE Bytes:C8 + INY ; PRG:$12DF Bytes:C8 +UpdateObjectRecordOnZero_D2E0: + LDA ($04),Y ; PRG:$12E0 Bytes:B1 04 + STA $00 ; PRG:$12E2 Bytes:85 00 + INY ; PRG:$12E4 Bytes:C8 + LDA ($04),Y ; PRG:$12E5 Bytes:B1 04 + STA $01 ; PRG:$12E7 Bytes:85 01 + LDY #$00 ; PRG:$12E9 Bytes:A0 00 + LDA #$00 ; PRG:$12EB Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$12ED Bytes:91 08 + INY ; PRG:$12EF Bytes:C8 + LDA WorkPtr0Lo ; PRG:$12F0 Bytes:A5 00 + STA (CurrentObjectPtrLo),Y ; PRG:$12F2 Bytes:91 08 + INY ; PRG:$12F4 Bytes:C8 + LDA #$00 ; PRG:$12F5 Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$12F7 Bytes:91 08 + INY ; PRG:$12F9 Bytes:C8 + LDA WorkPtr0Hi ; PRG:$12FA Bytes:A5 01 + STA (CurrentObjectPtrLo),Y ; PRG:$12FC Bytes:91 08 + INY ; PRG:$12FE Bytes:C8 + LDA #$00 ; PRG:$12FF Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$1301 Bytes:91 08 + LDA #$16 ; PRG:$1303 Bytes:A9 16 + CPX #$00 ; PRG:$1305 Bytes:E0 00 + BEQ UpdateObjectRecordOnZero_D30B ; PRG:$1307 Bytes:F0 02 + LDA #$17 ; PRG:$1309 Bytes:A9 17 +UpdateObjectRecordOnZero_D30B: + INY ; PRG:$130B Bytes:C8 + STA (CurrentObjectPtrLo),Y ; PRG:$130C Bytes:91 08 + LDY #$10 ; PRG:$130E Bytes:A0 10 + LDA #$00 ; PRG:$1310 Bytes:A9 00 +UpdateObjectRecordLoop_D312: + STA (CurrentObjectPtrLo),Y ; PRG:$1312 Bytes:91 08 + INY ; PRG:$1314 Bytes:C8 + CPY #$1E ; PRG:$1315 Bytes:C0 1E + BNE UpdateObjectRecordLoop_D312 ; PRG:$1317 Bytes:D0 F9 + LDY #$08 ; PRG:$1319 Bytes:A0 08 + STA (CurrentObjectPtrLo),Y ; PRG:$131B Bytes:91 08 + SEC ; PRG:$131D Bytes:38 + RTS ; PRG:$131E Bytes:60 + .byte $10, $D0, $12, $13, $14, $15, $17, $18, $19, $1A, $1B, $17 ; PRG:$131F Bytes:10 D0 12 13 14 15 17 18 19 1A 1B 17 +ObjectPathLoop_D32B: + LDA #$00 ; PRG:$132B Bytes:A9 00 + STA $90,X ; PRG:$132D Bytes:95 90 +ObjectPathLoop_D32F: + CLC ; PRG:$132F Bytes:18 + RTS ; PRG:$1330 Bytes:60 +ReadObjectRecordLoop_D331: + LDA $78 ; PRG:$1331 Bytes:A5 78 + BNE ObjectPathLoop_D32B ; PRG:$1333 Bytes:D0 F6 + LDY #$10 ; PRG:$1335 Bytes:A0 10 + LDA (CurrentObjectPtrLo),Y ; PRG:$1337 Bytes:B1 08 + BMI ObjectPathLoop_D32F ; PRG:$1339 Bytes:30 F4 + AND #$0F ; PRG:$133B Bytes:29 0F + TAX ; PRG:$133D Bytes:AA + JSR UpdateObjectRecordRoutine_E335 ; PRG:$133E Bytes:20 35 E3 + BCC ObjectPathLoop_D32F ; PRG:$1341 Bytes:90 EC + LDX $0A ; PRG:$1343 Bytes:A6 0A + DEC $90,X ; PRG:$1345 Bytes:D6 90 + LDA #$00 ; PRG:$1347 Bytes:A9 00 + BEQ UpdateObjectRecordOnZero_D36E ; PRG:$1349 Bytes:F0 23 +ObjectPathLoop_D34B: + JMP UpdateObjectRecordDispatch_D401 ; PRG:$134B Bytes:4C 01 D4 +;------------------------------------------------------------ +; ObjectPath_D34E +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_D34E: + LDX $0A ; PRG:$134E Bytes:A6 0A + LDA $90,X ; PRG:$1350 Bytes:B5 90 + BEQ ObjectPathLoop_D32F ; PRG:$1352 Bytes:F0 DB + CMP #$01 ; PRG:$1354 Bytes:C9 01 + BEQ ObjectPathOnZero_D382 ; PRG:$1356 Bytes:F0 2A + CMP #$10 ; PRG:$1358 Bytes:C9 10 + BEQ UpdateObjectBufferOnZero_D384 ; PRG:$135A Bytes:F0 28 + CMP #$11 ; PRG:$135C Bytes:C9 11 + BEQ UpdateObjectBufferOnZero_D3AF ; PRG:$135E Bytes:F0 4F + CMP #$12 ; PRG:$1360 Bytes:C9 12 + BEQ ObjectPathLoop_D34B ; PRG:$1362 Bytes:F0 E7 + CMP #$13 ; PRG:$1364 Bytes:C9 13 + BEQ ReadObjectRecordLoop_D331 ; PRG:$1366 Bytes:F0 C9 + LDA #$12 ; PRG:$1368 Bytes:A9 12 + STA $90,X ; PRG:$136A Bytes:95 90 + LDA #$05 ; PRG:$136C Bytes:A9 05 +UpdateObjectRecordOnZero_D36E: + STA $D2,X ; PRG:$136E Bytes:95 D2 + LDA #$08 ; PRG:$1370 Bytes:A9 08 + STA $5C,X ; PRG:$1372 Bytes:95 5C + LDY #$20 ; PRG:$1374 Bytes:A0 20 + LDA #$01 ; PRG:$1376 Bytes:A9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$1378 Bytes:91 08 + LDY #$30 ; PRG:$137A Bytes:A0 30 + STA (CurrentObjectPtrLo),Y ; PRG:$137C Bytes:91 08 + LDA #$02 ; PRG:$137E Bytes:A9 02 + STA $FF ; PRG:$1380 Bytes:85 FF +ObjectPathOnZero_D382: + SEC ; PRG:$1382 Bytes:38 + RTS ; PRG:$1383 Bytes:60 +UpdateObjectBufferOnZero_D384: + LDA $72,X ; PRG:$1384 Bytes:B5 72 + BNE UpdateObjectBufferOnNonZero_D396 ; PRG:$1386 Bytes:D0 0E + STA $90,X ; PRG:$1388 Bytes:95 90 + INC $90,X ; PRG:$138A Bytes:F6 90 + LDA #$01 ; PRG:$138C Bytes:A9 01 + STA $03F0 ; PRG:$138E Bytes:8D F0 03 + JSR RunGameTaskRoutine_C8D6 ; PRG:$1391 Bytes:20 D6 C8 + SEC ; PRG:$1394 Bytes:38 + RTS ; PRG:$1395 Bytes:60 +UpdateObjectBufferOnNonZero_D396: + LDA $03F1 ; PRG:$1396 Bytes:AD F1 03 + CMP #$1A ; PRG:$1399 Bytes:C9 1A + BCC UpdateObjectBufferOnNoCarry_D3A2 ; PRG:$139B Bytes:90 05 + SBC #$02 ; PRG:$139D Bytes:E9 02 + STA $03F1 ; PRG:$139F Bytes:8D F1 03 +UpdateObjectBufferOnNoCarry_D3A2: + LDA #$F0 ; PRG:$13A2 Bytes:A9 F0 + STA $00 ; PRG:$13A4 Bytes:85 00 + LDA #$03 ; PRG:$13A6 Bytes:A9 03 + STA $01 ; PRG:$13A8 Bytes:85 01 + JSR ProcessResourceStateRoutine_F601 ; PRG:$13AA Bytes:20 01 F6 + SEC ; PRG:$13AD Bytes:38 + RTS ; PRG:$13AE Bytes:60 +UpdateObjectBufferOnZero_D3AF: + LDA $5C,X ; PRG:$13AF Bytes:B5 5C + BNE ObjectPathContinue_D3DA ; PRG:$13B1 Bytes:D0 27 + DEC $80,X ; PRG:$13B3 Bytes:D6 80 + BPL ObjectPathOnPositive_D3E0 ; PRG:$13B5 Bytes:10 29 + STA $80,X ; PRG:$13B7 Bytes:95 80 + LDA $03F0 ; PRG:$13B9 Bytes:AD F0 03 + BEQ ObjectPathContinue_D3DA ; PRG:$13BC Bytes:F0 1C + LDA $8D ; PRG:$13BE Bytes:A5 8D + BNE ObjectPathOnNonZero_D3DC ; PRG:$13C0 Bytes:D0 1A + STA $03F0 ; PRG:$13C2 Bytes:8D F0 03 + LDA #$EF ; PRG:$13C5 Bytes:A9 EF + STA $03F1 ; PRG:$13C7 Bytes:8D F1 03 + LDA $D31F,X ; PRG:$13CA Bytes:BD 1F D3 + STA $03F3 ; PRG:$13CD Bytes:8D F3 03 + LDA #$01 ; PRG:$13D0 Bytes:A9 01 + STA $FF ; PRG:$13D2 Bytes:85 FF + LDA #$14 ; PRG:$13D4 Bytes:A9 14 + STA $72,X ; PRG:$13D6 Bytes:95 72 + DEC $90,X ; PRG:$13D8 Bytes:D6 90 +ObjectPathContinue_D3DA: + SEC ; PRG:$13DA Bytes:38 + RTS ; PRG:$13DB Bytes:60 +ObjectPathOnNonZero_D3DC: + STA $90,X ; PRG:$13DC Bytes:95 90 + SEC ; PRG:$13DE Bytes:38 + RTS ; PRG:$13DF Bytes:60 +ObjectPathOnPositive_D3E0: + STA $90,X ; PRG:$13E0 Bytes:95 90 + LDA #$02 ; PRG:$13E2 Bytes:A9 02 + STA $D0,X ; PRG:$13E4 Bytes:95 D0 + JSR ProcessObjectStateRoutine_D42C ; PRG:$13E6 Bytes:20 2C D4 + LDA $A0 ; PRG:$13E9 Bytes:A5 A0 + BEQ ObjectPathOnZero_D3FF ; PRG:$13EB Bytes:F0 12 + LDA #$00 ; PRG:$13ED Bytes:A9 00 + STA $A0 ; PRG:$13EF Bytes:85 A0 + STA $2F ; PRG:$13F1 Bytes:85 2F + LDA #$04 ; PRG:$13F3 Bytes:A9 04 + STA $2E ; PRG:$13F5 Bytes:85 2E + LDA #$82 ; PRG:$13F7 Bytes:A9 82 + JSR ProcessResourceStateRoutine_F31A ; PRG:$13F9 Bytes:20 1A F3 + JSR UpdateGameStateRoutine_C402 ; PRG:$13FC Bytes:20 02 C4 +ObjectPathOnZero_D3FF: + SEC ; PRG:$13FF Bytes:38 + RTS ; PRG:$1400 Bytes:60 +UpdateObjectRecordDispatch_D401: + LDA $5C,X ; PRG:$1401 Bytes:B5 5C + BNE ObjectPathOnNonZero_D418 ; PRG:$1403 Bytes:D0 13 + LDY $D2,X ; PRG:$1405 Bytes:B4 D2 + LDA $D321,Y ; PRG:$1407 Bytes:B9 21 D3 + LDY #$05 ; PRG:$140A Bytes:A0 05 + STA (CurrentObjectPtrLo),Y ; PRG:$140C Bytes:91 08 + CMP #$17 ; PRG:$140E Bytes:C9 17 + BEQ UpdateObjectRecordOnZero_D41A ; PRG:$1410 Bytes:F0 08 + INC $D2,X ; PRG:$1412 Bytes:F6 D2 + LDA #$08 ; PRG:$1414 Bytes:A9 08 +ObjectPathLoop_D416: + STA $5C,X ; PRG:$1416 Bytes:95 5C +ObjectPathOnNonZero_D418: + SEC ; PRG:$1418 Bytes:38 + RTS ; PRG:$1419 Bytes:60 +UpdateObjectRecordOnZero_D41A: + DEC $90,X ; PRG:$141A Bytes:D6 90 + LDY #$00 ; PRG:$141C Bytes:A0 00 + LDA #$01 ; PRG:$141E Bytes:A9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$1420 Bytes:91 08 + LDA #$80 ; PRG:$1422 Bytes:A9 80 + LDY $80,X ; PRG:$1424 Bytes:B4 80 + BNE ObjectPathLoop_D416 ; PRG:$1426 Bytes:D0 EE + LDA #$10 ; PRG:$1428 Bytes:A9 10 + BNE ObjectPathLoop_D416 ; PRG:$142A Bytes:D0 EA +;------------------------------------------------------------ +; ProcessObjectStateRoutine_D42C +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_D42C: + LDY #$20 ; PRG:$142C Bytes:A0 20 + LDA #$43 ; PRG:$142E Bytes:A9 43 + CPX #$00 ; PRG:$1430 Bytes:E0 00 + BEQ UpdateObjectBufferLoop_D436 ; PRG:$1432 Bytes:F0 02 + LDA #$5A ; PRG:$1434 Bytes:A9 5A +UpdateObjectBufferLoop_D436: + STA $00 ; PRG:$1436 Bytes:85 00 + STY $01 ; PRG:$1438 Bytes:84 01 + LDA #$E7 ; PRG:$143A Bytes:A9 E7 + STA $02 ; PRG:$143C Bytes:85 02 + LDA #$00 ; PRG:$143E Bytes:A9 00 + STA $03 ; PRG:$1440 Bytes:85 03 + LDA $80,X ; PRG:$1442 Bytes:B5 80 + STA $E9 ; PRG:$1444 Bytes:85 E9 + JSR UpdateCommandBufferRoutine_F3A1 ; PRG:$1446 Bytes:20 A1 F3 + RTS ; PRG:$1449 Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_D44A +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_D44A: + LDY #$28 ; PRG:$144A Bytes:A0 28 + LDA #$E9 ; PRG:$144C Bytes:A9 E9 + CPX #$00 ; PRG:$144E Bytes:E0 00 + BEQ UpdateObjectBufferLoop_D436 ; PRG:$1450 Bytes:F0 E4 + LDY #$2A ; PRG:$1452 Bytes:A0 2A + LDA #$A9 ; PRG:$1454 Bytes:A9 A9 + BNE UpdateObjectBufferLoop_D436 ; PRG:$1456 Bytes:D0 DE + CLC ; PRG:$1458 Bytes:18 + BMI ObjectPathOnNegative_D4A3 ; PRG:$1459 Bytes:30 48 + RTS ; PRG:$145B Bytes:60 + .byte $78, $90, $A8, $C0, $D8, $20, $38, $50, $68, $80, $98, $B0, $C8, $C8, $0A, $18 ; PRG:$145C Bytes:78 90 A8 C0 D8 20 38 50 68 80 98 B0 C8 C8 0A 18 + .byte $08, $08, $10, $04, $01, $03, $19, $1A, $01, $03 ; PRG:$146C Bytes:08 08 10 04 01 03 19 1A 01 03 +ObjectPathLoop_D476: + SBC #$03 ; PRG:$1476 Bytes:E9 03 + CMP #$F0 ; PRG:$1478 Bytes:C9 F0 + BCC ObjectPathOnNoCarry_D47E ; PRG:$147A Bytes:90 02 + LDA #$F0 ; PRG:$147C Bytes:A9 F0 +ObjectPathOnNoCarry_D47E: + JMP UpdateObjectRecordDispatch_D49E ; PRG:$147E Bytes:4C 9E D4 +ReadObjectRecordDispatch_D481: + CMP #$F0 ; PRG:$1481 Bytes:C9 F0 + BCS ReadObjectRecordOnCarry_D4D5 ; PRG:$1483 Bytes:B0 50 + CMP #$90 ; PRG:$1485 Bytes:C9 90 + AND #$0F ; PRG:$1487 Bytes:29 0F + STA $06 ; PRG:$1489 Bytes:85 06 + BCS UpdateObjectRecordOnCarry_D4DE ; PRG:$148B Bytes:B0 51 + LSR A ; PRG:$148D Bytes:4A + TAX ; PRG:$148E Bytes:AA + LDY $D474,X ; PRG:$148F Bytes:BC 74 D4 + LDA (CurrentObjectPtrLo),Y ; PRG:$1492 Bytes:B1 08 + BCS ObjectPathLoop_D476 ; PRG:$1494 Bytes:B0 E0 + ADC #$03 ; PRG:$1496 Bytes:69 03 + CMP #$F1 ; PRG:$1498 Bytes:C9 F1 + BCC UpdateObjectRecordDispatch_D49E ; PRG:$149A Bytes:90 02 + LDA #$00 ; PRG:$149C Bytes:A9 00 +UpdateObjectRecordDispatch_D49E: + STA (CurrentObjectPtrLo),Y ; PRG:$149E Bytes:91 08 + LDA $0F ; PRG:$14A0 Bytes:A5 0F + CLC ; PRG:$14A2 Bytes:18 +ObjectPathOnNegative_D4A3: + ADC #$06 ; PRG:$14A3 Bytes:69 06 + JSR ReadObjectRecordRoutine_E5AA ; PRG:$14A5 Bytes:20 AA E5 + LDY #$10 ; PRG:$14A8 Bytes:A0 10 + BCS UpdateObjectRecordContinue_D4CB ; PRG:$14AA Bytes:B0 1F + CMP #$24 ; PRG:$14AC Bytes:C9 24 + BEQ UpdateObjectRecordContinue_D4CB ; PRG:$14AE Bytes:F0 1B + CMP #$FF ; PRG:$14B0 Bytes:C9 FF + BEQ UpdateObjectRecordOnZero_D4B8 ; PRG:$14B2 Bytes:F0 04 + CMP #$4A ; PRG:$14B4 Bytes:C9 4A + BCS UpdateObjectRecordContinue_D4CB ; PRG:$14B6 Bytes:B0 13 +UpdateObjectRecordOnZero_D4B8: + LDA #$01 ; PRG:$14B8 Bytes:A9 01 + STA $FC ; PRG:$14BA Bytes:85 FC + LDA #$94 ; PRG:$14BC Bytes:A9 94 + STA (CurrentObjectPtrLo),Y ; PRG:$14BE Bytes:91 08 + LDY #$15 ; PRG:$14C0 Bytes:A0 15 + LDA #$02 ; PRG:$14C2 Bytes:A9 02 + STA (CurrentObjectPtrLo),Y ; PRG:$14C4 Bytes:91 08 +ObjectPathLoop_D4C6: + LDA #$20 ; PRG:$14C6 Bytes:A9 20 + JMP ProcessObjectStateDispatch_D783 ; PRG:$14C8 Bytes:4C 83 D7 +UpdateObjectRecordContinue_D4CB: + LDA (CurrentObjectPtrLo),Y ; PRG:$14CB Bytes:B1 08 + AND #$03 ; PRG:$14CD Bytes:29 03 + ORA #$40 ; PRG:$14CF Bytes:09 40 + STA (CurrentObjectPtrLo),Y ; PRG:$14D1 Bytes:91 08 + BNE ObjectPathLoop_D4C6 ; PRG:$14D3 Bytes:D0 F1 +ReadObjectRecordOnCarry_D4D5: + LDY #$15 ; PRG:$14D5 Bytes:A0 15 + LDA (CurrentObjectPtrLo),Y ; PRG:$14D7 Bytes:B1 08 + BNE ObjectPathOnNonZero_D4F9 ; PRG:$14D9 Bytes:D0 1E + JMP UpdateObjectRecordDispatch_D57E ; PRG:$14DB Bytes:4C 7E D5 +UpdateObjectRecordOnCarry_D4DE: + LDY #$15 ; PRG:$14DE Bytes:A0 15 + LDA (CurrentObjectPtrLo),Y ; PRG:$14E0 Bytes:B1 08 + BNE ObjectPathOnNonZero_D4F9 ; PRG:$14E2 Bytes:D0 15 + LDA #$01 ; PRG:$14E4 Bytes:A9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$14E6 Bytes:91 08 + LDA $06 ; PRG:$14E8 Bytes:A5 06 + CMP #$09 ; PRG:$14EA Bytes:C9 09 + BCS UpdateObjectRecordOnCarry_D4FC ; PRG:$14EC Bytes:B0 0E + LDY #$05 ; PRG:$14EE Bytes:A0 05 + STA (CurrentObjectPtrLo),Y ; PRG:$14F0 Bytes:91 08 + CLC ; PRG:$14F2 Bytes:18 + ADC #$91 ; PRG:$14F3 Bytes:69 91 + LDY #$10 ; PRG:$14F5 Bytes:A0 10 + STA (CurrentObjectPtrLo),Y ; PRG:$14F7 Bytes:91 08 +ObjectPathOnNonZero_D4F9: + JMP ProcessObjectStateDispatch_D67A ; PRG:$14F9 Bytes:4C 7A D6 +UpdateObjectRecordOnCarry_D4FC: + LDX $82 ; PRG:$14FC Bytes:A6 82 + LDA $C0C9,X ; PRG:$14FE Bytes:BD C9 C0 + STA (CurrentObjectPtrLo),Y ; PRG:$1501 Bytes:91 08 + LDY #$10 ; PRG:$1503 Bytes:A0 10 + LDA #$01 ; PRG:$1505 Bytes:A9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$1507 Bytes:91 08 + LDY #$00 ; PRG:$1509 Bytes:A0 00 + STA (CurrentObjectPtrLo),Y ; PRG:$150B Bytes:91 08 + INY ; PRG:$150D Bytes:C8 + LDA (CurrentObjectPtrLo),Y ; PRG:$150E Bytes:B1 08 + STA $04 ; PRG:$1510 Bytes:85 04 + LDY #$03 ; PRG:$1512 Bytes:A0 03 + LDA (CurrentObjectPtrLo),Y ; PRG:$1514 Bytes:B1 08 + STA $05 ; PRG:$1516 Bytes:85 05 + LDX #$01 ; PRG:$1518 Bytes:A2 01 + JSR UpdateObjectBufferRoutine_DD5B ; PRG:$151A Bytes:20 5B DD + LDY #$1B ; PRG:$151D Bytes:A0 1B + LDA (CurrentObjectPtrLo),Y ; PRG:$151F Bytes:B1 08 + TAX ; PRG:$1521 Bytes:AA + INC $D6,X ; PRG:$1522 Bytes:F6 D6 + JMP ProcessObjectStateDispatch_D67A ; PRG:$1524 Bytes:4C 7A D6 +UpdateObjectRecordDispatch_D527: + LDX $82 ; PRG:$1527 Bytes:A6 82 + LDA $C0C1,X ; PRG:$1529 Bytes:BD C1 C0 + SBC #$05 ; PRG:$152C Bytes:E9 05 + LDY #$15 ; PRG:$152E Bytes:A0 15 + CMP (CurrentObjectPtrLo),Y ; PRG:$1530 Bytes:D1 08 + BCC ObjectPathOnNoCarry_D54C ; PRG:$1532 Bytes:90 18 + LDA (CurrentObjectPtrLo),Y ; PRG:$1534 Bytes:B1 08 + BNE ObjectPathOnNonZero_D546 ; PRG:$1536 Bytes:D0 0E + LDA #$10 ; PRG:$1538 Bytes:A9 10 + STA (CurrentObjectPtrLo),Y ; PRG:$153A Bytes:91 08 + LDY #$10 ; PRG:$153C Bytes:A0 10 + LDA (CurrentObjectPtrLo),Y ; PRG:$153E Bytes:B1 08 + AND #$03 ; PRG:$1540 Bytes:29 03 + ORA #$30 ; PRG:$1542 Bytes:09 30 + STA (CurrentObjectPtrLo),Y ; PRG:$1544 Bytes:91 08 +ObjectPathOnNonZero_D546: + LDA #$04 ; PRG:$1546 Bytes:A9 04 +UpdateObjectRecordLoop_D548: + LDY #$05 ; PRG:$1548 Bytes:A0 05 + STA (CurrentObjectPtrLo),Y ; PRG:$154A Bytes:91 08 +ObjectPathOnNoCarry_D54C: + LDA #$30 ; PRG:$154C Bytes:A9 30 + JMP ProcessObjectStateDispatch_D783 ; PRG:$154E Bytes:4C 83 D7 + .byte $A9, $10, $91, $08 ; PRG:$1551 Bytes:A9 10 91 08 +UpdateObjectRecordDispatch_D555: + AND #$03 ; PRG:$1555 Bytes:29 03 + ORA #$50 ; PRG:$1557 Bytes:09 50 + STA (CurrentObjectPtrLo),Y ; PRG:$1559 Bytes:91 08 + LDY #$15 ; PRG:$155B Bytes:A0 15 + LDX $82 ; PRG:$155D Bytes:A6 82 + LDA $C0C1,X ; PRG:$155F Bytes:BD C1 C0 + STA (CurrentObjectPtrLo),Y ; PRG:$1562 Bytes:91 08 + INY ; PRG:$1564 Bytes:C8 + LDA #$00 ; PRG:$1565 Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$1567 Bytes:91 08 + LDY #$08 ; PRG:$1569 Bytes:A0 08 + STA (CurrentObjectPtrLo),Y ; PRG:$156B Bytes:91 08 + LDA #$02 ; PRG:$156D Bytes:A9 02 + STA $FC ; PRG:$156F Bytes:85 FC + LDY #$09 ; PRG:$1571 Bytes:A0 09 + LDA (CurrentObjectPtrLo),Y ; PRG:$1573 Bytes:B1 08 + AND #$F0 ; PRG:$1575 Bytes:29 F0 + ORA #$03 ; PRG:$1577 Bytes:09 03 + STA (CurrentObjectPtrLo),Y ; PRG:$1579 Bytes:91 08 + JMP ProcessObjectStateDispatch_D67A ; PRG:$157B Bytes:4C 7A D6 +UpdateObjectRecordDispatch_D57E: + LDY #$15 ; PRG:$157E Bytes:A0 15 + LDA (CurrentObjectPtrLo),Y ; PRG:$1580 Bytes:B1 08 + BNE UpdateObjectRecordOnNonZero_D595 ; PRG:$1582 Bytes:D0 11 + LDA #$30 ; PRG:$1584 Bytes:A9 30 + STA (CurrentObjectPtrLo),Y ; PRG:$1586 Bytes:91 08 + LDY #$10 ; PRG:$1588 Bytes:A0 10 + LDA (CurrentObjectPtrLo),Y ; PRG:$158A Bytes:B1 08 + AND #$03 ; PRG:$158C Bytes:29 03 + ORA #$10 ; PRG:$158E Bytes:09 10 + STA (CurrentObjectPtrLo),Y ; PRG:$1590 Bytes:91 08 + JMP ReadObjectRecordDispatch_D777 ; PRG:$1592 Bytes:4C 77 D7 +UpdateObjectRecordOnNonZero_D595: + LDY #$09 ; PRG:$1595 Bytes:A0 09 + LDA (CurrentObjectPtrLo),Y ; PRG:$1597 Bytes:B1 08 + AND #$F0 ; PRG:$1599 Bytes:29 F0 + ORA #$02 ; PRG:$159B Bytes:09 02 + STA (CurrentObjectPtrLo),Y ; PRG:$159D Bytes:91 08 +ProcessObjectStateDispatch_D59F: + LDA #$04 ; PRG:$159F Bytes:A9 04 + BNE UpdateObjectRecordLoop_D548 ; PRG:$15A1 Bytes:D0 A5 +UpdateObjectRecordDispatch_D5A3: + STA $06 ; PRG:$15A3 Bytes:85 06 + LDY #$17 ; PRG:$15A5 Bytes:A0 17 + LDA (CurrentObjectPtrLo),Y ; PRG:$15A7 Bytes:B1 08 + BNE ObjectPathContinue_D5CC ; PRG:$15A9 Bytes:D0 21 + LDY #$15 ; PRG:$15AB Bytes:A0 15 + LDA (CurrentObjectPtrLo),Y ; PRG:$15AD Bytes:B1 08 + BEQ ObjectPathContinue_D5CC ; PRG:$15AF Bytes:F0 1B + INY ; PRG:$15B1 Bytes:C8 + LDA (CurrentObjectPtrLo),Y ; PRG:$15B2 Bytes:B1 08 + BNE ObjectPathOnNonZero_D5C9 ; PRG:$15B4 Bytes:D0 13 + LDA #$04 ; PRG:$15B6 Bytes:A9 04 + STA (CurrentObjectPtrLo),Y ; PRG:$15B8 Bytes:91 08 + LDY #$10 ; PRG:$15BA Bytes:A0 10 + LDA (CurrentObjectPtrLo),Y ; PRG:$15BC Bytes:B1 08 + CLC ; PRG:$15BE Bytes:18 + ADC #$01 ; PRG:$15BF Bytes:69 01 + CMP #$24 ; PRG:$15C1 Bytes:C9 24 + BNE UpdateObjectRecordOnNonZero_D5C7 ; PRG:$15C3 Bytes:D0 02 + LDA #$20 ; PRG:$15C5 Bytes:A9 20 +UpdateObjectRecordOnNonZero_D5C7: + STA (CurrentObjectPtrLo),Y ; PRG:$15C7 Bytes:91 08 +ObjectPathOnNonZero_D5C9: + JMP ReadObjectRecordDispatch_D777 ; PRG:$15C9 Bytes:4C 77 D7 +ObjectPathContinue_D5CC: + LDX #$00 ; PRG:$15CC Bytes:A2 00 + LDA $06 ; PRG:$15CE Bytes:A5 06 + AND #$02 ; PRG:$15D0 Bytes:29 02 + BNE ReadObjectRecordOnNonZero_D5D5 ; PRG:$15D2 Bytes:D0 01 + INX ; PRG:$15D4 Bytes:E8 +ReadObjectRecordOnNonZero_D5D5: + EOR #$13 ; PRG:$15D5 Bytes:49 13 + PHA ; PRG:$15D7 Bytes:48 + LDY $D470,X ; PRG:$15D8 Bytes:BC 70 D4 + LDA (CurrentObjectPtrLo),Y ; PRG:$15DB Bytes:B1 08 + LDY $D472,X ; PRG:$15DD Bytes:BC 72 D4 + LDX #$80 ; PRG:$15E0 Bytes:A2 80 + SEC ; PRG:$15E2 Bytes:38 + SBC (CurrentObjectPtrLo),Y ; PRG:$15E3 Bytes:F1 08 + STA $00 ; PRG:$15E5 Bytes:85 00 + BEQ ObjectPathOnZero_D5F8 ; PRG:$15E7 Bytes:F0 0F + BCS ObjectPathOnCarry_D5F6 ; PRG:$15E9 Bytes:B0 0B + PLA ; PRG:$15EB Bytes:68 + AND #$12 ; PRG:$15EC Bytes:29 12 + PHA ; PRG:$15EE Bytes:48 + SEC ; PRG:$15EF Bytes:38 + LDA #$00 ; PRG:$15F0 Bytes:A9 00 + SBC $00 ; PRG:$15F2 Bytes:E5 00 + STA $00 ; PRG:$15F4 Bytes:85 00 +ObjectPathOnCarry_D5F6: + LDX #$20 ; PRG:$15F6 Bytes:A2 20 +ObjectPathOnZero_D5F8: + PLA ; PRG:$15F8 Bytes:68 + CPX $11 ; PRG:$15F9 Bytes:E4 11 + BCC UpdateObjectRecordOnNoCarry_D5FF ; PRG:$15FB Bytes:90 02 + EOR #$01 ; PRG:$15FD Bytes:49 01 +UpdateObjectRecordOnNoCarry_D5FF: + LDY #$10 ; PRG:$15FF Bytes:A0 10 + STA (CurrentObjectPtrLo),Y ; PRG:$1601 Bytes:91 08 + LDX #$01 ; PRG:$1603 Bytes:A2 01 + LDA $82 ; PRG:$1605 Bytes:A5 82 + CMP #$03 ; PRG:$1607 Bytes:C9 03 + BCC UpdateObjectRecordOnNoCarry_D60C ; PRG:$1609 Bytes:90 01 + INX ; PRG:$160B Bytes:E8 +UpdateObjectRecordOnNoCarry_D60C: + TXA ; PRG:$160C Bytes:8A + LDY #$18 ; PRG:$160D Bytes:A0 18 + STA (CurrentObjectPtrLo),Y ; PRG:$160F Bytes:91 08 + LDY #$00 ; PRG:$1611 Bytes:A0 00 + STY $01 ; PRG:$1613 Bytes:84 01 +ObjectPathLoop_D615: + SEC ; PRG:$1615 Bytes:38 + LDA WorkPtr0Hi ; PRG:$1616 Bytes:A5 01 + SBC $C0BD,X ; PRG:$1618 Bytes:FD BD C0 + STA $01 ; PRG:$161B Bytes:85 01 + LDA WorkPtr0Lo ; PRG:$161D Bytes:A5 00 + SBC $C0B5,X ; PRG:$161F Bytes:FD B5 C0 + STA $00 ; PRG:$1622 Bytes:85 00 + INY ; PRG:$1624 Bytes:C8 + BCS ObjectPathLoop_D615 ; PRG:$1625 Bytes:B0 EE + TYA ; PRG:$1627 Bytes:98 + LDY #$00 ; PRG:$1628 Bytes:A0 00 +UpdateObjectRecordLoop_D62A: + SEC ; PRG:$162A Bytes:38 + SBC #$06 ; PRG:$162B Bytes:E9 06 + INY ; PRG:$162D Bytes:C8 + BCS UpdateObjectRecordLoop_D62A ; PRG:$162E Bytes:B0 FA + TYA ; PRG:$1630 Bytes:98 + LDY #$15 ; PRG:$1631 Bytes:A0 15 + STA (CurrentObjectPtrLo),Y ; PRG:$1633 Bytes:91 08 + INY ; PRG:$1635 Bytes:C8 + LDA #$00 ; PRG:$1636 Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$1638 Bytes:91 08 + INY ; PRG:$163A Bytes:C8 + STA (CurrentObjectPtrLo),Y ; PRG:$163B Bytes:91 08 + JMP ReadObjectRecordDispatch_D777 ; PRG:$163D Bytes:4C 77 D7 +ObjectPathLoop_D640: + JMP UpdateObjectRecordDispatch_D5A3 ; PRG:$1640 Bytes:4C A3 D5 +ObjectPathLoop_D643: + JMP ReadObjectRecordDispatch_D481 ; PRG:$1643 Bytes:4C 81 D4 +ObjectPathLoop_D646: + JMP UpdateObjectRecordDispatch_D57E ; PRG:$1646 Bytes:4C 7E D5 +ObjectPathLoop_D649: + JMP UpdateObjectBufferDispatch_D73B ; PRG:$1649 Bytes:4C 3B D7 +ObjectPathLoop_D64C: + JMP UpdateObjectRecordDispatch_D555 ; PRG:$164C Bytes:4C 55 D5 +;------------------------------------------------------------ +; UpdateObjectBuffer_D64F +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBuffer_D64F: + LDA #$03 ; PRG:$164F Bytes:A9 03 + STA $0F ; PRG:$1651 Bytes:85 0F + LDA #$80 ; PRG:$1653 Bytes:A9 80 + STA $08 ; PRG:$1655 Bytes:85 08 + LDA #$04 ; PRG:$1657 Bytes:A9 04 + STA $09 ; PRG:$1659 Bytes:85 09 +ReadObjectRecordLoop_D65B: + LDY #$10 ; PRG:$165B Bytes:A0 10 + LDA (CurrentObjectPtrLo),Y ; PRG:$165D Bytes:B1 08 + BEQ ProcessObjectStateDispatch_D67A ; PRG:$165F Bytes:F0 19 + BMI ObjectPathLoop_D643 ; PRG:$1661 Bytes:30 E0 + CMP #$01 ; PRG:$1663 Bytes:C9 01 + BEQ ReadObjectRecordOnZero_D6A9 ; PRG:$1665 Bytes:F0 42 + CMP #$20 ; PRG:$1667 Bytes:C9 20 + BCC ObjectPathLoop_D649 ; PRG:$1669 Bytes:90 DE + CMP #$30 ; PRG:$166B Bytes:C9 30 + BCC ObjectPathLoop_D640 ; PRG:$166D Bytes:90 D1 + CMP #$40 ; PRG:$166F Bytes:C9 40 + BCC ObjectPathLoop_D646 ; PRG:$1671 Bytes:90 D3 + CMP #$50 ; PRG:$1673 Bytes:C9 50 + BCC ObjectPathLoop_D64C ; PRG:$1675 Bytes:90 D5 + JMP UpdateObjectRecordDispatch_D527 ; PRG:$1677 Bytes:4C 27 D5 +ProcessObjectStateDispatch_D67A: + LDX $5E ; PRG:$167A Bytes:A6 5E + BNE UpdateObjectRecordContinue_D68E ; PRG:$167C Bytes:D0 10 + LDY #$15 ; PRG:$167E Bytes:A0 15 +UpdateObjectRecordLoop_D680: + LDA (CurrentObjectPtrLo),Y ; PRG:$1680 Bytes:B1 08 + BEQ UpdateObjectRecordContinue_D68E ; PRG:$1682 Bytes:F0 0A + SEC ; PRG:$1684 Bytes:38 + SBC #$01 ; PRG:$1685 Bytes:E9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$1687 Bytes:91 08 + INY ; PRG:$1689 Bytes:C8 + CPY #$17 ; PRG:$168A Bytes:C0 17 + BCC UpdateObjectRecordLoop_D680 ; PRG:$168C Bytes:90 F2 +UpdateObjectRecordContinue_D68E: + LDY #$1C ; PRG:$168E Bytes:A0 1C + LDA (CurrentObjectPtrLo),Y ; PRG:$1690 Bytes:B1 08 + BEQ ObjectPathOnZero_D699 ; PRG:$1692 Bytes:F0 05 + SEC ; PRG:$1694 Bytes:38 + SBC #$01 ; PRG:$1695 Bytes:E9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$1697 Bytes:91 08 +ObjectPathOnZero_D699: + LDX #$08 ; PRG:$1699 Bytes:A2 08 + JSR RunGameTaskRoutine_CBD3 ; PRG:$169B Bytes:20 D3 CB + BPL ReadObjectRecordLoop_D65B ; PRG:$169E Bytes:10 BB + LDX $5E ; PRG:$16A0 Bytes:A6 5E + BNE ObjectPathOnNonZero_D6A8 ; PRG:$16A2 Bytes:D0 04 + LDX #$05 ; PRG:$16A4 Bytes:A2 05 + STX $5E ; PRG:$16A6 Bytes:86 5E +ObjectPathOnNonZero_D6A8: + RTS ; PRG:$16A8 Bytes:60 +ReadObjectRecordOnZero_D6A9: + LDY #$15 ; PRG:$16A9 Bytes:A0 15 + LDA (CurrentObjectPtrLo),Y ; PRG:$16AB Bytes:B1 08 + BNE ProcessObjectStateDispatch_D67A ; PRG:$16AD Bytes:D0 CB + JSR RunGameTaskRoutine_C8AA ; PRG:$16AF Bytes:20 AA C8 + LDY #$00 ; PRG:$16B2 Bytes:A0 00 + LDA ($04),Y ; PRG:$16B4 Bytes:B1 04 + LSR A ; PRG:$16B6 Bytes:4A + TAX ; PRG:$16B7 Bytes:AA + DEX ; PRG:$16B8 Bytes:CA + BEQ ProcessObjectStateDispatch_D67A ; PRG:$16B9 Bytes:F0 BF + LDA $A6 ; PRG:$16BB Bytes:A5 A6 + BNE UpdateObjectBufferOnNonZero_D6C0 ; PRG:$16BD Bytes:D0 01 + TXA ; PRG:$16BF Bytes:8A +UpdateObjectBufferOnNonZero_D6C0: + STA $A6 ; PRG:$16C0 Bytes:85 A6 + DEC $A6 ; PRG:$16C2 Bytes:C6 A6 + ASL A ; PRG:$16C4 Bytes:0A + TAY ; PRG:$16C5 Bytes:A8 + LDA ($04),Y ; PRG:$16C6 Bytes:B1 04 + STA $02 ; PRG:$16C8 Bytes:85 02 + INY ; PRG:$16CA Bytes:C8 + LDA ($04),Y ; PRG:$16CB Bytes:B1 04 + STA $03 ; PRG:$16CD Bytes:85 03 + JSR UpdateObjectBufferRoutine_E0F9 ; PRG:$16CF Bytes:20 F9 E0 + LDY #$05 ; PRG:$16D2 Bytes:A0 05 + LDA #$00 ; PRG:$16D4 Bytes:A9 00 +UpdateObjectRecordLoop_D6D6: + STA (CurrentObjectPtrLo),Y ; PRG:$16D6 Bytes:91 08 + DEY ; PRG:$16D8 Bytes:88 + BPL UpdateObjectRecordLoop_D6D6 ; PRG:$16D9 Bytes:10 FB + LDY #$09 ; PRG:$16DB Bytes:A0 09 + LDA #$02 ; PRG:$16DD Bytes:A9 02 + STA (CurrentObjectPtrLo),Y ; PRG:$16DF Bytes:91 08 + LDY #$01 ; PRG:$16E1 Bytes:A0 01 + LDA WorkPtr0Lo ; PRG:$16E3 Bytes:A5 00 + STA (CurrentObjectPtrLo),Y ; PRG:$16E5 Bytes:91 08 + LDY #$03 ; PRG:$16E7 Bytes:A0 03 + LDA WorkPtr0Hi ; PRG:$16E9 Bytes:A5 01 + STA (CurrentObjectPtrLo),Y ; PRG:$16EB Bytes:91 08 + LDY #$10 ; PRG:$16ED Bytes:A0 10 + LDA $15 ; PRG:$16EF Bytes:A5 15 + AND #$03 ; PRG:$16F1 Bytes:29 03 + ORA #$30 ; PRG:$16F3 Bytes:09 30 + STA (CurrentObjectPtrLo),Y ; PRG:$16F5 Bytes:91 08 + LDY #$15 ; PRG:$16F7 Bytes:A0 15 + LDA #$0C ; PRG:$16F9 Bytes:A9 0C + STA (CurrentObjectPtrLo),Y ; PRG:$16FB Bytes:91 08 + INY ; PRG:$16FD Bytes:C8 + LDA #$00 ; PRG:$16FE Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$1700 Bytes:91 08 + INY ; PRG:$1702 Bytes:C8 + STA (CurrentObjectPtrLo),Y ; PRG:$1703 Bytes:91 08 + INY ; PRG:$1705 Bytes:C8 + LDA #$01 ; PRG:$1706 Bytes:A9 01 + STA (CurrentObjectPtrLo),Y ; PRG:$1708 Bytes:91 08 + LDA #$03 ; PRG:$170A Bytes:A9 03 + STA $02 ; PRG:$170C Bytes:85 02 + LDA #$80 ; PRG:$170E Bytes:A9 80 + STA $00 ; PRG:$1710 Bytes:85 00 + LDA #$04 ; PRG:$1712 Bytes:A9 04 + STA $01 ; PRG:$1714 Bytes:85 01 +ObjectPathLoop_D716: + LDY #$10 ; PRG:$1716 Bytes:A0 10 + LDA ($00),Y ; PRG:$1718 Bytes:B1 00 + CMP #$01 ; PRG:$171A Bytes:C9 01 + BNE ObjectPathContinue_D72A ; PRG:$171C Bytes:D0 0C + LDY #$15 ; PRG:$171E Bytes:A0 15 + LDA ($00),Y ; PRG:$1720 Bytes:B1 00 + CMP #$20 ; PRG:$1722 Bytes:C9 20 + BCS ObjectPathContinue_D72A ; PRG:$1724 Bytes:B0 04 + LDA #$20 ; PRG:$1726 Bytes:A9 20 + STA ($00),Y ; PRG:$1728 Bytes:91 00 +ObjectPathContinue_D72A: + LDX #$00 ; PRG:$172A Bytes:A2 00 + JSR RunGameTaskRoutine_CBD3 ; PRG:$172C Bytes:20 D3 CB + DEC $02 ; PRG:$172F Bytes:C6 02 + BPL ObjectPathLoop_D716 ; PRG:$1731 Bytes:10 E3 + JMP ProcessObjectStateDispatch_D59F ; PRG:$1733 Bytes:4C 9F D5 +ObjectPathLoop_D736: + INY ; PRG:$1736 Bytes:C8 + LDA #$01 ; PRG:$1737 Bytes:A9 01 + BNE UpdateObjectRecordOnNonZero_D775 ; PRG:$1739 Bytes:D0 3A +UpdateObjectBufferDispatch_D73B: + AND #$03 ; PRG:$173B Bytes:29 03 + STA $06 ; PRG:$173D Bytes:85 06 + LDA $0F ; PRG:$173F Bytes:A5 0F + CLC ; PRG:$1741 Bytes:18 + ADC #$06 ; PRG:$1742 Bytes:69 06 + JSR ReadObjectRecordRoutine_E5AA ; PRG:$1744 Bytes:20 AA E5 + BCS ReadObjectRecordContinue_D7A4 ; PRG:$1747 Bytes:B0 5B + CMP #$24 ; PRG:$1749 Bytes:C9 24 + BEQ ReadObjectRecordContinue_D7A4 ; PRG:$174B Bytes:F0 57 + CMP #$4E ; PRG:$174D Bytes:C9 4E + BCS ObjectPathOnCarry_D755 ; PRG:$174F Bytes:B0 04 + CMP #$4A ; PRG:$1751 Bytes:C9 4A + BCS ReadObjectRecordContinue_D7A4 ; PRG:$1753 Bytes:B0 4F +ObjectPathOnCarry_D755: + CMP #$60 ; PRG:$1755 Bytes:C9 60 + BCS ObjectPathOnCarry_D75D ; PRG:$1757 Bytes:B0 04 + CMP #$50 ; PRG:$1759 Bytes:C9 50 + BCS ReadObjectRecordContinue_D7A4 ; PRG:$175B Bytes:B0 47 +ObjectPathOnCarry_D75D: + CMP #$FD ; PRG:$175D Bytes:C9 FD + BCS UpdateObjectRecordOnCarry_D765 ; PRG:$175F Bytes:B0 04 + CMP #$F9 ; PRG:$1761 Bytes:C9 F9 + BCS ReadObjectRecordContinue_D7A4 ; PRG:$1763 Bytes:B0 3F +UpdateObjectRecordOnCarry_D765: + LDA #$11 ; PRG:$1765 Bytes:A9 11 + EOR $06 ; PRG:$1767 Bytes:45 06 + LDY #$10 ; PRG:$1769 Bytes:A0 10 + STA (CurrentObjectPtrLo),Y ; PRG:$176B Bytes:91 08 + LDY #$16 ; PRG:$176D Bytes:A0 16 + LDA (CurrentObjectPtrLo),Y ; PRG:$176F Bytes:B1 08 + BNE ObjectPathLoop_D736 ; PRG:$1771 Bytes:D0 C3 + LDA #$18 ; PRG:$1773 Bytes:A9 18 +UpdateObjectRecordOnNonZero_D775: + STA (CurrentObjectPtrLo),Y ; PRG:$1775 Bytes:91 08 +ReadObjectRecordDispatch_D777: + LDY #$10 ; PRG:$1777 Bytes:A0 10 + LDA (CurrentObjectPtrLo),Y ; PRG:$1779 Bytes:B1 08 + PHA ; PRG:$177B Bytes:48 + AND #$03 ; PRG:$177C Bytes:29 03 + TAX ; PRG:$177E Bytes:AA + JSR UpdateObjectRecordRoutine_CD45 ; PRG:$177F Bytes:20 45 CD + PLA ; PRG:$1782 Bytes:68 +ProcessObjectStateDispatch_D783: + AND #$F0 ; PRG:$1783 Bytes:29 F0 + LSR A ; PRG:$1785 Bytes:4A + LSR A ; PRG:$1786 Bytes:4A + LSR A ; PRG:$1787 Bytes:4A + LSR A ; PRG:$1788 Bytes:4A + TAX ; PRG:$1789 Bytes:AA + DEX ; PRG:$178A Bytes:CA + LDA $5F,X ; PRG:$178B Bytes:B5 5F + BNE UpdateObjectRecordOnNonZero_D794 ; PRG:$178D Bytes:D0 05 + LDA $D46A,X ; PRG:$178F Bytes:BD 6A D4 + STA $5F,X ; PRG:$1792 Bytes:95 5F +UpdateObjectRecordOnNonZero_D794: + CMP $D46D,X ; PRG:$1794 Bytes:DD 6D D4 + BCC ObjectPathOnNoCarry_D7A1 ; PRG:$1797 Bytes:90 08 + LDY #$05 ; PRG:$1799 Bytes:A0 05 + LDA #$01 ; PRG:$179B Bytes:A9 01 + EOR (CurrentObjectPtrLo),Y ; PRG:$179D Bytes:51 08 + STA (CurrentObjectPtrLo),Y ; PRG:$179F Bytes:91 08 +ObjectPathOnNoCarry_D7A1: + JMP ProcessObjectStateDispatch_D67A ; PRG:$17A1 Bytes:4C 7A D6 +ReadObjectRecordContinue_D7A4: + LDY #$15 ; PRG:$17A4 Bytes:A0 15 + LDA (CurrentObjectPtrLo),Y ; PRG:$17A6 Bytes:B1 08 + BEQ UpdateObjectRecordContinue_D814 ; PRG:$17A8 Bytes:F0 6A + LDY #$17 ; PRG:$17AA Bytes:A0 17 + LDA (CurrentObjectPtrLo),Y ; PRG:$17AC Bytes:B1 08 + BNE UpdateObjectRecordContinue_D814 ; PRG:$17AE Bytes:D0 64 + LDA $06 ; PRG:$17B0 Bytes:A5 06 + LDX #$01 ; PRG:$17B2 Bytes:A2 01 + CMP #$02 ; PRG:$17B4 Bytes:C9 02 + BCC TestObjectFieldOnNoCarry_D7B9 ; PRG:$17B6 Bytes:90 01 + DEX ; PRG:$17B8 Bytes:CA +TestObjectFieldOnNoCarry_D7B9: + LDY $D470,X ; PRG:$17B9 Bytes:BC 70 D4 + LDA (CurrentObjectPtrLo),Y ; PRG:$17BC Bytes:B1 08 + LDY $D472,X ; PRG:$17BE Bytes:BC 72 D4 + CMP (CurrentObjectPtrLo),Y ; PRG:$17C1 Bytes:D1 08 + BNE ReadObjectRecordLoop_D80D ; PRG:$17C3 Bytes:D0 48 + TXA ; PRG:$17C5 Bytes:8A + EOR #$01 ; PRG:$17C6 Bytes:49 01 + TAX ; PRG:$17C8 Bytes:AA + LDY $D470,X ; PRG:$17C9 Bytes:BC 70 D4 + LDA (CurrentObjectPtrLo),Y ; PRG:$17CC Bytes:B1 08 + LDY $D472,X ; PRG:$17CE Bytes:BC 72 D4 + CMP (CurrentObjectPtrLo),Y ; PRG:$17D1 Bytes:D1 08 + LDA $06 ; PRG:$17D3 Bytes:A5 06 + AND #$01 ; PRG:$17D5 Bytes:29 01 + BCS ObjectPathOnCarry_D807 ; PRG:$17D7 Bytes:B0 2E + BEQ ObjectPathOnZero_D809 ; PRG:$17D9 Bytes:F0 2E +ObjectPathLoop_D7DB: + LDA #$00 ; PRG:$17DB Bytes:A9 00 +ProcessObjectStateDispatch_D7DD: + TAX ; PRG:$17DD Bytes:AA + LDA $06 ; PRG:$17DE Bytes:A5 06 + LDY #$02 ; PRG:$17E0 Bytes:A0 02 + CMP #$02 ; PRG:$17E2 Bytes:C9 02 + BCC ObjectPathOnNoCarry_D7E8 ; PRG:$17E4 Bytes:90 02 + LDY #$04 ; PRG:$17E6 Bytes:A0 04 +ObjectPathOnNoCarry_D7E8: + AND #$01 ; PRG:$17E8 Bytes:29 01 + BNE UpdateObjectRecordOnNonZero_D7F0 ; PRG:$17EA Bytes:D0 04 + INX ; PRG:$17EC Bytes:E8 + INX ; PRG:$17ED Bytes:E8 + INX ; PRG:$17EE Bytes:E8 + INX ; PRG:$17EF Bytes:E8 +UpdateObjectRecordOnNonZero_D7F0: + LDA $77 ; PRG:$17F0 Bytes:A5 77 + BNE ObjectPathOnNonZero_D804 ; PRG:$17F2 Bytes:D0 10 + CLC ; PRG:$17F4 Bytes:18 + LDA $C0B9,X ; PRG:$17F5 Bytes:BD B9 C0 + ADC (CurrentObjectPtrLo),Y ; PRG:$17F8 Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$17FA Bytes:91 08 + DEY ; PRG:$17FC Bytes:88 + LDA $C0B1,X ; PRG:$17FD Bytes:BD B1 C0 + ADC (CurrentObjectPtrLo),Y ; PRG:$1800 Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$1802 Bytes:91 08 +ObjectPathOnNonZero_D804: + JMP ReadObjectRecordDispatch_D777 ; PRG:$1804 Bytes:4C 77 D7 +ObjectPathOnCarry_D807: + BEQ ObjectPathLoop_D7DB ; PRG:$1807 Bytes:F0 D2 +ObjectPathOnZero_D809: + LDA #$03 ; PRG:$1809 Bytes:A9 03 + BNE ProcessObjectStateDispatch_D7DD ; PRG:$180B Bytes:D0 D0 +ReadObjectRecordLoop_D80D: + LDY #$18 ; PRG:$180D Bytes:A0 18 + LDA (CurrentObjectPtrLo),Y ; PRG:$180F Bytes:B1 08 + JMP ProcessObjectStateDispatch_D7DD ; PRG:$1811 Bytes:4C DD D7 +UpdateObjectRecordContinue_D814: + LDY #$18 ; PRG:$1814 Bytes:A0 18 + LDA #$00 ; PRG:$1816 Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$1818 Bytes:91 08 + LDY #$03 ; PRG:$181A Bytes:A0 03 + LDX #$08 ; PRG:$181C Bytes:A2 08 + LDA $06 ; PRG:$181E Bytes:A5 06 + CMP #$02 ; PRG:$1820 Bytes:C9 02 + BCS ReadObjectRecordOnCarry_D828 ; PRG:$1822 Bytes:B0 04 + LDY #$01 ; PRG:$1824 Bytes:A0 01 + LDX #$11 ; PRG:$1826 Bytes:A2 11 +ReadObjectRecordOnCarry_D828: + LDA (CurrentObjectPtrLo),Y ; PRG:$1828 Bytes:B1 08 + INY ; PRG:$182A Bytes:C8 + STY $00 ; PRG:$182B Bytes:84 00 + LDY #$09 ; PRG:$182D Bytes:A0 09 +ObjectPathLoop_D82F: + CMP $D458,X ; PRG:$182F Bytes:DD 58 D4 + BEQ ObjectPathOnZero_D83A ; PRG:$1832 Bytes:F0 06 + DEX ; PRG:$1834 Bytes:CA + DEY ; PRG:$1835 Bytes:88 + BNE ObjectPathLoop_D82F ; PRG:$1836 Bytes:D0 F7 + BEQ ReadObjectRecordLoop_D80D ; PRG:$1838 Bytes:F0 D3 +ObjectPathOnZero_D83A: + LDA $15 ; PRG:$183A Bytes:A5 15 + CMP #$20 ; PRG:$183C Bytes:C9 20 + BCC UpdateObjectRecordOnNoCarry_D842 ; PRG:$183E Bytes:90 02 + LDA #$00 ; PRG:$1840 Bytes:A9 00 +UpdateObjectRecordOnNoCarry_D842: + LDY #$15 ; PRG:$1842 Bytes:A0 15 + STA (CurrentObjectPtrLo),Y ; PRG:$1844 Bytes:91 08 + INY ; PRG:$1846 Bytes:C8 + LDA #$04 ; PRG:$1847 Bytes:A9 04 + STA (CurrentObjectPtrLo),Y ; PRG:$1849 Bytes:91 08 + LDY #$10 ; PRG:$184B Bytes:A0 10 + LDA $06 ; PRG:$184D Bytes:A5 06 + ORA #$20 ; PRG:$184F Bytes:09 20 + STA (CurrentObjectPtrLo),Y ; PRG:$1851 Bytes:91 08 + JMP ReadObjectRecordDispatch_D777 ; PRG:$1853 Bytes:4C 77 D7 +;------------------------------------------------------------ +; ObjectPath_D856 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_D856: + LDA #$07 ; PRG:$1856 Bytes:A9 07 + STA $0E ; PRG:$1858 Bytes:85 0E + LDA #$00 ; PRG:$185A Bytes:A9 00 + STA $00 ; PRG:$185C Bytes:85 00 + LDA #$05 ; PRG:$185E Bytes:A9 05 + STA $01 ; PRG:$1860 Bytes:85 01 +UpdateObjectBufferLoop_D862: + LDA #$03 ; PRG:$1862 Bytes:A9 03 + STA $0F ; PRG:$1864 Bytes:85 0F + LDA #$80 ; PRG:$1866 Bytes:A9 80 + STA $02 ; PRG:$1868 Bytes:85 02 + LDA #$04 ; PRG:$186A Bytes:A9 04 + STA $03 ; PRG:$186C Bytes:85 03 +ObjectPathLoop_D86E: + LDY #$10 ; PRG:$186E Bytes:A0 10 + LDA ($00),Y ; PRG:$1870 Bytes:B1 00 + BEQ ObjectPathContinue_D8A5 ; PRG:$1872 Bytes:F0 31 + LDY #$05 ; PRG:$1874 Bytes:A0 05 + LDA ($00),Y ; PRG:$1876 Bytes:B1 00 + CMP #$08 ; PRG:$1878 Bytes:C9 08 + BEQ ObjectPathOnZero_D888 ; PRG:$187A Bytes:F0 0C + CMP #$09 ; PRG:$187C Bytes:C9 09 + BEQ ObjectPathOnZero_D888 ; PRG:$187E Bytes:F0 08 + CMP #$12 ; PRG:$1880 Bytes:C9 12 + BEQ ObjectPathOnZero_D888 ; PRG:$1882 Bytes:F0 04 + CMP #$13 ; PRG:$1884 Bytes:C9 13 + BNE ObjectPathContinue_D8A5 ; PRG:$1886 Bytes:D0 1D +ObjectPathOnZero_D888: + LDY #$10 ; PRG:$1888 Bytes:A0 10 + LDA ($02),Y ; PRG:$188A Bytes:B1 02 + CMP #$02 ; PRG:$188C Bytes:C9 02 + BCC ObjectPathContinue_D8A5 ; PRG:$188E Bytes:90 15 + BPL UpdateObjectBufferOnPositive_D896 ; PRG:$1890 Bytes:10 04 + CMP #$F0 ; PRG:$1892 Bytes:C9 F0 + BCC ObjectPathContinue_D8A5 ; PRG:$1894 Bytes:90 0F +UpdateObjectBufferOnPositive_D896: + JSR ProcessResourceStateRoutine_F71C ; PRG:$1896 Bytes:20 1C F7 + BCC ObjectPathContinue_D8A5 ; PRG:$1899 Bytes:90 0A + LDY #$10 ; PRG:$189B Bytes:A0 10 + LDA ($02),Y ; PRG:$189D Bytes:B1 02 + AND #$03 ; PRG:$189F Bytes:29 03 + ORA #$40 ; PRG:$18A1 Bytes:09 40 + STA ($02),Y ; PRG:$18A3 Bytes:91 02 +ObjectPathContinue_D8A5: + LDX #$02 ; PRG:$18A5 Bytes:A2 02 + JSR RunGameTaskRoutine_CBD3 ; PRG:$18A7 Bytes:20 D3 CB + BPL ObjectPathLoop_D86E ; PRG:$18AA Bytes:10 C2 + LDX #$00 ; PRG:$18AC Bytes:A2 00 + JSR RunGameTaskRoutine_CBD3 ; PRG:$18AE Bytes:20 D3 CB + DEC $0E ; PRG:$18B1 Bytes:C6 0E + BPL UpdateObjectBufferLoop_D862 ; PRG:$18B3 Bytes:10 AD + RTS ; PRG:$18B5 Bytes:60 + .byte $00, $02, $01, $03 ; PRG:$18B6 Bytes:00 02 01 03 +;------------------------------------------------------------ +; ObjectPath_D8BA +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_D8BA: + LDA #$01 ; PRG:$18BA Bytes:A9 01 + STA $0E ; PRG:$18BC Bytes:85 0E + LDA #$40 ; PRG:$18BE Bytes:A9 40 + STA $00 ; PRG:$18C0 Bytes:85 00 + LDA #$04 ; PRG:$18C2 Bytes:A9 04 + STA $01 ; PRG:$18C4 Bytes:85 01 +UpdateObjectBufferLoop_D8C6: + LDA #$03 ; PRG:$18C6 Bytes:A9 03 + STA $0F ; PRG:$18C8 Bytes:85 0F + LDA #$80 ; PRG:$18CA Bytes:A9 80 + STA $02 ; PRG:$18CC Bytes:85 02 + LDA #$04 ; PRG:$18CE Bytes:A9 04 + STA $03 ; PRG:$18D0 Bytes:85 03 +ObjectPathLoop_D8D2: + JSR ProcessObjectStateRoutine_D970 ; PRG:$18D2 Bytes:20 70 D9 + BNE ProcessObjectStateDispatch_D904 ; PRG:$18D5 Bytes:D0 2D + LDY #$10 ; PRG:$18D7 Bytes:A0 10 + LDA ($02),Y ; PRG:$18D9 Bytes:B1 02 + BPL ObjectPathOnPositive_D8E1 ; PRG:$18DB Bytes:10 04 + CMP #$F0 ; PRG:$18DD Bytes:C9 F0 + BCC ProcessObjectStateDispatch_D904 ; PRG:$18DF Bytes:90 23 +ObjectPathOnPositive_D8E1: + CMP #$02 ; PRG:$18E1 Bytes:C9 02 + BCC ProcessObjectStateDispatch_D904 ; PRG:$18E3 Bytes:90 1F + JSR ProcessResourceStateRoutine_F71C ; PRG:$18E5 Bytes:20 1C F7 + BCC ProcessObjectStateDispatch_D904 ; PRG:$18E8 Bytes:90 1A + LDY #$10 ; PRG:$18EA Bytes:A0 10 + LDA ($02),Y ; PRG:$18EC Bytes:B1 02 + CMP #$30 ; PRG:$18EE Bytes:C9 30 + BCS ObjectPathOnCarry_D928 ; PRG:$18F0 Bytes:B0 36 +UpdateObjectBufferLoop_D8F2: + LDA #$23 ; PRG:$18F2 Bytes:A9 23 + STA $90,X ; PRG:$18F4 Bytes:95 90 + LDA ($02),Y ; PRG:$18F6 Bytes:B1 02 + AND #$03 ; PRG:$18F8 Bytes:29 03 + ORA #$F0 ; PRG:$18FA Bytes:09 F0 + STA ($02),Y ; PRG:$18FC Bytes:91 02 + LDY #$15 ; PRG:$18FE Bytes:A0 15 + LDA #$08 ; PRG:$1900 Bytes:A9 08 + STA ($02),Y ; PRG:$1902 Bytes:91 02 +ProcessObjectStateDispatch_D904: + LDX #$02 ; PRG:$1904 Bytes:A2 02 + JSR RunGameTaskRoutine_CBD3 ; PRG:$1906 Bytes:20 D3 CB + BPL ObjectPathLoop_D8D2 ; PRG:$1909 Bytes:10 C7 + LDA #$00 ; PRG:$190B Bytes:A9 00 + STA $00 ; PRG:$190D Bytes:85 00 + LDA #$04 ; PRG:$190F Bytes:A9 04 + STA $01 ; PRG:$1911 Bytes:85 01 + DEC $0E ; PRG:$1913 Bytes:C6 0E + BPL UpdateObjectBufferLoop_D8C6 ; PRG:$1915 Bytes:10 AF + RTS ; PRG:$1917 Bytes:60 +UpdateObjectBufferLoop_D918: + LDA ($02),Y ; PRG:$1918 Bytes:B1 02 + AND #$03 ; PRG:$191A Bytes:29 03 + ORA #$30 ; PRG:$191C Bytes:09 30 + STA ($02),Y ; PRG:$191E Bytes:91 02 + LDY #$15 ; PRG:$1920 Bytes:A0 15 + LDA #$14 ; PRG:$1922 Bytes:A9 14 + STA ($02),Y ; PRG:$1924 Bytes:91 02 + BNE ProcessObjectStateDispatch_D904 ; PRG:$1926 Bytes:D0 DC +ObjectPathOnCarry_D928: + CMP #$40 ; PRG:$1928 Bytes:C9 40 + BCC UpdateObjectBufferLoop_D918 ; PRG:$192A Bytes:90 EC + CMP #$F0 ; PRG:$192C Bytes:C9 F0 + BCS UpdateObjectBufferLoop_D8F2 ; PRG:$192E Bytes:B0 C2 + JSR ProcessObjectStateRoutine_D94D ; PRG:$1930 Bytes:20 4D D9 + TAX ; PRG:$1933 Bytes:AA + EOR ($02),Y ; PRG:$1934 Bytes:51 02 + AND #$02 ; PRG:$1936 Bytes:29 02 + BEQ UpdateObjectBufferOnZero_D93D ; PRG:$1938 Bytes:F0 03 + LDA ($02),Y ; PRG:$193A Bytes:B1 02 + TAX ; PRG:$193C Bytes:AA +UpdateObjectBufferOnZero_D93D: + TXA ; PRG:$193D Bytes:8A + AND #$03 ; PRG:$193E Bytes:29 03 + ORA #$80 ; PRG:$1940 Bytes:09 80 + STA ($02),Y ; PRG:$1942 Bytes:91 02 + LDY #$1B ; PRG:$1944 Bytes:A0 1B + LDA $0E ; PRG:$1946 Bytes:A5 0E + STA ($02),Y ; PRG:$1948 Bytes:91 02 + JMP ProcessObjectStateDispatch_D904 ; PRG:$194A Bytes:4C 04 D9 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_D94D +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_D94D: + LDA ($00),Y ; PRG:$194D Bytes:B1 00 + BPL ObjectPathContinue_D96D ; PRG:$194F Bytes:10 1C + CMP #$81 ; PRG:$1951 Bytes:C9 81 + PHP ; PRG:$1953 Bytes:08 + LDA #$08 ; PRG:$1954 Bytes:A9 08 + BCC ObjectPathOnNoCarry_D95A ; PRG:$1956 Bytes:90 02 + LDA #$38 ; PRG:$1958 Bytes:A9 38 +ObjectPathOnNoCarry_D95A: + LDY #$1B ; PRG:$195A Bytes:A0 1B + CLC ; PRG:$195C Bytes:18 + ADC ($00),Y ; PRG:$195D Bytes:71 00 + ROL A ; PRG:$195F Bytes:2A + ROL A ; PRG:$1960 Bytes:2A + ROL A ; PRG:$1961 Bytes:2A + AND #$03 ; PRG:$1962 Bytes:29 03 + TAX ; PRG:$1964 Bytes:AA + LDA $D8B6,X ; PRG:$1965 Bytes:BD B6 D8 + PLP ; PRG:$1968 Bytes:28 + BCC ObjectPathContinue_D96D ; PRG:$1969 Bytes:90 02 + EOR #$01 ; PRG:$196B Bytes:49 01 +ObjectPathContinue_D96D: + LDY #$10 ; PRG:$196D Bytes:A0 10 + RTS ; PRG:$196F Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_D970 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_D970: + LDX $0E ; PRG:$1970 Bytes:A6 0E + LDA $90,X ; PRG:$1972 Bytes:B5 90 + BNE ObjectPathOnNonZero_D978 ; PRG:$1974 Bytes:D0 02 + LDA $D0,X ; PRG:$1976 Bytes:B5 D0 +ObjectPathOnNonZero_D978: + RTS ; PRG:$1978 Bytes:60 + .byte $03, $FD ; PRG:$1979 Bytes:03 FD +;------------------------------------------------------------ +; ObjectPath_D97B +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_D97B: + LDA #$02 ; PRG:$197B Bytes:A9 02 + STA $0E ; PRG:$197D Bytes:85 0E + LDA #$80 ; PRG:$197F Bytes:A9 80 + STA $00 ; PRG:$1981 Bytes:85 00 + LDA #$04 ; PRG:$1983 Bytes:A9 04 + STA $01 ; PRG:$1985 Bytes:85 01 +UpdateObjectBufferLoop_D987: + LDA $0E ; PRG:$1987 Bytes:A5 0E + STA $0F ; PRG:$1989 Bytes:85 0F + CLC ; PRG:$198B Bytes:18 + LDA #$20 ; PRG:$198C Bytes:A9 20 + ADC $00 ; PRG:$198E Bytes:65 00 + STA $02 ; PRG:$1990 Bytes:85 02 + LDA #$00 ; PRG:$1992 Bytes:A9 00 + ADC $01 ; PRG:$1994 Bytes:65 01 + STA $03 ; PRG:$1996 Bytes:85 03 +ObjectPathLoop_D998: + JSR ProcessResourceStateRoutine_F71C ; PRG:$1998 Bytes:20 1C F7 + BCC ObjectPathOnNoCarry_D9A0 ; PRG:$199B Bytes:90 03 + JSR ProcessObjectStateRoutine_D9B1 ; PRG:$199D Bytes:20 B1 D9 +ObjectPathOnNoCarry_D9A0: + LDX #$02 ; PRG:$19A0 Bytes:A2 02 + JSR RunGameTaskRoutine_CBD3 ; PRG:$19A2 Bytes:20 D3 CB + BPL ObjectPathLoop_D998 ; PRG:$19A5 Bytes:10 F1 + LDX #$00 ; PRG:$19A7 Bytes:A2 00 + JSR RunGameTaskRoutine_CBD3 ; PRG:$19A9 Bytes:20 D3 CB + DEC $0E ; PRG:$19AC Bytes:C6 0E + BPL UpdateObjectBufferLoop_D987 ; PRG:$19AE Bytes:10 D7 + RTS ; PRG:$19B0 Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_D9B1 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_D9B1: + LDY #$10 ; PRG:$19B1 Bytes:A0 10 + LDA ($00),Y ; PRG:$19B3 Bytes:B1 00 + CMP #$20 ; PRG:$19B5 Bytes:C9 20 + BCS ObjectPathContinue_D9DE ; PRG:$19B7 Bytes:B0 25 + LDA ($02),Y ; PRG:$19B9 Bytes:B1 02 + CMP #$20 ; PRG:$19BB Bytes:C9 20 + BCS ObjectPathOnCarry_D9CB ; PRG:$19BD Bytes:B0 0C + EOR ($00),Y ; PRG:$19BF Bytes:51 00 + AND #$02 ; PRG:$19C1 Bytes:29 02 + BNE ObjectPathOnNonZero_D9CF ; PRG:$19C3 Bytes:D0 0A + LDY #$1C ; PRG:$19C5 Bytes:A0 1C + LDA ($00),Y ; PRG:$19C7 Bytes:B1 00 + BNE ObjectPathContinue_D9DE ; PRG:$19C9 Bytes:D0 13 +ObjectPathOnCarry_D9CB: + JSR UpdateObjectBufferRoutine_D9E2 ; PRG:$19CB Bytes:20 E2 D9 + RTS ; PRG:$19CE Bytes:60 +ObjectPathOnNonZero_D9CF: + JSR UpdateObjectBufferRoutine_D9E2 ; PRG:$19CF Bytes:20 E2 D9 + JSR ProcessResourceStateRoutine_F71C ; PRG:$19D2 Bytes:20 1C F7 + BCC ObjectPathOnNoCarry_D9E1 ; PRG:$19D5 Bytes:90 0A + JSR UpdateObjectBufferRoutine_D9E2 ; PRG:$19D7 Bytes:20 E2 D9 + LDA #$00 ; PRG:$19DA Bytes:A9 00 + STA ($00),Y ; PRG:$19DC Bytes:91 00 +ObjectPathContinue_D9DE: + JSR UpdateObjectBufferRoutine_DA04 ; PRG:$19DE Bytes:20 04 DA +ObjectPathOnNoCarry_D9E1: + RTS ; PRG:$19E1 Bytes:60 +;------------------------------------------------------------ +; UpdateObjectBufferRoutine_D9E2 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBufferRoutine_D9E2: + LDY #$10 ; PRG:$19E2 Bytes:A0 10 + LDA ($00),Y ; PRG:$19E4 Bytes:B1 00 + EOR #$01 ; PRG:$19E6 Bytes:49 01 + STA ($00),Y ; PRG:$19E8 Bytes:91 00 + LDY #$01 ; PRG:$19EA Bytes:A0 01 + CMP #$12 ; PRG:$19EC Bytes:C9 12 + BCC ObjectPathOnNoCarry_D9F2 ; PRG:$19EE Bytes:90 02 + LDY #$03 ; PRG:$19F0 Bytes:A0 03 +ObjectPathOnNoCarry_D9F2: + AND #$01 ; PRG:$19F2 Bytes:29 01 + TAX ; PRG:$19F4 Bytes:AA + LDA $D979,X ; PRG:$19F5 Bytes:BD 79 D9 + CLC ; PRG:$19F8 Bytes:18 + ADC ($00),Y ; PRG:$19F9 Bytes:71 00 + STA ($00),Y ; PRG:$19FB Bytes:91 00 + LDY #$1C ; PRG:$19FD Bytes:A0 1C + LDA #$05 ; PRG:$19FF Bytes:A9 05 + STA ($00),Y ; PRG:$1A01 Bytes:91 00 + RTS ; PRG:$1A03 Bytes:60 +;------------------------------------------------------------ +; UpdateObjectBufferRoutine_DA04 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBufferRoutine_DA04: + LDY #$10 ; PRG:$1A04 Bytes:A0 10 + LDA ($02),Y ; PRG:$1A06 Bytes:B1 02 + EOR #$01 ; PRG:$1A08 Bytes:49 01 + STA ($02),Y ; PRG:$1A0A Bytes:91 02 + LDY #$01 ; PRG:$1A0C Bytes:A0 01 + CMP #$12 ; PRG:$1A0E Bytes:C9 12 + BCC ObjectPathOnNoCarry_DA14 ; PRG:$1A10 Bytes:90 02 + LDY #$03 ; PRG:$1A12 Bytes:A0 03 +ObjectPathOnNoCarry_DA14: + AND #$01 ; PRG:$1A14 Bytes:29 01 + TAX ; PRG:$1A16 Bytes:AA + LDA $D979,X ; PRG:$1A17 Bytes:BD 79 D9 + CLC ; PRG:$1A1A Bytes:18 + ADC ($02),Y ; PRG:$1A1B Bytes:71 02 + STA ($02),Y ; PRG:$1A1D Bytes:91 02 + LDY #$1C ; PRG:$1A1F Bytes:A0 1C + LDA #$05 ; PRG:$1A21 Bytes:A9 05 + STA ($02),Y ; PRG:$1A23 Bytes:91 02 + RTS ; PRG:$1A25 Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_DA26 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_DA26: + LDA $77 ; PRG:$1A26 Bytes:A5 77 + BNE ObjectPathContinue_DA8A ; PRG:$1A28 Bytes:D0 60 + LDA $64 ; PRG:$1A2A Bytes:A5 64 + BNE ObjectPathContinue_DA8A ; PRG:$1A2C Bytes:D0 5C + LDA $2E ; PRG:$1A2E Bytes:A5 2E + BNE ObjectPathOnNonZero_DA36 ; PRG:$1A30 Bytes:D0 04 + LDA $2F ; PRG:$1A32 Bytes:A5 2F + BEQ ObjectPathContinue_DA8A ; PRG:$1A34 Bytes:F0 54 +ObjectPathOnNonZero_DA36: + LDX #$07 ; PRG:$1A36 Bytes:A2 07 + LDA $4C ; PRG:$1A38 Bytes:A5 4C + BEQ ObjectPathOnZero_DA3E ; PRG:$1A3A Bytes:F0 02 + LDX #$06 ; PRG:$1A3C Bytes:A2 06 +ObjectPathOnZero_DA3E: + STX $64 ; PRG:$1A3E Bytes:86 64 + LDA #$01 ; PRG:$1A40 Bytes:A9 01 + STA $00 ; PRG:$1A42 Bytes:85 00 + LDA #$02 ; PRG:$1A44 Bytes:A9 02 + STA $01 ; PRG:$1A46 Bytes:85 01 + JSR ProcessResourceStateRoutine_F408 ; PRG:$1A48 Bytes:20 08 F4 + LDA $2F ; PRG:$1A4B Bytes:A5 2F + BNE ObjectPathLoop_DA85 ; PRG:$1A4D Bytes:D0 36 + LDA $2E ; PRG:$1A4F Bytes:A5 2E + BEQ ObjectPathOnZero_DA65 ; PRG:$1A51 Bytes:F0 12 + CMP #$02 ; PRG:$1A53 Bytes:C9 02 + BNE ObjectPathLoop_DA85 ; PRG:$1A55 Bytes:D0 2E + LDA #$01 ; PRG:$1A57 Bytes:A9 01 + STA $64 ; PRG:$1A59 Bytes:85 64 + LDA $8F ; PRG:$1A5B Bytes:A5 8F + BNE ObjectPathLoop_DA85 ; PRG:$1A5D Bytes:D0 26 + LDA #$08 ; PRG:$1A5F Bytes:A9 08 + STA $FB ; PRG:$1A61 Bytes:85 FB + BNE ObjectPathLoop_DA85 ; PRG:$1A63 Bytes:D0 20 +ObjectPathOnZero_DA65: + LDA $8F ; PRG:$1A65 Bytes:A5 8F + BNE ObjectPathOnNonZero_DA8B ; PRG:$1A67 Bytes:D0 22 + LDA #$01 ; PRG:$1A69 Bytes:A9 01 + STA $A1 ; PRG:$1A6B Bytes:85 A1 + STA $A0 ; PRG:$1A6D Bytes:85 A0 + LDA #$23 ; PRG:$1A6F Bytes:A9 23 + LDX $90 ; PRG:$1A71 Bytes:A6 90 + CPX #$01 ; PRG:$1A73 Bytes:E0 01 + BCS ObjectPathOnCarry_DA79 ; PRG:$1A75 Bytes:B0 02 + STA $90 ; PRG:$1A77 Bytes:85 90 +ObjectPathOnCarry_DA79: + LDX $91 ; PRG:$1A79 Bytes:A6 91 + CPX #$01 ; PRG:$1A7B Bytes:E0 01 + BCS ObjectPathOnCarry_DA81 ; PRG:$1A7D Bytes:B0 02 + STA $91 ; PRG:$1A7F Bytes:85 91 +ObjectPathOnCarry_DA81: + LDA #$80 ; PRG:$1A81 Bytes:A9 80 + STA $FB ; PRG:$1A83 Bytes:85 FB +ObjectPathLoop_DA85: + LDA #$82 ; PRG:$1A85 Bytes:A9 82 + JSR ProcessResourceStateRoutine_F31A ; PRG:$1A87 Bytes:20 1A F3 +ObjectPathContinue_DA8A: + RTS ; PRG:$1A8A Bytes:60 +ObjectPathOnNonZero_DA8B: + LDA #$23 ; PRG:$1A8B Bytes:A9 23 + STA $78 ; PRG:$1A8D Bytes:85 78 + BNE ObjectPathLoop_DA85 ; PRG:$1A8F Bytes:D0 F4 +;------------------------------------------------------------ +; ObjectPath_DA91 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_DA91: + LDA $0401 ; PRG:$1A91 Bytes:AD 01 04 + LDY $0403 ; PRG:$1A94 Bytes:AC 03 04 + LDX $D0 ; PRG:$1A97 Bytes:A6 D0 + BEQ ObjectPathOnZero_DA9F ; PRG:$1A99 Bytes:F0 04 + LDA $11 ; PRG:$1A9B Bytes:A5 11 + LDY $12 ; PRG:$1A9D Bytes:A4 12 +ObjectPathOnZero_DA9F: + STA $0499 ; PRG:$1A9F Bytes:8D 99 04 + STY $049A ; PRG:$1AA2 Bytes:8C 9A 04 + STA $04D9 ; PRG:$1AA5 Bytes:8D D9 04 + STY $04DA ; PRG:$1AA8 Bytes:8C DA 04 + LDX $4C ; PRG:$1AAB Bytes:A6 4C + BEQ ObjectPathOnZero_DAB5 ; PRG:$1AAD Bytes:F0 06 + LDA $0441 ; PRG:$1AAF Bytes:AD 41 04 + LDY $0443 ; PRG:$1AB2 Bytes:AC 43 04 +ObjectPathOnZero_DAB5: + LDX $D1 ; PRG:$1AB5 Bytes:A6 D1 + BEQ ObjectPathOnZero_DABD ; PRG:$1AB7 Bytes:F0 04 + LDA $13 ; PRG:$1AB9 Bytes:A5 13 + LDY $14 ; PRG:$1ABB Bytes:A4 14 +ObjectPathOnZero_DABD: + STA $04B9 ; PRG:$1ABD Bytes:8D B9 04 + STY $04BA ; PRG:$1AC0 Bytes:8C BA 04 + STA $04F9 ; PRG:$1AC3 Bytes:8D F9 04 + STY $04FA ; PRG:$1AC6 Bytes:8C FA 04 + RTS ; PRG:$1AC9 Bytes:60 + .byte $0C, $FC, $00, $00, $00, $00, $0C, $FC, $00, $F0, $00, $08, $08, $00, $F0, $00 ; PRG:$1ACA Bytes:0C FC 00 00 00 00 0C FC 00 F0 00 08 08 00 F0 00 +;------------------------------------------------------------ +; ReadObjectRecord_DADA +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ReadObjectRecord_DADA: + LDX $0A ; PRG:$1ADA Bytes:A6 0A + LDA $46,X ; PRG:$1ADC Bytes:B5 46 + AND #$C0 ; PRG:$1ADE Bytes:29 C0 + BEQ ObjectPathContinue_DB27 ; PRG:$1AE0 Bytes:F0 45 + LDA $DA,X ; PRG:$1AE2 Bytes:B5 DA + CMP #$02 ; PRG:$1AE4 Bytes:C9 02 + BEQ ObjectPathContinue_DB27 ; PRG:$1AE6 Bytes:F0 3F + LDA #$20 ; PRG:$1AE8 Bytes:A9 20 + STA $07 ; PRG:$1AEA Bytes:85 07 + LSR A ; PRG:$1AEC Bytes:4A + STA $6C,X ; PRG:$1AED Bytes:95 6C + LDA $06 ; PRG:$1AEF Bytes:A5 06 + BMI ObjectPathOnNegative_DB28 ; PRG:$1AF1 Bytes:30 35 + AND #$03 ; PRG:$1AF3 Bytes:29 03 + TAX ; PRG:$1AF5 Bytes:AA + LSR A ; PRG:$1AF6 Bytes:4A + EOR #$01 ; PRG:$1AF7 Bytes:49 01 + STA $0D ; PRG:$1AF9 Bytes:85 0D + LDY #$01 ; PRG:$1AFB Bytes:A0 01 + LDA $DACA,X ; PRG:$1AFD Bytes:BD CA DA + CLC ; PRG:$1B00 Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$1B01 Bytes:71 08 + STA $00 ; PRG:$1B03 Bytes:85 00 + LDY #$03 ; PRG:$1B05 Bytes:A0 03 + LDA $DACE,X ; PRG:$1B07 Bytes:BD CE DA +ReadObjectRecordLoop_DB0A: + CLC ; PRG:$1B0A Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$1B0B Bytes:71 08 + STA $01 ; PRG:$1B0D Bytes:85 01 + LDA #$00 ; PRG:$1B0F Bytes:A9 00 + STA $02 ; PRG:$1B11 Bytes:85 02 + STA $0E ; PRG:$1B13 Bytes:85 0E + JSR ProcessObjectStateRoutine_CE50 ; PRG:$1B15 Bytes:20 50 CE + BCS ObjectPathContinue_DB27 ; PRG:$1B18 Bytes:B0 0D + LDX $0A ; PRG:$1B1A Bytes:A6 0A + INC $DA,X ; PRG:$1B1C Bytes:F6 DA + LDY #$15 ; PRG:$1B1E Bytes:A0 15 + TXA ; PRG:$1B20 Bytes:8A + STA ($04),Y ; PRG:$1B21 Bytes:91 04 + LDA #$40 ; PRG:$1B23 Bytes:A9 40 + STA $FF ; PRG:$1B25 Bytes:85 FF +ObjectPathContinue_DB27: + RTS ; PRG:$1B27 Bytes:60 +ObjectPathOnNegative_DB28: + CMP #$81 ; PRG:$1B28 Bytes:C9 81 + LDA #$08 ; PRG:$1B2A Bytes:A9 08 + BCC ReadObjectRecordOnNoCarry_DB30 ; PRG:$1B2C Bytes:90 02 + LDA #$38 ; PRG:$1B2E Bytes:A9 38 +ReadObjectRecordOnNoCarry_DB30: + LDY #$1B ; PRG:$1B30 Bytes:A0 1B + CLC ; PRG:$1B32 Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$1B33 Bytes:71 08 + ROL A ; PRG:$1B35 Bytes:2A + ROL A ; PRG:$1B36 Bytes:2A + ROL A ; PRG:$1B37 Bytes:2A + AND #$03 ; PRG:$1B38 Bytes:29 03 + TAX ; PRG:$1B3A Bytes:AA + AND #$01 ; PRG:$1B3B Bytes:29 01 + EOR #$01 ; PRG:$1B3D Bytes:49 01 + STA $0D ; PRG:$1B3F Bytes:85 0D + LDY #$21 ; PRG:$1B41 Bytes:A0 21 + CLC ; PRG:$1B43 Bytes:18 + LDA $DAD2,X ; PRG:$1B44 Bytes:BD D2 DA + ADC (CurrentObjectPtrLo),Y ; PRG:$1B47 Bytes:71 08 + STA $00 ; PRG:$1B49 Bytes:85 00 + LDA $DAD6,X ; PRG:$1B4B Bytes:BD D6 DA + LDY #$23 ; PRG:$1B4E Bytes:A0 23 + BNE ReadObjectRecordLoop_DB0A ; PRG:$1B50 Bytes:D0 B8 +;------------------------------------------------------------ +; UpdateObjectBuffer_DB52 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBuffer_DB52: + LDA $67 ; PRG:$1B52 Bytes:A5 67 + BNE ObjectPathContinue_DBC3 ; PRG:$1B54 Bytes:D0 6D + LDA $90 ; PRG:$1B56 Bytes:A5 90 + BNE ObjectPathContinue_DBC3 ; PRG:$1B58 Bytes:D0 69 + LDA $91 ; PRG:$1B5A Bytes:A5 91 + BNE ObjectPathContinue_DBC3 ; PRG:$1B5C Bytes:D0 65 + LDA $D0 ; PRG:$1B5E Bytes:A5 D0 + BNE ObjectPathContinue_DBC3 ; PRG:$1B60 Bytes:D0 61 + LDA $D1 ; PRG:$1B62 Bytes:A5 D1 + BNE ObjectPathContinue_DBC3 ; PRG:$1B64 Bytes:D0 5D + LDA #$00 ; PRG:$1B66 Bytes:A9 00 + STA $00 ; PRG:$1B68 Bytes:85 00 + LDA #$04 ; PRG:$1B6A Bytes:A9 04 + STA $01 ; PRG:$1B6C Bytes:85 01 + LDA #$40 ; PRG:$1B6E Bytes:A9 40 + STA $02 ; PRG:$1B70 Bytes:85 02 + LDA #$04 ; PRG:$1B72 Bytes:A9 04 + STA $03 ; PRG:$1B74 Bytes:85 03 + JSR ProcessResourceStateRoutine_F71C ; PRG:$1B76 Bytes:20 1C F7 + BCC ObjectPathContinue_DBC3 ; PRG:$1B79 Bytes:90 48 + JSR ProcessObjectStateRoutine_DB8A ; PRG:$1B7B Bytes:20 8A DB + LDA #$40 ; PRG:$1B7E Bytes:A9 40 + STA $00 ; PRG:$1B80 Bytes:85 00 + LDA #$04 ; PRG:$1B82 Bytes:A9 04 + STA $01 ; PRG:$1B84 Bytes:85 01 + LDA #$08 ; PRG:$1B86 Bytes:A9 08 + STA $FF ; PRG:$1B88 Bytes:85 FF +;------------------------------------------------------------ +; ProcessObjectStateRoutine_DB8A +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_DB8A: + LDY #$10 ; PRG:$1B8A Bytes:A0 10 + LDA ($00),Y ; PRG:$1B8C Bytes:B1 00 + BMI UpdateObjectBufferOnNegative_DBA7 ; PRG:$1B8E Bytes:30 17 + CMP #$04 ; PRG:$1B90 Bytes:C9 04 + BCS ObjectPathContinue_DBC3 ; PRG:$1B92 Bytes:B0 2F + TAX ; PRG:$1B94 Bytes:AA + LDY $E16F,X ; PRG:$1B95 Bytes:BC 6F E1 + SEC ; PRG:$1B98 Bytes:38 + LDA #$00 ; PRG:$1B99 Bytes:A9 00 + SBC ($00),Y ; PRG:$1B9B Bytes:F1 00 + STA ($00),Y ; PRG:$1B9D Bytes:91 00 + DEY ; PRG:$1B9F Bytes:88 + LDA #$00 ; PRG:$1BA0 Bytes:A9 00 + SBC ($00),Y ; PRG:$1BA2 Bytes:F1 00 + STA ($00),Y ; PRG:$1BA4 Bytes:91 00 + TXA ; PRG:$1BA6 Bytes:8A +UpdateObjectBufferOnNegative_DBA7: + LDY #$18 ; PRG:$1BA7 Bytes:A0 18 + STY $67 ; PRG:$1BA9 Bytes:84 67 + EOR #$01 ; PRG:$1BAB Bytes:49 01 + LDY #$10 ; PRG:$1BAD Bytes:A0 10 + STA ($00),Y ; PRG:$1BAF Bytes:91 00 + LDA #$0A ; PRG:$1BB1 Bytes:A9 0A + STA $56 ; PRG:$1BB3 Bytes:85 56 + LDY #$02 ; PRG:$1BB5 Bytes:A0 02 + LDX #$10 ; PRG:$1BB7 Bytes:A2 10 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$1BB9 Bytes:20 AE D1 + LDY #$03 ; PRG:$1BBC Bytes:A0 03 + LDX #$14 ; PRG:$1BBE Bytes:A2 14 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$1BC0 Bytes:20 AE D1 +ObjectPathContinue_DBC3: + RTS ; PRG:$1BC3 Bytes:60 + .byte $A8, $B0, $B8 ; PRG:$1BC4 Bytes:A8 B0 B8 +;------------------------------------------------------------ +; UpdateObjectBuffer_DBC7 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBuffer_DBC7: + LDA #$07 ; PRG:$1BC7 Bytes:A9 07 + STA $0F ; PRG:$1BC9 Bytes:85 0F + LDA #$00 ; PRG:$1BCB Bytes:A9 00 + STA $02 ; PRG:$1BCD Bytes:85 02 + LDA #$06 ; PRG:$1BCF Bytes:A9 06 + STA $03 ; PRG:$1BD1 Bytes:85 03 +ObjectPathLoop_DBD3: + LDY #$10 ; PRG:$1BD3 Bytes:A0 10 + LDA ($02),Y ; PRG:$1BD5 Bytes:B1 02 + TAX ; PRG:$1BD7 Bytes:AA + BEQ ObjectPathLoop_DC36 ; PRG:$1BD8 Bytes:F0 5C + DEX ; PRG:$1BDA Bytes:CA + TXA ; PRG:$1BDB Bytes:8A + STA ($02),Y ; PRG:$1BDC Bytes:91 02 + LDY #$00 ; PRG:$1BDE Bytes:A0 00 + LDA ($02),Y ; PRG:$1BE0 Bytes:B1 02 + BMI ObjectPathOnNegative_DC3E ; PRG:$1BE2 Bytes:30 5A + LDY #$05 ; PRG:$1BE4 Bytes:A0 05 + LDA #$08 ; PRG:$1BE6 Bytes:A9 08 + CPX #$1C ; PRG:$1BE8 Bytes:E0 1C + BEQ ObjectPathOnZero_DC34 ; PRG:$1BEA Bytes:F0 48 + LDA #$09 ; PRG:$1BEC Bytes:A9 09 + CPX #$14 ; PRG:$1BEE Bytes:E0 14 + BEQ ObjectPathOnZero_DC34 ; PRG:$1BF0 Bytes:F0 42 + LDA #$01 ; PRG:$1BF2 Bytes:A9 01 + CPX #$01 ; PRG:$1BF4 Bytes:E0 01 + BEQ ObjectPathLoop_DC2E ; PRG:$1BF6 Bytes:F0 36 + CPX #$00 ; PRG:$1BF8 Bytes:E0 00 + BNE ObjectPathLoop_DC36 ; PRG:$1BFA Bytes:D0 3A + LDY #$01 ; PRG:$1BFC Bytes:A0 01 + LDA ($02),Y ; PRG:$1BFE Bytes:B1 02 + SEC ; PRG:$1C00 Bytes:38 + SBC #$04 ; PRG:$1C01 Bytes:E9 04 + STA $04 ; PRG:$1C03 Bytes:85 04 + LDY #$03 ; PRG:$1C05 Bytes:A0 03 + LDA ($02),Y ; PRG:$1C07 Bytes:B1 02 + SEC ; PRG:$1C09 Bytes:38 + SBC #$04 ; PRG:$1C0A Bytes:E9 04 + STA $05 ; PRG:$1C0C Bytes:85 05 + LDY #$11 ; PRG:$1C0E Bytes:A0 11 + LDA ($02),Y ; PRG:$1C10 Bytes:B1 02 + TAX ; PRG:$1C12 Bytes:AA + BEQ ObjectPathOnZero_DC18 ; PRG:$1C13 Bytes:F0 03 + JSR UpdateObjectBufferRoutine_DD5B ; PRG:$1C15 Bytes:20 5B DD +ObjectPathOnZero_DC18: + LDY #$0B ; PRG:$1C18 Bytes:A0 0B + LDA ($02),Y ; PRG:$1C1A Bytes:B1 02 + LDX #$03 ; PRG:$1C1C Bytes:A2 03 +ObjectPathLoop_DC1E: + DEX ; PRG:$1C1E Bytes:CA + CMP $DBC4,X ; PRG:$1C1F Bytes:DD C4 DB + BNE ObjectPathLoop_DC1E ; PRG:$1C22 Bytes:D0 FA + LDA #$00 ; PRG:$1C24 Bytes:A9 00 + STA $A9,X ; PRG:$1C26 Bytes:95 A9 + LDY #$01 ; PRG:$1C28 Bytes:A0 01 + STA ($02),Y ; PRG:$1C2A Bytes:91 02 + LDA #$80 ; PRG:$1C2C Bytes:A9 80 +ObjectPathLoop_DC2E: + LDX #$10 ; PRG:$1C2E Bytes:A2 10 + STX $FF ; PRG:$1C30 Bytes:86 FF + LDY #$00 ; PRG:$1C32 Bytes:A0 00 +ObjectPathOnZero_DC34: + STA ($02),Y ; PRG:$1C34 Bytes:91 02 +ObjectPathLoop_DC36: + LDX #$02 ; PRG:$1C36 Bytes:A2 02 + JSR RunGameTaskRoutine_CBD3 ; PRG:$1C38 Bytes:20 D3 CB + BPL ObjectPathLoop_DBD3 ; PRG:$1C3B Bytes:10 96 + RTS ; PRG:$1C3D Bytes:60 +ObjectPathOnNegative_DC3E: + CPX #$00 ; PRG:$1C3E Bytes:E0 00 + BNE ObjectPathLoop_DC36 ; PRG:$1C40 Bytes:D0 F4 + LDX #$03 ; PRG:$1C42 Bytes:A2 03 +ObjectPathLoop_DC44: + DEX ; PRG:$1C44 Bytes:CA + BMI ObjectPathLoop_DC36 ; PRG:$1C45 Bytes:30 EF + LDA $A9,X ; PRG:$1C47 Bytes:B5 A9 + BNE ObjectPathLoop_DC44 ; PRG:$1C49 Bytes:D0 F9 + LDY #$0B ; PRG:$1C4B Bytes:A0 0B + LDA $DBC4,X ; PRG:$1C4D Bytes:BD C4 DB + STA ($02),Y ; PRG:$1C50 Bytes:91 02 + LDA #$01 ; PRG:$1C52 Bytes:A9 01 + STA $A9,X ; PRG:$1C54 Bytes:95 A9 + LDA #$00 ; PRG:$1C56 Bytes:A9 00 + BEQ ObjectPathLoop_DC2E ; PRG:$1C58 Bytes:F0 D4 +;------------------------------------------------------------ +; ObjectPath_DC5A +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_DC5A: + LDA #$01 ; PRG:$1C5A Bytes:A9 01 + STA $0E ; PRG:$1C5C Bytes:85 0E + LDA #$40 ; PRG:$1C5E Bytes:A9 40 + STA $00 ; PRG:$1C60 Bytes:85 00 + LDA #$04 ; PRG:$1C62 Bytes:A9 04 + STA $01 ; PRG:$1C64 Bytes:85 01 +UpdateObjectBufferLoop_DC66: + LDA #$07 ; PRG:$1C66 Bytes:A9 07 + STA $0F ; PRG:$1C68 Bytes:85 0F + LDA #$00 ; PRG:$1C6A Bytes:A9 00 + STA $02 ; PRG:$1C6C Bytes:85 02 + LDA #$06 ; PRG:$1C6E Bytes:A9 06 + STA $03 ; PRG:$1C70 Bytes:85 03 +ObjectPathLoop_DC72: + JSR ProcessObjectStateRoutine_D970 ; PRG:$1C72 Bytes:20 70 D9 + BNE ObjectPathLoop_DC8A ; PRG:$1C75 Bytes:D0 13 + LDY #$00 ; PRG:$1C77 Bytes:A0 00 + LDA ($02),Y ; PRG:$1C79 Bytes:B1 02 + BMI ObjectPathOnNegative_DC9E ; PRG:$1C7B Bytes:30 21 + BNE ObjectPathLoop_DC8A ; PRG:$1C7D Bytes:D0 0B + JSR ProcessResourceStateRoutine_F71C ; PRG:$1C7F Bytes:20 1C F7 + BCC ObjectPathLoop_DC8A ; PRG:$1C82 Bytes:90 06 + LDY #$10 ; PRG:$1C84 Bytes:A0 10 + LDA ($02),Y ; PRG:$1C86 Bytes:B1 02 + BEQ UpdateObjectBufferOnZero_DCBB ; PRG:$1C88 Bytes:F0 31 +ObjectPathLoop_DC8A: + LDX #$02 ; PRG:$1C8A Bytes:A2 02 + JSR RunGameTaskRoutine_CBD3 ; PRG:$1C8C Bytes:20 D3 CB + BPL ObjectPathLoop_DC72 ; PRG:$1C8F Bytes:10 E1 + LDA #$00 ; PRG:$1C91 Bytes:A9 00 + STA $00 ; PRG:$1C93 Bytes:85 00 + LDA #$04 ; PRG:$1C95 Bytes:A9 04 + STA $01 ; PRG:$1C97 Bytes:85 01 + DEC $0E ; PRG:$1C99 Bytes:C6 0E + BPL UpdateObjectBufferLoop_DC66 ; PRG:$1C9B Bytes:10 C9 + RTS ; PRG:$1C9D Bytes:60 +ObjectPathOnNegative_DC9E: + INY ; PRG:$1C9E Bytes:C8 + LDA ($02),Y ; PRG:$1C9F Bytes:B1 02 + BEQ ObjectPathLoop_DC8A ; PRG:$1CA1 Bytes:F0 E7 + DEY ; PRG:$1CA3 Bytes:88 + LDA #$00 ; PRG:$1CA4 Bytes:A9 00 + STA ($02),Y ; PRG:$1CA6 Bytes:91 02 + JSR ProcessResourceStateRoutine_F71C ; PRG:$1CA8 Bytes:20 1C F7 + LDY #$00 ; PRG:$1CAB Bytes:A0 00 + LDA #$80 ; PRG:$1CAD Bytes:A9 80 + STA ($02),Y ; PRG:$1CAF Bytes:91 02 + BCC ObjectPathLoop_DC8A ; PRG:$1CB1 Bytes:90 D7 + LDA #$04 ; PRG:$1CB3 Bytes:A9 04 + LDY #$10 ; PRG:$1CB5 Bytes:A0 10 + STA ($02),Y ; PRG:$1CB7 Bytes:91 02 + BNE ObjectPathLoop_DC8A ; PRG:$1CB9 Bytes:D0 CF +UpdateObjectBufferOnZero_DCBB: + LDY #$10 ; PRG:$1CBB Bytes:A0 10 + LDA #$28 ; PRG:$1CBD Bytes:A9 28 + STA ($02),Y ; PRG:$1CBF Bytes:91 02 + LDY #$05 ; PRG:$1CC1 Bytes:A0 05 + LDA ($02),Y ; PRG:$1CC3 Bytes:B1 02 + TAX ; PRG:$1CC5 Bytes:AA + BEQ ObjectPathOnZero_DCEA ; PRG:$1CC6 Bytes:F0 22 + DEX ; PRG:$1CC8 Bytes:CA + BEQ ObjectPathOnZero_DD08 ; PRG:$1CC9 Bytes:F0 3D + LDA #$03 ; PRG:$1CCB Bytes:A9 03 + LDY #$15 ; PRG:$1CCD Bytes:A0 15 + DEX ; PRG:$1CCF Bytes:CA + BEQ ObjectPathOnZero_DCD6 ; PRG:$1CD0 Bytes:F0 04 + LDA #$02 ; PRG:$1CD2 Bytes:A9 02 + LDY #$08 ; PRG:$1CD4 Bytes:A0 08 +ObjectPathOnZero_DCD6: + STY $00 ; PRG:$1CD6 Bytes:84 00 + LDY #$11 ; PRG:$1CD8 Bytes:A0 11 + STA ($02),Y ; PRG:$1CDA Bytes:91 02 + LDA $8D ; PRG:$1CDC Bytes:A5 8D + BNE ObjectPathOnNonZero_DCE9 ; PRG:$1CDE Bytes:D0 09 + LDA $0E ; PRG:$1CE0 Bytes:A5 0E + ORA #$08 ; PRG:$1CE2 Bytes:09 08 + STA $01 ; PRG:$1CE4 Bytes:85 01 + JSR ProcessResourceStateRoutine_F40C ; PRG:$1CE6 Bytes:20 0C F4 +ObjectPathOnNonZero_DCE9: + RTS ; PRG:$1CE9 Bytes:60 +ObjectPathOnZero_DCEA: + JSR ProcessObjectStateRoutine_D1CE ; PRG:$1CEA Bytes:20 CE D1 + INY ; PRG:$1CED Bytes:C8 + LDX #$08 ; PRG:$1CEE Bytes:A2 08 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$1CF0 Bytes:20 AE D1 + LDA $0E ; PRG:$1CF3 Bytes:A5 0E + EOR #$01 ; PRG:$1CF5 Bytes:49 01 + TAY ; PRG:$1CF7 Bytes:A8 + LDA #$30 ; PRG:$1CF8 Bytes:A9 30 + STA a:$0075,Y ; PRG:$1CFA Bytes:99 75 00 + STA $77 ; PRG:$1CFD Bytes:85 77 + LDX $D25D,Y ; PRG:$1CFF Bytes:BE 5D D2 + INY ; PRG:$1D02 Bytes:C8 + INY ; PRG:$1D03 Bytes:C8 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$1D04 Bytes:20 AE D1 + RTS ; PRG:$1D07 Bytes:60 +ObjectPathOnZero_DD08: + LDX $0E ; PRG:$1D08 Bytes:A6 0E + INC $80,X ; PRG:$1D0A Bytes:F6 80 + JSR ProcessObjectStateRoutine_D42C ; PRG:$1D0C Bytes:20 2C D4 + RTS ; PRG:$1D0F Bytes:60 +;------------------------------------------------------------ +; ObjectPath_DD10 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_DD10: + LDA $77 ; PRG:$1D10 Bytes:A5 77 + CMP #$01 ; PRG:$1D12 Bytes:C9 01 + BNE ObjectPathOnNonZero_DD20 ; PRG:$1D14 Bytes:D0 0A + DEC $77 ; PRG:$1D16 Bytes:C6 77 + JSR ProcessObjectStateRoutine_D1CE ; PRG:$1D18 Bytes:20 CE D1 + LDX #$08 ; PRG:$1D1B Bytes:A2 08 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$1D1D Bytes:20 AE D1 +ObjectPathOnNonZero_DD20: + LDA $75 ; PRG:$1D20 Bytes:A5 75 + CMP #$01 ; PRG:$1D22 Bytes:C9 01 + BNE ObjectPathOnNonZero_DD2F ; PRG:$1D24 Bytes:D0 09 + DEC $75 ; PRG:$1D26 Bytes:C6 75 + LDY #$00 ; PRG:$1D28 Bytes:A0 00 + LDX #$10 ; PRG:$1D2A Bytes:A2 10 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$1D2C Bytes:20 AE D1 +ObjectPathOnNonZero_DD2F: + LDA $76 ; PRG:$1D2F Bytes:A5 76 + CMP #$01 ; PRG:$1D31 Bytes:C9 01 + BNE ObjectPathOnNonZero_DD3E ; PRG:$1D33 Bytes:D0 09 + DEC $76 ; PRG:$1D35 Bytes:C6 76 + LDY #$01 ; PRG:$1D37 Bytes:A0 01 + LDX #$14 ; PRG:$1D39 Bytes:A2 14 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$1D3B Bytes:20 AE D1 +ObjectPathOnNonZero_DD3E: + LDA $56 ; PRG:$1D3E Bytes:A5 56 + CMP #$01 ; PRG:$1D40 Bytes:C9 01 + BNE ObjectPathOnNonZero_DD5A ; PRG:$1D42 Bytes:D0 16 + LDA $75 ; PRG:$1D44 Bytes:A5 75 + BNE ObjectPathOnNonZero_DD4F ; PRG:$1D46 Bytes:D0 07 +;------------------------------------------------------------ +; ProcessObjectStateDispatch_DD48 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateDispatch_DD48: + LDY #$00 ; PRG:$1D48 Bytes:A0 00 + LDX #$10 ; PRG:$1D4A Bytes:A2 10 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$1D4C Bytes:20 AE D1 +ObjectPathOnNonZero_DD4F: + LDA $76 ; PRG:$1D4F Bytes:A5 76 + BNE ObjectPathOnNonZero_DD5A ; PRG:$1D51 Bytes:D0 07 + LDY #$01 ; PRG:$1D53 Bytes:A0 01 + LDX #$14 ; PRG:$1D55 Bytes:A2 14 + JSR UpdateObjectBufferRoutine_D1AE ; PRG:$1D57 Bytes:20 AE D1 +ObjectPathOnNonZero_DD5A: + RTS ; PRG:$1D5A Bytes:60 +;------------------------------------------------------------ +; UpdateObjectBufferRoutine_DD5B +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBufferRoutine_DD5B: + STX $06 ; PRG:$1D5B Bytes:86 06 + LDA #$B0 ; PRG:$1D5D Bytes:A9 B0 + STA $00 ; PRG:$1D5F Bytes:85 00 + LDA #$03 ; PRG:$1D61 Bytes:A9 03 + STA $01 ; PRG:$1D63 Bytes:85 01 + LDX #$03 ; PRG:$1D65 Bytes:A2 03 +UpdateObjectBufferLoop_DD67: + JSR ProcessObjectStateRoutine_DDB2 ; PRG:$1D67 Bytes:20 B2 DD + BMI ObjectPathOnNegative_DD8E ; PRG:$1D6A Bytes:30 22 + LDY #$00 ; PRG:$1D6C Bytes:A0 00 + LDA ($00),Y ; PRG:$1D6E Bytes:B1 00 + BEQ UpdateObjectBufferLoop_DD67 ; PRG:$1D70 Bytes:F0 F5 + LDA #$00 ; PRG:$1D72 Bytes:A9 00 + STA ($00),Y ; PRG:$1D74 Bytes:91 00 + LDA $04 ; PRG:$1D76 Bytes:A5 04 + LDY #$01 ; PRG:$1D78 Bytes:A0 01 + STA ($00),Y ; PRG:$1D7A Bytes:91 00 + LDA $05 ; PRG:$1D7C Bytes:A5 05 + LDY #$03 ; PRG:$1D7E Bytes:A0 03 + STA ($00),Y ; PRG:$1D80 Bytes:91 00 + LDA $06 ; PRG:$1D82 Bytes:A5 06 + LDY #$05 ; PRG:$1D84 Bytes:A0 05 + STA ($00),Y ; PRG:$1D86 Bytes:91 00 + LDA #$20 ; PRG:$1D88 Bytes:A9 20 + LDY #$0C ; PRG:$1D8A Bytes:A0 0C + STA ($00),Y ; PRG:$1D8C Bytes:91 00 +ObjectPathOnNegative_DD8E: + RTS ; PRG:$1D8E Bytes:60 +;------------------------------------------------------------ +; UpdateObjectBuffer_DD8F +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBuffer_DD8F: + LDA #$C0 ; PRG:$1D8F Bytes:A9 C0 + STA $00 ; PRG:$1D91 Bytes:85 00 + LDA #$03 ; PRG:$1D93 Bytes:A9 03 + STA $01 ; PRG:$1D95 Bytes:85 01 + LDX #$02 ; PRG:$1D97 Bytes:A2 02 +ObjectPathLoop_DD99: + LDY #$0C ; PRG:$1D99 Bytes:A0 0C + LDA ($00),Y ; PRG:$1D9B Bytes:B1 00 + BEQ ObjectPathContinue_DDAC ; PRG:$1D9D Bytes:F0 0D + SEC ; PRG:$1D9F Bytes:38 + SBC #$01 ; PRG:$1DA0 Bytes:E9 01 + STA ($00),Y ; PRG:$1DA2 Bytes:91 00 + BNE ObjectPathContinue_DDAC ; PRG:$1DA4 Bytes:D0 06 + LDY #$00 ; PRG:$1DA6 Bytes:A0 00 + LDA #$01 ; PRG:$1DA8 Bytes:A9 01 + STA ($00),Y ; PRG:$1DAA Bytes:91 00 +ObjectPathContinue_DDAC: + JSR ProcessObjectStateRoutine_DDB2 ; PRG:$1DAC Bytes:20 B2 DD + BPL ObjectPathLoop_DD99 ; PRG:$1DAF Bytes:10 E8 + RTS ; PRG:$1DB1 Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_DDB2 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_DDB2: + CLC ; PRG:$1DB2 Bytes:18 + LDA #$10 ; PRG:$1DB3 Bytes:A9 10 + ADC $00 ; PRG:$1DB5 Bytes:65 00 + STA $00 ; PRG:$1DB7 Bytes:85 00 + LDA #$00 ; PRG:$1DB9 Bytes:A9 00 + ADC $01 ; PRG:$1DBB Bytes:65 01 + STA $01 ; PRG:$1DBD Bytes:85 01 + DEX ; PRG:$1DBF Bytes:CA + RTS ; PRG:$1DC0 Bytes:60 +;------------------------------------------------------------ +; ObjectPath_DDC1 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_DDC1: + LDA $8D ; PRG:$1DC1 Bytes:A5 8D + BEQ ObjectPathOnZero_DDF8 ; PRG:$1DC3 Bytes:F0 33 + LDX #$01 ; PRG:$1DC5 Bytes:A2 01 +ObjectPathLoop_DDC7: + LDA $70,X ; PRG:$1DC7 Bytes:B5 70 + BNE ObjectPathOnNonZero_DDE3 ; PRG:$1DC9 Bytes:D0 18 + LDA $10,X ; PRG:$1DCB Bytes:B5 10 + AND #$07 ; PRG:$1DCD Bytes:29 07 + ORA #$02 ; PRG:$1DCF Bytes:09 02 + STA $70,X ; PRG:$1DD1 Bytes:95 70 + LDA $12,X ; PRG:$1DD3 Bytes:B5 12 + AND #$0F ; PRG:$1DD5 Bytes:29 0F + TAY ; PRG:$1DD7 Bytes:A8 + LDA #$00 ; PRG:$1DD8 Bytes:A9 00 + SEC ; PRG:$1DDA Bytes:38 +ObjectPathLoop_DDDB: + ROL A ; PRG:$1DDB Bytes:2A + DEY ; PRG:$1DDC Bytes:88 + BNE ObjectPathLoop_DDDB ; PRG:$1DDD Bytes:D0 FC + AND #$0F ; PRG:$1DDF Bytes:29 0F + STA $D8,X ; PRG:$1DE1 Bytes:95 D8 +ObjectPathOnNonZero_DDE3: + LDA $44,X ; PRG:$1DE3 Bytes:B5 44 + AND #$30 ; PRG:$1DE5 Bytes:29 30 + ORA $D8,X ; PRG:$1DE7 Bytes:15 D8 + STA $44,X ; PRG:$1DE9 Bytes:95 44 + LDY $14,X ; PRG:$1DEB Bytes:B4 14 + CPY #$08 ; PRG:$1DED Bytes:C0 08 + BCS ObjectPathOnCarry_DDF3 ; PRG:$1DEF Bytes:B0 02 + ORA #$80 ; PRG:$1DF1 Bytes:09 80 +ObjectPathOnCarry_DDF3: + STA $46,X ; PRG:$1DF3 Bytes:95 46 + DEX ; PRG:$1DF5 Bytes:CA + BPL ObjectPathLoop_DDC7 ; PRG:$1DF6 Bytes:10 CF +ObjectPathOnZero_DDF8: + RTS ; PRG:$1DF8 Bytes:60 + .byte $28, $28, $20, $23, $00, $1F, $00, $A0, $00, $FF, $00, $FF, $01, $FF, $20, $E0 ; PRG:$1DF9 Bytes:28 28 20 23 00 1F 00 A0 00 FF 00 FF 01 FF 20 E0 + .byte $20, $20, $01, $01, $1E, $1E, $20, $20, $20, $20, $1E, $1E ; PRG:$1E09 Bytes:20 20 01 01 1E 1E 20 20 20 20 1E 1E +;------------------------------------------------------------ +; ObjectPath_DE15 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_DE15: + LDX #$03 ; PRG:$1E15 Bytes:A2 03 +ObjectPathLoop_DE17: + LDA $DE0D,X ; PRG:$1E17 Bytes:BD 0D DE + STA $04 ; PRG:$1E1A Bytes:85 04 + LDA $DDFD,X ; PRG:$1E1C Bytes:BD FD DD + STA $00 ; PRG:$1E1F Bytes:85 00 + LDA $DDF9,X ; PRG:$1E21 Bytes:BD F9 DD + STA $01 ; PRG:$1E24 Bytes:85 01 +UpdateObjectBufferLoop_DE26: + LDY $DE11,X ; PRG:$1E26 Bytes:BC 11 DE + LDA WorkPtr0Lo ; PRG:$1E29 Bytes:A5 00 + STA $02 ; PRG:$1E2B Bytes:85 02 + LDA WorkPtr0Hi ; PRG:$1E2D Bytes:A5 01 + STA $03 ; PRG:$1E2F Bytes:85 03 +ObjectPathLoop_DE31: + JSR UpdateObjectBufferRoutine_DE81 ; PRG:$1E31 Bytes:20 81 DE + CMP #$4E ; PRG:$1E34 Bytes:C9 4E + BEQ UpdateObjectBufferOnZero_DE3C ; PRG:$1E36 Bytes:F0 04 + CMP #$24 ; PRG:$1E38 Bytes:C9 24 + BNE ObjectPathOnNonZero_DE4D ; PRG:$1E3A Bytes:D0 11 +UpdateObjectBufferOnZero_DE3C: + PHA ; PRG:$1E3C Bytes:48 + LDA $03 ; PRG:$1E3D Bytes:A5 03 + STA PPUADDR ; PRG:$1E3F Bytes:8D 06 20 + LDA WorkPtr1Lo ; PRG:$1E42 Bytes:A5 02 + STA PPUADDR ; PRG:$1E44 Bytes:8D 06 20 + LDA #$FF ; PRG:$1E47 Bytes:A9 FF + STA PPUDATA ; PRG:$1E49 Bytes:8D 07 20 + PLA ; PRG:$1E4C Bytes:68 +ObjectPathOnNonZero_DE4D: + CMP #$4E ; PRG:$1E4D Bytes:C9 4E + BCS UpdateObjectBufferOnCarry_DE55 ; PRG:$1E4F Bytes:B0 04 + CMP #$30 ; PRG:$1E51 Bytes:C9 30 + BCS ObjectPathOnCarry_DE6B ; PRG:$1E53 Bytes:B0 16 +UpdateObjectBufferOnCarry_DE55: + CMP #$B9 ; PRG:$1E55 Bytes:C9 B9 + BCS ObjectPathOnCarry_DE6B ; PRG:$1E57 Bytes:B0 12 + CLC ; PRG:$1E59 Bytes:18 + LDA $DE05,X ; PRG:$1E5A Bytes:BD 05 DE + ADC $02 ; PRG:$1E5D Bytes:65 02 + STA $02 ; PRG:$1E5F Bytes:85 02 + LDA $DE01,X ; PRG:$1E61 Bytes:BD 01 DE + ADC $03 ; PRG:$1E64 Bytes:65 03 + STA $03 ; PRG:$1E66 Bytes:85 03 + DEY ; PRG:$1E68 Bytes:88 + BNE ObjectPathLoop_DE31 ; PRG:$1E69 Bytes:D0 C6 +ObjectPathOnCarry_DE6B: + CLC ; PRG:$1E6B Bytes:18 + LDA $DE09,X ; PRG:$1E6C Bytes:BD 09 DE + ADC $00 ; PRG:$1E6F Bytes:65 00 + STA $00 ; PRG:$1E71 Bytes:85 00 + LDA #$00 ; PRG:$1E73 Bytes:A9 00 + ADC $01 ; PRG:$1E75 Bytes:65 01 + STA $01 ; PRG:$1E77 Bytes:85 01 + DEC $04 ; PRG:$1E79 Bytes:C6 04 + BNE UpdateObjectBufferLoop_DE26 ; PRG:$1E7B Bytes:D0 A9 + DEX ; PRG:$1E7D Bytes:CA + BPL ObjectPathLoop_DE17 ; PRG:$1E7E Bytes:10 97 + RTS ; PRG:$1E80 Bytes:60 +;------------------------------------------------------------ +; UpdateObjectBufferRoutine_DE81 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBufferRoutine_DE81: + LDA PPUSTATUS ; PRG:$1E81 Bytes:AD 02 20 + LDA $03 ; PRG:$1E84 Bytes:A5 03 + STA PPUADDR ; PRG:$1E86 Bytes:8D 06 20 + LDA WorkPtr1Lo ; PRG:$1E89 Bytes:A5 02 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_DE8B +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_DE8B: + STA PPUADDR ; PRG:$1E8B Bytes:8D 06 20 + LDA PPUDATA ; PRG:$1E8E Bytes:AD 07 20 + LDA PPUDATA ; PRG:$1E91 Bytes:AD 07 20 + RTS ; PRG:$1E94 Bytes:60 + .byte $30, $35, $31, $4A, $3A, $3E, $4C, $3F, $33, $4B, $34, $38, $4D, $40, $3D, $41 ; PRG:$1E95 Bytes:30 35 31 4A 3A 3E 4C 3F 33 4B 34 38 4D 40 3D 41 + .byte $37, $35, $3B, $3C, $3A, $49, $48, $36, $45, $47, $46, $38, $42, $43, $3D, $44 ; PRG:$1EA5 Bytes:37 35 3B 3C 3A 49 48 36 45 47 46 38 42 43 3D 44 + .byte $4E, $FA, $FA, $4E, $6E, $86, $86, $6F, $FC, $FC, $FC, $FC, $4F, $F9, $F9, $4F ; PRG:$1EB5 Bytes:4E FA FA 4E 6E 86 86 6F FC FC FC FC 4F F9 F9 4F + .byte $4E, $FB, $FB, $4E, $60, $7C, $7C, $61, $FC, $FC, $FC, $FC, $4F, $F9, $F9, $4F ; PRG:$1EC5 Bytes:4E FB FB 4E 60 7C 7C 61 FC FC FC FC 4F F9 F9 4F +ObjectPathLoop_DED5: + AND #$F0 ; PRG:$1ED5 Bytes:29 F0 + PHA ; PRG:$1ED7 Bytes:48 + CMP #$C0 ; PRG:$1ED8 Bytes:C9 C0 + LDA $40 ; PRG:$1EDA Bytes:A5 40 + AND #$FB ; PRG:$1EDC Bytes:29 FB + BCC UpdateObjectBufferOnNoCarry_DEE2 ; PRG:$1EDE Bytes:90 02 + ORA #$04 ; PRG:$1EE0 Bytes:09 04 +UpdateObjectBufferOnNoCarry_DEE2: + STA $2000 ; PRG:$1EE2 Bytes:8D 00 20 + STA $40 ; PRG:$1EE5 Bytes:85 40 + LDA ($00),Y ; PRG:$1EE7 Bytes:B1 00 + AND #$0F ; PRG:$1EE9 Bytes:29 0F + ORA #$20 ; PRG:$1EEB Bytes:09 20 + STA PPUADDR ; PRG:$1EED Bytes:8D 06 20 + STA $03 ; PRG:$1EF0 Bytes:85 03 + INY ; PRG:$1EF2 Bytes:C8 + LDA ($00),Y ; PRG:$1EF3 Bytes:B1 00 + STA PPUADDR ; PRG:$1EF5 Bytes:8D 06 20 + STA $02 ; PRG:$1EF8 Bytes:85 02 + PLA ; PRG:$1EFA Bytes:68 + LSR A ; PRG:$1EFB Bytes:4A + LSR A ; PRG:$1EFC Bytes:4A + TAY ; PRG:$1EFD Bytes:A8 + LDA $DE95,Y ; PRG:$1EFE Bytes:B9 95 DE + STA PPUDATA ; PRG:$1F01 Bytes:8D 07 20 + INY ; PRG:$1F04 Bytes:C8 + LDA $DE95,Y ; PRG:$1F05 Bytes:B9 95 DE + STA PPUDATA ; PRG:$1F08 Bytes:8D 07 20 + CPY #$20 ; PRG:$1F0B Bytes:C0 20 + BCS ObjectPathOnCarry_DF1F ; PRG:$1F0D Bytes:B0 10 + CLC ; PRG:$1F0F Bytes:18 + LDA #$20 ; PRG:$1F10 Bytes:A9 20 + ADC $02 ; PRG:$1F12 Bytes:65 02 + TAX ; PRG:$1F14 Bytes:AA + LDA #$00 ; PRG:$1F15 Bytes:A9 00 + ADC $03 ; PRG:$1F17 Bytes:65 03 + STA PPUADDR ; PRG:$1F19 Bytes:8D 06 20 + STX PPUADDR ; PRG:$1F1C Bytes:8E 06 20 +ObjectPathOnCarry_DF1F: + INY ; PRG:$1F1F Bytes:C8 + LDA $DE95,Y ; PRG:$1F20 Bytes:B9 95 DE + STA PPUDATA ; PRG:$1F23 Bytes:8D 07 20 + INY ; PRG:$1F26 Bytes:C8 + LDA $DE95,Y ; PRG:$1F27 Bytes:B9 95 DE + STA PPUDATA ; PRG:$1F2A Bytes:8D 07 20 + LDY #$02 ; PRG:$1F2D Bytes:A0 02 +;------------------------------------------------------------ +; ObjectPath_DF2F +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_DF2F: + LDX PPUSTATUS ; PRG:$1F2F Bytes:AE 02 20 + TYA ; PRG:$1F32 Bytes:98 + CLC ; PRG:$1F33 Bytes:18 + ADC $00 ; PRG:$1F34 Bytes:65 00 + STA $00 ; PRG:$1F36 Bytes:85 00 + LDA #$00 ; PRG:$1F38 Bytes:A9 00 + ADC $01 ; PRG:$1F3A Bytes:65 01 + STA $01 ; PRG:$1F3C Bytes:85 01 + LDY #$00 ; PRG:$1F3E Bytes:A0 00 + LDA ($00),Y ; PRG:$1F40 Bytes:B1 00 + CMP #$FF ; PRG:$1F42 Bytes:C9 FF + BNE ObjectPathLoop_DED5 ; PRG:$1F44 Bytes:D0 8F + RTS ; PRG:$1F46 Bytes:60 + .byte $00, $02, $40, $42, $FC, $F3, $CF, $3F, $01, $04, $10, $40 ; PRG:$1F47 Bytes:00 02 40 42 FC F3 CF 3F 01 04 10 40 +ObjectPathLoop_DF53: + LDA $42 ; PRG:$1F53 Bytes:A5 42 + STA PPUSCROLL ; PRG:$1F55 Bytes:8D 05 20 + LDA $43 ; PRG:$1F58 Bytes:A5 43 + STA PPUSCROLL ; PRG:$1F5A Bytes:8D 05 20 + RTS ; PRG:$1F5D Bytes:60 +;------------------------------------------------------------ +; UpdateObjectBuffer_DF5E +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBuffer_DF5E: + LDA #$1F ; PRG:$1F5E Bytes:A9 1F + STA $03 ; PRG:$1F60 Bytes:85 03 + LDA #$FF ; PRG:$1F62 Bytes:A9 FF + STA $02 ; PRG:$1F64 Bytes:85 02 +UpdateObjectBufferDispatch_DF66: + CLC ; PRG:$1F66 Bytes:18 + LDA #$01 ; PRG:$1F67 Bytes:A9 01 + ADC $02 ; PRG:$1F69 Bytes:65 02 + STA $02 ; PRG:$1F6B Bytes:85 02 + LDA #$00 ; PRG:$1F6D Bytes:A9 00 + ADC $03 ; PRG:$1F6F Bytes:65 03 + STA $03 ; PRG:$1F71 Bytes:85 03 + CMP #$23 ; PRG:$1F73 Bytes:C9 23 + BNE ObjectPathOnNonZero_DF7D ; PRG:$1F75 Bytes:D0 06 + LDA WorkPtr1Lo ; PRG:$1F77 Bytes:A5 02 + CMP #$C0 ; PRG:$1F79 Bytes:C9 C0 + BEQ ObjectPathLoop_DF53 ; PRG:$1F7B Bytes:F0 D6 +ObjectPathOnNonZero_DF7D: + JSR UpdateObjectBufferRoutine_DE81 ; PRG:$1F7D Bytes:20 81 DE + LDY #$00 ; PRG:$1F80 Bytes:A0 00 + CMP #$4E ; PRG:$1F82 Bytes:C9 4E + BEQ UpdateObjectBufferContinue_DFAC ; PRG:$1F84 Bytes:F0 26 + CMP #$FA ; PRG:$1F86 Bytes:C9 FA + BEQ UpdateObjectBufferContinue_DFAC ; PRG:$1F88 Bytes:F0 22 + CMP #$FB ; PRG:$1F8A Bytes:C9 FB + BEQ UpdateObjectBufferContinue_DFAC ; PRG:$1F8C Bytes:F0 1E + INY ; PRG:$1F8E Bytes:C8 + CMP #$24 ; PRG:$1F8F Bytes:C9 24 + BEQ UpdateObjectBufferDispatch_DF66 ; PRG:$1F91 Bytes:F0 D3 + CMP #$4E ; PRG:$1F93 Bytes:C9 4E + BCC UpdateObjectBufferContinue_DFAC ; PRG:$1F95 Bytes:90 15 + CMP #$FF ; PRG:$1F97 Bytes:C9 FF + BEQ UpdateObjectBufferContinue_DFAC ; PRG:$1F99 Bytes:F0 11 + CMP #$CC ; PRG:$1F9B Bytes:C9 CC + BCS ObjectPathOnCarry_DFA3 ; PRG:$1F9D Bytes:B0 04 + CMP #$AB ; PRG:$1F9F Bytes:C9 AB + BCS UpdateObjectBufferContinue_DFAC ; PRG:$1FA1 Bytes:B0 09 +ObjectPathOnCarry_DFA3: + INY ; PRG:$1FA3 Bytes:C8 + CMP #$60 ; PRG:$1FA4 Bytes:C9 60 + BCS UpdateObjectBufferDispatch_DF66 ; PRG:$1FA6 Bytes:B0 BE + CMP #$50 ; PRG:$1FA8 Bytes:C9 50 + BCC UpdateObjectBufferDispatch_DF66 ; PRG:$1FAA Bytes:90 BA +UpdateObjectBufferContinue_DFAC: + LDA WorkPtr1Lo ; PRG:$1FAC Bytes:A5 02 + AND #$1C ; PRG:$1FAE Bytes:29 1C + LSR A ; PRG:$1FB0 Bytes:4A + LSR A ; PRG:$1FB1 Bytes:4A + STA $00 ; PRG:$1FB2 Bytes:85 00 + LDA WorkPtr1Lo ; PRG:$1FB4 Bytes:A5 02 + ASL A ; PRG:$1FB6 Bytes:0A + LDA $03 ; PRG:$1FB7 Bytes:A5 03 + AND #$03 ; PRG:$1FB9 Bytes:29 03 + ROL A ; PRG:$1FBB Bytes:2A + ASL A ; PRG:$1FBC Bytes:0A + ASL A ; PRG:$1FBD Bytes:0A + ASL A ; PRG:$1FBE Bytes:0A + CLC ; PRG:$1FBF Bytes:18 + ADC $00 ; PRG:$1FC0 Bytes:65 00 + CLC ; PRG:$1FC2 Bytes:18 + ADC #$C0 ; PRG:$1FC3 Bytes:69 C0 + STA $00 ; PRG:$1FC5 Bytes:85 00 + LDA #$23 ; PRG:$1FC7 Bytes:A9 23 + STA $01 ; PRG:$1FC9 Bytes:85 01 + LDA WorkPtr1Lo ; PRG:$1FCB Bytes:A5 02 + AND #$42 ; PRG:$1FCD Bytes:29 42 + LDX #$FF ; PRG:$1FCF Bytes:A2 FF +ObjectPathLoop_DFD1: + INX ; PRG:$1FD1 Bytes:E8 + CMP $DF47,X ; PRG:$1FD2 Bytes:DD 47 DF + BNE ObjectPathLoop_DFD1 ; PRG:$1FD5 Bytes:D0 FA + LDA $DF4F,X ; PRG:$1FD7 Bytes:BD 4F DF + CPY #$00 ; PRG:$1FDA Bytes:C0 00 + BEQ ObjectPathOnZero_DFE6 ; PRG:$1FDC Bytes:F0 08 + ASL A ; PRG:$1FDE Bytes:0A + CPY #$01 ; PRG:$1FDF Bytes:C0 01 + BEQ ObjectPathOnZero_DFE6 ; PRG:$1FE1 Bytes:F0 03 + ORA $DF4F,X ; PRG:$1FE3 Bytes:1D 4F DF +ObjectPathOnZero_DFE6: + STA $04 ; PRG:$1FE6 Bytes:85 04 + LDY $01 ; PRG:$1FE8 Bytes:A4 01 + STY PPUADDR ; PRG:$1FEA Bytes:8C 06 20 + LDA WorkPtr0Lo ; PRG:$1FED Bytes:A5 00 + JSR ProcessObjectStateRoutine_DE8B ; PRG:$1FEF Bytes:20 8B DE + AND $DF4B,X ; PRG:$1FF2 Bytes:3D 4B DF + ORA $04 ; PRG:$1FF5 Bytes:05 04 + STY PPUADDR ; PRG:$1FF7 Bytes:8C 06 20 + LDY $00 ; PRG:$1FFA Bytes:A4 00 + STY PPUADDR ; PRG:$1FFC Bytes:8C 06 20 + STA PPUDATA ; PRG:$1FFF Bytes:8D 07 20 + JMP UpdateObjectBufferDispatch_DF66 ; PRG:$2002 Bytes:4C 66 DF + .byte $00, $00, $01, $01, $01, $01, $02, $02, $02, $03, $03, $03, $03, $04, $04, $04 ; PRG:$2005 Bytes:00 00 01 01 01 01 02 02 02 03 03 03 03 04 04 04 + .byte $05, $05, $05, $05, $06, $06, $06, $06, $07, $07, $07, $07, $08, $08, $08, $08 ; PRG:$2015 Bytes:05 05 05 05 06 06 06 06 07 07 07 07 08 08 08 08 + .byte $08, $09, $09, $09, $09, $09, $0A, $0A, $0A, $0A, $0A, $0A, $0B, $0B, $0B, $0B ; PRG:$2025 Bytes:08 09 09 09 09 09 0A 0A 0A 0A 0A 0A 0B 0B 0B 0B + .byte $0B, $0B, $0B, $0B, $0B, $0C, $0C, $0C, $0C, $0C, $0C, $0C, $0C, $0C, $0C, $0C ; PRG:$2035 Bytes:0B 0B 0B 0B 0B 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C +;------------------------------------------------------------ +; ProcessObjectStateRoutine_E045 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_E045: + LDX #$00 ; PRG:$2045 Bytes:A2 00 + CMP #$80 ; PRG:$2047 Bytes:C9 80 + BCC ObjectPathOnNoCarry_E04F ; PRG:$2049 Bytes:90 04 + SBC #$80 ; PRG:$204B Bytes:E9 80 + LDX #$01 ; PRG:$204D Bytes:A2 01 +ObjectPathOnNoCarry_E04F: + CMP #$40 ; PRG:$204F Bytes:C9 40 + BCC ObjectPathOnNoCarry_E059 ; PRG:$2051 Bytes:90 06 + STA $00 ; PRG:$2053 Bytes:85 00 + LDA #$7F ; PRG:$2055 Bytes:A9 7F + SBC $00 ; PRG:$2057 Bytes:E5 00 +ObjectPathOnNoCarry_E059: + TAY ; PRG:$2059 Bytes:A8 + LDA $E005,Y ; PRG:$205A Bytes:B9 05 E0 + STA $00 ; PRG:$205D Bytes:85 00 + DEX ; PRG:$205F Bytes:CA + BNE ObjectPathOnNonZero_E069 ; PRG:$2060 Bytes:D0 07 + SEC ; PRG:$2062 Bytes:38 + LDA #$00 ; PRG:$2063 Bytes:A9 00 + SBC $00 ; PRG:$2065 Bytes:E5 00 + STA $00 ; PRG:$2067 Bytes:85 00 +ObjectPathOnNonZero_E069: + RTS ; PRG:$2069 Bytes:60 +;------------------------------------------------------------ +; ReadObjectRecordRoutine_E06A +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ReadObjectRecordRoutine_E06A: + LDA $56 ; PRG:$206A Bytes:A5 56 + BNE ObjectPathContinue_E09B ; PRG:$206C Bytes:D0 2D + LDX $0A ; PRG:$206E Bytes:A6 0A + LDA $75,X ; PRG:$2070 Bytes:B5 75 + BNE ObjectPathContinue_E09B ; PRG:$2072 Bytes:D0 27 + LDY #$1B ; PRG:$2074 Bytes:A0 1B + LDA (CurrentObjectPtrLo),Y ; PRG:$2076 Bytes:B1 08 + CMP #$30 ; PRG:$2078 Bytes:C9 30 + BCC UpdateObjectRecordOnNoCarry_E080 ; PRG:$207A Bytes:90 04 + CMP #$40 ; PRG:$207C Bytes:C9 40 + BCC ObjectPathContinue_E09B ; PRG:$207E Bytes:90 1B +UpdateObjectRecordOnNoCarry_E080: + LDA $06 ; PRG:$2080 Bytes:A5 06 + AND #$02 ; PRG:$2082 Bytes:29 02 + BEQ UpdateObjectRecordOnZero_E09C ; PRG:$2084 Bytes:F0 16 + CLC ; PRG:$2086 Bytes:18 + LDY #$14 ; PRG:$2087 Bytes:A0 14 + LDA (CurrentObjectPtrLo),Y ; PRG:$2089 Bytes:B1 08 + LDY #$04 ; PRG:$208B Bytes:A0 04 + ADC (CurrentObjectPtrLo),Y ; PRG:$208D Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$208F Bytes:91 08 + LDY #$13 ; PRG:$2091 Bytes:A0 13 + LDA (CurrentObjectPtrLo),Y ; PRG:$2093 Bytes:B1 08 + LDY #$03 ; PRG:$2095 Bytes:A0 03 + ADC (CurrentObjectPtrLo),Y ; PRG:$2097 Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$2099 Bytes:91 08 +ObjectPathContinue_E09B: + RTS ; PRG:$209B Bytes:60 +UpdateObjectRecordOnZero_E09C: + CLC ; PRG:$209C Bytes:18 + LDY #$12 ; PRG:$209D Bytes:A0 12 + LDA (CurrentObjectPtrLo),Y ; PRG:$209F Bytes:B1 08 + LDY #$02 ; PRG:$20A1 Bytes:A0 02 + ADC (CurrentObjectPtrLo),Y ; PRG:$20A3 Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$20A5 Bytes:91 08 + LDY #$11 ; PRG:$20A7 Bytes:A0 11 + LDA (CurrentObjectPtrLo),Y ; PRG:$20A9 Bytes:B1 08 + LDY #$01 ; PRG:$20AB Bytes:A0 01 + ADC (CurrentObjectPtrLo),Y ; PRG:$20AD Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$20AF Bytes:91 08 + RTS ; PRG:$20B1 Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_E0B2 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_E0B2: + TAX ; PRG:$20B2 Bytes:AA + LDA #$FD ; PRG:$20B3 Bytes:A9 FD +ObjectPathLoop_E0B5: + CLC ; PRG:$20B5 Bytes:18 + ADC #$03 ; PRG:$20B6 Bytes:69 03 + DEX ; PRG:$20B8 Bytes:CA + BPL ObjectPathLoop_E0B5 ; PRG:$20B9 Bytes:10 FA + TAX ; PRG:$20BB Bytes:AA + TAY ; PRG:$20BC Bytes:A8 + LDA a:$00B2,X ; PRG:$20BD Bytes:BD B2 00 + CMP $02 ; PRG:$20C0 Bytes:C5 02 + BNE UpdateObjectBufferOnNonZero_E0D2 ; PRG:$20C2 Bytes:D0 0E + INX ; PRG:$20C4 Bytes:E8 + LDA a:$00B2,X ; PRG:$20C5 Bytes:BD B2 00 + CMP $03 ; PRG:$20C8 Bytes:C5 03 + BNE UpdateObjectBufferOnNonZero_E0D2 ; PRG:$20CA Bytes:D0 06 + INX ; PRG:$20CC Bytes:E8 + LDA a:$00B2,X ; PRG:$20CD Bytes:BD B2 00 + CLC ; PRG:$20D0 Bytes:18 + RTS ; PRG:$20D1 Bytes:60 +UpdateObjectBufferOnNonZero_E0D2: + LDA WorkPtr1Lo ; PRG:$20D2 Bytes:A5 02 + STA a:$00B2,Y ; PRG:$20D4 Bytes:99 B2 00 + INY ; PRG:$20D7 Bytes:C8 + LDA $03 ; PRG:$20D8 Bytes:A5 03 + STA a:$00B2,Y ; PRG:$20DA Bytes:99 B2 00 + SEC ; PRG:$20DD Bytes:38 + RTS ; PRG:$20DE Bytes:60 +;------------------------------------------------------------ +; UpdateObjectBufferRoutine_E0DF +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBufferRoutine_E0DF: + LDA #$08 ; PRG:$20DF Bytes:A9 08 + STA $02 ; PRG:$20E1 Bytes:85 02 + LDA WorkPtr0Lo ; PRG:$20E3 Bytes:A5 00 + ASL A ; PRG:$20E5 Bytes:0A + ROL $02 ; PRG:$20E6 Bytes:26 02 + ASL A ; PRG:$20E8 Bytes:0A + ROL $02 ; PRG:$20E9 Bytes:26 02 + AND #$E0 ; PRG:$20EB Bytes:29 E0 + STA $03 ; PRG:$20ED Bytes:85 03 + LDA WorkPtr0Hi ; PRG:$20EF Bytes:A5 01 + LSR A ; PRG:$20F1 Bytes:4A + LSR A ; PRG:$20F2 Bytes:4A + LSR A ; PRG:$20F3 Bytes:4A + ORA $03 ; PRG:$20F4 Bytes:05 03 + STA $03 ; PRG:$20F6 Bytes:85 03 + RTS ; PRG:$20F8 Bytes:60 +;------------------------------------------------------------ +; UpdateObjectBufferRoutine_E0F9 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBufferRoutine_E0F9: + LDA $03 ; PRG:$20F9 Bytes:A5 03 + ASL A ; PRG:$20FB Bytes:0A + ASL A ; PRG:$20FC Bytes:0A + ASL A ; PRG:$20FD Bytes:0A + STA $01 ; PRG:$20FE Bytes:85 01 + LDA $03 ; PRG:$2100 Bytes:A5 03 + STA $00 ; PRG:$2102 Bytes:85 00 + LDA WorkPtr1Lo ; PRG:$2104 Bytes:A5 02 + LSR A ; PRG:$2106 Bytes:4A + ROR $00 ; PRG:$2107 Bytes:66 00 + LSR A ; PRG:$2109 Bytes:4A + ROR $00 ; PRG:$210A Bytes:66 00 + LDA #$F8 ; PRG:$210C Bytes:A9 F8 + AND $00 ; PRG:$210E Bytes:25 00 + STA $00 ; PRG:$2110 Bytes:85 00 + RTS ; PRG:$2112 Bytes:60 +;------------------------------------------------------------ +; ObjectPath_E113 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ObjectPath_E113: + LDA PPUSTATUS ; PRG:$2113 Bytes:AD 02 20 + LDX #$00 ; PRG:$2116 Bytes:A2 00 +ObjectPathLoop_E118: + LDA a:$00B2,X ; PRG:$2118 Bytes:BD B2 00 + STA PPUADDR ; PRG:$211B Bytes:8D 06 20 + INX ; PRG:$211E Bytes:E8 + LDA a:$00B2,X ; PRG:$211F Bytes:BD B2 00 + STA PPUADDR ; PRG:$2122 Bytes:8D 06 20 + INX ; PRG:$2125 Bytes:E8 + LDA PPUDATA ; PRG:$2126 Bytes:AD 07 20 + LDA PPUDATA ; PRG:$2129 Bytes:AD 07 20 + STA a:$00B2,X ; PRG:$212C Bytes:9D B2 00 + INX ; PRG:$212F Bytes:E8 + CPX #$1E ; PRG:$2130 Bytes:E0 1E + BNE ObjectPathLoop_E118 ; PRG:$2132 Bytes:D0 E4 + LDA $42 ; PRG:$2134 Bytes:A5 42 + STA PPUSCROLL ; PRG:$2136 Bytes:8D 05 20 + LDA $43 ; PRG:$2139 Bytes:A5 43 + STA PPUSCROLL ; PRG:$213B Bytes:8D 05 20 + RTS ; PRG:$213E Bytes:60 +;------------------------------------------------------------ +; ReadObjectRecordRoutine_E13F +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ReadObjectRecordRoutine_E13F: + LDY #$10 ; PRG:$213F Bytes:A0 10 + LDA (CurrentObjectPtrLo),Y ; PRG:$2141 Bytes:B1 08 + LDY #$21 ; PRG:$2143 Bytes:A0 21 + CMP #$00 ; PRG:$2145 Bytes:C9 00 + BEQ ReadObjectRecordOnZero_E15D ; PRG:$2147 Bytes:F0 14 + CMP #$01 ; PRG:$2149 Bytes:C9 01 + BEQ ReadObjectRecordOnZero_E153 ; PRG:$214B Bytes:F0 06 + LDY #$23 ; PRG:$214D Bytes:A0 23 + CMP #$02 ; PRG:$214F Bytes:C9 02 + BEQ ReadObjectRecordOnZero_E15D ; PRG:$2151 Bytes:F0 0A +ReadObjectRecordOnZero_E153: + LDA (CurrentObjectPtrLo),Y ; PRG:$2153 Bytes:B1 08 + AND #$07 ; PRG:$2155 Bytes:29 07 + CMP #$07 ; PRG:$2157 Bytes:C9 07 + BCS ObjectPathOnCarry_E165 ; PRG:$2159 Bytes:B0 0A +ObjectPathLoop_E15B: + CLC ; PRG:$215B Bytes:18 + RTS ; PRG:$215C Bytes:60 +ReadObjectRecordOnZero_E15D: + LDA (CurrentObjectPtrLo),Y ; PRG:$215D Bytes:B1 08 + AND #$07 ; PRG:$215F Bytes:29 07 + CMP #$01 ; PRG:$2161 Bytes:C9 01 + BCS ObjectPathLoop_E15B ; PRG:$2163 Bytes:B0 F6 +ObjectPathOnCarry_E165: + SEC ; PRG:$2165 Bytes:38 + RTS ; PRG:$2166 Bytes:60 + .byte $01, $19, $03, $1A, $19, $01, $1A, $03, $12, $12, $14, $14, $11, $11, $13, $13 ; PRG:$2167 Bytes:01 19 03 1A 19 01 1A 03 12 12 14 14 11 11 13 13 + .byte $19, $19, $1A, $1A, $01, $01, $03, $03 ; PRG:$2177 Bytes:19 19 1A 1A 01 01 03 03 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_E17F +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_E17F: + LDX #$08 ; PRG:$217F Bytes:A2 08 + LDY #$41 ; PRG:$2181 Bytes:A0 41 + CMP #$F9 ; PRG:$2183 Bytes:C9 F9 + BEQ ObjectPathContinue_E1BB ; PRG:$2185 Bytes:F0 34 + LDX #$20 ; PRG:$2187 Bytes:A2 20 + CMP #$93 ; PRG:$2189 Bytes:C9 93 + BCS ObjectPathOnCarry_E191 ; PRG:$218B Bytes:B0 04 + CMP #$7C ; PRG:$218D Bytes:C9 7C + BCS ObjectPathContinue_E1BB ; PRG:$218F Bytes:B0 2A +ObjectPathOnCarry_E191: + LDY #$31 ; PRG:$2191 Bytes:A0 31 + CMP #$24 ; PRG:$2193 Bytes:C9 24 + BEQ ObjectPathOnZero_E1A7 ; PRG:$2195 Bytes:F0 10 + CMP #$4A ; PRG:$2197 Bytes:C9 4A + BCC ObjectPathContinue_E1BB ; PRG:$2199 Bytes:90 20 + CMP #$C4 ; PRG:$219B Bytes:C9 C4 + BCS ObjectPathOnCarry_E1A3 ; PRG:$219D Bytes:B0 04 + CMP #$B9 ; PRG:$219F Bytes:C9 B9 + BCS ObjectPathContinue_E1BB ; PRG:$21A1 Bytes:B0 18 +ObjectPathOnCarry_E1A3: + CMP #$FF ; PRG:$21A3 Bytes:C9 FF + BEQ ObjectPathContinue_E1BB ; PRG:$21A5 Bytes:F0 14 +ObjectPathOnZero_E1A7: + LDY #$80 ; PRG:$21A7 Bytes:A0 80 + CMP #$60 ; PRG:$21A9 Bytes:C9 60 + BCS ObjectPathContinue_E1B9 ; PRG:$21AB Bytes:B0 0C + CMP #$50 ; PRG:$21AD Bytes:C9 50 + BCC ObjectPathContinue_E1B9 ; PRG:$21AF Bytes:90 08 + LDX $0A ; PRG:$21B1 Bytes:A6 0A + LDA $90,X ; PRG:$21B3 Bytes:B5 90 + CMP #$13 ; PRG:$21B5 Bytes:C9 13 + BNE ObjectPathOnNonZero_E1BD ; PRG:$21B7 Bytes:D0 04 +ObjectPathContinue_E1B9: + CLC ; PRG:$21B9 Bytes:18 + RTS ; PRG:$21BA Bytes:60 +ObjectPathContinue_E1BB: + STX $FF ; PRG:$21BB Bytes:86 FF +ObjectPathOnNonZero_E1BD: + SEC ; PRG:$21BD Bytes:38 + RTS ; PRG:$21BE Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_E1BF +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_E1BF: + TYA ; PRG:$21BF Bytes:98 + BPL UpdateObjectRecordOnPositive_E1CF ; PRG:$21C0 Bytes:10 0D + JSR ReadObjectRecordRoutine_E262 ; PRG:$21C2 Bytes:20 62 E2 + JSR UpdateObjectRecordRoutine_E229 ; PRG:$21C5 Bytes:20 29 E2 + LDX $0A ; PRG:$21C8 Bytes:A6 0A + LDA #$13 ; PRG:$21CA Bytes:A9 13 + STA $90,X ; PRG:$21CC Bytes:95 90 + RTS ; PRG:$21CE Bytes:60 +UpdateObjectRecordOnPositive_E1CF: + EOR $06 ; PRG:$21CF Bytes:45 06 + LDY #$1B ; PRG:$21D1 Bytes:A0 1B + STA (CurrentObjectPtrLo),Y ; PRG:$21D3 Bytes:91 08 + STA $00 ; PRG:$21D5 Bytes:85 00 + JSR ReadObjectRecordRoutine_E262 ; PRG:$21D7 Bytes:20 62 E2 + LDA WorkPtr0Lo ; PRG:$21DA Bytes:A5 00 + CMP #$40 ; PRG:$21DC Bytes:C9 40 + BMI ObjectPathOnNegative_E1E8 ; PRG:$21DE Bytes:30 08 + LSR $04 ; PRG:$21E0 Bytes:46 04 + ROR $05 ; PRG:$21E2 Bytes:66 05 + LSR $04 ; PRG:$21E4 Bytes:46 04 + ROR $05 ; PRG:$21E6 Bytes:66 05 +ObjectPathOnNegative_E1E8: + LSR $04 ; PRG:$21E8 Bytes:46 04 + ROR $05 ; PRG:$21EA Bytes:66 05 + LSR $04 ; PRG:$21EC Bytes:46 04 + ROR $05 ; PRG:$21EE Bytes:66 05 + LSR $04 ; PRG:$21F0 Bytes:46 04 + ROR $05 ; PRG:$21F2 Bytes:66 05 + LDA $06 ; PRG:$21F4 Bytes:A5 06 + AND #$01 ; PRG:$21F6 Bytes:29 01 + BNE UpdateObjectRecordOnNonZero_E1FD ; PRG:$21F8 Bytes:D0 03 + JSR ProcessObjectStateRoutine_E281 ; PRG:$21FA Bytes:20 81 E2 +UpdateObjectRecordOnNonZero_E1FD: + LDY #$18 ; PRG:$21FD Bytes:A0 18 + LDA $05 ; PRG:$21FF Bytes:A5 05 + STA (CurrentObjectPtrLo),Y ; PRG:$2201 Bytes:91 08 + DEY ; PRG:$2203 Bytes:88 + LDA $04 ; PRG:$2204 Bytes:A5 04 + STA (CurrentObjectPtrLo),Y ; PRG:$2206 Bytes:91 08 + JSR UpdateObjectRecordRoutine_E229 ; PRG:$2208 Bytes:20 29 E2 + LDA $06 ; PRG:$220B Bytes:A5 06 + ORA #$70 ; PRG:$220D Bytes:09 70 + LDY #$10 ; PRG:$220F Bytes:A0 10 + STA (CurrentObjectPtrLo),Y ; PRG:$2211 Bytes:91 08 + LDA WorkPtr0Lo ; PRG:$2213 Bytes:A5 00 + CMP #$40 ; PRG:$2215 Bytes:C9 40 + BCC ObjectPathOnNoCarry_E21D ; PRG:$2217 Bytes:90 04 + JSR ProcessObjectStateRoutine_E69A ; PRG:$2219 Bytes:20 9A E6 + RTS ; PRG:$221C Bytes:60 +ObjectPathOnNoCarry_E21D: + LDY $0A ; PRG:$221D Bytes:A4 0A + LDA #$10 ; PRG:$221F Bytes:A9 10 + STA a:$0058,Y ; PRG:$2221 Bytes:99 58 00 + RTS ; PRG:$2224 Bytes:60 + .byte $F8, $00, $10, $18 ; PRG:$2225 Bytes:F8 00 10 18 +;------------------------------------------------------------ +; UpdateObjectRecordRoutine_E229 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecordRoutine_E229: + LDY #$01 ; PRG:$2229 Bytes:A0 01 + LDA (CurrentObjectPtrLo),Y ; PRG:$222B Bytes:B1 08 + LDY #$19 ; PRG:$222D Bytes:A0 19 + STA (CurrentObjectPtrLo),Y ; PRG:$222F Bytes:91 08 + LDY #$03 ; PRG:$2231 Bytes:A0 03 + LDA (CurrentObjectPtrLo),Y ; PRG:$2233 Bytes:B1 08 + LDY #$1A ; PRG:$2235 Bytes:A0 1A + STA (CurrentObjectPtrLo),Y ; PRG:$2237 Bytes:91 08 + LDX $06 ; PRG:$2239 Bytes:A6 06 + LDY $E17B,X ; PRG:$223B Bytes:BC 7B E1 + LDX #$00 ; PRG:$223E Bytes:A2 00 + LDA (CurrentObjectPtrLo),Y ; PRG:$2240 Bytes:B1 08 + AND #$0F ; PRG:$2242 Bytes:29 0F + CMP #$08 ; PRG:$2244 Bytes:C9 08 + BCC ObjectPathOnNoCarry_E249 ; PRG:$2246 Bytes:90 01 + INX ; PRG:$2248 Bytes:E8 +ObjectPathOnNoCarry_E249: + LDA $06 ; PRG:$2249 Bytes:A5 06 + AND #$01 ; PRG:$224B Bytes:29 01 + BNE UpdateObjectRecordOnNonZero_E251 ; PRG:$224D Bytes:D0 02 + INX ; PRG:$224F Bytes:E8 + INX ; PRG:$2250 Bytes:E8 +UpdateObjectRecordOnNonZero_E251: + LDA (CurrentObjectPtrLo),Y ; PRG:$2251 Bytes:B1 08 + AND #$F0 ; PRG:$2253 Bytes:29 F0 + CLC ; PRG:$2255 Bytes:18 + ADC $E225,X ; PRG:$2256 Bytes:7D 25 E2 + TAX ; PRG:$2259 Bytes:AA + LDA $E177,Y ; PRG:$225A Bytes:B9 77 E1 + TAY ; PRG:$225D Bytes:A8 + TXA ; PRG:$225E Bytes:8A + STA (CurrentObjectPtrLo),Y ; PRG:$225F Bytes:91 08 + RTS ; PRG:$2261 Bytes:60 +;------------------------------------------------------------ +; ReadObjectRecordRoutine_E262 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ReadObjectRecordRoutine_E262: + LDX $06 ; PRG:$2262 Bytes:A6 06 + LDY $E16F,X ; PRG:$2264 Bytes:BC 6F E1 + LDA (CurrentObjectPtrLo),Y ; PRG:$2267 Bytes:B1 08 + STA $05 ; PRG:$2269 Bytes:85 05 + DEY ; PRG:$226B Bytes:88 + LDA (CurrentObjectPtrLo),Y ; PRG:$226C Bytes:B1 08 + STA $04 ; PRG:$226E Bytes:85 04 + BPL UpdateObjectRecordOnPositive_E275 ; PRG:$2270 Bytes:10 03 + JSR ProcessObjectStateRoutine_E281 ; PRG:$2272 Bytes:20 81 E2 +UpdateObjectRecordOnPositive_E275: + LDY #$16 ; PRG:$2275 Bytes:A0 16 + LDA $05 ; PRG:$2277 Bytes:A5 05 + STA (CurrentObjectPtrLo),Y ; PRG:$2279 Bytes:91 08 + DEY ; PRG:$227B Bytes:88 + LDA $04 ; PRG:$227C Bytes:A5 04 + STA (CurrentObjectPtrLo),Y ; PRG:$227E Bytes:91 08 + RTS ; PRG:$2280 Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_E281 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_E281: + SEC ; PRG:$2281 Bytes:38 + LDA #$00 ; PRG:$2282 Bytes:A9 00 + SBC $05 ; PRG:$2284 Bytes:E5 05 + STA $05 ; PRG:$2286 Bytes:85 05 + LDA #$00 ; PRG:$2288 Bytes:A9 00 + SBC $04 ; PRG:$228A Bytes:E5 04 + STA $04 ; PRG:$228C Bytes:85 04 + RTS ; PRG:$228E Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_E28F +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_E28F: + LDA $06 ; PRG:$228F Bytes:A5 06 + AND #$03 ; PRG:$2291 Bytes:29 03 + TAX ; PRG:$2293 Bytes:AA + LDA $06 ; PRG:$2294 Bytes:A5 06 + AND #$F0 ; PRG:$2296 Bytes:29 F0 + CMP #$70 ; PRG:$2298 Bytes:C9 70 + BNE ReadObjectRecordOnNonZero_E2C7 ; PRG:$229A Bytes:D0 2B + JSR UpdateObjectRecordRoutine_E335 ; PRG:$229C Bytes:20 35 E3 + BCS ObjectPathOnCarry_E2BA ; PRG:$229F Bytes:B0 19 + JSR UpdateObjectRecordRoutine_E2E6 ; PRG:$22A1 Bytes:20 E6 E2 + BMI ObjectPathOnNegative_E2B5 ; PRG:$22A4 Bytes:30 0F + LDA WorkPtr0Lo ; PRG:$22A6 Bytes:A5 00 + BMI ObjectPathOnNegative_E2B9 ; PRG:$22A8 Bytes:30 0F +;------------------------------------------------------------ +; UpdateObjectRecordRoutine_E2AA +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecordRoutine_E2AA: + LDY #$1B ; PRG:$22AA Bytes:A0 1B + LDA (CurrentObjectPtrLo),Y ; PRG:$22AC Bytes:B1 08 + LDY #$10 ; PRG:$22AE Bytes:A0 10 + STA (CurrentObjectPtrLo),Y ; PRG:$22B0 Bytes:91 08 + STA $06 ; PRG:$22B2 Bytes:85 06 + RTS ; PRG:$22B4 Bytes:60 +ObjectPathOnNegative_E2B5: + LDA WorkPtr0Lo ; PRG:$22B5 Bytes:A5 00 + BMI UpdateObjectRecordRoutine_E2AA ; PRG:$22B7 Bytes:30 F1 +ObjectPathOnNegative_E2B9: + RTS ; PRG:$22B9 Bytes:60 +ObjectPathOnCarry_E2BA: + JSR UpdateObjectRecordRoutine_E2AA ; PRG:$22BA Bytes:20 AA E2 + AND #$03 ; PRG:$22BD Bytes:29 03 + TAX ; PRG:$22BF Bytes:AA + LDY $E173,X ; PRG:$22C0 Bytes:BC 73 E1 + JSR UpdateObjectRecordRoutine_E325 ; PRG:$22C3 Bytes:20 25 E3 + RTS ; PRG:$22C6 Bytes:60 +ReadObjectRecordOnNonZero_E2C7: + LDY $E16F,X ; PRG:$22C7 Bytes:BC 6F E1 + LDA (CurrentObjectPtrLo),Y ; PRG:$22CA Bytes:B1 08 + STA $05 ; PRG:$22CC Bytes:85 05 + DEY ; PRG:$22CE Bytes:88 + LDA (CurrentObjectPtrLo),Y ; PRG:$22CF Bytes:B1 08 + STA $04 ; PRG:$22D1 Bytes:85 04 + BPL ReadObjectRecordOnPositive_E2D8 ; PRG:$22D3 Bytes:10 03 + JSR ProcessObjectStateRoutine_E281 ; PRG:$22D5 Bytes:20 81 E2 +ReadObjectRecordOnPositive_E2D8: + LDY #$16 ; PRG:$22D8 Bytes:A0 16 + SEC ; PRG:$22DA Bytes:38 + LDA $05 ; PRG:$22DB Bytes:A5 05 + SBC (CurrentObjectPtrLo),Y ; PRG:$22DD Bytes:F1 08 + DEY ; PRG:$22DF Bytes:88 + LDA $04 ; PRG:$22E0 Bytes:A5 04 + SBC (CurrentObjectPtrLo),Y ; PRG:$22E2 Bytes:F1 08 + BCC UpdateObjectRecordOnNoCarry_E301 ; PRG:$22E4 Bytes:90 1B +;------------------------------------------------------------ +; UpdateObjectRecordRoutine_E2E6 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecordRoutine_E2E6: + LDY #$18 ; PRG:$22E6 Bytes:A0 18 + LDA (CurrentObjectPtrLo),Y ; PRG:$22E8 Bytes:B1 08 + CLC ; PRG:$22EA Bytes:18 + LDY $E16F,X ; PRG:$22EB Bytes:BC 6F E1 + ADC (CurrentObjectPtrLo),Y ; PRG:$22EE Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$22F0 Bytes:91 08 + LDY #$17 ; PRG:$22F2 Bytes:A0 17 + LDA (CurrentObjectPtrLo),Y ; PRG:$22F4 Bytes:B1 08 + STA $00 ; PRG:$22F6 Bytes:85 00 + LDY $E16F,X ; PRG:$22F8 Bytes:BC 6F E1 + DEY ; PRG:$22FB Bytes:88 + ADC (CurrentObjectPtrLo),Y ; PRG:$22FC Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$22FE Bytes:91 08 + RTS ; PRG:$2300 Bytes:60 +UpdateObjectRecordOnNoCarry_E301: + LDY #$10 ; PRG:$2301 Bytes:A0 10 + TXA ; PRG:$2303 Bytes:8A + STA (CurrentObjectPtrLo),Y ; PRG:$2304 Bytes:91 08 + LDY #$1B ; PRG:$2306 Bytes:A0 1B + STA (CurrentObjectPtrLo),Y ; PRG:$2308 Bytes:91 08 + AND #$01 ; PRG:$230A Bytes:29 01 + BEQ UpdateObjectRecordOnZero_E313 ; PRG:$230C Bytes:F0 05 + LDY #$15 ; PRG:$230E Bytes:A0 15 + JSR UpdateObjectRecordRoutine_E325 ; PRG:$2310 Bytes:20 25 E3 +UpdateObjectRecordOnZero_E313: + LDY #$15 ; PRG:$2313 Bytes:A0 15 + LDA (CurrentObjectPtrLo),Y ; PRG:$2315 Bytes:B1 08 + PHA ; PRG:$2317 Bytes:48 + INY ; PRG:$2318 Bytes:C8 + LDA (CurrentObjectPtrLo),Y ; PRG:$2319 Bytes:B1 08 + LDY $E16F,X ; PRG:$231B Bytes:BC 6F E1 + STA (CurrentObjectPtrLo),Y ; PRG:$231E Bytes:91 08 + DEY ; PRG:$2320 Bytes:88 + PLA ; PRG:$2321 Bytes:68 + STA (CurrentObjectPtrLo),Y ; PRG:$2322 Bytes:91 08 + RTS ; PRG:$2324 Bytes:60 +;------------------------------------------------------------ +; UpdateObjectRecordRoutine_E325 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecordRoutine_E325: + INY ; PRG:$2325 Bytes:C8 + SEC ; PRG:$2326 Bytes:38 + LDA #$00 ; PRG:$2327 Bytes:A9 00 + SBC (CurrentObjectPtrLo),Y ; PRG:$2329 Bytes:F1 08 + STA (CurrentObjectPtrLo),Y ; PRG:$232B Bytes:91 08 + DEY ; PRG:$232D Bytes:88 + LDA #$00 ; PRG:$232E Bytes:A9 00 + SBC (CurrentObjectPtrLo),Y ; PRG:$2330 Bytes:F1 08 + STA (CurrentObjectPtrLo),Y ; PRG:$2332 Bytes:91 08 + RTS ; PRG:$2334 Bytes:60 +;------------------------------------------------------------ +; UpdateObjectRecordRoutine_E335 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecordRoutine_E335: + LDY $E167,X ; PRG:$2335 Bytes:BC 67 E1 + LDA (CurrentObjectPtrLo),Y ; PRG:$2338 Bytes:B1 08 + LDY $E16B,X ; PRG:$233A Bytes:BC 6B E1 + CMP (CurrentObjectPtrLo),Y ; PRG:$233D Bytes:D1 08 + BCC ObjectPathOnNoCarry_E350 ; PRG:$233F Bytes:90 0F + LDY $E177,X ; PRG:$2341 Bytes:BC 77 E1 + LDA (CurrentObjectPtrLo),Y ; PRG:$2344 Bytes:B1 08 + LDY $E17B,X ; PRG:$2346 Bytes:BC 7B E1 + STA (CurrentObjectPtrLo),Y ; PRG:$2349 Bytes:91 08 + INY ; PRG:$234B Bytes:C8 + LDA #$00 ; PRG:$234C Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$234E Bytes:91 08 +ObjectPathOnNoCarry_E350: + RTS ; PRG:$2350 Bytes:60 +;------------------------------------------------------------ +; ReadObjectRecordRoutine_E351 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ReadObjectRecordRoutine_E351: + LDY #$20 ; PRG:$2351 Bytes:A0 20 + LDA (CurrentObjectPtrLo),Y ; PRG:$2353 Bytes:B1 08 + BNE ObjectPathLoop_E37E ; PRG:$2355 Bytes:D0 27 + LDY #$21 ; PRG:$2357 Bytes:A0 21 + LDA (CurrentObjectPtrLo),Y ; PRG:$2359 Bytes:B1 08 + CLC ; PRG:$235B Bytes:18 +;------------------------------------------------------------ +; ReadObjectRecord_E35C +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ReadObjectRecord_E35C: + ADC #$04 ; PRG:$235C Bytes:69 04 + STA $00 ; PRG:$235E Bytes:85 00 + LDY #$23 ; PRG:$2360 Bytes:A0 23 + LDA (CurrentObjectPtrLo),Y ; PRG:$2362 Bytes:B1 08 + CLC ; PRG:$2364 Bytes:18 + ADC #$04 ; PRG:$2365 Bytes:69 04 + STA $01 ; PRG:$2367 Bytes:85 01 + JSR UpdateObjectBufferRoutine_E0DF ; PRG:$2369 Bytes:20 DF E0 + LDA $0A ; PRG:$236C Bytes:A5 0A + CLC ; PRG:$236E Bytes:18 + ADC #$02 ; PRG:$236F Bytes:69 02 + JSR ProcessObjectStateRoutine_E0B2 ; PRG:$2371 Bytes:20 B2 E0 + BCS ObjectPathLoop_E37E ; PRG:$2374 Bytes:B0 08 + CMP #$4E ; PRG:$2376 Bytes:C9 4E + BEQ ObjectPathOnZero_E380 ; PRG:$2378 Bytes:F0 06 + CMP #$4F ; PRG:$237A Bytes:C9 4F + BEQ ObjectPathOnZero_E380 ; PRG:$237C Bytes:F0 02 +ObjectPathLoop_E37E: + CLC ; PRG:$237E Bytes:18 + RTS ; PRG:$237F Bytes:60 +ObjectPathOnZero_E380: + JSR ReadObjectRecordRoutine_E13F ; PRG:$2380 Bytes:20 3F E1 + BCS ObjectPathLoop_E37E ; PRG:$2383 Bytes:B0 F9 + SEC ; PRG:$2385 Bytes:38 + RTS ; PRG:$2386 Bytes:60 + .byte $00, $00, $00, $00, $0C, $F4, $0C, $F4, $F4, $0C, $F4, $0C, $00, $00, $00, $00 ; PRG:$2387 Bytes:00 00 00 00 0C F4 0C F4 F4 0C F4 0C 00 00 00 00 + .byte $80, $00, $80, $00, $40, $C0, $40, $C0, $81, $80, $80, $81, $81, $80, $80, $81 ; PRG:$2397 Bytes:80 00 80 00 40 C0 40 C0 81 80 80 81 81 80 80 81 +;------------------------------------------------------------ +; UpdateObjectRecordRoutine_E3A7 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecordRoutine_E3A7: + JSR ReadObjectRecordRoutine_E262 ; PRG:$23A7 Bytes:20 62 E2 + LDX $06 ; PRG:$23AA Bytes:A6 06 + LDY $E16F,X ; PRG:$23AC Bytes:BC 6F E1 + LDA #$00 ; PRG:$23AF Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$23B1 Bytes:91 08 + DEY ; PRG:$23B3 Bytes:88 + STA (CurrentObjectPtrLo),Y ; PRG:$23B4 Bytes:91 08 +;------------------------------------------------------------ +; UpdateObjectRecord_E3B6 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectRecord_E3B6: + LDA $07 ; PRG:$23B6 Bytes:A5 07 + SEC ; PRG:$23B8 Bytes:38 + SBC #$04 ; PRG:$23B9 Bytes:E9 04 + TAX ; PRG:$23BB Bytes:AA + LDA $E39F,X ; PRG:$23BC Bytes:BD 9F E3 + LDY #$10 ; PRG:$23BF Bytes:A0 10 + STA (CurrentObjectPtrLo),Y ; PRG:$23C1 Bytes:91 08 + LDA $E387,X ; PRG:$23C3 Bytes:BD 87 E3 + LDY #$19 ; PRG:$23C6 Bytes:A0 19 + STA (CurrentObjectPtrLo),Y ; PRG:$23C8 Bytes:91 08 + LDA $E38F,X ; PRG:$23CA Bytes:BD 8F E3 + INY ; PRG:$23CD Bytes:C8 + STA (CurrentObjectPtrLo),Y ; PRG:$23CE Bytes:91 08 + LDA $E397,X ; PRG:$23D0 Bytes:BD 97 E3 + INY ; PRG:$23D3 Bytes:C8 + STA (CurrentObjectPtrLo),Y ; PRG:$23D4 Bytes:91 08 + LDY #$01 ; PRG:$23D6 Bytes:A0 01 + LDA (CurrentObjectPtrLo),Y ; PRG:$23D8 Bytes:B1 08 + LDX $06 ; PRG:$23DA Bytes:A6 06 + CPX #$02 ; PRG:$23DC Bytes:E0 02 + PHP ; PRG:$23DE Bytes:08 + BCS UpdateObjectRecordOnCarry_E3E4 ; PRG:$23DF Bytes:B0 03 + JSR ProcessObjectStateRoutine_E405 ; PRG:$23E1 Bytes:20 05 E4 +UpdateObjectRecordOnCarry_E3E4: + STA (CurrentObjectPtrLo),Y ; PRG:$23E4 Bytes:91 08 + LDY #$17 ; PRG:$23E6 Bytes:A0 17 + STA (CurrentObjectPtrLo),Y ; PRG:$23E8 Bytes:91 08 + LDY #$03 ; PRG:$23EA Bytes:A0 03 + LDA (CurrentObjectPtrLo),Y ; PRG:$23EC Bytes:B1 08 + PLP ; PRG:$23EE Bytes:28 + BCC UpdateObjectRecordOnNoCarry_E3F4 ; PRG:$23EF Bytes:90 03 + JSR ProcessObjectStateRoutine_E405 ; PRG:$23F1 Bytes:20 05 E4 +UpdateObjectRecordOnNoCarry_E3F4: + STA (CurrentObjectPtrLo),Y ; PRG:$23F4 Bytes:91 08 + LDY #$18 ; PRG:$23F6 Bytes:A0 18 + STA (CurrentObjectPtrLo),Y ; PRG:$23F8 Bytes:91 08 + LDA #$00 ; PRG:$23FA Bytes:A9 00 + LDY #$02 ; PRG:$23FC Bytes:A0 02 + STA (CurrentObjectPtrLo),Y ; PRG:$23FE Bytes:91 08 + LDY #$04 ; PRG:$2400 Bytes:A0 04 + STA (CurrentObjectPtrLo),Y ; PRG:$2402 Bytes:91 08 + RTS ; PRG:$2404 Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_E405 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_E405: + AND #$0F ; PRG:$2405 Bytes:29 0F + LDX #$04 ; PRG:$2407 Bytes:A2 04 + CMP #$08 ; PRG:$2409 Bytes:C9 08 + BCC ReadObjectRecordOnNoCarry_E40F ; PRG:$240B Bytes:90 02 + LDX #$0C ; PRG:$240D Bytes:A2 0C +ReadObjectRecordOnNoCarry_E40F: + STX $04 ; PRG:$240F Bytes:86 04 + LDA (CurrentObjectPtrLo),Y ; PRG:$2411 Bytes:B1 08 + AND #$F0 ; PRG:$2413 Bytes:29 F0 + ORA $04 ; PRG:$2415 Bytes:05 04 + RTS ; PRG:$2417 Bytes:60 + .byte $00, $04, $02, $04, $00, $04, $02, $04, $00, $04, $02, $04, $00, $04, $02, $04 ; PRG:$2418 Bytes:00 04 02 04 00 04 02 04 00 04 02 04 00 04 02 04 + .byte $40, $40, $40, $C0, $80, $80, $80, $00, $C0, $80, $00, $00, $00, $40, $C0, $C0 ; PRG:$2428 Bytes:40 40 40 C0 80 80 80 00 C0 80 00 00 00 40 C0 C0 + .byte $00, $03, $01, $02, $00, $03, $01, $02, $00, $02, $01, $03, $00, $02, $01, $03 ; PRG:$2438 Bytes:00 03 01 02 00 03 01 02 00 02 01 03 00 02 01 03 + .byte $F8, $F8, $04, $10, $10, $10, $04, $F8, $10, $10, $04, $F8, $F8, $F8, $04, $10 ; PRG:$2448 Bytes:F8 F8 04 10 10 10 04 F8 10 10 04 F8 F8 F8 04 10 + .byte $04, $FC, $F8, $FC, $04, $0C, $10, $0C, $04, $0C, $10, $0C, $04, $FC, $F8, $FC ; PRG:$2458 Bytes:04 FC F8 FC 04 0C 10 0C 04 0C 10 0C 04 FC F8 FC +;------------------------------------------------------------ +; UpdateObjectBufferRoutine_E468 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBufferRoutine_E468: + LDA #$00 ; PRG:$2468 Bytes:A9 00 + STA $04 ; PRG:$246A Bytes:85 04 + STA $05 ; PRG:$246C Bytes:85 05 + LDX #$03 ; PRG:$246E Bytes:A2 03 +ReadObjectRecordLoop_E470: + LDY #$16 ; PRG:$2470 Bytes:A0 16 + LDA $05 ; PRG:$2472 Bytes:A5 05 + CLC ; PRG:$2474 Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$2475 Bytes:71 08 + STA $05 ; PRG:$2477 Bytes:85 05 + LDY #$15 ; PRG:$2479 Bytes:A0 15 + LDA $04 ; PRG:$247B Bytes:A5 04 + ADC (CurrentObjectPtrLo),Y ; PRG:$247D Bytes:71 08 + STA $04 ; PRG:$247F Bytes:85 04 + DEX ; PRG:$2481 Bytes:CA + BNE ReadObjectRecordLoop_E470 ; PRG:$2482 Bytes:D0 EC + LDA $06 ; PRG:$2484 Bytes:A5 06 + CMP #$80 ; PRG:$2486 Bytes:C9 80 + BNE ObjectPathOnNonZero_E491 ; PRG:$2488 Bytes:D0 07 + SEC ; PRG:$248A Bytes:38 + LDA #$00 ; PRG:$248B Bytes:A9 00 + SBC $04 ; PRG:$248D Bytes:E5 04 + STA $04 ; PRG:$248F Bytes:85 04 +ObjectPathOnNonZero_E491: + LDA $56 ; PRG:$2491 Bytes:A5 56 + BNE ObjectPathOnNonZero_E49B ; PRG:$2493 Bytes:D0 06 + LDX $0A ; PRG:$2495 Bytes:A6 0A + LDA $75,X ; PRG:$2497 Bytes:B5 75 + BEQ UpdateObjectRecordOnZero_E49F ; PRG:$2499 Bytes:F0 04 +ObjectPathOnNonZero_E49B: + LDA #$00 ; PRG:$249B Bytes:A9 00 + STA $04 ; PRG:$249D Bytes:85 04 +UpdateObjectRecordOnZero_E49F: + LDY #$1B ; PRG:$249F Bytes:A0 1B + CLC ; PRG:$24A1 Bytes:18 + LDA $04 ; PRG:$24A2 Bytes:A5 04 + ADC (CurrentObjectPtrLo),Y ; PRG:$24A4 Bytes:71 08 + STA (CurrentObjectPtrLo),Y ; PRG:$24A6 Bytes:91 08 + JSR ProcessObjectStateRoutine_E045 ; PRG:$24A8 Bytes:20 45 E0 + LDY #$19 ; PRG:$24AB Bytes:A0 19 + LDA (CurrentObjectPtrLo),Y ; PRG:$24AD Bytes:B1 08 + SEC ; PRG:$24AF Bytes:38 + SBC $00 ; PRG:$24B0 Bytes:E5 00 + LDY #$17 ; PRG:$24B2 Bytes:A0 17 + CLC ; PRG:$24B4 Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$24B5 Bytes:71 08 + LDY #$01 ; PRG:$24B7 Bytes:A0 01 + STA (CurrentObjectPtrLo),Y ; PRG:$24B9 Bytes:91 08 + LDY #$1B ; PRG:$24BB Bytes:A0 1B + SEC ; PRG:$24BD Bytes:38 + LDA #$40 ; PRG:$24BE Bytes:A9 40 + SBC (CurrentObjectPtrLo),Y ; PRG:$24C0 Bytes:F1 08 + JSR ProcessObjectStateRoutine_E045 ; PRG:$24C2 Bytes:20 45 E0 + LDY #$1A ; PRG:$24C5 Bytes:A0 1A + LDA (CurrentObjectPtrLo),Y ; PRG:$24C7 Bytes:B1 08 + SEC ; PRG:$24C9 Bytes:38 + SBC $00 ; PRG:$24CA Bytes:E5 00 + STA $00 ; PRG:$24CC Bytes:85 00 + LDY #$18 ; PRG:$24CE Bytes:A0 18 + LDA (CurrentObjectPtrLo),Y ; PRG:$24D0 Bytes:B1 08 + SEC ; PRG:$24D2 Bytes:38 + SBC $00 ; PRG:$24D3 Bytes:E5 00 + LDY #$03 ; PRG:$24D5 Bytes:A0 03 + STA (CurrentObjectPtrLo),Y ; PRG:$24D7 Bytes:91 08 + LDX #$07 ; PRG:$24D9 Bytes:A2 07 + LDA $06 ; PRG:$24DB Bytes:A5 06 + CMP #$81 ; PRG:$24DD Bytes:C9 81 + BEQ ReadObjectRecordOnZero_E4E3 ; PRG:$24DF Bytes:F0 02 + LDX #$FF ; PRG:$24E1 Bytes:A2 FF +ReadObjectRecordOnZero_E4E3: + LDY #$1B ; PRG:$24E3 Bytes:A0 1B + LDA #$10 ; PRG:$24E5 Bytes:A9 10 + CLC ; PRG:$24E7 Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$24E8 Bytes:71 08 +UpdateObjectRecordLoop_E4EA: + SEC ; PRG:$24EA Bytes:38 + SBC #$20 ; PRG:$24EB Bytes:E9 20 + INX ; PRG:$24ED Bytes:E8 + BCS UpdateObjectRecordLoop_E4EA ; PRG:$24EE Bytes:B0 FA + LDA $E418,X ; PRG:$24F0 Bytes:BD 18 E4 + LDY #$05 ; PRG:$24F3 Bytes:A0 05 + STA (CurrentObjectPtrLo),Y ; PRG:$24F5 Bytes:91 08 + LDA $E428,X ; PRG:$24F7 Bytes:BD 28 E4 + LDY #$08 ; PRG:$24FA Bytes:A0 08 + STA (CurrentObjectPtrLo),Y ; PRG:$24FC Bytes:91 08 + LDY #$28 ; PRG:$24FE Bytes:A0 28 + STA (CurrentObjectPtrLo),Y ; PRG:$2500 Bytes:91 08 + LDY #$38 ; PRG:$2502 Bytes:A0 38 + STA (CurrentObjectPtrLo),Y ; PRG:$2504 Bytes:91 08 + LDA $E438,X ; PRG:$2506 Bytes:BD 38 E4 + LDY #$25 ; PRG:$2509 Bytes:A0 25 + STA (CurrentObjectPtrLo),Y ; PRG:$250B Bytes:91 08 + LDA $E418,X ; PRG:$250D Bytes:BD 18 E4 + LDY #$35 ; PRG:$2510 Bytes:A0 35 + STA (CurrentObjectPtrLo),Y ; PRG:$2512 Bytes:91 08 + LDA $E448,X ; PRG:$2514 Bytes:BD 48 E4 + LDY #$01 ; PRG:$2517 Bytes:A0 01 + CLC ; PRG:$2519 Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$251A Bytes:71 08 + LDY #$31 ; PRG:$251C Bytes:A0 31 + STA (CurrentObjectPtrLo),Y ; PRG:$251E Bytes:91 08 + LDA $E458,X ; PRG:$2520 Bytes:BD 58 E4 + LDY #$03 ; PRG:$2523 Bytes:A0 03 + CLC ; PRG:$2525 Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$2526 Bytes:71 08 + LDY #$33 ; PRG:$2528 Bytes:A0 33 + STA (CurrentObjectPtrLo),Y ; PRG:$252A Bytes:91 08 + RTS ; PRG:$252C Bytes:60 + .byte $02, $01, $03, $00, $02, $03, $03, $01, $01, $11, $24 ; PRG:$252D Bytes:02 01 03 00 02 03 03 01 01 11 24 +ObjectPathLoop_E538: + RTS ; PRG:$2538 Bytes:60 +;------------------------------------------------------------ +; ReadObjectRecordRoutine_E539 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ReadObjectRecordRoutine_E539: + LDX $0A ; PRG:$2539 Bytes:A6 0A + LDA $46,X ; PRG:$253B Bytes:B5 46 + AND #$0F ; PRG:$253D Bytes:29 0F + BNE ObjectPathLoop_E538 ; PRG:$253F Bytes:D0 F7 + LDY #$1B ; PRG:$2541 Bytes:A0 1B + LDA (CurrentObjectPtrLo),Y ; PRG:$2543 Bytes:B1 08 + LDY #$FF ; PRG:$2545 Bytes:A0 FF +ObjectPathLoop_E547: + INY ; PRG:$2547 Bytes:C8 + SEC ; PRG:$2548 Bytes:38 + SBC #$40 ; PRG:$2549 Bytes:E9 40 + BCS ObjectPathLoop_E547 ; PRG:$254B Bytes:B0 FA + ADC #$40 ; PRG:$254D Bytes:69 40 + LDX $06 ; PRG:$254F Bytes:A6 06 + CPX #$80 ; PRG:$2551 Bytes:E0 80 + BEQ ObjectPathOnZero_E59C ; PRG:$2553 Bytes:F0 47 + CMP #$1C ; PRG:$2555 Bytes:C9 1C + BCS ObjectPathLoop_E538 ; PRG:$2557 Bytes:B0 DF + INY ; PRG:$2559 Bytes:C8 +UpdateObjectRecordLoop_E55A: + LDA $E52D,Y ; PRG:$255A Bytes:B9 2D E5 + LDY #$10 ; PRG:$255D Bytes:A0 10 + STA (CurrentObjectPtrLo),Y ; PRG:$255F Bytes:91 08 + LDY #$1B ; PRG:$2561 Bytes:A0 1B + STA (CurrentObjectPtrLo),Y ; PRG:$2563 Bytes:91 08 + STA $06 ; PRG:$2565 Bytes:85 06 + LDY #$15 ; PRG:$2567 Bytes:A0 15 + TAX ; PRG:$2569 Bytes:AA + AND #$01 ; PRG:$256A Bytes:29 01 + BEQ UpdateObjectRecordOnZero_E571 ; PRG:$256C Bytes:F0 03 + JSR UpdateObjectRecordRoutine_E325 ; PRG:$256E Bytes:20 25 E3 +UpdateObjectRecordOnZero_E571: + LDA (CurrentObjectPtrLo),Y ; PRG:$2571 Bytes:B1 08 + STA $00 ; PRG:$2573 Bytes:85 00 + INY ; PRG:$2575 Bytes:C8 + LDA (CurrentObjectPtrLo),Y ; PRG:$2576 Bytes:B1 08 + LDY $E16F,X ; PRG:$2578 Bytes:BC 6F E1 + STA (CurrentObjectPtrLo),Y ; PRG:$257B Bytes:91 08 + LDA WorkPtr0Lo ; PRG:$257D Bytes:A5 00 + DEY ; PRG:$257F Bytes:88 + STA (CurrentObjectPtrLo),Y ; PRG:$2580 Bytes:91 08 + LDY $E532,X ; PRG:$2582 Bytes:BC 32 E5 + LDA (CurrentObjectPtrLo),Y ; PRG:$2585 Bytes:B1 08 + AND #$04 ; PRG:$2587 Bytes:29 04 + PHP ; PRG:$2589 Bytes:08 + LDA (CurrentObjectPtrLo),Y ; PRG:$258A Bytes:B1 08 + PLP ; PRG:$258C Bytes:28 + BEQ UpdateObjectRecordOnZero_E592 ; PRG:$258D Bytes:F0 03 + CLC ; PRG:$258F Bytes:18 + ADC #$04 ; PRG:$2590 Bytes:69 04 +UpdateObjectRecordOnZero_E592: + AND #$F8 ; PRG:$2592 Bytes:29 F8 + STA (CurrentObjectPtrLo),Y ; PRG:$2594 Bytes:91 08 + INY ; PRG:$2596 Bytes:C8 + LDA #$00 ; PRG:$2597 Bytes:A9 00 + STA (CurrentObjectPtrLo),Y ; PRG:$2599 Bytes:91 08 +ObjectPathLoop_E59B: + RTS ; PRG:$259B Bytes:60 +ObjectPathOnZero_E59C: + CMP #$24 ; PRG:$259C Bytes:C9 24 + BCC ObjectPathLoop_E59B ; PRG:$259E Bytes:90 FB + BCS UpdateObjectRecordLoop_E55A ; PRG:$25A0 Bytes:B0 B8 + .byte $0F, $01, $04, $04, $04, $04, $0F, $01 ; PRG:$25A2 Bytes:0F 01 04 04 04 04 0F 01 +;------------------------------------------------------------ +; ReadObjectRecordRoutine_E5AA +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ReadObjectRecordRoutine_E5AA: + PHA ; PRG:$25AA Bytes:48 + LDA $06 ; PRG:$25AB Bytes:A5 06 + AND #$03 ; PRG:$25AD Bytes:29 03 + TAX ; PRG:$25AF Bytes:AA + LDA $E5A2,X ; PRG:$25B0 Bytes:BD A2 E5 + LDY #$01 ; PRG:$25B3 Bytes:A0 01 + CLC ; PRG:$25B5 Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$25B6 Bytes:71 08 + STA $00 ; PRG:$25B8 Bytes:85 00 + LDA $E5A6,X ; PRG:$25BA Bytes:BD A6 E5 + LDY #$03 ; PRG:$25BD Bytes:A0 03 + CLC ; PRG:$25BF Bytes:18 + ADC (CurrentObjectPtrLo),Y ; PRG:$25C0 Bytes:71 08 + STA $01 ; PRG:$25C2 Bytes:85 01 + JSR UpdateObjectBufferRoutine_E0DF ; PRG:$25C4 Bytes:20 DF E0 + PLA ; PRG:$25C7 Bytes:68 + JSR ProcessObjectStateRoutine_E0B2 ; PRG:$25C8 Bytes:20 B2 E0 + RTS ; PRG:$25CB Bytes:60 + .byte $34, $24, $24, $24, $24, $6E, $86, $86, $6F, $24, $24, $24, $24, $34, $24, $24 ; PRG:$25CC Bytes:34 24 24 24 24 6E 86 86 6F 24 24 24 24 34 24 24 + .byte $24, $24, $70, $87, $88, $71, $24, $24, $24, $24, $34, $24, $24, $24, $24, $72 ; PRG:$25DC Bytes:24 24 70 87 88 71 24 24 24 24 34 24 24 24 24 72 + .byte $89, $8A, $73, $24, $9F, $A0, $24, $34, $24, $24, $24, $24, $74, $8B, $8C, $75 ; PRG:$25EC Bytes:89 8A 73 24 9F A0 24 34 24 24 24 24 74 8B 8C 75 + .byte $A1, $A2, $A3, $A4, $34, $24, $24, $24, $24, $76, $8D, $8E, $77, $24, $24, $24 ; PRG:$25FC Bytes:A1 A2 A3 A4 34 24 24 24 24 76 8D 8E 77 24 24 24 + .byte $24, $34, $24, $A5, $A6, $24, $78, $8F, $90, $79, $24, $24, $24, $24, $34, $A7 ; PRG:$260C Bytes:24 34 24 A5 A6 24 78 8F 90 79 24 24 24 24 34 A7 + .byte $A8, $A9, $AA, $7A, $91, $92, $7B, $24, $24, $24, $24, $43, $24, $60, $24, $24 ; PRG:$261C Bytes:A8 A9 AA 7A 91 92 7B 24 24 24 24 43 24 60 24 24 + .byte $7C, $24, $24, $7C, $24, $24, $61, $24, $43, $24, $62, $24, $24, $7D, $24, $24 ; PRG:$262C Bytes:7C 24 24 7C 24 24 61 24 43 24 62 24 24 7D 24 24 + .byte $7E, $24, $24, $63, $24, $43, $24, $64, $24, $24, $81, $93, $24, $82, $94, $24 ; PRG:$263C Bytes:7E 24 24 63 24 43 24 64 24 24 81 93 24 82 94 24 + .byte $65, $24, $43, $24, $66, $95, $24, $85, $96, $24, $85, $97, $24, $67, $98, $43 ; PRG:$264C Bytes:65 24 43 24 66 95 24 85 96 24 85 97 24 67 98 43 + .byte $24, $68, $24, $24, $7F, $24, $24, $80, $24, $24, $69, $24, $43, $24, $6A, $24 ; PRG:$265C Bytes:24 68 24 24 7F 24 24 80 24 24 69 24 43 24 6A 24 + .byte $99, $83, $24, $9A, $84, $24, $24, $6B, $24, $43, $9B, $6C, $24, $9C, $85, $24 ; PRG:$266C Bytes:99 83 24 9A 84 24 24 6B 24 43 9B 6C 24 9C 85 24 + .byte $9D, $85, $24, $9E, $6D, $24, $00, $0D, $00, $34, $41, $34, $00, $0D, $1A, $27 ; PRG:$267C Bytes:9D 85 24 9E 6D 24 00 0D 00 34 41 34 00 0D 1A 27 + .byte $1A, $0D, $00, $34, $00, $0D, $1A, $0D, $00, $34, $41, $4E, $41, $34 ; PRG:$268C Bytes:1A 0D 00 34 00 0D 1A 0D 00 34 41 4E 41 34 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_E69A +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_E69A: + LDX #$FB ; PRG:$269A Bytes:A2 FB +ReadObjectRecordLoop_E69C: + INX ; PRG:$269C Bytes:E8 + INX ; PRG:$269D Bytes:E8 + INX ; PRG:$269E Bytes:E8 + INX ; PRG:$269F Bytes:E8 + INX ; PRG:$26A0 Bytes:E8 + CPX #$14 ; PRG:$26A1 Bytes:E0 14 + BEQ ObjectPathLoop_E6F2 ; PRG:$26A3 Bytes:F0 4D + LDA $0370,X ; PRG:$26A5 Bytes:BD 70 03 + BNE ReadObjectRecordLoop_E69C ; PRG:$26A8 Bytes:D0 F2 + LDA #$0C ; PRG:$26AA Bytes:A9 0C + STA $0370,X ; PRG:$26AC Bytes:9D 70 03 + LDY #$16 ; PRG:$26AF Bytes:A0 16 + LDA (CurrentObjectPtrLo),Y ; PRG:$26B1 Bytes:B1 08 + STA $00 ; PRG:$26B3 Bytes:85 00 + DEY ; PRG:$26B5 Bytes:88 + LDA (CurrentObjectPtrLo),Y ; PRG:$26B6 Bytes:B1 08 + LSR A ; PRG:$26B8 Bytes:4A + ROR $00 ; PRG:$26B9 Bytes:66 00 + LSR A ; PRG:$26BB Bytes:4A + ROR $00 ; PRG:$26BC Bytes:66 00 + LSR A ; PRG:$26BE Bytes:4A + ROR $00 ; PRG:$26BF Bytes:66 00 + BNE ObjectPathOnNonZero_E6C5 ; PRG:$26C1 Bytes:D0 02 + INC $00 ; PRG:$26C3 Bytes:E6 00 +ObjectPathOnNonZero_E6C5: + SEC ; PRG:$26C5 Bytes:38 + LDA #$00 ; PRG:$26C6 Bytes:A9 00 + SBC $00 ; PRG:$26C8 Bytes:E5 00 + LDY #$00 ; PRG:$26CA Bytes:A0 00 +ObjectPathLoop_E6CC: + INY ; PRG:$26CC Bytes:C8 + SEC ; PRG:$26CD Bytes:38 + SBC $00 ; PRG:$26CE Bytes:E5 00 + BCS ObjectPathLoop_E6CC ; PRG:$26D0 Bytes:B0 FA + TYA ; PRG:$26D2 Bytes:98 + BNE UpdateObjectBufferOnNonZero_E6D7 ; PRG:$26D3 Bytes:D0 02 + LDA #$FF ; PRG:$26D5 Bytes:A9 FF +UpdateObjectBufferOnNonZero_E6D7: + INX ; PRG:$26D7 Bytes:E8 + STA $0370,X ; PRG:$26D8 Bytes:9D 70 03 + INX ; PRG:$26DB Bytes:E8 + LDA $06 ; PRG:$26DC Bytes:A5 06 + STA $0370,X ; PRG:$26DE Bytes:9D 70 03 + INX ; PRG:$26E1 Bytes:E8 + SEC ; PRG:$26E2 Bytes:38 + LDA $03 ; PRG:$26E3 Bytes:A5 03 + SBC #$21 ; PRG:$26E5 Bytes:E9 21 + STA $0370,X ; PRG:$26E7 Bytes:9D 70 03 + INX ; PRG:$26EA Bytes:E8 + LDA WorkPtr1Lo ; PRG:$26EB Bytes:A5 02 + SBC #$00 ; PRG:$26ED Bytes:E9 00 + STA $0370,X ; PRG:$26EF Bytes:9D 70 03 +ObjectPathLoop_E6F2: + RTS ; PRG:$26F2 Bytes:60 +;------------------------------------------------------------ +; ProcessObjectStateRoutine_E6F3 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessObjectStateRoutine_E6F3: + LDA #$FF ; PRG:$26F3 Bytes:A9 FF + STA $07 ; PRG:$26F5 Bytes:85 07 + LDX #$FB ; PRG:$26F7 Bytes:A2 FB +ObjectPathLoop_E6F9: + INX ; PRG:$26F9 Bytes:E8 + INX ; PRG:$26FA Bytes:E8 + INX ; PRG:$26FB Bytes:E8 + INX ; PRG:$26FC Bytes:E8 +ProcessObjectStateDispatch_E6FD: + INX ; PRG:$26FD Bytes:E8 + INC $07 ; PRG:$26FE Bytes:E6 07 +;------------------------------------------------------------ +; UpdateObjectBuffer_E700 +; +; Global: +; First-pass object-engine entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Object pointers, entity state, or gameplay state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateObjectBuffer_E700: + CPX #$14 ; PRG:$2700 Bytes:E0 14 + BEQ ObjectPathLoop_E6F2 ; PRG:$2702 Bytes:F0 EE + LDY $07 ; PRG:$2704 Bytes:A4 07 + LDA a:$0068,Y ; PRG:$2706 Bytes:B9 68 00 + BNE ObjectPathLoop_E6F9 ; PRG:$2709 Bytes:D0 EE + LDA $0370,X ; PRG:$270B Bytes:BD 70 03 + BEQ ObjectPathLoop_E6F9 ; PRG:$270E Bytes:F0 E9 + DEC $0370,X ; PRG:$2710 Bytes:DE 70 03 + LDA $0370,X ; PRG:$2713 Bytes:BD 70 03 + STA $00 ; PRG:$2716 Bytes:85 00 + INX ; PRG:$2718 Bytes:E8 + LDA $0370,X ; PRG:$2719 Bytes:BD 70 03 + STA a:$0068,Y ; PRG:$271C Bytes:99 68 00 + INX ; PRG:$271F Bytes:E8 + LDA $0370,X ; PRG:$2720 Bytes:BD 70 03 + CMP #$02 ; PRG:$2723 Bytes:C9 02 + PHP ; PRG:$2725 Bytes:08 + AND #$01 ; PRG:$2726 Bytes:29 01 + BEQ ObjectPathOnZero_E731 ; PRG:$2728 Bytes:F0 07 + LDA #$0C ; PRG:$272A Bytes:A9 0C + CLC ; PRG:$272C Bytes:18 + ADC $00 ; PRG:$272D Bytes:65 00 + STA $00 ; PRG:$272F Bytes:85 00 +ObjectPathOnZero_E731: + LDY $00 ; PRG:$2731 Bytes:A4 00 + LDA $E682,Y ; PRG:$2733 Bytes:B9 82 E6 + PLP ; PRG:$2736 Bytes:28 + BCC UpdateObjectBufferOnNoCarry_E73C ; PRG:$2737 Bytes:90 03 + CLC ; PRG:$2739 Bytes:18 + ADC #$5B ; PRG:$273A Bytes:69 5B +UpdateObjectBufferOnNoCarry_E73C: + CLC ; PRG:$273C Bytes:18 + ADC #$CC ; PRG:$273D Bytes:69 CC + STA $02 ; PRG:$273F Bytes:85 02 + LDA #$00 ; PRG:$2741 Bytes:A9 00 + ADC #$E5 ; PRG:$2743 Bytes:69 E5 + STA $03 ; PRG:$2745 Bytes:85 03 + INX ; PRG:$2747 Bytes:E8 + LDA $0370,X ; PRG:$2748 Bytes:BD 70 03 + STA $00 ; PRG:$274B Bytes:85 00 + INX ; PRG:$274D Bytes:E8 + LDA $0370,X ; PRG:$274E Bytes:BD 70 03 + STA $01 ; PRG:$2751 Bytes:85 01 + STX $08 ; PRG:$2753 Bytes:86 08 + JSR UpdateCommandBufferRoutine_F3A1 ; PRG:$2755 Bytes:20 A1 F3 + LDX $08 ; PRG:$2758 Bytes:A6 08 + JMP ProcessObjectStateDispatch_E6FD ; PRG:$275A Bytes:4C FD E6 + .byte $80, $C8, $80, $CB, $80, $D1, $80, $D4, $81, $25, $81, $2E, $81, $37, $81, $E5 ; PRG:$275D Bytes:80 C8 80 CB 80 D1 80 D4 81 25 81 2E 81 37 81 E5 + .byte $81, $F7, $82, $48, $82, $54, $82, $AB, $82, $B1, $83, $0E, $C0, $C8, $C0, $CE ; PRG:$276D Bytes:81 F7 82 48 82 54 82 AB 82 B1 83 0E C0 C8 C0 CE + .byte $C0, $D1, $C0 ; PRG:$277D Bytes:C0 D1 C0 + +;------------------------------------------------------------ +; Resource and level data with embedded PPU update code +; CPU $F20B-$F21A +; PRG $2780-$321A +; +; Pass 1 recursively traced from verified entry roots in this region. +; Direct branches, jumps, and subroutine calls are decoded. +; Bytes not reached by that trace remain explicit .byte data. +;------------------------------------------------------------ + + .byte $D7, $C1, $25, $C1, $3A, $C1, $85, $C1, $9A, $C1, $E8, $C1, $F7, $C2, $4B, $C2 ; PRG:$2780 Bytes:D7 C1 25 C1 3A C1 85 C1 9A C1 E8 C1 F7 C2 4B C2 + .byte $54, $C2, $AE, $C2, $B1, $F1, $8B, $F1, $94, $FF, $80, $CB, $80, $D1, $81, $8B ; PRG:$2790 Bytes:54 C2 AE C2 B1 F1 8B F1 94 FF 80 CB 80 D1 81 8B + .byte $81, $91, $82, $45, $82, $57, $82, $A5, $82, $A8, $82, $AB, $82, $AE, $82, $B1 ; PRG:$27A0 Bytes:81 91 82 45 82 57 82 A5 82 A8 82 AB 82 AE 82 B1 + .byte $82, $B4, $82, $B7, $82, $57, $83, $08, $83, $0B, $83, $0E, $83, $11, $83, $14 ; PRG:$27B0 Bytes:82 B4 82 B7 82 57 83 08 83 0B 83 0E 83 11 83 14 + .byte $C0, $CB, $C0, $CE, $C0, $D1, $C0, $D4, $C1, $2B, $C1, $2E, $C1, $31, $C1, $34 ; PRG:$27C0 Bytes:C0 CB C0 CE C0 D1 C0 D4 C1 2B C1 2E C1 31 C1 34 + .byte $C2, $45, $C2, $48, $C2, $57, $C2, $5A, $C2, $A8, $C2, $B7, $B1, $E5, $B1, $F7 ; PRG:$27D0 Bytes:C2 45 C2 48 C2 57 C2 5A C2 A8 C2 B7 B1 E5 B1 F7 + .byte $FF, $80, $CE, $81, $28, $81, $2B, $81, $2E, $81, $31, $81, $34, $81, $85, $81 ; PRG:$27E0 Bytes:FF 80 CE 81 28 81 2B 81 2E 81 31 81 34 81 85 81 + .byte $88, $81, $94, $81, $97, $81, $E5, $81, $F7, $82, $AE, $83, $0B, $83, $11, $C0 ; PRG:$27F0 Bytes:88 81 94 81 97 81 E5 81 F7 82 AE 83 0B 83 11 C0 + .byte $CE, $C0, $D1, $C1, $28, $C1, $37, $C1, $85, $C1, $88, $C1, $8B, $C1, $94, $C1 ; PRG:$2800 Bytes:CE C0 D1 C1 28 C1 37 C1 85 C1 88 C1 8B C1 94 C1 + .byte $97, $C1, $9A, $C1, $EB, $C1, $F4, $C2, $4B, $C2, $54, $C2, $AB, $C2, $AE, $C2 ; PRG:$2810 Bytes:97 C1 9A C1 EB C1 F4 C2 4B C2 54 C2 AB C2 AE C2 + .byte $B1, $C2, $B4, $B1, $8E, $FF, $80, $CB, $80, $CE, $80, $D1, $81, $28, $81, $34 ; PRG:$2820 Bytes:B1 C2 B4 B1 8E FF 80 CB 80 CE 80 D1 81 28 81 34 + .byte $81, $85, $81, $97, $81, $E5, $81, $E8, $81, $EB, $81, $EE, $81, $F1, $81, $F4 ; PRG:$2830 Bytes:81 85 81 97 81 E5 81 E8 81 EB 81 EE 81 F1 81 F4 + .byte $81, $F7, $83, $08, $83, $0B, $83, $0E, $83, $11, $83, $14, $C0, $CB, $C0, $D4 ; PRG:$2840 Bytes:81 F7 83 08 83 0B 83 0E 83 11 83 14 C0 CB C0 D4 + .byte $C1, $28, $C1, $37, $C1, $85, $C1, $9A, $C1, $E8, $C1, $F7, $C2, $48, $C2, $57 ; PRG:$2850 Bytes:C1 28 C1 37 C1 85 C1 9A C1 E8 C1 F7 C2 48 C2 57 + .byte $C2, $A8, $C2, $B7, $F2, $4B, $F2, $54, $FF, $80, $CE, $80, $D1, $81, $31, $81 ; PRG:$2860 Bytes:C2 A8 C2 B7 F2 4B F2 54 FF 80 CE 80 D1 81 31 81 + .byte $85, $81, $88, $81, $8B, $81, $91, $81, $94, $81, $97, $81, $E5, $81, $F7, $82 ; PRG:$2870 Bytes:85 81 88 81 8B 81 91 81 94 81 97 81 E5 81 F7 82 + .byte $4B, $82, $51, $82, $AB, $82, $AE, $82, $B1, $83, $0B, $83, $11, $C0, $CE, $C0 ; PRG:$2880 Bytes:4B 82 51 82 AB 82 AE 82 B1 83 0B 83 11 C0 CE C0 + .byte $D4, $C1, $2E, $C1, $31, $C1, $85, $C1, $9A, $C2, $AB, $C2, $AE, $C2, $B1, $C2 ; PRG:$2890 Bytes:D4 C1 2E C1 31 C1 85 C1 9A C2 AB C2 AE C2 B1 C2 + .byte $B4, $B1, $EB, $B1, $F1, $FF, $80, $C8, $80, $D4, $81, $28, $81, $2B, $81, $2E ; PRG:$28A0 Bytes:B4 B1 EB B1 F1 FF 80 C8 80 D4 81 28 81 2B 81 2E + .byte $81, $31, $81, $34, $81, $88, $81, $94, $82, $4E, $82, $AB, $82, $AE, $82, $B1 ; PRG:$28B0 Bytes:81 31 81 34 81 88 81 94 82 4E 82 AB 82 AE 82 B1 + .byte $83, $0E, $C0, $C8, $C0, $CB, $C0, $D4, $C0, $D7, $C1, $2B, $C1, $34, $C1, $88 ; PRG:$28C0 Bytes:83 0E C0 C8 C0 CB C0 D4 C0 D7 C1 2B C1 34 C1 88 + .byte $C1, $97, $C2, $4B, $C2, $54, $C2, $AE, $C2, $B1, $F1, $8E, $F1, $91, $FF, $81 ; PRG:$28D0 Bytes:C1 97 C2 4B C2 54 C2 AE C2 B1 F1 8E F1 91 FF 81 + .byte $28, $81, $34, $81, $85, $81, $8B, $81, $91, $81, $97, $81, $E5, $81, $EB, $81 ; PRG:$28E0 Bytes:28 81 34 81 85 81 8B 81 91 81 97 81 E5 81 EB 81 + .byte $F1, $81, $F7, $82, $4E, $83, $0E, $C1, $28, $C1, $2B, $C1, $34, $C1, $37, $C1 ; PRG:$28F0 Bytes:F1 81 F7 82 4E 83 0E C1 28 C1 2B C1 34 C1 37 C1 + .byte $85, $C1, $8E, $C1, $91, $C1, $9A, $C1, $EB, $C1, $F4, $C2, $AE, $C2, $B1, $B1 ; PRG:$2900 Bytes:85 C1 8E C1 91 C1 9A C1 EB C1 F4 C2 AE C2 B1 B1 + .byte $2E, $F2, $AB, $F2, $B4, $FF, $80, $CE, $81, $2B, $81, $31, $81, $88, $81, $94 ; PRG:$2910 Bytes:2E F2 AB F2 B4 FF 80 CE 81 2B 81 31 81 88 81 94 + .byte $81, $EE, $82, $4B, $82, $4E, $82, $51, $82, $AB, $82, $B1, $83, $0B, $83, $0E ; PRG:$2920 Bytes:81 EE 82 4B 82 4E 82 51 82 AB 82 B1 83 0B 83 0E + .byte $83, $11, $C0, $CE, $C0, $D1, $C1, $2B, $C1, $34, $C1, $88, $C1, $97, $C1, $EE ; PRG:$2930 Bytes:83 11 C0 CE C0 D1 C1 2B C1 34 C1 88 C1 97 C1 EE + .byte $C1, $F1, $C2, $AB, $C2, $B4, $B1, $8E, $FF, $81, $88, $81, $8B, $81, $91, $81 ; PRG:$2940 Bytes:C1 F1 C2 AB C2 B4 B1 8E FF 81 88 81 8B 81 91 81 + .byte $94, $81, $E5, $81, $EE, $81, $F7, $82, $A8, $82, $AB, $82, $B1, $82, $B4, $C0 ; PRG:$2950 Bytes:94 81 E5 81 EE 81 F7 82 A8 82 AB 82 B1 82 B4 C0 + .byte $C5, $C0, $DA, $C1, $25, $C1, $3A, $C1, $85, $C1, $88, $C1, $8E, $C1, $91, $C1 ; PRG:$2960 Bytes:C5 C0 DA C1 25 C1 3A C1 85 C1 88 C1 8E C1 91 C1 + .byte $97, $C1, $9A, $C1, $E8, $C1, $EE, $C1, $F1, $C1, $F7, $C2, $48, $C2, $4E, $C2 ; PRG:$2970 Bytes:97 C1 9A C1 E8 C1 EE C1 F1 C1 F7 C2 48 C2 4E C2 + .byte $51, $C2, $57, $B1, $28, $B1, $34, $FF, $81, $25, $81, $37, $81, $88, $81, $94 ; PRG:$2980 Bytes:51 C2 57 B1 28 B1 34 FF 81 25 81 37 81 88 81 94 + .byte $81, $EB, $81, $EE, $81, $F1, $82, $4B, $82, $51, $82, $A5, $82, $A8, $82, $AE ; PRG:$2990 Bytes:81 EB 81 EE 81 F1 82 4B 82 51 82 A5 82 A8 82 AE + .byte $82, $B4, $82, $B7, $C1, $25, $C1, $28, $C1, $37, $C1, $3A, $C1, $85, $C1, $8B ; PRG:$29A0 Bytes:82 B4 82 B7 C1 25 C1 28 C1 37 C1 3A C1 85 C1 8B + .byte $C1, $94, $C1, $9A, $C1, $E5, $C1, $EE, $C1, $F1, $C1, $FA, $C2, $45, $C2, $4B ; PRG:$29B0 Bytes:C1 94 C1 9A C1 E5 C1 EE C1 F1 C1 FA C2 45 C2 4B + .byte $C2, $4E, $C2, $51, $C2, $54, $C2, $5A, $F1, $2E, $F1, $31, $FF, $80, $C5, $80 ; PRG:$29C0 Bytes:C2 4E C2 51 C2 54 C2 5A F1 2E F1 31 FF 80 C5 80 + .byte $D7, $81, $28, $81, $2B, $81, $2E, $81, $31, $81, $34, $81, $85, $81, $97, $82 ; PRG:$29D0 Bytes:D7 81 28 81 2B 81 2E 81 31 81 34 81 85 81 97 82 + .byte $48, $82, $4E, $82, $54, $82, $AB, $82, $AE, $82, $B1, $C0, $C5, $C0, $C8, $C0 ; PRG:$29E0 Bytes:48 82 4E 82 54 82 AB 82 AE 82 B1 C0 C5 C0 C8 C0 + .byte $D7, $C0, $DA, $C1, $25, $C1, $3A, $C1, $88, $C1, $97, $C1, $E8, $C1, $F7, $C2 ; PRG:$29F0 Bytes:D7 C0 DA C1 25 C1 3A C1 88 C1 97 C1 E8 C1 F7 C2 + .byte $4B, $C2, $4E, $C2, $51, $C2, $54, $B2, $A5, $B2, $B7, $B1, $8B, $B1, $91, $FF ; PRG:$2A00 Bytes:4B C2 4E C2 51 C2 54 B2 A5 B2 B7 B1 8B B1 91 FF + .byte $81, $8B, $81, $8E, $81, $97, $81, $E5, $81, $E8, $81, $EB, $81, $EE, $81, $F1 ; PRG:$2A10 Bytes:81 8B 81 8E 81 97 81 E5 81 E8 81 EB 81 EE 81 F1 + .byte $81, $F4, $81, $F7, $82, $54, $82, $57, $82, $A5, $82, $A8, $82, $AB, $82, $AE ; PRG:$2A20 Bytes:81 F4 81 F7 82 54 82 57 82 A5 82 A8 82 AB 82 AE + .byte $82, $B1, $82, $B7, $C1, $2E, $C1, $8B, $C1, $91, $C1, $97, $C1, $9A, $C1, $E5 ; PRG:$2A30 Bytes:82 B1 82 B7 C1 2E C1 8B C1 91 C1 97 C1 9A C1 E5 + .byte $C1, $F7, $C2, $45, $C2, $54, $C2, $57, $C2, $5A, $F0, $C8, $F0, $D7, $FF, $80 ; PRG:$2A40 Bytes:C1 F7 C2 45 C2 54 C2 57 C2 5A F0 C8 F0 D7 FF 80 + .byte $C8, $80, $D4, $81, $28, $81, $34, $81, $8E, $81, $E5, $81, $EE, $81, $F7, $82 ; PRG:$2A50 Bytes:C8 80 D4 81 28 81 34 81 8E 81 E5 81 EE 81 F7 82 + .byte $45, $82, $4E, $82, $57, $82, $A8, $82, $B4, $83, $08, $83, $14, $C0, $C8, $C0 ; PRG:$2A60 Bytes:45 82 4E 82 57 82 A8 82 B4 83 08 83 14 C0 C8 C0 + .byte $CB, $C0, $D4, $C0, $D7, $C1, $8E, $C1, $91, $C1, $E5, $C1, $E8, $C1, $EE, $C1 ; PRG:$2A70 Bytes:CB C0 D4 C0 D7 C1 8E C1 91 C1 E5 C1 E8 C1 EE C1 + .byte $F1, $C1, $F7, $C1, $FA, $C2, $A8, $C2, $AB, $C2, $B4, $C2, $B7, $B1, $88, $B1 ; PRG:$2A80 Bytes:F1 C1 F7 C1 FA C2 A8 C2 AB C2 B4 C2 B7 B1 88 B1 + .byte $94, $F1, $EB, $F1, $F4, $FF, $80, $C5, $80, $C8, $80, $D4, $80, $D7, $81, $8B ; PRG:$2A90 Bytes:94 F1 EB F1 F4 FF 80 C5 80 C8 80 D4 80 D7 81 8B + .byte $81, $8E, $81, $91, $82, $4B, $82, $4E, $82, $51, $83, $05, $83, $08, $83, $14 ; PRG:$2AA0 Bytes:81 8E 81 91 82 4B 82 4E 82 51 83 05 83 08 83 14 + .byte $83, $17, $C0, $C5, $C0, $CB, $C0, $D4, $C0, $DA, $C1, $25, $C1, $2B, $C1, $34 ; PRG:$2AB0 Bytes:83 17 C0 C5 C0 CB C0 D4 C0 DA C1 25 C1 2B C1 34 + .byte $C1, $3A, $C1, $85, $C1, $9A, $C1, $E5, $C1, $FA, $C2, $45, $C2, $4B, $C2, $54 ; PRG:$2AC0 Bytes:C1 3A C1 85 C1 9A C1 E5 C1 FA C2 45 C2 4B C2 54 + .byte $C2, $5A, $C2, $A5, $C2, $AB, $C2, $B4, $C2, $BA, $B1, $EB, $B1, $F1, $F1, $88 ; PRG:$2AD0 Bytes:C2 5A C2 A5 C2 AB C2 B4 C2 BA B1 EB B1 F1 F1 88 + .byte $F1, $97, $F2, $48, $F2, $57, $FF, $81, $25, $81, $28, $81, $34, $81, $37, $81 ; PRG:$2AE0 Bytes:F1 97 F2 48 F2 57 FF 81 25 81 28 81 34 81 37 81 + .byte $85, $81, $88, $81, $8B, $81, $8E, $81, $91, $81, $94, $81, $97, $82, $45, $82 ; PRG:$2AF0 Bytes:85 81 88 81 8B 81 8E 81 91 81 94 81 97 82 45 82 + .byte $48, $82, $4B, $82, $4E, $82, $51, $82, $54, $82, $57, $82, $A5, $82, $A8, $82 ; PRG:$2B00 Bytes:48 82 4B 82 4E 82 51 82 54 82 57 82 A5 82 A8 82 + .byte $B4, $82, $B7, $C1, $25, $C1, $2B, $C1, $34, $C1, $3A, $C1, $8B, $C1, $94, $C1 ; PRG:$2B10 Bytes:B4 82 B7 C1 25 C1 2B C1 34 C1 3A C1 8B C1 94 C1 + .byte $EB, $C1, $F4, $C2, $45, $C2, $4B, $C2, $54, $C2, $5A, $B1, $E5, $B1, $EE, $B1 ; PRG:$2B20 Bytes:EB C1 F4 C2 45 C2 4B C2 54 C2 5A B1 E5 B1 EE B1 + .byte $F7, $FF, $80, $C5, $80, $D7, $81, $28, $81, $34, $81, $85, $81, $88, $81, $94 ; PRG:$2B30 Bytes:F7 FF 80 C5 80 D7 81 28 81 34 81 85 81 88 81 94 + .byte $81, $97, $82, $45, $82, $48, $82, $54, $82, $57, $82, $A5, $82, $B7, $83, $08 ; PRG:$2B40 Bytes:81 97 82 45 82 48 82 54 82 57 82 A5 82 B7 83 08 + .byte $83, $14, $C0, $C5, $C0, $C8, $C0, $D7, $C0, $DA, $C1, $25, $C1, $2B, $C1, $34 ; PRG:$2B50 Bytes:83 14 C0 C5 C0 C8 C0 D7 C0 DA C1 25 C1 2B C1 34 + .byte $C1, $3A, $C2, $45, $C2, $4B, $C2, $54, $C2, $5A, $C2, $A8, $C2, $AB, $C2, $B4 ; PRG:$2B60 Bytes:C1 3A C2 45 C2 4B C2 54 C2 5A C2 A8 C2 AB C2 B4 + .byte $C2, $B7, $B1, $E5, $B1, $EB, $B1, $F1, $B1, $F7, $FF, $80, $C5, $80, $D7, $81 ; PRG:$2B70 Bytes:C2 B7 B1 E5 B1 EB B1 F1 B1 F7 FF 80 C5 80 D7 81 + .byte $85, $81, $2E, $81, $97, $82, $45, $82, $AE, $82, $57, $83, $05, $83, $17, $C0 ; PRG:$2B80 Bytes:85 81 2E 81 97 82 45 82 AE 82 57 83 05 83 17 C0 + .byte $C8, $C0, $D7, $C1, $8E, $C1, $91, $C1, $EE, $C1, $F1, $C2, $A8, $C2, $B7, $B1 ; PRG:$2B90 Bytes:C8 C0 D7 C1 8E C1 91 C1 EE C1 F1 C2 A8 C2 B7 B1 + .byte $E8, $B1, $F4, $F1, $2B, $F1, $34, $F2, $4B, $F2, $54, $F1, $22, $F2, $5D, $FF ; PRG:$2BA0 Bytes:E8 B1 F4 F1 2B F1 34 F2 4B F2 54 F1 22 F2 5D FF + .byte $81, $25, $81, $2E, $81, $37, $81, $82, $81, $88, $81, $8E, $81, $94, $81, $9A ; PRG:$2BB0 Bytes:81 25 81 2E 81 37 81 82 81 88 81 8E 81 94 81 9A + .byte $82, $42, $82, $48, $82, $4E, $82, $54, $82, $5A, $82, $A5, $82, $AE, $82, $B7 ; PRG:$2BC0 Bytes:82 42 82 48 82 4E 82 54 82 5A 82 A5 82 AE 82 B7 + .byte $C0, $C8, $C0, $D7, $C2, $A8, $C2, $B7, $B1, $E8, $B1, $EE, $B1, $F4, $F0, $CB ; PRG:$2BD0 Bytes:C0 C8 C0 D7 C2 A8 C2 B7 B1 E8 B1 EE B1 F4 F0 CB + .byte $F0, $D4, $F2, $AB, $F2, $B4, $FF, $81, $2B, $81, $2E, $81, $31, $81, $85, $81 ; PRG:$2BE0 Bytes:F0 D4 F2 AB F2 B4 FF 81 2B 81 2E 81 31 81 85 81 + .byte $97, $81, $EE, $82, $45, $82, $57, $82, $AB, $82, $AE, $82, $B1, $C0, $CB, $C0 ; PRG:$2BF0 Bytes:97 81 EE 82 45 82 57 82 AB 82 AE 82 B1 C0 CB C0 + .byte $D4, $C1, $88, $C1, $97, $C1, $E8, $C1, $F7, $C2, $AB, $C2, $B4, $B1, $8E, $B2 ; PRG:$2C00 Bytes:D4 C1 88 C1 97 C1 E8 C1 F7 C2 AB C2 B4 B1 8E B2 + .byte $4E, $F0, $C8, $F0, $D7, $F2, $A8, $F2, $B7, $F1, $3D, $F2, $42, $FF, $80, $C5 ; PRG:$2C10 Bytes:4E F0 C8 F0 D7 F2 A8 F2 B7 F1 3D F2 42 FF 80 C5 + .byte $80, $C8, $80, $D4, $80, $D7, $81, $2B, $81, $31, $82, $AB, $82, $B1, $83, $05 ; PRG:$2C20 Bytes:80 C8 80 D4 80 D7 81 2B 81 31 82 AB 82 B1 83 05 + .byte $83, $08, $83, $14, $83, $17, $C1, $22, $C1, $3D, $C1, $2B, $C1, $34, $C2, $4B ; PRG:$2C30 Bytes:83 08 83 14 83 17 C1 22 C1 3D C1 2B C1 34 C2 4B + .byte $C2, $54, $C2, $42, $C2, $5D, $B1, $8E, $B2, $4E, $B1, $E8, $B1, $F4, $F1, $28 ; PRG:$2C40 Bytes:C2 54 C2 42 C2 5D B1 8E B2 4E B1 E8 B1 F4 F1 28 + .byte $F1, $37, $F2, $48, $F2, $57, $FF, $3F, $00, $20, $0F, $30, $17, $25, $0F, $30 ; PRG:$2C50 Bytes:F1 37 F2 48 F2 57 FF 3F 00 20 0F 30 17 25 0F 30 + .byte $17, $17, $0F, $30, $25, $05, $0F, $30, $21, $01, $0F, $30, $27, $16, $0F, $30 ; PRG:$2C60 Bytes:17 17 0F 30 25 05 0F 30 21 01 0F 30 27 16 0F 30 + .byte $27, $1A, $0F, $30, $1C, $01, $0F, $30, $27, $08, $60, $20, $50, $04, $2A, $2B ; PRG:$2C70 Bytes:27 1A 0F 30 1C 01 0F 30 27 08 60 20 50 04 2A 2B + .byte $2C, $2D, $20, $49, $04, $26, $27, $28, $29, $20, $C2, $D3, $4E, $20, $C5, $D3 ; PRG:$2C80 Bytes:2C 2D 20 49 04 26 27 28 29 20 C2 D3 4E 20 C5 D3 + .byte $4E, $20, $C8, $D3, $4E, $20, $CB, $D3, $4E, $20, $CE, $D3, $4E, $20, $D1, $D3 ; PRG:$2C90 Bytes:4E 20 C8 D3 4E 20 CB D3 4E 20 CE D3 4E 20 D1 D3 + .byte $4E, $20, $D4, $D3, $4E, $20, $D7, $D3, $4E, $20, $DA, $D3, $4E, $20, $DD, $D3 ; PRG:$2CA0 Bytes:4E 20 D4 D3 4E 20 D7 D3 4E 20 DA D3 4E 20 DD D3 + .byte $4E, $20, $E2, $5C, $24, $21, $02, $5C, $24, $21, $42, $5C, $24, $21, $62, $5C ; PRG:$2CB0 Bytes:4E 20 E2 5C 24 21 02 5C 24 21 42 5C 24 21 62 5C + .byte $24, $21, $A2, $5C, $24, $21, $C2, $5C, $24, $22, $02, $5C, $24, $22, $22, $5C ; PRG:$2CC0 Bytes:24 21 A2 5C 24 21 C2 5C 24 22 02 5C 24 22 22 5C + .byte $24, $22, $62, $5C, $24, $22, $82, $5C, $24, $22, $C2, $5C, $24, $22, $E2, $5C ; PRG:$2CD0 Bytes:24 22 62 5C 24 22 82 5C 24 22 C2 5C 24 22 E2 5C + .byte $24, $60, $21, $02, $CF, $32, $21, $1D, $CF, $32, $20, $67, $52, $39, $23, $67 ; PRG:$2CE0 Bytes:24 60 21 02 CF 32 21 1D CF 32 20 67 52 39 23 67 + .byte $52, $39, $60, $04, $08, $22, $0F, $38, $18, $38, $D8, $4C, $57, $EC, $4C, $7B ; PRG:$2CF0 Bytes:52 39 60 04 08 22 0F 38 18 38 D8 4C 57 EC 4C 7B + .byte $EC, $4C, $E2, $EC, $00, $00, $65, $10, $79, $23, $45, $33, $59, $00, $C2, $10 ; PRG:$2D00 Bytes:EC 4C E2 EC 00 00 65 10 79 23 45 33 59 00 C2 10 + .byte $DC, $22, $E2, $32, $FC, $43, $1A, $53, $04, $60, $BA, $70, $A4, $FF, $06, $0A ; PRG:$2D10 Bytes:DC 22 E2 32 FC 43 1A 53 04 60 BA 70 A4 FF 06 0A + .byte $22, $C6, $22, $D8, $20, $60, $20, $90, $4C, $57, $EC, $3F, $08, $04, $0F, $30 ; PRG:$2D20 Bytes:22 C6 22 D8 20 60 20 90 4C 57 EC 3F 08 04 0F 30 + .byte $2A, $0A, $4C, $7B, $EC, $4C, $E2, $EC, $00, $00, $65, $10, $79, $23, $45, $33 ; PRG:$2D30 Bytes:2A 0A 4C 7B EC 4C E2 EC 00 00 65 10 79 23 45 33 + .byte $59, $00, $C2, $10, $DC, $22, $E2, $32, $FC, $43, $1A, $53, $04, $60, $BA, $70 ; PRG:$2D40 Bytes:59 00 C2 10 DC 22 E2 32 FC 43 1A 53 04 60 BA 70 + .byte $A4, $C1, $E8, $C2, $4E, $C2, $51, $C1, $F7, $82, $48, $82, $54, $FF, $06, $0A ; PRG:$2D50 Bytes:A4 C1 E8 C2 4E C2 51 C1 F7 82 48 82 54 FF 06 0A + .byte $22, $0C, $22, $12, $38, $78, $B0, $78, $4C, $57, $EC, $3F, $08, $04, $0F, $30 ; PRG:$2D60 Bytes:22 0C 22 12 38 78 B0 78 4C 57 EC 3F 08 04 0F 30 + .byte $21, $01, $4C, $7B, $EC, $20, $64, $46, $39, $20, $CD, $46, $39, $20, $76, $46 ; PRG:$2D70 Bytes:21 01 4C 7B EC 20 64 46 39 20 CD 46 39 20 76 46 + .byte $39, $23, $64, $46, $39, $23, $0D, $46, $39, $23, $76, $46, $39, $20, $A2, $D5 ; PRG:$2D80 Bytes:39 23 64 46 39 23 0D 46 39 23 76 46 39 20 A2 D5 + .byte $32, $20, $BD, $D5, $32, $00, $00, $62, $10, $7C, $23, $42, $33, $5C, $00, $74 ; PRG:$2D90 Bytes:32 20 BD D5 32 00 00 62 10 7C 23 42 33 5C 00 74 + .byte $10, $6A, $23, $54, $33, $4A, $43, $0B, $53, $13, $60, $AB, $70, $B3, $FF, $0A ; PRG:$2DA0 Bytes:10 6A 23 54 33 4A 43 0B 53 13 60 AB 70 B3 FF 0A + .byte $0E, $21, $46, $21, $58, $22, $CC, $22, $D2, $20, $60, $20, $90, $4C, $57, $EC ; PRG:$2DB0 Bytes:0E 21 46 21 58 22 CC 22 D2 20 60 20 90 4C 57 EC + .byte $3F, $00, $0C, $0F, $30, $17, $2A, $0F, $30, $17, $17, $0F, $30, $23, $03, $4C ; PRG:$2DC0 Bytes:3F 00 0C 0F 30 17 2A 0F 30 17 17 0F 30 23 03 4C + .byte $7B, $EC, $4C, $E2, $EC, $20, $60, $60, $39, $20, $6F, $42, $24, $23, $60, $60 ; PRG:$2DD0 Bytes:7B EC 4C E2 EC 20 60 60 39 20 6F 42 24 23 60 60 + .byte $39, $23, $6F, $42, $24, $20, $C0, $D3, $39, $20, $DF, $D3, $39, $20, $AE, $C3 ; PRG:$2DE0 Bytes:39 23 6F 42 24 20 C0 D3 39 20 DF D3 39 20 AE C3 + .byte $32, $20, $B1, $C3, $32, $22, $EE, $C3, $32, $22, $F1, $C3, $32, $20, $E0, $D1 ; PRG:$2DF0 Bytes:32 20 B1 C3 32 22 EE C3 32 22 F1 C3 32 20 E0 D1 + .byte $FF, $21, $01, $CF, $FF, $21, $1E, $CF, $FF, $20, $FF, $D1, $FF, $00, $00, $71 ; PRG:$2E00 Bytes:FF 21 01 CF FF 21 1E CF FF 20 FF D1 FF 00 00 71 + .byte $10, $6D, $23, $51, $33, $4D, $42, $AE, $52, $B0, $61, $0E, $71, $10, $40, $DD ; PRG:$2E10 Bytes:10 6D 23 51 33 4D 42 AE 52 B0 61 0E 71 10 40 DD + .byte $50, $C1, $62, $FD, $72, $E1, $FF, $0A, $0E, $22, $06, $22, $0C, $22, $12, $22 ; PRG:$2E20 Bytes:50 C1 62 FD 72 E1 FF 0A 0E 22 06 22 0C 22 12 22 + .byte $18, $20, $18, $20, $D8, $4C, $57, $EC, $3F, $08, $04, $0F, $30, $27, $07, $4C ; PRG:$2E30 Bytes:18 20 18 20 D8 4C 57 EC 3F 08 04 0F 30 27 07 4C + .byte $7B, $EC, $20, $64, $49, $39, $20, $73, $49, $39, $23, $64, $49, $39, $23, $73 ; PRG:$2E40 Bytes:7B EC 20 64 49 39 20 73 49 39 23 64 49 39 23 73 + .byte $49, $39, $20, $C0, $01, $39, $20, $DF, $01, $39, $23, $00, $01, $39, $23, $1F ; PRG:$2E50 Bytes:49 39 20 C0 01 39 20 DF 01 39 23 00 01 39 23 1F + .byte $01, $39, $00, $00, $62, $10, $7C, $23, $42, $33, $5C, $00, $71, $10, $6D, $23 ; PRG:$2E60 Bytes:01 39 00 00 62 10 7C 23 42 33 5C 00 71 10 6D 23 + .byte $51, $33, $4D, $43, $1D, $53, $01, $60, $BD, $70, $A1, $43, $0E, $53, $10, $60 ; PRG:$2E70 Bytes:51 33 4D 43 1D 53 01 60 BD 70 A1 43 0E 53 10 60 + .byte $AE, $70, $B0, $C1, $25, $C1, $3A, $C2, $45, $C2, $5A, $91, $E2, $91, $FA, $FF ; PRG:$2E80 Bytes:AE 70 B0 C1 25 C1 3A C2 45 C2 5A 91 E2 91 FA FF + .byte $02, $06, $38, $60, $38, $90, $4C, $57, $EC, $3F, $04, $04, $0F, $30, $11, $11 ; PRG:$2E90 Bytes:02 06 38 60 38 90 4C 57 EC 3F 04 04 0F 30 11 11 + .byte $3F, $1C, $04, $0F, $30, $21, $01, $4C, $89, $EC, $20, $63, $5A, $BF, $23, $63 ; PRG:$2EA0 Bytes:3F 1C 04 0F 30 21 01 4C 89 EC 20 63 5A BF 23 63 + .byte $5A, $BF, $20, $82, $D7, $BD, $20, $9D, $D7, $BD, $21, $8C, $48, $BF, $22, $4C ; PRG:$2EB0 Bytes:5A BF 20 82 D7 BD 20 9D D7 BD 21 8C 48 BF 22 4C + .byte $48, $BF, $21, $AB, $C5, $BD, $21, $B4, $C5, $BD, $21, $AC, $48, $FF, $21, $CC ; PRG:$2EC0 Bytes:48 BF 21 AB C5 BD 21 B4 C5 BD 21 AC 48 FF 21 CC + .byte $08, $FF, $0B, $18, $17, $1E, $1C, $AD, $FF, $21, $EC, $48, $FF, $22, $0C, $08 ; PRG:$2ED0 Bytes:08 FF 0B 18 17 1E 1C AD FF 21 EC 48 FF 22 0C 08 + .byte $2A, $2B, $2C, $2D, $FF, $FF, $FF, $FF, $22, $2C, $48, $FF, $20, $62, $01, $B9 ; PRG:$2EE0 Bytes:2A 2B 2C 2D FF FF FF FF 22 2C 48 FF 20 62 01 B9 + .byte $20, $7D, $01, $C2, $23, $62, $01, $BA, $23, $7D, $01, $C3, $21, $8B, $01, $BC ; PRG:$2EF0 Bytes:20 7D 01 C2 23 62 01 BA 23 7D 01 C3 21 8B 01 BC + .byte $21, $94, $01, $C0, $22, $4B, $01, $BE, $22, $54, $01, $C1, $00, $80, $C5, $80 ; PRG:$2F00 Bytes:21 94 01 C0 22 4B 01 BE 22 54 01 C1 00 80 C5 80 + .byte $C8, $80, $CB, $80, $CE, $80, $D1, $80, $D4, $80, $D7, $81, $25, $81, $28, $81 ; PRG:$2F10 Bytes:C8 80 CB 80 CE 80 D1 80 D4 80 D7 81 25 81 28 81 + .byte $2B, $81, $2E, $81, $31, $81, $34, $81, $37, $81, $85, $81, $97, $81, $E5, $81 ; PRG:$2F20 Bytes:2B 81 2E 81 31 81 34 81 37 81 85 81 97 81 E5 81 + .byte $F7, $82, $45, $82, $57, $82, $A5, $82, $A8, $82, $AB, $82, $AE, $82, $B1, $82 ; PRG:$2F30 Bytes:F7 82 45 82 57 82 A5 82 A8 82 AB 82 AE 82 B1 82 + .byte $B4, $82, $B7, $83, $05, $83, $08, $83, $0B, $83, $0E, $83, $11, $83, $14, $83 ; PRG:$2F40 Bytes:B4 82 B7 83 05 83 08 83 0B 83 0E 83 11 83 14 83 + .byte $17, $C0, $C5, $C0, $C8, $C0, $CB, $C0, $CE, $C0, $D1, $C0, $D4, $C0, $D7, $C0 ; PRG:$2F50 Bytes:17 C0 C5 C0 C8 C0 CB C0 CE C0 D1 C0 D4 C0 D7 C0 + .byte $DA, $C1, $25, $C1, $28, $C1, $37, $C1, $3A, $C1, $85, $C1, $88, $C1, $97, $C1 ; PRG:$2F60 Bytes:DA C1 25 C1 28 C1 37 C1 3A C1 85 C1 88 C1 97 C1 + .byte $9A, $C1, $E5, $C1, $E8, $C1, $F7, $C1, $FA, $C2, $45, $C2, $48, $C2, $57, $C2 ; PRG:$2F70 Bytes:9A C1 E5 C1 E8 C1 F7 C1 FA C2 45 C2 48 C2 57 C2 + .byte $5A, $C2, $A5, $C2, $A8, $C2, $AB, $C2, $AE, $C2, $B1, $C2, $B4, $C2, $B7, $C2 ; PRG:$2F80 Bytes:5A C2 A5 C2 A8 C2 AB C2 AE C2 B1 C2 B4 C2 B7 C2 + .byte $BA, $FF, $02, $4C, $57, $EC, $3F, $00, $14, $0F, $30, $21, $01, $0F, $30, $30 ; PRG:$2F90 Bytes:BA FF 02 4C 57 EC 3F 00 14 0F 30 21 01 0F 30 30 + .byte $0F, $0F, $25, $25, $0F, $0F, $21, $21, $0F, $0F, $30, $26, $27, $23, $E0, $48 ; PRG:$2FA0 Bytes:0F 0F 25 25 0F 0F 21 21 0F 0F 30 26 27 23 E0 48 + .byte $50, $23, $E8, $48, $A5, $23, $F0, $48, $F5, $20, $86, $14, $DA, $DF, $E3, $E5 ; PRG:$2FB0 Bytes:50 23 E8 48 A5 23 F0 48 F5 20 86 14 DA DF E3 E5 + .byte $24, $24, $E5, $24, $E5, $24, $24, $DA, $DF, $E3, $E5, $24, $24, $E5, $24, $E5 ; PRG:$2FC0 Bytes:24 24 E5 24 E5 24 24 DA DF E3 E5 24 24 E5 24 E5 + .byte $20, $A6, $14, $DB, $E0, $E4, $DC, $24, $24, $DC, $24, $DC, $24, $24, $DB, $E0 ; PRG:$2FD0 Bytes:20 A6 14 DB E0 E4 DC 24 24 DC 24 DC 24 24 DB E0 + .byte $E4, $DC, $24, $24, $DC, $24, $DC, $20, $C6, $14, $DC, $24, $24, $DC, $24, $24 ; PRG:$2FE0 Bytes:E4 DC 24 24 DC 24 DC 20 C6 14 DC 24 24 DC 24 24 + .byte $DC, $24, $DC, $24, $24, $DC, $24, $24, $DC, $24, $24, $DC, $24, $DC, $20, $E6 ; PRG:$2FF0 Bytes:DC 24 DC 24 24 DC 24 24 DC 24 24 DC 24 DC 20 E6 + .byte $14, $DD, $E1, $E5, $DD, $24, $24, $DD, $E1, $DC, $24, $24, $DD, $E1, $E5, $DD ; PRG:$3000 Bytes:14 DD E1 E5 DD 24 24 DD E1 DC 24 24 DD E1 E5 DD + .byte $24, $24, $DD, $E1, $DC, $21, $06, $14, $DE, $E2, $E6, $DE, $E2, $E7, $DE, $E2 ; PRG:$3010 Bytes:24 24 DD E1 DC 21 06 14 DE E2 E6 DE E2 E7 DE E2 + .byte $E6, $24, $24, $DE, $E2, $E6, $DE, $E2, $E7, $DE, $E2, $E6, $20, $44, $57, $39 ; PRG:$3020 Bytes:E6 24 24 DE E2 E6 DE E2 E7 DE E2 E6 20 44 57 39 + .byte $22, $05, $57, $39, $20, $83, $CB, $DC, $20, $7C, $CD, $DC, $20, $43, $82, $DA ; PRG:$3030 Bytes:22 05 57 39 20 83 CB DC 20 7C CD DC 20 43 82 DA + .byte $DB, $21, $E3, $01, $DD, $22, $03, $02, $DE, $E2, $20, $5B, $02, $DF, $E3, $20 ; PRG:$3040 Bytes:DB 21 E3 01 DD 22 03 02 DE E2 20 5B 02 DF E3 20 + .byte $7B, $01, $E0, $21, $FB, $01, $E1, $22, $1C, $01, $E6, $21, $46, $85, $E5, $DC ; PRG:$3050 Bytes:7B 01 E0 21 FB 01 E1 22 1C 01 E6 21 46 85 E5 DC + .byte $DC, $DD, $DE, $21, $4B, $0F, $DA, $39, $39, $DF, $E3, $DA, $DF, $E3, $24, $E5 ; PRG:$3060 Bytes:DC DD DE 21 4B 0F DA 39 39 DF E3 DA DF E3 24 E5 + .byte $EA, $39, $39, $DF, $E3, $21, $6B, $0F, $DB, $24, $24, $E0, $DC, $DB, $E0, $DC ; PRG:$3070 Bytes:EA 39 39 DF E3 21 6B 0F DB 24 24 E0 DC DB E0 DC + .byte $24, $DC, $24, $EB, $24, $E0, $DC, $21, $8B, $0F, $DC, $24, $24, $24, $DC, $DC ; PRG:$3080 Bytes:24 DC 24 EB 24 E0 DC 21 8B 0F DC 24 24 24 DC DC + .byte $24, $DC, $24, $DC, $24, $DC, $24, $24, $DC, $21, $AB, $0F, $E8, $E9, $39, $E7 ; PRG:$3090 Bytes:24 DC 24 DC 24 DC 24 24 DC 21 AB 0F E8 E9 39 E7 + .byte $DC, $DC, $24, $DD, $E1, $DC, $24, $EC, $24, $E1, $DC, $21, $C7, $13, $E2, $39 ; PRG:$30A0 Bytes:DC DC 24 DD E1 DC 24 EC 24 E1 DC 21 C7 13 E2 39 + .byte $39, $E7, $EC, $24, $24, $24, $EC, $EC, $24, $DE, $E2, $E6, $EA, $39, $39, $39 ; PRG:$30B0 Bytes:39 E7 EC 24 24 24 EC EC 24 DE E2 E6 EA 39 39 39 + .byte $E6, $22, $4A, $0D, $01, $24, $19, $15, $0A, $22, $0E, $1B, $24, $10, $0A, $16 ; PRG:$30C0 Bytes:E6 22 4A 0D 01 24 19 15 0A 22 0E 1B 24 10 0A 16 + .byte $0E, $22, $8A, $0D, $02, $24, $19, $15, $0A, $22, $0E, $1B, $24, $10, $0A, $16 ; PRG:$30D0 Bytes:0E 22 8A 0D 02 24 19 15 0A 22 0E 1B 24 10 0A 16 + .byte $0E, $22, $CA, $04, $B5, $B6, $B7, $B8, $22, $D4, $04, $B2, $B3, $B4, $CC, $23 ; PRG:$30E0 Bytes:0E 22 CA 04 B5 B6 B7 B8 22 D4 04 B2 B3 B4 CC 23 + .byte $04, $02, $AB, $B8, $23, $0C, $07, $B2, $B3, $B4, $CC, $24, $AC, $B8, $23, $19 ; PRG:$30F0 Bytes:04 02 AB B8 23 0C 07 B2 B3 B4 CC 24 AC B8 23 19 + .byte $04, $B2, $B3, $B4, $CC, $23, $69, $0E, $25, $01, $09, $08, $04, $24, $17, $12 ; PRG:$3100 Bytes:04 B2 B3 B4 CC 23 69 0E 25 01 09 08 04 24 17 12 + .byte $17, $1D, $0E, $17, $0D, $18, $00, $FF, $02, $4C, $7E, $F1, $00, $FF, $02, $4C ; PRG:$3110 Bytes:17 1D 0E 17 0D 18 00 FF 02 4C 7E F1 00 FF 02 4C + .byte $7E, $F1, $2B, $E1, $46, $FA, $2B, $E9, $46, $FF, $2B, $F1, $46, $AF, $2B, $F1 ; PRG:$3120 Bytes:7E F1 2B E1 46 FA 2B E9 46 FF 2B F1 46 AF 2B F1 + .byte $01, $A5, $2A, $24, $58, $C7, $2B, $44, $58, $C8, $2A, $43, $C8, $C5, $2A, $5C ; PRG:$3130 Bytes:01 A5 2A 24 58 C7 2B 44 58 C8 2A 43 C8 C5 2A 5C + .byte $C8, $CA, $2A, $23, $01, $C4, $2A, $3C, $01, $C9, $2B, $43, $01, $C6, $2B, $5C ; PRG:$3140 Bytes:C8 CA 2A 23 01 C4 2A 3C 01 C9 2B 43 01 C6 2B 5C + .byte $01, $CB, $2A, $4A, $0C, $2E, $24, $19, $15, $0A, $22, $0E, $1B, $24, $02, $24 ; PRG:$3150 Bytes:01 CB 2A 4A 0C 2E 24 19 15 0A 22 0E 1B 24 02 24 + .byte $2F, $2A, $8F, $4A, $C7, $2A, $CF, $4A, $C8, $2A, $8E, $83, $C4, $C5, $C6, $2A ; PRG:$3160 Bytes:2F 2A 8F 4A C7 2A CF 4A C8 2A 8E 83 C4 C5 C6 2A + .byte $B5, $04, $B2, $B3, $B4, $CC, $2A, $99, $83, $C9, $CA, $CB, $00, $FF, $2B, $C0 ; PRG:$3170 Bytes:B5 04 B2 B3 B4 CC 2A 99 83 C9 CA CB 00 FF 2B C0 + .byte $60, $AA, $2B, $E0, $60, $AA, $2B, $C9, $46, $FF, $2B, $D1, $46, $FF, $2B, $D1 ; PRG:$3180 Bytes:60 AA 2B E0 60 AA 2B C9 46 FF 2B D1 46 FF 2B D1 + .byte $01, $55, $28, $64, $58, $C7, $29, $84, $58, $C8, $28, $83, $C8, $C5, $28, $9C ; PRG:$3190 Bytes:01 55 28 64 58 C7 29 84 58 C8 28 83 C8 C5 28 9C + .byte $C8, $CA, $28, $63, $01, $C4, $28, $7C, $01, $C9, $29, $83, $01, $C6, $29, $9C ; PRG:$31A0 Bytes:C8 CA 28 63 01 C4 28 7C 01 C9 29 83 01 C6 29 9C + .byte $01, $CB, $28, $8A, $0C, $2E, $24, $19, $15, $0A, $22, $0E, $1B, $24, $01, $24 ; PRG:$31B0 Bytes:01 CB 28 8A 0C 2E 24 19 15 0A 22 0E 1B 24 01 24 + .byte $2F, $28, $CF, $4A, $C7, $29, $0F, $4A, $C8, $28, $CE, $83, $C4, $C5, $C6, $28 ; PRG:$31C0 Bytes:2F 28 CF 4A C7 29 0F 4A C8 28 CE 83 C4 C5 C6 28 + .byte $F5, $04, $B2, $B3, $B4, $CC, $28, $D9, $83, $C9, $CA, $CB, $29, $A2, $45, $2E ; PRG:$31D0 Bytes:F5 04 B2 B3 B4 CC 28 D9 83 C9 CA CB 29 A2 45 2E + .byte $29, $B9, $45, $2F, $29, $A8, $0E, $0C, $15, $1E, $B8, $0C, $15, $1E, $B8, $15 ; PRG:$31E0 Bytes:29 B9 45 2F 29 A8 0E 0C 15 1E B8 0C 15 1E B8 15 + .byte $0A, $17, $0D, $B8, $B8, $29, $E4, $04, $2A, $2B, $2C, $2D, $29, $EE, $04, $B5 ; PRG:$31F0 Bytes:0A 17 0D B8 B8 29 E4 04 2A 2B 2C 2D 29 EE 04 B5 + .byte $B6, $B7, $B8, $29, $F8, $04, $B2, $B3, $B4, $CC, $60 ; PRG:$3200 Bytes:B6 B7 B8 29 F8 04 B2 B3 B4 CC 60 +;------------------------------------------------------------ +; ResourceAndLevelData +; +; Global: +; First-pass ResourceAndLevelData entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ResourceAndLevelData: + LDA $40 ; PRG:$320B Bytes:A5 40 + AND #$FB ; PRG:$320D Bytes:29 FB + STA PPUCTRL ; PRG:$320F Bytes:8D 00 20 + STA $40 ; PRG:$3212 Bytes:85 40 + LDX PPUSTATUS ; PRG:$3214 Bytes:AE 02 20 + LDY #$00 ; PRG:$3217 Bytes:A0 00 + BEQ PPUCommandReadNextByte_F249 ; PRG:$3219 Bytes:F0 2E + + +; Branch target inside the final five bytes of the preceding raw region. +; This is part of the PPU command-processing loop continued at $F220. +PPUCommandLoop_F21B: + PHA ; PRG:$321B Bytes:48 + STA PPUADDR ; PRG:$321C Bytes:8D 06 20 + INY ; PRG:$321F Bytes:C8 + +;------------------------------------------------------------ +; Resource, input, and collision code with embedded tables +; CPU $F220-$F7C0 +; PRG $3220-$37C0 +; +; Pass 1 recursively traced from verified entry roots in this region. +; Direct branches, jumps, and subroutine calls are decoded. +; Bytes not reached by that trace remain explicit .byte data. +;------------------------------------------------------------ + +;------------------------------------------------------------ +; ResourceInputCollisionCode +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ResourceInputCollisionCode: + LDA $0301,Y ; PRG:$3220 Bytes:B9 01 03 + STA PPUADDR ; PRG:$3223 Bytes:8D 06 20 + INY ; PRG:$3226 Bytes:C8 + LDA $0301,Y ; PRG:$3227 Bytes:B9 01 03 + AND #$3F ; PRG:$322A Bytes:29 3F + TAX ; PRG:$322C Bytes:AA +UpdateCommandBufferLoop_F22D: + INY ; PRG:$322D Bytes:C8 + LDA $0301,Y ; PRG:$322E Bytes:B9 01 03 + STA PPUDATA ; PRG:$3231 Bytes:8D 07 20 + DEX ; PRG:$3234 Bytes:CA + BNE UpdateCommandBufferLoop_F22D ; PRG:$3235 Bytes:D0 F6 + PLA ; PRG:$3237 Bytes:68 + CMP #$3F ; PRG:$3238 Bytes:C9 3F + BNE UpdateCommandBufferOnNonZero_F248 ; PRG:$323A Bytes:D0 0C + STA PPUADDR ; PRG:$323C Bytes:8D 06 20 + STX PPUADDR ; PRG:$323F Bytes:8E 06 20 + STX PPUADDR ; PRG:$3242 Bytes:8E 06 20 + STX PPUADDR ; PRG:$3245 Bytes:8E 06 20 +UpdateCommandBufferOnNonZero_F248: + INY ; PRG:$3248 Bytes:C8 +PPUCommandReadNextByte_F249: + LDA $0301,Y ; PRG:$3249 Bytes:B9 01 03 + BNE PPUCommandLoop_F21B ; PRG:$324C Bytes:D0 CD + LDA #$00 ; PRG:$324E Bytes:A9 00 + STA $0300 ; PRG:$3250 Bytes:8D 00 03 + STA $0301 ; PRG:$3253 Bytes:8D 01 03 + RTS ; PRG:$3256 Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F257 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F257: + LDA PPUSTATUS ; PRG:$3257 Bytes:AD 02 20 + LDA $40 ; PRG:$325A Bytes:A5 40 + AND #$FB ; PRG:$325C Bytes:29 FB + STA PPUCTRL ; PRG:$325E Bytes:8D 00 20 + STA $40 ; PRG:$3261 Bytes:85 40 + LDA #$1C ; PRG:$3263 Bytes:A9 1C + CLC ; PRG:$3265 Bytes:18 +EnginePathLoop_F266: + ADC #$04 ; PRG:$3266 Bytes:69 04 + DEC $01 ; PRG:$3268 Bytes:C6 01 + BNE EnginePathLoop_F266 ; PRG:$326A Bytes:D0 FA + STA $02 ; PRG:$326C Bytes:85 02 + STA PPUADDR ; PRG:$326E Bytes:8D 06 20 + LDA #$00 ; PRG:$3271 Bytes:A9 00 + STA PPUADDR ; PRG:$3273 Bytes:8D 06 20 + LDX #$04 ; PRG:$3276 Bytes:A2 04 + LDY #$00 ; PRG:$3278 Bytes:A0 00 + LDA WorkPtr0Lo ; PRG:$327A Bytes:A5 00 +EnginePathLoop_F27C: + STA PPUDATA ; PRG:$327C Bytes:8D 07 20 + DEY ; PRG:$327F Bytes:88 + BNE EnginePathLoop_F27C ; PRG:$3280 Bytes:D0 FA + DEX ; PRG:$3282 Bytes:CA + BNE EnginePathLoop_F27C ; PRG:$3283 Bytes:D0 F7 + LDA WorkPtr1Lo ; PRG:$3285 Bytes:A5 02 + ADC #$03 ; PRG:$3287 Bytes:69 03 + STA PPUADDR ; PRG:$3289 Bytes:8D 06 20 + LDA #$C0 ; PRG:$328C Bytes:A9 C0 + STA PPUADDR ; PRG:$328E Bytes:8D 06 20 + LDY #$40 ; PRG:$3291 Bytes:A0 40 + LDA #$00 ; PRG:$3293 Bytes:A9 00 +EnginePathLoop_F295: + STA PPUDATA ; PRG:$3295 Bytes:8D 07 20 + DEY ; PRG:$3298 Bytes:88 + BNE EnginePathLoop_F295 ; PRG:$3299 Bytes:D0 FA + RTS ; PRG:$329B Bytes:60 +EnginePathLoop_F29C: + PHA ; PRG:$329C Bytes:48 + STA PPUADDR ; PRG:$329D Bytes:8D 06 20 + INY ; PRG:$32A0 Bytes:C8 + LDA ($00),Y ; PRG:$32A1 Bytes:B1 00 + STA PPUADDR ; PRG:$32A3 Bytes:8D 06 20 + INY ; PRG:$32A6 Bytes:C8 + LDA ($00),Y ; PRG:$32A7 Bytes:B1 00 + ASL A ; PRG:$32A9 Bytes:0A + PHA ; PRG:$32AA Bytes:48 + LDA $40 ; PRG:$32AB Bytes:A5 40 + ORA #$04 ; PRG:$32AD Bytes:09 04 + BCS EnginePathOnCarry_F2B3 ; PRG:$32AF Bytes:B0 02 + AND #$FB ; PRG:$32B1 Bytes:29 FB +EnginePathOnCarry_F2B3: + STA PPUCTRL ; PRG:$32B3 Bytes:8D 00 20 + STA $40 ; PRG:$32B6 Bytes:85 40 + PLA ; PRG:$32B8 Bytes:68 + ASL A ; PRG:$32B9 Bytes:0A + BCC EnginePathOnNoCarry_F2BF ; PRG:$32BA Bytes:90 03 + ORA #$02 ; PRG:$32BC Bytes:09 02 + INY ; PRG:$32BE Bytes:C8 +EnginePathOnNoCarry_F2BF: + LSR A ; PRG:$32BF Bytes:4A + LSR A ; PRG:$32C0 Bytes:4A + TAX ; PRG:$32C1 Bytes:AA +EnginePathLoop_F2C2: + BCS EnginePathOnCarry_F2C5 ; PRG:$32C2 Bytes:B0 01 + INY ; PRG:$32C4 Bytes:C8 +EnginePathOnCarry_F2C5: + LDA ($00),Y ; PRG:$32C5 Bytes:B1 00 + STA PPUDATA ; PRG:$32C7 Bytes:8D 07 20 + DEX ; PRG:$32CA Bytes:CA + BNE EnginePathLoop_F2C2 ; PRG:$32CB Bytes:D0 F5 + PLA ; PRG:$32CD Bytes:68 + CMP #$3F ; PRG:$32CE Bytes:C9 3F + BNE EnginePathLoop_F2DE ; PRG:$32D0 Bytes:D0 0C + STA PPUADDR ; PRG:$32D2 Bytes:8D 06 20 + STX PPUADDR ; PRG:$32D5 Bytes:8E 06 20 + STX PPUADDR ; PRG:$32D8 Bytes:8E 06 20 + STX PPUADDR ; PRG:$32DB Bytes:8E 06 20 +EnginePathLoop_F2DE: + SEC ; PRG:$32DE Bytes:38 + TYA ; PRG:$32DF Bytes:98 + ADC $00 ; PRG:$32E0 Bytes:65 00 + STA $00 ; PRG:$32E2 Bytes:85 00 + LDA #$00 ; PRG:$32E4 Bytes:A9 00 + ADC $01 ; PRG:$32E6 Bytes:65 01 + STA $01 ; PRG:$32E8 Bytes:85 01 +;------------------------------------------------------------ +; ProcessResourceStateDispatch_F2EA +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateDispatch_F2EA: + LDX PPUSTATUS ; PRG:$32EA Bytes:AE 02 20 + LDY #$00 ; PRG:$32ED Bytes:A0 00 + LDA ($00),Y ; PRG:$32EF Bytes:B1 00 + BNE EnginePathOnNonZero_F2F4 ; PRG:$32F1 Bytes:D0 01 + RTS ; PRG:$32F3 Bytes:60 +EnginePathOnNonZero_F2F4: + CMP #$60 ; PRG:$32F4 Bytes:C9 60 + BNE EnginePathOnNonZero_F302 ; PRG:$32F6 Bytes:D0 0A + PLA ; PRG:$32F8 Bytes:68 + STA $01 ; PRG:$32F9 Bytes:85 01 + PLA ; PRG:$32FB Bytes:68 + STA $00 ; PRG:$32FC Bytes:85 00 + LDY #$02 ; PRG:$32FE Bytes:A0 02 + BNE EnginePathLoop_F2DE ; PRG:$3300 Bytes:D0 DC +EnginePathOnNonZero_F302: + CMP #$4C ; PRG:$3302 Bytes:C9 4C + BNE EnginePathLoop_F29C ; PRG:$3304 Bytes:D0 96 + LDA WorkPtr0Lo ; PRG:$3306 Bytes:A5 00 + PHA ; PRG:$3308 Bytes:48 + LDA WorkPtr0Hi ; PRG:$3309 Bytes:A5 01 + PHA ; PRG:$330B Bytes:48 + INY ; PRG:$330C Bytes:C8 + LDA ($00),Y ; PRG:$330D Bytes:B1 00 + TAX ; PRG:$330F Bytes:AA + INY ; PRG:$3310 Bytes:C8 + LDA ($00),Y ; PRG:$3311 Bytes:B1 00 + STA $01 ; PRG:$3313 Bytes:85 01 + STX $00 ; PRG:$3315 Bytes:86 00 + JMP ProcessResourceStateDispatch_F2EA ; PRG:$3317 Bytes:4C EA F2 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F31A +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F31A: + STA $00 ; PRG:$331A Bytes:85 00 + LDX $00 ; PRG:$331C Bytes:A6 00 + JSR UpdateCommandBufferRoutine_F32C ; PRG:$331E Bytes:20 2C F3 + LDA WorkPtr0Lo ; PRG:$3321 Bytes:A5 00 + LSR A ; PRG:$3323 Bytes:4A + LSR A ; PRG:$3324 Bytes:4A + LSR A ; PRG:$3325 Bytes:4A + LSR A ; PRG:$3326 Bytes:4A + TAX ; PRG:$3327 Bytes:AA + JSR UpdateCommandBufferRoutine_F32C ; PRG:$3328 Bytes:20 2C F3 + RTS ; PRG:$332B Bytes:60 +;------------------------------------------------------------ +; UpdateCommandBufferRoutine_F32C +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateCommandBufferRoutine_F32C: + INX ; PRG:$332C Bytes:E8 + TXA ; PRG:$332D Bytes:8A + AND #$0F ; PRG:$332E Bytes:29 0F + CMP #$09 ; PRG:$3330 Bytes:C9 09 + BCS EnginePathContinue_F3A0 ; PRG:$3332 Bytes:B0 6C + ASL A ; PRG:$3334 Bytes:0A + ASL A ; PRG:$3335 Bytes:0A + TAY ; PRG:$3336 Bytes:A8 + STA $02 ; PRG:$3337 Bytes:85 02 + LDX $0300 ; PRG:$3339 Bytes:AE 00 03 + LDA $0700,Y ; PRG:$333C Bytes:B9 00 07 + STA $0301,X ; PRG:$333F Bytes:9D 01 03 + JSR ProcessResourceStateRoutine_F3F5 ; PRG:$3342 Bytes:20 F5 F3 + INY ; PRG:$3345 Bytes:C8 + LDA $0700,Y ; PRG:$3346 Bytes:B9 00 07 + STA $0301,X ; PRG:$3349 Bytes:9D 01 03 + JSR ProcessResourceStateRoutine_F3F5 ; PRG:$334C Bytes:20 F5 F3 + INY ; PRG:$334F Bytes:C8 + LDA $0700,Y ; PRG:$3350 Bytes:B9 00 07 + AND #$07 ; PRG:$3353 Bytes:29 07 + STA $0301,X ; PRG:$3355 Bytes:9D 01 03 + STA $01 ; PRG:$3358 Bytes:85 01 + TXA ; PRG:$335A Bytes:8A + SEC ; PRG:$335B Bytes:38 + ADC $01 ; PRG:$335C Bytes:65 01 + JSR UpdateCommandBufferRoutine_F3F7 ; PRG:$335E Bytes:20 F7 F3 + TAX ; PRG:$3361 Bytes:AA + STX $0300 ; PRG:$3362 Bytes:8E 00 03 + LDA #$00 ; PRG:$3365 Bytes:A9 00 + STA $0301,X ; PRG:$3367 Bytes:9D 01 03 + INY ; PRG:$336A Bytes:C8 + LDA $0700,Y ; PRG:$336B Bytes:B9 00 07 + STA $03 ; PRG:$336E Bytes:85 03 +UpdateCommandBufferLoop_F370: + DEX ; PRG:$3370 Bytes:CA + LDA a:$0020,Y ; PRG:$3371 Bytes:B9 20 00 + AND #$0F ; PRG:$3374 Bytes:29 0F + STA $0301,X ; PRG:$3376 Bytes:9D 01 03 + DEC $01 ; PRG:$3379 Bytes:C6 01 + BEQ UpdateCommandBufferOnZero_F38F ; PRG:$337B Bytes:F0 12 + DEX ; PRG:$337D Bytes:CA + LDA a:$0020,Y ; PRG:$337E Bytes:B9 20 00 + AND #$F0 ; PRG:$3381 Bytes:29 F0 + LSR A ; PRG:$3383 Bytes:4A + LSR A ; PRG:$3384 Bytes:4A + LSR A ; PRG:$3385 Bytes:4A + LSR A ; PRG:$3386 Bytes:4A + STA $0301,X ; PRG:$3387 Bytes:9D 01 03 + DEY ; PRG:$338A Bytes:88 + DEC $01 ; PRG:$338B Bytes:C6 01 + BNE UpdateCommandBufferLoop_F370 ; PRG:$338D Bytes:D0 E1 +UpdateCommandBufferOnZero_F38F: + LDA $03 ; PRG:$338F Bytes:A5 03 + AND #$01 ; PRG:$3391 Bytes:29 01 + BEQ EnginePathContinue_F3A0 ; PRG:$3393 Bytes:F0 0B + LDY $02 ; PRG:$3395 Bytes:A4 02 + CLC ; PRG:$3397 Bytes:18 + LDA a:$0020,Y ; PRG:$3398 Bytes:B9 20 00 + ADC #$B1 ; PRG:$339B Bytes:69 B1 + STA $0301,X ; PRG:$339D Bytes:9D 01 03 +EnginePathContinue_F3A0: + RTS ; PRG:$33A0 Bytes:60 +;------------------------------------------------------------ +; UpdateCommandBufferRoutine_F3A1 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateCommandBufferRoutine_F3A1: + LDY #$00 ; PRG:$33A1 Bytes:A0 00 + LDA ($02),Y ; PRG:$33A3 Bytes:B1 02 + AND #$0F ; PRG:$33A5 Bytes:29 0F + STA $05 ; PRG:$33A7 Bytes:85 05 + LDA ($02),Y ; PRG:$33A9 Bytes:B1 02 + LSR A ; PRG:$33AB Bytes:4A + LSR A ; PRG:$33AC Bytes:4A + LSR A ; PRG:$33AD Bytes:4A + LSR A ; PRG:$33AE Bytes:4A + STA $04 ; PRG:$33AF Bytes:85 04 + LDX $0300 ; PRG:$33B1 Bytes:AE 00 03 +UpdateCommandBufferLoop_F3B4: + LDA WorkPtr0Hi ; PRG:$33B4 Bytes:A5 01 + STA $0301,X ; PRG:$33B6 Bytes:9D 01 03 + JSR ProcessResourceStateRoutine_F3F5 ; PRG:$33B9 Bytes:20 F5 F3 + LDA WorkPtr0Lo ; PRG:$33BC Bytes:A5 00 + STA $0301,X ; PRG:$33BE Bytes:9D 01 03 + JSR ProcessResourceStateRoutine_F3F5 ; PRG:$33C1 Bytes:20 F5 F3 + LDA $05 ; PRG:$33C4 Bytes:A5 05 + STA $06 ; PRG:$33C6 Bytes:85 06 + STA $0301,X ; PRG:$33C8 Bytes:9D 01 03 +UpdateCommandBufferLoop_F3CB: + JSR ProcessResourceStateRoutine_F3F5 ; PRG:$33CB Bytes:20 F5 F3 + INY ; PRG:$33CE Bytes:C8 + LDA ($02),Y ; PRG:$33CF Bytes:B1 02 + STA $0301,X ; PRG:$33D1 Bytes:9D 01 03 + DEC $06 ; PRG:$33D4 Bytes:C6 06 + BNE UpdateCommandBufferLoop_F3CB ; PRG:$33D6 Bytes:D0 F3 + JSR ProcessResourceStateRoutine_F3F5 ; PRG:$33D8 Bytes:20 F5 F3 + STX $0300 ; PRG:$33DB Bytes:8E 00 03 + CLC ; PRG:$33DE Bytes:18 + LDA #$20 ; PRG:$33DF Bytes:A9 20 + ADC $00 ; PRG:$33E1 Bytes:65 00 + STA $00 ; PRG:$33E3 Bytes:85 00 + LDA #$00 ; PRG:$33E5 Bytes:A9 00 + ADC $01 ; PRG:$33E7 Bytes:65 01 + STA $01 ; PRG:$33E9 Bytes:85 01 + DEC $04 ; PRG:$33EB Bytes:C6 04 + BNE UpdateCommandBufferLoop_F3B4 ; PRG:$33ED Bytes:D0 C5 + LDA #$00 ; PRG:$33EF Bytes:A9 00 + STA $0301,X ; PRG:$33F1 Bytes:9D 01 03 + RTS ; PRG:$33F4 Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F3F5 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F3F5: + INX ; PRG:$33F5 Bytes:E8 + TXA ; PRG:$33F6 Bytes:8A +;------------------------------------------------------------ +; UpdateCommandBufferRoutine_F3F7 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdateCommandBufferRoutine_F3F7: + CMP #$4E ; PRG:$33F7 Bytes:C9 4E + BCC EnginePathOnNoCarry_F407 ; PRG:$33F9 Bytes:90 0C + LDX $0300 ; PRG:$33FB Bytes:AE 00 03 + LDA #$00 ; PRG:$33FE Bytes:A9 00 + STA $0301,X ; PRG:$3400 Bytes:9D 01 03 + PLA ; PRG:$3403 Bytes:68 + PLA ; PRG:$3404 Bytes:68 + LDA #$01 ; PRG:$3405 Bytes:A9 01 +EnginePathOnNoCarry_F407: + RTS ; PRG:$3407 Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F408 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F408: + LDX #$FF ; PRG:$3408 Bytes:A2 FF + BNE EnginePathOnNonZero_F40E ; PRG:$340A Bytes:D0 02 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F40C +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F40C: + LDX #$00 ; PRG:$340C Bytes:A2 00 +EnginePathOnNonZero_F40E: + STX $04 ; PRG:$340E Bytes:86 04 + LDX #$00 ; PRG:$3410 Bytes:A2 00 + STX $05 ; PRG:$3412 Bytes:86 05 + STX $06 ; PRG:$3414 Bytes:86 06 + STX $07 ; PRG:$3416 Bytes:86 07 + LDA WorkPtr0Hi ; PRG:$3418 Bytes:A5 01 + AND #$08 ; PRG:$341A Bytes:29 08 + BNE EnginePathOnNonZero_F41F ; PRG:$341C Bytes:D0 01 + INX ; PRG:$341E Bytes:E8 +EnginePathOnNonZero_F41F: + LDA WorkPtr0Lo ; PRG:$341F Bytes:A5 00 + STA $06,X ; PRG:$3421 Bytes:95 06 + LDA WorkPtr0Hi ; PRG:$3423 Bytes:A5 01 + JSR ProcessResourceStateRoutine_F429 ; PRG:$3425 Bytes:20 29 F4 + RTS ; PRG:$3428 Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F429 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F429: + AND #$07 ; PRG:$3429 Bytes:29 07 + ASL A ; PRG:$342B Bytes:0A + ASL A ; PRG:$342C Bytes:0A + TAX ; PRG:$342D Bytes:AA + LDA $04 ; PRG:$342E Bytes:A5 04 + BEQ EnginePathOnZero_F459 ; PRG:$3430 Bytes:F0 27 + LDA $24,X ; PRG:$3432 Bytes:B5 24 + BEQ EnginePathOnZero_F45D ; PRG:$3434 Bytes:F0 27 +EnginePathLoop_F436: + CLC ; PRG:$3436 Bytes:18 + LDA $27,X ; PRG:$3437 Bytes:B5 27 + STA $03 ; PRG:$3439 Bytes:85 03 + LDA $07 ; PRG:$343B Bytes:A5 07 + JSR ProcessResourceStateRoutine_F4AE ; PRG:$343D Bytes:20 AE F4 + STA $27,X ; PRG:$3440 Bytes:95 27 + LDA $26,X ; PRG:$3442 Bytes:B5 26 + STA $03 ; PRG:$3444 Bytes:85 03 + LDA $06 ; PRG:$3446 Bytes:A5 06 + JSR ProcessResourceStateRoutine_F4AE ; PRG:$3448 Bytes:20 AE F4 + STA $26,X ; PRG:$344B Bytes:95 26 + LDA $25,X ; PRG:$344D Bytes:B5 25 + STA $03 ; PRG:$344F Bytes:85 03 + LDA $05 ; PRG:$3451 Bytes:A5 05 + JSR ProcessResourceStateRoutine_F4AE ; PRG:$3453 Bytes:20 AE F4 + STA $25,X ; PRG:$3456 Bytes:95 25 + RTS ; PRG:$3458 Bytes:60 +EnginePathOnZero_F459: + LDA $24,X ; PRG:$3459 Bytes:B5 24 + BEQ EnginePathLoop_F436 ; PRG:$345B Bytes:F0 D9 +EnginePathOnZero_F45D: + SEC ; PRG:$345D Bytes:38 + LDA $27,X ; PRG:$345E Bytes:B5 27 + STA $03 ; PRG:$3460 Bytes:85 03 + LDA $07 ; PRG:$3462 Bytes:A5 07 + JSR ProcessResourceStateRoutine_F4CF ; PRG:$3464 Bytes:20 CF F4 + STA $27,X ; PRG:$3467 Bytes:95 27 + LDA $26,X ; PRG:$3469 Bytes:B5 26 + STA $03 ; PRG:$346B Bytes:85 03 + LDA $06 ; PRG:$346D Bytes:A5 06 + JSR ProcessResourceStateRoutine_F4CF ; PRG:$346F Bytes:20 CF F4 + STA $26,X ; PRG:$3472 Bytes:95 26 + LDA $25,X ; PRG:$3474 Bytes:B5 25 + STA $03 ; PRG:$3476 Bytes:85 03 + LDA $05 ; PRG:$3478 Bytes:A5 05 + JSR ProcessResourceStateRoutine_F4CF ; PRG:$347A Bytes:20 CF F4 + STA $25,X ; PRG:$347D Bytes:95 25 + LDA $25,X ; PRG:$347F Bytes:B5 25 + BNE EnginePathOnNonZero_F48B ; PRG:$3481 Bytes:D0 08 + LDA $26,X ; PRG:$3483 Bytes:B5 26 + BNE EnginePathOnNonZero_F48B ; PRG:$3485 Bytes:D0 04 + LDA $27,X ; PRG:$3487 Bytes:B5 27 + BEQ EnginePathOnZero_F491 ; PRG:$3489 Bytes:F0 06 +EnginePathOnNonZero_F48B: + BCS EnginePathOnCarry_F4AD ; PRG:$348B Bytes:B0 20 + LDA $24,X ; PRG:$348D Bytes:B5 24 + EOR #$FF ; PRG:$348F Bytes:49 FF +EnginePathOnZero_F491: + STA $24,X ; PRG:$3491 Bytes:95 24 + SEC ; PRG:$3493 Bytes:38 + LDA #$00 ; PRG:$3494 Bytes:A9 00 + STA $03 ; PRG:$3496 Bytes:85 03 + LDA $27,X ; PRG:$3498 Bytes:B5 27 + JSR ProcessResourceStateRoutine_F4CF ; PRG:$349A Bytes:20 CF F4 + STA $27,X ; PRG:$349D Bytes:95 27 + LDA $26,X ; PRG:$349F Bytes:B5 26 + JSR ProcessResourceStateRoutine_F4CF ; PRG:$34A1 Bytes:20 CF F4 + STA $26,X ; PRG:$34A4 Bytes:95 26 + LDA $25,X ; PRG:$34A6 Bytes:B5 25 + JSR ProcessResourceStateRoutine_F4CF ; PRG:$34A8 Bytes:20 CF F4 + STA $25,X ; PRG:$34AB Bytes:95 25 +EnginePathOnCarry_F4AD: + RTS ; PRG:$34AD Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F4AE +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F4AE: + JSR ProcessResourceStateRoutine_F4F1 ; PRG:$34AE Bytes:20 F1 F4 + ADC $01 ; PRG:$34B1 Bytes:65 01 + CMP #$0A ; PRG:$34B3 Bytes:C9 0A + BCC EnginePathOnNoCarry_F4B9 ; PRG:$34B5 Bytes:90 02 + ADC #$05 ; PRG:$34B7 Bytes:69 05 +EnginePathOnNoCarry_F4B9: + CLC ; PRG:$34B9 Bytes:18 + ADC $02 ; PRG:$34BA Bytes:65 02 + STA $02 ; PRG:$34BC Bytes:85 02 + LDA $03 ; PRG:$34BE Bytes:A5 03 + AND #$F0 ; PRG:$34C0 Bytes:29 F0 + ADC $02 ; PRG:$34C2 Bytes:65 02 + BCC EnginePathOnNoCarry_F4CA ; PRG:$34C4 Bytes:90 04 +EnginePathLoop_F4C6: + ADC #$5F ; PRG:$34C6 Bytes:69 5F + SEC ; PRG:$34C8 Bytes:38 + RTS ; PRG:$34C9 Bytes:60 +EnginePathOnNoCarry_F4CA: + CMP #$A0 ; PRG:$34CA Bytes:C9 A0 + BCS EnginePathLoop_F4C6 ; PRG:$34CC Bytes:B0 F8 + RTS ; PRG:$34CE Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F4CF +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F4CF: + JSR ProcessResourceStateRoutine_F4F1 ; PRG:$34CF Bytes:20 F1 F4 + SBC $01 ; PRG:$34D2 Bytes:E5 01 + STA $01 ; PRG:$34D4 Bytes:85 01 + BCS EnginePathOnCarry_F4E2 ; PRG:$34D6 Bytes:B0 0A + ADC #$0A ; PRG:$34D8 Bytes:69 0A + STA $01 ; PRG:$34DA Bytes:85 01 + LDA WorkPtr1Lo ; PRG:$34DC Bytes:A5 02 + ADC #$0F ; PRG:$34DE Bytes:69 0F + STA $02 ; PRG:$34E0 Bytes:85 02 +EnginePathOnCarry_F4E2: + LDA $03 ; PRG:$34E2 Bytes:A5 03 + AND #$F0 ; PRG:$34E4 Bytes:29 F0 + SEC ; PRG:$34E6 Bytes:38 + SBC $02 ; PRG:$34E7 Bytes:E5 02 + BCS EnginePathOnCarry_F4EE ; PRG:$34E9 Bytes:B0 03 + ADC #$A0 ; PRG:$34EB Bytes:69 A0 + CLC ; PRG:$34ED Bytes:18 +EnginePathOnCarry_F4EE: + ORA $01 ; PRG:$34EE Bytes:05 01 + RTS ; PRG:$34F0 Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F4F1 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F4F1: + PHA ; PRG:$34F1 Bytes:48 + AND #$0F ; PRG:$34F2 Bytes:29 0F + STA $01 ; PRG:$34F4 Bytes:85 01 + PLA ; PRG:$34F6 Bytes:68 + AND #$F0 ; PRG:$34F7 Bytes:29 F0 + STA $02 ; PRG:$34F9 Bytes:85 02 + LDA $03 ; PRG:$34FB Bytes:A5 03 + AND #$0F ; PRG:$34FD Bytes:29 0F + RTS ; PRG:$34FF Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F500 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F500: + LDA #$00 ; PRG:$3500 Bytes:A9 00 + STA $04 ; PRG:$3502 Bytes:85 04 + CLC ; PRG:$3504 Bytes:18 + LDA WorkPtr0Lo ; PRG:$3505 Bytes:A5 00 + ADC #$10 ; PRG:$3507 Bytes:69 10 + AND #$F0 ; PRG:$3509 Bytes:29 F0 + LSR A ; PRG:$350B Bytes:4A + LSR A ; PRG:$350C Bytes:4A + TAY ; PRG:$350D Bytes:A8 + LDA WorkPtr0Lo ; PRG:$350E Bytes:A5 00 + AND #$07 ; PRG:$3510 Bytes:29 07 + ASL A ; PRG:$3512 Bytes:0A + ASL A ; PRG:$3513 Bytes:0A + TAX ; PRG:$3514 Bytes:AA +EnginePathLoop_F515: + LDA a:$0020,Y ; PRG:$3515 Bytes:B9 20 00 + BEQ EnginePathOnZero_F56B ; PRG:$3518 Bytes:F0 51 + LDA $24,X ; PRG:$351A Bytes:B5 24 + BEQ EnginePathLoop_F544 ; PRG:$351C Bytes:F0 26 +EnginePathLoop_F51E: + SEC ; PRG:$351E Bytes:38 + LDA a:$0023,Y ; PRG:$351F Bytes:B9 23 00 + STA $03 ; PRG:$3522 Bytes:85 03 + LDA $27,X ; PRG:$3524 Bytes:B5 27 + JSR ProcessResourceStateRoutine_F4CF ; PRG:$3526 Bytes:20 CF F4 + LDA a:$0022,Y ; PRG:$3529 Bytes:B9 22 00 + STA $03 ; PRG:$352C Bytes:85 03 + LDA $26,X ; PRG:$352E Bytes:B5 26 + JSR ProcessResourceStateRoutine_F4CF ; PRG:$3530 Bytes:20 CF F4 + LDA a:$0021,Y ; PRG:$3533 Bytes:B9 21 00 + STA $03 ; PRG:$3536 Bytes:85 03 + LDA $25,X ; PRG:$3538 Bytes:B5 25 + JSR ProcessResourceStateRoutine_F4CF ; PRG:$353A Bytes:20 CF F4 + BCS EnginePathOnCarry_F56F ; PRG:$353D Bytes:B0 30 + LDA a:$0020,Y ; PRG:$353F Bytes:B9 20 00 + BNE EnginePathOnNonZero_F574 ; PRG:$3542 Bytes:D0 30 +EnginePathLoop_F544: + LDA #$FF ; PRG:$3544 Bytes:A9 FF + STA $04 ; PRG:$3546 Bytes:85 04 + SEC ; PRG:$3548 Bytes:38 +EnginePathLoop_F549: + TYA ; PRG:$3549 Bytes:98 + BNE EnginePathContinue_F56A ; PRG:$354A Bytes:D0 1E + BCC EnginePathOnNoCarry_F55E ; PRG:$354C Bytes:90 10 + LDA $24,X ; PRG:$354E Bytes:B5 24 + STA $20 ; PRG:$3550 Bytes:85 20 + LDA $25,X ; PRG:$3552 Bytes:B5 25 + STA $21 ; PRG:$3554 Bytes:85 21 + LDA $26,X ; PRG:$3556 Bytes:B5 26 + STA $22 ; PRG:$3558 Bytes:85 22 + LDA $27,X ; PRG:$355A Bytes:B5 27 + STA $23 ; PRG:$355C Bytes:85 23 +EnginePathOnNoCarry_F55E: + LDA WorkPtr0Lo ; PRG:$355E Bytes:A5 00 + AND #$08 ; PRG:$3560 Bytes:29 08 + BEQ EnginePathContinue_F56A ; PRG:$3562 Bytes:F0 06 + DEX ; PRG:$3564 Bytes:CA + DEX ; PRG:$3565 Bytes:CA + DEX ; PRG:$3566 Bytes:CA + DEX ; PRG:$3567 Bytes:CA + BPL EnginePathLoop_F515 ; PRG:$3568 Bytes:10 AB +EnginePathContinue_F56A: + RTS ; PRG:$356A Bytes:60 +EnginePathOnZero_F56B: + LDA $24,X ; PRG:$356B Bytes:B5 24 + BEQ EnginePathLoop_F51E ; PRG:$356D Bytes:F0 AF +EnginePathOnCarry_F56F: + LDA a:$0020,Y ; PRG:$356F Bytes:B9 20 00 + BNE EnginePathLoop_F544 ; PRG:$3572 Bytes:D0 D0 +EnginePathOnNonZero_F574: + CLC ; PRG:$3574 Bytes:18 + BCC EnginePathLoop_F549 ; PRG:$3575 Bytes:90 D2 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F577 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F577: + LDX #$1E ; PRG:$3577 Bytes:A2 1E + DEC $50 ; PRG:$3579 Bytes:C6 50 + BPL EnginePathLoop_F583 ; PRG:$357B Bytes:10 06 + LDA #$0A ; PRG:$357D Bytes:A9 0A + STA $50 ; PRG:$357F Bytes:85 50 + LDX #$2E ; PRG:$3581 Bytes:A2 2E +EnginePathLoop_F583: + LDA $51,X ; PRG:$3583 Bytes:B5 51 + BEQ EnginePathOnZero_F589 ; PRG:$3585 Bytes:F0 02 + DEC $51,X ; PRG:$3587 Bytes:D6 51 +EnginePathOnZero_F589: + DEX ; PRG:$3589 Bytes:CA + BPL EnginePathLoop_F583 ; PRG:$358A Bytes:10 F7 + RTS ; PRG:$358C Bytes:60 +;------------------------------------------------------------ +; EnginePath_F58D +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +EnginePath_F58D: + LDA $10 ; PRG:$358D Bytes:A5 10 + AND #$02 ; PRG:$358F Bytes:29 02 + STA $00 ; PRG:$3591 Bytes:85 00 + LDA $11 ; PRG:$3593 Bytes:A5 11 + AND #$02 ; PRG:$3595 Bytes:29 02 + EOR $00 ; PRG:$3597 Bytes:45 00 + CLC ; PRG:$3599 Bytes:18 + BEQ EnginePathOnZero_F59D ; PRG:$359A Bytes:F0 01 + SEC ; PRG:$359C Bytes:38 +EnginePathOnZero_F59D: + ROR $10 ; PRG:$359D Bytes:66 10 + ROR $11 ; PRG:$359F Bytes:66 11 + ROR $12 ; PRG:$35A1 Bytes:66 12 + ROR $13 ; PRG:$35A3 Bytes:66 13 + ROR $14 ; PRG:$35A5 Bytes:66 14 + ROR $15 ; PRG:$35A7 Bytes:66 15 + ROR $16 ; PRG:$35A9 Bytes:66 16 + ROR $17 ; PRG:$35AB Bytes:66 17 + RTS ; PRG:$35AD Bytes:60 +;------------------------------------------------------------ +; EnginePath_F5AE +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +EnginePath_F5AE: + LDA #$01 ; PRG:$35AE Bytes:A9 01 + STA JOY1 ; PRG:$35B0 Bytes:8D 16 40 + LDX #$00 ; PRG:$35B3 Bytes:A2 00 + LDA #$00 ; PRG:$35B5 Bytes:A9 00 + STA JOY1 ; PRG:$35B7 Bytes:8D 16 40 + JSR ProcessResourceStateRoutine_F5BE ; PRG:$35BA Bytes:20 BE F5 + INX ; PRG:$35BD Bytes:E8 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F5BE +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F5BE: + LDY #$08 ; PRG:$35BE Bytes:A0 08 +EnginePathLoop_F5C0: + PHA ; PRG:$35C0 Bytes:48 + LDA JOY1,X ; PRG:$35C1 Bytes:BD 16 40 + STA $00 ; PRG:$35C4 Bytes:85 00 + LSR A ; PRG:$35C6 Bytes:4A + ORA $00 ; PRG:$35C7 Bytes:05 00 + LSR A ; PRG:$35C9 Bytes:4A + PLA ; PRG:$35CA Bytes:68 + ROL A ; PRG:$35CB Bytes:2A + DEY ; PRG:$35CC Bytes:88 + BNE EnginePathLoop_F5C0 ; PRG:$35CD Bytes:D0 F1 + LDY $44,X ; PRG:$35CF Bytes:B4 44 + STY $00 ; PRG:$35D1 Bytes:84 00 + PHA ; PRG:$35D3 Bytes:48 + STA $44,X ; PRG:$35D4 Bytes:95 44 + LDY $46,X ; PRG:$35D6 Bytes:B4 46 + AND #$3F ; PRG:$35D8 Bytes:29 3F + STA $46,X ; PRG:$35DA Bytes:95 46 + PLA ; PRG:$35DC Bytes:68 + ORA $00 ; PRG:$35DD Bytes:05 00 + EOR $00 ; PRG:$35DF Bytes:45 00 + AND #$C0 ; PRG:$35E1 Bytes:29 C0 + ORA $46,X ; PRG:$35E3 Bytes:15 46 + STA $46,X ; PRG:$35E5 Bytes:95 46 + TYA ; PRG:$35E7 Bytes:98 + AND #$0F ; PRG:$35E8 Bytes:29 0F + AND $46,X ; PRG:$35EA Bytes:35 46 + BEQ EnginePathOnZero_F5F4 ; PRG:$35EC Bytes:F0 06 + ORA #$F0 ; PRG:$35EE Bytes:09 F0 + AND $46,X ; PRG:$35F0 Bytes:35 46 + STA $46,X ; PRG:$35F2 Bytes:95 46 +EnginePathOnZero_F5F4: + RTS ; PRG:$35F4 Bytes:60 +EnginePathLoop_F5F5: + BMI EnginePathLoop_F600 ; PRG:$35F5 Bytes:30 09 + CPX #$F4 ; PRG:$35F7 Bytes:E0 F4 + BEQ EnginePathLoop_F600 ; PRG:$35F9 Bytes:F0 05 + LDA #$F4 ; PRG:$35FB Bytes:A9 F4 + JSR ProcessResourceStateRoutine_F6FB ; PRG:$35FD Bytes:20 FB F6 +EnginePathLoop_F600: + RTS ; PRG:$3600 Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F601 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F601: + LDY #$0B ; PRG:$3601 Bytes:A0 0B + LDA ($00),Y ; PRG:$3603 Bytes:B1 00 + STA $02 ; PRG:$3605 Bytes:85 02 + LDA #$02 ; PRG:$3607 Bytes:A9 02 + STA $03 ; PRG:$3609 Bytes:85 03 + LDY #$06 ; PRG:$360B Bytes:A0 06 + LDA ($00),Y ; PRG:$360D Bytes:B1 00 + STA $0B ; PRG:$360F Bytes:85 0B + LDY #$01 ; PRG:$3611 Bytes:A0 01 + LDA ($00),Y ; PRG:$3613 Bytes:B1 00 + TAX ; PRG:$3615 Bytes:AA + STA $08 ; PRG:$3616 Bytes:85 08 + DEY ; PRG:$3618 Bytes:88 + LDA ($00),Y ; PRG:$3619 Bytes:B1 00 + BNE EnginePathLoop_F5F5 ; PRG:$361B Bytes:D0 D8 + LDY #$0A ; PRG:$361D Bytes:A0 0A + LDA ($00),Y ; PRG:$361F Bytes:B1 00 + TAX ; PRG:$3621 Bytes:AA + LSR A ; PRG:$3622 Bytes:4A + LSR A ; PRG:$3623 Bytes:4A + LSR A ; PRG:$3624 Bytes:4A + LSR A ; PRG:$3625 Bytes:4A + BEQ EnginePathLoop_F600 ; PRG:$3626 Bytes:F0 D8 + STA $04 ; PRG:$3628 Bytes:85 04 + STA $06 ; PRG:$362A Bytes:85 06 + TXA ; PRG:$362C Bytes:8A + AND #$0F ; PRG:$362D Bytes:29 0F + BEQ EnginePathLoop_F600 ; PRG:$362F Bytes:F0 CF + STA $05 ; PRG:$3631 Bytes:85 05 + STA $07 ; PRG:$3633 Bytes:85 07 + LDY #$08 ; PRG:$3635 Bytes:A0 08 + LDA ($00),Y ; PRG:$3637 Bytes:B1 00 + AND #$C0 ; PRG:$3639 Bytes:29 C0 + INY ; PRG:$363B Bytes:C8 + ORA ($00),Y ; PRG:$363C Bytes:11 00 + STA $09 ; PRG:$363E Bytes:85 09 + LDY #$03 ; PRG:$3640 Bytes:A0 03 + LDA ($00),Y ; PRG:$3642 Bytes:B1 00 + STA $0A ; PRG:$3644 Bytes:85 0A + LDY #$02 ; PRG:$3646 Bytes:A0 02 + LDA $09 ; PRG:$3648 Bytes:A5 09 + CMP ($02),Y ; PRG:$364A Bytes:D1 02 + BNE EnginePathOnNonZero_F6B0 ; PRG:$364C Bytes:D0 62 + LDY #$00 ; PRG:$364E Bytes:A0 00 + LDA $08 ; PRG:$3650 Bytes:A5 08 + CMP ($02),Y ; PRG:$3652 Bytes:D1 02 + BEQ EnginePathOnZero_F659 ; PRG:$3654 Bytes:F0 03 + JSR ProcessResourceStateRoutine_F707 ; PRG:$3656 Bytes:20 07 F7 +EnginePathOnZero_F659: + LDY #$03 ; PRG:$3659 Bytes:A0 03 + LDA $0A ; PRG:$365B Bytes:A5 0A + CMP ($02),Y ; PRG:$365D Bytes:D1 02 + BEQ EnginePathOnZero_F677 ; PRG:$365F Bytes:F0 16 +EnginePathLoop_F661: + LDX $05 ; PRG:$3661 Bytes:A6 05 + STX $07 ; PRG:$3663 Bytes:86 07 +EnginePathLoop_F665: + LDX $04 ; PRG:$3665 Bytes:A6 04 +EnginePathLoop_F667: + STA ($02),Y ; PRG:$3667 Bytes:91 02 + INY ; PRG:$3669 Bytes:C8 + INY ; PRG:$366A Bytes:C8 + INY ; PRG:$366B Bytes:C8 + INY ; PRG:$366C Bytes:C8 + DEX ; PRG:$366D Bytes:CA + BNE EnginePathLoop_F667 ; PRG:$366E Bytes:D0 F7 + CLC ; PRG:$3670 Bytes:18 + ADC #$08 ; PRG:$3671 Bytes:69 08 + DEC $07 ; PRG:$3673 Bytes:C6 07 + BNE EnginePathLoop_F665 ; PRG:$3675 Bytes:D0 EE +EnginePathOnZero_F677: + LDY #$05 ; PRG:$3677 Bytes:A0 05 + LDA ($00),Y ; PRG:$3679 Bytes:B1 00 + STA $08 ; PRG:$367B Bytes:85 08 + LDA #$00 ; PRG:$367D Bytes:A9 00 + LDX $0B ; PRG:$367F Bytes:A6 0B + CLC ; PRG:$3681 Bytes:18 +EnginePathLoop_F682: + ADC $08 ; PRG:$3682 Bytes:65 08 + DEX ; PRG:$3684 Bytes:CA + BNE EnginePathLoop_F682 ; PRG:$3685 Bytes:D0 FB + LDY #$07 ; PRG:$3687 Bytes:A0 07 + ADC ($00),Y ; PRG:$3689 Bytes:71 00 + TAX ; PRG:$368B Bytes:AA + LDY #$01 ; PRG:$368C Bytes:A0 01 + LDA #$FF ; PRG:$368E Bytes:A9 FF + STA $0A ; PRG:$3690 Bytes:85 0A + BIT $09 ; PRG:$3692 Bytes:24 09 + BMI EnginePathOnNegative_F6BE ; PRG:$3694 Bytes:30 28 + BVS EnginePathOnOverflowSet_F6C0 ; PRG:$3696 Bytes:70 28 + LDA #$01 ; PRG:$3698 Bytes:A9 01 + STA $0A ; PRG:$369A Bytes:85 0A +EnginePathLoop_F69C: + TXA ; PRG:$369C Bytes:8A + CMP ($02),Y ; PRG:$369D Bytes:D1 02 + BEQ EnginePathOnZero_F6AF ; PRG:$369F Bytes:F0 0E + LDX $0B ; PRG:$36A1 Bytes:A6 0B +EnginePathLoop_F6A3: + STA ($02),Y ; PRG:$36A3 Bytes:91 02 + CLC ; PRG:$36A5 Bytes:18 + ADC $0A ; PRG:$36A6 Bytes:65 0A + INY ; PRG:$36A8 Bytes:C8 + INY ; PRG:$36A9 Bytes:C8 + INY ; PRG:$36AA Bytes:C8 + INY ; PRG:$36AB Bytes:C8 + DEX ; PRG:$36AC Bytes:CA + BNE EnginePathLoop_F6A3 ; PRG:$36AD Bytes:D0 F4 +EnginePathOnZero_F6AF: + RTS ; PRG:$36AF Bytes:60 +EnginePathOnNonZero_F6B0: + JSR ProcessResourceStateRoutine_F6FB ; PRG:$36B0 Bytes:20 FB F6 + LDY #$00 ; PRG:$36B3 Bytes:A0 00 + JSR ProcessResourceStateRoutine_F707 ; PRG:$36B5 Bytes:20 07 F7 + LDA $0A ; PRG:$36B8 Bytes:A5 0A + LDY #$03 ; PRG:$36BA Bytes:A0 03 + BNE EnginePathLoop_F661 ; PRG:$36BC Bytes:D0 A3 +EnginePathOnNegative_F6BE: + BVC EnginePathOnOverflowClear_F6D4 ; PRG:$36BE Bytes:50 14 +EnginePathOnOverflowSet_F6C0: + TXA ; PRG:$36C0 Bytes:8A + ADC $0B ; PRG:$36C1 Bytes:65 0B + TAX ; PRG:$36C3 Bytes:AA + DEX ; PRG:$36C4 Bytes:CA + ASL $09 ; PRG:$36C5 Bytes:06 09 + BCS EnginePathLoop_F69C ; PRG:$36C7 Bytes:B0 D3 + LDA #$01 ; PRG:$36C9 Bytes:A9 01 + STA $0A ; PRG:$36CB Bytes:85 0A + LDA #$00 ; PRG:$36CD Bytes:A9 00 + SEC ; PRG:$36CF Bytes:38 + SBC $06 ; PRG:$36D0 Bytes:E5 06 + STA $06 ; PRG:$36D2 Bytes:85 06 +EnginePathOnOverflowClear_F6D4: + TXA ; PRG:$36D4 Bytes:8A + LDX $04 ; PRG:$36D5 Bytes:A6 04 + CLC ; PRG:$36D7 Bytes:18 + ADC $06 ; PRG:$36D8 Bytes:65 06 + CLC ; PRG:$36DA Bytes:18 + ADC $0A ; PRG:$36DB Bytes:65 0A + CMP ($02),Y ; PRG:$36DD Bytes:D1 02 + BNE EnginePathOnNonZero_F6E7 ; PRG:$36DF Bytes:D0 06 + RTS ; PRG:$36E1 Bytes:60 +EnginePathLoop_F6E2: + LDX $04 ; PRG:$36E2 Bytes:A6 04 +EnginePathLoop_F6E4: + CLC ; PRG:$36E4 Bytes:18 + ADC $0A ; PRG:$36E5 Bytes:65 0A +EnginePathOnNonZero_F6E7: + STA ($02),Y ; PRG:$36E7 Bytes:91 02 + INY ; PRG:$36E9 Bytes:C8 + INY ; PRG:$36EA Bytes:C8 + INY ; PRG:$36EB Bytes:C8 + INY ; PRG:$36EC Bytes:C8 + DEX ; PRG:$36ED Bytes:CA + BNE EnginePathLoop_F6E4 ; PRG:$36EE Bytes:D0 F4 + CLC ; PRG:$36F0 Bytes:18 + ADC $06 ; PRG:$36F1 Bytes:65 06 + CLC ; PRG:$36F3 Bytes:18 + ADC $06 ; PRG:$36F4 Bytes:65 06 + DEC $05 ; PRG:$36F6 Bytes:C6 05 + BNE EnginePathLoop_F6E2 ; PRG:$36F8 Bytes:D0 E8 + RTS ; PRG:$36FA Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F6FB +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F6FB: + LDX $0B ; PRG:$36FB Bytes:A6 0B +EnginePathLoop_F6FD: + STA ($02),Y ; PRG:$36FD Bytes:91 02 + INY ; PRG:$36FF Bytes:C8 + INY ; PRG:$3700 Bytes:C8 + INY ; PRG:$3701 Bytes:C8 + INY ; PRG:$3702 Bytes:C8 + DEX ; PRG:$3703 Bytes:CA + BNE EnginePathLoop_F6FD ; PRG:$3704 Bytes:D0 F7 + RTS ; PRG:$3706 Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F707 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F707: + LDA $08 ; PRG:$3707 Bytes:A5 08 + LDX $04 ; PRG:$3709 Bytes:A6 04 +EnginePathLoop_F70B: + STA ($02),Y ; PRG:$370B Bytes:91 02 + INY ; PRG:$370D Bytes:C8 + INY ; PRG:$370E Bytes:C8 + INY ; PRG:$370F Bytes:C8 + INY ; PRG:$3710 Bytes:C8 + CLC ; PRG:$3711 Bytes:18 + ADC #$08 ; PRG:$3712 Bytes:69 08 + DEX ; PRG:$3714 Bytes:CA + BNE EnginePathLoop_F70B ; PRG:$3715 Bytes:D0 F4 + DEC $07 ; PRG:$3717 Bytes:C6 07 +;------------------------------------------------------------ +; EnginePath_F719 +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +EnginePath_F719: + BNE ProcessResourceStateRoutine_F707 ; PRG:$3719 Bytes:D0 EC + RTS ; PRG:$371B Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F71C +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F71C: + CLC ; PRG:$371C Bytes:18 + LDY #$00 ; PRG:$371D Bytes:A0 00 + LDA ($00),Y ; PRG:$371F Bytes:B1 00 + BNE EnginePathContinue_F77C ; PRG:$3721 Bytes:D0 59 + LDA ($02),Y ; PRG:$3723 Bytes:B1 02 + BNE EnginePathContinue_F77C ; PRG:$3725 Bytes:D0 55 + LDY #$0C ; PRG:$3727 Bytes:A0 0C + LDA ($02),Y ; PRG:$3729 Bytes:B1 02 + LDY #$01 ; PRG:$372B Bytes:A0 01 + ADC ($02),Y ; PRG:$372D Bytes:71 02 + STA $04 ; PRG:$372F Bytes:85 04 + LDA ($00),Y ; PRG:$3731 Bytes:B1 00 + LDY #$0E ; PRG:$3733 Bytes:A0 0E + CLC ; PRG:$3735 Bytes:18 + ADC ($00),Y ; PRG:$3736 Bytes:71 00 + CMP $04 ; PRG:$3738 Bytes:C5 04 + BCC EnginePathContinue_F77C ; PRG:$373A Bytes:90 40 + LDY #$0C ; PRG:$373C Bytes:A0 0C + LDA ($00),Y ; PRG:$373E Bytes:B1 00 + LDY #$01 ; PRG:$3740 Bytes:A0 01 + CLC ; PRG:$3742 Bytes:18 + ADC ($00),Y ; PRG:$3743 Bytes:71 00 + STA $04 ; PRG:$3745 Bytes:85 04 + LDA ($02),Y ; PRG:$3747 Bytes:B1 02 + LDY #$0E ; PRG:$3749 Bytes:A0 0E + CLC ; PRG:$374B Bytes:18 + ADC ($02),Y ; PRG:$374C Bytes:71 02 + CMP $04 ; PRG:$374E Bytes:C5 04 + BCC EnginePathContinue_F77C ; PRG:$3750 Bytes:90 2A + LDY #$0D ; PRG:$3752 Bytes:A0 0D + LDA ($02),Y ; PRG:$3754 Bytes:B1 02 + LDY #$03 ; PRG:$3756 Bytes:A0 03 + CLC ; PRG:$3758 Bytes:18 + ADC ($02),Y ; PRG:$3759 Bytes:71 02 + STA $04 ; PRG:$375B Bytes:85 04 + LDA ($00),Y ; PRG:$375D Bytes:B1 00 + LDY #$0F ; PRG:$375F Bytes:A0 0F + CLC ; PRG:$3761 Bytes:18 + ADC ($00),Y ; PRG:$3762 Bytes:71 00 + CMP $04 ; PRG:$3764 Bytes:C5 04 + BCC EnginePathContinue_F77C ; PRG:$3766 Bytes:90 14 + LDY #$0D ; PRG:$3768 Bytes:A0 0D + LDA ($00),Y ; PRG:$376A Bytes:B1 00 + LDY #$03 ; PRG:$376C Bytes:A0 03 + CLC ; PRG:$376E Bytes:18 + ADC ($00),Y ; PRG:$376F Bytes:71 00 + STA $04 ; PRG:$3771 Bytes:85 04 + LDA ($02),Y ; PRG:$3773 Bytes:B1 02 + LDY #$0F ; PRG:$3775 Bytes:A0 0F + CLC ; PRG:$3777 Bytes:18 + ADC ($02),Y ; PRG:$3778 Bytes:71 02 + CMP $04 ; PRG:$377A Bytes:C5 04 +EnginePathContinue_F77C: + RTS ; PRG:$377C Bytes:60 +;------------------------------------------------------------ +; ProcessResourceStateRoutine_F77D +; +; Global: +; First-pass resource/input/collision entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessResourceStateRoutine_F77D: + STA $00 ; PRG:$377D Bytes:85 00 + STX $01 ; PRG:$377F Bytes:86 01 + LDY #$04 ; PRG:$3781 Bytes:A0 04 + LDA ($00),Y ; PRG:$3783 Bytes:B1 00 + STA $03 ; PRG:$3785 Bytes:85 03 + DEY ; PRG:$3787 Bytes:88 + LDA ($00),Y ; PRG:$3788 Bytes:B1 00 + STA $02 ; PRG:$378A Bytes:85 02 + DEY ; PRG:$378C Bytes:88 + LDA ($00),Y ; PRG:$378D Bytes:B1 00 + STA $05 ; PRG:$378F Bytes:85 05 + DEY ; PRG:$3791 Bytes:88 + LDA ($00),Y ; PRG:$3792 Bytes:B1 00 + STA $04 ; PRG:$3794 Bytes:85 04 + DEY ; PRG:$3796 Bytes:88 + LDA ($00),Y ; PRG:$3797 Bytes:B1 00 + STA $06 ; PRG:$3799 Bytes:85 06 + LDA #$05 ; PRG:$379B Bytes:A9 05 +EnginePathLoop_F79D: + CLC ; PRG:$379D Bytes:18 + ADC a:$0000,Y ; PRG:$379E Bytes:79 00 00 + STA a:$0000,Y ; PRG:$37A1 Bytes:99 00 00 + LDA #$00 ; PRG:$37A4 Bytes:A9 00 + ADC a:$0001,Y ; PRG:$37A6 Bytes:79 01 00 + STA a:$0001,Y ; PRG:$37A9 Bytes:99 01 00 + LDY #$00 ; PRG:$37AC Bytes:A0 00 + LDX $05 ; PRG:$37AE Bytes:A6 05 +EnginePathLoop_F7B0: + LDA ($00),Y ; PRG:$37B0 Bytes:B1 00 + STA ($02),Y ; PRG:$37B2 Bytes:91 02 + INY ; PRG:$37B4 Bytes:C8 + DEX ; PRG:$37B5 Bytes:CA + BNE EnginePathLoop_F7B0 ; PRG:$37B6 Bytes:D0 F8 + LDA $06 ; PRG:$37B8 Bytes:A5 06 + LDY #$02 ; PRG:$37BA Bytes:A0 02 + DEC $04 ; PRG:$37BC Bytes:C6 04 + BNE EnginePathLoop_F79D ; PRG:$37BE Bytes:D0 DD + RTS ; PRG:$37C0 Bytes:60 + +;------------------------------------------------------------ +; Audio driver code and embedded tables +; CPU $F7C1-$FC77 +; PRG $37C1-$3C77 +; +; Pass 1 recursively traced from AudioDriverCode ($F7C1). +; Direct branches, jumps, and subroutine calls are decoded. +; Bytes not reached by that trace remain explicit .byte data. +;------------------------------------------------------------ + +;------------------------------------------------------------ +; AudioDriverCode +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +AudioDriverCode: + LDA #$FF ; PRG:$37C1 Bytes:A9 FF + STA JOY2 ; PRG:$37C3 Bytes:8D 17 40 + JSR ProcessAudioStateRoutine_F898 ; PRG:$37C6 Bytes:20 98 F8 + JSR ProcessAudioStateRoutine_FA2E ; PRG:$37C9 Bytes:20 2E FA + JSR ProcessAudioStateRoutine_FACF ; PRG:$37CC Bytes:20 CF FA + JSR ProcessAudioStateRoutine_FB22 ; PRG:$37CF Bytes:20 22 FB + LDA #$00 ; PRG:$37D2 Bytes:A9 00 + STA AudioRequest4 ; PRG:$37D4 Bytes:85 FF + STA AudioRequest3 ; PRG:$37D6 Bytes:85 FE + STA AudioRequest1 ; PRG:$37D8 Bytes:85 FC + STA AudioRequest0 ; PRG:$37DA Bytes:85 FB + LDY $07FE ; PRG:$37DC Bytes:AC FE 07 + LDA AudioNoiseState ; PRG:$37DF Bytes:A5 F3 + AND #$1C ; PRG:$37E1 Bytes:29 1C + BEQ AudioPathOnZero_F7EC ; PRG:$37E3 Bytes:F0 07 + INC $07FE ; PRG:$37E5 Bytes:EE FE 07 + CPY #$50 ; PRG:$37E8 Bytes:C0 50 + BCC AudioPathContinue_F7F2 ; PRG:$37EA Bytes:90 06 +AudioPathOnZero_F7EC: + TYA ; PRG:$37EC Bytes:98 + BEQ AudioPathContinue_F7F2 ; PRG:$37ED Bytes:F0 03 + DEC $07FE ; PRG:$37EF Bytes:CE FE 07 +AudioPathContinue_F7F2: + STY $4011 ; PRG:$37F2 Bytes:8C 11 40 + RTS ; PRG:$37F5 Bytes:60 +;------------------------------------------------------------ +; UpdatePulse1Routine_F7F6 +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdatePulse1Routine_F7F6: + STX SQ1_VOL ; PRG:$37F6 Bytes:8E 00 40 + STY SQ1_SWEEP ; PRG:$37F9 Bytes:8C 01 40 + RTS ; PRG:$37FC Bytes:60 +;------------------------------------------------------------ +; ProcessAudioStateRoutine_F7FD +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessAudioStateRoutine_F7FD: + JSR UpdatePulse1Routine_F7F6 ; PRG:$37FD Bytes:20 F6 F7 +;------------------------------------------------------------ +; ProcessAudioStateRoutine_F800 +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessAudioStateRoutine_F800: + LDX #$00 ; PRG:$3800 Bytes:A2 00 +UpdatePulse1Loop_F802: + TAY ; PRG:$3802 Bytes:A8 + LDA $FF01,Y ; PRG:$3803 Bytes:B9 01 FF + BEQ AudioPathOnZero_F813 ; PRG:$3806 Bytes:F0 0B + STA SQ1_LO,X ; PRG:$3808 Bytes:9D 02 40 + LDA $FF00,Y ; PRG:$380B Bytes:B9 00 FF + ORA #$08 ; PRG:$380E Bytes:09 08 + STA SQ1_HI,X ; PRG:$3810 Bytes:9D 03 40 +AudioPathOnZero_F813: + RTS ; PRG:$3813 Bytes:60 +;------------------------------------------------------------ +; ProcessAudioStateRoutine_F814 +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessAudioStateRoutine_F814: + LDX #$04 ; PRG:$3814 Bytes:A2 04 + BNE UpdatePulse1Loop_F802 ; PRG:$3816 Bytes:D0 EA +;------------------------------------------------------------ +; ProcessAudioStateRoutine_F818 +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessAudioStateRoutine_F818: + LDX #$08 ; PRG:$3818 Bytes:A2 08 + BNE UpdatePulse1Loop_F802 ; PRG:$381A Bytes:D0 E6 + STY $7E85 ; PRG:$381C Bytes:8C 85 7E + .byte $77, $70, $69, $62, $5B, $54, $4D, $46, $3F, $38, $31, $2A, $23, $04, $0E, $04 ; PRG:$381F Bytes:77 70 69 62 5B 54 4D 46 3F 38 31 2A 23 04 0E 04 + .byte $2E, $0E, $2E, $2C, $0E, $2C, $2A, $0E, $2A, $28, $2C, $28, $26, $91, $91, $51 ; PRG:$382F Bytes:2E 0E 2E 2C 0E 2C 2A 0E 2A 28 2C 28 26 91 91 51 + .byte $92, $92, $92, $53, $93, $93, $93, $54, $94, $94, $54, $54, $95, $95, $95, $55 ; PRG:$383F Bytes:92 92 92 53 93 93 93 54 94 94 54 54 95 95 95 55 + .byte $95, $95, $96, $56, $96, $96, $97, $57, $97, $97, $57, $57, $98, $98, $98, $58 ; PRG:$384F Bytes:95 95 96 56 96 96 97 57 97 97 57 57 98 98 98 58 + .byte $98, $99, $99, $59, $9A, $9A, $9B, $5C, $9D, $9E, $5A, $5A ; PRG:$385F Bytes:98 99 99 59 9A 9A 9B 5C 9D 9E 5A 5A +AudioPathLoop_F86B: + STY AudioPulse1State ; PRG:$386B Bytes:84 F0 + LDA #$8C ; PRG:$386D Bytes:A9 8C + STA AudioPeriodOrEnvelope ; PRG:$386F Bytes:85 F4 +AudioPathLoop_F871: + LDA AudioPeriodOrEnvelope ; PRG:$3871 Bytes:A5 F4 + LDY #$10 ; PRG:$3873 Bytes:A0 10 +AudioPathLoop_F875: + CMP $F81B,Y ; PRG:$3875 Bytes:D9 1B F8 + BNE AudioPathOnNonZero_F881 ; PRG:$3878 Bytes:D0 07 + LDA $F82B,Y ; PRG:$387A Bytes:B9 2B F8 + LDY #$7F ; PRG:$387D Bytes:A0 7F + BNE AudioPathOnNonZero_F890 ; PRG:$387F Bytes:D0 0F +AudioPathOnNonZero_F881: + DEY ; PRG:$3881 Bytes:88 + BNE AudioPathLoop_F875 ; PRG:$3882 Bytes:D0 F1 + CMP #$16 ; PRG:$3884 Bytes:C9 16 + BCS AudioPathContinue_F895 ; PRG:$3886 Bytes:B0 0D + AND #$03 ; PRG:$3888 Bytes:29 03 + BNE AudioPathContinue_F895 ; PRG:$388A Bytes:D0 09 + LDY #$A3 ; PRG:$388C Bytes:A0 A3 + LDA #$2A ; PRG:$388E Bytes:A9 2A +AudioPathOnNonZero_F890: + LDX #$9F ; PRG:$3890 Bytes:A2 9F + JSR ProcessAudioStateRoutine_F7FD ; PRG:$3892 Bytes:20 FD F7 +AudioPathContinue_F895: + JMP ProcessAudioStateDispatch_F9CB ; PRG:$3895 Bytes:4C CB F9 +;------------------------------------------------------------ +; ProcessAudioStateRoutine_F898 +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessAudioStateRoutine_F898: + LDY AudioRequest4 ; PRG:$3898 Bytes:A4 FF + LDA $F0 ; PRG:$389A Bytes:A5 F0 + LSR AudioRequest4 ; PRG:$389C Bytes:46 FF + BCS AudioPathLoop_F86B ; PRG:$389E Bytes:B0 CB + LSR A ; PRG:$38A0 Bytes:4A + BCS AudioPathLoop_F871 ; PRG:$38A1 Bytes:B0 CE + LSR AudioRequest4 ; PRG:$38A3 Bytes:46 FF + BCC UpdatePulse1OnNoCarry_F8F9 ; PRG:$38A5 Bytes:90 52 + STY AudioPulse1State ; PRG:$38A7 Bytes:84 F0 + LDA #$2F ; PRG:$38A9 Bytes:A9 2F + STA $07F4 ; PRG:$38AB Bytes:8D F4 07 + LDX #$5F ; PRG:$38AE Bytes:A2 5F + LDY #$93 ; PRG:$38B0 Bytes:A0 93 + JSR UpdatePulse1Routine_F7F6 ; PRG:$38B2 Bytes:20 F6 F7 +AudioPathLoop_F8B5: + LDA $07F4 ; PRG:$38B5 Bytes:AD F4 07 + CMP #$C0 ; PRG:$38B8 Bytes:C9 C0 + BCC AudioPathOnNoCarry_F8BD ; PRG:$38BA Bytes:90 01 + LSR A ; PRG:$38BC Bytes:4A +AudioPathOnNoCarry_F8BD: + LSR A ; PRG:$38BD Bytes:4A + LSR A ; PRG:$38BE Bytes:4A + LSR A ; PRG:$38BF Bytes:4A + LSR A ; PRG:$38C0 Bytes:4A + CLC ; PRG:$38C1 Bytes:18 + ADC $07F4 ; PRG:$38C2 Bytes:6D F4 07 + BCC UpdatePulse1OnNoCarry_F8EA ; PRG:$38C5 Bytes:90 23 +AudioPathLoop_F8C7: + JMP ProcessAudioStateDispatch_F9CF ; PRG:$38C7 Bytes:4C CF F9 +AudioPathLoop_F8CA: + STY AudioPulse1State ; PRG:$38CA Bytes:84 F0 + LDA #$FE ; PRG:$38CC Bytes:A9 FE + STA $07F4 ; PRG:$38CE Bytes:8D F4 07 + LDX #$5C ; PRG:$38D1 Bytes:A2 5C + LDY #$BA ; PRG:$38D3 Bytes:A0 BA + JSR UpdatePulse1Routine_F7F6 ; PRG:$38D5 Bytes:20 F6 F7 +AudioPathLoop_F8D8: + LDA $07F4 ; PRG:$38D8 Bytes:AD F4 07 + LSR A ; PRG:$38DB Bytes:4A + LSR A ; PRG:$38DC Bytes:4A + LSR A ; PRG:$38DD Bytes:4A + BNE AudioPathOnNonZero_F8E2 ; PRG:$38DE Bytes:D0 02 + LDA #$01 ; PRG:$38E0 Bytes:A9 01 +AudioPathOnNonZero_F8E2: + EOR #$FF ; PRG:$38E2 Bytes:49 FF + SEC ; PRG:$38E4 Bytes:38 + ADC $07F4 ; PRG:$38E5 Bytes:6D F4 07 + BCC AudioPathLoop_F8C7 ; PRG:$38E8 Bytes:90 DD +UpdatePulse1OnNoCarry_F8EA: + STA $07F4 ; PRG:$38EA Bytes:8D F4 07 + ROL A ; PRG:$38ED Bytes:2A + ROL A ; PRG:$38EE Bytes:2A + STA SQ1_LO ; PRG:$38EF Bytes:8D 02 40 + ROL A ; PRG:$38F2 Bytes:2A + AND #$03 ; PRG:$38F3 Bytes:29 03 + STA SQ1_HI ; PRG:$38F5 Bytes:8D 03 40 + RTS ; PRG:$38F8 Bytes:60 +UpdatePulse1OnNoCarry_F8F9: + LSR A ; PRG:$38F9 Bytes:4A + BCS AudioPathLoop_F8B5 ; PRG:$38FA Bytes:B0 B9 + LSR AudioRequest4 ; PRG:$38FC Bytes:46 FF + BCS AudioPathLoop_F8CA ; PRG:$38FE Bytes:B0 CA + LSR A ; PRG:$3900 Bytes:4A + BCS AudioPathLoop_F8D8 ; PRG:$3901 Bytes:B0 D5 + LSR AudioRequest4 ; PRG:$3903 Bytes:46 FF + BCC UpdatePulse1OnNoCarry_F95F ; PRG:$3905 Bytes:90 58 + STY AudioPulse1State ; PRG:$3907 Bytes:84 F0 + LDA #$3A ; PRG:$3909 Bytes:A9 3A + STA AudioPeriodOrEnvelope ; PRG:$390B Bytes:85 F4 + LDA #$6A ; PRG:$390D Bytes:A9 6A + STA $07F4 ; PRG:$390F Bytes:8D F4 07 + LDA #$82 ; PRG:$3912 Bytes:A9 82 + STA SQ1_SWEEP ; PRG:$3914 Bytes:8D 01 40 +UpdatePulse1Loop_F917: + LDA AudioPeriodOrEnvelope ; PRG:$3917 Bytes:A5 F4 + CMP #$34 ; PRG:$3919 Bytes:C9 34 + BCC UpdatePulse1OnNoCarry_F935 ; PRG:$391B Bytes:90 18 + BEQ UpdatePulse1OnZero_F92B ; PRG:$391D Bytes:F0 0C + ORA #$90 ; PRG:$391F Bytes:09 90 + STA SQ1_VOL ; PRG:$3921 Bytes:8D 00 40 + LDA $07F4 ; PRG:$3924 Bytes:AD F4 07 + SBC #$FC ; PRG:$3927 Bytes:E9 FC + BNE UpdatePulse1OnNonZero_F94D ; PRG:$3929 Bytes:D0 22 +UpdatePulse1OnZero_F92B: + LDX #$FF ; PRG:$392B Bytes:A2 FF + STX $07F4 ; PRG:$392D Bytes:8E F4 07 + LDY #$8C ; PRG:$3930 Bytes:A0 8C + STY SQ1_SWEEP ; PRG:$3932 Bytes:8C 01 40 +UpdatePulse1OnNoCarry_F935: + LSR A ; PRG:$3935 Bytes:4A + LSR A ; PRG:$3936 Bytes:4A + ORA #$90 ; PRG:$3937 Bytes:09 90 + STA SQ1_VOL ; PRG:$3939 Bytes:8D 00 40 + LDA AudioPeriodOrEnvelope ; PRG:$393C Bytes:A5 F4 + AND #$03 ; PRG:$393E Bytes:29 03 + BNE AudioPathOnNonZero_F95C ; PRG:$3940 Bytes:D0 1A + LDA $07F4 ; PRG:$3942 Bytes:AD F4 07 + LSR A ; PRG:$3945 Bytes:4A + LSR A ; PRG:$3946 Bytes:4A + LSR A ; PRG:$3947 Bytes:4A + LSR A ; PRG:$3948 Bytes:4A + SEC ; PRG:$3949 Bytes:38 + SBC $07F4 ; PRG:$394A Bytes:ED F4 07 +UpdatePulse1OnNonZero_F94D: + STA $07F4 ; PRG:$394D Bytes:8D F4 07 + ROL A ; PRG:$3950 Bytes:2A + ROL A ; PRG:$3951 Bytes:2A + ROL A ; PRG:$3952 Bytes:2A + STA SQ1_LO ; PRG:$3953 Bytes:8D 02 40 + ROL A ; PRG:$3956 Bytes:2A + AND #$07 ; PRG:$3957 Bytes:29 07 + STA SQ1_HI ; PRG:$3959 Bytes:8D 03 40 +AudioPathOnNonZero_F95C: + JMP ProcessAudioStateDispatch_F9CB ; PRG:$395C Bytes:4C CB F9 +UpdatePulse1OnNoCarry_F95F: + LSR A ; PRG:$395F Bytes:4A + BCS UpdatePulse1Loop_F917 ; PRG:$3960 Bytes:B0 B5 + LSR $FF ; PRG:$3962 Bytes:46 FF + BCC AudioPathOnNoCarry_F9D9 ; PRG:$3964 Bytes:90 73 + STY $F0 ; PRG:$3966 Bytes:84 F0 + LDA #$30 ; PRG:$3968 Bytes:A9 30 + STA AudioPeriodOrEnvelope ; PRG:$396A Bytes:85 F4 + LDA #$8A ; PRG:$396C Bytes:A9 8A + STA SQ1_SWEEP ; PRG:$396E Bytes:8D 01 40 +AudioPathLoop_F971: + LDY $F4 ; PRG:$3971 Bytes:A4 F4 + LDA $F83A,Y ; PRG:$3973 Bytes:B9 3A F8 +UpdatePulse1Dispatch_F976: + LDX $F83A,Y ; PRG:$3976 Bytes:BE 3A F8 + STX SQ1_VOL ; PRG:$3979 Bytes:8E 00 40 + BNE UpdatePulse1OnNonZero_F9C3 ; PRG:$397C Bytes:D0 45 +AudioPathLoop_F97E: + STY $F0 ; PRG:$397E Bytes:84 F0 + LDA #$28 ; PRG:$3980 Bytes:A9 28 + STA $F4 ; PRG:$3982 Bytes:85 F4 + LDX #$82 ; PRG:$3984 Bytes:A2 82 + LDY #$A7 ; PRG:$3986 Bytes:A0 A7 + LDA #$30 ; PRG:$3988 Bytes:A9 30 + JSR ProcessAudioStateRoutine_F7FD ; PRG:$398A Bytes:20 FD F7 +AudioPathLoop_F98D: + LDA $F4 ; PRG:$398D Bytes:A5 F4 + CMP #$25 ; PRG:$398F Bytes:C9 25 + BNE AudioPathOnNonZero_F999 ; PRG:$3991 Bytes:D0 06 + LDX #$5F ; PRG:$3993 Bytes:A2 5F + LDY #$F6 ; PRG:$3995 Bytes:A0 F6 + BNE AudioPathOnNonZero_F9A9 ; PRG:$3997 Bytes:D0 10 +AudioPathOnNonZero_F999: + CMP #$20 ; PRG:$3999 Bytes:C9 20 + BNE AudioPathOnNonZero_F9A1 ; PRG:$399B Bytes:D0 04 + LDY #$BC ; PRG:$399D Bytes:A0 BC + BNE AudioPathOnNonZero_F9A7 ; PRG:$399F Bytes:D0 06 +AudioPathOnNonZero_F9A1: + CMP #$10 ; PRG:$39A1 Bytes:C9 10 + BNE ProcessAudioStateDispatch_F9CB ; PRG:$39A3 Bytes:D0 26 + LDY #$9C ; PRG:$39A5 Bytes:A0 9C +AudioPathOnNonZero_F9A7: + LDX #$48 ; PRG:$39A7 Bytes:A2 48 +AudioPathOnNonZero_F9A9: + JSR UpdatePulse1Routine_F7F6 ; PRG:$39A9 Bytes:20 F6 F7 + BNE ProcessAudioStateDispatch_F9CB ; PRG:$39AC Bytes:D0 1D +AudioPathLoop_F9AE: + STY $F0 ; PRG:$39AE Bytes:84 F0 + LDA #$17 ; PRG:$39B0 Bytes:A9 17 + STA $F4 ; PRG:$39B2 Bytes:85 F4 + LDX #$5F ; PRG:$39B4 Bytes:A2 5F + LDY #$7F ; PRG:$39B6 Bytes:A0 7F + JSR UpdatePulse1Routine_F7F6 ; PRG:$39B8 Bytes:20 F6 F7 +AudioPathLoop_F9BB: + LDA $F4 ; PRG:$39BB Bytes:A5 F4 + AND #$07 ; PRG:$39BD Bytes:29 07 + TAY ; PRG:$39BF Bytes:A8 + LDA $FFC2,Y ; PRG:$39C0 Bytes:B9 C2 FF +UpdatePulse1OnNonZero_F9C3: + STA SQ1_LO ; PRG:$39C3 Bytes:8D 02 40 + LDA #$08 ; PRG:$39C6 Bytes:A9 08 + STA SQ1_HI ; PRG:$39C8 Bytes:8D 03 40 +ProcessAudioStateDispatch_F9CB: + DEC $F4 ; PRG:$39CB Bytes:C6 F4 + BNE AudioPathOnNonZero_F9D8 ; PRG:$39CD Bytes:D0 09 +ProcessAudioStateDispatch_F9CF: + LDA #$00 ; PRG:$39CF Bytes:A9 00 + STA $F0 ; PRG:$39D1 Bytes:85 F0 +;------------------------------------------------------------ +; UpdatePulse1Routine_F9D3 +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdatePulse1Routine_F9D3: + LDA #$90 ; PRG:$39D3 Bytes:A9 90 + STA SQ1_VOL ; PRG:$39D5 Bytes:8D 00 40 +AudioPathOnNonZero_F9D8: + RTS ; PRG:$39D8 Bytes:60 +AudioPathOnNoCarry_F9D9: + LSR A ; PRG:$39D9 Bytes:4A + BCS AudioPathLoop_F971 ; PRG:$39DA Bytes:B0 95 + LSR $FF ; PRG:$39DC Bytes:46 FF + BCS AudioPathLoop_F97E ; PRG:$39DE Bytes:B0 9E + LSR A ; PRG:$39E0 Bytes:4A + BCS AudioPathLoop_F98D ; PRG:$39E1 Bytes:B0 AA + LSR $FF ; PRG:$39E3 Bytes:46 FF + BCS AudioPathLoop_F9AE ; PRG:$39E5 Bytes:B0 C7 + LSR A ; PRG:$39E7 Bytes:4A + BCS AudioPathLoop_F9BB ; PRG:$39E8 Bytes:B0 D1 + LSR $FF ; PRG:$39EA Bytes:46 FF + BCS AudioPathOnCarry_F9F2 ; PRG:$39EC Bytes:B0 04 + LSR A ; PRG:$39EE Bytes:4A + BCS AudioPathOnCarry_F9FC ; PRG:$39EF Bytes:B0 0B + RTS ; PRG:$39F1 Bytes:60 +AudioPathOnCarry_F9F2: + STY $F0 ; PRG:$39F2 Bytes:84 F0 + LDA #$20 ; PRG:$39F4 Bytes:A9 20 + STA $F4 ; PRG:$39F6 Bytes:85 F4 + LDA #$8A ; PRG:$39F8 Bytes:A9 8A + BNE UpdatePulse1OnNonZero_FA04 ; PRG:$39FA Bytes:D0 08 +AudioPathOnCarry_F9FC: + LDY $F4 ; PRG:$39FC Bytes:A4 F4 + CPY #$19 ; PRG:$39FE Bytes:C0 19 + BNE AudioPathOnNonZero_FA07 ; PRG:$3A00 Bytes:D0 05 + LDA #$82 ; PRG:$3A02 Bytes:A9 82 +UpdatePulse1OnNonZero_FA04: + STA SQ1_SWEEP ; PRG:$3A04 Bytes:8D 01 40 +AudioPathOnNonZero_FA07: + LDA #$47 ; PRG:$3A07 Bytes:A9 47 + JMP UpdatePulse1Dispatch_F976 ; PRG:$3A09 Bytes:4C 76 F9 +;------------------------------------------------------------ +; UpdatePulse2Routine_FA0C +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +UpdatePulse2Routine_FA0C: + STY $F1 ; PRG:$3A0C Bytes:84 F1 + STX $07FF ; PRG:$3A0E Bytes:8E FF 07 + LDA #$9F ; PRG:$3A11 Bytes:A9 9F + STA SQ2_VOL ; PRG:$3A13 Bytes:8D 04 40 + LDA #$7F ; PRG:$3A16 Bytes:A9 7F + STA SQ2_SWEEP ; PRG:$3A18 Bytes:8D 05 40 + LDA #$08 ; PRG:$3A1B Bytes:A9 08 + STA SQ2_HI ; PRG:$3A1D Bytes:8D 07 40 + RTS ; PRG:$3A20 Bytes:60 +AudioPathLoop_FA21: + LDX #$08 ; PRG:$3A21 Bytes:A2 08 + JSR UpdatePulse2Routine_FA0C ; PRG:$3A23 Bytes:20 0C FA +AudioPathLoop_FA26: + LDY $07FF ; PRG:$3A26 Bytes:AC FF 07 + LDA $FFB9,Y ; PRG:$3A29 Bytes:B9 B9 FF + BNE UpdatePulse2OnNonZero_FA4E ; PRG:$3A2C Bytes:D0 20 +;------------------------------------------------------------ +; ProcessAudioStateRoutine_FA2E +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessAudioStateRoutine_FA2E: + LDY $FE ; PRG:$3A2E Bytes:A4 FE + LDA $F1 ; PRG:$3A30 Bytes:A5 F1 + LSR $FE ; PRG:$3A32 Bytes:46 FE + BCS AudioPathLoop_FA21 ; PRG:$3A34 Bytes:B0 EB + LSR A ; PRG:$3A36 Bytes:4A + BCS AudioPathLoop_FA26 ; PRG:$3A37 Bytes:B0 ED + LSR $FE ; PRG:$3A39 Bytes:46 FE + BCS AudioPathOnCarry_FA41 ; PRG:$3A3B Bytes:B0 04 + LSR A ; PRG:$3A3D Bytes:4A + BCS AudioPathOnCarry_FA46 ; PRG:$3A3E Bytes:B0 06 + RTS ; PRG:$3A40 Bytes:60 +AudioPathOnCarry_FA41: + LDX #$23 ; PRG:$3A41 Bytes:A2 23 + JSR UpdatePulse2Routine_FA0C ; PRG:$3A43 Bytes:20 0C FA +AudioPathOnCarry_FA46: + LDA $07FF ; PRG:$3A46 Bytes:AD FF 07 + LSR A ; PRG:$3A49 Bytes:4A + TAY ; PRG:$3A4A Bytes:A8 + LDA $FA5B,Y ; PRG:$3A4B Bytes:B9 5B FA +UpdatePulse2OnNonZero_FA4E: + STA SQ2_LO ; PRG:$3A4E Bytes:8D 06 40 + DEC $07FF ; PRG:$3A51 Bytes:CE FF 07 + BNE AudioPathOnNonZero_FA5A ; PRG:$3A54 Bytes:D0 04 + LDA #$00 ; PRG:$3A56 Bytes:A9 00 + STA $F1 ; PRG:$3A58 Bytes:85 F1 +AudioPathOnNonZero_FA5A: + RTS ; PRG:$3A5A Bytes:60 + .byte $00, $54, $00, $5F, $00, $6A, $00, $71, $00, $6A, $00, $71, $00, $7E, $00, $86 ; PRG:$3A5B Bytes:00 54 00 5F 00 6A 00 71 00 6A 00 71 00 7E 00 86 + .byte $00, $7E, $10, $12, $12, $12, $15, $15, $15, $13, $13, $13, $13, $16, $16, $16 ; PRG:$3A6B Bytes:00 7E 10 12 12 12 15 15 15 13 13 13 13 16 16 16 + .byte $16, $16, $14, $14, $14, $14, $17, $17, $17, $17, $15, $15, $15, $15, $18, $19 ; PRG:$3A7B Bytes:16 16 14 14 14 14 17 17 17 17 15 15 15 15 18 19 + .byte $19, $1A, $1A, $1A, $1B, $1B, $1C, $1D, $1E, $1F, $13, $15, $16, $16, $18, $18 ; PRG:$3A8B Bytes:19 1A 1A 1A 1B 1B 1C 1D 1E 1F 13 15 16 16 18 18 + .byte $1A, $1A, $07, $05, $05, $05, $05, $05, $06, $06, $06, $04, $04, $04, $04, $05 ; PRG:$3A9B Bytes:1A 1A 07 05 05 05 05 05 06 06 06 04 04 04 04 05 + .byte $05, $05, $09, $09, $0A, $0A, $07, $07, $08, $08 ; PRG:$3AAB Bytes:05 05 09 09 0A 0A 07 07 08 08 +AudioPathLoop_FAB5: + STY $F2 ; PRG:$3AB5 Bytes:84 F2 + LDA #$30 ; PRG:$3AB7 Bytes:A9 30 + STA $07FB ; PRG:$3AB9 Bytes:8D FB 07 +UpdateNoiseLoop_FABC: + LDY $07FB ; PRG:$3ABC Bytes:AC FB 07 + LDA $FA6C,Y ; PRG:$3ABF Bytes:B9 6C FA + STA NOISE_VOL ; PRG:$3AC2 Bytes:8D 0C 40 + LDA $07FB ; PRG:$3AC5 Bytes:AD FB 07 + LSR A ; PRG:$3AC8 Bytes:4A + TAY ; PRG:$3AC9 Bytes:A8 + LDA $FA9C,Y ; PRG:$3ACA Bytes:B9 9C FA + BNE UpdateNoiseOnNonZero_FB10 ; PRG:$3ACD Bytes:D0 41 +;------------------------------------------------------------ +; ProcessAudioStateRoutine_FACF +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessAudioStateRoutine_FACF: + LDY $FC ; PRG:$3ACF Bytes:A4 FC + LDA $F2 ; PRG:$3AD1 Bytes:A5 F2 + LSR $FC ; PRG:$3AD3 Bytes:46 FC + BCS AudioPathLoop_FAB5 ; PRG:$3AD5 Bytes:B0 DE + LSR A ; PRG:$3AD7 Bytes:4A + BCS UpdateNoiseLoop_FABC ; PRG:$3AD8 Bytes:B0 E2 + LSR $FC ; PRG:$3ADA Bytes:46 FC + BCS AudioPathOnCarry_FAE9 ; PRG:$3ADC Bytes:B0 0B + LSR A ; PRG:$3ADE Bytes:4A + BCS UpdateNoiseOnCarry_FAF0 ; PRG:$3ADF Bytes:B0 0F + LSR $FC ; PRG:$3AE1 Bytes:46 FC + BCS AudioPathOnCarry_FAFE ; PRG:$3AE3 Bytes:B0 19 + LSR A ; PRG:$3AE5 Bytes:4A + BCS UpdateNoiseOnCarry_FB05 ; PRG:$3AE6 Bytes:B0 1D + RTS ; PRG:$3AE8 Bytes:60 +AudioPathOnCarry_FAE9: + STY $F2 ; PRG:$3AE9 Bytes:84 F2 + LDA #$20 ; PRG:$3AEB Bytes:A9 20 + STA $07FB ; PRG:$3AED Bytes:8D FB 07 +UpdateNoiseOnCarry_FAF0: + LDY $07FB ; PRG:$3AF0 Bytes:AC FB 07 + LDA $FF50,Y ; PRG:$3AF3 Bytes:B9 50 FF + STA NOISE_VOL ; PRG:$3AF6 Bytes:8D 0C 40 + LDA $FF70,Y ; PRG:$3AF9 Bytes:B9 70 FF + BNE UpdateNoiseOnNonZero_FB10 ; PRG:$3AFC Bytes:D0 12 +AudioPathOnCarry_FAFE: + STY $F2 ; PRG:$3AFE Bytes:84 F2 + LDA #$09 ; PRG:$3B00 Bytes:A9 09 + STA $07FB ; PRG:$3B02 Bytes:8D FB 07 +UpdateNoiseOnCarry_FB05: + LDY $07FB ; PRG:$3B05 Bytes:AC FB 07 + LDA $FF90,Y ; PRG:$3B08 Bytes:B9 90 FF + STA NOISE_VOL ; PRG:$3B0B Bytes:8D 0C 40 + LDA #$04 ; PRG:$3B0E Bytes:A9 04 +UpdateNoiseOnNonZero_FB10: + STA NOISE_LO ; PRG:$3B10 Bytes:8D 0E 40 + LDA #$08 ; PRG:$3B13 Bytes:A9 08 + STA NOISE_HI ; PRG:$3B15 Bytes:8D 0F 40 + DEC $07FB ; PRG:$3B18 Bytes:CE FB 07 + BNE AudioPathOnNonZero_FB21 ; PRG:$3B1B Bytes:D0 04 + LDA #$00 ; PRG:$3B1D Bytes:A9 00 + STA $F2 ; PRG:$3B1F Bytes:85 F2 +AudioPathOnNonZero_FB21: + RTS ; PRG:$3B21 Bytes:60 +;------------------------------------------------------------ +; ProcessAudioStateRoutine_FB22 +; +; Global: +; First-pass audio-driver entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the audio naming pass. +; +; Parameters: +; Audio workspace and APU register state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessAudioStateRoutine_FB22: + LDA $FB ; PRG:$3B22 Bytes:A5 FB + BNE AudioPathLoop_FB2B ; PRG:$3B24 Bytes:D0 05 + LDA $F3 ; PRG:$3B26 Bytes:A5 F3 + BNE AudioPathOnNonZero_FB6E ; PRG:$3B28 Bytes:D0 44 + RTS ; PRG:$3B2A Bytes:60 +AudioPathLoop_FB2B: + STA $F3 ; PRG:$3B2B Bytes:85 F3 + LDY #$00 ; PRG:$3B2D Bytes:A0 00 + STY $F8 ; PRG:$3B2F Bytes:84 F8 +UpdatePulse1Loop_FB31: + INY ; PRG:$3B31 Bytes:C8 + LSR A ; PRG:$3B32 Bytes:4A + BCC UpdatePulse1Loop_FB31 ; PRG:$3B33 Bytes:90 FC + LDA $FC64,Y ; PRG:$3B35 Bytes:B9 64 FC + TAY ; PRG:$3B38 Bytes:A8 + LDA $FC65,Y ; PRG:$3B39 Bytes:B9 65 FC + STA $F5 ; PRG:$3B3C Bytes:85 F5 + LDA $FC66,Y ; PRG:$3B3E Bytes:B9 66 FC + STA $F6 ; PRG:$3B41 Bytes:85 F6 + LDA $FC67,Y ; PRG:$3B43 Bytes:B9 67 FC + STA $F7 ; PRG:$3B46 Bytes:85 F7 + LDA $FC68,Y ; PRG:$3B48 Bytes:B9 68 FC + STA $FA ; PRG:$3B4B Bytes:85 FA + LDA $FC69,Y ; PRG:$3B4D Bytes:B9 69 FC + STA $F9 ; PRG:$3B50 Bytes:85 F9 + LDA $FC6A,Y ; PRG:$3B52 Bytes:B9 6A FC + STA $07F2 ; PRG:$3B55 Bytes:8D F2 07 + LDA #$01 ; PRG:$3B58 Bytes:A9 01 + STA $07EE ; PRG:$3B5A Bytes:8D EE 07 + STA $07F0 ; PRG:$3B5D Bytes:8D F0 07 + STA $07F1 ; PRG:$3B60 Bytes:8D F1 07 + STA $07F3 ; PRG:$3B63 Bytes:8D F3 07 + LDA #$7F ; PRG:$3B66 Bytes:A9 7F + STA SQ1_SWEEP ; PRG:$3B68 Bytes:8D 01 40 + STA SQ2_SWEEP ; PRG:$3B6B Bytes:8D 05 40 +AudioPathOnNonZero_FB6E: + DEC $07EE ; PRG:$3B6E Bytes:CE EE 07 + BNE AudioPathOnNonZero_FBBD ; PRG:$3B71 Bytes:D0 4A +AudioPathLoop_FB73: + LDY $F8 ; PRG:$3B73 Bytes:A4 F8 + INC $F8 ; PRG:$3B75 Bytes:E6 F8 + LDA ($F6),Y ; PRG:$3B77 Bytes:B1 F6 + BEQ UpdatePulse2OnZero_FB84 ; PRG:$3B79 Bytes:F0 09 + CMP #$01 ; PRG:$3B7B Bytes:C9 01 + BNE AudioPathOnNonZero_FB95 ; PRG:$3B7D Bytes:D0 16 + LDA $10 ; PRG:$3B7F Bytes:A5 10 + LSR A ; PRG:$3B81 Bytes:4A + BCC AudioPathLoop_FB73 ; PRG:$3B82 Bytes:90 EF +UpdatePulse2OnZero_FB84: + LDA $F3 ; PRG:$3B84 Bytes:A5 F3 + AND #$1C ; PRG:$3B86 Bytes:29 1C + BNE AudioPathLoop_FB2B ; PRG:$3B88 Bytes:D0 A1 + LDA #$00 ; PRG:$3B8A Bytes:A9 00 + STA $F3 ; PRG:$3B8C Bytes:85 F3 + JSR UpdatePulse1Routine_F9D3 ; PRG:$3B8E Bytes:20 D3 F9 + STA SQ2_VOL ; PRG:$3B91 Bytes:8D 04 40 + RTS ; PRG:$3B94 Bytes:60 +AudioPathOnNonZero_FB95: + JSR ProcessAudioStateRoutine_FF41 ; PRG:$3B95 Bytes:20 41 FF + STA $07EE ; PRG:$3B98 Bytes:8D EE 07 + TXA ; PRG:$3B9B Bytes:8A + AND #$3E ; PRG:$3B9C Bytes:29 3E + JSR ProcessAudioStateRoutine_F814 ; PRG:$3B9E Bytes:20 14 F8 + BEQ AudioPathOnZero_FBAA ; PRG:$3BA1 Bytes:F0 07 + LDY #$1F ; PRG:$3BA3 Bytes:A0 1F + STY $07EF ; PRG:$3BA5 Bytes:8C EF 07 + BNE AudioPathOnNonZero_FBAF ; PRG:$3BA8 Bytes:D0 05 +AudioPathOnZero_FBAA: + LDY #$00 ; PRG:$3BAA Bytes:A0 00 + STY $07EF ; PRG:$3BAC Bytes:8C EF 07 +AudioPathOnNonZero_FBAF: + LDX #$84 ; PRG:$3BAF Bytes:A2 84 + LDA $07EE ; PRG:$3BB1 Bytes:AD EE 07 + CMP #$10 ; PRG:$3BB4 Bytes:C9 10 + BCS UpdatePulse2OnCarry_FBBA ; PRG:$3BB6 Bytes:B0 02 + LDX #$82 ; PRG:$3BB8 Bytes:A2 82 +UpdatePulse2OnCarry_FBBA: + STX SQ2_VOL ; PRG:$3BBA Bytes:8E 04 40 +AudioPathOnNonZero_FBBD: + LDA $F3 ; PRG:$3BBD Bytes:A5 F3 + AND #$1C ; PRG:$3BBF Bytes:29 1C + BEQ AudioPathOnZero_FBD1 ; PRG:$3BC1 Bytes:F0 0E + LDY $07EF ; PRG:$3BC3 Bytes:AC EF 07 + BEQ UpdatePulse2OnZero_FBCB ; PRG:$3BC6 Bytes:F0 03 + DEC $07EF ; PRG:$3BC8 Bytes:CE EF 07 +UpdatePulse2OnZero_FBCB: + LDA $FF9A,Y ; PRG:$3BCB Bytes:B9 9A FF + STA SQ2_VOL ; PRG:$3BCE Bytes:8D 04 40 +AudioPathOnZero_FBD1: + LDY $F9 ; PRG:$3BD1 Bytes:A4 F9 + BEQ AudioPathContinue_FC04 ; PRG:$3BD3 Bytes:F0 2F + DEC $07F0 ; PRG:$3BD5 Bytes:CE F0 07 + BNE AudioPathContinue_FC04 ; PRG:$3BD8 Bytes:D0 2A +UpdatePulse1Loop_FBDA: + LDY $F9 ; PRG:$3BDA Bytes:A4 F9 + INC $F9 ; PRG:$3BDC Bytes:E6 F9 + LDA ($F6),Y ; PRG:$3BDE Bytes:B1 F6 + BNE AudioPathOnNonZero_FBED ; PRG:$3BE0 Bytes:D0 0B + LDY $F9 ; PRG:$3BE2 Bytes:A4 F9 + INC $F9 ; PRG:$3BE4 Bytes:E6 F9 + LDA ($F6),Y ; PRG:$3BE6 Bytes:B1 F6 + STA SQ1_SWEEP ; PRG:$3BE8 Bytes:8D 01 40 + BNE UpdatePulse1Loop_FBDA ; PRG:$3BEB Bytes:D0 ED +AudioPathOnNonZero_FBED: + JSR ProcessAudioStateRoutine_FF41 ; PRG:$3BED Bytes:20 41 FF + STA $07F0 ; PRG:$3BF0 Bytes:8D F0 07 + TXA ; PRG:$3BF3 Bytes:8A + AND #$3E ; PRG:$3BF4 Bytes:29 3E + JSR ProcessAudioStateRoutine_F800 ; PRG:$3BF6 Bytes:20 00 F8 + BNE AudioPathOnNonZero_FBFF ; PRG:$3BF9 Bytes:D0 04 + LDX #$10 ; PRG:$3BFB Bytes:A2 10 + BNE UpdatePulse1OnNonZero_FC01 ; PRG:$3BFD Bytes:D0 02 +AudioPathOnNonZero_FBFF: + LDX #$06 ; PRG:$3BFF Bytes:A2 06 +UpdatePulse1OnNonZero_FC01: + STX SQ1_VOL ; PRG:$3C01 Bytes:8E 00 40 +AudioPathContinue_FC04: + LDY $FA ; PRG:$3C04 Bytes:A4 FA + BEQ AudioPathContinue_FC2B ; PRG:$3C06 Bytes:F0 23 + DEC $07F1 ; PRG:$3C08 Bytes:CE F1 07 + BNE AudioPathContinue_FC2B ; PRG:$3C0B Bytes:D0 1E + INC $FA ; PRG:$3C0D Bytes:E6 FA + LDA ($F6),Y ; PRG:$3C0F Bytes:B1 F6 + JSR ProcessAudioStateRoutine_FF41 ; PRG:$3C11 Bytes:20 41 FF + STA $07F1 ; PRG:$3C14 Bytes:8D F1 07 + CLC ; PRG:$3C17 Bytes:18 + ADC #$FE ; PRG:$3C18 Bytes:69 FE + CMP #$0E ; PRG:$3C1A Bytes:C9 0E + BCC UpdateTriangleOnNoCarry_FC20 ; PRG:$3C1C Bytes:90 02 + LDA #$0E ; PRG:$3C1E Bytes:A9 0E +UpdateTriangleOnNoCarry_FC20: + ASL A ; PRG:$3C20 Bytes:0A + ASL A ; PRG:$3C21 Bytes:0A + STA TRI_LINEAR ; PRG:$3C22 Bytes:8D 08 40 + TXA ; PRG:$3C25 Bytes:8A + AND #$3E ; PRG:$3C26 Bytes:29 3E + JSR ProcessAudioStateRoutine_F818 ; PRG:$3C28 Bytes:20 18 F8 +AudioPathContinue_FC2B: + LDA $F3 ; PRG:$3C2B Bytes:A5 F3 + AND #$43 ; PRG:$3C2D Bytes:29 43 + BEQ AudioPathContinue_FC64 ; PRG:$3C2F Bytes:F0 33 + DEC $07F3 ; PRG:$3C31 Bytes:CE F3 07 + BNE AudioPathContinue_FC64 ; PRG:$3C34 Bytes:D0 2E + LDY $07F2 ; PRG:$3C36 Bytes:AC F2 07 + INC $07F2 ; PRG:$3C39 Bytes:EE F2 07 + LDA ($F6),Y ; PRG:$3C3C Bytes:B1 F6 + JSR ProcessAudioStateRoutine_FF41 ; PRG:$3C3E Bytes:20 41 FF + STA $07F3 ; PRG:$3C41 Bytes:8D F3 07 + TXA ; PRG:$3C44 Bytes:8A + AND #$3E ; PRG:$3C45 Bytes:29 3E + BEQ AudioPathContinue_FC64 ; PRG:$3C47 Bytes:F0 1B + AND #$20 ; PRG:$3C49 Bytes:29 20 + BNE AudioPathOnNonZero_FC55 ; PRG:$3C4B Bytes:D0 08 + LDA #$02 ; PRG:$3C4D Bytes:A9 02 + LDX #$00 ; PRG:$3C4F Bytes:A2 00 + LDY #$28 ; PRG:$3C51 Bytes:A0 28 + BNE UpdateNoiseOnNonZero_FC5B ; PRG:$3C53 Bytes:D0 06 +AudioPathOnNonZero_FC55: + LDA #$00 ; PRG:$3C55 Bytes:A9 00 + LDX #$02 ; PRG:$3C57 Bytes:A2 02 + LDY #$08 ; PRG:$3C59 Bytes:A0 08 +UpdateNoiseOnNonZero_FC5B: + STA NOISE_VOL ; PRG:$3C5B Bytes:8D 0C 40 + STX NOISE_LO ; PRG:$3C5E Bytes:8E 0E 40 + STY NOISE_HI ; PRG:$3C61 Bytes:8C 0F 40 +AudioPathContinue_FC64: + RTS ; PRG:$3C64 Bytes:60 + .byte $0C, $16, $20, $1C, $24, $12, $28, $08, $07, $F7, $FF, $00, $00, $93, $FC, $3F ; PRG:$3C65 Bytes:0C 16 20 1C 24 12 28 08 07 F7 FF 00 00 93 FC 3F + .byte $1C, $60, $07 ; PRG:$3C75 Bytes:1C 60 07 + +;------------------------------------------------------------ +; Audio data with embedded sequence helper code +; CPU $FC78-$FFF9 +; PRG $3C78-$3FF9 +; +; Pass 1 recursively traced from verified entry roots in this region. +; Direct branches, jumps, and subroutine calls are decoded. +; Bytes not reached by that trace remain explicit .byte data. +;------------------------------------------------------------ + +AudioDataTables: + .byte $FB, $FE, $00, $00, $05, $FD, $3E, $1B, $4E, $07, $69, $FD, $3D, $00, $CA, $FD ; PRG:$3C78 Bytes:FB FE 00 00 05 FD 3E 1B 4E 07 69 FD 3D 00 CA FD + .byte $6E, $00, $AD, $FE, $27, $00, $CA, $FF, $15, $09, $1F, $42, $8C, $44, $4C, $84 ; PRG:$3C88 Bytes:6E 00 AD FE 27 00 CA FF 15 09 1F 42 8C 44 4C 84 + .byte $44, $27, $42, $8C, $44, $4C, $84, $44, $2B, $43, $6A, $84, $AA, $92, $52, $02 ; PRG:$3C98 Bytes:44 27 42 8C 44 4C 84 44 2B 43 6A 84 AA 92 52 02 + .byte $16, $4A, $02, $88, $02, $05, $00, $42, $84, $66, $4C, $84, $84, $60, $66, $44 ; PRG:$3CA8 Bytes:16 4A 02 88 02 05 00 42 84 66 4C 84 84 60 66 44 + .byte $4C, $88, $84, $AA, $64, $6A, $A4, $A4, $64, $6A, $44, $4C, $88, $C4, $62, $AA ; PRG:$3CB8 Bytes:4C 88 84 AA 64 6A A4 A4 64 6A 44 4C 88 C4 62 AA + .byte $A2, $88, $48, $02, $08, $62, $02, $A2, $02, $21, $5B, $5A, $5B, $9A, $5A, $60 ; PRG:$3CC8 Bytes:A2 88 48 02 08 62 02 A2 02 21 5B 5A 5B 9A 5A 60 + .byte $66, $44, $AE, $6A, $65, $64, $65, $A4, $5C, $64, $6A, $44, $AE, $6A, $63, $62 ; PRG:$3CD8 Bytes:66 44 AE 6A 65 64 65 A4 5C 64 6A 44 AE 6A 63 62 + .byte $A2, $A2, $AE, $6E, $02, $2E, $6A, $02, $AA, $02, $27, $80, $E0, $E0, $E0, $E0 ; PRG:$3CE8 Bytes:A2 A2 AE 6E 02 2E 6A 02 AA 02 27 80 E0 E0 E0 E0 + .byte $E0, $E0, $E0, $E0, $E0, $E0, $E0, $A0, $10, $10, $10, $10, $11, $42, $A6, $60 ; PRG:$3CF8 Bytes:E0 E0 E0 E0 E0 E0 E0 A0 10 10 10 10 11 42 A6 60 + .byte $AA, $AA, $6C, $AA, $A6, $5E, $60, $A6, $84, $6A, $88, $88, $AE, $52, $02, $10 ; PRG:$3D08 Bytes:AA AA 6C AA A6 5E 60 A6 84 6A 88 88 AE 52 02 10 + .byte $4E, $02, $88, $02, $45, $45, $C4, $00, $42, $A0, $5A, $A0, $A0, $66, $A2, $A0 ; PRG:$3D18 Bytes:4E 02 88 02 45 45 C4 00 42 A0 5A A0 A0 66 A2 A0 + .byte $5A, $5A, $9A, $AA, $62, $AA, $AA, $A6, $48, $02, $08, $48, $02, $AE, $02, $00 ; PRG:$3D28 Bytes:5A 5A 9A AA 62 AA AA A6 48 02 08 48 02 AE 02 00 + .byte $95, $0C, $8C, $02, $2E, $AE, $02, $22, $A2, $02, $42, $9A, $A0, $A6, $AA, $AC ; PRG:$3D38 Bytes:95 0C 8C 02 2E AE 02 22 A2 02 42 9A A0 A6 AA AC + .byte $AA, $A6, $A0, $A2, $AA, $84, $AA, $09, $53, $4F, $CC, $80, $E0, $E0, $E0, $E0 ; PRG:$3D48 Bytes:AA A6 A0 A2 AA 84 AA 09 53 4F CC 80 E0 E0 E0 E0 + .byte $E0, $A0, $11, $10, $10, $10, $10, $42, $10, $10, $10, $10, $42, $10, $10, $10 ; PRG:$3D58 Bytes:E0 A0 11 10 10 10 10 42 10 10 10 10 42 10 10 10 + .byte $11, $66, $0C, $04, $26, $0C, $04, $26, $0C, $04, $26, $0C, $04, $26, $0C, $04 ; PRG:$3D68 Bytes:11 66 0C 04 26 0C 04 26 0C 04 26 0C 04 26 0C 04 + .byte $6A, $10, $08, $2A, $10, $08, $2A, $10, $08, $2A, $10, $08, $2A, $10, $08, $6A ; PRG:$3D78 Bytes:6A 10 08 2A 10 08 2A 10 08 2A 10 08 2A 10 08 6A + .byte $0E, $04, $2A, $0E, $04, $2A, $0E, $04, $2A, $0E, $04, $2A, $0E, $04, $6E, $12 ; PRG:$3D88 Bytes:0E 04 2A 0E 04 2A 0E 04 2A 0E 04 2A 0E 04 6E 12 + .byte $08, $2E, $12, $08, $2E, $12, $12, $0E, $0E, $0C, $0C, $08, $08, $00, $5A, $60 ; PRG:$3D98 Bytes:08 2E 12 08 2E 12 12 0E 0E 0C 0C 08 08 00 5A 60 + .byte $66, $6A, $44, $6A, $66, $60, $5C, $64, $6A, $6E, $48, $6E, $6A, $64, $62, $6A ; PRG:$3DA8 Bytes:66 6A 44 6A 66 60 5C 64 6A 6E 48 6E 6A 64 62 6A + .byte $44, $48, $4E, $48, $44, $6A, $66, $6E, $48, $4E, $18, $18, $16, $16, $12, $12 ; PRG:$3DB8 Bytes:44 48 4E 48 44 6A 66 6E 48 4E 18 18 16 16 12 12 + .byte $0E, $0E, $60, $66, $88, $44, $A6, $60, $62, $64, $66, $6A, $A2, $6A, $8C, $4A ; PRG:$3DC8 Bytes:0E 0E 60 66 88 44 A6 60 62 64 66 6A A2 6A 8C 4A + .byte $89, $44, $6A, $8E, $4C, $88, $6E, $92, $50, $4E, $4C, $60, $62, $64, $66, $6A ; PRG:$3DD8 Bytes:89 44 6A 8E 4C 88 6E 92 50 4E 4C 60 62 64 66 6A + .byte $A7, $60, $66, $8C, $48, $84, $66, $A0, $62, $66, $6A, $68, $6A, $6E, $44, $48 ; PRG:$3DE8 Bytes:A7 60 66 8C 48 84 66 A0 62 66 6A 68 6A 6E 44 48 + .byte $D6, $42, $44, $44, $6E, $92, $4C, $44, $44, $6A, $8E, $4C, $48, $66, $68, $6A ; PRG:$3DF8 Bytes:D6 42 44 44 6E 92 4C 44 44 6A 8E 4C 48 66 68 6A + .byte $6C, $6E, $48, $85, $01, $44, $6E, $44, $6A, $6E, $44, $44, $6E, $44, $60, $62 ; PRG:$3E08 Bytes:6C 6E 48 85 01 44 6E 44 6A 6E 44 44 6E 44 60 62 + .byte $66, $6A, $68, $6A, $64, $66, $6A, $AE, $44, $49, $44, $6A, $6A, $44, $6A, $6A ; PRG:$3E18 Bytes:66 6A 68 6A 64 66 6A AE 44 49 44 6A 6A 44 6A 6A + .byte $44, $66, $66, $44, $66, $66, $6A, $64, $66, $6A, $6E, $44, $8C, $4A, $49, $00 ; PRG:$3E28 Bytes:44 66 66 44 66 66 6A 64 66 6A 6E 44 8C 4A 49 00 + .byte $9A, $66, $A0, $66, $9A, $66, $A0, $66, $5C, $48, $46, $44, $6A, $62, $9C, $6A ; PRG:$3E38 Bytes:9A 66 A0 66 9A 66 A0 66 5C 48 46 44 6A 62 9C 6A + .byte $A2, $6A, $A2, $44, $AA, $44, $A6, $48, $AE, $48, $9A, $66, $A0, $66, $9A, $66 ; PRG:$3E48 Bytes:A2 6A A2 44 AA 44 A6 48 AE 48 9A 66 A0 66 9A 66 + .byte $A0, $66, $9A, $66, $A0, $66, $9A, $66, $A0, $66, $9C, $6A, $A2, $6A, $9C, $6A ; PRG:$3E58 Bytes:A0 66 9A 66 A0 66 9A 66 A0 66 9C 6A A2 6A 9C 6A + .byte $A2, $6A, $66, $6E, $48, $66, $44, $4C, $62, $6A, $48, $62, $6A, $48, $66, $64 ; PRG:$3E68 Bytes:A2 6A 66 6E 48 66 44 4C 62 6A 48 62 6A 48 66 64 + .byte $66, $68, $6A, $6E, $44, $66, $62, $61, $62, $44, $6A, $62, $44, $6A, $60, $44 ; PRG:$3E78 Bytes:66 68 6A 6E 44 66 62 61 62 44 6A 62 44 6A 60 44 + .byte $66, $60, $44, $66, $5C, $6A, $64, $5C, $6A, $64, $66, $48, $6E, $66, $48, $6E ; PRG:$3E88 Bytes:66 60 44 66 5C 6A 64 5C 6A 64 66 48 6E 66 48 6E + .byte $62, $44, $6A, $62, $44, $6A, $60, $44, $66, $60, $44, $66, $5C, $6A, $64, $5C ; PRG:$3E98 Bytes:62 44 6A 62 44 6A 60 44 66 60 44 66 5C 6A 64 5C + .byte $6A, $64, $A2, $62, $27, $45, $67, $84, $AA, $60, $AE, $60, $84, $88, $62, $AA ; PRG:$3EA8 Bytes:6A 64 A2 62 27 45 67 84 AA 60 AE 60 84 88 62 AA + .byte $48, $84, $AE, $66, $84, $66, $88, $4D, $84, $44, $8C, $57, $8C, $4A, $48, $44 ; PRG:$3EB8 Bytes:48 84 AE 66 84 66 88 4D 84 44 8C 57 8C 4A 48 44 + .byte $8E, $6A, $8C, $6A, $8E, $8C, $4A, $88, $6E, $44, $48, $00, $5B, $A0, $66, $44 ; PRG:$3EC8 Bytes:8E 6A 8C 6A 8E 8C 4A 88 6E 44 48 00 5B A0 66 44 + .byte $6E, $6B, $84, $4C, $56, $54, $5D, $A2, $6A, $48, $6A, $67, $AE, $48, $8E, $5B ; PRG:$3ED8 Bytes:6E 6B 84 4C 56 54 5D A2 6A 48 6A 67 AE 48 8E 5B + .byte $A0, $66, $44, $6E, $6B, $84, $4C, $56, $4C, $5D, $A2, $6A, $48, $44, $67, $AE ; PRG:$3EE8 Bytes:A0 66 44 6E 6B 84 4C 56 4C 5D A2 6A 48 44 67 AE + .byte $48, $4C, $4E, $26, $2E, $08, $13, $00, $03, $57, $00, $00, $00, $D4, $00, $C8 ; PRG:$3EF8 Bytes:48 4C 4E 26 2E 08 13 00 03 57 00 00 00 D4 00 C8 + .byte $00, $BD, $00, $B2, $00, $A8, $00, $9F, $00, $96, $00, $8D, $00, $85, $00, $7E ; PRG:$3F08 Bytes:00 BD 00 B2 00 A8 00 9F 00 96 00 8D 00 85 00 7E + .byte $00, $70, $01, $AB, $01, $7C, $01, $67, $01, $52, $01, $3F, $01, $2D, $01, $1C ; PRG:$3F18 Bytes:00 70 01 AB 01 7C 01 67 01 52 01 3F 01 2D 01 1C + .byte $01, $0C, $00, $FD, $00, $EE, $00, $E1, $01, $FC, $01, $C4, $04, $08, $10, $20 ; PRG:$3F28 Bytes:01 0C 00 FD 00 EE 00 E1 01 FC 01 C4 04 08 10 20 + .byte $40, $18, $30, $05, $0A, $14, $28, $50, $1E ; PRG:$3F38 Bytes:40 18 30 05 0A 14 28 50 1E +;------------------------------------------------------------ +; ProcessAudioStateRoutine_FF41 +; +; Global: +; First-pass AudioDataTables entry point or directly called helper. +; +; Local: +; Exact semantic role is deferred to the semantic naming pass. +; +; Parameters: +; Zero-page pointers, object state, or PPU state; exact contract unresolved. +; +; Returns: +; Register and flag effects are defined by the decoded instructions. +;------------------------------------------------------------ +ProcessAudioStateRoutine_FF41: + TAX ; PRG:$3F41 Bytes:AA + ROR A ; PRG:$3F42 Bytes:6A + TXA ; PRG:$3F43 Bytes:8A + ROL A ; PRG:$3F44 Bytes:2A + ROL A ; PRG:$3F45 Bytes:2A + ROL A ; PRG:$3F46 Bytes:2A + AND #$07 ; PRG:$3F47 Bytes:29 07 + CLC ; PRG:$3F49 Bytes:18 + ADC $F5 ; PRG:$3F4A Bytes:65 F5 + TAY ; PRG:$3F4C Bytes:A8 + LDA $FF34,Y ; PRG:$3F4D Bytes:B9 34 FF + RTS ; PRG:$3F50 Bytes:60 + .byte $10, $15, $16, $16, $16, $15, $15, $17, $17, $17, $16, $16, $18, $18, $18, $16 ; PRG:$3F51 Bytes:10 15 16 16 16 15 15 17 17 17 16 16 18 18 18 16 + .byte $16, $1A, $1A, $1A, $16, $16, $1C, $1C, $1C, $16, $16, $1E, $1E, $1E, $16, $16 ; PRG:$3F61 Bytes:16 1A 1A 1A 16 16 1C 1C 1C 16 16 1E 1E 1E 16 16 + .byte $0A, $0A, $0A, $0A, $08, $08, $08, $08, $08, $08, $08, $08, $09, $09, $09, $09 ; PRG:$3F71 Bytes:0A 0A 0A 0A 08 08 08 08 08 08 08 08 09 09 09 09 + .byte $09, $09, $07, $07, $07, $07, $07, $07, $07, $07, $08, $08, $08, $08, $08, $08 ; PRG:$3F81 Bytes:09 09 07 07 07 07 07 07 07 07 08 08 08 08 08 08 + .byte $10, $11, $1C, $1A, $18, $16, $14, $12, $11, $50, $51, $51, $51, $51, $51, $51 ; PRG:$3F91 Bytes:10 11 1C 1A 18 16 14 12 11 50 51 51 51 51 51 51 + .byte $51, $51, $52, $52, $52, $52, $52, $52, $53, $53, $53, $53, $53, $54, $54, $54 ; PRG:$3FA1 Bytes:51 51 52 52 52 52 52 52 53 53 53 53 53 54 54 54 + .byte $54, $55, $55, $55, $56, $56, $56, $56, $57, $01, $01, $01, $BE, $01, $01, $01 ; PRG:$3FB1 Bytes:54 55 55 55 56 56 56 56 57 01 01 01 BE 01 01 01 + .byte $8E, $00, $FE, $00, $00, $FE, $00, $00, $FE, $6B, $6B, $AA, $6F, $6F, $AE, $03 ; PRG:$3FC1 Bytes:8E 00 FE 00 00 FE 00 00 FE 6B 6B AA 6F 6F AE 03 + .byte $05, $00, $00, $95, $5D, $49, $9C, $63, $4F, $A2, $03, $00, $9D, $27, $A2, $84 ; PRG:$3FD1 Bytes:05 00 00 95 5D 49 9C 63 4F A2 03 00 9D 27 A2 84 + .byte $A2, $84, $A6, $88, $A6, $88, $03, $0D, $01, $01, $A0, $60, $00, $20, $A0, $60 ; PRG:$3FE1 Bytes:A2 84 A6 88 A6 88 03 0D 01 01 A0 60 00 20 A0 60 + .byte $00, $20, $20, $20, $20, $21, $00, $4F, $0F ; PRG:$3FF1 Bytes:00 20 20 20 20 21 00 4F 0F + +;------------------------------------------------------------ +; VectorTable +; CPU $FFFA-$FFFF +; PRG $3FFA-$3FFF +; NMI, RESET, IRQ/BRK vectors +; Pass 1 preserves this range exactly with .incbin. +;------------------------------------------------------------ +VectorTable: + .word NMIHandler ; PRG:$3FFA Bytes:F1 C1 + .word ResetEntry ; PRG:$3FFC Bytes:96 C1 + .word IRQHandler ; PRG:$3FFE Bytes:96 C1 diff --git a/Clu Clu Land (JU)/copilot/reconstructed.lbl b/Clu Clu Land (JU)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e673b0d --- /dev/null +++ b/Clu Clu Land (JU)/copilot/reconstructed.lbl @@ -0,0 +1,770 @@ +al 00FFFA .VectorTable +al 00FC78 .AudioDataTables +al 00FC5B .UpdateNoiseOnNonZero_FC5B +al 00FC55 .AudioPathOnNonZero_FC55 +al 00FC64 .AudioPathContinue_FC64 +al 00FC20 .UpdateTriangleOnNoCarry_FC20 +al 00FC2B .AudioPathContinue_FC2B +al 00FC01 .UpdatePulse1OnNonZero_FC01 +al 00FBFF .AudioPathOnNonZero_FBFF +al 00FBED .AudioPathOnNonZero_FBED +al 00FBDA .UpdatePulse1Loop_FBDA +al 00FC04 .AudioPathContinue_FC04 +al 00FBCB .UpdatePulse2OnZero_FBCB +al 00FBD1 .AudioPathOnZero_FBD1 +al 00FBBA .UpdatePulse2OnCarry_FBBA +al 00FBAF .AudioPathOnNonZero_FBAF +al 00FBAA .AudioPathOnZero_FBAA +al 00FF41 .ProcessAudioStateRoutine_FF41 +al 00FB95 .AudioPathOnNonZero_FB95 +al 00FB84 .UpdatePulse2OnZero_FB84 +al 00FB73 .AudioPathLoop_FB73 +al 00FBBD .AudioPathOnNonZero_FBBD +al 00FB31 .UpdatePulse1Loop_FB31 +al 00FB6E .AudioPathOnNonZero_FB6E +al 00FB2B .AudioPathLoop_FB2B +al 00FB21 .AudioPathOnNonZero_FB21 +al 00FB05 .UpdateNoiseOnCarry_FB05 +al 00FAFE .AudioPathOnCarry_FAFE +al 00FAF0 .UpdateNoiseOnCarry_FAF0 +al 00FAE9 .AudioPathOnCarry_FAE9 +al 00FB10 .UpdateNoiseOnNonZero_FB10 +al 00FABC .UpdateNoiseLoop_FABC +al 00FAB5 .AudioPathLoop_FAB5 +al 00FA5A .AudioPathOnNonZero_FA5A +al 00FA46 .AudioPathOnCarry_FA46 +al 00FA41 .AudioPathOnCarry_FA41 +al 00FA4E .UpdatePulse2OnNonZero_FA4E +al 00FA26 .AudioPathLoop_FA26 +al 00FA21 .AudioPathLoop_FA21 +al 00FA0C .UpdatePulse2Routine_FA0C +al 00FA07 .AudioPathOnNonZero_FA07 +al 00FA04 .UpdatePulse1OnNonZero_FA04 +al 00F9FC .AudioPathOnCarry_F9FC +al 00F9F2 .AudioPathOnCarry_F9F2 +al 00F9D3 .UpdatePulse1Routine_F9D3 +al 00F9D8 .AudioPathOnNonZero_F9D8 +al 00F9BB .AudioPathLoop_F9BB +al 00F9AE .AudioPathLoop_F9AE +al 00F9A7 .AudioPathOnNonZero_F9A7 +al 00F9A1 .AudioPathOnNonZero_F9A1 +al 00F9A9 .AudioPathOnNonZero_F9A9 +al 00F999 .AudioPathOnNonZero_F999 +al 00F98D .AudioPathLoop_F98D +al 00F97E .AudioPathLoop_F97E +al 00F9C3 .UpdatePulse1OnNonZero_F9C3 +al 00F976 .UpdatePulse1Dispatch_F976 +al 00F971 .AudioPathLoop_F971 +al 00F9D9 .AudioPathOnNoCarry_F9D9 +al 00F95C .AudioPathOnNonZero_F95C +al 00F94D .UpdatePulse1OnNonZero_F94D +al 00F92B .UpdatePulse1OnZero_F92B +al 00F935 .UpdatePulse1OnNoCarry_F935 +al 00F917 .UpdatePulse1Loop_F917 +al 00F95F .UpdatePulse1OnNoCarry_F95F +al 00F8E2 .AudioPathOnNonZero_F8E2 +al 00F8D8 .AudioPathLoop_F8D8 +al 00F8CA .AudioPathLoop_F8CA +al 00F9CF .ProcessAudioStateDispatch_F9CF +al 00F8C7 .AudioPathLoop_F8C7 +al 00F8EA .UpdatePulse1OnNoCarry_F8EA +al 00F8BD .AudioPathOnNoCarry_F8BD +al 00F8B5 .AudioPathLoop_F8B5 +al 00F8F9 .UpdatePulse1OnNoCarry_F8F9 +al 00F9CB .ProcessAudioStateDispatch_F9CB +al 00F895 .AudioPathContinue_F895 +al 00F890 .AudioPathOnNonZero_F890 +al 00F881 .AudioPathOnNonZero_F881 +al 00F875 .AudioPathLoop_F875 +al 00F871 .AudioPathLoop_F871 +al 00F86B .AudioPathLoop_F86B +al 00F818 .ProcessAudioStateRoutine_F818 +al 00F814 .ProcessAudioStateRoutine_F814 +al 00F813 .AudioPathOnZero_F813 +al 00F802 .UpdatePulse1Loop_F802 +al 00F800 .ProcessAudioStateRoutine_F800 +al 00F7FD .ProcessAudioStateRoutine_F7FD +al 00F7F6 .UpdatePulse1Routine_F7F6 +al 00F7F2 .AudioPathContinue_F7F2 +al 00F7EC .AudioPathOnZero_F7EC +al 00FB22 .ProcessAudioStateRoutine_FB22 +al 00FACF .ProcessAudioStateRoutine_FACF +al 00FA2E .ProcessAudioStateRoutine_FA2E +al 00F898 .ProcessAudioStateRoutine_F898 +al 00F7B0 .EnginePathLoop_F7B0 +al 00F79D .EnginePathLoop_F79D +al 00F77C .EnginePathContinue_F77C +al 00F719 .EnginePath_F719 +al 00F70B .EnginePathLoop_F70B +al 00F6FD .EnginePathLoop_F6FD +al 00F6E4 .EnginePathLoop_F6E4 +al 00F6E2 .EnginePathLoop_F6E2 +al 00F6E7 .EnginePathOnNonZero_F6E7 +al 00F6D4 .EnginePathOnOverflowClear_F6D4 +al 00F6A3 .EnginePathLoop_F6A3 +al 00F6AF .EnginePathOnZero_F6AF +al 00F69C .EnginePathLoop_F69C +al 00F6C0 .EnginePathOnOverflowSet_F6C0 +al 00F6BE .EnginePathOnNegative_F6BE +al 00F682 .EnginePathLoop_F682 +al 00F667 .EnginePathLoop_F667 +al 00F665 .EnginePathLoop_F665 +al 00F661 .EnginePathLoop_F661 +al 00F677 .EnginePathOnZero_F677 +al 00F707 .ProcessResourceStateRoutine_F707 +al 00F659 .EnginePathOnZero_F659 +al 00F6B0 .EnginePathOnNonZero_F6B0 +al 00F6FB .ProcessResourceStateRoutine_F6FB +al 00F600 .EnginePathLoop_F600 +al 00F5F5 .EnginePathLoop_F5F5 +al 00F5F4 .EnginePathOnZero_F5F4 +al 00F5C0 .EnginePathLoop_F5C0 +al 00F5BE .ProcessResourceStateRoutine_F5BE +al 00F59D .EnginePathOnZero_F59D +al 00F589 .EnginePathOnZero_F589 +al 00F583 .EnginePathLoop_F583 +al 00F55E .EnginePathOnNoCarry_F55E +al 00F56A .EnginePathContinue_F56A +al 00F549 .EnginePathLoop_F549 +al 00F574 .EnginePathOnNonZero_F574 +al 00F56F .EnginePathOnCarry_F56F +al 00F51E .EnginePathLoop_F51E +al 00F544 .EnginePathLoop_F544 +al 00F56B .EnginePathOnZero_F56B +al 00F515 .EnginePathLoop_F515 +al 00F4EE .EnginePathOnCarry_F4EE +al 00F4E2 .EnginePathOnCarry_F4E2 +al 00F4C6 .EnginePathLoop_F4C6 +al 00F4CA .EnginePathOnNoCarry_F4CA +al 00F4B9 .EnginePathOnNoCarry_F4B9 +al 00F4F1 .ProcessResourceStateRoutine_F4F1 +al 00F4AD .EnginePathOnCarry_F4AD +al 00F491 .EnginePathOnZero_F491 +al 00F48B .EnginePathOnNonZero_F48B +al 00F4CF .ProcessResourceStateRoutine_F4CF +al 00F4AE .ProcessResourceStateRoutine_F4AE +al 00F436 .EnginePathLoop_F436 +al 00F45D .EnginePathOnZero_F45D +al 00F459 .EnginePathOnZero_F459 +al 00F429 .ProcessResourceStateRoutine_F429 +al 00F41F .EnginePathOnNonZero_F41F +al 00F40E .EnginePathOnNonZero_F40E +al 00F407 .EnginePathOnNoCarry_F407 +al 00F3CB .UpdateCommandBufferLoop_F3CB +al 00F3B4 .UpdateCommandBufferLoop_F3B4 +al 00F38F .UpdateCommandBufferOnZero_F38F +al 00F370 .UpdateCommandBufferLoop_F370 +al 00F3F7 .UpdateCommandBufferRoutine_F3F7 +al 00F3F5 .ProcessResourceStateRoutine_F3F5 +al 00F3A0 .EnginePathContinue_F3A0 +al 00F32C .UpdateCommandBufferRoutine_F32C +al 00F302 .EnginePathOnNonZero_F302 +al 00F2F4 .EnginePathOnNonZero_F2F4 +al 00F2DE .EnginePathLoop_F2DE +al 00F2C5 .EnginePathOnCarry_F2C5 +al 00F2C2 .EnginePathLoop_F2C2 +al 00F2BF .EnginePathOnNoCarry_F2BF +al 00F2B3 .EnginePathOnCarry_F2B3 +al 00F29C .EnginePathLoop_F29C +al 00F295 .EnginePathLoop_F295 +al 00F27C .EnginePathLoop_F27C +al 00F266 .EnginePathLoop_F266 +al 00F248 .UpdateCommandBufferOnNonZero_F248 +al 00F22D .UpdateCommandBufferLoop_F22D +al 00F220 .ResourceInputCollisionCode +al 00F21B .PPUCommandLoop_F21B +al 00F249 .PPUCommandReadNextByte_F249 +al 00E73C .UpdateObjectBufferOnNoCarry_E73C +al 00E731 .ObjectPathOnZero_E731 +al 00E700 .UpdateObjectBuffer_E700 +al 00E6FD .ProcessObjectStateDispatch_E6FD +al 00E6F9 .ObjectPathLoop_E6F9 +al 00E6D7 .UpdateObjectBufferOnNonZero_E6D7 +al 00E6CC .ObjectPathLoop_E6CC +al 00E6C5 .ObjectPathOnNonZero_E6C5 +al 00E6F2 .ObjectPathLoop_E6F2 +al 00E69C .ReadObjectRecordLoop_E69C +al 00E59B .ObjectPathLoop_E59B +al 00E592 .UpdateObjectRecordOnZero_E592 +al 00E571 .UpdateObjectRecordOnZero_E571 +al 00E55A .UpdateObjectRecordLoop_E55A +al 00E59C .ObjectPathOnZero_E59C +al 00E547 .ObjectPathLoop_E547 +al 00E538 .ObjectPathLoop_E538 +al 00E4EA .UpdateObjectRecordLoop_E4EA +al 00E4E3 .ReadObjectRecordOnZero_E4E3 +al 00E49F .UpdateObjectRecordOnZero_E49F +al 00E49B .ObjectPathOnNonZero_E49B +al 00E491 .ObjectPathOnNonZero_E491 +al 00E470 .ReadObjectRecordLoop_E470 +al 00E40F .ReadObjectRecordOnNoCarry_E40F +al 00E3F4 .UpdateObjectRecordOnNoCarry_E3F4 +al 00E405 .ProcessObjectStateRoutine_E405 +al 00E3E4 .UpdateObjectRecordOnCarry_E3E4 +al 00E3B6 .UpdateObjectRecord_E3B6 +al 00E380 .ObjectPathOnZero_E380 +al 00E35C .ReadObjectRecord_E35C +al 00E37E .ObjectPathLoop_E37E +al 00E350 .ObjectPathOnNoCarry_E350 +al 00E313 .UpdateObjectRecordOnZero_E313 +al 00E301 .UpdateObjectRecordOnNoCarry_E301 +al 00E2D8 .ReadObjectRecordOnPositive_E2D8 +al 00E2AA .UpdateObjectRecordRoutine_E2AA +al 00E2B9 .ObjectPathOnNegative_E2B9 +al 00E2B5 .ObjectPathOnNegative_E2B5 +al 00E2E6 .UpdateObjectRecordRoutine_E2E6 +al 00E2BA .ObjectPathOnCarry_E2BA +al 00E2C7 .ReadObjectRecordOnNonZero_E2C7 +al 00E275 .UpdateObjectRecordOnPositive_E275 +al 00E251 .UpdateObjectRecordOnNonZero_E251 +al 00E249 .ObjectPathOnNoCarry_E249 +al 00E69A .ProcessObjectStateRoutine_E69A +al 00E21D .ObjectPathOnNoCarry_E21D +al 00E281 .ProcessObjectStateRoutine_E281 +al 00E1FD .UpdateObjectRecordOnNonZero_E1FD +al 00E1E8 .ObjectPathOnNegative_E1E8 +al 00E229 .UpdateObjectRecordRoutine_E229 +al 00E262 .ReadObjectRecordRoutine_E262 +al 00E1CF .UpdateObjectRecordOnPositive_E1CF +al 00E1BD .ObjectPathOnNonZero_E1BD +al 00E1B9 .ObjectPathContinue_E1B9 +al 00E1A3 .ObjectPathOnCarry_E1A3 +al 00E1A7 .ObjectPathOnZero_E1A7 +al 00E191 .ObjectPathOnCarry_E191 +al 00E1BB .ObjectPathContinue_E1BB +al 00E15B .ObjectPathLoop_E15B +al 00E165 .ObjectPathOnCarry_E165 +al 00E153 .ReadObjectRecordOnZero_E153 +al 00E15D .ReadObjectRecordOnZero_E15D +al 00E13F .ReadObjectRecordRoutine_E13F +al 00E118 .ObjectPathLoop_E118 +al 00E0D2 .UpdateObjectBufferOnNonZero_E0D2 +al 00E0B5 .ObjectPathLoop_E0B5 +al 00E09C .UpdateObjectRecordOnZero_E09C +al 00E080 .UpdateObjectRecordOnNoCarry_E080 +al 00E09B .ObjectPathContinue_E09B +al 00E069 .ObjectPathOnNonZero_E069 +al 00E059 .ObjectPathOnNoCarry_E059 +al 00E04F .ObjectPathOnNoCarry_E04F +al 00E045 .ProcessObjectStateRoutine_E045 +al 00DFE6 .ObjectPathOnZero_DFE6 +al 00DFD1 .ObjectPathLoop_DFD1 +al 00DFA3 .ObjectPathOnCarry_DFA3 +al 00DFAC .UpdateObjectBufferContinue_DFAC +al 00DF7D .ObjectPathOnNonZero_DF7D +al 00DF66 .UpdateObjectBufferDispatch_DF66 +al 00DF53 .ObjectPathLoop_DF53 +al 00DF1F .ObjectPathOnCarry_DF1F +al 00DEE2 .UpdateObjectBufferOnNoCarry_DEE2 +al 00DED5 .ObjectPathLoop_DED5 +al 00DE8B .ProcessObjectStateRoutine_DE8B +al 00DE6B .ObjectPathOnCarry_DE6B +al 00DE55 .UpdateObjectBufferOnCarry_DE55 +al 00DE4D .ObjectPathOnNonZero_DE4D +al 00DE3C .UpdateObjectBufferOnZero_DE3C +al 00DE81 .UpdateObjectBufferRoutine_DE81 +al 00DE31 .ObjectPathLoop_DE31 +al 00DE26 .UpdateObjectBufferLoop_DE26 +al 00DE17 .ObjectPathLoop_DE17 +al 00DDF3 .ObjectPathOnCarry_DDF3 +al 00DDDB .ObjectPathLoop_DDDB +al 00DDE3 .ObjectPathOnNonZero_DDE3 +al 00DDC7 .ObjectPathLoop_DDC7 +al 00DDF8 .ObjectPathOnZero_DDF8 +al 00DDAC .ObjectPathContinue_DDAC +al 00DD99 .ObjectPathLoop_DD99 +al 00DD8E .ObjectPathOnNegative_DD8E +al 00DD67 .UpdateObjectBufferLoop_DD67 +al 00DD4F .ObjectPathOnNonZero_DD4F +al 00DD5A .ObjectPathOnNonZero_DD5A +al 00DD3E .ObjectPathOnNonZero_DD3E +al 00DD2F .ObjectPathOnNonZero_DD2F +al 00DD20 .ObjectPathOnNonZero_DD20 +al 00DCE9 .ObjectPathOnNonZero_DCE9 +al 00DCD6 .ObjectPathOnZero_DCD6 +al 00DD08 .ObjectPathOnZero_DD08 +al 00DCEA .ObjectPathOnZero_DCEA +al 00DCBB .UpdateObjectBufferOnZero_DCBB +al 00DC9E .ObjectPathOnNegative_DC9E +al 00DC8A .ObjectPathLoop_DC8A +al 00DC72 .ObjectPathLoop_DC72 +al 00DC66 .UpdateObjectBufferLoop_DC66 +al 00DC44 .ObjectPathLoop_DC44 +al 00DC1E .ObjectPathLoop_DC1E +al 00DC18 .ObjectPathOnZero_DC18 +al 00DC2E .ObjectPathLoop_DC2E +al 00DC34 .ObjectPathOnZero_DC34 +al 00DC3E .ObjectPathOnNegative_DC3E +al 00DC36 .ObjectPathLoop_DC36 +al 00DBD3 .ObjectPathLoop_DBD3 +al 00DBA7 .UpdateObjectBufferOnNegative_DBA7 +al 00DB8A .ProcessObjectStateRoutine_DB8A +al 00DBC3 .ObjectPathContinue_DBC3 +al 00DB30 .ReadObjectRecordOnNoCarry_DB30 +al 00DB0A .ReadObjectRecordLoop_DB0A +al 00DB28 .ObjectPathOnNegative_DB28 +al 00DB27 .ObjectPathContinue_DB27 +al 00DABD .ObjectPathOnZero_DABD +al 00DAB5 .ObjectPathOnZero_DAB5 +al 00DA9F .ObjectPathOnZero_DA9F +al 00DA81 .ObjectPathOnCarry_DA81 +al 00DA79 .ObjectPathOnCarry_DA79 +al 00DA8B .ObjectPathOnNonZero_DA8B +al 00DA65 .ObjectPathOnZero_DA65 +al 00DA85 .ObjectPathLoop_DA85 +al 00DA3E .ObjectPathOnZero_DA3E +al 00DA36 .ObjectPathOnNonZero_DA36 +al 00DA8A .ObjectPathContinue_DA8A +al 00DA14 .ObjectPathOnNoCarry_DA14 +al 00D9F2 .ObjectPathOnNoCarry_D9F2 +al 00DA04 .UpdateObjectBufferRoutine_DA04 +al 00D9E1 .ObjectPathOnNoCarry_D9E1 +al 00D9E2 .UpdateObjectBufferRoutine_D9E2 +al 00D9CF .ObjectPathOnNonZero_D9CF +al 00D9CB .ObjectPathOnCarry_D9CB +al 00D9DE .ObjectPathContinue_D9DE +al 00D9B1 .ProcessObjectStateRoutine_D9B1 +al 00D9A0 .ObjectPathOnNoCarry_D9A0 +al 00D998 .ObjectPathLoop_D998 +al 00D987 .UpdateObjectBufferLoop_D987 +al 00D978 .ObjectPathOnNonZero_D978 +al 00D95A .ObjectPathOnNoCarry_D95A +al 00D96D .ObjectPathContinue_D96D +al 00D93D .UpdateObjectBufferOnZero_D93D +al 00D918 .UpdateObjectBufferLoop_D918 +al 00D8F2 .UpdateObjectBufferLoop_D8F2 +al 00D928 .ObjectPathOnCarry_D928 +al 00D8E1 .ObjectPathOnPositive_D8E1 +al 00D904 .ProcessObjectStateDispatch_D904 +al 00D970 .ProcessObjectStateRoutine_D970 +al 00D8D2 .ObjectPathLoop_D8D2 +al 00D8C6 .UpdateObjectBufferLoop_D8C6 +al 00F71C .ProcessResourceStateRoutine_F71C +al 00D896 .UpdateObjectBufferOnPositive_D896 +al 00D888 .ObjectPathOnZero_D888 +al 00D8A5 .ObjectPathContinue_D8A5 +al 00D86E .ObjectPathLoop_D86E +al 00D862 .UpdateObjectBufferLoop_D862 +al 00D842 .UpdateObjectRecordOnNoCarry_D842 +al 00D83A .ObjectPathOnZero_D83A +al 00D82F .ObjectPathLoop_D82F +al 00D828 .ReadObjectRecordOnCarry_D828 +al 00D804 .ObjectPathOnNonZero_D804 +al 00D7F0 .UpdateObjectRecordOnNonZero_D7F0 +al 00D7E8 .ObjectPathOnNoCarry_D7E8 +al 00D7DD .ProcessObjectStateDispatch_D7DD +al 00D7DB .ObjectPathLoop_D7DB +al 00D809 .ObjectPathOnZero_D809 +al 00D807 .ObjectPathOnCarry_D807 +al 00D80D .ReadObjectRecordLoop_D80D +al 00D7B9 .TestObjectFieldOnNoCarry_D7B9 +al 00D814 .UpdateObjectRecordContinue_D814 +al 00D7A1 .ObjectPathOnNoCarry_D7A1 +al 00D794 .UpdateObjectRecordOnNonZero_D794 +al 00D765 .UpdateObjectRecordOnCarry_D765 +al 00D75D .ObjectPathOnCarry_D75D +al 00D755 .ObjectPathOnCarry_D755 +al 00D7A4 .ReadObjectRecordContinue_D7A4 +al 00D775 .UpdateObjectRecordOnNonZero_D775 +al 00D736 .ObjectPathLoop_D736 +al 00D72A .ObjectPathContinue_D72A +al 00D716 .ObjectPathLoop_D716 +al 00D6D6 .UpdateObjectRecordLoop_D6D6 +al 00D6C0 .UpdateObjectBufferOnNonZero_D6C0 +al 00D6A8 .ObjectPathOnNonZero_D6A8 +al 00D699 .ObjectPathOnZero_D699 +al 00D680 .UpdateObjectRecordLoop_D680 +al 00D68E .UpdateObjectRecordContinue_D68E +al 00D6A9 .ReadObjectRecordOnZero_D6A9 +al 00D65B .ReadObjectRecordLoop_D65B +al 00D64C .ObjectPathLoop_D64C +al 00D73B .UpdateObjectBufferDispatch_D73B +al 00D649 .ObjectPathLoop_D649 +al 00D646 .ObjectPathLoop_D646 +al 00D643 .ObjectPathLoop_D643 +al 00D640 .ObjectPathLoop_D640 +al 00D62A .UpdateObjectRecordLoop_D62A +al 00D615 .ObjectPathLoop_D615 +al 00D60C .UpdateObjectRecordOnNoCarry_D60C +al 00D5FF .UpdateObjectRecordOnNoCarry_D5FF +al 00D5F6 .ObjectPathOnCarry_D5F6 +al 00D5F8 .ObjectPathOnZero_D5F8 +al 00D5D5 .ReadObjectRecordOnNonZero_D5D5 +al 00D5C7 .UpdateObjectRecordOnNonZero_D5C7 +al 00D5C9 .ObjectPathOnNonZero_D5C9 +al 00D5CC .ObjectPathContinue_D5CC +al 00D5A3 .UpdateObjectRecordDispatch_D5A3 +al 00D59F .ProcessObjectStateDispatch_D59F +al 00D777 .ReadObjectRecordDispatch_D777 +al 00D595 .UpdateObjectRecordOnNonZero_D595 +al 00D555 .UpdateObjectRecordDispatch_D555 +al 00D548 .UpdateObjectRecordLoop_D548 +al 00D546 .ObjectPathOnNonZero_D546 +al 00D54C .ObjectPathOnNoCarry_D54C +al 00D527 .UpdateObjectRecordDispatch_D527 +al 00DD5B .UpdateObjectBufferRoutine_DD5B +al 00D67A .ProcessObjectStateDispatch_D67A +al 00D4FC .UpdateObjectRecordOnCarry_D4FC +al 00D57E .UpdateObjectRecordDispatch_D57E +al 00D4F9 .ObjectPathOnNonZero_D4F9 +al 00D783 .ProcessObjectStateDispatch_D783 +al 00D4C6 .ObjectPathLoop_D4C6 +al 00D4B8 .UpdateObjectRecordOnZero_D4B8 +al 00D4CB .UpdateObjectRecordContinue_D4CB +al 00D4DE .UpdateObjectRecordOnCarry_D4DE +al 00D4D5 .ReadObjectRecordOnCarry_D4D5 +al 00D481 .ReadObjectRecordDispatch_D481 +al 00D49E .UpdateObjectRecordDispatch_D49E +al 00D47E .ObjectPathOnNoCarry_D47E +al 00D476 .ObjectPathLoop_D476 +al 00D4A3 .ObjectPathOnNegative_D4A3 +al 00D436 .UpdateObjectBufferLoop_D436 +al 00D416 .ObjectPathLoop_D416 +al 00D41A .UpdateObjectRecordOnZero_D41A +al 00D418 .ObjectPathOnNonZero_D418 +al 00D3FF .ObjectPathOnZero_D3FF +al 00D3DC .ObjectPathOnNonZero_D3DC +al 00D3E0 .ObjectPathOnPositive_D3E0 +al 00D3DA .ObjectPathContinue_D3DA +al 00D3A2 .UpdateObjectBufferOnNoCarry_D3A2 +al 00D396 .UpdateObjectBufferOnNonZero_D396 +al 00D3AF .UpdateObjectBufferOnZero_D3AF +al 00D384 .UpdateObjectBufferOnZero_D384 +al 00D382 .ObjectPathOnZero_D382 +al 00D401 .UpdateObjectRecordDispatch_D401 +al 00D34B .ObjectPathLoop_D34B +al 00D36E .UpdateObjectRecordOnZero_D36E +al 00E335 .UpdateObjectRecordRoutine_E335 +al 00D331 .ReadObjectRecordLoop_D331 +al 00D32F .ObjectPathLoop_D32F +al 00D32B .ObjectPathLoop_D32B +al 00D312 .UpdateObjectRecordLoop_D312 +al 00D30B .UpdateObjectRecordOnZero_D30B +al 00D2E0 .UpdateObjectRecordOnZero_D2E0 +al 00D2C7 .ObjectPathOnZero_D2C7 +al 00E325 .UpdateObjectRecordRoutine_E325 +al 00D2B5 .UpdateObjectRecordOnZero_D2B5 +al 00D2D0 .ObjectPathOnZero_D2D0 +al 00D2CE .ObjectPathOnZero_D2CE +al 00D275 .ObjectPathLoop_D275 +al 00D272 .ObjectPathOnZero_D272 +al 00D277 .ObjectPathOnZero_D277 +al 00D25F .ObjectPathLoop_D25F +al 00D23A .ObjectPathOnNegative_D23A +al 00D220 .ObjectPathOnPositive_D220 +al 00D222 .UpdateObjectBufferOnNonZero_D222 +al 00D254 .ObjectPathContinue_D254 +al 00D1EF .ObjectPathOnZero_D1EF +al 00D1E6 .ObjectPathOnZero_D1E6 +al 00D1F4 .ObjectPathOnNonZero_D1F4 +al 00D16D .UpdateObjectRecordOnNoCarry_D16D +al 00D161 .ObjectPathOnCarry_D161 +al 00D158 .ObjectPathLoop_D158 +al 00D14E .ObjectPathOnNoCarry_D14E +al 00D13A .UpdateObjectRecordOnNonZero_D13A +al 00D14F .ObjectPathOnNoCarry_D14F +al 00D132 .ObjectPathContinue_D132 +al 00DDB2 .ProcessObjectStateRoutine_DDB2 +al 00D102 .ObjectPathLoop_D102 +al 00D0EB .ObjectPathLoop_D0EB +al 00D0D4 .ObjectPathLoop_D0D4 +al 00D0BD .ObjectPathLoop_D0BD +al 00F601 .ProcessResourceStateRoutine_F601 +al 00D04C .UpdateObjectRecordOnZero_D04C +al 00D045 .ObjectPathOnNonZero_D045 +al 00D04F .ProcessObjectStateDispatch_D04F +al 00D01A .UpdateObjectRecordOnCarry_D01A +al 00D052 .UpdateObjectRecordOnZero_D052 +al 00CFF7 .UpdateObjectRecordContinue_CFF7 +al 00CFDB .ReadObjectRecordOnNonZero_CFDB +al 00D004 .UpdateObjectRecordOnZero_D004 +al 00CFFA .ProcessObjectStateDispatch_CFFA +al 00CF9E .ObjectPathLoop_CF9E +al 00CFAD .UpdateObjectRecordLoop_CFAD +al 00CF96 .UpdateObjectRecordOnCarry_CF96 +al 00CF6B .UpdateObjectRecordOnZero_CF6B +al 00CF3C .ReadObjectRecordDispatch_CF3C +al 00CF1E .ObjectPathContinue_CF1E +al 00CF02 .ObjectPathContinue_CF02 +al 00D94D .ProcessObjectStateRoutine_D94D +al 00CED7 .ObjectPathLoop_CED7 +al 00CECA .ObjectPathOnZero_CECA +al 00CE96 .ObjectPathContinue_CE96 +al 00CE7A .ObjectPathLoop_CE7A +al 00E0F9 .UpdateObjectBufferRoutine_E0F9 +al 00CE9D .ObjectPathOnZero_CE9D +al 00CE6D .ObjectPathLoop_CE6D +al 00CE6F .ObjectPathOnZero_CE6F +al 00CE60 .ObjectPathLoop_CE60 +al 00CE41 .ObjectPathOnZero_CE41 +al 00CE26 .ObjectPathOnZero_CE26 +al 00CE2A .ProcessObjectStateDispatch_CE2A +al 00CE34 .ObjectPathOnZero_CE34 +al 00CE33 .ObjectPathContinue_CE33 +al 00CE50 .ProcessObjectStateRoutine_CE50 +al 00CDE4 .UpdateObjectBufferContinue_CDE4 +al 00CDBE .ObjectPathOnCarry_CDBE +al 00CDCE .ObjectPathContinue_CDCE +al 00CDCD .ObjectPathContinue_CDCD +al 00CD70 .ObjectPathOnZero_CD70 +al 00CD64 .ObjectPathLoop_CD64 +al 00CD62 .ObjectPathOnZero_CD62 +al 00CD5C .ObjectPathOnNoCarry_CD5C +al 00CD45 .UpdateObjectRecordRoutine_CD45 +al 00CD1E .UpdateObjectRecordRoutine_CD1E +al 00CCDE .UpdateObjectRecordLoop_CCDE +al 00CCF7 .UpdateObjectRecordRoutine_CCF7 +al 00CCD9 .ObjectPathLoop_CCD9 +al 00CD54 .ProcessObjectStateRoutine_CD54 +al 00CCEF .ObjectPathOnCarry_CCEF +al 00CCE9 .ObjectPathContinue_CCE9 +al 00CCCC .ObjectPathContinue_CCCC +al 00CCB8 .ObjectEngineCodeAndTables +al 00CCB6 .@SetObjectFieldOffset +al 00CC40 .MovementTables +al 00E28F .ProcessObjectStateRoutine_E28F +al 00CC1F .RunGameTaskDispatch_CC1F +al 00E3A7 .UpdateObjectRecordRoutine_E3A7 +al 00CC22 .CorePathOnNoCarry_CC22 +al 00E351 .ReadObjectRecordRoutine_E351 +al 00CCA8 .PrepareObjectMovementContext +al 00E1BF .ProcessObjectStateRoutine_E1BF +al 00E17F .ProcessObjectStateRoutine_E17F +al 00CC10 .CorePathContinue_CC10 +al 00E5AA .ReadObjectRecordRoutine_E5AA +al 00E06A .ReadObjectRecordRoutine_E06A +al 00CC23 .CorePathOnCarry_CC23 +al 00E539 .ReadObjectRecordRoutine_E539 +al 00E468 .UpdateObjectBufferRoutine_E468 +al 00CBFA .CorePathOnPositive_CBFA +al 00CBAE .CorePathLoop_CBAE +al 00F2EA .ProcessResourceStateDispatch_F2EA +al 00CB85 .CorePathOnNonZero_CB85 +al 00CB5E .UpdateGameStateOnZero_CB5E +al 00CB56 .UpdatePlayerStateOnZero_CB56 +al 00D42C .ProcessObjectStateRoutine_D42C +al 00CB3F .UpdatePlayerStateOnZero_CB3F +al 00CB15 .UpdateGameStateOnNonZero_CB15 +al 00CAD4 .CorePathLoop_CAD4 +al 00CA4D .CorePathOnNonZero_CA4D +al 00CA25 .UpdateGameStateLoop_CA25 +al 00CA1D .CorePathLoop_CA1D +al 00CBA8 .RunGameTaskRoutine_CBA8 +al 00DF5E .UpdateObjectBuffer_DF5E +al 00DE15 .ObjectPath_DE15 +al 00D211 .ProcessObjectStateRoutine_D211 +al 00CA09 .CorePathOnZero_CA09 +al 00DF2F .ObjectPath_DF2F +al 00CB87 .RunGameTaskDispatch_CB87 +al 00C9D3 .CorePathOnZero_C9D3 +al 00CB8C .RunGameTaskRoutine_CB8C +al 00C9B8 .UpdateGameStateOnZero_C9B8 +al 00F257 .ProcessResourceStateRoutine_F257 +al 00C9DA .CorePathOnZero_C9DA +al 00C99B .UpdateGameStateOnNonZero_C99B +al 00C986 .CorePathContinue_C986 +al 00C974 .CorePathContinue_C974 +al 00C95D .CorePathOnNonZero_C95D +al 00C94D .CorePathLoop_C94D +al 00C939 .CorePathLoop_C939 +al 00C937 .CorePathLoop_C937 +al 00C941 .CorePathContinue_C941 +al 00E0B2 .ProcessObjectStateRoutine_E0B2 +al 00E0DF .UpdateObjectBufferRoutine_E0DF +al 00C907 .CorePathLoop_C907 +al 00C8FB .RunGameTaskRoutine_C8FB +al 00C8E1 .CorePathLoop_C8E1 +al 00C8D6 .RunGameTaskRoutine_C8D6 +al 00CBD3 .RunGameTaskRoutine_CBD3 +al 00C8CA .CorePathLoop_C8CA +al 00C8B9 .RunGameTaskRoutine_C8B9 +al 00C8AA .RunGameTaskRoutine_C8AA +al 00C889 .CorePathLoop_C889 +al 00C875 .CorePathLoop_C875 +al 00C873 .CorePathLoop_C873 +al 00C86A .CorePathLoop_C86A +al 00C862 .CorePathLoop_C862 +al 00C851 .CorePathLoop_C851 +al 00C82C .CorePathOnZero_C82C +al 00C81E .CorePathLoop_C81E +al 00C80F .CorePathLoop_C80F +al 00C808 .CorePathOnZero_C808 +al 00F500 .ProcessResourceStateRoutine_F500 +al 00C816 .RunGameTaskRoutine_C816 +al 00C7DD .CorePathOnZero_C7DD +al 00C79B .CorePathOnNegative_C79B +al 00C78B .RunGameTaskDispatch_C78B +al 00C77C .CorePathLoop_C77C +al 00C77A .CorePathOnNonZero_C77A +al 00C76A .CorePathOnZero_C76A +al 00C7AD .RunGameTaskDispatch_C7AD +al 00C772 .RunGameTaskDispatch_C772 +al 00C72E .CorePathContinue_C72E +al 00C713 .UpdateGameStateOnZero_C713 +al 00C703 .CorePathOnNonZero_C703 +al 00C6E5 .CorePathOnNonZero_C6E5 +al 00C73D .CorePathOnZero_C73D +al 00C73A .CorePathOnZero_C73A +al 00C740 .CorePathOnZero_C740 +al 00C6BB .CorePathLoop_C6BB +al 00C6B8 .CorePathLoop_C6B8 +al 00C6B5 .CorePathLoop_C6B5 +al 00D0A5 .ProcessObjectStateRoutine_D0A5 +al 00D083 .ProcessObjectStateRoutine_D083 +al 00C6A8 .CorePathOnNonZero_C6A8 +al 00C6A2 .CorePathOnNonZero_C6A2 +al 00C689 .CorePathLoop_C689 +al 00C67F .CorePathOnZero_C67F +al 00C678 .CorePathLoop_C678 +al 00C7E8 .RunGameTaskDispatch_C7E8 +al 00C66B .CorePathLoop_C66B +al 00C667 .CorePathOnNegative_C667 +al 00C66A .CorePathLoop_C66A +al 00C670 .CorePathOnZero_C670 +al 00C654 .CorePathLoop_C654 +al 00C682 .CorePathOnZero_C682 +al 00D44A .ProcessObjectStateRoutine_D44A +al 00C62D .RunGameTaskDispatch_C62D +al 00C621 .RunGameTaskDispatch_C621 +al 00C80B .RunGameTaskDispatch_C80B +al 00C824 .RunGameTaskRoutine_C824 +al 00C830 .RunGameTaskRoutine_C830 +al 00C60E .CorePathOnZero_C60E +al 00C601 .CorePathLoop_C601 +al 00C61E .CorePathOnZero_C61E +al 00C5FF .CorePathOnNonZero_C5FF +al 00C5F7 .RunGameTaskDispatch_C5F7 +al 00C5F2 .RunGameTaskDispatch_C5F2 +al 00C5EC .UpdatePlayerStateDispatch_C5EC +al 00C81A .RunGameTaskRoutine_C81A +al 00C5E4 .CorePathOnNonZero_C5E4 +al 00C5CB .CorePathLoop_C5CB +al 00C5C8 .CorePathLoop_C5C8 +al 00C7E5 .RunGameTaskDispatch_C7E5 +al 00F408 .ProcessResourceStateRoutine_F408 +al 00C5A5 .CorePathOnZero_C5A5 +al 00C594 .UpdatePlayerStateLoop_C594 +al 00C590 .CorePathOnNonZero_C590 +al 00C5C5 .CorePathContinue_C5C5 +al 00C584 .CorePathLoop_C584 +al 00C7EA .RunGameTaskDispatch_C7EA +al 00C809 .RunGameTaskRoutine_C809 +al 00C7EF .RunGameTaskRoutine_C7EF +al 00F40C .ProcessResourceStateRoutine_F40C +al 00F3A1 .UpdateCommandBufferRoutine_F3A1 +al 00C56B .CorePathOnZero_C56B +al 00C547 .UpdatePlayerStateLoop_C547 +al 00C581 .CorePathOnNonZero_C581 +al 00C53B .RunGameTaskDispatch_C53B +al 00C51A .CorePathOnNonZero_C51A +al 00F31A .ProcessResourceStateRoutine_F31A +al 00C7F3 .RunGameTaskRoutine_C7F3 +al 00C4EB .CorePathLoop_C4EB +al 00C4E1 .CorePathOnNonZero_C4E1 +al 00C4D1 .CorePathLoop_C4D1 +al 00C4C3 .CorePathLoop_C4C3 +al 00C4BF .CorePathOnZero_C4BF +al 00DD48 .ProcessObjectStateDispatch_DD48 +al 00F77D .ProcessResourceStateRoutine_F77D +al 00C4A9 .CorePathOnNonZero_C4A9 +al 00C4A3 .UpdatePlayerStateOnNonZero_C4A3 +al 00C4B3 .CorePathLoop_C4B3 +al 00D1CE .ProcessObjectStateRoutine_D1CE +al 00DA26 .ProcessObjectStateRoutine_DA26 +al 00C504 .UpdatePlayerStateRoutine_C504 +al 00C46E .CorePathLoop_C46E +al 00C467 .CorePathLoop_C467 +al 00C463 .RunGameTaskRoutine_C463 +al 00C45A .CorePathOnZero_C45A +al 00C475 .CorePathOnCarry_C475 +al 00C43A .UpdatePlayerStateLoop_C43A +al 00C438 .CorePathLoop_C438 +al 00D1AE .UpdateObjectBufferRoutine_D1AE +al 00C432 .CorePathLoop_C432 +al 00C437 .CorePathOnNonZero_C437 +al 00C421 .CorePathLoop_C421 +al 00C41C .CorePathContinue_C41C +al 00C402 .UpdateGameStateRoutine_C402 +al 00C3EE .CorePathOnNonZero_C3EE +al 00C6BE .RunGameTaskRoutine_C6BE +al 00C3DF .CorePathContinue_C3DF +al 00C400 .CorePathOnZero_C400 +al 00C3BC .UpdateGameStateRoutine_C3BC +al 00C3E0 .CorePathOnZero_C3E0 +al 00C3CC .CorePathLoop_C3CC +al 00C3A3 .CorePathOnNonZero_C3A3 +al 00C3A9 .UpdateGameStateContinue_C3A9 +al 00C387 .CorePathOnNonZero_C387 +al 00C38D .CorePathOnZero_C38D +al 00F577 .ProcessResourceStateRoutine_F577 +al 00C373 .UpdateGameStateOnNonZero_C373 +al 00C3CD .CorePathOnNonZero_C3CD +al 00C359 .UpdateGameStateOnNonZero_C359 +al 00C342 .UpdatePlayerStateLoop_C342 +al 00C33A .CorePathLoop_C33A +al 00C365 .CorePathContinue_C365 +al 00C31C .CorePathOnZero_C31C +al 00C310 .UpdatePlayerStateContinue_C310 +al 00C2F8 .CorePathLoop_C2F8 +al 00C2F1 .UpdateGameStateDispatch_C2F1 +al 00C2DD .UpdateGameStateOnNonZero_C2DD +al 00C2D4 .InitializePlayerAndGameState +al 00C2CA .CorePathLoop_C2CA +al 00C84B .RunGameTaskRoutine_C84B +al 00C2C3 .CorePathLoop_C2C3 +al 00D209 .ObjectPath_D209 +al 00C47A .UpdateGameStateRoutine_C47A +al 00D0F6 .UpdateObjectBuffer_D0F6 +al 00DD8F .UpdateObjectBuffer_DD8F +al 00D1D6 .ObjectPath_D1D6 +al 00D0DF .ObjectPath_D0DF +al 00DBC7 .UpdateObjectBuffer_DBC7 +al 00DA91 .ObjectPath_DA91 +al 00E6F3 .ProcessObjectStateRoutine_E6F3 +al 00D0B1 .ObjectPath_D0B1 +al 00CFA1 .ObjectPath_CFA1 +al 00D0C8 .UpdateObjectBuffer_D0C8 +al 00D97B .ObjectPath_D97B +al 00D64F .UpdateObjectBuffer_D64F +al 00D8BA .ObjectPath_D8BA +al 00D856 .ObjectPath_D856 +al 00DB52 .UpdateObjectBuffer_DB52 +al 00DC5A .ObjectPath_DC5A +al 00DD10 .ObjectPath_DD10 +al 00D08F .ObjectPath_D08F +al 00C286 .CorePathContinue_C286 +al 00CBC6 .RunGameTaskRoutine_CBC6 +al 00D06D .ObjectPath_D06D +al 00D11E .ReadObjectRecord_D11E +al 00CD7B .ReadObjectRecord_CD7B +al 00DADA .ReadObjectRecord_DADA +al 00CBE3 .ProcessCurrentObjectRoutine_CBE3 +al 00D27D .UpdateObjectRecord_D27D +al 00C264 .ProcessCurrentObjectContinue_C264 +al 00D34E .ObjectPath_D34E +al 00CBB9 .RunGameTaskRoutine_CBB9 +al 00C245 .CoreGameCode +al 00C234 .NMIReadPPUStatus_C234 +al 00C368 .RunGameTaskRoutine_C368 +al 00DDC1 .ObjectPath_DDC1 +al 00F5AE .EnginePath_F5AE +al 00F7C1 .AudioDriverCode +al 00E113 .ObjectPath_E113 +al 00F20B .ResourceAndLevelData +al 00C996 .UpdateGameStateRoutine_C996 +al 00C1F1 .NMIHandler +al 00F58D .EnginePath_F58D +al 00C1EB .InterruptPathDispatch_C1EB +al 00C3E4 .RunGameTaskRoutine_C3E4 +al 00CBA6 .RunGameTaskRoutine_CBA6 +al 00C1B8 .InterruptPathLoop_C1B8 +al 00C1B6 .InterruptPathOnZero_C1B6 +al 00C1B4 .InterruptPathOnNonZero_C1B4 +al 00C1A2 .InterruptPathLoop_C1A2 +al 00C196 .ResetEntry +al 00C0E9 .StartupObjectTemplateData_C0E9 +al 00C0B4 .DirectionAndCoordinateTables_C0B4 +al 00C058 .ResourceDescriptorData_C058 +al 00C044 .TitleOrMessageTileString +al 00C008 .ResourceScriptPointerTable +al 00C000 .DeveloperCreditText diff --git a/Clu Clu Land (JU)/copilot/reconstructed.map b/Clu Clu Land (JU)/copilot/reconstructed.map new file mode 100644 index 0000000..1ad1cc6 --- /dev/null +++ b/Clu Clu Land (JU)/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/Clu Clu Land (JU)/copilot/reconstructed.nes b/Clu Clu Land (JU)/copilot/reconstructed.nes new file mode 100644 index 0000000000000000000000000000000000000000..682b885982db1d771124f262de3dcf563e87e632 GIT binary patch literal 24592 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 A5dZ)H literal 0 HcmV?d00001 diff --git a/Clu Clu Land (JU)/copilot/rom.nes b/Clu Clu Land (JU)/copilot/rom.nes new file mode 120000 index 0000000..ba0d050 --- /dev/null +++ b/Clu Clu Land (JU)/copilot/rom.nes @@ -0,0 +1 @@ +../rom.nes \ No newline at end of file diff --git a/Clu Clu Land (JU)/copilot/symbols.inc b/Clu Clu Land (JU)/copilot/symbols.inc new file mode 100644 index 0000000..9baab5a --- /dev/null +++ b/Clu Clu Land (JU)/copilot/symbols.inc @@ -0,0 +1,35 @@ +;------------------------------------------------------------ +; NES hardware registers +;------------------------------------------------------------ + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +SQ1_VOL = $4000 +SQ1_SWEEP = $4001 +SQ1_LO = $4002 +SQ1_HI = $4003 + +SQ2_VOL = $4004 +SQ2_SWEEP = $4005 +SQ2_LO = $4006 +SQ2_HI = $4007 + +TRI_LINEAR = $4008 +TRI_LO = $400A +TRI_HI = $400B + +NOISE_VOL = $400C +NOISE_LO = $400E +NOISE_HI = $400F + +OAMDMA = $4014 +APUSTATUS = $4015 +JOY1 = $4016 +JOY2 = $4017 diff --git a/Clu Clu Land (JU)/rom.nes b/Clu Clu Land (JU)/rom.nes new file mode 100644 index 0000000000000000000000000000000000000000..682b885982db1d771124f262de3dcf563e87e632 GIT binary patch literal 24592 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 diff --git a/Defender 2 (U)/copilot/header.o b/Defender 2 (U)/copilot/header.o deleted file mode 100644 index 6bb7a71f8072309500fe4bb2c2a57d19036bcba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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/Donkey Kong 3 (JUE)/copilot/chr.s b/Donkey Kong 3 (JUE)/copilot/chr.s new file mode 100644 index 0000000..f6a8c21 --- /dev/null +++ b/Donkey Kong 3 (JUE)/copilot/chr.s @@ -0,0 +1,2 @@ +.segment "CHR" + .incbin "chr.bin" \ No newline at end of file diff --git a/Donkey Kong 3 (JUE)/copilot/header.s b/Donkey Kong 3 (JUE)/copilot/header.s new file mode 100644 index 0000000..224dde7 --- /dev/null +++ b/Donkey Kong 3 (JUE)/copilot/header.s @@ -0,0 +1,2 @@ +.segment "HEADER" + .incbin "rom.nes", 0, 16 \ No newline at end of file diff --git a/Donkey Kong 3 (JUE)/copilot/linker.cfg b/Donkey Kong 3 (JUE)/copilot/linker.cfg new file mode 100644 index 0000000..cfaf881 --- /dev/null +++ b/Donkey Kong 3 (JUE)/copilot/linker.cfg @@ -0,0 +1,10 @@ +MEMORY { + HEADER: start = $0000, size = $0010, fill = yes; + PRG: start = $C000, size = $4000, fill = yes; + CHR: start = $0000, size = $2000, fill = yes; +} +SEGMENTS { + HEADER: load = HEADER, type = ro; + PRG: load = PRG, type = ro; + CHR: load = CHR, type = ro; +} \ No newline at end of file diff --git a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/locals.inc b/Donkey Kong 3 (JUE)/copilot/locals.inc similarity index 95% rename from _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/locals.inc rename to Donkey Kong 3 (JUE)/copilot/locals.inc index 95b0cb4..4a38844 100644 --- a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/locals.inc +++ b/Donkey Kong 3 (JUE)/copilot/locals.inc @@ -1,4 +1,4 @@ -; Defender II application-specific symbols identified in Pass 2. +; Donkey Kong 3 application-specific symbols identified in Pass 2. ControllerSerialBits = $00 WorkPointerOrValueLo = $01 @@ -120,23 +120,23 @@ AudioChannelRequest = $FF ; Main RAM OamBuffer = $0200 Ram_02E0 = $02E0 -Ram_0300 = $0300 +ObjectState = $0300 Ram_0301 = $0301 -Ram_0302 = $0302 -Ram_0303 = $0303 +ObjectType = $0302 +ObjectField3 = $0303 Ram_0304 = $0304 -Ram_0305 = $0305 -Ram_0306 = $0306 -Ram_0307 = $0307 -Ram_0308 = $0308 -Ram_0309 = $0309 +ObjectLookupIndex = $0305 +ObjectField6 = $0306 +ObjectField7 = $0307 +ObjectField8 = $0308 +ObjectField9 = $0309 Ram_030A = $030A Ram_030B = $030B Ram_030C = $030C Ram_030D = $030D -Ram_030E = $030E +ObjectFieldE = $030E Ram_0310 = $0310 -Ram_0312 = $0312 +ObjectCounter = $0312 Ram_0320 = $0320 Ram_0321 = $0321 Ram_0326 = $0326 diff --git a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/prg.s b/Donkey Kong 3 (JUE)/copilot/prg.s similarity index 97% rename from _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/prg.s rename to Donkey Kong 3 (JUE)/copilot/prg.s index dd70b1b..eaf838c 100644 --- a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/prg.s +++ b/Donkey Kong 3 (JUE)/copilot/prg.s @@ -3,6 +3,7 @@ .include "locals.inc" .segment "PRG" +.org $C000 ; Overlapping table aliases. These tables intentionally begin inside encoded ; instruction bytes, so they are expressed as relocatable symbol aliases rather @@ -324,8 +325,8 @@ ScreenStateHandlerTable: .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. +; Local behavior: Reads ControllerButtons, DispatchGameModePhase, ClearAudioRequestFlags; mutates GameMode, CurrentScreenState. +; Parameters: ControllerButtons, DispatchGameModePhase, ClearAudioRequestFlags. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- @@ -333,7 +334,7 @@ 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 + bne DispatchGameModePhase ; 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 @@ -345,31 +346,31 @@ HandleStartAndPlayerSelection: ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C13A: +ClearActorFlagsLoop: sta ActorFlags,x ; PRG $013A | CPU $C13A | 95 84 dex ; PRG $013C | CPU $C13C | CA - bpl Flow_C13A ; PRG $013D | CPU $C13D | 10 FB + bpl ClearActorFlagsLoop ; 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. +; Local behavior: Reads PlayerModeOrScreenPhase, DispatchGameModePhase, CheckGameModeZero, ClearAudioSetGameMode, StartInputLatch, CheckScreenSelectionPosition, SelectedPlayerAndScreenFlags, StoreSelectedPlayerAndScreenFlags; mutates no direct memory mutation observed. +; Parameters: PlayerModeOrScreenPhase, DispatchGameModePhase, CheckGameModeZero, ClearAudioSetGameMode, StartInputLatch, CheckScreenSelectionPosition, SelectedPlayerAndScreenFlags, StoreSelectedPlayerAndScreenFlags. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C142: +DispatchGameModePhase: ldx PlayerModeOrScreenPhase ; PRG $0142 | CPU $C142 | A6 3C - beq Flow_C18D ; PRG $0144 | CPU $C144 | F0 47 + beq DispatchScreenState ; PRG $0144 | CPU $C144 | F0 47 cmp #$20 ; PRG $0146 | CPU $C146 | C9 20 - bne Flow_C167 ; PRG $0148 | CPU $C148 | D0 1D + bne CheckGameModeZero ; PRG $0148 | CPU $C148 | D0 1D cpx #$01 ; PRG $014A | CPU $C14A | E0 01 - bne Flow_C160 ; PRG $014C | CPU $C14C | D0 12 + bne StoreSelectedPlayerAndScreenFlags ; PRG $014C | CPU $C14C | D0 12 lda StartInputLatch ; PRG $014E | CPU $C14E | A5 37 - bne Flow_C173 ; PRG $0150 | CPU $C150 | D0 21 + bne ClampScreenSelectionPositionMin ; 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 + bne StoreSelectedPlayerAndScreenFlags ; PRG $0157 | CPU $C157 | D0 02 ldy #$00 ; PRG $0159 | CPU $C159 | A0 00 ; ----------------------------------------------------------------------------- ; Global purpose: Flow C15 B. @@ -378,32 +379,32 @@ Flow_C142: ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C15B: +StoreSelectedPlayerAndScreenFlags: 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. +; Local behavior: Reads ClearAudioRequestFlags, DispatchScreenStateHandler; mutates PlayerModeOrScreenPhase. +; Parameters: ClearAudioRequestFlags, DispatchScreenStateHandler. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C160: +ClearAudioSetGameMode: 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 + beq DispatchScreenState ; 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. +; Local behavior: Reads UpdateZp_37_C16F, ConvertPlayerSlotToOamOffset; mutates StartInputLatch. +; Parameters: UpdateZp_37_C16F, ConvertPlayerSlotToOamOffset. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C167: +CheckGameModeZero: 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 + beq ConvertPlayerSlotToOamOffset ; PRG $016D | CPU $C16D | F0 0E ; ----------------------------------------------------------------------------- ; Global purpose: Update Zp 37 C16 F. ; Local behavior: Reads implicit CPU state or none observed; mutates StartInputLatch. @@ -416,27 +417,27 @@ UpdateZp_37_C16F: sta StartInputLatch ; PRG $0171 | CPU $C171 | 85 37 ; ----------------------------------------------------------------------------- ; Global purpose: Flow C173. -; Local behavior: Reads ScreenSelectionPositionOrDelay, Flow_C17D; mutates ScreenSelectionPositionOrDelay. -; Parameters: ScreenSelectionPositionOrDelay, Flow_C17D. +; Local behavior: Reads ScreenSelectionPositionOrDelay, ConvertPlayerSlotToOamOffset; mutates ScreenSelectionPositionOrDelay. +; Parameters: ScreenSelectionPositionOrDelay, ConvertPlayerSlotToOamOffset. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C173: +ClampScreenSelectionPositionMin: 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 + bcs ConvertPlayerSlotToOamOffset ; 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. +; Local behavior: Reads DispatchScreenStateHandler, SelectedPlayerAndScreenFlags; mutates OamBuffer. +; Parameters: DispatchScreenStateHandler, SelectedPlayerAndScreenFlags. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C17D: +ConvertPlayerSlotToOamOffset: cpx #$01 ; PRG $017D | CPU $C17D | E0 01 - bne Flow_C18D ; PRG $017F | CPU $C17F | D0 0C + bne DispatchScreenState ; 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 @@ -452,7 +453,7 @@ Flow_C17D: ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C18D: +DispatchScreenState: 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 @@ -558,18 +559,18 @@ HideOamSpritesLoop: ; Returns: returns to caller; flags/register result depends on final instructions: rts. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C1F4: +ReturnFromPpuTransfer: 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. +; Local behavior: Reads QueuedPpuTransferCount, ReturnFromPpuTransfer, QueuedPpuTransferSourcePageTable, QueuedPpuTransferDestinationOffsetTable, BeginPpuCommandStream; mutates QueuedPpuTransferCount. +; Parameters: QueuedPpuTransferCount, ReturnFromPpuTransfer, 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 + beq ReturnFromPpuTransfer ; 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 @@ -751,15 +752,15 @@ ReturnFromMetaspriteRender: rts ; PRG $02A7 | CPU $C2A7 | 60 ; ----------------------------------------------------------------------------- ; Global purpose: Decrement Object Timer. -; Local behavior: Reads ObjectRecordPointerLo, Flow_C2B3; mutates ObjectRecordPointerLo. -; Parameters: ObjectRecordPointerLo, Flow_C2B3. +; Local behavior: Reads ObjectRecordPointerLo, ReturnFromComputeOrDispatch; mutates ObjectRecordPointerLo. +; Parameters: ObjectRecordPointerLo, ReturnFromComputeOrDispatch. ; 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 + beq ReturnFromComputeOrDispatch ; 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 @@ -770,22 +771,22 @@ DecrementObjectTimer: ; Returns: returns to caller; flags/register result depends on final instructions: rts. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C2B3: +ReturnFromComputeOrDispatch: 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. +; Local behavior: Reads DecrementObjectTimer, ReturnFromComputeOrDispatch, ObjectRecordPointerLo, ObjectRecordPointerHi, ProcessObjectTableData, Flow_C2EF, Flow_C30F; mutates no direct memory mutation observed. +; Parameters: DecrementObjectTimer, ReturnFromComputeOrDispatch, ObjectRecordPointerLo, ObjectRecordPointerHi, ProcessObjectTableData, 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 + bne ReturnFromComputeOrDispatch ; 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 + beq ProcessObjectTableData ; 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 @@ -793,32 +794,32 @@ ComputeOrDispatch_C2B4: rts ; PRG $02C9 | CPU $C2C9 | 60 ; ----------------------------------------------------------------------------- ; Global purpose: Flow C2 CA. -; Local behavior: Reads IndexedGameplayLookupTable_F5D4; mutates Ram_0305. +; Local behavior: Reads IndexedGameplayLookupTable_F5D4; mutates ObjectLookupIndex. ; Parameters: IndexedGameplayLookupTable_F5D4. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- -Flow_C2CA: +ReadGameplayLookupValue: lda IndexedGameplayLookupTable_F5D4,y ; PRG $02CA | CPU $C2CA | B9 D4 F5 - sta Ram_0305,x ; PRG $02CD | CPU $C2CD | 9D 05 03 + sta ObjectLookupIndex,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. +; Local behavior: Reads ObjectLookupIndex, IndexedGameplayLookupTable_F5D4, ReadGameplayLookupValue, ObjectType; mutates ObjectField6, ObjectField3, ObjectLookupIndex. +; Parameters: ObjectLookupIndex, IndexedGameplayLookupTable_F5D4, ReadGameplayLookupValue, ObjectType. +; Returns: returns to caller; flags/register result depends on final instructions: tya; sta ObjectLookupIndex,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 +ProcessObjectTableData: + ldy ObjectLookupIndex,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 + beq ReadGameplayLookupValue ; PRG $02D9 | CPU $C2D9 | F0 EF + sta ObjectField6,x ; PRG $02DB | CPU $C2DB | 9D 06 03 + lda ObjectType,x ; PRG $02DE | CPU $C2DE | BD 02 03 + sta ObjectField3,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 + sta ObjectLookupIndex,x ; PRG $02E5 | CPU $C2E5 | 9D 05 03 rts ; PRG $02E8 | CPU $C2E8 | 60 ; ----------------------------------------------------------------------------- ; Global purpose: Flow C2 E9. @@ -2360,13 +2361,13 @@ Flow_C898: 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. +; Local behavior: Reads ObjectState, Flow_C8B0; mutates ScreenCollisionState, Ram_0360, GameplayStateFlags. +; Parameters: ObjectState, 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 + lda ObjectState ; 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 @@ -2389,7 +2390,7 @@ Flow_C8B0: 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. +; Local behavior: Reads implicit CPU state or none observed; mutates ScreenCollisionState, ObjectState, 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. @@ -2397,7 +2398,7 @@ Flow_C8B0: 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 + sta ObjectState ; 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 ; ----------------------------------------------------------------------------- @@ -2782,28 +2783,28 @@ Flow_C9EA: .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. +; Local behavior: Reads ScreenObjectMode, Flow_CB5F; mutates ObjectState, ObjectField7, ObjectType, ObjectLookupIndex, ObjectFieldE, Ram_0301, ObjectField6, ObjectCounter. ; 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 + sta ObjectState ; PRG $0B2D | CPU $CB2D | 8D 00 03 + sta ObjectField7 ; 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 + sta ObjectType ; 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 + sta ObjectLookupIndex ; 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 ObjectFieldE ; 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 + sta ObjectField6 ; PRG $0B45 | CPU $CB45 | 8D 06 03 + sta ObjectCounter ; 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 + sta ObjectField8 ; 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 + sta ObjectField9 ; 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 @@ -2888,18 +2889,18 @@ 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. +; Local behavior: Reads ObjectState, Flow_CBF5, ObjectCounter, Flow_CBD1, SelectedScreenVariant, Flow_CBCF; mutates ObjectCounter. +; Parameters: ObjectState, Flow_CBF5, ObjectCounter, 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 + lda ObjectState ; 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 + lda ObjectCounter ; 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 + dec ObjectCounter ; 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 @@ -2929,22 +2930,22 @@ Flow_CBD1: 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. +; Local behavior: Reads ObjectFieldE, Flow_CBF5; mutates ObjectFieldE, ScreenObjectCounter, Ram_0301, ObjectState. +; Parameters: ObjectFieldE, 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 + lda ObjectFieldE ; 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 + sta ObjectFieldE ; 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 + sta ObjectState ; 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. @@ -2956,19 +2957,19 @@ 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. +; Local behavior: Reads CoordinateValue, ObjectField3; mutates ObjectField8, Ram_0301, Ram_030B, Ram_030C, ObjectField3. +; Parameters: CoordinateValue, ObjectField3. +; Returns: returns to caller; flags/register result depends on final instructions: sta Ram_030C; inc ObjectField3; 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 + sta ObjectField8 ; 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 + inc ObjectField3 ; PRG $0C06 | CPU $CC06 | EE 03 03 rts ; PRG $0C09 | CPU $CC09 | 60 ; ----------------------------------------------------------------------------- ; Global purpose: Flow CC0 A. @@ -3003,21 +3004,21 @@ 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. +; Local behavior: Reads ObjectField8; mutates ObjectField8. +; Parameters: ObjectField8. ; 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 + inc ObjectField8 ; 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. +; Local behavior: Reads implicit CPU state or none observed; mutates AudioEffectRequest, Ram_0301, Ram_030B, ObjectField3. ; Parameters: implicit CPU state or none observed. -; Returns: returns to caller; flags/register result depends on final instructions: lda #$01; sta Ram_0303; rts. +; Returns: returns to caller; flags/register result depends on final instructions: lda #$01; sta ObjectField3; rts. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- Flow_CC22: @@ -3025,7 +3026,7 @@ Flow_CC22: 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 + sta ObjectField3 ; PRG $0C2C | CPU $CC2C | 8D 03 03 rts ; PRG $0C2F | CPU $CC2F | 60 ; ----------------------------------------------------------------------------- ; Global purpose: Flow CC30. @@ -3055,21 +3056,21 @@ Flow_CC33: ldy #$FF ; PRG $0C43 | CPU $CC43 | A0 FF ; ----------------------------------------------------------------------------- ; Global purpose: Flow CC45. -; Local behavior: Reads Ram_0309; mutates Ram_0309. -; Parameters: Ram_0309. +; Local behavior: Reads ObjectField9; mutates ObjectField9. +; Parameters: ObjectField9. ; 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 + adc ObjectField9 ; PRG $0C47 | CPU $CC47 | 6D 09 03 + sta ObjectField9 ; 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. +; Local behavior: Reads Ram_030B, IndexedGameplayLookupTable_CD85, Flow_CC30, ObjectField8, ObjectField3; mutates Ram_030B, ObjectField8, ObjectField3. +; Parameters: Ram_030B, IndexedGameplayLookupTable_CD85, Flow_CC30, ObjectField8, ObjectField3. +; Returns: returns to caller; flags/register result depends on final instructions: sta ObjectField8; inc ObjectField3; rts. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- Flow_CC4D: @@ -3079,26 +3080,26 @@ Flow_CC4D: 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 + adc ObjectField8 ; PRG $0C5B | CPU $CC5B | 6D 08 03 + sta ObjectField8 ; PRG $0C5E | CPU $CC5E | 8D 08 03 + inc ObjectField3 ; 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. +; Local behavior: Reads ObjectState, Flow_CC6F, Continuation_CD2E; mutates no direct memory mutation observed. +; Parameters: ObjectState, 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 + lda ObjectState ; 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. +; Local behavior: Reads Ram_0301, Flow_CC4D, Flow_CC33, CollisionExtent, Flow_CC0A, Flow_CC89, ObjectField8, ComputeOrDispatch_CC12; mutates no direct memory mutation observed. +; Parameters: Ram_0301, Flow_CC4D, Flow_CC33, CollisionExtent, Flow_CC0A, Flow_CC89, ObjectField8, ComputeOrDispatch_CC12. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- @@ -3112,7 +3113,7 @@ Flow_CC6F: 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 + lda ObjectField8 ; PRG $0C82 | CPU $CC82 | AD 08 03 cmp #$C8 ; PRG $0C85 | CPU $CC85 | C9 C8 bne ComputeOrDispatch_CC12 ; PRG $0C87 | CPU $CC87 | D0 89 ; ----------------------------------------------------------------------------- @@ -3137,14 +3138,14 @@ Flow_CC89: 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. +; Local behavior: Reads implicit CPU state or none observed; mutates ObjectField3. ; 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 + sta ObjectField3 ; PRG $0CA5 | CPU $CCA5 | 8D 03 03 ; ----------------------------------------------------------------------------- ; Global purpose: Flow CCA8. ; Local behavior: Reads Ram_030B, Flow_CCBB; mutates Ram_030C, Ram_030B. @@ -3178,8 +3179,8 @@ Flow_CCBB: 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. +; Local behavior: Reads CollisionExtent, Flow_CCD7, ObjectField9, SignedOffsetAccumulator, Continuation_CCDD; mutates no direct memory mutation observed. +; Parameters: CollisionExtent, Flow_CCD7, ObjectField9, SignedOffsetAccumulator, Continuation_CCDD. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- @@ -3187,24 +3188,24 @@ 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 + lda ObjectField9 ; 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. +; Local behavior: Reads ObjectField9, SignedOffsetAccumulator; mutates no direct memory mutation observed. +; Parameters: ObjectField9, 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 + lda ObjectField9 ; 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. +; Local behavior: Reads UpdateZp_13_CDCE, Flow_CCF2, FrameCounter, Flow_CD28; mutates ObjectField9, 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. @@ -3213,7 +3214,7 @@ 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 + sty ObjectField9 ; 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 @@ -3232,26 +3233,26 @@ Flow_CCF2: 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. +; Local behavior: Reads ObjectField3, Ram_030C, Flow_CD10; mutates Ram_030B, ObjectField3, Ram_030C, ObjectField6. +; Parameters: ObjectField3, 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 ObjectField3 ; 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 + sta ObjectField6 ; 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. +; Local behavior: Reads Ram_0304, Flow_CD28, ObjectField6, Flow_CD23; mutates ObjectField3. +; Parameters: Ram_0304, Flow_CD28, ObjectField6, Flow_CD23. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- @@ -3259,11 +3260,11 @@ 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 + lda ObjectField6 ; 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 + sta ObjectField3 ; PRG $0D20 | CPU $CD20 | 8D 03 03 ; ----------------------------------------------------------------------------- ; Global purpose: Flow CD23. ; Local behavior: Reads implicit CPU state or none observed; mutates Ram_030C. @@ -3305,16 +3306,16 @@ Continuation_CD2E: 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. +; Local behavior: Reads Ram_0301; mutates ObjectField3, ObjectLookupIndex, 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 + sta ObjectField3 ; 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 + sta ObjectLookupIndex ; 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 @@ -3355,18 +3356,18 @@ Flow_CD64: rts ; PRG $0D67 | CPU $CD67 | 60 ; ----------------------------------------------------------------------------- ; Global purpose: Flow CD68. -; Local behavior: Reads Ram_0301; mutates Ram_0305, Ram_030C, Ram_0308, Ram_0301. +; Local behavior: Reads Ram_0301; mutates ObjectLookupIndex, Ram_030C, ObjectField8, Ram_0301. ; Parameters: Ram_0301. -; Returns: returns to caller; flags/register result depends on final instructions: sta Ram_0308; inc Ram_0301; rts. +; Returns: returns to caller; flags/register result depends on final instructions: sta ObjectField8; 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 + sta ObjectLookupIndex ; 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 + sta ObjectField8 ; PRG $0D74 | CPU $CD74 | 8D 08 03 inc Ram_0301 ; PRG $0D77 | CPU $CD77 | EE 01 03 rts ; PRG $0D7A | CPU $CD7A | 60 ; ----------------------------------------------------------------------------- @@ -3397,18 +3398,18 @@ IndexedGameplayLookupTable_CD85: .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. +; Local behavior: Reads ObjectState, Flow_CDCD, Ram_0304, ObjectField6, Flow_CDC8, Flow_CDCA; mutates Ram_0304. +; Parameters: ObjectState, Flow_CDCD, Ram_0304, ObjectField6, 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 + lda ObjectState ; 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 + lda ObjectField6 ; 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 @@ -3426,13 +3427,13 @@ 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. +; Local behavior: Reads implicit CPU state or none observed; mutates ObjectField6. ; 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 + sta ObjectField6 ; 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. @@ -3444,13 +3445,13 @@ Flow_CDCD: rts ; PRG $0DCD | CPU $CDCD | 60 ; ----------------------------------------------------------------------------- ; Global purpose: Update Zp 13 CDCE. -; Local behavior: Reads Ram_0308; mutates CoordinateValue. -; Parameters: Ram_0308. +; Local behavior: Reads ObjectField8; mutates CoordinateValue. +; Parameters: ObjectField8. ; 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 + lda ObjectField8 ; PRG $0DCE | CPU $CDCE | AD 08 03 sta CoordinateValue ; PRG $0DD1 | CPU $CDD1 | 85 13 ldx #$00 ; PRG $0DD3 | CPU $CDD3 | A2 00 ; ----------------------------------------------------------------------------- @@ -3514,13 +3515,13 @@ 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. +; Local behavior: Reads ObjectField8, ScreenObjectMode, Flow_CE0A; mutates CoordinateValue. +; Parameters: ObjectField8, 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 + lda ObjectField8 ; 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 @@ -3532,13 +3533,13 @@ CalculateAndClampValue_CDF6: 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. +; Local behavior: Reads ObjectField9; mutates no direct memory mutation observed. +; Parameters: ObjectField9. ; 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 + ldy ObjectField9 ; 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. @@ -3756,29 +3757,29 @@ Flow_CF0C: 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. +; Local behavior: Reads ObjectField8, Ram_0304, PackedHudOrObjectValue, UpdateRam_032E_CF6D, Ram_0301; mutates PackedHudOrObjectValue, ObjectField8, Ram_0301, Ram_030B. +; Parameters: ObjectField8, 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 + lda ObjectField8,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 + sta ObjectField8,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 + sta ObjectField8,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. +; Local behavior: Reads FrameCounter, UpdateRam_032E_CF6D, Ram_030B, IndexedGameplayLookupTable_CF8C, Flow_CF6A, ObjectField8, Flow_CF58; mutates ObjectField8, Ram_030B. +; Parameters: FrameCounter, UpdateRam_032E_CF6D, Ram_030B, IndexedGameplayLookupTable_CF8C, Flow_CF6A, ObjectField8, Flow_CF58. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- @@ -3791,8 +3792,8 @@ Flow_CF33: 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 + adc ObjectField8,x ; PRG $0F43 | CPU $CF43 | 7D 08 03 + sta ObjectField8,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 @@ -3907,8 +3908,8 @@ Flow_CFB8: 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. +; Local behavior: Reads ObjectField8, ObjectField9, GameplayObjectAnimation, Flow_D003; mutates GameplayObjectFlags, Ram_0304, Ram_0340, Ram_034C, Ram_0343, Ram_0342, Ram_0348, Ram_0349. +; Parameters: ObjectField8, ObjectField9, GameplayObjectAnimation, Flow_D003. ; Returns: continues or transfers control; no independent return. ; Clobbers: Determined by the instructions below; refined in Pass 3. ; ----------------------------------------------------------------------------- @@ -3922,11 +3923,11 @@ Flow_CFCC: 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 + lda ObjectField8 ; 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 + lda ObjectField9 ; 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 @@ -4323,15 +4324,15 @@ 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. +; Local behavior: Reads ObjectField8, ObjectField9, Ram_030D, CalculateAndClampValue_D17F, Flow_D1FB; mutates ObjectScreenY, ObjectScreenX, MovementStepIndex, MetaspriteLayoutPointerLo, MetaspriteLayoutPointerHi, Ram_032E, ObjectCounter. +; Parameters: ObjectField8, ObjectField9, 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 + lda ObjectField8 ; 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 + lda ObjectField9 ; 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 @@ -4343,7 +4344,7 @@ UpdateObjectScreenY_D1D7: 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 + sta ObjectCounter ; 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. @@ -4436,14 +4437,14 @@ Flow_D245: rts ; PRG $1256 | CPU $D256 | 60 ; ----------------------------------------------------------------------------- ; Global purpose: Flow D257. -; Local behavior: Reads implicit CPU state or none observed; mutates Ram_030E, MetaspriteLayoutPointerLo. +; Local behavior: Reads implicit CPU state or none observed; mutates ObjectFieldE, 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 + sta ObjectFieldE ; 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 @@ -8123,8 +8124,8 @@ 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. +; Local behavior: Reads Ram_04A8, ObjectField8, ObjectField9, Ram_04A9, Flow_EADB, WorkPointerOrValueHi, ComputeOrDispatch_E695; mutates WorkPointerOrValueHi, SignedOffsetAccumulator, WorkPointerOrValueLo. +; Parameters: Ram_04A8, ObjectField8, ObjectField9, 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. ; ----------------------------------------------------------------------------- @@ -8134,9 +8135,9 @@ CalculateAndClampValue_EABE: 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 + sbc ObjectField8 ; 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 + lda ObjectField9 ; 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 @@ -9946,7 +9947,6 @@ 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/Donkey Kong 3 (JUE)/copilot/reconstructed.lbl b/Donkey Kong 3 (JUE)/copilot/reconstructed.lbl new file mode 100644 index 0000000..1d703a1 --- /dev/null +++ b/Donkey Kong 3 (JUE)/copilot/reconstructed.lbl @@ -0,0 +1,697 @@ +al 00FC8C .Flow_FC8C +al 00FC89 .Flow_FC89 +al 00FC92 .Flow_FC92 +al 00FFC3 .IndexedGameplayLookupTable_FFC3 +al 00FC5E .Flow_FC5E +al 00FC5A .Flow_FC5A +al 00FC5D .Flow_FC5D +al 00FC41 .Flow_FC41 +al 00FC2F .Flow_FC2F +al 00FC6A .UpdateApuChannelState_FC6A +al 00FC35 .Flow_FC35 +al 00FDAB .IndexedGameplayLookupTable_FDAB +al 00FDAA .IndexedGameplayLookupTable_FDAA +al 00FDA9 .IndexedGameplayLookupTable_FDA9 +al 00FDA8 .IndexedGameplayLookupTable_FDA8 +al 00FDA7 .IndexedGameplayLookupTable_FDA7 +al 00FDA6 .IndexedGameplayLookupTable_FDA6 +al 00FDA5 .IndexedGameplayLookupTable_FDA5 +al 00FDA4 .IndexedGameplayLookupTable_FDA4 +al 00FBE4 .Flow_FBE4 +al 00FBDE .Flow_FBDE +al 00FBDF .Flow_FBDF +al 00FC23 .Flow_FC23 +al 00FBEB .Flow_FBEB +al 00FBC6 .Flow_FBC6 +al 00FB94 .Flow_FB94 +al 00FB8D .Flow_FB8D +al 00FB86 .Flow_FB86 +al 00FB79 .Flow_FB79 +al 00FB74 .Flow_FB74 +al 00FBBA .Flow_FBBA +al 00FB5A .Flow_FB5A +al 00FB55 .Flow_FB55 +al 00FB63 .Flow_FB63 +al 00FB4A .Flow_FB4A +al 00FB45 .Flow_FB45 +al 00FB3C .UpdateApuChannelState_FB3C +al 00FB3A .ComputeOrDispatch_FB3A +al 00FB17 .IndexedGameplayLookupTable_FB17 +al 00FAF6 .IndexedGameplayLookupTable_FAF6 +al 00FAD4 .IndexedGameplayLookupTable_FAD4 +al 00FAF5 .LookupTableEntry_FAF5 +al 00FA4F .Flow_FA4F +al 00FB9A .Continuation_FB9A +al 00FAA4 .Flow_FAA4 +al 00FA9C .Flow_FA9C +al 00FA93 .Flow_FA93 +al 00FA6F .Flow_FA6F +al 00FA61 .Flow_FA61 +al 00FA3C .Flow_FA3C +al 00FA32 .Flow_FA32 +al 00FA82 .UpdateApuChannelState_FA82 +al 00F9F7 .Flow_F9F7 +al 00FA7F .UpdateRam_07B5_FA7F +al 00F9EF .Flow_F9EF +al 00F9DD .Flow_F9DD +al 00F9D4 .Flow_F9D4 +al 00F9EC .Flow_F9EC +al 00FA2F .Flow_FA2F +al 00F9C4 .Flow_F9C4 +al 00F9A4 .Flow_F9A4 +al 00F9CD .Flow_F9CD +al 00F99B .Flow_F99B +al 00F98D .ConfigureSoundChannel +al 00F98B .ComputeOrDispatch_F98B +al 00F96D .Flow_F96D +al 00F930 .Flow_F930 +al 00FBD6 .UpdateApuChannelState_FBD6 +al 00F923 .Flow_F923 +al 00F918 .Flow_F918 +al 00F916 .Flow_F916 +al 00F97C .IndexedGameplayLookupTable_F97C +al 00F97B .IndexedGameplayLookupTable_F97B +al 00F8F0 .Flow_F8F0 +al 00F9FD .Continuation_F9FD +al 00F8D8 .Flow_F8D8 +al 00F957 .Flow_F957 +al 00F936 .Flow_F936 +al 00F8EB .Flow_F8EB +al 00F8DB .Flow_F8DB +al 00F921 .Flow_F921 +al 00F91B .Flow_F91B +al 00F8B1 .Flow_F8B1 +al 00F8A7 .Flow_F8A7 +al 00F897 .Flow_F897 +al 00F87A .Flow_F87A +al 00F876 .ComputeOrDispatch_F876 +al 00F869 .Flow_F869 +al 00F859 .Flow_F859 +al 00FFE3 .IndexedGameplayLookupTable_FFE3 +al 00FFE2 .IndexedGameplayLookupTable_FFE2 +al 00F846 .Flow_F846 +al 00F840 .Flow_F840 +al 00F836 .StartSoundEffect +al 00F8B9 .TransformPackedValue_F8B9 +al 00EC4D .Flow_EC4D +al 00EC35 .UpdateRam_03A6_EC35 +al 00EC02 .Flow_EC02 +al 00EC08 .Flow_EC08 +al 00EC2E .Continuation_EC2E +al 00EC1D .Flow_EC1D +al 00EBE4 .Flow_EBE4 +al 00EC34 .Flow_EC34 +al 00EB70 .Flow_EB70 +al 00EB66 .Flow_EB66 +al 00EB5A .Flow_EB5A +al 00EB80 .Flow_EB80 +al 00EB27 .Flow_EB27 +al 00EB1A .Flow_EB1A +al 00EB05 .Flow_EB05 +al 00EB00 .Flow_EB00 +al 00EAF7 .Flow_EAF7 +al 00EAF5 .ComputeOrDispatch_EAF5 +al 00EAE7 .Flow_EAE7 +al 00EAE0 .Flow_EAE0 +al 00EADB .Flow_EADB +al 00EABD .Flow_EABD +al 00EABE .CalculateAndClampValue_EABE +al 00FF4C .GameplayConstantTable_FF4C +al 00EA42 .Flow_EA42 +al 00EA37 .Flow_EA37 +al 00EA4F .Flow_EA4F +al 00EA45 .Flow_EA45 +al 00EA1C .Flow_EA1C +al 00EA14 .Flow_EA14 +al 00E9CE .Flow_E9CE +al 00E9C0 .Flow_E9C0 +al 00E97C .Flow_E97C +al 00E97B .Flow_E97B +al 00E967 .Flow_E967 +al 00E974 .Flow_E974 +al 00E94C .Flow_E94C +al 00E915 .Flow_E915 +al 00E9BC .ComputeOrDispatch_E9BC +al 00E905 .Flow_E905 +al 00E8F1 .Flow_E8F1 +al 00E8E2 .Flow_E8E2 +al 00E94A .Flow_E94A +al 00E8D7 .Flow_E8D7 +al 00E8C0 .UpdateZp_01_E8C0 +al 00E8CA .Flow_E8CA +al 00E8BA .Flow_E8BA +al 00E8B8 .Flow_E8B8 +al 00E912 .Flow_E912 +al 00E8C9 .Flow_E8C9 +al 00E8AA .Flow_E8AA +al 00E85D .Flow_E85D +al 00ED03 .IndexedGameplayLookupTable_ED03 +al 00E83B .Flow_E83B +al 00E855 .Flow_E855 +al 00E830 .Continuation_E830 +al 00E829 .Flow_E829 +al 00E9BE .ComputeOrDispatch_E9BE +al 00E860 .ScreenObjectInitialStateTable +al 00E85F .ScreenObjectInitialYTable +al 00E85E .ScreenObjectInitialXTable +al 00E7CB .Flow_E7CB +al 00E695 .ComputeOrDispatch_E695 +al 00E0BA .Flow_E0BA +al 00E0AD .Flow_E0AD +al 00E08A .Flow_E08A +al 00E090 .Flow_E090 +al 00E056 .Flow_E056 +al 00E07E .Flow_E07E +al 00E0BD .Flow_E0BD +al 00E0F0 .IndexedGameplayLookupTable_E0F0 +al 00E037 .Flow_E037 +al 00E029 .Flow_E029 +al 00E01E .Flow_E01E +al 00E01F .Flow_E01F +al 00E0D2 .Continuation_E0D2 +al 00E012 .Flow_E012 +al 00DFF1 .Flow_DFF1 +al 00DFF4 .Flow_DFF4 +al 00DFCA .Flow_DFCA +al 00DFCD .Flow_DFCD +al 00E000 .UpdateRam_0402_E000 +al 00DFDC .Flow_DFDC +al 00DFBB .Flow_DFBB +al 00DFAC .Flow_DFAC +al 00DFDB .Flow_DFDB +al 00DF75 .Flow_DF75 +al 00DF81 .Flow_DF81 +al 00EB36 .CalculateAndClampValue_EB36 +al 00DF88 .Flow_DF88 +al 00EA9F .UpdateRam_04A4_EA9F +al 00DF4C .Flow_DF4C +al 00DF84 .Flow_DF84 +al 00DF1C .Flow_DF1C +al 00DF66 .Flow_DF66 +al 00DF51 .Flow_DF51 +al 00DF24 .Flow_DF24 +al 00DEFD .Flow_DEFD +al 00DEBA .Flow_DEBA +al 00DECD .ActorCollisionOrStateTable_DECD +al 00DECC .Flow_DECC +al 00DE78 .EvaluateCollisionState_DE78 +al 00DE77 .Flow_DE77 +al 00DE5E .Flow_DE5E +al 00DE61 .Flow_DE61 +al 00DDDF .UpdateRam_038D_DDDF +al 00DDBF .Flow_DDBF +al 00DDB2 .Flow_DDB2 +al 00DDC5 .Flow_DDC5 +al 00DDA1 .Flow_DDA1 +al 00DDCD .Flow_DDCD +al 00DD8D .Flow_DD8D +al 00DD70 .Flow_DD70 +al 00DD5D .Flow_DD5D +al 00DD60 .UpdateRam_0398_DD60 +al 00DD57 .Flow_DD57 +al 00DD4A .Flow_DD4A +al 00DB38 .IndexedGameplayLookupTable_DB38 +al 00DB00 .Flow_DB00 +al 00DAFE .Flow_DAFE +al 00DC27 .IndexedGameplayLookupTable_DC27 +al 00DC26 .IndexedGameplayLookupTable_DC26 +al 00DC25 .IndexedGameplayLookupTable_DC25 +al 00DC24 .IndexedGameplayLookupTable_DC24 +al 00DBA7 .IndexedGameplayLookupTable_DBA7 +al 00DBA6 .IndexedGameplayLookupTable_DBA6 +al 00DA9C .Flow_DA9C +al 00DA8A .Flow_DA8A +al 00DBA0 .IndexedGameplayLookupTable_DBA0 +al 00DA5F .Flow_DA5F +al 00DB88 .CodeOrDataPointerTable_DB88 +al 00DA30 .Flow_DA30 +al 00DA82 .UpdateRam_0373_DA82 +al 00DA13 .Flow_DA13 +al 00DAF5 .TransformPackedValue_DAF5 +al 00DA8B .Continuation_DA8B +al 00DABC .Continuation_DABC +al 00D9FC .Flow_D9FC +al 00D9D2 .Flow_D9D2 +al 00DB15 .TransformPackedValue_DB15 +al 00DBC5 .IndexedGameplayLookupTable_DBC5 +al 00DBC4 .IndexedGameplayLookupTable_DBC4 +al 00DBC3 .IndexedGameplayLookupTable_DBC3 +al 00DBC2 .IndexedGameplayLookupTable_DBC2 +al 00D9A4 .Flow_D9A4 +al 00D9FF .Flow_D9FF +al 00D9CD .UpdateRam_0375_D9CD +al 00D9B3 .Continuation_D9B3 +al 00D99E .Flow_D99E +al 00D992 .Flow_D992 +al 00D967 .Flow_D967 +al 00D94D .Flow_D94D +al 00D941 .UpdateZp_A8_D941 +al 00D912 .Flow_D912 +al 00D8F1 .Flow_D8F1 +al 00D91D .Flow_D91D +al 00D925 .Flow_D925 +al 00D8E2 .Flow_D8E2 +al 00D8A8 .Flow_D8A8 +al 00D8A5 .Flow_D8A5 +al 00D88B .Flow_D88B +al 00D8CD .Flow_D8CD +al 00D868 .Flow_D868 +al 00D8BB .Flow_D8BB +al 00D85E .Flow_D85E +al 00D8AC .Flow_D8AC +al 00D834 .Flow_D834 +al 00D824 .Flow_D824 +al 00D83E .Flow_D83E +al 00D815 .Flow_D815 +al 00D7FC .Flow_D7FC +al 00D9D3 .TransformPackedValue_D9D3 +al 00DADD .UpdateZp_03_DADD +al 00D7CC .Flow_D7CC +al 00D7D1 .Flow_D7D1 +al 00D7F1 .Flow_D7F1 +al 00D968 .IndexedGameplayLookupTable_D968 +al 00D7B9 .Flow_D7B9 +al 00D7F0 .Flow_D7F0 +al 00D7ED .Flow_D7ED +al 00DDF8 .ComputeOrDispatch_DDF8 +al 00D7AC .Flow_D7AC +al 00D7A9 .Flow_D7A9 +al 00D952 .Continuation_D952 +al 00D8D7 .Continuation_D8D7 +al 00D78F .Continuation_D78F +al 00D80A .Continuation_D80A +al 00D7B1 .Continuation_D7B1 +al 00D84A .Flow_D84A +al 00D78E .Flow_D78E +al 00D788 .Flow_D788 +al 00D78B .Flow_D78B +al 00D785 .Flow_D785 +al 00D77D .Flow_D77D +al 00D77A .Flow_D77A +al 00D73A .CodeOrDataPointerTable_D73A +al 00D72E .Flow_D72E +al 00D739 .Flow_D739 +al 00D5C8 .Flow_D5C8 +al 00D5B2 .Flow_D5B2 +al 00D596 .Flow_D596 +al 00D584 .Flow_D584 +al 00D570 .Flow_D570 +al 00D55F .Flow_D55F +al 00D544 .Flow_D544 +al 00D55D .Flow_D55D +al 00D52A .Flow_D52A +al 00D50C .Flow_D50C +al 00D6EF .CodeOrDataPointerTable_D6EF +al 00D4E6 .Flow_D4E6 +al 00D4C2 .Flow_D4C2 +al 00D559 .Flow_D559 +al 00D4B4 .Flow_D4B4 +al 00D59E .Continuation_D59E +al 00D4A6 .Flow_D4A6 +al 00D4CA .Flow_D4CA +al 00D488 .Continuation_D488 +al 00D5F9 .ComputeOrDispatch_D5F9 +al 00D5C0 .ComputeOrDispatch_D5C0 +al 00D474 .Flow_D474 +al 00D477 .Flow_D477 +al 00D500 .Continuation_D500 +al 00D5DB .UpdateZp_BC_D5DB +al 00D45E .Flow_D45E +al 00D461 .Flow_D461 +al 00D464 .Flow_D464 +al 00D498 .Flow_D498 +al 00D60D .UpdateZp_0F_D60D +al 00D603 .ComputeOrDispatch_D603 +al 00D5D1 .ComputeOrDispatch_D5D1 +al 00D5EA .UpdateZp_BC_D5EA +al 00D43D .Flow_D43D +al 00D438 .Flow_D438 +al 00D433 .Flow_D433 +al 00D41F .Flow_D41F +al 00D47A .Flow_D47A +al 00D40A .Flow_D40A +al 00D440 .Flow_D440 +al 00D3EB .Flow_D3EB +al 00D3E8 .Flow_D3E8 +al 00D3D5 .Flow_D3D5 +al 00D3B0 .Flow_D3B0 +al 00D393 .Flow_D393 +al 00D388 .Flow_D388 +al 00D3B8 .IndexedGameplayLookupTable_D3B8 +al 00D3B7 .IndexedGameplayLookupTable_D3B7 +al 00D371 .Flow_D371 +al 00D3B6 .IndexedGameplayLookupTable_D3B6 +al 00D3B5 .IndexedGameplayLookupTable_D3B5 +al 00D3B4 .Flow_D3B4 +al 00D32D .Flow_D32D +al 00D3EC .EvaluateCollisionState_D3EC +al 00D321 .Flow_D321 +al 00D32E .TransformPackedValue_D32E +al 00D300 .Flow_D300 +al 00D2D3 .Flow_D2D3 +al 00D2BF .Continuation_D2BF +al 00D2D4 .IndexedGameplayLookupTable_D2D4 +al 00D2A6 .Flow_D2A6 +al 00D292 .Flow_D292 +al 00D274 .Flow_D274 +al 00D245 .Flow_D245 +al 00D235 .Flow_D235 +al 00D225 .Flow_D225 +al 00D257 .Flow_D257 +al 00D212 .Flow_D212 +al 00D207 .Flow_D207 +al 00D1FB .Flow_D1FB +al 00D1BF .Flow_D1BF +al 00D1AE .Flow_D1AE +al 00D1C8 .IndexedGameplayLookupTable_D1C8 +al 00D1C7 .IndexedGameplayLookupTable_D1C7 +al 00D1C5 .Flow_D1C5 +al 00D173 .Flow_D173 +al 00D16D .ComputeOrDispatch_D16D +al 00D160 .Flow_D160 +al 00E9C6 .ComputeOrDispatch_E9C6 +al 00D157 .Flow_D157 +al 00D13D .Flow_D13D +al 00D171 .ComputeOrDispatch_D171 +al 00D15E .Flow_D15E +al 00D17F .CalculateAndClampValue_D17F +al 00D125 .Flow_D125 +al 00D0B3 .Flow_D0B3 +al 00D0B4 .CodeOrDataPointerTable_D0B4 +al 00D098 .Flow_D098 +al 00D071 .Flow_D071 +al 00D0A6 .Flow_D0A6 +al 00D06C .Flow_D06C +al 00D04F .UpdateRam_034E_D04F +al 00D108 .UpdateObjectScreenY_D108 +al 00D04E .Flow_D04E +al 00D03B .Flow_D03B +al 00D01C .ObjectSpawnTypeTable +al 00D01B .ObjectSpawnYTable +al 00D01A .ObjectSpawnXTable +al 00D003 .Flow_D003 +al 00D019 .Flow_D019 +al 00CFCC .Flow_CFCC +al 00CFB7 .Flow_CFB7 +al 00CFB8 .Flow_CFB8 +al 00CF83 .Flow_CF83 +al 00CF64 .Flow_CF64 +al 00CF58 .Flow_CF58 +al 00CF6A .Flow_CF6A +al 00CF8C .IndexedGameplayLookupTable_CF8C +al 00CF14 .Flow_CF14 +al 00CF84 .IndexedGameplayLookupTable_CF84 +al 00CF0C .Flow_CF0C +al 00CEE4 .Flow_CEE4 +al 00CF6D .UpdateRam_032E_CF6D +al 00CF33 .Flow_CF33 +al 00CECD .Flow_CECD +al 00CEBF .ComputeOrDispatch_CEBF +al 00CEBE .Flow_CEBE +al 00CEA8 .Flow_CEA8 +al 00CE81 .Flow_CE81 +al 00CE27 .CalculateAndClampValue_CE27 +al 00CE25 .Flow_CE25 +al 00CE0D .Flow_CE0D +al 00CE0A .Flow_CE0A +al 00CDF5 .Flow_CDF5 +al 00CDF4 .Flow_CDF4 +al 00CDE9 .Flow_CDE9 +al 00CDD9 .Flow_CDD9 +al 00CDD5 .UpdateCurrentSpriteTileId_CDD5 +al 00CDCA .Flow_CDCA +al 00CDC8 .Flow_CDC8 +al 00CDCD .Flow_CDCD +al 00CD84 .Flow_CD84 +al 00CEF2 .UpdateRam_030C_CEF2 +al 00CEE5 .UpdateRam_0301_CEE5 +al 00CD63 .Flow_CD63 +al 00CD7B .Flow_CD7B +al 00CD68 .Flow_CD68 +al 00CD64 .Flow_CD64 +al 00CD5B .Flow_CD5B +al 00CD40 .Flow_CD40 +al 00CD23 .Flow_CD23 +al 00CD10 .Flow_CD10 +al 00CD28 .Flow_CD28 +al 00CDCE .UpdateZp_13_CDCE +al 00CCDD .Continuation_CCDD +al 00CCD7 .Flow_CCD7 +al 00CCC9 .Flow_CCC9 +al 00CCBB .Flow_CCBB +al 00CCF2 .Flow_CCF2 +al 00CCA8 .Flow_CCA8 +al 00CCA3 .Flow_CCA3 +al 00CCF6 .Flow_CCF6 +al 00CC89 .Flow_CC89 +al 00CD2E .Continuation_CD2E +al 00CC6F .Flow_CC6F +al 00CD85 .IndexedGameplayLookupTable_CD85 +al 00CC4D .Flow_CC4D +al 00CC45 .Flow_CC45 +al 00CDF6 .CalculateAndClampValue_CDF6 +al 00CC33 .Flow_CC33 +al 00CC30 .Flow_CC30 +al 00CC16 .Flow_CC16 +al 00CC19 .Flow_CC19 +al 00CC12 .ComputeOrDispatch_CC12 +al 00CC22 .Flow_CC22 +al 00CC0A .Flow_CC0A +al 00CBF6 .Flow_CBF6 +al 00CBDD .Flow_CBDD +al 00CBCF .Flow_CBCF +al 00CBD1 .Flow_CBD1 +al 00CBF5 .Flow_CBF5 +al 00CDAC .UpdateRam_0304_CDAC +al 00CC65 .ComputeOrDispatch_CC65 +al 00CBB8 .UpdateRam_0312_CBB8 +al 00CFB1 .UpdateZp_54_CFB1 +al 00CBA8 .Flow_CBA8 +al 00CBB7 .Flow_CBB7 +al 00CB99 .Flow_CB99 +al 00DE62 .UpdateZp_50_DE62 +al 00DDFD .UpdateRam_0380_DDFD +al 00CE77 .ComputeOrDispatch_CE77 +al 00D6F3 .UpdateRam_036C_D6F3 +al 00D263 .TransformPackedValue_D263 +al 00CB5F .Flow_CB5F +al 00C9DF .Flow_C9DF +al 00C9EA .Flow_C9EA +al 00C9DD .Flow_C9DD +al 00C9C7 .UpdateScreenGameplayState12 +al 00C9AF .UpdateScreenGameplayState11 +al 00C9AA .Flow_C9AA +al 00C9AC .Flow_C9AC +al 00C9AE .Flow_C9AE +al 00C998 .UpdateScreenGameplayState10 +al 00C98E .Flow_C98E +al 00C991 .Flow_C991 +al 00C993 .Flow_C993 +al 00C975 .Flow_C975 +al 00C957 .Flow_C957 +al 00C94B .UpdateScreenGameplayState9 +al 00C948 .Flow_C948 +al 00C93E .UpdateScreenGameplayState8 +al 00C937 .Flow_C937 +al 00EC49 .ComputeOrDispatch_EC49 +al 00C924 .Flow_C924 +al 00C923 .Flow_C923 +al 00C8F1 .Flow_C8F1 +al 00C8D3 .Flow_C8D3 +al 00C8FC .Flow_C8FC +al 00C8D4 .Flow_C8D4 +al 00C8C6 .UpdateScreenGameplayState7 +al 00C8C5 .Flow_C8C5 +al 00C8B0 .Flow_C8B0 +al 00C8B9 .Flow_C8B9 +al 00C89D .Flow_C89D +al 00C898 .Flow_C898 +al 00C887 .Flow_C887 +al 00C865 .Flow_C865 +al 00C85D .Flow_C85D +al 00C871 .Flow_C871 +al 00C853 .Flow_C853 +al 00C84A .Flow_C84A +al 00C840 .Flow_C840 +al 00C82C .Flow_C82C +al 00C82E .Flow_C82E +al 00C837 .Flow_C837 +al 00C82F .LoadScreenCollisionState +al 00EB06 .UpdateZp_A8_EB06 +al 00E9F6 .UpdateZp_A8_E9F6 +al 00DE2E .EvaluateCollisionState_DE2E +al 00DD71 .EvaluateCollisionState_DD71 +al 00D75A .UpdateRam_0371_D75A +al 00DED5 .EvaluateCollisionState_DED5 +al 00EBC6 .UpdateZp_A8_EBC6 +al 00DF94 .EvaluateCollisionState_DF94 +al 00E86A .EvaluateCollisionState_E86A +al 00D2F2 .UpdateZp_A8_D2F2 +al 00D023 .TransformPackedValue_D023 +al 00CEA9 .UpdateZp_A8_CEA9 +al 00CB89 .UpdateZp_A8_CB89 +al 00D1D7 .UpdateObjectScreenY_D1D7 +al 00C7DD .UpdateScreenGameplayState6 +al 00E7C5 .UpdateZp_04_E7C5 +al 00CB2B .UpdateRam_0300_CB2B +al 00C7C2 .UpdateScreenGameplayState5 +al 00C7AF .Flow_C7AF +al 00C7A9 .Flow_C7A9 +al 00C797 .Flow_C797 +al 00C784 .Flow_C784 +al 00C7B0 .UpdateZp_01_C7B0 +al 00C76F .ComputeOrDispatch_C76F +al 00C755 .UpdateScreenGameplayState4 +al 00C751 .ScreenVariantInitialStateTable +al 00C73D .Flow_C73D +al 00C724 .Flow_C724 +al 00EC69 .ActorCollisionOrStateTable_EC69 +al 00C70C .Flow_C70C +al 00C710 .PrepareScreenObjectUpdate +al 00C709 .Flow_C709 +al 00C70B .Flow_C70B +al 00C6EB .UpdateActiveScreenObjects +al 00C6E4 .Flow_C6E4 +al 00C6D4 .InitializeScreenState2 +al 00C6BE .Flow_C6BE +al 00C6AB .InitializeScreenState1 +al 00C692 .Flow_C692 +al 00C663 .InitializeGameplayActors +al 00EC43 .ComputeOrDispatch_EC43 +al 00C651 .Flow_C651 +al 00C646 .Flow_C646 +al 00C642 .Continuation_C642 +al 00C634 .UpdateZp_04_C634 +al 00C624 .EvaluateCollisionState_C624 +al 00C623 .CopySelectedActorCoordinates +al 00C5FE .Flow_C5FE +al 00C601 .SelectNearestActorOrObstacle +al 00C5C0 .UpdateActorObstacleInteraction +al 00C5BF .Flow_C5BF +al 00C5AE .Flow_C5AE +al 00C5A2 .Flow_C5A2 +al 00C58F .CalculateAndClampValue_C58F +al 00C586 .Flow_C586 +al 00C58A .Flow_C58A +al 00C579 .Flow_C579 +al 00C5B1 .DecodePackedMovementDelta +al 00C56E .AddPackedMovementDelta +al 00C56D .Flow_C56D +al 00C54B .UpdateActorCoordinates_C54B +al 00C541 .Continuation_C541 +al 00C534 .ComputeOrDispatch_C534 +al 00C524 .TransformPackedValue_C524 +al 00C51E .Continuation_C51E +al 00C514 .Continuation_C514 +al 00C4F9 .UpdateActorCoordinates_C4F9 +al 00C4E9 .EvaluateCollisionState_C4E9 +al 00C4E8 .Flow_C4E8 +al 00C4C6 .TransformPackedValue_C4C6 +al 00C4C5 .Flow_C4C5 +al 00C4BD .Continuation_C4BD +al 00C4B3 .Flow_C4B3 +al 00EF7D .HudDigitGlyphPointerTableHi +al 00EF7C .HudDigitGlyphPointerTableLo +al 00C499 .SelectDigitGlyphTable +al 00C4C0 .Flow_C4C0 +al 00C476 .Flow_C476 +al 00C4D5 .AppendHudTileByte +al 00C468 .Flow_C468 +al 00C451 .ExpandPackedScoreOrHudData +al 00C447 .Flow_C447 +al 00C407 .Flow_C407 +al 00C404 .Flow_C404 +al 00C401 .Flow_C401 +al 00C3F7 .Flow_C3F7 +al 00C3E3 .Flow_C3E3 +al 00C41B .FinishPpuCommandStreamAndRestoreScroll +al 00C3C2 .Flow_C3C2 +al 00C3BC .Flow_C3BC +al 00C397 .Flow_C397 +al 00C388 .Flow_C388 +al 00C3A1 .Flow_C3A1 +al 00C3AF .Flow_C3AF +al 00C36F .Flow_C36F +al 00C361 .Flow_C361 +al 00C338 .ShiftControllerBits +al 00C336 .ReadControllerPorts +al 00F68B .IndexedGameplayLookupTable_F68B +al 00C309 .Flow_C309 +al 00F60D .IndexedGameplayLookupTable_F60D +al 00C2E9 .Flow_C2E9 +al 00F5D4 .IndexedGameplayLookupTable_F5D4 +al 00C2CA .ReadGameplayLookupValue +al 00C30F .Flow_C30F +al 00C2EF .Flow_C2EF +al 00C2D0 .ProcessObjectTableData +al 00C2B4 .ComputeOrDispatch_C2B4 +al 00C2B3 .ReturnFromComputeOrDispatch +al 00C2A8 .DecrementObjectTimer +al 00C29D .HideUnusedMetaspriteSlots +al 00C2A7 .ReturnFromMetaspriteRender +al 00C27D .StoreSpriteX +al 00C277 .MirrorSpriteXOffset +al 00C287 .SkipFlickerSprite +al 00C253 .EmitOamSprite +al 00C248 .RenderMetaspriteEntry +al 00C28E .AdvanceMetaspriteLayout +al 00F758 .MetaspriteLayoutPointerTableHi +al 00F757 .MetaspriteLayoutPointerTable +al 00F6AF .AnimationLayoutIndexTable +al 00F6B0 .AnimationBaseTileTable +al 00C217 .LoadObjectSpriteRenderState +al 00C20F .AdvanceObjectRecordPointer +al 00C3DC .BeginPpuCommandStream +al 00C20A .QueuedPpuTransferSourcePageTable +al 00C1F4 .ReturnFromPpuTransfer +al 00C1EE .HideOamSpritesLoop +al 00C1E3 .ClearNametableAttributes +al 00C1C9 .FillNametableTileBytes +al 00C1A9 .ClearNametable2000WithTile24 +al 00C1AD .FillNametableAndClearAttributes +al 00C17D .ConvertPlayerSlotToOamOffset +al 00C160 .ClearAudioSetGameMode +al 00C16F .UpdateZp_37_C16F +al 00C173 .ClampScreenSelectionPositionMin +al 00C15B .StoreSelectedPlayerAndScreenFlags +al 00C167 .CheckGameModeZero +al 00C18D .DispatchScreenState +al 00C13A .ClearActorFlagsLoop +al 00C142 .DispatchGameModePhase +al 00C10D .ScreenStateHandlerTable +al 00C3C6 .DispatchScreenStateHandler +al 00C0FE .SelectAlternateAudioMode +al 00C656 .ClearAudioRequestFlags +al 00C0D7 .CopyPlayerStateDefaults +al 00C0F6 .StartGameplayCountdown +al 00C108 .DispatchCurrentScreenState +al 00C104 .ClearScreenSubstate +al 00C129 .HandleStartAndPlayerSelection +al 00C328 .UpdateControllerState_C328 +al 00C424 .ResetPpuScroll +al 00C370 .UpdatePpuTransferQueue +al 00C0B0 .CompleteNmiAndRestoreRegisters +al 00C08D .NmiHandler +al 00C084 .EnableRenderingAfterNmiWork +al 00C089 .WritePpuMaskAndReturn +al 00C07D .DisableRenderingForNmiWork +al 00C078 .WaitForNmiWorkCompletion +al 00C073 .ClearNmiWorkMode +al 00C42F .AdvancePseudoRandomState +al 00C063 .WaitForFrameReady +al 00C05F .RequestNmiProcessing +al 00C0BA .UpdateTitleAndGameplayState +al 00C3B0 .DecrementGameplayTimers +al 00F820 .UpdateAudioEngine +al 00C054 .RunMainGameFrame +al 00C051 .RunAudioOnlyFrame +al 00C047 .SelectMainLoopAudioPath +al 00C1EA .HideAllOamSprites +al 00C1A2 .ClearNametable2400WithTileFF +al 00C02B .FinishResetInitialization +al 00C01D .ClearCpuRamPageLoop +al 00C002 .WaitForInitialVblankAndDisableRendering +al 00C000 .ResetHandler +al 00FA85 .Flow_FA85 +al 00F96F .Flow_F96F +al 00C1F5 .RunQueuedPpuTransfer diff --git a/Donkey Kong 3 (JUE)/copilot/reconstructed.map b/Donkey Kong 3 (JUE)/copilot/reconstructed.map new file mode 100644 index 0000000..1ad1cc6 --- /dev/null +++ b/Donkey Kong 3 (JUE)/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/_wip/Donkey Kong 3 (JUE)/dk3.nes.txt b/Donkey Kong 3 (JUE)/copilot/reconstructed.nes similarity index 99% rename from _wip/Donkey Kong 3 (JUE)/dk3.nes.txt rename to Donkey Kong 3 (JUE)/copilot/reconstructed.nes index 7b683e6c5dd4112beb75746baba24bfc2b1933da..0e0982f46dde821dff8adcd8dbc3e87a88d8f29e 100644 GIT binary patch delta 16 YcmbPmfN{bB#tpHIjJ%uU7&pZM05$go;Q#;t delta 16 YcmbPmfN{bB#tpHIj6$2^7&pZM05%l`<^TWy diff --git a/Donkey Kong 3 (JUE)/copilot/rom.nes b/Donkey Kong 3 (JUE)/copilot/rom.nes new file mode 120000 index 0000000..8820f68 --- /dev/null +++ b/Donkey Kong 3 (JUE)/copilot/rom.nes @@ -0,0 +1 @@ +../Donkey Kong 3 (JUE).nes \ No newline at end of file diff --git a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/symbols.inc b/Donkey Kong 3 (JUE)/copilot/symbols.inc similarity index 100% rename from _wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/symbols.inc rename to Donkey Kong 3 (JUE)/copilot/symbols.inc diff --git a/_wip/Donkey Kong 3 (JUE)/header.bin b/Donkey Kong 3 (JUE)/header.bin similarity index 100% rename from _wip/Donkey Kong 3 (JUE)/header.bin rename to Donkey Kong 3 (JUE)/header.bin diff --git a/_ROMS/Donkey Kong Jr. (JU).nes b/Donkey Kong Jr. (JU)/Donkey Kong Jr. (JU).nes similarity index 100% rename from _ROMS/Donkey Kong Jr. (JU).nes rename to Donkey Kong Jr. (JU)/Donkey Kong Jr. (JU).nes diff --git a/Donkey Kong Jr. (JU)/OVERVIEW.md b/Donkey Kong Jr. (JU)/OVERVIEW.md new file mode 100644 index 0000000..0c5b4d9 --- /dev/null +++ b/Donkey Kong Jr. (JU)/OVERVIEW.md @@ -0,0 +1,324 @@ +# Donkey Kong Jr. (JU) — Game Flow from Power-On + +This document describes the execution flow of the disassembled Donkey Kong Jr. (JU) PRG bank (16 KB, mapped at CPU **$C000–$FFFF**), starting from power-on. It is based entirely on `copilot/prg.s` (13,634 lines) in the repository, originally generated by `pass1_trace.py` from the interrupt vectors and refined through Pass 2/3 semantic labeling. The rebuild is verified **byte-identical** to the original `rom.nes` (`make` in `copilot/` produces `reconstructed.nes` matching `rom.nes` exactly). + +Listing: project **11** in the top-level `OVERVIEW.md` index. NROM cartridge (mapper 0), iNES flags: 1 × 16 KB PRG, 1 × 8 KB CHR, horizontal mirroring (flag 6 = $01). + +ROM SHA-256: `7d5f77878af7646296d994da14b25213741f6e0e0bc5deadd32a406d044a5788` + +Current label status — **all 1,035 top-level labels are semantically named**; every data region is emitted as explicit `.byte` data with its ROM provenance in comments (no `.incbin` blocks remain), and 688 local `Label_` branch targets are routine-internal. + +--- + +## 1. Reset Vector — CPU $FFFC → $C66E + +**`ResetHandler`** ($C66E–$C6B3) + +Unlike most projects in this repository (whose reset handlers sit at $C000 or nearby entrypoints such as $C40B), Donkey Kong Jr.'s reset entry is at **$C66E**. On power-on or reset, the 6502 jumps to `$C66E`. The reset routine performs cold-start hardware initialization: + +| Step | Code | Purpose | +|------|------|---------| +| 1 | `sei / cld` | Disable interrupts, clear decimal mode | +| 2 | `lda #$10 / sta PPUCTRL` | Disable NMI and PPU rendering immediately | +| 3 | `ldx #$FF / txs` | Initialize stack pointer | +| 4 | Poll `$2002` until bit 7 set | Wait for one VBlank period (PPU warm-up) | +| 5–8 | Indirect clear loop via `$00/$01` pointer | Clear all of RAM `$0000–$07FF` (8 pages, walked downward from $0700) | +| 9 | `jsr InitializePpuOamAndDmc` ($C6B6) | PPU, shadow-OAM, and DMC initialization (see §2) | +| 10 | `lda #$6F / sta TitleCursorY` | Initialize the title-cursor sprite Y position ($6F) | +| 11 | `lda #$18 / sta GameModeTimer` | Set attract-sequence timer (24) | +| 12 | `lda #$01 / sta PlayerLivesOrModeCount, sta PendingGameMode` | Arm the pre-game attract path | +| 13 | `lda #$00 / sta GameMode` | Set current game mode to 0 | +| 14 | Toggle `$2000` bit 7 via `PPUControlShadow` | **Enable NMI** — actual execution begins | +| 15 | `Label_C6B0: jsr AdvanceRandomLfsr / jmp` | Idle loop; the reset path never returns | + +**Architectural note:** After reset, the CPU idles forever (`jmp Label_C6B0`); the loop body's only activity is `jsr AdvanceRandomLfsr` to churn the 8-byte PRNG. *All* game logic — attract screen, titles, gameplay, sound — runs entirely inside the **NMI handler**, which is the opposite of most NES titles in this collection (where the NMI flag merely paces a foreground main loop). + +--- + +## 2. Initialization — `InitializePpuOamAndDmc` ($C6B6–$C6E5) + +Called from `ResetHandler`: + +1. **PPU control**: `PPUCTRL = $10`, saved to `PPUControlShadow` ($10) +2. **PPU mask**: `PPUMASK = $06` (background + sprite rendering), shadow at $11 +3. **Scroll**: both scroll registers cleared, shadows at $12/$13 +4. **Shadow OAM fill**: fills `$0200–$02FF` with `$FF` (all sprites hidden) +5. `jsr ClearGameplayNametable` ($CA16) — clears the background nametable +6. `APUDMALOAD = $00` (`$4011`, DMC volume/level reset) + +--- + +## 3. Interrupt Vectors — CPU $FFFA–$FFFF + +Located at the end of the bank (PRG offset $3FFA): + +| Vector | Address | Handler | +|--------|---------|---------| +| NMI | $C6E6 | `NmiHandler` | +| RESET | $C66E | `ResetHandler` | +| IRQ | $FFF0 | `IrqHandler` (single `asl a` byte; see the deferred-task note in §6.1) | + +The IRQ's apparent "oddity" is now explained: `DeferredTaskHandlerTable` deliberately addresses its entry 0 at mirrored CPU **$BFFE**, which is the IRQ-vector word at PRG $3FFE. The table leverages the address mirror so that a zero task type falls through to the unused `asl a` byte at $FFF0 — a register-saving trick rather than a real handler. + +--- + +## 4. NMI / Frame Heartbeat — `NmiHandler` ($C6E6–$C76D) + +The NMI is the *entire* per-frame scheduler. It: + +1. **Preserves state**: pushes A, X, Y, **plus zero page $00–$07** (an 11-byte save; other projects only save the registers) +2. **Suspends NMI**: clears bit 7 of `PPUControlShadow` and writes `$2000` — prevents re-entrancy while the frame logic runs +3. **OAM DMA**: `jsr PerformOamDma` ($EEB0) — sprite DMA from shadow OAM $0200 +4. **VRAM queue flush**: `jsr FlushQueuedVramCommands` ($EE9C) — drains the $0300 command queue during rendering +5. `jsr WriteInvertedRenderingMask` ($CA7A) — redraws PPUMASK state +6. `jsr UpdateAudioFrame` ($F91F) — per-frame audio channel update +7. **Controllers**: `jsr ReadControllers` ($F219) — serial pad read for both ports +8. **Frame logic dispatch** (see §5) based on `PendingGameMode` ($47), `GameMode` ($46), and `GameplaySubmode` ($4D) +9. `jsr ProcessQueuedTask` ($EE3A) — pops one pending task from the $0300 queue (see §6.1) +10. **Resumes NMI**: re-enables bit 7 of `PPUControlShadow` / `$2000` — allows the next frame +11. **Restores $00–$07, A, X, Y, `rti`** + +--- + +## 5. Frame State Machine (inside the NMI) + +The frame-mode dispatch at $C71B–$C748: + +``` +lda PendingGameMode ($47) + │ + ├─ non-zero ── pending attract boot ──┬─ PlayerLivesOrModeCount == 0 → UpdateGameModeTransition ($C897) + │ │ (sound timers only) + │ └─ PlayerLivesOrModeCount != 0 → UpdateTitleScreenAndStartSelection ($C773) + │ + TickSoundTimers ($F1AF) + │ + └─ zero ── lda GameMode ($46) + │ + ├─ zero → UpdateAttractModeState ($C932) (attract / inter-stage sequencer) + │ + └─ non-zero ── lda GameplaySubmode ($4D) + ├─ zero → UpdateGameplayFrame ($CD6E) (normal gameplay frame chain) + └─ non-zero → UpdateStageTransition ($CFC1) (stage-intro / submode-6 path) +``` + +After the mode dispatch, `ProcessQueuedTask` ($EE3A) executes one queued gameplay task, then $2000 bit 7 is restored. + +--- + +## 6. Subsystems + +### 6.1 Deferred Task / VRAM Queue Systems ($0331, $0300) + +Two cooperating RAM queues at $0300 fill during VBlank-adjacent time and are consumed during rendering: + +- **Deferred gameplay tasks**: `EnqueueTask` ($EE7F) appends a tagged task byte (address in $0301, data in $0302). `ProcessQueuedTask` ($EE3A) pops one per frame: the task's high nibble selects a handler from `DeferredTaskHandlerTable` ($C000), the low nibble becomes its final data byte, and the dispatcher performs an indirect `jmp ($00):($02)` with a synthetic `$39EE` return address. Queue positions wrap at offset $2E. +- **`DeferredTaskHandlerTable` ($C000)** — five typed handlers: + + | Task type | Handler | Address | + |-----------|---------|---------| + | 1 | `InitializeBoundingBox` | $F044 | + | 2 | `UpdateExistingBoundingBox` | $F040 | + | 3 | `TestObjectBoundingBoxOverlap` | $F138 | + | 4 | `QueueSelectedHudFields` | $EF50 | + | 5 | `FillNametableAndClearAttributes` | $EEBB | + + Entry 0 (task type 0) is deliberately routed through the mirror at $BFFE to the IRQ-vector word — see §3. +- **VRAM command streams**: `QueueSingleVramByte` ($F1C5), `QueueRectangularVramTransfer` ($EFCE), and `QueuePlayerSelectVramStream` ($CA33) build queued VRAM writes; `FlushQueuedVramCommands` ($EE9C) walks the $0331 handoff pointer into `ProcessVramCommandStreamAndRestoreScroll` ($EF3C), the generic $2006/$2007 writer used by every screen-draw path. +- **Sprite management**: `PerformOamDma` ($EEB0) performs the shadow-OAM ($0200–$02FF) → $2003/$4014 DMA each frame; `HideInactiveObjectSprites` ($EC17)/`HideObjectSpriteGroup` ($CA08) park inactive slots. + +### 6.2 Attract / Inter-Stage Sequencer ($C932–$C9FF) + +`UpdateAttractModeState` ($C932) runs whenever `GameMode == 0`. It is a **countdown-driven scene sequencer** using `GameStateTimer` ($39) as a descending timer with fixed thresholds: + +| GameStateTimer value | Action | +|------------|--------| +| $84 | scoreboard/interlude phase (decrements per frame) | +| $6E–$6F | stage transition setup (`AdvanceAttractModeSequence`, $C969) | +| $74 | full PPU re-prep (`HideObjectSpriteGroup` $CA08 + `ClearGameplayNametable` $CA16 + `QueuePlayerSelectVramStream` $CA33) | +| $68 | `jsr InitializeGameplayRam` ($CA82), **`GameMode = $01`** — gameplay begins | + +At $C988 it disables rendering and uploads per-stage VRAM via `StageBackgroundVramStreamPointerTable` ($C3BD, one 2-byte stream pointer per stage index) plus the fixed stream at $F8B6, guarded by `GameModeTimer` ($48) — this draws the "How High Can You Get??"-style inter-stage screens before the stage demo starts, then queues rendering via `QueueCollisionAndVramTasks` ($ECA4) and `QueueSingleVramByte` ($F1C5). + +### 6.3 Title / Game Start ($C773–$C896) + +`UpdateTitleScreenAndStartSelection` ($C773) runs while `PendingGameMode != 0` and `PlayerLivesOrModeCount != 0`: + +1. **APU gate**: audio enable `$06A2`-checked; a start-up delay in $05B4 raises `APUCTRL = $0F` (all channels on) +2. First pass (`TitleScreenInitialized` ($52) == 0): disables rendering, uploads the title background via the `TitleScreenVramCommandStream` at $F266, then builds the cursor sprite ($0200/$0201/$0203 with Y from `TitleCursorY` ($ED) = $6F) +3. **SELECT** ($20 mask): advances `TitleCursorY` by $10 (wraps $AF → $6F), sets `TitleInputRepeatTimer` ($7D) = $0A, latches `StartButtonLatch` ($6A) +4. **START** ($10 mask): latches `PreviousStartButtonState` ($EC), clears the bounding-box work area ($24–$2E), derives `SelectedPlayerMode` ($EF) from `TitleCursorY` (`lsr` ×4 minus 6) and a matching `GameModeTimer` ($1C or $18), then `jsr CollisionUpdateStep_EDFF` ($EDFF) +5. **Transition to gameplay**: reseeds the PRNG ($18 = $0F, $19 = $13), clears `PendingGameMode`, `GameMode`, and the $0580–$0587 record arrays, sets `StageOrScreenIndex` ($4A) = $01, derives `DifficultyOrRoundIndex` ($4B) from `SelectedPlayerMode` parity, sets `PlayerLivesOrModeCount` ($4C) per `TwoPlayerModeFlag` ($4E); final call `HideObjectSpriteGroup` and clears the $05B4 startup delay + +`UpdateGameModeTransition` ($C897) is the alternate boot chain (`PlayerLivesOrModeCount == 0`): it ticks sound timers and compares `GameStateTimer` against $75 in the same phased style as the attract sequencer. + +### 6.4 Gameplay Submodes ($CD6E–$D0FF) + +With `GameMode != 0`, the NMI dispatches on `GameplaySubmode` ($4D): + +- **Submode 0 — `UpdateGameplayFrame` ($CD6E)**: the full gameplay frame chain. Player state machine on `PlayerState` ($6B, states $03/$04/$05 special-cased): + - `PlayerUpdateStep_EE10` ($EE10), `DecodePlayerDirectionalInput` ($CE6C) — input decode and object ambient updates + - `UpdatePlayerAuxiliarySprite` ($CEA2), `InitializePlayerStateTransition` ($D251), `DispatchPlayerState` ($D412), `ProcessStageCollisions` ($D2FC), `UpdateStageEntities` ($CEF4), `DetectPlayerLoss` ($CED4) — player state, movement, and collision phase + - `HideInactiveObjectSprites` ($EC17), `UpdateGameplaySubmode` ($CF9D), `RequestLowAltitudeSound` ($CEC9) — object OAM build and sound requests + - death/loss handling: `UpdatePlayerDeathSequence` ($D1AE), `UpdateBonusCountdown` ($CF37) + - `TickSoundTimers` ($F1AF) + - Player-state bookkeeping: `PlayerStateReferenceY` ($76) copied from shadow OAM $0210, `PlayerStatePhase` ($78), `PlayerStateTransitionActive` ($79), `PlayerStateCounter` ($7E), plus the vertical-physics groups `PlayerVerticalSpeedInteger` ($7A)/`PlayerFallThreshold` ($7B)/`PlayerVerticalAcceleration*` ($7C/$82/$83)/`PlayerGravity*` ($86/$87) + - SELECT exits via the `PendingGameMode = 1` path at $CDE4 (return to title) + - `PauseActive` ($EB)/`PauseDebounceTimer` ($EE) gate the frame body +- **Submode != 0 — `UpdateStageTransition` ($CFC1)**: stage-intro / submode-6 path. In its early phase it gates on `PlayerState` and `PlayerStatePhase`; once the reference sprite at $0210 passes Y threshold $28, it issues a per-stage sound request into `SecondarySoundRequestFlags` ($FD) from `StageOrScreenIndex` ($02 for stage 1, $04 for stage 2, otherwise $08 — stage music), uploads a $50-byte VRAM stream (PPU address $1866 with a $00 fill value — pattern-table erase for the intro) via `QueueRectangularVramTransfer`, and sets `PlayerInputDirection` ($54) = $03. Submode 6 branches to `BeginStageClearSequence` ($D05F); entry also flows through `InitializePlayerBoundingBox` ($D04E) and `BuildPlayerCollisionBounds` ($D2BD). + +### 6.5 Controllers ($F219–$F265) + +Standard NES serial read through $4016 with the classic DPCM-corruption filter: + +- `ReadControllers`: strobe on/off, then `ReadControllerPort` for X = 0 and 2 +- `ReadControllerPort`: 8-bit shift loop in Y, then a two-sample consistency merge — a polarity-safe trick that keeps the record stable against mid-frame pad reads +- Results in `ControllerRawState` ($14) / `ControllerFilteredState` ($15) and `$16/$17` for port 2 +- The $0F-mask ladder implements "button pressed this frame" persistence for directional input vs start/select + +### 6.6 Sound Engine ($F1AF–$FE55) + +- `UpdateAudioFrame` ($F91F): called from the NMI as the main audio service — it manages the APU channel frame state and audio effects +- `TickSoundTimers` ($F1AF): per-frame channel timer service; `SoundTimerDivider` ($34) drives the frame-based `SoundTimerArray` ($35+) +- Effect state and data: `Pulse1Effect*` ($F0–$F2), `AudioEffectTimer`/`AudioPitchAccumulator` ($F3/$F4), `Triangle*` ($F5/$F6), music sequencer state `MusicDataPointer*` ($F7/$F8)/`MusicNoisePosition` ($F9)/`MusicPulsePosition` ($FA)/`AudioLfoPhase` ($FB), and request flags `SoundRequestFlags` ($FC)/`SecondarySoundRequestFlags` ($FD)/`ObjectSoundRequestFlags` ($FE) +- Sound-effect data at the end of the bank: `SoundEffectDataPointer*` ($FE52/$FE53), `SoundEffectNoiseOffset` ($FE54), `SoundEffectSequenceData` at $FE55 +- The title/APU chain programs `APUCTRL = $0F` (all channels on) at start + +### 6.7 Pseudo-Random Generator ($F1F8–$F218) + +An **8-byte LFSR** at $18–$1F: + +- Taps: bit 1 of `RandomLfsr0` XOR bit 1 of `RandomLfsr1` +- Shifted bit through the full `ror` chain over all eight bytes +- Stepped continuously in the reset idle loop (`Label_C6B0`) +- Seeded to `$0F $13 $00…` at game start + +--- + +## 7. Memory Map (Key Zero Page / RAM) + +| Address | Name | Use | +|---------|------|-----| +| $00–$0F | `Zp00`–`Zp0F` | Shared scratch / indirect pointers (routine-local by design) | +| $10 | `PPUControlShadow` | $2000 shadow | +| $11 | `PPUMaskShadow` | $2001 shadow | +| $12–$13 | `PPUScrollXShadow` / `PPUScrollYShadow` | $2005 shadows | +| $14/$16 | `ControllerRawState` / `Controller2RawState` | Raw serial pad bytes, ports 1/2 | +| $15/$17 | `ControllerFilteredState` / `Controller2FilteredState` | Filtered pad bytes, ports 1/2 | +| $18–$1F | `RandomLfsr0`–`RandomLfsr7` | 8-byte pseudo-random shift register | +| $20–$23 | `CollisionBounds0`–`CollisionBounds3` | Active collision bounds | +| $24–$27 | `BoundingBoxFlags` / `BoundingBoxCoord1–3` | Pending bounding box (queued tasks) | +| $2C/$2E | `PlayerVerticalFraction` / `PlayerVerticalPosition` | Player Y integration | +| $34–$38 | `SoundTimerDivider` / `SoundTimerArray` / `SharedActionTimer` / `PlayerSpriteVisibilityTimer` | Sound timers, shared timers | +| $39 | `GameStateTimer` | Attract/title countdown | +| $3A | `ObjectActiveArray` | Object active/hidden flags for sprite hiding | +| $3C | `ActionCooldown` | Object cooldown | +| $3E–$45 | `CollisionLeft/Top/Right/Bottom`, `CollisionMatchX/Y/Right/Bottom` | Collision results | +| $46 | `GameMode` | Current mode (0 = attract, 1 = gameplay) | +| $47 | `PendingGameMode` | Boot pending flag | +| $48 | `GameModeTimer` | Mode timer (attract/title countdowns) | +| $49 | `CurrentPlayerIndex` | Player selector | +| $4A | `StageOrScreenIndex` | Current stage (1-based) | +| $4B | `DifficultyOrRoundIndex` | Difficulty/round selector | +| $4C | `PlayerLivesOrModeCount` | Lives / mode count | +| $4D | `GameplaySubmode` | Gameplay submode selector | +| $4E | `TwoPlayerModeFlag` | 2-player selection | +| $4F–$51 | `DemoInputIndex` / `DemoInputTimer` / `DemoInputCode` | Attract-demo scripted input | +| $52–$53 | `TitleScreenInitialized` / `LevelObjectProgress` | Boot stage, level-object progress | +| $54–$57 | `PlayerInputDirection` / `PreviousInputDirection` / `PlayerPositionFraction` / `ObjectPositionFraction` | Input + fixed-point positions | +| $64–$6A | `BonusTickDivider` / `BonusCounter` / `DeathAnimation*` ($66/$67) / `PlayerCollisionResult` ($68) / `CollidingObjectOamOffset` ($69) / `StartButtonLatch` ($6A) | Bonus ticks, death animation, collision results | +| $6B–$70 | `PlayerState`, `PreviousPlayerState`, `PlayerFacing`, `PreviousPlayerFacing`, `PlayerClimbPhase`, `PlayerClimbDirection` | Player state machine + climbing | +| $71–$77 | `PlayerMovementSubstate`, `MovementCollisionCode`, `PlayerCollisionAnchor*` ($73/$74), `PlayerClimbOffset`, `PlayerStateReferenceY` ($76), `PlayerLandingTile` | Movement, collision anchors, landing | +| $78–$7E | `PlayerStatePhase` ($78), `PlayerStateTransitionActive` ($79), `PlayerVerticalSpeedInteger` ($7A), `PlayerFallThreshold` ($7B), `PlayerVerticalAcceleration` ($7C), `TitleInputRepeatTimer` ($7D), `PlayerStateCounter` ($7E) | State phase + vertical physics | +| $7F–$87 | `PlayerVerticalVelocityFraction` ($7F), `PlayerVerticalAcceleration*` ($82/$83), `PlayerGravity*` ($86/$87) | Vertical velocity/gravity fixed-point | +| $8C–$9F | `CarriedObjectActive` ($8C), `CollectibleSpriteTileArray` ($8D), `StageObjectDataPointer*` ($91–$93), `CollectedObject*` ($94–$9F) | Stage objects and collectibles | +| $A0–$BB | `StagePrimaryObjectCount`, `ObjectMotionStep` ($A1), `StageSecondaryObject*`, `EnemyStateArray` ($A3), `EnemyAlternateStateArray` ($A6), `EnemyDirectionArray` ($B4), `EnemySpawnDelayArray` ($B9), `Platform*` state ($AC–$BE), `StageSecondaryObjectCount` ($B0), `SpawnedEnemyCount` ($B1), `StageObjectMode` ($B2) | Stage-entity pools | +| $C3–$CF | `SpecialObjectIndex` ($C3), `SpecialObjectX` ($C4), `StageObjectAnimationMode` ($CE), `StageObjectOamOffset` ($CF) | Special objects | +| $D0–$E6 | `BonusSpriteActive` ($D0), `VramMetatileBuffer` ($D1), `StageRopeAddress*` ($DA/$DB), `PendingLevelObjectTask` ($E7) | VRAM buffers, ropes, level-object tasks | +| $E7–$EE | `DemoInputActive` ($E8), `GameplayInitializationPending` ($E9), `MovementFrameCounter` ($EA), `PauseActive` ($EB), `PreviousStartButtonState` ($EC), `TitleCursorY` ($ED), `PauseDebounceTimer` ($EE) | Flow/pause/title state | +| $EF | `SelectedPlayerMode` | Player-count selection from the title | +| $F0–$FE | `Pulse1Effect*` ($F0–$F2), `AudioEffectTimer` ($F3), `AudioPitchAccumulator` ($F4), `Triangle*` ($F5/$F6), `MusicDataPointer*` ($F7/$F8), `MusicNoisePosition` ($F9), `MusicPulsePosition` ($FA), `AudioLfoPhase` ($FB), `SoundRequestFlags` ($FC), `SecondarySoundRequestFlags` ($FD), `ObjectSoundRequestFlags` ($FE) | APU effects and music sequencer state | +| $FF | `GameplayEventFlags` | Shared gameplay event/request flags | +| $0100–$01FF | Scratch and object arrays | Object work area | +| $0200–$02FF | Shadow OAM | Cleared to $FF at reset; DMA'd every frame | +| $0300–$03FF | Deferred task / VRAM queue | Command-stream bytes and task dispatch slots ($0300 cursor, $0301 wrap index, $0302 entries×2, $0331 handoff pointer) | +| $0520+ | Stage object RAM | Object/config groups copied in via the `ObjectConfig*` tables | +| $0580–$05B5 | Per-mode record arrays | Attract/stage state records written by the title and attract sequences | +| $06A2, $05B4 | APU gate / startup delay flags | Sound enable gating used at title and gameplay entry | + +A handful of bytes still carry deliberately neutral names (`Zp28`–`Zp5C`, `Zp58`–`Zp62`, `Zp80`–`ZpE6` members) where reuse across routines is suspected; the Pass 1 trace recorded 1,757 zero-page accesses across 186 distinct base addresses. + +--- + +## 8. Code/Data Map + +Pass-1 trace statistics (recorded during generation): **6,135 decoded instructions**, **12,358 classified code bytes**, **266 reachable routine entry points**, **68 referenced PRG data labels**, **0 overlapping-instruction conflicts**. As of the current Pass 3 source, every data region is emitted as explicit `.byte` data with its ROM provenance documented — no `.incbin` blocks remain. + +| Region | Class | Size | +|--------|-------|------| +| $C000–$C66D | data (`DeferredTaskHandlerTable`, `HudDigitDescriptorTable`, `StagePlayerStartYTable`, `ObjectConfig*` tables, `StageBackgroundVramStreamPointerTable` at $C3BD) | 1,646 bytes | +| $C66E–$F137 | code (reset, NMI, mode dispatch, attract, title, gameplay) | 10,954 bytes | +| $F138–$F1AE | data (bounding-box overlap data) | 119 bytes | +| $F1AF–$F265 | code (sound timers, LFSR, controllers) | 183 bytes | +| $F266–$F91E | data (`TitleScreenVramCommandStream` at $F266, screen VRAM streams and stage data — 1,721 bytes) | 1,721 bytes | +| $F91F–$F957 | code (`UpdateAudioFrame`) | 57 bytes | +| $F958–$F959 | data | 2 bytes | +| $F95A–$F9F7 | code | 158 bytes | +| $F9F8–$FA63 | data | 108 bytes | +| $FA64–$FE50 | code (deferred task / VRAM queue engine, $EE39–$FE50) | 1,005 bytes | +| $FE51–$FFEF | data (`SoundEffectDataPointer*` $FE52–$FE53, `SoundEffectNoiseOffset` $FE54, `SoundEffectSequenceData` $FE55…) | 415 bytes | +| $FFF0–$FFFF | IRQ byte (reused by `DeferredTaskHandlerTable` entry 0) + filler + vectors | 16 bytes | + +--- + +## 9. Summary of Execution Flow + +``` +Power On / Reset + │ + ▼ +ResetHandler ($C66E) ──── sei, clear RAM, init PPU/shadow OAM, arm attract + │ + ▼ +enable $2000 bit 7 (NMI on) + │ + ▼ +Idle loop $C6B0 ────────► AdvanceRandomLfsr, forever (reset path never returns) + (all action is in NMI) + +NMI ($C6E6) [once per frame] + ├─ push A/X/Y + $00–$07 save + ├─ PerformOamDma ($EEB0) + FlushQueuedVramCommands ($EE9C) + ├─ WriteInvertedRenderingMask ($CA7A) + UpdateAudioFrame ($F91F) + ├─ ReadControllers ($F219) + ├─ Mode dispatch ─┬─ PendingGameMode → UpdateTitleScreenAndStartSelection ($C773) + │ │ / UpdateGameModeTransition ($C897) + │ ├─ GameMode == 0 → UpdateAttractModeState ($C932) ─┐ + │ └─ GameMode != 0 → UpdateGameplayFrame ($CD6E) │ + │ / UpdateStageTransition ($CFC1) │ + ├─ ProcessQueuedTask ($EE3A) ──► DeferredTaskHandlerTable ($C000) │ + └─ restore CPU/ram state, rti │ + │ + InitializeGameplayRam ($CA82) at GameStateTimer ($39) = $68 ◄──────────┘ + │ + ▼ + GameMode = 1; NMI dispatches gameplay chains per GameplaySubmode + (player state machine on $6B, collision bounds, stage entities, + deferred task queue, DispatchPlayerState/ProcessStageCollisions) +``` + +--- + +## 10. Notes on Provisional Areas + +- **Status:** Pass 3 — all 1,035 top-level labels (`ResetHandler`, `NmiHandler`, `UpdateGameplayFrame`, `UpdateStageTransition`, `ProcessQueuedTask`, `DeferredTaskHandlerTable`, state tables, etc.) carry semantic names, and all data regions are explicit `.byte` blocks with Pass 3 structure annotations. Remaining `ZpXX` names are deliberate (routine-reused scratch), documented in §7. +- **IRQ / deferred-task quirk:** The table entry 0 at mirrored $BFFE reuses the IRQ-vector word; the $FFF0 `asl a` byte is a table addressing artifact, not a real handler (see §3 and §6.1). +- **Remaining unknowns:** the detailed semantics of the `ObjectConfig*` per-difficulty groups copied into $0520+ RAM, the exact music-sequence encoding inside the $F266/$F95A data streams, and a few still-neutral `ZpXX` scratch bytes. + +Build verification: + +```bash +cd "/home/tmerritt/Projects/disassembly/Donkey Kong Jr. (JU)/copilot" +make # builds reconstructed.nes, then cmp against rom.nes → "Byte-identical ROM verified." +``` + +The rebuild is **byte-identical** to `rom.nes` (ROM SHA-256 at the top of this document). The Pass-1 source verifier (`verify_pass1.py`, which re-decoded every annotated instruction byte and re-hashed the full 24,592-byte ROM against `rom.nes`) passed during generation but was not carried into `copilot/`. diff --git a/Donkey Kong Jr. (JU)/copilot/Donkey Kong Jr. (JU).nes b/Donkey Kong Jr. (JU)/copilot/Donkey Kong Jr. (JU).nes new file mode 100644 index 0000000000000000000000000000000000000000..f80eada2d1219a3fe2fd1cc55c0f3571bdab735f GIT binary patch literal 24592 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 F{4Y;PV1xhw literal 0 HcmV?d00001 diff --git a/Donkey Kong Jr. (JU)/copilot/Makefile b/Donkey Kong Jr. (JU)/copilot/Makefile new file mode 100644 index 0000000..bdefb60 --- /dev/null +++ b/Donkey Kong Jr. (JU)/copilot/Makefile @@ -0,0 +1,29 @@ +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 +verify-source: + python3 verify_pass1.py + +.PHONY: verify-source diff --git a/Donkey Kong Jr. (JU)/copilot/chr.s b/Donkey Kong Jr. (JU)/copilot/chr.s new file mode 100644 index 0000000..2dfe933 --- /dev/null +++ b/Donkey Kong Jr. (JU)/copilot/chr.s @@ -0,0 +1,8 @@ +; Donkey Kong Jr. (JU) - CHR-ROM +.segment "CHR" + +; iNES layout: +; $0000-$000F 16-byte header +; $0010-$400F 16 KiB PRG-ROM +; $4010-$600F 8 KiB CHR-ROM +.incbin "rom.nes", $4010, $2000 diff --git a/Donkey Kong Jr. (JU)/copilot/header.s b/Donkey Kong Jr. (JU)/copilot/header.s new file mode 100644 index 0000000..f698a83 --- /dev/null +++ b/Donkey Kong Jr. (JU)/copilot/header.s @@ -0,0 +1,2 @@ +.segment "HEADER" + .incbin "rom.nes", 0, 16 diff --git a/Donkey Kong Jr. (JU)/copilot/linker.cfg b/Donkey Kong Jr. (JU)/copilot/linker.cfg new file mode 100644 index 0000000..cfaf881 --- /dev/null +++ b/Donkey Kong Jr. (JU)/copilot/linker.cfg @@ -0,0 +1,10 @@ +MEMORY { + HEADER: start = $0000, size = $0010, fill = yes; + PRG: start = $C000, size = $4000, fill = yes; + CHR: start = $0000, size = $2000, fill = yes; +} +SEGMENTS { + HEADER: load = HEADER, type = ro; + PRG: load = PRG, type = ro; + CHR: load = CHR, type = ro; +} \ No newline at end of file diff --git a/Donkey Kong Jr. (JU)/copilot/locals.inc b/Donkey Kong Jr. (JU)/copilot/locals.inc new file mode 100644 index 0000000..356c253 --- /dev/null +++ b/Donkey Kong Jr. (JU)/copilot/locals.inc @@ -0,0 +1,272 @@ +; Donkey Kong Jr. (JU) - application-specific zero-page/RAM symbols +; Pass 2 status: +; Semantic names are used only where access tracing gives a stable role. +; ZpXX names remain deliberately neutral where a byte is reused or unresolved. + +; Shared scratch and indirect pointers +Zp00 = $00 +Zp01 = $01 +Zp02 = $02 +Zp03 = $03 +Zp04 = $04 +Zp05 = $05 +Zp06 = $06 +Zp07 = $07 +Zp08 = $08 +Zp09 = $09 +Zp0A = $0A +Zp0B = $0B +Zp0C = $0C +Zp0D = $0D +Zp0E = $0E +Zp0F = $0F + +; PPU software shadows +PPUControlShadow = $10 +PPUMaskShadow = $11 +PPUScrollXShadow = $12 +PPUScrollYShadow = $13 + +; Two controller records, selected with X = 0 or 2 +ControllerRawState = $14 +ControllerFilteredState = $15 +Controller2RawState = $16 +Controller2FilteredState = $17 + +; Eight-byte pseudo-random shift-register state +RandomLfsr0 = $18 +RandomLfsr1 = $19 +RandomLfsr2 = $1A +RandomLfsr3 = $1B +RandomLfsr4 = $1C +RandomLfsr5 = $1D +RandomLfsr6 = $1E +RandomLfsr7 = $1F + +; General gameplay/audio work area +CollisionBounds0 = $20 +CollisionBounds1 = $21 +CollisionBounds2 = $22 +CollisionBounds3 = $23 +BoundingBoxFlags = $24 +BoundingBoxCoord1 = $25 +BoundingBoxCoord2 = $26 +BoundingBoxCoord3 = $27 +Zp28 = $28 +Zp29 = $29 +Zp2A = $2A +Zp2B = $2B +PlayerVerticalFraction = $2C +Zp2D = $2D +PlayerVerticalPosition = $2E +Zp2F = $2F +Zp30 = $30 +Zp31 = $31 +Zp32 = $32 +Zp33 = $33 +SoundTimerDivider = $34 +SoundTimerArray = $35 +SharedActionTimer = $36 +Zp37 = $37 +PlayerSpriteVisibilityTimer = $38 +GameStateTimer = $39 +ObjectActiveArray = $3A +Zp3B = $3B +ActionCooldown = $3C +Zp3D = $3D +CollisionLeft = $3E +CollisionTop = $3F + +; State and gameplay bytes. Names are conservative pending deeper state tracing. +CollisionRight = $40 +CollisionBottom = $41 +CollisionMatchX = $42 +CollisionMatchY = $43 +CollisionMatchRight = $44 +CollisionMatchBottom = $45 +GameMode = $46 +PendingGameMode = $47 +GameModeTimer = $48 +CurrentPlayerIndex = $49 +StageOrScreenIndex = $4A +DifficultyOrRoundIndex = $4B +PlayerLivesOrModeCount = $4C +GameplaySubmode = $4D +TwoPlayerModeFlag = $4E +DemoInputIndex = $4F +DemoInputTimer = $50 +DemoInputCode = $51 +TitleScreenInitialized = $52 +LevelObjectProgress = $53 +PlayerInputDirection = $54 +PreviousInputDirection = $55 +PlayerPositionFraction = $56 +ObjectPositionFraction = $57 +Zp58 = $58 +Zp59 = $59 +Zp5A = $5A +Zp5B = $5B +Zp5C = $5C +Zp5D = $5D +Zp5E = $5E +Zp5F = $5F +Zp60 = $60 +Zp61 = $61 +Zp62 = $62 +PlayerAuxSpritePending = $63 +BonusTickDivider = $64 +BonusCounter = $65 +DeathAnimationActive = $66 +DeathAnimationDirection = $67 +PlayerCollisionResult = $68 +CollidingObjectOamOffset = $69 +StartButtonLatch = $6A +PlayerState = $6B +PreviousPlayerState = $6C +PlayerFacing = $6D +PreviousPlayerFacing = $6E +PlayerClimbPhase = $6F +PlayerClimbDirection = $70 +PlayerMovementSubstate = $71 +MovementCollisionCode = $72 +PlayerCollisionAnchorLeft = $73 +PlayerCollisionAnchorRight = $74 +PlayerClimbOffset = $75 +PlayerStateReferenceY = $76 +PlayerLandingTile = $77 +PlayerStatePhase = $78 +PlayerStateTransitionActive = $79 +PlayerVerticalSpeedInteger = $7A +PlayerFallThreshold = $7B +PlayerVerticalAcceleration = $7C +TitleInputRepeatTimer = $7D +PlayerStateCounter = $7E +PlayerVerticalVelocityFraction = $7F +Zp80 = $80 +Zp81 = $81 +PlayerVerticalAccelerationFraction = $82 +PlayerVerticalAccelerationInteger = $83 +Zp84 = $84 +Zp85 = $85 +PlayerGravityFraction = $86 +PlayerGravityInteger = $87 +Zp88 = $88 +Zp89 = $89 +Zp8A = $8A +Zp8B = $8B +CarriedObjectActive = $8C +CollectibleSpriteTileArray = $8D +Zp8E = $8E +Zp8F = $8F +Zp90 = $90 +StageObjectDataPointer = $91 +CurrentStageObjectDataPointerHi = $92 +StageObjectDataLength = $93 +CollectedObjectVramRecord = $94 +CurrentCollectedObjectVramAddressHi = $95 +Zp96 = $96 +Zp97 = $97 +Zp98 = $98 +Zp99 = $99 +CollectibleActiveArray = $9A +Zp9B = $9B +Zp9C = $9C +Zp9D = $9D +CollectedObjectCount = $9E +PreviousCollectedObjectCount = $9F +StagePrimaryObjectCount = $A0 +ObjectMotionStep = $A1 +StageSecondaryObjectIndex = $A2 +EnemyStateArray = $A3 +ZpA4 = $A4 +ZpA5 = $A5 +EnemyAlternateStateArray = $A6 +ZpA7 = $A7 +EnemyDirectionInitializedArray = $A8 +EnemyRouteSelectorArray = $A9 +ZpAA = $AA +ZpAB = $AB +PlatformDirectionState = $AC +PlayerPlatformContact = $AD +PlatformEdgeContact = $AE +ZpAF = $AF +StageSecondaryObjectCount = $B0 +SpawnedEnemyCount = $B1 +StageObjectMode = $B2 +EnemySpawnPending = $B3 +EnemyDirectionArray = $B4 +ZpB5 = $B5 +ZpB6 = $B6 +ZpB7 = $B7 +ZpB8 = $B8 +EnemySpawnDelayArray = $B9 +ZpBA = $BA +ZpBB = $BB +PreviousPlatformContact = $BC +CurrentPlatformContact = $BD +PlatformTurnaroundFlag = $BE +ZpBF = $BF +ZpC0 = $C0 +ZpC1 = $C1 +ZpC2 = $C2 +SpecialObjectIndex = $C3 +SpecialObjectX = $C4 +ZpC5 = $C5 +ZpC6 = $C6 +ZpC7 = $C7 +ZpC8 = $C8 +ZpC9 = $C9 +ZpCA = $CA +ZpCB = $CB +ZpCC = $CC +ZpCD = $CD +StageObjectAnimationMode = $CE +StageObjectOamOffset = $CF +BonusSpriteActive = $D0 +VramMetatileBuffer = $D1 +ZpD2 = $D2 +ZpD3 = $D3 +ZpD4 = $D4 +ZpD5 = $D5 +ZpD6 = $D6 +ZpD7 = $D7 +ZpD8 = $D8 +ZpD9 = $D9 +StageRopeAddressHi = $DA +StageRopeAddressLoArray = $DB +ZpDC = $DC +ZpDD = $DD +ZpDE = $DE +ZpDF = $DF +ZpE0 = $E0 +ZpE1 = $E1 +ZpE2 = $E2 +ZpE3 = $E3 +ZpE4 = $E4 +ZpE5 = $E5 +ZpE6 = $E6 +PendingLevelObjectTask = $E7 +DemoInputActive = $E8 +GameplayInitializationPending = $E9 +MovementFrameCounter = $EA +PauseActive = $EB +PreviousStartButtonState = $EC +TitleCursorY = $ED +PauseDebounceTimer = $EE +SelectedPlayerMode = $EF +Pulse1EffectFlags = $F0 +Pulse1EffectTimer = $F1 +Pulse1PitchAccumulator = $F2 +AudioEffectTimer = $F3 +AudioPitchAccumulator = $F4 +TriangleEffectTimer = $F5 +TrianglePitchAccumulator = $F6 +MusicDataPointerLo = $F7 +MusicDataPointerHi = $F8 +MusicNoisePosition = $F9 +MusicPulsePosition = $FA +AudioLfoPhase = $FB +SoundRequestFlags = $FC +SecondarySoundRequestFlags = $FD +ObjectSoundRequestFlags = $FE +GameplayEventFlags = $FF diff --git a/Donkey Kong Jr. (JU)/copilot/prg.s b/Donkey Kong Jr. (JU)/copilot/prg.s new file mode 100644 index 0000000..0eca104 --- /dev/null +++ b/Donkey Kong Jr. (JU)/copilot/prg.s @@ -0,0 +1,13634 @@ +; Donkey Kong Jr. (JU) - Pass 1 reachable-code disassembly +; Generated by pass1_trace.py from NMI/RESET/IRQ vectors. +; Classified data regions are emitted explicitly with byte-identical .byte directives. +.setcpu "6502" +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" + + +;------------------------------------------------------------------------------ +; DeferredTaskHandlerTable +; +; Entries 1-5 of the deferred-task handler table. Entry 0 is deliberately +; addressed at mirrored CPU $BFFE and reuses the IRQ vector word at PRG $3FFE. +; The dispatcher indexes this table with the high nibble of each queued task. +;------------------------------------------------------------------------------ +DeferredTaskHandlerTable: + .word InitializeBoundingBox ; PRG:$0000 44 F0 task type 1 + .word UpdateExistingBoundingBox ; PRG:$0002 40 F0 task type 2 + .word TestObjectBoundingBoxOverlap ; PRG:$0004 38 F1 task type 3 + .word QueueSelectedHudFields ; PRG:$0006 50 EF task type 4 + .word FillNametableAndClearAttributes ; PRG:$0008 BB EE task type 5 + +;------------------------------------------------------------------------------ +; HudDigitDescriptorTable +; +; Pass 3 description: +; Five four-byte HUD digit descriptors: PPU address high, PPU address low, digit count/control, and packed-digit source selector/flags. QueueHudDigitsByDescriptor indexes this table with descriptor index times four. +;------------------------------------------------------------------------------ +HudDigitDescriptorTable: + ; Explicit bytes replacing .incbin ROM:$001A, length $0014 + .byte $20, $6E, $06, $00, $20, $64, $06, $00, $20, $77, $06, $00, $20, $B7, $04, $00 ; PRG:$000A 20 6E 06 00 20 64 06 00 20 77 06 00 20 B7 04 00 + .byte $20, $B5, $01, $00 ; PRG:$001A 20 B5 01 00 + +;------------------------------------------------------------------------------ +; StagePlayerStartYTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StagePlayerStartYTable: + ; Explicit bytes replacing .incbin ROM:$002E, length $0005 + .byte $50, $60, $70, $80, $80 ; PRG:$001E 50 60 70 80 80 + +;------------------------------------------------------------------------------ +; ObjectConfigDifficultyStrideTable +; +; Pass 3 description: +; One stride byte per configuration group. The loader multiplies the selected value by DifficultyOrRoundIndex to locate that difficulty record. +;------------------------------------------------------------------------------ +ObjectConfigDifficultyStrideTable: + ; Explicit bytes replacing .incbin ROM:$0033, length $0001 + .byte $07 ; PRG:$0023 07 + +;------------------------------------------------------------------------------ +; ObjectConfigDestinationEndIndexTable +; +; Pass 3 description: +; Exclusive X destination limit for the group copy into RAM beginning at $0520. +;------------------------------------------------------------------------------ +ObjectConfigDestinationEndIndexTable: + ; Explicit bytes replacing .incbin ROM:$0034, length $0001 + .byte $07 ; PRG:$0024 07 + +;------------------------------------------------------------------------------ +; ObjectConfigDataPointerLoTable +; +; Pass 3 description: +; Low-byte field of the source pointer for each indexed object-configuration group. +;------------------------------------------------------------------------------ +ObjectConfigDataPointerLoTable: + ; Explicit bytes replacing .incbin ROM:$0035, length $0001 + .byte $B9 ; PRG:$0025 B9 + +;------------------------------------------------------------------------------ +; ObjectConfigDataPointerHiTable +; +; Pass 3 description: +; High-byte field of the source pointer for each indexed object-configuration group. +;------------------------------------------------------------------------------ +ObjectConfigDataPointerHiTable: + ; Explicit bytes replacing .incbin ROM:$0036, length $0009 + .byte $C0, $03, $02, $EF, $C0, $09, $08, $01, $C1 ; PRG:$0026 C0 03 02 EF C0 09 08 01 C1 + +;------------------------------------------------------------------------------ +; StagePrimaryObjectConfigTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StagePrimaryObjectConfigTable: + ; Explicit bytes replacing .incbin ROM:$003F, length $0060 + .byte $02, $33, $40, $80, $90, $90, $A0, $10, $02, $33, $40, $80, $00, $90, $A0, $10 ; PRG:$002F 02 33 40 80 90 90 A0 10 02 33 40 80 00 90 A0 10 + .byte $02, $33, $40, $80, $90, $A0, $A4, $10, $02, $33, $40, $80, $00, $A0, $A4, $10 ; PRG:$003F 02 33 40 80 90 A0 A4 10 02 33 40 80 00 A0 A4 10 + .byte $03, $33, $40, $80, $90, $90, $A0, $10, $02, $33, $40, $80, $00, $A0, $A8, $10 ; PRG:$004F 03 33 40 80 90 90 A0 10 02 33 40 80 00 A0 A8 10 + .byte $03, $50, $50, $90, $A0, $A0, $A0, $10, $03, $40, $43, $90, $00, $A0, $A0, $10 ; PRG:$005F 03 50 50 90 A0 A0 A0 10 03 40 43 90 00 A0 A0 10 + .byte $04, $60, $60, $B0, $B0, $B0, $B0, $10, $04, $5C, $4E, $AC, $00, $B0, $B0, $10 ; PRG:$006F 04 60 60 B0 B0 B0 B0 10 04 5C 4E AC 00 B0 B0 10 + .byte $04, $70, $70, $D0, $C0, $C0, $C0, $10, $04, $80, $59, $D8, $00, $C0, $C0, $10 ; PRG:$007F 04 70 70 D0 C0 C0 C0 10 04 80 59 D8 00 C0 C0 10 + +;------------------------------------------------------------------------------ +; StageSecondaryObjectConfigTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageSecondaryObjectConfigTable: + ; Explicit bytes replacing .incbin ROM:$009F, length $0024 + .byte $FF, $60, $D0, $B0, $A0, $B0, $C0, $70, $D8, $B0, $A0, $B0, $A0, $80, $E0, $B0 ; PRG:$008F FF 60 D0 B0 A0 B0 C0 70 D8 B0 A0 B0 A0 80 E0 B0 + .byte $A0, $B0, $90, $90, $E8, $C0, $A0, $B0, $80, $A8, $F4, $D0, $A0, $B0, $70, $C0 ; PRG:$009F A0 B0 90 90 E8 C0 A0 B0 80 A8 F4 D0 A0 B0 70 C0 + .byte $FC, $E0, $A0, $B0 ; PRG:$00AF FC E0 A0 B0 + +;------------------------------------------------------------------------------ +; DifficultyObjectCountTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +DifficultyObjectCountTable: + ; Explicit bytes replacing .incbin ROM:$00C3, length $0030 + .byte $01, $00, $02, $01, $01, $00, $02, $80, $E0, $00, $02, $01, $00, $03, $80, $E0 ; PRG:$00B3 01 00 02 01 01 00 02 80 E0 00 02 01 00 03 80 E0 + .byte $00, $02, $01, $00, $03, $80, $E0, $01, $00, $02, $01, $03, $70, $E4, $02, $01 ; PRG:$00C3 00 02 01 00 03 80 E0 01 00 02 01 03 70 E4 02 01 + .byte $00, $02, $04, $64, $E8, $00, $01, $02, $01, $04, $54, $F0, $01, $02, $01, $00 ; PRG:$00D3 00 02 04 64 E8 00 01 02 01 04 54 F0 01 02 01 00 + +;------------------------------------------------------------------------------ +; StageFourPrimaryObjectCountByDifficulty +; +; Pass 3 description: +; Interleaved stage-four count field selected with Y = DifficultyOrRoundIndex * 2 and stored in StagePrimaryObjectCount. +;------------------------------------------------------------------------------ +StageFourPrimaryObjectCountByDifficulty: + ; Explicit bytes replacing .incbin ROM:$00F3, length $0001 + .byte $04 ; PRG:$00E3 04 + +;------------------------------------------------------------------------------ +; StageFourObjectOamBaseByDifficulty +; +; Pass 3 description: +; Interleaved stage-four OAM/base field selected with Y = DifficultyOrRoundIndex * 2 and written to $0540. +;------------------------------------------------------------------------------ +StageFourObjectOamBaseByDifficulty: + ; Explicit bytes replacing .incbin ROM:$00F4, length $0053 + .byte $C0, $04, $E0, $04, $FF, $04, $FF, $05, $FF, $05, $FF, $02, $FF, $D0, $02, $D0 ; PRG:$00E4 C0 04 E0 04 FF 04 FF 05 FF 05 FF 02 FF D0 02 D0 + .byte $E0, $03, $B0, $FF, $04, $90, $FF, $04, $8C, $FF, $05, $88, $FF, $02, $80, $F8 ; PRG:$00F4 E0 03 B0 FF 04 90 FF 04 8C FF 05 88 FF 02 80 F8 + .byte $02, $01, $00, $01, $02, $01, $03, $80, $F8, $01, $02, $01, $00, $01, $02, $04 ; PRG:$0104 02 01 00 01 02 01 03 80 F8 01 02 01 00 01 02 04 + .byte $80, $F8, $02, $01, $00, $01, $02, $01, $04, $80, $F8, $02, $00, $01, $02, $01 ; PRG:$0114 80 F8 02 01 00 01 02 01 04 80 F8 02 00 01 02 01 + .byte $00, $05, $80, $F8, $01, $00, $01, $02, $01, $00, $06, $80, $F8, $01, $02, $03 ; PRG:$0124 00 05 80 F8 01 00 01 02 01 00 06 80 F8 01 02 03 + .byte $00, $03, $02 ; PRG:$0134 00 03 02 + +;------------------------------------------------------------------------------ +; StageObjectParameterTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageObjectParameterTable: + ; Explicit bytes replacing .incbin ROM:$0147, length $001E + .byte $84, $7C, $68, $88, $80, $6C, $8C, $00, $70, $50, $5B, $30, $2F, $35, $28, $31 ; PRG:$0137 84 7C 68 88 80 6C 8C 00 70 50 5B 30 2F 35 28 31 + .byte $36, $29, $10, $04, $10, $A7, $00, $DD, $2D, $00, $26, $30, $00, $28 ; PRG:$0147 36 29 10 04 10 A7 00 DD 2D 00 26 30 00 28 + +;------------------------------------------------------------------------------ +; StageSpriteLayoutPointerLo +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageSpriteLayoutPointerLo: + ; Explicit bytes replacing .incbin ROM:$0165, length $0001 + .byte $08 ; PRG:$0155 08 + +;------------------------------------------------------------------------------ +; StageSpriteLayoutPointerHi +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageSpriteLayoutPointerHi: + ; Explicit bytes replacing .incbin ROM:$0166, length $0009 + .byte $C7, $08, $B7, $08, $C7, $1B, $C7, $70, $C7 ; PRG:$0156 C7 08 B7 08 C7 1B C7 70 C7 + +;------------------------------------------------------------------------------ +; ObjectLayoutXTable +; +; Pass 3 description: +; Byte zero of each five-byte static object-layout record: sprite-grid X coordinate. +;------------------------------------------------------------------------------ +ObjectLayoutXTable: + ; Explicit bytes replacing .incbin ROM:$016F, length $0001 + .byte $38 ; PRG:$015F 38 + +;------------------------------------------------------------------------------ +; ObjectLayoutYTable +; +; Pass 3 description: +; Byte one of each five-byte static object-layout record: sprite-grid Y coordinate. +;------------------------------------------------------------------------------ +ObjectLayoutYTable: + ; Explicit bytes replacing .incbin ROM:$0170, length $0001 + .byte $8F ; PRG:$0160 8F + +;------------------------------------------------------------------------------ +; ObjectLayoutTileIndexTable +; +; Pass 3 description: +; Byte two of each five-byte static object-layout record: initial CHR tile index. +;------------------------------------------------------------------------------ +ObjectLayoutTileIndexTable: + ; Explicit bytes replacing .incbin ROM:$0171, length $0001 + .byte $58 ; PRG:$0161 58 + +;------------------------------------------------------------------------------ +; ObjectLayoutDimensionsTable +; +; Pass 3 description: +; Byte three of each five-byte static object-layout record: packed grid dimensions. RenderObjectSpriteGrid uses the high nibble as the column count and low nibble as the row count. +;------------------------------------------------------------------------------ +ObjectLayoutDimensionsTable: + ; Explicit bytes replacing .incbin ROM:$0172, length $0001 + .byte $12 ; PRG:$0162 12 + +;------------------------------------------------------------------------------ +; ObjectLayoutOamOffsetTable +; +; Pass 3 description: +; Byte four of each five-byte static object-layout record: low byte of the destination pointer in shadow OAM. RenderObjectSpriteGrid supplies page $02 as the high byte. +;------------------------------------------------------------------------------ +ObjectLayoutOamOffsetTable: + ; Explicit bytes replacing .incbin ROM:$0173, length $0065 + .byte $C0, $A0, $3F, $58, $12, $C8, $CD, $7F, $58, $12, $D0, $30, $37, $58, $12, $D8 ; PRG:$0163 C0 A0 3F 58 12 C8 CD 7F 58 12 D0 30 37 58 12 D8 + .byte $A0, $37, $58, $12, $C0, $90, $37, $58, $12, $C8, $B0, $36, $74, $22, $40, $41 ; PRG:$0173 A0 37 58 12 C0 90 37 58 12 C8 B0 36 74 22 40 41 + .byte $66, $74, $22, $50, $78, $8E, $74, $22, $60, $50, $B6, $74, $22, $70, $78, $A0 ; PRG:$0183 66 74 22 50 78 8E 74 22 60 50 B6 74 22 70 78 A0 + .byte $74, $22, $80, $60, $66, $7C, $22, $A0, $B0, $B6, $7C, $22, $B0, $80, $36, $7C ; PRG:$0193 74 22 80 60 66 7C 22 A0 B0 B6 7C 22 B0 80 36 7C + .byte $22, $C0, $60, $8E, $7C, $22, $D0, $40, $CF, $94, $22, $C0, $3F, $8B, $B2, $21 ; PRG:$01A3 22 C0 60 8E 7C 22 D0 40 CF 94 22 C0 3F 8B B2 21 + .byte $90, $70, $8B, $B2, $21, $98, $70, $B0, $B0, $12, $A0, $88, $CF, $B0, $12, $B0 ; PRG:$01B3 90 70 8B B2 21 98 70 B0 B0 12 A0 88 CF B0 12 B0 + .byte $98, $CF, $B0, $12, $B8 ; PRG:$01C3 98 CF B0 12 B8 + +;------------------------------------------------------------------------------ +; StageInitializerTypeTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageInitializerTypeTable: + ; Explicit bytes replacing .incbin ROM:$01D8, length $0001 + .byte $00 ; PRG:$01C8 00 + +;------------------------------------------------------------------------------ +; StageInitializerParamTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageInitializerParamTable: + ; Explicit bytes replacing .incbin ROM:$01D9, length $0001 + .byte $08 ; PRG:$01C9 08 + +;------------------------------------------------------------------------------ +; StageInitializerValueTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageInitializerValueTable: + ; Explicit bytes replacing .incbin ROM:$01DA, length $002F + .byte $C0, $03, $08, $E0, $FF, $03, $10, $40, $03, $01, $0C, $02, $08, $A0, $02, $04 ; PRG:$01CA C0 03 08 E0 FF 03 10 40 03 01 0C 02 08 A0 02 04 + .byte $90, $03, $04, $C0, $FF, $02, $18, $40, $03, $18, $A0, $FF, $02, $18, $40, $00 ; PRG:$01DA 90 03 04 C0 FF 02 18 40 03 18 A0 FF 02 18 40 00 + .byte $0A, $C0, $FF, $01, $1C, $30, $02, $04, $A0, $FF, $14, $0F, $01, $36, $05 ; PRG:$01EA 0A C0 FF 01 1C 30 02 04 A0 FF 14 0F 01 36 05 + +;------------------------------------------------------------------------------ +; StageObjectReferenceYTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageObjectReferenceYTable: + ; Explicit bytes replacing .incbin ROM:$0209, length $0001 + .byte $48 ; PRG:$01F9 48 + +;------------------------------------------------------------------------------ +; StageObjectLeftBoundaryTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageObjectLeftBoundaryTable: + ; Explicit bytes replacing .incbin ROM:$020A, length $0001 + .byte $BF ; PRG:$01FA BF + +;------------------------------------------------------------------------------ +; StageObjectRightBoundaryTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageObjectRightBoundaryTable: + ; Explicit bytes replacing .incbin ROM:$020B, length $0010 + .byte $C1, $78, $31, $2F, $A0, $C0, $C1, $C8, $30, $31, $A0, $C0, $C1, $C8, $30, $31 ; PRG:$01FB C1 78 31 2F A0 C0 C1 C8 30 31 A0 C0 C1 C8 30 31 + +;------------------------------------------------------------------------------ +; SpecialObjectXTriggerTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +SpecialObjectXTriggerTable: + ; Explicit bytes replacing .incbin ROM:$021B, length $000A + .byte $B4, $94, $5C, $3B, $31, $C2, $36, $C2, $3B, $C2 ; PRG:$020B B4 94 5C 3B 31 C2 36 C2 3B C2 + +;------------------------------------------------------------------------------ +; StageCollisionRecordPointerTable +; +; Pass 3 description: +; Interleaved little-endian pointers selected from stage/submode state. Targets are stage collision records consumed by the stage collision update path. +;------------------------------------------------------------------------------ +StageCollisionRecordPointerTable: + ; Explicit bytes replacing .incbin ROM:$0225, length $0001 + .byte $65 ; PRG:$0215 65 + +;------------------------------------------------------------------------------ +; StageCollisionRecordPointerHighBytes +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageCollisionRecordPointerHighBytes: + ; Explicit bytes replacing .incbin ROM:$0226, length $00AB + .byte $C2, $6E, $C2, $77, $C2, $80, $C2, $77, $C2, $80, $C2, $40, $C2, $40, $C2, $40 ; PRG:$0216 C2 6E C2 77 C2 80 C2 77 C2 80 C2 40 C2 40 C2 40 + .byte $C2, $40, $C2, $89, $C2, $96, $C2, $A3, $C2, $B0, $C2, $02, $AB, $44, $00, $44 ; PRG:$0226 C2 40 C2 89 C2 96 C2 A3 C2 B0 C2 02 AB 44 00 44 + .byte $02, $AB, $53, $00, $53, $02, $AB, $64, $00, $64, $12, $60, $36, $C0, $36, $C0 ; PRG:$0236 02 AB 53 00 53 02 AB 64 00 64 12 60 36 C0 36 C0 + .byte $48, $3C, $48, $B4, $66, $30, $66, $30, $78, $3C, $78, $3C, $8E, $C0, $8E, $C0 ; PRG:$0246 48 3C 48 B4 66 30 66 30 78 3C 78 3C 8E C0 8E C0 + .byte $A0, $B4, $A0, $B4, $B6, $30, $B6, $30, $C8, $3C, $C8, $3C, $ED, $00, $ED, $04 ; PRG:$0256 A0 B4 A0 B4 B6 30 B6 30 C8 3C C8 3C ED 00 ED 04 + .byte $C0, $36, $30, $36, $2E, $48, $BF, $48, $04, $30, $66, $C0, $66, $C0, $78, $2F ; PRG:$0266 C0 36 30 36 2E 48 BF 48 04 30 66 C0 66 C0 78 2F + .byte $78, $04, $C0, $8E, $30, $8E, $2E, $A0, $C0, $A0, $04, $30, $B6, $C0, $B6, $C2 ; PRG:$0276 78 04 C0 8E 30 8E 2E A0 C0 A0 04 30 B6 C0 B6 C2 + .byte $C8, $31, $C8, $06, $DD, $50, $10, $50, $10, $70, $DD, $70, $DD, $90, $00, $90 ; PRG:$0286 C8 31 C8 06 DD 50 10 50 10 70 DD 70 DD 90 00 90 + .byte $06, $DD, $60, $10, $60, $10, $80, $DD, $80, $DD, $A0, $00, $A0, $06, $DD, $50 ; PRG:$0296 06 DD 60 10 60 10 80 DD 80 DD A0 00 A0 06 DD 50 + .byte $10, $50, $10, $70, $DD, $70, $DD, $B0, $00, $B0, $08, $DD, $60, $10, $60, $10 ; PRG:$02A6 10 50 10 70 DD 70 DD B0 00 B0 08 DD 60 10 60 10 + .byte $80, $DD, $80, $DD, $C0, $00, $C0, $08, $08, $0F, $0A ; PRG:$02B6 80 DD 80 DD C0 00 C0 08 08 0F 0A + +;------------------------------------------------------------------------------ +; RopeInitialLowBytes +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +RopeInitialLowBytes: + ; Explicit bytes replacing .incbin ROM:$02D1, length $0006 + .byte $20, $50, $68, $80, $98, $C8 ; PRG:$02C1 20 50 68 80 98 C8 + +;------------------------------------------------------------------------------ +; RopeInitialHighBytes +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +RopeInitialHighBytes: + ; Explicit bytes replacing .incbin ROM:$02D7, length $0006 + .byte $C4, $CA, $CD, $D0, $D3, $D9 ; PRG:$02C7 C4 CA CD D0 D3 D9 + +;------------------------------------------------------------------------------ +; StageCollectibleSpriteTiles +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageCollectibleSpriteTiles: + ; Explicit bytes replacing .incbin ROM:$02DD, length $0018 + .byte $02, $00, $02, $02, $02, $00, $02, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; PRG:$02CD 02 00 02 02 02 00 02 00 00 00 00 00 00 00 00 00 + .byte $00, $02, $10, $0F, $03, $03, $0D, $0A ; PRG:$02DD 00 02 10 0F 03 03 0D 0A + +;------------------------------------------------------------------------------ +; CollectedObjectVramXTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +CollectedObjectVramXTable: + ; Explicit bytes replacing .incbin ROM:$02F5, length $0008 + .byte $D1, $D3, $D1, $D2, $EB, $D4, $DA, $DD ; PRG:$02E5 D1 D3 D1 D2 EB D4 DA DD + +;------------------------------------------------------------------------------ +; CollectedObjectVramAddressLo +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +CollectedObjectVramAddressLo: + ; Explicit bytes replacing .incbin ROM:$02FD, length $0001 + .byte $44 ; PRG:$02ED 44 + +;------------------------------------------------------------------------------ +; CollectedObjectVramAddressHi +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +CollectedObjectVramAddressHi: + ; Explicit bytes replacing .incbin ROM:$02FE, length $001B + .byte $21, $4C, $21, $51, $22, $93, $21, $45, $21, $4A, $21, $D3, $21, $00, $00, $8C ; PRG:$02EE 21 4C 21 51 22 93 21 45 21 4A 21 D3 21 00 00 8C + .byte $22, $12, $22, $4E, $21, $00, $00, $C8, $21, $D6, $21 ; PRG:$02FE 22 12 22 4E 21 00 00 C8 21 D6 21 + +;------------------------------------------------------------------------------ +; StageObjectDataPointerLo +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageObjectDataPointerLo: + ; Explicit bytes replacing .incbin ROM:$0319, length $0001 + .byte $11 ; PRG:$0309 11 + +;------------------------------------------------------------------------------ +; StageObjectDataPointerHi +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageObjectDataPointerHi: + ; Explicit bytes replacing .incbin ROM:$031A, length $005F + .byte $C3, $2E, $C3, $44, $C3, $5A, $C3, $1C, $20, $50, $AC, $24, $24, $5D, $5C, $60 ; PRG:$030A C3 2E C3 44 C3 5A C3 1C 20 50 AC 24 24 5D 5C 60 + .byte $50, $A4, $24, $24, $5C, $5D, $88, $90, $A8, $24, $24, $24, $24, $98, $60, $AC ; PRG:$031A 50 A4 24 24 5C 5D 88 90 A8 24 24 24 24 98 60 AC + .byte $24, $24, $5C, $5C, $15, $28, $50, $A8, $65, $65, $24, $24, $50, $50, $A4, $24 ; PRG:$032A 24 24 5C 5C 15 28 50 A8 65 65 24 24 50 50 A4 24 + .byte $24, $65, $65, $98, $70, $AC, $24, $24, $65, $65, $15, $60, $A0, $A4, $79, $24 ; PRG:$033A 24 65 65 98 70 AC 24 24 65 65 15 60 A0 A4 79 24 + .byte $79, $24, $90, $80, $A4, $24, $24, $24, $24, $70, $50, $A4, $24, $24, $24, $24 ; PRG:$034A 79 24 90 80 A4 24 24 24 24 70 50 A4 24 24 24 24 + .byte $0E, $40, $70, $A4, $65, $65, $24, $24, $B0, $70, $A4, $24, $24, $65, $65 ; PRG:$035A 0E 40 70 A4 65 65 24 24 B0 70 A4 24 24 65 65 + +;------------------------------------------------------------------------------ +; PlayerPoseCollisionShapePointerTable +; +; Pass 3 description: +; Interleaved little-endian pointers selected from PlayerState, PlayerFacing, and PlayerMovementSubstate. Targets describe the player collision rectangle for the current pose. +;------------------------------------------------------------------------------ +PlayerPoseCollisionShapePointerTable: + ; Explicit bytes replacing .incbin ROM:$0379, length $0001 + .byte $79 ; PRG:$0369 79 + +;------------------------------------------------------------------------------ +; PlayerPoseCollisionShapePointerHighBytes +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +PlayerPoseCollisionShapePointerHighBytes: + ; Explicit bytes replacing .incbin ROM:$037A, length $0053 + .byte $C3, $79, $C3, $7D, $C3, $81, $C3, $89, $C3, $8D, $C3, $85, $C3, $85, $C3, $07 ; PRG:$036A C3 79 C3 7D C3 81 C3 89 C3 8D C3 85 C3 85 C3 07 + .byte $00, $18, $0F, $03, $00, $11, $10, $0F, $00, $1B, $10, $03, $00, $1D, $10, $09 ; PRG:$037A 00 18 0F 03 00 11 10 0F 00 1B 10 03 00 1D 10 09 + .byte $00, $19, $0F, $05, $00, $18, $0F, $07, $04, $08, $07, $03, $07, $04, $08, $08 ; PRG:$038A 00 19 0F 05 00 18 0F 07 04 08 07 03 07 04 08 08 + .byte $09, $08, $09, $03, $09, $03, $09, $04, $00, $04, $03, $04, $01, $0C, $01, $00 ; PRG:$039A 09 08 09 03 09 03 09 04 00 04 03 04 01 0C 01 00 + .byte $01, $1F, $01, $04, $01, $0C, $04, $07, $08, $07, $09, $01, $01, $04, $01, $00 ; PRG:$03AA 01 1F 01 04 01 0C 04 07 08 07 09 01 01 04 01 00 + .byte $00, $10, $58 ; PRG:$03BA 00 10 58 + +;------------------------------------------------------------------------------ +; StageBackgroundVramStreamPointerTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageBackgroundVramStreamPointerTable: + ; Explicit bytes replacing .incbin ROM:$03CD, length $0001 + .byte $8E ; PRG:$03BD 8E + +;------------------------------------------------------------------------------ +; StageBackgroundVramStreamPointerHighBytes +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageBackgroundVramStreamPointerHighBytes: + ; Explicit bytes replacing .incbin ROM:$03CE, length $0036 + .byte $F3, $6C, $F7, $47, $F6, $EE, $F4, $12, $C8, $C9, $12, $24, $24, $42, $D0, $4F ; PRG:$03BE F3 6C F7 47 F6 EE F4 12 C8 C9 12 24 24 42 D0 4F + .byte $DF, $22, $A0, $A1, $A2, $A3, $24, $98, $99, $9A, $9B, $81, $82, $24, $83, $22 ; PRG:$03CE DF 22 A0 A1 A2 A3 24 98 99 9A 9B 81 82 24 83 22 + .byte $48, $49, $4A, $4B, $24, $9C, $9D, $9E, $9F, $24, $A4, $24, $A5, $00, $C0, $B4 ; PRG:$03DE 48 49 4A 4B 24 9C 9D 9E 9F 24 A4 24 A5 00 C0 B4 + .byte $BC, $B8, $C0, $12, $24, $24 ; PRG:$03EE BC B8 C0 12 24 24 + +;------------------------------------------------------------------------------ +; PlayerSelectVramCommandStream +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +PlayerSelectVramCommandStream: + ; Explicit bytes replacing .incbin ROM:$0404, length $0018 + .byte $23, $DB, $42, $50, $21, $CA, $4C, $24, $21, $EA, $0C, $24, $24, $19, $15, $0A ; PRG:$03F4 23 DB 42 50 21 CA 4C 24 21 EA 0C 24 24 19 15 0A + .byte $22, $0E, $1B, $24, $C0, $24, $24, $00 ; PRG:$0404 22 0E 1B 24 C0 24 24 00 + +;------------------------------------------------------------------------------ +; TwoPlayerVramCommandStream +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +TwoPlayerVramCommandStream: + ; Explicit bytes replacing .incbin ROM:$041C, length $0034 + .byte $23, $E2, $04, $04, $05, $05, $01, $22, $0A, $4C, $24, $22, $2A, $0C, $24, $10 ; PRG:$040C 23 E2 04 04 05 05 01 22 0A 4C 24 22 2A 0C 24 10 + .byte $0A, $16, $0E, $24, $24, $18, $8C, $0E, $1B, $24, $22, $4A, $4C, $24, $00, $12 ; PRG:$041C 0A 16 0E 24 24 18 8C 0E 1B 24 22 4A 4C 24 00 12 + .byte $24, $24, $22, $69, $6A, $69, $6A, $21, $42, $D1, $67, $21, $5D, $D1, $67, $23 ; PRG:$042C 24 24 22 69 6A 69 6A 21 42 D1 67 21 5D D1 67 23 + .byte $60, $60, $69, $00 ; PRG:$043C 60 60 69 00 + +;------------------------------------------------------------------------------ +; StageCollisionQueryPointerTable +; +; Pass 3 description: +; Interleaved little-endian pointers to stage-level collision query lists consumed by LoadStageCollisionList. +;------------------------------------------------------------------------------ +StageCollisionQueryPointerTable: + ; Explicit bytes replacing .incbin ROM:$0450, length $0001 + .byte $58 ; PRG:$0440 58 + +;------------------------------------------------------------------------------ +; StageCollisionQueryPointerHighBytes +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageCollisionQueryPointerHighBytes: + ; Explicit bytes replacing .incbin ROM:$0451, length $0007 + .byte $C4, $00, $04, $AA, $C4, $CB, $C4 ; PRG:$0441 C4 00 04 AA C4 CB C4 + +;------------------------------------------------------------------------------ +; PlayerStateCollisionListPointerTable +; +; Pass 3 description: +; Interleaved little-endian pointers to collision lists selected by the player movement/collision mode. +;------------------------------------------------------------------------------ +PlayerStateCollisionListPointerTable: + ; Explicit bytes replacing .incbin ROM:$0458, length $0001 + .byte $D4 ; PRG:$0448 D4 + +;------------------------------------------------------------------------------ +; PlayerStateCollisionListPointerHighBytes +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +PlayerStateCollisionListPointerHighBytes: + ; Explicit bytes replacing .incbin ROM:$0459, length $0007 + .byte $C4, $50, $04, $3E, $C5, $53, $C5 ; PRG:$0449 C4 50 04 3E C5 53 C5 + +;------------------------------------------------------------------------------ +; AlternateCollisionListPointerTable +; +; Pass 3 description: +; Interleaved little-endian pointers to alternate collision lists used by the secondary movement query path. +;------------------------------------------------------------------------------ +AlternateCollisionListPointerTable: + ; Explicit bytes replacing .incbin ROM:$0460, length $0001 + .byte $74 ; PRG:$0450 74 + +;------------------------------------------------------------------------------ +; AlternateCollisionListPointerHighBytes +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +AlternateCollisionListPointerHighBytes: + ; Explicit bytes replacing .incbin ROM:$0461, length $0034 + .byte $C5, $A0, $04, $D2, $C5, $07, $C6, $50, $28, $5F, $28, $14, $40, $92, $40, $90 ; PRG:$0451 C5 A0 04 D2 C5 07 C6 50 28 5F 28 14 40 92 40 90 + .byte $48, $CD, $48, $32, $70, $4B, $70, $C4, $88, $EF, $88, $32, $98, $5E, $98, $D4 ; PRG:$0461 48 CD 48 32 70 4B 70 C4 88 EF 88 32 98 5E 98 D4 + .byte $C0, $E5, $C0, $AF, $C8, $C0, $C8, $68, $C8, $78, $C8, $8F, $D0, $98, $D0, $08 ; PRG:$0471 C0 E5 C0 AF C8 C0 C8 68 C8 78 C8 8F D0 98 D0 08 + .byte $D8, $40, $D8, $FF ; PRG:$0481 D8 40 D8 FF + +;------------------------------------------------------------------------------ +; StageEnemyOamTemplateA +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageEnemyOamTemplateA: + ; Explicit bytes replacing .incbin ROM:$0495, length $007C + .byte $40, $28, $5F, $28, $40, $40, $A3, $40, $BD, $40, $CF, $40, $00, $C8, $2D, $C8 ; PRG:$0485 40 28 5F 28 40 40 A3 40 BD 40 CF 40 00 C8 2D C8 + .byte $62, $C8, $77, $CB, $B4, $A8, $CB, $A8, $C8, $D0, $FE, $D0, $18, $68, $20, $68 ; PRG:$0495 62 C8 77 CB B4 A8 CB A8 C8 D0 FE D0 18 68 20 68 + .byte $00, $A8, $20, $A8, $FF, $40, $28, $5F, $28, $60, $40, $C6, $40, $38, $70, $C7 ; PRG:$04A5 00 A8 20 A8 FF 40 28 5F 28 60 40 C6 40 38 70 C7 + .byte $70, $D0, $70, $EF, $70, $10, $98, $2F, $98, $38, $98, $C6, $98, $38, $C0, $C6 ; PRG:$04B5 70 D0 70 EF 70 10 98 2F 98 38 98 C6 98 38 C0 C6 + .byte $C0, $10, $D8, $40, $D8, $FF, $10, $40, $EF, $40, $08, $D8, $F8, $DA, $FF, $9C ; PRG:$04C5 C0 10 D8 40 D8 FF 10 40 EF 40 08 D8 F8 DA FF 9C + .byte $20, $9C, $24, $D4, $30, $D4, $AD, $EC, $30, $EC, $AD, $14, $40, $14, $C3, $2C ; PRG:$04D5 20 9C 24 D4 30 D4 AD EC 30 EC AD 14 40 14 C3 2C + .byte $40, $2C, $BD, $6C, $40, $6C, $AD, $8C, $40, $8C, $8D, $A4, $48, $A4, $AB, $BC ; PRG:$04E5 40 2C BD 6C 40 6C AD 8C 40 8C 8D A4 48 A4 AB BC + .byte $48, $BC, $9D, $44, $70, $44, $C4, $6C, $18, $6C, $2D, $FF ; PRG:$04F5 48 BC 9D 44 70 44 C4 6C 18 6C 2D FF + +;------------------------------------------------------------------------------ +; StageEnemyOamTemplateB +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageEnemyOamTemplateB: + ; Explicit bytes replacing .incbin ROM:$0511, length $00A0 + .byte $14, $47, $14, $5D, $14, $78, $14, $9D, $2C, $47, $2C, $9D, $44, $47, $44, $86 ; PRG:$0501 14 47 14 5D 14 78 14 9D 2C 47 2C 9D 44 47 44 86 + .byte $5C, $47, $5C, $6D, $74, $47, $74, $76, $8C, $47, $8C, $6D, $A4, $47, $A4, $86 ; PRG:$0511 5C 47 5C 6D 74 47 74 76 8C 47 8C 6D A4 47 A4 86 + .byte $BC, $47, $BC, $6D, $D4, $20, $D4, $6D, $EC, $20, $EC, $6D, $6C, $18, $6C, $2D ; PRG:$0521 BC 47 BC 6D D4 20 D4 6D EC 20 EC 6D 6C 18 6C 2D + .byte $D4, $90, $D4, $BD, $EC, $90, $EC, $BD, $9C, $18, $9C, $24, $FF, $14, $4F, $14 ; PRG:$0531 D4 90 D4 BD EC 90 EC BD 9C 18 9C 24 FF 14 4F 14 + .byte $C5, $2C, $4F, $2C, $C5, $D4, $20, $D4, $C7, $EC, $20, $EC, $C7, $6C, $18, $6C ; PRG:$0541 C5 2C 4F 2C C5 D4 20 D4 C7 EC 20 EC C7 6C 18 6C + .byte $2D, $FF, $2C, $40, $2C, $C3, $44, $40, $44, $C3, $5C, $40, $5C, $C3, $74, $40 ; PRG:$0551 2D FF 2C 40 2C C3 44 40 44 C3 5C 40 5C C3 74 40 + .byte $74, $C3, $8C, $40, $8C, $C3, $A4, $40, $A4, $C3, $BC, $40, $BC, $C3, $D4, $40 ; PRG:$0561 74 C3 8C 40 8C C3 A4 40 A4 C3 BC 40 BC C3 D4 40 + .byte $D4, $C3, $FF, $50, $10, $D0, $10, $50, $18, $50, $37, $50, $2B, $5D, $40, $D0 ; PRG:$0571 D4 C3 FF 50 10 D0 10 50 18 50 37 50 2B 5D 40 D0 + .byte $24, $F8, $24, $07, $43, $92, $48, $90, $49, $CF, $50, $30, $71, $4B, $78, $C0 ; PRG:$0581 24 F8 24 07 43 92 48 90 49 CF 50 30 71 4B 78 C0 + .byte $89, $F7, $90, $30, $99, $5D, $A0, $0A, $00, $0A, $FF, $F5, $00, $F5, $FF, $FF ; PRG:$0591 89 F7 90 30 99 5D A0 0A 00 0A FF F5 00 F5 FF FF + +;------------------------------------------------------------------------------ +; StageEnemyOamTemplateC +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +StageEnemyOamTemplateC: + ; Explicit bytes replacing .incbin ROM:$05B1, length $0073 + .byte $40, $14, $D0, $14, $D0, $2B, $FE, $2B, $00, $41, $A5, $47, $50, $18, $50, $3F ; PRG:$05A1 40 14 D0 14 D0 2B FE 2B 00 41 A5 47 50 18 50 3F + .byte $50, $2F, $5D, $2F, $BB, $41, $CF, $47, $B4, $A9, $CB, $AF, $D4, $95, $EC, $95 ; PRG:$05B1 50 2F 5D 2F BB 41 CF 47 B4 A9 CB AF D4 95 EC 95 + .byte $10, $69, $28, $6F, $D0, $90, $F0, $94, $0A, $00, $0A, $FF, $F5, $00, $F5, $FF ; PRG:$05C1 10 69 28 6F D0 90 F0 94 0A 00 0A FF F5 00 F5 FF + .byte $FF, $D0, $1F, $EF, $1F, $5C, $28, $5C, $40, $60, $42, $C7, $45, $10, $4F, $2B ; PRG:$05D1 FF D0 1F EF 1F 5C 28 5C 40 60 42 C7 45 10 4F 2B + .byte $4F, $38, $72, $C7, $75, $CA, $7F, $EF, $70, $38, $9A, $C6, $9C, $10, $A7, $2F ; PRG:$05E1 4F 38 72 C7 75 CA 7F EF 70 38 9A C6 9C 10 A7 2F + .byte $A7, $38, $C2, $C6, $C5, $40, $10, $B8, $10, $48, $00, $48, $28, $0A, $00, $0A ; PRG:$05F1 A7 38 C2 C6 C5 40 10 B8 10 48 00 48 28 0A 00 0A + .byte $FF, $F5, $00, $F5, $FF, $FF, $08, $4F, $F8, $4F, $0A, $00, $0A, $FF, $F5, $00 ; PRG:$0601 FF F5 00 F5 FF FF 08 4F F8 4F 0A 00 0A FF F5 00 + .byte $F5, $FF, $FF ; PRG:$0611 F5 FF FF + +;------------------------------------------------------------------------------ +; TwoTileObjectTileTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +TwoTileObjectTileTable: + ; Explicit bytes replacing .incbin ROM:$0624, length $0007 + .byte $F1, $F2, $5E, $F3, $F4, $F5, $F6 ; PRG:$0614 F1 F2 5E F3 F4 F5 F6 + +;------------------------------------------------------------------------------ +; ObjectTaskPayloadByIndex +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +ObjectTaskPayloadByIndex: + ; Explicit bytes replacing .incbin ROM:$062B, length $0007 + .byte $01, $02, $03, $04, $08, $12, $16 ; PRG:$061B 01 02 03 04 08 12 16 + +;------------------------------------------------------------------------------ +; SpawnedObjectCollisionShapePointerTable +; +; Pass 3 description: +; Interleaved little-endian pointers to collision shapes used when testing the spawned/two-tile object against the player. +;------------------------------------------------------------------------------ +SpawnedObjectCollisionShapePointerTable: + ; Explicit bytes replacing .incbin ROM:$0632, length $0001 + .byte $26 ; PRG:$0622 26 + +;------------------------------------------------------------------------------ +; SpawnedObjectCollisionShapePointerHighBytes +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +SpawnedObjectCollisionShapePointerHighBytes: + ; Explicit bytes replacing .incbin ROM:$0633, length $000B + .byte $C6, $2A, $C6, $19, $0F, $1B, $21, $04, $0F, $06, $21 ; PRG:$0623 C6 2A C6 19 0F 1B 21 04 0F 06 21 + +;------------------------------------------------------------------------------ +; DemoInputCodeTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +DemoInputCodeTable: + ; Explicit bytes replacing .incbin ROM:$063E, length $0020 + .byte $00, $05, $00, $01, $04, $01, $04, $01, $04, $02, $04, $05, $00, $02, $04, $05 ; PRG:$062E 00 05 00 01 04 01 04 01 04 02 04 05 00 02 04 05 + .byte $04, $05, $03, $00, $05, $01, $03, $01, $00, $04, $02, $01, $04, $02, $04, $02 ; PRG:$063E 04 05 03 00 05 01 03 01 00 04 02 01 04 02 04 02 + +;------------------------------------------------------------------------------ +; DemoInputDurationTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +DemoInputDurationTable: + ; Explicit bytes replacing .incbin ROM:$065E, length $0020 + .byte $2D, $01, $2D, $2D, $03, $96, $02, $0F, $1E, $1E, $1F, $01, $2D, $7E, $06, $01 ; PRG:$064E 2D 01 2D 2D 03 96 02 0F 1E 1E 1F 01 2D 7E 06 01 + .byte $0A, $01, $01, $0F, $01, $96, $0C, $3C, $2D, $02, $01, $0F, $04, $2C, $10, $FF ; PRG:$065E 0A 01 01 0F 01 96 0C 3C 2D 02 01 0F 04 2C 10 FF + +;------------------------------------------------------------------------------ +; ResetHandler +; +; Global description: +; Performs the decoded graphics operation represented by ResetHandler at PRG $066E. +; +; Local description: +; Direct callees/tail targets: InitializePpuOamAndDmc, AdvanceRandomLfsr. State and scratch fields referenced: GameMode, GameModeTimer, PlayerLivesOrModeCount, Zp00, Zp01. Direct named writes: GameMode, GameModeTimer, PPUCTRL, PPUControlShadow, PendingGameMode, PlayerLivesOrModeCount, TitleCursorY, Zp00, Zp01. Hardware registers: PPUCTRL, PPUSTATUS. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +ResetHandler: + sei ; PRG:$066E 78 + cld ; PRG:$066F D8 + lda #$10 ; PRG:$0670 A9 10 + sta PPUCTRL ; PRG:$0672 8D 00 20 + ldx #$FF ; PRG:$0675 A2 FF + txs ; PRG:$0677 9A +Label_C678: + lda PPUSTATUS ; PRG:$0678 AD 02 20 + and #$80 ; PRG:$067B 29 80 + beq Label_C678 ; PRG:$067D F0 F9 + ldy #$07 ; PRG:$067F A0 07 + sty Zp01 ; PRG:$0681 84 01 + ldy #$00 ; PRG:$0683 A0 00 + sty Zp00 ; PRG:$0685 84 00 + lda #$00 ; PRG:$0687 A9 00 +Label_C689: + sta (Zp00),y ; PRG:$0689 91 00 + dey ; PRG:$068B 88 + bne Label_C689 ; PRG:$068C D0 FB + dec Zp01 ; PRG:$068E C6 01 + bpl Label_C689 ; PRG:$0690 10 F7 + jsr InitializePpuOamAndDmc ; PRG:$0692 20 B6 C6 + lda #$6F ; PRG:$0695 A9 6F + sta TitleCursorY ; PRG:$0697 85 ED + lda #$18 ; PRG:$0699 A9 18 + sta GameModeTimer ; PRG:$069B 85 48 + lda #$01 ; PRG:$069D A9 01 + sta PlayerLivesOrModeCount ; PRG:$069F 85 4C + sta PendingGameMode ; PRG:$06A1 85 47 + lda #$00 ; PRG:$06A3 A9 00 + sta GameMode ; PRG:$06A5 85 46 + lda PPUControlShadow ; PRG:$06A7 A5 10 + eor #$80 ; PRG:$06A9 49 80 + sta PPUCTRL ; PRG:$06AB 8D 00 20 + sta PPUControlShadow ; PRG:$06AE 85 10 +Label_C6B0: + jsr AdvanceRandomLfsr ; PRG:$06B0 20 F8 F1 + jmp Label_C6B0 ; PRG:$06B3 4C B0 C6 + +;------------------------------------------------------------------------------ +; InitializePpuOamAndDmc +; +; Global description: +; Performs the decoded audio operation represented by InitializePpuOamAndDmc at PRG $06B6. +; +; Local description: +; Direct callees/tail targets: ClearGameplayNametable. State and scratch fields referenced: none. Direct named writes: APUDMALOAD, PPUCTRL, PPUControlShadow, PPUMASK, PPUMaskShadow, PPUSCROLL, PPUScrollXShadow, PPUScrollYShadow. Hardware registers: APUDMALOAD, PPUCTRL, PPUMASK, PPUSCROLL. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +InitializePpuOamAndDmc: + lda #$10 ; PRG:$06B6 A9 10 + sta PPUCTRL ; PRG:$06B8 8D 00 20 + sta PPUControlShadow ; PRG:$06BB 85 10 + lda #$06 ; PRG:$06BD A9 06 + sta PPUMASK ; PRG:$06BF 8D 01 20 + sta PPUMaskShadow ; PRG:$06C2 85 11 + lda #$00 ; PRG:$06C4 A9 00 + sta PPUSCROLL ; PRG:$06C6 8D 05 20 + sta PPUScrollXShadow ; PRG:$06C9 85 12 + sta PPUSCROLL ; PRG:$06CB 8D 05 20 + sta PPUScrollYShadow ; PRG:$06CE 85 13 + lda #$FF ; PRG:$06D0 A9 FF + ldy #$00 ; PRG:$06D2 A0 00 +Label_C6D4: + sta $0200,y ; PRG:$06D4 99 00 02 + dey ; PRG:$06D7 88 + beq Label_C6DD ; PRG:$06D8 F0 03 + jmp Label_C6D4 ; PRG:$06DA 4C D4 C6 +Label_C6DD: + jsr ClearGameplayNametable ; PRG:$06DD 20 16 CA + lda #$00 ; PRG:$06E0 A9 00 + sta APUDMALOAD ; PRG:$06E2 8D 11 40 + rts ; PRG:$06E5 60 + +;------------------------------------------------------------------------------ +; NmiHandler +; +; Global description: +; Runs the once-per-frame interrupt service and preserves the interrupted software-register workspace. +; +; Local description: +; Saves A, X, Y and Zp00-Zp07, disables NMI generation in the PPUCTRL shadow, performs OAM DMA, flushes queued VRAM commands, updates the rendering mask, audio, controllers, and the active game-mode frame handler, then restores Zp00-Zp07 and the CPU registers before RTI. +; +; Parameters: +; Entered by the NES NMI vector during vertical blank. Mainline code may have live values in Zp00-Zp07. +; +; Returns: +; Returns with RTI to the interrupted instruction. Persistent frame state is updated, while A, X, Y and Zp00-Zp07 are restored. +; +; Clobbers: +; Processor flags during the handler, PPU/APU/controller hardware, OAM/VRAM buffers, and game state intentionally updated by called frame routines. +;------------------------------------------------------------------------------ +NmiHandler: + pha ; PRG:$06E6 48 + txa ; PRG:$06E7 8A + pha ; PRG:$06E8 48 + tya ; PRG:$06E9 98 + pha ; PRG:$06EA 48 + lda Zp00 ; PRG:$06EB A5 00 + pha ; PRG:$06ED 48 + lda Zp01 ; PRG:$06EE A5 01 + pha ; PRG:$06F0 48 + lda Zp02 ; PRG:$06F1 A5 02 + pha ; PRG:$06F3 48 + lda Zp03 ; PRG:$06F4 A5 03 + pha ; PRG:$06F6 48 + lda Zp04 ; PRG:$06F7 A5 04 + pha ; PRG:$06F9 48 + lda Zp05 ; PRG:$06FA A5 05 + pha ; PRG:$06FC 48 + lda Zp06 ; PRG:$06FD A5 06 + pha ; PRG:$06FF 48 + lda Zp07 ; PRG:$0700 A5 07 + pha ; PRG:$0702 48 + lda PPUControlShadow ; PRG:$0703 A5 10 + and #$7F ; PRG:$0705 29 7F + sta PPUCTRL ; PRG:$0707 8D 00 20 + sta PPUControlShadow ; PRG:$070A 85 10 + jsr PerformOamDma ; PRG:$070C 20 B0 EE + jsr FlushQueuedVramCommands ; PRG:$070F 20 9C EE + jsr WriteInvertedRenderingMask ; PRG:$0712 20 7A CA + jsr UpdateAudioFrame ; PRG:$0715 20 1F F9 + jsr ReadControllers ; PRG:$0718 20 19 F2 + lda PendingGameMode ; PRG:$071B A5 47 + bne Label_C733 ; PRG:$071D D0 14 + lda GameMode ; PRG:$071F A5 46 + beq Label_C746 ; PRG:$0721 F0 23 + lda GameplaySubmode ; PRG:$0723 A5 4D + bne Label_C72D ; PRG:$0725 D0 06 + jsr UpdateGameplayFrame ; PRG:$0727 20 6E CD + jmp Label_C749 ; PRG:$072A 4C 49 C7 +Label_C72D: + jsr UpdateStageTransition ; PRG:$072D 20 C1 CF + jmp Label_C749 ; PRG:$0730 4C 49 C7 +Label_C733: + lda PlayerLivesOrModeCount ; PRG:$0733 A5 4C + bne Label_C73D ; PRG:$0735 D0 06 + jsr UpdateGameModeTransition ; PRG:$0737 20 97 C8 + jmp Label_C749 ; PRG:$073A 4C 49 C7 +Label_C73D: + jsr UpdateTitleScreenAndStartSelection ; PRG:$073D 20 73 C7 + jsr TickSoundTimers ; PRG:$0740 20 AF F1 + jmp Label_C749 ; PRG:$0743 4C 49 C7 +Label_C746: + jsr UpdateAttractModeState ; PRG:$0746 20 32 C9 +Label_C749: + jsr ProcessQueuedTask ; PRG:$0749 20 3A EE + lda PPUControlShadow ; PRG:$074C A5 10 + eor #$80 ; PRG:$074E 49 80 + sta PPUCTRL ; PRG:$0750 8D 00 20 + sta PPUControlShadow ; PRG:$0753 85 10 + pla ; PRG:$0755 68 + sta Zp07 ; PRG:$0756 85 07 + pla ; PRG:$0758 68 + sta Zp06 ; PRG:$0759 85 06 + pla ; PRG:$075B 68 + sta Zp05 ; PRG:$075C 85 05 + pla ; PRG:$075E 68 + sta Zp04 ; PRG:$075F 85 04 + pla ; PRG:$0761 68 + sta Zp03 ; PRG:$0762 85 03 + pla ; PRG:$0764 68 + sta Zp02 ; PRG:$0765 85 02 + pla ; PRG:$0767 68 + sta Zp01 ; PRG:$0768 85 01 + pla ; PRG:$076A 68 + sta Zp00 ; PRG:$076B 85 00 + pla ; PRG:$076D 68 + tay ; PRG:$076E A8 + pla ; PRG:$076F 68 + tax ; PRG:$0770 AA + pla ; PRG:$0771 68 + rti ; PRG:$0772 40 + +;------------------------------------------------------------------------------ +; UpdateTitleScreenAndStartSelection +; +; Global description: +; Performs the decoded audio operation represented by UpdateTitleScreenAndStartSelection at PRG $0773. +; +; Local description: +; Direct callees/tail targets: DisableBackgroundAndSpriteRendering, ProcessVramCommandStreamAndRestoreScroll, CollisionUpdateStep_EDFF, HideObjectSpriteGroup. State and scratch fields referenced: CollisionUpdateStep_EDFF, GameMode, GameModeTimer, GameStateTimer, GameplayInitializationPending, PlayerLivesOrModeCount, SoundRequestFlags, StageOrScreenIndex, Zp00, Zp01. Direct named writes: APUCTRL, ActionCooldown, BoundingBoxFlags, CurrentPlayerIndex, DemoInputActive, DifficultyOrRoundIndex, GameMode, GameModeTimer, GameStateTimer, GameplayInitializationPending, PendingGameMode, PlayerLivesOrModeCount, PreviousStartButtonState, RandomLfsr0, RandomLfsr1, SecondarySoundRequestFlags. Hardware registers: APUCTRL. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateTitleScreenAndStartSelection: + lda $06A2 ; PRG:$0773 AD A2 06 + bne Label_C77B ; PRG:$0776 D0 03 + sta APUCTRL ; PRG:$0778 8D 15 40 +Label_C77B: + lda $05B4 ; PRG:$077B AD B4 05 + bne Label_C78E ; PRG:$077E D0 0E + lda #$80 ; PRG:$0780 A9 80 + sta SecondarySoundRequestFlags ; PRG:$0782 85 FD + lda #$04 ; PRG:$0784 A9 04 + sta $05B4 ; PRG:$0786 8D B4 05 + lda #$0F ; PRG:$0789 A9 0F + sta APUCTRL ; PRG:$078B 8D 15 40 +Label_C78E: + lda TitleScreenInitialized ; PRG:$078E A5 52 + bne Label_C7BD ; PRG:$0790 D0 2B + jsr DisableBackgroundAndSpriteRendering; PRG:$0792 20 70 CA + lda #$66 ; PRG:$0795 A9 66 + sta Zp00 ; PRG:$0797 85 00 + lda #$F2 ; PRG:$0799 A9 F2 + sta Zp01 ; PRG:$079B 85 01 + jsr ProcessVramCommandStreamAndRestoreScroll; PRG:$079D 20 3C EF + lda TitleCursorY ; PRG:$07A0 A5 ED + sta $0200 ; PRG:$07A2 8D 00 02 + lda #$5C ; PRG:$07A5 A9 5C + sta $0201 ; PRG:$07A7 8D 01 02 + lda #$00 ; PRG:$07AA A9 00 + sta $0202 ; PRG:$07AC 8D 02 02 + sta TwoPlayerModeFlag ; PRG:$07AF 85 4E + lda #$38 ; PRG:$07B1 A9 38 + sta $0203 ; PRG:$07B3 8D 03 02 + sta TitleScreenInitialized ; PRG:$07B6 85 52 + lda #$20 ; PRG:$07B8 A9 20 + sta ActionCooldown ; PRG:$07BA 85 3C + rts ; PRG:$07BC 60 +Label_C7BD: + lda ControllerFilteredState ; PRG:$07BD A5 15 + and #$20 ; PRG:$07BF 29 20 + bne Label_C7DD ; PRG:$07C1 D0 1A + lda ControllerFilteredState ; PRG:$07C3 A5 15 + and #$10 ; PRG:$07C5 29 10 + bne Label_C7FE ; PRG:$07C7 D0 35 + lda #$00 ; PRG:$07C9 A9 00 + sta StartButtonLatch ; PRG:$07CB 85 6A + lda ActionCooldown ; PRG:$07CD A5 3C + bne Label_C7DC ; PRG:$07CF D0 0B + lda #$01 ; PRG:$07D1 A9 01 + sta TwoPlayerModeFlag ; PRG:$07D3 85 4E + lda #$01 ; PRG:$07D5 A9 01 + sta SelectedPlayerMode ; PRG:$07D7 85 EF + jmp Label_C826 ; PRG:$07D9 4C 26 C8 +Label_C7DC: + rts ; PRG:$07DC 60 +Label_C7DD: + lda #$20 ; PRG:$07DD A9 20 + sta ActionCooldown ; PRG:$07DF 85 3C + lda StartButtonLatch ; PRG:$07E1 A5 6A + beq Label_C7E6 ; PRG:$07E3 F0 01 + rts ; PRG:$07E5 60 +Label_C7E6: + lda $0200 ; PRG:$07E6 AD 00 02 + clc ; PRG:$07E9 18 + adc #$10 ; PRG:$07EA 69 10 + cmp #$AF ; PRG:$07EC C9 AF + bne Label_C7F2 ; PRG:$07EE D0 02 + lda #$6F ; PRG:$07F0 A9 6F +Label_C7F2: + sta $0200 ; PRG:$07F2 8D 00 02 + sta TitleCursorY ; PRG:$07F5 85 ED + inc StartButtonLatch ; PRG:$07F7 E6 6A + lda #$0A ; PRG:$07F9 A9 0A + sta TitleInputRepeatTimer ; PRG:$07FB 85 7D + rts ; PRG:$07FD 60 +Label_C7FE: + sta PreviousStartButtonState ; PRG:$07FE 85 EC + ldx #$0A ; PRG:$0800 A2 0A + lda #$00 ; PRG:$0802 A9 00 +Label_C804: + sta BoundingBoxFlags,x ; PRG:$0804 95 24 + dex ; PRG:$0806 CA + bne Label_C804 ; PRG:$0807 D0 FB + lda TitleCursorY ; PRG:$0809 A5 ED + lsr a ; PRG:$080B 4A + lsr a ; PRG:$080C 4A + lsr a ; PRG:$080D 4A + lsr a ; PRG:$080E 4A + sec ; PRG:$080F 38 + sbc #$06 ; PRG:$0810 E9 06 + sta SelectedPlayerMode ; PRG:$0812 85 EF + cmp #$02 ; PRG:$0814 C9 02 + bmi Label_C81F ; PRG:$0816 30 07 + lda #$1C ; PRG:$0818 A9 1C + sta GameModeTimer ; PRG:$081A 85 48 + jmp Label_C823 ; PRG:$081C 4C 23 C8 +Label_C81F: + lda #$18 ; PRG:$081F A9 18 + sta GameModeTimer ; PRG:$0821 85 48 +Label_C823: + jsr CollisionUpdateStep_EDFF ; PRG:$0823 20 FF ED +Label_C826: + lda #$0F ; PRG:$0826 A9 0F + sta RandomLfsr0 ; PRG:$0828 85 18 + lda #$13 ; PRG:$082A A9 13 + sta RandomLfsr1 ; PRG:$082C 85 19 + lda #$00 ; PRG:$082E A9 00 + sta PendingGameMode ; PRG:$0830 85 47 + sta $0586 ; PRG:$0832 8D 86 05 + sta $0587 ; PRG:$0835 8D 87 05 + sta GameMode ; PRG:$0838 85 46 + lda #$00 ; PRG:$083A A9 00 + sta TitleScreenInitialized ; PRG:$083C 85 52 + sta DemoInputActive ; PRG:$083E 85 E8 + sta StartButtonLatch ; PRG:$0840 85 6A + lda #$01 ; PRG:$0842 A9 01 + sta StageOrScreenIndex ; PRG:$0844 85 4A + sta $0580 ; PRG:$0846 8D 80 05 + sta $0581 ; PRG:$0849 8D 81 05 + lda SelectedPlayerMode ; PRG:$084C A5 EF + and #$01 ; PRG:$084E 29 01 + beq Label_C854 ; PRG:$0850 F0 02 + lda #$02 ; PRG:$0852 A9 02 +Label_C854: + sta DifficultyOrRoundIndex ; PRG:$0854 85 4B + sta $0582 ; PRG:$0856 8D 82 05 + sta $0583 ; PRG:$0859 8D 83 05 + lda #$00 ; PRG:$085C A9 00 + sta CurrentPlayerIndex ; PRG:$085E 85 49 + sta $05B0 ; PRG:$0860 8D B0 05 + sta $05B1 ; PRG:$0863 8D B1 05 + sta SoundRequestFlags ; PRG:$0866 85 FC + lda #$03 ; PRG:$0868 A9 03 + ldx TwoPlayerModeFlag ; PRG:$086A A6 4E + beq Label_C870 ; PRG:$086C F0 02 + lda #$01 ; PRG:$086E A9 01 +Label_C870: + sta PlayerLivesOrModeCount ; PRG:$0870 85 4C + sta $0584 ; PRG:$0872 8D 84 05 + sta $0585 ; PRG:$0875 8D 85 05 + sta GameplayInitializationPending ; PRG:$0878 85 E9 + lda TwoPlayerModeFlag ; PRG:$087A A5 4E + bne Label_C88C ; PRG:$087C D0 0E + lda #$80 ; PRG:$087E A9 80 + sta GameStateTimer ; PRG:$0880 85 39 + lda #$01 ; PRG:$0882 A9 01 + sta SecondarySoundRequestFlags ; PRG:$0884 85 FD + lda #$0F ; PRG:$0886 A9 0F + sta APUCTRL ; PRG:$0888 8D 15 40 + rts ; PRG:$088B 60 +Label_C88C: + dec $05B4 ; PRG:$088C CE B4 05 + lda #$6F ; PRG:$088F A9 6F + sta GameStateTimer ; PRG:$0891 85 39 + jsr HideObjectSpriteGroup ; PRG:$0893 20 08 CA + rts ; PRG:$0896 60 + +;------------------------------------------------------------------------------ +; UpdateGameModeTransition +; +; Global description: +; Performs the decoded audio operation represented by UpdateGameModeTransition at PRG $0897. +; +; Local description: +; Direct callees/tail targets: TickSoundTimers, ClearGameplayNametable, HideObjectSpriteGroup, QueuePlatformVramUpdateB, QueuePlayerSelectVramStream, QueueTwoPlayerVramStream, CollisionComputeStep_EDEE, LoadCurrentPlayerSessionState. State and scratch fields referenced: CollisionComputeStep_EDEE, GameMode, GameModeTimer, GameStateTimer, GameplayInitializationPending, PlayerLivesOrModeCount, StageOrScreenIndex. Direct named writes: CurrentPlayerIndex, GameMode, GameStateTimer, GameplayInitializationPending, PendingGameMode, PlayerLivesOrModeCount, TitleScreenInitialized, TwoPlayerModeFlag. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateGameModeTransition: + jsr TickSoundTimers ; PRG:$0897 20 AF F1 + lda TwoPlayerModeFlag ; PRG:$089A A5 4E + bne Label_C8B1 ; PRG:$089C D0 13 + lda GameStateTimer ; PRG:$089E A5 39 + cmp #$75 ; PRG:$08A0 C9 75 + beq Label_C8C0 ; PRG:$08A2 F0 1C + cmp #$74 ; PRG:$08A4 C9 74 + beq Label_C8CF ; PRG:$08A6 F0 27 + cmp #$73 ; PRG:$08A8 C9 73 + beq Label_C8D5 ; PRG:$08AA F0 29 + cmp #$5F ; PRG:$08AC C9 5F + beq Label_C8DE ; PRG:$08AE F0 2E + rts ; PRG:$08B0 60 +Label_C8B1: + sta PlayerLivesOrModeCount ; PRG:$08B1 85 4C + lda #$00 ; PRG:$08B3 A9 00 + sta TwoPlayerModeFlag ; PRG:$08B5 85 4E + sta TitleScreenInitialized ; PRG:$08B7 85 52 + jsr ClearGameplayNametable ; PRG:$08B9 20 16 CA + jsr HideObjectSpriteGroup ; PRG:$08BC 20 08 CA + rts ; PRG:$08BF 60 +Label_C8C0: + lda StageOrScreenIndex ; PRG:$08C0 A5 4A + cmp #$02 ; PRG:$08C2 C9 02 + bne Label_C8C9 ; PRG:$08C4 D0 03 + jsr QueuePlatformVramUpdateB ; PRG:$08C6 20 44 E2 +Label_C8C9: + jsr HideObjectSpriteGroup ; PRG:$08C9 20 08 CA + dec GameStateTimer ; PRG:$08CC C6 39 + rts ; PRG:$08CE 60 +Label_C8CF: + jsr QueuePlayerSelectVramStream ; PRG:$08CF 20 33 CA + dec GameStateTimer ; PRG:$08D2 C6 39 + rts ; PRG:$08D4 60 +Label_C8D5: + jsr QueueTwoPlayerVramStream ; PRG:$08D5 20 5E CA + jsr CollisionComputeStep_EDEE ; PRG:$08D8 20 EE ED + dec GameStateTimer ; PRG:$08DB C6 39 + rts ; PRG:$08DD 60 +Label_C8DE: + ldx CurrentPlayerIndex ; PRG:$08DE A6 49 + lda #$01 ; PRG:$08E0 A9 01 + sta $0586,x ; PRG:$08E2 9D 86 05 + sta PendingGameMode ; PRG:$08E5 85 47 + lda GameModeTimer ; PRG:$08E7 A5 48 + cmp #$1C ; PRG:$08E9 C9 1C + bne Label_C8F9 ; PRG:$08EB D0 0C + lda CurrentPlayerIndex ; PRG:$08ED A5 49 + eor #$01 ; PRG:$08EF 49 01 + tax ; PRG:$08F1 AA + lda $0586,x ; PRG:$08F2 BD 86 05 + sta PendingGameMode ; PRG:$08F5 85 47 + beq Label_C902 ; PRG:$08F7 F0 09 +Label_C8F9: + sta PlayerLivesOrModeCount ; PRG:$08F9 85 4C + jsr HideObjectSpriteGroup ; PRG:$08FB 20 08 CA + jsr ClearGameplayNametable ; PRG:$08FE 20 16 CA + rts ; PRG:$0901 60 +Label_C902: + ldy #$00 ; PRG:$0902 A0 00 + sty GameMode ; PRG:$0904 84 46 + stx CurrentPlayerIndex ; PRG:$0906 86 49 + jsr LoadCurrentPlayerSessionState ; PRG:$0908 20 12 C9 + lda #$85 ; PRG:$090B A9 85 + sta GameStateTimer ; PRG:$090D 85 39 + sta GameplayInitializationPending ; PRG:$090F 85 E9 + rts ; PRG:$0911 60 + +;------------------------------------------------------------------------------ +; LoadCurrentPlayerSessionState +; +; Global description: +; Performs the decoded player-state operation represented by LoadCurrentPlayerSessionState at PRG $0912. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: StageOrScreenIndex. Direct named writes: a. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +LoadCurrentPlayerSessionState: + ldy #$00 ; PRG:$0912 A0 00 +Label_C914: + lda $0580,x ; PRG:$0914 BD 80 05 + sta a:StageOrScreenIndex,y ; PRG:$0917 99 4A 00 + inx ; PRG:$091A E8 + inx ; PRG:$091B E8 + iny ; PRG:$091C C8 + cpy #$03 ; PRG:$091D C0 03 + bne Label_C914 ; PRG:$091F D0 F3 + rts ; PRG:$0921 60 + +;------------------------------------------------------------------------------ +; SaveCurrentPlayerSessionState +; +; Global description: +; Performs the decoded player-state operation represented by SaveCurrentPlayerSessionState at PRG $0922. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: StageOrScreenIndex. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +SaveCurrentPlayerSessionState: + ldy #$00 ; PRG:$0922 A0 00 +Label_C924: + lda a:StageOrScreenIndex,y ; PRG:$0924 B9 4A 00 + sta $0580,x ; PRG:$0927 9D 80 05 + inx ; PRG:$092A E8 + inx ; PRG:$092B E8 + iny ; PRG:$092C C8 + cpy #$03 ; PRG:$092D C0 03 + bne Label_C924 ; PRG:$092F D0 F3 + rts ; PRG:$0931 60 + +;------------------------------------------------------------------------------ +; UpdateAttractModeState +; +; Global description: +; Performs the decoded audio operation represented by UpdateAttractModeState at PRG $0932. +; +; Local description: +; Direct callees/tail targets: TickSoundTimers, InitializeGameplayRam, InitializePlayerBoundingBox, DetectPlayerLoss, AdvanceAttractModeSequence. State and scratch fields referenced: GameMode, GameStateTimer, StageOrScreenIndex. Direct named writes: GameMode, GameStateTimer. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateAttractModeState: + jsr TickSoundTimers ; PRG:$0932 20 AF F1 + lda GameStateTimer ; PRG:$0935 A5 39 + cmp #$84 ; PRG:$0937 C9 84 + beq Label_C94F ; PRG:$0939 F0 14 + cmp #$6E ; PRG:$093B C9 6E + bcs Label_C965 ; PRG:$093D B0 26 + cmp #$68 ; PRG:$093F C9 68 + bne Label_C94E ; PRG:$0941 D0 0B + jsr InitializeGameplayRam ; PRG:$0943 20 82 CA + lda #$01 ; PRG:$0946 A9 01 + sta GameMode ; PRG:$0948 85 46 + lda #$00 ; PRG:$094A A9 00 + sta GameStateTimer ; PRG:$094C 85 39 +Label_C94E: + rts ; PRG:$094E 60 +Label_C94F: + ldx CurrentPlayerIndex ; PRG:$094F A6 49 + lda StageOrScreenIndex ; PRG:$0951 A5 4A + cmp $0580,x ; PRG:$0953 DD 80 05 + beq Label_C962 ; PRG:$0956 F0 0A + cmp #$01 ; PRG:$0958 C9 01 + beq Label_C962 ; PRG:$095A F0 06 + jsr InitializePlayerBoundingBox ; PRG:$095C 20 4E D0 + jsr DetectPlayerLoss ; PRG:$095F 20 D4 CE +Label_C962: + dec GameStateTimer ; PRG:$0962 C6 39 + rts ; PRG:$0964 60 +Label_C965: + jsr AdvanceAttractModeSequence ; PRG:$0965 20 69 C9 + rts ; PRG:$0968 60 + +;------------------------------------------------------------------------------ +; AdvanceAttractModeSequence +; +; Global description: +; Performs the decoded collision operation represented by AdvanceAttractModeSequence at PRG $0969. +; +; Local description: +; Direct callees/tail targets: HideObjectSpriteGroup, ClearGameplayNametable, QueuePlayerSelectVramStream, DisableBackgroundAndSpriteRendering, ProcessVramCommandStreamAndRestoreScroll, QueueRectangularVramTransfer, QueueCollisionAndVramTasks, QueuePlayerCountVramUpdate, QueueSingleVramByte, QueueSelectedHudFields. State and scratch fields referenced: GameModeTimer, GameStateTimer, PlayerVerticalFraction, PlayerVerticalPosition, StageBackgroundVramStreamPointerHighBytes, StageBackgroundVramStreamPointerTable, StageOrScreenIndex, StagePlayerStartYTable, Zp00, Zp01, Zp02, Zp03, Zp08. Direct named writes: ActionCooldown, GameStateTimer, PlayerVerticalFraction, PlayerVerticalPosition, Zp00, Zp01, Zp02, Zp03, Zp08. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AdvanceAttractModeSequence: + cmp #$74 ; PRG:$0969 C9 74 + beq Label_C976 ; PRG:$096B F0 09 + cmp #$6F ; PRG:$096D C9 6F + beq Label_C982 ; PRG:$096F F0 11 + cmp #$6E ; PRG:$0971 C9 6E + beq Label_C988 ; PRG:$0973 F0 13 + rts ; PRG:$0975 60 +Label_C976: + jsr HideObjectSpriteGroup ; PRG:$0976 20 08 CA + jsr ClearGameplayNametable ; PRG:$0979 20 16 CA + jsr QueuePlayerSelectVramStream ; PRG:$097C 20 33 CA + dec GameStateTimer ; PRG:$097F C6 39 + rts ; PRG:$0981 60 +Label_C982: + jsr ClearGameplayNametable ; PRG:$0982 20 16 CA + dec GameStateTimer ; PRG:$0985 C6 39 + rts ; PRG:$0987 60 +Label_C988: + jsr DisableBackgroundAndSpriteRendering; PRG:$0988 20 70 CA + ldx StageOrScreenIndex ; PRG:$098B A6 4A + dex ; PRG:$098D CA + txa ; PRG:$098E 8A + asl a ; PRG:$098F 0A + sta Zp08 ; PRG:$0990 85 08 + tax ; PRG:$0992 AA + lda StageBackgroundVramStreamPointerTable,x ; PRG:$0993 BD BD C3 + sta Zp00 ; PRG:$0996 85 00 + lda StageBackgroundVramStreamPointerHighBytes,x ; PRG:$0998 BD BE C3 + sta Zp01 ; PRG:$099B 85 01 + jsr ProcessVramCommandStreamAndRestoreScroll; PRG:$099D 20 3C EF + lda StageOrScreenIndex ; PRG:$09A0 A5 4A + cmp #$04 ; PRG:$09A2 C9 04 + beq Label_C9B1 ; PRG:$09A4 F0 0B + lda #$B6 ; PRG:$09A6 A9 B6 + sta Zp00 ; PRG:$09A8 85 00 + lda #$F8 ; PRG:$09AA A9 F8 + sta Zp01 ; PRG:$09AC 85 01 + jsr ProcessVramCommandStreamAndRestoreScroll; PRG:$09AE 20 3C EF +Label_C9B1: + lda GameModeTimer ; PRG:$09B1 A5 48 + cmp #$1C ; PRG:$09B3 C9 1C + beq Label_C9CA ; PRG:$09B5 F0 13 + lda #$75 ; PRG:$09B7 A9 75 + sta Zp00 ; PRG:$09B9 85 00 + lda #$20 ; PRG:$09BB A9 20 + sta Zp01 ; PRG:$09BD 85 01 + lda #$2B ; PRG:$09BF A9 2B + sta Zp02 ; PRG:$09C1 85 02 + lda #$C4 ; PRG:$09C3 A9 C4 + sta Zp03 ; PRG:$09C5 85 03 + jsr QueueRectangularVramTransfer ; PRG:$09C7 20 CE EF +Label_C9CA: + jsr QueueCollisionAndVramTasks ; PRG:$09CA 20 A4 EC + jsr QueuePlayerCountVramUpdate ; PRG:$09CD 20 25 CA + lda #$BC ; PRG:$09D0 A9 BC + sta Zp00 ; PRG:$09D2 85 00 + ldy DifficultyOrRoundIndex ; PRG:$09D4 A4 4B + lda SelectedPlayerMode ; PRG:$09D6 A5 EF + and #$01 ; PRG:$09D8 29 01 + beq Label_C9DE ; PRG:$09DA F0 02 + dey ; PRG:$09DC 88 + dey ; PRG:$09DD 88 +Label_C9DE: + iny ; PRG:$09DE C8 + jsr QueueSingleVramByte ; PRG:$09DF 20 C5 F1 + lda #$00 ; PRG:$09E2 A9 00 + sta PlayerVerticalFraction ; PRG:$09E4 85 2C + lda #$80 ; PRG:$09E6 A9 80 + dey ; PRG:$09E8 88 + cpy #$04 ; PRG:$09E9 C0 04 + bpl Label_C9F0 ; PRG:$09EB 10 03 + lda StagePlayerStartYTable,y ; PRG:$09ED B9 1E C0 +Label_C9F0: + sta PlayerVerticalPosition ; PRG:$09F0 85 2E + lda #$1B ; PRG:$09F2 A9 1B + sta ActionCooldown ; PRG:$09F4 85 3C + lda #$02 ; PRG:$09F6 A9 02 + sta Zp00 ; PRG:$09F8 85 00 + jsr QueueSelectedHudFields; PRG:$09FA 20 50 EF + dec GameStateTimer ; PRG:$09FD C6 39 + lda TwoPlayerModeFlag ; PRG:$09FF A5 4E + beq Label_CA07 ; PRG:$0A01 F0 04 + lda #$69 ; PRG:$0A03 A9 69 + sta GameStateTimer ; PRG:$0A05 85 39 +Label_CA07: + rts ; PRG:$0A07 60 + +;------------------------------------------------------------------------------ +; HideObjectSpriteGroup +; +; Global description: +; Performs the decoded graphics operation represented by HideObjectSpriteGroup at PRG $0A08. +; +; Local description: +; Direct callees/tail targets: RenderObjectSpriteGrid. State and scratch fields referenced: Zp03, Zp04. Direct named writes: Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +HideObjectSpriteGroup: + lda #$00 ; PRG:$0A08 A9 00 + sta Zp04 ; PRG:$0A0A 85 04 + lda #$FF ; PRG:$0A0C A9 FF + sta Zp03 ; PRG:$0A0E 85 03 + lda #$0F ; PRG:$0A10 A9 0F + jsr RenderObjectSpriteGrid ; PRG:$0A12 20 08 EA + rts ; PRG:$0A15 60 + +;------------------------------------------------------------------------------ +; ClearGameplayNametable +; +; Global description: +; Performs the decoded graphics operation represented by ClearGameplayNametable at PRG $0A16. +; +; Local description: +; Direct callees/tail targets: DisableBackgroundAndSpriteRendering, FillNametableAndClearAttributes. State and scratch fields referenced: Zp00, Zp01. Direct named writes: Zp00, Zp01. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +ClearGameplayNametable: + lda #$24 ; PRG:$0A16 A9 24 + sta Zp00 ; PRG:$0A18 85 00 + lda #$01 ; PRG:$0A1A A9 01 + sta Zp01 ; PRG:$0A1C 85 01 + jsr DisableBackgroundAndSpriteRendering; PRG:$0A1E 20 70 CA + jsr FillNametableAndClearAttributes; PRG:$0A21 20 BB EE + rts ; PRG:$0A24 60 + +;------------------------------------------------------------------------------ +; QueuePlayerCountVramUpdate +; +; Global description: +; Performs the decoded graphics operation represented by QueuePlayerCountVramUpdate at PRG $0A25. +; +; Local description: +; Direct callees/tail targets: QueueSingleVramByte. State and scratch fields referenced: PlayerLivesOrModeCount, Zp00, Zp01. Direct named writes: Zp00, Zp01. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +QueuePlayerCountVramUpdate: + lda #$B5 ; PRG:$0A25 A9 B5 + sta Zp00 ; PRG:$0A27 85 00 + lda #$20 ; PRG:$0A29 A9 20 + sta Zp01 ; PRG:$0A2B 85 01 + ldy PlayerLivesOrModeCount ; PRG:$0A2D A4 4C + jsr QueueSingleVramByte ; PRG:$0A2F 20 C5 F1 + rts ; PRG:$0A32 60 + +;------------------------------------------------------------------------------ +; QueuePlayerSelectVramStream +; +; Global description: +; Performs the decoded graphics operation represented by QueuePlayerSelectVramStream at PRG $0A33. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: GameModeTimer, PlayerSelectVramCommandStream, StageOrScreenIndex. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +QueuePlayerSelectVramStream: + lda TwoPlayerModeFlag ; PRG:$0A33 A5 4E + bne Label_CA5D ; PRG:$0A35 D0 26 + lda GameModeTimer ; PRG:$0A37 A5 48 + cmp #$1C ; PRG:$0A39 C9 1C + bne Label_CA5D ; PRG:$0A3B D0 20 + ldx CurrentPlayerIndex ; PRG:$0A3D A6 49 + lda StageOrScreenIndex ; PRG:$0A3F A5 4A + cmp $0580,x ; PRG:$0A41 DD 80 05 + bne Label_CA5D ; PRG:$0A44 D0 17 + ldy #$00 ; PRG:$0A46 A0 00 +Label_CA48: + lda PlayerSelectVramCommandStream,y ; PRG:$0A48 B9 F4 C3 + sta $0331,y ; PRG:$0A4B 99 31 03 + beq Label_CA54 ; PRG:$0A4E F0 04 + iny ; PRG:$0A50 C8 + jmp Label_CA48 ; PRG:$0A51 4C 48 CA +Label_CA54: + lda CurrentPlayerIndex ; PRG:$0A54 A5 49 + beq Label_CA5D ; PRG:$0A56 F0 05 + lda #$C1 ; PRG:$0A58 A9 C1 + sta $0345 ; PRG:$0A5A 8D 45 03 +Label_CA5D: + rts ; PRG:$0A5D 60 + +;------------------------------------------------------------------------------ +; QueueTwoPlayerVramStream +; +; Global description: +; Performs the decoded collision operation represented by QueueTwoPlayerVramStream at PRG $0A5E. +; +; Local description: +; Direct callees/tail targets: CollisionComputeStep_EDEE. State and scratch fields referenced: CollisionComputeStep_EDEE. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +QueueTwoPlayerVramStream: + ldy #$00 ; PRG:$0A5E A0 00 +Label_CA60: + lda TwoPlayerVramCommandStream,y ; PRG:$0A60 B9 0C C4 + sta $0331,y ; PRG:$0A63 99 31 03 + beq Label_CA6C ; PRG:$0A66 F0 04 + iny ; PRG:$0A68 C8 + jmp Label_CA60 ; PRG:$0A69 4C 60 CA +Label_CA6C: + jsr CollisionComputeStep_EDEE ; PRG:$0A6C 20 EE ED + rts ; PRG:$0A6F 60 + +;------------------------------------------------------------------------------ +; DisableBackgroundAndSpriteRendering +; +; Global description: +; Performs the decoded graphics operation represented by DisableBackgroundAndSpriteRendering at PRG $0A70. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. Direct named writes: PPUMASK, PPUMaskShadow. Hardware registers: PPUMASK. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DisableBackgroundAndSpriteRendering: + lda PPUMaskShadow ; PRG:$0A70 A5 11 + and #$E7 ; PRG:$0A72 29 E7 + sta PPUMASK ; PRG:$0A74 8D 01 20 + sta PPUMaskShadow ; PRG:$0A77 85 11 + rts ; PRG:$0A79 60 + +;------------------------------------------------------------------------------ +; WriteInvertedRenderingMask +; +; Global description: +; Performs the decoded graphics operation represented by WriteInvertedRenderingMask at PRG $0A7A. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. Direct named writes: PPUMASK. Hardware registers: PPUMASK. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +WriteInvertedRenderingMask: + lda PPUMaskShadow ; PRG:$0A7A A5 11 + eor #$18 ; PRG:$0A7C 49 18 + sta PPUMASK ; PRG:$0A7E 8D 01 20 + rts ; PRG:$0A81 60 + +;------------------------------------------------------------------------------ +; InitializeGameplayRam +; +; Global description: +; Performs the decoded graphics operation represented by InitializeGameplayRam at PRG $0A82. +; +; Local description: +; Direct callees/tail targets: FillObjectTileColumn, RunStageInitializerRecords, DrawStageSpriteLayout, QueuePlayerCountVramUpdate, InitializeStageObjects, SaveCurrentPlayerSessionState. State and scratch fields referenced: GameplayInitializationPending, PlayerFacing, PlayerFallThreshold, PlayerGravityFraction, PlayerGravityInteger, PlayerLivesOrModeCount, PlayerState, PlayerVerticalAcceleration, PlayerVerticalSpeedInteger, StageCollectibleSpriteTiles, StageObjectDataLength, StageObjectDataPointer, StageObjectDataPointerHi, StageObjectDataPointerLo, StageOrScreenIndex, Zp00, Zp02, Zp03, Zp04, Zp08, Zp88, Zp89, Zp9B, Zp9C. Direct named writes: BonusCounter, BonusTickDivider, CollectibleActiveArray, CollectibleSpriteTileArray, CurrentStageObjectDataPointerHi, DifficultyOrRoundIndex, GameplayInitializationPending, PlayerFacing, PlayerFallThreshold, PlayerGravityFraction, PlayerGravityInteger, PlayerLivesOrModeCount, PlayerState, PlayerVerticalAcceleration, PlayerVerticalSpeedInteger, StageObjectDataLength. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +InitializeGameplayRam: + lda #$00 ; PRG:$0A82 A9 00 + ldx #$53 ; PRG:$0A84 A2 53 +Label_CA86: + sta Zp00,x ; PRG:$0A86 95 00 + inx ; PRG:$0A88 E8 + cpx #$E9 ; PRG:$0A89 E0 E9 + bne Label_CA86 ; PRG:$0A8B D0 F9 + lda #$01 ; PRG:$0A8D A9 01 + sta PlayerState ; PRG:$0A8F 85 6B + sta CollectibleActiveArray ; PRG:$0A91 85 9A + sta Zp9B ; PRG:$0A93 85 9B + sta Zp9C ; PRG:$0A95 85 9C + sta Zp9D ; PRG:$0A97 85 9D + sta PlayerGravityInteger ; PRG:$0A99 85 87 + sta Zp89 ; PRG:$0A9B 85 89 + lda StageOrScreenIndex ; PRG:$0A9D A5 4A + and #$01 ; PRG:$0A9F 29 01 + eor #$01 ; PRG:$0AA1 49 01 + sta PlayerFacing ; PRG:$0AA3 85 6D + lda #$02 ; PRG:$0AA5 A9 02 + sta PlayerVerticalSpeedInteger ; PRG:$0AA7 85 7A + lda #$60 ; PRG:$0AA9 A9 60 + sta PlayerGravityFraction ; PRG:$0AAB 85 86 + sta Zp88 ; PRG:$0AAD 85 88 + lda #$A0 ; PRG:$0AAF A9 A0 + sta PlayerVerticalAcceleration ; PRG:$0AB1 85 7C + lda #$16 ; PRG:$0AB3 A9 16 + sta PlayerFallThreshold ; PRG:$0AB5 85 7B + lda #$32 ; PRG:$0AB7 A9 32 + sta BonusTickDivider ; PRG:$0AB9 85 64 + lda #$24 ; PRG:$0ABB A9 24 + sta BonusCounter ; PRG:$0ABD 85 65 + ldx Zp08 ; PRG:$0ABF A6 08 + lda StageObjectDataPointerLo,x ; PRG:$0AC1 BD 09 C3 + sta StageObjectDataPointer ; PRG:$0AC4 85 91 + lda StageObjectDataPointerHi,x ; PRG:$0AC6 BD 0A C3 + sta CurrentStageObjectDataPointerHi ; PRG:$0AC9 85 92 + ldy #$00 ; PRG:$0ACB A0 00 + lda (StageObjectDataPointer),y ; PRG:$0ACD B1 91 + sta StageObjectDataLength ; PRG:$0ACF 85 93 + lda #$01 ; PRG:$0AD1 A9 01 + sta Zp02 ; PRG:$0AD3 85 02 + lda #$08 ; PRG:$0AD5 A9 08 + sta Zp03 ; PRG:$0AD7 85 03 + lda #$10 ; PRG:$0AD9 A9 10 + sta Zp04 ; PRG:$0ADB 85 04 + jsr FillObjectTileColumn ; PRG:$0ADD 20 06 EA + lda Zp08 ; PRG:$0AE0 A5 08 + asl a ; PRG:$0AE2 0A + tay ; PRG:$0AE3 A8 + ldx #$00 ; PRG:$0AE4 A2 00 +Label_CAE6: + lda StageCollectibleSpriteTiles,y ; PRG:$0AE6 B9 CD C2 + sta CollectibleSpriteTileArray,x ; PRG:$0AE9 95 8D + iny ; PRG:$0AEB C8 + inx ; PRG:$0AEC E8 + cpx #$04 ; PRG:$0AED E0 04 + bne Label_CAE6 ; PRG:$0AEF D0 F5 + ldy StageOrScreenIndex ; PRG:$0AF1 A4 4A + jsr RunStageInitializerRecords ; PRG:$0AF3 20 85 CB + ldx Zp08 ; PRG:$0AF6 A6 08 + jsr DrawStageSpriteLayout ; PRG:$0AF8 20 58 CC + lda GameplayInitializationPending ; PRG:$0AFB A5 E9 + beq Label_CB08 ; PRG:$0AFD F0 09 + lda #$00 ; PRG:$0AFF A9 00 + sta GameplayInitializationPending ; PRG:$0B01 85 E9 + dec PlayerLivesOrModeCount ; PRG:$0B03 C6 4C + jsr QueuePlayerCountVramUpdate ; PRG:$0B05 20 25 CA +Label_CB08: + lda DifficultyOrRoundIndex ; PRG:$0B08 A5 4B + pha ; PRG:$0B0A 48 + cmp #$06 ; PRG:$0B0B C9 06 + bmi Label_CB13 ; PRG:$0B0D 30 04 + lda #$05 ; PRG:$0B0F A9 05 + sta DifficultyOrRoundIndex ; PRG:$0B11 85 4B +Label_CB13: + jsr InitializeStageObjects ; PRG:$0B13 20 1F CB + pla ; PRG:$0B16 68 + sta DifficultyOrRoundIndex ; PRG:$0B17 85 4B + ldx CurrentPlayerIndex ; PRG:$0B19 A6 49 + jsr SaveCurrentPlayerSessionState ; PRG:$0B1B 20 22 C9 + rts ; PRG:$0B1E 60 + +;------------------------------------------------------------------------------ +; InitializeStageObjects +; +; Global description: +; Initializes stage-specific object, collision, and sprite-layout state. +; +; Local description: +; Dispatches through the stage initializer records, loads the active stage object configuration, seeds stage RAM and counts, and prepares stage-specific OAM/collision records used by gameplay. +; +; Parameters: +; StageOrScreenIndex and DifficultyOrRoundIndex select the stage and difficulty configuration. +; +; Returns: +; Returns with stage object arrays, counts, collision records, and sprite templates initialized. +; +; Clobbers: +; A, X, Y, shared scratch Zp00-Zp07, stage object RAM, OAM/template RAM, and processor flags. +;------------------------------------------------------------------------------ +InitializeStageObjects: + lda StageOrScreenIndex ; PRG:$0B1F A5 4A + cmp #$01 ; PRG:$0B21 C9 01 + beq Label_CB45 ; PRG:$0B23 F0 20 + cmp #$02 ; PRG:$0B25 C9 02 + beq Label_CB5A ; PRG:$0B27 F0 31 + cmp #$03 ; PRG:$0B29 C9 03 + beq Label_CB6E ; PRG:$0B2B F0 41 + jsr InitializeStageFourRopes ; PRG:$0B2D 20 2A CC + jsr LoadPrimaryStageObjectConfig ; PRG:$0B30 20 BD CC + jsr LoadObjectConfigGroup8 ; PRG:$0B33 20 23 CD + jsr LoadStageObjectParameters ; PRG:$0B36 20 59 CD + lda #$02 ; PRG:$0B39 A9 02 + sta Zp00 ; PRG:$0B3B 85 00 + jsr DrawPrimaryStageObjects ; PRG:$0B3D 20 6C CC + lda #$10 ; PRG:$0B40 A9 10 + sta SoundRequestFlags ; PRG:$0B42 85 FC + rts ; PRG:$0B44 60 +Label_CB45: + jsr InitializeStageOneObjectCounts ; PRG:$0B45 20 A8 CB + jsr LoadPrimaryStageObjectConfig ; PRG:$0B48 20 BD CC + jsr LoadSecondaryStageObjectConfig ; PRG:$0B4B 20 EA CC + lda StagePrimaryObjectCount ; PRG:$0B4E A5 A0 + sta Zp00 ; PRG:$0B50 85 00 + jsr DrawPrimaryStageObjects ; PRG:$0B52 20 6C CC + lda #$02 ; PRG:$0B55 A9 02 + sta SoundRequestFlags ; PRG:$0B57 85 FC + rts ; PRG:$0B59 60 +Label_CB5A: + jsr InitializeStageTwoObjects ; PRG:$0B5A 20 B1 CB + jsr LoadObjectConfigGroup0 ; PRG:$0B5D 20 07 CD + jsr LoadStageObjectParameters ; PRG:$0B60 20 59 CD + jsr DrawFixedStageObjects ; PRG:$0B63 20 94 CC + jsr QueuePlatformVramUpdateA ; PRG:$0B66 20 39 E2 + lda #$04 ; PRG:$0B69 A9 04 + sta SoundRequestFlags ; PRG:$0B6B 85 FC + rts ; PRG:$0B6D 60 +Label_CB6E: + jsr InitializeStageThreeObjects ; PRG:$0B6E 20 0D CC + jsr LoadStageFourObjectConfig ; PRG:$0B71 20 0D CD + jsr LoadObjectConfigGroup4 ; PRG:$0B74 20 1D CD + jsr LoadStageObjectParameters ; PRG:$0B77 20 59 CD + jsr DrawStageThreePrimaryObjects ; PRG:$0B7A 20 7E CC + jsr DrawSecondaryStageObjects ; PRG:$0B7D 20 86 CC + lda #$08 ; PRG:$0B80 A9 08 + sta SoundRequestFlags ; PRG:$0B82 85 FC + rts ; PRG:$0B84 60 + +;------------------------------------------------------------------------------ +; RunStageInitializerRecords +; +; Global description: +; Performs the decoded stage/game-state operation represented by RunStageInitializerRecords at PRG $0B85. +; +; Local description: +; Direct callees/tail targets: FillObjectTileColumn. State and scratch fields referenced: StageInitializerParamTable, StageInitializerTypeTable, StageInitializerValueTable, Zp02, Zp03, Zp04. Direct named writes: Zp02, Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +RunStageInitializerRecords: + ldx #$00 ; PRG:$0B85 A2 00 +Label_CB87: + lda StageInitializerTypeTable,x ; PRG:$0B87 BD C8 C1 + cmp #$FF ; PRG:$0B8A C9 FF + beq Label_CBA3 ; PRG:$0B8C F0 15 + sta Zp02 ; PRG:$0B8E 85 02 + lda StageInitializerParamTable,x ; PRG:$0B90 BD C9 C1 + sta Zp03 ; PRG:$0B93 85 03 + lda StageInitializerValueTable,x ; PRG:$0B95 BD CA C1 + sta Zp04 ; PRG:$0B98 85 04 + jsr FillObjectTileColumn ; PRG:$0B9A 20 06 EA + inx ; PRG:$0B9D E8 + inx ; PRG:$0B9E E8 + inx ; PRG:$0B9F E8 + jmp Label_CB87 ; PRG:$0BA0 4C 87 CB +Label_CBA3: + inx ; PRG:$0BA3 E8 + dey ; PRG:$0BA4 88 + bne Label_CB87 ; PRG:$0BA5 D0 E0 + rts ; PRG:$0BA7 60 + +;------------------------------------------------------------------------------ +; InitializeStageOneObjectCounts +; +; Global description: +; Performs the decoded stage/game-state operation represented by InitializeStageOneObjectCounts at PRG $0BA8. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: StageSecondaryObjectCount, StageSecondaryObjectIndex. Direct named writes: StageSecondaryObjectCount, StageSecondaryObjectIndex. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +InitializeStageOneObjectCounts: + lda #$01 ; PRG:$0BA8 A9 01 + sta StageSecondaryObjectIndex ; PRG:$0BAA 85 A2 + lda #$04 ; PRG:$0BAC A9 04 + sta StageSecondaryObjectCount ; PRG:$0BAE 85 B0 + rts ; PRG:$0BB0 60 + +;------------------------------------------------------------------------------ +; InitializeStageTwoObjects +; +; Global description: +; Performs the decoded graphics operation represented by InitializeStageTwoObjects at PRG $0BB1. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyAlternateStateArray, EnemyDirectionArray, EnemyDirectionInitializedArray, EnemyStateArray, StageEnemyOamTemplateA, StageEnemyOamTemplateB, StageEnemyOamTemplateC, ZpA4, ZpA5, ZpA7, ZpB5. Direct named writes: EnemyAlternateStateArray, EnemyDirectionArray, EnemyDirectionInitializedArray, EnemyStateArray, ZpA4, ZpA5, ZpA7, ZpB5. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +InitializeStageTwoObjects: + lda DifficultyOrRoundIndex ; PRG:$0BB1 A5 4B + cmp #$04 ; PRG:$0BB3 C9 04 + bcc Label_CBC0 ; PRG:$0BB5 90 09 + lda #$38 ; PRG:$0BB7 A9 38 + sta EnemyStateArray ; PRG:$0BB9 85 A3 + lda #$64 ; PRG:$0BBB A9 64 + jmp Label_CBC6 ; PRG:$0BBD 4C C6 CB +Label_CBC0: + lda #$38 ; PRG:$0BC0 A9 38 + sta EnemyStateArray ; PRG:$0BC2 85 A3 + lda #$57 ; PRG:$0BC4 A9 57 +Label_CBC6: + sta ZpA4 ; PRG:$0BC6 85 A4 + lda #$84 ; PRG:$0BC8 A9 84 + sta ZpA5 ; PRG:$0BCA 85 A5 + lda #$68 ; PRG:$0BCC A9 68 + sta EnemyAlternateStateArray ; PRG:$0BCE 85 A6 + lda #$78 ; PRG:$0BD0 A9 78 + sta ZpA7 ; PRG:$0BD2 85 A7 + lda #$9D ; PRG:$0BD4 A9 9D + sta EnemyDirectionInitializedArray ; PRG:$0BD6 85 A8 + lda #$0F ; PRG:$0BD8 A9 0F + sta EnemyDirectionArray ; PRG:$0BDA 85 B4 + lda #$C2 ; PRG:$0BDC A9 C2 + sta ZpB5 ; PRG:$0BDE 85 B5 + ldy #$00 ; PRG:$0BE0 A0 00 +Label_CBE2: + lda StageEnemyOamTemplateA,y ; PRG:$0BE2 B9 85 C4 + sta $0400,y ; PRG:$0BE5 99 00 04 + lda StageEnemyOamTemplateB,y ; PRG:$0BE8 B9 01 C5 + sta $0450,y ; PRG:$0BEB 99 50 04 + lda StageEnemyOamTemplateC,y ; PRG:$0BEE B9 A1 C5 + sta $04A0,y ; PRG:$0BF1 99 A0 04 + iny ; PRG:$0BF4 C8 + cpy #$40 ; PRG:$0BF5 C0 40 + bne Label_CBE2 ; PRG:$0BF7 D0 E9 + lda #$FF ; PRG:$0BF9 A9 FF + sta $042C ; PRG:$0BFB 8D 2C 04 + sta $0494 ; PRG:$0BFE 8D 94 04 + sta $04D4 ; PRG:$0C01 8D D4 04 + ldx DifficultyOrRoundIndex ; PRG:$0C04 A6 4B + lda DifficultyObjectCountTable,x ; PRG:$0C06 BD B3 C0 + sta $0530 ; PRG:$0C09 8D 30 05 + rts ; PRG:$0C0C 60 + +;------------------------------------------------------------------------------ +; InitializeStageThreeObjects +; +; Global description: +; Performs the decoded graphics operation represented by InitializeStageThreeObjects at PRG $0C0D. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyDirectionArray, StageObjectMode, StageObjectOamOffset, ZpB5. Direct named writes: EnemyDirectionArray, SpecialObjectIndex, StageObjectMode, StageObjectOamOffset, ZpB5. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +InitializeStageThreeObjects: + lda #$FF ; PRG:$0C0D A9 FF + sta SpecialObjectIndex ; PRG:$0C0F 85 C3 + lda #$60 ; PRG:$0C11 A9 60 + sta StageObjectOamOffset ; PRG:$0C13 85 CF + lda #$01 ; PRG:$0C15 A9 01 + sta StageObjectMode ; PRG:$0C17 85 B2 + ldx #$05 ; PRG:$0C19 A2 05 +Label_CC1B: + sta $0522,x ; PRG:$0C1B 9D 22 05 + dex ; PRG:$0C1E CA + bpl Label_CC1B ; PRG:$0C1F 10 FA + lda #$21 ; PRG:$0C21 A9 21 + sta EnemyDirectionArray ; PRG:$0C23 85 B4 + lda #$C2 ; PRG:$0C25 A9 C2 + sta ZpB5 ; PRG:$0C27 85 B5 + rts ; PRG:$0C29 60 + +;------------------------------------------------------------------------------ +; InitializeStageFourRopes +; +; Global description: +; Performs the decoded enemy operation represented by InitializeStageFourRopes at PRG $0C2A. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyDirectionArray, StageRopeAddressHi, StageRopeAddressLoArray, StageSecondaryObjectIndex, ZpB5. Direct named writes: EnemyDirectionArray, StageRopeAddressHi, StageRopeAddressLoArray, StageSecondaryObjectIndex, ZpB5. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +InitializeStageFourRopes: + lda #$01 ; PRG:$0C2A A9 01 + sta StageSecondaryObjectIndex ; PRG:$0C2C 85 A2 + lda #$29 ; PRG:$0C2E A9 29 + sta EnemyDirectionArray ; PRG:$0C30 85 B4 + lda #$C2 ; PRG:$0C32 A9 C2 + sta ZpB5 ; PRG:$0C34 85 B5 + ldx #$0B ; PRG:$0C36 A2 0B + ldy #$05 ; PRG:$0C38 A0 05 +Label_CC3A: + lda #$B0 ; PRG:$0C3A A9 B0 + sta $05E7,x ; PRG:$0C3C 9D E7 05 + lda #$22 ; PRG:$0C3F A9 22 + sta StageRopeAddressLoArray,x ; PRG:$0C41 95 DB + dex ; PRG:$0C43 CA + lda RopeInitialLowBytes,y ; PRG:$0C44 B9 C1 C2 + sta $05E7,x ; PRG:$0C47 9D E7 05 + lda RopeInitialHighBytes,y ; PRG:$0C4A B9 C7 C2 + sta StageRopeAddressLoArray,x ; PRG:$0C4D 95 DB + dey ; PRG:$0C4F 88 + dex ; PRG:$0C50 CA + bpl Label_CC3A ; PRG:$0C51 10 E7 + lda #$24 ; PRG:$0C53 A9 24 + sta StageRopeAddressHi ; PRG:$0C55 85 DA + rts ; PRG:$0C57 60 + +;------------------------------------------------------------------------------ +; DrawStageSpriteLayout +; +; Global description: +; Draws the stage-specific static sprite layout into shadow OAM. +; +; Local description: +; Uses the stage layout pointer tables and five-byte object-layout records. Each record supplies X, Y, initial tile, packed grid dimensions, and shadow-OAM destination offset before DrawObjectLayoutRecords renders it. +; +; Parameters: +; X selects the stage layout pointer entry according to the caller. CHR tile numbers are interpreted by the sprite pattern table. +; +; Returns: +; Returns after all layout records have been rendered into page $02. +; +; Clobbers: +; A, X, Y, Zp00-Zp09, Zp0F, shadow OAM, and processor flags. +;------------------------------------------------------------------------------ +DrawStageSpriteLayout: + lda StageSpriteLayoutPointerLo,x ; PRG:$0C58 BD 55 C1 + sta Zp00 ; PRG:$0C5B 85 00 + lda StageSpriteLayoutPointerHi,x ; PRG:$0C5D BD 56 C1 + sta Zp01 ; PRG:$0C60 85 01 + lda #$50 ; PRG:$0C62 A9 50 + sta Zp02 ; PRG:$0C64 85 02 + lda #$00 ; PRG:$0C66 A9 00 + jsr DrawSingleObjectSprite ; PRG:$0C68 20 EE E9 + rts ; PRG:$0C6B 60 + +;------------------------------------------------------------------------------ +; DrawPrimaryStageObjects +; +; Global description: +; Performs the decoded graphics operation represented by DrawPrimaryStageObjects at PRG $0C6C. +; +; Local description: +; Direct callees/tail targets: DrawObjectLayoutRecords. State and scratch fields referenced: StageOrScreenIndex, Zp00. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DrawPrimaryStageObjects: + ldx StageOrScreenIndex ; PRG:$0C6C A6 4A + dex ; PRG:$0C6E CA + bne Label_CC76 ; PRG:$0C6F D0 05 + ldy #$00 ; PRG:$0C71 A0 00 + jmp Label_CC78 ; PRG:$0C73 4C 78 CC +Label_CC76: + ldy #$14 ; PRG:$0C76 A0 14 +Label_CC78: + ldx Zp00 ; PRG:$0C78 A6 00 + jsr DrawObjectLayoutRecords ; PRG:$0C7A 20 98 CC + rts ; PRG:$0C7D 60 + +;------------------------------------------------------------------------------ +; DrawStageThreePrimaryObjects +; +; Global description: +; Performs the decoded graphics operation represented by DrawStageThreePrimaryObjects at PRG $0C7E. +; +; Local description: +; Direct callees/tail targets: DrawObjectLayoutRecords. State and scratch fields referenced: StagePrimaryObjectCount. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DrawStageThreePrimaryObjects: + ldx StagePrimaryObjectCount ; PRG:$0C7E A6 A0 + ldy #$1E ; PRG:$0C80 A0 1E + jsr DrawObjectLayoutRecords ; PRG:$0C82 20 98 CC + rts ; PRG:$0C85 60 + +;------------------------------------------------------------------------------ +; DrawSecondaryStageObjects +; +; Global description: +; Performs the decoded graphics operation represented by DrawSecondaryStageObjects at PRG $0C86. +; +; Local description: +; Direct callees/tail targets: DrawObjectLayoutRecords. State and scratch fields referenced: StageSecondaryObjectCount. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DrawSecondaryStageObjects: + ldx StageSecondaryObjectCount ; PRG:$0C86 A6 B0 + cpx #$05 ; PRG:$0C88 E0 05 + bmi Label_CC8E ; PRG:$0C8A 30 02 + ldx #$04 ; PRG:$0C8C A2 04 +Label_CC8E: + ldy #$37 ; PRG:$0C8E A0 37 + jsr DrawObjectLayoutRecords ; PRG:$0C90 20 98 CC + rts ; PRG:$0C93 60 + +;------------------------------------------------------------------------------ +; DrawFixedStageObjects +; +; Global description: +; Performs the decoded graphics operation represented by DrawFixedStageObjects at PRG $0C94. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DrawFixedStageObjects: + ldx #$06 ; PRG:$0C94 A2 06 + ldy #$4B ; PRG:$0C96 A0 4B + +;------------------------------------------------------------------------------ +; DrawObjectLayoutRecords +; +; Global description: +; Draws a sequence of five-byte static object-layout records into shadow OAM. +; +; Local description: +; For each record, loads X, Y, first tile, packed dimensions, and shadow-OAM offset into Zp00-Zp04, calls DrawObjectSpriteMode0, advances by five bytes, and repeats X times. +; +; Parameters: +; Y is the byte offset of the first layout record; X is the number of records. +; +; Returns: +; The selected sprite grids are written into shadow OAM page $02. +; +; Clobbers: +; A, X, Y, Zp00-Zp09, Zp0F, OAM shadow, and processor flags. +;------------------------------------------------------------------------------ +DrawObjectLayoutRecords: + lda ObjectLayoutXTable,y ; PRG:$0C98 B9 5F C1 + sta Zp00 ; PRG:$0C9B 85 00 + lda ObjectLayoutYTable,y ; PRG:$0C9D B9 60 C1 + sta Zp01 ; PRG:$0CA0 85 01 + lda ObjectLayoutTileIndexTable,y ; PRG:$0CA2 B9 61 C1 + sta Zp02 ; PRG:$0CA5 85 02 + lda ObjectLayoutDimensionsTable,y ; PRG:$0CA7 B9 62 C1 + sta Zp03 ; PRG:$0CAA 85 03 + lda ObjectLayoutOamOffsetTable,y ; PRG:$0CAC B9 63 C1 + sta Zp04 ; PRG:$0CAF 85 04 + jsr DrawObjectSpriteMode0 ; PRG:$0CB1 20 FC E9 + iny ; PRG:$0CB4 C8 + iny ; PRG:$0CB5 C8 + iny ; PRG:$0CB6 C8 + iny ; PRG:$0CB7 C8 + iny ; PRG:$0CB8 C8 + dex ; PRG:$0CB9 CA + bne DrawObjectLayoutRecords ; PRG:$0CBA D0 DC + rts ; PRG:$0CBC 60 + +;------------------------------------------------------------------------------ +; LoadPrimaryStageObjectConfig +; +; Global description: +; Performs the decoded stage/game-state operation represented by LoadPrimaryStageObjectConfig at PRG $0CBD. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: StageOrScreenIndex, StagePrimaryObjectConfigTable, StagePrimaryObjectCount. Direct named writes: StagePrimaryObjectCount. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +LoadPrimaryStageObjectConfig: + lda #$00 ; PRG:$0CBD A9 00 + ldx DifficultyOrRoundIndex ; PRG:$0CBF A6 4B +Label_CCC1: + cpx #$00 ; PRG:$0CC1 E0 00 + beq Label_CCCC ; PRG:$0CC3 F0 07 + clc ; PRG:$0CC5 18 + adc #$10 ; PRG:$0CC6 69 10 + dex ; PRG:$0CC8 CA + jmp Label_CCC1 ; PRG:$0CC9 4C C1 CC +Label_CCCC: + ldy StageOrScreenIndex ; PRG:$0CCC A4 4A + dey ; PRG:$0CCE 88 + beq Label_CCD4 ; PRG:$0CCF F0 03 + clc ; PRG:$0CD1 18 + adc #$08 ; PRG:$0CD2 69 08 +Label_CCD4: + tay ; PRG:$0CD4 A8 + lda StagePrimaryObjectConfigTable,y ; PRG:$0CD5 B9 2F C0 + sta StagePrimaryObjectCount ; PRG:$0CD8 85 A0 + ldx #$00 ; PRG:$0CDA A2 00 + iny ; PRG:$0CDC C8 +Label_CCDD: + lda StagePrimaryObjectConfigTable,y ; PRG:$0CDD B9 2F C0 + sta $0500,x ; PRG:$0CE0 9D 00 05 + iny ; PRG:$0CE3 C8 + inx ; PRG:$0CE4 E8 + cpx #$07 ; PRG:$0CE5 E0 07 + bne Label_CCDD ; PRG:$0CE7 D0 F4 + rts ; PRG:$0CE9 60 + +;------------------------------------------------------------------------------ +; LoadSecondaryStageObjectConfig +; +; Global description: +; Performs the decoded stage/game-state operation represented by LoadSecondaryStageObjectConfig at PRG $0CEA. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: StageSecondaryObjectConfigTable. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +LoadSecondaryStageObjectConfig: + lda #$00 ; PRG:$0CEA A9 00 + ldx DifficultyOrRoundIndex ; PRG:$0CEC A6 4B +Label_CCEE: + cpx #$00 ; PRG:$0CEE E0 00 + beq Label_CCF9 ; PRG:$0CF0 F0 07 + clc ; PRG:$0CF2 18 + adc #$06 ; PRG:$0CF3 69 06 + dex ; PRG:$0CF5 CA + jmp Label_CCEE ; PRG:$0CF6 4C EE CC +Label_CCF9: + tay ; PRG:$0CF9 A8 +Label_CCFA: + lda StageSecondaryObjectConfigTable,y ; PRG:$0CFA B9 8F C0 + sta $0510,x ; PRG:$0CFD 9D 10 05 + iny ; PRG:$0D00 C8 + inx ; PRG:$0D01 E8 + cpx #$06 ; PRG:$0D02 E0 06 + bne Label_CCFA ; PRG:$0D04 D0 F4 + rts ; PRG:$0D06 60 + +;------------------------------------------------------------------------------ +; LoadObjectConfigGroup0 +; +; Global description: +; Loads the first indexed object-configuration group. +; +; Local description: +; Sets Y to $00 and delegates to LoadIndexedObjectConfiguration. +; +; Parameters: +; Uses the current stage/object configuration state consumed by the shared loader. +; +; Returns: +; Returns after loading group zero. +; +; Clobbers: +; A, X, Y, shared loader scratch, and processor flags. +;------------------------------------------------------------------------------ +LoadObjectConfigGroup0: + ldy #$00 ; PRG:$0D07 A0 00 + jsr LoadIndexedObjectConfiguration ; PRG:$0D09 20 25 CD + rts ; PRG:$0D0C 60 + +;------------------------------------------------------------------------------ +; LoadStageFourObjectConfig +; +; Global description: +; Loads stage-four object counts and the associated OAM/base selector for the current difficulty. +; +; Local description: +; Doubles DifficultyOrRoundIndex to index the interleaved count/base tables, then stores the selected count in StagePrimaryObjectCount and the selected base byte in $0540. +; +; Parameters: +; DifficultyOrRoundIndex identifies the active difficulty/round record. +; +; Returns: +; StagePrimaryObjectCount and $0540 are updated. +; +; Clobbers: +; A, Y and processor flags. +;------------------------------------------------------------------------------ +LoadStageFourObjectConfig: + lda DifficultyOrRoundIndex ; PRG:$0D0D A5 4B + asl a ; PRG:$0D0F 0A + tay ; PRG:$0D10 A8 + lda StageFourPrimaryObjectCountByDifficulty,y ; PRG:$0D11 B9 E3 C0 + sta StagePrimaryObjectCount ; PRG:$0D14 85 A0 + lda StageFourObjectOamBaseByDifficulty,y ; PRG:$0D16 B9 E4 C0 + sta $0540 ; PRG:$0D19 8D 40 05 + rts ; PRG:$0D1C 60 + +;------------------------------------------------------------------------------ +; LoadObjectConfigGroup4 +; +; Global description: +; Loads the second indexed object-configuration group. +; +; Local description: +; Sets Y to $04 and delegates to LoadIndexedObjectConfiguration. +; +; Parameters: +; Uses the current stage/object configuration state consumed by the shared loader. +; +; Returns: +; Returns after loading group four. +; +; Clobbers: +; A, X, Y, shared loader scratch, and processor flags. +;------------------------------------------------------------------------------ +LoadObjectConfigGroup4: + ldy #$04 ; PRG:$0D1D A0 04 + jsr LoadIndexedObjectConfiguration ; PRG:$0D1F 20 25 CD + rts ; PRG:$0D22 60 + +;------------------------------------------------------------------------------ +; LoadObjectConfigGroup8 +; +; Global description: +; Loads the third indexed object-configuration group. +; +; Local description: +; Sets Y to $08 and falls through to LoadIndexedObjectConfiguration. +; +; Parameters: +; Uses the current stage/object configuration state consumed by the shared loader. +; +; Returns: +; Returns through the shared loader. +; +; Clobbers: +; A, X, Y, shared loader scratch, and processor flags. +;------------------------------------------------------------------------------ +LoadObjectConfigGroup8: + ldy #$08 ; PRG:$0D23 A0 08 + +;------------------------------------------------------------------------------ +; LoadIndexedObjectConfiguration +; +; Global description: +; Loads a difficulty-selected object-configuration record into the $0520 RAM structure. +; +; Local description: +; Y selects one of three four-byte group descriptors. The descriptor supplies the per-difficulty stride, exclusive destination end index, and source pointer. The selected record begins with StageSecondaryObjectCount followed by bytes copied to $0520,X. +; +; Parameters: +; Y is $00, $04, or $08 for configuration groups zero, four, or eight; DifficultyOrRoundIndex selects the record inside that group. +; +; Returns: +; StageSecondaryObjectCount and a bounded portion of $0520 RAM are updated. +; +; Clobbers: +; A, X, Y, Zp00-Zp03 and processor flags. +;------------------------------------------------------------------------------ +LoadIndexedObjectConfiguration: + lda ObjectConfigDifficultyStrideTable,y ; PRG:$0D25 B9 23 C0 + sta Zp00 ; PRG:$0D28 85 00 + lda ObjectConfigDestinationEndIndexTable,y ; PRG:$0D2A B9 24 C0 + sta Zp01 ; PRG:$0D2D 85 01 + lda ObjectConfigDataPointerLoTable,y ; PRG:$0D2F B9 25 C0 + sta Zp02 ; PRG:$0D32 85 02 + lda ObjectConfigDataPointerHiTable,y ; PRG:$0D34 B9 26 C0 + sta Zp03 ; PRG:$0D37 85 03 + lda #$00 ; PRG:$0D39 A9 00 + ldx DifficultyOrRoundIndex ; PRG:$0D3B A6 4B +Label_CD3D: + cpx #$00 ; PRG:$0D3D E0 00 + beq Label_CD47 ; PRG:$0D3F F0 06 + clc ; PRG:$0D41 18 + adc Zp00 ; PRG:$0D42 65 00 + dex ; PRG:$0D44 CA + bne Label_CD3D ; PRG:$0D45 D0 F6 +Label_CD47: + tay ; PRG:$0D47 A8 + lda (Zp02),y ; PRG:$0D48 B1 02 + sta StageSecondaryObjectCount ; PRG:$0D4A 85 B0 + iny ; PRG:$0D4C C8 +Label_CD4D: + lda (Zp02),y ; PRG:$0D4D B1 02 + sta $0520,x ; PRG:$0D4F 9D 20 05 + iny ; PRG:$0D52 C8 + inx ; PRG:$0D53 E8 + cpx Zp01 ; PRG:$0D54 E4 01 + bne Label_CD4D ; PRG:$0D56 D0 F5 + rts ; PRG:$0D58 60 + +;------------------------------------------------------------------------------ +; LoadStageObjectParameters +; +; Global description: +; Performs the decoded stage/game-state operation represented by LoadStageObjectParameters at PRG $0D59. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: StageObjectParameterTable, StageOrScreenIndex. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +LoadStageObjectParameters: + ldy StageOrScreenIndex ; PRG:$0D59 A4 4A + dey ; PRG:$0D5B 88 + dey ; PRG:$0D5C 88 + ldx #$00 ; PRG:$0D5D A2 00 +Label_CD5F: + lda StageObjectParameterTable,y ; PRG:$0D5F B9 37 C1 + sta $0570,x ; PRG:$0D62 9D 70 05 + iny ; PRG:$0D65 C8 + iny ; PRG:$0D66 C8 + iny ; PRG:$0D67 C8 + inx ; PRG:$0D68 E8 + cpx #$0A ; PRG:$0D69 E0 0A + bne Label_CD5F ; PRG:$0D6B D0 F2 + rts ; PRG:$0D6D 60 + +;------------------------------------------------------------------------------ +; UpdateGameplayFrame +; +; Global description: +; Performs the decoded audio operation represented by UpdateGameplayFrame at PRG $0D6E. +; +; Local description: +; Direct callees/tail targets: PlayerUpdateStep_EE10, CollisionStateStep_EDAB, DecodePlayerDirectionalInput, UpdatePlayerAuxiliarySprite, InitializePlayerStateTransition, DispatchPlayerState, ProcessStageCollisions, UpdateStageEntities, DetectPlayerLoss, HideInactiveObjectSprites, UpdateGameplaySubmode, RequestLowAltitudeSound, TickSoundTimers, UpdatePlayerDeathSequence, UpdateBonusCountdown, HandlePauseInput, ClearGameplayNametable, HideObjectSpriteGroup. State and scratch fields referenced: CollisionStateStep_EDAB, PlayerCollisionResult, PlayerInputDirection, PlayerLivesOrModeCount, PlayerState, PlayerUpdateStep_EE10. Direct named writes: APUCTRL, PauseDebounceTimer, PendingGameMode, PlayerLivesOrModeCount, PreviousInputDirection, SharedActionTimer, StartButtonLatch, TitleScreenInitialized, TwoPlayerModeFlag. Hardware registers: APUCTRL. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateGameplayFrame: + lda TwoPlayerModeFlag ; PRG:$0D6E A5 4E + beq Label_CD83 ; PRG:$0D70 F0 11 + lda $06A2 ; PRG:$0D72 AD A2 06 + bne Label_CD7A ; PRG:$0D75 D0 03 + sta APUCTRL ; PRG:$0D77 8D 15 40 +Label_CD7A: + lda ControllerFilteredState ; PRG:$0D7A A5 15 + and #$20 ; PRG:$0D7C 29 20 + beq Label_CD83 ; PRG:$0D7E F0 03 + jmp Label_CDE4 ; PRG:$0D80 4C E4 CD +Label_CD83: + lda PauseActive ; PRG:$0D83 A5 EB + bne Label_CDE0 ; PRG:$0D85 D0 59 + lda PauseDebounceTimer ; PRG:$0D87 A5 EE + beq Label_CD8E ; PRG:$0D89 F0 03 + dec PauseDebounceTimer ; PRG:$0D8B C6 EE + rts ; PRG:$0D8D 60 +Label_CD8E: + jsr PlayerUpdateStep_EE10 ; PRG:$0D8E 20 10 EE + lda PlayerCollisionResult ; PRG:$0D91 A5 68 + bne Label_CDD7 ; PRG:$0D93 D0 42 + lda PlayerState ; PRG:$0D95 A5 6B + cmp #$05 ; PRG:$0D97 C9 05 + beq Label_CDDD ; PRG:$0D99 F0 42 + cmp #$04 ; PRG:$0D9B C9 04 + beq Label_CDB2 ; PRG:$0D9D F0 13 + lda PlayerState ; PRG:$0D9F A5 6B + cmp #$03 ; PRG:$0DA1 C9 03 + beq Label_CDB2 ; PRG:$0DA3 F0 0D + lda TwoPlayerModeFlag ; PRG:$0DA5 A5 4E + beq Label_CDAF ; PRG:$0DA7 F0 06 + jsr CollisionStateStep_EDAB ; PRG:$0DA9 20 AB ED + jmp Label_CDB2 ; PRG:$0DAC 4C B2 CD +Label_CDAF: + jsr DecodePlayerDirectionalInput ; PRG:$0DAF 20 6C CE +Label_CDB2: + jsr UpdatePlayerAuxiliarySprite ; PRG:$0DB2 20 A2 CE + jsr InitializePlayerStateTransition; PRG:$0DB5 20 51 D2 + jsr DispatchPlayerState ; PRG:$0DB8 20 12 D4 + jsr ProcessStageCollisions ; PRG:$0DBB 20 FC D2 + jsr UpdateStageEntities ; PRG:$0DBE 20 F4 CE + jsr DetectPlayerLoss ; PRG:$0DC1 20 D4 CE + jsr HideInactiveObjectSprites ; PRG:$0DC4 20 17 EC + jsr UpdateGameplaySubmode ; PRG:$0DC7 20 9D CF + jsr RequestLowAltitudeSound ; PRG:$0DCA 20 C9 CE + jsr TickSoundTimers ; PRG:$0DCD 20 AF F1 + lda PlayerInputDirection ; PRG:$0DD0 A5 54 + sta PreviousInputDirection ; PRG:$0DD2 85 55 + jmp Label_CDE0 ; PRG:$0DD4 4C E0 CD +Label_CDD7: + jsr UpdatePlayerDeathSequence ; PRG:$0DD7 20 AE D1 + jmp Label_CDE0 ; PRG:$0DDA 4C E0 CD +Label_CDDD: + jsr UpdateBonusCountdown ; PRG:$0DDD 20 37 CF +Label_CDE0: + jsr HandlePauseInput ; PRG:$0DE0 20 FD CD + rts ; PRG:$0DE3 60 +Label_CDE4: + lda #$01 ; PRG:$0DE4 A9 01 + sta PendingGameMode ; PRG:$0DE6 85 47 + sta StartButtonLatch ; PRG:$0DE8 85 6A + sta PlayerLivesOrModeCount ; PRG:$0DEA 85 4C + lda #$40 ; PRG:$0DEC A9 40 + sta SharedActionTimer ; PRG:$0DEE 85 36 + lda #$00 ; PRG:$0DF0 A9 00 + sta TwoPlayerModeFlag ; PRG:$0DF2 85 4E + sta TitleScreenInitialized ; PRG:$0DF4 85 52 + jsr ClearGameplayNametable ; PRG:$0DF6 20 16 CA + jsr HideObjectSpriteGroup ; PRG:$0DF9 20 08 CA + rts ; PRG:$0DFC 60 + +;------------------------------------------------------------------------------ +; HandlePauseInput +; +; Global description: +; Performs the decoded audio operation represented by HandlePauseInput at PRG $0DFD. +; +; Local description: +; Direct callees/tail targets: QueuePlatformVramUpdateA, QueuePlatformVramUpdateB. State and scratch fields referenced: SoundRequestFlags, StageOrScreenIndex, Zp0F. Direct named writes: PPUMaskShadow, PauseActive, PauseDebounceTimer, PreviousStartButtonState, SecondarySoundRequestFlags, SoundRequestFlags, TwoPlayerModeFlag, Zp0F. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +HandlePauseInput: + lda ControllerFilteredState ; PRG:$0DFD A5 15 + and #$10 ; PRG:$0DFF 29 10 + beq Label_CE4E ; PRG:$0E01 F0 4B + lda TwoPlayerModeFlag ; PRG:$0E03 A5 4E + beq Label_CE0E ; PRG:$0E05 F0 07 + lda #$00 ; PRG:$0E07 A9 00 + sta TwoPlayerModeFlag ; PRG:$0E09 85 4E + jmp Label_C7FE ; PRG:$0E0B 4C FE C7 +Label_CE0E: + lda ControllerFilteredState ; PRG:$0E0E A5 15 + cmp PreviousStartButtonState ; PRG:$0E10 C5 EC + beq Label_CE50 ; PRG:$0E12 F0 3C + sta PreviousStartButtonState ; PRG:$0E14 85 EC + lda PauseActive ; PRG:$0E16 A5 EB + beq Label_CE39 ; PRG:$0E18 F0 1F + lda PauseDebounceTimer ; PRG:$0E1A A5 EE + bne Label_CE38 ; PRG:$0E1C D0 1A + lda #$00 ; PRG:$0E1E A9 00 + sta PauseActive ; PRG:$0E20 85 EB + lda Zp0F ; PRG:$0E22 A5 0F + sta SoundRequestFlags ; PRG:$0E24 85 FC + lda StageOrScreenIndex ; PRG:$0E26 A5 4A + cmp #$02 ; PRG:$0E28 C9 02 + bne Label_CE2F ; PRG:$0E2A D0 03 + jsr QueuePlatformVramUpdateA ; PRG:$0E2C 20 39 E2 +Label_CE2F: + lda PPUMaskShadow ; PRG:$0E2F A5 11 + and #$EF ; PRG:$0E31 29 EF + sta PPUMaskShadow ; PRG:$0E33 85 11 + jmp Label_CE45 ; PRG:$0E35 4C 45 CE +Label_CE38: + rts ; PRG:$0E38 60 +Label_CE39: + lda #$01 ; PRG:$0E39 A9 01 + sta PauseActive ; PRG:$0E3B 85 EB + lda SoundRequestFlags ; PRG:$0E3D A5 FC + sta Zp0F ; PRG:$0E3F 85 0F + lda #$00 ; PRG:$0E41 A9 00 + sta SoundRequestFlags ; PRG:$0E43 85 FC +Label_CE45: + lda #$40 ; PRG:$0E45 A9 40 + sta PauseDebounceTimer ; PRG:$0E47 85 EE + lda #$40 ; PRG:$0E49 A9 40 + sta SecondarySoundRequestFlags ; PRG:$0E4B 85 FD + rts ; PRG:$0E4D 60 +Label_CE4E: + sta PreviousStartButtonState ; PRG:$0E4E 85 EC +Label_CE50: + lda PauseDebounceTimer ; PRG:$0E50 A5 EE + beq Label_CE57 ; PRG:$0E52 F0 03 + dec PauseDebounceTimer ; PRG:$0E54 C6 EE + rts ; PRG:$0E56 60 +Label_CE57: + lda PauseActive ; PRG:$0E57 A5 EB + bne Label_CE5C ; PRG:$0E59 D0 01 + rts ; PRG:$0E5B 60 +Label_CE5C: + lda StageOrScreenIndex ; PRG:$0E5C A5 4A + cmp #$02 ; PRG:$0E5E C9 02 + bne Label_CE65 ; PRG:$0E60 D0 03 + jsr QueuePlatformVramUpdateB ; PRG:$0E62 20 44 E2 +Label_CE65: + lda PPUMaskShadow ; PRG:$0E65 A5 11 + ora #$10 ; PRG:$0E67 09 10 + sta PPUMaskShadow ; PRG:$0E69 85 11 + rts ; PRG:$0E6B 60 + +;------------------------------------------------------------------------------ +; DecodePlayerDirectionalInput +; +; Global description: +; Performs the decoded player-state operation represented by DecodePlayerDirectionalInput at PRG $0E6C. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: PlayerInputDirection, PlayerState. Direct named writes: PlayerInputDirection, PlayerState. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DecodePlayerDirectionalInput: + lda CurrentPlayerIndex ; PRG:$0E6C A5 49 + asl a ; PRG:$0E6E 0A + tax ; PRG:$0E6F AA + inx ; PRG:$0E70 E8 + ldy #$00 ; PRG:$0E71 A0 00 + lda ControllerRawState,x ; PRG:$0E73 B5 14 + and #$0F ; PRG:$0E75 29 0F + beq Label_CE8D ; PRG:$0E77 F0 14 + cmp #$08 ; PRG:$0E79 C9 08 + beq Label_CE8C ; PRG:$0E7B F0 0F + cmp #$04 ; PRG:$0E7D C9 04 + beq Label_CE8B ; PRG:$0E7F F0 0A + cmp #$02 ; PRG:$0E81 C9 02 + beq Label_CE8A ; PRG:$0E83 F0 05 + cmp #$01 ; PRG:$0E85 C9 01 + bne Label_CE8D ; PRG:$0E87 D0 04 + iny ; PRG:$0E89 C8 +Label_CE8A: + iny ; PRG:$0E8A C8 +Label_CE8B: + iny ; PRG:$0E8B C8 +Label_CE8C: + iny ; PRG:$0E8C C8 +Label_CE8D: + sty PlayerInputDirection ; PRG:$0E8D 84 54 + lda PlayerState ; PRG:$0E8F A5 6B + cmp #$02 ; PRG:$0E91 C9 02 + beq Label_CEA1 ; PRG:$0E93 F0 0C + lda ControllerRawState,x ; PRG:$0E95 B5 14 + and #$80 ; PRG:$0E97 29 80 + cmp #$00 ; PRG:$0E99 C9 00 + beq Label_CEA1 ; PRG:$0E9B F0 04 + lda #$03 ; PRG:$0E9D A9 03 + sta PlayerState ; PRG:$0E9F 85 6B +Label_CEA1: + rts ; PRG:$0EA1 60 + +;------------------------------------------------------------------------------ +; UpdatePlayerAuxiliarySprite +; +; Global description: +; Performs the decoded graphics operation represented by UpdatePlayerAuxiliarySprite at PRG $0EA2. +; +; Local description: +; Direct callees/tail targets: DrawSingleObjectSprite. State and scratch fields referenced: PlayerAuxSpritePending, PlayerFacing, PlayerSpriteVisibilityTimer, Zp00, Zp01, Zp02. Direct named writes: PlayerAuxSpritePending, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdatePlayerAuxiliarySprite: + lda PlayerAuxSpritePending ; PRG:$0EA2 A5 63 + beq Label_CEBF ; PRG:$0EA4 F0 19 + lda $0213 ; PRG:$0EA6 AD 13 02 + sta Zp00 ; PRG:$0EA9 85 00 + lda $0210 ; PRG:$0EAB AD 10 02 + sta Zp01 ; PRG:$0EAE 85 01 + lda #$08 ; PRG:$0EB0 A9 08 + sta Zp02 ; PRG:$0EB2 85 02 + lda PlayerFacing ; PRG:$0EB4 A5 6D + eor #$01 ; PRG:$0EB6 49 01 + jsr DrawSingleObjectSprite ; PRG:$0EB8 20 EE E9 + lda #$00 ; PRG:$0EBB A9 00 + sta PlayerAuxSpritePending ; PRG:$0EBD 85 63 +Label_CEBF: + lda PlayerSpriteVisibilityTimer ; PRG:$0EBF A5 38 + bne Label_CEC8 ; PRG:$0EC1 D0 05 + lda #$FF ; PRG:$0EC3 A9 FF + sta $0208 ; PRG:$0EC5 8D 08 02 +Label_CEC8: + rts ; PRG:$0EC8 60 + +;------------------------------------------------------------------------------ +; RequestLowAltitudeSound +; +; Global description: +; Performs the decoded audio operation represented by RequestLowAltitudeSound at PRG $0EC9. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: PlayerVerticalPosition, SoundRequestFlags. Direct named writes: SoundRequestFlags. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +RequestLowAltitudeSound: + lda PlayerVerticalPosition ; PRG:$0EC9 A5 2E + cmp #$10 ; PRG:$0ECB C9 10 + bpl Label_CED3 ; PRG:$0ECD 10 04 + lda #$20 ; PRG:$0ECF A9 20 + sta SoundRequestFlags ; PRG:$0ED1 85 FC +Label_CED3: + rts ; PRG:$0ED3 60 + +;------------------------------------------------------------------------------ +; DetectPlayerLoss +; +; Global description: +; Performs the decoded graphics operation represented by DetectPlayerLoss at PRG $0ED4. +; +; Local description: +; Direct callees/tail targets: QueuePlayerCountVramUpdate. State and scratch fields referenced: PlayerLivesOrModeCount. Direct named writes: PlayerLivesOrModeCount. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DetectPlayerLoss: + lda TwoPlayerModeFlag ; PRG:$0ED4 A5 4E + bne Label_CEF3 ; PRG:$0ED6 D0 1B + ldx CurrentPlayerIndex ; PRG:$0ED8 A6 49 + lda $05B0,x ; PRG:$0EDA BD B0 05 + bne Label_CEF3 ; PRG:$0EDD D0 14 + txa ; PRG:$0EDF 8A + tay ; PRG:$0EE0 A8 + clc ; PRG:$0EE1 18 + asl a ; PRG:$0EE2 0A + asl a ; PRG:$0EE3 0A + tax ; PRG:$0EE4 AA + lda BoundingBoxCoord1,x ; PRG:$0EE5 B5 25 + cmp #$02 ; PRG:$0EE7 C9 02 + bcc Label_CEF3 ; PRG:$0EE9 90 08 + sta $05B0,y ; PRG:$0EEB 99 B0 05 + inc PlayerLivesOrModeCount ; PRG:$0EEE E6 4C + jsr QueuePlayerCountVramUpdate ; PRG:$0EF0 20 25 CA +Label_CEF3: + rts ; PRG:$0EF3 60 + +;------------------------------------------------------------------------------ +; UpdateStageEntities +; +; Global description: +; Performs the decoded audio operation represented by UpdateStageEntities at PRG $0EF4. +; +; Local description: +; Direct callees/tail targets: UpdateBonusDisplay, UpdateCarriedObjectSprite, GraphicsCollisionStep_E402, GraphicsCollisionStep_DBE9, GraphicsRenderStep_E5F9, AudioRenderStep_DEE3, GraphicsUpdateStep_E0E4, GraphicsRenderStep_E13E, UpdateMovingPlatforms, GraphicsRenderStep_E10D, GraphicsRenderStep_E4F5. State and scratch fields referenced: AudioRenderStep_DEE3, PlayerState, StageOrScreenIndex. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateStageEntities: + jsr UpdateBonusDisplay ; PRG:$0EF4 20 5A DB + jsr UpdateCarriedObjectSprite ; PRG:$0EF7 20 B3 DB + lda PlayerState ; PRG:$0EFA A5 6B + cmp #$05 ; PRG:$0EFC C9 05 + bne Label_CF01 ; PRG:$0EFE D0 01 + rts ; PRG:$0F00 60 +Label_CF01: + lda StageOrScreenIndex ; PRG:$0F01 A5 4A + cmp #$01 ; PRG:$0F03 C9 01 + beq Label_CF19 ; PRG:$0F05 F0 12 + cmp #$02 ; PRG:$0F07 C9 02 + beq Label_CF20 ; PRG:$0F09 F0 15 + cmp #$03 ; PRG:$0F0B C9 03 + beq Label_CF30 ; PRG:$0F0D F0 21 + jsr GraphicsCollisionStep_E402 ; PRG:$0F0F 20 02 E4 + jsr GraphicsCollisionStep_DBE9 ; PRG:$0F12 20 E9 DB + jsr GraphicsRenderStep_E5F9 ; PRG:$0F15 20 F9 E5 + rts ; PRG:$0F18 60 +Label_CF19: + jsr GraphicsCollisionStep_DBE9 ; PRG:$0F19 20 E9 DB + jsr AudioRenderStep_DEE3 ; PRG:$0F1C 20 E3 DE + rts ; PRG:$0F1F 60 +Label_CF20: + jsr GraphicsRenderStep_E5F9 ; PRG:$0F20 20 F9 E5 + jsr GraphicsUpdateStep_E0E4 ; PRG:$0F23 20 E4 E0 + jsr GraphicsRenderStep_E13E ; PRG:$0F26 20 3E E1 + jsr UpdateMovingPlatforms ; PRG:$0F29 20 58 E2 + jsr GraphicsRenderStep_E10D ; PRG:$0F2C 20 0D E1 + rts ; PRG:$0F2F 60 +Label_CF30: + jsr GraphicsRenderStep_E4F5 ; PRG:$0F30 20 F5 E4 + jsr GraphicsRenderStep_E5F9 ; PRG:$0F33 20 F9 E5 + rts ; PRG:$0F36 60 + +;------------------------------------------------------------------------------ +; UpdateBonusCountdown +; +; Global description: +; Performs the decoded audio operation represented by UpdateBonusCountdown at PRG $0F37. +; +; Local description: +; Direct callees/tail targets: AudioRenderStep_DB20, TestPlayerCollisionMode3, SwitchActivePlayerOrReturnToAttract, GraphicsRenderStep_DAF7. State and scratch fields referenced: AudioRenderStep_DB20, SoundRequestFlags. Direct named writes: BonusCounter, BonusTickDivider, SoundRequestFlags. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateBonusCountdown: + lda #$00 ; PRG:$0F37 A9 00 + sta SoundRequestFlags ; PRG:$0F39 85 FC + lda BonusTickDivider ; PRG:$0F3B A5 64 + bne Label_CF58 ; PRG:$0F3D D0 19 + lda BonusCounter ; PRG:$0F3F A5 65 + beq Label_CF49 ; PRG:$0F41 F0 06 + jsr AudioRenderStep_DB20 ; PRG:$0F43 20 20 DB + jmp Label_CF5B ; PRG:$0F46 4C 5B CF +Label_CF49: + jsr TestPlayerCollisionMode3 ; PRG:$0F49 20 9F E8 + cmp #$00 ; PRG:$0F4C C9 00 + beq Label_CF54 ; PRG:$0F4E F0 04 + jsr SwitchActivePlayerOrReturnToAttract ; PRG:$0F50 20 62 CF + rts ; PRG:$0F53 60 +Label_CF54: + jsr GraphicsRenderStep_DAF7 ; PRG:$0F54 20 F7 DA + rts ; PRG:$0F57 60 +Label_CF58: + dec BonusTickDivider ; PRG:$0F58 C6 64 + rts ; PRG:$0F5A 60 +Label_CF5B: + lda #$03 ; PRG:$0F5B A9 03 + sta BonusTickDivider ; PRG:$0F5D 85 64 + dec BonusCounter ; PRG:$0F5F C6 65 + rts ; PRG:$0F61 60 + +;------------------------------------------------------------------------------ +; SwitchActivePlayerOrReturnToAttract +; +; Global description: +; Performs the decoded player-state operation represented by SwitchActivePlayerOrReturnToAttract at PRG $0F62. +; +; Local description: +; Direct callees/tail targets: SaveCurrentPlayerSessionState, LoadCurrentPlayerSessionState. State and scratch fields referenced: GameMode, GameModeTimer, GameStateTimer, GameplayInitializationPending, PlayerLivesOrModeCount. Direct named writes: CurrentPlayerIndex, GameMode, GameStateTimer, GameplayInitializationPending, PendingGameMode. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +SwitchActivePlayerOrReturnToAttract: + ldx CurrentPlayerIndex ; PRG:$0F62 A6 49 + jsr SaveCurrentPlayerSessionState ; PRG:$0F64 20 22 C9 + lda PlayerLivesOrModeCount ; PRG:$0F67 A5 4C + bne Label_CF74 ; PRG:$0F69 D0 09 + lda #$01 ; PRG:$0F6B A9 01 + sta PendingGameMode ; PRG:$0F6D 85 47 + lda #$87 ; PRG:$0F6F A9 87 + sta GameStateTimer ; PRG:$0F71 85 39 + rts ; PRG:$0F73 60 +Label_CF74: + lda GameModeTimer ; PRG:$0F74 A5 48 + cmp #$1C ; PRG:$0F76 C9 1C + bne Label_CF92 ; PRG:$0F78 D0 18 + lda CurrentPlayerIndex ; PRG:$0F7A A5 49 + eor #$01 ; PRG:$0F7C 49 01 + tax ; PRG:$0F7E AA + stx CurrentPlayerIndex ; PRG:$0F7F 86 49 + lda $0586,x ; PRG:$0F81 BD 86 05 + beq Label_CF8F ; PRG:$0F84 F0 09 + txa ; PRG:$0F86 8A + eor #$01 ; PRG:$0F87 49 01 + tax ; PRG:$0F89 AA + stx CurrentPlayerIndex ; PRG:$0F8A 86 49 + jmp Label_CF92 ; PRG:$0F8C 4C 92 CF +Label_CF8F: + jsr LoadCurrentPlayerSessionState ; PRG:$0F8F 20 12 C9 +Label_CF92: + lda #$87 ; PRG:$0F92 A9 87 + sta GameStateTimer ; PRG:$0F94 85 39 + sta GameplayInitializationPending ; PRG:$0F96 85 E9 + lda #$00 ; PRG:$0F98 A9 00 + sta GameMode ; PRG:$0F9A 85 46 + rts ; PRG:$0F9C 60 + +;------------------------------------------------------------------------------ +; UpdateGameplaySubmode +; +; Global description: +; Performs the decoded collision operation represented by UpdateGameplaySubmode at PRG $0F9D. +; +; Local description: +; Direct callees/tail targets: BuildPlayerCollisionBounds, TestCollisionList. State and scratch fields referenced: GameplaySubmode, PlayerInputDirection, StageOrScreenIndex, Zp02, Zp03. Direct named writes: GameplaySubmode, PlayerInputDirection, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateGameplaySubmode: + jsr BuildPlayerCollisionBounds ; PRG:$0F9D 20 BD D2 + lda StageOrScreenIndex ; PRG:$0FA0 A5 4A + cmp #$04 ; PRG:$0FA2 C9 04 + bmi Label_CFAF ; PRG:$0FA4 30 09 + lda LevelObjectProgress ; PRG:$0FA6 A5 53 + cmp #$06 ; PRG:$0FA8 C9 06 + bne Label_CFAE ; PRG:$0FAA D0 02 + sta GameplaySubmode ; PRG:$0FAC 85 4D +Label_CFAE: + rts ; PRG:$0FAE 60 +Label_CFAF: + lda #$FC ; PRG:$0FAF A9 FC + sta Zp02 ; PRG:$0FB1 85 02 + lda #$C4 ; PRG:$0FB3 A9 C4 + sta Zp03 ; PRG:$0FB5 85 03 + jsr TestCollisionList ; PRG:$0FB7 20 73 EB + beq Label_CFBE ; PRG:$0FBA F0 02 + sta PlayerInputDirection ; PRG:$0FBC 85 54 +Label_CFBE: + sta GameplaySubmode ; PRG:$0FBE 85 4D + rts ; PRG:$0FC0 60 + +;------------------------------------------------------------------------------ +; UpdateStageTransition +; +; Global description: +; Performs the decoded audio operation represented by UpdateStageTransition at PRG $0FC1. +; +; Local description: +; Direct callees/tail targets: InitializePlayerStateTransition, BuildPlayerCollisionBounds, DispatchPlayerState, UpdateStageEntities, TickSoundTimers, DrawSingleObjectSprite, BeginStageClearSequence, HandlePauseInput. State and scratch fields referenced: GameMode, GameStateTimer, GameplaySubmode, PlayerInputDirection, PlayerState, PlayerStatePhase, SoundRequestFlags, StageOrScreenIndex, Zp00, Zp01, Zp02. Direct named writes: DifficultyOrRoundIndex, GameMode, GameStateTimer, GameplaySubmode, PlayerInputDirection, SecondarySoundRequestFlags, SoundRequestFlags, StageOrScreenIndex, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateStageTransition: + lda GameplaySubmode ; PRG:$0FC1 A5 4D + cmp #$06 ; PRG:$0FC3 C9 06 + beq Label_D029 ; PRG:$0FC5 F0 62 + lda PlayerState ; PRG:$0FC7 A5 6B + cmp #$02 ; PRG:$0FC9 C9 02 + beq Label_CFDF ; PRG:$0FCB F0 12 + cmp #$03 ; PRG:$0FCD C9 03 + beq Label_CFDF ; PRG:$0FCF F0 0E + lda PlayerStatePhase ; PRG:$0FD1 A5 78 + cmp #$01 ; PRG:$0FD3 C9 01 + bne Label_CFE5 ; PRG:$0FD5 D0 0E + lda $0210 ; PRG:$0FD7 AD 10 02 + cmp #$28 ; PRG:$0FDA C9 28 + bcc Label_CFF9 ; PRG:$0FDC 90 1B + rts ; PRG:$0FDE 60 +Label_CFDF: + lda PlayerStatePhase ; PRG:$0FDF A5 78 + cmp #$01 ; PRG:$0FE1 C9 01 + bne Label_CFE9 ; PRG:$0FE3 D0 04 +Label_CFE5: + lda #$03 ; PRG:$0FE5 A9 03 + sta PlayerInputDirection ; PRG:$0FE7 85 54 +Label_CFE9: + jsr InitializePlayerStateTransition; PRG:$0FE9 20 51 D2 + jsr BuildPlayerCollisionBounds ; PRG:$0FEC 20 BD D2 + jsr DispatchPlayerState ; PRG:$0FEF 20 12 D4 + jsr UpdateStageEntities ; PRG:$0FF2 20 F4 CE + jsr TickSoundTimers ; PRG:$0FF5 20 AF F1 + rts ; PRG:$0FF8 60 +Label_CFF9: + lda #$00 ; PRG:$0FF9 A9 00 + sta SoundRequestFlags ; PRG:$0FFB 85 FC + lda StageOrScreenIndex ; PRG:$0FFD A5 4A + cmp #$01 ; PRG:$0FFF C9 01 + beq Label_D00C ; PRG:$1001 F0 09 + cmp #$02 ; PRG:$1003 C9 02 + beq Label_D011 ; PRG:$1005 F0 0A + lda #$08 ; PRG:$1007 A9 08 + jmp Label_D013 ; PRG:$1009 4C 13 D0 +Label_D00C: + lda #$02 ; PRG:$100C A9 02 + jmp Label_D013 ; PRG:$100E 4C 13 D0 +Label_D011: + lda #$04 ; PRG:$1011 A9 04 +Label_D013: + sta SecondarySoundRequestFlags ; PRG:$1013 85 FD + lda #$44 ; PRG:$1015 A9 44 + sta Zp00 ; PRG:$1017 85 00 + lda #$18 ; PRG:$1019 A9 18 + sta Zp01 ; PRG:$101B 85 01 + lda #$50 ; PRG:$101D A9 50 + sta Zp02 ; PRG:$101F 85 02 + lda #$00 ; PRG:$1021 A9 00 + jsr DrawSingleObjectSprite ; PRG:$1023 20 EE E9 + jmp Label_D041 ; PRG:$1026 4C 41 D0 +Label_D029: + lda PauseActive ; PRG:$1029 A5 EB + bne Label_D037 ; PRG:$102B D0 0A + jsr BeginStageClearSequence ; PRG:$102D 20 5F D0 + jsr TickSoundTimers ; PRG:$1030 20 AF F1 + lda GameStateTimer ; PRG:$1033 A5 39 + beq Label_D03B ; PRG:$1035 F0 04 +Label_D037: + jsr HandlePauseInput ; PRG:$1037 20 FD CD + rts ; PRG:$103A 60 +Label_D03B: + lda #$00 ; PRG:$103B A9 00 + sta StageOrScreenIndex ; PRG:$103D 85 4A + inc DifficultyOrRoundIndex ; PRG:$103F E6 4B +Label_D041: + inc StageOrScreenIndex ; PRG:$1041 E6 4A + lda #$8D ; PRG:$1043 A9 8D + sta GameStateTimer ; PRG:$1045 85 39 + lda #$00 ; PRG:$1047 A9 00 + sta GameMode ; PRG:$1049 85 46 + sta GameplaySubmode ; PRG:$104B 85 4D + rts ; PRG:$104D 60 + +;------------------------------------------------------------------------------ +; InitializePlayerBoundingBox +; +; Global description: +; Performs the decoded collision operation represented by InitializePlayerBoundingBox at PRG $104E. +; +; Local description: +; Direct callees/tail targets: InitializeBoundingBox, QueueCollisionAndVramTasks. State and scratch fields referenced: PlayerVerticalPosition, Zp00, Zp01. Direct named writes: Zp00, Zp01. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +InitializePlayerBoundingBox: + lda PlayerVerticalPosition ; PRG:$104E A5 2E + sta Zp00 ; PRG:$1050 85 00 + lda CurrentPlayerIndex ; PRG:$1052 A5 49 + ora #$08 ; PRG:$1054 09 08 + sta Zp01 ; PRG:$1056 85 01 + jsr InitializeBoundingBox ; PRG:$1058 20 44 F0 + jsr QueueCollisionAndVramTasks ; PRG:$105B 20 A4 EC + rts ; PRG:$105E 60 + +;------------------------------------------------------------------------------ +; BeginStageClearSequence +; +; Global description: +; Initializes the stage-clear sequence after the primary stage-object count reaches its terminal condition. +; +; Local description: +; Seeds GameStateTimer, clears StagePrimaryObjectCount and sound requests, initializes motion/gravity fields, rebuilds the player bounding box, and invokes player-loss detection before timed stage-clear milestones run. +; +; Parameters: +; StagePrimaryObjectCount and the current player/stage state must be valid. +; +; Returns: +; Returns after initialization or immediately when no initialization is required. +; +; Clobbers: +; A, X, GameStateTimer, stage/player motion fields, sound flags, and processor flags. +;------------------------------------------------------------------------------ +BeginStageClearSequence: + lda StagePrimaryObjectCount ; PRG:$105F A5 A0 + beq Label_D087 ; PRG:$1061 F0 24 + lda #$D5 ; PRG:$1063 A9 D5 + sta GameStateTimer ; PRG:$1065 85 39 + lda #$00 ; PRG:$1067 A9 00 + sta StagePrimaryObjectCount ; PRG:$1069 85 A0 + sta SoundRequestFlags ; PRG:$106B 85 FC + lda #$01 ; PRG:$106D A9 01 + sta ObjectMotionStep ; PRG:$106F 85 A1 + sta $0592 ; PRG:$1071 8D 92 05 + lda #$20 ; PRG:$1074 A9 20 + sta $0593 ; PRG:$1076 8D 93 05 + lda #$60 ; PRG:$1079 A9 60 + sta PlayerGravityFraction ; PRG:$107B 85 86 + lda #$01 ; PRG:$107D A9 01 + sta PlayerGravityInteger ; PRG:$107F 85 87 + jsr InitializePlayerBoundingBox ; PRG:$1081 20 4E D0 + jsr DetectPlayerLoss ; PRG:$1084 20 D4 CE +Label_D087: + lda GameStateTimer ; PRG:$1087 A5 39 + cmp #$CA ; PRG:$1089 C9 CA + bcs Label_D09A ; PRG:$108B B0 0D + cmp #$C0 ; PRG:$108D C9 C0 + bcs Label_D09E ; PRG:$108F B0 0D + cmp #$B9 ; PRG:$1091 C9 B9 + bcs Label_D0A2 ; PRG:$1093 B0 0D + lda #$00 ; PRG:$1095 A9 00 + sta GameStateTimer ; PRG:$1097 85 39 + rts ; PRG:$1099 60 +Label_D09A: + jsr HandleStageClearMilestoneD0 ; PRG:$109A 20 A6 D0 + rts ; PRG:$109D 60 +Label_D09E: + jsr AdvanceStageClearAnimation ; PRG:$109E 20 C7 D0 + rts ; PRG:$10A1 60 +Label_D0A2: + jsr UpdateStageClearAnimatedObjects ; PRG:$10A2 20 4E D1 + rts ; PRG:$10A5 60 + +;------------------------------------------------------------------------------ +; HandleStageClearMilestoneD0 +; +; Global description: +; Handles the stage-clear timer milestone at $D0. +; +; Local description: +; When A equals $D0, hides an object sprite group, queues a rectangular VRAM transfer, and executes stage initializer record five. +; +; Parameters: +; A is the current GameStateTimer value. +; +; Returns: +; Returns with no action unless A equals $D0. +; +; Clobbers: +; A, X, Y, Zp00-Zp03, VRAM queue state, and processor flags. +;------------------------------------------------------------------------------ +HandleStageClearMilestoneD0: + cmp #$D0 ; PRG:$10A6 C9 D0 + beq Label_D0AB ; PRG:$10A8 F0 01 + rts ; PRG:$10AA 60 +Label_D0AB: + jsr HideObjectSpriteGroup ; PRG:$10AB 20 08 CA + lda #$18 ; PRG:$10AE A9 18 + sta Zp00 ; PRG:$10B0 85 00 + lda #$3F ; PRG:$10B2 A9 3F + sta Zp01 ; PRG:$10B4 85 01 + lda #$F4 ; PRG:$10B6 A9 F4 + sta Zp02 ; PRG:$10B8 85 02 + lda #$C1 ; PRG:$10BA A9 C1 + sta Zp03 ; PRG:$10BC 85 03 + jsr QueueRectangularVramTransfer ; PRG:$10BE 20 CE EF + ldy #$05 ; PRG:$10C1 A0 05 + jsr RunStageInitializerRecords ; PRG:$10C3 20 85 CB + rts ; PRG:$10C6 60 + +;------------------------------------------------------------------------------ +; AdvanceStageClearAnimation +; +; Global description: +; Advances the timed stage-clear animation. +; +; Local description: +; At timer $C9 it rebuilds the stage-clear screen, requests a secondary sound, and decrements GameStateTimer. At other values it selects and draws one of two stage-clear sprite variants. +; +; Parameters: +; A is the current GameStateTimer value. +; +; Returns: +; Returns after one stage-clear animation step. +; +; Clobbers: +; A, X, rendering scratch, sound request flags, and processor flags. +;------------------------------------------------------------------------------ +AdvanceStageClearAnimation: + cmp #$C9 ; PRG:$10C7 C9 C9 + beq Label_D0D2 ; PRG:$10C9 F0 07 + and #$01 ; PRG:$10CB 29 01 + tax ; PRG:$10CD AA + jsr DrawStageClearSpriteGroupA ; PRG:$10CE 20 1C D1 + rts ; PRG:$10D1 60 +Label_D0D2: + jsr BuildStageClearScreen ; PRG:$10D2 20 DC D0 + lda #$10 ; PRG:$10D5 A9 10 + sta SecondarySoundRequestFlags ; PRG:$10D7 85 FD + dec GameStateTimer ; PRG:$10D9 C6 39 + rts ; PRG:$10DB 60 + +;------------------------------------------------------------------------------ +; BuildStageClearScreen +; +; Global description: +; Builds the stage-clear background and sprite composition. +; +; Local description: +; Clears the gameplay nametable, applies the stage-clear VRAM stream, draws the fixed stage-clear layout, and emits both stage-clear sprite groups. +; +; Parameters: +; Current stage and PPU state must be initialized. +; +; Returns: +; Returns after queuing/drawing the complete stage-clear screen. +; +; Clobbers: +; A, X, Y, Zp00-Zp04, VRAM decoder state, OAM shadow, and processor flags. +;------------------------------------------------------------------------------ +BuildStageClearScreen: + jsr ClearGameplayNametable ; PRG:$10DC 20 16 CA + lda #$02 ; PRG:$10DF A9 02 + sta Zp00 ; PRG:$10E1 85 00 + lda #$21 ; PRG:$10E3 A9 21 + sta Zp01 ; PRG:$10E5 85 01 + lda #$2E ; PRG:$10E7 A9 2E + sta Zp02 ; PRG:$10E9 85 02 + lda #$C4 ; PRG:$10EB A9 C4 + sta Zp03 ; PRG:$10ED 85 03 + jsr QueueRectangularVramTransfer ; PRG:$10EF 20 CE EF + lda #$1C ; PRG:$10F2 A9 1C + sta Zp00 ; PRG:$10F4 85 00 + lda #$21 ; PRG:$10F6 A9 21 + sta Zp01 ; PRG:$10F8 85 01 + jsr QueueRectangularVramTransfer ; PRG:$10FA 20 CE EF + lda #$C4 ; PRG:$10FD A9 C4 + sta Zp03 ; PRG:$10FF 85 03 + lda #$33 ; PRG:$1101 A9 33 + sta Zp00 ; PRG:$1103 85 00 + lda #$C4 ; PRG:$1105 A9 C4 + sta Zp01 ; PRG:$1107 85 01 + jsr ProcessVramCommandStreamAndRestoreScroll; PRG:$1109 20 3C EF + ldx #$00 ; PRG:$110C A2 00 + jsr DrawStageClearSpriteGroupA ; PRG:$110E 20 1C D1 + ldx #$08 ; PRG:$1111 A2 08 + jsr DrawStageSpriteLayout ; PRG:$1113 20 58 CC + ldx #$00 ; PRG:$1116 A2 00 + jsr DrawStageClearSpriteGroupC ; PRG:$1118 20 35 D1 + rts ; PRG:$111B 60 + +;------------------------------------------------------------------------------ +; DrawStageClearSpriteGroupA +; +; Global description: +; Configures stage-clear sprite group A. +; +; Local description: +; Sets sprite-grid parameter Zp01 to $1F and falls through to DrawStageClearSpriteGroupB. +; +; Parameters: +; X selects the destination sprite group. +; +; Returns: +; Returns after rendering the configured group. +; +; Clobbers: +; A, X, Y, Zp00-Zp04, OAM shadow, and processor flags. +;------------------------------------------------------------------------------ +DrawStageClearSpriteGroupA: + lda #$1F ; PRG:$111C A9 1F + sta Zp01 ; PRG:$111E 85 01 + +;------------------------------------------------------------------------------ +; DrawStageClearSpriteGroupB +; +; Global description: +; Draws a stage-clear sprite group using the first tile/position template. +; +; Local description: +; Loads fixed sprite-grid parameters and calls RenderObjectSpriteGrid with A derived from X. +; +; Parameters: +; X selects the rendering variant/destination. +; +; Returns: +; Returns after writing the sprite group to shadow OAM. +; +; Clobbers: +; A, X, Y, Zp00-Zp04, OAM shadow, and processor flags. +;------------------------------------------------------------------------------ +DrawStageClearSpriteGroupB: + lda #$68 ; PRG:$1120 A9 68 + sta Zp00 ; PRG:$1122 85 00 + lda #$D4 ; PRG:$1124 A9 D4 + sta Zp02 ; PRG:$1126 85 02 + lda #$46 ; PRG:$1128 A9 46 + sta Zp03 ; PRG:$112A 85 03 + lda #$40 ; PRG:$112C A9 40 + sta Zp04 ; PRG:$112E 85 04 + txa ; PRG:$1130 8A + jsr RenderObjectSpriteGrid ; PRG:$1131 20 08 EA + rts ; PRG:$1134 60 + +;------------------------------------------------------------------------------ +; DrawStageClearSpriteGroupC +; +; Global description: +; Configures stage-clear sprite group C. +; +; Local description: +; Sets sprite-grid parameter Zp01 to $30 and falls through to DrawStageClearSpriteGroupD. +; +; Parameters: +; X selects the destination sprite group. +; +; Returns: +; Returns through DrawStageClearSpriteGroupE. +; +; Clobbers: +; A, X, Y, Zp00-Zp04, OAM shadow, and processor flags. +;------------------------------------------------------------------------------ +DrawStageClearSpriteGroupC: + lda #$30 ; PRG:$1135 A9 30 + sta Zp01 ; PRG:$1137 85 01 + +;------------------------------------------------------------------------------ +; DrawStageClearSpriteGroupD +; +; Global description: +; Configures stage-clear sprite group D. +; +; Local description: +; Loads the group base position and tile parameters, then falls through to DrawStageClearSpriteGroupE. +; +; Parameters: +; X selects the destination sprite group. +; +; Returns: +; Returns through the shared renderer. +; +; Clobbers: +; A, X, Y, Zp00-Zp04, OAM shadow, and processor flags. +;------------------------------------------------------------------------------ +DrawStageClearSpriteGroupD: + lda #$20 ; PRG:$1139 A9 20 + sta Zp00 ; PRG:$113B 85 00 + lda #$C0 ; PRG:$113D A9 C0 + sta Zp02 ; PRG:$113F 85 02 + +;------------------------------------------------------------------------------ +; DrawStageClearSpriteGroupE +; +; Global description: +; Draws a stage-clear sprite group using the second template. +; +; Local description: +; Completes the fixed parameters and calls RenderObjectSpriteGrid. +; +; Parameters: +; X selects the rendering variant/destination. +; +; Returns: +; Returns after updating shadow OAM. +; +; Clobbers: +; A, X, Y, Zp00-Zp04, OAM shadow, and processor flags. +;------------------------------------------------------------------------------ +DrawStageClearSpriteGroupE: + lda #$22 ; PRG:$1141 A9 22 + sta Zp03 ; PRG:$1143 85 03 + lda #$A0 ; PRG:$1145 A9 A0 + sta Zp04 ; PRG:$1147 85 04 + txa ; PRG:$1149 8A + jsr RenderObjectSpriteGrid ; PRG:$114A 20 08 EA + rts ; PRG:$114D 60 + +;------------------------------------------------------------------------------ +; UpdateStageClearAnimatedObjects +; +; Global description: +; Updates animated objects and event flags during the stage-clear sequence. +; +; Local description: +; Tests shadow-OAM Y positions for milestone ranges, draws temporary sprites, sets GameplayEventFlags at exact animation positions, and updates stage-clear sprite groups. +; +; Parameters: +; Stage-clear OAM entries at $0210, $0240, and $02A0 must be initialized. +; +; Returns: +; Returns after one animation update. +; +; Clobbers: +; A, X, Zp00-Zp04, GameplayEventFlags, OAM shadow, and processor flags. +;------------------------------------------------------------------------------ +UpdateStageClearAnimatedObjects: + lda $0240 ; PRG:$114E AD 40 02 + cmp #$A7 ; PRG:$1151 C9 A7 + bcs Label_D181 ; PRG:$1153 B0 2C + cmp #$90 ; PRG:$1155 C9 90 + bcc Label_D16C ; PRG:$1157 90 13 + lda $0213 ; PRG:$1159 AD 13 02 + sta Zp00 ; PRG:$115C 85 00 + lda $0210 ; PRG:$115E AD 10 02 + sta Zp01 ; PRG:$1161 85 01 + lda #$CC ; PRG:$1163 A9 CC + sta Zp02 ; PRG:$1165 85 02 + lda #$01 ; PRG:$1167 A9 01 + jsr DrawSingleObjectSprite ; PRG:$1169 20 EE E9 +Label_D16C: + lda $0240 ; PRG:$116C AD 40 02 + cmp #$1F ; PRG:$116F C9 1F + bne Label_D177 ; PRG:$1171 D0 04 + ldx #$01 ; PRG:$1173 A2 01 + stx GameplayEventFlags ; PRG:$1175 86 FF +Label_D177: + clc ; PRG:$1177 18 + adc #$02 ; PRG:$1178 69 02 + sta Zp01 ; PRG:$117A 85 01 + ldx #$00 ; PRG:$117C A2 00 + jsr DrawStageClearSpriteGroupB ; PRG:$117E 20 20 D1 +Label_D181: + lda $02A0 ; PRG:$1181 AD A0 02 + cmp #$BA ; PRG:$1184 C9 BA + bne Label_D18C ; PRG:$1186 D0 04 + ldx #$10 ; PRG:$1188 A2 10 + stx GameplayEventFlags ; PRG:$118A 86 FF +Label_D18C: + cmp #$C1 ; PRG:$118C C9 C1 + bcs Label_D19B ; PRG:$118E B0 0B + clc ; PRG:$1190 18 + adc #$02 ; PRG:$1191 69 02 + sta Zp01 ; PRG:$1193 85 01 + ldx #$00 ; PRG:$1195 A2 00 + jsr DrawStageClearSpriteGroupD ; PRG:$1197 20 39 D1 + rts ; PRG:$119A 60 +Label_D19B: + lda #$C7 ; PRG:$119B A9 C7 + sta Zp01 ; PRG:$119D 85 01 + lda $02A3 ; PRG:$119F AD A3 02 + sta Zp00 ; PRG:$11A2 85 00 + lda #$64 ; PRG:$11A4 A9 64 + sta Zp02 ; PRG:$11A6 85 02 + ldx #$01 ; PRG:$11A8 A2 01 + jsr DrawStageClearSpriteGroupE ; PRG:$11AA 20 41 D1 + rts ; PRG:$11AD 60 + +;------------------------------------------------------------------------------ +; UpdatePlayerDeathSequence +; +; Global description: +; Updates detection or animation for the player-death sequence. +; +; Local description: +; Calls DetectAndStartPlayerDeathAnimation while DeathAnimationActive is clear; otherwise calls AnimatePlayerDeath. +; +; Parameters: +; DeathAnimationActive selects detection versus animation. +; +; Returns: +; Returns after one death-sequence frame. +; +; Clobbers: +; A, X, Y, death-state fields, OAM shadow, and processor flags. +;------------------------------------------------------------------------------ +UpdatePlayerDeathSequence: + lda DeathAnimationActive ; PRG:$11AE A5 66 + bne Label_D1B8 ; PRG:$11B0 D0 06 + jsr DetectAndStartPlayerDeathAnimation ; PRG:$11B2 20 BC D1 + jmp Label_D1BB ; PRG:$11B5 4C BB D1 +Label_D1B8: + jsr AnimatePlayerDeath ; PRG:$11B8 20 18 D2 +Label_D1BB: + rts ; PRG:$11BB 60 + +;------------------------------------------------------------------------------ +; DetectAndStartPlayerDeathAnimation +; +; Global description: +; Tests player collision/death conditions and starts the death animation when required. +; +; Local description: +; Examines collision and object state, sets the death sound/event request, initializes animation counters and direction, and marks DeathAnimationActive when the trigger conditions are satisfied. +; +; Parameters: +; PlayerCollisionResult, CollidingObjectOamOffset, and relevant shadow-OAM entries describe the current collision. +; +; Returns: +; Returns with DeathAnimationActive unchanged when no trigger is found, or initialized for animation. +; +; Clobbers: +; A, X, Y, Zp08/Zp09, death fields, sound request flags, and processor flags. +;------------------------------------------------------------------------------ +DetectAndStartPlayerDeathAnimation: + lda #$01 ; PRG:$11BC A9 01 + sta ObjectSoundRequestFlags ; PRG:$11BE 85 FE + ldx CollidingObjectOamOffset ; PRG:$11C0 A6 69 + lda PlayerCollisionResult ; PRG:$11C2 A5 68 + cmp #$01 ; PRG:$11C4 C9 01 + beq Label_D1E9 ; PRG:$11C6 F0 21 + lda $0240,x ; PRG:$11C8 BD 40 02 + sta $0208 ; PRG:$11CB 8D 08 02 + lda #$FF ; PRG:$11CE A9 FF + sta $0240,x ; PRG:$11D0 9D 40 02 + lda $0243,x ; PRG:$11D3 BD 43 02 + sta $020B ; PRG:$11D6 8D 0B 02 + ldy #$03 ; PRG:$11D9 A0 03 + lda #$FF ; PRG:$11DB A9 FF + sta $0244,x ; PRG:$11DD 9D 44 02 + sta $0248,x ; PRG:$11E0 9D 48 02 + sta $024C,x ; PRG:$11E3 9D 4C 02 + jmp Label_D1FF ; PRG:$11E6 4C FF D1 +Label_D1E9: + lda $02C0,x ; PRG:$11E9 BD C0 02 + sta $0208 ; PRG:$11EC 8D 08 02 + lda #$FF ; PRG:$11EF A9 FF + sta $02C0,x ; PRG:$11F1 9D C0 02 + lda $02C3,x ; PRG:$11F4 BD C3 02 + sta $020B ; PRG:$11F7 8D 0B 02 + lda #$FF ; PRG:$11FA A9 FF + sta $02C4,x ; PRG:$11FC 9D C4 02 +Label_D1FF: + lda #$90 ; PRG:$11FF A9 90 + sta $0209 ; PRG:$1201 8D 09 02 + lda #$00 ; PRG:$1204 A9 00 + sta $020A ; PRG:$1206 8D 0A 02 + lda #$07 ; PRG:$1209 A9 07 + sta Zp09 ; PRG:$120B 85 09 + lda #$04 ; PRG:$120D A9 04 + sta Zp08 ; PRG:$120F 85 08 + lda #$01 ; PRG:$1211 A9 01 + sta DeathAnimationActive ; PRG:$1213 85 66 + sta DeathAnimationDirection ; PRG:$1215 85 67 + rts ; PRG:$1217 60 + +;------------------------------------------------------------------------------ +; AnimatePlayerDeath +; +; Global description: +; Advances the player death animation and completes player removal. +; +; Local description: +; Counts animation frames, alternates the player tile, hides the player sprite when the sequence ends, restores the visibility timer, clears death/collision state, and invokes the post-death helper at $ED44. +; +; Parameters: +; DeathAnimationActive, DeathAnimationDirection, Zp08, and Zp09 hold animation state. +; +; Returns: +; Returns after one animation tick. +; +; Clobbers: +; A, X, Zp08/Zp09, death and collision fields, OAM shadow, and processor flags. +;------------------------------------------------------------------------------ +AnimatePlayerDeath: + dec Zp08 ; PRG:$1218 C6 08 + bpl Label_D250 ; PRG:$121A 10 34 + dec Zp09 ; PRG:$121C C6 09 + bne Label_D237 ; PRG:$121E D0 17 + lda #$FF ; PRG:$1220 A9 FF + sta $0200 ; PRG:$1222 8D 00 02 + jsr GameplayUpdateStep_ED44 ; PRG:$1225 20 44 ED + ldx #$40 ; PRG:$1228 A2 40 + stx PlayerSpriteVisibilityTimer ; PRG:$122A 86 38 + lda #$00 ; PRG:$122C A9 00 + sta DeathAnimationActive ; PRG:$122E 85 66 + sta PlayerCollisionResult ; PRG:$1230 85 68 + ldx #$93 ; PRG:$1232 A2 93 + jmp Label_D243 ; PRG:$1234 4C 43 D2 +Label_D237: + ldx $0209 ; PRG:$1237 AE 09 02 + lda DeathAnimationDirection ; PRG:$123A A5 67 + beq Label_D242 ; PRG:$123C F0 04 + inx ; PRG:$123E E8 + jmp Label_D243 ; PRG:$123F 4C 43 D2 +Label_D242: + dex ; PRG:$1242 CA +Label_D243: + lda Zp09 ; PRG:$1243 A5 09 + and #$02 ; PRG:$1245 29 02 + sta DeathAnimationDirection ; PRG:$1247 85 67 + stx $0209 ; PRG:$1249 8E 09 02 + lda #$08 ; PRG:$124C A9 08 + sta Zp08 ; PRG:$124E 85 08 +Label_D250: + rts ; PRG:$1250 60 + +;------------------------------------------------------------------------------ +; InitializePlayerStateTransition +; +; Global description: +; Performs the decoded player-state operation represented by InitializePlayerStateTransition at PRG $1251. +; +; Local description: +; Direct callees/tail targets: ResetPlayerMotionParameters. State and scratch fields referenced: GameplayEventFlags, PlayerClimbDirection, PlayerClimbOffset, PlayerClimbPhase, PlayerMovementSubstate, PlayerPositionFraction, PlayerState, PlayerStateCounter, PlayerStatePhase, PlayerStateReferenceY, PlayerStateTransitionActive, Zp02, Zp09. Direct named writes: GameplayEventFlags, PlayerClimbDirection, PlayerClimbOffset, PlayerClimbPhase, PlayerMovementSubstate, PlayerPositionFraction, PlayerStateCounter, PlayerStatePhase, PlayerStateReferenceY, PlayerStateTransitionActive, PreviousPlayerState, Zp02, Zp09. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +InitializePlayerStateTransition: + lda PlayerState ; PRG:$1251 A5 6B + cmp PreviousPlayerState ; PRG:$1253 C5 6C + beq Label_D2BC ; PRG:$1255 F0 65 + lda #$00 ; PRG:$1257 A9 00 + sta PlayerPositionFraction ; PRG:$1259 85 56 + sta PlayerStatePhase ; PRG:$125B 85 78 + lda PlayerState ; PRG:$125D A5 6B + cmp #$01 ; PRG:$125F C9 01 + beq Label_D27B ; PRG:$1261 F0 18 + cmp #$02 ; PRG:$1263 C9 02 + beq Label_D288 ; PRG:$1265 F0 21 + cmp #$03 ; PRG:$1267 C9 03 + beq Label_D291 ; PRG:$1269 F0 26 + cmp #$04 ; PRG:$126B C9 04 + beq Label_D2A4 ; PRG:$126D F0 35 + lda PreviousPlayerState ; PRG:$126F A5 6C + cmp #$04 ; PRG:$1271 C9 04 + bne Label_D2B8 ; PRG:$1273 D0 43 + jsr ResetPlayerMotionParameters ; PRG:$1275 20 A5 DA + jmp Label_D2B4 ; PRG:$1278 4C B4 D2 +Label_D27B: + lda #$00 ; PRG:$127B A9 00 + sta PlayerClimbOffset ; PRG:$127D 85 75 + sta Zp02 ; PRG:$127F 85 02 + sta PlayerClimbDirection ; PRG:$1281 85 70 + sta PlayerClimbPhase ; PRG:$1283 85 6F + jmp Label_D2B8 ; PRG:$1285 4C B8 D2 +Label_D288: + lda #$01 ; PRG:$1288 A9 01 + sta PlayerMovementSubstate ; PRG:$128A 85 71 + sta PlayerStateTransitionActive; PRG:$128C 85 79 + jmp Label_D2B8 ; PRG:$128E 4C B8 D2 +Label_D291: + lda #$00 ; PRG:$1291 A9 00 + sta PlayerStateCounter ; PRG:$1293 85 7E + sta $05C6 ; PRG:$1295 8D C6 05 + lda #$40 ; PRG:$1298 A9 40 + sta GameplayEventFlags ; PRG:$129A 85 FF + lda $0210 ; PRG:$129C AD 10 02 + sta PlayerStateReferenceY ; PRG:$129F 85 76 + jmp Label_D2B8 ; PRG:$12A1 4C B8 D2 +Label_D2A4: + lda $0210 ; PRG:$12A4 AD 10 02 + sta PlayerStateReferenceY ; PRG:$12A7 85 76 + lda #$01 ; PRG:$12A9 A9 01 + sta Zp09 ; PRG:$12AB 85 09 + lda #$00 ; PRG:$12AD A9 00 + sta PlayerMovementSubstate ; PRG:$12AF 85 71 + jmp Label_D2B8 ; PRG:$12B1 4C B8 D2 +Label_D2B4: + lda #$01 ; PRG:$12B4 A9 01 + sta GameplayEventFlags ; PRG:$12B6 85 FF +Label_D2B8: + lda PlayerState ; PRG:$12B8 A5 6B + sta PreviousPlayerState ; PRG:$12BA 85 6C +Label_D2BC: + rts ; PRG:$12BC 60 + +;------------------------------------------------------------------------------ +; BuildPlayerCollisionBounds +; +; Global description: +; Builds the player collision rectangle for the current pose. +; +; Local description: +; Uses the player shadow-OAM Y/X position as the rectangle origin. PlayerState selects a pose group, PlayerFacing selects its mirrored variant, and PlayerMovementSubstate adds the special movement offset. The resulting even index selects an interleaved pointer from PlayerPoseCollisionShapePointerTable, and BuildCollisionBounds expands the referenced shape into CollisionLeft through CollisionBottom. +; +; Parameters: +; Player shadow-OAM at $0210/$0213 plus PlayerState, PlayerFacing, and PlayerMovementSubstate must be current. +; +; Returns: +; Returns with CollisionLeft, CollisionTop, CollisionRight, and CollisionBottom describing the player. +; +; Clobbers: +; A, X, Y, Zp00-Zp03, collision-bound fields, and processor flags. +;------------------------------------------------------------------------------ +BuildPlayerCollisionBounds: + lda $0210 ; PRG:$12BD AD 10 02 + sta Zp01 ; PRG:$12C0 85 01 + lda $0213 ; PRG:$12C2 AD 13 02 + sta Zp00 ; PRG:$12C5 85 00 + lda PlayerState ; PRG:$12C7 A5 6B + cmp #$04 ; PRG:$12C9 C9 04 + bmi Label_D2CF ; PRG:$12CB 30 02 + lda #$01 ; PRG:$12CD A9 01 +Label_D2CF: + sec ; PRG:$12CF 38 + sbc #$01 ; PRG:$12D0 E9 01 + asl a ; PRG:$12D2 0A + asl a ; PRG:$12D3 0A + clc ; PRG:$12D4 18 + ldx PlayerFacing ; PRG:$12D5 A6 6D + bne Label_D2DB ; PRG:$12D7 D0 02 + adc #$02 ; PRG:$12D9 69 02 +Label_D2DB: + ldx PlayerMovementSubstate ; PRG:$12DB A6 71 + cpx #$02 ; PRG:$12DD E0 02 + bne Label_D2E3 ; PRG:$12DF D0 02 + adc #$07 ; PRG:$12E1 69 07 +Label_D2E3: + tax ; PRG:$12E3 AA + lda PlayerPoseCollisionShapePointerTable,x ; PRG:$12E4 BD 69 C3 + sta Zp02 ; PRG:$12E7 85 02 + lda PlayerPoseCollisionShapePointerHighBytes,x ; PRG:$12E9 BD 6A C3 + sta Zp03 ; PRG:$12EC 85 03 + jsr BuildCollisionBounds ; PRG:$12EE 20 69 EB + ldx #$03 ; PRG:$12F1 A2 03 +Label_D2F3: + lda CollisionLeft,x ; PRG:$12F3 B5 3E + sta $05FC,x ; PRG:$12F5 9D FC 05 + dex ; PRG:$12F8 CA + bpl Label_D2F3 ; PRG:$12F9 10 F8 + rts ; PRG:$12FB 60 + +;------------------------------------------------------------------------------ +; ProcessStageCollisions +; +; Global description: +; Performs the decoded collision operation represented by ProcessStageCollisions at PRG $12FC. +; +; Local description: +; Direct callees/tail targets: TestPlayerObjectCollision, BuildPlayerCollisionBounds, TestPrimaryEnemyCollisions, TestSecondaryObjectGroupCollision, TestSecondaryEnemyCollisions, RefreshCurrentPlatformContact, UpdatePlayerPlatformContact, TestPlayerAgainstPlatformPair, HandleAuxiliarySpriteCollision, TestPrimarySpriteObjectCollisions, TestSecondarySpriteObjectCollisions. State and scratch fields referenced: StageOrScreenIndex. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +ProcessStageCollisions: + jsr TestPlayerObjectCollision ; PRG:$12FC 20 3A D4 + cmp #$00 ; PRG:$12FF C9 00 + beq Label_D304 ; PRG:$1301 F0 01 + rts ; PRG:$1303 60 +Label_D304: + jsr BuildPlayerCollisionBounds ; PRG:$1304 20 BD D2 + lda StageOrScreenIndex ; PRG:$1307 A5 4A + cmp #$01 ; PRG:$1309 C9 01 + beq Label_D31C ; PRG:$130B F0 0F + cmp #$02 ; PRG:$130D C9 02 + beq Label_D323 ; PRG:$130F F0 12 + cmp #$03 ; PRG:$1311 C9 03 + beq Label_D333 ; PRG:$1313 F0 1E + jsr TestPrimaryEnemyCollisions ; PRG:$1315 20 D8 D3 + jsr TestSecondaryObjectGroupCollision ; PRG:$1318 20 F9 D3 + rts ; PRG:$131B 60 +Label_D31C: + jsr TestPrimaryEnemyCollisions ; PRG:$131C 20 D8 D3 + jsr TestSecondaryEnemyCollisions ; PRG:$131F 20 DF D3 + rts ; PRG:$1322 60 +Label_D323: + jsr TestSecondaryObjectGroupCollision ; PRG:$1323 20 F9 D3 + jsr RefreshCurrentPlatformContact ; PRG:$1326 20 BC D3 + jsr UpdatePlayerPlatformContact ; PRG:$1329 20 3A D3 + jsr TestPlayerAgainstPlatformPair ; PRG:$132C 20 87 D3 + jsr HandleAuxiliarySpriteCollision ; PRG:$132F 20 D0 D3 + rts ; PRG:$1332 60 +Label_D333: + jsr TestPrimarySpriteObjectCollisions ; PRG:$1333 20 EB D3 + jsr TestSecondarySpriteObjectCollisions ; PRG:$1336 20 F2 D3 + rts ; PRG:$1339 60 + +;------------------------------------------------------------------------------ +; UpdatePlayerPlatformContact +; +; Global description: +; Updates the player contact state for the stage platform pair. +; +; Local description: +; Maintains PlatformEdgeContact from the player shadow-OAM position, then tests the two platform sprites at $0294/$0297 against collision shape data at $C3A1. A successful first-platform contact also starts SharedActionTimer. +; +; Parameters: +; Player shadow-OAM position and the two platform sprite positions must be current. +; +; Returns: +; PlayerPlatformContact and PlatformEdgeContact are updated; zero means no platform match. +; +; Clobbers: +; A, Y, Zp00-Zp03, collision result fields, platform contact fields, and processor flags. +;------------------------------------------------------------------------------ +UpdatePlayerPlatformContact: + lda PlatformEdgeContact ; PRG:$133A A5 AE + beq Label_D34A ; PRG:$133C F0 0C + lda $0210 ; PRG:$133E AD 10 02 + cmp #$B0 ; PRG:$1341 C9 B0 + bcc Label_D349 ; PRG:$1343 90 04 + lda #$00 ; PRG:$1345 A9 00 + sta PlatformEdgeContact ; PRG:$1347 85 AE +Label_D349: + rts ; PRG:$1349 60 +Label_D34A: + lda $0210 ; PRG:$134A AD 10 02 + cmp #$8B ; PRG:$134D C9 8B + bcs Label_D35A ; PRG:$134F B0 09 + lda $0213 ; PRG:$1351 AD 13 02 + cmp #$20 ; PRG:$1354 C9 20 + bcs Label_D35A ; PRG:$1356 B0 02 + sta PlatformEdgeContact ; PRG:$1358 85 AE +Label_D35A: + lda #$A1 ; PRG:$135A A9 A1 + sta Zp02 ; PRG:$135C 85 02 + lda #$C3 ; PRG:$135E A9 C3 + sta Zp03 ; PRG:$1360 85 03 + ldy #$00 ; PRG:$1362 A0 00 +Label_D364: + lda $0294,y ; PRG:$1364 B9 94 02 + sta Zp01 ; PRG:$1367 85 01 + lda $0297,y ; PRG:$1369 B9 97 02 + sta Zp00 ; PRG:$136C 85 00 + jsr BuildAndTestCollisionBounds ; PRG:$136E 20 6E EB + beq Label_D37D ; PRG:$1371 F0 0A + sta PlayerPlatformContact ; PRG:$1373 85 AD + cpy #$00 ; PRG:$1375 C0 00 + bne Label_D37D ; PRG:$1377 D0 04 + lda #$08 ; PRG:$1379 A9 08 + sta SharedActionTimer ; PRG:$137B 85 36 +Label_D37D: + cpy #$08 ; PRG:$137D C0 08 + beq Label_D386 ; PRG:$137F F0 05 + ldy #$08 ; PRG:$1381 A0 08 + jmp Label_D364 ; PRG:$1383 4C 64 D3 +Label_D386: + rts ; PRG:$1386 60 + +;------------------------------------------------------------------------------ +; TestPlayerAgainstPlatformPair +; +; Global description: +; Tests the player collision rectangle against two alternate platform sprites. +; +; Local description: +; Builds bounds for the platform sprites at $02A0/$02A3 using collision shape data at $C3A5, adjusts the generated right edge by the OAM-group offset, and performs explicit rectangle-overlap tests. +; +; Parameters: +; Player collision bounds must already be in the collision work fields. +; +; Returns: +; PlayerPlatformContact is set to the one-based platform index on overlap. +; +; Clobbers: +; A, X, Y, Zp00-Zp03, collision-match fields, PlayerPlatformContact, and processor flags. +;------------------------------------------------------------------------------ +TestPlayerAgainstPlatformPair: + ldx #$01 ; PRG:$1387 A2 01 + ldy #$00 ; PRG:$1389 A0 00 + lda #$A5 ; PRG:$138B A9 A5 + sta Zp02 ; PRG:$138D 85 02 + lda #$C3 ; PRG:$138F A9 C3 + sta Zp03 ; PRG:$1391 85 03 +Label_D393: + lda $02A3,y ; PRG:$1393 B9 A3 02 + sta Zp00 ; PRG:$1396 85 00 + lda $02A0,y ; PRG:$1398 B9 A0 02 + sec ; PRG:$139B 38 + sbc #$04 ; PRG:$139C E9 04 + sta Zp01 ; PRG:$139E 85 01 + jsr BuildAndTestCollisionBounds ; PRG:$13A0 20 6E EB + tya ; PRG:$13A3 98 + clc ; PRG:$13A4 18 + adc CollisionMatchRight ; PRG:$13A5 65 44 + sta CollisionMatchRight ; PRG:$13A7 85 44 + jsr TestRectangleOverlap ; PRG:$13A9 20 E3 EB + beq Label_D3B1 ; PRG:$13AC F0 03 + inx ; PRG:$13AE E8 + stx PlayerPlatformContact ; PRG:$13AF 86 AD +Label_D3B1: + cpy #$10 ; PRG:$13B1 C0 10 + beq Label_D3BB ; PRG:$13B3 F0 06 + ldy #$10 ; PRG:$13B5 A0 10 + inx ; PRG:$13B7 E8 + jmp Label_D393 ; PRG:$13B8 4C 93 D3 +Label_D3BB: + rts ; PRG:$13BB 60 + +;------------------------------------------------------------------------------ +; RefreshCurrentPlatformContact +; +; Global description: +; Recomputes the current platform-contact code from the fixed platform collision shape. +; +; Local description: +; Builds collision bounds at origin using shape data at $C3CB and stores the collision result in CurrentPlatformContact. +; +; Parameters: +; Current player collision bounds must be prepared. +; +; Returns: +; CurrentPlatformContact contains the resulting collision code. +; +; Clobbers: +; A, Zp00-Zp03, collision work fields, CurrentPlatformContact, and processor flags. +;------------------------------------------------------------------------------ +RefreshCurrentPlatformContact: + lda #$00 ; PRG:$13BC A9 00 + sta Zp00 ; PRG:$13BE 85 00 + sta Zp01 ; PRG:$13C0 85 01 + lda #$CB ; PRG:$13C2 A9 CB + sta Zp02 ; PRG:$13C4 85 02 + lda #$C3 ; PRG:$13C6 A9 C3 + sta Zp03 ; PRG:$13C8 85 03 + jsr BuildAndTestCollisionBounds ; PRG:$13CA 20 6E EB + sta CurrentPlatformContact ; PRG:$13CD 85 BD + rts ; PRG:$13CF 60 + +;------------------------------------------------------------------------------ +; HandleAuxiliarySpriteCollision +; +; Global description: +; Tests the player against the auxiliary sprite and dispatches collision response. +; +; Local description: +; Calls TestPlayerAuxSpriteCollision and returns immediately if there is no hit; a hit continues through the shared collision-response path at $D405. +; +; Parameters: +; Player and auxiliary-sprite OAM entries must be current. +; +; Returns: +; Returns zero/no action when no collision occurs, otherwise enters the shared response flow. +; +; Clobbers: +; A, collision work fields, and processor flags. +;------------------------------------------------------------------------------ +HandleAuxiliarySpriteCollision: + jsr TestPlayerAuxSpriteCollision ; PRG:$13D0 20 45 D5 + cmp #$00 ; PRG:$13D3 C9 00 + bne Label_D405 ; PRG:$13D5 D0 2E + rts ; PRG:$13D7 60 + +;------------------------------------------------------------------------------ +; TestPrimaryEnemyCollisions +; +; Global description: +; Tests the player against the primary enemy sprite group. +; +; Local description: +; Loads StagePrimaryObjectCount, selects OAM group base $00, and enters ScanEnemyCollisionSlots. +; +; Parameters: +; StagePrimaryObjectCount and primary enemy OAM slots must be valid. +; +; Returns: +; A is zero when no enemy collides and nonzero on the first hit. +; +; Clobbers: +; A, X, Y, Zp00-Zp05, collision work fields, and processor flags. +;------------------------------------------------------------------------------ +TestPrimaryEnemyCollisions: + ldx StagePrimaryObjectCount ; PRG:$13D8 A6 A0 + ldy #$00 ; PRG:$13DA A0 00 + jmp Label_D3E3 ; PRG:$13DC 4C E3 D3 + +;------------------------------------------------------------------------------ +; TestSecondaryEnemyCollisions +; +; Global description: +; Tests the player against the secondary enemy sprite group. +; +; Local description: +; Loads StageSecondaryObjectCount, selects OAM group base $20, and enters ScanEnemyCollisionSlots. +; +; Parameters: +; StageSecondaryObjectCount and secondary enemy OAM slots must be valid. +; +; Returns: +; A is zero when no enemy collides and nonzero on the first hit. +; +; Clobbers: +; A, X, Y, Zp00-Zp05, collision work fields, and processor flags. +;------------------------------------------------------------------------------ +TestSecondaryEnemyCollisions: + ldx StageSecondaryObjectCount ; PRG:$13DF A6 B0 + ldy #$20 ; PRG:$13E1 A0 20 +Label_D3E3: + jsr ScanEnemyCollisionSlots ; PRG:$13E3 20 D6 D4 + cmp #$00 ; PRG:$13E6 C9 00 + bne Label_D405 ; PRG:$13E8 D0 1B + rts ; PRG:$13EA 60 + +;------------------------------------------------------------------------------ +; TestPrimarySpriteObjectCollisions +; +; Global description: +; Tests the player against primary sprite objects using the sprite-object collision helper. +; +; Local description: +; Loads StagePrimaryObjectCount and OAM base $00 before entering the shared sprite-object collision loop. +; +; Parameters: +; Primary sprite-object count and OAM records must be valid. +; +; Returns: +; Returns through the shared collision-response path on a hit. +; +; Clobbers: +; A, X, Y, collision scratch fields, and processor flags. +;------------------------------------------------------------------------------ +TestPrimarySpriteObjectCollisions: + ldx StagePrimaryObjectCount ; PRG:$13EB A6 A0 + ldy #$00 ; PRG:$13ED A0 00 + jmp Label_D3FD ; PRG:$13EF 4C FD D3 + +;------------------------------------------------------------------------------ +; TestSecondarySpriteObjectCollisions +; +; Global description: +; Tests the player against secondary sprite objects using OAM base $60. +; +; Local description: +; Loads StageSecondaryObjectCount and OAM base $60 before entering the shared sprite-object collision loop. +; +; Parameters: +; Secondary sprite-object count and OAM records must be valid. +; +; Returns: +; Returns through the shared collision-response path on a hit. +; +; Clobbers: +; A, X, Y, collision scratch fields, and processor flags. +;------------------------------------------------------------------------------ +TestSecondarySpriteObjectCollisions: + ldx StageSecondaryObjectCount ; PRG:$13F2 A6 B0 + ldy #$60 ; PRG:$13F4 A0 60 + jmp Label_D3FD ; PRG:$13F6 4C FD D3 + +;------------------------------------------------------------------------------ +; TestSecondaryObjectGroupCollision +; +; Global description: +; Tests the player against the secondary object group using OAM base zero. +; +; Local description: +; Loads StageSecondaryObjectCount and dispatches each candidate through TestPlayerAgainstSpriteObjects. +; +; Parameters: +; Secondary object count and OAM records must be valid. +; +; Returns: +; Returns after the first hit or after all candidates are exhausted. +; +; Clobbers: +; A, X, Y, collision scratch fields, and processor flags. +;------------------------------------------------------------------------------ +TestSecondaryObjectGroupCollision: + ldx StageSecondaryObjectCount ; PRG:$13F9 A6 B0 + ldy #$00 ; PRG:$13FB A0 00 +Label_D3FD: + jsr TestPlayerAgainstSpriteObjects ; PRG:$13FD 20 1E D5 + cmp #$00 ; PRG:$1400 C9 00 + bne Label_D405 ; PRG:$1402 D0 01 + rts ; PRG:$1404 60 +Label_D405: + lda #$05 ; PRG:$1405 A9 05 + sta PlayerState ; PRG:$1407 85 6B + lda #$04 ; PRG:$1409 A9 04 + sta GameplayEventFlags ; PRG:$140B 85 FF + lda #$01 ; PRG:$140D A9 01 + sta Zp09 ; PRG:$140F 85 09 + rts ; PRG:$1411 60 + +;------------------------------------------------------------------------------ +; DispatchPlayerState +; +; Global description: +; Performs the decoded collision operation represented by DispatchPlayerState at PRG $1412. +; +; Local description: +; Direct callees/tail targets: BuildPlayerCollisionBounds, GraphicsRenderStep_D631, PlayerCollisionStep_D56E, PlayerCollisionStep_D58C, CollisionCollisionStep_D5D7, CollectStageObject. State and scratch fields referenced: CollisionCollisionStep_D5D7, PlayerCollisionStep_D56E, PlayerCollisionStep_D58C, PlayerState. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DispatchPlayerState: + jsr BuildPlayerCollisionBounds ; PRG:$1412 20 BD D2 + lda PlayerState ; PRG:$1415 A5 6B + cmp #$01 ; PRG:$1417 C9 01 + beq Label_D427 ; PRG:$1419 F0 0C + cmp #$02 ; PRG:$141B C9 02 + beq Label_D42D ; PRG:$141D F0 0E + cmp #$03 ; PRG:$141F C9 03 + beq Label_D433 ; PRG:$1421 F0 10 + jsr GraphicsRenderStep_D631 ; PRG:$1423 20 31 D6 + rts ; PRG:$1426 60 +Label_D427: + jsr PlayerCollisionStep_D56E ; PRG:$1427 20 6E D5 + jmp Label_D436 ; PRG:$142A 4C 36 D4 +Label_D42D: + jsr PlayerCollisionStep_D58C ; PRG:$142D 20 8C D5 + jmp Label_D436 ; PRG:$1430 4C 36 D4 +Label_D433: + jsr CollisionCollisionStep_D5D7 ; PRG:$1433 20 D7 D5 +Label_D436: + jsr CollectStageObject ; PRG:$1436 20 55 D9 + rts ; PRG:$1439 60 + +;------------------------------------------------------------------------------ +; TestPlayerObjectCollision +; +; Global description: +; Performs the decoded collision operation represented by TestPlayerObjectCollision at PRG $143A. +; +; Local description: +; Direct callees/tail targets: BuildCollisionBounds, EnemyCollisionStep_D4B8, EnemyCollisionStep_D479, EnemyDispatchStep_D496, EnemyUpdateStep_D49A. State and scratch fields referenced: EnemyCollisionStep_D479, EnemyCollisionStep_D4B8, EnemyDispatchStep_D496, EnemyUpdateStep_D49A, PlayerCollisionResult, StageOrScreenIndex, Zp00, Zp01, Zp02, Zp03. Direct named writes: PlayerCollisionResult, Zp00, Zp01, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +TestPlayerObjectCollision: + lda CarriedObjectActive ; PRG:$143A A5 8C + beq Label_D476 ; PRG:$143C F0 38 + lda $0230 ; PRG:$143E AD 30 02 + sta Zp01 ; PRG:$1441 85 01 + lda $0233 ; PRG:$1443 AD 33 02 + sta Zp00 ; PRG:$1446 85 00 + lda #$DD ; PRG:$1448 A9 DD + sta Zp02 ; PRG:$144A 85 02 + lda #$C2 ; PRG:$144C A9 C2 + sta Zp03 ; PRG:$144E 85 03 + jsr BuildCollisionBounds ; PRG:$1450 20 69 EB + lda StageOrScreenIndex ; PRG:$1453 A5 4A + cmp #$01 ; PRG:$1455 C9 01 + beq Label_D467 ; PRG:$1457 F0 0E + cmp #$02 ; PRG:$1459 C9 02 + beq Label_D46D ; PRG:$145B F0 10 + cmp #$03 ; PRG:$145D C9 03 + beq Label_D473 ; PRG:$145F F0 12 + jsr EnemyCollisionStep_D4B8 ; PRG:$1461 20 B8 D4 + jmp Label_D476 ; PRG:$1464 4C 76 D4 +Label_D467: + jsr EnemyCollisionStep_D479 ; PRG:$1467 20 79 D4 + jmp Label_D476 ; PRG:$146A 4C 76 D4 +Label_D46D: + jsr EnemyDispatchStep_D496 ; PRG:$146D 20 96 D4 + jmp Label_D476 ; PRG:$1470 4C 76 D4 +Label_D473: + jsr EnemyUpdateStep_D49A ; PRG:$1473 20 9A D4 +Label_D476: + sta PlayerCollisionResult ; PRG:$1476 85 68 + rts ; PRG:$1478 60 + +;------------------------------------------------------------------------------ +; EnemyCollisionStep_D479 +; +; Global description: +; Performs the decoded collision operation represented by EnemyCollisionStep_D479 at PRG $1479. +; +; Local description: +; Direct callees/tail targets: ScanEnemyCollisionSlots. State and scratch fields referenced: EnemyCollisionStep_D479, StagePrimaryObjectCount, StageSecondaryObjectCount. Direct named writes: CollidingObjectOamOffset, SpawnedEnemyCount. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyCollisionStep_D479: + ldx StagePrimaryObjectCount ; PRG:$1479 A6 A0 + ldy #$00 ; PRG:$147B A0 00 + jsr ScanEnemyCollisionSlots ; PRG:$147D 20 D6 D4 + cmp #$00 ; PRG:$1480 C9 00 + bne Label_D491 ; PRG:$1482 D0 0D + ldx StageSecondaryObjectCount ; PRG:$1484 A6 B0 + ldy #$20 ; PRG:$1486 A0 20 + jsr ScanEnemyCollisionSlots ; PRG:$1488 20 D6 D4 + cmp #$00 ; PRG:$148B C9 00 + beq Label_D495 ; PRG:$148D F0 06 + dec SpawnedEnemyCount ; PRG:$148F C6 B1 +Label_D491: + lda #$01 ; PRG:$1491 A9 01 + sty CollidingObjectOamOffset ; PRG:$1493 84 69 +Label_D495: + rts ; PRG:$1495 60 + +;------------------------------------------------------------------------------ +; EnemyDispatchStep_D496 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyDispatchStep_D496 at PRG $1496. +; +; Local description: +; Direct callees/tail targets: EnemyUpdateStep_D4C3. State and scratch fields referenced: EnemyDispatchStep_D496, EnemyUpdateStep_D4C3. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyDispatchStep_D496: + jsr EnemyUpdateStep_D4C3 ; PRG:$1496 20 C3 D4 + rts ; PRG:$1499 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_D49A +; +; Global description: +; Performs the decoded graphics operation represented by EnemyUpdateStep_D49A at PRG $149A. +; +; Local description: +; Direct callees/tail targets: TestPlayerAgainstSpriteObjects. State and scratch fields referenced: EnemyUpdateStep_D49A, StagePrimaryObjectCount, StageSecondaryObjectCount. Direct named writes: CollidingObjectOamOffset, SpawnedEnemyCount. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_D49A: + ldx StagePrimaryObjectCount ; PRG:$149A A6 A0 + ldy #$00 ; PRG:$149C A0 00 + jsr TestPlayerAgainstSpriteObjects ; PRG:$149E 20 1E D5 + cmp #$00 ; PRG:$14A1 C9 00 + bne Label_D4B2 ; PRG:$14A3 D0 0D + ldx StageSecondaryObjectCount ; PRG:$14A5 A6 B0 + ldy #$60 ; PRG:$14A7 A0 60 + jsr TestPlayerAgainstSpriteObjects ; PRG:$14A9 20 1E D5 + cmp #$00 ; PRG:$14AC C9 00 + beq Label_D4B7 ; PRG:$14AE F0 07 + dec SpawnedEnemyCount ; PRG:$14B0 C6 B1 +Label_D4B2: + clc ; PRG:$14B2 18 + adc #$01 ; PRG:$14B3 69 01 + sty CollidingObjectOamOffset ; PRG:$14B5 84 69 +Label_D4B7: + rts ; PRG:$14B7 60 + +;------------------------------------------------------------------------------ +; EnemyCollisionStep_D4B8 +; +; Global description: +; Performs the decoded collision operation represented by EnemyCollisionStep_D4B8 at PRG $14B8. +; +; Local description: +; Direct callees/tail targets: ScanEnemyCollisionSlots. State and scratch fields referenced: EnemyCollisionStep_D4B8, StagePrimaryObjectCount. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyCollisionStep_D4B8: + ldx StagePrimaryObjectCount ; PRG:$14B8 A6 A0 + ldy #$00 ; PRG:$14BA A0 00 + jsr ScanEnemyCollisionSlots ; PRG:$14BC 20 D6 D4 + cmp #$00 ; PRG:$14BF C9 00 + bne Label_D4D3 ; PRG:$14C1 D0 10 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_D4C3 +; +; Global description: +; Performs the decoded graphics operation represented by EnemyUpdateStep_D4C3 at PRG $14C3. +; +; Local description: +; Direct callees/tail targets: TestPlayerAgainstSpriteObjects. State and scratch fields referenced: EnemyUpdateStep_D4C3, StageSecondaryObjectCount. Direct named writes: CollidingObjectOamOffset, SpawnedEnemyCount. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_D4C3: + ldx StageSecondaryObjectCount ; PRG:$14C3 A6 B0 + ldy #$00 ; PRG:$14C5 A0 00 + jsr TestPlayerAgainstSpriteObjects ; PRG:$14C7 20 1E D5 + cmp #$00 ; PRG:$14CA C9 00 + beq Label_D4D5 ; PRG:$14CC F0 07 + clc ; PRG:$14CE 18 + adc #$01 ; PRG:$14CF 69 01 + dec SpawnedEnemyCount ; PRG:$14D1 C6 B1 +Label_D4D3: + sty CollidingObjectOamOffset ; PRG:$14D3 84 69 +Label_D4D5: + rts ; PRG:$14D5 60 + +;------------------------------------------------------------------------------ +; ScanEnemyCollisionSlots +; +; Global description: +; Scans an enemy OAM group and tests each active slot against the player. +; +; Local description: +; Uses X as the enemy count and Y as the OAM-group offset. Selects one of two collision-shape definitions from the enemy state, skips hidden sprites with Y=$FF, builds collision bounds for each candidate, and stops on the first nonzero result. +; +; Parameters: +; X is the number of candidates; Y is the first OAM-group offset. +; +; Returns: +; A is zero when no candidate collides or nonzero for the first collision. +; +; Clobbers: +; A, X, Y, Zp00-Zp05, collision work fields, and processor flags. +;------------------------------------------------------------------------------ +ScanEnemyCollisionSlots: + stx Zp05 ; PRG:$14D6 86 05 + ldx #$00 ; PRG:$14D8 A2 00 +Label_D4DA: + cpy #$20 ; PRG:$14DA C0 20 + bpl Label_D4E3 ; PRG:$14DC 10 05 + lda EnemyStateArray,x ; PRG:$14DE B5 A3 + jmp Label_D4E5 ; PRG:$14E0 4C E5 D4 +Label_D4E3: + lda EnemyDirectionArray,x ; PRG:$14E3 B5 B4 +Label_D4E5: + cmp #$02 ; PRG:$14E5 C9 02 + bpl Label_D4F4 ; PRG:$14E7 10 0B + lda #$91 ; PRG:$14E9 A9 91 + sta Zp02 ; PRG:$14EB 85 02 + lda #$C3 ; PRG:$14ED A9 C3 + sta Zp03 ; PRG:$14EF 85 03 + jmp Label_D4FC ; PRG:$14F1 4C FC D4 +Label_D4F4: + lda #$95 ; PRG:$14F4 A9 95 + sta Zp02 ; PRG:$14F6 85 02 + lda #$C3 ; PRG:$14F8 A9 C3 + sta Zp03 ; PRG:$14FA 85 03 +Label_D4FC: + lda $02C0,y ; PRG:$14FC B9 C0 02 + cmp #$FF ; PRG:$14FF C9 FF + beq Label_D511 ; PRG:$1501 F0 0E + sta Zp01 ; PRG:$1503 85 01 + lda $02C3,y ; PRG:$1505 B9 C3 02 + sta Zp00 ; PRG:$1508 85 00 + jsr BuildAndTestCollisionBounds ; PRG:$150A 20 6E EB + cmp #$00 ; PRG:$150D C9 00 + bne Label_D51D ; PRG:$150F D0 0C +Label_D511: + tya ; PRG:$1511 98 + clc ; PRG:$1512 18 + adc #$08 ; PRG:$1513 69 08 + tay ; PRG:$1515 A8 + inx ; PRG:$1516 E8 + cpx Zp05 ; PRG:$1517 E4 05 + bne Label_D4DA ; PRG:$1519 D0 BF + lda #$00 ; PRG:$151B A9 00 +Label_D51D: + rts ; PRG:$151D 60 + +;------------------------------------------------------------------------------ +; TestPlayerAgainstSpriteObjects +; +; Global description: +; Performs the decoded collision operation represented by TestPlayerAgainstSpriteObjects at PRG $151E. +; +; Local description: +; Direct callees/tail targets: BuildAndTestCollisionBounds. State and scratch fields referenced: Zp00, Zp01, Zp02, Zp03. Direct named writes: Zp00, Zp01, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +TestPlayerAgainstSpriteObjects: + lda #$B1 ; PRG:$151E A9 B1 + sta Zp02 ; PRG:$1520 85 02 + lda #$C3 ; PRG:$1522 A9 C3 + sta Zp03 ; PRG:$1524 85 03 +Label_D526: + lda $0240,y ; PRG:$1526 B9 40 02 + cmp #$FF ; PRG:$1529 C9 FF + beq Label_D53B ; PRG:$152B F0 0E + sta Zp01 ; PRG:$152D 85 01 + lda $0243,y ; PRG:$152F B9 43 02 + sta Zp00 ; PRG:$1532 85 00 + jsr BuildAndTestCollisionBounds ; PRG:$1534 20 6E EB + cmp #$00 ; PRG:$1537 C9 00 + bne Label_D544 ; PRG:$1539 D0 09 +Label_D53B: + tya ; PRG:$153B 98 + clc ; PRG:$153C 18 + adc #$10 ; PRG:$153D 69 10 + tay ; PRG:$153F A8 + dex ; PRG:$1540 CA + bne Label_D526 ; PRG:$1541 D0 E3 + txa ; PRG:$1543 8A +Label_D544: + rts ; PRG:$1544 60 + +;------------------------------------------------------------------------------ +; TestPlayerAuxSpriteCollision +; +; Global description: +; Performs the decoded collision operation represented by TestPlayerAuxSpriteCollision at PRG $1545. +; +; Local description: +; Direct callees/tail targets: BuildAndTestCollisionBounds. State and scratch fields referenced: Zp00, Zp01, Zp02, Zp03. Direct named writes: Zp00, Zp01, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +TestPlayerAuxSpriteCollision: + lda $020F ; PRG:$1545 AD 0F 02 + sta Zp00 ; PRG:$1548 85 00 + lda $020C ; PRG:$154A AD 0C 02 + sta Zp01 ; PRG:$154D 85 01 + lda #$B5 ; PRG:$154F A9 B5 + sta Zp02 ; PRG:$1551 85 02 + lda #$C3 ; PRG:$1553 A9 C3 + sta Zp03 ; PRG:$1555 85 03 + jsr BuildAndTestCollisionBounds ; PRG:$1557 20 6E EB + rts ; PRG:$155A 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_D55B +; +; Global description: +; Performs the decoded player-state operation represented by PlayerUpdateStep_D55B at PRG $155B. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: PlayerUpdateStep_D55B, Zp01. Direct named writes: Zp01. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_D55B: + lda Zp01 ; PRG:$155B A5 01 + sec ; PRG:$155D 38 + sbc #$58 ; PRG:$155E E9 58 + sta Zp01 ; PRG:$1560 85 01 + +;------------------------------------------------------------------------------ +; PlayerCollisionStep_D562 +; +; Global description: +; Performs the decoded collision operation represented by PlayerCollisionStep_D562 at PRG $1562. +; +; Local description: +; Direct callees/tail targets: BuildAndTestCollisionBounds. State and scratch fields referenced: PlayerCollisionStep_D562, Zp02, Zp03. Direct named writes: Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerCollisionStep_D562: + lda #$B9 ; PRG:$1562 A9 B9 + sta Zp02 ; PRG:$1564 85 02 + lda #$C3 ; PRG:$1566 A9 C3 + sta Zp03 ; PRG:$1568 85 03 + jsr BuildAndTestCollisionBounds ; PRG:$156A 20 6E EB + rts ; PRG:$156D 60 + +;------------------------------------------------------------------------------ +; PlayerCollisionStep_D56E +; +; Global description: +; Performs the decoded collision operation represented by PlayerCollisionStep_D56E at PRG $156E. +; +; Local description: +; Direct callees/tail targets: TestPlayerCollisionMode0, TestPlayerCollisionMode3, GraphicsStateStep_D612, UpdatePlayerStatePhase, GraphicsRenderStep_D681. State and scratch fields referenced: PlayerCollisionStep_D56E, PlayerState. Direct named writes: PlayerState. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerCollisionStep_D56E: + jsr TestPlayerCollisionMode0 ; PRG:$156E 20 93 E8 + cmp #$00 ; PRG:$1571 C9 00 + bne Label_D581 ; PRG:$1573 D0 0C + jsr TestPlayerCollisionMode3 ; PRG:$1575 20 9F E8 + cmp #$00 ; PRG:$1578 C9 00 + bne Label_D585 ; PRG:$157A D0 09 + lda #$04 ; PRG:$157C A9 04 + sta PlayerState ; PRG:$157E 85 6B + rts ; PRG:$1580 60 +Label_D581: + jsr GraphicsStateStep_D612 ; PRG:$1581 20 12 D6 + rts ; PRG:$1584 60 +Label_D585: + jsr UpdatePlayerStatePhase ; PRG:$1585 20 14 DA + jsr GraphicsRenderStep_D681 ; PRG:$1588 20 81 D6 + rts ; PRG:$158B 60 + +;------------------------------------------------------------------------------ +; PlayerCollisionStep_D58C +; +; Global description: +; Performs the decoded collision operation represented by PlayerCollisionStep_D58C at PRG $158C. +; +; Local description: +; Direct callees/tail targets: UpdatePlayerStatePhase, TestPlayerCollisionMode3, TestPlayerCollisionMode0, TestPlayerCollisionMode1, GraphicsUpdateStep_D87E, PlayerDispatchStep_D82C, GraphicsDispatchStep_D71B, StartPlayerClimbMotion. State and scratch fields referenced: PlayerCollisionStep_D58C, PlayerDispatchStep_D82C, PlayerInputDirection, PlayerLandingTile, PlayerMovementSubstate, PlayerState, PlayerStateTransitionActive, Zp00. Direct named writes: MovementCollisionCode, MovementFrameCounter, PlayerInputDirection, PlayerState, PlayerStateTransitionActive, Zp00. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerCollisionStep_D58C: + lda PlayerStateTransitionActive; PRG:$158C A5 79 + bne Label_D5CB ; PRG:$158E D0 3B + jsr UpdatePlayerStatePhase ; PRG:$1590 20 14 DA + jsr TestPlayerCollisionMode3 ; PRG:$1593 20 9F E8 + beq Label_D5A2 ; PRG:$1596 F0 0A + lda PlayerInputDirection ; PRG:$1598 A5 54 + cmp #$02 ; PRG:$159A C9 02 + bne Label_D5A2 ; PRG:$159C D0 04 + eor #$02 ; PRG:$159E 49 02 + sta PlayerInputDirection ; PRG:$15A0 85 54 +Label_D5A2: + inc MovementFrameCounter ; PRG:$15A2 E6 EA + jsr TestPlayerCollisionMode0 ; PRG:$15A4 20 93 E8 + cmp #$00 ; PRG:$15A7 C9 00 + beq Label_D5C6 ; PRG:$15A9 F0 1B + lda PlayerMovementSubstate ; PRG:$15AB A5 71 + cmp #$01 ; PRG:$15AD C9 01 + beq Label_D5C2 ; PRG:$15AF F0 11 + jsr TestPlayerCollisionMode1 ; PRG:$15B1 20 97 E8 + sta MovementCollisionCode ; PRG:$15B4 85 72 + cmp #$11 ; PRG:$15B6 C9 11 + bne Label_D5BE ; PRG:$15B8 D0 04 + jsr GraphicsUpdateStep_D87E ; PRG:$15BA 20 7E D8 + rts ; PRG:$15BD 60 +Label_D5BE: + jsr PlayerDispatchStep_D82C ; PRG:$15BE 20 2C D8 + rts ; PRG:$15C1 60 +Label_D5C2: + jsr GraphicsDispatchStep_D71B ; PRG:$15C2 20 1B D7 + rts ; PRG:$15C5 60 +Label_D5C6: + lda #$04 ; PRG:$15C6 A9 04 + sta PlayerState ; PRG:$15C8 85 6B + rts ; PRG:$15CA 60 +Label_D5CB: + lda PlayerLandingTile ; PRG:$15CB A5 77 + sta Zp00 ; PRG:$15CD 85 00 + jsr StartPlayerClimbMotion ; PRG:$15CF 20 66 DA + lda #$00 ; PRG:$15D2 A9 00 + sta PlayerStateTransitionActive; PRG:$15D4 85 79 + rts ; PRG:$15D6 60 + +;------------------------------------------------------------------------------ +; CollisionCollisionStep_D5D7 +; +; Global description: +; Performs the decoded collision operation represented by CollisionCollisionStep_D5D7 at PRG $15D7. +; +; Local description: +; Direct callees/tail targets: TestPlayerCollisionMode0, PlayerCollisionStep_ECB7, TestPlayerCollisionMode3, TestPlayerCollisionMode2, GraphicsRenderStep_D913, GraphicsStateStep_D612, ResolvePlayerFallState. State and scratch fields referenced: CollisionCollisionStep_D5D7, PlayerCollisionStep_ECB7, PlayerState, PlayerStateCounter. Direct named writes: PlayerState. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionCollisionStep_D5D7: + jsr TestPlayerCollisionMode0 ; PRG:$15D7 20 93 E8 + cmp #$00 ; PRG:$15DA C9 00 + bne Label_D600 ; PRG:$15DC D0 22 + jsr PlayerCollisionStep_ECB7 ; PRG:$15DE 20 B7 EC + lda PlayerStateCounter ; PRG:$15E1 A5 7E + cmp #$03 ; PRG:$15E3 C9 03 + bcc Label_D5EE ; PRG:$15E5 90 07 + jsr TestPlayerCollisionMode3 ; PRG:$15E7 20 9F E8 + cmp #$00 ; PRG:$15EA C9 00 + bne Label_D604 ; PRG:$15EC D0 16 +Label_D5EE: + jsr TestPlayerCollisionMode2 ; PRG:$15EE 20 9B E8 + cmp #$00 ; PRG:$15F1 C9 00 + bne Label_D608 ; PRG:$15F3 D0 13 + lda $0210 ; PRG:$15F5 AD 10 02 + cmp #$D8 ; PRG:$15F8 C9 D8 + bcs Label_D60D ; PRG:$15FA B0 11 + jsr GraphicsRenderStep_D913 ; PRG:$15FC 20 13 D9 + rts ; PRG:$15FF 60 +Label_D600: + jsr GraphicsStateStep_D612 ; PRG:$1600 20 12 D6 + rts ; PRG:$1603 60 +Label_D604: + jsr ResolvePlayerFallState ; PRG:$1604 20 22 DA + rts ; PRG:$1607 60 +Label_D608: + lda #$04 ; PRG:$1608 A9 04 + sta PlayerState ; PRG:$160A 85 6B + rts ; PRG:$160C 60 +Label_D60D: + lda #$05 ; PRG:$160D A9 05 + sta PlayerState ; PRG:$160F 85 6B + rts ; PRG:$1611 60 + +;------------------------------------------------------------------------------ +; GraphicsStateStep_D612 +; +; Global description: +; Performs the decoded collision operation represented by GraphicsStateStep_D612 at PRG $1612. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: CollisionMatchX, PlayerFacing, PlayerLandingTile, PlayerState. Direct named writes: PlayerFacing, PlayerLandingTile, PlayerState. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsStateStep_D612: + lda CollisionMatchX ; PRG:$1612 A5 42 + sec ; PRG:$1614 38 + sbc #$10 ; PRG:$1615 E9 10 + sta PlayerLandingTile ; PRG:$1617 85 77 + lda #$02 ; PRG:$1619 A9 02 + sta PlayerState ; PRG:$161B 85 6B + lda CollisionMatchX ; PRG:$161D A5 42 + cmp #$14 ; PRG:$161F C9 14 + beq Label_D62C ; PRG:$1621 F0 09 + cmp #$EC ; PRG:$1623 C9 EC + bne Label_D630 ; PRG:$1625 D0 09 + lda #$01 ; PRG:$1627 A9 01 + sta PlayerFacing ; PRG:$1629 85 6D + rts ; PRG:$162B 60 +Label_D62C: + lda #$00 ; PRG:$162C A9 00 + sta PlayerFacing ; PRG:$162E 85 6D +Label_D630: + rts ; PRG:$1630 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_D631 +; +; Global description: +; Performs the decoded collision operation represented by GraphicsRenderStep_D631 at PRG $1631. +; +; Local description: +; Direct callees/tail targets: TestPlayerCollisionMode3, ResolvePlayerFallState, TestPlayerFallDistance, DrawSingleObjectSprite. State and scratch fields referenced: GameplayEventFlags, PlayerFacing, PlayerState, PlayerVerticalSpeedInteger, Zp00, Zp01, Zp02, Zp09. Direct named writes: GameplayEventFlags, PlayerState, Zp00, Zp01, Zp02, Zp09. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_D631: + jsr TestPlayerCollisionMode3 ; PRG:$1631 20 9F E8 + cmp #$00 ; PRG:$1634 C9 00 + beq Label_D640 ; PRG:$1636 F0 08 + jsr ResolvePlayerFallState ; PRG:$1638 20 22 DA + lda #$10 ; PRG:$163B A9 10 + sta GameplayEventFlags ; PRG:$163D 85 FF + rts ; PRG:$163F 60 +Label_D640: + lda $0210 ; PRG:$1640 AD 10 02 + cmp #$D8 ; PRG:$1643 C9 D8 + bcc Label_D650 ; PRG:$1645 90 09 + lda #$10 ; PRG:$1647 A9 10 + sta GameplayEventFlags ; PRG:$1649 85 FF + lda #$05 ; PRG:$164B A9 05 + sta PlayerState ; PRG:$164D 85 6B + rts ; PRG:$164F 60 +Label_D650: + jsr TestPlayerFallDistance ; PRG:$1650 20 34 DA + beq Label_D65D ; PRG:$1653 F0 08 + lda Zp09 ; PRG:$1655 A5 09 + sta GameplayEventFlags ; PRG:$1657 85 FF + lda #$00 ; PRG:$1659 A9 00 + sta Zp09 ; PRG:$165B 85 09 +Label_D65D: + lda $0213 ; PRG:$165D AD 13 02 + sta Zp00 ; PRG:$1660 85 00 + lda $0210 ; PRG:$1662 AD 10 02 + clc ; PRG:$1665 18 + adc PlayerVerticalSpeedInteger ; PRG:$1666 65 7A + sta Zp01 ; PRG:$1668 85 01 + lda $0211 ; PRG:$166A AD 11 02 + ldx $0212 ; PRG:$166D AE 12 02 + cpx #$40 ; PRG:$1670 E0 40 + bmi Label_D677 ; PRG:$1672 30 03 + sec ; PRG:$1674 38 + sbc #$06 ; PRG:$1675 E9 06 +Label_D677: + sta Zp02 ; PRG:$1677 85 02 + lda PlayerFacing ; PRG:$1679 A5 6D + eor #$01 ; PRG:$167B 49 01 + jsr DrawSingleObjectSprite ; PRG:$167D 20 EE E9 + rts ; PRG:$1680 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_D681 +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_D681 at PRG $1681. +; +; Local description: +; Direct callees/tail targets: PlayerUpdateStep_D6B9, PlayerUpdateStep_D6D7, PlayerUpdateStep_D6F5, DrawSingleObjectSprite. State and scratch fields referenced: PlayerClimbOffset, PlayerClimbPhase, PlayerFacing, PlayerInputDirection, PlayerUpdateStep_D6B9, PlayerUpdateStep_D6D7, PlayerUpdateStep_D6F5, Zp00, Zp01, Zp02. Direct named writes: PlayerClimbPhase, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_D681: + lda $0210 ; PRG:$1681 AD 10 02 + sta Zp01 ; PRG:$1684 85 01 + lda PlayerInputDirection ; PRG:$1686 A5 54 + cmp #$03 ; PRG:$1688 C9 03 + beq Label_D696 ; PRG:$168A F0 0A + cmp #$04 ; PRG:$168C C9 04 + bne Label_D6B8 ; PRG:$168E D0 28 + jsr PlayerUpdateStep_D6B9 ; PRG:$1690 20 B9 D6 + jmp Label_D699 ; PRG:$1693 4C 99 D6 +Label_D696: + jsr PlayerUpdateStep_D6D7 ; PRG:$1696 20 D7 D6 +Label_D699: + sta Zp00 ; PRG:$1699 85 00 + and #$02 ; PRG:$169B 29 02 + pha ; PRG:$169D 48 + cmp PlayerClimbPhase ; PRG:$169E C5 6F + beq Label_D6A5 ; PRG:$16A0 F0 03 + jsr PlayerUpdateStep_D6F5 ; PRG:$16A2 20 F5 D6 +Label_D6A5: + pla ; PRG:$16A5 68 + sta PlayerClimbPhase ; PRG:$16A6 85 6F + lda PlayerClimbOffset ; PRG:$16A8 A5 75 + sta Zp02 ; PRG:$16AA 85 02 + lda $0210 ; PRG:$16AC AD 10 02 + sta Zp01 ; PRG:$16AF 85 01 + lda PlayerFacing ; PRG:$16B1 A5 6D + eor #$01 ; PRG:$16B3 49 01 + jsr DrawSingleObjectSprite ; PRG:$16B5 20 EE E9 +Label_D6B8: + rts ; PRG:$16B8 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_D6B9 +; +; Global description: +; Performs the decoded player-state operation represented by PlayerUpdateStep_D6B9 at PRG $16B9. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: PlayerFacing, PlayerPositionFraction, PlayerStatePhase, PlayerUpdateStep_D6B9. Direct named writes: PlayerFacing, PlayerPositionFraction. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_D6B9: + lda #$01 ; PRG:$16B9 A9 01 + sta PlayerFacing ; PRG:$16BB 85 6D + lda PlayerStatePhase ; PRG:$16BD A5 78 + cmp #$04 ; PRG:$16BF C9 04 + beq Label_D6D0 ; PRG:$16C1 F0 0D + lda PlayerPositionFraction ; PRG:$16C3 A5 56 + clc ; PRG:$16C5 18 + adc #$A0 ; PRG:$16C6 69 A0 + sta PlayerPositionFraction ; PRG:$16C8 85 56 + lda $0213 ; PRG:$16CA AD 13 02 + adc #$00 ; PRG:$16CD 69 00 + rts ; PRG:$16CF 60 +Label_D6D0: + lda $0213 ; PRG:$16D0 AD 13 02 + sec ; PRG:$16D3 38 + sbc #$02 ; PRG:$16D4 E9 02 + rts ; PRG:$16D6 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_D6D7 +; +; Global description: +; Performs the decoded player-state operation represented by PlayerUpdateStep_D6D7 at PRG $16D7. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: PlayerFacing, PlayerPositionFraction, PlayerStatePhase, PlayerUpdateStep_D6D7. Direct named writes: PlayerFacing, PlayerPositionFraction. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_D6D7: + lda #$00 ; PRG:$16D7 A9 00 + sta PlayerFacing ; PRG:$16D9 85 6D + lda PlayerStatePhase ; PRG:$16DB A5 78 + cmp #$03 ; PRG:$16DD C9 03 + beq Label_D6EE ; PRG:$16DF F0 0D + lda PlayerPositionFraction ; PRG:$16E1 A5 56 + sec ; PRG:$16E3 38 + sbc #$A0 ; PRG:$16E4 E9 A0 + sta PlayerPositionFraction ; PRG:$16E6 85 56 + lda $0213 ; PRG:$16E8 AD 13 02 + sbc #$00 ; PRG:$16EB E9 00 + rts ; PRG:$16ED 60 +Label_D6EE: + lda $0213 ; PRG:$16EE AD 13 02 + clc ; PRG:$16F1 18 + adc #$02 ; PRG:$16F2 69 02 + rts ; PRG:$16F4 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_D6F5 +; +; Global description: +; Performs the decoded player-state operation represented by PlayerUpdateStep_D6F5 at PRG $16F5. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: GameplayEventFlags, PlayerClimbDirection, PlayerClimbOffset, PlayerFacing, PlayerUpdateStep_D6F5. Direct named writes: GameplayEventFlags, PlayerClimbDirection, PlayerClimbOffset, PreviousPlayerFacing. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_D6F5: + lda PlayerClimbOffset ; PRG:$16F5 A5 75 + beq Label_D709 ; PRG:$16F7 F0 10 + cmp #$10 ; PRG:$16F9 C9 10 + bpl Label_D701 ; PRG:$16FB 10 04 + ldx PlayerClimbDirection ; PRG:$16FD A6 70 + beq Label_D709 ; PRG:$16FF F0 08 +Label_D701: + sec ; PRG:$1701 38 + sbc #$08 ; PRG:$1702 E9 08 + ldx #$01 ; PRG:$1704 A2 01 + jmp Label_D70E ; PRG:$1706 4C 0E D7 +Label_D709: + clc ; PRG:$1709 18 + adc #$08 ; PRG:$170A 69 08 + ldx #$00 ; PRG:$170C A2 00 +Label_D70E: + stx PlayerClimbDirection ; PRG:$170E 86 70 + sta PlayerClimbOffset ; PRG:$1710 85 75 + lda PlayerFacing ; PRG:$1712 A5 6D + sta PreviousPlayerFacing ; PRG:$1714 85 6E + lda #$80 ; PRG:$1716 A9 80 + sta GameplayEventFlags ; PRG:$1718 85 FF + rts ; PRG:$171A 60 + +;------------------------------------------------------------------------------ +; GraphicsDispatchStep_D71B +; +; Global description: +; Performs the decoded collision operation represented by GraphicsDispatchStep_D71B at PRG $171B. +; +; Local description: +; Direct callees/tail targets: CollisionUpdateStep_D79C, GraphicsRenderStep_D72B. State and scratch fields referenced: CollisionUpdateStep_D79C, PlayerInputDirection. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsDispatchStep_D71B: + lda PlayerInputDirection ; PRG:$171B A5 54 + beq Label_D72A ; PRG:$171D F0 0B + cmp #$03 ; PRG:$171F C9 03 + bmi Label_D727 ; PRG:$1721 30 04 + jsr CollisionUpdateStep_D79C ; PRG:$1723 20 9C D7 + rts ; PRG:$1726 60 +Label_D727: + jsr GraphicsRenderStep_D72B ; PRG:$1727 20 2B D7 +Label_D72A: + rts ; PRG:$172A 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_D72B +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_D72B at PRG $172B. +; +; Local description: +; Direct callees/tail targets: PlayerUpdateStep_D75A, PlayerUpdateStep_D77E, DrawSingleObjectSprite. State and scratch fields referenced: PlayerFacing, PlayerInputDirection, PlayerMovementSubstate, PlayerUpdateStep_D75A, PlayerUpdateStep_D77E, Zp00, Zp01, Zp02. Direct named writes: PlayerMovementSubstate, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_D72B: + lda $0213 ; PRG:$172B AD 13 02 + sta Zp00 ; PRG:$172E 85 00 + lda PlayerInputDirection ; PRG:$1730 A5 54 + cmp #$01 ; PRG:$1732 C9 01 + bne Label_D73C ; PRG:$1734 D0 06 + jsr PlayerUpdateStep_D75A ; PRG:$1736 20 5A D7 + jmp Label_D73F ; PRG:$1739 4C 3F D7 +Label_D73C: + jsr PlayerUpdateStep_D77E ; PRG:$173C 20 7E D7 +Label_D73F: + sta Zp01 ; PRG:$173F 85 01 + and #$01 ; PRG:$1741 29 01 + beq Label_D74A ; PRG:$1743 F0 05 + lda #$28 ; PRG:$1745 A9 28 + jmp Label_D74C ; PRG:$1747 4C 4C D7 +Label_D74A: + lda #$30 ; PRG:$174A A9 30 +Label_D74C: + sta Zp02 ; PRG:$174C 85 02 + lda PlayerFacing ; PRG:$174E A5 6D + eor #$01 ; PRG:$1750 49 01 + jsr DrawSingleObjectSprite ; PRG:$1752 20 EE E9 + lda #$01 ; PRG:$1755 A9 01 + sta PlayerMovementSubstate ; PRG:$1757 85 71 + rts ; PRG:$1759 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_D75A +; +; Global description: +; Performs the decoded player-state operation represented by PlayerUpdateStep_D75A at PRG $175A. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: GameplayEventFlags, PlayerPositionFraction, PlayerStatePhase, PlayerUpdateStep_D75A. Direct named writes: GameplayEventFlags, PlayerPositionFraction. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_D75A: + lda MovementFrameCounter ; PRG:$175A A5 EA + and #$0A ; PRG:$175C 29 0A + bne Label_D764 ; PRG:$175E D0 04 + lda #$20 ; PRG:$1760 A9 20 + sta GameplayEventFlags ; PRG:$1762 85 FF +Label_D764: + lda PlayerStatePhase ; PRG:$1764 A5 78 + cmp #$01 ; PRG:$1766 C9 01 + beq Label_D777 ; PRG:$1768 F0 0D + lda PlayerPositionFraction ; PRG:$176A A5 56 + sec ; PRG:$176C 38 + sbc #$40 ; PRG:$176D E9 40 + sta PlayerPositionFraction ; PRG:$176F 85 56 + lda $0210 ; PRG:$1771 AD 10 02 + sbc #$00 ; PRG:$1774 E9 00 + rts ; PRG:$1776 60 +Label_D777: + lda $0210 ; PRG:$1777 AD 10 02 + clc ; PRG:$177A 18 + adc #$01 ; PRG:$177B 69 01 + rts ; PRG:$177D 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_D77E +; +; Global description: +; Performs the decoded player-state operation represented by PlayerUpdateStep_D77E at PRG $177E. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: GameplayEventFlags, PlayerPositionFraction, PlayerStatePhase, PlayerUpdateStep_D77E. Direct named writes: GameplayEventFlags, PlayerPositionFraction. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_D77E: + lda PlayerStatePhase ; PRG:$177E A5 78 + cmp #$02 ; PRG:$1780 C9 02 + bne Label_D78B ; PRG:$1782 D0 07 + sec ; PRG:$1784 38 + lda $0210 ; PRG:$1785 AD 10 02 + sbc #$01 ; PRG:$1788 E9 01 + rts ; PRG:$178A 60 +Label_D78B: + clc ; PRG:$178B 18 + lda PlayerPositionFraction ; PRG:$178C A5 56 + adc #$50 ; PRG:$178E 69 50 + sta PlayerPositionFraction ; PRG:$1790 85 56 + lda $0210 ; PRG:$1792 AD 10 02 + adc #$01 ; PRG:$1795 69 01 + ldx #$20 ; PRG:$1797 A2 20 + stx GameplayEventFlags ; PRG:$1799 86 FF + rts ; PRG:$179B 60 + +;------------------------------------------------------------------------------ +; CollisionUpdateStep_D79C +; +; Global description: +; Performs the decoded collision operation represented by CollisionUpdateStep_D79C at PRG $179C. +; +; Local description: +; Direct callees/tail targets: CollisionCollisionStep_D7D3, TickDirectionalRepeatTimer, StartPlayerTransitionMotion, BuildPlayerMotionPosition. State and scratch fields referenced: CollisionCollisionStep_D7D3, CollisionUpdateStep_D79C, GameplayEventFlags, PlayerFacing, PlayerInputDirection. Direct named writes: GameplayEventFlags, PlayerFacing. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionUpdateStep_D79C: + jsr CollisionCollisionStep_D7D3 ; PRG:$179C 20 D3 D7 + beq Label_D7A2 ; PRG:$179F F0 01 + rts ; PRG:$17A1 60 +Label_D7A2: + lda #$0B ; PRG:$17A2 A9 0B + ldx #$00 ; PRG:$17A4 A2 00 + jsr TickDirectionalRepeatTimer ; PRG:$17A6 20 8B E9 + bne Label_D7AC ; PRG:$17A9 D0 01 + rts ; PRG:$17AB 60 +Label_D7AC: + lda PlayerInputDirection ; PRG:$17AC A5 54 + cmp #$04 ; PRG:$17AE C9 04 + bne Label_D7BF ; PRG:$17B0 D0 0D + lda PlayerFacing ; PRG:$17B2 A5 6D + beq Label_D7BB ; PRG:$17B4 F0 05 + lda #$00 ; PRG:$17B6 A9 00 + jmp Label_D7C9 ; PRG:$17B8 4C C9 D7 +Label_D7BB: + jsr StartPlayerTransitionMotion ; PRG:$17BB 20 76 DA + rts ; PRG:$17BE 60 +Label_D7BF: + lda PlayerFacing ; PRG:$17BF A5 6D + beq Label_D7C7 ; PRG:$17C1 F0 04 + jsr StartPlayerTransitionMotion ; PRG:$17C3 20 76 DA + rts ; PRG:$17C6 60 +Label_D7C7: + lda #$01 ; PRG:$17C7 A9 01 +Label_D7C9: + sta PlayerFacing ; PRG:$17C9 85 6D + jsr BuildPlayerMotionPosition ; PRG:$17CB 20 48 DA + lda #$20 ; PRG:$17CE A9 20 + sta GameplayEventFlags ; PRG:$17D0 85 FF + rts ; PRG:$17D2 60 + +;------------------------------------------------------------------------------ +; CollisionCollisionStep_D7D3 +; +; Global description: +; Performs the decoded collision operation represented by CollisionCollisionStep_D7D3 at PRG $17D3. +; +; Local description: +; Direct callees/tail targets: CollisionUpdateStep_D7F8, CollisionUpdateStep_D810, TestPlayerCollisionMode2. State and scratch fields referenced: CollisionCollisionStep_D7D3, CollisionLeft, CollisionRight, CollisionUpdateStep_D7F8, CollisionUpdateStep_D810, PlayerInputDirection, Zp0F. Direct named writes: CollisionLeft, CollisionRight. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionCollisionStep_D7D3: + lda CollisionLeft ; PRG:$17D3 A5 3E + pha ; PRG:$17D5 48 + lda CollisionRight ; PRG:$17D6 A5 40 + pha ; PRG:$17D8 48 + lda PlayerInputDirection ; PRG:$17D9 A5 54 + cmp #$03 ; PRG:$17DB C9 03 + beq Label_D7E5 ; PRG:$17DD F0 06 + jsr CollisionUpdateStep_D7F8 ; PRG:$17DF 20 F8 D7 + jmp Label_D7E8 ; PRG:$17E2 4C E8 D7 +Label_D7E5: + jsr CollisionUpdateStep_D810 ; PRG:$17E5 20 10 D8 +Label_D7E8: + cmp #$00 ; PRG:$17E8 C9 00 + bne Label_D7EF ; PRG:$17EA D0 03 + jsr TestPlayerCollisionMode2 ; PRG:$17EC 20 9B E8 +Label_D7EF: + pla ; PRG:$17EF 68 + sta CollisionRight ; PRG:$17F0 85 40 + pla ; PRG:$17F2 68 + sta CollisionLeft ; PRG:$17F3 85 3E + lda Zp0F ; PRG:$17F5 A5 0F + rts ; PRG:$17F7 60 + +;------------------------------------------------------------------------------ +; CollisionUpdateStep_D7F8 +; +; Global description: +; Performs the decoded collision operation represented by CollisionUpdateStep_D7F8 at PRG $17F8. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: CollisionBottom, CollisionLeft, CollisionRight, CollisionUpdateStep_D7F8. Direct named writes: CollisionBottom, CollisionLeft, CollisionRight. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionUpdateStep_D7F8: + lda CollisionRight ; PRG:$17F8 A5 40 + sec ; PRG:$17FA 38 + sbc CollisionLeft ; PRG:$17FB E5 3E + clc ; PRG:$17FD 18 + adc CollisionRight ; PRG:$17FE 65 40 + bcs Label_D80D ; PRG:$1800 B0 0B + ldx CollisionRight ; PRG:$1802 A6 40 + sta CollisionRight ; PRG:$1804 85 40 + stx CollisionLeft ; PRG:$1806 86 3E + inc CollisionBottom ; PRG:$1808 E6 41 + lda #$00 ; PRG:$180A A9 00 + rts ; PRG:$180C 60 +Label_D80D: + lda #$01 ; PRG:$180D A9 01 + rts ; PRG:$180F 60 + +;------------------------------------------------------------------------------ +; CollisionUpdateStep_D810 +; +; Global description: +; Performs the decoded collision operation represented by CollisionUpdateStep_D810 at PRG $1810. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: CollisionBottom, CollisionLeft, CollisionRight, CollisionUpdateStep_D810. Direct named writes: CollisionBottom, CollisionLeft, CollisionRight. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionUpdateStep_D810: + lda CollisionRight ; PRG:$1810 A5 40 + sec ; PRG:$1812 38 + sbc CollisionLeft ; PRG:$1813 E5 3E + sta CollisionRight ; PRG:$1815 85 40 + lda CollisionLeft ; PRG:$1817 A5 3E + sec ; PRG:$1819 38 + sbc CollisionRight ; PRG:$181A E5 40 + bcc Label_D829 ; PRG:$181C 90 0B + ldx CollisionLeft ; PRG:$181E A6 3E + sta CollisionLeft ; PRG:$1820 85 3E + stx CollisionRight ; PRG:$1822 86 40 + inc CollisionBottom ; PRG:$1824 E6 41 + lda #$00 ; PRG:$1826 A9 00 + rts ; PRG:$1828 60 +Label_D829: + lda #$01 ; PRG:$1829 A9 01 + rts ; PRG:$182B 60 + +;------------------------------------------------------------------------------ +; PlayerDispatchStep_D82C +; +; Global description: +; Performs the decoded player-state operation represented by PlayerDispatchStep_D82C at PRG $182C. +; +; Local description: +; Direct callees/tail targets: TickDirectionalRepeatTimer, PlayerUpdateStep_D83F. State and scratch fields referenced: PlayerDispatchStep_D82C, PlayerInputDirection, PlayerUpdateStep_D83F. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerDispatchStep_D82C: + lda PlayerInputDirection ; PRG:$182C A5 54 + cmp #$02 ; PRG:$182E C9 02 + bmi Label_D83E ; PRG:$1830 30 0C + lda #$0F ; PRG:$1832 A9 0F + ldx #$00 ; PRG:$1834 A2 00 + jsr TickDirectionalRepeatTimer ; PRG:$1836 20 8B E9 + beq Label_D83E ; PRG:$1839 F0 03 + jsr PlayerUpdateStep_D83F ; PRG:$183B 20 3F D8 +Label_D83E: + rts ; PRG:$183E 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_D83F +; +; Global description: +; Performs the decoded player-state operation represented by PlayerUpdateStep_D83F at PRG $183F. +; +; Local description: +; Direct callees/tail targets: BuildPlayerMotionPosition, EnterPlayerFallingState. State and scratch fields referenced: PlayerFacing, PlayerInputDirection, PlayerUpdateStep_D83F. Direct named writes: PlayerFacing. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_D83F: + lda PlayerInputDirection ; PRG:$183F A5 54 + cmp #$02 ; PRG:$1841 C9 02 + beq Label_D856 ; PRG:$1843 F0 11 + cmp #$03 ; PRG:$1845 C9 03 + beq Label_D869 ; PRG:$1847 F0 20 + lda #$01 ; PRG:$1849 A9 01 + sta PlayerFacing ; PRG:$184B 85 6D + lda MovementCollisionCode ; PRG:$184D A5 72 + cmp #$01 ; PRG:$184F C9 01 + beq Label_D87A ; PRG:$1851 F0 27 + jmp Label_D876 ; PRG:$1853 4C 76 D8 +Label_D856: + lda MovementCollisionCode ; PRG:$1856 A5 72 + cmp #$01 ; PRG:$1858 C9 01 + beq Label_D861 ; PRG:$185A F0 05 + lda #$00 ; PRG:$185C A9 00 + jmp Label_D863 ; PRG:$185E 4C 63 D8 +Label_D861: + lda #$01 ; PRG:$1861 A9 01 +Label_D863: + sta PlayerFacing ; PRG:$1863 85 6D + jsr BuildPlayerMotionPosition ; PRG:$1865 20 48 DA + rts ; PRG:$1868 60 +Label_D869: + lda #$00 ; PRG:$1869 A9 00 + sta PlayerFacing ; PRG:$186B 85 6D + lda MovementCollisionCode ; PRG:$186D A5 72 + cmp #$01 ; PRG:$186F C9 01 + beq Label_D876 ; PRG:$1871 F0 03 + jmp Label_D87A ; PRG:$1873 4C 7A D8 +Label_D876: + jsr EnterPlayerFallingState ; PRG:$1876 20 D7 DA + rts ; PRG:$1879 60 +Label_D87A: + jsr BuildPlayerMotionPosition ; PRG:$187A 20 48 DA + rts ; PRG:$187D 60 + +;------------------------------------------------------------------------------ +; GraphicsUpdateStep_D87E +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsUpdateStep_D87E at PRG $187E. +; +; Local description: +; Direct callees/tail targets: GraphicsRenderStep_D8A3, TickDirectionalRepeatTimer, BuildPlayerMotionPosition. State and scratch fields referenced: GameplayEventFlags, PlayerFacing, PlayerInputDirection. Direct named writes: GameplayEventFlags, PlayerFacing. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsUpdateStep_D87E: + lda PlayerInputDirection ; PRG:$187E A5 54 + bne Label_D883 ; PRG:$1880 D0 01 + rts ; PRG:$1882 60 +Label_D883: + cmp #$03 ; PRG:$1883 C9 03 + bpl Label_D88B ; PRG:$1885 10 04 + jsr GraphicsRenderStep_D8A3 ; PRG:$1887 20 A3 D8 + rts ; PRG:$188A 60 +Label_D88B: + lda #$0B ; PRG:$188B A9 0B + ldx #$00 ; PRG:$188D A2 00 + jsr TickDirectionalRepeatTimer ; PRG:$188F 20 8B E9 + beq Label_D8A2 ; PRG:$1892 F0 0E + lda PlayerInputDirection ; PRG:$1894 A5 54 + sec ; PRG:$1896 38 + sbc #$03 ; PRG:$1897 E9 03 + sta PlayerFacing ; PRG:$1899 85 6D + jsr BuildPlayerMotionPosition ; PRG:$189B 20 48 DA + lda #$20 ; PRG:$189E A9 20 + sta GameplayEventFlags ; PRG:$18A0 85 FF +Label_D8A2: + rts ; PRG:$18A2 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_D8A3 +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_D8A3 at PRG $18A3. +; +; Local description: +; Direct callees/tail targets: GraphicsUpdateStep_D8EF, PlayerUpdateStep_D8CB, DrawSingleObjectSprite. State and scratch fields referenced: PlayerInputDirection, PlayerMovementSubstate, PlayerUpdateStep_D8CB, Zp00, Zp01, Zp02. Direct named writes: PlayerMovementSubstate, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_D8A3: + lda $0213 ; PRG:$18A3 AD 13 02 + sta Zp00 ; PRG:$18A6 85 00 + lda #$38 ; PRG:$18A8 A9 38 + sta Zp02 ; PRG:$18AA 85 02 + lda PlayerInputDirection ; PRG:$18AC A5 54 + cmp #$01 ; PRG:$18AE C9 01 + beq Label_D8B8 ; PRG:$18B0 F0 06 + jsr GraphicsUpdateStep_D8EF ; PRG:$18B2 20 EF D8 + jmp Label_D8BB ; PRG:$18B5 4C BB D8 +Label_D8B8: + jsr PlayerUpdateStep_D8CB ; PRG:$18B8 20 CB D8 +Label_D8BB: + sta Zp01 ; PRG:$18BB 85 01 + lda Zp01 ; PRG:$18BD A5 01 + and #$04 ; PRG:$18BF 29 04 + lsr a ; PRG:$18C1 4A + lsr a ; PRG:$18C2 4A + jsr DrawSingleObjectSprite ; PRG:$18C3 20 EE E9 + lda #$02 ; PRG:$18C6 A9 02 + sta PlayerMovementSubstate ; PRG:$18C8 85 71 + rts ; PRG:$18CA 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_D8CB +; +; Global description: +; Performs the decoded player-state operation represented by PlayerUpdateStep_D8CB at PRG $18CB. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: GameplayEventFlags, PlayerPositionFraction, PlayerStatePhase, PlayerUpdateStep_D8CB. Direct named writes: GameplayEventFlags, PlayerPositionFraction. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_D8CB: + lda MovementFrameCounter ; PRG:$18CB A5 EA + and #$08 ; PRG:$18CD 29 08 + bne Label_D8D5 ; PRG:$18CF D0 04 + lda #$20 ; PRG:$18D1 A9 20 + sta GameplayEventFlags ; PRG:$18D3 85 FF +Label_D8D5: + lda PlayerStatePhase ; PRG:$18D5 A5 78 + cmp #$01 ; PRG:$18D7 C9 01 + beq Label_D8E8 ; PRG:$18D9 F0 0D + lda PlayerPositionFraction ; PRG:$18DB A5 56 + sec ; PRG:$18DD 38 + sbc #$A0 ; PRG:$18DE E9 A0 + sta PlayerPositionFraction ; PRG:$18E0 85 56 + lda $0210 ; PRG:$18E2 AD 10 02 + sbc #$00 ; PRG:$18E5 E9 00 + rts ; PRG:$18E7 60 +Label_D8E8: + lda $0210 ; PRG:$18E8 AD 10 02 + clc ; PRG:$18EB 18 + adc #$01 ; PRG:$18EC 69 01 + rts ; PRG:$18EE 60 + +;------------------------------------------------------------------------------ +; GraphicsUpdateStep_D8EF +; +; Global description: +; Performs the decoded player-state operation represented by GraphicsUpdateStep_D8EF at PRG $18EF. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: GameplayEventFlags, PlayerPositionFraction, PlayerStatePhase. Direct named writes: GameplayEventFlags, PlayerPositionFraction. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsUpdateStep_D8EF: + lda PlayerStatePhase ; PRG:$18EF A5 78 + cmp #$02 ; PRG:$18F1 C9 02 + bne Label_D8FC ; PRG:$18F3 D0 07 + lda $0210 ; PRG:$18F5 AD 10 02 + sec ; PRG:$18F8 38 + sbc #$01 ; PRG:$18F9 E9 01 + rts ; PRG:$18FB 60 +Label_D8FC: + lda MovementFrameCounter ; PRG:$18FC A5 EA + and #$09 ; PRG:$18FE 29 09 + bne Label_D906 ; PRG:$1900 D0 04 + lda #$20 ; PRG:$1902 A9 20 + sta GameplayEventFlags ; PRG:$1904 85 FF +Label_D906: + lda PlayerPositionFraction ; PRG:$1906 A5 56 + clc ; PRG:$1908 18 + adc #$90 ; PRG:$1909 69 90 + sta PlayerPositionFraction ; PRG:$190B 85 56 + lda $0210 ; PRG:$190D AD 10 02 + adc #$00 ; PRG:$1910 69 00 + rts ; PRG:$1912 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_D913 +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_D913 at PRG $1913. +; +; Local description: +; Direct callees/tail targets: IntegrateVerticalMotion, DrawSingleObjectSprite. State and scratch fields referenced: PlayerFacing, PlayerInputDirection, PlayerPositionFraction, PlayerVerticalAcceleration, Zp00, Zp01, Zp02. Direct named writes: PlayerPositionFraction, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_D913: + lda $0210 ; PRG:$1913 AD 10 02 + sta Zp01 ; PRG:$1916 85 01 + lda #$00 ; PRG:$1918 A9 00 + jsr IntegrateVerticalMotion ; PRG:$191A 20 AE E9 + lda PlayerInputDirection ; PRG:$191D A5 54 + cmp #$03 ; PRG:$191F C9 03 + bpl Label_D929 ; PRG:$1921 10 06 + lda $0213 ; PRG:$1923 AD 13 02 + jmp Label_D947 ; PRG:$1926 4C 47 D9 +Label_D929: + clc ; PRG:$1929 18 + lda PlayerPositionFraction ; PRG:$192A A5 56 + adc PlayerVerticalAcceleration ; PRG:$192C 65 7C + sta PlayerPositionFraction ; PRG:$192E 85 56 + lda #$00 ; PRG:$1930 A9 00 + rol a ; PRG:$1932 2A + sta Zp00 ; PRG:$1933 85 00 + lda $0213 ; PRG:$1935 AD 13 02 + ldx PlayerInputDirection ; PRG:$1938 A6 54 + cpx #$03 ; PRG:$193A E0 03 + beq Label_D944 ; PRG:$193C F0 06 + clc ; PRG:$193E 18 + adc Zp00 ; PRG:$193F 65 00 + jmp Label_D947 ; PRG:$1941 4C 47 D9 +Label_D944: + sec ; PRG:$1944 38 + sbc Zp00 ; PRG:$1945 E5 00 +Label_D947: + sta Zp00 ; PRG:$1947 85 00 + lda #$18 ; PRG:$1949 A9 18 + sta Zp02 ; PRG:$194B 85 02 + lda PlayerFacing ; PRG:$194D A5 6D + eor #$01 ; PRG:$194F 49 01 + jsr DrawSingleObjectSprite ; PRG:$1951 20 EE E9 + rts ; PRG:$1954 60 + +;------------------------------------------------------------------------------ +; CollectStageObject +; +; Global description: +; Performs the decoded collision operation represented by CollectStageObject at PRG $1955. +; +; Local description: +; Direct callees/tail targets: BuildAndTestCollisionBounds, FillObjectTileColumn, DrawObjectSpriteMode0, QueueRectangularVramTransfer, QueueSingleVramByte, GameplayUpdateStep_ED7B. State and scratch fields referenced: GameplayUpdateStep_ED7B, StageObjectDataLength, StageObjectDataPointer, StageOrScreenIndex, Zp00, Zp01, Zp02, Zp03, Zp04, Zp09. Direct named writes: CarriedObjectActive, CollectedObjectCount, CollectedObjectVramRecord, CollectibleActiveArray, CurrentCollectedObjectVramAddressHi, ObjectSoundRequestFlags, Zp00, Zp01, Zp02, Zp03, Zp04, Zp09. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollectStageObject: + lda $0591 ; PRG:$1955 AD 91 05 + bne Label_D95E ; PRG:$1958 D0 04 + lda CarriedObjectActive ; PRG:$195A A5 8C + beq Label_D95F ; PRG:$195C F0 01 +Label_D95E: + rts ; PRG:$195E 60 +Label_D95F: + lda #$E1 ; PRG:$195F A9 E1 + sta Zp02 ; PRG:$1961 85 02 + lda #$C2 ; PRG:$1963 A9 C2 + sta Zp03 ; PRG:$1965 85 03 + lda #$00 ; PRG:$1967 A9 00 + sta CarriedObjectActive ; PRG:$1969 85 8C + ldx #$00 ; PRG:$196B A2 00 + ldy #$01 ; PRG:$196D A0 01 +Label_D96F: + lda CollectibleActiveArray,x ; PRG:$196F B5 9A + beq Label_D986 ; PRG:$1971 F0 13 + lda (StageObjectDataPointer),y ; PRG:$1973 B1 91 + sta Zp00 ; PRG:$1975 85 00 + iny ; PRG:$1977 C8 + lda (StageObjectDataPointer),y ; PRG:$1978 B1 91 + sta Zp01 ; PRG:$197A 85 01 + jsr BuildAndTestCollisionBounds ; PRG:$197C 20 6E EB + cmp #$00 ; PRG:$197F C9 00 + bne Label_D992 ; PRG:$1981 D0 0F + jmp Label_D987 ; PRG:$1983 4C 87 D9 +Label_D986: + iny ; PRG:$1986 C8 +Label_D987: + inx ; PRG:$1987 E8 + tya ; PRG:$1988 98 + clc ; PRG:$1989 18 + adc #$06 ; PRG:$198A 69 06 + tay ; PRG:$198C A8 + cpy StageObjectDataLength ; PRG:$198D C4 93 + bcc Label_D96F ; PRG:$198F 90 DE + rts ; PRG:$1991 60 +Label_D992: + lda #$02 ; PRG:$1992 A9 02 + sta ObjectSoundRequestFlags ; PRG:$1994 85 FE + lda #$FF ; PRG:$1996 A9 FF + sta $0200 ; PRG:$1998 8D 00 02 + lda CollectibleSpriteTileArray,x ; PRG:$199B B5 8D + sta Zp02 ; PRG:$199D 85 02 + lda #$04 ; PRG:$199F A9 04 + sta Zp03 ; PRG:$19A1 85 03 + lda #$30 ; PRG:$19A3 A9 30 + sta Zp04 ; PRG:$19A5 85 04 + jsr FillObjectTileColumn ; PRG:$19A7 20 06 EA + lda #$00 ; PRG:$19AA A9 00 + sta CollectibleActiveArray,x ; PRG:$19AC 95 9A + txa ; PRG:$19AE 8A + pha ; PRG:$19AF 48 + inx ; PRG:$19B0 E8 + stx CarriedObjectActive ; PRG:$19B1 86 8C + stx CollectedObjectCount ; PRG:$19B3 86 9E + iny ; PRG:$19B5 C8 + lda (StageObjectDataPointer),y ; PRG:$19B6 B1 91 + sta Zp02 ; PRG:$19B8 85 02 + lda #$22 ; PRG:$19BA A9 22 + sta CurrentCollectedObjectVramAddressHi ; PRG:$19BC 85 95 + sta Zp03 ; PRG:$19BE 85 03 + dex ; PRG:$19C0 CA + jsr DrawObjectSpriteMode0 ; PRG:$19C1 20 FC E9 + ldx #$02 ; PRG:$19C4 A2 02 +Label_D9C6: + iny ; PRG:$19C6 C8 + lda (StageObjectDataPointer),y ; PRG:$19C7 B1 91 + sta CollectedObjectVramRecord,x ; PRG:$19C9 95 94 + inx ; PRG:$19CB E8 + cpx #$06 ; PRG:$19CC E0 06 + bne Label_D9C6 ; PRG:$19CE D0 F6 + pla ; PRG:$19D0 68 + asl a ; PRG:$19D1 0A + sta Zp01 ; PRG:$19D2 85 01 + ldx StageOrScreenIndex ; PRG:$19D4 A6 4A + dex ; PRG:$19D6 CA + txa ; PRG:$19D7 8A + asl a ; PRG:$19D8 0A + sta Zp09 ; PRG:$19D9 85 09 + asl a ; PRG:$19DB 0A + asl a ; PRG:$19DC 0A + clc ; PRG:$19DD 18 + adc Zp01 ; PRG:$19DE 65 01 + tax ; PRG:$19E0 AA + lda CollectedObjectVramAddressLo,x ; PRG:$19E1 BD ED C2 + sta Zp00 ; PRG:$19E4 85 00 + lda CollectedObjectVramAddressHi,x ; PRG:$19E6 BD EE C2 + sta Zp01 ; PRG:$19E9 85 01 + lda #$95 ; PRG:$19EB A9 95 + sta Zp02 ; PRG:$19ED 85 02 + lda #$00 ; PRG:$19EF A9 00 + sta Zp03 ; PRG:$19F1 85 03 + jsr QueueRectangularVramTransfer ; PRG:$19F3 20 CE EF + ldx CarriedObjectActive ; PRG:$19F6 A6 8C + cpx #$03 ; PRG:$19F8 E0 03 + bpl Label_DA10 ; PRG:$19FA 10 14 + dex ; PRG:$19FC CA + txa ; PRG:$19FD 8A + clc ; PRG:$19FE 18 + adc Zp09 ; PRG:$19FF 65 09 + tax ; PRG:$1A01 AA + lda CollectedObjectVramXTable,x ; PRG:$1A02 BD E5 C2 + sta Zp00 ; PRG:$1A05 85 00 + ldy #$00 ; PRG:$1A07 A0 00 + lda #$23 ; PRG:$1A09 A9 23 + sta Zp01 ; PRG:$1A0B 85 01 + jsr QueueSingleVramByte ; PRG:$1A0D 20 C5 F1 +Label_DA10: + jsr GameplayUpdateStep_ED7B ; PRG:$1A10 20 7B ED + rts ; PRG:$1A13 60 + +;------------------------------------------------------------------------------ +; UpdatePlayerStatePhase +; +; Global description: +; Performs the decoded collision operation represented by UpdatePlayerStatePhase at PRG $1A14. +; +; Local description: +; Direct callees/tail targets: TestPlayerCollisionMode2. State and scratch fields referenced: PlayerInputDirection, PlayerStatePhase. Direct named writes: PlayerInputDirection, PlayerStatePhase. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdatePlayerStatePhase: + jsr TestPlayerCollisionMode2 ; PRG:$1A14 20 9B E8 + cmp #$00 ; PRG:$1A17 C9 00 + beq Label_DA1F ; PRG:$1A19 F0 04 + lda PreviousInputDirection ; PRG:$1A1B A5 55 + sta PlayerInputDirection ; PRG:$1A1D 85 54 +Label_DA1F: + sta PlayerStatePhase ; PRG:$1A1F 85 78 + rts ; PRG:$1A21 60 + +;------------------------------------------------------------------------------ +; ResolvePlayerFallState +; +; Global description: +; Performs the decoded player-state operation represented by ResolvePlayerFallState at PRG $1A22. +; +; Local description: +; Direct callees/tail targets: TestPlayerFallDistance, ResetPlayerMotionParameters. State and scratch fields referenced: PlayerState. Direct named writes: PlayerState. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +ResolvePlayerFallState: + jsr TestPlayerFallDistance ; PRG:$1A22 20 34 DA + bne Label_DA2F ; PRG:$1A25 D0 08 + jsr ResetPlayerMotionParameters ; PRG:$1A27 20 A5 DA + lda #$01 ; PRG:$1A2A A9 01 + jmp Label_DA31 ; PRG:$1A2C 4C 31 DA +Label_DA2F: + lda #$05 ; PRG:$1A2F A9 05 +Label_DA31: + sta PlayerState ; PRG:$1A31 85 6B + rts ; PRG:$1A33 60 + +;------------------------------------------------------------------------------ +; TestPlayerFallDistance +; +; Global description: +; Performs the decoded player-state operation represented by TestPlayerFallDistance at PRG $1A34. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: PlayerFallThreshold, PlayerStateReferenceY. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +TestPlayerFallDistance: + lda $0210 ; PRG:$1A34 AD 10 02 + cmp PlayerStateReferenceY ; PRG:$1A37 C5 76 + bcc Label_DA42 ; PRG:$1A39 90 07 + sec ; PRG:$1A3B 38 + sbc PlayerStateReferenceY ; PRG:$1A3C E5 76 + cmp PlayerFallThreshold ; PRG:$1A3E C5 7B + bcs Label_DA45 ; PRG:$1A40 B0 03 +Label_DA42: + lda #$00 ; PRG:$1A42 A9 00 + rts ; PRG:$1A44 60 +Label_DA45: + lda #$01 ; PRG:$1A45 A9 01 + rts ; PRG:$1A47 60 + +;------------------------------------------------------------------------------ +; BuildPlayerMotionPosition +; +; Global description: +; Performs the decoded collision operation represented by BuildPlayerMotionPosition at PRG $1A48. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: PlayerCollisionAnchorLeft, PlayerCollisionAnchorRight, PlayerFacing, PlayerMovementSubstate, Zp00, Zp01. Direct named writes: Zp00, Zp01. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +BuildPlayerMotionPosition: + lda $0210 ; PRG:$1A48 AD 10 02 + sta Zp01 ; PRG:$1A4B 85 01 + lda $0213 ; PRG:$1A4D AD 13 02 + ldx PlayerMovementSubstate ; PRG:$1A50 A6 71 + cpx #$02 ; PRG:$1A52 E0 02 + bne Label_DA64 ; PRG:$1A54 D0 0E + ldx PlayerFacing ; PRG:$1A56 A6 6D + beq Label_DA5F ; PRG:$1A58 F0 05 + lda PlayerCollisionAnchorLeft ; PRG:$1A5A A5 73 + jmp Label_DA61 ; PRG:$1A5C 4C 61 DA +Label_DA5F: + lda PlayerCollisionAnchorRight ; PRG:$1A5F A5 74 +Label_DA61: + sec ; PRG:$1A61 38 + sbc #$10 ; PRG:$1A62 E9 10 +Label_DA64: + sta Zp00 ; PRG:$1A64 85 00 + +;------------------------------------------------------------------------------ +; StartPlayerClimbMotion +; +; Global description: +; Performs the decoded graphics operation represented by StartPlayerClimbMotion at PRG $1A66. +; +; Local description: +; Direct callees/tail targets: DrawSingleObjectSprite. State and scratch fields referenced: PlayerFacing, PlayerMovementSubstate, Zp02. Direct named writes: PlayerMovementSubstate, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +StartPlayerClimbMotion: + lda #$28 ; PRG:$1A66 A9 28 + sta Zp02 ; PRG:$1A68 85 02 + lda PlayerFacing ; PRG:$1A6A A5 6D + eor #$01 ; PRG:$1A6C 49 01 + jsr DrawSingleObjectSprite ; PRG:$1A6E 20 EE E9 + lda #$01 ; PRG:$1A71 A9 01 + sta PlayerMovementSubstate ; PRG:$1A73 85 71 + rts ; PRG:$1A75 60 + +;------------------------------------------------------------------------------ +; StartPlayerTransitionMotion +; +; Global description: +; Performs the decoded graphics operation represented by StartPlayerTransitionMotion at PRG $1A76. +; +; Local description: +; Direct callees/tail targets: DrawSingleObjectSprite. State and scratch fields referenced: PlayerFacing, PlayerMovementSubstate, PlayerState, Zp00, Zp01, Zp02. Direct named writes: PlayerMovementSubstate, PlayerState, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +StartPlayerTransitionMotion: + txa ; PRG:$1A76 8A + pha ; PRG:$1A77 48 + lda $0210 ; PRG:$1A78 AD 10 02 + sta Zp01 ; PRG:$1A7B 85 01 + lda $0213 ; PRG:$1A7D AD 13 02 + ldx PlayerFacing ; PRG:$1A80 A6 6D + beq Label_DA8C ; PRG:$1A82 F0 08 + sec ; PRG:$1A84 38 + sbc #$0C ; PRG:$1A85 E9 0C + sta Zp00 ; PRG:$1A87 85 00 + jmp Label_DA91 ; PRG:$1A89 4C 91 DA +Label_DA8C: + clc ; PRG:$1A8C 18 + adc #$0C ; PRG:$1A8D 69 0C + sta Zp00 ; PRG:$1A8F 85 00 +Label_DA91: + lda #$38 ; PRG:$1A91 A9 38 + sta Zp02 ; PRG:$1A93 85 02 + lda PlayerFacing ; PRG:$1A95 A5 6D + eor #$01 ; PRG:$1A97 49 01 + jsr DrawSingleObjectSprite ; PRG:$1A99 20 EE E9 + lda #$02 ; PRG:$1A9C A9 02 + sta PlayerMovementSubstate ; PRG:$1A9E 85 71 + sta PlayerState ; PRG:$1AA0 85 6B + pla ; PRG:$1AA2 68 + tax ; PRG:$1AA3 AA + rts ; PRG:$1AA4 60 + +;------------------------------------------------------------------------------ +; ResetPlayerMotionParameters +; +; Global description: +; Performs the decoded collision operation represented by ResetPlayerMotionParameters at PRG $1AA5. +; +; Local description: +; Direct callees/tail targets: DrawSingleObjectSprite. State and scratch fields referenced: CollisionMatchY, GameplayEventFlags, PlayerAuxSpritePending, PlayerFacing, PlayerFallThreshold, PlayerGravityFraction, PlayerGravityInteger, PlayerVerticalAcceleration, PlayerVerticalSpeedInteger, Zp00, Zp01, Zp02. Direct named writes: GameplayEventFlags, PlayerAuxSpritePending, PlayerFallThreshold, PlayerGravityFraction, PlayerGravityInteger, PlayerVerticalAcceleration, PlayerVerticalSpeedInteger, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +ResetPlayerMotionParameters: + lda CollisionMatchY ; PRG:$1AA5 A5 43 + sec ; PRG:$1AA7 38 + sbc #$11 ; PRG:$1AA8 E9 11 + sta Zp01 ; PRG:$1AAA 85 01 + lda $0213 ; PRG:$1AAC AD 13 02 + sta Zp00 ; PRG:$1AAF 85 00 + lda #$20 ; PRG:$1AB1 A9 20 + sta Zp02 ; PRG:$1AB3 85 02 + sta PlayerAuxSpritePending ; PRG:$1AB5 85 63 + lda PlayerFacing ; PRG:$1AB7 A5 6D + eor #$01 ; PRG:$1AB9 49 01 + jsr DrawSingleObjectSprite ; PRG:$1ABB 20 EE E9 + lda #$60 ; PRG:$1ABE A9 60 + sta PlayerGravityFraction ; PRG:$1AC0 85 86 + lda #$01 ; PRG:$1AC2 A9 01 + sta PlayerGravityInteger ; PRG:$1AC4 85 87 + lda #$02 ; PRG:$1AC6 A9 02 + sta PlayerVerticalSpeedInteger ; PRG:$1AC8 85 7A + lda #$18 ; PRG:$1ACA A9 18 + sta PlayerFallThreshold ; PRG:$1ACC 85 7B + lda #$A0 ; PRG:$1ACE A9 A0 + sta PlayerVerticalAcceleration ; PRG:$1AD0 85 7C + lda #$10 ; PRG:$1AD2 A9 10 + sta GameplayEventFlags ; PRG:$1AD4 85 FF + rts ; PRG:$1AD6 60 + +;------------------------------------------------------------------------------ +; EnterPlayerFallingState +; +; Global description: +; Performs the decoded graphics operation represented by EnterPlayerFallingState at PRG $1AD7. +; +; Local description: +; Direct callees/tail targets: DrawSingleObjectSprite. State and scratch fields referenced: PlayerFacing, PlayerMovementSubstate, PlayerState, PlayerStateReferenceY, Zp00, Zp01, Zp02. Direct named writes: PlayerMovementSubstate, PlayerState, PlayerStateReferenceY, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnterPlayerFallingState: + lda $0210 ; PRG:$1AD7 AD 10 02 + sta Zp01 ; PRG:$1ADA 85 01 + sta PlayerStateReferenceY ; PRG:$1ADC 85 76 + lda $0213 ; PRG:$1ADE AD 13 02 + sta Zp00 ; PRG:$1AE1 85 00 + lda #$18 ; PRG:$1AE3 A9 18 + sta Zp02 ; PRG:$1AE5 85 02 + lda PlayerFacing ; PRG:$1AE7 A5 6D + eor #$01 ; PRG:$1AE9 49 01 + jsr DrawSingleObjectSprite ; PRG:$1AEB 20 EE E9 + lda #$00 ; PRG:$1AEE A9 00 + sta PlayerMovementSubstate ; PRG:$1AF0 85 71 + lda #$04 ; PRG:$1AF2 A9 04 + sta PlayerState ; PRG:$1AF4 85 6B + rts ; PRG:$1AF6 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_DAF7 +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_DAF7 at PRG $1AF7. +; +; Local description: +; Direct callees/tail targets: DrawSingleObjectSprite, SwitchActivePlayerOrReturnToAttract. State and scratch fields referenced: GameplayEventFlags, Zp00, Zp01, Zp02, Zp08, Zp09. Direct named writes: GameplayEventFlags, Zp00, Zp01, Zp02, Zp09. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_DAF7: + lda $0210 ; PRG:$1AF7 AD 10 02 + cmp #$D8 ; PRG:$1AFA C9 D8 + bcs Label_DB18 ; PRG:$1AFC B0 1A + clc ; PRG:$1AFE 18 + adc #$02 ; PRG:$1AFF 69 02 + sta Zp01 ; PRG:$1B01 85 01 + lda Zp09 ; PRG:$1B03 A5 09 + sta GameplayEventFlags ; PRG:$1B05 85 FF + lda $0213 ; PRG:$1B07 AD 13 02 + sta Zp00 ; PRG:$1B0A 85 00 + lda #$40 ; PRG:$1B0C A9 40 + sta Zp02 ; PRG:$1B0E 85 02 + lda #$00 ; PRG:$1B10 A9 00 + sta Zp09 ; PRG:$1B12 85 09 + jsr DrawSingleObjectSprite ; PRG:$1B14 20 EE E9 + rts ; PRG:$1B17 60 +Label_DB18: + lda Zp08 ; PRG:$1B18 A5 08 + sta GameplayEventFlags ; PRG:$1B1A 85 FF + jsr SwitchActivePlayerOrReturnToAttract ; PRG:$1B1C 20 62 CF + rts ; PRG:$1B1F 60 + +;------------------------------------------------------------------------------ +; AudioRenderStep_DB20 +; +; Global description: +; Performs the decoded audio operation represented by AudioRenderStep_DB20 at PRG $1B20. +; +; Local description: +; Direct callees/tail targets: DrawSingleObjectSprite. State and scratch fields referenced: AudioRenderStep_DB20, GameStateTimer, GameplayEventFlags, Zp00, Zp01, Zp02, Zp08. Direct named writes: GameStateTimer, GameplayEventFlags, Zp00, Zp01, Zp02, Zp08. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioRenderStep_DB20: + lda BonusCounter ; PRG:$1B20 A5 65 + cmp #$24 ; PRG:$1B22 C9 24 + bne Label_DB2A ; PRG:$1B24 D0 04 + lda #$02 ; PRG:$1B26 A9 02 + sta GameplayEventFlags ; PRG:$1B28 85 FF +Label_DB2A: + lda $0210 ; PRG:$1B2A AD 10 02 + sta Zp01 ; PRG:$1B2D 85 01 + lda $0213 ; PRG:$1B2F AD 13 02 + sta Zp00 ; PRG:$1B32 85 00 + ldx #$40 ; PRG:$1B34 A2 40 + lda BonusCounter ; PRG:$1B36 A5 65 + and #$02 ; PRG:$1B38 29 02 + bne Label_DB3E ; PRG:$1B3A D0 02 + ldx #$48 ; PRG:$1B3C A2 48 +Label_DB3E: + stx Zp02 ; PRG:$1B3E 86 02 + lda #$00 ; PRG:$1B40 A9 00 + jsr DrawSingleObjectSprite ; PRG:$1B42 20 EE E9 + lda #$20 ; PRG:$1B45 A9 20 + sta GameStateTimer ; PRG:$1B47 85 39 + lda $0210 ; PRG:$1B49 AD 10 02 + cmp #$D8 ; PRG:$1B4C C9 D8 + bcs Label_DB55 ; PRG:$1B4E B0 05 + lda #$10 ; PRG:$1B50 A9 10 + jmp Label_DB57 ; PRG:$1B52 4C 57 DB +Label_DB55: + lda #$00 ; PRG:$1B55 A9 00 +Label_DB57: + sta Zp08 ; PRG:$1B57 85 08 + rts ; PRG:$1B59 60 + +;------------------------------------------------------------------------------ +; UpdateBonusDisplay +; +; Global description: +; Performs the decoded audio operation represented by UpdateBonusDisplay at PRG $1B5A. +; +; Local description: +; Direct callees/tail targets: QueueRectangularVramTransfer. State and scratch fields referenced: SoundTimerArray, StageOrScreenIndex, Zp00, Zp01, Zp02, Zp03. Direct named writes: SoundTimerArray, Zp00, Zp01, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateBonusDisplay: + lda $0590 ; PRG:$1B5A AD 90 05 + bne Label_DB66 ; PRG:$1B5D D0 07 + lda #$20 ; PRG:$1B5F A9 20 + sta SoundTimerArray ; PRG:$1B61 85 35 + sta $0590 ; PRG:$1B63 8D 90 05 +Label_DB66: + ldy SoundTimerArray ; PRG:$1B66 A4 35 + bne Label_DB70 ; PRG:$1B68 D0 06 + lda #$00 ; PRG:$1B6A A9 00 + sta $0591 ; PRG:$1B6C 8D 91 05 + rts ; PRG:$1B6F 60 +Label_DB70: + lda #$20 ; PRG:$1B70 A9 20 + sta Zp01 ; PRG:$1B72 85 01 + lda #$C8 ; PRG:$1B74 A9 C8 + ldx StageOrScreenIndex ; PRG:$1B76 A6 4A + cpx #$04 ; PRG:$1B78 E0 04 + bne Label_DB7E ; PRG:$1B7A D0 02 + lda #$C4 ; PRG:$1B7C A9 C4 +Label_DB7E: + sta Zp00 ; PRG:$1B7E 85 00 + cpx #$03 ; PRG:$1B80 E0 03 + beq Label_DB8D ; PRG:$1B82 F0 09 + lda #$CF ; PRG:$1B84 A9 CF + sta Zp02 ; PRG:$1B86 85 02 + lda #$C3 ; PRG:$1B88 A9 C3 + jmp Label_DB93 ; PRG:$1B8A 4C 93 DB +Label_DB8D: + lda #$D4 ; PRG:$1B8D A9 D4 + sta Zp02 ; PRG:$1B8F 85 02 + lda #$C3 ; PRG:$1B91 A9 C3 +Label_DB93: + sta Zp03 ; PRG:$1B93 85 03 + cpy #$10 ; PRG:$1B95 C0 10 + beq Label_DBAA ; PRG:$1B97 F0 11 + cpy #$01 ; PRG:$1B99 C0 01 + beq Label_DBA3 ; PRG:$1B9B F0 06 + lda #$00 ; PRG:$1B9D A9 00 + sta $0591 ; PRG:$1B9F 8D 91 05 + rts ; PRG:$1BA2 60 +Label_DBA3: + lda Zp02 ; PRG:$1BA3 A5 02 + clc ; PRG:$1BA5 18 + adc #$0E ; PRG:$1BA6 69 0E + sta Zp02 ; PRG:$1BA8 85 02 +Label_DBAA: + jsr QueueRectangularVramTransfer ; PRG:$1BAA 20 CE EF + lda #$01 ; PRG:$1BAD A9 01 + sta $0591 ; PRG:$1BAF 8D 91 05 + rts ; PRG:$1BB2 60 + +;------------------------------------------------------------------------------ +; UpdateCarriedObjectSprite +; +; Global description: +; Performs the decoded graphics operation represented by UpdateCarriedObjectSprite at PRG $1BB3. +; +; Local description: +; Direct callees/tail targets: RenderObjectSpriteGrid. State and scratch fields referenced: Zp00, Zp01, Zp02, Zp03, Zp04. Direct named writes: CarriedObjectActive, Zp00, Zp01, Zp02, Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateCarriedObjectSprite: + ldx CarriedObjectActive ; PRG:$1BB3 A6 8C + beq Label_DBE8 ; PRG:$1BB5 F0 31 + lda #$30 ; PRG:$1BB7 A9 30 + sta Zp04 ; PRG:$1BB9 85 04 + lda $0230 ; PRG:$1BBB AD 30 02 + cmp #$D8 ; PRG:$1BBE C9 D8 + bcs Label_DBCD ; PRG:$1BC0 B0 0B + clc ; PRG:$1BC2 18 + adc #$02 ; PRG:$1BC3 69 02 + sta Zp01 ; PRG:$1BC5 85 01 + lda #$00 ; PRG:$1BC7 A9 00 + pha ; PRG:$1BC9 48 + jmp Label_DBD6 ; PRG:$1BCA 4C D6 DB +Label_DBCD: + lda #$00 ; PRG:$1BCD A9 00 + sta CarriedObjectActive ; PRG:$1BCF 85 8C + lda #$FF ; PRG:$1BD1 A9 FF + sta Zp01 ; PRG:$1BD3 85 01 + pha ; PRG:$1BD5 48 +Label_DBD6: + lda $0231 ; PRG:$1BD6 AD 31 02 + sta Zp02 ; PRG:$1BD9 85 02 + lda #$22 ; PRG:$1BDB A9 22 + sta Zp03 ; PRG:$1BDD 85 03 + lda $0233 ; PRG:$1BDF AD 33 02 + sta Zp00 ; PRG:$1BE2 85 00 + pla ; PRG:$1BE4 68 + jsr RenderObjectSpriteGrid ; PRG:$1BE5 20 08 EA +Label_DBE8: + rts ; PRG:$1BE8 60 + +;------------------------------------------------------------------------------ +; GraphicsCollisionStep_DBE9 +; +; Global description: +; Performs the decoded collision operation represented by GraphicsCollisionStep_DBE9 at PRG $1BE9. +; +; Local description: +; Direct callees/tail targets: GraphicsRenderStep_DC9D, BuildCollisionBounds, TestPlayerCollisionMode0, RunCollisionQuery, CollisionStateStep_DE28, GraphicsRenderStep_DCEF, GraphicsRenderStep_DD43, GraphicsRenderStep_DCCC, EnemyStateStep_DDA7, GraphicsStateStep_DDE4. State and scratch fields referenced: CollisionStateStep_DE28, EnemyDirectionInitializedArray, EnemyStateArray, EnemyStateStep_DDA7, StagePrimaryObjectCount, StageSecondaryObjectIndex, Zp00, Zp01, Zp02, Zp03, Zp04. Direct named writes: EnemyDirectionInitializedArray, EnemyStateArray, StageSecondaryObjectIndex, Zp00, Zp01, Zp02, Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsCollisionStep_DBE9: + lda #$C0 ; PRG:$1BE9 A9 C0 + sta Zp04 ; PRG:$1BEB 85 04 + lda #$00 ; PRG:$1BED A9 00 + ldx #$00 ; PRG:$1BEF A2 00 + ldy #$00 ; PRG:$1BF1 A0 00 +Label_DBF3: + pha ; PRG:$1BF3 48 + lda $02C0,y ; PRG:$1BF4 B9 C0 02 + cmp #$FF ; PRG:$1BF7 C9 FF + bne Label_DC01 ; PRG:$1BF9 D0 06 + jsr GraphicsRenderStep_DC9D ; PRG:$1BFB 20 9D DC + jmp Label_DC41 ; PRG:$1BFE 4C 41 DC +Label_DC01: + sta Zp01 ; PRG:$1C01 85 01 + lda $02C3,y ; PRG:$1C03 B9 C3 02 + sta Zp00 ; PRG:$1C06 85 00 + lda EnemyStateArray,x ; PRG:$1C08 B5 A3 + cmp #$02 ; PRG:$1C0A C9 02 + bpl Label_DC17 ; PRG:$1C0C 10 09 + lda #$99 ; PRG:$1C0E A9 99 + sta Zp02 ; PRG:$1C10 85 02 + lda #$C3 ; PRG:$1C12 A9 C3 + jmp Label_DC1D ; PRG:$1C14 4C 1D DC +Label_DC17: + lda #$9D ; PRG:$1C17 A9 9D + sta Zp02 ; PRG:$1C19 85 02 + lda #$C3 ; PRG:$1C1B A9 C3 +Label_DC1D: + sta Zp03 ; PRG:$1C1D 85 03 + jsr BuildCollisionBounds ; PRG:$1C1F 20 69 EB + jsr TestPlayerCollisionMode0 ; PRG:$1C22 20 93 E8 + cmp #$00 ; PRG:$1C25 C9 00 + bne Label_DC56 ; PRG:$1C27 D0 2D + jsr RunCollisionQuery ; PRG:$1C29 20 A3 E8 + cmp #$00 ; PRG:$1C2C C9 00 + bne Label_DC73 ; PRG:$1C2E D0 43 + dec StageSecondaryObjectIndex ; PRG:$1C30 C6 A2 + cpy StageSecondaryObjectIndex ; PRG:$1C32 C4 A2 + beq Label_DC87 ; PRG:$1C34 F0 51 + inc StageSecondaryObjectIndex ; PRG:$1C36 E6 A2 + lda EnemyStateArray,x ; PRG:$1C38 B5 A3 + cmp #$02 ; PRG:$1C3A C9 02 + bpl Label_DC91 ; PRG:$1C3C 10 53 + jmp Label_DC97 ; PRG:$1C3E 4C 97 DC +Label_DC41: + pla ; PRG:$1C41 68 + tax ; PRG:$1C42 AA + inx ; PRG:$1C43 E8 + cpx StagePrimaryObjectCount ; PRG:$1C44 E4 A0 + beq Label_DC55 ; PRG:$1C46 F0 0D + tya ; PRG:$1C48 98 + clc ; PRG:$1C49 18 + adc #$08 ; PRG:$1C4A 69 08 + tay ; PRG:$1C4C A8 + adc #$C0 ; PRG:$1C4D 69 C0 + sta Zp04 ; PRG:$1C4F 85 04 + txa ; PRG:$1C51 8A + jmp Label_DBF3 ; PRG:$1C52 4C F3 DB +Label_DC55: + rts ; PRG:$1C55 60 +Label_DC56: + jsr RunCollisionQuery ; PRG:$1C56 20 A3 E8 + cmp #$00 ; PRG:$1C59 C9 00 + beq Label_DC69 ; PRG:$1C5B F0 0C + jsr CollisionStateStep_DE28 ; PRG:$1C5D 20 28 DE + lda EnemyStateArray,x ; PRG:$1C60 B5 A3 + cmp #$02 ; PRG:$1C62 C9 02 + bmi Label_DC77 ; PRG:$1C64 30 11 + jmp Label_DC6D ; PRG:$1C66 4C 6D DC +Label_DC69: + lda #$00 ; PRG:$1C69 A9 00 + sta EnemyDirectionInitializedArray,x ; PRG:$1C6B 95 A8 +Label_DC6D: + jsr GraphicsRenderStep_DCEF ; PRG:$1C6D 20 EF DC + jmp Label_DC41 ; PRG:$1C70 4C 41 DC +Label_DC73: + lda #$00 ; PRG:$1C73 A9 00 + sta EnemyDirectionInitializedArray,x ; PRG:$1C75 95 A8 +Label_DC77: + iny ; PRG:$1C77 C8 + cpy StageSecondaryObjectIndex ; PRG:$1C78 C4 A2 + bne Label_DC80 ; PRG:$1C7A D0 04 + lda #$00 ; PRG:$1C7C A9 00 + sta StageSecondaryObjectIndex ; PRG:$1C7E 85 A2 +Label_DC80: + dey ; PRG:$1C80 88 + jsr GraphicsRenderStep_DD43 ; PRG:$1C81 20 43 DD + jmp Label_DC41 ; PRG:$1C84 4C 41 DC +Label_DC87: + jsr GraphicsRenderStep_DCCC ; PRG:$1C87 20 CC DC + inc StageSecondaryObjectIndex ; PRG:$1C8A E6 A2 + sta EnemyStateArray,x ; PRG:$1C8C 95 A3 + jmp Label_DC41 ; PRG:$1C8E 4C 41 DC +Label_DC91: + jsr EnemyStateStep_DDA7 ; PRG:$1C91 20 A7 DD + jmp Label_DC41 ; PRG:$1C94 4C 41 DC +Label_DC97: + jsr GraphicsStateStep_DDE4 ; PRG:$1C97 20 E4 DD + jmp Label_DC41 ; PRG:$1C9A 4C 41 DC + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_DC9D +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_DC9D at PRG $1C9D. +; +; Local description: +; Direct callees/tail targets: DrawObjectSpriteMode1. State and scratch fields referenced: EnemyStateArray, StageSecondaryObjectIndex, Zp00, Zp01, Zp02, Zp03, Zp80. Direct named writes: EnemyStateArray, StageSecondaryObjectIndex, Zp00, Zp01, Zp02, Zp03, Zp80. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_DC9D: + lda $0211 ; PRG:$1C9D AD 11 02 + cmp #$50 ; PRG:$1CA0 C9 50 + beq Label_DCAA ; PRG:$1CA2 F0 06 + lda DifficultyOrRoundIndex ; PRG:$1CA4 A5 4B + cmp #$03 ; PRG:$1CA6 C9 03 + bmi Label_DCCB ; PRG:$1CA8 30 21 +Label_DCAA: + lda StageSecondaryObjectIndex ; PRG:$1CAA A5 A2 + bne Label_DCCB ; PRG:$1CAC D0 1D + iny ; PRG:$1CAE C8 + sty StageSecondaryObjectIndex ; PRG:$1CAF 84 A2 + dey ; PRG:$1CB1 88 + lda #$40 ; PRG:$1CB2 A9 40 + sta Zp00 ; PRG:$1CB4 85 00 + lda #$34 ; PRG:$1CB6 A9 34 + sta Zp01 ; PRG:$1CB8 85 01 + lda #$58 ; PRG:$1CBA A9 58 + sta Zp02 ; PRG:$1CBC 85 02 + lda #$12 ; PRG:$1CBE A9 12 + sta Zp03 ; PRG:$1CC0 85 03 + lda #$00 ; PRG:$1CC2 A9 00 + sta Zp80 ; PRG:$1CC4 85 80 + sta EnemyStateArray,x ; PRG:$1CC6 95 A3 + jsr DrawObjectSpriteMode1 ; PRG:$1CC8 20 01 EA +Label_DCCB: + rts ; PRG:$1CCB 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_DCCC +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_DCCC at PRG $1CCC. +; +; Local description: +; Direct callees/tail targets: IntegrateVerticalMotion, DrawObjectSpriteMode1. State and scratch fields referenced: Zp00, Zp01, Zp02, Zp03. Direct named writes: ObjectPositionFraction, Zp00, Zp01, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_DCCC: + lda $02C0,y ; PRG:$1CCC B9 C0 02 + sta Zp01 ; PRG:$1CCF 85 01 + lda #$01 ; PRG:$1CD1 A9 01 + jsr IntegrateVerticalMotion ; PRG:$1CD3 20 AE E9 + lda ObjectPositionFraction,x ; PRG:$1CD6 B5 57 + adc #$80 ; PRG:$1CD8 69 80 + sta ObjectPositionFraction,x ; PRG:$1CDA 95 57 + lda #$00 ; PRG:$1CDC A9 00 + adc $02C3,y ; PRG:$1CDE 79 C3 02 + sta Zp00 ; PRG:$1CE1 85 00 + lda #$58 ; PRG:$1CE3 A9 58 + sta Zp02 ; PRG:$1CE5 85 02 + lda #$12 ; PRG:$1CE7 A9 12 + sta Zp03 ; PRG:$1CE9 85 03 + jsr DrawObjectSpriteMode1 ; PRG:$1CEB 20 01 EA + rts ; PRG:$1CEE 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_DCEF +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_DCEF at PRG $1CEF. +; +; Local description: +; Direct callees/tail targets: EnemyUpdateStep_DD1D, GraphicsUpdateStep_DD33, RenderObjectSpriteGrid. State and scratch fields referenced: EnemyStateArray, EnemyUpdateStep_DD1D, Zp00, Zp02, Zp03. Direct named writes: Zp00, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_DCEF: + lda EnemyStateArray,x ; PRG:$1CEF B5 A3 + cmp #$02 ; PRG:$1CF1 C9 02 + bne Label_DCFD ; PRG:$1CF3 D0 08 + jsr EnemyUpdateStep_DD1D ; PRG:$1CF5 20 1D DD + ldx #$00 ; PRG:$1CF8 A2 00 + jmp Label_DD02 ; PRG:$1CFA 4C 02 DD +Label_DCFD: + jsr GraphicsUpdateStep_DD33 ; PRG:$1CFD 20 33 DD + ldx #$02 ; PRG:$1D00 A2 02 +Label_DD02: + and #$02 ; PRG:$1D02 29 02 + beq Label_DD0B ; PRG:$1D04 F0 05 + lda #$60 ; PRG:$1D06 A9 60 + jmp Label_DD0D ; PRG:$1D08 4C 0D DD +Label_DD0B: + lda #$62 ; PRG:$1D0B A9 62 +Label_DD0D: + sta Zp02 ; PRG:$1D0D 85 02 + lda $02C3,y ; PRG:$1D0F B9 C3 02 + sta Zp00 ; PRG:$1D12 85 00 + lda #$21 ; PRG:$1D14 A9 21 + sta Zp03 ; PRG:$1D16 85 03 + txa ; PRG:$1D18 8A + jsr RenderObjectSpriteGrid ; PRG:$1D19 20 08 EA + rts ; PRG:$1D1C 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_DD1D +; +; Global description: +; Performs the decoded enemy operation represented by EnemyUpdateStep_DD1D at PRG $1D1D. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyUpdateStep_DD1D, Zp01. Direct named writes: ObjectPositionFraction, Zp01. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_DD1D: + lda ObjectPositionFraction,x ; PRG:$1D1D B5 57 + clc ; PRG:$1D1F 18 + adc $0501 ; PRG:$1D20 6D 01 05 + sta ObjectPositionFraction,x ; PRG:$1D23 95 57 + lda #$00 ; PRG:$1D25 A9 00 + rol a ; PRG:$1D27 2A + sta Zp01 ; PRG:$1D28 85 01 + lda $02C0,y ; PRG:$1D2A B9 C0 02 + sec ; PRG:$1D2D 38 + sbc Zp01 ; PRG:$1D2E E5 01 + sta Zp01 ; PRG:$1D30 85 01 + rts ; PRG:$1D32 60 + +;------------------------------------------------------------------------------ +; GraphicsUpdateStep_DD33 +; +; Global description: +; Performs the decoded gameplay operation represented by GraphicsUpdateStep_DD33 at PRG $1D33. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp01. Direct named writes: ObjectPositionFraction, Zp01. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsUpdateStep_DD33: + lda ObjectPositionFraction,x ; PRG:$1D33 B5 57 + clc ; PRG:$1D35 18 + adc $0502 ; PRG:$1D36 6D 02 05 + sta ObjectPositionFraction,x ; PRG:$1D39 95 57 + lda #$00 ; PRG:$1D3B A9 00 + adc $02C0,y ; PRG:$1D3D 79 C0 02 + sta Zp01 ; PRG:$1D40 85 01 + rts ; PRG:$1D42 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_DD43 +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_DD43 at PRG $1D43. +; +; Local description: +; Direct callees/tail targets: EnemyUpdateStep_DD85, EnemyUpdateStep_DD93, RenderObjectSpriteGrid. State and scratch fields referenced: EnemyStateArray, EnemyUpdateStep_DD85, EnemyUpdateStep_DD93, Zp00, Zp01, Zp02, Zp03. Direct named writes: Zp00, Zp01, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_DD43: + lda $0210 ; PRG:$1D43 AD 10 02 + cmp $02C0,y ; PRG:$1D46 D9 C0 02 + bcc Label_DD50 ; PRG:$1D49 90 05 + lda #$40 ; PRG:$1D4B A9 40 + jmp Label_DD53 ; PRG:$1D4D 4C 53 DD +Label_DD50: + lda $0506 ; PRG:$1D50 AD 06 05 +Label_DD53: + cmp RandomLfsr0,x ; PRG:$1D53 D5 18 + bcc Label_DD58 ; PRG:$1D55 90 01 + rts ; PRG:$1D57 60 +Label_DD58: + lda EnemyStateArray,x ; PRG:$1D58 B5 A3 + cmp #$00 ; PRG:$1D5A C9 00 + bne Label_DD64 ; PRG:$1D5C D0 06 + jsr EnemyUpdateStep_DD85 ; PRG:$1D5E 20 85 DD + jmp Label_DD67 ; PRG:$1D61 4C 67 DD +Label_DD64: + jsr EnemyUpdateStep_DD93 ; PRG:$1D64 20 93 DD +Label_DD67: + sta Zp00 ; PRG:$1D67 85 00 + and #$02 ; PRG:$1D69 29 02 + bne Label_DD72 ; PRG:$1D6B D0 05 + lda #$58 ; PRG:$1D6D A9 58 + jmp Label_DD74 ; PRG:$1D6F 4C 74 DD +Label_DD72: + lda #$5A ; PRG:$1D72 A9 5A +Label_DD74: + sta Zp02 ; PRG:$1D74 85 02 + lda $02C0,y ; PRG:$1D76 B9 C0 02 + sta Zp01 ; PRG:$1D79 85 01 + lda #$12 ; PRG:$1D7B A9 12 + sta Zp03 ; PRG:$1D7D 85 03 + lda EnemyStateArray,x ; PRG:$1D7F B5 A3 + jsr RenderObjectSpriteGrid ; PRG:$1D81 20 08 EA + rts ; PRG:$1D84 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_DD85 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyUpdateStep_DD85 at PRG $1D85. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyUpdateStep_DD85. Direct named writes: ObjectPositionFraction. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_DD85: + lda ObjectPositionFraction,x ; PRG:$1D85 B5 57 + clc ; PRG:$1D87 18 + adc $0500 ; PRG:$1D88 6D 00 05 + sta ObjectPositionFraction,x ; PRG:$1D8B 95 57 + lda #$00 ; PRG:$1D8D A9 00 + adc $02C3,y ; PRG:$1D8F 79 C3 02 + rts ; PRG:$1D92 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_DD93 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyUpdateStep_DD93 at PRG $1D93. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyUpdateStep_DD93, Zp00. Direct named writes: ObjectPositionFraction, Zp00. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_DD93: + lda ObjectPositionFraction,x ; PRG:$1D93 B5 57 + clc ; PRG:$1D95 18 + adc $0500 ; PRG:$1D96 6D 00 05 + sta ObjectPositionFraction,x ; PRG:$1D99 95 57 + lda #$00 ; PRG:$1D9B A9 00 + rol a ; PRG:$1D9D 2A + sta Zp00 ; PRG:$1D9E 85 00 + lda $02C3,y ; PRG:$1DA0 B9 C3 02 + sec ; PRG:$1DA3 38 + sbc Zp00 ; PRG:$1DA4 E5 00 + rts ; PRG:$1DA6 60 + +;------------------------------------------------------------------------------ +; EnemyStateStep_DDA7 +; +; Global description: +; Performs the decoded graphics operation represented by EnemyStateStep_DDA7 at PRG $1DA7. +; +; Local description: +; Direct callees/tail targets: GraphicsDispatchStep_DDC1, GraphicsRenderStep_DDCA. State and scratch fields referenced: EnemyStateArray, EnemyStateStep_DDA7. Direct named writes: EnemyStateArray. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyStateStep_DDA7: + lda EnemyStateArray,x ; PRG:$1DA7 B5 A3 + cmp #$02 ; PRG:$1DA9 C9 02 + bne Label_DDB7 ; PRG:$1DAB D0 0A + lda #$03 ; PRG:$1DAD A9 03 + sta EnemyStateArray,x ; PRG:$1DAF 95 A3 + ldx #$00 ; PRG:$1DB1 A2 00 + jsr GraphicsDispatchStep_DDC1 ; PRG:$1DB3 20 C1 DD + rts ; PRG:$1DB6 60 +Label_DDB7: + lda #$02 ; PRG:$1DB7 A9 02 + sta EnemyStateArray,x ; PRG:$1DB9 95 A3 + ldx #$01 ; PRG:$1DBB A2 01 + jsr GraphicsRenderStep_DDCA ; PRG:$1DBD 20 CA DD + rts ; PRG:$1DC0 60 + +;------------------------------------------------------------------------------ +; GraphicsDispatchStep_DDC1 +; +; Global description: +; Performs the decoded gameplay operation represented by GraphicsDispatchStep_DDC1 at PRG $1DC1. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsDispatchStep_DDC1: + lda $02C0,y ; PRG:$1DC1 B9 C0 02 + clc ; PRG:$1DC4 18 + adc #$01 ; PRG:$1DC5 69 01 + jmp Label_DDD0 ; PRG:$1DC7 4C D0 DD + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_DDCA +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_DDCA at PRG $1DCA. +; +; Local description: +; Direct callees/tail targets: RenderObjectSpriteGrid. State and scratch fields referenced: Zp00, Zp01, Zp02, Zp03. Direct named writes: Zp00, Zp01, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_DDCA: + lda $02C0,y ; PRG:$1DCA B9 C0 02 + sec ; PRG:$1DCD 38 + sbc #$01 ; PRG:$1DCE E9 01 +Label_DDD0: + sta Zp01 ; PRG:$1DD0 85 01 + lda $02C3,y ; PRG:$1DD2 B9 C3 02 + sta Zp00 ; PRG:$1DD5 85 00 + lda #$62 ; PRG:$1DD7 A9 62 + sta Zp02 ; PRG:$1DD9 85 02 + lda #$21 ; PRG:$1DDB A9 21 + sta Zp03 ; PRG:$1DDD 85 03 + txa ; PRG:$1DDF 8A + jsr RenderObjectSpriteGrid ; PRG:$1DE0 20 08 EA + rts ; PRG:$1DE3 60 + +;------------------------------------------------------------------------------ +; GraphicsStateStep_DDE4 +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsStateStep_DDE4 at PRG $1DE4. +; +; Local description: +; Direct callees/tail targets: GraphicsRenderStep_DE02. State and scratch fields referenced: EnemyStateArray, Zp02. Direct named writes: EnemyStateArray, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsStateStep_DDE4: + lda EnemyStateArray,x ; PRG:$1DE4 B5 A3 + cmp #$00 ; PRG:$1DE6 C9 00 + bne Label_DDF6 ; PRG:$1DE8 D0 0C + lda #$5A ; PRG:$1DEA A9 5A + sta Zp02 ; PRG:$1DEC 85 02 + lda #$01 ; PRG:$1DEE A9 01 + sta EnemyStateArray,x ; PRG:$1DF0 95 A3 + jsr GraphicsRenderStep_DE02 ; PRG:$1DF2 20 02 DE + rts ; PRG:$1DF5 60 +Label_DDF6: + lda #$58 ; PRG:$1DF6 A9 58 + sta Zp02 ; PRG:$1DF8 85 02 + lda #$00 ; PRG:$1DFA A9 00 + sta EnemyStateArray,x ; PRG:$1DFC 95 A3 + jsr GraphicsRenderStep_DE02 ; PRG:$1DFE 20 02 DE + rts ; PRG:$1E01 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_DE02 +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_DE02 at PRG $1E02. +; +; Local description: +; Direct callees/tail targets: RenderObjectSpriteGrid. State and scratch fields referenced: EnemyStateArray, Zp00, Zp01, Zp03. Direct named writes: Zp00, Zp01, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_DE02: + pha ; PRG:$1E02 48 + lda $02C0,y ; PRG:$1E03 B9 C0 02 + sta Zp01 ; PRG:$1E06 85 01 + pla ; PRG:$1E08 68 + beq Label_DE14 ; PRG:$1E09 F0 09 + lda $02C3,y ; PRG:$1E0B B9 C3 02 + sec ; PRG:$1E0E 38 + sbc #$01 ; PRG:$1E0F E9 01 + jmp Label_DE1A ; PRG:$1E11 4C 1A DE +Label_DE14: + lda $02C3,y ; PRG:$1E14 B9 C3 02 + clc ; PRG:$1E17 18 + adc #$01 ; PRG:$1E18 69 01 +Label_DE1A: + sta Zp00 ; PRG:$1E1A 85 00 + lda #$12 ; PRG:$1E1C A9 12 + sta Zp03 ; PRG:$1E1E 85 03 + lda EnemyStateArray,x ; PRG:$1E20 B5 A3 + eor #$01 ; PRG:$1E22 49 01 + jsr RenderObjectSpriteGrid ; PRG:$1E24 20 08 EA + rts ; PRG:$1E27 60 + +;------------------------------------------------------------------------------ +; CollisionStateStep_DE28 +; +; Global description: +; Performs the decoded collision operation represented by CollisionStateStep_DE28 at PRG $1E28. +; +; Local description: +; Direct callees/tail targets: CollisionCollisionStep_DE6C, EnemyComputeStep_E0CC. State and scratch fields referenced: CollisionCollisionStep_DE6C, CollisionStateStep_DE28, EnemyComputeStep_E0CC, EnemyDirectionInitializedArray, EnemyStateArray, Zp05, Zp06, Zp07, Zp08. Direct named writes: EnemyDirectionInitializedArray, EnemyStateArray, Zp08. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionStateStep_DE28: + txa ; PRG:$1E28 8A + pha ; PRG:$1E29 48 + lda EnemyDirectionInitializedArray,x ; PRG:$1E2A B5 A8 + beq Label_DE31 ; PRG:$1E2C F0 03 + jmp Label_DE69 ; PRG:$1E2E 4C 69 DE +Label_DE31: + lda #$01 ; PRG:$1E31 A9 01 + sta EnemyDirectionInitializedArray,x ; PRG:$1E33 95 A8 + lda EnemyStateArray,x ; PRG:$1E35 B5 A3 + sta Zp08 ; PRG:$1E37 85 08 + lda #$00 ; PRG:$1E39 A9 00 + sta EnemyStateArray,x ; PRG:$1E3B 95 A3 + jsr CollisionCollisionStep_DE6C ; PRG:$1E3D 20 6C DE + lda RandomLfsr1 ; PRG:$1E40 A5 19 + cmp Zp05 ; PRG:$1E42 C5 05 + bcc Label_DE57 ; PRG:$1E44 90 11 + lda RandomLfsr2 ; PRG:$1E46 A5 1A + cmp Zp06 ; PRG:$1E48 C5 06 + bcc Label_DE55 ; PRG:$1E4A 90 09 + lda RandomLfsr3 ; PRG:$1E4C A5 1B + cmp Zp07 ; PRG:$1E4E C5 07 + bcs Label_DE59 ; PRG:$1E50 B0 07 + jmp Label_DE5B ; PRG:$1E52 4C 5B DE +Label_DE55: + inc EnemyStateArray,x ; PRG:$1E55 F6 A3 +Label_DE57: + inc EnemyStateArray,x ; PRG:$1E57 F6 A3 +Label_DE59: + inc EnemyStateArray,x ; PRG:$1E59 F6 A3 +Label_DE5B: + lda EnemyStateArray,x ; PRG:$1E5B B5 A3 + ldx Zp08 ; PRG:$1E5D A6 08 + jsr EnemyComputeStep_E0CC ; PRG:$1E5F 20 CC E0 + clc ; PRG:$1E62 18 + adc $02C3,y ; PRG:$1E63 79 C3 02 + sta $02C3,y ; PRG:$1E66 99 C3 02 +Label_DE69: + pla ; PRG:$1E69 68 + tax ; PRG:$1E6A AA + rts ; PRG:$1E6B 60 + +;------------------------------------------------------------------------------ +; CollisionCollisionStep_DE6C +; +; Global description: +; Performs the decoded collision operation represented by CollisionCollisionStep_DE6C at PRG $1E6C. +; +; Local description: +; Direct callees/tail targets: CollisionUpdateStep_DED4, TestPlayerCollisionMode0, PlayerUpdateStep_D55B, PlayerCollisionStep_D562. State and scratch fields referenced: CollisionBottom, CollisionCollisionStep_DE6C, CollisionTop, CollisionUpdateStep_DED4, PlayerCollisionStep_D562, PlayerUpdateStep_D55B, StageOrScreenIndex, Zp00, Zp01, Zp05, Zp06, Zp07. Direct named writes: CollisionBottom, CollisionTop, Zp00, Zp01, Zp05, Zp06, Zp07. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionCollisionStep_DE6C: + lda $02C3,y ; PRG:$1E6C B9 C3 02 + sta Zp00 ; PRG:$1E6F 85 00 + lda $02C0,y ; PRG:$1E71 B9 C0 02 + sta Zp01 ; PRG:$1E74 85 01 + lda #$30 ; PRG:$1E76 A9 30 + sta Zp05 ; PRG:$1E78 85 05 + lda #$40 ; PRG:$1E7A A9 40 + sta Zp06 ; PRG:$1E7C 85 06 + lda #$80 ; PRG:$1E7E A9 80 + sta Zp07 ; PRG:$1E80 85 07 + jsr CollisionUpdateStep_DED4 ; PRG:$1E82 20 D4 DE + lda StageOrScreenIndex ; PRG:$1E85 A5 4A + cmp #$04 ; PRG:$1E87 C9 04 + beq Label_DEA6 ; PRG:$1E89 F0 1B + dec CollisionTop ; PRG:$1E8B C6 3F + dec CollisionBottom ; PRG:$1E8D C6 41 + jsr TestPlayerCollisionMode0 ; PRG:$1E8F 20 93 E8 + inc CollisionTop ; PRG:$1E92 E6 3F + inc CollisionBottom ; PRG:$1E94 E6 41 + cmp #$00 ; PRG:$1E96 C9 00 + beq Label_DEA6 ; PRG:$1E98 F0 0C + jsr PlayerUpdateStep_D55B ; PRG:$1E9A 20 5B D5 + cmp #$00 ; PRG:$1E9D C9 00 + bne Label_DEB9 ; PRG:$1E9F D0 18 + lda $02C0,y ; PRG:$1EA1 B9 C0 02 + sta Zp01 ; PRG:$1EA4 85 01 +Label_DEA6: + jsr PlayerCollisionStep_D562 ; PRG:$1EA6 20 62 D5 + cmp #$00 ; PRG:$1EA9 C9 00 + bne Label_DEBF ; PRG:$1EAB D0 12 + lda $0223 ; PRG:$1EAD AD 23 02 + cmp Zp00 ; PRG:$1EB0 C5 00 + bcc Label_DECB ; PRG:$1EB2 90 17 + beq Label_DEB8 ; PRG:$1EB4 F0 02 + bcs Label_DEC5 ; PRG:$1EB6 B0 0D +Label_DEB8: + rts ; PRG:$1EB8 60 +Label_DEB9: + lda $0503 ; PRG:$1EB9 AD 03 05 + sta Zp05 ; PRG:$1EBC 85 05 + rts ; PRG:$1EBE 60 +Label_DEBF: + lda $0504 ; PRG:$1EBF AD 04 05 + sta Zp06 ; PRG:$1EC2 85 06 + rts ; PRG:$1EC4 60 +Label_DEC5: + lda $0505 ; PRG:$1EC5 AD 05 05 + sta Zp07 ; PRG:$1EC8 85 07 + rts ; PRG:$1ECA 60 +Label_DECB: + sec ; PRG:$1ECB 38 + lda #$FF ; PRG:$1ECC A9 FF + sbc $0505 ; PRG:$1ECE ED 05 05 + sta Zp07 ; PRG:$1ED1 85 07 + rts ; PRG:$1ED3 60 + +;------------------------------------------------------------------------------ +; CollisionUpdateStep_DED4 +; +; Global description: +; Performs the decoded collision operation represented by CollisionUpdateStep_DED4 at PRG $1ED4. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: CollisionLeft, CollisionUpdateStep_DED4. Direct named writes: CollisionLeft. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionUpdateStep_DED4: + txa ; PRG:$1ED4 8A + pha ; PRG:$1ED5 48 + ldx #$03 ; PRG:$1ED6 A2 03 +Label_DED8: + lda $05FC,x ; PRG:$1ED8 BD FC 05 + sta CollisionLeft,x ; PRG:$1EDB 95 3E + dex ; PRG:$1EDD CA + bpl Label_DED8 ; PRG:$1EDE 10 F8 + pla ; PRG:$1EE0 68 + tax ; PRG:$1EE1 AA + rts ; PRG:$1EE2 60 + +;------------------------------------------------------------------------------ +; AudioRenderStep_DEE3 +; +; Global description: +; Performs the decoded audio operation represented by AudioRenderStep_DEE3 at PRG $1EE3. +; +; Local description: +; Direct callees/tail targets: EnemyDispatchStep_DFF9, AudioRenderStep_DF68, EnemyUpdateStep_E055, EnemyDispatchStep_DFC1, RenderObjectSpriteGrid. State and scratch fields referenced: AudioRenderStep_DEE3, AudioRenderStep_DF68, EnemyDirectionArray, EnemyDispatchStep_DFC1, EnemyDispatchStep_DFF9, EnemySpawnDelayArray, EnemySpawnPending, EnemyUpdateStep_E055, StageSecondaryObjectCount, Zp02, Zp03, Zp04. Direct named writes: EnemySpawnDelayArray, EnemySpawnPending, Zp02, Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioRenderStep_DEE3: + lda #$E0 ; PRG:$1EE3 A9 E0 + sta Zp04 ; PRG:$1EE5 85 04 + lda #$00 ; PRG:$1EE7 A9 00 + ldx #$00 ; PRG:$1EE9 A2 00 + ldy #$00 ; PRG:$1EEB A0 00 +Label_DEED: + pha ; PRG:$1EED 48 + txa ; PRG:$1EEE 8A + pha ; PRG:$1EEF 48 + lda $02E0,y ; PRG:$1EF0 B9 E0 02 + cmp #$FF ; PRG:$1EF3 C9 FF + beq Label_DF0B ; PRG:$1EF5 F0 14 + lda EnemySpawnDelayArray,x ; PRG:$1EF7 B5 B9 + bne Label_DF11 ; PRG:$1EF9 D0 16 + lda EnemyDirectionArray,x ; PRG:$1EFB B5 B4 + cmp #$03 ; PRG:$1EFD C9 03 + beq Label_DF1D ; PRG:$1EFF F0 1C + cmp #$01 ; PRG:$1F01 C9 01 + beq Label_DF23 ; PRG:$1F03 F0 1E + jsr EnemyDispatchStep_DFF9 ; PRG:$1F05 20 F9 DF + jmp Label_DF26 ; PRG:$1F08 4C 26 DF +Label_DF0B: + jsr AudioRenderStep_DF68 ; PRG:$1F0B 20 68 DF + jmp Label_DF52 ; PRG:$1F0E 4C 52 DF +Label_DF11: + sec ; PRG:$1F11 38 + sbc #$01 ; PRG:$1F12 E9 01 + sta EnemySpawnDelayArray,x ; PRG:$1F14 95 B9 + bne Label_DF52 ; PRG:$1F16 D0 3A + sta EnemySpawnPending ; PRG:$1F18 85 B3 + jmp Label_DF52 ; PRG:$1F1A 4C 52 DF +Label_DF1D: + jsr EnemyUpdateStep_E055 ; PRG:$1F1D 20 55 E0 + jmp Label_DF26 ; PRG:$1F20 4C 26 DF +Label_DF23: + jsr EnemyDispatchStep_DFC1 ; PRG:$1F23 20 C1 DF +Label_DF26: + and #$04 ; PRG:$1F26 29 04 + beq Label_DF2F ; PRG:$1F28 F0 05 + lda #$58 ; PRG:$1F2A A9 58 + jmp Label_DF31 ; PRG:$1F2C 4C 31 DF +Label_DF2F: + lda #$5A ; PRG:$1F2F A9 5A +Label_DF31: + sta Zp02 ; PRG:$1F31 85 02 + ldy EnemyDirectionArray,x ; PRG:$1F33 B4 B4 + cpy #$03 ; PRG:$1F35 C0 03 + beq Label_DF44 ; PRG:$1F37 F0 0B + lda #$12 ; PRG:$1F39 A9 12 + sta Zp03 ; PRG:$1F3B 85 03 + lda EnemyDirectionArray,x ; PRG:$1F3D B5 B4 + eor #$00 ; PRG:$1F3F 49 00 + jmp Label_DF4F ; PRG:$1F41 4C 4F DF +Label_DF44: + clc ; PRG:$1F44 18 + adc #$08 ; PRG:$1F45 69 08 + sta Zp02 ; PRG:$1F47 85 02 + lda #$21 ; PRG:$1F49 A9 21 + sta Zp03 ; PRG:$1F4B 85 03 + lda #$02 ; PRG:$1F4D A9 02 +Label_DF4F: + jsr RenderObjectSpriteGrid ; PRG:$1F4F 20 08 EA +Label_DF52: + pla ; PRG:$1F52 68 + tax ; PRG:$1F53 AA + pla ; PRG:$1F54 68 + inx ; PRG:$1F55 E8 + cpx StageSecondaryObjectCount ; PRG:$1F56 E4 B0 + beq Label_DF67 ; PRG:$1F58 F0 0D + clc ; PRG:$1F5A 18 + adc #$08 ; PRG:$1F5B 69 08 + tay ; PRG:$1F5D A8 + clc ; PRG:$1F5E 18 + adc #$E0 ; PRG:$1F5F 69 E0 + sta Zp04 ; PRG:$1F61 85 04 + tya ; PRG:$1F63 98 + jmp Label_DEED ; PRG:$1F64 4C ED DE +Label_DF67: + rts ; PRG:$1F67 60 + +;------------------------------------------------------------------------------ +; AudioRenderStep_DF68 +; +; Global description: +; Performs the decoded audio operation represented by AudioRenderStep_DF68 at PRG $1F68. +; +; Local description: +; Direct callees/tail targets: DrawObjectSpriteMode0. State and scratch fields referenced: AudioRenderStep_DF68, EnemyDirectionArray, EnemySpawnDelayArray, EnemySpawnPending, SoundTimerArray, StageObjectMode, StageSecondaryObjectCount, Zp00, Zp01, Zp02, Zp03. Direct named writes: EnemyDirectionArray, EnemySpawnDelayArray, EnemySpawnPending, SharedActionTimer, SoundTimerArray, SpawnedEnemyCount, StageObjectMode, Zp00, Zp01, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioRenderStep_DF68: + lda SharedActionTimer ; PRG:$1F68 A5 36 + bne Label_DFC0 ; PRG:$1F6A D0 54 + lda $0510 ; PRG:$1F6C AD 10 05 + sta SharedActionTimer ; PRG:$1F6F 85 36 + lda EnemySpawnPending ; PRG:$1F71 A5 B3 + bne Label_DFC0 ; PRG:$1F73 D0 4B + lda StageSecondaryObjectCount ; PRG:$1F75 A5 B0 + cmp SpawnedEnemyCount ; PRG:$1F77 C5 B1 + beq Label_DFC0 ; PRG:$1F79 F0 45 + bmi Label_DFC0 ; PRG:$1F7B 30 43 + inc SpawnedEnemyCount ; PRG:$1F7D E6 B1 + lda #$01 ; PRG:$1F7F A9 01 + sta EnemySpawnPending ; PRG:$1F81 85 B3 + lda #$30 ; PRG:$1F83 A9 30 + sta EnemySpawnDelayArray,x ; PRG:$1F85 95 B9 + sta SoundTimerArray ; PRG:$1F87 85 35 + lda #$50 ; PRG:$1F89 A9 50 + sta Zp00 ; PRG:$1F8B 85 00 + lda #$37 ; PRG:$1F8D A9 37 + sta Zp01 ; PRG:$1F8F 85 01 + lda #$58 ; PRG:$1F91 A9 58 + sta Zp02 ; PRG:$1F93 85 02 + lda #$12 ; PRG:$1F95 A9 12 + sta Zp03 ; PRG:$1F97 85 03 + lda $0213 ; PRG:$1F99 AD 13 02 + cmp #$45 ; PRG:$1F9C C9 45 + bcs Label_DFA9 ; PRG:$1F9E B0 09 + lda #$FF ; PRG:$1FA0 A9 FF + sec ; PRG:$1FA2 38 + sbc $0515 ; PRG:$1FA3 ED 15 05 + jmp Label_DFAC ; PRG:$1FA6 4C AC DF +Label_DFA9: + lda $0515 ; PRG:$1FA9 AD 15 05 +Label_DFAC: + cmp RandomLfsr1 ; PRG:$1FAC C5 19 + bcc Label_DFB5 ; PRG:$1FAE 90 05 + lda #$00 ; PRG:$1FB0 A9 00 + jmp Label_DFB7 ; PRG:$1FB2 4C B7 DF +Label_DFB5: + lda #$01 ; PRG:$1FB5 A9 01 +Label_DFB7: + sta EnemyDirectionArray,x ; PRG:$1FB7 95 B4 + lda #$00 ; PRG:$1FB9 A9 00 + sta StageObjectMode ; PRG:$1FBB 85 B2 + jsr DrawObjectSpriteMode0 ; PRG:$1FBD 20 FC E9 +Label_DFC0: + rts ; PRG:$1FC0 60 + +;------------------------------------------------------------------------------ +; EnemyDispatchStep_DFC1 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyDispatchStep_DFC1 at PRG $1FC1. +; +; Local description: +; Direct callees/tail targets: EnemyUpdateStep_E0B3, EnemyUpdateStep_E055, EnemyUpdateStep_DFE4, EnemyUpdateStep_E081. State and scratch fields referenced: EnemyDirectionArray, EnemyDispatchStep_DFC1, EnemyUpdateStep_DFE4, EnemyUpdateStep_E055, EnemyUpdateStep_E081, EnemyUpdateStep_E0B3. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyDispatchStep_DFC1: + lda $02E3,y ; PRG:$1FC1 B9 E3 02 + clc ; PRG:$1FC4 18 + adc #$08 ; PRG:$1FC5 69 08 + cmp #$2C ; PRG:$1FC7 C9 2C + beq Label_DFDA ; PRG:$1FC9 F0 0F + cmp #$14 ; PRG:$1FCB C9 14 + bne Label_DFD6 ; PRG:$1FCD D0 07 + jsr EnemyUpdateStep_E0B3 ; PRG:$1FCF 20 B3 E0 + jsr EnemyUpdateStep_E055 ; PRG:$1FD2 20 55 E0 + rts ; PRG:$1FD5 60 +Label_DFD6: + jsr EnemyUpdateStep_DFE4 ; PRG:$1FD6 20 E4 DF + rts ; PRG:$1FD9 60 +Label_DFDA: + jsr EnemyUpdateStep_E081 ; PRG:$1FDA 20 81 E0 + lda EnemyDirectionArray,x ; PRG:$1FDD B5 B4 + cmp #$03 ; PRG:$1FDF C9 03 + bne EnemyUpdateStep_DFE4 ; PRG:$1FE1 D0 01 + rts ; PRG:$1FE3 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_DFE4 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyUpdateStep_DFE4 at PRG $1FE4. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyUpdateStep_DFE4, Zp00, Zp01, Zp5D. Direct named writes: Zp00, Zp01, Zp5D. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_DFE4: + lda $02E0,y ; PRG:$1FE4 B9 E0 02 + sta Zp01 ; PRG:$1FE7 85 01 + lda Zp5D,x ; PRG:$1FE9 B5 5D + sec ; PRG:$1FEB 38 + sbc $0511 ; PRG:$1FEC ED 11 05 + sta Zp5D,x ; PRG:$1FEF 95 5D + lda $02E3,y ; PRG:$1FF1 B9 E3 02 + sbc #$00 ; PRG:$1FF4 E9 00 + sta Zp00 ; PRG:$1FF6 85 00 + rts ; PRG:$1FF8 60 + +;------------------------------------------------------------------------------ +; EnemyDispatchStep_DFF9 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyDispatchStep_DFF9 at PRG $1FF9. +; +; Local description: +; Direct callees/tail targets: EnemyUpdateStep_E0B3, EnemyUpdateStep_E055, EnemyUpdateStep_E030, EnemyUpdateStep_E045, EnemyUpdateStep_E081. State and scratch fields referenced: EnemyDirectionArray, EnemyDispatchStep_DFF9, EnemyUpdateStep_E030, EnemyUpdateStep_E045, EnemyUpdateStep_E055, EnemyUpdateStep_E081, EnemyUpdateStep_E0B3. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyDispatchStep_DFF9: + lda $02E3,y ; PRG:$1FF9 B9 E3 02 + clc ; PRG:$1FFC 18 + adc #$07 ; PRG:$1FFD 69 07 + cmp #$94 ; PRG:$1FFF C9 94 + beq Label_E022 ; PRG:$2001 F0 1F + cmp #$6B ; PRG:$2003 C9 6B + beq Label_E026 ; PRG:$2005 F0 1F + cmp #$8B ; PRG:$2007 C9 8B + beq Label_E026 ; PRG:$2009 F0 1B + cmp #$A3 ; PRG:$200B C9 A3 + beq Label_E026 ; PRG:$200D F0 17 + cmp #$BB ; PRG:$200F C9 BB + beq Label_E026 ; PRG:$2011 F0 13 + cmp #$D3 ; PRG:$2013 C9 D3 + bne Label_E01E ; PRG:$2015 D0 07 + jsr EnemyUpdateStep_E0B3 ; PRG:$2017 20 B3 E0 + jsr EnemyUpdateStep_E055 ; PRG:$201A 20 55 E0 + rts ; PRG:$201D 60 +Label_E01E: + jsr EnemyUpdateStep_E030 ; PRG:$201E 20 30 E0 + rts ; PRG:$2021 60 +Label_E022: + jsr EnemyUpdateStep_E045 ; PRG:$2022 20 45 E0 + rts ; PRG:$2025 60 +Label_E026: + jsr EnemyUpdateStep_E081 ; PRG:$2026 20 81 E0 + lda EnemyDirectionArray,x ; PRG:$2029 B5 B4 + cmp #$03 ; PRG:$202B C9 03 + bne EnemyUpdateStep_E030 ; PRG:$202D D0 01 + rts ; PRG:$202F 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_E030 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyUpdateStep_E030 at PRG $2030. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyUpdateStep_E030, Zp00, Zp01, Zp5D. Direct named writes: Zp00, Zp01, Zp5D. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_E030: + lda $02E0,y ; PRG:$2030 B9 E0 02 + sta Zp01 ; PRG:$2033 85 01 + lda Zp5D,x ; PRG:$2035 B5 5D + clc ; PRG:$2037 18 + adc $0511 ; PRG:$2038 6D 11 05 + sta Zp5D,x ; PRG:$203B 95 5D + lda #$00 ; PRG:$203D A9 00 + adc $02E3,y ; PRG:$203F 79 E3 02 + sta Zp00 ; PRG:$2042 85 00 + rts ; PRG:$2044 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_E045 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyUpdateStep_E045 at PRG $2045. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyUpdateStep_E045, Zp00, Zp01. Direct named writes: Zp00, Zp01. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_E045: + lda $02E0,y ; PRG:$2045 B9 E0 02 + clc ; PRG:$2048 18 + adc #$08 ; PRG:$2049 69 08 + sta Zp01 ; PRG:$204B 85 01 + lda $02E3,y ; PRG:$204D B9 E3 02 + sta Zp00 ; PRG:$2050 85 00 + inc Zp00 ; PRG:$2052 E6 00 + rts ; PRG:$2054 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_E055 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyUpdateStep_E055 at PRG $2055. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyDirectionArray, EnemyUpdateStep_E055, Zp00, Zp01, Zp5D. Direct named writes: EnemyDirectionArray, SpawnedEnemyCount, Zp00, Zp01, Zp5D. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_E055: + lda $02E0,y ; PRG:$2055 B9 E0 02 + cmp #$E0 ; PRG:$2058 C9 E0 + bcc Label_E069 ; PRG:$205A 90 0D + lda #$FF ; PRG:$205C A9 FF + sta Zp00 ; PRG:$205E 85 00 + sta Zp01 ; PRG:$2060 85 01 + dec SpawnedEnemyCount ; PRG:$2062 C6 B1 + lda #$00 ; PRG:$2064 A9 00 + sta EnemyDirectionArray,x ; PRG:$2066 95 B4 + rts ; PRG:$2068 60 +Label_E069: + lda #$03 ; PRG:$2069 A9 03 + sta EnemyDirectionArray,x ; PRG:$206B 95 B4 + lda $02E3,y ; PRG:$206D B9 E3 02 + sta Zp00 ; PRG:$2070 85 00 + lda Zp5D,x ; PRG:$2072 B5 5D + adc $0512 ; PRG:$2074 6D 12 05 + sta Zp5D,x ; PRG:$2077 95 5D + lda #$00 ; PRG:$2079 A9 00 + adc $02E0,y ; PRG:$207B 79 E0 02 + sta Zp01 ; PRG:$207E 85 01 + rts ; PRG:$2080 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_E081 +; +; Global description: +; Performs the decoded collision operation represented by EnemyUpdateStep_E081 at PRG $2081. +; +; Local description: +; Direct callees/tail targets: CollisionUpdateStep_DED4, PlayerCollisionStep_D562, EnemyUpdateStep_E0B3, EnemyUpdateStep_E055. State and scratch fields referenced: CollisionUpdateStep_DED4, EnemyUpdateStep_E055, EnemyUpdateStep_E081, EnemyUpdateStep_E0B3, PlayerCollisionStep_D562, Zp00, Zp01. Direct named writes: Zp00, Zp01. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_E081: + lda $02E3,y ; PRG:$2081 B9 E3 02 + sta Zp00 ; PRG:$2084 85 00 + lda $02E0,y ; PRG:$2086 B9 E0 02 + sta Zp01 ; PRG:$2089 85 01 + jsr CollisionUpdateStep_DED4 ; PRG:$208B 20 D4 DE + jsr PlayerCollisionStep_D562 ; PRG:$208E 20 62 D5 + beq Label_E099 ; PRG:$2091 F0 06 + lda $0514 ; PRG:$2093 AD 14 05 + jmp Label_E0A7 ; PRG:$2096 4C A7 E0 +Label_E099: + lda $0210 ; PRG:$2099 AD 10 02 + cmp #$47 ; PRG:$209C C9 47 + bcc Label_E0A5 ; PRG:$209E 90 05 + lda #$40 ; PRG:$20A0 A9 40 + jmp Label_E0A7 ; PRG:$20A2 4C A7 E0 +Label_E0A5: + lda #$10 ; PRG:$20A5 A9 10 +Label_E0A7: + cmp RandomLfsr0,x ; PRG:$20A7 D5 18 + bcs Label_E0AC ; PRG:$20A9 B0 01 + rts ; PRG:$20AB 60 +Label_E0AC: + jsr EnemyUpdateStep_E0B3 ; PRG:$20AC 20 B3 E0 + jsr EnemyUpdateStep_E055 ; PRG:$20AF 20 55 E0 + rts ; PRG:$20B2 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_E0B3 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyUpdateStep_E0B3 at PRG $20B3. +; +; Local description: +; Direct callees/tail targets: EnemyComputeStep_E0CC. State and scratch fields referenced: EnemyComputeStep_E0CC, EnemyDirectionArray, EnemyUpdateStep_E0B3, Zp00. Direct named writes: EnemyDirectionArray, Zp00. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_E0B3: + txa ; PRG:$20B3 8A + pha ; PRG:$20B4 48 + lda EnemyDirectionArray,x ; PRG:$20B5 B5 B4 + sta Zp00 ; PRG:$20B7 85 00 + lda #$03 ; PRG:$20B9 A9 03 + sta EnemyDirectionArray,x ; PRG:$20BB 95 B4 + ldx Zp00 ; PRG:$20BD A6 00 + jsr EnemyComputeStep_E0CC ; PRG:$20BF 20 CC E0 + clc ; PRG:$20C2 18 + adc $02E3,y ; PRG:$20C3 79 E3 02 + sta $02E3,y ; PRG:$20C6 99 E3 02 + pla ; PRG:$20C9 68 + tax ; PRG:$20CA AA + rts ; PRG:$20CB 60 + +;------------------------------------------------------------------------------ +; EnemyComputeStep_E0CC +; +; Global description: +; Performs the decoded enemy operation represented by EnemyComputeStep_E0CC at PRG $20CC. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyComputeStep_E0CC. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyComputeStep_E0CC: + cpx #$02 ; PRG:$20CC E0 02 + bpl Label_E0DA ; PRG:$20CE 10 0A + cmp #$02 ; PRG:$20D0 C9 02 + bpl Label_E0D7 ; PRG:$20D2 10 03 + lda #$00 ; PRG:$20D4 A9 00 + rts ; PRG:$20D6 60 +Label_E0D7: + lda #$05 ; PRG:$20D7 A9 05 + rts ; PRG:$20D9 60 +Label_E0DA: + cmp #$02 ; PRG:$20DA C9 02 + bpl Label_E0E1 ; PRG:$20DC 10 03 + lda #$FB ; PRG:$20DE A9 FB + rts ; PRG:$20E0 60 +Label_E0E1: + lda #$00 ; PRG:$20E1 A9 00 + rts ; PRG:$20E3 60 + +;------------------------------------------------------------------------------ +; GraphicsUpdateStep_E0E4 +; +; Global description: +; Performs the decoded gameplay operation represented by GraphicsUpdateStep_E0E4 at PRG $20E4. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. Direct named writes: BonusSpriteActive. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsUpdateStep_E0E4: + lda BonusSpriteActive ; PRG:$20E4 A5 D0 + beq Label_E10C ; PRG:$20E6 F0 24 + ldx $020C ; PRG:$20E8 AE 0C 02 + cpx #$A0 ; PRG:$20EB E0 A0 + beq Label_E100 ; PRG:$20ED F0 11 + inx ; PRG:$20EF E8 + stx $020C ; PRG:$20F0 8E 0C 02 + lda #$F0 ; PRG:$20F3 A9 F0 + sta $020D ; PRG:$20F5 8D 0D 02 + lda #$AB ; PRG:$20F8 A9 AB + sta $020F ; PRG:$20FA 8D 0F 02 + jmp Label_E10C ; PRG:$20FD 4C 0C E1 +Label_E100: + lda #$FF ; PRG:$2100 A9 FF + sta $020C ; PRG:$2102 8D 0C 02 + sta $020F ; PRG:$2105 8D 0F 02 + lda #$00 ; PRG:$2108 A9 00 + sta BonusSpriteActive ; PRG:$210A 85 D0 +Label_E10C: + rts ; PRG:$210C 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_E10D +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_E10D at PRG $210D. +; +; Local description: +; Direct callees/tail targets: DrawSingleObjectSprite. State and scratch fields referenced: PlayerFacing, PlayerPlatformContact, StagePrimaryObjectCount, Zp00, Zp01, Zp02. Direct named writes: PlayerPlatformContact, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_E10D: + ldx PlayerPlatformContact ; PRG:$210D A6 AD + bne Label_E112 ; PRG:$210F D0 01 + rts ; PRG:$2111 60 +Label_E112: + lda $0210 ; PRG:$2112 AD 10 02 + cmp #$8B ; PRG:$2115 C9 8B + bcs Label_E11B ; PRG:$2117 B0 02 + lda #$8C ; PRG:$2119 A9 8C +Label_E11B: + sta Zp01 ; PRG:$211B 85 01 + dex ; PRG:$211D CA + lda #$00 ; PRG:$211E A9 00 + sta PlayerPlatformContact ; PRG:$2120 85 AD + lda $0213 ; PRG:$2122 AD 13 02 + clc ; PRG:$2125 18 + adc StagePrimaryObjectCount,x ; PRG:$2126 75 A0 + sta Zp00 ; PRG:$2128 85 00 + lda $0211 ; PRG:$212A AD 11 02 + ldx PlayerFacing ; PRG:$212D A6 6D + bne Label_E134 ; PRG:$212F D0 03 + sec ; PRG:$2131 38 + sbc #$06 ; PRG:$2132 E9 06 +Label_E134: + sta Zp02 ; PRG:$2134 85 02 + lda PlayerFacing ; PRG:$2136 A5 6D + eor #$01 ; PRG:$2138 49 01 + jsr DrawSingleObjectSprite ; PRG:$213A 20 EE E9 + rts ; PRG:$213D 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_E13E +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_E13E at PRG $213E. +; +; Local description: +; Direct callees/tail targets: DrawPlatformSprite, QueuePlatformVramUpdateA, DrawSingleObjectSprite, QueuePlatformVramUpdateB. State and scratch fields referenced: PlatformTurnaroundFlag, PlayerFacing, PlayerFallThreshold, PlayerGravityFraction, PlayerGravityInteger, PlayerInputDirection, PlayerSpriteVisibilityTimer, PlayerState, PlayerStateReferenceY, PlayerVerticalAcceleration, PlayerVerticalSpeedInteger, Zp00, Zp01, Zp02. Direct named writes: PlatformTurnaroundFlag, PlayerFallThreshold, PlayerGravityFraction, PlayerGravityInteger, PlayerInputDirection, PlayerSpriteVisibilityTimer, PlayerState, PlayerVerticalAcceleration, PlayerVerticalSpeedInteger, PreviousPlatformContact, PreviousPlayerState, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_E13E: + lda CurrentPlatformContact ; PRG:$213E A5 BD + bne Label_E185 ; PRG:$2140 D0 43 + cmp PreviousPlatformContact ; PRG:$2142 C5 BC + beq Label_E184 ; PRG:$2144 F0 3E + sta PreviousPlatformContact ; PRG:$2146 85 BC + lda $0210 ; PRG:$2148 AD 10 02 + cmp #$C2 ; PRG:$214B C9 C2 + bcs Label_E170 ; PRG:$214D B0 21 + lda #$01 ; PRG:$214F A9 01 + sta PreviousPlayerState ; PRG:$2151 85 6C + lda #$03 ; PRG:$2153 A9 03 + sta PlayerState ; PRG:$2155 85 6B + ldx PlayerFacing ; PRG:$2157 A6 6D + inx ; PRG:$2159 E8 + inx ; PRG:$215A E8 + inx ; PRG:$215B E8 + stx PlayerInputDirection ; PRG:$215C 86 54 + lda PlayerGravityInteger ; PRG:$215E A5 87 + cmp #$02 ; PRG:$2160 C9 02 + beq Label_E170 ; PRG:$2162 F0 0C + lda #$01 ; PRG:$2164 A9 01 + sta PlayerGravityInteger ; PRG:$2166 85 87 + lda #$90 ; PRG:$2168 A9 90 + sta PlayerVerticalAcceleration ; PRG:$216A 85 7C + lda #$60 ; PRG:$216C A9 60 + sta PlayerGravityFraction ; PRG:$216E 85 86 +Label_E170: + lda #$02 ; PRG:$2170 A9 02 + sta PlayerVerticalSpeedInteger ; PRG:$2172 85 7A + lda #$00 ; PRG:$2174 A9 00 + sta PlatformTurnaroundFlag ; PRG:$2176 85 BE + sta PlayerSpriteVisibilityTimer ; PRG:$2178 85 38 + lda #$94 ; PRG:$217A A9 94 + sta Zp02 ; PRG:$217C 85 02 + jsr DrawPlatformSprite ; PRG:$217E 20 25 E2 + jsr QueuePlatformVramUpdateA ; PRG:$2181 20 39 E2 +Label_E184: + rts ; PRG:$2184 60 +Label_E185: + cmp PreviousPlatformContact ; PRG:$2185 C5 BC + beq Label_E1BF ; PRG:$2187 F0 36 + sta PreviousPlatformContact ; PRG:$2189 85 BC + lda $0213 ; PRG:$218B AD 13 02 + sta Zp00 ; PRG:$218E 85 00 + lda $0210 ; PRG:$2190 AD 10 02 + sta Zp01 ; PRG:$2193 85 01 + lda #$08 ; PRG:$2195 A9 08 + sta Zp02 ; PRG:$2197 85 02 + lda PlayerFacing ; PRG:$2199 A5 6D + eor #$01 ; PRG:$219B 49 01 + jsr DrawSingleObjectSprite ; PRG:$219D 20 EE E9 + lda #$04 ; PRG:$21A0 A9 04 + sta PlayerState ; PRG:$21A2 85 6B + lda #$FE ; PRG:$21A4 A9 FE + sta PlayerSpriteVisibilityTimer ; PRG:$21A6 85 38 + lda #$01 ; PRG:$21A8 A9 01 + sta PlayerVerticalSpeedInteger ; PRG:$21AA 85 7A + lda #$90 ; PRG:$21AC A9 90 + sta PlayerGravityFraction ; PRG:$21AE 85 86 + lda #$01 ; PRG:$21B0 A9 01 + sta PlayerGravityInteger ; PRG:$21B2 85 87 + lda #$20 ; PRG:$21B4 A9 20 + sta PlayerFallThreshold ; PRG:$21B6 85 7B + lda #$70 ; PRG:$21B8 A9 70 + sta PlayerVerticalAcceleration ; PRG:$21BA 85 7C + jsr QueuePlatformVramUpdateB ; PRG:$21BC 20 44 E2 +Label_E1BF: + lda PlayerSpriteVisibilityTimer ; PRG:$21BF A5 38 + and #$02 ; PRG:$21C1 29 02 + bne Label_E1F0 ; PRG:$21C3 D0 2B + lda PlatformTurnaroundFlag ; PRG:$21C5 A5 BE + bne Label_E1DF ; PRG:$21C7 D0 16 + lda $0210 ; PRG:$21C9 AD 10 02 + cmp #$C8 ; PRG:$21CC C9 C8 + bcc Label_E1D2 ; PRG:$21CE 90 02 + sta PlatformTurnaroundFlag ; PRG:$21D0 85 BE +Label_E1D2: + lda $02C1 ; PRG:$21D2 AD C1 02 + cmp #$A0 ; PRG:$21D5 C9 A0 + beq Label_E1F3 ; PRG:$21D7 F0 1A + clc ; PRG:$21D9 18 + adc #$04 ; PRG:$21DA 69 04 + jmp Label_E1F3 ; PRG:$21DC 4C F3 E1 +Label_E1DF: + lda #$FE ; PRG:$21DF A9 FE + sta PlayerVerticalSpeedInteger ; PRG:$21E1 85 7A + lda $02C1 ; PRG:$21E3 AD C1 02 + cmp #$94 ; PRG:$21E6 C9 94 + beq Label_E1F3 ; PRG:$21E8 F0 09 + sec ; PRG:$21EA 38 + sbc #$04 ; PRG:$21EB E9 04 + jmp Label_E1F3 ; PRG:$21ED 4C F3 E1 +Label_E1F0: + lda $02C1 ; PRG:$21F0 AD C1 02 +Label_E1F3: + sta Zp02 ; PRG:$21F3 85 02 + cmp #$A0 ; PRG:$21F5 C9 A0 + bne DrawPlatformSprite ; PRG:$21F7 D0 2C + lda PlayerFacing ; PRG:$21F9 A5 6D + beq DrawPlatformSprite ; PRG:$21FB F0 28 + lda PlayerStateReferenceY ; PRG:$21FD A5 76 + cmp #$C0 ; PRG:$21FF C9 C0 + bcc DrawPlatformSprite ; PRG:$2201 90 22 + lda ControllerRawState ; PRG:$2203 A5 14 + and #$80 ; PRG:$2205 29 80 + cmp #$80 ; PRG:$2207 C9 80 + beq Label_E213 ; PRG:$2209 F0 08 + lda Controller2RawState ; PRG:$220B A5 16 + and #$80 ; PRG:$220D 29 80 + cmp #$80 ; PRG:$220F C9 80 + bne DrawPlatformSprite ; PRG:$2211 D0 12 +Label_E213: + lda #$D0 ; PRG:$2213 A9 D0 + cmp RandomLfsr1 ; PRG:$2215 C5 19 + bcc DrawPlatformSprite ; PRG:$2217 90 0C + lda #$40 ; PRG:$2219 A9 40 + sta PlayerGravityFraction ; PRG:$221B 85 86 + lda #$02 ; PRG:$221D A9 02 + sta PlayerGravityInteger ; PRG:$221F 85 87 + lda #$60 ; PRG:$2221 A9 60 + sta PlayerVerticalAcceleration ; PRG:$2223 85 7C + +;------------------------------------------------------------------------------ +; DrawPlatformSprite +; +; Global description: +; Performs the decoded graphics operation represented by DrawPlatformSprite at PRG $2225. +; +; Local description: +; Direct callees/tail targets: DrawObjectSpriteMode0. State and scratch fields referenced: Zp00, Zp01, Zp03, Zp04. Direct named writes: Zp00, Zp01, Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DrawPlatformSprite: + lda #$40 ; PRG:$2225 A9 40 + sta Zp00 ; PRG:$2227 85 00 + lda #$CF ; PRG:$2229 A9 CF + sta Zp01 ; PRG:$222B 85 01 + lda #$22 ; PRG:$222D A9 22 + sta Zp03 ; PRG:$222F 85 03 + lda #$C0 ; PRG:$2231 A9 C0 + sta Zp04 ; PRG:$2233 85 04 + jsr DrawObjectSpriteMode0 ; PRG:$2235 20 FC E9 + rts ; PRG:$2238 60 + +;------------------------------------------------------------------------------ +; QueuePlatformVramUpdateA +; +; Global description: +; Performs the decoded graphics operation represented by QueuePlatformVramUpdateA at PRG $2239. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp02, Zp03. Direct named writes: Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +QueuePlatformVramUpdateA: + lda #$C5 ; PRG:$2239 A9 C5 + sta Zp02 ; PRG:$223B 85 02 + lda #$C3 ; PRG:$223D A9 C3 + sta Zp03 ; PRG:$223F 85 03 + jmp Label_E24C ; PRG:$2241 4C 4C E2 + +;------------------------------------------------------------------------------ +; QueuePlatformVramUpdateB +; +; Global description: +; Performs the decoded graphics operation represented by QueuePlatformVramUpdateB at PRG $2244. +; +; Local description: +; Direct callees/tail targets: QueueRectangularVramTransfer. State and scratch fields referenced: Zp00, Zp01, Zp02, Zp03. Direct named writes: Zp00, Zp01, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +QueuePlatformVramUpdateB: + lda #$C8 ; PRG:$2244 A9 C8 + sta Zp02 ; PRG:$2246 85 02 + lda #$C3 ; PRG:$2248 A9 C3 + sta Zp03 ; PRG:$224A 85 03 +Label_E24C: + lda #$48 ; PRG:$224C A9 48 + sta Zp00 ; PRG:$224E 85 00 + lda #$23 ; PRG:$2250 A9 23 + sta Zp01 ; PRG:$2252 85 01 + jsr QueueRectangularVramTransfer ; PRG:$2254 20 CE EF + rts ; PRG:$2257 60 + +;------------------------------------------------------------------------------ +; UpdateMovingPlatforms +; +; Global description: +; Performs the decoded collision operation represented by UpdateMovingPlatforms at PRG $2258. +; +; Local description: +; Direct callees/tail targets: GraphicsRenderStep_E311, GraphicsRenderStep_E2F6, CollisionCollisionStep_E380, CollisionCollisionStep_E3B9, GraphicsStateStep_E2A2, CollisionCollisionStep_E33C. State and scratch fields referenced: CollisionCollisionStep_E33C, CollisionCollisionStep_E380, CollisionCollisionStep_E3B9, EnemyAlternateStateArray, EnemyRouteSelectorArray, EnemyStateArray. Direct named writes: EnemyRouteSelectorArray. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateMovingPlatforms: + ldx #$00 ; PRG:$2258 A2 00 + ldy #$00 ; PRG:$225A A0 00 +Label_E25C: + lda $0293,y ; PRG:$225C B9 93 02 + cmp EnemyStateArray,x ; PRG:$225F D5 A3 + bne Label_E26A ; PRG:$2261 D0 07 + lda #$01 ; PRG:$2263 A9 01 + sta EnemyRouteSelectorArray,x ; PRG:$2265 95 A9 + jmp Label_E272 ; PRG:$2267 4C 72 E2 +Label_E26A: + cmp EnemyAlternateStateArray,x ; PRG:$226A D5 A6 + bne Label_E272 ; PRG:$226C D0 04 + lda #$00 ; PRG:$226E A9 00 + sta EnemyRouteSelectorArray,x ; PRG:$2270 95 A9 +Label_E272: + lda EnemyRouteSelectorArray,x ; PRG:$2272 B5 A9 + cpx #$00 ; PRG:$2274 E0 00 + beq Label_E28E ; PRG:$2276 F0 16 + cpx #$01 ; PRG:$2278 E0 01 + beq Label_E282 ; PRG:$227A F0 06 + jsr GraphicsRenderStep_E311 ; PRG:$227C 20 11 E3 + jmp Label_E285 ; PRG:$227F 4C 85 E2 +Label_E282: + jsr GraphicsRenderStep_E2F6 ; PRG:$2282 20 F6 E2 +Label_E285: + jsr CollisionCollisionStep_E380 ; PRG:$2285 20 80 E3 + jsr CollisionCollisionStep_E3B9 ; PRG:$2288 20 B9 E3 + jmp Label_E294 ; PRG:$228B 4C 94 E2 +Label_E28E: + jsr GraphicsStateStep_E2A2 ; PRG:$228E 20 A2 E2 + jsr CollisionCollisionStep_E33C ; PRG:$2291 20 3C E3 +Label_E294: + cpx #$02 ; PRG:$2294 E0 02 + beq Label_E2A1 ; PRG:$2296 F0 09 + inx ; PRG:$2298 E8 + tya ; PRG:$2299 98 + clc ; PRG:$229A 18 + adc #$10 ; PRG:$229B 69 10 + tay ; PRG:$229D A8 + jmp Label_E25C ; PRG:$229E 4C 5C E2 +Label_E2A1: + rts ; PRG:$22A1 60 + +;------------------------------------------------------------------------------ +; GraphicsStateStep_E2A2 +; +; Global description: +; Performs the decoded player-state operation represented by GraphicsStateStep_E2A2 at PRG $22A2. +; +; Local description: +; Direct callees/tail targets: PlayerUpdateStep_E3DD. State and scratch fields referenced: PlatformDirectionState, PlayerUpdateStep_E3DD, Zp00. Direct named writes: PlatformDirectionState, SharedActionTimer, Zp00. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsStateStep_E2A2: + jsr PlayerUpdateStep_E3DD ; PRG:$22A2 20 DD E3 + clc ; PRG:$22A5 18 + adc $0293 ; PRG:$22A6 6D 93 02 + sta $0293 ; PRG:$22A9 8D 93 02 + sta $0297 ; PRG:$22AC 8D 97 02 + clc ; PRG:$22AF 18 + adc #$30 ; PRG:$22B0 69 30 + sta $029B ; PRG:$22B2 8D 9B 02 + sta $029F ; PRG:$22B5 8D 9F 02 + lda $0294 ; PRG:$22B8 AD 94 02 + cmp #$8B ; PRG:$22BB C9 8B + beq Label_E2C5 ; PRG:$22BD F0 06 + cmp #$92 ; PRG:$22BF C9 92 + bne Label_E2D3 ; PRG:$22C1 D0 10 + lda #$00 ; PRG:$22C3 A9 00 +Label_E2C5: + sta Zp00 ; PRG:$22C5 85 00 + cmp PlatformDirectionState ; PRG:$22C7 C5 AC + beq Label_E2CF ; PRG:$22C9 F0 04 + lda #$43 ; PRG:$22CB A9 43 + sta SharedActionTimer ; PRG:$22CD 85 36 +Label_E2CF: + lda Zp00 ; PRG:$22CF A5 00 + sta PlatformDirectionState ; PRG:$22D1 85 AC +Label_E2D3: + lda SharedActionTimer ; PRG:$22D3 A5 36 + cmp #$00 ; PRG:$22D5 C9 00 + bne Label_E2F5 ; PRG:$22D7 D0 1C + lda PlatformDirectionState ; PRG:$22D9 A5 AC + cmp #$00 ; PRG:$22DB C9 00 + bne Label_E2E8 ; PRG:$22DD D0 09 + lda $0294 ; PRG:$22DF AD 94 02 + sec ; PRG:$22E2 38 + sbc #$01 ; PRG:$22E3 E9 01 + jmp Label_E2EE ; PRG:$22E5 4C EE E2 +Label_E2E8: + lda $0294 ; PRG:$22E8 AD 94 02 + clc ; PRG:$22EB 18 + adc #$01 ; PRG:$22EC 69 01 +Label_E2EE: + sta $0294 ; PRG:$22EE 8D 94 02 + lda #$06 ; PRG:$22F1 A9 06 + sta SharedActionTimer ; PRG:$22F3 85 36 +Label_E2F5: + rts ; PRG:$22F5 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_E2F6 +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_E2F6 at PRG $22F6. +; +; Local description: +; Direct callees/tail targets: PlayerUpdateStep_E3DD, DrawObjectSpriteMode0. State and scratch fields referenced: PlayerUpdateStep_E3DD, Zp00, Zp01, Zp02, Zp03, Zp04. Direct named writes: Zp00, Zp01, Zp02, Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_E2F6: + jsr PlayerUpdateStep_E3DD ; PRG:$22F6 20 DD E3 + clc ; PRG:$22F9 18 + adc $02A3 ; PRG:$22FA 6D A3 02 + sta Zp00 ; PRG:$22FD 85 00 + lda #$B0 ; PRG:$22FF A9 B0 + sta Zp01 ; PRG:$2301 85 01 + sta Zp02 ; PRG:$2303 85 02 + lda #$12 ; PRG:$2305 A9 12 + sta Zp03 ; PRG:$2307 85 03 + lda #$A0 ; PRG:$2309 A9 A0 + sta Zp04 ; PRG:$230B 85 04 + jsr DrawObjectSpriteMode0 ; PRG:$230D 20 FC E9 + rts ; PRG:$2310 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_E311 +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsRenderStep_E311 at PRG $2311. +; +; Local description: +; Direct callees/tail targets: PlayerUpdateStep_E3DD, DrawObjectSpriteMode0. State and scratch fields referenced: PlayerUpdateStep_E3DD, Zp00, Zp01, Zp02, Zp03, Zp04. Direct named writes: Zp00, Zp01, Zp02, Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_E311: + jsr PlayerUpdateStep_E3DD ; PRG:$2311 20 DD E3 + clc ; PRG:$2314 18 + adc $02B3 ; PRG:$2315 6D B3 02 + sta Zp00 ; PRG:$2318 85 00 + lda #$CF ; PRG:$231A A9 CF + sta Zp01 ; PRG:$231C 85 01 + lda #$B0 ; PRG:$231E A9 B0 + sta Zp02 ; PRG:$2320 85 02 + lda #$12 ; PRG:$2322 A9 12 + sta Zp03 ; PRG:$2324 85 03 + lda #$B0 ; PRG:$2326 A9 B0 + sta Zp04 ; PRG:$2328 85 04 + jsr DrawObjectSpriteMode0 ; PRG:$232A 20 FC E9 + lda Zp00 ; PRG:$232D A5 00 + clc ; PRG:$232F 18 + adc #$10 ; PRG:$2330 69 10 + sta Zp00 ; PRG:$2332 85 00 + lda #$B8 ; PRG:$2334 A9 B8 + sta Zp04 ; PRG:$2336 85 04 + jsr DrawObjectSpriteMode0 ; PRG:$2338 20 FC E9 + rts ; PRG:$233B 60 + +;------------------------------------------------------------------------------ +; CollisionCollisionStep_E33C +; +; Global description: +; Performs the decoded collision operation represented by CollisionCollisionStep_E33C at PRG $233C. +; +; Local description: +; Direct callees/tail targets: BuildCollisionBounds, BuildAndTestCollisionBounds. State and scratch fields referenced: CollisionCollisionStep_E33C, CollisionLeft, PlatformEdgeContact, Zp00, Zp01, Zp02, Zp03, Zp05. Direct named writes: Zp00, Zp01, Zp02, Zp03, Zp05. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionCollisionStep_E33C: + lda PlatformEdgeContact ; PRG:$233C A5 AE + bne Label_E371 ; PRG:$233E D0 31 + lda $0297 ; PRG:$2340 AD 97 02 + sta Zp00 ; PRG:$2343 85 00 + lda $0294 ; PRG:$2345 AD 94 02 + sta Zp01 ; PRG:$2348 85 01 + lda #$A1 ; PRG:$234A A9 A1 + sta Zp02 ; PRG:$234C 85 02 + lda #$C3 ; PRG:$234E A9 C3 + sta Zp03 ; PRG:$2350 85 03 + jsr BuildCollisionBounds ; PRG:$2352 20 69 EB + lda $029F ; PRG:$2355 AD 9F 02 + sta Zp00 ; PRG:$2358 85 00 + lda $029C ; PRG:$235A AD 9C 02 + sta Zp01 ; PRG:$235D 85 01 + jsr BuildAndTestCollisionBounds ; PRG:$235F 20 6E EB + stx Zp05 ; PRG:$2362 86 05 + ldx #$07 ; PRG:$2364 A2 07 +Label_E366: + lda CollisionLeft,x ; PRG:$2366 B5 3E + sta $048C,x ; PRG:$2368 9D 8C 04 + dex ; PRG:$236B CA + bpl Label_E366 ; PRG:$236C 10 F8 + ldx Zp05 ; PRG:$236E A6 05 + rts ; PRG:$2370 60 +Label_E371: + stx Zp05 ; PRG:$2371 86 05 + lda #$00 ; PRG:$2373 A9 00 + ldx #$07 ; PRG:$2375 A2 07 +Label_E377: + sta $048C,x ; PRG:$2377 9D 8C 04 + dex ; PRG:$237A CA + bpl Label_E377 ; PRG:$237B 10 FA + ldx Zp05 ; PRG:$237D A6 05 + rts ; PRG:$237F 60 + +;------------------------------------------------------------------------------ +; CollisionCollisionStep_E380 +; +; Global description: +; Performs the decoded collision operation represented by CollisionCollisionStep_E380 at PRG $2380. +; +; Local description: +; Direct callees/tail targets: BuildCollisionBounds, BuildAndTestCollisionBounds. State and scratch fields referenced: CollisionCollisionStep_E380, CollisionLeft, Zp00, Zp01, Zp02, Zp03, Zp05. Direct named writes: Zp00, Zp01, Zp02, Zp03, Zp05. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionCollisionStep_E380: + lda $02A3 ; PRG:$2380 AD A3 02 + sta Zp00 ; PRG:$2383 85 00 + lda $02A0 ; PRG:$2385 AD A0 02 + sta Zp01 ; PRG:$2388 85 01 + lda #$A5 ; PRG:$238A A9 A5 + sta Zp02 ; PRG:$238C 85 02 + lda #$C3 ; PRG:$238E A9 C3 + sta Zp03 ; PRG:$2390 85 03 + jsr BuildCollisionBounds ; PRG:$2392 20 69 EB + lda $02B3 ; PRG:$2395 AD B3 02 + sta Zp00 ; PRG:$2398 85 00 + lda $02B0 ; PRG:$239A AD B0 02 + sta Zp01 ; PRG:$239D 85 01 + lda #$A9 ; PRG:$239F A9 A9 + sta Zp02 ; PRG:$23A1 85 02 + lda #$C3 ; PRG:$23A3 A9 C3 + sta Zp03 ; PRG:$23A5 85 03 + jsr BuildAndTestCollisionBounds ; PRG:$23A7 20 6E EB + stx Zp05 ; PRG:$23AA 86 05 + ldx #$07 ; PRG:$23AC A2 07 +Label_E3AE: + lda CollisionLeft,x ; PRG:$23AE B5 3E + sta $0424,x ; PRG:$23B0 9D 24 04 + dex ; PRG:$23B3 CA + bpl Label_E3AE ; PRG:$23B4 10 F8 + ldx Zp05 ; PRG:$23B6 A6 05 + rts ; PRG:$23B8 60 + +;------------------------------------------------------------------------------ +; CollisionCollisionStep_E3B9 +; +; Global description: +; Performs the decoded collision operation represented by CollisionCollisionStep_E3B9 at PRG $23B9. +; +; Local description: +; Direct callees/tail targets: BuildCollisionBounds. State and scratch fields referenced: CollisionCollisionStep_E3B9, CollisionLeft, Zp00, Zp01, Zp02, Zp03, Zp05. Direct named writes: Zp00, Zp01, Zp02, Zp03, Zp05. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionCollisionStep_E3B9: + lda $02A3 ; PRG:$23B9 AD A3 02 + sta Zp00 ; PRG:$23BC 85 00 + lda $02A0 ; PRG:$23BE AD A0 02 + sta Zp01 ; PRG:$23C1 85 01 + lda #$AD ; PRG:$23C3 A9 AD + sta Zp02 ; PRG:$23C5 85 02 + lda #$C3 ; PRG:$23C7 A9 C3 + sta Zp03 ; PRG:$23C9 85 03 + jsr BuildCollisionBounds ; PRG:$23CB 20 69 EB + stx Zp05 ; PRG:$23CE 86 05 + ldx #$03 ; PRG:$23D0 A2 03 +Label_E3D2: + lda CollisionLeft,x ; PRG:$23D2 B5 3E + sta $04D0,x ; PRG:$23D4 9D D0 04 + dex ; PRG:$23D7 CA + bpl Label_E3D2 ; PRG:$23D8 10 F8 + ldx Zp05 ; PRG:$23DA A6 05 + rts ; PRG:$23DC 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_E3DD +; +; Global description: +; Performs the decoded player-state operation represented by PlayerUpdateStep_E3DD at PRG $23DD. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: PlayerUpdateStep_E3DD, StagePrimaryObjectCount. Direct named writes: ObjectPositionFraction, StagePrimaryObjectCount. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_E3DD: + cmp #$00 ; PRG:$23DD C9 00 + beq Label_E3EE ; PRG:$23DF F0 0D + lda ObjectPositionFraction,x ; PRG:$23E1 B5 57 + clc ; PRG:$23E3 18 + adc #$3A ; PRG:$23E4 69 3A + sta ObjectPositionFraction,x ; PRG:$23E6 95 57 + lda #$00 ; PRG:$23E8 A9 00 + rol a ; PRG:$23EA 2A + jmp Label_E3FF ; PRG:$23EB 4C FF E3 +Label_E3EE: + lda ObjectPositionFraction,x ; PRG:$23EE B5 57 + sec ; PRG:$23F0 38 + sbc #$3A ; PRG:$23F1 E9 3A + sta ObjectPositionFraction,x ; PRG:$23F3 95 57 + lda #$00 ; PRG:$23F5 A9 00 + rol a ; PRG:$23F7 2A + eor #$01 ; PRG:$23F8 49 01 + eor #$FF ; PRG:$23FA 49 FF + clc ; PRG:$23FC 18 + adc #$01 ; PRG:$23FD 69 01 +Label_E3FF: + sta StagePrimaryObjectCount,x ; PRG:$23FF 95 A0 + rts ; PRG:$2401 60 + +;------------------------------------------------------------------------------ +; GraphicsCollisionStep_E402 +; +; Global description: +; Performs the decoded collision operation represented by GraphicsCollisionStep_E402 at PRG $2402. +; +; Local description: +; Direct callees/tail targets: BuildAndTestCollisionBounds, GraphicsUpdateStep_E45F, GraphicsUpdateStep_E47E, QueueCollisionAndVramTasks. State and scratch fields referenced: PlayerInputDirection, Zp00, Zp01, Zp02, Zp03, Zp0D. Direct named writes: PendingLevelObjectTask, Zp00, Zp01, Zp02, Zp03. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsCollisionStep_E402: + lda $0591 ; PRG:$2402 AD 91 05 + beq Label_E408 ; PRG:$2405 F0 01 + rts ; PRG:$2407 60 +Label_E408: + ldx #$00 ; PRG:$2408 A2 00 + sta PendingLevelObjectTask ; PRG:$240A 85 E7 + ldy #$06 ; PRG:$240C A0 06 +Label_E40E: + tya ; PRG:$240E 98 + pha ; PRG:$240F 48 + txa ; PRG:$2410 8A + pha ; PRG:$2411 48 + lda $05E7,x ; PRG:$2412 BD E7 05 + sta Zp00 ; PRG:$2415 85 00 + lda $05E8,x ; PRG:$2417 BD E8 05 + cmp #$40 ; PRG:$241A C9 40 + beq Label_E441 ; PRG:$241C F0 23 + sta Zp01 ; PRG:$241E 85 01 + lda #$BD ; PRG:$2420 A9 BD + sta Zp02 ; PRG:$2422 85 02 + lda #$C2 ; PRG:$2424 A9 C2 + sta Zp03 ; PRG:$2426 85 03 + jsr BuildAndTestCollisionBounds ; PRG:$2428 20 6E EB + cmp #$00 ; PRG:$242B C9 00 + beq Label_E441 ; PRG:$242D F0 12 + lda PreviousInputDirection ; PRG:$242F A5 55 + beq Label_E441 ; PRG:$2431 F0 0E + cmp PlayerInputDirection ; PRG:$2433 C5 54 + bne Label_E441 ; PRG:$2435 D0 0A + cmp #$01 ; PRG:$2437 C9 01 + bne Label_E441 ; PRG:$2439 D0 06 + jsr GraphicsUpdateStep_E45F ; PRG:$243B 20 5F E4 + jsr GraphicsUpdateStep_E47E ; PRG:$243E 20 7E E4 +Label_E441: + pla ; PRG:$2441 68 + tax ; PRG:$2442 AA + pla ; PRG:$2443 68 + tay ; PRG:$2444 A8 + dey ; PRG:$2445 88 + beq Label_E453 ; PRG:$2446 F0 0B + lda Zp0D ; PRG:$2448 A5 0D + cmp #$02 ; PRG:$244A C9 02 + beq Label_E453 ; PRG:$244C F0 05 + inx ; PRG:$244E E8 + inx ; PRG:$244F E8 + jmp Label_E40E ; PRG:$2450 4C 0E E4 +Label_E453: + lda PendingLevelObjectTask ; PRG:$2453 A5 E7 + beq Label_E45E ; PRG:$2455 F0 07 + jsr QueueCollisionAndVramTasks ; PRG:$2457 20 A4 EC + lda #$00 ; PRG:$245A A9 00 + sta PendingLevelObjectTask ; PRG:$245C 85 E7 +Label_E45E: + rts ; PRG:$245E 60 + +;------------------------------------------------------------------------------ +; GraphicsUpdateStep_E45F +; +; Global description: +; Performs the decoded gameplay operation represented by GraphicsUpdateStep_E45F at PRG $245F. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. Direct named writes: VramMetatileBuffer. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsUpdateStep_E45F: + pha ; PRG:$245F 48 + txa ; PRG:$2460 8A + pha ; PRG:$2461 48 + tya ; PRG:$2462 98 + pha ; PRG:$2463 48 + lda #$6D ; PRG:$2464 A9 6D + ldx #$01 ; PRG:$2466 A2 01 + clc ; PRG:$2468 18 +Label_E469: + ldy #$02 ; PRG:$2469 A0 02 +Label_E46B: + sta VramMetatileBuffer,x ; PRG:$246B 95 D1 + adc #$01 ; PRG:$246D 69 01 + inx ; PRG:$246F E8 + dey ; PRG:$2470 88 + bne Label_E46B ; PRG:$2471 D0 F8 + inx ; PRG:$2473 E8 + cpx #$0A ; PRG:$2474 E0 0A + bne Label_E469 ; PRG:$2476 D0 F1 + pla ; PRG:$2478 68 + tay ; PRG:$2479 A8 + pla ; PRG:$247A 68 + tax ; PRG:$247B AA + pla ; PRG:$247C 68 + rts ; PRG:$247D 60 + +;------------------------------------------------------------------------------ +; GraphicsUpdateStep_E47E +; +; Global description: +; Performs the decoded graphics operation represented by GraphicsUpdateStep_E47E at PRG $247E. +; +; Local description: +; Direct callees/tail targets: QueueRectangularVramTransfer, PlayerUpdateStep_ED8E. State and scratch fields referenced: PlayerUpdateStep_ED8E, StageRopeAddressLoArray, Zp00, Zp01, Zp02, Zp03, ZpD2, ZpD3, ZpD4, ZpD5, ZpD6, ZpD7, ZpD8, ZpD9, ZpDC. Direct named writes: LevelObjectProgress, ObjectSoundRequestFlags, PendingLevelObjectTask, StageRopeAddressLoArray, VramMetatileBuffer, Zp00, Zp01, Zp02, Zp03, ZpD2, ZpD3, ZpD4, ZpD5, ZpD6, ZpD7, ZpD8. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsUpdateStep_E47E: + lda #$33 ; PRG:$247E A9 33 + sta VramMetatileBuffer ; PRG:$2480 85 D1 + lda #$24 ; PRG:$2482 A9 24 + sta ZpD4 ; PRG:$2484 85 D4 + lda #$65 ; PRG:$2486 A9 65 + sta ZpD7 ; PRG:$2488 85 D7 + lda StageRopeAddressLoArray,x ; PRG:$248A B5 DB + sec ; PRG:$248C 38 + sbc #$20 ; PRG:$248D E9 20 + sta StageRopeAddressLoArray,x ; PRG:$248F 95 DB + sta Zp00 ; PRG:$2491 85 00 + lda ZpDC,x ; PRG:$2493 B5 DC + sbc #$00 ; PRG:$2495 E9 00 + sta ZpDC,x ; PRG:$2497 95 DC + sta Zp01 ; PRG:$2499 85 01 + lda $05E8,x ; PRG:$249B BD E8 05 + sec ; PRG:$249E 38 + sbc #$08 ; PRG:$249F E9 08 + sta $05E8,x ; PRG:$24A1 9D E8 05 + pha ; PRG:$24A4 48 + cmp #$40 ; PRG:$24A5 C9 40 + beq Label_E4B8 ; PRG:$24A7 F0 0F + cmp #$48 ; PRG:$24A9 C9 48 + beq Label_E4CF ; PRG:$24AB F0 22 + cmp #$B0 ; PRG:$24AD C9 B0 + bne Label_E4D9 ; PRG:$24AF D0 28 + lda #$66 ; PRG:$24B1 A9 66 + sta ZpD7 ; PRG:$24B3 85 D7 + jmp Label_E4D9 ; PRG:$24B5 4C D9 E4 +Label_E4B8: + lda #$69 ; PRG:$24B8 A9 69 + sta ZpD2 ; PRG:$24BA 85 D2 + sta ZpD8 ; PRG:$24BC 85 D8 + lda #$6A ; PRG:$24BE A9 6A + sta ZpD3 ; PRG:$24C0 85 D3 + sta ZpD9 ; PRG:$24C2 85 D9 + lda #$8A ; PRG:$24C4 A9 8A + sta ZpD5 ; PRG:$24C6 85 D5 + lda #$FF ; PRG:$24C8 A9 FF + sta ZpD6 ; PRG:$24CA 85 D6 + jmp Label_E4D9 ; PRG:$24CC 4C D9 E4 +Label_E4CF: + lda #$6A ; PRG:$24CF A9 6A + sta ZpD2 ; PRG:$24D1 85 D2 + sta ZpD8 ; PRG:$24D3 85 D8 + lda #$6F ; PRG:$24D5 A9 6F + sta ZpD5 ; PRG:$24D7 85 D5 +Label_E4D9: + lda #$D1 ; PRG:$24D9 A9 D1 + sta Zp02 ; PRG:$24DB 85 02 + lda #$00 ; PRG:$24DD A9 00 + sta Zp03 ; PRG:$24DF 85 03 + jsr QueueRectangularVramTransfer ; PRG:$24E1 20 CE EF + pla ; PRG:$24E4 68 + cmp #$40 ; PRG:$24E5 C9 40 + bne Label_E4F4 ; PRG:$24E7 D0 0B + lda #$04 ; PRG:$24E9 A9 04 + sta ObjectSoundRequestFlags ; PRG:$24EB 85 FE + inc PendingLevelObjectTask ; PRG:$24ED E6 E7 + inc LevelObjectProgress ; PRG:$24EF E6 53 + jsr PlayerUpdateStep_ED8E ; PRG:$24F1 20 8E ED +Label_E4F4: + rts ; PRG:$24F4 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_E4F5 +; +; Global description: +; Performs the decoded collision operation represented by GraphicsRenderStep_E4F5 at PRG $24F5. +; +; Local description: +; Direct callees/tail targets: ClassifyCoordinateAgainstRanges, StageUpdateStep_E5C1, EnemyUpdateStep_E5DD, DrawObjectSpriteMode0. State and scratch fields referenced: EnemyUpdateStep_E5DD, StageCollisionRecordPointerHighBytes, StageCollisionRecordPointerTable, StageObjectLeftBoundaryTable, StageObjectReferenceYTable, StageObjectRightBoundaryTable, StagePrimaryObjectCount, StageSecondaryObjectIndex, StageUpdateStep_E5C1, Zp00, Zp01, Zp02, Zp03, Zp04, Zp05, Zp06, Zp07. Direct named writes: ObjectMotionStep, StageSecondaryObjectIndex, Zp00, Zp01, Zp02, Zp03, Zp04, Zp05, Zp06, Zp07. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_E4F5: + lda #$40 ; PRG:$24F5 A9 40 + sta Zp04 ; PRG:$24F7 85 04 + ldx #$00 ; PRG:$24F9 A2 00 + ldy #$00 ; PRG:$24FB A0 00 + stx Zp05 ; PRG:$24FD 86 05 + stx Zp06 ; PRG:$24FF 86 06 +Label_E501: + txa ; PRG:$2501 8A + asl a ; PRG:$2502 0A + tax ; PRG:$2503 AA + lda StageCollisionRecordPointerTable,x ; PRG:$2504 BD 15 C2 + sta Zp02 ; PRG:$2507 85 02 + lda StageCollisionRecordPointerHighBytes,x ; PRG:$2509 BD 16 C2 + sta Zp03 ; PRG:$250C 85 03 + lda $0240,y ; PRG:$250E B9 40 02 + cmp #$FF ; PRG:$2511 C9 FF + bne Label_E518 ; PRG:$2513 D0 03 + jmp Label_E5A0 ; PRG:$2515 4C A0 E5 +Label_E518: + ldx Zp06 ; PRG:$2518 A6 06 + cmp StageObjectReferenceYTable,x ; PRG:$251A DD F9 C1 + beq Label_E538 ; PRG:$251D F0 19 + bcs Label_E535 ; PRG:$251F B0 14 + lda StageObjectReferenceYTable,x ; PRG:$2521 BD F9 C1 + sec ; PRG:$2524 38 + sbc #$12 ; PRG:$2525 E9 12 + cmp $0240,y ; PRG:$2527 D9 40 02 + bcc Label_E52F ; PRG:$252A 90 03 + jmp Label_E538 ; PRG:$252C 4C 38 E5 +Label_E52F: + lda $0240,y ; PRG:$252F B9 40 02 + jmp Label_E538 ; PRG:$2532 4C 38 E5 +Label_E535: + lda StageObjectReferenceYTable,x ; PRG:$2535 BD F9 C1 +Label_E538: + sta Zp01 ; PRG:$2538 85 01 + lda $0243,y ; PRG:$253A B9 43 02 + sta Zp00 ; PRG:$253D 85 00 + jsr ClassifyCoordinateAgainstRanges ; PRG:$253F 20 40 E8 + sta Zp07 ; PRG:$2542 85 07 + cmp #$02 ; PRG:$2544 C9 02 + bne Label_E558 ; PRG:$2546 D0 10 + lda Zp00 ; PRG:$2548 A5 00 + cmp StageObjectLeftBoundaryTable,x ; PRG:$254A DD FA C1 + beq Label_E554 ; PRG:$254D F0 05 + cmp StageObjectRightBoundaryTable,x ; PRG:$254F DD FB C1 + bne Label_E558 ; PRG:$2552 D0 04 +Label_E554: + lda #$03 ; PRG:$2554 A9 03 + sta Zp07 ; PRG:$2556 85 07 +Label_E558: + lda Zp05 ; PRG:$2558 A5 05 + tax ; PRG:$255A AA + beq Label_E571 ; PRG:$255B F0 14 + cpx #$02 ; PRG:$255D E0 02 + bpl Label_E567 ; PRG:$255F 10 06 + lda DifficultyOrRoundIndex ; PRG:$2561 A5 4B + cmp #$05 ; PRG:$2563 C9 05 + bpl Label_E571 ; PRG:$2565 10 0A +Label_E567: + lda $0540 ; PRG:$2567 AD 40 05 + sta ObjectMotionStep ; PRG:$256A 85 A1 + lda #$00 ; PRG:$256C A9 00 + jmp Label_E577 ; PRG:$256E 4C 77 E5 +Label_E571: + lda #$EF ; PRG:$2571 A9 EF + sta ObjectMotionStep ; PRG:$2573 85 A1 + lda #$01 ; PRG:$2575 A9 01 +Label_E577: + sta StageSecondaryObjectIndex ; PRG:$2577 85 A2 + lda Zp07 ; PRG:$2579 A5 07 + cmp #$02 ; PRG:$257B C9 02 + bmi Label_E587 ; PRG:$257D 30 08 + jsr StageUpdateStep_E5C1 ; PRG:$257F 20 C1 E5 + sta Zp01 ; PRG:$2582 85 01 + jmp Label_E58C ; PRG:$2584 4C 8C E5 +Label_E587: + jsr EnemyUpdateStep_E5DD ; PRG:$2587 20 DD E5 + sta Zp00 ; PRG:$258A 85 00 +Label_E58C: + and #$04 ; PRG:$258C 29 04 + bne Label_E595 ; PRG:$258E D0 05 + lda #$74 ; PRG:$2590 A9 74 + jmp Label_E597 ; PRG:$2592 4C 97 E5 +Label_E595: + lda #$78 ; PRG:$2595 A9 78 +Label_E597: + sta Zp02 ; PRG:$2597 85 02 + lda #$22 ; PRG:$2599 A9 22 + sta Zp03 ; PRG:$259B 85 03 + jsr DrawObjectSpriteMode0 ; PRG:$259D 20 FC E9 +Label_E5A0: + ldx Zp05 ; PRG:$25A0 A6 05 + inx ; PRG:$25A2 E8 + cpx StagePrimaryObjectCount ; PRG:$25A3 E4 A0 + beq Label_E5C0 ; PRG:$25A5 F0 19 + stx Zp05 ; PRG:$25A7 86 05 + inc Zp06 ; PRG:$25A9 E6 06 + inc Zp06 ; PRG:$25AB E6 06 + inc Zp06 ; PRG:$25AD E6 06 + tya ; PRG:$25AF 98 + clc ; PRG:$25B0 18 + adc #$10 ; PRG:$25B1 69 10 + tay ; PRG:$25B3 A8 + clc ; PRG:$25B4 18 + lda Zp04 ; PRG:$25B5 A5 04 + adc #$10 ; PRG:$25B7 69 10 + sta Zp04 ; PRG:$25B9 85 04 + ldx Zp05 ; PRG:$25BB A6 05 + jmp Label_E501 ; PRG:$25BD 4C 01 E5 +Label_E5C0: + rts ; PRG:$25C0 60 + +;------------------------------------------------------------------------------ +; StageUpdateStep_E5C1 +; +; Global description: +; Performs the decoded stage/game-state operation represented by StageUpdateStep_E5C1 at PRG $25C1. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: StageSecondaryObjectIndex, StageUpdateStep_E5C1, Zp01. Direct named writes: ObjectPositionFraction. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +StageUpdateStep_E5C1: + cmp #$02 ; PRG:$25C1 C9 02 + beq Label_E5D1 ; PRG:$25C3 F0 0C + lda ObjectPositionFraction,x ; PRG:$25C5 B5 57 + sec ; PRG:$25C7 38 + sbc ObjectMotionStep ; PRG:$25C8 E5 A1 + sta ObjectPositionFraction,x ; PRG:$25CA 95 57 + lda Zp01 ; PRG:$25CC A5 01 + sbc StageSecondaryObjectIndex ; PRG:$25CE E5 A2 + rts ; PRG:$25D0 60 +Label_E5D1: + lda ObjectPositionFraction,x ; PRG:$25D1 B5 57 + clc ; PRG:$25D3 18 + adc ObjectMotionStep ; PRG:$25D4 65 A1 + sta ObjectPositionFraction,x ; PRG:$25D6 95 57 + lda Zp01 ; PRG:$25D8 A5 01 + adc StageSecondaryObjectIndex ; PRG:$25DA 65 A2 + rts ; PRG:$25DC 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_E5DD +; +; Global description: +; Performs the decoded enemy operation represented by EnemyUpdateStep_E5DD at PRG $25DD. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyUpdateStep_E5DD, StageSecondaryObjectIndex, Zp00. Direct named writes: ObjectPositionFraction. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_E5DD: + cmp #$00 ; PRG:$25DD C9 00 + bne Label_E5ED ; PRG:$25DF D0 0C + lda ObjectPositionFraction,x ; PRG:$25E1 B5 57 + clc ; PRG:$25E3 18 + adc ObjectMotionStep ; PRG:$25E4 65 A1 + sta ObjectPositionFraction,x ; PRG:$25E6 95 57 + lda Zp00 ; PRG:$25E8 A5 00 + adc StageSecondaryObjectIndex ; PRG:$25EA 65 A2 + rts ; PRG:$25EC 60 +Label_E5ED: + lda ObjectPositionFraction,x ; PRG:$25ED B5 57 + sec ; PRG:$25EF 38 + sbc ObjectMotionStep ; PRG:$25F0 E5 A1 + sta ObjectPositionFraction,x ; PRG:$25F2 95 57 + lda Zp00 ; PRG:$25F4 A5 00 + sbc StageSecondaryObjectIndex ; PRG:$25F6 E5 A2 + rts ; PRG:$25F8 60 + +;------------------------------------------------------------------------------ +; GraphicsRenderStep_E5F9 +; +; Global description: +; Performs the decoded audio operation represented by GraphicsRenderStep_E5F9 at PRG $25F9. +; +; Local description: +; Direct callees/tail targets: ClassifyCoordinateAgainstRanges, EnemyUpdateStep_E7D9, EnemyUpdateStep_E67C, AudioUpdateStep_E6E3, RenderObjectSpriteGrid, AudioUpdateStep_E71D, AudioRenderStep_E740, AudioUpdateStep_E762. State and scratch fields referenced: AudioRenderStep_E740, AudioUpdateStep_E6E3, AudioUpdateStep_E71D, AudioUpdateStep_E762, EnemyDirectionArray, EnemyUpdateStep_E67C, EnemyUpdateStep_E7D9, StageObjectMode, StageObjectOamOffset, StageSecondaryObjectCount, Zp00, Zp01, Zp02, Zp03, Zp04, Zp05, Zp06. Direct named writes: Zp00, Zp01, Zp02, Zp03, Zp04, Zp05, Zp06. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GraphicsRenderStep_E5F9: + ldx #$00 ; PRG:$25F9 A2 00 + ldy StageObjectOamOffset ; PRG:$25FB A4 CF +Label_E5FD: + sty Zp05 ; PRG:$25FD 84 05 + lda $0240,y ; PRG:$25FF B9 40 02 + cmp #$FF ; PRG:$2602 C9 FF + beq Label_E66D ; PRG:$2604 F0 67 + cmp $0575 ; PRG:$2606 CD 75 05 + bcc Label_E676 ; PRG:$2609 90 6B + sta Zp01 ; PRG:$260B 85 01 + iny ; PRG:$260D C8 + iny ; PRG:$260E C8 + iny ; PRG:$260F C8 + lda $0240,y ; PRG:$2610 B9 40 02 + cmp #$01 ; PRG:$2613 C9 01 + bcs Label_E61C ; PRG:$2615 B0 05 + lda #$0F ; PRG:$2617 A9 0F + jmp Label_E64F ; PRG:$2619 4C 4F E6 +Label_E61C: + sta Zp00 ; PRG:$261C 85 00 + tya ; PRG:$261E 98 + pha ; PRG:$261F 48 + lda $0522,x ; PRG:$2620 BD 22 05 + asl a ; PRG:$2623 0A + tay ; PRG:$2624 A8 + lda (EnemyDirectionArray),y ; PRG:$2625 B1 B4 + sta Zp02 ; PRG:$2627 85 02 + iny ; PRG:$2629 C8 + lda (EnemyDirectionArray),y ; PRG:$262A B1 B4 + sta Zp03 ; PRG:$262C 85 03 + jsr ClassifyCoordinateAgainstRanges ; PRG:$262E 20 40 E8 + sta Zp06 ; PRG:$2631 85 06 + lda StageObjectMode ; PRG:$2633 A5 B2 + beq Label_E63A ; PRG:$2635 F0 03 + jsr EnemyUpdateStep_E7D9 ; PRG:$2637 20 D9 E7 +Label_E63A: + pla ; PRG:$263A 68 + tay ; PRG:$263B A8 + lda Zp06 ; PRG:$263C A5 06 + cmp #$08 ; PRG:$263E C9 08 + beq Label_E64F ; PRG:$2640 F0 0D + cmp #$02 ; PRG:$2642 C9 02 + beq Label_E64C ; PRG:$2644 F0 06 + jsr EnemyUpdateStep_E67C ; PRG:$2646 20 7C E6 + jmp Label_E64F ; PRG:$2649 4C 4F E6 +Label_E64C: + jsr AudioUpdateStep_E6E3 ; PRG:$264C 20 E3 E6 +Label_E64F: + pha ; PRG:$264F 48 + lda #$22 ; PRG:$2650 A9 22 + sta Zp03 ; PRG:$2652 85 03 + lda #$40 ; PRG:$2654 A9 40 + clc ; PRG:$2656 18 + adc Zp05 ; PRG:$2657 65 05 + sta Zp04 ; PRG:$2659 85 04 + pla ; PRG:$265B 68 + and #$07 ; PRG:$265C 29 07 + jsr RenderObjectSpriteGrid ; PRG:$265E 20 08 EA +Label_E661: + lda Zp05 ; PRG:$2661 A5 05 + clc ; PRG:$2663 18 + adc #$10 ; PRG:$2664 69 10 + tay ; PRG:$2666 A8 + inx ; PRG:$2667 E8 + cpx StageSecondaryObjectCount ; PRG:$2668 E4 B0 + bne Label_E5FD ; PRG:$266A D0 91 + rts ; PRG:$266C 60 +Label_E66D: + jsr AudioUpdateStep_E71D ; PRG:$266D 20 1D E7 + jsr AudioRenderStep_E740 ; PRG:$2670 20 40 E7 + jmp Label_E661 ; PRG:$2673 4C 61 E6 +Label_E676: + jsr AudioUpdateStep_E762 ; PRG:$2676 20 62 E7 + jmp Label_E64F ; PRG:$2679 4C 4F E6 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_E67C +; +; Global description: +; Performs the decoded audio operation represented by EnemyUpdateStep_E67C at PRG $267C. +; +; Local description: +; Direct callees/tail targets: AudioUpdateStep_E6AF, AudioUpdateStep_E6A1. State and scratch fields referenced: AudioUpdateStep_E6A1, AudioUpdateStep_E6AF, EnemyUpdateStep_E67C, Zp00, Zp02. Direct named writes: Zp00, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_E67C: + pha ; PRG:$267C 48 + cmp #$00 ; PRG:$267D C9 00 + beq Label_E687 ; PRG:$267F F0 06 + jsr AudioUpdateStep_E6AF ; PRG:$2681 20 AF E6 + jmp Label_E68A ; PRG:$2684 4C 8A E6 +Label_E687: + jsr AudioUpdateStep_E6A1 ; PRG:$2687 20 A1 E6 +Label_E68A: + sta Zp00 ; PRG:$268A 85 00 + and $0576 ; PRG:$268C 2D 76 05 + beq Label_E697 ; PRG:$268F F0 06 + lda $0570 ; PRG:$2691 AD 70 05 + jmp Label_E69A ; PRG:$2694 4C 9A E6 +Label_E697: + lda $0571 ; PRG:$2697 AD 71 05 +Label_E69A: + sta Zp02 ; PRG:$269A 85 02 + dey ; PRG:$269C 88 + dey ; PRG:$269D 88 + dey ; PRG:$269E 88 + pla ; PRG:$269F 68 + rts ; PRG:$26A0 60 + +;------------------------------------------------------------------------------ +; AudioUpdateStep_E6A1 +; +; Global description: +; Performs the decoded audio operation represented by AudioUpdateStep_E6A1 at PRG $26A1. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioUpdateStep_E6A1, Zp5D. Direct named writes: Zp5D. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioUpdateStep_E6A1: + lda Zp5D,x ; PRG:$26A1 B5 5D + clc ; PRG:$26A3 18 + adc $0521 ; PRG:$26A4 6D 21 05 + sta Zp5D,x ; PRG:$26A7 95 5D + lda $0240,y ; PRG:$26A9 B9 40 02 + adc #$00 ; PRG:$26AC 69 00 + rts ; PRG:$26AE 60 + +;------------------------------------------------------------------------------ +; AudioUpdateStep_E6AF +; +; Global description: +; Performs the decoded audio operation represented by AudioUpdateStep_E6AF at PRG $26AF. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioUpdateStep_E6AF, SoundRequestFlags, StageOrScreenIndex, Zp5D. Direct named writes: BonusSpriteActive, SoundRequestFlags, Zp5D. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioUpdateStep_E6AF: + lda StageOrScreenIndex ; PRG:$26AF A5 4A + cmp #$02 ; PRG:$26B1 C9 02 + bne Label_E6D5 ; PRG:$26B3 D0 20 + lda $0240,y ; PRG:$26B5 B9 40 02 + cmp $0577 ; PRG:$26B8 CD 77 05 + bne Label_E6D5 ; PRG:$26BB D0 18 + pha ; PRG:$26BD 48 + lda #$04 ; PRG:$26BE A9 04 + sta SoundRequestFlags ; PRG:$26C0 85 FC + pla ; PRG:$26C2 68 + cpx $0530 ; PRG:$26C3 EC 30 05 + bne Label_E6D5 ; PRG:$26C6 D0 0D + lda #$01 ; PRG:$26C8 A9 01 + sta BonusSpriteActive ; PRG:$26CA 85 D0 + lda $023D,y ; PRG:$26CC B9 3D 02 + clc ; PRG:$26CF 18 + adc #$08 ; PRG:$26D0 69 08 + sta $020C ; PRG:$26D2 8D 0C 02 +Label_E6D5: + lda Zp5D,x ; PRG:$26D5 B5 5D + sec ; PRG:$26D7 38 + sbc $0521 ; PRG:$26D8 ED 21 05 + sta Zp5D,x ; PRG:$26DB 95 5D + lda $0240,y ; PRG:$26DD B9 40 02 + sbc #$00 ; PRG:$26E0 E9 00 + rts ; PRG:$26E2 60 + +;------------------------------------------------------------------------------ +; AudioUpdateStep_E6E3 +; +; Global description: +; Performs the decoded audio operation represented by AudioUpdateStep_E6E3 at PRG $26E3. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioUpdateStep_E6E3, SoundRequestFlags, StageObjectMode, StageOrScreenIndex, Zp01, Zp02, Zp5D. Direct named writes: SoundRequestFlags, Zp01, Zp02, Zp5D. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioUpdateStep_E6E3: + dey ; PRG:$26E3 88 + dey ; PRG:$26E4 88 + dey ; PRG:$26E5 88 + lda StageOrScreenIndex ; PRG:$26E6 A5 4A + cmp #$02 ; PRG:$26E8 C9 02 + bne Label_E6F2 ; PRG:$26EA D0 06 + lda SoundRequestFlags ; PRG:$26EC A5 FC + ora #$40 ; PRG:$26EE 09 40 + sta SoundRequestFlags ; PRG:$26F0 85 FC +Label_E6F2: + lda Zp5D,x ; PRG:$26F2 B5 5D + clc ; PRG:$26F4 18 + adc $0521 ; PRG:$26F5 6D 21 05 + sta Zp5D,x ; PRG:$26F8 95 5D + lda $0240,y ; PRG:$26FA B9 40 02 + adc #$00 ; PRG:$26FD 69 00 + sta Zp01 ; PRG:$26FF 85 01 + lda StageObjectMode ; PRG:$2701 A5 B2 + bne Label_E70B ; PRG:$2703 D0 06 + lda $0572 ; PRG:$2705 AD 72 05 + jmp Label_E718 ; PRG:$2708 4C 18 E7 +Label_E70B: + lda Zp01 ; PRG:$270B A5 01 + and #$04 ; PRG:$270D 29 04 + beq Label_E716 ; PRG:$270F F0 05 + lda #$7C ; PRG:$2711 A9 7C + jmp Label_E718 ; PRG:$2713 4C 18 E7 +Label_E716: + lda #$80 ; PRG:$2716 A9 80 +Label_E718: + sta Zp02 ; PRG:$2718 85 02 + lda #$00 ; PRG:$271A A9 00 + rts ; PRG:$271C 60 + +;------------------------------------------------------------------------------ +; AudioUpdateStep_E71D +; +; Global description: +; Performs the decoded audio operation represented by AudioUpdateStep_E71D at PRG $271D. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioUpdateStep_E71D, SoundTimerArray, StageObjectAnimationMode, StageObjectMode, Zp00, Zp01, Zp02. Direct named writes: SoundTimerArray, StageObjectAnimationMode, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioUpdateStep_E71D: + lda StageObjectAnimationMode ; PRG:$271D A5 CE + bne Label_E761 ; PRG:$271F D0 40 + lda SoundTimerArray ; PRG:$2721 A5 35 + bne Label_E761 ; PRG:$2723 D0 3C + lda $0520 ; PRG:$2725 AD 20 05 + sta SoundTimerArray ; PRG:$2728 85 35 + lda StageObjectMode ; PRG:$272A A5 B2 + sta StageObjectAnimationMode ; PRG:$272C 85 CE + lda $0573 ; PRG:$272E AD 73 05 + sta Zp00 ; PRG:$2731 85 00 + lda $0574 ; PRG:$2733 AD 74 05 + sta Zp01 ; PRG:$2736 85 01 + lda $0570 ; PRG:$2738 AD 70 05 + sta Zp02 ; PRG:$273B 85 02 + jmp Label_E74E ; PRG:$273D 4C 4E E7 + +;------------------------------------------------------------------------------ +; AudioRenderStep_E740 +; +; Global description: +; Performs the decoded audio operation represented by AudioRenderStep_E740 at PRG $2740. +; +; Local description: +; Direct callees/tail targets: DrawObjectSpriteMode0. State and scratch fields referenced: AudioRenderStep_E740, StageObjectMode, Zp00, Zp01, Zp03, Zp04. Direct named writes: SpawnedEnemyCount, SpecialObjectX, Zp00, Zp01, Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioRenderStep_E740: + lda StageObjectMode ; PRG:$2740 A5 B2 + beq Label_E761 ; PRG:$2742 F0 1D + lda SpecialObjectX ; PRG:$2744 A5 C4 + beq Label_E761 ; PRG:$2746 F0 19 + sta Zp00 ; PRG:$2748 85 00 + lda #$48 ; PRG:$274A A9 48 + sta Zp01 ; PRG:$274C 85 01 +Label_E74E: + lda #$22 ; PRG:$274E A9 22 + sta Zp03 ; PRG:$2750 85 03 + tya ; PRG:$2752 98 + clc ; PRG:$2753 18 + adc #$40 ; PRG:$2754 69 40 + sta Zp04 ; PRG:$2756 85 04 + lda #$00 ; PRG:$2758 A9 00 + sta SpecialObjectX ; PRG:$275A 85 C4 + jsr DrawObjectSpriteMode0 ; PRG:$275C 20 FC E9 + inc SpawnedEnemyCount ; PRG:$275F E6 B1 +Label_E761: + rts ; PRG:$2761 60 + +;------------------------------------------------------------------------------ +; AudioUpdateStep_E762 +; +; Global description: +; Performs the decoded audio operation represented by AudioUpdateStep_E762 at PRG $2762. +; +; Local description: +; Direct callees/tail targets: AudioUpdateStep_E6A1. State and scratch fields referenced: AudioUpdateStep_E6A1, AudioUpdateStep_E762, SoundTimerArray, StageObjectAnimationMode, StageObjectMode, Zp00, Zp01, Zp02. Direct named writes: SoundTimerArray, SpawnedEnemyCount, StageObjectAnimationMode, Zp00, Zp01, Zp02. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioUpdateStep_E762: + lda StageObjectMode ; PRG:$2762 A5 B2 + bne Label_E7A0 ; PRG:$2764 D0 3A + iny ; PRG:$2766 C8 + iny ; PRG:$2767 C8 + iny ; PRG:$2768 C8 + lda $0240,y ; PRG:$2769 B9 40 02 + cmp $0577 ; PRG:$276C CD 77 05 + bne Label_E77F ; PRG:$276F D0 0E + sta Zp00 ; PRG:$2771 85 00 + lda $0572 ; PRG:$2773 AD 72 05 + sta Zp02 ; PRG:$2776 85 02 + lda #$31 ; PRG:$2778 A9 31 + sta Zp01 ; PRG:$277A 85 01 + lda #$00 ; PRG:$277C A9 00 + rts ; PRG:$277E 60 +Label_E77F: + and #$08 ; PRG:$277F 29 08 + bne Label_E78E ; PRG:$2781 D0 0B + lda $0570 ; PRG:$2783 AD 70 05 + sta Zp02 ; PRG:$2786 85 02 + lda $0578 ; PRG:$2788 AD 78 05 + jmp Label_E796 ; PRG:$278B 4C 96 E7 +Label_E78E: + lda $0571 ; PRG:$278E AD 71 05 + sta Zp02 ; PRG:$2791 85 02 + lda $0579 ; PRG:$2793 AD 79 05 +Label_E796: + sta Zp01 ; PRG:$2796 85 01 + jsr AudioUpdateStep_E6A1 ; PRG:$2798 20 A1 E6 + sta Zp00 ; PRG:$279B 85 00 + lda #$00 ; PRG:$279D A9 00 + rts ; PRG:$279F 60 +Label_E7A0: + lda SoundTimerArray ; PRG:$27A0 A5 35 + beq Label_E7BE ; PRG:$27A2 F0 1A + and #$04 ; PRG:$27A4 29 04 + beq Label_E7AD ; PRG:$27A6 F0 05 + lda #$7C ; PRG:$27A8 A9 7C + jmp Label_E7AF ; PRG:$27AA 4C AF E7 +Label_E7AD: + lda #$80 ; PRG:$27AD A9 80 +Label_E7AF: + sta Zp02 ; PRG:$27AF 85 02 + lda $0573 ; PRG:$27B1 AD 73 05 + sta Zp00 ; PRG:$27B4 85 00 + lda $0574 ; PRG:$27B6 AD 74 05 + sta Zp01 ; PRG:$27B9 85 01 + lda #$00 ; PRG:$27BB A9 00 + rts ; PRG:$27BD 60 +Label_E7BE: + lda $0573 ; PRG:$27BE AD 73 05 + sta Zp00 ; PRG:$27C1 85 00 + lda $0575 ; PRG:$27C3 AD 75 05 + sta Zp01 ; PRG:$27C6 85 01 + lda #$7C ; PRG:$27C8 A9 7C + sta Zp02 ; PRG:$27CA 85 02 + lda #$00 ; PRG:$27CC A9 00 + sta StageObjectAnimationMode ; PRG:$27CE 85 CE + inc SpawnedEnemyCount ; PRG:$27D0 E6 B1 + lda #$A0 ; PRG:$27D2 A9 A0 + sta SoundTimerArray ; PRG:$27D4 85 35 + lda #$00 ; PRG:$27D6 A9 00 + rts ; PRG:$27D8 60 + +;------------------------------------------------------------------------------ +; EnemyUpdateStep_E7D9 +; +; Global description: +; Performs the decoded enemy operation represented by EnemyUpdateStep_E7D9 at PRG $27D9. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: EnemyUpdateStep_E7D9, Zp00, Zp01, Zp02, Zp06. Direct named writes: SharedActionTimer, SpecialObjectIndex, SpecialObjectX, Zp01, Zp02, Zp06. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +EnemyUpdateStep_E7D9: + lda Zp01 ; PRG:$27D9 A5 01 + cmp #$48 ; PRG:$27DB C9 48 + bne Label_E809 ; PRG:$27DD D0 2A + lda Zp00 ; PRG:$27DF A5 00 + ldy #$00 ; PRG:$27E1 A0 00 +Label_E7E3: + cmp SpecialObjectXTriggerTable,y ; PRG:$27E3 D9 0B C2 + beq Label_E7EE ; PRG:$27E6 F0 06 + bcs Label_E809 ; PRG:$27E8 B0 1F + iny ; PRG:$27EA C8 + jmp Label_E7E3 ; PRG:$27EB 4C E3 E7 +Label_E7EE: + cpx SpecialObjectIndex ; PRG:$27EE E4 C3 + beq Label_E81B ; PRG:$27F0 F0 29 + lda $0210 ; PRG:$27F2 AD 10 02 + cmp #$68 ; PRG:$27F5 C9 68 + bcs Label_E809 ; PRG:$27F7 B0 10 + lda RandomLfsr1,x ; PRG:$27F9 B5 19 + cmp #$60 ; PRG:$27FB C9 60 + bcc Label_E80A ; PRG:$27FD 90 0B + lda RandomLfsr2,x ; PRG:$27FF B5 1A + cmp #$A0 ; PRG:$2801 C9 A0 + bcc Label_E809 ; PRG:$2803 90 04 + lda Zp00 ; PRG:$2805 A5 00 + sta SpecialObjectX ; PRG:$2807 85 C4 +Label_E809: + rts ; PRG:$2809 60 +Label_E80A: + lda RandomLfsr2,x ; PRG:$280A B5 1A + cmp #$60 ; PRG:$280C C9 60 + bcc Label_E823 ; PRG:$280E 90 13 + stx SpecialObjectIndex ; PRG:$2810 86 C3 + lda #$90 ; PRG:$2812 A9 90 + sta SharedActionTimer ; PRG:$2814 85 36 + lda #$7C ; PRG:$2816 A9 7C + jmp Label_E839 ; PRG:$2818 4C 39 E8 +Label_E81B: + lda SharedActionTimer ; PRG:$281B A5 36 + bne Label_E82E ; PRG:$281D D0 0F + lda #$FF ; PRG:$281F A9 FF + sta SpecialObjectIndex ; PRG:$2821 85 C3 +Label_E823: + inc Zp01 ; PRG:$2823 E6 01 + lda #$7C ; PRG:$2825 A9 7C + sta Zp02 ; PRG:$2827 85 02 + lda #$02 ; PRG:$2829 A9 02 + jmp Label_E83D ; PRG:$282B 4C 3D E8 +Label_E82E: + and #$04 ; PRG:$282E 29 04 + beq Label_E837 ; PRG:$2830 F0 05 + lda #$80 ; PRG:$2832 A9 80 + jmp Label_E839 ; PRG:$2834 4C 39 E8 +Label_E837: + lda #$7C ; PRG:$2837 A9 7C +Label_E839: + sta Zp02 ; PRG:$2839 85 02 + lda #$08 ; PRG:$283B A9 08 +Label_E83D: + sta Zp06 ; PRG:$283D 85 06 + rts ; PRG:$283F 60 + +;------------------------------------------------------------------------------ +; ClassifyCoordinateAgainstRanges +; +; Global description: +; Performs the decoded gameplay operation represented by ClassifyCoordinateAgainstRanges at PRG $2840. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp00, Zp01, Zp02, Zp0F. Direct named writes: Zp0F. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +ClassifyCoordinateAgainstRanges: + txa ; PRG:$2840 8A + pha ; PRG:$2841 48 + tya ; PRG:$2842 98 + pha ; PRG:$2843 48 + ldy #$00 ; PRG:$2844 A0 00 + lda (Zp02),y ; PRG:$2846 B1 02 + tax ; PRG:$2848 AA + ldy #$02 ; PRG:$2849 A0 02 +Label_E84B: + lda (Zp02),y ; PRG:$284B B1 02 + cmp Zp01 ; PRG:$284D C5 01 + beq Label_E85B ; PRG:$284F F0 0A + iny ; PRG:$2851 C8 + iny ; PRG:$2852 C8 + dex ; PRG:$2853 CA + bne Label_E84B ; PRG:$2854 D0 F5 + lda #$02 ; PRG:$2856 A9 02 + jmp Label_E88A ; PRG:$2858 4C 8A E8 +Label_E85B: + dey ; PRG:$285B 88 + lda (Zp02),y ; PRG:$285C B1 02 + cmp Zp00 ; PRG:$285E C5 00 + bne Label_E874 ; PRG:$2860 D0 12 + iny ; PRG:$2862 C8 + iny ; PRG:$2863 C8 + lda (Zp02),y ; PRG:$2864 B1 02 + cmp Zp00 ; PRG:$2866 C5 00 + bcc Label_E86F ; PRG:$2868 90 05 + lda #$00 ; PRG:$286A A9 00 + jmp Label_E88A ; PRG:$286C 4C 8A E8 +Label_E86F: + lda #$01 ; PRG:$286F A9 01 + jmp Label_E88A ; PRG:$2871 4C 8A E8 +Label_E874: + iny ; PRG:$2874 C8 + iny ; PRG:$2875 C8 + lda (Zp02),y ; PRG:$2876 B1 02 + cmp Zp00 ; PRG:$2878 C5 00 + bcc Label_E888 ; PRG:$287A 90 0C + beq Label_E883 ; PRG:$287C F0 05 + lda #$00 ; PRG:$287E A9 00 + jmp Label_E88A ; PRG:$2880 4C 8A E8 +Label_E883: + lda #$02 ; PRG:$2883 A9 02 + jmp Label_E88A ; PRG:$2885 4C 8A E8 +Label_E888: + lda #$01 ; PRG:$2888 A9 01 +Label_E88A: + sta Zp0F ; PRG:$288A 85 0F + pla ; PRG:$288C 68 + tay ; PRG:$288D A8 + pla ; PRG:$288E 68 + tax ; PRG:$288F AA + lda Zp0F ; PRG:$2890 A5 0F + rts ; PRG:$2892 60 + +;------------------------------------------------------------------------------ +; TestPlayerCollisionMode0 +; +; Global description: +; Performs the decoded collision operation represented by TestPlayerCollisionMode0 at PRG $2893. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +TestPlayerCollisionMode0: + lda #$00 ; PRG:$2893 A9 00 + beq Label_E8A5 ; PRG:$2895 F0 0E + +;------------------------------------------------------------------------------ +; TestPlayerCollisionMode1 +; +; Global description: +; Performs the decoded collision operation represented by TestPlayerCollisionMode1 at PRG $2897. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +TestPlayerCollisionMode1: + lda #$01 ; PRG:$2897 A9 01 + bne Label_E8A5 ; PRG:$2899 D0 0A + +;------------------------------------------------------------------------------ +; TestPlayerCollisionMode2 +; +; Global description: +; Performs the decoded collision operation represented by TestPlayerCollisionMode2 at PRG $289B. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +TestPlayerCollisionMode2: + lda #$02 ; PRG:$289B A9 02 + bne Label_E8A5 ; PRG:$289D D0 06 + +;------------------------------------------------------------------------------ +; TestPlayerCollisionMode3 +; +; Global description: +; Performs the decoded collision operation represented by TestPlayerCollisionMode3 at PRG $289F. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +TestPlayerCollisionMode3: + lda #$03 ; PRG:$289F A9 03 + bne Label_E8A5 ; PRG:$28A1 D0 02 + +;------------------------------------------------------------------------------ +; RunCollisionQuery +; +; Global description: +; Performs the decoded collision operation represented by RunCollisionQuery at PRG $28A3. +; +; Local description: +; Direct callees/tail targets: RunStageCollisionQuery. State and scratch fields referenced: CollisionMatchX, PlayerCollisionAnchorLeft, PlayerCollisionAnchorRight, Zp00, Zp01, Zp02, Zp03, Zp0F. Direct named writes: PlayerCollisionAnchorLeft, PlayerCollisionAnchorRight, Zp0F. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +RunCollisionQuery: + lda #$04 ; PRG:$28A3 A9 04 +Label_E8A5: + sta Zp0F ; PRG:$28A5 85 0F + txa ; PRG:$28A7 8A + pha ; PRG:$28A8 48 + tya ; PRG:$28A9 98 + pha ; PRG:$28AA 48 + lda Zp00 ; PRG:$28AB A5 00 + pha ; PRG:$28AD 48 + lda Zp01 ; PRG:$28AE A5 01 + pha ; PRG:$28B0 48 + lda Zp02 ; PRG:$28B1 A5 02 + pha ; PRG:$28B3 48 + lda Zp03 ; PRG:$28B4 A5 03 + pha ; PRG:$28B6 48 + lda Zp0F ; PRG:$28B7 A5 0F + cmp #$01 ; PRG:$28B9 C9 01 + beq Label_E8F0 ; PRG:$28BB F0 33 + cmp #$02 ; PRG:$28BD C9 02 + beq Label_E927 ; PRG:$28BF F0 66 + cmp #$03 ; PRG:$28C1 C9 03 + bne Label_E8C8 ; PRG:$28C3 D0 03 + jmp Label_E93E ; PRG:$28C5 4C 3E E9 +Label_E8C8: + cmp #$04 ; PRG:$28C8 C9 04 + bne Label_E8CF ; PRG:$28CA D0 03 + jmp Label_E95E ; PRG:$28CC 4C 5E E9 +Label_E8CF: + jsr RunStageCollisionQuery ; PRG:$28CF 20 DB E8 + ldx CollisionMatchX ; PRG:$28D2 A6 42 + stx PlayerCollisionAnchorLeft ; PRG:$28D4 86 73 + stx PlayerCollisionAnchorRight ; PRG:$28D6 86 74 + jmp Label_E964 ; PRG:$28D8 4C 64 E9 + +;------------------------------------------------------------------------------ +; RunStageCollisionQuery +; +; Global description: +; Runs a player-state collision-list query selected by the caller-provided index. +; +; Local description: +; Loads an interleaved pointer from PlayerStateCollisionListPointerTable into Zp02/Zp03 and calls TestCollisionList. One table entry points to the live RAM list at $0450; the others point to ROM lists. +; +; Parameters: +; X is an even pointer-table offset selected by the movement/collision mode. Player bounds and collision origin fields must already be prepared. +; +; Returns: +; Returns the collision-list result in A, zero for no match and nonzero for a match. +; +; Clobbers: +; A, X, Y, Zp02/Zp03, collision work fields, and processor flags. +;------------------------------------------------------------------------------ +RunStageCollisionQuery: + lda StageOrScreenIndex ; PRG:$28DB A5 4A + sec ; PRG:$28DD 38 + sbc #$01 ; PRG:$28DE E9 01 + asl a ; PRG:$28E0 0A + tax ; PRG:$28E1 AA + lda PlayerStateCollisionListPointerTable,x ; PRG:$28E2 BD 48 C4 + sta Zp02 ; PRG:$28E5 85 02 + lda PlayerStateCollisionListPointerHighBytes,x ; PRG:$28E7 BD 49 C4 + sta Zp03 ; PRG:$28EA 85 03 + jsr TestCollisionList ; PRG:$28EC 20 73 EB + rts ; PRG:$28EF 60 +Label_E8F0: + lda CollisionLeft ; PRG:$28F0 A5 3E + pha ; PRG:$28F2 48 + clc ; PRG:$28F3 18 + adc #$10 ; PRG:$28F4 69 10 + sta CollisionLeft ; PRG:$28F6 85 3E + jsr RunStageCollisionQuery ; PRG:$28F8 20 DB E8 + ldx CollisionMatchX ; PRG:$28FB A6 42 + stx PlayerCollisionAnchorLeft ; PRG:$28FD 86 73 + sta Zp0D ; PRG:$28FF 85 0D + pla ; PRG:$2901 68 + sta CollisionLeft ; PRG:$2902 85 3E + lda CollisionRight ; PRG:$2904 A5 40 + pha ; PRG:$2906 48 + sec ; PRG:$2907 38 + sbc #$10 ; PRG:$2908 E9 10 + sta CollisionRight ; PRG:$290A 85 40 + jsr RunStageCollisionQuery ; PRG:$290C 20 DB E8 + ldx CollisionMatchX ; PRG:$290F A6 42 + stx PlayerCollisionAnchorRight ; PRG:$2911 86 74 + cmp #$00 ; PRG:$2913 C9 00 + beq Label_E91D ; PRG:$2915 F0 06 + lda Zp0D ; PRG:$2917 A5 0D + ora #$10 ; PRG:$2919 09 10 + sta Zp0D ; PRG:$291B 85 0D +Label_E91D: + pla ; PRG:$291D 68 + sta CollisionRight ; PRG:$291E 85 40 + lda Zp0D ; PRG:$2920 A5 0D + sta Zp0F ; PRG:$2922 85 0F + jmp Label_E964 ; PRG:$2924 4C 64 E9 +Label_E927: + lda StageOrScreenIndex ; PRG:$2927 A5 4A + sec ; PRG:$2929 38 + sbc #$01 ; PRG:$292A E9 01 + asl a ; PRG:$292C 0A + tax ; PRG:$292D AA + lda AlternateCollisionListPointerTable,x ; PRG:$292E BD 50 C4 + sta Zp02 ; PRG:$2931 85 02 + lda AlternateCollisionListPointerHighBytes,x ; PRG:$2933 BD 51 C4 + sta Zp03 ; PRG:$2936 85 03 + jsr TestCollisionList ; PRG:$2938 20 73 EB + jmp Label_E964 ; PRG:$293B 4C 64 E9 +Label_E93E: + jsr LoadStageCollisionList ; PRG:$293E 20 79 E9 + lda CollisionTop ; PRG:$2941 A5 3F + pha ; PRG:$2943 48 + lda CollisionBottom ; PRG:$2944 A5 41 + pha ; PRG:$2946 48 + clc ; PRG:$2947 18 + adc #$01 ; PRG:$2948 69 01 + sta CollisionTop ; PRG:$294A 85 3F + adc #$01 ; PRG:$294C 69 01 + sta CollisionBottom ; PRG:$294E 85 41 + jsr TestCollisionList ; PRG:$2950 20 73 EB + pla ; PRG:$2953 68 + sta CollisionBottom ; PRG:$2954 85 41 + pla ; PRG:$2956 68 + sta CollisionTop ; PRG:$2957 85 3F + lda Zp0F ; PRG:$2959 A5 0F + jmp Label_E964 ; PRG:$295B 4C 64 E9 +Label_E95E: + jsr LoadStageCollisionList ; PRG:$295E 20 79 E9 + jsr TestCollisionList ; PRG:$2961 20 73 EB +Label_E964: + sta Zp0F ; PRG:$2964 85 0F + pla ; PRG:$2966 68 + sta Zp03 ; PRG:$2967 85 03 + pla ; PRG:$2969 68 + sta Zp02 ; PRG:$296A 85 02 + pla ; PRG:$296C 68 + sta Zp01 ; PRG:$296D 85 01 + pla ; PRG:$296F 68 + sta Zp00 ; PRG:$2970 85 00 + pla ; PRG:$2972 68 + tay ; PRG:$2973 A8 + pla ; PRG:$2974 68 + tax ; PRG:$2975 AA + lda Zp0F ; PRG:$2976 A5 0F + rts ; PRG:$2978 60 + +;------------------------------------------------------------------------------ +; LoadStageCollisionList +; +; Global description: +; Loads the stage-level collision query list selected by an even index. +; +; Local description: +; Reads an interleaved pointer from StageCollisionQueryPointerTable into Zp02/Zp03. Entry one targets the live RAM collision records at $0400; the remaining entries target ROM lists. +; +; Parameters: +; X is an even table offset derived from the active stage/query mode. +; +; Returns: +; Returns with Zp02/Zp03 pointing to the selected list for TestCollisionList. +; +; Clobbers: +; A, Zp02/Zp03, and processor flags. +;------------------------------------------------------------------------------ +LoadStageCollisionList: + lda StageOrScreenIndex ; PRG:$2979 A5 4A + sec ; PRG:$297B 38 + sbc #$01 ; PRG:$297C E9 01 + asl a ; PRG:$297E 0A + tax ; PRG:$297F AA + lda StageCollisionQueryPointerTable,x ; PRG:$2980 BD 40 C4 + sta Zp02 ; PRG:$2983 85 02 + lda StageCollisionQueryPointerHighBytes,x ; PRG:$2985 BD 41 C4 + sta Zp03 ; PRG:$2988 85 03 + rts ; PRG:$298A 60 + +;------------------------------------------------------------------------------ +; TickDirectionalRepeatTimer +; +; Global description: +; Performs the decoded player-state operation represented by TickDirectionalRepeatTimer at PRG $298B. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: PlayerInputDirection. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +TickDirectionalRepeatTimer: + sta $05E0 ; PRG:$298B 8D E0 05 + lda PreviousInputDirection ; PRG:$298E A5 55 + cmp PlayerInputDirection ; PRG:$2990 C5 54 + bne Label_E9A2 ; PRG:$2992 D0 0E + dec $05E1,x ; PRG:$2994 DE E1 05 + lda $05E1,x ; PRG:$2997 BD E1 05 + cmp #$FF ; PRG:$299A C9 FF + beq Label_E9A2 ; PRG:$299C F0 04 + cmp #$00 ; PRG:$299E C9 00 + bne Label_E9AB ; PRG:$29A0 D0 09 +Label_E9A2: + lda $05E0 ; PRG:$29A2 AD E0 05 + sta $05E1,x ; PRG:$29A5 9D E1 05 + lda #$01 ; PRG:$29A8 A9 01 + rts ; PRG:$29AA 60 +Label_E9AB: + lda #$00 ; PRG:$29AB A9 00 + rts ; PRG:$29AD 60 + +;------------------------------------------------------------------------------ +; IntegrateVerticalMotion +; +; Global description: +; Performs the decoded player-state operation represented by IntegrateVerticalMotion at PRG $29AE. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: PlayerGravityFraction, PlayerGravityInteger, PlayerStateCounter, PlayerVerticalAccelerationFraction, PlayerVerticalAccelerationInteger, PlayerVerticalVelocityFraction, Zp01, Zp0F. Direct named writes: PlayerStateCounter, PlayerVerticalAccelerationFraction, PlayerVerticalAccelerationInteger, PlayerVerticalVelocityFraction, Zp01, Zp0F. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +IntegrateVerticalMotion: + stx Zp0F ; PRG:$29AE 86 0F + asl a ; PRG:$29B0 0A + tax ; PRG:$29B1 AA + lda PlayerStateCounter,x ; PRG:$29B2 B5 7E + bne Label_E9C3 ; PRG:$29B4 D0 0D + sta PlayerVerticalAccelerationInteger,x ; PRG:$29B6 95 83 + lda #$08 ; PRG:$29B8 A9 08 + sta PlayerVerticalAccelerationFraction,x ; PRG:$29BA 95 82 + lda #$F0 ; PRG:$29BC A9 F0 + sta PlayerVerticalVelocityFraction,x ; PRG:$29BE 95 7F + jmp Label_E9CF ; PRG:$29C0 4C CF E9 +Label_E9C3: + lda PlayerVerticalAccelerationFraction,x ; PRG:$29C3 B5 82 + adc #$10 ; PRG:$29C5 69 10 + sta PlayerVerticalAccelerationFraction,x ; PRG:$29C7 95 82 + lda PlayerVerticalAccelerationInteger,x ; PRG:$29C9 B5 83 + adc #$00 ; PRG:$29CB 69 00 + sta PlayerVerticalAccelerationInteger,x ; PRG:$29CD 95 83 +Label_E9CF: + lda PlayerVerticalVelocityFraction,x ; PRG:$29CF B5 7F + sec ; PRG:$29D1 38 + sbc PlayerGravityFraction,x ; PRG:$29D2 F5 86 + sta PlayerVerticalVelocityFraction,x ; PRG:$29D4 95 7F + lda Zp01 ; PRG:$29D6 A5 01 + sbc PlayerGravityInteger,x ; PRG:$29D8 F5 87 + sta Zp01 ; PRG:$29DA 85 01 + clc ; PRG:$29DC 18 + lda PlayerVerticalVelocityFraction,x ; PRG:$29DD B5 7F + adc PlayerVerticalAccelerationFraction,x ; PRG:$29DF 75 82 + sta PlayerVerticalVelocityFraction,x ; PRG:$29E1 95 7F + lda Zp01 ; PRG:$29E3 A5 01 + adc PlayerVerticalAccelerationInteger,x ; PRG:$29E5 75 83 + sta Zp01 ; PRG:$29E7 85 01 + inc PlayerStateCounter,x ; PRG:$29E9 F6 7E + ldx Zp0F ; PRG:$29EB A6 0F + rts ; PRG:$29ED 60 + +;------------------------------------------------------------------------------ +; DrawSingleObjectSprite +; +; Global description: +; Performs the decoded graphics operation represented by DrawSingleObjectSprite at PRG $29EE. +; +; Local description: +; Direct callees/tail targets: RenderObjectSpriteGrid. State and scratch fields referenced: Zp03, Zp04. Direct named writes: Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DrawSingleObjectSprite: + pha ; PRG:$29EE 48 + lda #$24 ; PRG:$29EF A9 24 + sta Zp03 ; PRG:$29F1 85 03 + lda #$10 ; PRG:$29F3 A9 10 + sta Zp04 ; PRG:$29F5 85 04 + pla ; PRG:$29F7 68 + jsr RenderObjectSpriteGrid ; PRG:$29F8 20 08 EA + rts ; PRG:$29FB 60 + +;------------------------------------------------------------------------------ +; DrawObjectSpriteMode0 +; +; Global description: +; Performs the decoded graphics operation represented by DrawObjectSpriteMode0 at PRG $29FC. +; +; Local description: +; Direct callees/tail targets: RenderObjectSpriteGrid. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DrawObjectSpriteMode0: + lda #$00 ; PRG:$29FC A9 00 + jmp RenderObjectSpriteGrid ; PRG:$29FE 4C 08 EA + +;------------------------------------------------------------------------------ +; DrawObjectSpriteMode1 +; +; Global description: +; Performs the decoded graphics operation represented by DrawObjectSpriteMode1 at PRG $2A01. +; +; Local description: +; Direct callees/tail targets: RenderObjectSpriteGrid. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +DrawObjectSpriteMode1: + lda #$01 ; PRG:$2A01 A9 01 + jmp RenderObjectSpriteGrid ; PRG:$2A03 4C 08 EA + +;------------------------------------------------------------------------------ +; FillObjectTileColumn +; +; Global description: +; Performs the decoded gameplay operation represented by FillObjectTileColumn at PRG $2A06. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +FillObjectTileColumn: + lda #$04 ; PRG:$2A06 A9 04 + +;------------------------------------------------------------------------------ +; RenderObjectSpriteGrid +; +; Global description: +; Performs the decoded graphics operation represented by RenderObjectSpriteGrid at PRG $2A08. +; +; Local description: +; Direct callees/tail targets: FillForwardSpriteTiles, HideSpriteGrid, FillMirroredSpriteTiles, FillVerticallyFlippedSpriteTiles, FillSpriteGridPositions, FillSpriteTileIndices. State and scratch fields referenced: Zp00, Zp01, Zp03, Zp05, Zp06, Zp07, Zp08, Zp09, Zp0F. Direct named writes: Zp00, Zp01, Zp05, Zp06, Zp07, Zp08, Zp09, Zp0F. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +RenderObjectSpriteGrid: + pha ; PRG:$2A08 48 + sta Zp0F ; PRG:$2A09 85 0F + txa ; PRG:$2A0B 8A + pha ; PRG:$2A0C 48 + tya ; PRG:$2A0D 98 + pha ; PRG:$2A0E 48 + lda Zp00 ; PRG:$2A0F A5 00 + pha ; PRG:$2A11 48 + lda Zp01 ; PRG:$2A12 A5 01 + pha ; PRG:$2A14 48 + lda Zp05 ; PRG:$2A15 A5 05 + pha ; PRG:$2A17 48 + lda Zp06 ; PRG:$2A18 A5 06 + pha ; PRG:$2A1A 48 + lda Zp07 ; PRG:$2A1B A5 07 + pha ; PRG:$2A1D 48 + lda Zp08 ; PRG:$2A1E A5 08 + pha ; PRG:$2A20 48 + lda Zp09 ; PRG:$2A21 A5 09 + pha ; PRG:$2A23 48 + lda #$02 ; PRG:$2A24 A9 02 + sta Zp05 ; PRG:$2A26 85 05 + lda Zp0F ; PRG:$2A28 A5 0F + cmp #$04 ; PRG:$2A2A C9 04 + beq Label_EA71 ; PRG:$2A2C F0 43 + lda #$0F ; PRG:$2A2E A9 0F + and Zp03 ; PRG:$2A30 25 03 + sta Zp07 ; PRG:$2A32 85 07 + lda Zp03 ; PRG:$2A34 A5 03 + lsr a ; PRG:$2A36 4A + lsr a ; PRG:$2A37 4A + lsr a ; PRG:$2A38 4A + lsr a ; PRG:$2A39 4A + sta Zp06 ; PRG:$2A3A 85 06 + tax ; PRG:$2A3C AA + lda #$00 ; PRG:$2A3D A9 00 + clc ; PRG:$2A3F 18 +Label_EA40: + adc Zp07 ; PRG:$2A40 65 07 + dex ; PRG:$2A42 CA + bne Label_EA40 ; PRG:$2A43 D0 FB + sta Zp08 ; PRG:$2A45 85 08 + lda Zp0F ; PRG:$2A47 A5 0F + bne Label_EA51 ; PRG:$2A49 D0 06 + jsr FillForwardSpriteTiles ; PRG:$2A4B 20 9F EA + jmp Label_EA6B ; PRG:$2A4E 4C 6B EA +Label_EA51: + cmp #$01 ; PRG:$2A51 C9 01 + beq Label_EA5F ; PRG:$2A53 F0 0A + cmp #$02 ; PRG:$2A55 C9 02 + beq Label_EA65 ; PRG:$2A57 F0 0C + jsr HideSpriteGrid ; PRG:$2A59 20 4A EB + jmp Label_EA74 ; PRG:$2A5C 4C 74 EA +Label_EA5F: + jsr FillMirroredSpriteTiles ; PRG:$2A5F 20 E0 EA + jmp Label_EA6B ; PRG:$2A62 4C 6B EA +Label_EA65: + jsr FillVerticallyFlippedSpriteTiles ; PRG:$2A65 20 14 EB + jmp Label_EA6B ; PRG:$2A68 4C 6B EA +Label_EA6B: + jsr FillSpriteGridPositions ; PRG:$2A6B 20 BA EA + jmp Label_EA74 ; PRG:$2A6E 4C 74 EA +Label_EA71: + jsr FillSpriteTileIndices ; PRG:$2A71 20 8F EA +Label_EA74: + pla ; PRG:$2A74 68 + sta Zp09 ; PRG:$2A75 85 09 + pla ; PRG:$2A77 68 + sta Zp08 ; PRG:$2A78 85 08 + pla ; PRG:$2A7A 68 + sta Zp07 ; PRG:$2A7B 85 07 + pla ; PRG:$2A7D 68 + sta Zp06 ; PRG:$2A7E 85 06 + pla ; PRG:$2A80 68 + sta Zp05 ; PRG:$2A81 85 05 + pla ; PRG:$2A83 68 + sta Zp01 ; PRG:$2A84 85 01 + pla ; PRG:$2A86 68 + sta Zp00 ; PRG:$2A87 85 00 + pla ; PRG:$2A89 68 + tay ; PRG:$2A8A A8 + pla ; PRG:$2A8B 68 + tax ; PRG:$2A8C AA + pla ; PRG:$2A8D 68 + rts ; PRG:$2A8E 60 + +;------------------------------------------------------------------------------ +; FillSpriteTileIndices +; +; Global description: +; Performs the decoded graphics operation represented by FillSpriteTileIndices at PRG $2A8F. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp02, Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +FillSpriteTileIndices: + lda Zp02 ; PRG:$2A8F A5 02 + ldx Zp03 ; PRG:$2A91 A6 03 + ldy #$02 ; PRG:$2A93 A0 02 +Label_EA95: + sta (Zp04),y ; PRG:$2A95 91 04 + iny ; PRG:$2A97 C8 + iny ; PRG:$2A98 C8 + iny ; PRG:$2A99 C8 + iny ; PRG:$2A9A C8 + dex ; PRG:$2A9B CA + bne Label_EA95 ; PRG:$2A9C D0 F7 + rts ; PRG:$2A9E 60 + +;------------------------------------------------------------------------------ +; FillForwardSpriteTiles +; +; Global description: +; Performs the decoded graphics operation represented by FillForwardSpriteTiles at PRG $2A9F. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp02, Zp04, Zp08. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +FillForwardSpriteTiles: + lda Zp02 ; PRG:$2A9F A5 02 + ldx Zp08 ; PRG:$2AA1 A6 08 + ldy #$01 ; PRG:$2AA3 A0 01 +Label_EAA5: + sta (Zp04),y ; PRG:$2AA5 91 04 + clc ; PRG:$2AA7 18 + adc #$01 ; PRG:$2AA8 69 01 + iny ; PRG:$2AAA C8 + pha ; PRG:$2AAB 48 + lda (Zp04),y ; PRG:$2AAC B1 04 + and #$3F ; PRG:$2AAE 29 3F + sta (Zp04),y ; PRG:$2AB0 91 04 + pla ; PRG:$2AB2 68 + iny ; PRG:$2AB3 C8 + iny ; PRG:$2AB4 C8 + iny ; PRG:$2AB5 C8 + dex ; PRG:$2AB6 CA + bne Label_EAA5 ; PRG:$2AB7 D0 EC + rts ; PRG:$2AB9 60 + +;------------------------------------------------------------------------------ +; FillSpriteGridPositions +; +; Global description: +; Performs the decoded graphics operation represented by FillSpriteGridPositions at PRG $2ABA. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp00, Zp01, Zp04, Zp06, Zp07, Zp09. Direct named writes: Zp00, Zp07, Zp09. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +FillSpriteGridPositions: + ldy #$00 ; PRG:$2ABA A0 00 +Label_EABC: + ldx Zp06 ; PRG:$2ABC A6 06 + lda Zp01 ; PRG:$2ABE A5 01 + sta Zp09 ; PRG:$2AC0 85 09 +Label_EAC2: + lda Zp09 ; PRG:$2AC2 A5 09 + sta (Zp04),y ; PRG:$2AC4 91 04 + clc ; PRG:$2AC6 18 + adc #$08 ; PRG:$2AC7 69 08 + sta Zp09 ; PRG:$2AC9 85 09 + iny ; PRG:$2ACB C8 + iny ; PRG:$2ACC C8 + iny ; PRG:$2ACD C8 + lda Zp00 ; PRG:$2ACE A5 00 + sta (Zp04),y ; PRG:$2AD0 91 04 + iny ; PRG:$2AD2 C8 + dex ; PRG:$2AD3 CA + bne Label_EAC2 ; PRG:$2AD4 D0 EC + clc ; PRG:$2AD6 18 + adc #$08 ; PRG:$2AD7 69 08 + sta Zp00 ; PRG:$2AD9 85 00 + dec Zp07 ; PRG:$2ADB C6 07 + bne Label_EABC ; PRG:$2ADD D0 DD + rts ; PRG:$2ADF 60 + +;------------------------------------------------------------------------------ +; FillMirroredSpriteTiles +; +; Global description: +; Performs the decoded graphics operation represented by FillMirroredSpriteTiles at PRG $2AE0. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp02, Zp04, Zp06, Zp08, Zp0A, Zp0B. Direct named writes: Zp0A, Zp0B. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +FillMirroredSpriteTiles: + ldy #$01 ; PRG:$2AE0 A0 01 + sty Zp0A ; PRG:$2AE2 84 0A + lda Zp08 ; PRG:$2AE4 A5 08 + sec ; PRG:$2AE6 38 + sbc Zp06 ; PRG:$2AE7 E5 06 +Label_EAE9: + tay ; PRG:$2AE9 A8 + sta Zp0B ; PRG:$2AEA 85 0B + ldx Zp06 ; PRG:$2AEC A6 06 +Label_EAEE: + tya ; PRG:$2AEE 98 + pha ; PRG:$2AEF 48 + clc ; PRG:$2AF0 18 + tya ; PRG:$2AF1 98 + adc Zp02 ; PRG:$2AF2 65 02 + ldy Zp0A ; PRG:$2AF4 A4 0A + sta (Zp04),y ; PRG:$2AF6 91 04 + iny ; PRG:$2AF8 C8 + lda (Zp04),y ; PRG:$2AF9 B1 04 + and #$3F ; PRG:$2AFB 29 3F + eor #$40 ; PRG:$2AFD 49 40 + sta (Zp04),y ; PRG:$2AFF 91 04 + iny ; PRG:$2B01 C8 + iny ; PRG:$2B02 C8 + iny ; PRG:$2B03 C8 + sty Zp0A ; PRG:$2B04 84 0A + pla ; PRG:$2B06 68 + tay ; PRG:$2B07 A8 + iny ; PRG:$2B08 C8 + dex ; PRG:$2B09 CA + bne Label_EAEE ; PRG:$2B0A D0 E2 + lda Zp0B ; PRG:$2B0C A5 0B + sec ; PRG:$2B0E 38 + sbc Zp06 ; PRG:$2B0F E5 06 + bpl Label_EAE9 ; PRG:$2B11 10 D6 + rts ; PRG:$2B13 60 + +;------------------------------------------------------------------------------ +; FillVerticallyFlippedSpriteTiles +; +; Global description: +; Performs the decoded graphics operation represented by FillVerticallyFlippedSpriteTiles at PRG $2B14. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp02, Zp04, Zp06, Zp08, Zp0A, Zp0B. Direct named writes: Zp0A, Zp0B. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +FillVerticallyFlippedSpriteTiles: + lda #$01 ; PRG:$2B14 A9 01 + sta Zp0A ; PRG:$2B16 85 0A + lda Zp06 ; PRG:$2B18 A5 06 + sec ; PRG:$2B1A 38 + sbc #$01 ; PRG:$2B1B E9 01 +Label_EB1D: + tay ; PRG:$2B1D A8 + sta Zp0B ; PRG:$2B1E 85 0B + ldx Zp06 ; PRG:$2B20 A6 06 +Label_EB22: + tya ; PRG:$2B22 98 + pha ; PRG:$2B23 48 + clc ; PRG:$2B24 18 + tya ; PRG:$2B25 98 + adc Zp02 ; PRG:$2B26 65 02 + ldy Zp0A ; PRG:$2B28 A4 0A + sta (Zp04),y ; PRG:$2B2A 91 04 + iny ; PRG:$2B2C C8 + lda (Zp04),y ; PRG:$2B2D B1 04 + and #$3F ; PRG:$2B2F 29 3F + ora #$80 ; PRG:$2B31 09 80 + sta (Zp04),y ; PRG:$2B33 91 04 + iny ; PRG:$2B35 C8 + iny ; PRG:$2B36 C8 + iny ; PRG:$2B37 C8 + sty Zp0A ; PRG:$2B38 84 0A + pla ; PRG:$2B3A 68 + tay ; PRG:$2B3B A8 + dey ; PRG:$2B3C 88 + dex ; PRG:$2B3D CA + bne Label_EB22 ; PRG:$2B3E D0 E2 + lda Zp0B ; PRG:$2B40 A5 0B + clc ; PRG:$2B42 18 + adc Zp06 ; PRG:$2B43 65 06 + cmp Zp08 ; PRG:$2B45 C5 08 + bmi Label_EB1D ; PRG:$2B47 30 D4 + rts ; PRG:$2B49 60 + +;------------------------------------------------------------------------------ +; HideSpriteGrid +; +; Global description: +; Performs the decoded graphics operation represented by HideSpriteGrid at PRG $2B4A. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp00, Zp01, Zp04, Zp06, Zp07, Zp09. Direct named writes: Zp00, Zp07, Zp09. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +HideSpriteGrid: + ldy #$00 ; PRG:$2B4A A0 00 +Label_EB4C: + ldx Zp06 ; PRG:$2B4C A6 06 + lda Zp01 ; PRG:$2B4E A5 01 + sta Zp09 ; PRG:$2B50 85 09 + lda #$FF ; PRG:$2B52 A9 FF +Label_EB54: + sta (Zp04),y ; PRG:$2B54 91 04 + iny ; PRG:$2B56 C8 + iny ; PRG:$2B57 C8 + iny ; PRG:$2B58 C8 + iny ; PRG:$2B59 C8 + dex ; PRG:$2B5A CA + bne Label_EB54 ; PRG:$2B5B D0 F7 + lda Zp00 ; PRG:$2B5D A5 00 + clc ; PRG:$2B5F 18 + adc #$08 ; PRG:$2B60 69 08 + sta Zp00 ; PRG:$2B62 85 00 + dec Zp07 ; PRG:$2B64 C6 07 + bne Label_EB4C ; PRG:$2B66 D0 E4 + rts ; PRG:$2B68 60 + +;------------------------------------------------------------------------------ +; BuildCollisionBounds +; +; Global description: +; Performs the decoded collision operation represented by BuildCollisionBounds at PRG $2B69. +; +; Local description: +; Direct callees/tail targets: ProcessCollisionShape. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +BuildCollisionBounds: + lda #$00 ; PRG:$2B69 A9 00 + jmp ProcessCollisionShape ; PRG:$2B6B 4C 75 EB + +;------------------------------------------------------------------------------ +; BuildAndTestCollisionBounds +; +; Global description: +; Performs the decoded collision operation represented by BuildAndTestCollisionBounds at PRG $2B6E. +; +; Local description: +; Direct callees/tail targets: ProcessCollisionShape. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +BuildAndTestCollisionBounds: + lda #$01 ; PRG:$2B6E A9 01 + jmp ProcessCollisionShape ; PRG:$2B70 4C 75 EB + +;------------------------------------------------------------------------------ +; TestCollisionList +; +; Global description: +; Tests the current collision rectangle against a selected list or fixed record. +; +; Local description: +; Enters ProcessCollisionShape in list-test mode. The pointed data is interpreted as one or more four-byte rectangles terminated by $FF; TestRectangleOverlap stops on the first match. +; +; Parameters: +; Zp02/Zp03 point to the collision list. CollisionLeft through CollisionBottom hold the subject rectangle. +; +; Returns: +; Returns A=$01 on overlap and A=$00 when the terminator is reached without a match. +; +; Clobbers: +; A, X, Y, Zp0F, CollisionMatchX through CollisionMatchBottom, and processor flags. +;------------------------------------------------------------------------------ +TestCollisionList: + lda #$02 ; PRG:$2B73 A9 02 + +;------------------------------------------------------------------------------ +; ProcessCollisionShape +; +; Global description: +; Decodes a collision shape according to the requested operating mode. +; +; Local description: +; Mode zero builds a collision rectangle from relative shape bytes. Mode one builds the rectangle and immediately tests it. Mode two walks a $FF-terminated sequence of explicit four-byte rectangles, testing each against the current subject rectangle. +; +; Parameters: +; A selects mode 0, 1, or 2. Zp00/Zp01 are origin coordinates; Zp02/Zp03 point to shape data. +; +; Returns: +; Returns the generated/test result in A and restores the caller registers saved by the routine. +; +; Clobbers: +; A, X, Y, Zp0F, collision rectangle fields, and processor flags. +;------------------------------------------------------------------------------ +ProcessCollisionShape: + sta Zp0F ; PRG:$2B75 85 0F + txa ; PRG:$2B77 8A + pha ; PRG:$2B78 48 + tya ; PRG:$2B79 98 + pha ; PRG:$2B7A 48 + ldy #$00 ; PRG:$2B7B A0 00 + lda Zp0F ; PRG:$2B7D A5 0F + cmp #$02 ; PRG:$2B7F C9 02 + beq Label_EB96 ; PRG:$2B81 F0 13 + cmp #$01 ; PRG:$2B83 C9 01 + beq Label_EB8D ; PRG:$2B85 F0 06 + jsr BuildCollisionRectangle ; PRG:$2B87 20 C1 EB + jmp Label_EBBA ; PRG:$2B8A 4C BA EB +Label_EB8D: + jsr BuildCollisionRectangle ; PRG:$2B8D 20 C1 EB + jsr TestRectangleOverlap ; PRG:$2B90 20 E3 EB + jmp Label_EBB8 ; PRG:$2B93 4C B8 EB +Label_EB96: + lda (Zp02),y ; PRG:$2B96 B1 02 + cmp #$FF ; PRG:$2B98 C9 FF + beq Label_EBB6 ; PRG:$2B9A F0 1A + sta CollisionMatchX ; PRG:$2B9C 85 42 + iny ; PRG:$2B9E C8 + lda (Zp02),y ; PRG:$2B9F B1 02 + sta CollisionMatchY ; PRG:$2BA1 85 43 + iny ; PRG:$2BA3 C8 + lda (Zp02),y ; PRG:$2BA4 B1 02 + sta CollisionMatchRight ; PRG:$2BA6 85 44 + iny ; PRG:$2BA8 C8 + lda (Zp02),y ; PRG:$2BA9 B1 02 + sta CollisionMatchBottom ; PRG:$2BAB 85 45 + iny ; PRG:$2BAD C8 + jsr TestRectangleOverlap ; PRG:$2BAE 20 E3 EB + beq Label_EB96 ; PRG:$2BB1 F0 E3 + jmp Label_EBB8 ; PRG:$2BB3 4C B8 EB +Label_EBB6: + lda #$00 ; PRG:$2BB6 A9 00 +Label_EBB8: + sta Zp0F ; PRG:$2BB8 85 0F +Label_EBBA: + pla ; PRG:$2BBA 68 + tay ; PRG:$2BBB A8 + pla ; PRG:$2BBC 68 + tax ; PRG:$2BBD AA + lda Zp0F ; PRG:$2BBE A5 0F + rts ; PRG:$2BC0 60 + +;------------------------------------------------------------------------------ +; BuildCollisionRectangle +; +; Global description: +; Performs the decoded collision operation represented by BuildCollisionRectangle at PRG $2BC1. +; +; Local description: +; Direct callees/tail targets: CollisionCollisionStep_EBCD. State and scratch fields referenced: CollisionCollisionStep_EBCD, Zp0F. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +BuildCollisionRectangle: + ldx #$00 ; PRG:$2BC1 A2 00 + lda Zp0F ; PRG:$2BC3 A5 0F + beq Label_EBC9 ; PRG:$2BC5 F0 02 + ldx #$04 ; PRG:$2BC7 A2 04 +Label_EBC9: + jsr CollisionCollisionStep_EBCD ; PRG:$2BC9 20 CD EB + rts ; PRG:$2BCC 60 + +;------------------------------------------------------------------------------ +; CollisionCollisionStep_EBCD +; +; Global description: +; Performs the decoded collision operation represented by CollisionCollisionStep_EBCD at PRG $2BCD. +; +; Local description: +; Direct callees/tail targets: ExpandCollisionPointPair. State and scratch fields referenced: CollisionCollisionStep_EBCD. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionCollisionStep_EBCD: + jsr ExpandCollisionPointPair ; PRG:$2BCD 20 D0 EB + +;------------------------------------------------------------------------------ +; ExpandCollisionPointPair +; +; Global description: +; Performs the decoded collision operation represented by ExpandCollisionPointPair at PRG $2BD0. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: CollisionLeft, Zp00, Zp01, Zp02. Direct named writes: CollisionLeft. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +ExpandCollisionPointPair: + lda (Zp02),y ; PRG:$2BD0 B1 02 + clc ; PRG:$2BD2 18 + adc Zp00 ; PRG:$2BD3 65 00 + sta CollisionLeft,x ; PRG:$2BD5 95 3E + inx ; PRG:$2BD7 E8 + iny ; PRG:$2BD8 C8 + lda (Zp02),y ; PRG:$2BD9 B1 02 + clc ; PRG:$2BDB 18 + adc Zp01 ; PRG:$2BDC 65 01 + sta CollisionLeft,x ; PRG:$2BDE 95 3E + inx ; PRG:$2BE0 E8 + iny ; PRG:$2BE1 C8 + rts ; PRG:$2BE2 60 + +;------------------------------------------------------------------------------ +; TestRectangleOverlap +; +; Global description: +; Tests two inclusive axis-aligned rectangles for overlap. +; +; Local description: +; Compares CollisionLeft/Top/Right/Bottom against CollisionMatchX/Y/Right/Bottom. Edge equality counts as overlap. +; +; Parameters: +; The two rectangle records must already be populated. +; +; Returns: +; Returns A=$01 when both axes overlap, otherwise A=$00. +; +; Clobbers: +; A and processor flags. +;------------------------------------------------------------------------------ +TestRectangleOverlap: + lda CollisionLeft ; PRG:$2BE3 A5 3E + cmp CollisionMatchX ; PRG:$2BE5 C5 42 + bcc Label_EBF4 ; PRG:$2BE7 90 0B + beq Label_EBFA ; PRG:$2BE9 F0 0F + cmp CollisionMatchRight ; PRG:$2BEB C5 44 + bcc Label_EBFA ; PRG:$2BED 90 0B + beq Label_EBFA ; PRG:$2BEF F0 09 + lda #$00 ; PRG:$2BF1 A9 00 + rts ; PRG:$2BF3 60 +Label_EBF4: + lda CollisionRight ; PRG:$2BF4 A5 40 + cmp CollisionMatchX ; PRG:$2BF6 C5 42 + bcc Label_EC14 ; PRG:$2BF8 90 1A +Label_EBFA: + lda CollisionTop ; PRG:$2BFA A5 3F + cmp CollisionMatchY ; PRG:$2BFC C5 43 + bcc Label_EC0B ; PRG:$2BFE 90 0B + beq Label_EC11 ; PRG:$2C00 F0 0F + cmp CollisionMatchBottom ; PRG:$2C02 C5 45 + bcc Label_EC11 ; PRG:$2C04 90 0B + beq Label_EC11 ; PRG:$2C06 F0 09 + lda #$00 ; PRG:$2C08 A9 00 + rts ; PRG:$2C0A 60 +Label_EC0B: + lda CollisionBottom ; PRG:$2C0B A5 41 + cmp CollisionMatchY ; PRG:$2C0D C5 43 + bcc Label_EC14 ; PRG:$2C0F 90 03 +Label_EC11: + lda #$01 ; PRG:$2C11 A9 01 + rts ; PRG:$2C13 60 +Label_EC14: + lda #$00 ; PRG:$2C14 A9 00 + rts ; PRG:$2C16 60 + +;------------------------------------------------------------------------------ +; HideInactiveObjectSprites +; +; Global description: +; Performs the decoded graphics operation represented by HideInactiveObjectSprites at PRG $2C17. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +HideInactiveObjectSprites: + ldx #$00 ; PRG:$2C17 A2 00 + ldy #$00 ; PRG:$2C19 A0 00 +Label_EC1B: + lda ObjectActiveArray,x ; PRG:$2C1B B5 3A + bne Label_EC27 ; PRG:$2C1D D0 08 + lda #$FF ; PRG:$2C1F A9 FF + sta $0200,y ; PRG:$2C21 99 00 02 + sta $0204,y ; PRG:$2C24 99 04 02 +Label_EC27: + inx ; PRG:$2C27 E8 + tya ; PRG:$2C28 98 + clc ; PRG:$2C29 18 + adc #$30 ; PRG:$2C2A 69 30 + tay ; PRG:$2C2C A8 + lda $0231 ; PRG:$2C2D AD 31 02 + and #$F0 ; PRG:$2C30 29 F0 + cmp #$A0 ; PRG:$2C32 C9 A0 + beq Label_EC3A ; PRG:$2C34 F0 04 + cpx #$02 ; PRG:$2C36 E0 02 + bmi Label_EC1B ; PRG:$2C38 30 E1 +Label_EC3A: + rts ; PRG:$2C3A 60 + +;------------------------------------------------------------------------------ +; SpawnTwoTileObjectSprite +; +; Global description: +; Performs the decoded graphics operation represented by SpawnTwoTileObjectSprite at PRG $2C3B. +; +; Local description: +; Direct callees/tail targets: QueueObjectDeferredTasks. State and scratch fields referenced: Zp05, Zp06, Zp0F. Direct named writes: ObjectActiveArray, Zp0F. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +SpawnTwoTileObjectSprite: + ldy #$00 ; PRG:$2C3B A0 00 + sty Zp0F ; PRG:$2C3D 84 0F + jsr QueueObjectDeferredTasks ; PRG:$2C3F 20 84 EC +Label_EC42: + lda $0200,y ; PRG:$2C42 B9 00 02 + cmp #$FF ; PRG:$2C45 C9 FF + bne Label_EC78 ; PRG:$2C47 D0 2F + lda Zp05 ; PRG:$2C49 A5 05 + sta $0203,y ; PRG:$2C4B 99 03 02 + clc ; PRG:$2C4E 18 + adc #$08 ; PRG:$2C4F 69 08 + sta $0207,y ; PRG:$2C51 99 07 02 + lda Zp06 ; PRG:$2C54 A5 06 + sta $0200,y ; PRG:$2C56 99 00 02 + sta $0204,y ; PRG:$2C59 99 04 02 + lda TwoTileObjectTileTable,x ; PRG:$2C5C BD 14 C6 + sta $0201,y ; PRG:$2C5F 99 01 02 + lda #$01 ; PRG:$2C62 A9 01 + sta $0202,y ; PRG:$2C64 99 02 02 + lda #$F7 ; PRG:$2C67 A9 F7 + sta $0205,y ; PRG:$2C69 99 05 02 + lda #$01 ; PRG:$2C6C A9 01 + sta $0206,y ; PRG:$2C6E 99 06 02 + ldx Zp0F ; PRG:$2C71 A6 0F + lda #$04 ; PRG:$2C73 A9 04 + sta ObjectActiveArray,x ; PRG:$2C75 95 3A + rts ; PRG:$2C77 60 +Label_EC78: + tya ; PRG:$2C78 98 + clc ; PRG:$2C79 18 + adc #$30 ; PRG:$2C7A 69 30 + tay ; PRG:$2C7C A8 + inc Zp0F ; PRG:$2C7D E6 0F + cpy #$60 ; PRG:$2C7F C0 60 + bmi Label_EC42 ; PRG:$2C81 30 BF + rts ; PRG:$2C83 60 + +;------------------------------------------------------------------------------ +; QueueObjectDeferredTasks +; +; Global description: +; Queues deferred object, collision, and VRAM work associated with an object slot. +; +; Local description: +; Preserves X and Y, skips queueing while TwoPlayerModeFlag is nonzero, packs task type 1 with a stage-dependent low-nibble selector, loads the payload from ObjectTaskPayloadByIndex, and enqueues it. When PendingLevelObjectTask is clear, also queues the standard collision and VRAM tasks. +; +; Parameters: +; X selects an object payload byte in ObjectTaskPayloadByIndex; CurrentPlayerIndex contributes the task argument. +; +; Returns: +; Returns with X and Y restored. +; +; Clobbers: +; A, processor flags, and queue state through EnqueueTask. +;------------------------------------------------------------------------------ +QueueObjectDeferredTasks: + txa ; PRG:$2C84 8A + pha ; PRG:$2C85 48 + tya ; PRG:$2C86 98 + pha ; PRG:$2C87 48 + lda TwoPlayerModeFlag ; PRG:$2C88 A5 4E + bne Label_EC9F ; PRG:$2C8A D0 13 + lda CurrentPlayerIndex ; PRG:$2C8C A5 49 + ora #$18 ; PRG:$2C8E 09 18 + sta Zp01 ; PRG:$2C90 85 01 + lda ObjectTaskPayloadByIndex,x ; PRG:$2C92 BD 1B C6 + jsr EnqueueTask ; PRG:$2C95 20 7F EE + lda PendingLevelObjectTask ; PRG:$2C98 A5 E7 + bne Label_EC9F ; PRG:$2C9A D0 03 + jsr QueueCollisionAndVramTasks ; PRG:$2C9C 20 A4 EC +Label_EC9F: + pla ; PRG:$2C9F 68 + tay ; PRG:$2CA0 A8 + pla ; PRG:$2CA1 68 + tax ; PRG:$2CA2 AA + rts ; PRG:$2CA3 60 + +;------------------------------------------------------------------------------ +; QueueCollisionAndVramTasks +; +; Global description: +; Queues the standard collision test and VRAM update tasks. +; +; Local description: +; Enqueues task type 3 with payload $F9, then task type 4 with GameModeTimer as its payload. +; +; Parameters: +; GameModeTimer supplies the VRAM command-selection payload. +; +; Returns: +; Returns after attempting to enqueue both tasks. +; +; Clobbers: +; A, Zp01 and processor flags. +;------------------------------------------------------------------------------ +QueueCollisionAndVramTasks: + lda #$30 ; PRG:$2CA4 A9 30 + sta Zp01 ; PRG:$2CA6 85 01 + lda #$F9 ; PRG:$2CA8 A9 F9 + jsr EnqueueTask ; PRG:$2CAA 20 7F EE + lda #$40 ; PRG:$2CAD A9 40 + sta Zp01 ; PRG:$2CAF 85 01 + lda GameModeTimer ; PRG:$2CB1 A5 48 + jsr EnqueueTask ; PRG:$2CB3 20 7F EE + rts ; PRG:$2CB6 60 + +;------------------------------------------------------------------------------ +; PlayerCollisionStep_ECB7 +; +; Global description: +; Performs the decoded collision operation represented by PlayerCollisionStep_ECB7 at PRG $2CB7. +; +; Local description: +; Direct callees/tail targets: ProcessCollisionShape, TestPlayerAgainstSpriteObjects, GameplayUpdateStep_ED38, CollisionUpdateStep_DED4, SpawnTwoTileObjectSprite. State and scratch fields referenced: CollisionUpdateStep_DED4, GameplayUpdateStep_ED38, PlayerCollisionStep_ECB7, PlayerFacing, StageOrScreenIndex, StagePrimaryObjectCount, StageSecondaryObjectCount, Zp00, Zp01, Zp02, Zp03, Zp04. Direct named writes: SecondarySoundRequestFlags, Zp00, Zp01, Zp02, Zp03, Zp04. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerCollisionStep_ECB7: + lda StageOrScreenIndex ; PRG:$2CB7 A5 4A + cmp #$04 ; PRG:$2CB9 C9 04 + bne Label_ECBE ; PRG:$2CBB D0 01 + rts ; PRG:$2CBD 60 +Label_ECBE: + cmp #$01 ; PRG:$2CBE C9 01 + bne Label_ECC3 ; PRG:$2CC0 D0 01 + rts ; PRG:$2CC2 60 +Label_ECC3: + lda $05C6 ; PRG:$2CC3 AD C6 05 + beq Label_ECC9 ; PRG:$2CC6 F0 01 + rts ; PRG:$2CC8 60 +Label_ECC9: + lda Zp03 ; PRG:$2CC9 A5 03 + pha ; PRG:$2CCB 48 + lda Zp04 ; PRG:$2CCC A5 04 + pha ; PRG:$2CCE 48 + lda PlayerFacing ; PRG:$2CCF A5 6D + and #$01 ; PRG:$2CD1 29 01 + bne Label_ECDA ; PRG:$2CD3 D0 05 + ldx #$00 ; PRG:$2CD5 A2 00 + jmp Label_ECDC ; PRG:$2CD7 4C DC EC +Label_ECDA: + ldx #$02 ; PRG:$2CDA A2 02 +Label_ECDC: + lda SpawnedObjectCollisionShapePointerTable,x ; PRG:$2CDC BD 22 C6 + sta Zp02 ; PRG:$2CDF 85 02 + lda SpawnedObjectCollisionShapePointerHighBytes,x ; PRG:$2CE1 BD 23 C6 + sta Zp03 ; PRG:$2CE4 85 03 + lda $0213 ; PRG:$2CE6 AD 13 02 + sta Zp00 ; PRG:$2CE9 85 00 + lda $0210 ; PRG:$2CEB AD 10 02 + sta Zp01 ; PRG:$2CEE 85 01 + lda #$00 ; PRG:$2CF0 A9 00 + jsr ProcessCollisionShape ; PRG:$2CF2 20 75 EB + lda StageOrScreenIndex ; PRG:$2CF5 A5 4A + cmp #$03 ; PRG:$2CF7 C9 03 + beq Label_ED0A ; PRG:$2CF9 F0 0F + ldx StageSecondaryObjectCount ; PRG:$2CFB A6 B0 + ldy #$00 ; PRG:$2CFD A0 00 + jsr TestPlayerAgainstSpriteObjects ; PRG:$2CFF 20 1E D5 + beq Label_ED1F ; PRG:$2D02 F0 1B + jsr GameplayUpdateStep_ED38 ; PRG:$2D04 20 38 ED + jmp Label_ED1F ; PRG:$2D07 4C 1F ED +Label_ED0A: + ldx StagePrimaryObjectCount ; PRG:$2D0A A6 A0 + ldy #$00 ; PRG:$2D0C A0 00 + jsr TestPlayerAgainstSpriteObjects ; PRG:$2D0E 20 1E D5 + bne Label_ED1C ; PRG:$2D11 D0 09 + ldx StageSecondaryObjectCount ; PRG:$2D13 A6 B0 + ldy #$60 ; PRG:$2D15 A0 60 + jsr TestPlayerAgainstSpriteObjects ; PRG:$2D17 20 1E D5 + beq Label_ED1F ; PRG:$2D1A F0 03 +Label_ED1C: + jsr GameplayUpdateStep_ED38 ; PRG:$2D1C 20 38 ED +Label_ED1F: + jsr CollisionUpdateStep_DED4 ; PRG:$2D1F 20 D4 DE + pla ; PRG:$2D22 68 + sta Zp04 ; PRG:$2D23 85 04 + pla ; PRG:$2D25 68 + sta Zp03 ; PRG:$2D26 85 03 + ldx $05C6 ; PRG:$2D28 AE C6 05 + bne Label_ED2E ; PRG:$2D2B D0 01 + rts ; PRG:$2D2D 60 +Label_ED2E: + lda #$20 ; PRG:$2D2E A9 20 + sta SecondarySoundRequestFlags ; PRG:$2D30 85 FD + ldx #$00 ; PRG:$2D32 A2 00 + jsr SpawnTwoTileObjectSprite ; PRG:$2D34 20 3B EC + rts ; PRG:$2D37 60 + +;------------------------------------------------------------------------------ +; GameplayUpdateStep_ED38 +; +; Global description: +; Performs the decoded stage/game-state operation represented by GameplayUpdateStep_ED38 at PRG $2D38. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: GameplayUpdateStep_ED38, Zp00, Zp01, Zp05, Zp06. Direct named writes: Zp05, Zp06. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GameplayUpdateStep_ED38: + lda Zp00 ; PRG:$2D38 A5 00 + sta Zp05 ; PRG:$2D3A 85 05 + lda Zp01 ; PRG:$2D3C A5 01 + sta Zp06 ; PRG:$2D3E 85 06 + inc $05C6 ; PRG:$2D40 EE C6 05 + rts ; PRG:$2D43 60 + +;------------------------------------------------------------------------------ +; GameplayUpdateStep_ED44 +; +; Global description: +; Performs the decoded graphics operation represented by GameplayUpdateStep_ED44 at PRG $2D44. +; +; Local description: +; Direct callees/tail targets: SpawnTwoTileObjectSprite. State and scratch fields referenced: GameplayUpdateStep_ED44, Zp05, Zp06. Direct named writes: PreviousCollectedObjectCount, Zp05, Zp06. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GameplayUpdateStep_ED44: + lda CollectedObjectCount ; PRG:$2D44 A5 9E + cmp PreviousCollectedObjectCount ; PRG:$2D46 C5 9F + beq Label_ED56 ; PRG:$2D48 F0 0C + sta PreviousCollectedObjectCount ; PRG:$2D4A 85 9F + lda #$00 ; PRG:$2D4C A9 00 + sta $05C7 ; PRG:$2D4E 8D C7 05 + ldx #$04 ; PRG:$2D51 A2 04 + jmp Label_ED67 ; PRG:$2D53 4C 67 ED +Label_ED56: + inc $05C7 ; PRG:$2D56 EE C7 05 + lda #$01 ; PRG:$2D59 A9 01 + cmp $05C7 ; PRG:$2D5B CD C7 05 + bne Label_ED65 ; PRG:$2D5E D0 05 + ldx #$05 ; PRG:$2D60 A2 05 + jmp Label_ED67 ; PRG:$2D62 4C 67 ED +Label_ED65: + ldx #$06 ; PRG:$2D65 A2 06 +Label_ED67: + lda $0208 ; PRG:$2D67 AD 08 02 + sec ; PRG:$2D6A 38 + sbc #$08 ; PRG:$2D6B E9 08 + sta Zp06 ; PRG:$2D6D 85 06 + lda $020B ; PRG:$2D6F AD 0B 02 + sec ; PRG:$2D72 38 + sbc #$04 ; PRG:$2D73 E9 04 + sta Zp05 ; PRG:$2D75 85 05 + jsr SpawnTwoTileObjectSprite ; PRG:$2D77 20 3B EC + rts ; PRG:$2D7A 60 + +;------------------------------------------------------------------------------ +; GameplayUpdateStep_ED7B +; +; Global description: +; Performs the decoded graphics operation represented by GameplayUpdateStep_ED7B at PRG $2D7B. +; +; Local description: +; Direct callees/tail targets: SpawnTwoTileObjectSprite. State and scratch fields referenced: GameplayUpdateStep_ED7B, Zp05, Zp06. Direct named writes: Zp05, Zp06. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +GameplayUpdateStep_ED7B: + lda $0233 ; PRG:$2D7B AD 33 02 + sta Zp05 ; PRG:$2D7E 85 05 + lda $0230 ; PRG:$2D80 AD 30 02 + sec ; PRG:$2D83 38 + sbc #$04 ; PRG:$2D84 E9 04 + sta Zp06 ; PRG:$2D86 85 06 + ldx #$03 ; PRG:$2D88 A2 03 + jsr SpawnTwoTileObjectSprite ; PRG:$2D8A 20 3B EC + rts ; PRG:$2D8D 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_ED8E +; +; Global description: +; Performs the decoded graphics operation represented by PlayerUpdateStep_ED8E at PRG $2D8E. +; +; Local description: +; Direct callees/tail targets: SpawnTwoTileObjectSprite. State and scratch fields referenced: PlayerUpdateStep_ED8E, Zp01, Zp05, Zp06. Direct named writes: Zp01, Zp05, Zp06. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_ED8E: + lda Zp01 ; PRG:$2D8E A5 01 + pha ; PRG:$2D90 48 + txa ; PRG:$2D91 8A + pha ; PRG:$2D92 48 + lda $05E7,x ; PRG:$2D93 BD E7 05 + sta Zp05 ; PRG:$2D96 85 05 + lda $05E8,x ; PRG:$2D98 BD E8 05 + clc ; PRG:$2D9B 18 + adc #$18 ; PRG:$2D9C 69 18 + sta Zp06 ; PRG:$2D9E 85 06 + ldx #$01 ; PRG:$2DA0 A2 01 + jsr SpawnTwoTileObjectSprite ; PRG:$2DA2 20 3B EC + pla ; PRG:$2DA5 68 + tax ; PRG:$2DA6 AA + pla ; PRG:$2DA7 68 + sta Zp01 ; PRG:$2DA8 85 01 + rts ; PRG:$2DAA 60 + +;------------------------------------------------------------------------------ +; CollisionStateStep_EDAB +; +; Global description: +; Performs the decoded collision operation represented by CollisionStateStep_EDAB at PRG $2DAB. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: CollisionStateStep_EDAB, GameStateTimer, PlayerInputDirection, PlayerState. Direct named writes: DemoInputActive, DemoInputCode, DemoInputIndex, DemoInputTimer, GameStateTimer, PlayerInputDirection, PlayerState, RandomLfsr0, RandomLfsr1. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionStateStep_EDAB: + lda DemoInputActive ; PRG:$2DAB A5 E8 + bne Label_EDC6 ; PRG:$2DAD D0 17 + lda #$01 ; PRG:$2DAF A9 01 + sta DemoInputActive ; PRG:$2DB1 85 E8 + lda #$00 ; PRG:$2DB3 A9 00 + sta DemoInputIndex ; PRG:$2DB5 85 4F + sta DemoInputTimer ; PRG:$2DB7 85 50 + lda #$0F ; PRG:$2DB9 A9 0F + sta RandomLfsr0 ; PRG:$2DBB 85 18 + lda #$13 ; PRG:$2DBD A9 13 + sta RandomLfsr1 ; PRG:$2DBF 85 19 + lda #$09 ; PRG:$2DC1 A9 09 + sta GameStateTimer ; PRG:$2DC3 85 39 + rts ; PRG:$2DC5 60 +Label_EDC6: + lda DemoInputTimer ; PRG:$2DC6 A5 50 + beq Label_EDDC ; PRG:$2DC8 F0 12 + lda DemoInputCode ; PRG:$2DCA A5 51 + cmp #$05 ; PRG:$2DCC C9 05 + bne Label_EDD7 ; PRG:$2DCE D0 07 + lda #$03 ; PRG:$2DD0 A9 03 + sta PlayerState ; PRG:$2DD2 85 6B + jmp Label_EDD9 ; PRG:$2DD4 4C D9 ED +Label_EDD7: + sta PlayerInputDirection ; PRG:$2DD7 85 54 +Label_EDD9: + dec DemoInputTimer ; PRG:$2DD9 C6 50 + rts ; PRG:$2DDB 60 +Label_EDDC: + sta $0515 ; PRG:$2DDC 8D 15 05 + ldx DemoInputIndex ; PRG:$2DDF A6 4F + lda DemoInputDurationTable,x ; PRG:$2DE1 BD 4E C6 + sta DemoInputTimer ; PRG:$2DE4 85 50 + lda DemoInputCodeTable,x ; PRG:$2DE6 BD 2E C6 + sta DemoInputCode ; PRG:$2DE9 85 51 + inc DemoInputIndex ; PRG:$2DEB E6 4F + rts ; PRG:$2DED 60 + +;------------------------------------------------------------------------------ +; CollisionComputeStep_EDEE +; +; Global description: +; Performs the decoded collision operation represented by CollisionComputeStep_EDEE at PRG $2DEE. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: CollisionBounds1, CollisionBounds2, CollisionComputeStep_EDEE. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionComputeStep_EDEE: + lda SelectedPlayerMode ; PRG:$2DEE A5 EF + and #$01 ; PRG:$2DF0 29 01 + asl a ; PRG:$2DF2 0A + tax ; PRG:$2DF3 AA + lda CollisionBounds1 ; PRG:$2DF4 A5 21 + sta $05D6,x ; PRG:$2DF6 9D D6 05 + lda CollisionBounds2 ; PRG:$2DF9 A5 22 + sta $05D7,x ; PRG:$2DFB 9D D7 05 + rts ; PRG:$2DFE 60 + +;------------------------------------------------------------------------------ +; CollisionUpdateStep_EDFF +; +; Global description: +; Performs the decoded collision operation represented by CollisionUpdateStep_EDFF at PRG $2DFF. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: CollisionBounds1, CollisionBounds2, CollisionUpdateStep_EDFF. Direct named writes: CollisionBounds1, CollisionBounds2. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +CollisionUpdateStep_EDFF: + lda SelectedPlayerMode ; PRG:$2DFF A5 EF + and #$01 ; PRG:$2E01 29 01 + asl a ; PRG:$2E03 0A + tax ; PRG:$2E04 AA + lda $05D6,x ; PRG:$2E05 BD D6 05 + sta CollisionBounds1 ; PRG:$2E08 85 21 + lda $05D7,x ; PRG:$2E0A BD D7 05 + sta CollisionBounds2 ; PRG:$2E0D 85 22 + rts ; PRG:$2E0F 60 + +;------------------------------------------------------------------------------ +; PlayerUpdateStep_EE10 +; +; Global description: +; Performs the decoded player-state operation represented by PlayerUpdateStep_EE10 at PRG $2E10. +; +; Local description: +; Direct callees/tail targets: UpdateExistingBoundingBox, QueueSelectedHudFields. State and scratch fields referenced: PlayerState, PlayerUpdateStep_EE10, PlayerVerticalPosition, Zp00, Zp01. Direct named writes: ActionCooldown, PlayerState, Zp00, Zp01. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PlayerUpdateStep_EE10: + lda ActionCooldown ; PRG:$2E10 A5 3C + beq Label_EE15 ; PRG:$2E12 F0 01 + rts ; PRG:$2E14 60 +Label_EE15: + lda PlayerVerticalPosition ; PRG:$2E15 A5 2E + bne Label_EE1E ; PRG:$2E17 D0 05 + lda #$05 ; PRG:$2E19 A9 05 + sta PlayerState ; PRG:$2E1B 85 6B + rts ; PRG:$2E1D 60 +Label_EE1E: + lda #$0F ; PRG:$2E1E A9 0F + sta ActionCooldown ; PRG:$2E20 85 3C + lda #$01 ; PRG:$2E22 A9 01 + sta Zp00 ; PRG:$2E24 85 00 + lda #$0A ; PRG:$2E26 A9 0A + sta Zp01 ; PRG:$2E28 85 01 + jsr UpdateExistingBoundingBox ; PRG:$2E2A 20 40 F0 + lda #$02 ; PRG:$2E2D A9 02 + sta Zp00 ; PRG:$2E2F 85 00 + lda #$01 ; PRG:$2E31 A9 01 + sta $05C8 ; PRG:$2E33 8D C8 05 + jsr QueueSelectedHudFields; PRG:$2E36 20 50 EF + rts ; PRG:$2E39 60 + +;------------------------------------------------------------------------------ +; ProcessQueuedTask +; +; Global description: +; Dispatches one queued deferred task when the VRAM output buffer is idle. +; +; Local description: +; Checks that no buffered VRAM command is pending, reads the next two-byte task record from the ring at $0302, derives a handler-table index from its high nibble, clears the consumed record, advances the queue cursor, loads the low-nibble argument into Zp01 and the following byte into Zp00, then tail-dispatches through Zp02/Zp03. A synthetic return address sends handlers back to $EE3A. +; +; Parameters: +; $0300 selects the current task record. Each record uses a type/argument byte at $0302,X and payload byte at $0303,X. +; +; Returns: +; Returns when no task can run; dispatched handlers return to the dispatcher continuation at $EE3A. +; +; Clobbers: +; A, X, Y, Zp00-Zp03 and processor flags. +;------------------------------------------------------------------------------ +ProcessQueuedTask: + lda $0331 ; PRG:$2E3A AD 31 03 + bne Label_EE7E ; PRG:$2E3D D0 3F + ldx $0300 ; PRG:$2E3F AE 00 03 + lda $0302,x ; PRG:$2E42 BD 02 03 + beq Label_EE7E ; PRG:$2E45 F0 37 + and #$F0 ; PRG:$2E47 29 F0 + lsr a ; PRG:$2E49 4A + lsr a ; PRG:$2E4A 4A + lsr a ; PRG:$2E4B 4A + tay ; PRG:$2E4C A8 + lda $BFFE,y ; PRG:$2E4D B9 FE BF + sta Zp02 ; PRG:$2E50 85 02 + iny ; PRG:$2E52 C8 + lda $BFFE,y ; PRG:$2E53 B9 FE BF + sta Zp03 ; PRG:$2E56 85 03 + lda $0302,x ; PRG:$2E58 BD 02 03 + and #$0F ; PRG:$2E5B 29 0F + sta Zp01 ; PRG:$2E5D 85 01 + lda #$00 ; PRG:$2E5F A9 00 + sta $0302,x ; PRG:$2E61 9D 02 03 + lda #$EE ; PRG:$2E64 A9 EE + pha ; PRG:$2E66 48 + lda #$39 ; PRG:$2E67 A9 39 + pha ; PRG:$2E69 48 + inx ; PRG:$2E6A E8 + inx ; PRG:$2E6B E8 + txa ; PRG:$2E6C 8A + cmp #$2E ; PRG:$2E6D C9 2E + bcc Label_EE73 ; PRG:$2E6F 90 02 + lda #$00 ; PRG:$2E71 A9 00 +Label_EE73: + sta $0300 ; PRG:$2E73 8D 00 03 + lda $0301,x ; PRG:$2E76 BD 01 03 + sta Zp00 ; PRG:$2E79 85 00 + jmp (Zp02) ; PRG:$2E7B 6C 02 00 +Label_EE7E: + rts ; PRG:$2E7E 60 + +;------------------------------------------------------------------------------ +; EnqueueTask +; +; Global description: +; Appends a two-byte deferred task to the producer ring at $0302. +; +; Local description: +; Uses the producer cursor at $0301. If the selected slot is empty, stores the payload from A and type/argument byte from Zp01, advances by two bytes, and wraps at $2E. +; +; Parameters: +; A is the task payload; Zp01 is the packed task type and argument. +; +; Returns: +; Returns with the task queued, or unchanged if the selected slot is occupied. +; +; Clobbers: +; A, X, Y and processor flags. +;------------------------------------------------------------------------------ +EnqueueTask: + ldx $0301 ; PRG:$2E7F AE 01 03 + ldy $0302,x ; PRG:$2E82 BC 02 03 + bne Label_EE9B ; PRG:$2E85 D0 14 + sta $0303,x ; PRG:$2E87 9D 03 03 + lda Zp01 ; PRG:$2E8A A5 01 + sta $0302,x ; PRG:$2E8C 9D 02 03 + inx ; PRG:$2E8F E8 + inx ; PRG:$2E90 E8 + txa ; PRG:$2E91 8A + cmp #$2E ; PRG:$2E92 C9 2E + bcc Label_EE98 ; PRG:$2E94 90 02 + lda #$00 ; PRG:$2E96 A9 00 +Label_EE98: + sta $0301 ; PRG:$2E98 8D 01 03 +Label_EE9B: + rts ; PRG:$2E9B 60 + +;------------------------------------------------------------------------------ +; FlushQueuedVramCommands +; +; Global description: +; Executes the dynamic VRAM command buffer and resets it for the next frame. +; +; Local description: +; Points Zp00/Zp01 to $0331, calls ProcessVramCommandStreamAndRestoreScroll, then clears the cursor at $0330 and writes a zero terminator at $0331. +; +; Parameters: +; `$0330` contains the used-byte count and `$0331` begins a valid zero-terminated command stream. +; +; Returns: +; Returns with the queued stream consumed and the command buffer empty. +; +; Clobbers: +; A, X, Y, Zp00/Zp01, $0330/$0331, PPU state touched by the decoder, and processor flags. +;------------------------------------------------------------------------------ +FlushQueuedVramCommands: + lda #$31 ; PRG:$2E9C A9 31 + sta Zp00 ; PRG:$2E9E 85 00 + lda #$03 ; PRG:$2EA0 A9 03 + sta Zp01 ; PRG:$2EA2 85 01 + jsr ProcessVramCommandStreamAndRestoreScroll; PRG:$2EA4 20 3C EF + lda #$00 ; PRG:$2EA7 A9 00 + sta $0330 ; PRG:$2EA9 8D 30 03 + sta $0331 ; PRG:$2EAC 8D 31 03 + rts ; PRG:$2EAF 60 + +;------------------------------------------------------------------------------ +; PerformOamDma +; +; Global description: +; Performs the decoded graphics operation represented by PerformOamDma at PRG $2EB0. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. Direct named writes: OAMADDR, OAMDMA. Hardware registers: OAMADDR, OAMDMA. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +PerformOamDma: + lda #$00 ; PRG:$2EB0 A9 00 + sta OAMADDR ; PRG:$2EB2 8D 03 20 + lda #$02 ; PRG:$2EB5 A9 02 + sta OAMDMA ; PRG:$2EB7 8D 14 40 + rts ; PRG:$2EBA 60 + +;------------------------------------------------------------------------------ +; FillNametableAndClearAttributes +; +; Global description: +; Fills one complete nametable and clears its attribute table. +; +; Local description: +; Selects the nametable from one-based selector Zp01, disables vertical PPU increment, writes the tile value in Zp00 across 1,024 nametable bytes, then clears the corresponding 64-byte attribute region. +; +; Parameters: +; Zp00 is the fill tile; Zp01 is the one-based nametable selector. +; +; Returns: +; Returns after all tile and attribute bytes have been written. +; +; Clobbers: +; A, X, Y, Zp01/Zp02, PPUCTRL shadow and processor flags. +;------------------------------------------------------------------------------ +FillNametableAndClearAttributes: + lda PPUSTATUS ; PRG:$2EBB AD 02 20 + lda PPUControlShadow ; PRG:$2EBE A5 10 + and #$FB ; PRG:$2EC0 29 FB + sta PPUCTRL ; PRG:$2EC2 8D 00 20 + sta PPUControlShadow ; PRG:$2EC5 85 10 + lda #$1C ; PRG:$2EC7 A9 1C + clc ; PRG:$2EC9 18 +Label_EECA: + adc #$04 ; PRG:$2ECA 69 04 + dec Zp01 ; PRG:$2ECC C6 01 + bne Label_EECA ; PRG:$2ECE D0 FA + sta Zp02 ; PRG:$2ED0 85 02 + sta PPUADDR ; PRG:$2ED2 8D 06 20 + lda #$00 ; PRG:$2ED5 A9 00 + sta PPUADDR ; PRG:$2ED7 8D 06 20 + ldx #$04 ; PRG:$2EDA A2 04 + ldy #$00 ; PRG:$2EDC A0 00 + lda Zp00 ; PRG:$2EDE A5 00 +Label_EEE0: + sta PPUDATA ; PRG:$2EE0 8D 07 20 + dey ; PRG:$2EE3 88 + bne Label_EEE0 ; PRG:$2EE4 D0 FA + dex ; PRG:$2EE6 CA + bne Label_EEE0 ; PRG:$2EE7 D0 F7 + lda Zp02 ; PRG:$2EE9 A5 02 + adc #$03 ; PRG:$2EEB 69 03 + sta PPUADDR ; PRG:$2EED 8D 06 20 + lda #$C0 ; PRG:$2EF0 A9 C0 + sta PPUADDR ; PRG:$2EF2 8D 06 20 + ldy #$40 ; PRG:$2EF5 A0 40 + lda #$00 ; PRG:$2EF7 A9 00 +Label_EEF9: + sta PPUDATA ; PRG:$2EF9 8D 07 20 + dey ; PRG:$2EFC 88 + bne Label_EEF9 ; PRG:$2EFD D0 FA + rts ; PRG:$2EFF 60 +Label_EF00: + sta PPUADDR ; PRG:$2F00 8D 06 20 + iny ; PRG:$2F03 C8 + lda (Zp00),y ; PRG:$2F04 B1 00 + sta PPUADDR ; PRG:$2F06 8D 06 20 + iny ; PRG:$2F09 C8 + lda (Zp00),y ; PRG:$2F0A B1 00 + asl a ; PRG:$2F0C 0A + pha ; PRG:$2F0D 48 + lda PPUControlShadow ; PRG:$2F0E A5 10 + ora #$04 ; PRG:$2F10 09 04 + bcs Label_EF16 ; PRG:$2F12 B0 02 + and #$FB ; PRG:$2F14 29 FB +Label_EF16: + sta PPUCTRL ; PRG:$2F16 8D 00 20 + sta PPUControlShadow ; PRG:$2F19 85 10 + pla ; PRG:$2F1B 68 + asl a ; PRG:$2F1C 0A + bcc Label_EF22 ; PRG:$2F1D 90 03 + ora #$02 ; PRG:$2F1F 09 02 + iny ; PRG:$2F21 C8 +Label_EF22: + lsr a ; PRG:$2F22 4A + lsr a ; PRG:$2F23 4A + tax ; PRG:$2F24 AA +Label_EF25: + bcs Label_EF28 ; PRG:$2F25 B0 01 + iny ; PRG:$2F27 C8 +Label_EF28: + lda (Zp00),y ; PRG:$2F28 B1 00 + sta PPUDATA ; PRG:$2F2A 8D 07 20 + dex ; PRG:$2F2D CA + bne Label_EF25 ; PRG:$2F2E D0 F5 + sec ; PRG:$2F30 38 + tya ; PRG:$2F31 98 + adc Zp00 ; PRG:$2F32 65 00 + sta Zp00 ; PRG:$2F34 85 00 + lda #$00 ; PRG:$2F36 A9 00 + adc Zp01 ; PRG:$2F38 65 01 + sta Zp01 ; PRG:$2F3A 85 01 + +;------------------------------------------------------------------------------ +; ProcessVramCommandStreamAndRestoreScroll +; +; Global description: +; Decodes a zero-terminated VRAM command stream and restores the software scroll position. +; +; Local description: +; Reads PPU address high, address low, and control from the stream at Zp00/Zp01. Control bits 0-5 are the length, bit 6 selects repeated-byte payloads, and bit 7 selects PPU increment-by-32. Literal records consume one byte per write; repeated records reuse one payload byte. The stream pointer advances to the next record and a zero address-high byte terminates processing. +; +; Parameters: +; Zp00/Zp01 point to an encoded stream. Execution must occur during a PPU-safe interval such as NMI or disabled rendering. +; +; Returns: +; Returns after writing PPUScrollXShadow and PPUScrollYShadow to PPUSCROLL. +; +; Clobbers: +; A, X, Y, Zp00/Zp01, PPUCTRL, PPUDATA, PPUSCROLL, PPUControlShadow, and processor flags. +;------------------------------------------------------------------------------ +ProcessVramCommandStreamAndRestoreScroll: + ldx PPUSTATUS ; PRG:$2F3C AE 02 20 + ldy #$00 ; PRG:$2F3F A0 00 + lda (Zp00),y ; PRG:$2F41 B1 00 + bne Label_EF00 ; PRG:$2F43 D0 BB + lda PPUScrollXShadow ; PRG:$2F45 A5 12 + sta PPUSCROLL ; PRG:$2F47 8D 05 20 + lda PPUScrollYShadow ; PRG:$2F4A A5 13 + sta PPUSCROLL ; PRG:$2F4C 8D 05 20 + rts ; PRG:$2F4F 60 + +;------------------------------------------------------------------------------ +; QueueSelectedHudFields +; +; Global description: +; Queues selected numeric HUD fields from a destructive selection mask. +; +; Local description: +; Shifts Zp00 once per descriptor while A counts from four down through zero. A set carry queues the corresponding four-byte HudDigitDescriptorTable entry through QueueHudDigitsByDescriptor. +; +; Parameters: +; Zp00 is the field-selection mask. Packed BCD-like source nibbles begin at CollisionBounds0 and adjacent bytes. +; +; Returns: +; Returns after testing all five descriptor positions; Zp00 has been shifted to zero. +; +; Clobbers: +; A, X, Y, Zp00-Zp03, the VRAM command buffer, and processor flags. +;------------------------------------------------------------------------------ +QueueSelectedHudFields: + lda #$04 ; PRG:$2F50 A9 04 +Label_EF52: + lsr Zp00 ; PRG:$2F52 46 00 + bcc Label_EF5B ; PRG:$2F54 90 05 + pha ; PRG:$2F56 48 + jsr QueueHudDigitsByDescriptor ; PRG:$2F57 20 61 EF + pla ; PRG:$2F5A 68 +Label_EF5B: + clc ; PRG:$2F5B 18 + sbc #$00 ; PRG:$2F5C E9 00 + bpl Label_EF52 ; PRG:$2F5E 10 F2 + rts ; PRG:$2F60 60 + +;------------------------------------------------------------------------------ +; QueueHudDigitsByDescriptor +; +; Global description: +; Builds one HUD digit update in the dynamic VRAM command buffer. +; +; Local description: +; Multiplies descriptor index A by four, appends the descriptor PPU address and digit count, then converts packed source nibbles to tile values in reverse buffer order. Descriptor flag bit zero optionally appends an additional tile. The routine updates $0330 and preserves a zero terminator, aborting through the overflow guard when needed. +; +; Parameters: +; A is descriptor index 0-4. HudDigitDescriptorTable supplies destination, count, and source flags. CollisionBounds0 onward supplies packed digit nibbles. +; +; Returns: +; Returns with one complete buffered VRAM command, or without overrunning the buffer. +; +; Clobbers: +; A, X, Y, Zp01-Zp03, $0330-$0360, and processor flags. +;------------------------------------------------------------------------------ +QueueHudDigitsByDescriptor: + asl a ; PRG:$2F61 0A + asl a ; PRG:$2F62 0A + tay ; PRG:$2F63 A8 + sta Zp02 ; PRG:$2F64 85 02 + ldx $0330 ; PRG:$2F66 AE 30 03 + lda HudDigitDescriptorTable,y ; PRG:$2F69 B9 0A C0 + sta $0331,x ; PRG:$2F6C 9D 31 03 + jsr AdvanceVramBufferCursor ; PRG:$2F6F 20 2C F0 + iny ; PRG:$2F72 C8 + lda HudDigitDescriptorTable,y ; PRG:$2F73 B9 0A C0 + sta $0331,x ; PRG:$2F76 9D 31 03 + jsr AdvanceVramBufferCursor ; PRG:$2F79 20 2C F0 + iny ; PRG:$2F7C C8 + lda HudDigitDescriptorTable,y ; PRG:$2F7D B9 0A C0 + and #$07 ; PRG:$2F80 29 07 + sta $0331,x ; PRG:$2F82 9D 31 03 + sta Zp01 ; PRG:$2F85 85 01 + txa ; PRG:$2F87 8A + sec ; PRG:$2F88 38 + adc Zp01 ; PRG:$2F89 65 01 + jsr AbortVramAppendOnOverflow ; PRG:$2F8B 20 2E F0 + tax ; PRG:$2F8E AA + stx $0330 ; PRG:$2F8F 8E 30 03 + lda #$00 ; PRG:$2F92 A9 00 + sta $0331,x ; PRG:$2F94 9D 31 03 + iny ; PRG:$2F97 C8 + lda HudDigitDescriptorTable,y ; PRG:$2F98 B9 0A C0 + sta Zp03 ; PRG:$2F9B 85 03 +Label_EF9D: + dex ; PRG:$2F9D CA + lda a:CollisionBounds0,y ; PRG:$2F9E B9 20 00 + and #$0F ; PRG:$2FA1 29 0F + sta $0331,x ; PRG:$2FA3 9D 31 03 + dec Zp01 ; PRG:$2FA6 C6 01 + beq Label_EFBC ; PRG:$2FA8 F0 12 + dex ; PRG:$2FAA CA + lda a:CollisionBounds0,y ; PRG:$2FAB B9 20 00 + and #$F0 ; PRG:$2FAE 29 F0 + lsr a ; PRG:$2FB0 4A + lsr a ; PRG:$2FB1 4A + lsr a ; PRG:$2FB2 4A + lsr a ; PRG:$2FB3 4A + sta $0331,x ; PRG:$2FB4 9D 31 03 + dey ; PRG:$2FB7 88 + dec Zp01 ; PRG:$2FB8 C6 01 + bne Label_EF9D ; PRG:$2FBA D0 E1 +Label_EFBC: + lda Zp03 ; PRG:$2FBC A5 03 + and #$01 ; PRG:$2FBE 29 01 + beq Label_EFCD ; PRG:$2FC0 F0 0B + ldy Zp02 ; PRG:$2FC2 A4 02 + clc ; PRG:$2FC4 18 + lda a:CollisionBounds0,y ; PRG:$2FC5 B9 20 00 + adc #$37 ; PRG:$2FC8 69 37 + sta $0331,x ; PRG:$2FCA 9D 31 03 +Label_EFCD: + rts ; PRG:$2FCD 60 + +;------------------------------------------------------------------------------ +; QueueRectangularVramTransfer +; +; Global description: +; Encodes a rectangular RAM-to-VRAM copy as one literal command per row. +; +; Local description: +; Appends each row as PPU address high, PPU address low, row width, and row payload. It increments the source pointer by width and the PPU destination by Zp06 after each row, updates the command-buffer cursor, and writes a zero terminator. +; +; Parameters: +; Zp00/Zp01 source pointer; Zp02/Zp03 initial PPU address; Zp04 row width; Zp05 row count; Zp06 PPU row increment. +; +; Returns: +; Returns with all rows appended when buffer capacity permits. +; +; Clobbers: +; A, X, Y, Zp00-Zp06, $0330-$0360, and processor flags. +;------------------------------------------------------------------------------ +QueueRectangularVramTransfer: + txa ; PRG:$2FCE 8A + pha ; PRG:$2FCF 48 + tya ; PRG:$2FD0 98 + pha ; PRG:$2FD1 48 + ldy #$00 ; PRG:$2FD2 A0 00 + lda (Zp02),y ; PRG:$2FD4 B1 02 + and #$0F ; PRG:$2FD6 29 0F + sta Zp05 ; PRG:$2FD8 85 05 + lda (Zp02),y ; PRG:$2FDA B1 02 + lsr a ; PRG:$2FDC 4A + lsr a ; PRG:$2FDD 4A + lsr a ; PRG:$2FDE 4A + lsr a ; PRG:$2FDF 4A + sta Zp04 ; PRG:$2FE0 85 04 + ldx $0330 ; PRG:$2FE2 AE 30 03 +Label_EFE5: + lda Zp01 ; PRG:$2FE5 A5 01 + sta $0331,x ; PRG:$2FE7 9D 31 03 + jsr AdvanceVramBufferCursor ; PRG:$2FEA 20 2C F0 + lda Zp00 ; PRG:$2FED A5 00 + sta $0331,x ; PRG:$2FEF 9D 31 03 + jsr AdvanceVramBufferCursor ; PRG:$2FF2 20 2C F0 + lda Zp04 ; PRG:$2FF5 A5 04 + sta Zp06 ; PRG:$2FF7 85 06 + ora #$80 ; PRG:$2FF9 09 80 + sta $0331,x ; PRG:$2FFB 9D 31 03 +Label_EFFE: + jsr AdvanceVramBufferCursor ; PRG:$2FFE 20 2C F0 + iny ; PRG:$3001 C8 + lda (Zp02),y ; PRG:$3002 B1 02 + sta $0331,x ; PRG:$3004 9D 31 03 + dec Zp06 ; PRG:$3007 C6 06 + bne Label_EFFE ; PRG:$3009 D0 F3 + jsr AdvanceVramBufferCursor ; PRG:$300B 20 2C F0 + clc ; PRG:$300E 18 + lda #$01 ; PRG:$300F A9 01 + adc Zp00 ; PRG:$3011 65 00 + sta Zp00 ; PRG:$3013 85 00 + lda #$00 ; PRG:$3015 A9 00 + adc Zp01 ; PRG:$3017 65 01 + sta Zp01 ; PRG:$3019 85 01 + stx $0330 ; PRG:$301B 8E 30 03 + dec Zp05 ; PRG:$301E C6 05 + bne Label_EFE5 ; PRG:$3020 D0 C3 + lda #$00 ; PRG:$3022 A9 00 + sta $0331,x ; PRG:$3024 9D 31 03 +Label_F027: + pla ; PRG:$3027 68 + tay ; PRG:$3028 A8 + pla ; PRG:$3029 68 + tax ; PRG:$302A AA + rts ; PRG:$302B 60 + +;------------------------------------------------------------------------------ +; AdvanceVramBufferCursor +; +; Global description: +; Performs the decoded graphics operation represented by AdvanceVramBufferCursor at PRG $302C. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AdvanceVramBufferCursor: + inx ; PRG:$302C E8 + txa ; PRG:$302D 8A + +;------------------------------------------------------------------------------ +; AbortVramAppendOnOverflow +; +; Global description: +; Performs the decoded graphics operation represented by AbortVramAppendOnOverflow at PRG $302E. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AbortVramAppendOnOverflow: + cmp #$3F ; PRG:$302E C9 3F + bcc Label_F03F ; PRG:$3030 90 0D + ldx $0330 ; PRG:$3032 AE 30 03 + lda #$00 ; PRG:$3035 A9 00 + sta $0331,x ; PRG:$3037 9D 31 03 + pla ; PRG:$303A 68 + pla ; PRG:$303B 68 + jmp Label_F027 ; PRG:$303C 4C 27 F0 +Label_F03F: + rts ; PRG:$303F 60 + +;------------------------------------------------------------------------------ +; UpdateExistingBoundingBox +; +; Global description: +; Applies a packed coordinate update to an existing bounding-box record. +; +; Local description: +; Sets the update-mode flag to $FF, clears the temporary delta bytes, routes the task payload into the selected axis byte, and tail-calls ApplyPackedBoundingBoxUpdate. +; +; Parameters: +; Zp00 is the packed coordinate delta; Zp01 packs the bounding-box index and axis selector. +; +; Returns: +; Returns after updating the selected bounding-box record. +; +; Clobbers: +; A, X, Zp04-Zp07 and processor flags. +;------------------------------------------------------------------------------ +UpdateExistingBoundingBox: + ldx #$FF ; PRG:$3040 A2 FF + bne Label_F046 ; PRG:$3042 D0 02 + +;------------------------------------------------------------------------------ +; InitializeBoundingBox +; +; Global description: +; Initializes or activates a bounding-box record from a packed coordinate value. +; +; Local description: +; Clears update mode and temporary delta bytes, routes the task payload into the selected axis byte, and calls ApplyPackedBoundingBoxUpdate to populate the selected four-byte record. +; +; Parameters: +; Zp00 is the packed coordinate value; Zp01 packs the bounding-box index and axis selector. +; +; Returns: +; Returns after initializing the selected bounding-box record. +; +; Clobbers: +; A, X, Zp04-Zp07 and processor flags. +;------------------------------------------------------------------------------ +InitializeBoundingBox: + ldx #$00 ; PRG:$3044 A2 00 +Label_F046: + stx Zp04 ; PRG:$3046 86 04 + ldx #$00 ; PRG:$3048 A2 00 + stx Zp05 ; PRG:$304A 86 05 + stx Zp06 ; PRG:$304C 86 06 + stx Zp07 ; PRG:$304E 86 07 + lda Zp01 ; PRG:$3050 A5 01 + and #$08 ; PRG:$3052 29 08 + bne Label_F057 ; PRG:$3054 D0 01 + inx ; PRG:$3056 E8 +Label_F057: + lda Zp00 ; PRG:$3057 A5 00 + sta Zp06,x ; PRG:$3059 95 06 + lda Zp01 ; PRG:$305B A5 01 + jsr ApplyPackedBoundingBoxUpdate; PRG:$305D 20 61 F0 + rts ; PRG:$3060 60 + +;------------------------------------------------------------------------------ +; ApplyPackedBoundingBoxUpdate +; +; Global description: +; Applies packed coordinate data to one four-byte bounding-box record. +; +; Local description: +; Selects a record from the low three bits of A, then either initializes, toggles, or offsets its four packed coordinate fields using Zp05-Zp07 and the packed-coordinate arithmetic helpers. +; +; Parameters: +; A contains the packed box selector; Zp04 selects initialize/update behavior; Zp05-Zp07 contain coordinate deltas. +; +; Returns: +; Returns after updating the selected record. +; +; Clobbers: +; A, X, Zp02/Zp03 and processor flags. +;------------------------------------------------------------------------------ +ApplyPackedBoundingBoxUpdate: + and #$07 ; PRG:$3061 29 07 + asl a ; PRG:$3063 0A + asl a ; PRG:$3064 0A + tax ; PRG:$3065 AA + lda Zp04 ; PRG:$3066 A5 04 + beq Label_F091 ; PRG:$3068 F0 27 + lda BoundingBoxFlags,x ; PRG:$306A B5 24 + beq Label_F095 ; PRG:$306C F0 27 +Label_F06E: + clc ; PRG:$306E 18 + lda BoundingBoxCoord3,x ; PRG:$306F B5 27 + sta Zp03 ; PRG:$3071 85 03 + lda Zp07 ; PRG:$3073 A5 07 + jsr AddPackedCoordinateDelta ; PRG:$3075 20 E6 F0 + sta BoundingBoxCoord3,x ; PRG:$3078 95 27 + lda BoundingBoxCoord2,x ; PRG:$307A B5 26 + sta Zp03 ; PRG:$307C 85 03 + lda Zp06 ; PRG:$307E A5 06 + jsr AddPackedCoordinateDelta ; PRG:$3080 20 E6 F0 + sta BoundingBoxCoord2,x ; PRG:$3083 95 26 + lda BoundingBoxCoord1,x ; PRG:$3085 B5 25 + sta Zp03 ; PRG:$3087 85 03 + lda Zp05 ; PRG:$3089 A5 05 + jsr AddPackedCoordinateDelta ; PRG:$308B 20 E6 F0 + sta BoundingBoxCoord1,x ; PRG:$308E 95 25 + rts ; PRG:$3090 60 +Label_F091: + lda BoundingBoxFlags,x ; PRG:$3091 B5 24 + beq Label_F06E ; PRG:$3093 F0 D9 +Label_F095: + sec ; PRG:$3095 38 + lda BoundingBoxCoord3,x ; PRG:$3096 B5 27 + sta Zp03 ; PRG:$3098 85 03 + lda Zp07 ; PRG:$309A A5 07 + jsr SubtractPackedCoordinateDelta; PRG:$309C 20 07 F1 + sta BoundingBoxCoord3,x ; PRG:$309F 95 27 + lda BoundingBoxCoord2,x ; PRG:$30A1 B5 26 + sta Zp03 ; PRG:$30A3 85 03 + lda Zp06 ; PRG:$30A5 A5 06 + jsr SubtractPackedCoordinateDelta; PRG:$30A7 20 07 F1 + sta BoundingBoxCoord2,x ; PRG:$30AA 95 26 + lda BoundingBoxCoord1,x ; PRG:$30AC B5 25 + sta Zp03 ; PRG:$30AE 85 03 + lda Zp05 ; PRG:$30B0 A5 05 + jsr SubtractPackedCoordinateDelta; PRG:$30B2 20 07 F1 + sta BoundingBoxCoord1,x ; PRG:$30B5 95 25 + lda BoundingBoxCoord1,x ; PRG:$30B7 B5 25 + bne Label_F0C3 ; PRG:$30B9 D0 08 + lda BoundingBoxCoord2,x ; PRG:$30BB B5 26 + bne Label_F0C3 ; PRG:$30BD D0 04 + lda BoundingBoxCoord3,x ; PRG:$30BF B5 27 + beq Label_F0C9 ; PRG:$30C1 F0 06 +Label_F0C3: + bcs Label_F0E5 ; PRG:$30C3 B0 20 + lda BoundingBoxFlags,x ; PRG:$30C5 B5 24 + eor #$FF ; PRG:$30C7 49 FF +Label_F0C9: + sta BoundingBoxFlags,x ; PRG:$30C9 95 24 + sec ; PRG:$30CB 38 + lda #$00 ; PRG:$30CC A9 00 + sta Zp03 ; PRG:$30CE 85 03 + lda BoundingBoxCoord3,x ; PRG:$30D0 B5 27 + jsr SubtractPackedCoordinateDelta; PRG:$30D2 20 07 F1 + sta BoundingBoxCoord3,x ; PRG:$30D5 95 27 + lda BoundingBoxCoord2,x ; PRG:$30D7 B5 26 + jsr SubtractPackedCoordinateDelta; PRG:$30D9 20 07 F1 + sta BoundingBoxCoord2,x ; PRG:$30DC 95 26 + lda BoundingBoxCoord1,x ; PRG:$30DE B5 25 + jsr SubtractPackedCoordinateDelta; PRG:$30E0 20 07 F1 + sta BoundingBoxCoord1,x ; PRG:$30E3 95 25 +Label_F0E5: + rts ; PRG:$30E5 60 + +;------------------------------------------------------------------------------ +; AddPackedCoordinateDelta +; +; Global description: +; Adds a packed decimal-like coordinate delta with screen-range wrapping. +; +; Local description: +; Splits the packed source byte, adds the low component and high component separately, and wraps the result into the valid $00-$9F coordinate range. +; +; Parameters: +; A is the delta; Zp03 is the packed source coordinate. +; +; Returns: +; A contains the adjusted packed coordinate; carry reports range wrapping. +; +; Clobbers: +; A, Zp01/Zp02 and processor flags. +;------------------------------------------------------------------------------ +AddPackedCoordinateDelta: + jsr SplitPackedCoordinate ; PRG:$30E6 20 29 F1 + adc Zp01 ; PRG:$30E9 65 01 + cmp #$0A ; PRG:$30EB C9 0A + bcc Label_F0F1 ; PRG:$30ED 90 02 + adc #$05 ; PRG:$30EF 69 05 +Label_F0F1: + clc ; PRG:$30F1 18 + adc Zp02 ; PRG:$30F2 65 02 + sta Zp02 ; PRG:$30F4 85 02 + lda Zp03 ; PRG:$30F6 A5 03 + and #$F0 ; PRG:$30F8 29 F0 + adc Zp02 ; PRG:$30FA 65 02 + bcc Label_F102 ; PRG:$30FC 90 04 +Label_F0FE: + adc #$5F ; PRG:$30FE 69 5F + sec ; PRG:$3100 38 + rts ; PRG:$3101 60 +Label_F102: + cmp #$A0 ; PRG:$3102 C9 A0 + bcs Label_F0FE ; PRG:$3104 B0 F8 + rts ; PRG:$3106 60 + +;------------------------------------------------------------------------------ +; SubtractPackedCoordinateDelta +; +; Global description: +; Subtracts a packed decimal-like coordinate delta with screen-range wrapping. +; +; Local description: +; Splits the packed delta, subtracts low and high components separately, and wraps underflow into the valid coordinate range. +; +; Parameters: +; A is the packed source coordinate; Zp03 is the packed delta. +; +; Returns: +; A contains the adjusted packed coordinate; carry reflects the final range operation. +; +; Clobbers: +; A, Zp01/Zp02 and processor flags. +;------------------------------------------------------------------------------ +SubtractPackedCoordinateDelta: + jsr SplitPackedCoordinate ; PRG:$3107 20 29 F1 + sbc Zp01 ; PRG:$310A E5 01 + sta Zp01 ; PRG:$310C 85 01 + bcs Label_F11A ; PRG:$310E B0 0A + adc #$0A ; PRG:$3110 69 0A + sta Zp01 ; PRG:$3112 85 01 + lda Zp02 ; PRG:$3114 A5 02 + adc #$0F ; PRG:$3116 69 0F + sta Zp02 ; PRG:$3118 85 02 +Label_F11A: + lda Zp03 ; PRG:$311A A5 03 + and #$F0 ; PRG:$311C 29 F0 + sec ; PRG:$311E 38 + sbc Zp02 ; PRG:$311F E5 02 + bcs Label_F126 ; PRG:$3121 B0 03 + adc #$A0 ; PRG:$3123 69 A0 + clc ; PRG:$3125 18 +Label_F126: + ora Zp01 ; PRG:$3126 05 01 + rts ; PRG:$3128 60 + +;------------------------------------------------------------------------------ +; SplitPackedCoordinate +; +; Global description: +; Splits a packed coordinate byte into low-nibble and high-nibble components. +; +; Local description: +; Stores the low nibble in Zp01 and the high nibble in Zp02, then leaves the low nibble of Zp03 in A. +; +; Parameters: +; A is the first packed coordinate; Zp03 holds the second packed coordinate. +; +; Returns: +; Zp01 and Zp02 contain components; A contains Zp03 low nibble. +; +; Clobbers: +; A, Zp01, Zp02 and processor flags. +;------------------------------------------------------------------------------ +SplitPackedCoordinate: + pha ; PRG:$3129 48 + and #$0F ; PRG:$312A 29 0F + sta Zp01 ; PRG:$312C 85 01 + pla ; PRG:$312E 68 + and #$F0 ; PRG:$312F 29 F0 + sta Zp02 ; PRG:$3131 85 02 + lda Zp03 ; PRG:$3133 A5 03 + and #$0F ; PRG:$3135 29 0F + rts ; PRG:$3137 60 + +;------------------------------------------------------------------------------ +; TestObjectBoundingBoxOverlap +; +; Global description: +; Tests a selected object bounding box against active bounding-box slots. +; +; Local description: +; Derives one of four target records from the packed selector in Zp00, compares its four bounds against candidate records in BoundingBoxFlags-BoundingBoxCoord3, and copies the matching bounds to CollisionBounds0-CollisionBounds3. Zp04 is set to $FF for the alternate search mode and remains zero for the primary match mode. +; +; Parameters: +; Zp00 contains packed object selectors and mode bits; CollisionBounds0-BoundingBoxCoord3 contain bounding-box records. +; +; Returns: +; Returns with the matched bounds copied to CollisionBounds0-CollisionBounds3 when overlap is found; otherwise returns after exhausting candidates. Zp04 indicates alternate-mode resolution. +; +; Clobbers: +; A, X, Y, Zp01, Zp03, Zp04 and processor flags. +;------------------------------------------------------------------------------ +TestObjectBoundingBoxOverlap: + lda #$00 ; PRG:$3138 A9 00 + sta Zp04 ; PRG:$313A 85 04 + clc ; PRG:$313C 18 + lda Zp00 ; PRG:$313D A5 00 + adc #$10 ; PRG:$313F 69 10 + and #$F0 ; PRG:$3141 29 F0 + lsr a ; PRG:$3143 4A + lsr a ; PRG:$3144 4A + tay ; PRG:$3145 A8 + lda Zp00 ; PRG:$3146 A5 00 + and #$07 ; PRG:$3148 29 07 + asl a ; PRG:$314A 0A + asl a ; PRG:$314B 0A + tax ; PRG:$314C AA +Label_F14D: + lda a:CollisionBounds0,y ; PRG:$314D B9 20 00 + beq Label_F1A3 ; PRG:$3150 F0 51 + lda BoundingBoxFlags,x ; PRG:$3152 B5 24 + beq Label_F17C ; PRG:$3154 F0 26 +Label_F156: + sec ; PRG:$3156 38 + lda a:CollisionBounds3,y ; PRG:$3157 B9 23 00 + sta Zp03 ; PRG:$315A 85 03 + lda BoundingBoxCoord3,x ; PRG:$315C B5 27 + jsr SubtractPackedCoordinateDelta; PRG:$315E 20 07 F1 + lda a:CollisionBounds2,y ; PRG:$3161 B9 22 00 + sta Zp03 ; PRG:$3164 85 03 + lda BoundingBoxCoord2,x ; PRG:$3166 B5 26 + jsr SubtractPackedCoordinateDelta; PRG:$3168 20 07 F1 + lda a:CollisionBounds1,y ; PRG:$316B B9 21 00 + sta Zp03 ; PRG:$316E 85 03 + lda BoundingBoxCoord1,x ; PRG:$3170 B5 25 + jsr SubtractPackedCoordinateDelta; PRG:$3172 20 07 F1 + bcs Label_F1A7 ; PRG:$3175 B0 30 + lda a:CollisionBounds0,y ; PRG:$3177 B9 20 00 + bne Label_F1AC ; PRG:$317A D0 30 +Label_F17C: + lda #$FF ; PRG:$317C A9 FF + sta Zp04 ; PRG:$317E 85 04 + sec ; PRG:$3180 38 +Label_F181: + tya ; PRG:$3181 98 + bne Label_F1A2 ; PRG:$3182 D0 1E + bcc Label_F196 ; PRG:$3184 90 10 + lda BoundingBoxFlags,x ; PRG:$3186 B5 24 + sta CollisionBounds0 ; PRG:$3188 85 20 + lda BoundingBoxCoord1,x ; PRG:$318A B5 25 + sta CollisionBounds1 ; PRG:$318C 85 21 + lda BoundingBoxCoord2,x ; PRG:$318E B5 26 + sta CollisionBounds2 ; PRG:$3190 85 22 + lda BoundingBoxCoord3,x ; PRG:$3192 B5 27 + sta CollisionBounds3 ; PRG:$3194 85 23 +Label_F196: + lda Zp00 ; PRG:$3196 A5 00 + and #$08 ; PRG:$3198 29 08 + beq Label_F1A2 ; PRG:$319A F0 06 + dex ; PRG:$319C CA + dex ; PRG:$319D CA + dex ; PRG:$319E CA + dex ; PRG:$319F CA + bpl Label_F14D ; PRG:$31A0 10 AB +Label_F1A2: + rts ; PRG:$31A2 60 +Label_F1A3: + lda BoundingBoxFlags,x ; PRG:$31A3 B5 24 + beq Label_F156 ; PRG:$31A5 F0 AF +Label_F1A7: + lda a:CollisionBounds0,y ; PRG:$31A7 B9 20 00 + bne Label_F17C ; PRG:$31AA D0 D0 +Label_F1AC: + clc ; PRG:$31AC 18 + bcc Label_F181 ; PRG:$31AD 90 D2 + +;------------------------------------------------------------------------------ +; TickSoundTimers +; +; Global description: +; Performs the decoded audio operation represented by TickSoundTimers at PRG $31AF. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: SoundTimerArray, SoundTimerDivider. Direct named writes: SoundTimerArray, SoundTimerDivider. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +TickSoundTimers: + ldx #$03 ; PRG:$31AF A2 03 + dec SoundTimerDivider ; PRG:$31B1 C6 34 + bpl Label_F1BB ; PRG:$31B3 10 06 + lda #$0A ; PRG:$31B5 A9 0A + sta SoundTimerDivider ; PRG:$31B7 85 34 + ldx #$08 ; PRG:$31B9 A2 08 +Label_F1BB: + lda SoundTimerArray,x ; PRG:$31BB B5 35 + beq Label_F1C1 ; PRG:$31BD F0 02 + dec SoundTimerArray,x ; PRG:$31BF D6 35 +Label_F1C1: + dex ; PRG:$31C1 CA + bpl Label_F1BB ; PRG:$31C2 10 F7 + rts ; PRG:$31C4 60 + +;------------------------------------------------------------------------------ +; QueueSingleVramByte +; +; Global description: +; Appends a one-byte literal VRAM write to the dynamic command buffer. +; +; Local description: +; Writes the supplied PPU address, control/length byte $01, and payload byte, advances $0330, and restores the zero terminator. +; +; Parameters: +; Call-site scratch fields provide the PPU address and payload according to the decoded instruction sequence. +; +; Returns: +; Returns with one command appended unless the overflow guard rejects it. +; +; Clobbers: +; A, X, Y, scratch zero-page fields, $0330-$0360, and processor flags. +;------------------------------------------------------------------------------ +QueueSingleVramByte: + txa ; PRG:$31C5 8A + pha ; PRG:$31C6 48 + tya ; PRG:$31C7 98 + pha ; PRG:$31C8 48 + ldx $0330 ; PRG:$31C9 AE 30 03 + lda Zp01 ; PRG:$31CC A5 01 + sta $0331,x ; PRG:$31CE 9D 31 03 + jsr AdvanceVramBufferCursor ; PRG:$31D1 20 2C F0 + lda Zp00 ; PRG:$31D4 A5 00 + sta $0331,x ; PRG:$31D6 9D 31 03 + jsr AdvanceVramBufferCursor ; PRG:$31D9 20 2C F0 + lda #$01 ; PRG:$31DC A9 01 + sta $0331,x ; PRG:$31DE 9D 31 03 + jsr AdvanceVramBufferCursor ; PRG:$31E1 20 2C F0 + tya ; PRG:$31E4 98 + sta $0331,x ; PRG:$31E5 9D 31 03 + jsr AdvanceVramBufferCursor ; PRG:$31E8 20 2C F0 + lda #$00 ; PRG:$31EB A9 00 + sta $0331,x ; PRG:$31ED 9D 31 03 + stx $0330 ; PRG:$31F0 8E 30 03 + pla ; PRG:$31F3 68 + tay ; PRG:$31F4 A8 + pla ; PRG:$31F5 68 + tax ; PRG:$31F6 AA + rts ; PRG:$31F7 60 + +;------------------------------------------------------------------------------ +; AdvanceRandomLfsr +; +; Global description: +; Performs the decoded gameplay operation represented by AdvanceRandomLfsr at PRG $31F8. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp00. Direct named writes: Zp00. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AdvanceRandomLfsr: + lda RandomLfsr0 ; PRG:$31F8 A5 18 + and #$02 ; PRG:$31FA 29 02 + sta Zp00 ; PRG:$31FC 85 00 + lda RandomLfsr1 ; PRG:$31FE A5 19 + and #$02 ; PRG:$3200 29 02 + eor Zp00 ; PRG:$3202 45 00 + clc ; PRG:$3204 18 + beq Label_F208 ; PRG:$3205 F0 01 + sec ; PRG:$3207 38 +Label_F208: + ror RandomLfsr0 ; PRG:$3208 66 18 + ror RandomLfsr1 ; PRG:$320A 66 19 + ror RandomLfsr2 ; PRG:$320C 66 1A + ror RandomLfsr3 ; PRG:$320E 66 1B + ror RandomLfsr4 ; PRG:$3210 66 1C + ror RandomLfsr5 ; PRG:$3212 66 1D + ror RandomLfsr6 ; PRG:$3214 66 1E + ror RandomLfsr7 ; PRG:$3216 66 1F + rts ; PRG:$3218 60 + +;------------------------------------------------------------------------------ +; ReadControllers +; +; Global description: +; Performs the decoded gameplay operation represented by ReadControllers at PRG $3219. +; +; Local description: +; Direct callees/tail targets: ReadControllerPort. State and scratch fields referenced: none. Direct named writes: JOY1. Hardware registers: JOY1. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +ReadControllers: + lda #$01 ; PRG:$3219 A9 01 + sta JOY1 ; PRG:$321B 8D 16 40 + ldx #$00 ; PRG:$321E A2 00 + lda #$00 ; PRG:$3220 A9 00 + sta JOY1 ; PRG:$3222 8D 16 40 + jsr ReadControllerPort ; PRG:$3225 20 2D F2 + inx ; PRG:$3228 E8 + jsr ReadControllerPort ; PRG:$3229 20 2D F2 + rts ; PRG:$322C 60 + +;------------------------------------------------------------------------------ +; ReadControllerPort +; +; Global description: +; Performs the decoded gameplay operation represented by ReadControllerPort at PRG $322D. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: Zp00. Direct named writes: ControllerFilteredState, ControllerRawState, Zp00. Hardware registers: JOY1. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +ReadControllerPort: + ldy #$08 ; PRG:$322D A0 08 +Label_F22F: + pha ; PRG:$322F 48 + lda JOY1,x ; PRG:$3230 BD 16 40 + sta Zp00 ; PRG:$3233 85 00 + lsr a ; PRG:$3235 4A + ora Zp00 ; PRG:$3236 05 00 + lsr a ; PRG:$3238 4A + pla ; PRG:$3239 68 + rol a ; PRG:$323A 2A + dey ; PRG:$323B 88 + bne Label_F22F ; PRG:$323C D0 F1 + stx Zp00 ; PRG:$323E 86 00 + asl Zp00 ; PRG:$3240 06 00 + ldx Zp00 ; PRG:$3242 A6 00 + ldy ControllerRawState,x ; PRG:$3244 B4 14 + sty Zp00 ; PRG:$3246 84 00 + sta ControllerRawState,x ; PRG:$3248 95 14 + and #$FF ; PRG:$324A 29 FF + bpl Label_F254 ; PRG:$324C 10 06 + bit Zp00 ; PRG:$324E 24 00 + bpl Label_F254 ; PRG:$3250 10 02 + and #$7F ; PRG:$3252 29 7F +Label_F254: + ldy ControllerFilteredState,x ; PRG:$3254 B4 15 + sta ControllerFilteredState,x ; PRG:$3256 95 15 + tya ; PRG:$3258 98 + and #$0F ; PRG:$3259 29 0F + and ControllerFilteredState,x ; PRG:$325B 35 15 + beq Label_F265 ; PRG:$325D F0 06 + ora #$F0 ; PRG:$325F 09 F0 + and ControllerFilteredState,x ; PRG:$3261 35 15 + sta ControllerFilteredState,x ; PRG:$3263 95 15 +Label_F265: + rts ; PRG:$3265 60 + +;------------------------------------------------------------------------------ +; Data_$F266 +; +; Pass 1 classification: data or currently unreachable bytes. +; Preserved directly from the original ROM for byte-identical builds. +;------------------------------------------------------------------------------ +; TitleScreenVramCommandStream +; +; Title-screen palette, nametable text, and attribute updates. +; Encoded records: 24; total bytes including terminator: 296. +;------------------------------------------------------------------------------ +TitleScreenVramCommandStream: + ; PPU $3F00, length 18, literal, horizontal + .byte $3F, $00, $12, $0F, $37, $02, $21, $0F, $30, $30, $30, $0F, $24, $24, $24, $0F ; PRG:$3266 3F 00 12 0F 37 02 21 0F 30 30 30 0F 24 24 24 0F + .byte $37, $12, $11, $0F, $37 ; PRG:$3276 37 12 11 0F 37 + ; PPU $23CC, length 3, repeat, horizontal + .byte $23, $CC, $43, $FF ; PRG:$327B 23 CC 43 FF + ; PPU $23D4, length 3, repeat, horizontal + .byte $23, $D4, $43, $FF ; PRG:$327F 23 D4 43 FF + ; PPU $23D8, length 24, repeat, horizontal + .byte $23, $D8, $58, $AA ; PRG:$3283 23 D8 58 AA + ; PPU $23F0, length 8, repeat, horizontal + .byte $23, $F0, $48, $55 ; PRG:$3287 23 F0 48 55 + ; PPU $2084, length 22, literal, horizontal + .byte $20, $84, $16, $CC, $D2, $D6, $D2, $DB, $CF, $CF, $D4, $CC, $D8, $CF, $CF, $24 ; PRG:$328B 20 84 16 CC D2 D6 D2 DB CF CF D4 CC D8 CF CF 24 + .byte $24, $E7, $EA, $ED, $F0, $E5, $F3, $F3, $F8 ; PRG:$329B 24 E7 EA ED F0 E5 F3 F3 F8 + ; PPU $20A4, length 12, literal, horizontal + .byte $20, $A4, $0C, $CD, $CD, $CD, $CD, $DC, $DF, $D0, $D5, $D0, $D9, $DD, $E1 ; PRG:$32A4 20 A4 0C CD CD CD CD DC DF D0 D5 D0 D9 DD E1 + ; PPU $20C4, length 12, literal, horizontal + .byte $20, $C4, $0C, $CE, $D3, $D7, $D3, $D1, $E0, $D1, $D1, $CE, $DA, $DE, $E2 ; PRG:$32B3 20 C4 0C CE D3 D7 D3 D1 E0 D1 D1 CE DA DE E2 + ; PPU $2108, length 11, literal, horizontal + .byte $21, $08, $0B, $CF, $D4, $D6, $D2, $DB, $CF, $D6, $CB, $24, $E5, $E8 ; PRG:$32C2 21 08 0B CF D4 D6 D2 DB CF D6 CB 24 E5 E8 + ; PPU $2128, length 11, literal, horizontal + .byte $21, $28, $0B, $D0, $D5, $CD, $CD, $DC, $DF, $CD, $E3, $24, $EB, $E9 ; PRG:$32D0 21 28 0B D0 D5 CD CD DC DF CD E3 24 EB E9 + ; PPU $2148, length 19, literal, horizontal + .byte $21, $48, $13, $D1, $D1, $D7, $D3, $D1, $E0, $D7, $E4, $24, $E6, $EC, $EC, $EF ; PRG:$32DE 21 48 13 D1 D1 D7 D3 D1 E0 D7 E4 24 E6 EC EC EF + .byte $24, $E6, $EF, $F7, $FB, $EF ; PRG:$32EE 24 E6 EF F7 FB EF + ; PPU $20B3, length 5, repeat, vertical + .byte $20, $B3, $C5, $EB ; PRG:$32F4 20 B3 C5 EB + ; PPU $20B4, length 5, repeat, vertical + .byte $20, $B4, $C5, $EE ; PRG:$32F8 20 B4 C5 EE + ; PPU $20B6, length 5, repeat, vertical + .byte $20, $B6, $C5, $EB ; PRG:$32FC 20 B6 C5 EB + ; PPU $20B7, length 5, literal, vertical + .byte $20, $B7, $85, $F1, $F2, $C6, $C6, $EE ; PRG:$3300 20 B7 85 F1 F2 C6 C6 EE + ; PPU $20B8, length 5, literal, vertical + .byte $20, $B8, $85, $F4, $F5, $C6, $C6, $F6 ; PRG:$3308 20 B8 85 F4 F5 C6 C6 F6 + ; PPU $20B9, length 5, literal, vertical + .byte $20, $B9, $85, $EE, $EE, $EF, $F9, $FA ; PRG:$3310 20 B9 85 EE EE EF F9 FA + ; PPU $213A, length 1, literal, horizontal + .byte $21, $3A, $01, $F8 ; PRG:$3318 21 3A 01 F8 + ; PPU $21C9, length 15, literal, horizontal + .byte $21, $C9, $0F, $01, $24, $19, $15, $0A, $22, $0E, $1B, $24, $10, $0A, $16, $0E ; PRG:$331C 21 C9 0F 01 24 19 15 0A 22 0E 1B 24 10 0A 16 0E + .byte $24, $0A ; PRG:$332C 24 0A + ; PPU $2209, length 15, literal, horizontal + .byte $22, $09, $0F, $01, $24, $19, $15, $0A, $22, $0E, $1B, $24, $10, $0A, $16, $0E ; PRG:$332E 22 09 0F 01 24 19 15 0A 22 0E 1B 24 10 0A 16 0E + .byte $24, $0B ; PRG:$333E 24 0B + ; PPU $2249, length 15, literal, horizontal + .byte $22, $49, $0F, $02, $24, $19, $15, $0A, $22, $0E, $1B, $24, $10, $0A, $16, $0E ; PRG:$3340 22 49 0F 02 24 19 15 0A 22 0E 1B 24 10 0A 16 0E + .byte $24, $0A ; PRG:$3350 24 0A + ; PPU $2289, length 15, literal, horizontal + .byte $22, $89, $0F, $02, $24, $19, $15, $0A, $22, $0E, $1B, $24, $10, $0A, $16, $0E ; PRG:$3352 22 89 0F 02 24 19 15 0A 22 0E 1B 24 10 0A 16 0E + .byte $24, $0B ; PRG:$3362 24 0B + ; PPU $2305, length 22, literal, horizontal + .byte $23, $05, $16, $FE, $01, $09, $08, $02, $24, $17, $12, $17, $1D, $0E, $17, $0D ; PRG:$3364 23 05 16 FE 01 09 08 02 24 17 12 17 1D 0E 17 0D + .byte $18, $24, $0C, $18, $CA, $15, $1D, $0D, $C7 ; PRG:$3374 18 24 0C 18 CA 15 1D 0D C7 + ; PPU $234B, length 13, literal, horizontal + .byte $23, $4B, $0D, $16, $0A, $0D, $0E, $24, $12, $17, $24, $13, $0A, $19, $0A, $17 ; PRG:$337D 23 4B 0D 16 0A 0D 0E 24 12 17 24 13 0A 19 0A 17 + .byte $00 ; PRG:$338D 00 ; stream terminator + +;------------------------------------------------------------------------------ +; VinesStageVramCommandStream +; +; Stage-one background and attribute command stream. +; Encoded records: 50; total bytes including terminator: 352. +;------------------------------------------------------------------------------ +VinesStageVramCommandStream: + ; PPU $3F00, length 32, literal, horizontal + .byte $3F, $00, $20, $0F, $2A, $17, $37, $0F, $30, $2A, $16, $0F, $30, $36, $06, $0F ; PRG:$338E 3F 00 20 0F 2A 17 37 0F 30 2A 16 0F 30 36 06 0F + .byte $12, $37, $16, $0F, $30, $2A, $16, $0F, $30, $06, $36, $0F, $2A, $17, $37, $0F ; PRG:$339E 12 37 16 0F 30 2A 16 0F 30 06 36 0F 2A 17 37 0F + .byte $30, $30, $12 ; PRG:$33AE 30 30 12 + ; PPU $23C0, length 8, repeat, horizontal + .byte $23, $C0, $48, $55 ; PRG:$33B1 23 C0 48 55 + ; PPU $23C8, length 4, literal, horizontal + .byte $23, $C8, $04, $AA, $AA, $30, $0C ; PRG:$33B5 23 C8 04 AA AA 30 0C + ; PPU $23CD, length 3, repeat, horizontal + .byte $23, $CD, $43, $05 ; PRG:$33BC 23 CD 43 05 + ; PPU $23D3, length 1, literal, horizontal + .byte $23, $D3, $01, $10 ; PRG:$33C0 23 D3 01 10 + ; PPU $23F8, length 8, repeat, horizontal + .byte $23, $F8, $48, $FF ; PRG:$33C4 23 F8 48 FF + ; PPU $20A9, length 3, repeat, horizontal + .byte $20, $A9, $43, $5E ; PRG:$33C8 20 A9 43 5E + ; PPU $20C8, length 2, literal, horizontal + .byte $20, $C8, $02, $48, $4A ; PRG:$33CC 20 C8 02 48 4A + ; PPU $20E8, length 2, literal, horizontal + .byte $20, $E8, $02, $49, $4B ; PRG:$33D1 20 E8 02 49 4B + ; PPU $208D, length 2, literal, vertical + .byte $20, $8D, $82, $5C, $5D ; PRG:$33D6 20 8D 82 5C 5D + ; PPU $2093, length 1, literal, horizontal + .byte $20, $93, $01, $5D ; PRG:$33DB 20 93 01 5D + ; PPU $2100, length 19, repeat, horizontal + .byte $21, $00, $53, $5E ; PRG:$33DF 21 00 53 5E + ; PPU $2132, length 8, repeat, horizontal + .byte $21, $32, $48, $5E ; PRG:$33E3 21 32 48 5E + ; PPU $2122, length 16, literal, vertical + .byte $21, $22, $90, $5C, $5C, $5C, $5D, $5C, $5C, $5C, $5C, $5C, $5C, $5D, $5C, $5C ; PRG:$33E7 21 22 90 5C 5C 5C 5D 5C 5C 5C 5C 5C 5C 5D 5C 5C + .byte $5C, $5C, $5D ; PRG:$33F7 5C 5C 5D + ; PPU $2125, length 15, literal, vertical + .byte $21, $25, $8F, $5C, $5C, $5C, $5C, $5C, $5C, $5C, $5D, $5C, $5C, $5C, $5C, $5C ; PRG:$33FA 21 25 8F 5C 5C 5C 5C 5C 5C 5C 5D 5C 5C 5C 5C 5C + .byte $5C, $5D ; PRG:$340A 5C 5D + ; PPU $21E8, length 10, literal, vertical + .byte $21, $E8, $8A, $5C, $5C, $5C, $5D, $5C, $5C, $5C, $5C, $5C, $5D ; PRG:$340C 21 E8 8A 5C 5C 5C 5D 5C 5C 5C 5C 5C 5D + ; PPU $212D, length 7, repeat, vertical + .byte $21, $2D, $C7, $5C ; PRG:$3419 21 2D C7 5C + ; PPU $220D, length 6, literal, vertical + .byte $22, $0D, $86, $5D, $5C, $5C, $5C, $5C, $5D ; PRG:$341D 22 0D 86 5D 5C 5C 5C 5C 5D + ; PPU $2131, length 9, literal, vertical + .byte $21, $31, $89, $5C, $5C, $5C, $5C, $5D, $5C, $5C, $5C, $5D ; PRG:$3426 21 31 89 5C 5C 5C 5C 5D 5C 5C 5C 5D + ; PPU $2154, length 12, literal, vertical + .byte $21, $54, $8C, $5C, $5C, $5C, $5C, $5D, $5C, $5C, $5C, $5D, $5C, $5C, $5D ; PRG:$3432 21 54 8C 5C 5C 5C 5C 5D 5C 5C 5C 5D 5C 5C 5D + ; PPU $2157, length 10, literal, vertical + .byte $21, $57, $8A, $5C, $5D, $5C, $5C, $5C, $5C, $5C, $5D, $5C, $5D ; PRG:$3441 21 57 8A 5C 5D 5C 5C 5C 5C 5C 5D 5C 5D + ; PPU $20DA, length 16, literal, vertical + .byte $20, $DA, $90, $5C, $5C, $5C, $5C, $5C, $5D, $5C, $5C, $5C, $5C, $5D, $5C, $5C ; PRG:$344E 20 DA 90 5C 5C 5C 5C 5C 5D 5C 5C 5C 5C 5D 5C 5C + .byte $5C, $5C, $5D ; PRG:$345E 5C 5C 5D + ; PPU $20DD, length 10, repeat, vertical + .byte $20, $DD, $CA, $5C ; PRG:$3461 20 DD CA 5C + ; PPU $221D, length 6, literal, vertical + .byte $22, $1D, $86, $5D, $5C, $5C, $5C, $5C, $5D ; PRG:$3465 22 1D 86 5D 5C 5C 5C 5C 5D + ; PPU $21C6, length 4, repeat, horizontal + .byte $21, $C6, $44, $5E ; PRG:$346E 21 C6 44 5E + ; PPU $2238, length 8, repeat, horizontal + .byte $22, $38, $48, $5E ; PRG:$3472 22 38 48 5E + ; PPU $2266, length 6, repeat, horizontal + .byte $22, $66, $46, $5E ; PRG:$3476 22 66 46 5E + ; PPU $231A, length 4, literal, horizontal + .byte $23, $1A, $04, $5F, $60, $60, $61 ; PRG:$347A 23 1A 04 5F 60 60 61 + ; PPU $232C, length 4, literal, horizontal + .byte $23, $2C, $04, $5F, $60, $60, $61 ; PRG:$3481 23 2C 04 5F 60 60 61 + ; PPU $2335, length 8, literal, horizontal + .byte $23, $35, $08, $5F, $60, $60, $61, $24, $24, $62, $62 ; PRG:$3488 23 35 08 5F 60 60 61 24 24 62 62 + ; PPU $234D, length 2, repeat, horizontal + .byte $23, $4D, $42, $62 ; PRG:$3493 23 4D 42 62 + ; PPU $2351, length 3, literal, horizontal + .byte $23, $51, $03, $5F, $60, $61 ; PRG:$3497 23 51 03 5F 60 61 + ; PPU $2356, length 2, repeat, horizontal + .byte $23, $56, $42, $62 ; PRG:$349D 23 56 42 62 + ; PPU $235B, length 2, repeat, horizontal + .byte $23, $5B, $42, $62 ; PRG:$34A1 23 5B 42 62 + ; PPU $2360, length 8, repeat, horizontal + .byte $23, $60, $48, $60 ; PRG:$34A5 23 60 48 60 + ; PPU $2368, length 1, literal, horizontal + .byte $23, $68, $01, $61 ; PRG:$34A9 23 68 01 61 + ; PPU $236D, length 2, repeat, horizontal + .byte $23, $6D, $42, $62 ; PRG:$34AD 23 6D 42 62 + ; PPU $2372, length 1, literal, horizontal + .byte $23, $72, $01, $62 ; PRG:$34B1 23 72 01 62 + ; PPU $2376, length 2, repeat, horizontal + .byte $23, $76, $42, $62 ; PRG:$34B5 23 76 42 62 + ; PPU $237B, length 2, repeat, horizontal + .byte $23, $7B, $42, $62 ; PRG:$34B9 23 7B 42 62 + ; PPU $2380, length 32, repeat, horizontal + .byte $23, $80, $60, $63 ; PRG:$34BD 23 80 60 63 + ; PPU $23A0, length 32, repeat, horizontal + .byte $23, $A0, $60, $64 ; PRG:$34C1 23 A0 60 64 + ; PPU $2144, length 2, literal, vertical + .byte $21, $44, $82, $58, $59 ; PRG:$34C5 21 44 82 58 59 + ; PPU $2145, length 2, literal, vertical + .byte $21, $45, $82, $5A, $5B ; PRG:$34CA 21 45 82 5A 5B + ; PPU $214C, length 2, literal, vertical + .byte $21, $4C, $82, $50, $51 ; PRG:$34CF 21 4C 82 50 51 + ; PPU $214D, length 2, literal, vertical + .byte $21, $4D, $82, $96, $97 ; PRG:$34D4 21 4D 82 96 97 + ; PPU $2193, length 2, literal, vertical + .byte $21, $93, $82, $58, $59 ; PRG:$34D9 21 93 82 58 59 + ; PPU $2194, length 2, literal, vertical + .byte $21, $94, $82, $5A, $5B ; PRG:$34DE 21 94 82 5A 5B + ; PPU $2251, length 2, literal, vertical + .byte $22, $51, $82, $54, $55 ; PRG:$34E3 22 51 82 54 55 + ; PPU $2252, length 2, literal, vertical + .byte $22, $52, $82, $56, $57 ; PRG:$34E8 22 52 82 56 57 + .byte $00 ; PRG:$34ED 00 ; stream terminator + +;------------------------------------------------------------------------------ +; ChainsStageVramCommandStream +; +; Stage-four background and attribute command stream. +; Encoded records: 38; total bytes including terminator: 345. +;------------------------------------------------------------------------------ +ChainsStageVramCommandStream: + ; PPU $3F00, length 4, literal, horizontal + .byte $3F, $00, $04, $0F, $21, $12, $37 ; PRG:$34EE 3F 00 04 0F 21 12 37 + ; PPU $3F18, length 8, literal, horizontal + .byte $3F, $18, $08, $0F, $30, $27, $13, $0F, $30, $2C, $12 ; PRG:$34F5 3F 18 08 0F 30 27 13 0F 30 2C 12 + ; PPU $23C0, length 8, repeat, horizontal + .byte $23, $C0, $48, $55 ; PRG:$3500 23 C0 48 55 + ; PPU $23C9, length 7, literal, horizontal + .byte $23, $C9, $07, $FF, $FF, $AA, $AA, $F5, $05, $05 ; PRG:$3504 23 C9 07 FF FF AA AA F5 05 05 + ; PPU $23DA, length 4, literal, horizontal + .byte $23, $DA, $04, $10, $00, $00, $40 ; PRG:$350E 23 DA 04 10 00 00 40 + ; PPU $2063, length 1, literal, horizontal + .byte $20, $63, $01, $FD ; PRG:$3515 20 63 01 FD + ; PPU $206B, length 3, literal, horizontal + .byte $20, $6B, $03, $8D, $8E, $8F ; PRG:$3519 20 6B 03 8D 8E 8F + ; PPU $2075, length 2, literal, horizontal + .byte $20, $75, $02, $FC, $FD ; PRG:$351F 20 75 02 FC FD + ; PPU $208C, length 18, literal, horizontal + .byte $20, $8C, $12, $80, $30, $34, $38, $3C, $40, $44, $7F, $25, $13, $2A, $26, $27 ; PRG:$3524 20 8C 12 80 30 34 38 3C 40 44 7F 25 13 2A 26 27 + .byte $28, $29, $2A, $15, $2D ; PRG:$3534 28 29 2A 15 2D + ; PPU $20AB, length 19, literal, horizontal + .byte $20, $AB, $13, $7D, $24, $31, $35, $39, $3D, $41, $45, $24, $2B, $24, $2C, $24 ; PRG:$3539 20 AB 13 7D 24 31 35 39 3D 41 45 24 2B 24 2C 24 + .byte $24, $24, $24, $2C, $24, $2F ; PRG:$3549 24 24 24 2C 24 2F + ; PPU $20CA, length 12, literal, horizontal + .byte $20, $CA, $0C, $7D, $24, $80, $32, $36, $3A, $3E, $42, $46, $7F, $24, $7E ; PRG:$354F 20 CA 0C 7D 24 80 32 36 3A 3E 42 46 7F 24 7E + ; PPU $20E9, length 14, literal, horizontal + .byte $20, $E9, $0E, $68, $24, $68, $24, $33, $37, $3B, $3F, $43, $47, $24, $68, $24 ; PRG:$355E 20 E9 0E 68 24 68 24 33 37 3B 3F 43 47 24 68 24 + .byte $68 ; PRG:$356E 68 + ; PPU $20C4, length 2, literal, horizontal + .byte $20, $C4, $02, $48, $4A ; PRG:$356F 20 C4 02 48 4A + ; PPU $20E4, length 2, literal, horizontal + .byte $20, $E4, $02, $49, $4B ; PRG:$3574 20 E4 02 49 4B + ; PPU $2102, length 28, literal, horizontal + .byte $21, $02, $1C, $69, $69, $69, $6B, $69, $69, $69, $69, $69, $6B, $69, $69, $6B ; PRG:$3579 21 02 1C 69 69 69 6B 69 69 69 69 69 6B 69 69 6B + .byte $69, $69, $6B, $69, $69, $6B, $69, $69, $69, $69, $69, $6B, $69, $69, $69 ; PRG:$3589 69 69 6B 69 69 6B 69 69 69 69 69 6B 69 69 69 + ; PPU $2122, length 28, literal, horizontal + .byte $21, $22, $1C, $6A, $6A, $6A, $6C, $6A, $6A, $6A, $6A, $6A, $6C, $6A, $6A, $6C ; PRG:$3598 21 22 1C 6A 6A 6A 6C 6A 6A 6A 6A 6A 6C 6A 6A 6C + .byte $6A, $6A, $6C, $6A, $6A, $6C, $6A, $6A, $6A, $6A, $6A, $6C, $6A, $6A, $6A ; PRG:$35A8 6A 6A 6C 6A 6A 6C 6A 6A 6A 6A 6A 6C 6A 6A 6A + ; PPU $2142, length 17, repeat, vertical + .byte $21, $42, $D1, $67 ; PRG:$35B7 21 42 D1 67 + ; PPU $215D, length 17, repeat, vertical + .byte $21, $5D, $D1, $67 ; PRG:$35BB 21 5D D1 67 + ; PPU $2145, length 15, repeat, vertical + .byte $21, $45, $CF, $65 ; PRG:$35BF 21 45 CF 65 + ; PPU $2148, length 15, repeat, vertical + .byte $21, $48, $CF, $65 ; PRG:$35C3 21 48 CF 65 + ; PPU $214B, length 15, repeat, vertical + .byte $21, $4B, $CF, $65 ; PRG:$35C7 21 4B CF 65 + ; PPU $214E, length 15, repeat, vertical + .byte $21, $4E, $CF, $65 ; PRG:$35CB 21 4E CF 65 + ; PPU $2151, length 15, repeat, vertical + .byte $21, $51, $CF, $65 ; PRG:$35CF 21 51 CF 65 + ; PPU $2154, length 15, repeat, vertical + .byte $21, $54, $CF, $65 ; PRG:$35D3 21 54 CF 65 + ; PPU $2157, length 15, repeat, vertical + .byte $21, $57, $CF, $65 ; PRG:$35D7 21 57 CF 65 + ; PPU $215A, length 15, repeat, vertical + .byte $21, $5A, $CF, $65 ; PRG:$35DB 21 5A CF 65 + ; PPU $2305, length 22, literal, horizontal + .byte $23, $05, $16, $66, $24, $24, $66, $24, $24, $66, $24, $24, $66, $24, $24, $66 ; PRG:$35DF 23 05 16 66 24 24 66 24 24 66 24 24 66 24 24 66 + .byte $24, $24, $66, $24, $24, $66, $24, $24, $66 ; PRG:$35EF 24 24 66 24 24 66 24 24 66 + ; PPU $2360, length 32, repeat, horizontal + .byte $23, $60, $60, $69 ; PRG:$35F8 23 60 60 69 + ; PPU $21C8, length 2, literal, horizontal + .byte $21, $C8, $02, $50, $52 ; PRG:$35FC 21 C8 02 50 52 + ; PPU $21E8, length 2, literal, horizontal + .byte $21, $E8, $02, $51, $53 ; PRG:$3601 21 E8 02 51 53 + ; PPU $21D6, length 2, literal, horizontal + .byte $21, $D6, $02, $50, $52 ; PRG:$3606 21 D6 02 50 52 + ; PPU $21F6, length 2, literal, horizontal + .byte $21, $F6, $02, $51, $53 ; PRG:$360B 21 F6 02 51 53 + ; PPU $22C4, length 3, literal, horizontal + .byte $22, $C4, $03, $6D, $6F, $71 ; PRG:$3610 22 C4 03 6D 6F 71 + ; PPU $22E4, length 3, literal, horizontal + .byte $22, $E4, $03, $6E, $70, $72 ; PRG:$3616 22 E4 03 6E 70 72 + ; PPU $22D9, length 3, literal, horizontal + .byte $22, $D9, $03, $6D, $6F, $71 ; PRG:$361C 22 D9 03 6D 6F 71 + ; PPU $22F9, length 3, literal, horizontal + .byte $22, $F9, $03, $6E, $70, $72 ; PRG:$3622 22 F9 03 6E 70 72 + ; PPU $22CA, length 12, literal, horizontal + .byte $22, $CA, $0C, $6D, $6F, $71, $6D, $6F, $71, $6D, $6F, $71, $6D, $6F, $71 ; PRG:$3628 22 CA 0C 6D 6F 71 6D 6F 71 6D 6F 71 6D 6F 71 + ; PPU $22EA, length 12, literal, horizontal + .byte $22, $EA, $0C, $6E, $70, $72, $6E, $70, $72, $6E, $70, $72, $6E, $70, $72 ; PRG:$3637 22 EA 0C 6E 70 72 6E 70 72 6E 70 72 6E 70 72 + .byte $00 ; PRG:$3646 00 ; stream terminator + +;------------------------------------------------------------------------------ +; MariosHideoutVramCommandStream +; +; Stage-three background and attribute command stream. +; Encoded records: 51; total bytes including terminator: 293. +;------------------------------------------------------------------------------ +MariosHideoutVramCommandStream: + ; PPU $3F00, length 4, literal, horizontal + .byte $3F, $00, $04, $0F, $30, $13, $22 ; PRG:$3647 3F 00 04 0F 30 13 22 + ; PPU $3F18, length 8, literal, horizontal + .byte $3F, $18, $08, $0F, $30, $27, $15, $0F, $30, $2C, $02 ; PRG:$364E 3F 18 08 0F 30 27 15 0F 30 2C 02 + ; PPU $23C0, length 8, repeat, horizontal + .byte $23, $C0, $48, $55 ; PRG:$3659 23 C0 48 55 + ; PPU $23C8, length 8, literal, horizontal + .byte $23, $C8, $08, $AA, $AA, $F0, $0C, $00, $05, $05, $05 ; PRG:$365D 23 C8 08 AA AA F0 0C 00 05 05 05 + ; PPU $23D3, length 1, literal, horizontal + .byte $23, $D3, $01, $40 ; PRG:$3668 23 D3 01 40 + ; PPU $23E4, length 1, literal, horizontal + .byte $23, $E4, $01, $04 ; PRG:$366C 23 E4 01 04 + ; PPU $23EB, length 1, literal, horizontal + .byte $23, $EB, $01, $01 ; PRG:$3670 23 EB 01 01 + ; PPU $208D, length 2, repeat, vertical + .byte $20, $8D, $C2, $7A ; PRG:$3674 20 8D C2 7A + ; PPU $20A9, length 3, literal, horizontal + .byte $20, $A9, $03, $75, $75, $77 ; PRG:$3678 20 A9 03 75 75 77 + ; PPU $20C8, length 3, literal, horizontal + .byte $20, $C8, $03, $98, $9A, $81 ; PRG:$367E 20 C8 03 98 9A 81 + ; PPU $20E8, length 4, literal, horizontal + .byte $20, $E8, $04, $99, $9B, $82, $83 ; PRG:$3684 20 E8 04 99 9B 82 83 + ; PPU $2103, length 21, repeat, horizontal + .byte $21, $03, $55, $75 ; PRG:$368B 21 03 55 75 + ; PPU $2123, length 21, repeat, horizontal + .byte $21, $23, $55, $76 ; PRG:$368F 21 23 55 76 + ; PPU $2102, length 2, literal, vertical + .byte $21, $02, $82, $73, $74 ; PRG:$3693 21 02 82 73 74 + ; PPU $2105, length 3, literal, horizontal + .byte $21, $05, $03, $77, $24, $73 ; PRG:$3698 21 05 03 77 24 73 + ; PPU $2125, length 3, literal, horizontal + .byte $21, $25, $03, $78, $24, $74 ; PRG:$369E 21 25 03 78 24 74 + ; PPU $2118, length 2, literal, vertical + .byte $21, $18, $82, $77, $78 ; PRG:$36A4 21 18 82 77 78 + ; PPU $2128, length 12, literal, vertical + .byte $21, $28, $8C, $7B, $7C, $7C, $7C, $7C, $75, $7B, $7C, $7C, $7C, $75, $7B ; PRG:$36A9 21 28 8C 7B 7C 7C 7C 7C 75 7B 7C 7C 7C 75 7B + ; PPU $212C, length 5, literal, vertical + .byte $21, $2C, $85, $7B, $7C, $7C, $7C, $7C ; PRG:$36B8 21 2C 85 7B 7C 7C 7C 7C + ; PPU $2133, length 5, literal, vertical + .byte $21, $33, $85, $7B, $7C, $7C, $7C, $7C ; PRG:$36C0 21 33 85 7B 7C 7C 7C 7C + ; PPU $2137, length 5, literal, vertical + .byte $21, $37, $85, $7B, $7C, $7C, $7C, $7C ; PRG:$36C8 21 37 85 7B 7C 7C 7C 7C + ; PPU $2142, length 15, repeat, vertical + .byte $21, $42, $CF, $8B ; PRG:$36D0 21 42 CF 8B + ; PPU $2145, length 15, repeat, vertical + .byte $21, $45, $CF, $7A ; PRG:$36D4 21 45 CF 7A + ; PPU $20DA, length 19, repeat, vertical + .byte $20, $DA, $D3, $8B ; PRG:$36D8 20 DA D3 8B + ; PPU $20DD, length 19, repeat, vertical + .byte $20, $DD, $D3, $7A ; PRG:$36DC 20 DD D3 7A + ; PPU $21C8, length 16, repeat, horizontal + .byte $21, $C8, $50, $75 ; PRG:$36E0 21 C8 50 75 + ; PPU $21D8, length 6, literal, horizontal + .byte $21, $D8, $06, $77, $24, $73, $75, $75, $77 ; PRG:$36E4 21 D8 06 77 24 73 75 75 77 + ; PPU $21F7, length 7, literal, horizontal + .byte $21, $F7, $07, $7B, $78, $24, $74, $76, $76, $78 ; PRG:$36ED 21 F7 07 7B 78 24 74 76 76 78 + ; PPU $21C7, length 2, literal, vertical + .byte $21, $C7, $82, $73, $74 ; PRG:$36F7 21 C7 82 73 74 + ; PPU $21E9, length 14, repeat, horizontal + .byte $21, $E9, $4E, $79 ; PRG:$36FC 21 E9 4E 79 + ; PPU $2263, length 21, repeat, horizontal + .byte $22, $63, $55, $75 ; PRG:$3700 22 63 55 75 + ; PPU $2262, length 2, literal, vertical + .byte $22, $62, $82, $73, $74 ; PRG:$3704 22 62 82 73 74 + ; PPU $2283, length 5, literal, horizontal + .byte $22, $83, $05, $76, $76, $78, $24, $74 ; PRG:$3709 22 83 05 76 76 78 24 74 + ; PPU $2265, length 3, literal, horizontal + .byte $22, $65, $03, $77, $24, $73 ; PRG:$3711 22 65 03 77 24 73 + ; PPU $2289, length 14, repeat, horizontal + .byte $22, $89, $4E, $79 ; PRG:$3717 22 89 4E 79 + ; PPU $2278, length 2, literal, vertical + .byte $22, $78, $82, $77, $78 ; PRG:$371B 22 78 82 77 78 + ; PPU $2297, length 6, literal, vertical + .byte $22, $97, $86, $7B, $7C, $7C, $7C, $75, $7B ; PRG:$3720 22 97 86 7B 7C 7C 7C 75 7B + ; PPU $2307, length 2, literal, vertical + .byte $23, $07, $82, $73, $74 ; PRG:$3729 23 07 82 73 74 + ; PPU $2328, length 3, literal, vertical + .byte $23, $28, $83, $7B, $7C, $77 ; PRG:$372E 23 28 83 7B 7C 77 + ; PPU $2308, length 16, repeat, horizontal + .byte $23, $08, $50, $75 ; PRG:$3734 23 08 50 75 + ; PPU $2329, length 14, repeat, horizontal + .byte $23, $29, $4E, $79 ; PRG:$3738 23 29 4E 79 + ; PPU $2337, length 1, literal, horizontal + .byte $23, $37, $01, $7B ; PRG:$373C 23 37 01 7B + ; PPU $2318, length 2, literal, vertical + .byte $23, $18, $82, $77, $78 ; PRG:$3740 23 18 82 77 78 + ; PPU $2362, length 1, literal, horizontal + .byte $23, $62, $01, $73 ; PRG:$3745 23 62 01 73 + ; PPU $2363, length 5, repeat, horizontal + .byte $23, $63, $45, $75 ; PRG:$3749 23 63 45 75 + ; PPU $214E, length 2, literal, horizontal + .byte $21, $4E, $02, $50, $52 ; PRG:$374D 21 4E 02 50 52 + ; PPU $216E, length 2, literal, horizontal + .byte $21, $6E, $02, $51, $53 ; PRG:$3752 21 6E 02 51 53 + ; PPU $2212, length 2, literal, horizontal + .byte $22, $12, $02, $50, $52 ; PRG:$3757 22 12 02 50 52 + ; PPU $2232, length 2, literal, horizontal + .byte $22, $32, $02, $51, $53 ; PRG:$375C 22 32 02 51 53 + ; PPU $228C, length 2, literal, horizontal + .byte $22, $8C, $02, $50, $52 ; PRG:$3761 22 8C 02 50 52 + ; PPU $22AC, length 2, literal, horizontal + .byte $22, $AC, $02, $51, $53 ; PRG:$3766 22 AC 02 51 53 + .byte $00 ; PRG:$376B 00 ; stream terminator + +;------------------------------------------------------------------------------ +; SpringboardStageVramCommandStream +; +; Stage-two background and attribute command stream. +; Encoded records: 65; total bytes including terminator: 330. +;------------------------------------------------------------------------------ +SpringboardStageVramCommandStream: + ; PPU $3F00, length 4, literal, horizontal + .byte $3F, $00, $04, $0F, $2A, $17, $37 ; PRG:$376C 3F 00 04 0F 2A 17 37 + ; PPU $3F18, length 8, literal, horizontal + .byte $3F, $18, $08, $0F, $2A, $27, $38, $0F, $30, $13, $37 ; PRG:$3773 3F 18 08 0F 2A 27 38 0F 30 13 37 + ; PPU $23C0, length 8, repeat, horizontal + .byte $23, $C0, $48, $55 ; PRG:$377E 23 C0 48 55 + ; PPU $23C8, length 8, literal, horizontal + .byte $23, $C8, $08, $AA, $AA, $30, $0C, $00, $05, $05, $05 ; PRG:$3782 23 C8 08 AA AA 30 0C 00 05 05 05 + ; PPU $23D2, length 2, literal, vertical + .byte $23, $D2, $82, $40, $30 ; PRG:$378D 23 D2 82 40 30 + ; PPU $23E7, length 1, literal, horizontal + .byte $23, $E7, $01, $03 ; PRG:$3792 23 E7 01 03 + ; PPU $208D, length 2, literal, vertical + .byte $20, $8D, $82, $65, $66 ; PRG:$3796 20 8D 82 65 66 + ; PPU $2093, length 1, literal, horizontal + .byte $20, $93, $01, $66 ; PRG:$379B 20 93 01 66 + ; PPU $20A9, length 3, repeat, horizontal + .byte $20, $A9, $43, $5E ; PRG:$379F 20 A9 43 5E + ; PPU $20C8, length 2, literal, horizontal + .byte $20, $C8, $02, $48, $4A ; PRG:$37A3 20 C8 02 48 4A + ; PPU $20E8, length 2, literal, horizontal + .byte $20, $E8, $02, $49, $4B ; PRG:$37A8 20 E8 02 49 4B + ; PPU $2100, length 21, repeat, horizontal + .byte $21, $00, $55, $5E ; PRG:$37AD 21 00 55 5E + ; PPU $2117, length 3, repeat, horizontal + .byte $21, $17, $43, $5E ; PRG:$37B1 21 17 43 5E + ; PPU $21C3, length 16, repeat, vertical + .byte $21, $C3, $D0, $62 ; PRG:$37B5 21 C3 D0 62 + ; PPU $2344, length 4, repeat, vertical + .byte $23, $44, $C4, $62 ; PRG:$37B9 23 44 C4 62 + ; PPU $2345, length 4, repeat, vertical + .byte $23, $45, $C4, $62 ; PRG:$37BD 23 45 C4 62 + ; PPU $22C2, length 8, repeat, vertical + .byte $22, $C2, $C8, $62 ; PRG:$37C1 22 C2 C8 62 + ; PPU $22C1, length 8, repeat, vertical + .byte $22, $C1, $C8, $62 ; PRG:$37C5 22 C1 C8 62 + ; PPU $22C0, length 8, repeat, vertical + .byte $22, $C0, $C8, $62 ; PRG:$37C9 22 C0 C8 62 + ; PPU $234C, length 4, repeat, vertical + .byte $23, $4C, $C4, $62 ; PRG:$37CD 23 4C C4 62 + ; PPU $234D, length 4, repeat, vertical + .byte $23, $4D, $C4, $62 ; PRG:$37D1 23 4D C4 62 + ; PPU $234E, length 4, repeat, vertical + .byte $23, $4E, $C4, $62 ; PRG:$37D5 23 4E C4 62 + ; PPU $227B, length 7, repeat, vertical + .byte $22, $7B, $C7, $62 ; PRG:$37D9 22 7B C7 62 + ; PPU $227C, length 7, repeat, vertical + .byte $22, $7C, $C7, $62 ; PRG:$37DD 22 7C C7 62 + ; PPU $2379, length 7, repeat, horizontal + .byte $23, $79, $47, $62 ; PRG:$37E1 23 79 47 62 + ; PPU $2399, length 7, repeat, horizontal + .byte $23, $99, $47, $62 ; PRG:$37E5 23 99 47 62 + ; PPU $23B9, length 7, repeat, horizontal + .byte $23, $B9, $47, $62 ; PRG:$37E9 23 B9 47 62 + ; PPU $21A2, length 3, literal, horizontal + .byte $21, $A2, $03, $5F, $60, $61 ; PRG:$37ED 21 A2 03 5F 60 61 + ; PPU $225A, length 4, literal, horizontal + .byte $22, $5A, $04, $5F, $60, $60, $61 ; PRG:$37F3 22 5A 04 5F 60 60 61 + ; PPU $22A0, length 4, repeat, horizontal + .byte $22, $A0, $44, $60 ; PRG:$37FA 22 A0 44 60 + ; PPU $22A4, length 1, literal, horizontal + .byte $22, $A4, $01, $61 ; PRG:$37FE 22 A4 01 61 + ; PPU $22B6, length 4, literal, horizontal + .byte $22, $B6, $04, $5F, $60, $60, $61 ; PRG:$3802 22 B6 04 5F 60 60 61 + ; PPU $2320, length 6, repeat, horizontal + .byte $23, $20, $46, $60 ; PRG:$3809 23 20 46 60 + ; PPU $2326, length 1, literal, horizontal + .byte $23, $26, $01, $61 ; PRG:$380D 23 26 01 61 + ; PPU $232B, length 5, literal, horizontal + .byte $23, $2B, $05, $5F, $60, $60, $60, $61 ; PRG:$3811 23 2B 05 5F 60 60 60 61 + ; PPU $2358, length 1, literal, horizontal + .byte $23, $58, $01, $5F ; PRG:$3819 23 58 01 5F + ; PPU $2359, length 7, repeat, horizontal + .byte $23, $59, $47, $60 ; PRG:$381D 23 59 47 60 + ; PPU $2227, length 21, repeat, horizontal + .byte $22, $27, $55, $84 ; PRG:$3821 22 27 55 84 + ; PPU $221C, length 2, literal, vertical + .byte $22, $1C, $82, $85, $86 ; PRG:$3825 22 1C 82 85 86 + ; PPU $221D, length 2, literal, vertical + .byte $22, $1D, $82, $87, $88 ; PRG:$382A 22 1D 82 87 88 + ; PPU $2122, length 3, literal, vertical + .byte $21, $22, $83, $65, $65, $66 ; PRG:$382F 21 22 83 65 65 66 + ; PPU $21C2, length 5, repeat, vertical + .byte $21, $C2, $C5, $65 ; PRG:$3835 21 C2 C5 65 + ; PPU $2262, length 1, literal, horizontal + .byte $22, $62, $01, $66 ; PRG:$3839 22 62 01 66 + ; PPU $2125, length 10, repeat, vertical + .byte $21, $25, $CA, $65 ; PRG:$383D 21 25 CA 65 + ; PPU $2265, length 1, literal, horizontal + .byte $22, $65, $01, $66 ; PRG:$3841 22 65 01 66 + ; PPU $2128, length 7, repeat, vertical + .byte $21, $28, $C7, $65 ; PRG:$3845 21 28 C7 65 + ; PPU $2208, length 1, literal, horizontal + .byte $22, $08, $01, $66 ; PRG:$3849 22 08 01 66 + ; PPU $212B, length 5, literal, vertical + .byte $21, $2B, $85, $65, $94, $95, $65, $66 ; PRG:$384D 21 2B 85 65 94 95 65 66 + ; PPU $214A, length 2, literal, vertical + .byte $21, $4A, $82, $50, $51 ; PRG:$3855 21 4A 82 50 51 + ; PPU $212E, length 5, repeat, vertical + .byte $21, $2E, $C5, $65 ; PRG:$385A 21 2E C5 65 + ; PPU $21CE, length 1, literal, horizontal + .byte $21, $CE, $01, $66 ; PRG:$385E 21 CE 01 66 + ; PPU $2131, length 5, literal, vertical + .byte $21, $31, $85, $65, $65, $65, $65, $66 ; PRG:$3862 21 31 85 65 65 65 65 66 + ; PPU $2134, length 8, literal, vertical + .byte $21, $34, $88, $65, $65, $65, $65, $65, $90, $91, $66 ; PRG:$386A 21 34 88 65 65 65 65 65 90 91 66 + ; PPU $21D3, length 2, literal, vertical + .byte $21, $D3, $82, $58, $59 ; PRG:$3875 21 D3 82 58 59 + ; PPU $2137, length 5, literal, vertical + .byte $21, $37, $85, $65, $65, $65, $65, $66 ; PRG:$387A 21 37 85 65 65 65 65 66 + ; PPU $20DA, length 7, repeat, vertical + .byte $20, $DA, $C7, $65 ; PRG:$3882 20 DA C7 65 + ; PPU $21BA, length 1, literal, horizontal + .byte $21, $BA, $01, $66 ; PRG:$3886 21 BA 01 66 + ; PPU $20DD, length 7, repeat, vertical + .byte $20, $DD, $C7, $65 ; PRG:$388A 20 DD C7 65 + ; PPU $21BD, length 1, literal, horizontal + .byte $21, $BD, $01, $66 ; PRG:$388E 21 BD 01 66 + ; PPU $2146, length 2, literal, vertical + .byte $21, $46, $82, $56, $57 ; PRG:$3892 21 46 82 56 57 + ; PPU $2145, length 2, literal, vertical + .byte $21, $45, $82, $92, $93 ; PRG:$3897 21 45 82 92 93 + ; PPU $227A, length 5, literal, vertical + .byte $22, $7A, $85, $65, $65, $65, $65, $66 ; PRG:$389C 22 7A 85 65 65 65 65 66 + ; PPU $227D, length 5, literal, vertical + .byte $22, $7D, $85, $65, $65, $65, $65, $66 ; PRG:$38A4 22 7D 85 65 65 65 65 66 + ; PPU $2388, length 2, literal, horizontal + .byte $23, $88, $02, $5F, $61 ; PRG:$38AC 23 88 02 5F 61 + ; PPU $23A8, length 2, repeat, horizontal + .byte $23, $A8, $42, $62 ; PRG:$38B1 23 A8 42 62 + .byte $00 ; PRG:$38B5 00 ; stream terminator + +;------------------------------------------------------------------------------ +; CommonStageStatusVramCommandStream +; +; Common status/header updates applied after stages one through three. +; Encoded records: 11; total bytes including terminator: 88. +;------------------------------------------------------------------------------ +CommonStageStatusVramCommandStream: + ; PPU $2063, length 1, literal, horizontal + .byte $20, $63, $01, $FD ; PRG:$38B6 20 63 01 FD + ; PPU $206B, length 3, literal, horizontal + .byte $20, $6B, $03, $8D, $8E, $8F ; PRG:$38BA 20 6B 03 8D 8E 8F + ; PPU $2075, length 2, literal, horizontal + .byte $20, $75, $02, $FC, $FD ; PRG:$38C0 20 75 02 FC FD + ; PPU $2094, length 10, literal, horizontal + .byte $20, $94, $0A, $25, $13, $2A, $26, $27, $28, $29, $2A, $15, $2D ; PRG:$38C5 20 94 0A 25 13 2A 26 27 28 29 2A 15 2D + ; PPU $20B4, length 10, literal, horizontal + .byte $20, $B4, $0A, $2B, $24, $2C, $24, $24, $24, $24, $2C, $24, $2F ; PRG:$38D2 20 B4 0A 2B 24 2C 24 24 24 24 2C 24 2F + ; PPU $2082, length 6, literal, horizontal + .byte $20, $82, $06, $30, $34, $38, $3C, $40, $44 ; PRG:$38DF 20 82 06 30 34 38 3C 40 44 + ; PPU $20A2, length 6, literal, horizontal + .byte $20, $A2, $06, $31, $35, $39, $3D, $41, $45 ; PRG:$38E8 20 A2 06 31 35 39 3D 41 45 + ; PPU $208E, length 2, literal, vertical + .byte $20, $8E, $82, $4C, $4D ; PRG:$38F1 20 8E 82 4C 4D + ; PPU $208F, length 2, literal, vertical + .byte $20, $8F, $82, $4E, $4F ; PRG:$38F6 20 8F 82 4E 4F + ; PPU $20C2, length 6, literal, horizontal + .byte $20, $C2, $06, $32, $36, $3A, $3E, $42, $46 ; PRG:$38FB 20 C2 06 32 36 3A 3E 42 46 + ; PPU $20E2, length 6, literal, horizontal + .byte $20, $E2, $06, $33, $37, $3B, $3F, $43, $47 ; PRG:$3904 20 E2 06 33 37 3B 3F 43 47 + .byte $00 ; PRG:$390D 00 ; stream terminator + +;------------------------------------------------------------------------------ +; UnusedVramDataPadding +; +; Unreferenced $FF fill between the final command stream and UpdateAudioFrame. +;------------------------------------------------------------------------------ +UnusedVramDataPadding: + .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; PRG:$390E FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF + .byte $FF ; PRG:$391E FF +;------------------------------------------------------------------------------ +; UpdateAudioFrame +; +; Global description: +; Performs the decoded audio operation represented by UpdateAudioFrame at PRG $391F. +; +; Local description: +; Direct callees/tail targets: RunAudioEngine. State and scratch fields referenced: AudioLfoPhase, GameplayEventFlags, Zp00. Direct named writes: APUFRAMECNT, AudioLfoPhase, GameplayEventFlags, ObjectSoundRequestFlags, SecondarySoundRequestFlags, Zp00. Hardware registers: APUFRAMECNT. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +UpdateAudioFrame: + lda #$C0 ; PRG:$391F A9 C0 + sta APUFRAMECNT ; PRG:$3921 8D 17 40 + jsr RunAudioEngine ; PRG:$3924 20 D5 FA + ldx #$00 ; PRG:$3927 A2 00 + stx GameplayEventFlags ; PRG:$3929 86 FF + stx ObjectSoundRequestFlags ; PRG:$392B 86 FE + stx SecondarySoundRequestFlags ; PRG:$392D 86 FD + lda AudioLfoPhase ; PRG:$392F A5 FB + cmp #$20 ; PRG:$3931 C9 20 + bcs Label_F938 ; PRG:$3933 B0 03 + stx $06B2 ; PRG:$3935 8E B2 06 +Label_F938: + cmp #$80 ; PRG:$3938 C9 80 + bcc Label_F93F ; PRG:$393A 90 03 + inc $06B2 ; PRG:$393C EE B2 06 +Label_F93F: + tay ; PRG:$393F A8 + lsr a ; PRG:$3940 4A + lsr a ; PRG:$3941 4A + lsr a ; PRG:$3942 4A + lsr a ; PRG:$3943 4A + lsr a ; PRG:$3944 4A + sta Zp00 ; PRG:$3945 85 00 + tya ; PRG:$3947 98 + ldx $06B2 ; PRG:$3948 AE B2 06 + bne Label_F952 ; PRG:$394B D0 05 + sec ; PRG:$394D 38 + adc Zp00 ; PRG:$394E 65 00 + bne Label_F955 ; PRG:$3950 D0 03 +Label_F952: + clc ; PRG:$3952 18 + sbc Zp00 ; PRG:$3953 E5 00 +Label_F955: + sta AudioLfoPhase ; PRG:$3955 85 FB + rts ; PRG:$3957 60 + +;------------------------------------------------------------------------------ +; ConfigurePulse1WithSweepDisabled +; +; Loads the pulse-1 sweep register value $7F, then falls through to the shared +; pulse-1 envelope/sweep writer at ConfigurePulse1Envelope. +; Parameters: X = pulse-1 envelope/control value. +; Returns: through ConfigurePulse1Envelope. +;------------------------------------------------------------------------------ +ConfigurePulse1WithSweepDisabled: + ldy #$7F ; PRG:$3958 A0 7F + +;------------------------------------------------------------------------------ +; ConfigurePulse1Envelope +; +; Global description: +; Performs the decoded audio operation represented by ConfigurePulse1Envelope at PRG $395A. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. Direct named writes: APUPC1BASE, APUPC1SWEEP. Hardware registers: APUPC1BASE, APUPC1SWEEP. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +ConfigurePulse1Envelope: + stx APUPC1BASE ; PRG:$395A 8E 00 40 + sty APUPC1SWEEP ; PRG:$395D 8C 01 40 + rts ; PRG:$3960 60 + +;------------------------------------------------------------------------------ +; StartPulse2Effect +; +; Global description: +; Performs the decoded audio operation represented by StartPulse2Effect at PRG $3961. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioEffectTimer, AudioPitchAccumulator. Direct named writes: APUPC2BASE, APUPC2SWEEP, AudioEffectTimer, AudioPitchAccumulator. Hardware registers: APUPC2BASE, APUPC2SWEEP. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +StartPulse2Effect: + sta AudioEffectTimer ; PRG:$3961 85 F3 + stx AudioPitchAccumulator ; PRG:$3963 86 F4 + sty $06A1 ; PRG:$3965 8C A1 06 + ldx #$9A ; PRG:$3968 A2 9A + ldy #$08 ; PRG:$396A A0 08 + stx APUPC2BASE ; PRG:$396C 8E 04 40 + sty APUPC2SWEEP ; PRG:$396F 8C 05 40 + rts ; PRG:$3972 60 + +;------------------------------------------------------------------------------ +; StartTriangleEffect +; +; Global description: +; Performs the decoded audio operation represented by StartTriangleEffect at PRG $3973. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: TriangleEffectTimer, TrianglePitchAccumulator. Direct named writes: APUTRIBASE, APUTRIHIGH, TriangleEffectTimer, TrianglePitchAccumulator. Hardware registers: APUTRIBASE, APUTRIHIGH. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +StartTriangleEffect: + sta TriangleEffectTimer ; PRG:$3973 85 F5 + stx TrianglePitchAccumulator ; PRG:$3975 86 F6 + sty $06C0 ; PRG:$3977 8C C0 06 + lda #$FF ; PRG:$397A A9 FF + sta APUTRIBASE ; PRG:$397C 8D 08 40 + lda #$08 ; PRG:$397F A9 08 + sta APUTRIHIGH ; PRG:$3981 8D 0B 40 + rts ; PRG:$3984 60 + +;------------------------------------------------------------------------------ +; AudioUpdateStep_F985 +; +; Global description: +; Performs the decoded audio operation represented by AudioUpdateStep_F985 at PRG $3985. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioUpdateStep_F985, Pulse1EffectFlags, Pulse1EffectTimer. Direct named writes: Pulse1EffectFlags, Pulse1EffectTimer. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioUpdateStep_F985: + stx Pulse1EffectTimer ; PRG:$3985 86 F1 + sty Pulse1EffectFlags ; PRG:$3987 84 F0 + bne WriteApuPeriod ; PRG:$3989 D0 05 + +;------------------------------------------------------------------------------ +; AudioComputeStep_F98B +; +; Global description: +; Performs the decoded audio operation represented by AudioComputeStep_F98B at PRG $398B. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioComputeStep_F98B. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioComputeStep_F98B: + ldy #$7F ; PRG:$398B A0 7F + +;------------------------------------------------------------------------------ +; AudioDispatchStep_F98D +; +; Global description: +; Performs the decoded audio operation represented by AudioDispatchStep_F98D at PRG $398D. +; +; Local description: +; Direct callees/tail targets: ConfigurePulse1Envelope. State and scratch fields referenced: AudioDispatchStep_F98D. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioDispatchStep_F98D: + jsr ConfigurePulse1Envelope ; PRG:$398D 20 5A F9 + +;------------------------------------------------------------------------------ +; WriteApuPeriod +; +; Global description: +; Performs the decoded audio operation represented by WriteApuPeriod at PRG $3990. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. Direct named writes: APUPC1THIGH, APUPC1TLOW. Hardware registers: APUPC1THIGH, APUPC1TLOW. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +WriteApuPeriod: + ldx #$00 ; PRG:$3990 A2 00 +Label_F992: + tay ; PRG:$3992 A8 + lda ApuPeriodLowTable,y ; PRG:$3993 B9 01 FA + beq Label_F9A3 ; PRG:$3996 F0 0B + sta APUPC1TLOW,x ; PRG:$3998 9D 02 40 + lda ApuPeriodHighTable,y ; PRG:$399B B9 00 FA + ora #$08 ; PRG:$399E 09 08 + sta APUPC1THIGH,x ; PRG:$39A0 9D 03 40 +Label_F9A3: + rts ; PRG:$39A3 60 + +;------------------------------------------------------------------------------ +; WritePulse2Period +; +; Global description: +; Performs the decoded audio operation represented by WritePulse2Period at PRG $39A4. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +WritePulse2Period: + ldx #$04 ; PRG:$39A4 A2 04 + bne Label_F992 ; PRG:$39A6 D0 EA + +;------------------------------------------------------------------------------ +; WriteTrianglePeriod +; +; Global description: +; Performs the decoded audio operation represented by WriteTrianglePeriod at PRG $39A8. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +WriteTrianglePeriod: + txa ; PRG:$39A8 8A + and #$3E ; PRG:$39A9 29 3E + ldx #$08 ; PRG:$39AB A2 08 + bne Label_F992 ; PRG:$39AD D0 E3 + +;------------------------------------------------------------------------------ +; AudioComputeStep_F9AF +; +; Global description: +; Performs the decoded audio operation represented by AudioComputeStep_F9AF at PRG $39AF. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioComputeStep_F9AF. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioComputeStep_F9AF: + lda #$00 ; PRG:$39AF A9 00 + +;------------------------------------------------------------------------------ +; AudioUpdateStep_F9B1 +; +; Global description: +; Performs the decoded audio operation represented by AudioUpdateStep_F9B1 at PRG $39B1. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioUpdateStep_F9B1. Direct named writes: APUPC1BASE. Hardware registers: APUPC1BASE. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioUpdateStep_F9B1: + lsr a ; PRG:$39B1 4A + lsr a ; PRG:$39B2 4A + ora #$90 ; PRG:$39B3 09 90 + sta APUPC1BASE ; PRG:$39B5 8D 00 40 + rts ; PRG:$39B8 60 + +;------------------------------------------------------------------------------ +; AudioComputeStep_F9B9 +; +; Global description: +; Performs the decoded audio operation represented by AudioComputeStep_F9B9 at PRG $39B9. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioComputeStep_F9B9. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioComputeStep_F9B9: + tax ; PRG:$39B9 AA + ror a ; PRG:$39BA 6A + txa ; PRG:$39BB 8A + rol a ; PRG:$39BC 2A + rol a ; PRG:$39BD 2A + rol a ; PRG:$39BE 2A + +;------------------------------------------------------------------------------ +; AudioComputeStep_F9BF +; +; Global description: +; Performs the decoded audio operation represented by AudioComputeStep_F9BF at PRG $39BF. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioComputeStep_F9BF, AudioPitchModulationTable. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioComputeStep_F9BF: + and #$07 ; PRG:$39BF 29 07 + clc ; PRG:$39C1 18 + adc $068D ; PRG:$39C2 6D 8D 06 + tay ; PRG:$39C5 A8 + lda AudioPitchModulationTable,y ; PRG:$39C6 B9 4E FA + rts ; PRG:$39C9 60 + +;------------------------------------------------------------------------------ +; AudioComputeStep_F9CA +; +; Global description: +; Performs the decoded audio operation represented by AudioComputeStep_F9CA at PRG $39CA. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioComputeStep_F9CA. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioComputeStep_F9CA: + tya ; PRG:$39CA 98 + lsr a ; PRG:$39CB 4A + +;------------------------------------------------------------------------------ +; AudioComputeStep_F9CC +; +; Global description: +; Performs the decoded audio operation represented by AudioComputeStep_F9CC at PRG $39CC. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioComputeStep_F9CC. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioComputeStep_F9CC: + lsr a ; PRG:$39CC 4A + +;------------------------------------------------------------------------------ +; AudioUpdateStep_F9CD +; +; Global description: +; Performs the decoded audio operation represented by AudioUpdateStep_F9CD at PRG $39CD. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioUpdateStep_F9CD, Zp00. Direct named writes: Zp00. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioUpdateStep_F9CD: + lsr a ; PRG:$39CD 4A + sta Zp00 ; PRG:$39CE 85 00 + tya ; PRG:$39D0 98 + sec ; PRG:$39D1 38 + sbc Zp00 ; PRG:$39D2 E5 00 + rts ; PRG:$39D4 60 + +;------------------------------------------------------------------------------ +; AudioUpdateStep_F9D5 +; +; Global description: +; Performs the decoded audio operation represented by AudioUpdateStep_F9D5 at PRG $39D5. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioUpdateStep_F9D5. Direct named writes: APUDMALOAD. Hardware registers: APUDMALOAD. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioUpdateStep_F9D5: + lda $06D1 ; PRG:$39D5 AD D1 06 + cmp #$80 ; PRG:$39D8 C9 80 + bcs Label_F9DF ; PRG:$39DA B0 03 + inc $06D1 ; PRG:$39DC EE D1 06 +Label_F9DF: + lsr a ; PRG:$39DF 4A + sta APUDMALOAD ; PRG:$39E0 8D 11 40 + rts ; PRG:$39E3 60 + +;------------------------------------------------------------------------------ +; AudioDispatchStep_F9E4 +; +; Global description: +; Performs the decoded audio operation represented by AudioDispatchStep_F9E4 at PRG $39E4. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioDispatchStep_F9E4. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioDispatchStep_F9E4: + lda $06D1 ; PRG:$39E4 AD D1 06 + beq Label_F9DF ; PRG:$39E7 F0 F6 + dec $06D1 ; PRG:$39E9 CE D1 06 + jmp Label_F9DF ; PRG:$39EC 4C DF F9 + +;------------------------------------------------------------------------------ +; AudioComputeStep_F9EF +; +; Global description: +; Performs the decoded audio operation represented by AudioComputeStep_F9EF at PRG $39EF. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: AudioComputeStep_F9EF. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +AudioComputeStep_F9EF: + ldy #$07 ; PRG:$39EF A0 07 +Label_F9F1: + asl a ; PRG:$39F1 0A + bcs Label_F9F7 ; PRG:$39F2 B0 03 + dey ; PRG:$39F4 88 + bne Label_F9F1 ; PRG:$39F5 D0 FA +Label_F9F7: + rts ; PRG:$39F7 60 + +;------------------------------------------------------------------------------ +; PulseSweepPatternTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +PulseSweepPatternTable: + ; Explicit bytes replacing .incbin ROM:$3A08, length $0008 + .byte $85, $84, $84, $84, $84, $8C, $8C, $8C ; PRG:$39F8 85 84 84 84 84 8C 8C 8C + +;------------------------------------------------------------------------------ +; ApuPeriodHighTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +ApuPeriodHighTable: + ; Explicit bytes replacing .incbin ROM:$3A10, length $0001 + .byte $07 ; PRG:$3A00 07 + +;------------------------------------------------------------------------------ +; ApuPeriodLowTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +ApuPeriodLowTable: + ; Explicit bytes replacing .incbin ROM:$3A11, length $004D + .byte $F0, $00, $00, $00, $69, $00, $D4, $00, $BD, $00, $A8, $00, $9F, $00, $96, $00 ; PRG:$3A01 F0 00 00 00 69 00 D4 00 BD 00 A8 00 9F 00 96 00 + .byte $8D, $00, $70, $01, $AB, $01, $93, $01, $7C, $01, $67, $01, $52, $01, $3F, $01 ; PRG:$3A11 8D 00 70 01 AB 01 93 01 7C 01 67 01 52 01 3F 01 + .byte $2D, $01, $1C, $01, $0C, $00, $FD, $00, $E1, $03, $57, $02, $F9, $02, $A6, $02 ; PRG:$3A21 2D 01 1C 01 0C 00 FD 00 E1 03 57 02 F9 02 A6 02 + .byte $80, $02, $3A, $02, $1A, $01, $FC, $01, $C4, $06, $AE, $05, $F3, $05, $9E, $05 ; PRG:$3A31 80 02 3A 02 1A 01 FC 01 C4 06 AE 05 F3 05 9E 05 + .byte $4D, $05, $01, $04, $B9, $04, $75, $04, $35, $03, $F8, $03, $89 ; PRG:$3A41 4D 05 01 04 B9 04 75 04 35 03 F8 03 89 + +;------------------------------------------------------------------------------ +; AudioPitchModulationTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +AudioPitchModulationTable: + ; Explicit bytes replacing .incbin ROM:$3A5E, length $000F + .byte $05, $0A, $14, $28, $50, $1E, $3C, $06, $0C, $18, $30, $28, $24, $10, $04 ; PRG:$3A4E 05 0A 14 28 50 1E 3C 06 0C 18 30 28 24 10 04 + +;------------------------------------------------------------------------------ +; AudioDurationTable +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +AudioDurationTable: + ; Explicit bytes replacing .incbin ROM:$3A6D, length $0007 + .byte $08, $0A, $14, $03, $07, $08, $10 ; PRG:$3A5D 08 0A 14 03 07 08 10 +Label_FA64: + sta Pulse1EffectFlags ; PRG:$3A64 85 F0 + sta $06A1 ; PRG:$3A66 8D A1 06 + sta $06A2 ; PRG:$3A69 8D A2 06 + rts ; PRG:$3A6C 60 +Label_FA6D: + sty Pulse1EffectFlags ; PRG:$3A6D 84 F0 + lda #$08 ; PRG:$3A6F A9 08 + sta Pulse1EffectTimer ; PRG:$3A71 85 F1 + ldx #$9F ; PRG:$3A73 A2 9F + ldy #$A5 ; PRG:$3A75 A0 A5 + lda #$04 ; PRG:$3A77 A9 04 + jsr AudioDispatchStep_F98D ; PRG:$3A79 20 8D F9 +Label_FA7C: + dec Pulse1EffectTimer ; PRG:$3A7C C6 F1 + bne Label_FAD3 ; PRG:$3A7E D0 53 + lda #$8F ; PRG:$3A80 A9 8F + jmp Label_FB16 ; PRG:$3A82 4C 16 FB +Label_FA85: + sty Pulse1EffectFlags ; PRG:$3A85 84 F0 + lda #$80 ; PRG:$3A87 A9 80 + sta Pulse1EffectTimer ; PRG:$3A89 85 F1 + ldx #$9C ; PRG:$3A8B A2 9C + lda #$12 ; PRG:$3A8D A9 12 + jsr AudioComputeStep_F98B ; PRG:$3A8F 20 8B F9 +Label_FA92: + dec Pulse1EffectTimer ; PRG:$3A92 C6 F1 + lda Pulse1EffectTimer ; PRG:$3A94 A5 F1 + beq Label_FA64 ; PRG:$3A96 F0 CC + cmp #$30 ; PRG:$3A98 C9 30 + bcs Label_FA9F ; PRG:$3A9A B0 03 + jsr AudioUpdateStep_F9B1 ; PRG:$3A9C 20 B1 F9 +Label_FA9F: + lda Pulse1EffectTimer ; PRG:$3A9F A5 F1 + and #$07 ; PRG:$3AA1 29 07 + tay ; PRG:$3AA3 A8 + lda PulseSweepPatternTable,y ; PRG:$3AA4 B9 F8 F9 + sta APUPC1SWEEP ; PRG:$3AA7 8D 01 40 + jmp Label_FDF5 ; PRG:$3AAA 4C F5 FD +Label_FAAD: + ldx #$0E ; PRG:$3AAD A2 0E + lda #$26 ; PRG:$3AAF A9 26 + jsr AudioUpdateStep_F985 ; PRG:$3AB1 20 85 F9 + lda #$FE ; PRG:$3AB4 A9 FE + sta Pulse1PitchAccumulator ; PRG:$3AB6 85 F2 + ldx #$84 ; PRG:$3AB8 A2 84 + ldy #$8A ; PRG:$3ABA A0 8A + jsr ConfigurePulse1Envelope ; PRG:$3ABC 20 5A F9 +Label_FABF: + dec Pulse1EffectTimer ; PRG:$3ABF C6 F1 + beq Label_FB14 ; PRG:$3AC1 F0 51 + lda Pulse1EffectTimer ; PRG:$3AC3 A5 F1 + lsr a ; PRG:$3AC5 4A + bcs Label_FB11 ; PRG:$3AC6 B0 49 + lda Pulse1PitchAccumulator ; PRG:$3AC8 A5 F2 + tay ; PRG:$3ACA A8 + jsr AudioComputeStep_F9CC ; PRG:$3ACB 20 CC F9 + sta Pulse1PitchAccumulator ; PRG:$3ACE 85 F2 + sta APUPC1TLOW ; PRG:$3AD0 8D 02 40 +Label_FAD3: + bne Label_FB11 ; PRG:$3AD3 D0 3C + +;------------------------------------------------------------------------------ +; RunAudioEngine +; +; Global description: +; Performs the decoded audio operation represented by RunAudioEngine at PRG $3AD5. +; +; Local description: +; Direct callees/tail targets: AudioUpdateStep_F985, ConfigurePulse1Envelope, StartPulse2Effect, AudioUpdateStep_F9CD, AudioComputeStep_F9CA, StartTriangleEffect, AudioComputeStep_F9CC, AudioUpdateStep_F9D5, AudioComputeStep_F9EF, AudioDispatchStep_F9E4, WriteTrianglePeriod, AudioComputeStep_F9BF, WriteApuPeriod, AudioComputeStep_F9AF, AudioComputeStep_F9B9, WritePulse2Period. State and scratch fields referenced: AudioComputeStep_F9AF, AudioComputeStep_F9B9, AudioComputeStep_F9BF, AudioComputeStep_F9CA, AudioComputeStep_F9CC, AudioComputeStep_F9EF, AudioDispatchStep_F9E4, AudioDurationTable, AudioEffectTimer, AudioLfoPhase, AudioPitchAccumulator, AudioUpdateStep_F985, AudioUpdateStep_F9CD, AudioUpdateStep_F9D5, GameplayEventFlags, MusicDataPointerHi, MusicDataPointerLo, MusicNoisePosition, MusicPulsePosition, Pulse1EffectFlags, Pulse1EffectTimer, SoundEffectDataPointerHi, SoundEffectDataPointerLo, SoundEffectDescriptorIndex. Direct named writes: APUNOISEBASE, APUNOISELENGTH, APUNOISELOOP, APUPC1BASE, APUPC1SWEEP, APUPC1THIGH, APUPC1TLOW, APUPC2BASE, APUPC2HIGH, APUPC2LOW, APUPC2SWEEP, APUTRIBASE, APUTRIHIGH, APUTRILOW, AudioEffectTimer, AudioPitchAccumulator. Hardware registers: APUNOISEBASE, APUNOISELENGTH, APUNOISELOOP, APUPC1BASE, APUPC1SWEEP, APUPC1THIGH, APUPC1TLOW, APUPC2BASE, APUPC2HIGH, APUPC2LOW, APUPC2SWEEP, APUTRIBASE, APUTRIHIGH, APUTRILOW. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +RunAudioEngine: + lda MusicPulsePosition ; PRG:$3AD5 A5 FA + bne Label_FB11 ; PRG:$3AD7 D0 38 + ldy GameplayEventFlags ; PRG:$3AD9 A4 FF + lda Pulse1EffectFlags ; PRG:$3ADB A5 F0 + lsr a ; PRG:$3ADD 4A + bcs Label_FA7C ; PRG:$3ADE B0 9C + lsr GameplayEventFlags ; PRG:$3AE0 46 FF + bcs Label_FA6D ; PRG:$3AE2 B0 89 + lsr a ; PRG:$3AE4 4A + bcs Label_FA92 ; PRG:$3AE5 B0 AB + lsr GameplayEventFlags ; PRG:$3AE7 46 FF + bcs Label_FA85 ; PRG:$3AE9 B0 9A + lsr a ; PRG:$3AEB 4A + bcs Label_FABF ; PRG:$3AEC B0 D1 + lsr GameplayEventFlags ; PRG:$3AEE 46 FF + bcs Label_FAAD ; PRG:$3AF0 B0 BB + lsr a ; PRG:$3AF2 4A + lsr GameplayEventFlags ; PRG:$3AF3 46 FF + lsr a ; PRG:$3AF5 4A + bcs Label_FB26 ; PRG:$3AF6 B0 2E + lsr GameplayEventFlags ; PRG:$3AF8 46 FF + bcs Label_FB1F ; PRG:$3AFA B0 23 + lsr a ; PRG:$3AFC 4A + bcs Label_FB37 ; PRG:$3AFD B0 38 + lsr GameplayEventFlags ; PRG:$3AFF 46 FF + bcs Label_FB30 ; PRG:$3B01 B0 2D + lsr a ; PRG:$3B03 4A + bcs Label_FB50 ; PRG:$3B04 B0 4A + lsr GameplayEventFlags ; PRG:$3B06 46 FF + bcs Label_FB49 ; PRG:$3B08 B0 3F + lsr a ; PRG:$3B0A 4A + bcs Label_FB72 ; PRG:$3B0B B0 65 + lsr GameplayEventFlags ; PRG:$3B0D 46 FF + bcs Label_FB6C ; PRG:$3B0F B0 5B +Label_FB11: + jmp Label_FC9A ; PRG:$3B11 4C 9A FC +Label_FB14: + lda #$90 ; PRG:$3B14 A9 90 +Label_FB16: + sta APUPC1BASE ; PRG:$3B16 8D 00 40 + lda #$00 ; PRG:$3B19 A9 00 + sta Pulse1EffectFlags ; PRG:$3B1B 85 F0 + beq Label_FB11 ; PRG:$3B1D F0 F2 +Label_FB1F: + ldx #$0C ; PRG:$3B1F A2 0C + lda #$2A ; PRG:$3B21 A9 2A + jsr AudioUpdateStep_F985 ; PRG:$3B23 20 85 F9 +Label_FB26: + ldx #$85 ; PRG:$3B26 A2 85 + ldy #$85 ; PRG:$3B28 A0 85 + dec Pulse1EffectTimer ; PRG:$3B2A C6 F1 +Label_FB2C: + beq Label_FB14 ; PRG:$3B2C F0 E6 + bne Label_FB67 ; PRG:$3B2E D0 37 +Label_FB30: + ldx #$0A ; PRG:$3B30 A2 0A + lda #$10 ; PRG:$3B32 A9 10 + jsr AudioUpdateStep_F985 ; PRG:$3B34 20 85 F9 +Label_FB37: + dec Pulse1EffectTimer ; PRG:$3B37 C6 F1 + ldy #$84 ; PRG:$3B39 A0 84 + lda Pulse1EffectTimer ; PRG:$3B3B A5 F1 + cmp #$03 ; PRG:$3B3D C9 03 + beq Label_FB2C ; PRG:$3B3F F0 EB + cmp #$08 ; PRG:$3B41 C9 08 + bcs Label_FB64 ; PRG:$3B43 B0 1F + ldy #$8B ; PRG:$3B45 A0 8B + bne Label_FB64 ; PRG:$3B47 D0 1B +Label_FB49: + ldx #$15 ; PRG:$3B49 A2 15 + lda #$06 ; PRG:$3B4B A9 06 + jsr AudioUpdateStep_F985 ; PRG:$3B4D 20 85 F9 +Label_FB50: + dec Pulse1EffectTimer ; PRG:$3B50 C6 F1 + beq Label_FB2C ; PRG:$3B52 F0 D8 + ldy #$84 ; PRG:$3B54 A0 84 + lda Pulse1EffectTimer ; PRG:$3B56 A5 F1 + cmp #$12 ; PRG:$3B58 C9 12 + bcs Label_FB5E ; PRG:$3B5A B0 02 + ldy #$8D ; PRG:$3B5C A0 8D +Label_FB5E: + cmp #$0A ; PRG:$3B5E C9 0A + bcc Label_FB64 ; PRG:$3B60 90 02 + lda #$0A ; PRG:$3B62 A9 0A +Label_FB64: + ora #$50 ; PRG:$3B64 09 50 + tax ; PRG:$3B66 AA +Label_FB67: + jsr ConfigurePulse1Envelope ; PRG:$3B67 20 5A F9 + bne Label_FB11 ; PRG:$3B6A D0 A5 +Label_FB6C: + sty Pulse1EffectFlags ; PRG:$3B6C 84 F0 + lda #$0C ; PRG:$3B6E A9 0C + sta Pulse1EffectTimer ; PRG:$3B70 85 F1 +Label_FB72: + lda AudioLfoPhase ; PRG:$3B72 A5 FB + rol a ; PRG:$3B74 2A + rol a ; PRG:$3B75 2A + rol a ; PRG:$3B76 2A + sta APUPC1TLOW ; PRG:$3B77 8D 02 40 + rol a ; PRG:$3B7A 2A + sta APUPC1THIGH ; PRG:$3B7B 8D 03 40 + dec Pulse1EffectTimer ; PRG:$3B7E C6 F1 + lda Pulse1EffectTimer ; PRG:$3B80 A5 F1 + cmp #$02 ; PRG:$3B82 C9 02 + beq Label_FB2C ; PRG:$3B84 F0 A6 + ldy #$7F ; PRG:$3B86 A0 7F + bne Label_FB64 ; PRG:$3B88 D0 DA +Label_FB8A: + lda #$48 ; PRG:$3B8A A9 48 + ldx #$FE ; PRG:$3B8C A2 FE + jsr StartPulse2Effect ; PRG:$3B8E 20 61 F9 +Label_FB91: + ldy AudioPitchAccumulator ; PRG:$3B91 A4 F4 + dec AudioEffectTimer ; PRG:$3B93 C6 F3 + lda AudioEffectTimer ; PRG:$3B95 A5 F3 + beq Label_FBC2 ; PRG:$3B97 F0 29 + and #$03 ; PRG:$3B99 29 03 + beq Label_FBA8 ; PRG:$3B9B F0 0B + cmp #$03 ; PRG:$3B9D C9 03 + beq Label_FBAD ; PRG:$3B9F F0 0C + tya ; PRG:$3BA1 98 + jsr AudioUpdateStep_F9CD ; PRG:$3BA2 20 CD F9 + tay ; PRG:$3BA5 A8 + bne Label_FBAD ; PRG:$3BA6 D0 05 +Label_FBA8: + jsr AudioComputeStep_F9CA ; PRG:$3BA8 20 CA F9 + sta AudioPitchAccumulator ; PRG:$3BAB 85 F4 +Label_FBAD: + tya ; PRG:$3BAD 98 + clc ; PRG:$3BAE 18 + rol a ; PRG:$3BAF 2A + rol a ; PRG:$3BB0 2A + sta APUPC2LOW ; PRG:$3BB1 8D 06 40 + rol a ; PRG:$3BB4 2A + bne Label_FBDC ; PRG:$3BB5 D0 25 +Label_FBB7: + lda #$1C ; PRG:$3BB7 A9 1C + ldx #$2A ; PRG:$3BB9 A2 2A + jsr StartPulse2Effect ; PRG:$3BBB 20 61 F9 +Label_FBBE: + dec AudioEffectTimer ; PRG:$3BBE C6 F3 + lda AudioEffectTimer ; PRG:$3BC0 A5 F3 +Label_FBC2: + beq Label_FC07 ; PRG:$3BC2 F0 43 + lsr a ; PRG:$3BC4 4A + lda AudioPitchAccumulator ; PRG:$3BC5 A5 F4 + bcs Label_FBCF ; PRG:$3BC7 B0 06 + lsr a ; PRG:$3BC9 4A + clc ; PRG:$3BCA 18 + adc AudioPitchAccumulator ; PRG:$3BCB 65 F4 + bne Label_FBD7 ; PRG:$3BCD D0 08 +Label_FBCF: + lsr a ; PRG:$3BCF 4A + lsr a ; PRG:$3BD0 4A + lsr a ; PRG:$3BD1 4A + clc ; PRG:$3BD2 18 + adc AudioPitchAccumulator ; PRG:$3BD3 65 F4 + sta AudioPitchAccumulator ; PRG:$3BD5 85 F4 +Label_FBD7: + sta APUPC2LOW ; PRG:$3BD7 8D 06 40 + lda #$08 ; PRG:$3BDA A9 08 +Label_FBDC: + sta APUPC2HIGH ; PRG:$3BDC 8D 07 40 + lda AudioEffectTimer ; PRG:$3BDF A5 F3 + cmp #$18 ; PRG:$3BE1 C9 18 + bcs Label_FBEB ; PRG:$3BE3 B0 06 + lsr a ; PRG:$3BE5 4A + ora #$90 ; PRG:$3BE6 09 90 + sta APUPC2BASE ; PRG:$3BE8 8D 04 40 +Label_FBEB: + rts ; PRG:$3BEB 60 +Label_FBEC: + ldy ObjectSoundRequestFlags ; PRG:$3BEC A4 FE + lda $06A1 ; PRG:$3BEE AD A1 06 + lsr ObjectSoundRequestFlags ; PRG:$3BF1 46 FE + bcs Label_FB8A ; PRG:$3BF3 B0 95 + lsr a ; PRG:$3BF5 4A + bcs Label_FB91 ; PRG:$3BF6 B0 99 + lsr a ; PRG:$3BF8 4A + bcs Label_FBBE ; PRG:$3BF9 B0 C3 + lsr ObjectSoundRequestFlags ; PRG:$3BFB 46 FE + bcs Label_FBB7 ; PRG:$3BFD B0 B8 + lsr ObjectSoundRequestFlags ; PRG:$3BFF 46 FE + bcs Label_FC10 ; PRG:$3C01 B0 0D + lsr a ; PRG:$3C03 4A + bcs Label_FC24 ; PRG:$3C04 B0 1E + rts ; PRG:$3C06 60 +Label_FC07: + sta $06A1 ; PRG:$3C07 8D A1 06 + lda #$10 ; PRG:$3C0A A9 10 + sta APUNOISEBASE ; PRG:$3C0C 8D 0C 40 + rts ; PRG:$3C0F 60 +Label_FC10: + sty $06A1 ; PRG:$3C10 8C A1 06 + lda #$20 ; PRG:$3C13 A9 20 + sta AudioEffectTimer ; PRG:$3C15 85 F3 + lda #$04 ; PRG:$3C17 A9 04 + sta AudioPitchAccumulator ; PRG:$3C19 85 F4 + lda #$05 ; PRG:$3C1B A9 05 + sta APUNOISEBASE ; PRG:$3C1D 8D 0C 40 + asl a ; PRG:$3C20 0A + sta APUNOISELENGTH ; PRG:$3C21 8D 0F 40 +Label_FC24: + ldy #$02 ; PRG:$3C24 A0 02 + dec AudioEffectTimer ; PRG:$3C26 C6 F3 + lda AudioEffectTimer ; PRG:$3C28 A5 F3 + beq Label_FC07 ; PRG:$3C2A F0 DB + cmp #$18 ; PRG:$3C2C C9 18 + beq Label_FC34 ; PRG:$3C2E F0 04 + bcs Label_FC47 ; PRG:$3C30 B0 15 + bcc Label_FC3E ; PRG:$3C32 90 0A +Label_FC34: + ldx #$0F ; PRG:$3C34 A2 0F + stx APUNOISEBASE ; PRG:$3C36 8E 0C 40 + ldx #$50 ; PRG:$3C39 A2 50 + stx APUNOISELENGTH ; PRG:$3C3B 8E 0F 40 +Label_FC3E: + ldy AudioPitchAccumulator ; PRG:$3C3E A4 F4 + lsr a ; PRG:$3C40 4A + bcs Label_FC4C ; PRG:$3C41 B0 09 + inc AudioPitchAccumulator ; PRG:$3C43 E6 F4 + bne Label_FC4A ; PRG:$3C45 D0 03 +Label_FC47: + lsr a ; PRG:$3C47 4A + bcs Label_FC4C ; PRG:$3C48 B0 02 +Label_FC4A: + ldy #$0E ; PRG:$3C4A A0 0E +Label_FC4C: + sty APUNOISELOOP ; PRG:$3C4C 8C 0E 40 + rts ; PRG:$3C4F 60 +Label_FC50: + ldx #$18 ; PRG:$3C50 A2 18 + jsr StartTriangleEffect ; PRG:$3C52 20 73 F9 + bne Label_FC5B ; PRG:$3C55 D0 04 +Label_FC57: + dec TriangleEffectTimer ; PRG:$3C57 C6 F5 + bne Label_FCAD ; PRG:$3C59 D0 52 +Label_FC5B: + lda #$05 ; PRG:$3C5B A9 05 + sta TriangleEffectTimer ; PRG:$3C5D 85 F5 + lda TrianglePitchAccumulator ; PRG:$3C5F A5 F6 + lsr a ; PRG:$3C61 4A + lsr a ; PRG:$3C62 4A + clc ; PRG:$3C63 18 + adc TrianglePitchAccumulator ; PRG:$3C64 65 F6 + bcs Label_FCA8 ; PRG:$3C66 B0 40 + sta TrianglePitchAccumulator ; PRG:$3C68 85 F6 + bne Label_FC87 ; PRG:$3C6A D0 1B +Label_FC6C: + ldy #$02 ; PRG:$3C6C A0 02 + lda #$0C ; PRG:$3C6E A9 0C + ldx #$6F ; PRG:$3C70 A2 6F + jsr StartTriangleEffect ; PRG:$3C72 20 73 F9 +Label_FC75: + dec TriangleEffectTimer ; PRG:$3C75 C6 F5 + lda TriangleEffectTimer ; PRG:$3C77 A5 F5 + beq Label_FC6C ; PRG:$3C79 F0 F1 + cmp #$06 ; PRG:$3C7B C9 06 + beq Label_FCA8 ; PRG:$3C7D F0 29 + lda TrianglePitchAccumulator ; PRG:$3C7F A5 F6 + tay ; PRG:$3C81 A8 + jsr AudioComputeStep_F9CC ; PRG:$3C82 20 CC F9 + sta TrianglePitchAccumulator ; PRG:$3C85 85 F6 +Label_FC87: + sta APUTRILOW ; PRG:$3C87 8D 0A 40 + jsr AudioUpdateStep_F9D5 ; PRG:$3C8A 20 D5 F9 + jmp Label_FD4C ; PRG:$3C8D 4C 4C FD +Label_FC90: + cmp #$06 ; PRG:$3C90 C9 06 + beq Label_FC57 ; PRG:$3C92 F0 C3 + cmp #$03 ; PRG:$3C94 C9 03 + beq Label_FD15 ; PRG:$3C96 F0 7D + bne Label_FC75 ; PRG:$3C98 D0 DB +Label_FC9A: + ldx MusicNoisePosition ; PRG:$3C9A A6 F9 + bne Label_FD0C ; PRG:$3C9C D0 6E + lda SoundRequestFlags ; PRG:$3C9E A5 FC + bne Label_FCB0 ; PRG:$3CA0 D0 0E + sta $06B6 ; PRG:$3CA2 8D B6 06 + sta $06C0 ; PRG:$3CA5 8D C0 06 +Label_FCA8: + lda #$00 ; PRG:$3CA8 A9 00 + sta APUTRIBASE ; PRG:$3CAA 8D 08 40 +Label_FCAD: + jmp Label_FD4C ; PRG:$3CAD 4C 4C FD +Label_FCB0: + eor $06B6 ; PRG:$3CB0 4D B6 06 + beq Label_FCDC ; PRG:$3CB3 F0 27 +Label_FCB5: + lda SoundRequestFlags ; PRG:$3CB5 A5 FC + sta $06B6 ; PRG:$3CB7 8D B6 06 + jsr AudioComputeStep_F9EF ; PRG:$3CBA 20 EF F9 + cpy #$06 ; PRG:$3CBD C0 06 + beq Label_FC50 ; PRG:$3CBF F0 8F + cpy #$03 ; PRG:$3CC1 C0 03 + beq Label_FD0E ; PRG:$3CC3 F0 49 + cpy #$02 ; PRG:$3CC5 C0 02 + beq Label_FC6C ; PRG:$3CC7 F0 A3 + stx $06C0 ; PRG:$3CC9 8E C0 06 + lda TriangleSequenceStartOffsets,y ; PRG:$3CCC B9 B7 FF + sta $0680 ; PRG:$3CCF 8D 80 06 + lda #$BD ; PRG:$3CD2 A9 BD + sta TriangleEffectTimer ; PRG:$3CD4 85 F5 + lda #$FF ; PRG:$3CD6 A9 FF + sta TrianglePitchAccumulator ; PRG:$3CD8 85 F6 + bne Label_FCE9 ; PRG:$3CDA D0 0D +Label_FCDC: + lda $06C0 ; PRG:$3CDC AD C0 06 + bne Label_FC90 ; PRG:$3CDF D0 AF + jsr AudioDispatchStep_F9E4 ; PRG:$3CE1 20 E4 F9 + dec $0698 ; PRG:$3CE4 CE 98 06 + bne Label_FD4C ; PRG:$3CE7 D0 63 +Label_FCE9: + ldy $0680 ; PRG:$3CE9 AC 80 06 + inc $0680 ; PRG:$3CEC EE 80 06 + lda (TriangleEffectTimer),y ; PRG:$3CEF B1 F5 + beq Label_FCB5 ; PRG:$3CF1 F0 C2 + tax ; PRG:$3CF3 AA + ror a ; PRG:$3CF4 6A + txa ; PRG:$3CF5 8A + rol a ; PRG:$3CF6 2A + rol a ; PRG:$3CF7 2A + rol a ; PRG:$3CF8 2A + and #$07 ; PRG:$3CF9 29 07 + tay ; PRG:$3CFB A8 + lda AudioDurationTable,y ; PRG:$3CFC B9 5D FA + sta $0698 ; PRG:$3CFF 8D 98 06 + jsr WriteTrianglePeriod ; PRG:$3D02 20 A8 F9 + beq Label_FD4C ; PRG:$3D05 F0 45 + lda #$10 ; PRG:$3D07 A9 10 + sta APUTRIBASE ; PRG:$3D09 8D 08 40 +Label_FD0C: + bne Label_FD4C ; PRG:$3D0C D0 3E +Label_FD0E: + sty $06C0 ; PRG:$3D0E 8C C0 06 + lda #$06 ; PRG:$3D11 A9 06 + sta TriangleEffectTimer ; PRG:$3D13 85 F5 +Label_FD15: + ldy #$00 ; PRG:$3D15 A0 00 + dec TriangleEffectTimer ; PRG:$3D17 C6 F5 + bne Label_FD31 ; PRG:$3D19 D0 16 + lda #$0A ; PRG:$3D1B A9 0A + sta TriangleEffectTimer ; PRG:$3D1D 85 F5 + lda RandomLfsr0 ; PRG:$3D1F A5 18 + and RandomLfsr1 ; PRG:$3D21 25 19 + sta APUTRILOW ; PRG:$3D23 8D 0A 40 + and #$F0 ; PRG:$3D26 29 F0 + bne Label_FD41 ; PRG:$3D28 D0 17 + lda AudioLfoPhase ; PRG:$3D2A A5 FB + sta APUTRILOW ; PRG:$3D2C 8D 0A 40 + bne Label_FD41 ; PRG:$3D2F D0 10 +Label_FD31: + lda TriangleEffectTimer ; PRG:$3D31 A5 F5 + cmp #$05 ; PRG:$3D33 C9 05 + bne Label_FD4C ; PRG:$3D35 D0 15 + lda RandomLfsr0 ; PRG:$3D37 A5 18 + sta APUTRILOW ; PRG:$3D39 8D 0A 40 + lda RandomLfsr1 ; PRG:$3D3C A5 19 + bne Label_FD41 ; PRG:$3D3E D0 01 + iny ; PRG:$3D40 C8 +Label_FD41: + sty APUTRIHIGH ; PRG:$3D41 8C 0B 40 + lda #$08 ; PRG:$3D44 A9 08 + sta APUTRIBASE ; PRG:$3D46 8D 08 40 + jsr AudioUpdateStep_F9D5 ; PRG:$3D49 20 D5 F9 +Label_FD4C: + lda SecondarySoundRequestFlags ; PRG:$3D4C A5 FD + bne Label_FD58 ; PRG:$3D4E D0 08 + lda $06A2 ; PRG:$3D50 AD A2 06 + bne Label_FD9C ; PRG:$3D53 D0 47 + jmp Label_FBEC ; PRG:$3D55 4C EC FB +Label_FD58: + jsr AudioComputeStep_F9EF ; PRG:$3D58 20 EF F9 + inc $06A2 ; PRG:$3D5B EE A2 06 + sty $06F1 ; PRG:$3D5E 8C F1 06 + lda SoundEffectDescriptorIndex,y ; PRG:$3D61 B9 51 FE + tay ; PRG:$3D64 A8 + lda SoundEffectDescriptorIndex,y ; PRG:$3D65 B9 51 FE + sta $068D ; PRG:$3D68 8D 8D 06 + lda SoundEffectDataPointerLo,y ; PRG:$3D6B B9 52 FE + sta MusicDataPointerLo ; PRG:$3D6E 85 F7 + lda SoundEffectDataPointerHi,y ; PRG:$3D70 B9 53 FE + sta MusicDataPointerHi ; PRG:$3D73 85 F8 + lda SoundEffectNoiseOffset,y ; PRG:$3D75 B9 54 FE + sta MusicNoisePosition ; PRG:$3D78 85 F9 + lda SoundEffectSequenceData,y ; PRG:$3D7A B9 55 FE + sta MusicPulsePosition ; PRG:$3D7D 85 FA + lda #$7F ; PRG:$3D7F A9 7F + sta APUPC1SWEEP ; PRG:$3D81 8D 01 40 + sta APUPC2SWEEP ; PRG:$3D84 8D 05 40 + lda #$01 ; PRG:$3D87 A9 01 + sta $0695 ; PRG:$3D89 8D 95 06 + sta $0696 ; PRG:$3D8C 8D 96 06 + sta $0698 ; PRG:$3D8F 8D 98 06 + ldy #$00 ; PRG:$3D92 A0 00 + sty $0682 ; PRG:$3D94 8C 82 06 + lda $06F1 ; PRG:$3D97 AD F1 06 + beq Label_FDA0 ; PRG:$3D9A F0 04 +Label_FD9C: + ldy MusicPulsePosition ; PRG:$3D9C A4 FA + beq Label_FDDE ; PRG:$3D9E F0 3E +Label_FDA0: + dec $0696 ; PRG:$3DA0 CE 96 06 + bne Label_FDDE ; PRG:$3DA3 D0 39 + inc MusicPulsePosition ; PRG:$3DA5 E6 FA + lda (MusicDataPointerLo),y ; PRG:$3DA7 B1 F7 + beq Label_FDF2 ; PRG:$3DA9 F0 47 + bpl Label_FDB9 ; PRG:$3DAB 10 0C + jsr AudioComputeStep_F9BF ; PRG:$3DAD 20 BF F9 + sta $0691 ; PRG:$3DB0 8D 91 06 + ldy MusicPulsePosition ; PRG:$3DB3 A4 FA + inc MusicPulsePosition ; PRG:$3DB5 E6 FA + lda (MusicDataPointerLo),y ; PRG:$3DB7 B1 F7 +Label_FDB9: + jsr WriteApuPeriod ; PRG:$3DB9 20 90 F9 + bne Label_FDC2 ; PRG:$3DBC D0 04 + ldy #$10 ; PRG:$3DBE A0 10 + bne Label_FDD1 ; PRG:$3DC0 D0 0F +Label_FDC2: + ldy #$9F ; PRG:$3DC2 A0 9F + lda $06F1 ; PRG:$3DC4 AD F1 06 + beq Label_FDD1 ; PRG:$3DC7 F0 08 + ldy #$06 ; PRG:$3DC9 A0 06 + lda MusicNoisePosition ; PRG:$3DCB A5 F9 + bne Label_FDD1 ; PRG:$3DCD D0 02 + ldy #$86 ; PRG:$3DCF A0 86 +Label_FDD1: + sty APUPC1BASE ; PRG:$3DD1 8C 00 40 + lda $0691 ; PRG:$3DD4 AD 91 06 + sta $0696 ; PRG:$3DD7 8D 96 06 + lda #$00 ; PRG:$3DDA A9 00 + sta Pulse1EffectFlags ; PRG:$3DDC 85 F0 +Label_FDDE: + lda $06F1 ; PRG:$3DDE AD F1 06 + beq Label_FE22 ; PRG:$3DE1 F0 3F + dec $0695 ; PRG:$3DE3 CE 95 06 + bne Label_FE22 ; PRG:$3DE6 D0 3A + ldy $0682 ; PRG:$3DE8 AC 82 06 + inc $0682 ; PRG:$3DEB EE 82 06 + lda (MusicDataPointerLo),y ; PRG:$3DEE B1 F7 + bne Label_FE02 ; PRG:$3DF0 D0 10 +Label_FDF2: + jsr AudioComputeStep_F9AF ; PRG:$3DF2 20 AF F9 +Label_FDF5: + lda #$00 ; PRG:$3DF5 A9 00 + sta MusicPulsePosition ; PRG:$3DF7 85 FA + sta MusicNoisePosition ; PRG:$3DF9 85 F9 + sta $06A2 ; PRG:$3DFB 8D A2 06 + sta APUTRIBASE ; PRG:$3DFE 8D 08 40 + rts ; PRG:$3E01 60 +Label_FE02: + jsr AudioComputeStep_F9B9 ; PRG:$3E02 20 B9 F9 + sta $0695 ; PRG:$3E05 8D 95 06 + txa ; PRG:$3E08 8A + and #$3E ; PRG:$3E09 29 3E + jsr WritePulse2Period ; PRG:$3E0B 20 A4 F9 + ldy #$87 ; PRG:$3E0E A0 87 + lda $0695 ; PRG:$3E10 AD 95 06 + cmp #$10 ; PRG:$3E13 C9 10 + bcs Label_FE1F ; PRG:$3E15 B0 08 + ldy #$85 ; PRG:$3E17 A0 85 + cmp #$08 ; PRG:$3E19 C9 08 + bcs Label_FE1F ; PRG:$3E1B B0 02 + ldy #$82 ; PRG:$3E1D A0 82 +Label_FE1F: + sty APUPC2BASE ; PRG:$3E1F 8C 04 40 +Label_FE22: + ldy MusicNoisePosition ; PRG:$3E22 A4 F9 + beq Label_FE50 ; PRG:$3E24 F0 2A + jsr AudioDispatchStep_F9E4 ; PRG:$3E26 20 E4 F9 + dec $0698 ; PRG:$3E29 CE 98 06 + bne Label_FE50 ; PRG:$3E2C D0 22 + inc MusicNoisePosition ; PRG:$3E2E E6 F9 + lda (MusicDataPointerLo),y ; PRG:$3E30 B1 F7 + jsr AudioComputeStep_F9B9 ; PRG:$3E32 20 B9 F9 + sta $0698 ; PRG:$3E35 8D 98 06 + clc ; PRG:$3E38 18 + adc #$FE ; PRG:$3E39 69 FE + asl a ; PRG:$3E3B 0A + asl a ; PRG:$3E3C 0A + cmp #$3C ; PRG:$3E3D C9 3C + bcc Label_FE43 ; PRG:$3E3F 90 02 + lda #$3C ; PRG:$3E41 A9 3C +Label_FE43: + ldy $06F1 ; PRG:$3E43 AC F1 06 + bne Label_FE4A ; PRG:$3E46 D0 02 + lda #$FF ; PRG:$3E48 A9 FF +Label_FE4A: + sta APUTRIBASE ; PRG:$3E4A 8D 08 40 + jsr WriteTrianglePeriod ; PRG:$3E4D 20 A8 F9 +Label_FE50: + rts ; PRG:$3E50 60 + +;------------------------------------------------------------------------------ +; SoundEffectDescriptorIndex +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +SoundEffectDescriptorIndex: + ; Explicit bytes replacing .incbin ROM:$3E61, length $0001 + .byte $08 ; PRG:$3E51 08 + +;------------------------------------------------------------------------------ +; SoundEffectDataPointerLo +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +SoundEffectDataPointerLo: + ; Explicit bytes replacing .incbin ROM:$3E62, length $0001 + .byte $0D ; PRG:$3E52 0D + +;------------------------------------------------------------------------------ +; SoundEffectDataPointerHi +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +SoundEffectDataPointerHi: + ; Explicit bytes replacing .incbin ROM:$3E63, length $0001 + .byte $12 ; PRG:$3E53 12 + +;------------------------------------------------------------------------------ +; SoundEffectNoiseOffset +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +SoundEffectNoiseOffset: + ; Explicit bytes replacing .incbin ROM:$3E64, length $0001 + .byte $17 ; PRG:$3E54 17 + +;------------------------------------------------------------------------------ +; SoundEffectSequenceData +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +SoundEffectSequenceData: + ; Explicit bytes replacing .incbin ROM:$3E65, length $0162 + .byte $1C, $21, $26, $2B, $07, $81, $FE, $16, $00, $00, $A1, $FE, $11, $00, $00, $C3 ; PRG:$3E55 1C 21 26 2B 07 81 FE 16 00 00 A1 FE 11 00 00 C3 + .byte $FE, $00, $13, $00, $F3, $FE, $00, $1C, $00, $34, $FF, $20, $00, $0F, $A7, $FF ; PRG:$3E65 FE 00 13 00 F3 FE 00 1C 00 34 FF 20 00 0F A7 FF + .byte $00, $00, $00, $AE, $FF, $00, $00, $07, $25, $FF, $1F, $3F, $81, $02, $3C, $42 ; PRG:$3E75 00 00 00 AE FF 00 00 07 25 FF 1F 3F 81 02 3C 42 + .byte $48, $4C, $2C, $30, $34, $38, $80, $18, $16, $18, $16, $18, $16, $18, $16, $83 ; PRG:$3E85 48 4C 2C 30 34 38 80 18 16 18 16 18 16 18 16 83 + .byte $18, $00, $82, $6C, $70, $74, $78, $58, $5E, $64, $E8, $E8, $62, $86, $62, $86 ; PRG:$3E95 18 00 82 6C 70 74 78 58 5E 64 E8 E8 62 86 62 86 + .byte $A2, $60, $86, $60, $86, $A0, $5E, $86, $5E, $86, $8A, $11, $00, $94, $9C, $A2 ; PRG:$3EA5 A2 60 86 60 86 A0 5E 86 5E 86 8A 11 00 94 9C A2 + .byte $94, $94, $9A, $A0, $9A, $98, $9E, $A6, $86, $82, $20, $62, $02, $F2, $94, $58 ; PRG:$3EB5 94 94 9A A0 9A 98 9E A6 86 82 20 62 02 F2 94 58 + .byte $5C, $9E, $9C, $98, $54, $B8, $76, $B2, $94, $58, $5C, $9E, $9C, $98, $54, $F8 ; PRG:$3EC5 5C 9E 9C 98 54 B8 76 B2 94 58 5C 9E 9C 98 54 F8 + .byte $00, $82, $32, $81, $36, $38, $82, $14, $14, $14, $81, $36, $82, $32, $81, $30 ; PRG:$3ED5 00 82 32 81 36 38 82 14 14 14 81 36 82 32 81 30 + .byte $82, $2E, $32, $81, $36, $38, $82, $14, $14, $14, $81, $36, $84, $32, $5C, $64 ; PRG:$3EE5 82 2E 32 81 36 38 82 14 14 14 81 36 84 32 5C 64 + .byte $68, $48, $60, $66, $46, $4A, $0C, $08, $0A, $06, $08, $28, $06, $26, $28, $22 ; PRG:$3EF5 68 48 60 66 46 4A 0C 08 0A 06 08 28 06 26 28 22 + .byte $26, $1E, $22, $1C, $1E, $18, $15, $03, $83, $00, $82, $2E, $4C, $44, $3E, $2C ; PRG:$3F05 26 1E 22 1C 1E 18 15 03 83 00 82 2E 4C 44 3E 2C + .byte $4C, $46, $40, $81, $3A, $3C, $40, $82, $46, $81, $4A, $2A, $2C, $84, $2A, $02 ; PRG:$3F15 4C 46 40 81 3A 3C 40 82 46 81 4A 2A 2C 84 2A 02 + .byte $94, $A2, $5C, $55, $B8, $A2, $5C, $79, $B6, $94, $5E, $A2, $5E, $DC, $D8, $94 ; PRG:$3F25 94 A2 5C 55 B8 A2 5C 79 B6 94 5E A2 5E DC D8 94 + .byte $A2, $5C, $55, $B8, $A2, $5C, $79, $B6, $94, $5C, $A2, $5C, $D8, $D4, $00, $94 ; PRG:$3F35 A2 5C 55 B8 A2 5C 79 B6 94 5C A2 5C D8 D4 00 94 + .byte $B2, $AE, $B2, $9C, $B8, $B2, $B8, $9E, $94, $B6, $94, $94, $B2, $B2, $98, $94 ; PRG:$3F45 B2 AE B2 9C B8 B2 B8 9E 94 B6 94 94 B2 B2 98 94 + .byte $B2, $AE, $B2, $9C, $B8, $B2, $B8, $9E, $94, $AE, $B8, $72, $B2, $6C, $D4, $83 ; PRG:$3F55 B2 AE B2 9C B8 B2 B8 9E 94 AE B8 72 B2 6C D4 83 + .byte $02, $81, $02, $06, $08, $0A, $83, $02, $81, $02, $28, $06, $08, $02, $1E, $26 ; PRG:$3F65 02 81 02 06 08 0A 83 02 81 02 28 06 08 02 1E 26 + .byte $06, $02, $26, $06, $0C, $02, $0A, $06, $0A, $02, $08, $28, $08, $82, $06, $87 ; PRG:$3F75 06 02 26 06 0C 02 0A 06 0A 02 08 28 08 82 06 87 + .byte $06, $0A, $84, $10, $82, $02, $28, $87, $28, $1C, $84, $10, $83, $02, $87, $1E ; PRG:$3F85 06 0A 84 10 82 02 28 87 28 1C 84 10 83 02 87 1E + .byte $06, $84, $0C, $87, $1C, $28, $84, $0A, $87, $22, $28, $86, $08, $87, $1C, $22 ; PRG:$3F95 06 84 0C 87 1C 28 84 0A 87 22 28 86 08 87 1C 22 + .byte $83, $06, $E8, $07, $CE, $11, $D2, $05, $00, $04, $10, $04, $10, $04, $10, $04 ; PRG:$3FA5 83 06 E8 07 CE 11 D2 05 00 04 10 04 10 04 10 04 + .byte $50, $00 ; PRG:$3FB5 50 00 + +;------------------------------------------------------------------------------ +; TriangleSequenceStartOffsets +; +; Pass 1 classification: data referenced by reachable code. +; Exact structure and semantics will be refined in Pass 2/3. +;------------------------------------------------------------------------------ +TriangleSequenceStartOffsets: + ; Explicit bytes replacing .incbin ROM:$3FC7, length $0039 + .byte $00, $00, $00, $00, $13, $2E, $9F, $99, $95, $59, $9F, $9F, $59, $95, $99, $A3 ; PRG:$3FB7 00 00 00 00 13 2E 9F 99 95 59 9F 9F 59 95 99 A3 + .byte $9D, $99, $5D, $A3, $A3, $5D, $99, $9D, $00, $5E, $9E, $54, $5E, $9E, $54, $5E ; PRG:$3FC7 9D 99 5D A3 A3 5D 99 9D 00 5E 9E 54 5E 9E 54 5E + .byte $9E, $54, $5E, $5C, $5E, $60, $62, $A2, $58, $62, $A2, $58, $62, $A2, $58, $62 ; PRG:$3FD7 9E 54 5E 5C 5E 60 62 A2 58 62 A2 58 62 A2 58 62 + .byte $60, $62, $64, $00, $06, $06, $06, $06, $08 ; PRG:$3FE7 60 62 64 00 06 06 06 06 08 + +;------------------------------------------------------------------------------ +; IrqHandler +; +; Global description: +; Performs the decoded gameplay operation represented by IrqHandler at PRG $3FF0. +; +; Local description: +; Direct callees/tail targets: none. State and scratch fields referenced: none. +; +; Parameters: +; Consumes the listed state fields and any register/scratch inputs established by its callers; immediate constants and indexed records are shown in the instruction listing. +; +; Returns: +; Returns through the decoded RTS/RTI path or documented tail transfer. A and condition flags carry any directly computed status used by the caller. +; +; Clobbers: +; A, X, Y, processor flags, and the listed state/scratch/hardware destinations when written; called routines add their documented clobbers. +;------------------------------------------------------------------------------ +IrqHandler: + asl a ; PRG:$3FF0 0A + +;------------------------------------------------------------------------------ +; Data_$FFF1 +; +; Pass 1 classification: data or currently unreachable bytes. +; Preserved directly from the original ROM for byte-identical builds. +;------------------------------------------------------------------------------ +UnreferencedVectorTailRectangleBytes: + ; Four rectangle-like bytes; no direct static consumer has been proven. + .byte $0C, $0C, $0C, $0C ; PRG:$3FF1 0C 0C 0C 0C +UnreferencedVectorTailSentinelBytes: + ; Shape-like bytes with $FF sentinels; no direct static consumer has been proven. + .byte $0A, $08, $00, $FF, $FF ; PRG:$3FF5 0A 08 00 FF FF +;------------------------------------------------------------------------------ +; Interrupt vector table +;------------------------------------------------------------------------------ +VectorTable: + .word NmiHandler ; PRG:$3FFA E6 C6 + .word ResetHandler ; PRG:$3FFC 6E C6 + .word IrqHandler ; PRG:$3FFE F0 FF diff --git a/Donkey Kong Jr. (JU)/copilot/reconstructed.lbl b/Donkey Kong Jr. (JU)/copilot/reconstructed.lbl new file mode 100644 index 0000000..f01d36e --- /dev/null +++ b/Donkey Kong Jr. (JU)/copilot/reconstructed.lbl @@ -0,0 +1,1035 @@ +al 00FFFA .VectorTable +al 00FFF5 .UnreferencedVectorTailSentinelBytes +al 00FFF1 .UnreferencedVectorTailRectangleBytes +al 00FFF0 .IrqHandler +al 00FE4A .Label_FE4A +al 00FE43 .Label_FE43 +al 00FE50 .Label_FE50 +al 00FE1F .Label_FE1F +al 00FE02 .Label_FE02 +al 00FE22 .Label_FE22 +al 00FDD1 .Label_FDD1 +al 00FDC2 .Label_FDC2 +al 00FDB9 .Label_FDB9 +al 00FDF2 .Label_FDF2 +al 00FDDE .Label_FDDE +al 00FDA0 .Label_FDA0 +al 00FE55 .SoundEffectSequenceData +al 00FE54 .SoundEffectNoiseOffset +al 00FE53 .SoundEffectDataPointerHi +al 00FE52 .SoundEffectDataPointerLo +al 00FE51 .SoundEffectDescriptorIndex +al 00FD9C .Label_FD9C +al 00FD58 .Label_FD58 +al 00FD41 .Label_FD41 +al 00FD31 .Label_FD31 +al 00FCE9 .Label_FCE9 +al 00FFB7 .TriangleSequenceStartOffsets +al 00FD0E .Label_FD0E +al 00FCB5 .Label_FCB5 +al 00FCDC .Label_FCDC +al 00FCB0 .Label_FCB0 +al 00FD0C .Label_FD0C +al 00FD15 .Label_FD15 +al 00FC90 .Label_FC90 +al 00FD4C .Label_FD4C +al 00FC75 .Label_FC75 +al 00FC6C .Label_FC6C +al 00FC87 .Label_FC87 +al 00FCA8 .Label_FCA8 +al 00FCAD .Label_FCAD +al 00FC57 .Label_FC57 +al 00FC5B .Label_FC5B +al 00FC50 .Label_FC50 +al 00FC4A .Label_FC4A +al 00FC4C .Label_FC4C +al 00FC3E .Label_FC3E +al 00FC47 .Label_FC47 +al 00FC34 .Label_FC34 +al 00FC24 .Label_FC24 +al 00FC10 .Label_FC10 +al 00FBEC .Label_FBEC +al 00FBEB .Label_FBEB +al 00FBD7 .Label_FBD7 +al 00FBCF .Label_FBCF +al 00FC07 .Label_FC07 +al 00FBBE .Label_FBBE +al 00FBB7 .Label_FBB7 +al 00FBDC .Label_FBDC +al 00FBAD .Label_FBAD +al 00FBA8 .Label_FBA8 +al 00FBC2 .Label_FBC2 +al 00FB91 .Label_FB91 +al 00FB8A .Label_FB8A +al 00FB5E .Label_FB5E +al 00FB64 .Label_FB64 +al 00FB67 .Label_FB67 +al 00FB2C .Label_FB2C +al 00FC9A .Label_FC9A +al 00FB6C .Label_FB6C +al 00FB72 .Label_FB72 +al 00FB49 .Label_FB49 +al 00FB50 .Label_FB50 +al 00FB30 .Label_FB30 +al 00FB37 .Label_FB37 +al 00FB1F .Label_FB1F +al 00FB26 .Label_FB26 +al 00FB11 .Label_FB11 +al 00FB14 .Label_FB14 +al 00FABF .Label_FABF +al 00FAAD .Label_FAAD +al 00FDF5 .Label_FDF5 +al 00FA9F .Label_FA9F +al 00FA92 .Label_FA92 +al 00FA85 .Label_FA85 +al 00FB16 .Label_FB16 +al 00FAD3 .Label_FAD3 +al 00FA7C .Label_FA7C +al 00FA6D .Label_FA6D +al 00FA64 .Label_FA64 +al 00FA5D .AudioDurationTable +al 00F9F8 .PulseSweepPatternTable +al 00F9F7 .Label_F9F7 +al 00F9F1 .Label_F9F1 +al 00F9EF .AudioComputeStep_F9EF +al 00F9E4 .AudioDispatchStep_F9E4 +al 00F9DF .Label_F9DF +al 00F9D5 .AudioUpdateStep_F9D5 +al 00F9CD .AudioUpdateStep_F9CD +al 00F9CC .AudioComputeStep_F9CC +al 00F9CA .AudioComputeStep_F9CA +al 00FA4E .AudioPitchModulationTable +al 00F9BF .AudioComputeStep_F9BF +al 00F9B9 .AudioComputeStep_F9B9 +al 00F9B1 .AudioUpdateStep_F9B1 +al 00F9AF .AudioComputeStep_F9AF +al 00F9A8 .WriteTrianglePeriod +al 00F9A4 .WritePulse2Period +al 00FA00 .ApuPeriodHighTable +al 00F9A3 .Label_F9A3 +al 00FA01 .ApuPeriodLowTable +al 00F992 .Label_F992 +al 00F98D .AudioDispatchStep_F98D +al 00F98B .AudioComputeStep_F98B +al 00F990 .WriteApuPeriod +al 00F985 .AudioUpdateStep_F985 +al 00F973 .StartTriangleEffect +al 00F961 .StartPulse2Effect +al 00F95A .ConfigurePulse1Envelope +al 00F958 .ConfigurePulse1WithSweepDisabled +al 00F955 .Label_F955 +al 00F952 .Label_F952 +al 00F93F .Label_F93F +al 00F938 .Label_F938 +al 00FAD5 .RunAudioEngine +al 00F90E .UnusedVramDataPadding +al 00F8B6 .CommonStageStatusVramCommandStream +al 00F76C .SpringboardStageVramCommandStream +al 00F647 .MariosHideoutVramCommandStream +al 00F4EE .ChainsStageVramCommandStream +al 00F38E .VinesStageVramCommandStream +al 00F266 .TitleScreenVramCommandStream +al 00F265 .Label_F265 +al 00F254 .Label_F254 +al 00F22F .Label_F22F +al 00F22D .ReadControllerPort +al 00F208 .Label_F208 +al 00F1C1 .Label_F1C1 +al 00F1BB .Label_F1BB +al 00F196 .Label_F196 +al 00F1A2 .Label_F1A2 +al 00F181 .Label_F181 +al 00F1AC .Label_F1AC +al 00F1A7 .Label_F1A7 +al 00F156 .Label_F156 +al 00F17C .Label_F17C +al 00F1A3 .Label_F1A3 +al 00F14D .Label_F14D +al 00F126 .Label_F126 +al 00F11A .Label_F11A +al 00F0FE .Label_F0FE +al 00F102 .Label_F102 +al 00F0F1 .Label_F0F1 +al 00F129 .SplitPackedCoordinate +al 00F0E5 .Label_F0E5 +al 00F0C9 .Label_F0C9 +al 00F0C3 .Label_F0C3 +al 00F107 .SubtractPackedCoordinateDelta +al 00F0E6 .AddPackedCoordinateDelta +al 00F06E .Label_F06E +al 00F095 .Label_F095 +al 00F091 .Label_F091 +al 00F061 .ApplyPackedBoundingBoxUpdate +al 00F057 .Label_F057 +al 00F046 .Label_F046 +al 00F03F .Label_F03F +al 00F027 .Label_F027 +al 00EFFE .Label_EFFE +al 00EFE5 .Label_EFE5 +al 00EFCD .Label_EFCD +al 00EFBC .Label_EFBC +al 00EF9D .Label_EF9D +al 00F02E .AbortVramAppendOnOverflow +al 00F02C .AdvanceVramBufferCursor +al 00EF61 .QueueHudDigitsByDescriptor +al 00EF5B .Label_EF5B +al 00EF52 .Label_EF52 +al 00EF28 .Label_EF28 +al 00EF25 .Label_EF25 +al 00EF22 .Label_EF22 +al 00EF16 .Label_EF16 +al 00EF00 .Label_EF00 +al 00EEF9 .Label_EEF9 +al 00EEE0 .Label_EEE0 +al 00EECA .Label_EECA +al 00EE98 .Label_EE98 +al 00EE9B .Label_EE9B +al 00EE73 .Label_EE73 +al 00EE7E .Label_EE7E +al 00EE1E .Label_EE1E +al 00EE15 .Label_EE15 +al 00EDD9 .Label_EDD9 +al 00EDD7 .Label_EDD7 +al 00EDDC .Label_EDDC +al 00EDC6 .Label_EDC6 +al 00ED65 .Label_ED65 +al 00ED67 .Label_ED67 +al 00ED56 .Label_ED56 +al 00ED2E .Label_ED2E +al 00ED1C .Label_ED1C +al 00ED38 .GameplayUpdateStep_ED38 +al 00ED1F .Label_ED1F +al 00ED0A .Label_ED0A +al 00ECDC .Label_ECDC +al 00ECDA .Label_ECDA +al 00ECC9 .Label_ECC9 +al 00ECC3 .Label_ECC3 +al 00ECBE .Label_ECBE +al 00EE7F .EnqueueTask +al 00EC9F .Label_EC9F +al 00EC78 .Label_EC78 +al 00EC42 .Label_EC42 +al 00EC84 .QueueObjectDeferredTasks +al 00EC3B .SpawnTwoTileObjectSprite +al 00EC3A .Label_EC3A +al 00EC27 .Label_EC27 +al 00EC1B .Label_EC1B +al 00EC11 .Label_EC11 +al 00EC0B .Label_EC0B +al 00EC14 .Label_EC14 +al 00EBFA .Label_EBFA +al 00EBF4 .Label_EBF4 +al 00EBD0 .ExpandCollisionPointPair +al 00EBCD .CollisionCollisionStep_EBCD +al 00EBC9 .Label_EBC9 +al 00EBB6 .Label_EBB6 +al 00EBB8 .Label_EBB8 +al 00EBBA .Label_EBBA +al 00EBC1 .BuildCollisionRectangle +al 00EB8D .Label_EB8D +al 00EB96 .Label_EB96 +al 00EB75 .ProcessCollisionShape +al 00EB54 .Label_EB54 +al 00EB4C .Label_EB4C +al 00EB22 .Label_EB22 +al 00EB1D .Label_EB1D +al 00EAEE .Label_EAEE +al 00EAE9 .Label_EAE9 +al 00EAC2 .Label_EAC2 +al 00EABC .Label_EABC +al 00EAA5 .Label_EAA5 +al 00EA95 .Label_EA95 +al 00EA8F .FillSpriteTileIndices +al 00EABA .FillSpriteGridPositions +al 00EB14 .FillVerticallyFlippedSpriteTiles +al 00EAE0 .FillMirroredSpriteTiles +al 00EA74 .Label_EA74 +al 00EB4A .HideSpriteGrid +al 00EA65 .Label_EA65 +al 00EA5F .Label_EA5F +al 00EA6B .Label_EA6B +al 00EA9F .FillForwardSpriteTiles +al 00EA51 .Label_EA51 +al 00EA40 .Label_EA40 +al 00EA71 .Label_EA71 +al 00E9CF .Label_E9CF +al 00E9C3 .Label_E9C3 +al 00E9AB .Label_E9AB +al 00E9A2 .Label_E9A2 +al 00E979 .LoadStageCollisionList +al 00E91D .Label_E91D +al 00E964 .Label_E964 +al 00E8DB .RunStageCollisionQuery +al 00E95E .Label_E95E +al 00E8CF .Label_E8CF +al 00E93E .Label_E93E +al 00E8C8 .Label_E8C8 +al 00E927 .Label_E927 +al 00E8F0 .Label_E8F0 +al 00E8A5 .Label_E8A5 +al 00E883 .Label_E883 +al 00E888 .Label_E888 +al 00E86F .Label_E86F +al 00E874 .Label_E874 +al 00E88A .Label_E88A +al 00E85B .Label_E85B +al 00E84B .Label_E84B +al 00E837 .Label_E837 +al 00E83D .Label_E83D +al 00E82E .Label_E82E +al 00E839 .Label_E839 +al 00E823 .Label_E823 +al 00E80A .Label_E80A +al 00E81B .Label_E81B +al 00E7EE .Label_E7EE +al 00E7E3 .Label_E7E3 +al 00E809 .Label_E809 +al 00E7AF .Label_E7AF +al 00E7AD .Label_E7AD +al 00E7BE .Label_E7BE +al 00E796 .Label_E796 +al 00E78E .Label_E78E +al 00E77F .Label_E77F +al 00E7A0 .Label_E7A0 +al 00E74E .Label_E74E +al 00E761 .Label_E761 +al 00E716 .Label_E716 +al 00E718 .Label_E718 +al 00E70B .Label_E70B +al 00E6F2 .Label_E6F2 +al 00E6D5 .Label_E6D5 +al 00E69A .Label_E69A +al 00E697 .Label_E697 +al 00E6A1 .AudioUpdateStep_E6A1 +al 00E68A .Label_E68A +al 00E6AF .AudioUpdateStep_E6AF +al 00E687 .Label_E687 +al 00E762 .AudioUpdateStep_E762 +al 00E740 .AudioRenderStep_E740 +al 00E71D .AudioUpdateStep_E71D +al 00E661 .Label_E661 +al 00E6E3 .AudioUpdateStep_E6E3 +al 00E67C .EnemyUpdateStep_E67C +al 00E64C .Label_E64C +al 00E7D9 .EnemyUpdateStep_E7D9 +al 00E63A .Label_E63A +al 00E64F .Label_E64F +al 00E61C .Label_E61C +al 00E676 .Label_E676 +al 00E66D .Label_E66D +al 00E5FD .Label_E5FD +al 00E5ED .Label_E5ED +al 00E5D1 .Label_E5D1 +al 00E5C0 .Label_E5C0 +al 00E597 .Label_E597 +al 00E595 .Label_E595 +al 00E5DD .EnemyUpdateStep_E5DD +al 00E58C .Label_E58C +al 00E5C1 .StageUpdateStep_E5C1 +al 00E587 .Label_E587 +al 00E577 .Label_E577 +al 00E567 .Label_E567 +al 00E571 .Label_E571 +al 00E554 .Label_E554 +al 00E558 .Label_E558 +al 00E840 .ClassifyCoordinateAgainstRanges +al 00E52F .Label_E52F +al 00E535 .Label_E535 +al 00E538 .Label_E538 +al 00E5A0 .Label_E5A0 +al 00E518 .Label_E518 +al 00E501 .Label_E501 +al 00ED8E .PlayerUpdateStep_ED8E +al 00E4F4 .Label_E4F4 +al 00E4D9 .Label_E4D9 +al 00E4CF .Label_E4CF +al 00E4B8 .Label_E4B8 +al 00E46B .Label_E46B +al 00E469 .Label_E469 +al 00E45E .Label_E45E +al 00E453 .Label_E453 +al 00E47E .GraphicsUpdateStep_E47E +al 00E45F .GraphicsUpdateStep_E45F +al 00E441 .Label_E441 +al 00E40E .Label_E40E +al 00E408 .Label_E408 +al 00E3FF .Label_E3FF +al 00E3EE .Label_E3EE +al 00E3D2 .Label_E3D2 +al 00E3AE .Label_E3AE +al 00E377 .Label_E377 +al 00E366 .Label_E366 +al 00E371 .Label_E371 +al 00E2EE .Label_E2EE +al 00E2E8 .Label_E2E8 +al 00E2F5 .Label_E2F5 +al 00E2CF .Label_E2CF +al 00E2D3 .Label_E2D3 +al 00E2C5 .Label_E2C5 +al 00E3DD .PlayerUpdateStep_E3DD +al 00E2A1 .Label_E2A1 +al 00E33C .CollisionCollisionStep_E33C +al 00E2A2 .GraphicsStateStep_E2A2 +al 00E294 .Label_E294 +al 00E3B9 .CollisionCollisionStep_E3B9 +al 00E380 .CollisionCollisionStep_E380 +al 00E2F6 .GraphicsRenderStep_E2F6 +al 00E285 .Label_E285 +al 00E311 .GraphicsRenderStep_E311 +al 00E282 .Label_E282 +al 00E28E .Label_E28E +al 00E272 .Label_E272 +al 00E26A .Label_E26A +al 00E25C .Label_E25C +al 00E24C .Label_E24C +al 00E213 .Label_E213 +al 00E1F3 .Label_E1F3 +al 00E1D2 .Label_E1D2 +al 00E1DF .Label_E1DF +al 00E1F0 .Label_E1F0 +al 00E1BF .Label_E1BF +al 00E225 .DrawPlatformSprite +al 00E170 .Label_E170 +al 00E184 .Label_E184 +al 00E185 .Label_E185 +al 00E134 .Label_E134 +al 00E11B .Label_E11B +al 00E112 .Label_E112 +al 00E100 .Label_E100 +al 00E10C .Label_E10C +al 00E0E1 .Label_E0E1 +al 00E0D7 .Label_E0D7 +al 00E0DA .Label_E0DA +al 00E0AC .Label_E0AC +al 00E0A5 .Label_E0A5 +al 00E0A7 .Label_E0A7 +al 00E099 .Label_E099 +al 00E069 .Label_E069 +al 00E045 .EnemyUpdateStep_E045 +al 00E030 .EnemyUpdateStep_E030 +al 00E01E .Label_E01E +al 00E026 .Label_E026 +al 00E022 .Label_E022 +al 00E081 .EnemyUpdateStep_E081 +al 00DFE4 .EnemyUpdateStep_DFE4 +al 00E0B3 .EnemyUpdateStep_E0B3 +al 00DFD6 .Label_DFD6 +al 00DFDA .Label_DFDA +al 00DFB7 .Label_DFB7 +al 00DFB5 .Label_DFB5 +al 00DFAC .Label_DFAC +al 00DFA9 .Label_DFA9 +al 00DFC0 .Label_DFC0 +al 00DF67 .Label_DF67 +al 00DF4F .Label_DF4F +al 00DF44 .Label_DF44 +al 00DF31 .Label_DF31 +al 00DF2F .Label_DF2F +al 00DFC1 .EnemyDispatchStep_DFC1 +al 00E055 .EnemyUpdateStep_E055 +al 00DF52 .Label_DF52 +al 00DF68 .AudioRenderStep_DF68 +al 00DF26 .Label_DF26 +al 00DFF9 .EnemyDispatchStep_DFF9 +al 00DF23 .Label_DF23 +al 00DF1D .Label_DF1D +al 00DF11 .Label_DF11 +al 00DF0B .Label_DF0B +al 00DEED .Label_DEED +al 00DED8 .Label_DED8 +al 00DEC5 .Label_DEC5 +al 00DEB8 .Label_DEB8 +al 00DECB .Label_DECB +al 00DEBF .Label_DEBF +al 00DEB9 .Label_DEB9 +al 00DEA6 .Label_DEA6 +al 00DED4 .CollisionUpdateStep_DED4 +al 00E0CC .EnemyComputeStep_E0CC +al 00DE5B .Label_DE5B +al 00DE59 .Label_DE59 +al 00DE55 .Label_DE55 +al 00DE57 .Label_DE57 +al 00DE6C .CollisionCollisionStep_DE6C +al 00DE69 .Label_DE69 +al 00DE31 .Label_DE31 +al 00DE1A .Label_DE1A +al 00DE14 .Label_DE14 +al 00DE02 .GraphicsRenderStep_DE02 +al 00DDF6 .Label_DDF6 +al 00DDD0 .Label_DDD0 +al 00DDCA .GraphicsRenderStep_DDCA +al 00DDC1 .GraphicsDispatchStep_DDC1 +al 00DDB7 .Label_DDB7 +al 00DD74 .Label_DD74 +al 00DD72 .Label_DD72 +al 00DD93 .EnemyUpdateStep_DD93 +al 00DD67 .Label_DD67 +al 00DD85 .EnemyUpdateStep_DD85 +al 00DD64 .Label_DD64 +al 00DD58 .Label_DD58 +al 00DD53 .Label_DD53 +al 00DD50 .Label_DD50 +al 00DD0D .Label_DD0D +al 00DD0B .Label_DD0B +al 00DD33 .GraphicsUpdateStep_DD33 +al 00DD02 .Label_DD02 +al 00DD1D .EnemyUpdateStep_DD1D +al 00DCFD .Label_DCFD +al 00EA01 .DrawObjectSpriteMode1 +al 00DCCB .Label_DCCB +al 00DCAA .Label_DCAA +al 00DDE4 .GraphicsStateStep_DDE4 +al 00DDA7 .EnemyStateStep_DDA7 +al 00DCCC .GraphicsRenderStep_DCCC +al 00DD43 .GraphicsRenderStep_DD43 +al 00DC80 .Label_DC80 +al 00DCEF .GraphicsRenderStep_DCEF +al 00DC6D .Label_DC6D +al 00DC77 .Label_DC77 +al 00DE28 .CollisionStateStep_DE28 +al 00DC69 .Label_DC69 +al 00DC55 .Label_DC55 +al 00DC97 .Label_DC97 +al 00DC91 .Label_DC91 +al 00DC87 .Label_DC87 +al 00DC73 .Label_DC73 +al 00E8A3 .RunCollisionQuery +al 00DC56 .Label_DC56 +al 00DC1D .Label_DC1D +al 00DC17 .Label_DC17 +al 00DC41 .Label_DC41 +al 00DC9D .GraphicsRenderStep_DC9D +al 00DC01 .Label_DC01 +al 00DBF3 .Label_DBF3 +al 00DBD6 .Label_DBD6 +al 00DBCD .Label_DBCD +al 00DBE8 .Label_DBE8 +al 00DBA3 .Label_DBA3 +al 00DBAA .Label_DBAA +al 00DB93 .Label_DB93 +al 00DB8D .Label_DB8D +al 00DB7E .Label_DB7E +al 00DB70 .Label_DB70 +al 00DB66 .Label_DB66 +al 00DB57 .Label_DB57 +al 00DB55 .Label_DB55 +al 00DB3E .Label_DB3E +al 00DB2A .Label_DB2A +al 00DB18 .Label_DB18 +al 00DA91 .Label_DA91 +al 00DA8C .Label_DA8C +al 00DA61 .Label_DA61 +al 00DA5F .Label_DA5F +al 00DA64 .Label_DA64 +al 00DA45 .Label_DA45 +al 00DA42 .Label_DA42 +al 00DA31 .Label_DA31 +al 00DA2F .Label_DA2F +al 00DA1F .Label_DA1F +al 00ED7B .GameplayUpdateStep_ED7B +al 00DA10 .Label_DA10 +al 00D9C6 .Label_D9C6 +al 00D987 .Label_D987 +al 00D992 .Label_D992 +al 00D986 .Label_D986 +al 00D96F .Label_D96F +al 00D95F .Label_D95F +al 00D95E .Label_D95E +al 00D944 .Label_D944 +al 00D947 .Label_D947 +al 00D929 .Label_D929 +al 00E9AE .IntegrateVerticalMotion +al 00D906 .Label_D906 +al 00D8FC .Label_D8FC +al 00D8E8 .Label_D8E8 +al 00D8D5 .Label_D8D5 +al 00D8CB .PlayerUpdateStep_D8CB +al 00D8BB .Label_D8BB +al 00D8EF .GraphicsUpdateStep_D8EF +al 00D8B8 .Label_D8B8 +al 00D8A2 .Label_D8A2 +al 00D8A3 .GraphicsRenderStep_D8A3 +al 00D88B .Label_D88B +al 00D883 .Label_D883 +al 00DAD7 .EnterPlayerFallingState +al 00D863 .Label_D863 +al 00D861 .Label_D861 +al 00D876 .Label_D876 +al 00D87A .Label_D87A +al 00D869 .Label_D869 +al 00D856 .Label_D856 +al 00D83F .PlayerUpdateStep_D83F +al 00D83E .Label_D83E +al 00D829 .Label_D829 +al 00D80D .Label_D80D +al 00D7EF .Label_D7EF +al 00D810 .CollisionUpdateStep_D810 +al 00D7E8 .Label_D7E8 +al 00D7F8 .CollisionUpdateStep_D7F8 +al 00D7E5 .Label_D7E5 +al 00DA48 .BuildPlayerMotionPosition +al 00D7C7 .Label_D7C7 +al 00DA76 .StartPlayerTransitionMotion +al 00D7C9 .Label_D7C9 +al 00D7BB .Label_D7BB +al 00D7BF .Label_D7BF +al 00D7AC .Label_D7AC +al 00E98B .TickDirectionalRepeatTimer +al 00D7A2 .Label_D7A2 +al 00D7D3 .CollisionCollisionStep_D7D3 +al 00D78B .Label_D78B +al 00D777 .Label_D777 +al 00D764 .Label_D764 +al 00D74C .Label_D74C +al 00D74A .Label_D74A +al 00D77E .PlayerUpdateStep_D77E +al 00D73F .Label_D73F +al 00D75A .PlayerUpdateStep_D75A +al 00D73C .Label_D73C +al 00D72B .GraphicsRenderStep_D72B +al 00D79C .CollisionUpdateStep_D79C +al 00D727 .Label_D727 +al 00D72A .Label_D72A +al 00D70E .Label_D70E +al 00D701 .Label_D701 +al 00D709 .Label_D709 +al 00D6EE .Label_D6EE +al 00D6D0 .Label_D6D0 +al 00D6F5 .PlayerUpdateStep_D6F5 +al 00D6A5 .Label_D6A5 +al 00D6D7 .PlayerUpdateStep_D6D7 +al 00D699 .Label_D699 +al 00D6B9 .PlayerUpdateStep_D6B9 +al 00D6B8 .Label_D6B8 +al 00D696 .Label_D696 +al 00D677 .Label_D677 +al 00D65D .Label_D65D +al 00DA34 .TestPlayerFallDistance +al 00D650 .Label_D650 +al 00D640 .Label_D640 +al 00D630 .Label_D630 +al 00D62C .Label_D62C +al 00DA22 .ResolvePlayerFallState +al 00D913 .GraphicsRenderStep_D913 +al 00D60D .Label_D60D +al 00D608 .Label_D608 +al 00E89B .TestPlayerCollisionMode2 +al 00D604 .Label_D604 +al 00D5EE .Label_D5EE +al 00ECB7 .PlayerCollisionStep_ECB7 +al 00D600 .Label_D600 +al 00DA66 .StartPlayerClimbMotion +al 00D71B .GraphicsDispatchStep_D71B +al 00D82C .PlayerDispatchStep_D82C +al 00D87E .GraphicsUpdateStep_D87E +al 00D5BE .Label_D5BE +al 00E897 .TestPlayerCollisionMode1 +al 00D5C2 .Label_D5C2 +al 00D5C6 .Label_D5C6 +al 00D5A2 .Label_D5A2 +al 00D5CB .Label_D5CB +al 00D681 .GraphicsRenderStep_D681 +al 00DA14 .UpdatePlayerStatePhase +al 00D612 .GraphicsStateStep_D612 +al 00D585 .Label_D585 +al 00D581 .Label_D581 +al 00E893 .TestPlayerCollisionMode0 +al 00D562 .PlayerCollisionStep_D562 +al 00D55B .PlayerUpdateStep_D55B +al 00D544 .Label_D544 +al 00D53B .Label_D53B +al 00D526 .Label_D526 +al 00D51D .Label_D51D +al 00D511 .Label_D511 +al 00D4FC .Label_D4FC +al 00D4F4 .Label_D4F4 +al 00D4E5 .Label_D4E5 +al 00D4E3 .Label_D4E3 +al 00D4DA .Label_D4DA +al 00D4D5 .Label_D4D5 +al 00D4D3 .Label_D4D3 +al 00D4B7 .Label_D4B7 +al 00D4B2 .Label_D4B2 +al 00D4C3 .EnemyUpdateStep_D4C3 +al 00D495 .Label_D495 +al 00D491 .Label_D491 +al 00D49A .EnemyUpdateStep_D49A +al 00D496 .EnemyDispatchStep_D496 +al 00D479 .EnemyCollisionStep_D479 +al 00D4B8 .EnemyCollisionStep_D4B8 +al 00D473 .Label_D473 +al 00D46D .Label_D46D +al 00D467 .Label_D467 +al 00D476 .Label_D476 +al 00D955 .CollectStageObject +al 00D5D7 .CollisionCollisionStep_D5D7 +al 00D58C .PlayerCollisionStep_D58C +al 00D436 .Label_D436 +al 00D56E .PlayerCollisionStep_D56E +al 00D631 .GraphicsRenderStep_D631 +al 00D433 .Label_D433 +al 00D42D .Label_D42D +al 00D427 .Label_D427 +al 00D51E .TestPlayerAgainstSpriteObjects +al 00D3FD .Label_D3FD +al 00D4D6 .ScanEnemyCollisionSlots +al 00D3E3 .Label_D3E3 +al 00D405 .Label_D405 +al 00D545 .TestPlayerAuxSpriteCollision +al 00D3BB .Label_D3BB +al 00D3B1 .Label_D3B1 +al 00EBE3 .TestRectangleOverlap +al 00D393 .Label_D393 +al 00D386 .Label_D386 +al 00D37D .Label_D37D +al 00EB6E .BuildAndTestCollisionBounds +al 00D364 .Label_D364 +al 00D35A .Label_D35A +al 00D349 .Label_D349 +al 00D34A .Label_D34A +al 00D3F2 .TestSecondarySpriteObjectCollisions +al 00D3EB .TestPrimarySpriteObjectCollisions +al 00D3D0 .HandleAuxiliarySpriteCollision +al 00D387 .TestPlayerAgainstPlatformPair +al 00D33A .UpdatePlayerPlatformContact +al 00D3BC .RefreshCurrentPlatformContact +al 00D3DF .TestSecondaryEnemyCollisions +al 00D3F9 .TestSecondaryObjectGroupCollision +al 00D3D8 .TestPrimaryEnemyCollisions +al 00D333 .Label_D333 +al 00D323 .Label_D323 +al 00D31C .Label_D31C +al 00D304 .Label_D304 +al 00D43A .TestPlayerObjectCollision +al 00D2F3 .Label_D2F3 +al 00EB69 .BuildCollisionBounds +al 00D2E3 .Label_D2E3 +al 00D2DB .Label_D2DB +al 00D2CF .Label_D2CF +al 00D2B4 .Label_D2B4 +al 00DAA5 .ResetPlayerMotionParameters +al 00D2B8 .Label_D2B8 +al 00D2A4 .Label_D2A4 +al 00D291 .Label_D291 +al 00D288 .Label_D288 +al 00D27B .Label_D27B +al 00D2BC .Label_D2BC +al 00D242 .Label_D242 +al 00D243 .Label_D243 +al 00ED44 .GameplayUpdateStep_ED44 +al 00D237 .Label_D237 +al 00D250 .Label_D250 +al 00D1FF .Label_D1FF +al 00D1E9 .Label_D1E9 +al 00D218 .AnimatePlayerDeath +al 00D1BB .Label_D1BB +al 00D1BC .DetectAndStartPlayerDeathAnimation +al 00D1B8 .Label_D1B8 +al 00D19B .Label_D19B +al 00D18C .Label_D18C +al 00D177 .Label_D177 +al 00D16C .Label_D16C +al 00D181 .Label_D181 +al 00D141 .DrawStageClearSpriteGroupE +al 00D139 .DrawStageClearSpriteGroupD +al 00D120 .DrawStageClearSpriteGroupB +al 00D135 .DrawStageClearSpriteGroupC +al 00D0DC .BuildStageClearScreen +al 00D11C .DrawStageClearSpriteGroupA +al 00D0D2 .Label_D0D2 +al 00D0AB .Label_D0AB +al 00D14E .UpdateStageClearAnimatedObjects +al 00D0C7 .AdvanceStageClearAnimation +al 00D0A6 .HandleStageClearMilestoneD0 +al 00D0A2 .Label_D0A2 +al 00D09E .Label_D09E +al 00D09A .Label_D09A +al 00D087 .Label_D087 +al 00D03B .Label_D03B +al 00D05F .BeginStageClearSequence +al 00D037 .Label_D037 +al 00D041 .Label_D041 +al 00D013 .Label_D013 +al 00D011 .Label_D011 +al 00D00C .Label_D00C +al 00CFE9 .Label_CFE9 +al 00CFF9 .Label_CFF9 +al 00CFE5 .Label_CFE5 +al 00CFDF .Label_CFDF +al 00D029 .Label_D029 +al 00CFBE .Label_CFBE +al 00EB73 .TestCollisionList +al 00CFAE .Label_CFAE +al 00CFAF .Label_CFAF +al 00D2BD .BuildPlayerCollisionBounds +al 00CF8F .Label_CF8F +al 00CF92 .Label_CF92 +al 00CF74 .Label_CF74 +al 00DAF7 .GraphicsRenderStep_DAF7 +al 00CF62 .SwitchActivePlayerOrReturnToAttract +al 00CF54 .Label_CF54 +al 00E89F .TestPlayerCollisionMode3 +al 00CF5B .Label_CF5B +al 00DB20 .AudioRenderStep_DB20 +al 00CF49 .Label_CF49 +al 00CF58 .Label_CF58 +al 00E4F5 .GraphicsRenderStep_E4F5 +al 00E10D .GraphicsRenderStep_E10D +al 00E258 .UpdateMovingPlatforms +al 00E13E .GraphicsRenderStep_E13E +al 00E0E4 .GraphicsUpdateStep_E0E4 +al 00DEE3 .AudioRenderStep_DEE3 +al 00E5F9 .GraphicsRenderStep_E5F9 +al 00DBE9 .GraphicsCollisionStep_DBE9 +al 00E402 .GraphicsCollisionStep_E402 +al 00CF30 .Label_CF30 +al 00CF20 .Label_CF20 +al 00CF19 .Label_CF19 +al 00CF01 .Label_CF01 +al 00DBB3 .UpdateCarriedObjectSprite +al 00DB5A .UpdateBonusDisplay +al 00CEF3 .Label_CEF3 +al 00CED3 .Label_CED3 +al 00CEC8 .Label_CEC8 +al 00CEBF .Label_CEBF +al 00CEA1 .Label_CEA1 +al 00CE8A .Label_CE8A +al 00CE8B .Label_CE8B +al 00CE8C .Label_CE8C +al 00CE8D .Label_CE8D +al 00CE65 .Label_CE65 +al 00CE5C .Label_CE5C +al 00CE57 .Label_CE57 +al 00CE45 .Label_CE45 +al 00CE2F .Label_CE2F +al 00CE38 .Label_CE38 +al 00CE39 .Label_CE39 +al 00CE50 .Label_CE50 +al 00CE0E .Label_CE0E +al 00CE4E .Label_CE4E +al 00CDFD .HandlePauseInput +al 00CF37 .UpdateBonusCountdown +al 00D1AE .UpdatePlayerDeathSequence +al 00CEC9 .RequestLowAltitudeSound +al 00CF9D .UpdateGameplaySubmode +al 00EC17 .HideInactiveObjectSprites +al 00CEF4 .UpdateStageEntities +al 00D2FC .ProcessStageCollisions +al 00D412 .DispatchPlayerState +al 00D251 .InitializePlayerStateTransition +al 00CEA2 .UpdatePlayerAuxiliarySprite +al 00CE6C .DecodePlayerDirectionalInput +al 00EDAB .CollisionStateStep_EDAB +al 00CDAF .Label_CDAF +al 00CDB2 .Label_CDB2 +al 00CDDD .Label_CDDD +al 00CDD7 .Label_CDD7 +al 00EE10 .PlayerUpdateStep_EE10 +al 00CD8E .Label_CD8E +al 00CDE0 .Label_CDE0 +al 00CDE4 .Label_CDE4 +al 00CD7A .Label_CD7A +al 00CD83 .Label_CD83 +al 00CD5F .Label_CD5F +al 00CD4D .Label_CD4D +al 00CD47 .Label_CD47 +al 00CD3D .Label_CD3D +al 00CD25 .LoadIndexedObjectConfiguration +al 00CCFA .Label_CCFA +al 00CCF9 .Label_CCF9 +al 00CCEE .Label_CCEE +al 00CCDD .Label_CCDD +al 00CCD4 .Label_CCD4 +al 00CCCC .Label_CCCC +al 00CCC1 .Label_CCC1 +al 00E9FC .DrawObjectSpriteMode0 +al 00CC8E .Label_CC8E +al 00CC98 .DrawObjectLayoutRecords +al 00CC78 .Label_CC78 +al 00CC76 .Label_CC76 +al 00E9EE .DrawSingleObjectSprite +al 00CC3A .Label_CC3A +al 00CC1B .Label_CC1B +al 00CBE2 .Label_CBE2 +al 00CBC6 .Label_CBC6 +al 00CBC0 .Label_CBC0 +al 00CBA3 .Label_CBA3 +al 00CB87 .Label_CB87 +al 00CC86 .DrawSecondaryStageObjects +al 00CC7E .DrawStageThreePrimaryObjects +al 00CD1D .LoadObjectConfigGroup4 +al 00CD0D .LoadStageFourObjectConfig +al 00CC0D .InitializeStageThreeObjects +al 00E239 .QueuePlatformVramUpdateA +al 00CC94 .DrawFixedStageObjects +al 00CD07 .LoadObjectConfigGroup0 +al 00CBB1 .InitializeStageTwoObjects +al 00CCEA .LoadSecondaryStageObjectConfig +al 00CBA8 .InitializeStageOneObjectCounts +al 00CC6C .DrawPrimaryStageObjects +al 00CD59 .LoadStageObjectParameters +al 00CD23 .LoadObjectConfigGroup8 +al 00CCBD .LoadPrimaryStageObjectConfig +al 00CC2A .InitializeStageFourRopes +al 00CB6E .Label_CB6E +al 00CB5A .Label_CB5A +al 00CB45 .Label_CB45 +al 00CB1F .InitializeStageObjects +al 00CB13 .Label_CB13 +al 00CB08 .Label_CB08 +al 00CC58 .DrawStageSpriteLayout +al 00CB85 .RunStageInitializerRecords +al 00CAE6 .Label_CAE6 +al 00EA06 .FillObjectTileColumn +al 00CA86 .Label_CA86 +al 00CA6C .Label_CA6C +al 00CA60 .Label_CA60 +al 00CA54 .Label_CA54 +al 00CA48 .Label_CA48 +al 00CA5D .Label_CA5D +al 00EA08 .RenderObjectSpriteGrid +al 00CA07 .Label_CA07 +al 00C9F0 .Label_C9F0 +al 00F1C5 .QueueSingleVramByte +al 00C9DE .Label_C9DE +al 00CA25 .QueuePlayerCountVramUpdate +al 00ECA4 .QueueCollisionAndVramTasks +al 00EFCE .QueueRectangularVramTransfer +al 00C9CA .Label_C9CA +al 00C9B1 .Label_C9B1 +al 00C988 .Label_C988 +al 00C982 .Label_C982 +al 00C976 .Label_C976 +al 00C969 .AdvanceAttractModeSequence +al 00CED4 .DetectPlayerLoss +al 00D04E .InitializePlayerBoundingBox +al 00C962 .Label_C962 +al 00CA82 .InitializeGameplayRam +al 00C94E .Label_C94E +al 00C965 .Label_C965 +al 00C94F .Label_C94F +al 00C924 .Label_C924 +al 00C922 .SaveCurrentPlayerSessionState +al 00C914 .Label_C914 +al 00C912 .LoadCurrentPlayerSessionState +al 00C902 .Label_C902 +al 00C8F9 .Label_C8F9 +al 00EDEE .CollisionComputeStep_EDEE +al 00CA5E .QueueTwoPlayerVramStream +al 00CA33 .QueuePlayerSelectVramStream +al 00E244 .QueuePlatformVramUpdateB +al 00C8C9 .Label_C8C9 +al 00C8DE .Label_C8DE +al 00C8D5 .Label_C8D5 +al 00C8CF .Label_C8CF +al 00C8C0 .Label_C8C0 +al 00C8B1 .Label_C8B1 +al 00CA08 .HideObjectSpriteGroup +al 00C88C .Label_C88C +al 00C870 .Label_C870 +al 00C854 .Label_C854 +al 00EDFF .CollisionUpdateStep_EDFF +al 00C823 .Label_C823 +al 00C81F .Label_C81F +al 00C804 .Label_C804 +al 00C7F2 .Label_C7F2 +al 00C7E6 .Label_C7E6 +al 00C826 .Label_C826 +al 00C7DC .Label_C7DC +al 00C7FE .Label_C7FE +al 00C7DD .Label_C7DD +al 00EF3C .ProcessVramCommandStreamAndRestoreScroll +al 00CA70 .DisableBackgroundAndSpriteRendering +al 00C7BD .Label_C7BD +al 00C78E .Label_C78E +al 00C77B .Label_C77B +al 00EE3A .ProcessQueuedTask +al 00C932 .UpdateAttractModeState +al 00F1AF .TickSoundTimers +al 00C773 .UpdateTitleScreenAndStartSelection +al 00C897 .UpdateGameModeTransition +al 00C73D .Label_C73D +al 00CFC1 .UpdateStageTransition +al 00C749 .Label_C749 +al 00CD6E .UpdateGameplayFrame +al 00C72D .Label_C72D +al 00C746 .Label_C746 +al 00C733 .Label_C733 +al 00F219 .ReadControllers +al 00F91F .UpdateAudioFrame +al 00CA7A .WriteInvertedRenderingMask +al 00EE9C .FlushQueuedVramCommands +al 00EEB0 .PerformOamDma +al 00C6E6 .NmiHandler +al 00CA16 .ClearGameplayNametable +al 00C6DD .Label_C6DD +al 00C6D4 .Label_C6D4 +al 00F1F8 .AdvanceRandomLfsr +al 00C6B0 .Label_C6B0 +al 00C6B6 .InitializePpuOamAndDmc +al 00C689 .Label_C689 +al 00C678 .Label_C678 +al 00C66E .ResetHandler +al 00C64E .DemoInputDurationTable +al 00C62E .DemoInputCodeTable +al 00C623 .SpawnedObjectCollisionShapePointerHighBytes +al 00C622 .SpawnedObjectCollisionShapePointerTable +al 00C61B .ObjectTaskPayloadByIndex +al 00C614 .TwoTileObjectTileTable +al 00C5A1 .StageEnemyOamTemplateC +al 00C501 .StageEnemyOamTemplateB +al 00C485 .StageEnemyOamTemplateA +al 00C451 .AlternateCollisionListPointerHighBytes +al 00C450 .AlternateCollisionListPointerTable +al 00C449 .PlayerStateCollisionListPointerHighBytes +al 00C448 .PlayerStateCollisionListPointerTable +al 00C441 .StageCollisionQueryPointerHighBytes +al 00C440 .StageCollisionQueryPointerTable +al 00C40C .TwoPlayerVramCommandStream +al 00C3F4 .PlayerSelectVramCommandStream +al 00C3BE .StageBackgroundVramStreamPointerHighBytes +al 00C3BD .StageBackgroundVramStreamPointerTable +al 00C36A .PlayerPoseCollisionShapePointerHighBytes +al 00C369 .PlayerPoseCollisionShapePointerTable +al 00C30A .StageObjectDataPointerHi +al 00C309 .StageObjectDataPointerLo +al 00C2EE .CollectedObjectVramAddressHi +al 00C2ED .CollectedObjectVramAddressLo +al 00C2E5 .CollectedObjectVramXTable +al 00C2CD .StageCollectibleSpriteTiles +al 00C2C7 .RopeInitialHighBytes +al 00C2C1 .RopeInitialLowBytes +al 00C216 .StageCollisionRecordPointerHighBytes +al 00C215 .StageCollisionRecordPointerTable +al 00C20B .SpecialObjectXTriggerTable +al 00C1FB .StageObjectRightBoundaryTable +al 00C1FA .StageObjectLeftBoundaryTable +al 00C1F9 .StageObjectReferenceYTable +al 00C1CA .StageInitializerValueTable +al 00C1C9 .StageInitializerParamTable +al 00C1C8 .StageInitializerTypeTable +al 00C163 .ObjectLayoutOamOffsetTable +al 00C162 .ObjectLayoutDimensionsTable +al 00C161 .ObjectLayoutTileIndexTable +al 00C160 .ObjectLayoutYTable +al 00C15F .ObjectLayoutXTable +al 00C156 .StageSpriteLayoutPointerHi +al 00C155 .StageSpriteLayoutPointerLo +al 00C137 .StageObjectParameterTable +al 00C0E4 .StageFourObjectOamBaseByDifficulty +al 00C0E3 .StageFourPrimaryObjectCountByDifficulty +al 00C0B3 .DifficultyObjectCountTable +al 00C08F .StageSecondaryObjectConfigTable +al 00C02F .StagePrimaryObjectConfigTable +al 00C026 .ObjectConfigDataPointerHiTable +al 00C025 .ObjectConfigDataPointerLoTable +al 00C024 .ObjectConfigDestinationEndIndexTable +al 00C023 .ObjectConfigDifficultyStrideTable +al 00C01E .StagePlayerStartYTable +al 00C00A .HudDigitDescriptorTable +al 00EEBB .FillNametableAndClearAttributes +al 00EF50 .QueueSelectedHudFields +al 00F138 .TestObjectBoundingBoxOverlap +al 00F040 .UpdateExistingBoundingBox +al 00F044 .InitializeBoundingBox +al 00C000 .DeferredTaskHandlerTable diff --git a/Donkey Kong Jr. (JU)/copilot/reconstructed.map b/Donkey Kong Jr. (JU)/copilot/reconstructed.map new file mode 100644 index 0000000..1ad1cc6 --- /dev/null +++ b/Donkey Kong Jr. (JU)/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/Donkey Kong Jr. (JU)/copilot/reconstructed.nes b/Donkey Kong Jr. (JU)/copilot/reconstructed.nes new file mode 100644 index 0000000000000000000000000000000000000000..f80eada2d1219a3fe2fd1cc55c0f3571bdab735f GIT binary patch literal 24592 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 F{4Y;PV1xhw literal 0 HcmV?d00001 diff --git a/Donkey Kong Jr. (JU)/copilot/rom.nes b/Donkey Kong Jr. (JU)/copilot/rom.nes new file mode 100644 index 0000000000000000000000000000000000000000..f80eada2d1219a3fe2fd1cc55c0f3571bdab735f GIT binary patch literal 24592 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 F{4Y;PV1xhw literal 0 HcmV?d00001 diff --git a/Donkey Kong Jr. (JU)/copilot/symbols.inc b/Donkey Kong Jr. (JU)/copilot/symbols.inc new file mode 100644 index 0000000..2a8d276 --- /dev/null +++ b/Donkey Kong Jr. (JU)/copilot/symbols.inc @@ -0,0 +1,54 @@ +; Donkey Kong Jr. (JU) - PPU registers +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 +OAMDMA = $4014 +JOY1 = $4016 +JOY2 = $4017 + +; APU registers +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 +PAD_MENU_INPUT=PAD_SELECT|PAD_START|PAD_VERTICAL \ No newline at end of file diff --git a/Excitebike (JU)/copilot/chr.o b/Excitebike (JU)/copilot/chr.o deleted file mode 100644 index 62dcbec0d7b9aa7debea611cf1a155f96b28594e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12596 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

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

s6xY97qZ?$w#bENoOfkP24{Kn|#F~ zQvaM+I`Q9tH8kbGqkmf8LqYx>tkpvd@TAxUuv^fbG7quHgS~FBCt%YC;xV^oU0_yV zX=Y-XpRhW?-bHwwy0o;Lo~2$jxITaznxc;f=^YUK1gyzXe%CN2_&Vpsd2kc(Lq<}b z%LRR+=RoD4N1Q~3f>=A)b4$MQI*D?vOi>N=6sTBVoV6mcvtS1BT4XL=a-FBvv`ox`|4p@OVYGy>92f&@o{#XTys8pRpFLcmkTw8;uXRfZT#3u`c_Kl+S#O@`v7*S*bRRLY~6i=wx z98qKdmIICkh%3}#j409p%K&fbh<+MVjVRIp^8gzTh(bB#`B5-ha7wYXn~DUgVpkQZ zfV684!5kqy)G4PxuPTlJ|CX>2+0>PAo09_eYl!w(N!i{PX>fE-JsEf}@LgxoK+0OJ zu9^XK0=!}-YADcZb=4f64d9GII_FuSOLL{KG*cfq$yb!`3XyIq5)tZ%5vMCOKt%Fz zIRR`3EZJA_RGM~sB3-6>c~cP&rxrLZ2Z$(s2#N!v&Aljyhu)N{(~84Dv<(KKt{_oE zvjo$MSilItC`0M8cQf_x(~212&w;lNh;Hge3e{EG{Y$`XNrZB@83n=j!D{!3M#_}} zb=7>tR{{GC#EJtgI8lp)q&c9K*rrVBS33k|2)3vxa;Y!vSBn6Y0CQ>mg(gGQ%Dk6` zocL0AX>m_14Xygs!XZn001&RD1#48T`_;k#X8~!3Zkq-@>B^TF*X01_?WdjO=~cQS z6q2EUX&&MR53Y6~_)oBSE0I9AUaP(h_&MNV+FFD=<}EPVtd`>L)Dkt+($uP}qInCj z%|Wd46U-(A=djqL%}##H`RDVLq!oo~3F02eF1U&=o_N`StUXwTo9HElda6*ZwxJCN zC?j-LUZ0bDc^g+>fjPwef01AC-q%`y$fsvv109R+zZSR8es zKv&_v6l@8D*{2{SAo)7n7Cr%q0a^Ez?(d!B?sNt8UC=as`5K}280c-F%l4u>kfBP^ zUIUETC(`NeBGev2@+*MVl6V2hWk6TJ97A!N)3*d>0k(kG84o~yj3HQ+nzU(f&n-mC zQ@amr3c(E@>4eCkPBKRA9x&}MMfcocAjYW-VqVRC?*QHll-6yYuu?5T^gd_>-ia-M z%z`{M5m))P=fUoREzzreZ(_8OIyJNRz~Z$;Irn>WV3T0|dSdDTv01QwFnY}qBBi`a z3LSAl={vkj)KWpEsHqC78?ew$ZPDzedfvVqc|B=lirNeUp}i`|$D*}}_oslT!P3D> z@e=M1$Wf3+PpQHAiY3Y22Bi(=$Zw{RRHj_vA=E9<9lR25vzBLR^_Zpw6Q2T)g!G29 znBghyn_w|uVII{CqX|2U9^yT{IBtY(gbKU=%le`on4X7Lz7yo>$^%_qx~iw zig-*o4w*L~b8U~J!{Nrh8I5Xda=8JQKf-0lMT)k&7esUn)EhL~Ry^l)UI)_wJ9$tP zvhQnPGN{9c;v$XpLzP#-cJ%n}TiwM9RiIGi6+i_%hdL?GD9iO9D=vG)m_H@`34Jvw zK+BuSPp`iirx~%LSA{kNn4%_MG&!o?$(b{XuxJ}u5{@;e@~u--J*w6KoiG)#UJQG% zIKBYzhK7izLa%!j=rO<}YSN_T3r7la7(s@D-mw+2oUcP*pMzBziwFy1gJ9ucw|2>2 z_@#P4s(8-2R#cq zr^~I|Igob|=G_3%&VJj$S|D|aPRP(Cb{6b3SeZNfYy+tTske|ig2Mxdwt}XCZW@X* zp7dw|dkA*OQgk>IYX*x4%iAS}c^ujV_TOL+v8J{WKHnu$E! zztXK!pS+)e@GrrKJj5DJmBlF=01v3b)RpozBZ3&Ko=v|B{KPC@DOEG zZ74Pb@D0F8Bk`D?A}^__x;s=Js~ZF{vLwQlDu>mj2Y&gUw)U4(q&E)nKL ztP<=mm`K`kkRtqx`I)r>v=x%i+(aI?nB`!_V2@2jF6;G4FxudrlA7T!HJYtcrbMW# zR+9Z4_%`h_N5j8}SKrY51F+FmEN}-xCt%V2e+V|TpO%^tD+BugY~50v;(9?ZL`bd( z6T-9m)h-3c8y#{y%UY%mqeyNDeFy9&9o10tOp*L<-5f!x0setb&le)92`co@+P?m%qW~ zG(IOt1^EPISzBOqK?4s95?ZY zKtBep5z@@=Ay%UZ&_94K1&fEA)Nn8duwi_i7zPpy(i$x8Qr2z18X#!_F4NLz9&PU+ znHpdn_{@T)mnnn2u^^!&Ky%GhjCMY7wyET5yJ6nn`4>KmC|-4ap}#0Y9q`6 z8ehq?FeC@v#?wShkaWcNFxR3P&`+Te*=|yf#)&;dr$NoVIo#ifhn(eifc_29uQ*BD z-dDLA-3I*uXosOlpr@Mxm1J%*dDOcn8UdV;sX-zM2$zOauUcED91ot zqW-s3IRU5#xN<_>_WT~AzPA6XTGLM_a!08AM5-!oD zn8G!#15E-I()MUh46gxJ0#9E=h>gaRSFGF@o zopYqdUZhg%m!m!aNZaaCs2euoF5P^mvLEm!B&&_YHA9AdfD?d&n&Lhss#Dnu*aCRg zMRd9{>;WtWT(J{f1`IC&(ni`8`Ou4@=x&v7Loq?kM6a?9a7)Q|*tth+QvvlVTLB*chPjBN za)vE{bAT;-g$uK0uyL>(G>&!6Gp2}|K-~~gyOlKQ{)}6_Mo>E9gJNp85SO%xodGk0 zfV##Frg>rxS2f#VcHdm68peVDhlYPx^(ST z%KitK3aFlDF0LtSAR7iq(@?Wo3{}bf55S9FB9|McDhPf7HYk@z?0;%|NIgUvS60H| zPjD!96Avkbab*SI?*Q)yioAmqLOIyaz>e#xCF~utP1H-(xzD}hNx1zSZZv9s6iDm@ z*jr%d)a8->orbGa!c)pJID8up*?YtSJ$6qisXw7C-mjA0Czdew{Sr&}Qlxr6b6gId zVkIkqi!Y=f=*gEIqg^K{lkO^2k0H)*==KoBJg_N-@EbmypXW5Ckpr>RkjyHJfS;%_ z?zI%WeK(wzpP+FQxP{bLYwMBG^l>6*Cg zLobch^MMaT^pdma^<$U^NQc@`j(loG?hyT+oI3n&B37%WUrn(}$> zL^K^#j_~L>tV3LV(!gFSIJM!%;)n;aqhM=bFX*^d?&ng$wBff|lAfBL;CPOJ&Ovfq zS2S?tO95L1D-RYoc*v0qMthJ^EH^Afn37l$*hR1?OKJ2#jylmqP$$H*N9x|S z%+)>=^esqUp?%u9Ja*94eiiHtREU1fC9oGn zBZ9>|cPpD?~L+Vtx!_h!oPI!JBF%^$4s6QV}|8TXwTL6Z;?O+~%}Dgj*Bb zPB@A4+)*xrrGe#PK?IHOsUn{OX>pYwwyE;F$K%%r;E%w&4W)X~sHF63+z0*?IFy#D zatYl7yM+$y)INE`?#CJr%~^O64s^H_urQj=Ptehcs{;L(HB zAXlhQ0WAZK=!uiul-&gDP`$oWiem1GC&B2fKZ@iW-XBbWoCG<&PmFNmHV*chYVVI- zVuu^S8(?oBv>Wc?BKLb^UqX`qi@>0 zX#+A^f~h_P=nJ^+C6Y844gwkgUUU-^z6@1;=Z;|SNBl(wKe`S;a6fb`%uUKRdd}m+ zeiem^^gAo+yo)@}TGttbNImL(a9Tzn1x_NCTd`iS9(0T^4Mi_Ku=J>_=DgP+809NY zae-Zepg+QGu~#H}-m-dP8^!I|MYy;jqf;%!I6aBlMITx0c?`I(Pi`ctj5fJ^NGY1yapAkj|HErb(Bx=f8jkGkrCqyaEnS9<7l ziwdYm{XAr=fuE^K*Bk~V#^-?32+Ku-i8!OfupKZFFx6Ou?W4HPf*peYCVaBg1`-NV ziW%rukbi;PpfkX^%V_}%0ZVZe*SUpl2K!%N8Cb_jUs2Qj{S{;qs}veRJ_YH;I)O7F zAAy|4+x!NQ_dy;*rXJ*7kQ-P7PzUm3kS%NgaT??ekUk7fPJw(2gg#ZJ6xM)z1ti`< zgz}V7HP~*j%3!hWK&%QZ0IUsdP9=yB$Rm8VRRLnC@~1DFxXY&_2IzjDlLFAUvO!{u zABLzkBDM^+Y9vy)O)dpn0&DgZ_qh|Mb96{<5$v&+nBjK41ne#teWF;-!@6Ry8L*c& zVw?vGMPRqUuG>h-!LdC2DFmGWjol+R=>)+oC}u$xa8=H&|qRYV0~cIHe#0VGaIZ2EStWW zk%(o1b%Sl7AI=0h5Apz-lL68Oasg9s=^#xYYtY>^kb00GaDg8Ms0Fy|!z2|X1tcz5 zD)2hSg_HuC44Q~3-eizCkRtlD!;qwsz+%8I7>Z0T@48GZs-Y%Jd}skLunRsV0sKS2P4W+IGJ62j

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: @@ -145,4 +184,26 @@ make To verify byte-identity: ```bash make verify # (where supported by the Makefile) -``` \ No newline at end of file +``` + +--- + +## Summary + +All 11 projects in this repository rebuild **byte-identical** to their original ROMs: + +| # | Project | Build Status | +|---|---------|--------------| +| 1 | Balloon Fight (JU) | BYTE-IDENTICAL | +| 2 | Baseball (UE) | BYTE-IDENTICAL | +| 3 | Bomberman (U) | BYTE-IDENTICAL | +| 4 | Burger Time (U) | BYTE-IDENTICAL | +| 5 | Clu Clu Land (JU) | BYTE-IDENTICAL | +| 6 | Defender 2 (U) | BYTE-IDENTICAL | +| 7 | Excitebike (JU) | BYTE-IDENTICAL | +| 8 | Tennis (JU) | BYTE-IDENTICAL | +| 9 | Pac-Man (USA) (Namco) | BYTE-IDENTICAL | +| 10 | Donkey Kong 3 (JUE) | BYTE-IDENTICAL | +| 11 | Donkey Kong Jr. (JU) | BYTE-IDENTICAL (Pass 1) | + +Every project builds successfully with `make` in the `copilot/` folder, and every reconstructed ROM matches the original byte-for-byte. Donkey Kong Jr. shares the same byte-identical build guarantee; its remaining Pass 2/3 work is semantic renaming and table decoding, not build-correctness. \ No newline at end of file diff --git a/PROMPTS.md b/PROMPTS.md index 059ede0..241fab1 100644 --- a/PROMPTS.md +++ b/PROMPTS.md @@ -1,5 +1,5 @@ -Bomberman disassembly project. -you will disassemble a NES rom. I will provide you with the binary file renamed as a txt file. With that file I want you to read the header to identify the type of file, locate the vectors that code starts from, and follow each of the 3 through the rom file. build the byte identical rom with ca65. once you have completed a first pass to identify the code vs the data blocks, stop and provide me with the code. The goal is a byte-identical disassembly. Identify code and data sections. After the first pass, take a second pass and replace the known labels. Pass a third time to better identify use of code and data tables naming more appropriately. +Donkey Kong Jr disassembly project. +you will disassemble a NES rom. I will provide you with the skeleton project as a tar.gz file renamed to txt. build the byte identical rom. once you have completed a first pass to identify the code vs the data blocks, stop and provide me with the code. The goal is a byte-identical disassembly. Identify code and data sections. After the first pass, take a second pass and replace the known labels. Pass a third time to better identify use of code and data tables naming more appropriately. with code blocks that are generated, each method will have a local and global description, the parameters and the return value(s). for each instruction, include a comment at the end of the line with the offset followed by the actual bytes that are expected to be encoded. during building the byte exact source, include the remaining incbin line so we can cycle through builds quickly and efficently. diff --git a/Pac-Man (USA) (Namco)/copilot/chr.o b/Pac-Man (USA) (Namco)/copilot/chr.o deleted file mode 100644 index aed007caedbe4ac85e8e7191db2a12f2b38f5412..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12596 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

Ly=T$7vE5JY?AWwz^Oi{ew#|1vaF^P5|NR{Z fVh?ZW-}a5W?%vYz_3iiGt8Uub4?kamVwC>?n?8Sh diff --git a/Pac-Man (USA) (Namco)/copilot/header.o b/Pac-Man (USA) (Namco)/copilot/header.o deleted file mode 100644 index 5126448c0350fa5e6d3c9e556c8bedb4cf8bb5ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 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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 diff --git a/_ROMS/Wild Gunman (U).nes b/_ROMS/Wild Gunman (U).nes deleted file mode 100644 index 2af80dd3320afde8e6d12ef47e15931a6d9fa742..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24592 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 fD/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/CIRCUS/copilot/Makefile b/_wip/CIRCUS/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/CIRCUS/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/CIRCUS/copilot/chr.bin b/_wip/CIRCUS/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..067535cd323662afd01240872f3de479d6d7a034 GIT binary patch literal 8192 zcmb_he{dAneSdo^-5ue$Jp;DSaOh;r*wjhw!^G%9kJ|&&v~k^nGLeyIG84-kY$cxl(M~gCI@57zhE^-iJ=G2dx1QQc>R1b+79Kp(5@Bl* zr+xi=-|n6S^)%^^ucZC#_kG{{zW2WG`@Zk{R*ZcLbw9ChUTKeGTV}``x^C=yqPraO zEU{?Ovu`%sknjHKv!I`Lhy3x`_j-GueYQ8`-QGmuqu!$vA^#p9uM>s**wk7ns=a+c+x-5qW4s}A&SQ)>L=BfSupG~z0aq=smdsUAPynM$P03?~ z^1|iI8Mg!hM@L6SM&=qq5jEj4LBQ$hj*bq-R#gjK2l^mcRZZ)<(0cttmgkpzdYzyK z#zCX?2`I~JwtTg+EiY%4VV<_g*@si)PCvB zJ~s6Q+90<{zU3_+#q==_G5rSFi>Stf`8Clmmjk&RlyfeokM?5v2Iu+BaK6oX>OxRD zp9ak>S*4yV^w?e~W_luBh}J7jKJ&Q;dc8!V$$M5KI$vJUtVVraeXpKK=W@Ab{hrs( zS6(_er>|14>(N9{Q(oBg!ViA%!lpu4;CriO!Bqt@S;>#}6&xn#Vp+^b!?OLNp3HOw zPDT8Ko#lMUGt0>gUn(ffO4zO!taqp!nBQHmdvn{7Ves_ZtWoH~2)dfXVeTo|@080- z)34%LR>QL9?B(-TvwcysPS?ANO&+b$U32@h0+~NOr@t)$IyGmH`l%7eeeZO$y(VaG zz3LO5_s%?h^$$Mr-akF3ANB=Rn(Z;UItJY2N&fz+rc^-gL7* zs)OeAgW0@0Pus<(di@>G+r2qtS$(3CuT0F1ud8bnnV>26l9_yYp8th{aGq(-Yn)fH z+O-<5RpHseUloYIr9-cqrOeUz&sTnF?B^?&{v+CxOVCagF2QDJKK}UP#pjtEO(fFk zG8^3f$}8`_`ysQmTrQnXa^ARP+crW&!}(}p@=T+ua#doiVbVxG8fWNno)=B3)dnXS z)nTk-nsc=eF$6(cRS-g^MD=+O#(D%r+0%j$Rs^Nlq#(xp_?u?af*3rFNMk1iNiyWh zgX-gZwu96MEyu0w-mUAv2OfAp*M&W*Fp6)FDvgSJpw#iFi1 z`&bM|kD#DBW3RsY>LZUlb|;xfmL;|Yv){94-_v~jYOVI2BhT>RF@YGvr&8Oxbx(eM zV&Z)a->c;39Fj&iIbIv$p6fVn!@ERQ0riPhQ50@u6(x%afu_f62SVk-?cw*H3u_^+ zAkx;Vur>yV^-;2Xw&6mfO%l)~=Z2ciqI@2CUZdgKCYIRp>!AvXy@u;#V-mw!E5sXy zsuKDHDHMks{7faqwuv}p+bAEd(MlLt1=TS86AFXAejkT+u;5#vF1%V!_if8ZtRsqY zU~>hsDf66^2r|QL=0YbIVdaBD|{94XDA#gx^jnQS*~e z?5N^gF%~SyUctGLMMcVwY{qQSg=hdH62YJS^$(G3?ciV-s*PifkRR@LCAPWc|NcCC*Fhdtl|CaYG5#;$S&lZCNjj+i91^a+iH7lq!^EDwB3F;_mpBvCX>(SL$uxa zs=a$F`4CZax)U@Ho&Mh5e()h?ySwT&@J$@pe~=P_Y=Av$)~uleKg5~Sп7dW*; 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 cX&mYG-MrDj8D4HAjawZ52mZ?$KL7v# literal 0 HcmV?d00001 diff --git a/_wip/CIRCUS/copilot/prg.s b/_wip/CIRCUS/copilot/prg.s new file mode 100644 index 0000000..5213cd9 --- /dev/null +++ b/_wip/CIRCUS/copilot/prg.s @@ -0,0 +1,12 @@ +; CIRCUS NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/CIRCUS/copilot/reconstructed.lbl b/_wip/CIRCUS/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/CIRCUS/copilot/reconstructed.map b/_wip/CIRCUS/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/CIRCUS/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/CIRCUS/copilot/reconstructed_prg.bin b/_wip/CIRCUS/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..9e973befe81242ed06a71c60202fdd316f8bfdff GIT binary patch literal 16384 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 cX&mYG-MrDj8D4HAjawZ52mZ?$KL7v# literal 0 HcmV?d00001 diff --git a/_wip/CIRCUS/copilot/symbols.inc b/_wip/CIRCUS/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/CIRCUS/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_ROMS/Donkey Kong (JU).nes b/_wip/Donkey Kong (JU)/Donkey Kong (JU).nes similarity index 100% rename from _ROMS/Donkey Kong (JU).nes rename to _wip/Donkey Kong (JU)/Donkey Kong (JU).nes diff --git a/_wip/Donkey Kong (JU)/OVERVIEW.md b/_wip/Donkey Kong (JU)/OVERVIEW.md new file mode 100644 index 0000000..74612d0 --- /dev/null +++ b/_wip/Donkey Kong (JU)/OVERVIEW.md @@ -0,0 +1,55 @@ +# Donkey Kong (JU) — Skeleton Project + +ROM: `_wip/Donkey Kong (JU)/Donkey Kong (JU).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + +**Relationship note:** separate title from the already-disassembled `Donkey Kong Jr. (JU)` and `Donkey Kong 3 (JUE)` — do not reuse their symbols. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Vertical | +| Battery-backed flag | clear | +| ROM SHA-256 | `f9f026fd3560eeb03be9f6d1efa329b4c71d562caf06d4a5a691e5342f8da8e6` | +| PRG SHA-256 | `2952648e8a6eea65b7f388af8fce9ef33a9cb07178835fea6674db75d2623c49` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C85F` | per-frame heartbeat | +| RESET | `$C79E` | enters at $C79E inside the first pages (the Donkey Kong Jr.-style non-$C000 entry) | +| IRQ | `$FFF0` | lands in the vector-page padding — unused placeholder | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Donkey Kong (JU).nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Donkey Kong (JU)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C79E) and NMI ($C85F), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Donkey Kong (JU)/copilot/Makefile b/_wip/Donkey Kong (JU)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Donkey Kong (JU)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Donkey Kong (JU)/copilot/chr.bin b/_wip/Donkey Kong (JU)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..29e24963dedd73e7f63c31fb5f9bbfae6d9274cb GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/_wip/Donkey Kong (JU)/copilot/prg.s b/_wip/Donkey Kong (JU)/copilot/prg.s new file mode 100644 index 0000000..f4dceb1 --- /dev/null +++ b/_wip/Donkey Kong (JU)/copilot/prg.s @@ -0,0 +1,12 @@ +; Donkey Kong (JU) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Donkey Kong (JU)/copilot/reconstructed.lbl b/_wip/Donkey Kong (JU)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Donkey Kong (JU)/copilot/reconstructed.map b/_wip/Donkey Kong (JU)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Donkey Kong (JU)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Donkey Kong (JU)/copilot/reconstructed_prg.bin b/_wip/Donkey Kong (JU)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..d85d6574436482b0ddd26f0443c8f7ac32c73274 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/Donkey Kong (JU)/copilot/symbols.inc b/_wip/Donkey Kong (JU)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Donkey Kong (JU)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/Makefile b/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/Makefile deleted file mode 100644 index cf14bd0..0000000 --- a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -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 dk3.nes $< diff --git a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.o b/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.o deleted file mode 100644 index 846bf7e747b39d63a8a16f217fd80f8fa70d1989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12582 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 Ah5!Hn diff --git a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.s b/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.s deleted file mode 100644 index c021b92..0000000 --- a/_wip/Donkey Kong 3 (JUE)/DonkeyKong3_ZeroPageSemanticNames/chr.s +++ /dev/null @@ -1,2 +0,0 @@ -.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 deleted file mode 100644 index 7b683e6c5dd4112beb75746baba24bfc2b1933da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24592 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
t_oa@s%nyrG- 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 PQ%%UC7EernA>{u9IpT(v diff --git a/_ROMS/Donkey Kong Jr. Math (U).nes b/_wip/Donkey Kong Jr. Math (U)/Donkey Kong Jr. Math (U).nes similarity index 100% rename from _ROMS/Donkey Kong Jr. Math (U).nes rename to _wip/Donkey Kong Jr. Math (U)/Donkey Kong Jr. Math (U).nes diff --git a/_wip/Donkey Kong Jr. Math (U)/OVERVIEW.md b/_wip/Donkey Kong Jr. Math (U)/OVERVIEW.md new file mode 100644 index 0000000..d437873 --- /dev/null +++ b/_wip/Donkey Kong Jr. Math (U)/OVERVIEW.md @@ -0,0 +1,53 @@ +# Donkey Kong Jr. Math (U) — Skeleton Project + +ROM: `_wip/Donkey Kong Jr. Math (U)/Donkey Kong Jr. Math (U).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Horizontal | +| Battery-backed flag | clear | +| ROM SHA-256 | `263e5e9602943cfcb28c4d4492375a0e103c1d46c6f641ffab4da6f1f8422b4a` | +| PRG SHA-256 | `de0612081266e6ad556d6c98dd7ad9c362ceac8531d9446239813feb1961221b` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C4A9` | per-frame heartbeat | +| RESET | `$C41E` | enters at $C41E inside the first pages (the Donkey Kong Jr.-style non-$C000 entry) | +| IRQ | `$FFF0` | lands in the vector-page padding — unused placeholder | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Donkey Kong Jr. Math (U).nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Donkey Kong Jr. Math (U)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C41E) and NMI ($C4A9), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Donkey Kong Jr. Math (U)/copilot/Makefile b/_wip/Donkey Kong Jr. Math (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Donkey Kong Jr. Math (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Donkey Kong Jr. Math (U)/copilot/chr.bin b/_wip/Donkey Kong Jr. Math (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..f8d74d28517a9c9b9e081815aaf8ee7d8cf6a88f GIT binary patch literal 8192 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 A6aWAK literal 0 HcmV?d00001 diff --git a/_wip/Donkey Kong Jr. Math (U)/copilot/prg.s b/_wip/Donkey Kong Jr. Math (U)/copilot/prg.s new file mode 100644 index 0000000..5a80053 --- /dev/null +++ b/_wip/Donkey Kong Jr. Math (U)/copilot/prg.s @@ -0,0 +1,12 @@ +; Donkey Kong Jr. Math (U) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Donkey Kong Jr. Math (U)/copilot/reconstructed.lbl b/_wip/Donkey Kong Jr. Math (U)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Donkey Kong Jr. Math (U)/copilot/reconstructed.map b/_wip/Donkey Kong Jr. Math (U)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Donkey Kong Jr. Math (U)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Donkey Kong Jr. Math (U)/copilot/reconstructed_prg.bin b/_wip/Donkey Kong Jr. Math (U)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..e30f806665cd091cbd89f9ed2ff34a5fbb69fd3b GIT binary patch literal 16384 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 A6aWAK literal 0 HcmV?d00001 diff --git a/_wip/Donkey Kong Jr. Math (U)/copilot/symbols.inc b/_wip/Donkey Kong Jr. Math (U)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Donkey Kong Jr. Math (U)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_ROMS/Duck Hunt (JUE).nes b/_wip/Duck Hunt (JUE)/Duck Hunt (JUE).nes similarity index 100% rename from _ROMS/Duck Hunt (JUE).nes rename to _wip/Duck Hunt (JUE)/Duck Hunt (JUE).nes diff --git a/_wip/Duck Hunt (JUE)/OVERVIEW.md b/_wip/Duck Hunt (JUE)/OVERVIEW.md new file mode 100644 index 0000000..8033d99 --- /dev/null +++ b/_wip/Duck Hunt (JUE)/OVERVIEW.md @@ -0,0 +1,53 @@ +# Duck Hunt (JUE) — Skeleton Project + +ROM: `_wip/Duck Hunt (JUE)/Duck Hunt (JUE).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Horizontal | +| Battery-backed flag | clear | +| ROM SHA-256 | `ca0d31e6f3aa70204fa5af67803c6533851a28fa48a133e15d772d3667fa675a` | +| PRG SHA-256 | `bcdd22fbe343ebd33c7fd19309510079150d1e4dc052f65382b64d197d6ba080` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C086` | per-frame heartbeat | +| RESET | `$C000` | cold start at $C000 — the usual pattern in this repo | +| IRQ | `$C000` | redirects to RESET — unused placeholder | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Duck Hunt (JUE).nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Duck Hunt (JUE)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C000) and NMI ($C086), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Duck Hunt (JUE)/copilot/Makefile b/_wip/Duck Hunt (JUE)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Duck Hunt (JUE)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Duck Hunt (JUE)/copilot/chr.bin b/_wip/Duck Hunt (JUE)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..4e34a082de9da28fc4099b8b207416e19cb415ed GIT binary patch literal 8192 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 KO_5kCnfyOm6Vr+S literal 0 HcmV?d00001 diff --git a/_wip/Duck Hunt (JUE)/copilot/header.bin b/_wip/Duck Hunt (JUE)/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/_wip/Duck Hunt (JUE)/copilot/linker.cfg b/_wip/Duck Hunt (JUE)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/Duck Hunt (JUE)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/Duck Hunt (JUE)/copilot/locals.inc b/_wip/Duck Hunt (JUE)/copilot/locals.inc new file mode 100644 index 0000000..b7fc31c --- /dev/null +++ b/_wip/Duck Hunt (JUE)/copilot/locals.inc @@ -0,0 +1,2 @@ +; Duck Hunt (JUE) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/Duck Hunt (JUE)/copilot/prg.bin b/_wip/Duck Hunt (JUE)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..871727598f2a1ed5d3365f96120a1a77a9ee1ed9 GIT binary patch literal 16384 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 G{l5b&JcJbh literal 0 HcmV?d00001 diff --git a/_wip/Duck Hunt (JUE)/copilot/prg.s b/_wip/Duck Hunt (JUE)/copilot/prg.s new file mode 100644 index 0000000..6c9fe11 --- /dev/null +++ b/_wip/Duck Hunt (JUE)/copilot/prg.s @@ -0,0 +1,12 @@ +; Duck Hunt (JUE) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Duck Hunt (JUE)/copilot/reconstructed.lbl b/_wip/Duck Hunt (JUE)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Duck Hunt (JUE)/copilot/reconstructed.map b/_wip/Duck Hunt (JUE)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Duck Hunt (JUE)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Duck Hunt (JUE)/copilot/reconstructed_prg.bin b/_wip/Duck Hunt (JUE)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..871727598f2a1ed5d3365f96120a1a77a9ee1ed9 GIT binary patch literal 16384 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 G{l5b&JcJbh literal 0 HcmV?d00001 diff --git a/_wip/Duck Hunt (JUE)/copilot/symbols.inc b/_wip/Duck Hunt (JUE)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Duck Hunt (JUE)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_ROMS/Golf (JU).nes b/_wip/Golf (JU)/Golf (JU).nes similarity index 100% rename from _ROMS/Golf (JU).nes rename to _wip/Golf (JU)/Golf (JU).nes diff --git a/_wip/Golf (JU)/OVERVIEW.md b/_wip/Golf (JU)/OVERVIEW.md new file mode 100644 index 0000000..4705f72 --- /dev/null +++ b/_wip/Golf (JU)/OVERVIEW.md @@ -0,0 +1,53 @@ +# Golf (JU) — Skeleton Project + +ROM: `_wip/Golf (JU)/Golf (JU).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Horizontal | +| Battery-backed flag | clear | +| ROM SHA-256 | `70986ed4fb441199a9ff50c7b5c6388d9f7a17c29990d1b5f7214572ae0a4bc6` | +| PRG SHA-256 | `9f729074cd7c74340f325460173519427b1180f5101f8dc37da7b1c2b9b604d5` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C0A6` | per-frame heartbeat | +| RESET | `$C000` | cold start at $C000 — the usual pattern in this repo | +| IRQ | `$C0C4` | target $C0C4 — verify during Pass 1 | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Golf (JU).nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Golf (JU)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C000) and NMI ($C0A6), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Golf (JU)/copilot/Makefile b/_wip/Golf (JU)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Golf (JU)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Golf (JU)/copilot/chr.bin b/_wip/Golf (JU)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..5861cd0a642cd6dfc84f42ea016f870d623678f3 GIT binary patch literal 8192 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/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Hogan's Alley (JU)/copilot/Makefile b/_wip/Hogan's Alley (JU)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Hogan's Alley (JU)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Hogan's Alley (JU)/copilot/chr.bin b/_wip/Hogan's Alley (JU)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..2e2f5b8cac1facfa722b27d90f222ed3b5d1b088 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/_wip/Hogan's Alley (JU)/copilot/header.bin b/_wip/Hogan's Alley (JU)/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/_wip/Hogan's Alley (JU)/copilot/linker.cfg b/_wip/Hogan's Alley (JU)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/Hogan's Alley (JU)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/Hogan's Alley (JU)/copilot/locals.inc b/_wip/Hogan's Alley (JU)/copilot/locals.inc new file mode 100644 index 0000000..7ba6bf1 --- /dev/null +++ b/_wip/Hogan's Alley (JU)/copilot/locals.inc @@ -0,0 +1,2 @@ +; Hogan's Alley (JU) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/Hogan's Alley (JU)/copilot/prg.bin b/_wip/Hogan's Alley (JU)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..a00d40c22f66613cf87fa5349887744dcc37f78b GIT binary patch literal 16384 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/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Ice Climber (JE)/copilot/Makefile b/_wip/Ice Climber (JE)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Ice Climber (JE)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Ice Climber (JE)/copilot/chr.bin b/_wip/Ice Climber (JE)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..18d0218c2f26b6dfe2771da75fd36cf90e2972de GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/_wip/Ice Climber (JE)/copilot/header.bin b/_wip/Ice Climber (JE)/copilot/header.bin new file mode 100644 index 0000000000000000000000000000000000000000..aee36c438eb06284501f97c9f7247d5d3193af17 GIT binary patch literal 16 PcmeZs4VGeLWPk$z4(h~pqKLYVY^f2@o@)Fr#EYc?*`oef4^^<&fK}r zbMHO(oZmV34&(X!;BwNl{|&;KT3cKBR-PAL*`?WiL<*(fUByaP|HZ5Kpjg2KNd>75 z%{^W&>f-S?M4b&DuOU@>e=B1@ug&$9i@rBR>1WN-kH3;OwRz?=Ys5FONVEBd6lsEw zk)$^h(z^-IsD!)PUF%lujr$DtLDu=YZ67rNv)m!|}X*V7S7FG0XMZSl)6CTdv`l?MAH$B7|r}Z1ry8VaNQF?Sx$`s($+4@GQenaO> z^$}f=Zd->!Qt>);(Hr(Qd5b`ZYPXatloB~a;-pz2aci@}NUv-Fy@c~IoUGofFO+H$ zjZf$UwQ{9jda*e~r2bZo@i@M2(|OIL_qORa?SeuiPn&j1N+moazSfBHxblSWBIoPp zl)=h4Wqim|FLQ17i^@aDAvLd4A44Hdc}$z5JfvBan~RlxRR3`2BQhFOpU?+MiG za=Vn>*El=H=vf+z;bK!r_jNvTwPP5?0dxczI)Y+m1Vt(D90u`Bn{HO;7`$fIyQIo< z=wpRuS8h{Wnpe5S^YPaxIaL~!KxGq)ef_48Sl=g7B8q$$Mc);%aZYqWQq+a$T!Y;y zwb@T;g7W)J{o`5(w+?QckYaTa6X*K|ZTr5F{(W2>oRlJNjk`)j=My2Tr=}OpE>K=j z<|~DTx9I)Sg!QFgwSU#~^{THUUpIV%E{nv)E(^v`vak>$(^9HN=fD6;m0*QJIzI;&k$#>(oP2N`9K_Ikq{gVo;l5jMoe zpIKMWuxY8~iUDs@?vY!bub>HxH8~D0ye3kudh-jp~kgtD$Pr3a<{mp#+ z48Gb?=4eX!{fA{jNIIQ9b7b?>sZ(t>+f?#x+Lr$2(sTnCv2ETw-5}|2zy0>iRC4K3 z`VyHgO+KRiTggWE2VnGaLSmG+I$q+#u|X{gi4AU1m{@L$!Zu{12V-#R3{uLJvSt<2s@e>b#uR8|l3`795l&+Z=xe%W zKz_tT^A~j5s#-byTY2EPfi7qM@UbKECk>i3E_aZc>nt>KS6!i#m678_dGy3(&U0?N zIvcaL8NzmhTAJJ**|X{*=d?A&?X6$fT0iOMbW7N2Kysb9$kjS+N^Y$cmnqlzjgqSj zQD-_Co!ivU$>TPf$an$&xh9hT4NoNePbZSCa4ch+Fsabya$0Q@hl#erffH&gr8J}S9 zn@uJ+|B_73go3<%5M*ThLMzls{5-v{5+#fT31bqO5R11OlF<7)nKu25tj@NEy$bOv zOky=rSbF0Yvba$_1`%b_Y}a#&sB*=)6ro8Yj`?Dn-mjRO)EvVq{dPTOfRnyjFP&RY z)rPFHL8gXxlrahSYTh}$hOc(31Dsr=CB+pEOgSP08fQb6(N}}DNHx5-X@<2lt2DcG zzz}^ag4X+B5dw)sh1DBI<^yUL^4WLF zLDDFwjABtOlm@e6K^~PLYny&tB{YV#iu!kQs0bs%)BXjC)<>(-Xf9+sC6606Zepda zDVox4flkdF=+cb9(cYBDn}~KM%@Nz$o1$I6yFC%;iguQfKxg!*>)e6BQI$D&$nA(8 zeW@#O)caDW!Zg}s%?|yKh6X8vJ#SE*$w;#F%vYEmO_CZCTE0RuO4ivA6{}JRkih}r z5U;s>q6GcZrk|%|b2OUDZxo(h_;hY7KuvxLA2>J;O;$ zHzfWm?wCjCV-)wMp$ssh~~aRDp(Wr6ChSo}xCI zWv`27ab8WIdNuLxHr*OOE$XKD8PO0U!;$a7G}M3#qsJi**`=v%(%o&cG@@-jleGHT zGLvIItFS8PH0HB@zU*0-oD4?#Xoka#!bGfPR)ta7GTYTWuET7ED+@YIjO@m$WxP%! zlVFpjzGVFw5v^xJr^WcGt06qlGH4fN$}A3*l-Zpan6OGRUB;jpPtguJU9pqMN6G9< z#!k@S=}fSP22aso&KfdTUOW*l@c_krvJBKa$ z#ZbGs&us1^ee}PN*h!z=Zcj6(jR$A`u3U?B95{8c`1eh_&y^QRb~Dd1gvb4gx>SEw z9il7-q8Ypqx4PZHPC4o@<(GgdhyhmFEge58{povY!5-=G7HQl*X}}5T-IG$*DQV?4 zY0y@Q*(SYyOd5Y&a`j1n-Y&g+K#HZLZ#$%)?3Qjk27Dy_e7khhF3-MpV9#^grC*+v z-tJQGH%vgGyzDvMrAoXXTz`+4xslbw$P6hqq+7JtO+d(j0am@FzyGj zuKxh3-fux%@3)kKx6V@{8hWKs=V_C_Js{n6kODJb@}@#wov3p_Gg4l=^yw~-f0z1@ zJ{Dl@-1f?6tF7VK5I`+y){girXx+wVrT2E=Chm|cp9KJPuU$}8E9I}BvhkTsu8n5> z8QrWm;h*e~A{#w-Zj@R#OY=5H#%iWOS74FG2Re%>$V~+*ivv|_y@ol~x54pJNuUI) zBCrHNl8Kf$AW+tRS7=M}`ryQB&Yn|Mg}Yg^v@rU9hwPGBi@@_N%lFDrxx=^74?`#* z_b!Ys?5NpDhbOQQnh07qhf<$QoJ9sT9fn00Lz@o4oz;g&y~gC|qT;|5jSDQ$C5>6@ zZDx&b-K?<)F~`>g-}o%5=k(lKH!?-%>7uvJ!g}uAeVMfD{%fiT8l9{;6-!ba)6M)Jk1tZ1e|XaXc6QlG&fYGyhWP2MLM}j8nM|w zS(87V!rS;@k@l$oW-cXpv6%dqI2W-ic#zyg_ObI@!z z)K-W)s*FjoJsXr9+Kq@k$@;HDOOQg*u4J>{)*vpg0z3Ex7oF}Zhs>0713==EV#TVN zrRL3rfTH>x7zc+YTzyR;#Y%${RI5eQM*|3Eubmfrax>!WY-{#fZ7zn%>yYl{_hGH6Q%k9pR9hmo+*A>CP0&|4BTVNM|~Y|*(%!EeEk7a6&li4OJx zP&Xyu4ak9ofkkp=;x0({Zt|SmjNS;qhGrvMdS;VntS(h$?r&|1ri`7K{YpKL4y`d- zeHO|yHj;I9GjwpS4u~0bmt$&{1jVSF%!+WmausHP@^LaZGAzmX-w9d~Z%v93K1lrr z79>-GiUV@kII~P&uD`1Xb#K{%7Z$#_pv?Q?!WZyE0I!H7<;_Lt(a5CT5F**ZEZqjY zp4F5wwgM?RNKhLV@5C)qiyq{_*U^O_vQh^C|D&!jYZt~Ebp=>EMPMsj-$W&EJz=}z zgmrQzmIk|^UIc#^dOAfP7|e?KNm8O%yv`2;_mm7$4{7D#PbP3vv=kciS?TUXL9<8EhgEYo!&Uuj}yyaltI~lc8pAj&$j0#!AylabZA*FR-kP;W5ZsGre9$lo5w-)^a6Yvd55GOI2qj^wEXC~CA? z+VXrvOnwtFwU!oima6j%uCt_|wFC{bx-CRh&QAFkl}cZ1RbPORdLUEq$LjMfrPm5R zU(ory${IJQoo@Ar(&<%>s9kQgTj}yD-5|RY91Iy3=!CU{)+?1iDpks#&>?l+gODAD z*jv(D;@PluXUWczsJGb9YHYx(Il$a%iR>OmKmV=(FMkHNzr&FX)&IR-k{IUEIF(^2!d=Ss~SiIJsI^~L`*bi0g1>! zBD0gM@l%M^Nz#n%np9UqnpyuS$fDuRrbt$7IkDRjyPU|eWyEema2Ww$S4p8r2~Oxd zB|o~r$r$2tZ>3qH3)4$TduFvxJUz<8M61=mW4Tu`#ovmCk| zg3F>$4YJXa4&Qc2a6fKU_EUvYMu}ucOCeNpllDliKL_E0h&h=LF5xJbtb;iLO<`%7 zYnWS}(pPE>b(SOO7z4cp_Ta-s+hUIyyNgb@;g{me*Ze8^p_hKnm z?Bv2RW{1Kw?1-6mIOgwE$c~c8@cGP+68~TT`jW27(QQ;sU}8|wLm8>4_0^4JWehn3 zY0Mf~Nsgi%z=hV$|4S2&$aEq%qX}~|nvlh4WYpmQXugaBL-ZtdFqU-063B0u2%O(- z59IewicV52(R?Kf`bh!A@3cUE3~-d$m23)SUJ8;}N+@);SoG^-UZL9z!bip`1&9_9 zKS;H9a~%zWF)AXK@d!k66V0RbjT*aSfpG)+gHbHj$JN%qDP}s7gH8<1P;95FHr9Z8 zh6nONT1raojOM!zXMw;#DKs*vpT%Jby`l~tGD){bOOliQFD6?fWzqcP9RED5UJ&i- ze!`!G z5E+5)e=Yb2(=oDQjI5b45)gt=9IbDXDX7z=Ko=FCR69ywknR2vT3-f8eav5T?3fFwNFFOmMdi(e(AzQpJBXJgDL+5I5LYUd+O=z!jw{=ootK=Y6Tsvly|re!N{DN8&3D)g(Y51)G_-NB$TPLDj3jQ-hse=t3 zL?kH@Y91v#&-3fU>R_jlG;}MTCzZjS`&xf5H#`oLk`3~)pS53gLCdPIr8;uKbNqCl znV6{cc}>t}q%2gyJcZ8qh>oUs377nNgu7D0c>yP4I-Be>tdw(`9sX01N22Y}+Hke` zIcZgg#uaF6-Bz|SJMQRk%(vEUV<{J!>mZV{KA9%qVXfQ3*1~9pES@RU6$y2+pk1kR z3xI$uMDrXW<270}T^PV{fdB50jkH05@Z4;%jdP({~=$>mXdq@KZ2Mk zhb2LzHM{*zAg90XMtH|=@C^^G17m9W(<&EuO**|h(j$%Rh*nsbK!rojOd7P}e6n_K zqS+ehp{;hI$;d$p(0$W{)tqrI$=OdO(?(AcUVS&la+=_UucU@ca)m(aHJn3M%z74d zsTivvkmn{m?7voL8-;i&fDX+6`x@1(4~)G>3ZbA2v_8l0-XoqTzC(oLck%YUX!O3l zXmt9u2p}wwe_^XzH5+Dc$F}y!^?s8#nH?D&TY(b)XooPR$xydEvRJ(xiS`KVk{z-a z%I<>yoR*e@CV*$Y0%HO{@te@;_4jgX=SG(R?=5dfSNEudcJ>dnv%iDFV^t#kyC<-H zZF_89yTV1cW0ktYFgv*`_j1wpAlZm%5)vCRPd~08kaIi$C##QyDssfyMW9C5YWe^z zSIO7%$uL9?G zV?Ru-Fs$&?5b3XbByF#%7~4b4O2XmQqwQVT{!)8&`=8sR6;A9n;Lhq+S^E24$=Kuh zY!40e?uoXe119O{oWh|Acw=@7&>%lE-thZVssN)g)c8Fx;tq#z7ID^AMSO$ zMn{nb%6PQvW4UP>erTNm#u+o;d#v--grULZ2iiuGiOXeWSQy>GJT` z_Z81<+u~kaG2zCN#p^e23w^x0KzXa?FDpLTynW(*Gk^YKrT-)C(}Rb5&boj4(Z`>C zv*E>e)K8CyPAW4-&3HIwEXQ^s4ZRuo1?&{AfiZ<5f}nx$sJMe${Z z3 zVEvdlRJ7-6f3fW5vsl#B7-~*I<=mk^0rO%OB$sG-Ab{NeZM8u+6T!F<4gDZ}A#caT z?0~T&uZdegL^dLNlOz3OBM`@V{t?u^OUQJS${3Jwt*{2yTT-yIM0Wp>+2J2WGmrNV zMTS8tNpgNMc{##KFMkhv<_?IzLJL}kdh@*SJpzt0F_5wJ^nsq2zgLM>VChLgke zF10@Sihcl9yb74NUwtQ;hGgWGcObqMTF}wD-wv}%A8zy@k;gV-nDSZ}NyA(B!=SV) z`_aPHGz}XK;Y`{kr1f2kOlL@^ZGH@s>s2h`v`q1Eh${#&@n0VZ$3ghOSddK~_rp%B zuN0xy&VdaN$|1AF9SqWJ$TCzKdyqoVaQq*l<9AhJU6lyTaXOgWW={o~*a8BZi%)WT z-rwgMQi?4ciNSQlZXmiTb}y$3@lQml|G<}TiiMoicc99?NzT+$Lh4G09B&pKuLZ^W zW@yvb{Nfk7XmC>h*7}G@$$%_jGMPVO>psdr9UOK!A?Fs{_cZp~xq~5&(l;XRIv56x z$mw>xwnV630x>%s@Q8@mtGwr03OrF|)3;Da5m|vbWo~)VL zcuVKhmx$CzT6d5;$f5IOCmBZ?+uKPiAya#$o5xLU_hRYX#9^3XncdH(oYZrMp%qvNLBa)gw=+(`1)A13D}6KQ=fnR=M? z-ZFKkM5Z>9=XZ|3lf2eRE{}gXZ|eH-N8TrQ-q=oxib&CmzmbT267yrLn-KiU^706| zZ|rltd61nHS&F>8o3IPbyxmPo)93$@et&2G{`99iul(!W;gh7C1W7YVF@z~%%30FI zl99yWekHu?N_r1|()h#D@FP&G*tUr;IjAtslrcH^Tx6n~Zn`yjld_JzB0C!rs;y1& z(4jiN82{){T~I`_y$(zbzj1N#B1P;ZiDps%XVA2CiMVo!C>3>XS|aM_uo^-))ce5< z7egEv6i=Tb${Vgr7r%2|Lpp0_V0U+V!-w@3&WPF(s{LM}wGOseZH!Whu@!LVr4FDmA` zFClbHb$bM@t8R&)IU2bX55R7&3kvE)Lr~4|7!=T*P?6alk=t@Ghjfs{Aqq*8{EYSyzg z!!e(udhI#@HL?ohgPl}UeY>a%^?wyrv3`X}Wjhra)OU-+KS7eR8f?%J5-P3QICP=W z8voZJ?4a}LxH(fZwWU7H^or`UrmpxuzzFc5CK9byV}uHWO>a@L_v>lzq&l}ry8yY3 z375Am-T1cpWRuetj=ggTp4KIYFjT)f1Z6hwkirEqGa>GAG6`AT2@FM5GU)YFlGKp&e6!R^qwxzOi4&A}&{7aCUV=0nq_P5PIr4PKd}L5d(S@XVLKBhc+tb^|a> zuonl-NzTp&?G@ILslkf#UT{Y%I6P1)l!|}2UHHR2!XJJj{NXX-56=jHC>17{Cs?Kx z3ezSE(?$!^h6vNLg=rjmyQR(kb;yEKeXTZQfak*_p!Fm8FX8r<)5HXYK29GB$I75D zd|k2UIK!$w4$Z>{#`WSr)Vfzf4mL1${q>_zN!F%RmVX~|VC&2stK+2N zqxDvZf0=8SAO3(N?YF?Dqu<+sESMcW$Z=-jd_4mDK4Ie`sPonHz= zrMgmZfASF*-_Vu9Y^=IsQrP%Scz=8a*oon7@Nz_{78W`t@DuAawxrlooz^Nw^lWZ=*YTI7Z&6Sc{)ezseZ zNuFG^xGGp)i~YJ(k-WIvAB;S`@YN#s%#jk2$n4p(G0{y;O=Nbu2?w`uAqwv_X3CUt z_l$$bZS2^A1IOhdboI)-=jBycVjmt=_}IUXDsZDK*~);}-lLwo*9!vn$LU5a%P>54 zWUpO#4_V_~oH5ny9Ao5%y@fYAi?Ad39yV`QU?J{>y%CMuxy;JO4vsrBEqPwRnl3O@ z3lvG9rrI4Fe5?uW!ei)p_83rX^)YO_9|Ysi)%Sw&JF4CA?Ppxc@zBw0p2g^N{VVC% zW^8|Amkrh21dP|s;h^aft_22F3yD}&;@NhLu5OlE^d@T1X9KMv>0}v)q`+Kh2aF_h zpfoyHv0VkpIZ|w2A%#s@YEH(QOQ!tC>1L}r<59gq`ds&1-US*b9S40k7~??S=<3Yg z^N_{P%?9L9;D!uLHfLz{j7`Wm|5gKk--;B`1-R%~?KrS^0I!BQ*#`-RF-WlyD=@nd zEk#Ocii>1NKSin$;qm@yoBhksA-b^wt#=7Kbjj1Gi4Nk8w2{o{Du94=Ao*sLlDyOQ#*1%zogT&hey(4KqsvFMA()B&G^pn`iW9y#el7$&>l-zZeFs=y6&g>ZB z_;cLb6XK}X*xj^Nsw%vtnFHUm@dZ6t<_mjpAZAfdlQy=#i`8ze?`BoD{wU7y)E}c8 zm0fhI02Wek{kfgxP$@W>=6nUu`Ea|;El{7jX0L@c==j1as4rqNQQOR0n=l+wzLX9& zgd5T;(}Qx;S4bLvgaBRP1f_^+`Y~9%@GeZE%YKKn_@tkc{?AG2@slYAPN};MG5Vek z*T4yB*-4lS)PK90L%4n~2Z6?o>f$oI{<)lDjGrVKeSXRmnSo48xGP(^_*Tv->Ne@& zlVKXP>3l6MjW&chp0AyZzGoCj_nfqgy)~JNH39WX3r^}Ed4!Xiz5WXhgnY4@i(T$P zg59K*qcusmR^Cf_gdDC?@Qc_v}~^853Bcn&9);vU3e8FT}oDpr#lN z!_wGFYxmTjfQRbyq)A_!p#@RsGH3}(Z=Uo!Kw3CPPB>m#5m<3$HP@Vdt=C#DXz+wi zTyum}+B|FaMdL6W0&yALqoad98)jOG83nZ>5G%(UImc`3x%&0knut4IdN1&v9RC7Q zTR9LTqbT9hr@-qE|N8O}V zpzi2p=b@k`*^J#d zUb#{npkod)mVmM~^_5&Sj-b|D-^j&NCj)L&=6UTT!$!N~fvy%8`04R?EqWX`78Vr;{Uw#a6W!%-`H`vIn z*jb)(tvH0&L~ORLLA^B~O?{l6e>ij!Bw;YW;G%0F(gG_o$T^%}^=zyE$3p)OSp;>IZNJxDPvKVlwH+u315utEItstVK0uwlo@^ zK!fTJS5-lV8-m@eNr?h&CjQFfAQSy($2Idr&bi%n+pX7)818W0^3>cv*SK6YcTBzYZr4MP z;?h37qd_mBaI!K zhiig!(v7&thuZ3n(p4}2X2F7A{i@|RvsX4no_}c8Z%a=vE&IjdMQ(TTFCXY*JB~)HJBb<+Hhh44?mutUEoi%`P`tzzU zY|Mkdz>=KizY*)nCu`}@Z|l9V)GuOlU53!&}u>2qZ%7*#+7hq@d+Gfs$?}DX<%bf>7vR|N0c|?{DCAhr{#CfoqP8(&}IAL zx^pmMN1v-BJoXEE<#B&zrC+lRPgdc8yv-QyG|_`NwazgOx9K@JDvysBC{WgH%56b> zm=JTFqXq*Cb}bV)3T^>|m-3tsn3tGH4qCWF8w=jh;5~Zt9Ays^*aL96ar75&oU49JQ>CpM0^dfDR)ab- zhtD-gY}+}&{X|zQ(a$0tCcC82hDl%dTZVB3+LRDr`Jn& z2UyMNadm;2evxt#iA&J<0jOy2|#3?Xkl13LDH( zabiS;c`g<9B9+z02D3w)x&xT@5!{99x<^>JC8wUR`!U;=*+1=u6l&aoUNQ8v$xiCE zqS{i~LHEA(1D@N?L;c}%@ct$5rIvc7?I@}kxO5VL6GIiwOC}} zOibEt*x^jf;5;geSq9b&y*QSm7tcXQ5nq16+f*Z~D`3hfE1(VO2M9IV8vWlZ zf&7l2cdKiha5#B^wA@~RM!dp3-@2lpa|MF%6`a79&nEn@TFp7f=z~st!L9s)i+yq4 z$zycKpgZb&Nt=II@>FE7iuxl1kX+b-41jDF9Fm|Pbkum2HF7$wrG3MSq+=JPbr+=% z`=v|$nB%l^MY*K(uN)|~|k3>m13!XWf zyiR{QR2AHY<6h5Qz!wy+U(iPS%tiVG4QbVwk&b*`9QhX>n~Edb@W?8T48y}!9GNbo zj(p{8=-uE7?N*dURoCl6=z(CbZpL9qG5AHugWj~B)h!qXL-YGc5iOIYoYkJdhj(Xz z@DAXsO%Qe`2n)r7)%s>>^vDqvr?f)fAaT_oF~k)|?tynQ9DDX+@U772(kmDADMJ2Mbz$+{?CO~7SYESB?AU`!a_^IXyCOEbRj7KdVl0I6>S&D<3Ibzt5T$UHi)~xIS z_T1sujT$p%Fnqs&H)F;K)+|f5Eyrd@*pgLoT6^7>Bd*F3sWuLO`ICMGsbBHVeqVOc zvK%_AwxUfrw9iC2EjL_JPtUj%NfbxE#RJpjz$33XaLtkg# z>Rx?MHPQ(0%0jI_+ zWyMg%Dh4ASVM9xTuVcX=M=r?BHgZ<7aF=gl#aKrg6*OEhrflLw{f34Mofpt-*3~D7 z(R*m!oJi{}xuC;e1pzFqBqI2@;i55q6OWVEoflX4(rmowD7%u(ftbs&TCrkiq1P|S zW6c8wO&B(8q)>dtLWGAdFS$oJdHKQX$yRDM@4`)pT?ym~zf2e9-^21t_(Hz$K9>JU z1)KkA_emO4@jtIi?tih`&GL)b{8BbgW)I|l+|yFCd4qDYd&S}J|MvZ1at}LhNoXEB z?&l$Pw7UQB|MR-!x#w0cWDC5s?C81dhKkh!Z>R8X}o>Sz5{rmA- zapcIVo}Q|z``DFe@m==);J+^P|E>SK`tSB?hr7d(Dt~S5W9+h=cS8-0;ii?5j2^*_ zc-e6!EFBAs1pi+z3)ws`TW}9+7V!69FN@jyg>2zHY)&@*{_Dlp(v9ES$sYV_k}dfC zd2@30$)34S|4a^*J^w%-2HGxWzh%j}htyE9@HA>hJb`@clvcNcZu3*!)GT!E#Sv7PpfGKHOeI!sG+;7ksn*2l6sm%zVuJ znR%6Yo|(l=XKr9dGTG!ZIYGW>?_ftTmze#`I+DY`WU}Vw&m4XAE{OjhQJCP9t6SFp zX~RbS8c`n|JXpdu=1;=kitZN7z>V6G!~ZLC7MoMdu4BpHzWeTH?7Q!?+z$aaYrc<# zKd8HVA=?yT|EKT|F>_eQW9W7Mg!~Czgv@;8+BGY4Q3LJK$8fh~pqKLYVY^f2@o@)Fr#EYc?*`oef4^^<&fK}r zbMHO(oZmV34&(X!;BwNl{|&;KT3cKBR-PAL*`?WiL<*(fUByaP|HZ5Kpjg2KNd>75 z%{^W&>f-S?M4b&DuOU@>e=B1@ug&$9i@rBR>1WN-kH3;OwRz?=Ys5FONVEBd6lsEw zk)$^h(z^-IsD!)PUF%lujr$DtLDu=YZ67rNv)m!|}X*V7S7FG0XMZSl)6CTdv`l?MAH$B7|r}Z1ry8VaNQF?Sx$`s($+4@GQenaO> z^$}f=Zd->!Qt>);(Hr(Qd5b`ZYPXatloB~a;-pz2aci@}NUv-Fy@c~IoUGofFO+H$ zjZf$UwQ{9jda*e~r2bZo@i@M2(|OIL_qORa?SeuiPn&j1N+moazSfBHxblSWBIoPp zl)=h4Wqim|FLQ17i^@aDAvLd4A44Hdc}$z5JfvBan~RlxRR3`2BQhFOpU?+MiG za=Vn>*El=H=vf+z;bK!r_jNvTwPP5?0dxczI)Y+m1Vt(D90u`Bn{HO;7`$fIyQIo< z=wpRuS8h{Wnpe5S^YPaxIaL~!KxGq)ef_48Sl=g7B8q$$Mc);%aZYqWQq+a$T!Y;y zwb@T;g7W)J{o`5(w+?QckYaTa6X*K|ZTr5F{(W2>oRlJNjk`)j=My2Tr=}OpE>K=j z<|~DTx9I)Sg!QFgwSU#~^{THUUpIV%E{nv)E(^v`vak>$(^9HN=fD6;m0*QJIzI;&k$#>(oP2N`9K_Ikq{gVo;l5jMoe zpIKMWuxY8~iUDs@?vY!bub>HxH8~D0ye3kudh-jp~kgtD$Pr3a<{mp#+ z48Gb?=4eX!{fA{jNIIQ9b7b?>sZ(t>+f?#x+Lr$2(sTnCv2ETw-5}|2zy0>iRC4K3 z`VyHgO+KRiTggWE2VnGaLSmG+I$q+#u|X{gi4AU1m{@L$!Zu{12V-#R3{uLJvSt<2s@e>b#uR8|l3`795l&+Z=xe%W zKz_tT^A~j5s#-byTY2EPfi7qM@UbKECk>i3E_aZc>nt>KS6!i#m678_dGy3(&U0?N zIvcaL8NzmhTAJJ**|X{*=d?A&?X6$fT0iOMbW7N2Kysb9$kjS+N^Y$cmnqlzjgqSj zQD-_Co!ivU$>TPf$an$&xh9hT4NoNePbZSCa4ch+Fsabya$0Q@hl#erffH&gr8J}S9 zn@uJ+|B_73go3<%5M*ThLMzls{5-v{5+#fT31bqO5R11OlF<7)nKu25tj@NEy$bOv zOky=rSbF0Yvba$_1`%b_Y}a#&sB*=)6ro8Yj`?Dn-mjRO)EvVq{dPTOfRnyjFP&RY z)rPFHL8gXxlrahSYTh}$hOc(31Dsr=CB+pEOgSP08fQb6(N}}DNHx5-X@<2lt2DcG zzz}^ag4X+B5dw)sh1DBI<^yUL^4WLF zLDDFwjABtOlm@e6K^~PLYny&tB{YV#iu!kQs0bs%)BXjC)<>(-Xf9+sC6606Zepda zDVox4flkdF=+cb9(cYBDn}~KM%@Nz$o1$I6yFC%;iguQfKxg!*>)e6BQI$D&$nA(8 zeW@#O)caDW!Zg}s%?|yKh6X8vJ#SE*$w;#F%vYEmO_CZCTE0RuO4ivA6{}JRkih}r z5U;s>q6GcZrk|%|b2OUDZxo(h_;hY7KuvxLA2>J;O;$ zHzfWm?wCjCV-)wMp$ssh~~aRDp(Wr6ChSo}xCI zWv`27ab8WIdNuLxHr*OOE$XKD8PO0U!;$a7G}M3#qsJi**`=v%(%o&cG@@-jleGHT zGLvIItFS8PH0HB@zU*0-oD4?#Xoka#!bGfPR)ta7GTYTWuET7ED+@YIjO@m$WxP%! zlVFpjzGVFw5v^xJr^WcGt06qlGH4fN$}A3*l-Zpan6OGRUB;jpPtguJU9pqMN6G9< z#!k@S=}fSP22aso&KfdTUOW*l@c_krvJBKa$ z#ZbGs&us1^ee}PN*h!z=Zcj6(jR$A`u3U?B95{8c`1eh_&y^QRb~Dd1gvb4gx>SEw z9il7-q8Ypqx4PZHPC4o@<(GgdhyhmFEge58{povY!5-=G7HQl*X}}5T-IG$*DQV?4 zY0y@Q*(SYyOd5Y&a`j1n-Y&g+K#HZLZ#$%)?3Qjk27Dy_e7khhF3-MpV9#^grC*+v z-tJQGH%vgGyzDvMrAoXXTz`+4xslbw$P6hqq+7JtO+d(j0am@FzyGj zuKxh3-fux%@3)kKx6V@{8hWKs=V_C_Js{n6kODJb@}@#wov3p_Gg4l=^yw~-f0z1@ zJ{Dl@-1f?6tF7VK5I`+y){girXx+wVrT2E=Chm|cp9KJPuU$}8E9I}BvhkTsu8n5> z8QrWm;h*e~A{#w-Zj@R#OY=5H#%iWOS74FG2Re%>$V~+*ivv|_y@ol~x54pJNuUI) zBCrHNl8Kf$AW+tRS7=M}`ryQB&Yn|Mg}Yg^v@rU9hwPGBi@@_N%lFDrxx=^74?`#* z_b!Ys?5NpDhbOQQnh07qhf<$QoJ9sT9fn00Lz@o4oz;g&y~gC|qT;|5jSDQ$C5>6@ zZDx&b-K?<)F~`>g-}o%5=k(lKH!?-%>7uvJ!g}uAeVMfD{%fiT8l9{;6-!ba)6M)Jk1tZ1e|XaXc6QlG&fYGyhWP2MLM}j8nM|w zS(87V!rS;@k@l$oW-cXpv6%dqI2W-ic#zyg_ObI@!z z)K-W)s*FjoJsXr9+Kq@k$@;HDOOQg*u4J>{)*vpg0z3Ex7oF}Zhs>0713==EV#TVN zrRL3rfTH>x7zc+YTzyR;#Y%${RI5eQM*|3Eubmfrax>!WY-{#fZ7zn%>yYl{_hGH6Q%k9pR9hmo+*A>CP0&|4BTVNM|~Y|*(%!EeEk7a6&li4OJx zP&Xyu4ak9ofkkp=;x0({Zt|SmjNS;qhGrvMdS;VntS(h$?r&|1ri`7K{YpKL4y`d- zeHO|yHj;I9GjwpS4u~0bmt$&{1jVSF%!+WmausHP@^LaZGAzmX-w9d~Z%v93K1lrr z79>-GiUV@kII~P&uD`1Xb#K{%7Z$#_pv?Q?!WZyE0I!H7<;_Lt(a5CT5F**ZEZqjY zp4F5wwgM?RNKhLV@5C)qiyq{_*U^O_vQh^C|D&!jYZt~Ebp=>EMPMsj-$W&EJz=}z zgmrQzmIk|^UIc#^dOAfP7|e?KNm8O%yv`2;_mm7$4{7D#PbP3vv=kciS?TUXL9<8EhgEYo!&Uuj}yyaltI~lc8pAj&$j0#!AylabZA*FR-kP;W5ZsGre9$lo5w-)^a6Yvd55GOI2qj^wEXC~CA? z+VXrvOnwtFwU!oima6j%uCt_|wFC{bx-CRh&QAFkl}cZ1RbPORdLUEq$LjMfrPm5R zU(ory${IJQoo@Ar(&<%>s9kQgTj}yD-5|RY91Iy3=!CU{)+?1iDpks#&>?l+gODAD z*jv(D;@PluXUWczsJGb9YHYx(Il$a%iR>OmKmV=(FMkHNzr&FX)&IR-k{IUEIF(^2!d=Ss~SiIJsI^~L`*bi0g1>! zBD0gM@l%M^Nz#n%np9UqnpyuS$fDuRrbt$7IkDRjyPU|eWyEema2Ww$S4p8r2~Oxd zB|o~r$r$2tZ>3qH3)4$TduFvxJUz<8M61=mW4Tu`#ovmCk| zg3F>$4YJXa4&Qc2a6fKU_EUvYMu}ucOCeNpllDliKL_E0h&h=LF5xJbtb;iLO<`%7 zYnWS}(pPE>b(SOO7z4cp_Ta-s+hUIyyNgb@;g{me*Ze8^p_hKnm z?Bv2RW{1Kw?1-6mIOgwE$c~c8@cGP+68~TT`jW27(QQ;sU}8|wLm8>4_0^4JWehn3 zY0Mf~Nsgi%z=hV$|4S2&$aEq%qX}~|nvlh4WYpmQXugaBL-ZtdFqU-063B0u2%O(- z59IewicV52(R?Kf`bh!A@3cUE3~-d$m23)SUJ8;}N+@);SoG^-UZL9z!bip`1&9_9 zKS;H9a~%zWF)AXK@d!k66V0RbjT*aSfpG)+gHbHj$JN%qDP}s7gH8<1P;95FHr9Z8 zh6nONT1raojOM!zXMw;#DKs*vpT%Jby`l~tGD){bOOliQFD6?fWzqcP9RED5UJ&i- ze!`!G z5E+5)e=Yb2(=oDQjI5b45)gt=9IbDXDX7z=Ko=FCR69ywknR2vT3-f8eav5T?3fFwNFFOmMdi(e(AzQpJBXJgDL+5I5LYUd+O=z!jw{=ootK=Y6Tsvly|re!N{DN8&3D)g(Y51)G_-NB$TPLDj3jQ-hse=t3 zL?kH@Y91v#&-3fU>R_jlG;}MTCzZjS`&xf5H#`oLk`3~)pS53gLCdPIr8;uKbNqCl znV6{cc}>t}q%2gyJcZ8qh>oUs377nNgu7D0c>yP4I-Be>tdw(`9sX01N22Y}+Hke` zIcZgg#uaF6-Bz|SJMQRk%(vEUV<{J!>mZV{KA9%qVXfQ3*1~9pES@RU6$y2+pk1kR z3xI$uMDrXW<270}T^PV{fdB50jkH05@Z4;%jdP({~=$>mXdq@KZ2Mk zhb2LzHM{*zAg90XMtH|=@C^^G17m9W(<&EuO**|h(j$%Rh*nsbK!rojOd7P}e6n_K zqS+ehp{;hI$;d$p(0$W{)tqrI$=OdO(?(AcUVS&la+=_UucU@ca)m(aHJn3M%z74d zsTivvkmn{m?7voL8-;i&fDX+6`x@1(4~)G>3ZbA2v_8l0-XoqTzC(oLck%YUX!O3l zXmt9u2p}wwe_^XzH5+Dc$F}y!^?s8#nH?D&TY(b)XooPR$xydEvRJ(xiS`KVk{z-a z%I<>yoR*e@CV*$Y0%HO{@te@;_4jgX=SG(R?=5dfSNEudcJ>dnv%iDFV^t#kyC<-H zZF_89yTV1cW0ktYFgv*`_j1wpAlZm%5)vCRPd~08kaIi$C##QyDssfyMW9C5YWe^z zSIO7%$uL9?G zV?Ru-Fs$&?5b3XbByF#%7~4b4O2XmQqwQVT{!)8&`=8sR6;A9n;Lhq+S^E24$=Kuh zY!40e?uoXe119O{oWh|Acw=@7&>%lE-thZVssN)g)c8Fx;tq#z7ID^AMSO$ zMn{nb%6PQvW4UP>erTNm#u+o;d#v--grULZ2iiuGiOXeWSQy>GJT` z_Z81<+u~kaG2zCN#p^e23w^x0KzXa?FDpLTynW(*Gk^YKrT-)C(}Rb5&boj4(Z`>C zv*E>e)K8CyPAW4-&3HIwEXQ^s4ZRuo1?&{AfiZ<5f}nx$sJMe${Z z3 zVEvdlRJ7-6f3fW5vsl#B7-~*I<=mk^0rO%OB$sG-Ab{NeZM8u+6T!F<4gDZ}A#caT z?0~T&uZdegL^dLNlOz3OBM`@V{t?u^OUQJS${3Jwt*{2yTT-yIM0Wp>+2J2WGmrNV zMTS8tNpgNMc{##KFMkhv<_?IzLJL}kdh@*SJpzt0F_5wJ^nsq2zgLM>VChLgke zF10@Sihcl9yb74NUwtQ;hGgWGcObqMTF}wD-wv}%A8zy@k;gV-nDSZ}NyA(B!=SV) z`_aPHGz}XK;Y`{kr1f2kOlL@^ZGH@s>s2h`v`q1Eh${#&@n0VZ$3ghOSddK~_rp%B zuN0xy&VdaN$|1AF9SqWJ$TCzKdyqoVaQq*l<9AhJU6lyTaXOgWW={o~*a8BZi%)WT z-rwgMQi?4ciNSQlZXmiTb}y$3@lQml|G<}TiiMoicc99?NzT+$Lh4G09B&pKuLZ^W zW@yvb{Nfk7XmC>h*7}G@$$%_jGMPVO>psdr9UOK!A?Fs{_cZp~xq~5&(l;XRIv56x z$mw>xwnV630x>%s@Q8@mtGwr03OrF|)3;Da5m|vbWo~)VL zcuVKhmx$CzT6d5;$f5IOCmBZ?+uKPiAya#$o5xLU_hRYX#9^3XncdH(oYZrMp%qvNLBa)gw=+(`1)A13D}6KQ=fnR=M? z-ZFKkM5Z>9=XZ|3lf2eRE{}gXZ|eH-N8TrQ-q=oxib&CmzmbT267yrLn-KiU^706| zZ|rltd61nHS&F>8o3IPbyxmPo)93$@et&2G{`99iul(!W;gh7C1W7YVF@z~%%30FI zl99yWekHu?N_r1|()h#D@FP&G*tUr;IjAtslrcH^Tx6n~Zn`yjld_JzB0C!rs;y1& z(4jiN82{){T~I`_y$(zbzj1N#B1P;ZiDps%XVA2CiMVo!C>3>XS|aM_uo^-))ce5< z7egEv6i=Tb${Vgr7r%2|Lpp0_V0U+V!-w@3&WPF(s{LM}wGOseZH!Whu@!LVr4FDmA` zFClbHb$bM@t8R&)IU2bX55R7&3kvE)Lr~4|7!=T*P?6alk=t@Ghjfs{Aqq*8{EYSyzg z!!e(udhI#@HL?ohgPl}UeY>a%^?wyrv3`X}Wjhra)OU-+KS7eR8f?%J5-P3QICP=W z8voZJ?4a}LxH(fZwWU7H^or`UrmpxuzzFc5CK9byV}uHWO>a@L_v>lzq&l}ry8yY3 z375Am-T1cpWRuetj=ggTp4KIYFjT)f1Z6hwkirEqGa>GAG6`AT2@FM5GU)YFlGKp&e6!R^qwxzOi4&A}&{7aCUV=0nq_P5PIr4PKd}L5d(S@XVLKBhc+tb^|a> zuonl-NzTp&?G@ILslkf#UT{Y%I6P1)l!|}2UHHR2!XJJj{NXX-56=jHC>17{Cs?Kx z3ezSE(?$!^h6vNLg=rjmyQR(kb;yEKeXTZQfak*_p!Fm8FX8r<)5HXYK29GB$I75D zd|k2UIK!$w4$Z>{#`WSr)Vfzf4mL1${q>_zN!F%RmVX~|VC&2stK+2N zqxDvZf0=8SAO3(N?YF?Dqu<+sESMcW$Z=-jd_4mDK4Ie`sPonHz= zrMgmZfASF*-_Vu9Y^=IsQrP%Scz=8a*oon7@Nz_{78W`t@DuAawxrlooz^Nw^lWZ=*YTI7Z&6Sc{)ezseZ zNuFG^xGGp)i~YJ(k-WIvAB;S`@YN#s%#jk2$n4p(G0{y;O=Nbu2?w`uAqwv_X3CUt z_l$$bZS2^A1IOhdboI)-=jBycVjmt=_}IUXDsZDK*~);}-lLwo*9!vn$LU5a%P>54 zWUpO#4_V_~oH5ny9Ao5%y@fYAi?Ad39yV`QU?J{>y%CMuxy;JO4vsrBEqPwRnl3O@ z3lvG9rrI4Fe5?uW!ei)p_83rX^)YO_9|Ysi)%Sw&JF4CA?Ppxc@zBw0p2g^N{VVC% zW^8|Amkrh21dP|s;h^aft_22F3yD}&;@NhLu5OlE^d@T1X9KMv>0}v)q`+Kh2aF_h zpfoyHv0VkpIZ|w2A%#s@YEH(QOQ!tC>1L}r<59gq`ds&1-US*b9S40k7~??S=<3Yg z^N_{P%?9L9;D!uLHfLz{j7`Wm|5gKk--;B`1-R%~?KrS^0I!BQ*#`-RF-WlyD=@nd zEk#Ocii>1NKSin$;qm@yoBhksA-b^wt#=7Kbjj1Gi4Nk8w2{o{Du94=Ao*sLlDyOQ#*1%zogT&hey(4KqsvFMA()B&G^pn`iW9y#el7$&>l-zZeFs=y6&g>ZB z_;cLb6XK}X*xj^Nsw%vtnFHUm@dZ6t<_mjpAZAfdlQy=#i`8ze?`BoD{wU7y)E}c8 zm0fhI02Wek{kfgxP$@W>=6nUu`Ea|;El{7jX0L@c==j1as4rqNQQOR0n=l+wzLX9& zgd5T;(}Qx;S4bLvgaBRP1f_^+`Y~9%@GeZE%YKKn_@tkc{?AG2@slYAPN};MG5Vek z*T4yB*-4lS)PK90L%4n~2Z6?o>f$oI{<)lDjGrVKeSXRmnSo48xGP(^_*Tv->Ne@& zlVKXP>3l6MjW&chp0AyZzGoCj_nfqgy)~JNH39WX3r^}Ed4!Xiz5WXhgnY4@i(T$P zg59K*qcusmR^Cf_gdDC?@Qc_v}~^853Bcn&9);vU3e8FT}oDpr#lN z!_wGFYxmTjfQRbyq)A_!p#@RsGH3}(Z=Uo!Kw3CPPB>m#5m<3$HP@Vdt=C#DXz+wi zTyum}+B|FaMdL6W0&yALqoad98)jOG83nZ>5G%(UImc`3x%&0knut4IdN1&v9RC7Q zTR9LTqbT9hr@-qE|N8O}V zpzi2p=b@k`*^J#d zUb#{npkod)mVmM~^_5&Sj-b|D-^j&NCj)L&=6UTT!$!N~fvy%8`04R?EqWX`78Vr;{Uw#a6W!%-`H`vIn z*jb)(tvH0&L~ORLLA^B~O?{l6e>ij!Bw;YW;G%0F(gG_o$T^%}^=zyE$3p)OSp;>IZNJxDPvKVlwH+u315utEItstVK0uwlo@^ zK!fTJS5-lV8-m@eNr?h&CjQFfAQSy($2Idr&bi%n+pX7)818W0^3>cv*SK6YcTBzYZr4MP z;?h37qd_mBaI!K zhiig!(v7&thuZ3n(p4}2X2F7A{i@|RvsX4no_}c8Z%a=vE&IjdMQ(TTFCXY*JB~)HJBb<+Hhh44?mutUEoi%`P`tzzU zY|Mkdz>=KizY*)nCu`}@Z|l9V)GuOlU53!&}u>2qZ%7*#+7hq@d+Gfs$?}DX<%bf>7vR|N0c|?{DCAhr{#CfoqP8(&}IAL zx^pmMN1v-BJoXEE<#B&zrC+lRPgdc8yv-QyG|_`NwazgOx9K@JDvysBC{WgH%56b> zm=JTFqXq*Cb}bV)3T^>|m-3tsn3tGH4qCWF8w=jh;5~Zt9Ays^*aL96ar75&oU49JQ>CpM0^dfDR)ab- zhtD-gY}+}&{X|zQ(a$0tCcC82hDl%dTZVB3+LRDr`Jn& z2UyMNadm;2evxt#iA&J<0jOy2|#3?Xkl13LDH( zabiS;c`g<9B9+z02D3w)x&xT@5!{99x<^>JC8wUR`!U;=*+1=u6l&aoUNQ8v$xiCE zqS{i~LHEA(1D@N?L;c}%@ct$5rIvc7?I@}kxO5VL6GIiwOC}} zOibEt*x^jf;5;geSq9b&y*QSm7tcXQ5nq16+f*Z~D`3hfE1(VO2M9IV8vWlZ zf&7l2cdKiha5#B^wA@~RM!dp3-@2lpa|MF%6`a79&nEn@TFp7f=z~st!L9s)i+yq4 z$zycKpgZb&Nt=II@>FE7iuxl1kX+b-41jDF9Fm|Pbkum2HF7$wrG3MSq+=JPbr+=% z`=v|$nB%l^MY*K(uN)|~|k3>m13!XWf zyiR{QR2AHY<6h5Qz!wy+U(iPS%tiVG4QbVwk&b*`9QhX>n~Edb@W?8T48y}!9GNbo zj(p{8=-uE7?N*dURoCl6=z(CbZpL9qG5AHugWj~B)h!qXL-YGc5iOIYoYkJdhj(Xz z@DAXsO%Qe`2n)r7)%s>>^vDqvr?f)fAaT_oF~k)|?tynQ9DDX+@U772(kmDADMJ2Mbz$+{?CO~7SYESB?AU`!a_^IXyCOEbRj7KdVl0I6>S&D<3Ibzt5T$UHi)~xIS z_T1sujT$p%Fnqs&H)F;K)+|f5Eyrd@*pgLoT6^7>Bd*F3sWuLO`ICMGsbBHVeqVOc zvK%_AwxUfrw9iC2EjL_JPtUj%NfbxE#RJpjz$33XaLtkg# z>Rx?MHPQ(0%0jI_+ zWyMg%Dh4ASVM9xTuVcX=M=r?BHgZ<7aF=gl#aKrg6*OEhrflLw{f34Mofpt-*3~D7 z(R*m!oJi{}xuC;e1pzFqBqI2@;i55q6OWVEoflX4(rmowD7%u(ftbs&TCrkiq1P|S zW6c8wO&B(8q)>dtLWGAdFS$oJdHKQX$yRDM@4`)pT?ym~zf2e9-^21t_(Hz$K9>JU z1)KkA_emO4@jtIi?tih`&GL)b{8BbgW)I|l+|yFCd4qDYd&S}J|MvZ1at}LhNoXEB z?&l$Pw7UQB|MR-!x#w0cWDC5s?C81dhKkh!Z>R8X}o>Sz5{rmA- zapcIVo}Q|z``DFe@m==);J+^P|E>SK`tSB?hr7d(Dt~S5W9+h=cS8-0;ii?5j2^*_ zc-e6!EFBAs1pi+z3)ws`TW}9+7V!69FN@jyg>2zHY)&@*{_Dlp(v9ES$sYV_k}dfC zd2@30$)34S|4a^*J^w%-2HGxWzh%j}htyE9@HA>hJb`@clvcNcZu3*!)GT!E#Sv7PpfGKHOeI!sG+;7ksn*2l6sm%zVuJ znR%6Yo|(l=XKr9dGTG!ZIYGW>?_ftTmze#`I+DY`WU}Vw&m4XAE{OjhQJCP9t6SFp zX~RbS8c`n|JXpdu=1;=kitZN7z>V6G!~ZLC7MoMdu4BpHzWeTH?7Q!?+z$aaYrc<# zKd8HVA=?yT|EKT|F>_eQW9W7Mg!~Czgv@;8+BGY4Q3LJK$8f/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Ice Climber (U)/copilot/Makefile b/_wip/Ice Climber (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Ice Climber (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Ice Climber (U)/copilot/chr.bin b/_wip/Ice Climber (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..89e609f9b7ac43187619cddcd68f42a5b9f60b8d GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/_wip/Ice Climber (U)/copilot/header.bin b/_wip/Ice Climber (U)/copilot/header.bin new file mode 100644 index 0000000000000000000000000000000000000000..aee36c438eb06284501f97c9f7247d5d3193af17 GIT binary patch literal 16 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/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Joypad Test Cartridge (U)/copilot/Makefile b/_wip/Joypad Test Cartridge (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Joypad Test Cartridge (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Joypad Test Cartridge (U)/copilot/chr.bin b/_wip/Joypad Test Cartridge (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..fcbac117b3b242462a068d0dc71bc6ba9afa2f9f GIT binary patch literal 8192 zcmeH~ziT5$6vv-XY+WJbGzJyI{uc~xR4g{>L#nvHBB;8;$E7eqSQ0AK*<7EbyD~)} zMT!&?1nWk~*W^f%J9HRQ8X0pz#d;^-H#6Ve)nX^X+#NXR+019>_k7>XtoF4(kK_2O zwzLDA?I!G4$Zp(-j%KNl$Mt5k9(RRoMNcMay)I;8l69>oqsJzRktfr*-rU*Q5weR) ztuOF+y?&&5$M%yrPUBd}B#!l8$f#qC=|n;p_7?a8}O~@PBdu*n0XD=gq zW4c(#V|54oL2j)>9@b07li%lyKc+%Hc6Kaee3_=NbUgCUztT5T(P|&!Jdjc{8?00;EHATXUi|dK3)5qJE1!Jv^_ODvyuAGGw>+O#KYM-fx|*`y zk*&$4%2LK+EdBduTdrSjzue#Fvi6VaskLeS5m~8JtVIG7L9({CW-St!2$IdsO>2?B zM35XD99WA4CV~Y1(hVrR~>@dtk3fh?SftvR#4w}|hJ z^+Z|{i5)-xaWEL8e}tT_bo_jLs|G*t-Rtx9xl*4mmyUz6Hut12$(6H(^6pmSaj_kr zZ!cx-eYoG7nX~ihL}Yt^e}6AhonEWo@yYc3%*=ZG(H^R|bq2Nw^%HMVu-#|Z7u8yt zMBOAw79vSnt6p3`+Z9=$pd0N5WBdE8`Mvhp-tTpf4i6#U)6A}}p5n5SJ!`MuVxP$2 z_(Dy{e&3kcY%V0~^yCT&H??4JnSIA0rG&(yw6B6a;BeW+QjT1E? z%g%7u2J@2}8ygLnkZJ1gWZ+@R+?%S9@Sc)b_L9vPKmYRW_opK=Oq)Tq7fm%6Z7>+Z zGbbk`q>uDwlf}0B?8Fz6JLG5cHyS~Bpa`m5C(pyfqizoeo2*oxUR})$Ue%t)yuG$~ zt&vXrc&OWVaRH8o*u8!~W0+WHQInuOW6&eyXoL}l10icQ6pVirvRWOTTbrQ0r%FHF z*bq{s;Em`MDRojfG^6hQ>FFtsi>EeRIs&-XZJ3a=`J#Th>8c`DxH6Ut09Ra<2#B3C8^-<9?EHKgqbCWZX|O?k5@dlZ^XG z#I^drivL5Lj<|jm|F7cz`^W$HjDLIh(bnHyzO)c-tm6NIKYUC~?~r-vD*pEo{VM*y zSjGPuga-S!c!_a8$+({^##Z`V2>sn7Zz9Qg$yNNnivM{wZX@E}Rs6q-|I0^%kz5|} zX^UdSw;cWEQDAwbhnc@!ziOs#udA$^{T`<3eAUZ3{Jwkjx&Gp5pda!P9>~+*=fJ6q literal 0 HcmV?d00001 diff --git a/_wip/Joypad Test Cartridge (U)/copilot/header.bin b/_wip/Joypad Test Cartridge (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/_wip/Joypad Test Cartridge (U)/copilot/linker.cfg b/_wip/Joypad Test Cartridge (U)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/Joypad Test Cartridge (U)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/Joypad Test Cartridge (U)/copilot/locals.inc b/_wip/Joypad Test Cartridge (U)/copilot/locals.inc new file mode 100644 index 0000000..580811b --- /dev/null +++ b/_wip/Joypad Test Cartridge (U)/copilot/locals.inc @@ -0,0 +1,2 @@ +; Joypad Test Cartridge (U) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/Joypad Test Cartridge (U)/copilot/prg.bin b/_wip/Joypad Test Cartridge (U)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..d3f99e15578f41e8d7f14fd44d6a6418171edb53 GIT binary patch literal 16384 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/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Lode Runner (U)/copilot/Makefile b/_wip/Lode Runner (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Lode Runner (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Lode Runner (U)/copilot/chr.bin b/_wip/Lode Runner (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..eb62ace663d56abb94fcfd907361bbf7cb4a4555 GIT binary patch literal 8192 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 Ms3Wum7yMlGe}3=z5C8xG literal 0 HcmV?d00001 diff --git a/_wip/Lode Runner (U)/copilot/header.bin b/_wip/Lode Runner (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/_wip/Lode Runner (U)/copilot/linker.cfg b/_wip/Lode Runner (U)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/Lode Runner (U)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/Lode Runner (U)/copilot/locals.inc b/_wip/Lode Runner (U)/copilot/locals.inc new file mode 100644 index 0000000..24fb583 --- /dev/null +++ b/_wip/Lode Runner (U)/copilot/locals.inc @@ -0,0 +1,2 @@ +; Lode Runner (U) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/Lode Runner (U)/copilot/prg.bin b/_wip/Lode Runner (U)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..4d1211a41a26d66718bc2f9f04f9a9deb685c1ca GIT binary patch literal 16384 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 Zg`dLVOzq0hlY_VEyVNO8MWg=3sF>YYB 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 Zg`dLVOzq0hlY_VEyVNO8/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Lunar Pool (U)/copilot/Makefile b/_wip/Lunar Pool (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Lunar Pool (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Lunar Pool (U)/copilot/chr.bin b/_wip/Lunar Pool (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..5a8c5ed8e073a872c85847785fd3fda9b13cfea5 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/_wip/Lunar Pool (U)/copilot/header.bin b/_wip/Lunar Pool (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/_wip/Lunar Pool (U)/copilot/linker.cfg b/_wip/Lunar Pool (U)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/Lunar Pool (U)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/Lunar Pool (U)/copilot/locals.inc b/_wip/Lunar Pool (U)/copilot/locals.inc new file mode 100644 index 0000000..02cd40d --- /dev/null +++ b/_wip/Lunar Pool (U)/copilot/locals.inc @@ -0,0 +1,2 @@ +; Lunar Pool (U) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/Lunar Pool (U)/copilot/prg.bin b/_wip/Lunar Pool (U)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..e4b8e4cecf2fbe770fc2731a5554ea5e0f25425e GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/Lunar Pool (U)/copilot/prg.s b/_wip/Lunar Pool (U)/copilot/prg.s new file mode 100644 index 0000000..0ae22c8 --- /dev/null +++ b/_wip/Lunar Pool (U)/copilot/prg.s @@ -0,0 +1,12 @@ +; Lunar Pool (U) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Lunar Pool (U)/copilot/reconstructed.lbl b/_wip/Lunar Pool (U)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Lunar Pool (U)/copilot/reconstructed.map b/_wip/Lunar Pool (U)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Lunar Pool (U)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Lunar Pool (U)/copilot/reconstructed_prg.bin b/_wip/Lunar Pool (U)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..e4b8e4cecf2fbe770fc2731a5554ea5e0f25425e GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/Lunar Pool (U)/copilot/symbols.inc b/_wip/Lunar Pool (U)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Lunar Pool (U)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_ROMS/M.U.S.C.L.E. (U).nes b/_wip/MUSCLE (U)/M.U.S.C.L.E. (U).nes similarity index 100% rename from _ROMS/M.U.S.C.L.E. (U).nes rename to _wip/MUSCLE (U)/M.U.S.C.L.E. (U).nes diff --git a/_wip/MUSCLE (U)/OVERVIEW.md b/_wip/MUSCLE (U)/OVERVIEW.md new file mode 100644 index 0000000..bff8316 --- /dev/null +++ b/_wip/MUSCLE (U)/OVERVIEW.md @@ -0,0 +1,53 @@ +# MUSCLE (U) — Skeleton Project + +ROM: `_wip/MUSCLE (U)/M.U.S.C.L.E. (U).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Horizontal | +| Battery-backed flag | clear | +| ROM SHA-256 | `d3da17f2b67d517e4d519659407d6f0e3cd7a2a4d89d31da6bb2727afce798dd` | +| PRG SHA-256 | `c9061b6d3d06f56e3c2f89337d8e59c159f494ff9efad50852fcd19621f0b03e` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$86CB` | per-frame heartbeat | +| RESET | `$8000` | $8000 entry implies the header's NROM/$C000-base claim does not match the image — resolve in Pass 1 | +| IRQ | `$8764` | target $8764 — verify during Pass 1 | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `M.U.S.C.L.E. (U).nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/MUSCLE (U)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($8000) and NMI ($86CB), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/MUSCLE (U)/copilot/Makefile b/_wip/MUSCLE (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/MUSCLE (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/MUSCLE (U)/copilot/chr.bin b/_wip/MUSCLE (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..d2d1378511ca40711e02171d5a561a21c8406905 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/_wip/MUSCLE (U)/copilot/header.bin b/_wip/MUSCLE (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/_wip/MUSCLE (U)/copilot/linker.cfg b/_wip/MUSCLE (U)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/MUSCLE (U)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/MUSCLE (U)/copilot/locals.inc b/_wip/MUSCLE (U)/copilot/locals.inc new file mode 100644 index 0000000..f38a220 --- /dev/null +++ b/_wip/MUSCLE (U)/copilot/locals.inc @@ -0,0 +1,2 @@ +; MUSCLE (U) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/MUSCLE (U)/copilot/prg.bin b/_wip/MUSCLE (U)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..99ef18d0c5a6f65321526aaa8ec00664426c2286 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/MUSCLE (U)/copilot/prg.s b/_wip/MUSCLE (U)/copilot/prg.s new file mode 100644 index 0000000..8c86c68 --- /dev/null +++ b/_wip/MUSCLE (U)/copilot/prg.s @@ -0,0 +1,12 @@ +; MUSCLE (U) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/MUSCLE (U)/copilot/reconstructed.lbl b/_wip/MUSCLE (U)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/MUSCLE (U)/copilot/reconstructed.map b/_wip/MUSCLE (U)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/MUSCLE (U)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/MUSCLE (U)/copilot/reconstructed_prg.bin b/_wip/MUSCLE (U)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..99ef18d0c5a6f65321526aaa8ec00664426c2286 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/MUSCLE (U)/copilot/symbols.inc b/_wip/MUSCLE (U)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/MUSCLE (U)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_ROMS/Mario Bros (JU).nes b/_wip/Mario Bros (JU)/Mario Bros (JU).nes similarity index 100% rename from _ROMS/Mario Bros (JU).nes rename to _wip/Mario Bros (JU)/Mario Bros (JU).nes diff --git a/_wip/Mario Bros (JU)/OVERVIEW.md b/_wip/Mario Bros (JU)/OVERVIEW.md new file mode 100644 index 0000000..792efb7 --- /dev/null +++ b/_wip/Mario Bros (JU)/OVERVIEW.md @@ -0,0 +1,53 @@ +# Mario Bros (JU) — Skeleton Project + +ROM: `_wip/Mario Bros (JU)/Mario Bros (JU).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Horizontal | +| Battery-backed flag | clear | +| ROM SHA-256 | `2810051c21132abd8b9b1e1bf741b302ee6c1d4af983e0df7fe50bd05ac0a5c8` | +| PRG SHA-256 | `699ae2908486fce5a0fffdd051285e1144021f616d9af88eb511f319539acce1` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C07D` | per-frame heartbeat | +| RESET | `$C000` | cold start at $C000 — the usual pattern in this repo | +| IRQ | `$C000` | redirects to RESET — unused placeholder | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Mario Bros (JU).nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Mario Bros (JU)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C000) and NMI ($C07D), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Mario Bros (JU)/copilot/Makefile b/_wip/Mario Bros (JU)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Mario Bros (JU)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Mario Bros (JU)/copilot/chr.bin b/_wip/Mario Bros (JU)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..c685c56bc10106b98d3aa45851286d5d998b8ef2 GIT binary patch literal 8192 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 J?$F-0{|8wiR^|Wz literal 0 HcmV?d00001 diff --git a/_wip/Mario Bros (JU)/copilot/header.bin b/_wip/Mario Bros (JU)/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/_wip/Mario Bros (JU)/copilot/linker.cfg b/_wip/Mario Bros (JU)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/Mario Bros (JU)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/Mario Bros (JU)/copilot/locals.inc b/_wip/Mario Bros (JU)/copilot/locals.inc new file mode 100644 index 0000000..d06e348 --- /dev/null +++ b/_wip/Mario Bros (JU)/copilot/locals.inc @@ -0,0 +1,2 @@ +; Mario Bros (JU) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/Mario Bros (JU)/copilot/prg.bin b/_wip/Mario Bros (JU)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..3c1ed7481ecad4e876ab46bcd0a4cfc2e19fee04 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/Mario Bros (JU)/copilot/prg.s b/_wip/Mario Bros (JU)/copilot/prg.s new file mode 100644 index 0000000..ea4b468 --- /dev/null +++ b/_wip/Mario Bros (JU)/copilot/prg.s @@ -0,0 +1,12 @@ +; Mario Bros (JU) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Mario Bros (JU)/copilot/reconstructed.lbl b/_wip/Mario Bros (JU)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Mario Bros (JU)/copilot/reconstructed.map b/_wip/Mario Bros (JU)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Mario Bros (JU)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Mario Bros (JU)/copilot/reconstructed_prg.bin b/_wip/Mario Bros (JU)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..3c1ed7481ecad4e876ab46bcd0a4cfc2e19fee04 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/Mario Bros (JU)/copilot/symbols.inc b/_wip/Mario Bros (JU)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Mario Bros (JU)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_ROMS/Millipede (U).nes b/_wip/Millipede (U)/Millipede (U).nes similarity index 100% rename from _ROMS/Millipede (U).nes rename to _wip/Millipede (U)/Millipede (U).nes diff --git a/_wip/Millipede (U)/OVERVIEW.md b/_wip/Millipede (U)/OVERVIEW.md new file mode 100644 index 0000000..9ef1c8d --- /dev/null +++ b/_wip/Millipede (U)/OVERVIEW.md @@ -0,0 +1,53 @@ +# Millipede (U) — Skeleton Project + +ROM: `_wip/Millipede (U)/Millipede (U).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Horizontal | +| Battery-backed flag | clear | +| ROM SHA-256 | `627c0573e7d9fe306369f184ef0258950be43b6b530e668c6e840ed6c416c52f` | +| PRG SHA-256 | `1dab22d522b86ce73dd2214447f734188907f7c3b4c7d54da2c6bb2f80daf9bb` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C7F1` | per-frame heartbeat | +| RESET | `$C735` | enters at $C735 inside the first pages (the Donkey Kong Jr.-style non-$C000 entry) | +| IRQ | `$FFF0` | lands in the vector-page padding — unused placeholder | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Millipede (U).nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Millipede (U)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C735) and NMI ($C7F1), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/Millipede (U)/copilot/Makefile b/_wip/Millipede (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Millipede (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Millipede (U)/copilot/chr.bin b/_wip/Millipede (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..e4afefa66a2b06d055498c101ced2ab4c8d892e6 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/_wip/Millipede (U)/copilot/header.bin b/_wip/Millipede (U)/copilot/header.bin new file mode 100644 index 0000000000000000000000000000000000000000..9b4a4b72f0d7c925ad0db9ca84c3597eae1e0577 GIT binary patch literal 16 VcmeZs4VGeLWMp7q5CCEZ1^^FO0TciL literal 0 HcmV?d00001 diff --git a/_wip/Millipede (U)/copilot/linker.cfg b/_wip/Millipede (U)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/Millipede (U)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/Millipede (U)/copilot/locals.inc b/_wip/Millipede (U)/copilot/locals.inc new file mode 100644 index 0000000..96d0b4d --- /dev/null +++ b/_wip/Millipede (U)/copilot/locals.inc @@ -0,0 +1,2 @@ +; Millipede (U) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/Millipede (U)/copilot/prg.bin b/_wip/Millipede (U)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..36dbd2fdf117a2b1b0dbab92af5228bfead2a443 GIT binary patch literal 16384 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/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_wip/NES PowerPad Test Card (U)/copilot/Makefile b/_wip/NES PowerPad Test Card (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/NES PowerPad Test Card (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/NES PowerPad Test Card (U)/copilot/chr.bin b/_wip/NES PowerPad Test Card (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..02cd95b8b5dea4d37d0e07bcdd97c032ab630811 GIT binary patch literal 8192 zcmeHL&uiOu6o0XU;(>{c8O4Vnhq7BQA}0@wWhaG-B-D_CZ zkO(Ki%U5-pu~W0QR9;vh#S=Yy=1)SA%83>h%1bqq<|vb26{OGSPokw(%QWF9Jrj*I zGSMW8gb?Wo)hh(i6@swUS|Uo%d2djTq6v{YKQZq#kE>ZSmqwhI-1I!ro4z|bdi(a> zG_{)UK6tRT^=-!Ad-CMV@9t&%o1Z{$6rb7^=fA5!dpih%y|yxHwwoYV@lLSZu_v+O z-DSXw*T%N**t-v=4Iqmx5gXm^X~fAF*xD{)#N|>SWmx zRqCs&tMy7E!4>xvJX5^3ywarMQ1SMUD~O)W59Gk-E4g8PWBm3qt5Ov z?RcKqBFox-G&EXBuN%iAq6TWCRU>)|_pW2p=C;*ee`wPw(sR2y?W{Ep*YE2HpUjI) zzURrzxdJkIT;}8B*SW*?)mJ}nkJh9;(BF(NO>e;EW&9wtfG$dR*&FM2Y)b{Y&`VJ?llLkY$bAB-hF81o3Q5BY}4mkapi%ME1_`&Y65V|(NUxY+-T{r~g-`q5u#y--~M literal 0 HcmV?d00001 diff --git a/_wip/NES PowerPad Test Card (U)/copilot/header.bin b/_wip/NES PowerPad Test Card (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/_wip/NES PowerPad Test Card (U)/copilot/linker.cfg b/_wip/NES PowerPad Test Card (U)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/NES PowerPad Test Card (U)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/NES PowerPad Test Card (U)/copilot/locals.inc b/_wip/NES PowerPad Test Card (U)/copilot/locals.inc new file mode 100644 index 0000000..3460482 --- /dev/null +++ b/_wip/NES PowerPad Test Card (U)/copilot/locals.inc @@ -0,0 +1,2 @@ +; NES PowerPad Test Card (U) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/NES PowerPad Test Card (U)/copilot/prg.bin b/_wip/NES PowerPad Test Card (U)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..dbec8675c51f2a91af0159dcb08fa2f7c25b052b GIT binary patch literal 16384 zcmeI2Yitxn9Kh!ud%O4C?X^8hF*&v#=5Y?ZI0&3OHe8W5lbz)B2^wnZ}0Zn0>-XU#DEFT?A~#uXF~Xf$;{nO z{`;T*W9Bz=n@j!+-_OBQId~-pX#=(!@KpouFyJ8r&dT z6+Zo{N;g^hQiN|Au+MuocKbnV@t>O z4x||K>~TZc4IeGQ?FG2rbh54acunsbL3LaIXh3#LZ=O@YRu|mtQn;-EZU&l=o*^JV z?uOlIY`R|1-07GgDI0c3JwO2(co$6QH--io{V(lL1$+S96Z&_1a9q?@gKTNx9RY*eKIXGvR_g?4fF6ve_)KV zXq9SM`>aek!H1BO!l;xJTvB~9qtdcp4ah;Xq?n+&aEB#@*)v0sBYR>36kdPsARZ{J_GLYgHiw4waWy3SP}q>-P585c1nrodDJ5{sm+Ph7(Fr}M*7~j9 z3EcyG%-wbPzP@zdYf60~D-(9kdBn=Fwp6%sIe*DGf8nQ#znb~WR|>!c7r_N!@b59% z{v!itN6(J(2bsZRBd5)xSp@NlIzB~>_9K!AX6Zzr+auN$kqD7^pBOKyVZ9!{p4VJ* zSe%dUEE+x5(B6k7^tkb$A1gX-sOK?5`OP3}W zcBPheyqxSzEo*5@y_7<_uFj4nOOl=Z%2`tTqA7#zA|Aya$+i{z##yhVoYuZD^+e0l zsn%qwwWaMDtXm0Ydt=KwlcJbvNp*Fkx{_j7N^EaSE^nE=xHQmu`#>wWNg5$Q2oM5< z03kpK5CV5Y;K|~a;=ZCdc698a@e#9Nc8}kUH?buI2mwNX5Fi8y0YZQfAOr{jLVyq; z1PFn9o4{*1fIg7a|4IEHy%Rv{|D^tp>e;B+P3r%o{*P&v#=5Y?ZI0&3OHe8W5lbz)B2^wnZ}0Zn0>-XU#DEFT?A~#uXF~Xf$;{nO z{`;T*W9Bz=n@j!+-_OBQId~-pX#=(!@KpouFyJ8r&dT z6+Zo{N;g^hQiN|Au+MuocKbnV@t>O z4x||K>~TZc4IeGQ?FG2rbh54acunsbL3LaIXh3#LZ=O@YRu|mtQn;-EZU&l=o*^JV z?uOlIY`R|1-07GgDI0c3JwO2(co$6QH--io{V(lL1$+S96Z&_1a9q?@gKTNx9RY*eKIXGvR_g?4fF6ve_)KV zXq9SM`>aek!H1BO!l;xJTvB~9qtdcp4ah;Xq?n+&aEB#@*)v0sBYR>36kdPsARZ{J_GLYgHiw4waWy3SP}q>-P585c1nrodDJ5{sm+Ph7(Fr}M*7~j9 z3EcyG%-wbPzP@zdYf60~D-(9kdBn=Fwp6%sIe*DGf8nQ#znb~WR|>!c7r_N!@b59% z{v!itN6(J(2bsZRBd5)xSp@NlIzB~>_9K!AX6Zzr+auN$kqD7^pBOKyVZ9!{p4VJ* zSe%dUEE+x5(B6k7^tkb$A1gX-sOK?5`OP3}W zcBPheyqxSzEo*5@y_7<_uFj4nOOl=Z%2`tTqA7#zA|Aya$+i{z##yhVoYuZD^+e0l zsn%qwwWaMDtXm0Ydt=KwlcJbvNp*Fkx{_j7N^EaSE^nE=xHQmu`#>wWNg5$Q2oM5< z03kpK5CV5Y;K|~a;=ZCdc698a@e#9Nc8}kUH?buI2mwNX5Fi8y0YZQfAOr{jLVyq; z1PFn9o4{*1fIg7a|4IEHy%Rv{|D^tp>e;B+P3r%o{*P/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_ROMS/Pac-Man (Tengen) (U) [!].nes b/_wip/Pac-Man (Tengen) (U)/Pac-Man (Tengen) (U) [!].nes similarity index 100% rename from _ROMS/Pac-Man (Tengen) (U) [!].nes rename to _wip/Pac-Man (Tengen) (U)/Pac-Man (Tengen) (U) [!].nes diff --git a/_wip/Pac-Man (Tengen) (U)/copilot/Makefile b/_wip/Pac-Man (Tengen) (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Pac-Man (Tengen) (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Pac-Man (Tengen) (U)/copilot/chr.bin b/_wip/Pac-Man (Tengen) (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..8c589ac1426037bb316c9383004e31327623eab5 GIT binary patch literal 8192 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 NgU>tWbgX&te*>uh5Lo~K literal 0 HcmV?d00001 diff --git a/_wip/Pac-Man (Tengen) (U)/copilot/prg.s b/_wip/Pac-Man (Tengen) (U)/copilot/prg.s new file mode 100644 index 0000000..cd62f15 --- /dev/null +++ b/_wip/Pac-Man (Tengen) (U)/copilot/prg.s @@ -0,0 +1,12 @@ +; Pac-Man (Tengen) (U) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Pac-Man (Tengen) (U)/copilot/reconstructed.lbl b/_wip/Pac-Man (Tengen) (U)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Pac-Man (Tengen) (U)/copilot/reconstructed.map b/_wip/Pac-Man (Tengen) (U)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Pac-Man (Tengen) (U)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Pac-Man (Tengen) (U)/copilot/reconstructed_prg.bin b/_wip/Pac-Man (Tengen) (U)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..354e4f475fe30b53c9e40e0163e31c5df33a9201 GIT binary patch literal 16384 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 NgU>tWbgX&te*>uh5Lo~K literal 0 HcmV?d00001 diff --git a/_wip/Pac-Man (Tengen) (U)/copilot/symbols.inc b/_wip/Pac-Man (Tengen) (U)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Pac-Man (Tengen) (U)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_wip/Pac-Man (U)/OVERVIEW.md b/_wip/Pac-Man (U)/OVERVIEW.md new file mode 100644 index 0000000..f07fdad --- /dev/null +++ b/_wip/Pac-Man (U)/OVERVIEW.md @@ -0,0 +1,55 @@ +# Pac-Man (U) — Skeleton Project + +ROM: `_wip/Pac-Man (U)/Pac-Man (U) [!].nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + +**Variant note:** `Pac-Man (Tengen) (U)` is an unrelated dump (different PRG). Both use vertical mirroring. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Vertical | +| Battery-backed flag | clear | +| ROM SHA-256 | `d5e9c4e81ff7316d4d8b15f2198471606fdb728b8cd9da92b153bdc45124b565` | +| PRG SHA-256 | `c1b777982f55de192c9f8cd9738445d3704d5c3b31ba01647a1609aad6c2872e` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C0FA` | per-frame heartbeat | +| RESET | `$FF00` | initial execution at $FF00, inside the last PRG page — unusual; PASS 1 should confirm the true cold-start path | +| IRQ | `$C16A` | target $C16A — verify during Pass 1 | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Pac-Man (U) [!].nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Pac-Man (U)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($FF00) and NMI ($C0FA), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_ROMS/Pac-Man (U) [!].nes b/_wip/Pac-Man (U)/Pac-Man (U) [!].nes similarity index 100% rename from _ROMS/Pac-Man (U) [!].nes rename to _wip/Pac-Man (U)/Pac-Man (U) [!].nes diff --git a/_wip/Pac-Man (U)/copilot/Makefile b/_wip/Pac-Man (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Pac-Man (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Pac-Man (U)/copilot/chr.bin b/_wip/Pac-Man (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..8c589ac1426037bb316c9383004e31327623eab5 GIT binary patch literal 8192 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/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_ROMS/Pinball (JU).nes b/_wip/Pinball (JU)/Pinball (JU).nes similarity index 100% rename from _ROMS/Pinball (JU).nes rename to _wip/Pinball (JU)/Pinball (JU).nes diff --git a/_wip/Pinball (JU)/copilot/Makefile b/_wip/Pinball (JU)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Pinball (JU)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Pinball (JU)/copilot/chr.bin b/_wip/Pinball (JU)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..781b5b9bdf3627890b1384bf308f55b048351a19 GIT binary patch literal 8192 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 N9@*2i4|8|z`#(2KY@7f9 literal 0 HcmV?d00001 diff --git a/_wip/Pinball (JU)/copilot/prg.s b/_wip/Pinball (JU)/copilot/prg.s new file mode 100644 index 0000000..1e983a7 --- /dev/null +++ b/_wip/Pinball (JU)/copilot/prg.s @@ -0,0 +1,12 @@ +; Pinball (JU) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Pinball (JU)/copilot/reconstructed.lbl b/_wip/Pinball (JU)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Pinball (JU)/copilot/reconstructed.map b/_wip/Pinball (JU)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Pinball (JU)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Pinball (JU)/copilot/reconstructed_prg.bin b/_wip/Pinball (JU)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..9afb3d05e7057a779902c2d0cfe861c147b3efe2 GIT binary patch literal 16384 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 N9@*2i4|8|z`#(2KY@7f9 literal 0 HcmV?d00001 diff --git a/_wip/Pinball (JU)/copilot/symbols.inc b/_wip/Pinball (JU)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Pinball (JU)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_wip/Popeye (JU) (PRG 0)/OVERVIEW.md b/_wip/Popeye (JU) (PRG 0)/OVERVIEW.md new file mode 100644 index 0000000..5e5cb6a --- /dev/null +++ b/_wip/Popeye (JU) (PRG 0)/OVERVIEW.md @@ -0,0 +1,55 @@ +# Popeye (JU) (PRG 0) — Skeleton Project + +ROM: `_wip/Popeye (JU) (PRG 0)/Popeye (JU) (PRG 0).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + +**Companion note:** `Popeye (JU) (PRG 1)` holds a different PRG image of the same title (different mirroring flag, too). Neither is currently known to be a superset of the other. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Horizontal | +| Battery-backed flag | clear | +| ROM SHA-256 | `a9e586a0449d23c294cf8f2443a8b4a85be6832507c6baba6c275028360e71c9` | +| PRG SHA-256 | `8f095a389c8d357cd2042e39e7a111b2d42838159d52e374c24bb2b8f2560c56` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C701` | per-frame heartbeat | +| RESET | `$C649` | enters at $C649 inside the first pages (the Donkey Kong Jr.-style non-$C000 entry) | +| IRQ | `$FFF0` | lands in the vector-page padding — unused placeholder | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Popeye (JU) (PRG 0).nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Popeye (JU) (PRG 0)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C649) and NMI ($C701), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_ROMS/Popeye (JU) (PRG 0).nes b/_wip/Popeye (JU) (PRG 0)/Popeye (JU) (PRG 0).nes similarity index 100% rename from _ROMS/Popeye (JU) (PRG 0).nes rename to _wip/Popeye (JU) (PRG 0)/Popeye (JU) (PRG 0).nes diff --git a/_wip/Popeye (JU) (PRG 0)/copilot/Makefile b/_wip/Popeye (JU) (PRG 0)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Popeye (JU) (PRG 0)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Popeye (JU) (PRG 0)/copilot/chr.bin b/_wip/Popeye (JU) (PRG 0)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..3b34ba114908076ca3ec50d524504461bb805a6c GIT binary patch literal 8192 zcmbVRU5pf0cD~)!-BmD6R{^%%jGL~SSqNSpLStgPuzR~3?`q=*%Wnz;PZ{`w)#*tB6PzsW7NP+7XbAyx{>c1xCzdgN7R8 zm@+Q9@|}D8b`3xFLyl(Z+;h*l-#z!-bAPIuF_zL(EX9aa6-8E1btR>%sU7>8t(F4P z^?a`VOoeG$KF3(Ybs0Ov?Pr3}N1++`UKm_aPail^@Xp`vzppWtVJCBWa8BxgGex12 zqN-U{RjAW6%b|l5|K}<^EYEYP47w1W3BX*>i=r@ay+#F+=c5#cP*j))8GiF89s)lF z;`r%8iKSAyKB6((-dWT%?$BNM&&{Bj>-z%#yC#Z$@P=LKmfa@HXcd+sm-$1hI=6#V zN>O#)H2q!FU7mHqz;84N1Kxpqhb(5KF>=FtvfJ&};rVrs`F`Kq4V+~aY2d^`-Z9Qlz&IH@-;9K*I?U1>Mv!9|ZlB%1O^R zTeS@=m(P=Zb2#5GhOXNHlJ8@FedcO;gw;KU?y9!oT9yUn1Mm?mfv=`>ImAsb-5hkz97`%~xM#S_!_Z%8s=Z7|Jl-S%F7~DVPBA zo`S;Ii(wcx81sW;uKU?iVJctJnCArn;CXbAO^m%^8?0PJfj!;r)=DW=e{}s*+qQw5 zX1!Le*XyQrfPB)#pNqIb=;_;74FQ|qTS#jgH z?ALs`lVEwI)9I8tf+fi(Vq>k_eZ6T}%7#r!!8A<+|2i^2HwxsBZXshEL9t~~o(5qM zyi`0K{kl~4{i{D>&n;dZtwqtDxIA_BjCN|LlAF38zutXySA$`RWk=zAALXitm9l+Sa?;@4*u*dWJ46SYd_0qnUJv>8(aUx+BM25w#DR*mTE)% z5yDTyf5NY?75JXttXNI&7?xasW#(0iqZbMPKBul-`-4Gz<`AFbgZLch^N#%+Tr1TaCxz1o4tJf;{`>PLYAJu?_;L$* zYaBe_wYdG7zdtW{t@f*M>3{lX=f7~ePPg{!U*v-GLDR=}QuxCc-aqle>X4klX@4fKGTVhB3l%7z4nvkPg@<@J&-~LyO>uDqgY_>spp!Wcf4@q(zzSw=1-T( zWyB|nt}HHYay8>2TAVlDg|n4eRYe-ZS$KEq25i|_ZZ_xqmz=^kbMD&up?&oJz05Apm=7QP%<3V?vbe*5_2+qWD1 z2;$R^qlmbMIR4F-4)Qqq>~-baUoHp1eB6zys z7sv;rg6%kLRs0Gfd=c}juJArX&kZ^E8szZ{bXjb*y&#~6&xQ2jq5=)dHK^Y=*L~BoYyKR zabhT$P3aMwr?U$Sx4Lg`p|O_BWqrg*XR_IB8o5X3i^{MZ;h5@T5Dnk*T^>+6XMG&; zh1#6{a!ljw-+?=)G0xPQWrW95Gpg8s`KXdd)a#uMFP>!+pzpA`IjQ;i_w2s?y`M{w zEiK`uu(Y%^KAuiLK0dzWI1bJU$4RHlnNm9Kw1^-ZM35sG_aooWz&Ka6d;`ZBGwj{W zU@*WT1GqkpgWV@ia6Xx7wrlaNF?6V9M!!48v=5A$bK`AtAie2%x3So+?0Kr3Z!C6d z-Fi8nX)ON5cr#zhG=Bf)li*dSh86aT&N9#E*=Uwk_T0R-=)HvVr`aHk3~PMz>9|`% zF{N#NrPjTC6Nei1i6c`-h{v-FvpA+$TrF0K_Ya&q&?mlc`#$0+C9Tl?7srV*0mpfbzx0s!=ZzVpz2`Eo!N7e`z^o1!3#|L`(Lpwg zs}P`gf}>j`3H7cp6}23nlJRbQ2%FBI5>>fOKEuoec^u3bOewHAjJHJrphMV&8`+x^>|FD_nKzU)^BdPbPB@gHvn zy#{MRCtB3@~W~< zDGX9gyoH!1SU+@XX18A728~vqpT}FCsk5gbp0?; zav9Z3vou{6AHj>Jx_VuK78@-Ty3A9(&eAG4)6+bEfwJd>i?!gndrtiF_gg^dvreQxiy z-rTh-cz3#>^{!wC3N9q~W>|h5+0XZSy&olcTC|HGXV|3ED^%M)?U;g`e6gDACC7QG zx_7QGUbnbGI4EeQ60+R9L6&j4&^>x#62(ZU&!82Uu$}2dlR*xjMnHb>Cd5XtcXWBhvBUl zPjBu*K5LSKmwVW~rB_keo6-{BsR_(R&x3K`dkDgq$QS-()STPyNmsE`E=B^eF& zmu7Qfq8Ugn(-FU1Zg{;jou!iC+=f4> zi#R@aE?!=SEI8FkqPA2PEkvy-6BhX{q&N-&Aq#uar_hS_@;xBn0VI2gCiEf>qK?{0 z`$2q$_Oc%H0R-w3mss>ok2Bik_$~z8R|Agzm6JScY6aJLi!o#zIf( zTl7cmBn`jasquRs|HsE4%M%B05%I&{f8tL?%j8Lz!dL1=_#?(bh@=%HBSM~2YqFMH zT2P&&yXz83mITKWmmX@<-MK*|8MaxD0Zulu58@>AOAJ_XXIG5Rr%Di7(fDNl@g%1> z{#$gg|MU&Em*1leGL`Ws{>cK~meE%f-duREE=MW)<$ZQ0COXX~i}z1Y?>~ApW>u_Q zr;2;<^z`&3uEI{U({vmbPafTWbaFDr3xb1%&0^9nEb#S2eaiVEE@w^7ANfr6!cLTj zb>e-2#qWU#zk?Soy90ktgZ9U4VPOF~35&6rOwWq`L?47M#v?Li7(wcW;k~I&v&aQJ zu-+r`Ov-|Kc0!h!A?8W;mW)e`k1!B!%$6Y16Ulx_MT)?WCS+ zMPHmYbf?cJz^ofcv!1Lbk5>X}^ey5}WnQCOaM5a1Uq6#*`UlIp>^0CNIWG|tp zoh-}olAe4f-^4%plK4ZKqz#p*MS{s<+7Iy&WI*vi7KmaE3Pc#-UMKH)oPW4)D9iQ& zpCoZ|B=zFtkg~u}{E+dKdh$`)P}pTXriGJ`>31L^1!Gk7XCnHMPtog=UrgkBgxv=> zOXx1pZCXOc^8z|{!1>J+CnV{=9MliG{P}$Gy-CV<&p*9P6pP9GT1+1*CkDQv$Lh1w zAAB(VY+|tDJ|qT&FMv(@7eu#wBJmoL%h6{@B551XPEPW&YS!#ltI1T8f2ikmif$68 zPXdps1$;|MtLY4V{!6h8eVQXB_{boGwT%bfrYhHOwOA8BezvQTf6NcsFO^C-{K631 z;6>tg-X=SLMnnolJzsP7Zp06QYBn{pE|X4^o=6nZ!~7Su_^wua?aIwNP8lB@{8r?Y zt8IKvZy-MHJMkC0cAaE?*eMkXIq(R-6!!6xy$qncE9%6o`GjP10;%hF`jvEp=6O-OlXoJ@!BRyxA_p!RNd9)0}5sdk8MR8 z3#ejJ*E26{15!~yyZr!d1f=PQ)qbd+R;!9i5uF8OkoF1aR@w3a!9Wo2b&DQDNW+8- zp8n3gzP9<3R_y`Lx#!&T@1A?^pPA>niT%Gw80&xUk46&-MzCqe&Mn)I)*LhwdV&e2 zs-nqqs;(q-HL+$_z0ptrx}ME6Unnt6%Vrp>xh`V|$OfAVLLaCe_+A)XRZs6Zob%4# z?S7y!mSQI|Szr!o4>LufmZGX@RaMBTlVllqNbn!;!^84Cm)d{};h6x)^}Hww1J|pS zKzTk|VTg_r^FTB9fP(~pJ4ogVERoRl5slgQ+PtRmh=%Mt7s6MjV8Hc#;o#dQntrg; zE;&WF&Qe;5B`9eA(8}$*K_a23x^9~OI2YlVSdtC0+OaRV`1QNoG$@W{yF3=#@^dgb>gT2XM%@3>1Lt8STdvh+nqR{O|ir;PMmSx z%H)cL9DDgi#tdL2JCjioG&GmFg?6f8=aD17+wHbK_7H}!#`4)hq5PO2o?5IV8MDhy zs~Oy8=_JeMRAuJoThA?2Pz;z3RnHY6N<$|M@Q!kX21d%*8Q=H(8<#Tgzkk>R_WWszC;DEyUe z!?i36osV#UYzYTyGLu2(^jtQPNGV$O>+E~AFm%WP{-L5nyTpzLfv@GM#$W+YRG8g( zd+S!F6%f6utXW8@L0a$x(Q<-OuN8`?3X%d0r5}JkJj* zim{!x!HRi4|Ia&4rI1kdCl^1rY89|)Rx9OdwQ8DJjO9wzECTys)a}M`?AsgOIBss- zk7lerg7@`jeplCpYx3bY0)NP)yXcHXX3tCd#2 z{#iyh+f|dQSxOxHxUgO|B+2qizh!Ut<(7g)l1wHO>IhaQpNpjx$JtT0EM>_uC1;wZ zfuD{l(2X1|C*AUxTMP0Hi;6V}gW&c2!RY5sq3HY9-ej-LUK_1M(Y?61@7fvd)LJF8 z?_md3XY0Be!%9n!B6tf^LnU2ZIFdrWD35fovt047U7twqJ#*^$c69be7<_zc?~s4f%^JilJD>fTYTya21sE9FNo zl7ka7Gb?rvJJ3>J<3MI8pB_a8kD-VuLuN^2=wbT>=R$-Oow|Pgw|Xg>Mv9L0Qgn>Z zJ@#^7tx##V6F7>H5~uz7e|%8~m#R39uQX7+#@;<%gUc`Y+w%ffDnAS7{igQ|mIUueZgP%?_TSo^`P&l)Y- zMo>pNJD*hyBcEgLsaNWrcPw}K(z%=GE}t$Gi^xzEU7ej>=4!@cv_@~fk7!FLX?I|V z7U5zl6_f}{mcp%kpRvi0{_YAZl*|47zic-f;SVfYfMFEvdxNC4Mi9Io>HiXAp9t^b z_(L$nCqQNA%qP;1b}%j-6nk4Y_V64|b$$Lr_8snEVb4KsNTJv&HyZ{^;h0Y9`CN*& zJnZ2nifGU7Nv0}V`Y&4T>gs1O$<=Z(H@}2+W)-o>YBksM;mJb@c~klP2i+UpuIGQY zSy?>K_=1Ww3|rb`yhxpv7|+l%0gJGSt@r7tSFbksdBjTq=MrHJsr>7&+NkE}^Bu}d zU)>6V%dr!$Sf%UM?@zkOFgC`(b88k(PS?X3SvvU2Pf!y^2|IJxDETGi_!^ED^f|SI zUd`g(kJ+}}D)i3Bgp$Ec$GdgqwxgTH!UFS&>W)pzN0Ll4s;eCM*cEDqMO#bA+`4hV znk@kb0XCMY*?g;e$y9KZ>@{u#(d3oS!k`;F?P69doxtg#q?RQ|aJrtHnYrUQZ?B-y z7K=rF#7L&n>2wkWNQaHeuqqLm>S7o*-|}6aQ#y8i9QnD*wEjj+BkkTpJf|_z#DZH$ zkf)|pu@&=S4IWXab2hwqmQ4U&X4BKu!}s4GeaG(F-}zBra&8V+hq<}A@$qEx>GAQo zcDs#3quov>i>X2~*=`VkHV8mR5bj34pMr3vZ21NbH)hxyn86@`69?wHI2tw_KhE)F zs@|-`cgD!SmKy!`7}Gv9D(#!^QUu9mue!C_W@+Rp5rN>ZU)G0qlc1XxKg$e{S>HYBe{>O9*hD5|EW z!Sv`>?4n?3=k!qi=Zz^8zvnWq#(;f5z^oP!3#=jgPR{{6q|>+^!4@xbuu&=GUSTS@ z+yPbO{SHtQ+yM@>C~!w|vq7-0ae!@4aP%?-}Ke6U1i`pqAnIcTd z>1amX^Z#K5E+a4rIRB+{&qb$qKDhB;Gbc!nU9dck@xZ2u)eo$ysd4!-vBog?4FkJT z)%nXM3n5^wTeoT5LY!QrIEf!6o-dZW-Mbvm&R)26#V?WRDIvzjw=4%Z+aWGs{JR9> zl6(kjOXdNvr}UunO@fXjS$=tX>FTj^pSG8$m!y~5ecH1KygpqX8~aw;Ne=`HV`FQV zFUMv-3^;w1l%@fhjQ=MjfQw;A^DM&v3K{=TNPsX?5LYyo9IXc~XBBm-V}NSnXsVhf za5rpMa2cqsLYG#(d>LkDhIaY#VG}ox-Y`WkJ$m3YM!SZ&wwe5Om z`ubJ8Rb9|JSFsfZ7qnjLAost3{c5Mvd2>*#c{>ki_qAG`T)FAf-YKA+&6hKs!RcNo zZ=3FlH!&^{c~J)a1OMf^hXZP$(CuXNrBX@SW6e|7n(w_g=x=p8?M$}W@3*&gI^E7- zIl>tI@AsD{kh+O-pAM%nplK)UGrD+D_q@Rf1nu?vD|PQ|XQI-lp$>lohiyv8P)3Rw z3~*>bo#_h!9lsLl1WtXB!VZqzUk@4VT>qkb>FmG(MhqBa0K@AbVrh?2|E1}7`ZW6a zc`q5wX|IKpOOjE*4t{+GnIColVy;DJc@H|BU*ldd2#9)HLp1IcT)}P()r7Ru z$1SY?K|I)K>h+0g zj!&MXmcU$wKgdQLpF0=dx&>Nb;&CAVq)dcR;p|?Uj8XKWCys+a&_Z4~6}>`Vz8?fU zg(NSniGGm@!6Q9gC;xz6iuwxD5T*ns$SJP2a84tXSa3x^^dyi0OUJ@G=`!r3T!b#R z1Xzuroj5)_?GY_TLr-!p9Fn4h{x?1~-v7zJe)5Ste(-t`KmOfk{!nNRo@7%5OKwF# zVlZTpdI>OonG}kh)Ja@oAw--3+|L_OvL!H{xCW7yvvvtp8omhmKDPo)B=_NfLk(i^ zYYk9-ts_S06B7V68X;Gv$0Ub1{xLl4K7EsI?7VkcEX!nsLF)L#Qx68O5A3Ahs5;x>_y;X0wSv+}U_mRoT7;g@3EN~W6 z@5~GeQ-GWz!gAt7@qAJ z@lilXVzPmZW5NUwpFnz{J_6a#{gX*DI9#OzH5v&?NKAqC(g&*)lnC0oxxI; zeS{qnkkOC{*_J{?i{OM)Y73*JM;bz3V6l3nj?|Mh*_8gM589M}nj1=yzz+(`d4xzv zeFVe75iRrumuP|^9(^&eu&#dh9cP^!9Y-+dQd4Mp3hP zE$Ybwk#V933mD8V(d1Z+ZZM@iL5`@Oa>kLs>@`OF$cvw&B-|tMM zoOA_W_@OrGQvTU}6-f+U?E{BWSz=O@1_+bJgP1CV6(j91dK zrex7QY`W5I%qh?vNpQ$BK{#7{U9ZYUdKAS5sCk)CY#2J9eeAt)mh zi5vt(BN`}Ci!=sCSxh@4zGCzs?$II>Vkwd}-i@oCy!&zdk+ZAMkOqVUqQo&W;EQ8K z(!#+Y5SdchPeDon8dx(4}44 zh%XDzFCPN=A38Zj*a&nTlRkLC@8g-_c{KG!y zDY{9RJ{dfz=J2^CsU}nOnJ~dp^aYPPfk%2}tS#O1F0ov{(O^y;e>ZKGBmbx$G+!?i za1@3iHpGjB?W|3L{**`-ntHa<-nJBfNmSE`kwvLwlKKfmBiUaCf{V{@mF-t=-)k4~ zMZ#}H?P9r!ukSTvsCh5`a^1QU4)eoSA(zVlNB9$C7k~1%E2hej41AVWStge&v_hYu z3!1*P%kd=ch_AiX*s^Pj_1o6VoBnju)-7*ZFYWsNmhFGGW#=Dn-mzf*ed3QIYL8<6 HUwHow$&B)p diff --git a/_wip/Popeye (JU) (PRG 0)/copilot/prg.s b/_wip/Popeye (JU) (PRG 0)/copilot/prg.s new file mode 100644 index 0000000..2c97dec --- /dev/null +++ b/_wip/Popeye (JU) (PRG 0)/copilot/prg.s @@ -0,0 +1,12 @@ +; Popeye (JU) (PRG 0) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Popeye (JU) (PRG 0)/copilot/reconstructed.lbl b/_wip/Popeye (JU) (PRG 0)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Popeye (JU) (PRG 0)/copilot/reconstructed.map b/_wip/Popeye (JU) (PRG 0)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Popeye (JU) (PRG 0)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Popeye (JU) (PRG 0)/copilot/reconstructed_prg.bin b/_wip/Popeye (JU) (PRG 0)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..a2711a6fb9ec8374fab19eef6c6843007cd4eb92 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/Popeye (JU) (PRG 0)/copilot/symbols.inc b/_wip/Popeye (JU) (PRG 0)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Popeye (JU) (PRG 0)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_wip/Popeye (JU) (PRG 1)/OVERVIEW.md b/_wip/Popeye (JU) (PRG 1)/OVERVIEW.md new file mode 100644 index 0000000..f13c207 --- /dev/null +++ b/_wip/Popeye (JU) (PRG 1)/OVERVIEW.md @@ -0,0 +1,55 @@ +# Popeye (JU) (PRG 1) — Skeleton Project + +ROM: `_wip/Popeye (JU) (PRG 1)/Popeye (JU) (PRG 1) [!].nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + +**Companion note:** `Popeye (JU) (PRG 0)` holds a different PRG image of the same title (different mirroring flag, too). Neither is currently known to be a superset of the other. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Vertical | +| Battery-backed flag | clear | +| ROM SHA-256 | `0016065132a2dc98afb1181a735edcb9c656b0b89af4e0771e94807ba67bd8b4` | +| PRG SHA-256 | `72f06b36f4e908e15639564e83a32e0afe680189e82f0f9d7fa5a9fadaa2e646` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C701` | per-frame heartbeat | +| RESET | `$C649` | enters at $C649 inside the first pages (the Donkey Kong Jr.-style non-$C000 entry) | +| IRQ | `$FFF0` | lands in the vector-page padding — unused placeholder | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Popeye (JU) (PRG 1) [!].nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Popeye (JU) (PRG 1)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C649) and NMI ($C701), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_ROMS/Popeye (JU) (PRG 1) [!].nes b/_wip/Popeye (JU) (PRG 1)/Popeye (JU) (PRG 1) [!].nes similarity index 100% rename from _ROMS/Popeye (JU) (PRG 1) [!].nes rename to _wip/Popeye (JU) (PRG 1)/Popeye (JU) (PRG 1) [!].nes diff --git a/_wip/Popeye (JU) (PRG 1)/copilot/Makefile b/_wip/Popeye (JU) (PRG 1)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Popeye (JU) (PRG 1)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Popeye (JU) (PRG 1)/copilot/chr.bin b/_wip/Popeye (JU) (PRG 1)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..3b34ba114908076ca3ec50d524504461bb805a6c GIT binary patch literal 8192 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

mkW!rMKx8uBoVtOE5?+-`rOm~vX- zf?0)wrQ~)*(97AHIhd&#>SueT&kg{m7DEM68gYyQUe0baQGFOho-TxdK-3`_q!pu= z&w@b3?xBJc%sjlKR=ouj4gzbQsUkPz8R{X06_4yy_G2QB058!6)l$V}U#i{Z?rK+{ z>`8i{NB5@Qa__LgMF;8ak$Y&y`X18SFM>TQSJsgpO+70c>ZGDCqO(qb!8s&nnM=w$ zlh?$Rdqi!I{E}vnoL|a~8bx3g@7WinpjBL?iUSUallOuh-Q=tiv$?o@pqftR0&F)5+r2Je zq7!>XeO&$@H9<`NQU0g)fVkqMwB$>9B!o*OBawv$jtFLbJF9$_HW)-c4fZ||Wh7`5 zA^29UdoZiH02TlsLIKH=7Jez;rm@Wh)N)`kJm6h-xid9baWGw4qPT4j3=>sSzCmF< z)Dn-DJEvH*;d1A?TeQK{#?eZiPLj$?7r8^qX&44-E?^xPUU7R_9%7EHWZ0uaYy4hR zQE2!hv45Bm9TKEYmWOMxVOE1fLaKOkh=_JAeri~}nc zq=>3XehqslM~)#iXz?YeY$Xc{j0?yDk4#OeY+KLqvVA?z%Z~K|l?_kBZ>^bfss>Ui9y*xcropa67gC%Zzs+ZVEjz^{n(x&*lE}B zTyv2%$5hj;MWQ;~E3TFs+H8oACa+UAat}$}KB*jp8 zzen%glvHJLH9%0*l!El4bUCXRsl^(C?X_aedBsIoqKI~k)v@AFbSc|u2E7KTHcwVciIfBpL#-4`&Z)h1%vNy16-t(i!aiR-_TqQwRzll7 z@;flcHsF#s6GjeUL3r^cRlM~qya66^<02B^uX{==@1h(0h$W-oXiAg96nRyd*txhn$QFC^L^%PTPy!#X4M20W(iN3dhBT8ii)z!MWfP zrF}3=Z#S^u9W1XQHWzy(OCngMZt%5^?A7O-g{l|HOW10!!$G{8?n@jTmWKW61o3Yw z`Wqy9KR7)}y{F8~!;p)lRencx$xFbe)r7_N(yQKQ3m**i!XOs4lQ?3(nk<%m1(SR9 zE64!19}Akd--F)j03}yEa#nN5^ZTsSdMP3bYM0>a@-Wo`4iBq*t*XxIGlCW@3_};& zwqNTeudJJI>1doEHfW}>pz+~&)d-eEL0AgXS)O0F(voCc2@pOkpjnJIZ+yLcIBbWj zaCpU1in>K{(eY1tFlN3wL{3%j#<;1`aa}qVa63xk>hL6Audo`z_!!#=q^vY|Kb9$9 z>~%OQJIGT^cd6aMy1SHIj9`JTydy8ETOBe;oeqm}hpCiSL4iRb6d2;?vxKWc@$DdS zhs90+Ssg4Azugb!vYXBi>p6fKMzzxV(R9p zm&s{ZwEzQ)_>x*_#dS!RNCej!MVHzx(NRrl zt*3^w9fc7n)XwdF&i$#+Q4f%CP4g;6F7*t*UgRoz)UUU3l@5*=Q3s1n1UQ&;_JYA9 z!ODn-HZf>|&ARoh?mie>NvpzvUVXqr91+3|K2B)>GmZicJZ4D#SV*o(o)0fU8t{!g zKV6BeKg6v+%GH0OFl%-&YpR$vDzoMw6U@5&jNFK=m?0k*m{mg&_4IS9$o1?JY0h3c zg9c1>jYr<1-huhvDlZ9_hx&y5KAXHW>j;twYS3{D8oFmT9e)wPr2+9p33RQ?QnbMeM0v89O? zw5 z;$n)@6+(;w_9UYT%}qw>{%`9UWhPeTYr@Hlc%)g2k&V_Ikr=a!gAC3qmPSE~Z;aJU zjd2>^n51$I4Kn17>S4uf&{gp~-G)JOHYdNN_7*FesT7K3KfoX&Pc5rielf+Q@#3%F zdgNnj989LD8O3`Ksv5PPnn8^D0jq3~Vh*D0MpN}c?6?bHeg&WqAN$S|Tq>_nhc>!> zG4)I9mr7~h!Dy@~D}wGM)-CmQhu*G$6`&SU2$(QF+ZmGSU3R_(8eL`Kx+_Y4= zMf|8)+RzMoej_hpgo|VWlwbvpNV?nhl^nr_5m6R_9})0lA^4#hq-%6Iv%C<7I4Nw_ z;^1+{$a#d5c6=x2>6ZDL^!|6)1$jjvUOCU2=_MS=107~qE*8}sx-SSX0ViIAuBkTZ z{CDBS?IkT1CDe18x!x?B$47`6N5m!8Ofy*`hTw5)&7gDN(n-+SMWK0G1 zY&zPheps4r!q)pX`nE7QRnCF*aq=Q6Ee?563a<%r z-gp)>UTn==N|q{vC~bL^ibdfRi=kFUMxl2ZsYnLtN!5I>mRYrL6BO*U;=*I@`B4zNODr z`(w5i3a=Uiw@O9d2L$@)qhr9SBA?T9vGQ9uJNA?|e@`=(j-aeHmLm)5WaYOZSut{)IIa=Aqr9waj1;^0P-8j$8?uJhGUD7j3GqVN^wIowvosW;<)4T z^Hc=HyN-(w9|!pJ0a1QEY_xCzOa2YWJ#5dt*!G;%CGA6FPJn6E?N9J-%?8yL)WPyQ zDK6F2crg^)cq-&Je%K86R zgc&uhlYTl)@yYK~*OI(X#r+pu+daIz&v$$`OMc{n`4ay!k+>r&4omsFmr zBXN}%tB6@Awg|^~Xeo(ng0|{YLXY}lxj1}LH{ubw82mAaTMq~3%IjdRxWMcA9JtxE zt_UK75icUNh0r!)kaAJ#nRrr!6_ksyoiGsFWIb$61I*DVx6DT4+^}ewP3u6aXqgi3 zpmhjaEJo#D(uKoH4i$r+P6ywUi{LjZ#c&&SJ|)Pj;Wn;!aDKPc>xjHM^^A!Ya^>SG z_mbm9#^dC8(|gfB`Mq$0MSx#T)=>`_=3yA6XcCouIc(dhdwB>1$mdekQ?=8h`WfpaDr< zlC0>Gb499XR7}>)5}ZZK{5S-ea4u1}^+!1BkVCW>Wb@;LGgLvh^a+(ycVZKMVkbP; z>y2g8Q7C&Fg^ja=Nn4o09kSB7s<5hQcGD;FjEoX^zlri}#7t8RC6%#tQr}~hF?GTC z^@llmGz`8VE8`7BL6DpRSH4;WGw{JNEC-eJQY!Y3$)$B4S&VX-^y)GBBWsSCd<3uO zg{rzT7_%3vP>TX7130Fm8JkL^<;Utv3NlLMlEdY-AzHEiSUBV})t5xaqHtnzb5ki! z^DE3ePIF*Q9FB=$MNLK+b{Gz3A_rZD&PrF0c>!YQQtn-Er)RHPh&Mhl5M?{CI&pk2e;T zhikyrBQ-d1p>Tp0PSQfL(Jhxh&#xvPmR%3sYwf2@QEB=@-mN zO{wB7eYP-F2s@>onIv^Pu{`w>(?Ak8nznExiMrgd(fUy34b~U9!iJCmSkcOp1o2vQ ze2D*=Ly$iRFq-1Zt01YSiX&JC>Dd!{8tYzjgeyM?@f;^Di*|xvVpQ%&NlD)rx8^X1 zu5w~V#({&D?$J4vR}Fl=N{dPPPhpj`QPx%CG05}6$L00*M6r7AWkgw}kET)rsh8F2E?GGh+6m#JO2@sPo?75U-_il3=-f58brXUTsG? z{O^s>e-Fg-o+C#&{9lOBe@~!Q-lBDt-CD{;at-B~rycaI#hW^N{%MQ?L~b{{R^ETY82&K=WY>A^eZp!8CcxZ||E4QCAm zauD7rP_0U&ezWveQvuYPZNe6)#2`$}(9q9)>IB71?hDRAoF{C>IbonLrhsl>b4m)* ztXTeqLt z!oZ$)BwPcIhX(qf?@}71rKhQvwFq}E?uGi1ga!mCOGzG%^7M$b0H-7WgJ@q*){*zf zJLCfr1kf71CNUw>bUR#SU*1~kEYrissuTk}^i}AC9v@=+rQ5KveSf;SB^6g8N`sTe zR=l^COTgd3(!L16 zBQM1+qq|y@2=A$!PTQWMZS9^|v<>g1JjDT~!8((h$u3u~`rs@Uct{d`djvPes3i3< zkQmvZZw&&Br8P5Vw|bqJZR;rkIV&4e)er1YS@szg-^NnZ9W^Cw_9!T_}M(OY)U;P6qC51P?T;h z%H%eh(UpRYcT*elj|G3*G3aY z$b`ja{}`j{4|w&M2LVb!W=X6ZOUX5nSd1?-00FTy?q?!QeT@1e#ilb4JM=X0=r%bC zTrxrBR-Tm}Ig9k=vtr3v>FKjg(~zpzJz)yz2|Y=A?reZIQ?AKLu$k!21$c4M*)4GK znZie#8)$~5nLk?Bqcz&3*UOLAJ?@LslIo`787uvGR-S^2?($=G|In+SxLN&oR2UG` zKvV!S0hhT1am-U}v1Sd$6{waXn2=)W#@PbRSX9RWlEKV8fh!0>(15H3dx$P$)*POS z8BSVwLo>r8is#DSgEv$5KD-&Y?zf#qO{JguHydiiq35*Q0!!$tJ_{FEEF0lN;x(Gq zEo{^}7tnXM({R)fKnz|C6~KX9Me$VzY41&XZ=;efZ8)dben@M}^jfnrhQ9KZr;)d) zkM(;nsoiLdXsBDQ{wl8o?zk#eyS2)w^^*>rt1@U}6|eQww`(2^$>Q~MS^|B4;)==J zgpsDU&{?~K^G~kSgrK!C7r}pKY$F|`J$6O#?Urts?$yTt%HcpcxE-aS^#`7q)Ki0GcW9i-|OG;vxN+O&f?$kZK;)=Ha zz?{-2t%b{n1M_;$ptPhb_36#c1>xK2e7)$y8VECsV>})wqg}7YhXLalpD|s0^L)1T3}gApgHJdJ_mRs`VX9h>57{2P(D0XBN(^cVTacQ` ziVt5XS>b}{qJ{zy!|n=^Nl8Mn9?Pv4be|U$%j;S7m~4P>$8F@S0L!@(wVr}>EHDS& z7`Je`3FI*{=B^JcQ^X(up?M*igMuPcFQ`AG8bezZF_Q)%m`oP2OlMfAu<-;`Y+hMyczj6e z#0?jkaeMrx^vW)7!ekhkjO+o+)l2z|0MBQ8r#z;xQ(@7yD=Q zX-=0dv3!Wr7lv4}%|1gc*MMC(#8Q|Taku(wYSABa_=pp!#H*jl^m9SEBOabWM8zAL zd>*$kU&xP%B>(^IY!aeh>m^WsYxWP2_iD^$f>3Q-gv3lGT@%XqYHV(HP z_kA%BJn-OylOBA)Hr+U5!i1d1ZA*;zJ0E>4!?qzNZTg6ZADNtHtLEJI+K%rYYCFMY zkG307vfKFT`$i47kD~dfY3)*)+Yqg#@OBF8ps)_nn3gtV$Z*Gf(+1i4KlqS6iJSer zz0ad*_B(2;?5^6Kb{Y9HVdOohn(iK9-y^sNJDot#Vj6bWP^WV!(8QZugJ~AX(9bc@ zFnq`m#~=fciffFso_p@OS>leEsnarNW?_ck*De$f|+}-I?XmE z1~Yx|!3Q3&{nPk2X~Kkwwl&84)5kkAY&%S8PmdWpa$H)P?GWc0Y`cNEUgw70W$%HK z{ce7E>YX+AsWksOt$ml~K8w~;csqr4P*?|GhYU%xv+S+*#q6z)r>1@ASd4qav=5nk z88P0{B_`hDN{a6~0JkkE-ZeZazBBH=!(-x;l5JS($&Q9m7RNyoKAUEl$&+PAV>D|- zw%H`hGQ;G_^8ancLxwpoz94?}#mizX+ebV>XC9yU=8Cu8T=5V6`PQ2+*#=ISWV?%f z-L`?-xY1U8f10g?9ce2^`YAiY_Bp%Jwws-6`+@zyc7_}FitQQ~7;TSb=h}PlA2>5! zu=nLhrlrlZ4;Y_jAH=S=4;!0iAHk1&FKx1Y9Dp9=Uv|Dq?2pq=u+EfhHz=A ztuEp7?d6|-hR5fhV+`9Nv^2$k{K==EMR9-piLG^XshzVt`j``VQQba*y}L1ee8z_# z!mOk{{79O;&%|x^{@lMS?YE68wGWv95i^b%yZg=|_OXdNay&{)Y0f^?0Bd2Ni9v2o z;Nws1uk+M$*z@E6n81z-2po*a9($1Aw(Zl;>?P^j>|41{>+IX_PqTk!fQH-a6Mv^3 zxY4BRc2nY?CxF`P24J@zH{drV4$eS-Rw5++c`~2YIeLJqp$<$YZDE?D&xCCbIvK}c z?%(x}q4%db?$+%W%;A682TM}-eqE9V+LDu8E*HJ;?Z){~uIh{9-9&NjsI+3Aeo07yjqrac1;7+s^z~ zO`JU?iTf*zJ?Fn_;_PzAGi5k&MOpGOuFj1;1`q`*-i7rr@*Ni#KNmhSJiBL0(uSm_;s&W{nc5c--Rh3o6Rqt1Ms}}Ao-MI?Cip$#h(9U~z_S_j? zb))J+)iM0=s$cch>V4Hg{5EaG&eokrch=T_RQGe;dvz1)*xHKPVKrB3{!{aY{v$`L zOE8){^`F!`Ek=m9x;)NwlW*la|0-I$?p+)Ly27`;0v9Vn+Qt& z826hje%RpiGHy?vhM4E2z+3)8yk{DArT!8=^tk65YCEBp_=(bAuLUPx##bZHp_qC_ zor(4Vdard#f3*Q6uqCk6zZRu~OJPfh z&xrMv?ERE}ODK3h70Nyp!n{8ZYyBo&>q>MpftXxns5k_Z(>ALmH>2kN$H4JVsq%a{J@+ekQ-DUFDzgeI&2s;L{@tLVhVqJ@pIu#q2e^ z2c+N~pBof?1nJ!%Xq)6#)kH31J$biBzC5;7v&yaHvfK*6tr!v^zbbc=-ypPCAhd;o zI$-0kO}}pWO*?9_K!1uWrd;*%cAE)=GY@*xOo++v^o7_O+7VD%4hTrQ)kraZU9Qb?vj-DL!-s<51PhxU%u8=Ga>#sJ)x6ZuyNi z6baUxh}n!!(dkb_Ol}G`@rvidHX(}B&xb|GLjSy|q$z!YM0sBopcW=2A0$#XBzNtZ z(Dzo8&D7Sqc%VhRvG8uohc}qM%+(uA2TSiZrjun{8`H%!r)?6$(8rRs)83o5ZteS{ zrcGZrJwFgl#|5WP3rt)49-0C(N5w3qFo9sqQZAoc%;lQn7bglruGu7*7MqtO{-5gd zxOPy}V!=!y`wD&Sz3shwcJI=?XK#C7!IWpt=a%5NaZL5f?a{w=Ti0!+xtF)Uj3^n+ zJ@oMQS)*2N-&(x=Q@!wE$7xf0PUBXteEiXe9({c3krRhc>^gno=!v60)*QukqUJOm zC!bluE$+`p|1u`_AL!zFe%WAL9M>Ng#|<6qS~4)Ne_;Bwb@>}-On+~A{i^#$(b*cl_~MIj&8~u#d%}CZs@Zch{bJ7-yK2z%#h#jd zE4Tmuz%W8Wr(S|7V_H7*MR?b^NpCXaqNP2+g}(wuz>?E?h8gu3LpFWB7~BNII6j*8 zpO}%sWsDldjf$oj{FpJ^n6xx5Et-xTMPWydG{No_yu}1y%zajG*K}o literal 0 HcmV?d00001 diff --git a/_wip/Popeye (JU) (PRG 1)/copilot/prg.s b/_wip/Popeye (JU) (PRG 1)/copilot/prg.s new file mode 100644 index 0000000..1ad00a9 --- /dev/null +++ b/_wip/Popeye (JU) (PRG 1)/copilot/prg.s @@ -0,0 +1,12 @@ +; Popeye (JU) (PRG 1) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Popeye (JU) (PRG 1)/copilot/reconstructed.lbl b/_wip/Popeye (JU) (PRG 1)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Popeye (JU) (PRG 1)/copilot/reconstructed.map b/_wip/Popeye (JU) (PRG 1)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Popeye (JU) (PRG 1)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Popeye (JU) (PRG 1)/copilot/reconstructed_prg.bin b/_wip/Popeye (JU) (PRG 1)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..cd2800ddcc4a780891d9a9bcb072efa193bcd57d GIT binary patch literal 16384 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

mkW!rMKx8uBoVtOE5?+-`rOm~vX- zf?0)wrQ~)*(97AHIhd&#>SueT&kg{m7DEM68gYyQUe0baQGFOho-TxdK-3`_q!pu= z&w@b3?xBJc%sjlKR=ouj4gzbQsUkPz8R{X06_4yy_G2QB058!6)l$V}U#i{Z?rK+{ z>`8i{NB5@Qa__LgMF;8ak$Y&y`X18SFM>TQSJsgpO+70c>ZGDCqO(qb!8s&nnM=w$ zlh?$Rdqi!I{E}vnoL|a~8bx3g@7WinpjBL?iUSUallOuh-Q=tiv$?o@pqftR0&F)5+r2Je zq7!>XeO&$@H9<`NQU0g)fVkqMwB$>9B!o*OBawv$jtFLbJF9$_HW)-c4fZ||Wh7`5 zA^29UdoZiH02TlsLIKH=7Jez;rm@Wh)N)`kJm6h-xid9baWGw4qPT4j3=>sSzCmF< z)Dn-DJEvH*;d1A?TeQK{#?eZiPLj$?7r8^qX&44-E?^xPUU7R_9%7EHWZ0uaYy4hR zQE2!hv45Bm9TKEYmWOMxVOE1fLaKOkh=_JAeri~}nc zq=>3XehqslM~)#iXz?YeY$Xc{j0?yDk4#OeY+KLqvVA?z%Z~K|l?_kBZ>^bfss>Ui9y*xcropa67gC%Zzs+ZVEjz^{n(x&*lE}B zTyv2%$5hj;MWQ;~E3TFs+H8oACa+UAat}$}KB*jp8 zzen%glvHJLH9%0*l!El4bUCXRsl^(C?X_aedBsIoqKI~k)v@AFbSc|u2E7KTHcwVciIfBpL#-4`&Z)h1%vNy16-t(i!aiR-_TqQwRzll7 z@;flcHsF#s6GjeUL3r^cRlM~qya66^<02B^uX{==@1h(0h$W-oXiAg96nRyd*txhn$QFC^L^%PTPy!#X4M20W(iN3dhBT8ii)z!MWfP zrF}3=Z#S^u9W1XQHWzy(OCngMZt%5^?A7O-g{l|HOW10!!$G{8?n@jTmWKW61o3Yw z`Wqy9KR7)}y{F8~!;p)lRencx$xFbe)r7_N(yQKQ3m**i!XOs4lQ?3(nk<%m1(SR9 zE64!19}Akd--F)j03}yEa#nN5^ZTsSdMP3bYM0>a@-Wo`4iBq*t*XxIGlCW@3_};& zwqNTeudJJI>1doEHfW}>pz+~&)d-eEL0AgXS)O0F(voCc2@pOkpjnJIZ+yLcIBbWj zaCpU1in>K{(eY1tFlN3wL{3%j#<;1`aa}qVa63xk>hL6Audo`z_!!#=q^vY|Kb9$9 z>~%OQJIGT^cd6aMy1SHIj9`JTydy8ETOBe;oeqm}hpCiSL4iRb6d2;?vxKWc@$DdS zhs90+Ssg4Azugb!vYXBi>p6fKMzzxV(R9p zm&s{ZwEzQ)_>x*_#dS!RNCej!MVHzx(NRrl zt*3^w9fc7n)XwdF&i$#+Q4f%CP4g;6F7*t*UgRoz)UUU3l@5*=Q3s1n1UQ&;_JYA9 z!ODn-HZf>|&ARoh?mie>NvpzvUVXqr91+3|K2B)>GmZicJZ4D#SV*o(o)0fU8t{!g zKV6BeKg6v+%GH0OFl%-&YpR$vDzoMw6U@5&jNFK=m?0k*m{mg&_4IS9$o1?JY0h3c zg9c1>jYr<1-huhvDlZ9_hx&y5KAXHW>j;twYS3{D8oFmT9e)wPr2+9p33RQ?QnbMeM0v89O? zw5 z;$n)@6+(;w_9UYT%}qw>{%`9UWhPeTYr@Hlc%)g2k&V_Ikr=a!gAC3qmPSE~Z;aJU zjd2>^n51$I4Kn17>S4uf&{gp~-G)JOHYdNN_7*FesT7K3KfoX&Pc5rielf+Q@#3%F zdgNnj989LD8O3`Ksv5PPnn8^D0jq3~Vh*D0MpN}c?6?bHeg&WqAN$S|Tq>_nhc>!> zG4)I9mr7~h!Dy@~D}wGM)-CmQhu*G$6`&SU2$(QF+ZmGSU3R_(8eL`Kx+_Y4= zMf|8)+RzMoej_hpgo|VWlwbvpNV?nhl^nr_5m6R_9})0lA^4#hq-%6Iv%C<7I4Nw_ z;^1+{$a#d5c6=x2>6ZDL^!|6)1$jjvUOCU2=_MS=107~qE*8}sx-SSX0ViIAuBkTZ z{CDBS?IkT1CDe18x!x?B$47`6N5m!8Ofy*`hTw5)&7gDN(n-+SMWK0G1 zY&zPheps4r!q)pX`nE7QRnCF*aq=Q6Ee?563a<%r z-gp)>UTn==N|q{vC~bL^ibdfRi=kFUMxl2ZsYnLtN!5I>mRYrL6BO*U;=*I@`B4zNODr z`(w5i3a=Uiw@O9d2L$@)qhr9SBA?T9vGQ9uJNA?|e@`=(j-aeHmLm)5WaYOZSut{)IIa=Aqr9waj1;^0P-8j$8?uJhGUD7j3GqVN^wIowvosW;<)4T z^Hc=HyN-(w9|!pJ0a1QEY_xCzOa2YWJ#5dt*!G;%CGA6FPJn6E?N9J-%?8yL)WPyQ zDK6F2crg^)cq-&Je%K86R zgc&uhlYTl)@yYK~*OI(X#r+pu+daIz&v$$`OMc{n`4ay!k+>r&4omsFmr zBXN}%tB6@Awg|^~Xeo(ng0|{YLXY}lxj1}LH{ubw82mAaTMq~3%IjdRxWMcA9JtxE zt_UK75icUNh0r!)kaAJ#nRrr!6_ksyoiGsFWIb$61I*DVx6DT4+^}ewP3u6aXqgi3 zpmhjaEJo#D(uKoH4i$r+P6ywUi{LjZ#c&&SJ|)Pj;Wn;!aDKPc>xjHM^^A!Ya^>SG z_mbm9#^dC8(|gfB`Mq$0MSx#T)=>`_=3yA6XcCouIc(dhdwB>1$mdekQ?=8h`WfpaDr< zlC0>Gb499XR7}>)5}ZZK{5S-ea4u1}^+!1BkVCW>Wb@;LGgLvh^a+(ycVZKMVkbP; z>y2g8Q7C&Fg^ja=Nn4o09kSB7s<5hQcGD;FjEoX^zlri}#7t8RC6%#tQr}~hF?GTC z^@llmGz`8VE8`7BL6DpRSH4;WGw{JNEC-eJQY!Y3$)$B4S&VX-^y)GBBWsSCd<3uO zg{rzT7_%3vP>TX7130Fm8JkL^<;Utv3NlLMlEdY-AzHEiSUBV})t5xaqHtnzb5ki! z^DE3ePIF*Q9FB=$MNLK+b{Gz3A_rZD&PrF0c>!YQQtn-Er)RHPh&Mhl5M?{CI&pk2e;T zhikyrBQ-d1p>Tp0PSQfL(Jhxh&#xvPmR%3sYwf2@QEB=@-mN zO{wB7eYP-F2s@>onIv^Pu{`w>(?Ak8nznExiMrgd(fUy34b~U9!iJCmSkcOp1o2vQ ze2D*=Ly$iRFq-1Zt01YSiX&JC>Dd!{8tYzjgeyM?@f;^Di*|xvVpQ%&NlD)rx8^X1 zu5w~V#({&D?$J4vR}Fl=N{dPPPhpj`QPx%CG05}6$L00*M6r7AWkgw}kET)rsh8F2E?GGh+6m#JO2@sPo?75U-_il3=-f58brXUTsG? z{O^s>e-Fg-o+C#&{9lOBe@~!Q-lBDt-CD{;at-B~rycaI#hW^N{%MQ?L~b{{R^ETY82&K=WY>A^eZp!8CcxZ||E4QCAm zauD7rP_0U&ezWveQvuYPZNe6)#2`$}(9q9)>IB71?hDRAoF{C>IbonLrhsl>b4m)* ztXTeqLt z!oZ$)BwPcIhX(qf?@}71rKhQvwFq}E?uGi1ga!mCOGzG%^7M$b0H-7WgJ@q*){*zf zJLCfr1kf71CNUw>bUR#SU*1~kEYrissuTk}^i}AC9v@=+rQ5KveSf;SB^6g8N`sTe zR=l^COTgd3(!L16 zBQM1+qq|y@2=A$!PTQWMZS9^|v<>g1JjDT~!8((h$u3u~`rs@Uct{d`djvPes3i3< zkQmvZZw&&Br8P5Vw|bqJZR;rkIV&4e)er1YS@szg-^NnZ9W^Cw_9!T_}M(OY)U;P6qC51P?T;h z%H%eh(UpRYcT*elj|G3*G3aY z$b`ja{}`j{4|w&M2LVb!W=X6ZOUX5nSd1?-00FTy?q?!QeT@1e#ilb4JM=X0=r%bC zTrxrBR-Tm}Ig9k=vtr3v>FKjg(~zpzJz)yz2|Y=A?reZIQ?AKLu$k!21$c4M*)4GK znZie#8)$~5nLk?Bqcz&3*UOLAJ?@LslIo`787uvGR-S^2?($=G|In+SxLN&oR2UG` zKvV!S0hhT1am-U}v1Sd$6{waXn2=)W#@PbRSX9RWlEKV8fh!0>(15H3dx$P$)*POS z8BSVwLo>r8is#DSgEv$5KD-&Y?zf#qO{JguHydiiq35*Q0!!$tJ_{FEEF0lN;x(Gq zEo{^}7tnXM({R)fKnz|C6~KX9Me$VzY41&XZ=;efZ8)dben@M}^jfnrhQ9KZr;)d) zkM(;nsoiLdXsBDQ{wl8o?zk#eyS2)w^^*>rt1@U}6|eQww`(2^$>Q~MS^|B4;)==J zgpsDU&{?~K^G~kSgrK!C7r}pKY$F|`J$6O#?Urts?$yTt%HcpcxE-aS^#`7q)Ki0GcW9i-|OG;vxN+O&f?$kZK;)=Ha zz?{-2t%b{n1M_;$ptPhb_36#c1>xK2e7)$y8VECsV>})wqg}7YhXLalpD|s0^L)1T3}gApgHJdJ_mRs`VX9h>57{2P(D0XBN(^cVTacQ` ziVt5XS>b}{qJ{zy!|n=^Nl8Mn9?Pv4be|U$%j;S7m~4P>$8F@S0L!@(wVr}>EHDS& z7`Je`3FI*{=B^JcQ^X(up?M*igMuPcFQ`AG8bezZF_Q)%m`oP2OlMfAu<-;`Y+hMyczj6e z#0?jkaeMrx^vW)7!ekhkjO+o+)l2z|0MBQ8r#z;xQ(@7yD=Q zX-=0dv3!Wr7lv4}%|1gc*MMC(#8Q|Taku(wYSABa_=pp!#H*jl^m9SEBOabWM8zAL zd>*$kU&xP%B>(^IY!aeh>m^WsYxWP2_iD^$f>3Q-gv3lGT@%XqYHV(HP z_kA%BJn-OylOBA)Hr+U5!i1d1ZA*;zJ0E>4!?qzNZTg6ZADNtHtLEJI+K%rYYCFMY zkG307vfKFT`$i47kD~dfY3)*)+Yqg#@OBF8ps)_nn3gtV$Z*Gf(+1i4KlqS6iJSer zz0ad*_B(2;?5^6Kb{Y9HVdOohn(iK9-y^sNJDot#Vj6bWP^WV!(8QZugJ~AX(9bc@ zFnq`m#~=fciffFso_p@OS>leEsnarNW?_ck*De$f|+}-I?XmE z1~Yx|!3Q3&{nPk2X~Kkwwl&84)5kkAY&%S8PmdWpa$H)P?GWc0Y`cNEUgw70W$%HK z{ce7E>YX+AsWksOt$ml~K8w~;csqr4P*?|GhYU%xv+S+*#q6z)r>1@ASd4qav=5nk z88P0{B_`hDN{a6~0JkkE-ZeZazBBH=!(-x;l5JS($&Q9m7RNyoKAUEl$&+PAV>D|- zw%H`hGQ;G_^8ancLxwpoz94?}#mizX+ebV>XC9yU=8Cu8T=5V6`PQ2+*#=ISWV?%f z-L`?-xY1U8f10g?9ce2^`YAiY_Bp%Jwws-6`+@zyc7_}FitQQ~7;TSb=h}PlA2>5! zu=nLhrlrlZ4;Y_jAH=S=4;!0iAHk1&FKx1Y9Dp9=Uv|Dq?2pq=u+EfhHz=A ztuEp7?d6|-hR5fhV+`9Nv^2$k{K==EMR9-piLG^XshzVt`j``VQQba*y}L1ee8z_# z!mOk{{79O;&%|x^{@lMS?YE68wGWv95i^b%yZg=|_OXdNay&{)Y0f^?0Bd2Ni9v2o z;Nws1uk+M$*z@E6n81z-2po*a9($1Aw(Zl;>?P^j>|41{>+IX_PqTk!fQH-a6Mv^3 zxY4BRc2nY?CxF`P24J@zH{drV4$eS-Rw5++c`~2YIeLJqp$<$YZDE?D&xCCbIvK}c z?%(x}q4%db?$+%W%;A682TM}-eqE9V+LDu8E*HJ;?Z){~uIh{9-9&NjsI+3Aeo07yjqrac1;7+s^z~ zO`JU?iTf*zJ?Fn_;_PzAGi5k&MOpGOuFj1;1`q`*-i7rr@*Ni#KNmhSJiBL0(uSm_;s&W{nc5c--Rh3o6Rqt1Ms}}Ao-MI?Cip$#h(9U~z_S_j? zb))J+)iM0=s$cch>V4Hg{5EaG&eokrch=T_RQGe;dvz1)*xHKPVKrB3{!{aY{v$`L zOE8){^`F!`Ek=m9x;)NwlW*la|0-I$?p+)Ly27`;0v9Vn+Qt& z826hje%RpiGHy?vhM4E2z+3)8yk{DArT!8=^tk65YCEBp_=(bAuLUPx##bZHp_qC_ zor(4Vdard#f3*Q6uqCk6zZRu~OJPfh z&xrMv?ERE}ODK3h70Nyp!n{8ZYyBo&>q>MpftXxns5k_Z(>ALmH>2kN$H4JVsq%a{J@+ekQ-DUFDzgeI&2s;L{@tLVhVqJ@pIu#q2e^ z2c+N~pBof?1nJ!%Xq)6#)kH31J$biBzC5;7v&yaHvfK*6tr!v^zbbc=-ypPCAhd;o zI$-0kO}}pWO*?9_K!1uWrd;*%cAE)=GY@*xOo++v^o7_O+7VD%4hTrQ)kraZU9Qb?vj-DL!-s<51PhxU%u8=Ga>#sJ)x6ZuyNi z6baUxh}n!!(dkb_Ol}G`@rvidHX(}B&xb|GLjSy|q$z!YM0sBopcW=2A0$#XBzNtZ z(Dzo8&D7Sqc%VhRvG8uohc}qM%+(uA2TSiZrjun{8`H%!r)?6$(8rRs)83o5ZteS{ zrcGZrJwFgl#|5WP3rt)49-0C(N5w3qFo9sqQZAoc%;lQn7bglruGu7*7MqtO{-5gd zxOPy}V!=!y`wD&Sz3shwcJI=?XK#C7!IWpt=a%5NaZL5f?a{w=Ti0!+xtF)Uj3^n+ zJ@oMQS)*2N-&(x=Q@!wE$7xf0PUBXteEiXe9({c3krRhc>^gno=!v60)*QukqUJOm zC!bluE$+`p|1u`_AL!zFe%WAL9M>Ng#|<6qS~4)Ne_;Bwb@>}-On+~A{i^#$(b*cl_~MIj&8~u#d%}CZs@Zch{bJ7-yK2z%#h#jd zE4Tmuz%W8Wr(S|7V_H7*MR?b^NpCXaqNP2+g}(wuz>?E?h8gu3LpFWB7~BNII6j*8 zpO}%sWsDldjf$oj{FpJ^n6xx5Et-xTMPWydG{No_yu}1y%zajG*K}o literal 0 HcmV?d00001 diff --git a/_wip/Popeye (JU) (PRG 1)/copilot/symbols.inc b/_wip/Popeye (JU) (PRG 1)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Popeye (JU) (PRG 1)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_wip/Pyramid (U)/OVERVIEW.md b/_wip/Pyramid (U)/OVERVIEW.md new file mode 100644 index 0000000..0067918 --- /dev/null +++ b/_wip/Pyramid (U)/OVERVIEW.md @@ -0,0 +1,53 @@ +# Pyramid (U) — Skeleton Project + +ROM: `_wip/Pyramid (U)/Pyramid (U) (Sachen).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Horizontal | +| Battery-backed flag | clear | +| ROM SHA-256 | `8e042dc55093e47547ff9fa26e7fec2c3fb94ebac0d0686cc8bb6c2749a6066d` | +| PRG SHA-256 | `251688d69009091c4a37e831e0fd6114bb1dc9d1bace98032c1b9a3030b5e378` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$D72E` | per-frame heartbeat | +| RESET | `$FF00` | initial execution at $FF00, inside the last PRG page — unusual; PASS 1 should confirm the true cold-start path | +| IRQ | `$FF00` | redirects to RESET — unused placeholder | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Pyramid (U) (Sachen).nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Pyramid (U)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($FF00) and NMI ($D72E), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_ROMS/Pyramid (U) (Sachen).nes b/_wip/Pyramid (U)/Pyramid (U) (Sachen).nes similarity index 100% rename from _ROMS/Pyramid (U) (Sachen).nes rename to _wip/Pyramid (U)/Pyramid (U) (Sachen).nes diff --git a/_wip/Pyramid (U)/copilot/Makefile b/_wip/Pyramid (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Pyramid (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Pyramid (U)/copilot/chr.bin b/_wip/Pyramid (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..3cd46566fa978c31a0faeb7417ead6fa1179a695 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/_wip/Pyramid (U)/copilot/header.bin b/_wip/Pyramid (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/_wip/Pyramid (U)/copilot/linker.cfg b/_wip/Pyramid (U)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/Pyramid (U)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/Pyramid (U)/copilot/locals.inc b/_wip/Pyramid (U)/copilot/locals.inc new file mode 100644 index 0000000..c87bd35 --- /dev/null +++ b/_wip/Pyramid (U)/copilot/locals.inc @@ -0,0 +1,2 @@ +; Pyramid (U) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/Pyramid (U)/copilot/prg.bin b/_wip/Pyramid (U)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..3f75c8b4857aef62b3465956a5a7415d7dc166da GIT binary patch literal 16384 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 E02Xywo&W#< literal 0 HcmV?d00001 diff --git a/_wip/Pyramid (U)/copilot/prg.s b/_wip/Pyramid (U)/copilot/prg.s new file mode 100644 index 0000000..4c7d459 --- /dev/null +++ b/_wip/Pyramid (U)/copilot/prg.s @@ -0,0 +1,12 @@ +; Pyramid (U) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Pyramid (U)/copilot/reconstructed.lbl b/_wip/Pyramid (U)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Pyramid (U)/copilot/reconstructed.map b/_wip/Pyramid (U)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Pyramid (U)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Pyramid (U)/copilot/reconstructed_prg.bin b/_wip/Pyramid (U)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..3f75c8b4857aef62b3465956a5a7415d7dc166da GIT binary patch literal 16384 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 E02Xywo&W#< literal 0 HcmV?d00001 diff --git a/_wip/Pyramid (U)/copilot/symbols.inc b/_wip/Pyramid (U)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Pyramid (U)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_wip/Raid on Bungeling Bay (U) [a2]/OVERVIEW.md b/_wip/Raid on Bungeling Bay (U) [a2]/OVERVIEW.md new file mode 100644 index 0000000..803dc94 --- /dev/null +++ b/_wip/Raid on Bungeling Bay (U) [a2]/OVERVIEW.md @@ -0,0 +1,55 @@ +# Raid on Bungeling Bay (U) [a2] — Skeleton Project + +ROM: `_wip/Raid on Bungeling Bay (U) [a2]/Raid on Bungeling Bay (U) [a2].nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + +**Revision note:** these are two different PRG images of the same title; `Raid on Bungeling Bay (U)` and this `[a2]` dump differ in PRG content *and* mirroring flag (H vs V). + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Vertical | +| Battery-backed flag | clear | +| ROM SHA-256 | `fe7d426c04627e0e233b0fcec1163d932ff161e20f5d1acbebaa5e9748bf5e17` | +| PRG SHA-256 | `d30a3ea8a3ed0c4a90ab01f784780cf8ac0f0c769aa7f02d8202515b6e80cb53` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C04C` | per-frame heartbeat | +| RESET | `$C000` | cold start at $C000 — the usual pattern in this repo | +| IRQ | `$C2C0` | target $C2C0 — verify during Pass 1 | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Raid on Bungeling Bay (U) [a2].nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Raid on Bungeling Bay (U) [a2]/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C000) and NMI ($C04C), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_ROMS/Raid on Bungeling Bay (U) [a2].nes b/_wip/Raid on Bungeling Bay (U) [a2]/Raid on Bungeling Bay (U) [a2].nes similarity index 100% rename from _ROMS/Raid on Bungeling Bay (U) [a2].nes rename to _wip/Raid on Bungeling Bay (U) [a2]/Raid on Bungeling Bay (U) [a2].nes diff --git a/_wip/Raid on Bungeling Bay (U) [a2]/copilot/Makefile b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Raid on Bungeling Bay (U) [a2]/copilot/chr.bin b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..0a37b247afaf068af1a1e3144baa53b7eff483b9 GIT binary patch literal 8192 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 RKSi(EL@n`l;(vkG{XbTOmAL=_ literal 0 HcmV?d00001 diff --git a/_wip/Raid on Bungeling Bay (U) [a2]/copilot/prg.s b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/prg.s new file mode 100644 index 0000000..6685622 --- /dev/null +++ b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/prg.s @@ -0,0 +1,12 @@ +; Raid on Bungeling Bay (U) [a2] NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Raid on Bungeling Bay (U) [a2]/copilot/reconstructed.lbl b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Raid on Bungeling Bay (U) [a2]/copilot/reconstructed.map b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Raid on Bungeling Bay (U) [a2]/copilot/reconstructed_prg.bin b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..f0543e3249942888a93e09efe382dc1cc847a975 GIT binary patch literal 16384 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 RKSi(EL@n`l;(vkG{XbTOmAL=_ literal 0 HcmV?d00001 diff --git a/_wip/Raid on Bungeling Bay (U) [a2]/copilot/symbols.inc b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Raid on Bungeling Bay (U) [a2]/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_wip/Raid on Bungeling Bay (U)/OVERVIEW.md b/_wip/Raid on Bungeling Bay (U)/OVERVIEW.md new file mode 100644 index 0000000..c016638 --- /dev/null +++ b/_wip/Raid on Bungeling Bay (U)/OVERVIEW.md @@ -0,0 +1,53 @@ +# Raid on Bungeling Bay (U) — Skeleton Project + +ROM: `_wip/Raid on Bungeling Bay (U)/Raid on Bungeling Bay (U).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Horizontal | +| Battery-backed flag | clear | +| ROM SHA-256 | `577ceb8c441276aee3aec3f86a0592c84d57e2f97675dd84b07fd06dc4a3b213` | +| PRG SHA-256 | `46e80cd2d105178efc2adbdd49463421eb455b7729867c352ec8e5fb45d032d8` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C04C` | per-frame heartbeat | +| RESET | `$C000` | cold start at $C000 — the usual pattern in this repo | +| IRQ | `$C2C0` | target $C2C0 — verify during Pass 1 | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Raid on Bungeling Bay (U).nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Raid on Bungeling Bay (U)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C000) and NMI ($C04C), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_ROMS/Raid on Bungeling Bay (U).nes b/_wip/Raid on Bungeling Bay (U)/Raid on Bungeling Bay (U).nes similarity index 100% rename from _ROMS/Raid on Bungeling Bay (U).nes rename to _wip/Raid on Bungeling Bay (U)/Raid on Bungeling Bay (U).nes diff --git a/_wip/Raid on Bungeling Bay (U)/copilot/Makefile b/_wip/Raid on Bungeling Bay (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Raid on Bungeling Bay (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Raid on Bungeling Bay (U)/copilot/chr.bin b/_wip/Raid on Bungeling Bay (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..b0cbff7d3076afd39dda5a59035d39aa5d6da03d GIT binary patch literal 8192 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/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_ROMS/Urban Champion (JU).nes b/_wip/Urban Champion (JU)/Urban Champion (JU).nes similarity index 100% rename from _ROMS/Urban Champion (JU).nes rename to _wip/Urban Champion (JU)/Urban Champion (JU).nes diff --git a/_wip/Urban Champion (JU)/copilot/Makefile b/_wip/Urban Champion (JU)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Urban Champion (JU)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Urban Champion (JU)/copilot/chr.bin b/_wip/Urban Champion (JU)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..1f0b1c8d166ccc5754f87b3d4b6f7ece8295e221 GIT binary patch literal 8192 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 WKhO^`stV^0;5f))?7CsU#QzUkQ5FsW literal 0 HcmV?d00001 diff --git a/_wip/Urban Champion (JU)/copilot/header.bin b/_wip/Urban Champion (JU)/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/_wip/Urban Champion (JU)/copilot/linker.cfg b/_wip/Urban Champion (JU)/copilot/linker.cfg new file mode 100644 index 0000000..d9d421d --- /dev/null +++ b/_wip/Urban Champion (JU)/copilot/linker.cfg @@ -0,0 +1,6 @@ +MEMORY { + PRG: start = $C000, size = $4000, file = %O, fill = yes; +} +SEGMENTS { + PRG: load = PRG, type = ro; +} diff --git a/_wip/Urban Champion (JU)/copilot/locals.inc b/_wip/Urban Champion (JU)/copilot/locals.inc new file mode 100644 index 0000000..43c392b --- /dev/null +++ b/_wip/Urban Champion (JU)/copilot/locals.inc @@ -0,0 +1,2 @@ +; Urban Champion (JU) zero-page aliases (declared during Pass 2). +; These intentionally conservative names will be refined in Passes 2 and 3. diff --git a/_wip/Urban Champion (JU)/copilot/prg.bin b/_wip/Urban Champion (JU)/copilot/prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..6660a601b7d706aa4e26f40a049e7a6004f33e44 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/Urban Champion (JU)/copilot/prg.s b/_wip/Urban Champion (JU)/copilot/prg.s new file mode 100644 index 0000000..46354ef --- /dev/null +++ b/_wip/Urban Champion (JU)/copilot/prg.s @@ -0,0 +1,12 @@ +; Urban Champion (JU) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Urban Champion (JU)/copilot/reconstructed.lbl b/_wip/Urban Champion (JU)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Urban Champion (JU)/copilot/reconstructed.map b/_wip/Urban Champion (JU)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Urban Champion (JU)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Urban Champion (JU)/copilot/reconstructed_prg.bin b/_wip/Urban Champion (JU)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..6660a601b7d706aa4e26f40a049e7a6004f33e44 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/Urban Champion (JU)/copilot/symbols.inc b/_wip/Urban Champion (JU)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Urban Champion (JU)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file diff --git a/_wip/Wild Gunman (U)/OVERVIEW.md b/_wip/Wild Gunman (U)/OVERVIEW.md new file mode 100644 index 0000000..d8d8faf --- /dev/null +++ b/_wip/Wild Gunman (U)/OVERVIEW.md @@ -0,0 +1,53 @@ +# Wild Gunman (U) — Skeleton Project + +ROM: `_wip/Wild Gunman (U)/Wild Gunman (U) [!].nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level. + + +## ROM Facts + +| Property | Value | +|----------|-------| +| Mapper | 0 (NROM) — from the iNES header | +| PRG | 16 KB (header claims map at CPU $C000–$FFFF) | +| CHR | 8 KB | +| Mirroring | Horizontal | +| Battery-backed flag | clear | +| ROM SHA-256 | `bee7de2cad3133ee6414423e904597154e70e85340fcce5c0829e78c996d84fc` | +| PRG SHA-256 | `1d22036e41b62ec7645bcbab7604034449988193ef7ddcd59c168bc39b417690` | + +## Interrupt Vectors (taken from PRG $3FFA–$3FFF) + +| Vector | Target | Note | +|--------|--------|------| +| NMI | `$C086` | per-frame heartbeat | +| RESET | `$C000` | cold start at $C000 — the usual pattern in this repo | +| IRQ | `$C000` | redirects to RESET — unused placeholder | + +## `copilot/` Contents + +| File | Purpose | +|------|---------| +| `Wild Gunman (U) [!].nes` | original ROM image (reference) | +| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` | +| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) | +| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) | +| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) | +| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` | +| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` | +| `reconstructed_prg.bin` | build output from the last verified build | + +Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added. + +## Build + +```bash +cd "_wip/Wild Gunman (U)/copilot" +make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL" +``` + +## Next Steps (per `PROMPTS.md`) + +1. **Pass 1** — replace the blanket `.incbin` with classified code/data: trace reachability from RESET ($C000) and NMI ($C086), emit per-instruction `; PRG:$xxxx AA BB` annotations, keep unreached bytes as explicit `.byte` blocks. +2. **Pass 2** — replace `Label_`/`Sub_` names with semantic routine names; fill `locals.inc`. +3. **Pass 3** — name data tables/structures; release provisional flags. +4. **Promotion** — move to a top-level `/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory. diff --git a/_ROMS/Wild Gunman (U) [!].nes b/_wip/Wild Gunman (U)/Wild Gunman (U) [!].nes similarity index 100% rename from _ROMS/Wild Gunman (U) [!].nes rename to _wip/Wild Gunman (U)/Wild Gunman (U) [!].nes diff --git a/_wip/Wild Gunman (U)/copilot/Makefile b/_wip/Wild Gunman (U)/copilot/Makefile new file mode 100644 index 0000000..3f9ba6f --- /dev/null +++ b/_wip/Wild Gunman (U)/copilot/Makefile @@ -0,0 +1,10 @@ +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 +clean: + rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl diff --git a/_wip/Wild Gunman (U)/copilot/chr.bin b/_wip/Wild Gunman (U)/copilot/chr.bin new file mode 100644 index 0000000000000000000000000000000000000000..8a6a6dcdeb0a42eedac4832f785fabbc7b62d437 GIT binary patch literal 8192 zcmZu$e{d8>cJ9?IJMw9@vmB0D!?Lp&SMU#Ft%?g;MazzCljExFi%FHMl9Vqe`EUVM zrbOAI@I=QGI=VxU;|*^C_yPqXZN+ zrR$uK>d7e*vpFl81e+BzC^88Joi$Z!3Mh?@cQme$Y}Z@yvy?SYEDwAZ)wk+GWXl~0ksqi4lGUigliEJtsLpk`PGgq!m zO^RlJoexrIde6bU+M?-tnLCsJ^=@BZgCrG-#bTkr7|M1keLfjnl)dS68bfr|p119{ zFHCXga%xJ@c-qAAGX{keASIANzdDKuS5Wq`05U8s|3F-6bw^!>qu)oY@ z(Y;VK462}Hx67j_vh2ze3>rUuRTYC=d^%EgfxYfbYhR2C58J_(hFW4yM6~J5G{=D%L+{ zq(sTJ35W(rFaUYQ3Y2{E^EuL-lxov=9%zk|MG+XQ3xs0nwE6Do5zdDvl&x>QT_{>y zG)j_`C&0L8X3CXi=h~v)wl${6t7Ys9b|^4oSxY_L-3RCGoA%Z2MA(qNCar#9Y(~`& zl*{Ko*xB6uT)F)5hh1sTRUxVzm?AN_D>r~VX{6MYoaosYK+_q z7$3hnJw0s~&{;_6i=;?E$8qIt)0dWR+_+&{oZI<)I+j+ry}zeTZT4dh%mQYTtc0S` zv^O4%pny=Uy52^pBA?IMOKVjvpVzh6yt!1_r#Ht)pTgc^v;DNrG+y68%E8i&n*A3i;+sBK$edZwSIC&cJa+9);v#G0TYJi4{&)3mwv58b+s z;O~2?Dfs+Xj@dlM==N50=_~8$fP%zNg_~%;@24k_9I|0J9 z?|VO3y7B3ar5o!SS2WU(f(&d1dUOGkbC#DK-oHI@u;;mbVTlX^U=)Ob)d$K83kxsg z#d%eqEs)g`+*bDq(-ez9$;hUGX=-ttBHUOUBd}W+DT*(tSWN*W51oHlmyhNY^4z>q z;@p`1Gv?xkFm(*G}H}8Xf?^YU>jt=cHvKPw{CWNs#532g!&>T@i!Jq=8A)~9o)0ZN{ zE+Mj}tqq6IEtWSl->I&{PT{3ku{QvIna<^MHGS!6nn0H7Rs=(#kSuxp`nR{A8j*V0 zB403G8w~p_r#y9hSPhZK!2_R<+ML4!dotFGje&q9>B<3+%Lli`@1t|d82aS=6l~X^ zKoNvu@@X|hx>dz&Qd?tvycXz*(yD&X~?7S%sMnA_oNr>jVz7K{pDm-1g8zYgaNv0Ez)H$Xmt=X@t>{Q~{{VjW&>i+ z)NdM78p47}_2K$C)(hYn35OF2^0glLS@K>#^XuHA^#^=uJ*1}fZs$}X4`X$ZQTF!r z_4W3a#!i1$ww94kwycHyz&OCV(2m$l(+_ua9M@GfM*G|WgF_M^l?;>PopPdMX751x zroCgwj&JSR^UODnA3y%qE3f?Iw?Z^JIECh9k?T=NcQ~D(rupwb`D+NvLf?L7V+CeGSG&574h$&r&X-?)8Vym{r0Kq~qfef;=e*H?yA?!<+&R)87 z^k^`os_9(Trre)O7JiWxFJnuUm(>Y=tzp6Fj1v#9%w!UYa5xP2(zJ)3?aGA^H1TDF z*zY*|x2&!mZdn&OZ+`b!h`HxN)g=+KMRN}MQVPh~1q#U8TD(nb8rhz!KLlQ(N0j6~ zhS6TYFCLGhKRj94OMXJ-fa-RHmDd4?*Artn`=N8#3&jJDJ%~| zae$K7z-Qs}1f}shpQ=nx&EBBCc^av;Z9S+T=(#rb!lBacH>T#zMYy45EiW%tDpFmY zD3LKOlnHljaa)nvRIcrOu1)fJC59l2AdlmfB}-TdgoU70kRA!F9e?mWtb7FyOxTK# zp@g2rw1bR=QWWn;qrFjrNf6`1!%6k zGgCe)FrZf!mzS6A3x62Enmf|Rp$2uLe_|N+g&PBZ)+!)<1{F+uK3p1HmjS zz1-UBYi;GpuF+9vbd*W0t@MwB8U14;M_^q?MtEu$c7Ioj$(vhSTQ|$xI)n9`v6xTO zB)BSfibcCvbgHygrHky;fY#i4(d&-$G30N(`wrjwX3$p_oJ(g%Ss%nD zepoM%qxH2yU|QcO1a|o+lLeB6fc9p2Lo>CXwJw}xhc;_{ix{6hQ_KZ0-j#Q%DsO}d z_GlOE(GGjjU^}|YjiLR1pKm4P8U5ICu8-FC1ML*E*pVYgMxX$`YuBz66u^A5lcjzY z`V2*r8Q8;DVVpZ%Dvg~p)TWkXGSQ^U4XY+6=Ne>demWWr&RgfkN~P214BnJTCR>_R z)-X3YxvD|t^TB9zdfs9c(35i&?gt$W`u`7&y9(H=X&^bo)CeV@Q0H`zpp8*1McCqQ z=B+Y5fe9fGi(^8_!)XG@!)OA?L;VTf!9en0dLa*{r>vb?Wj7R>bU#GhX-=_pcYPJ^ zuFuch^-pkj{c-lyb`poyPvX$}NgP@~i9_or-lbAW=suZ*KaTYFz5|dUJOWU?w|9h7 zolK89Q$%OzjB~D@>d+vkIyC5xUtXRQKo zzbgMoRsK|!K2@b}#Up65tE(2Sgl;=K>6^{5al><)p^=8fc`EuKvf~EGuC=?ZXumJ_ z=9@pen)T?^Ll3<9X70Y~7{*eM9C`iqBafsQxpn03wej}$V)2n}?Q5%OZ+E-4Re`k% zfP@E%JPa!H`;n3f;8H?BKOpd&O9krg+5oIyzdn^edGaI_hbkeCDnO|gWjj9R(MTHN zaTa&m`7qjDc*oYP;2{W)uJf~>cTHdTv-$d3KK7r#dTZ#y-h@Km?1cKrCIOf7`CMw#CP8C- z*M*e5y@!9*YbGyQqD+|t%cRT%c1@GK(;Cb?&C!Ob>=iNKL zUgu+vah$)~Xa4jtZky*m|L@n%{h>0$m&}{|{3}xLqwDJ$5JtY=qMW~`;uJqFF8H|i zQ@7-Y9xY?GkzQXreF}2k@5YR=0+p0`d9i?2E_&FNGS!*nuNO4wf`F%>wTT%)7vo{_ zR|5Gf!ObUTW{|@QRPaFsU6lQ}dKCPK1MzeJkYB}Osbr=o_~Bt$xX*}&YF7ksAKRj| zpo$3%<1v4{2o9KE@W(6g7w~q4WF?6HXh(km#80{l=7^t^f>3-#W&}E(po>_sK8nfI z8R-sHc?jPrRT|$r1yt|BPv^zqzeOt@o!jtpxU~Em>drH`=)()#?V1^)NzYYUsGc6g zn?T=alV@IvH#XMG(ZtR%7EqNbe9Q4g-{qA)+kCc+GPv~CK z$_`(okB7lQ!(hAjHnnW|;wgwrUz0kAycrq}=HN!4c@RAi0Qng5lVK2vJS)QL_+pWt zTm~J`gr!uwiXk-6qpPg&oh)kV?(Y0vj1t&eg*OwG1UQ?3OL30;Vr5@xhVqN+xn$UF zq^E1vt{>bYYjjl=wRl6TVhEic12>G`qUj(A?BBoNYe!YUqpQ=^_z^2&=>eSsV1aj( z04b7JvPb!5z83DyUS-qFJ>1dADbFW(j9dOM2|&W! zCQtyknDq1d2S%Oz?X=*JNo(!Y9}D>Cqw}1fpSbYggVKYW{6S@6LbyjU5l*z=2%`nl zHJaMrk;hYpoSCimrW zFPcn6f1FZrp9Q8P2JW-406J~y>(DE)Bmt5WnYe~K5$0|Jm#Kl?yWqVe_^$Hszypju z01*8VepDxTy~+6r*fQ_%7p2f5dnb>6oWCRN)>A9ZCD?Dqllbt>n^ARN5=rmqJDxDY z@CTr)MK(?4m81FEen8y@uOumh-7#g!=Q-7b#Ye*H5%}-tKQvZT_F=l zM-~kmcSS*eS;rwAm_U>$QKJOIDdE0n)vP4;ddNy5tz@K@H{bnUa2tvlHz_7w@+w)b_BJwN=L(he zJiPLIK?>b2C2V(-QbEF>n<=(=Eu}GbsWad$DC$xTAQ@JLzh@G|s#ikjQ ztY${#q$>ew_zvlVhW1~1i7d$}ilm;9p5NtovB8wHB4>4umy~jnmo1I9D=BK2^!9dX z%ywzx4k>>-7^M_T1?vl{3exS0P5p}!n;~kmHeM6dSxv886Dr1N(;Gsy$qhzrut%uP zEO&7&VwVz<5njqja)>fUzTIn-$2gd6N=S&P+)Plp``j_-P_bz`gi&7IqejvU{Go@dLGN&|wDrP-uJRhp|-2ZUxu z3u|Vz;pmpFSyZDyWs}FyroY_;f z+r5m;c++I!IJMo)_Nl=YT@9QvDPg3wJDe4%TJQ4J=Jj=>c5fZM8;X*uoo<|t3jTI^j1$u-OK2{o!0BOD#@bs}l*Zbn=eKvbO*!?kcA4Y~B)1@Qx%xv1F_22K zIkuRrid_|#5fDvjMC3CHSH(G%WG&k}UnX8bW)xFKudZY7vXYx<14|83Qw<5m8QE17 zHcBmOCjj*nX45H@&KKllr!;Rnbo_d4Z=!Vp-^i#vGK;#PGe{oZO%z&tx!QvU6m|he ziy9EQ?V!*LFp9=Z(cm@9nI5ioxW;}x9189H>?Ur3+bS^590-dk$k6lxixa$ft3not8Cq`cdWB>dG0eK1M7y`PNgJ9~x1085 z54hJgQmBPOyC~EQXp;?;stqfM&swbxE)#2;af1^L zzDMa*YuWzl?}ZFjHdbFiGTms^n5<{M7oNEwJabWa=8}L?sJQROk%tNntt(hpP*8BFU|rfFq&uYbJjF>(!K5SNy@G;o({u_-g^cv>(t-l1hDNnC z`WR92G%JeI^tWIKC8v=dk{`1cq@@LmXpF}DGs(p$y5ZG}g3TmXpuum`-lM$J5Du-Q z0DZqrF-3^x*zhznT4mC#g9pW!rIegV9Ty55+lNa`Sw28Vh5;#>Wfv*yGM8gN(Y%mK0H0pV$pacNQJf#$fB-Jyf51Je@2tO?<1EvXI8Kx$h~ zRcc4hywnp+Ug|j}kKD8S`Q0z?erxxJ-Me>xy8El$ox8cFsHViGAx*b5-P)8*Bxd|T zD>Ke$U~Co(W67{FmdH59VjG4Kix5Y$iD-BW4n>I7gC)~uF-68%OtxVNu?VyeCd>GtoMl8< zBH%DfOdl;$pY*F^7Vd4Si1Qj=aPlx&kHIfKrH=d}AfNj-dn>bptZhbPw%?3YIM zDrzKpNPWGI=x8&kR~i%5i!jnN1P^fws3{F?rM?3;-?CN@>m4Zt4tqIy2RsSK_q(u+ zq{LRq)GD=nEs+D##|NZUUrH^9r2D>>p886XzdC>ZyxwghkC#2DH%6(z#=X4N@k%S* z?oWR$>7HPy{kM{>=A%DocFRZj^*DEx94%00X{6hnX|##XCH zwidUoohHiKcNuOY!@>6$@a`yX<0uaNIN;zn3~pf5_{I%ttk)oKXslAhF{CZh)2-4i zhhZN+ZsRmln?d8-jB0!X;0C~uZMd>UGh@gbL9+!^p{m#rs)nKNc&|$yPHQ@gD?Ox+ zaM~b5tDH?8Z8r6)^y`)iplh9L2p7aSm27lokTM^x#TzZPEv+r)J^Y^TmZL4*EeH0+ z9XQu=#~!_K(w@9MPw%0H$Kin--$e`G*|TMjbbgQW?5@S?hmfBM^21~nx4Ic`pm@Gx z_dfJg|*sJph(KUyIKkk^{D&@Btie?lki{*vhu*wx}yvBM(IZ<(Cok^4zIDXip z6xl+Q0?p7^;F$8c6QV3o7B-7zgPOHX11p}WS=#)mYM@iB&TFnx2hx??q@JUQ$|7iV zk@t$cKwhY3H}6$V`q)lrC!3m&sbPAi0Yh7)eqzmEATL1Q7&WS9X=R0GtW{$$Do!i?yy^@v`NSTzwQ*E^zJZ;iQFf zo~(Mycjbhhw>;+h*6+$i9h|u`ROnb4CU^oXhY6k~E7Jv!*`4fo@1Vy<8>P($oBT=J zKa|EIJ7KY%vO*LYZ9Epf7iOoo{49t}) zR0H%R>zv7&zgVsSI7*@-dUVfk=?+mY=~5m7Q_m@N+8M~EuBq6g9#uAK&$N9= zIHZqQ3rC5uaZ`Juqf(_cZRiE#nER#P1J3csFWoj}Ed*^)66tAM*`k`g=Ai9W2iIX& zw$))1HKLYz4a0dz1HoN~%^Og*7#ap4}k@{W@-C58I7IiGA#?(;_*XYK&&MT~m zNsv!q88$|Ro@9f-A%XD?X(}P z`l+^AI&@e%b+~d{y>JW$#q5zPvbD>eh3ch}go>XO~8B-c6;GIp~6LtUbZQpymJwgj*?cEA5=av>$+*NKyOU zw#scK36%-O@o0;1UJm0z9lBWIoLDF~P9CH)wdN11h+mV*NhkMLtZjfiD&p%hIW@d; zko47lWsr5jBUJz@;&rASCEGGAmD}5FWw-=7fO;HPRln`HTt(dzY5zBRU2Fb7tLk%( zud#3|*6>_K{8o;u|KhmJZRNT8!sFBqp&}1kl8Ne=Q91`aY?Re2QX3Ut#`!s}oaf*s z)&1_92sHH4^FoH;N#iDqklVimU8#ESTO_QViD+T7N`eVoC==$TwP-vYB6+9MF09x00%eC9NxiEVTczz^c?@1#(AA`iuJY-M#JUnvp=g|Sfopwz9(Fe^ zmhM>q*D!2Hd!mxq%&V;>PdmLl{3u+D>|E8uBzTINuxckS z&I({_cdpTdAQr|WtEt%LRMu%D+Se)TnyqRyaO;$f?hr^Z)@_8SMU~Is)G(~4bs2C0 za6OsoRJQl;PV#ndB*vp`&(Kuf8&G+wt`Ia3bdU0ky)Nq8^&|4muXP0u>ah`e?DP;R z6r0bMNKPBOTpP7q`_*!7^m5Ij{3^q!rXV(HCdcf9*lQ!Xl0@$?eOBDj^sY_pajZS) zlv)q=m+Kp!#$z2D>S0@8Toc`NW6jVslbdfA(S4KNf`^f|9>nBgW^XGs3muR(sBqD; z9(ZJ;Q3baW$ao%cOG=`~d;aW}=m_XBr-Uu$9CbVDB2Ho7@2HCmCQ+x#1)(nbRJlQL z)<DCOa^cccskq_NuH>vPkKqceB?)xFB$P*UWpmIqx`dd199#ekr{3;mFjfpW znxjgj4X@WtQ(E8XJp;UfpelJxZVo!P#!T-Tf0EW7#4!cibt?3^;A@W+fDHgNx;Vas z$c!hVzarJ-Y)?e}?(g)5I-x5Zry0#vZdOV@>|wB;ct}9y+lUr|39WK-zz4AwQ1Qrl z$73e20;CTPf`ez`b^X4F>NgfZ-+WhW#5^d~aH#%qsJ$BIJe(_?#4Xq6-LQ0)YXgv5 z+2=;tcw85!dZOVmhPp>q!`?@^$Eeg?!w19Edg8q=s;qZ0wp{9|v6YD{a6Y|(r8flC z6YF!XyJZzyVOk>U264?#m6@7dWya=;P29eL0ydl(1+DoI60B(7G%mmib^81E+|lFmVwIkwo;Se9U2sF{cWc(wE79B)o77bGB$SvGEQi_*5h@RhjX4m_4$3{);C@g7IH{~8D8v*D+daz^;5du zf1F=NREKj~$i8q63TjrvswZ*Uz|uIPbF)fuWzZs3d42GP z;0`maA}@zuFT#P*r+n=Wk63@Qtz5)cfKDgiAKS|9It;sp+c77uzj3$;6g*Xy-AseuXJu77va?Rw>aiZE)= zar*YMIDPYKq}PP~S%l9a;V5Fq6igS~tQ?jKjZ-hevE2lTe!NyW|>aODHIawAus$dy|;r&5Ep`T9|MzcS*8RDMJ{*DB3ALhn~R-#C@kboJsW zjbW{>cmsDycfduXmY!J-weD!MsF%D+R98~msSv)hz1dV|(tQ={0+Sqt?<4t9S?2`# zpSY{98-G$Jb+?|x1@UA0_MkjQ2TAwkzO#%sI;i(I(t1X^PdYw2h`lnAN-d6x>)-8~ zD8$AeyrsdW@`ocJ1R{7}wm|;5PAtqxB$W#HhTlSsLGW;%X~Zd0pPFtdh6U zY1gM{GG#UqRHNw(s-tn0grn>G3O>T&q-(+kDV4GAaM;f{4SPXT2QGE4cxLGbF>jbW z1_qh73%&6kfU&>@IWCjob`uP%D9U}fJ1c_&aF&3(1y(DakL)CbZi-VsiP*i zV|JkwBJOb7#PwSfFXbQ$W?)s|%rLIsntaJobX2Lqf%xE2@6q0)Un8_1CC9*hgcjtk zY^QUEr4+!yQ{Uzd0+mVMsM~9tZbRLuK4P!k(Q?!+)Xl%B@7JCBS1=q9T8=ipuN}Y| zmus9%7?VZfnV}?y#4x#JD3e2Yb~qcu-pSs^hOsl)3^tC) z>oyW2&{ELMh-FcV>H`K*8X$!sRU|rn;_Sy3&0Z9p{@BFyMdY#B(Tmc_#K)q6d2C`; zgI!?l(*mP}XtyMAE=io`N)@7bNmO#tpHL8*-~{`p?mHn|<7D zJt7>#3w&tUfN%@T@q)o<3NeRSBBJAFPq(9fYO-XFi4w)L#~=T8&9|1eJKJ~`Gs^HR z+tVE$Ql!5mgucx67tKkt&xZAoh;E-v#07nS2$u$+ZeMXg9MCIy3srv$+J;C z-BxQ+-%G5-%3Ob0E2qE2+O_mLL9mzwVX#tv1)nWWik139j1eH;Q}bgvjA#)`4v zn!vLIc{aYsEOq@s>h#$LOG#3H7$hZ138>dc6A%-6#YAzCI0*Gpc{Z76Q+m21hZX5B z8Ae~``pXVuhyBmxYa1#Jk@`cLlnSnW90Fo$ub3td5r@T;GmJW zjk<#+zXeT1O!CMfqd4;04<-RmX?Wrf1db7gVOfSDfq)-b zsxI<1$iF5UIb`Z0hfTzO*krOFGF6Qme`{7CBak_K=&%vPhmK6Y*Lq?BGA2NDa z`k1kS%ppUEr4Ipq!tE39n3O%qK6%Pi`?TAq-!bF%JMHDCs!n}$YUioeQ-3=B@@e5kLB(~)O}ow@7GLubaGdHziCnK#d@Iukf0p1yc0`Sj@1b5G}= zo_f0B%)v7o&YV9JI1}COY;XUTbe&a1?cAbtja<*jdWJzsgm&&985%jem1rHkqIUL9 zvFlu$O*?nUMt+Ih2jn@5Oe5OaKZ{)*E3Df2=WM8YBjTl-5&yaoQF(KfhU*AkJ1a+b zbyOy5=WECIHChTTKU0A1;u{e+_gL>7kmrOOh7m+^+Br)U#un9eZr>P;Z44b-AM&0X zkmojIGTVOwr(cU*XWOmh+(4^#Zi=nz+>aQ>FACC8@Sl)lZ$v)a*F-<^>=lR@CQ+|; z)(j?3Si3qBAc3*z+WG8s^yy|~-p$C|n<>Ykx-$#%GIMAzp{pY=K|8|weQcR;N*R(jUiD3R^$nQjfA}WS!p<7k@Wo05Z+dDJ)gQJOCHOlcxXjP5u{6cQqoO+~{Ly z%Dm*8{F09KP2NS*R^Q}SnqKuyzKWDJhx*~|_&AFgf&Os!&hbs1b8mq25!)yqGkT1V z_1}7%kKFFFkFxnDj~VTo;vakK_}hF_vwZg3Cj=PZ6$lD!g+n9s(O>($8GSD zcWaPteD8hV)HQFu<>Nk}<(q4LxWE^lZ}T7fmU5i>Ek#_?emvm+;W7|c zX!fVh?gRd=p1yL_ij0bmiH)-kjHgW`Bn}#!BqgV$(o7oNWHK^`k3c=Lw7A5-Og`xM z*=dX%)yKQQ#eSEM`9Oq>XN7ZPd)VvW*IT^PxoVK-e)Iw-+d3TtNXC4Y5qo9ANSV(DF?yp=-*T%eq`wo z-*$U|eJ6;0$B!)SYx(Ow`|ITt+WJ|;Hrl3-eChxEi~Se^js5;Fe}N?X)USZ_*>(Ot zvKk;o-9)_-lm1GnkNh1ojMV;j)LDs!eB|V5|A|v)Ku=@;$J5e*cAw6luS3 z(ND8KQ{Ejhv;T46$3sc|4$uBvO12o`=fcQ@ z@S6)`^d@8UdOx$L+=J{TYn;ygXZHV@d)h2CGGW5qh;P3=AzU&i3<$Nx4NlaX&P}m9 zpGa{!3sPJNZiEJeHfKTd~qhj)avmw?6c3METT~_jq;i2Q~rc-1>q6q*_6+jXC+b?kn9L9ga(A9ra&rislcTI zmzvZVklfB>=}Ge+|J3*VS$f&LXi#Kq_-&ZrzepR*FZ{LdDU|k@7X`$@ak1vOz+a^A z%&wxoXK8A~>_Dn&&C6R;RaKQj9Z&2+gb0G5r>Po>XA1gn$5KbL(ru}8*q?4AlHGYZ z*@fVA?t|d}1;P81CFkeKcBe0S<+R4+cc-N#@0*sEvJ!#9rAv1;C;wyV)$Ziao7N@o zZ#tCnl)SsC>C-JK&&!=%UEh75vUBO4FH)LlbcjYrX!QAvy(t$E_Ao6e2bdmdCcCLk zx(`wE3L3pevrjhHNY6LdBv&D92K-d>3F$wYPb62t%&uavI*dzo~>@ajMQ`P!=2lLr`Heq;5T zH_MVo8s35_cDfu$0N)#B${Ka*0_{qGkR0rn9(Z{=R8Sr&PyfuX`O^%M{pvz z5Znk&63L4oWSTBpx0_0Kc3+f7rbUoELghTHfqDkI?|*YT>~K1r9kMqN`0rAZI>it= zI3^~1Q0jdqecl2;-IjVArj86*;h0B~h72EdD=~ycS|61jz4WVsKkBh3`O!<+%RkiP z3(0FQ4Z1(@sI*Nlrm-h^+of9UWPHJ9^+iul^i(e{)*e>60JSe%x{9)CV7abhf=OuKVzl^X=!{!PeDx)=`Ub z=*$0U8YKU(;@AM3r~!f4KwM;4cpx^`oH!^vAyzV1gvSO@gn%Dn2CNm~3A%~--{^lO z@c*U+j2aBc0a8!iC+o@Ejtwf8@HjzmWyxA@TsZkL5W7ZxSWD)fOh04PnM`lNb_d zjt-5*zZJyUCHobr;j)x{75C5d*V|r#pVWlmN}HFj;0KCVOMWWu#LtC(di6@vYJ6h< z$texJ;=QLd%I@tbjkJ5iOGP`rdBoVAiq>q`PU5@rz-AXdmmG0lmi~U(^R4@`D!K~G zvRs9)W-0Be(Q^p}FI{%7lI?1Cp~Vy%9Vv!~@oWGmEs?PjX1RgIZE}P6r_v}xX@tRv zk11EAmoGb3TrqY>V=)#= z_q}|1Zm;|73YuuYpj>FS;e!r%IKxA+ zo%TJ!izs@x#qnJKWf#4VqPJ~*PqzNtF)=GE>(*Ou9Y20--!rD~8U2e#6x%N<7n{@d zf6%#DajCBJvV2ClgdhK~?Ux*JKY97}Qd+0S;$L;jep-FP zTT-!6XsB(|qP}jcJ+MkuLsw^HuWCa^U3K88 zNJ9pG@Ni~*-2<0b9mUTc*4HtYwa{|bUPms6n94c3)5ELhJtnnX>DDGS9#$vdYuoVB zNCUpKi-rodU9IWTtd8ARSBoLirK>@N)O!_Q#zocWC63H173W?dcIBviSn1U=8e7#N z_>});`A+fW^1cb475m%w*Id(? zB~xanHTumj)VjcLHaAZ!W4#lhk@DFfnG{8v#5G^V*;h<<<+%Kf63|989#PZrGr*r{ zlNV@{U$uW#bz@k@uuIzpAQj?opAy;5qiJLUGe7dzJ@$Y<&n zcgkILOFHH5y24Jmr_R+W_tq74%Gc_acFMlGWu3CWuDDYU;5*x48UHjUAHf`{@|W^{ z`75jnr?;?_v6l+=l5@r9o#v>-A-CLWziZBed|M~iHLPn$H=olrr;CsWyZExM7rUP6 zdaH}C=-SuSO^a^nzO#FF_jBFW7rF^4Md07=uI~PX0*`hr2-a%u-q*dKV!rM^)qSpe zNcU298DEsnvL+T6!eKI7l$ka-lh4%AVJtpwnMo1Lrl&7si_$@s$!2C6KoXmlo|XKC{=O*)ltY6y3tc#-^pD4^B*s zotVz@=~BFzl|XBzv|%&~M9C9xIKAmt>yEY4+Io!7@Ks zN`v!u)03CC$B}n%Y+hcqBQNjZ+}gQ$2Q%{yI`YQN%*(5tI}5mtb5S@aZ&qGy6$-27 z9st?Sq zo-^`bl_RfuGwN5Per;9Noco5;wtzqk4tX1L^Sspy6(DMn%R4w{Ty53Hxg)DH527=9 z2j8Dlo4Fuw&;Cqw34b&5Hte4}tF~(M+>r+}56;W=8iiET=iyjYC{W} zm^1T}%DD$C(VZF9kJUbPqH*qmuWq@wX4Qqr3CgO6ypf;2bIXHs&qe%I-jI90QagRa zw)6LHs90Ql`kvDjJ#)6r+_=?wdraPg#Rs--NK-ys=tWoV+V79coL(D&FC>EN;zx7l zUNE=<50kEdKwN=<5kL~@NFr?ki$L?P07LwRvzZQ{{l+%L_{hQl+ZABqT{=<=Fdf3R zY|>+K2aFxWpXBm0U4>*xLx6J^5}=G7g`~^aRp`og`7N#`MFC?m=Px8}Nj-mct9l!Z z-#AG`i|(YZ!UpDKAP)3?;}Ud+b1gaXuq!G3T7aO?atCv~xsv=G=?Rdwm;5JY zwiWqL!IAN|C6S)&$;Ifv8?@H}Cd(BlB#E@suFnD-S_6O&M8OgG$f9ne-TyZ0dON^i zIL2s{F(9(ISpR3nwuV5G%cz~rE}-OMUzw2tMtd71M$2ZSj1$`~7gBb58Ert9kr5&+ zWEQyseiw^2?fnFV0bb9M7rT-MyOMfp1qi1tX&&Vhi9*^xBgyJcigjl%ekbyLQk&8L zj?fV>x*31B(Om@IT}9bF!n}q+6m!kk<1TE&6fteao)eHuR}#~e)U_?!6?^Sr@_ka< zxUT| zv^xPPXQ42yHyfQs2R@5NZP!Kg+8+#Uos`)2@KvYt<-Py6K4Os4yu;gavc=zBL@oIYo6Z|3wl7v4>qe&Oy_6$_tUHD_UU)m;no k9=r?200yBpw|Y)>Zf(^~=J5ZEtmC=M4$GC227>qh0?rsPiU0rr literal 0 HcmV?d00001 diff --git a/_wip/Wild Gunman (U)/copilot/prg.s b/_wip/Wild Gunman (U)/copilot/prg.s new file mode 100644 index 0000000..e6aba71 --- /dev/null +++ b/_wip/Wild Gunman (U)/copilot/prg.s @@ -0,0 +1,12 @@ +; Wild Gunman (U) NES disassembly - Pass 1 (skeleton) +; Generated from the supplied 16 KiB PRG image. +; Pass 1 classifies recursively reachable code, inline address tables, vectors, +; and untraced/data regions. All PRG data bytes are emitted explicitly with .byte directives. + +.setcpu "6502" + +.include "symbols.inc" +.include "locals.inc" + +.segment "PRG" +.incbin "prg.bin", $0000, $4000 diff --git a/_wip/Wild Gunman (U)/copilot/reconstructed.lbl b/_wip/Wild Gunman (U)/copilot/reconstructed.lbl new file mode 100644 index 0000000..e69de29 diff --git a/_wip/Wild Gunman (U)/copilot/reconstructed.map b/_wip/Wild Gunman (U)/copilot/reconstructed.map new file mode 100644 index 0000000..aaf7f17 --- /dev/null +++ b/_wip/Wild Gunman (U)/copilot/reconstructed.map @@ -0,0 +1,26 @@ +Modules list: +------------- +prg.o: + PRG Offs=000000 Size=004000 Align=00001 Fill=0000 + + +Segment list: +------------- +Name Start End Size Align +---------------------------------------------------- +PRG 00C000 00FFFF 004000 00001 + + +Exports list by name: +--------------------- + + + +Exports list by value: +---------------------- + + + +Imports list: +------------- + diff --git a/_wip/Wild Gunman (U)/copilot/reconstructed_prg.bin b/_wip/Wild Gunman (U)/copilot/reconstructed_prg.bin new file mode 100644 index 0000000000000000000000000000000000000000..4f66b6b21fe9af049dd307f57f0057d496e751db GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/_wip/Wild Gunman (U)/copilot/symbols.inc b/_wip/Wild Gunman (U)/copilot/symbols.inc new file mode 100644 index 0000000..6944e05 --- /dev/null +++ b/_wip/Wild Gunman (U)/copilot/symbols.inc @@ -0,0 +1,108 @@ +; ============================================================================= +; Nintendo Entertainment System hardware symbols +; ============================================================================= + +; ----------------------------------------------------------------------------- +; PPU registers +; ----------------------------------------------------------------------------- + +PPUCTRL = $2000 +PPUMASK = $2001 +PPUSTATUS = $2002 +OAMADDR = $2003 +OAMDATA = $2004 +PPUSCROLL = $2005 +PPUADDR = $2006 +PPUDATA = $2007 + +OAMDMA = $4014 + +; ----------------------------------------------------------------------------- +; Controller ports +; +; $4016: +; Write: controller strobe +; Read: controller port 1 +; +; $4017: +; Read: controller port 2 +; Write: APU frame counter +; ----------------------------------------------------------------------------- + +JOY1 = $4016 +JOY2 = $4017 + +; ----------------------------------------------------------------------------- +; APU pulse channel 1 +; ----------------------------------------------------------------------------- + +APUPULSE1CTRL = $4000 +APUPULSE1SWEEP = $4001 +APUPULSE1TIMERLO = $4002 +APUPULSE1TIMERHI = $4003 + +; ----------------------------------------------------------------------------- +; APU pulse channel 2 +; ----------------------------------------------------------------------------- + +APUPULSE2CTRL = $4004 +APUPULSE2SWEEP = $4005 +APUPULSE2TIMERLO = $4006 +APUPULSE2TIMERHI = $4007 + +; ----------------------------------------------------------------------------- +; APU triangle channel +; ----------------------------------------------------------------------------- + +APUTRIANGLECTRL = $4008 +APUTRIANGLETIMERLO = $400A +APUTRIANGLETIMERHI = $400B + +; ----------------------------------------------------------------------------- +; APU noise channel +; ----------------------------------------------------------------------------- + +APUNOISECTRL = $400C +APUNOISEPERIOD = $400E +APUNOISELENGTH = $400F + +; ----------------------------------------------------------------------------- +; APU DMC channel +; ----------------------------------------------------------------------------- + +APUDMCCTRL = $4010 +APUDMCDIRECT = $4011 +APUDMCADDR = $4012 +APUDMCLENGTH = $4013 + +; ----------------------------------------------------------------------------- +; APU status and frame counter +; +; $4015: +; Write: enable or disable the five APU channels +; Read: channel and interrupt status +; +; $4017: +; Write: APU frame-counter mode and IRQ inhibit +; Read: controller port 2 +; ----------------------------------------------------------------------------- + +APUSTATUS = $4015 +APUFRAMECOUNTER = $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 \ No newline at end of file