Files
tmerrittandClaude Opus 4.8 49e117bfcc Fix Pass 3 symbol application and add promotion criteria to PROMPTS.md
- Apply symbols.inc hardware register names to Defender 2 (U) (51 operands)
- Apply symbols.inc hardware register names to Donkey Kong 3 (JUE) (36 operands)
- Add APU register symbols (-) to Defender 2 (U) and Donkey Kong 3 (JUE) symbols.inc
- Apply symbols to Donkey Kong Jr. Math (U) (80 operands: 11 single + 69 hardware)
- Apply symbols to Excitebike (JU) (786 operands: 785 single + 1 hardware)
- Add promotion criteria to PROMPTS.md: symbol/local substitution,
  ROM-specific semantic naming, and verification checklist

Add branch/jump target naming requirement to PROMPTS.md

All branches and jumps must target symbolic labels with descriptive names
derived from program flow role (e.g., _Loop, _Next, _Done, _Store, _Return),
never raw address literals. Adds criterion 8 to verification checklist.

Rename all OVERVIEW.md to README.md; add root README content to top-level

- Rename all OVERVIEW.md files to README.md throughout the repo (47 files)
- Prepend README.md content to top-level OVERVIEW.md before rename
- Fix apply_symbols.py NAME_RE regex to handle spaced assignments
- Apply symbols.inc to Defender 2 (U) (51 hardware operands)
- Apply symbols.inc to Donkey Kong 3 (JUE) (36 hardware operands)
- Apply symbols.inc to Donkey Kong Jr. Math (U) (80 operands: 11 single + 69 hardware)
- Apply symbols.inc to Excitebike (JU) (786 operands: 785 single + 1 hardware)
- Add missing Zp18/FrameCounter aliases to Excitebike prg.s
- Build all 27 top-level projects: byte-identical

Promote Donkey Kong Jr. Math back to _wip tier

Moves code from `copilot` folder and verifies each builds after

Add pre-commit hook for byte-identical verification

Add .git/hooks/pre-commit that runs 'make' then 'make clean' in each
project directory before committing. This ensures every project builds
byte-identical before any commit is accepted.

Also includes all file moves from the Donkey Kong Jr. Math (U) demotion
and other file restructuring from the session.

moves code out of copilot folder, its all AI generated.
Moves NROM games into NROM folder

removes copilot folder from Lunar Pool
Adds makefile to build all projects recursively

Updates docs to reflect changes in layout

Repromotes Donkey Kong Jr Math
Repromotes Excitebike
Promotes Popeye (JU) (PRG 1)
Updates Makefile to provide summary of build failure/success

Promote Raid on Bungeling Bay (U): Pass 2/3 partial, whole-ROM byte-identical

Move _wip/NROM/Raid on Bungeling Bay (U) to NROM/ and switch the build
from a PRG-only compare to a whole-ROM one:

  - header.s/chr.s added (one-line .incbin of header.bin / chr.bin)
  - linker.cfg gains HEADER ($0000, $0010) and CHR ($0000, $2000)
    areas ahead of PRG ($C000, $4000)
  - rom.nes symlink to the space-containing original ROM name
  - Makefile builds header.o/prg.o/chr.o into reconstructed.nes and
    compares it against rom.nes ('Byte-identical ROM verified.')
  - one leftover neutral indirect operand jmp (Zp01) at $E2EC becomes
    jmp (IndDispatch01); apply_symbols.py reports 0 substitutions pending

README.md / TODO.md / AGENTS.md updated: 29 promoted, 7 in _wip/.

Pac-Man (U): Pass 2 complete (label renaming) + Pass 3 partial (ZP aliases, table names)

Pass 2 — fresh map derived from the committed split, not from any drafted
map (the drafted maps in other projects were audited and found not
applicable):

  - all 194 address-derived Label_XXXX definitions renamed to semantic
    routine-entry names plus <Routine>_<Role>_<addr> internal branch
    targets; zero Label_ remains
  - all 49 jsr/jmp call sites resolved from raw $XXXX to labels; zero
    raw $XXXX call operands remain
  - routinemap.tsv / derived_names.tsv record the derivation

Pass 3 (partial):

  - 15 proven semantic zero-page aliases added to locals.inc
    (GameState, NmiFlag, ScrollX/Y, PpuCtrlShadow, OamDmaPage,
    CocktailModeFlag, ActivePlayerFlag, GameplaySuspended, FrameCounter,
    StateTimer, Player1/2Input, ActiveInput, CopyrightVerified)
  - 112 operands substituted into prg.s (11 single + 101 hardware)
  - key data tables named: ProgrammerSig ($C0EB), GameStateDispatchTable
    ($C253), TitleScreenData ($C2FD), EntityPtrTable ($D912),
    AudioCommandTable ($EFDD)

Also corrects the README's claim that the RESET vector points at padding:
$FF00 holds real boot code (sei/cld, PPU off, double vblank wait, then
jmp ColdStart at $C042).

.gitignore: ignore reconstructed_prg.bin (build artifact of the _wip
Makefiles; '**/reconstructed.*' does not match the underscore form).

Promote Pac-Man (U): Pass 2/3 complete, whole-ROM byte-identical

Move _wip/NROM/Pac-Man (U) to NROM/ and switch the build from a PRG-only
compare to a whole-ROM one:

  - header.s/chr.s added (one-line .incbin of header.bin / chr.bin)
  - linker.cfg gains HEADER ($0000, $0010) and CHR ($0000, $2000)
    areas ahead of PRG ($C000, $4000)
  - rom.nes symlink to 'Pac-Man (U) [!].nes' (the original ROM name
    contains a space and brackets)
  - Makefile builds header.o/prg.o/chr.o into reconstructed.nes and
    compares it against rom.nes
  - reconstructed.nes is 24,592 bytes, MD5 a69d310f8cae9397fbd39f204672b5c7
    - equal to the original ROM; the header/prg/chr splits were checked
    against the original before promotion and are byte-exact

Pass 3 residue closed.  The last 7 multi-alias zero-page operands are
resolved per site through a new sites.tsv, each proven from context
rather than guessed:

  - jmp ($0010) at $C250/$D3CA/$D90F/$D9B6 -> (DispatchPtrLo); each
    is immediately preceded by sta DispatchPtrLo/sta DispatchPtrHi
  - jmp ($00FE) at $EFDA -> (AudioHandlerPtrLo); preceded by
    sta AudioHandlerPtrLo/sta AudioHandlerPtrHi
  - sta a:$0000,y at $C048/$C089 -> a:Zp00,y; the literal zero-page
    base in the two ZP clear loops, so the neutral name is used rather
    than the semantic WorkPtrLo.  The 'a:' prefix survives the
    substitution, so the bytes stay 99 00 00 (sta abs,Y)

apply_symbols.py now reports 119 operands substituted (101 hardware,
11 single-name, 7 site) and 0 residue.

New tool _tools/align_audit_comments.py: re-aligns the audit comment to
column 35 after a substitution lengthens an operand (nesdis.py pads each
instruction to 31 characters).  Whitespace-only, so the byte identity
cannot change.  405 lines re-aligned in this project; all 2,387 audit
comments still match prg.bin at the stated PRG offset, 0 mismatches.

Docs: root README.md / TODO.md / AGENTS.md updated - 30 promoted, 6 in
_wip/; a per-project detail entry for Pac-Man (U) added; the stale
'Donkey Kong 3 (JUE) has no README.md' claim corrected (it has a
318-line one).

Promote Raid on Bungeling Bay (U) [a2]: Pass 3 complete, whole-ROM byte-identical

Move _wip/NROM/Raid on Bungeling Bay (U) [a2] to NROM/ and switch the build
from a PRG-only compare to a whole-ROM one:

  - header.s/chr.s added (one-line .incbin of header.bin / chr.bin)
  - linker.cfg gains HEADER ($0000, $0010) and CHR ($0000, $2000)
    areas ahead of PRG ($C000, $4000)
  - rom.nes symlink to 'Raid on Bungeling Bay (U) [a2].nes' (the original
    ROM name contains spaces and brackets)
  - reconstructed.nes is 24,592 bytes, MD5 659d340a1e9d420eee28df13319b0094
    - equal to the original ROM; the header/prg/chr splits were checked
    against the original before promotion and are byte-exact

Pass 3 - 15 semantic zero-page aliases, each applied only at the sites
where its role is proven:

  - PpuCtrlShadow ($C2), 15 sites: the reset entry primes it right after
    'sta PPUCTRL', and every other use is an ora/and/eor followed by
    'sta PPUCTRL'
  - NmiPathSelector ($C4), 5 sites: written 1 at $C3E9 and 0 at $C962
  - GameState ($D6), 6 sites: 'cmp #$02' and used as an index at $C4C7
  - FrameSubCounter ($55), 6 sites: set to $0A at $C520, decremented per
    NMI at $C07B
  - PrngPeriodCounter ($EA) / PrngSeedB ($EB) / PrngState ($EC), 13 sites:
    the PRNG state
  - PtrLo ($00) / PtrHi ($01), 8 sites: the 16-bit pair $1C13 and $1610
    compared at $E785/$E791
  - IndDispatch01 ($01) / IndDispatch02 ($02), 3 sites: the computed
    dispatch at $E2EC
  - IndDispatch1B ($1B) / IndDispatch1C ($1C), 6 sites: the dispatch at
    $E7A3
  - IndDispatch17 ($17) / IndDispatch19 ($19): the dispatches at $E79D
    and $E7A0

Addresses that carry two names keep the neutral ZpXX name where the other
role applies - $01 is PtrHi at the 16-bit compare and IndDispatch01 at the
dispatch; $17 is IndDispatch17 at the dispatch and Zp17 for the absolute
RAM $0017 store in the copy loop at $E895/$E8D0.

New tool _tools/apply_zp_aliases.py does the per-site substitution:
apply_symbols.py only rewrites *numeric* operands, so it cannot rename an
operand that is already written as a neutral ZpXX name.  The tool keeps the
ca65 'a:' prefix (dropping it would turn 'sta a:Zp17,y' into a zero-page
store and change the bytes) and rewrites only the operand token, so the
audit comment survives byte for byte.

Naming correction in the promoted sibling.  Finishing this dump showed that
$EA was misnamed 'VBlankWaitCounter': the routine at $C412 is the game's
pseudo-random generator (the classic eor/asl/php/lsr/plp/rol scrambler,
called from thirteen gameplay sites, twice in a row at $CDF4/$CDF9 with the
second result masked #$07), so $EA is the scrambler's phase counter.
Renamed PrngPeriodCounter in both dumps and named $EB/$EC PrngSeedB /
PrngState.  The sibling's two 'sta a:IndDispatch17,y' operands were also
wrong - they are absolute stores to RAM $0017, not the dispatch pointer -
and are now 'a:Zp17,y', matching the file's 'a:' = absolute convention.

Audit-comment alignment re-done with _tools/align_audit_comments.py (1,040
lines here, 1,080 in the sibling).  Both files still match prg.bin at every
stated PRG offset: 5,467 and 5,483 audit comments, 0 mismatches.

Docs: root README.md / TODO.md / AGENTS.md updated - 31 promoted, 5 in
_wip/; per-project detail entries added for both Raid dumps.

Promote Pac-Man (Tengen) (U): Pass 2/3 from scratch, whole-ROM byte-identical

Move _wip/NROM/Pac-Man (Tengen) (U) to NROM/ and switch the build from a
PRG-only compare to a whole-ROM one:

  - header.s/chr.s added (one-line .incbin of header.bin / chr.bin)
  - linker.cfg gains HEADER ($0000, $0010) and CHR ($0000, $2000)
    areas ahead of PRG ($C000, $4000)
  - rom.nes symlink to 'Pac-Man (Tengen) (U) [!].nes'
  - reconstructed.nes is 24,592 bytes, MD5 d34e7a74d8d2c231b6cc601210e28ad0
    - equal to the original ROM; the header/prg/chr splits were checked
    against the original before promotion and are byte-exact

Disassembled from scratch.  No name, map or file was carried over from the
sibling 'Pac-Man (U)' dump; the map was derived from this dump's own
committed split and the two were only compared afterwards.

Pass 2 (new tool _tools/apply_pass2_map.py):
  - all 194 Label_XXXX definitions renamed to semantic routine entries plus
    <Routine>_<Role> branch targets; zero Label_ remains
  - all 48 raw $XXXX jsr/jmp operands resolved to labels; zero raw $XXXX
    call or branch operands remain
  - the map is in routinemap.tsv

Pass 3:
  - 30 semantic zero-page aliases, each applied only at the sites where its
    role is proven (per-site choice in sites.tsv; the addresses that carry
    two roles keep the neutral ZpXX name elsewhere).  _tools/
    derive_zp_aliases.py records how the set was derived, and locals.inc
    records the reason for every remaining neutral slot
  - 28 data tables named (new tool _tools/name_data_region.py), including
    CharacterDataTable ($C66A) and CharacterNameStrings ($C67E), where the
    ROM itself names Blinky, Pinky, Inky and Clyde - which is why the four
    indexed entities are called ghosts and not 'actors'
  - apply_symbols.py reports 0 substitutions pending and 0 residue
  - audit-comment alignment re-done with _tools/align_audit_comments.py;
    all 2,479 audit comments still match prg.bin at the stated PRG offset

Pass 1 correction - six command handlers recovered (new tool
_tools/recode_region.py).  ScriptCommandTable ($EFDD) is read by the traced
instruction at $EFCC, and six of its entries point at $F00A, $F022, $F03A,
$F052, $F062 and $F072 - all of which the tracer had left as data, and two
of which it had mis-split across the 'jmp $EF61' at $F01F and $F04F.
Those 120 bytes are code here, decoded straight from the ROM; the six
handlers tile $F00A-$F081 exactly.  The same gap exists in the promoted
'Pac-Man (U)' dump, which has not been corrected - recorded in both READMEs.

Residue (documented, not guessed): the unreached main game logic at
$C45A-$C55F is still .byte data.  It is code - the tracer's own decoder
walks it cleanly and the dispatch table at $C511 points into it - but
nothing reaches it, so it cannot be entered without a guess.  The same gap
exists in the promoted 'Pac-Man (U)' dump.  Re-deriving it is a Pass 1 job;
a Mesen Code Data Logger capture is the tool the repo uses for it.

Docs: root README.md / TODO.md / AGENTS.md updated - 32 promoted, 4 in
_wip/; a per-project detail entry added for the Tengen dump.

Promote Pyramid (U): Pass 1 corrected, Pass 2/3 complete, whole-ROM byte-identical

Move _wip/NROM/Pyramid (U) to NROM/ and switch the build from a PRG-only
compare to a whole-ROM one:

  - header.s/chr.s added (one-line .incbin of header.bin / chr.bin)
  - linker.cfg gains HEADER ($0000, $0010) and CHR ($0000, $2000)
    areas ahead of PRG ($C000, $4000)
  - rom.nes symlink to 'Pyramid (U) (Sachen).nes'
  - reconstructed.nes is 24,592 bytes, MD5 aa285ff17f25dd05da5996b7466c59e2
    - equal to the original ROM; the header/prg/chr splits were checked
    against the original before promotion and are byte-exact

Pass 1 correction - the committed split was a strict subset of the correct
one.  This game dispatches through 'jmp' trampoline tables that live
*inside* the data regions, and the tracer cannot follow a jmp there, so
828 bytes of code were still marked as data.  Four such tables were found
($C01E 3 entries, $C02A 6, $C042 2, $C054 5) plus ten more entries at
$C000-$C01B; all sixteen targets decode as valid instructions.  Seeding
them, the $C800 boot mainline and six further code starts recovers the
whole lot, plus a five-byte stub at $DF89 (lda $33 / jmp $DECB) that sat
in a hole between two routines.  The re-trace loses NO committed code byte
and takes the split from 34.5% to 39.6% (3,130 instructions / 6,493 code
bytes).  'make regen' reproduces it, so the split stays verifiable.

Pass 2 - a fresh map derived from this dump's own committed split:
  - 428 Label_XXXX definitions renamed; zero Label_ residue
  - 320 raw $XXXX jsr/jmp operands resolved; zero raw $XXXX branch
    operands remain
  - 431 routine entries and the 32 data blocks named from the code
  - the internal branch-target names are derived mechanically from the
    branch that reaches them by the new _tools/derive_branch_names.py
    (beq -> OnZero, bne -> OnNonzero, bcc/bcs -> the carry cases, a
    backwards branch -> Loop)
  - recorded in routinemap.tsv

Pass 3:
  - 24 semantic zero-page aliases, each applied only where its role is
    proven; the 57 slots that stay neutral are each listed with the reason
    in locals.inc (the neutral set lives in zp_aliases.inc so that
    'make regen' can rebuild locals.inc from prg.bin)
  - 32 data tables named - TaskVectorTable1/2, LevelScriptData,
    MusicPeriodTable, SoundEnvelopeTable, the actor tables - recorded in
    data_region_names.tsv
  - apply_symbols.py reports 0 substitutions pending and 0 residue; no
    hardware register is left as a raw literal
  - the audit comments are now canonical on every line, data included
    (the old file carried only 'PRG:$xxxx' on its 1,358 data lines);
    all 3,762 audit comments match prg.bin at their stated PRG offset

Kept as-is, not 'cleaned up':
  - sta $4100 stays a raw operand.  The iNES header claims mapper 0 but
    the boot code writes past the NES register space; the ROM does not
    explain it, so it is recorded rather than guessed
  - the 'A'/'V' check on RAM $0120/$0121 and its seed/clear routines
    are named for what they do, not for what they are for
  - the ninth entry of the $C3A6 task vector table ($D820) is a junk
    slot and stays data

Docs: root README.md / TODO.md / AGENTS.md updated - 33 promoted, 3 in
_wip/; a per-project detail entry added.

Hogan's Alley (JU): Pass 1 correction, Pass 2, Pass 3, promoted to NROM/

The light-gun game whose engine dispatches through *inline* tables:
`IndirectCall` at $C34D pops the return address of the `jsr` that called
it and reads a 16-bit handler pointer from the word that follows, so all
six handler tables ($C124 19 entries, $C219 4, $C89C 14, $CDD1 1, $D234 2,
$D3D6 14) live inside the code stream and the static tracer cannot follow
them.

Pass 1 correction.  The committed split was a strict subset of the correct
one -- 41.8% of the PRG was classified as code.  A fresh Mesen Code Data
Logger capture was merged with the four captures already in the folder
(hogans_merged.cdl, the OR of five per-byte flag arrays, 6,544 code bytes)
and _tools/cdl_reclass.py rewrote the split to match what the CPU actually
fetched: 1,216 bytes moved from data to code, five the other way, 59 labels
emitted.  The split is now 49.1% code (3,950 instructions, 8,041 bytes).
The four branch targets the reclassifier could not prove were turned into
labels by the new _tools/resolve_raw_branches.py.

Pass 2.  206 routine entries hand-named from this dump's own code and 413
internal branch targets derived mechanically by _tools/derive_branch_names.py:
630 Label_XXXX definitions gone, 484 raw $XXXX call operands resolved, 15
call targets the tracer had never labelled given a label.  Recorded in
routinemap.tsv.  No SubC<addr> residue was needed -- every entry the engine
reaches is named after what it does.

Pass 3.  60 semantic zero-page aliases, each applied only where its role is
proven (zp_aliases.inc, zp_alias_sites.tsv); the slots that stay neutral are
each listed with the reason.  All 34 data blocks named
(data_region_names.tsv).  apply_symbols.py reports 1 residue: `sta a:$00B4,y`
at $C203, the same address as Zp40/ActorPalette but forced to absolute
addressing, so it must stay numeric.

Promotion.  header.s, chr.s and a HEADER/PRG/CHR linker.cfg added, rom.nes
symlinked to the original ROM; the whole-ROM cmp passes on the first
promoted build.  There is deliberately no `make regen` target: the Pass 1
split here is the static trace corrected by a CDL capture, and the base the
correction was applied to is not what the current _tools/nesdis.py
produces, so prg.s is the maintained source of truth.

Tools changed:
  nesdis.py             --split/--note/--provenance options, so a data
                          region can carry its own name and explanation;
                          a forced-data address is no longer reported as a
                          recovered routine entry
  apply_pass2_map.py    can create the label for a call target the tracer
                          left unlabelled; no longer double-labels it
  apply_zp_aliases.py   --at-file, an address-based per-site list
  derive_branch_names.py keeps the map's own header instead of writing a
                          fixed one
  resolve_raw_branches.py  new: turns `bXX *+$NN` operands into labels
  build_hogans_map.py   new: the hand-written Pass 2 map builder

The existing regen pipelines (MUSCLE (U), Urban Champion (JU)) still
reproduce prg.s byte for byte.

Apply the symbols.inc register names at Pass 1; fix a dropped byte in cdl_reclass

nesdis.py now names the hardware registers as it renders the operands, so a
project's Pass 1 output already reads `lda PPUSTATUS` instead of `lda $2002`
and the Pass 3 apply_symbols.py step has nothing left to do for them.

  * nesdis.py --symbols FILE reads a symbols.inc-style file and substitutes
    the register names.  Only unambiguous entries in the $2000-$4017 window
    are used: $4017 is both JOY2 and APUFRAMECOUNTER, so it stays numeric
    and apply_symbols.py reports it as multi-alias residue, exactly as
    before.  The default is the symbols.inc next to --out, so a new project
    gets the names without asking; --no-symbols opts out.
  * The renderer records the operand's numeric value on the Insn, because
    operand_value() used to re-parse the operand text and could no longer
    read a name.
  * The controller bit masks in symbols.inc (PAD_A and friends) are
    constants, not addresses, and are still never substituted.

MUSCLE (U) and Urban Champion (JU) keep --no-symbols: their committed
prg.s was produced with the registers named by the Pass 3 apply_symbols.py
step, and the columns in those files reflect the in-place substitution.
Adding the missing apply_symbols.py step to both regen pipelines makes
them reproduce their committed prg.s byte for byte again - neither did
before this change (MUSCLE was 440 lines out, Urban Champion 772).

cdl_reclass.py had a bug that cost a byte: a region whose last source row
straddled the region's end was replaced by a regeneration of the region
only, so the tail of that row was dropped.  Mario Bros (JU) hit it at
$C595, where the rebuild came out one byte short and every label after it
shifted.  A region now covers the whole rows it replaces.

pass2.py reflow takes an optional column argument; the default is
unchanged (the ';' lands on the same column as before).

Mario Bros (JU): Pass 1 correction, Pass 2, Pass 3, promoted to NROM/

A two-player platformer whose handler tables are *inline*: the pointers sit
in the middle of the code stream, right after the `jsr` that reads them, so
the static tracer could never follow them.

Pass 1 correction.  The committed split was a strict subset of the correct
one -- only 72.0% of the PRG was classified as code.  A Mesen Code Data
Logger capture of this ROM (mario_mesen.cdl, 10,915 code bytes) showed
1,010 bytes the tracer had left as data were code; two branch targets the
capture never reached ($E4CB and $E639) were forced with --override for 57
more, so 1,067 bytes moved from data to code and 22 moved the other way.
The split is now 78.4% code (6,210 instructions, 12,847 bytes).  The three
branch targets the reclassifier could not prove were turned into labels by
_resolve_raw_branches.py, which now refuses to put a label on a `.byte` row.

Pass 2.  206 routine entries and 519 internal branch targets: 931
Label_XXXX definitions gone, 51 raw $XXXX call operands resolved and 12 call
targets the tracer had never labelled given a label.  Zero SubC residue --
the 185 entries a previous session had left as address-derived residue were
all named from this dump's own code.  Recorded in routinemap.tsv.

Pass 3.  25 semantic zero-page aliases, each applied only where its role is
proven (zp_aliases.inc); the slots that stay neutral are each listed with the
reason.  35 data tables named -- GameStateHandlerTable, EnemyBehaviourTable,
EnemyScriptTable, EnemyTypePointerTable, SoundRoutineTable,
NoteFrequencyTable and the rest -- and recorded in
data_region_names.tsv.  apply_symbols.py reports 0 residue.

Promotion.  header.s, chr.s and a HEADER/PRG/CHR linker.cfg added, rom.nes
symlinked to the original ROM; the whole-ROM cmp passes on the first
promoted build.  There is deliberately no `make regen` target: the Pass 1
split here is the static trace corrected by a CDL capture, and the base the
correction was applied to is not what the current _tools/nesdis.py
produces, so prg.s is the maintained source of truth.

Tools:
  apply_pass2_map.py     renames a label of any spelling -- SubC<addr> is
                          the honest residue form -- and its references
                          follow it; one combined pattern, so a 16,000-line
                          file does not need a substitution per label
  resolve_raw_branches.py refuses to label a data row
  build_mario_map.py      new: the hand-written Pass 2 map builder

Remove the old _wip/NROM/Mario Bros (JU) folder (promoted to NROM/)

Mario Bros (JU): add the promoted-tier header, CHR, rom.nes symlink and zero-page aliases

Moves _ROMS/<ROM> into _wip/<MAPPER>/<ROM>

Sync the docs and the skeleton tool with the 857-project _wip tier

The _wip/ tier now holds 857 projects across 30 mapper folders, all
building byte-identical for the whole ROM.  README.md, TODO.md and
AGENTS.md still described the old 39-project tier, so bring them in line
with WIP.md, which carries the tier's index.

The tier is no longer 39 projects of NROM-256 with a 16/32 KB PRG:
only two projects have a 16 KB PRG, 151 have 32 KB, 523 have 128 KB and
one has 1.5 MB, so most of it is a banked mapper whose image does not fit
the 6502's address space.  Those projects link their MEMORY areas at .nes
file offsets rather than CPU addresses, which is the only option and the
honest model; the 39 older projects keep the CPU-address layout because
their PRG really is one contiguous window.

make_skeleton.py gains the two layouts (--layout flat|cpu), the board
name for the mapper, and a fix for find_rom() mistaking the build
output reconstructed.nes for the source ROM.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-10-20 16:44:06 -04:00

19 KiB

1labelLabel_C000InitAPU_C000
2labelLabel_C003CheckControllerStart
3labelLabel_C026ScaleInputIndex
4labelLabel_C04ESetAPUVolume
5labelLabel_C056SetAPUSweep
6labelLabel_C058InitAPUWaveform
7labelLabel_C05ESaveXY
8labelLabel_C063InitSoundPointers
9labelLabel_C06EUpdateControllerState
10labelLabel_C087InitControllerTables
11labelLabel_C0A0InitControllerTablesLoop
12labelLabel_C0AEInitControllerTablesAlt
13labelLabel_C0B1InitControllerTablesExit
14labelLabel_C0CFInitPPU
15labelLabel_C0E0InitPPULoop
16labelLabel_C0F1InitAPUFrameCounter
17labelLabel_C0F8InitAPUFrameCounterExit
18labelLabel_C0FCInitPPUFinal
19labelLabel_C18DLoadBackgroundData
20labelLabel_C195LoadBackgroundDataLoop
21labelLabel_C199LoadBackgroundDataAlt
22labelLabel_C19BLoadBackgroundDataExit
23labelLabel_C1A7SetupSpriteData
24labelLabel_C1B2SetupSpriteDataLoop
25labelLabel_C20FCopySpriteTables
26labelLabel_C22CCopySpriteTablesLoop
27labelLabel_C24DWaitVBlank
28labelLabel_C288WaitVBlankLoop
29labelLabel_C2A5InitGameVariables
30labelLabel_C2DEClearRAM
31labelLabel_C30CClearRAMPage
32labelLabel_C30DClearRAMPageLoop
33labelLabel_C31BInitGameState
34labelLabel_C327InitGameStateExit
35labelLabel_C332InitAPUCall
36labelLabel_C335InitAPU
37labelLabel_C352ClearControllerState
38labelLabel_C358InitAPURegisters
39labelLabel_C376InitSpritesAlt1
40labelLabel_C37DInitSpritesAlt2
41labelLabel_C384InitSpritesMain
42labelLabel_C3A0InitSpritesLoop
43labelLabel_C3B3InitSpritesExit_C3B3
44labelLabel_C3C8InitSpritesAlt3
45labelLabel_C3E0InitSpritesAlt4
46labelLabel_C3F5InitSpritesAlt5
47labelLabel_C408InitSpritesAlt6
48labelLabel_C41EInitSpritesAlt7
49labelLabel_C425InitSpritesAlt8
50labelLabel_C438InitSpritesAlt9
51labelLabel_C44EInitSpritesAlt10
52labelLabel_C465InitGameState2
53labelLabel_C48AInitGameState2Exit
54labelLabel_C508InitGameState3
55labelLabel_C533InitGameState3Exit
56labelLabel_C5D1InitGameState4
57labelLabel_C5FCInitGameState4Exit
58labelLabel_C66EReset
59labelLabel_C66FResetEntry
60labelLabel_C69EInitSystem
61labelLabel_CA02WaitPPUReady
62labelLabel_CA07WaitPPUReadyLoop
63labelLabel_CA0FInitStack
64labelLabel_CA11LoadGameConfig
65labelLabel_CA14InitVariables
66labelLabel_CA17SetupInitialState
67labelLabel_CA19SetupRAMPointer
68labelLabel_CA1DClearRAMStart
69labelLabel_CA1FClearRAMByte
70labelLabel_CA21ClearRAMLoop
71labelLabel_CA2FStoreConfig
72labelLabel_CA32CallInitRoutines
73labelLabel_CA35CallInitRoutines2
74labelLabel_CA38SetupScroll
75labelLabel_CA3ASetupScroll2
76labelLabel_CA40SetupGameMode
77labelLabel_CA42SetGameMode1
78labelLabel_CA44SetZpA5
79labelLabel_CA46InitAPURegisters2
80labelLabel_CA48InitAPURegisters2Exit
81labelLabel_CA4BCallCheckControllerStart
82labelLabel_CA4ECallE7EF
83labelLabel_CA51SetupPPUCtrl
84labelLabel_CA53SetupPPUCtrlExit
85labelLabel_CA56SetZp08
86labelLabel_CA58SetZp09
87labelLabel_CA5CSetupX
88labelLabel_CA5ECopyConfigData
89labelLabel_CA69TitleScreenLoop
90labelLabel_CA6DCheckGameMode
91labelLabel_CA6FCheckRoundIndex
92labelLabel_CA73CallInitAPU
93labelLabel_CA76GameplayFrame
94labelLabel_CA87MainGameLoop
95labelLabel_CA8BCallCheckRoundEnd
96labelLabel_CA8EMainGameLoopJump
97labelLabel_CA91NmiHandler
98labelLabel_CA9BNmiFrameUpdate
99labelLabel_CAA5NmiVBlankOnly_CAA5
100labelLabel_CAACNmiFrameUpdate2
101labelLabel_CAAFNmiFrameUpdate3
102labelLabel_CAB2NmiFrameUpdate4
103labelLabel_CAB5NmiExit
104labelLabel_CAC2NmiVBlankOnly_CAC2
105labelLabel_CADAUpdateScroll
106labelLabel_CBE2InitSprites
107labelLabel_CBF7InitSpritesAlt
108labelLabel_CC0BInitSpritesExit
109labelLabel_CC46UpdateSprites
110labelLabel_CC61UpdateSpritesExit
111labelLabel_CC67UpdateOAM_CC67
112labelLabel_CC77UpdateOAMExit
113labelLabel_CC85UpdateOAM_CC85
114labelLabel_CC95UpdateOAMExit2
115labelLabel_CCAFUpdatePalettes
116labelLabel_CCC6UpdatePalettes2
117labelLabel_CCCBUpdatePalettesExit
118labelLabel_CCCEUpdatePalettesLoop
119labelLabel_CCD0UpdatePlayers
120labelLabel_CCDAUpdatePlayersExit
121labelLabel_CDE0ProcessControllerInput
122labelLabel_CE43ScrollBackground
123labelLabel_CE8BScrollBackgroundExit
124labelLabel_CF92UpdateSpritePositions
125labelLabel_CFA1CheckRoundEnd
126labelLabel_CFABCheckRoundEndExit
127labelLabel_CFC3HandleKO
128labelLabel_CFD3HandleKOExit
129labelLabel_CFE5HandleTimeout
130labelLabel_CFF8HandleTimeoutExit
131labelLabel_D01AUpdateRoundTimerInit
132labelLabel_D027UpdateRoundTimerInitExit
133labelLabel_D057UpdateRoundTimer
134labelLabel_D08ESpriteDMA
135labelLabel_D09DDrawBackground
136labelLabel_D174UpdatePPUMask
137labelLabel_D187UpdatePPUMaskExit
138labelLabel_D1A7UpdatePPUMaskAlt
139labelLabel_D1C6UpdatePPUMaskLoop
140labelLabel_D216UpdateHUD
141labelLabel_D2E2UpdateHUDExit
142labelLabel_D30AUpdateScore
143labelLabel_D3FAUpdateScoreLoop
144labelLabel_D40EUpdateScoreExit
145labelLabel_D469DrawRoundNumber
146labelLabel_D5D1DrawRoundNumberExit
147labelLabel_D7DBUpdatePlayerPositions
148labelLabel_D80CUpdatePlayerPositionsExit
149labelLabel_DAA7CheckCollisions
150labelLabel_DADDCheckCollisionsExit
151labelLabel_DBCBUpdateTimers
152labelLabel_DBDCUpdateTimersExit
153labelLabel_DBFDProcessInputs
154labelLabel_DE03ProcessInputsExit
155labelLabel_DE24ProcessInputsAlt
156labelLabel_DE2EProcessInputsAltExit
157labelLabel_DEC9UpdateRoundState
158labelLabel_DEE3UpdateRoundStateExit
159labelLabel_DF4CUpdateRoundStateAlt
160labelLabel_DF5EUpdateRoundStateAltExit
161labelLabel_E00FHandlePlayer1
162labelLabel_E02BHandlePlayer1Exit
163labelLabel_E048HandlePlayer2
164labelLabel_E064HandlePlayer2Exit
165labelLabel_E076HandlePlayer1Alt
166labelLabel_E08DHandlePlayer1Entry
167labelLabel_E11DHandlePlayer2Entry
168labelLabel_E223HandlePlayer1Logic
169labelLabel_E2B9HandlePlayer2Logic
170labelLabel_E2C9HandlePlayerLogicExit
171labelLabel_E350HandleGameOver
172labelLabel_E3B2HandleGameOverExit
173labelLabel_E3E0HandleRoundStart
174labelLabel_E40EHandleRoundStartExit
175labelLabel_E459UpdateSound
176labelLabel_E48BUpdateSoundExit
177labelLabel_E4A4UpdateSoundAlt
178labelLabel_E4E2UpdateSoundAltExit
179labelLabel_E506PlaySoundEffect
180labelLabel_E535PlaySoundEffectExit
181labelLabel_E54APlaySoundEffectAlt
182labelLabel_E5B2UpdateMusic
183labelLabel_E617UpdateMusicExit
184labelLabel_E61BUpdateMusicAlt
185labelLabel_E6D4UpdateMusicLoop
186labelLabel_E6FAUpdateMusicLoopExit
187labelLabel_E793InitSpriteData
188labelLabel_E7B6InitSpriteDataExit
189labelLabel_E7EFInitSound
190labelLabel_E7FEInitSoundExit
191labelLabel_C39AInitSpritesLoop
192labelLabel_C3ADInitSpritesAltExit
193labelLabel_C3C3InitSpritesCheckE6
194labelLabel_C3E3InitSpritesSetE4
195labelLabel_C3E9InitSpritesSetE6
196labelLabel_C3FFInitSpritesCallChain
197labelLabel_C405InitSpritesClearEF
198labelLabel_C40EInitSpritesCheckF1
199labelLabel_C40FInitSpritesSetF3
200labelLabel_C444InitSpritesCheckF2
201labelLabel_C44AInitSpritesSetF2
202labelLabel_C478InitSpritesAlt1Entry
203labelLabel_C49CInitSpritesAlt1Loop
204labelLabel_C4A4InitSpritesAlt2Entry
205labelLabel_C4A5InitSpritesAlt2Loop
206labelLabel_C4BBInitSpritesCheck10B
207labelLabel_C4C3InitSpritesInc10B
208labelLabel_C4CAInitSpritesCheck10BMax
209labelLabel_C4E3InitSpritesCheck10C
210labelLabel_C4E6InitSpritesCheck10CAF
211labelLabel_C4F4InitSpritesSetF4
212labelLabel_C512InitGameState3CheckE6
213labelLabel_C520InitGameState3Loop
214labelLabel_C52DInitGameState3Alt
215labelLabel_C542InitGameState4CheckF2
216labelLabel_C55AInitGameState4Loop
217labelLabel_C590InitGameState4ClearEF
218labelLabel_C593InitGameState4MaskF3
219labelLabel_C5A4InitGameState4MaskEF
220labelLabel_C5ABInitGameState4CheckF9
221labelLabel_C5C5InitGameState4DecD8
222labelLabel_C5CAInitGameState4CheckF2Alt
223labelLabel_C5F5WaitVBlankLoop_C5F5
224labelLabel_C5F6WaitVBlankDecD8
225labelLabel_C5F9WaitVBlankDecD9
226labelLabel_C5FFWaitVBlankCheckFF
227labelLabel_C605WaitVBlankCheckFA
228labelLabel_C60BWaitVBlankStore
229labelLabel_C622WaitVBlankCallC1B2
230labelLabel_C637WaitVBlankCallC1B2Alt
231labelLabel_C63DWaitVBlankCallC1B2Alt2
232labelLabel_C644WaitVBlankJmpC20F
233labelLabel_C647WaitVBlankZeroE4
234labelLabel_C64EWaitVBlankCallC1B2Zero
235labelLabel_CAE1TitleScreenCheckMode
236labelLabel_CB06CheckControllerStartEntry
237labelLabel_CB0FCheckControllerStartLoop
238labelLabel_CB31CheckControllerStartExit
239labelLabel_CB4BCheckControllerStartWait
240labelLabel_CB4ECheckControllerStartJmp
241labelLabel_CB51GameplayFrameCallD012
242labelLabel_CB55GameplayFrameCallE70C
243labelLabel_CB61TitleScreenLoopCallInitAPU
244labelLabel_CB66UpdateScrollEntry
245labelLabel_CBB6InitSpritesSetPos
246labelLabel_CBC0InitSpritesZero5FF
247labelLabel_CBDAUpdateScrollLogic
248labelLabel_CBFBInitSpritesBeqCBFB
249labelLabel_CC02UpdateScrollCheckZp1F
250labelLabel_CC15InitSpritesIncY
251labelLabel_CC1BInitSpritesCpy02
252labelLabel_CC24InitSpritesSet5FD
253labelLabel_CC29UpdateScrollReadDispatch
254labelLabel_CC3AUpdateScrollCheckDispatch
255labelLabel_CC3EUpdateScrollReadZpA4
256labelLabel_CC42UpdateScrollCheckDispatchAlt
257labelLabel_CC5CUpdateScrollCheckZpA4
258labelLabel_CC6EUpdateOAMSetPointer
259labelLabel_CC7BUpdateOAMClear200
260labelLabel_CC97UpdateOAMCheckZp23
261labelLabel_CCAEUpdateOAMDecrement
262labelLabel_CCC3UpdateOAMCheckZp27
263labelLabel_CCCFUpdateOAMZeroY
264labelLabel_CCE3UpdatePalettesCheckZp27
265labelLabel_CCF3UpdatePalettesZeroY
266labelLabel_CCFBProcessControllerInputLoop
267labelLabel_CCFDProcessControllerInputStore
268labelLabel_CD22RoundLogicCheckZp21
269labelLabel_CD33RoundLogicBeqCD84
270labelLabel_CD38RoundLogicSet21
271labelLabel_CD41ProcessControllerInputEntry
272labelLabel_CD5DProcessControllerInputRead2002
273labelLabel_CD6CProcessControllerInputAndFB
274labelLabel_CD76ProcessControllerInputStaZp08
275labelLabel_CD84ProcessControllerInputRead2002Alt
276labelLabel_CD85ProcessControllerInputRead2002Alt2
277labelLabel_CD94ProcessControllerInputAnd04
278labelLabel_CDAAProcessControllerInputOra18
279labelLabel_CDC3ProcessControllerInputStaZp09
280labelLabel_CDCARoundLogicEntry
281labelLabel_CDD6RoundLogicDecZp2A
282labelLabel_CDDCRoundLogicBplCDD6
283labelLabel_CDFERoundLogicSaveXY
284labelLabel_CE14ScrollBackgroundEntry
285labelLabel_CE20ScrollBackgroundIncX
286labelLabel_CE23ScrollBackgroundTXA_CE23
287labelLabel_CE26ScrollBackgroundCmp6F_CE26
288labelLabel_CE3AScrollBackgroundRead2002
289labelLabel_CE55ScrollBackgroundSetZp21
290labelLabel_CE6CScrollBackgroundLoop
291labelLabel_CE83ScrollBackgroundInx
292labelLabel_CEADScrollBackgroundTXA_CEAD
293labelLabel_CEBDScrollBackgroundCmp6F_CEBD
294labelLabel_CEBEScrollBackgroundAdc01
295labelLabel_CEC5ScrollBackgroundAnd0F
296labelLabel_CECEScrollBackgroundStaZp01
297labelLabel_CEF1ScrollBackgroundAdcZp01_CEF1
298labelLabel_CEF5ScrollBackgroundCmp0A_CEF5
299labelLabel_CF23ScrollBackgroundSbcZp01_CF23
300labelLabel_CF25ScrollBackgroundStaZp01Alt
301labelLabel_CF4EScrollBackgroundCallCF92
302labelLabel_CF4FScrollBackgroundCallCF92Entry
303labelLabel_CF5AScrollBackgroundAdcZp01_CF5A
304labelLabel_CF67ScrollBackgroundCmp0A_CF67
305labelLabel_CF6BScrollBackgroundSbcZp01_CF6B
306labelLabel_CF70ScrollBackgroundCallCF92Alt
307labelLabel_CF83ScrollBackgroundCallCF92Alt2
308labelLabel_CF8FScrollBackgroundStaZp01Alt2
309labelLabel_CFB3CheckRoundEndEntry
310labelLabel_D012UpdateRoundTimerCallD057
311labelLabel_D015UpdateRoundTimerBeq
312labelLabel_D030DrawBackgroundEntry
313labelLabel_D034DrawBackgroundSetZpA2
314labelLabel_D040DrawBackgroundSetZpA2Alt
315labelLabel_D044DrawBackgroundLdx0
316labelLabel_D050UpdateRoundTimerInitSetPtr
317labelLabel_D05EUpdateRoundTimerInitSetZp09
318labelLabel_D066UpdateRoundTimerInitCallCE3A
319labelLabel_D07ASetupInitialStateEntry
320labelLabel_D07ESetupInitialStateLoop
321labelLabel_D084SpriteDMAEntry
322labelLabel_D086SpriteDMALoop_D086
323labelLabel_D088SpriteDMASetZp00
324labelLabel_D1A4UpdatePPUMaskCheckZp85
325labelLabel_D1AEUpdatePPUMaskASL
326labelLabel_D1C4UpdatePPUMaskEntry
327labelLabel_D1CAUpdatePPUMaskCheckZp8B
328labelLabel_D1E8UpdatePPUMaskBCS
329labelLabel_D1EAUpdatePPUMaskLdx01
330labelLabel_D1F9UpdatePPUMaskSetZp88
331labelLabel_D213UpdatePlayersCheckZp00
332labelLabel_D243UpdatePlayersBitZp00
333labelLabel_D254UpdatePlayersCpyZp43
334labelLabel_D261UpdatePlayersStxZp31
335labelLabel_D27BUpdatePlayersEntry
336labelLabel_D289UpdatePlayersCpyZp43Alt
337labelLabel_D29EUpdatePlayersStyZp43
338labelLabel_D2A5UpdatePlayersEntryAlt
339labelLabel_D2A7UpdatePlayersStxZp31Alt
340labelLabel_D2A9UpdatePlayersStyZp43Alt
341labelLabel_D2ADUpdatePlayersCallE4E2
342labelLabel_D2AFUpdatePlayersCallE4E2Alt
343labelLabel_D2B2UpdatePlayersCallE5AC
344labelLabel_D2C4UpdatePlayersCallE462
345labelLabel_D2CAUpdatePlayersCheckZp1F
346labelLabel_D300UpdateScoreEntry
347labelLabel_D301UpdateScoreCheckZp88
348labelLabel_D304UpdateScoreSetZp31
349labelLabel_D313UpdateScoreLoadZp1F
350labelLabel_D31FUpdateScoreBeqD31F
351labelLabel_D327UpdateScoreLdxZp89
352labelLabel_D332UpdateScoreCallE2B9
353labelLabel_D341UpdateScoreCallE459
354labelLabel_D34BUpdateScoreCallE462
355labelLabel_D35EUpdateScoreCpy0D
356labelLabel_D367UpdateScoreSetZp31Alt
357labelLabel_D392UpdateScoreLdx02
358labelLabel_D3A4UpdateScoreCheckZp88Alt
359labelLabel_D3BDUpdateScoreSetZp31Alt2
360labelLabel_D3C3UpdateScoreBneD408
361labelLabel_D3CEUpdateScoreCallE46E
362labelLabel_D3D1UpdateScoreBneD40E
363labelLabel_D3F3UpdateScoreSetZp31Alt3
364labelLabel_D408UpdateScoreBneD3CE
365labelLabel_D411UpdateScoreLDY02
366labelLabel_D436DrawRoundNumberCalc
367labelLabel_D444DrawRoundNumberClc
368labelLabel_D447DrawRoundNumberADC06
369labelLabel_D45BDrawRoundNumberCallE7A7
370labelLabel_D463DrawRoundNumberCallE4E2
371labelLabel_D7FCUpdatePlayerPositionsCheckZp84
372labelLabel_D807UpdatePlayerPositionsSetZp32
373labelLabel_D825UpdatePlayerPositionsEntry
374labelLabel_D828UpdatePlayerPositionsStxZp31
375labelLabel_DA25TitleScreenSetMode
376labelLabel_DAB3SpriteDMACheckZp96
377labelLabel_DB57SpriteDMACmp02
378labelLabel_DB7DSpriteDMALoopEntry
379labelLabel_DB8ESpriteDMALdx0A
380labelLabel_DB91SpriteDMABeqDB91
381labelLabel_DB92SpriteDMALdy0A
382labelLabel_DB9ESpriteDMALdaF940
383labelLabel_DBA6SpriteDMALoop_DBA6
384labelLabel_DBAASpriteDMADex
385labelLabel_DBBFSpriteDMACheckZp93
386labelLabel_DBDDSpriteDMACallCDE0
387labelLabel_DBEFSpriteDMACallDD8C
388labelLabel_DBF0SpriteDMARTS
389labelLabel_DCF6UpdateTimersEntry
390labelLabel_DCFFUpdateTimersBeqDD33
391labelLabel_DD00UpdateTimersCmp02
392labelLabel_DD33UpdateTimersBeqDD33Alt
393labelLabel_DD34UpdateTimersBeqDD34
394labelLabel_DD3BUpdateTimersCmp02Alt
395labelLabel_DD8CUpdateTimersAnd1F
396labelLabel_DD96UpdateTimersBneDDAB
397labelLabel_DDABUpdateTimersCallCDE0
398labelLabel_DE1CProcessInputsEntry
399labelLabel_DE35ProcessInputsCheckZp1F
400labelLabel_DF53HandleKOEntry
401labelLabel_DF74HandleKOLda05EC
402labelLabel_DF75HandleKOAnd07
403labelLabel_DF7AHandleKOLoop
404labelLabel_DF8DHandleKOCmp07
405labelLabel_DF9EHandleKOCheckZp88
406labelLabel_DFAEHandleKOBeqDFB7
407labelLabel_DFB7HandleKOLda0321
408labelLabel_DFDAHandleKODex
409labelLabel_DFDFHandleKODexBne
410labelLabel_DFE4HandleKOCheckZp1F
411labelLabel_DFE5HandleKOBeqDFE4
412labelLabel_E040HandlePlayer1CheckZpC0
413labelLabel_E052HandlePlayer1BeqE075
414labelLabel_E056HandlePlayer1LdxZp89
415labelLabel_E06DHandlePlayer1CallE1CD
416labelLabel_E073HandlePlayer1CallE1FD
417labelLabel_E075HandlePlayer1Entry
418labelLabel_E0B4HandlePlayer1CheckZp87
419labelLabel_E0B7HandlePlayer1BeqE235
420labelLabel_E11AHandlePlayer2CallE1FD
421labelLabel_E11CHandlePlayer2Entry
422labelLabel_E1CDHandlePlayer2CallE1FDEntry
423labelLabel_E1FDHandlePlayer2Dex
424labelLabel_E207HandlePlayer1LogicLdxZp36
425labelLabel_E20DHandlePlayer1LogicInx
426labelLabel_E21EHandlePlayer1LogicLda0258
427labelLabel_E235HandlePlayer1LogicBeq
428labelLabel_E236HandlePlayer1LogicLdaZp87
429labelLabel_E24AHandlePlayer1LogicCallE4E2
430labelLabel_E255HandlePlayer1LogicCallE5AC
431labelLabel_E26CHandlePlayer1LogicCallE4E2Alt
432labelLabel_E290HandlePlayer2LogicEntry
433labelLabel_E29CHandlePlayer2LogicCpyZp43
434labelLabel_E2A3HandlePlayer2LogicStxZp31
435labelLabel_E2B8HandlePlayer2LogicCallE4E2
436labelLabel_E2C1HandlePlayer2LogicCallE5AC
437labelLabel_E2D8HandlePlayer2LogicCallE4E2Alt
438labelLabel_E2E5HandlePlayer2LogicCallE4E2Alt2
439labelLabel_E2FFHandlePlayer2LogicCallE4E2Alt3
440labelLabel_E30FHandleGameOverEntry
441labelLabel_E312HandleGameOverCallE4E2
442labelLabel_E31EHandleGameOverCallE5AC
443labelLabel_E334HandleGameOverCallE4E2Alt
444labelLabel_E346HandleGameOverCallE4E2Alt2
445labelLabel_E34FHandleGameOverCallE4E2Alt3
446labelLabel_E418HandleRoundStartEntry
447labelLabel_E41AHandleRoundStartCallE4E2
448labelLabel_E42AHandleRoundStartCallE5AC
449labelLabel_E438HandleRoundStartCallE4E2Alt
450labelLabel_E450HandleRoundStartCallE4E2Alt2
451labelLabel_E458HandleRoundStartCallE4E2Alt3
452labelLabel_E461HandleRoundStartCallE4E2Alt4
453labelLabel_E462UpdateSoundEntry
454labelLabel_E469UpdateSoundCallE4E2
455labelLabel_E46EUpdateSoundCallE5AC
456labelLabel_E479UpdateSoundCallE4E2Alt
457labelLabel_E48AUpdateSoundCallE4E2Alt2
458labelLabel_E496UpdateSoundCallE4E2Alt3
459labelLabel_E4AEUpdateSoundCallE5ACAlt
460labelLabel_E4BDUpdateSoundCallE4E2Alt5
461labelLabel_E4BFUpdateSoundCallE4E2Alt6
462labelLabel_E4EAUpdateSoundCallE5ACAlt2
463labelLabel_E4F6UpdateSoundCallE4E2Alt7
464labelLabel_E50APlaySoundEffectEntry
465labelLabel_E52APlaySoundEffectCallE4E2
466labelLabel_E52BPlaySoundEffectCallE5AC
467labelLabel_E52FPlaySoundEffectCallE4E2Alt
468labelLabel_E543PlaySoundEffectCallE4E2Alt2
469labelLabel_E549PlaySoundEffectCallE5ACAlt
470labelLabel_E56BPlaySoundEffectCallE4E2Alt3
471labelLabel_E582PlaySoundEffectCallE5ACAlt2
472labelLabel_E594PlaySoundEffectCallE4E2Alt4
473labelLabel_E595PlaySoundEffectCallE5ACAlt3
474labelLabel_E5ABUpdateMusicEntry
475labelLabel_E5ACUpdateMusicCallE4E2
476labelLabel_E5CDUpdateMusicCallE5AC
477labelLabel_E5D9UpdateMusicCallE4E2Alt
478labelLabel_E5E4UpdateMusicCallE4E2Alt2
479labelLabel_E5E5UpdateMusicCallE5ACAlt
480labelLabel_E5FBUpdateMusicCallE5ACAlt2
481labelLabel_E60EUpdateMusicCallE4E2Alt3
482labelLabel_E62DUpdateMusicCallE5ACAlt3
483labelLabel_E62FUpdateMusicCallE4E2Alt4
484labelLabel_E630UpdateMusicCallE5ACAlt4
485labelLabel_E641UpdateMusicCallE4E2Alt5
486labelLabel_E65AUpdateMusicCallE5ACAlt5
487labelLabel_E669UpdateMusicCallE4E2Alt6
488labelLabel_E695UpdateMusicLoopEntry
489labelLabel_E6A8UpdateMusicLoopCallE4E2
490labelLabel_E6BEUpdateMusicLoopCallE5AC
491labelLabel_E6CEUpdateMusicLoopCallE4E2Alt
492labelLabel_E6DDUpdateMusicLoopCallE4E2Alt2
493labelLabel_E6E3UpdateMusicLoopCallE5ACAlt
494labelLabel_E6E6UpdateMusicLoopCallE4E2Alt3
495labelLabel_E6F2UpdateMusicLoopCallE5ACAlt2
496labelLabel_E6F9UpdateMusicLoopCallE4E2Alt4
497labelLabel_E70CInitSpriteDataEntry
498labelLabel_E72DInitSpriteDataLoop
499labelLabel_E749InitSpriteDataCallE4E2
500labelLabel_E753InitSpriteDataCallE5AC
501labelLabel_E764InitSpriteDataCallE4E2Alt
502labelLabel_E768InitSpriteDataCallE5ACAlt
503labelLabel_E777InitSpriteDataCallE4E2Alt2
504labelLabel_E77CInitSpriteDataCallE5ACAlt2
505labelLabel_E7A7InitSpriteDataCallE4E2Alt3
506labelLabel_E7ABInitSpriteDataCallE5ACAlt3
507labelLabel_E7AFInitSpriteDataCallE4E2Alt4
508labelLabel_E7B1InitSpriteDataCallE5ACAlt4
509labelLabel_E7BEInitSpriteDataCallE4E2Alt5
510labelLabel_E7C6InitSpriteDataCallE5ACAlt5
511labelLabel_E7D6InitSpriteDataCallE4E2Alt6
512labelLabel_E7DBInitSpriteDataCallE5ACAlt6
513labelLabel_E7F7InitSoundEntry
514labelLabel_E7F9InitSoundCallE4E2
515labelLabel_E80BInitSoundCallE5AC
516labelLabel_E80CInitSoundExit_E80C
517labelLabel_D2C7UpdatePlayersCallE462_CF
518labelLabel_DB48SpriteDMACheckZp96_DB48
519labelLabel_DFBCHandleKOCheckZp1F_DFBC