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

703 lines
33 KiB
Plaintext

label Label_800E WaitForFirstPpuWarmup
label Label_8019 WaitForSecondPpuWarmup
label Label_802C InitializeGameState
label Label_803B InitializeGameState_OnNonzero_803B
label Label_8052 UpdateNametableFromStream
label Label_805B UpdateNametableFromStream_OnNonzero_805B
label Label_8066 UpdateNametableFromStream_OnZero_8066
label Label_806E UpdateNametableFromStream_OnNonnegative_806E
label Label_8077 UpdateNametableFromStream_OnZero_8077
label Label_807A UpdateNametableFromStream_OnZero_807A
label Label_8080 UpdateNametableFromStream_OnZero_8080
label Label_8094 UpdateNametableFromStream_OnZero_8094
label Label_80AC StartStageSequence
label Label_80E0 StartStageSequence_OnZero_80E0
label Label_8105 StartStageSequence_OnNonzero_8105
label Label_810A StartStageSequence_OnNonzero_810A
label Label_811A StartStageSequence_OnZero_811A
label Label_8132 UpdateFadeFlashSprites
label Label_8154 UpdateFadeFlashSprites_OnCarryClear_8154
label Label_8164 InitializeRound
label Label_8173 InitializeRound_OnCarryClear_8173
label Label_8187 InitializeRound_OnNonnegative_8187
label Label_8191 InitializeRound_OnNonzero_8191
label Label_8196 InitializeRound_OnNonnegative_8196
label Label_81A0 InitializeRound_OnNonzero_81A0
label Label_81D6 InitializeRound_OnCarryClear_81D6
label Label_81DA InitializeRound_OnCarryClear_81DA
label Label_81DE InitializeRound_OnCarryClear_81DE
label Label_81E0 InitializeRound_OnCarryClear_81E0
label Label_81E2 InitializeRound_JoinBranchPaths_81E2
label Label_8223 InitializeRound_OnNonzero_8223
label Label_8226 MainGameLoop
label Label_8232 MainGameLoop_OnZero_8232
label Label_8235 MainGameLoop_OnZero_8235
label Label_824D MainGameLoop_OnZero_824D
label Label_8255 MainGameLoop_OnNonzero_8255
label Label_8261 MainGameLoop_OnNonzero_8261
label Label_8267 MainGameLoop_OnNonnegative_8267
label Label_8284 MainGameLoop_OnZero_8284
label Label_828C MainGameLoop_OnNonzero_828C
label Label_8298 MainGameLoop_OnNonzero_8298
label Label_829E MainGameLoop_OnNonnegative_829E
label Label_82AC DivideBy20
label Label_82BE DivideBy20_OnNonzero_82BE
label Label_82DA DivideBy20_OnCarryClear_82DA
label Label_82E1 SilenceSoundChannels1And3
label Label_82ED SilenceSoundChannel3
label Label_82FA StartIntroMusic
label Label_82FF StartMusicSequence
label Label_832A UpdateHudTallyTiles
label Label_833E UpdateHudTallyTiles_OnZero_833E
label Label_8352 UpdateHudTallyTiles_OnZero_8352
label Label_8353 UpdateScoreTallyDigits
label Label_8372 WriteScoreTallyDigits
label Label_8374 WriteScoreTallyDigits_OnCarryClear_8374
label Label_8385 WriteScoreTallyDigits_OnZero_8385
label Label_8390 WriteScoreTallyDigits_OnNonzero_8390
label Label_8399 LoadOamShadowFromTable
label Label_839B LoadOamShadowFromTable_OnNonnegative_839B
label Label_83A7 UpdateActorPositions
label Label_83AB UpdateActorPositions_OnNonnegative_83AB
label Label_83D0 UpdateActorPositions_OnZero_83D0
label Label_83E1 UpdateActorPositions_OnCarryClear_83E1
label Label_841A UpdateActorPositions_OnZero_841A
label Label_8434 UpdateActorPositions_OnNonzero_8434
label Label_845C UpdateRoundTimers
label Label_848D UpdateRoundTimers_OnNonzero_848D
label Label_84A1 UpdateRoundTimers_OnZero_84A1
label Label_84B1 UpdateRoundTimers_OnNonzero_84B1
label Label_84B5 UpdateRoundTimers_OnNonzero_84B5
label Label_84E9 UpdateRoundTimers_OnCarrySet_84E9
label Label_84EE UpdateRoundTimers_OnNonzero_84EE
label Label_84F4 UpdateRoundTimers_OnCarryClear_84F4
label Label_850F UpdateRoundTimers_OnZero_850F
label Label_851C UpdateRoundTimers_OnCarrySet_851C
label Label_851F UpdateRoundTimers_OnNonzero_851F
label Label_8522 UpdateRoundTimers_OnCarrySet_8522
label Label_8564 UpdateRoundTimers_OnZero_8564
label Label_856C PlayRoundChangeMusic
label Label_858F PlayRoundChangeMusic_OnNonzero_858F
label Label_8596 UpdateScrollTarget
label Label_8598 UpdateScrollTargetAlt
label Label_85A3 UpdateScrollTargetAlt_OnZero_85A3
label Label_85A8 UpdateScrollTargetAlt_OnNonzero_85A8
label Label_85DA UpdateScrollTargetAlt_OnNonzero_85DA
label Label_85EC UpdateScrollTargetAlt_JoinBranchPaths_85EC
label Label_8639 BeginVblankFrame
label Label_8644 ForceRenderingOff
label Label_8653 SetRenderingOffAndSignalVblank
label Label_865D UpdateRoundLogic
label Label_8682 UpdateRoundLogic_OnNonzero_8682
label Label_86A0 UpdateRoundLogic_JoinBranchPaths_86A0
label Label_86AA UpdateRoundLogic_JoinBranchPaths_86AA
label Label_86AD UpdateRoundLogic_OnNegative_86AD
label Label_86D8 NmiHandler_OnZero_86D8
label Label_86E3 NmiHandler_OnNonzero_86E3
label Label_86FA NmiHandler_OnZero_86FA
label Label_8703 NmiHandler_OnNegative_8703
label Label_8709 NmiHandler_OnZero_8709
label Label_8728 NmiHandler_OnCarrySet_8728
label Label_872F NmiHandler_OnNonzero_872F
label Label_8742 NmiHandler_OnNonzero_8742
label Label_8751 FinishNmiUpdates
label Label_8759 FinishNmiRegisters
label Label_8765 SetSoundSequenceChannel1
label Label_877C RunGameStateDispatcher
label Label_8787 RunGameStateDispatcher_JoinBranchPaths_8787
label Label_8795 RunGameStateDispatcher_OnNonzero_8795
label Label_87BF UpdateTimersAlt
label Label_87D1 PollControllerStart
label Label_87F1 PollControllerStart_JoinBranchPaths_87F1
label Label_87F2 UpdateFlashCounter
label Label_8801 UpdateFlashCounter_OnZero_8801
label Label_8803 UpdateFlashCounter_OnNonzero_8803
label Label_8819 UpdateFlashCounter_OnCarryClear_8819
label Label_8837 PlayDeathSequence
label Label_8848 PollControllerBits
label Label_885A PollControllerBits_JoinBranchPaths_885A
label Label_885B PollControllerAndAdvance
label Label_886C PollControllerBitsAlt
label Label_887C SignalVblankComplete
label Label_8881 SignalVblankComplete_JoinBranchPaths_8881
label Label_8882 PollControllerAndCheckRound
label Label_888D PollControllerAndCheckRound_OnZero_888D
label Label_8899 PollControllerAndCheckRound_OnCarrySet_8899
label Label_889D PollControllerAndCheckRound_OnNonzero_889D
label Label_88A4 BuildOamList
label Label_88AE BuildOamList_OnNonzero_88AE
label Label_88B0 EmitOamEntry
label Label_88EB EmitOamBlankEntry
label Label_88F3 EmitOamBlankEntry_JoinBranchPaths_88F3
label Label_88F4 EmitOamBlankEntry_OnZero_88F4
label Label_88F9 EmitOamFromTable
label Label_88FF EmitOamAtOffset
label Label_8909 EmitOamAtOffset_OnZero_8909
label Label_890F EmitOamAtOffset_JoinBranchPaths_890F
label Label_891B EmitOamAtOffset_OnZero_891B
label Label_892A EmitOamAtOffset_OnNonzero_892A
label Label_8936 FindFreeOamSlot
label Label_8938 FindFreeOamSlot_OnNonnegative_8938
label Label_8942 FindFreeOamSlot_OnZero_8942
label Label_8943 FindFreeOamSlot_JoinBranchPaths_8943
label Label_896A FindFreeOamSlot_JoinBranchPaths_896A
label Label_896B FindFreeOamSlot_OnZero_896B
label Label_897F FindFreeOamSlot_OnNonzero_897F
label Label_8986 CompactOamList
label Label_898A CompactOamList_OnNonnegative_898A
label Label_899D CompactOamList_OnZero_899D
label Label_899F CompactOamList_OnNonzero_899F
label Label_89A8 CompactOamList_OnZero_89A8
label Label_89AC CompactOamList_OnZero_89AC
label Label_89B0 CompactOamList_OnCarryClear_89B0
label Label_89B2 CompactOamList_OnNonzero_89B2
label Label_89B5 CompactOamList_OnNonzero_89B5
label Label_89B8 CompactOamList_OnNonzero_89B8
label Label_89CE ReadControllerAndInit
label Label_89EE ReadControllerAndInit_OnCarryClear_89EE
label Label_89F7 ReadControllerAndInit_OnNonzero_89F7
label Label_8A28 UpdateStageActors
label Label_8A5D UpdateStageActors_JoinBranchPaths_8A5D
label Label_8A5E SpawnStageActors
label Label_8A68 SpawnStageActors_OnCarryClear_8A68
label Label_8A74 SpawnStageActors_OnZero_8A74
label Label_8A84 SpawnStageActors_OnNonzero_8A84
label Label_8A93 SpawnStageActors_OnZero_8A93
label Label_8AA4 SpawnStageActors_JoinBranchPaths_8AA4
label Label_8AA5 SpawnStageActors_OnZero_8AA5
label Label_8AE1 SpawnStageActors_JoinBranchPaths_8AE1
label Label_8AE8 UpdateAttributeTable
label Label_8B07 ClearScrollLatch
label Label_8B0D ClearScrollLatch_OnNonzero_8B0D
label Label_8B20 WriteNametableTile
label Label_8B25 WriteNametableTile_OnNonzero_8B25
label Label_8B33 ClearAttributeRegion
label Label_8B37 ClearAttributeRegion_JoinBranchPaths_8B37
label Label_8B3B ClearAttributeRegion_OnNonnegative_8B3B
label Label_8B5F ClearAttributeRegion_OnCarryClear_8B5F
label Label_8B67 ClearAttributeRegion_OnZero_8B67
label Label_8B6D ClearAttributeRegion_JoinBranchPaths_8B6D
label Label_8B92 RenderHudDigits
label Label_8BBA RenderHudDigits_OnNonzero_8BBA
label Label_8BEF RenderHudDigitDescriptor
label Label_8BF8 SetRenderingOn
label Label_8BFF SetRenderingOn_OnNonnegative_8BFF
label Label_8C05 AdvanceAnimationSlot
label Label_8C0E QueueVramTransfer
label Label_8C11 QueueVramTransferAlt
label Label_8C3A QueueVramTransferAlt_OnNonnegative_8C3A
label Label_8C55 QueueVramTransferAlt_OnNonzero_8C55
label Label_8C65 ExecuteVramTransfer
label Label_8C72 ExecuteVramTransfer_OnNonzero_8C72
label Label_8C98 ExecuteVramTransfer_OnZero_8C98
label Label_8CB8 QueueVramDescriptor
label Label_9287 QueueVramDescriptor_Entry_9287
label Label_928D QueueVramDescriptor_JumpNext_928D
label Label_9293 QueueVramDescriptor_JumpNext_9293
label Label_929F QueueVramDescriptor_OnNonzero_929F
label Label_92AF QueueVramDescriptor_OnNonzero_92AF
label Label_92B2 QueueVramDescriptor_JumpNext_92B2
label Label_92CD QueueVramDescriptor_JumpNext_92CD
label Label_92E8 QueueVramDescriptor_OnZero_92E8
label Label_9329 QueueVramDescriptor_OnZero_9329
label Label_932C QueueVramDescriptor_JumpNext_932C
label Label_934B UpdateActorX
label Label_9354 UpdateActorX_JumpNext_9354
label Label_9371 UpdateActorTile
label Label_9374 UpdateActorTileAlt
label Label_937C UpdateActorTileAlt_JumpNext_937C
label Label_93A4 UpdateActorTileAlt_JumpNext_93A4
label Label_93C4 UpdateActorTileAlt_OnCarrySet_93C4
label Label_93CC UpdateActorTileAlt_JumpNext_93CC
label Label_93D0 UpdateActorTileAlt_OnZero_93D0
label Label_93D3 UpdateActorTileAlt_OnNonzero_93D3
label Label_9401 UpdateActorTileAlt_OnCarrySet_9401
label Label_9409 UpdateActorTileAlt_JumpNext_9409
label Label_941B UpdateActorTileAlt_JumpNext_941B
label Label_942C UpdateActorTileAlt_OnNegative_942C
label Label_9441 UpdateActorTileAlt_OnNonnegative_9441
label Label_9450 UpdateActorTileAlt_OnNonzero_9450
label Label_9451 UpdateActorTileAlt_OnCarrySet_9451
label Label_9454 UpdateActorTileAlt_OnCarryClear_9454
label Label_945B UpdateActorTileAlt_OnNegative_945B
label Label_9465 UpdateActorTileAlt_JumpNext_9465
label Label_946D UpdateActorTileAlt_JumpNext_946D
label Label_9477 UpdateActorTileAlt_JumpNext_9477
label Label_947D UpdateActorTileAlt_OnZero_947D
label Label_9480 UpdateActorTileAlt_JumpNext_9480
label Label_948F UpdateActorTileAlt_JumpNext_948F
label Label_9499 UpdateActorTileAlt_JumpNext_9499
label Label_94AA UpdateActorTileAlt_OnZero_94AA
label Label_94AD UpdateActorTileAlt_JumpNext_94AD
label Label_94B1 TestPlayerFacing
label Label_94C0 TestPlayerFacing_JumpNext_94C0
label Label_94C7 SelectActorSlot
label Label_94C8 SelectActorSlotAlt
label Label_94CF ClearActorPosition
label Label_94D7 ClearActorFields
label Label_94F3 ClearActorFields_JoinBranchPaths_94F3
label Label_94F6 ClearActorFields_OnNonzero_94F6
label Label_94FE SetActorFlag
label Label_950B SetActorFlag_JumpNext_950B
label Label_9513 SetActorFlag_JumpNext_9513
label Label_951F SetActorFlag_OnNonzero_951F
label Label_9522 SetActorFlag_JumpNext_9522
label Label_9535 SetActorFlag_OnNonzero_9535
label Label_9541 SetActorFlag_Return_9541
label Label_9551 SetActorFlag_OnNonzero_9551
label Label_9559 SetActorFlag_JumpNext_9559
label Label_9585 UpdateActorState
label Label_9590 UpdateActorState_OnNonzero_9590
label Label_95A5 UpdateActorState_OnCarryClear_95A5
label Label_95AE ComputeActorLeftEdge
label Label_95B8 ComputeActorLeftEdge_OnNonzero_95B8
label Label_95C9 ComputeActorLeftEdge_OnCarryClear_95C9
label Label_95D2 ComputeActorRightEdge
label Label_95D9 CompareActorToLimit
label Label_95DC CompareActorToLimit_Return_95DC
label Label_95E3 CompareActorToLimit_OnNonzero_95E3
label Label_9628 CompareActorToLimit_OnCarrySet_9628
label Label_963C CompareActorToLimit_OnCarrySet_963C
label Label_963E CompareActorToLimit_OnNonnegative_963E
label Label_9641 CompareActorToLimit_OnZero_9641
label Label_9644 CompareActorToLimit_JumpNext_9644
label Label_9653 SetActorTileFromPalette
label Label_9664 SetActorTileFromPalette_OnNonzero_9664
label Label_9667 StoreActorTile
label Label_966D StoreActorTile_Return_966D
label Label_9679 StoreActorTile_OnNegative_9679
label Label_968E StoreActorTile_OnNonnegative_968E
label Label_969D StoreActorTile_OnNonzero_969D
label Label_969E AdvanceActorCounter
label Label_96A6 AdvanceActorCounter_OnCarryClear_96A6
label Label_96AA SetActorTileValue
label Label_96B3 SetActorTileValue_OnNonzero_96B3
label Label_96B9 SetActorTileValue_OnNegative_96B9
label Label_96BC SetActorTileValue_JumpNext_96BC
label Label_96C2 SetActorTileValue_Continue_96C2
label Label_96C8 TestActorCollisionFlag
label Label_96CC TestActorCollisionFlag_OnZero_96CC
label Label_96CE TestActorCollisionFlag_OnZero_96CE
label Label_96EE TestActorCollisionFlag_OnCarryClear_96EE
label Label_96F7 ComputeActorLeftEdgeAlt
label Label_9701 ComputeActorLeftEdgeAlt_OnNonzero_9701
label Label_9719 ComputeActorLeftEdgeAlt_OnCarryClear_9719
label Label_9722 ComputeActorRightEdgeAlt
label Label_9729 TestActorRange
label Label_9731 TestActorRange_OnCarrySet_9731
label Label_9732 MoveActorByStep
label Label_975D MoveActorByStep_OnCarrySet_975D
label Label_975E MoveActorByStep_Return_975E
label Label_9766 MoveActorByStep_OnCarryClear_9766
label Label_979A MoveActorByStep_OnNonzero_979A
label Label_97A0 MoveActorByStep_OnNonzero_97A0
label Label_97BC SetActorAnimation63
label Label_97C0 SetActorAnimation62
label Label_97C4 SetActorAnimation61
label Label_97C6 SetActorAnimation61_OnNonzero_97C6
label Label_97D5 UpdateActorAnimation
label Label_97FB UpdateActorAnimation_OnZero_97FB
label Label_97FC TestAnimationSlot
label Label_9800 TestAnimationSlot_JoinBranchPaths_9800
label Label_9802 TestAnimationSlot_OnNonzero_9802
label Label_981C TestAnimationSlot_OnCarryClear_981C
label Label_982A ComputeActorLeftEdgeAt
label Label_9834 ComputeActorLeftEdgeAt_OnNonzero_9834
label Label_984A ComputeActorLeftEdgeAt_OnCarryClear_984A
label Label_9858 ComputeActorRightEdgeAt
label Label_985F TestActorValue
label Label_986A TestActorValue_Return_986A
label Label_9875 TestActorValue_OnCarryClear_9875
label Label_98A7 TestActorValue_OnCarryClear_98A7
label Label_98AA TestActorValue_JoinBranchPaths_98AA
label Label_98AD TestActorValue_JoinBranchPaths_98AD
label Label_98B0 TestActorValue_JumpNext_98B0
label Label_98B7 TestActorValue_OnNonzero_98B7
label Label_98BE TestActorValue_JoinBranchPaths_98BE
label Label_98C1 TestActorValue_OnNonzero_98C1
label Label_98D8 TestActorValue_OnCarryClear_98D8
label Label_98E6 ComputeActorLeftEdgeAlt2
label Label_98F0 ComputeActorLeftEdgeAlt2_OnNonzero_98F0
label Label_9903 ComputeActorLeftEdgeAlt2_OnCarryClear_9903
label Label_9911 UpdateActorTileFromIndex
label Label_9918 UpdateActorTileFromIndexAlt
label Label_9948 UpdateActorTileFromIndexAlt_JoinBranchPaths_9948
label Label_994B UpdateActorTileFromIndexAlt_JumpNext_994B
label Label_996E UpdateActorTileFromIndexAlt_JumpNext_996E
label Label_997C UpdateActorTileFromIndexAlt_JumpNext_997C
label Label_9989 UpdateActorTileFromIndexAlt_OnNonzero_9989
label Label_9994 UpdateActorTileFromIndexAlt_OnNonzero_9994
label Label_99A0 UpdateActorTileFromIndexAlt_OnNonzero_99A0
label Label_99A3 SetSoundSequenceChannel2
label Label_99B0 SetSoundSequenceChannel2_Return_99B0
label Label_99B7 SetSoundSequenceChannel2_JumpNext_99B7
label Label_99D7 SetSoundSequenceChannel2_OnNegative_99D7
label Label_99E2 LookupActorTileId
label Label_99E4 LookupActorTileIdAlt
label Label_9A02 LookupActorTileIdAlt_OnCarryClear_9A02
label Label_9A24 StoreActorCoordinates
label Label_9A2E StoreActorCoordinatesAlt
label Label_9A36 StoreActorCoordinatesAlt_OnNonnegative_9A36
label Label_9A3F FlipActorFacing
label Label_9A4E SpawnActorPair
label Label_9A6B SpawnActorPairAlt
label Label_9ABC SpawnActorPairAlt_OnNonzero_9ABC
label Label_9ACE SpawnActorPairAlt_OnNonzero_9ACE
label Label_9AD3 SpawnActorPairAlt_JoinBranchPaths_9AD3
label Label_9AD8 SpawnActorPairAlt_OnNonzero_9AD8
label Label_9AE8 RunBytecodeInterpreter
label Label_9B05 DispatchThroughPointer
label Label_9B08 DispatchThroughPointer_JoinBranchPaths_9B08
label Label_9B18 DispatchThroughPointer_OnNonzero_9B18
label Label_9B25 RunBytecodeProgram
label Label_9B4C RunBytecodeProgram_OnNonnegative_9B4C
label Label_9B64 RunBytecodeProgram_OnNonnegative_9B64
label Label_9B72 RunBytecodeProgram_OnNonnegative_9B72
label Label_9BA1 RunBytecodeProgram_OnZero_9BA1
label Label_9BB0 RunBytecodeProgram_OnNonzero_9BB0
label Label_9BB4 RunBytecodeProgram_OnNonzero_9BB4
label Label_9BD9 RunBytecodeProgram_OnNonzero_9BD9
label Label_9BDD RunBytecodeProgram_OnNonzero_9BDD
label Label_9BF3 RunBytecodeProgram_OnCarryClear_9BF3
label Label_9C2C RunBytecodeProgram_OnZero_9C2C
label Label_9C2E RunBytecodeProgram_OnNonnegative_9C2E
label Label_9C4C RunBytecodeProgram_OnNonnegative_9C4C
label Label_9C52 RunBytecodeProgram_OnNonnegative_9C52
label Label_9C66 RunBytecodeProgram_OnCarryClear_9C66
label Label_9C71 RunBytecodeProgram_OnZero_9C71
label Label_9C73 RunBytecodeProgram_JoinBranchPaths_9C73
label Label_9C84 RunBytecodeProgram_OnNonzero_9C84
label Label_9C8D RunBytecodeProgram_OnCarryClear_9C8D
label Label_9C91 RunBytecodeProgram_JoinBranchPaths_9C91
label Label_9CAD RunBytecodeProgram_Return_9CAD
label Label_9CBB ResetBytecodeState
label Label_9CDB ResetBytecodeState_OnCarryClear_9CDB
label Label_9CE5 ResetBytecodeState_OnCarryClear_9CE5
label Label_9D04 ResetBytecodeState_OnNonnegative_9D04
label Label_9D0D ResetBytecodeState_OnCarrySet_9D0D
label Label_9D10 ResetBytecodeState_OnNonzero_9D10
label Label_9D39 ResetBytecodeState_OnZero_9D39
label Label_9D4A ResetBytecodeState_OnZero_9D4A
label Label_9D4E CopyActorCoordinates
label Label_9D61 CopyActorCoordinates_OnCarryClear_9D61
label Label_9DA2 CopyActorCoordinates_OnNonzero_9DA2
label Label_9DB6 CopyActorCoordinates_OnZero_9DB6
label Label_9DBB CopyActorCoordinates_OnNonzero_9DBB
label Label_9DD0 CopyActorCoordinates_OnCarryClear_9DD0
label Label_9DD4 CopyActorCoordinates_OnCarryClear_9DD4
label Label_9DD6 SetActorBounds
label Label_9DE6 LoadActorTileIndex
label Label_9E02 LoadActorTileIndex_OnCarrySet_9E02
label Label_9E19 LoadActorTileIndex_OnZero_9E19
label Label_9E37 LoadActorTileIndex_OnNonzero_9E37
label Label_9E4B LoadActorTileIndex_OnZero_9E4B
label Label_9E50 LoadActorTileIndex_OnNonzero_9E50
label Label_9E65 LoadActorTileIndex_OnCarryClear_9E65
label Label_9E69 LoadActorTileIndex_OnCarryClear_9E69
label Label_9E6B LoadActorTileIndex_OnNonzero_9E6B
label Label_9E6E UpdateActorFacing
label Label_9E7F QueueNametableWrite
label Label_9E87 QueueNametableWrite_OnNonzero_9E87
label Label_9E89 QueueNametableWrite_OnNonnegative_9E89
label Label_9F14 FlushNametableWrite
label Label_9F2A FlushNametableWrite_JoinBranchPaths_9F2A
label Label_9F4B UpdateActorMovement
label Label_9F54 MoveActorByOpcode
label Label_9F7F MoveActorByOpcode_JoinBranchPaths_9F7F
label Label_9F83 MoveActorByOpcode_JoinBranchPaths_9F83
label Label_9FAC MoveActorByOpcode_OnCarryClear_9FAC
label Label_9FB8 MoveActorByOpcode_OnNonzero_9FB8
label Label_9FBA MoveActorByOpcode_JoinBranchPaths_9FBA
label Label_9FBB MoveActorByOpcode_Return_9FBB
label Label_9FC2 MoveActorByOpcode_Continue_9FC2
label Label_9FC9 MoveActorByOpcode_Continue_9FC9
label Label_9FD0 MoveActorByOpcode_Continue_9FD0
label Label_9FD7 MoveActorByOpcode_Continue_9FD7
label Label_9FDF AddToNametableValue
label Label_9FEF AddToNametableValue_Return_9FEF
label Label_9FFA AddToNametableValue_JumpNext_9FFA
label Label_A002 SubtractFromNametableValue
label Label_A012 SubtractFromNametableValue_Return_A012
label Label_A01D ProcessBytecodeOpcode
label Label_A060 ProcessBytecodeOpcode_OnCarrySet_A060
label Label_A062 ProcessBytecodeOpcode_JoinBranchPaths_A062
label Label_A07B ProcessBytecodeOpcode_JoinBranchPaths_A07B
label Label_A085 ComputeBytecodeOffset
label Label_A08B ComputeBytecodeOffset_OnNonzero_A08B
label Label_A09F ComputeBytecodeOffset_OnCarryClear_A09F
label Label_A0A5 ResetBytecodeAccumulator
label Label_A0AD ResetBytecodeAccumulator_OnNonzero_A0AD
label Label_A0C2 ResetBytecodeAccumulator_OnCarryClear_A0C2
label Label_A0C6 ResetBytecodeAccumulatorAlt
label Label_A0CE ResetBytecodeAccumulatorAlt_OnNonzero_A0CE
label Label_A0EC ResetBytecodeAccumulatorAlt_OnCarryClear_A0EC
label Label_A0F4 AdvanceBytecodeProgram
label Label_A0FB ResetBytecodeStateAlt
label Label_A105 ResetBytecodeStateAlt_OnNonzero_A105
label Label_A122 ResetBytecodeStateAlt_OnCarryClear_A122
label Label_A12E ComputeActorTileRow
label Label_A14F ComputeActorTileRow_OnNonnegative_A14F
label Label_A157 ComputeActorTileRow_JoinBranchPaths_A157
label Label_A15D ResetBytecodePointers
label Label_A165 ResetBytecodePointers_OnNonzero_A165
label Label_A179 ResetBytecodePointers_OnCarryClear_A179
label Label_A17F RunActorScript
label Label_A1A5 RunActorScript_OnCarrySet_A1A5
label Label_A1C3 RunActorScript_OnZero_A1C3
label Label_A1E3 RunActorScript_OnNonnegative_A1E3
label Label_A1F1 RunActorScript_OnNonnegative_A1F1
label Label_A201 RunActorScript_OnNonzero_A201
label Label_A246 RunActorScript_OnZero_A246
label Label_A250 LoadActorConfigByte
label Label_A253 ComputeActorConfigOffset
label Label_A25F CopyConfigBytes
label Label_A261 CopyConfigBytes_OnNonnegative_A261
label Label_A270 LoadActorConfigRecord
label Label_A28D LoadActorConfigRecord_JoinBranchPaths_A28D
label Label_A298 CompareConfigValue
label Label_A2BD CompareConfigValue_JoinBranchPaths_A2BD
label Label_A2C8 ReturnFromConfigLoad
label Label_A2C9 LoadActorConfigFields
label Label_A2D8 LoadActorConfigFields_OnZero_A2D8
label Label_A2EB LoadActorConfigFields_OnNegative_A2EB
label Label_A2F1 LoadActorConfigFields_OnNonzero_A2F1
label Label_A305 LoadActorConfigFields_OnZero_A305
label Label_A30B LoadActorConfigFields_OnNonzero_A30B
label Label_A316 StoreActorPaletteByte
label Label_A32A StoreActorPaletteByte_OnZero_A32A
label Label_A32C StoreActorControlByte
label Label_A334 StoreActorControlByte_OnZero_A334
label Label_A338 ReadActorConfigByte
label Label_A388 ReadActorConfigByte_JoinBranchPaths_A388
label Label_A3A5 ReadActorConfigByte_JoinBranchPaths_A3A5
label Label_A3B1 ReadActorConfigByte_OnNonzero_A3B1
label Label_A3C9 ReadActorConfigByte_OnCarrySet_A3C9
label Label_A3E9 ReadActorConfigByte_OnCarrySet_A3E9
label Label_A3F1 ReadActorConfigByte_OnNonzero_A3F1
label Label_A3FA ReadActorConfigByte_OnNonzero_A3FA
label Label_A406 ReadActorConfigByte_JoinBranchPaths_A406
label Label_A40A ReadActorConfigByte_OnCarrySet_A40A
label Label_A40D ReadActorConfigByte_OnNonzero_A40D
label Label_A418 ReadActorConfigByte_OnZero_A418
label Label_A423 ReadActorConfigByte_OnNonzero_A423
label Label_A428 ReadActorConfigByte_OnCarrySet_A428
label Label_A430 ReadActorConfigByte_JoinBranchPaths_A430
label Label_A435 CompareActorConfigValue
label Label_A44E CompareActorConfigValue_OnZero_A44E
label Label_A459 CompareActorConfigValue_OnZero_A459
label Label_A464 CompareActorConfigValue_OnZero_A464
label Label_A46D CompareActorConfigValue_OnNonzero_A46D
label Label_A46F StoreActorConfigResult
label Label_A475 StoreActorConfigResult_JoinBranchPaths_A475
label Label_A482 LoadActorConfigAlt
label Label_A48D LoadActorConfigAlt_OnZero_A48D
label Label_A49B LoadActorConfigAlt_OnZero_A49B
label Label_A49F StoreActorConfigResultAlt
label Label_A4A5 StoreActorConfigResultAlt_OnZero_A4A5
label Label_A4AA LoadActorFacingFlag
label Label_A4B5 LoadActorFacingFlag_OnNonzero_A4B5
label Label_A4BA LoadActorFacingFlag_OnCarryClear_A4BA
label Label_A4C2 LoadActorFacingFlag_JoinBranchPaths_A4C2
label Label_A4C7 LoadActorConfigBlock
label Label_A4DF TestSoundChannelState
label Label_A4F1 TestSoundChannelState_OnNonzero_A4F1
label Label_A4F2 SetSoundSequenceChannel2Alt
label Label_A4FF FlipObjectIndex
label Label_A508 LookupObjectIndex
label Label_A512 UpdateObjectSlots
label Label_A51B AdvanceObjectSlot
label Label_A522 AdvanceObjectSlot_OnNonzero_A522
label Label_A52D AdvanceObjectSlot_OnCarrySet_A52D
label Label_A532 AdvanceObjectSlot_OnCarryClear_A532
label Label_A583 AdvanceObjectSlot_OnNegative_A583
label Label_A5DD WriteNametableBytes
label Label_A5DF WriteNametableBytes_OnNonnegative_A5DF
label Label_A660 SetSoundSequenceChannel4
label Label_A67F SetSoundSequenceChannel4_OnZero_A67F
label Label_A68E UpdateObjectList
label Label_A695 UpdateObjectListEntry
label Label_A6BE UpdateObjectListEntry_OnNegative_A6BE
label Label_A6DF UpdateObjectListEntry_OnNonzero_A6DF
label Label_A6EB UpdateObjectListEntry_OnZero_A6EB
label Label_A6EF UpdateObjectListEntry_OnZero_A6EF
label Label_A6F8 UpdateObjectCollisions
label Label_A70D UpdateObjectCollisions_OnNonzero_A70D
label Label_A714 UpdateObjectCollisions_OnNonzero_A714
label Label_A728 UpdateObjectCollisions_OnNonzero_A728
label Label_A729 UpdateObjectCollisions_OnCarryClear_A729
label Label_A73D UpdateObjectCollisions_OnNonzero_A73D
label Label_A745 UpdateObjectCollisions_OnNonzero_A745
label Label_A758 UpdateObjectCollisions_OnNonzero_A758
label Label_A75D UpdateObjectCollisions_OnNonzero_A75D
label Label_A773 UpdateObjectCollisions_OnCarryClear_A773
label Label_A77F UpdateObjectCollisions_OnCarryClear_A77F
label Label_A78F UpdateObjectCollisions_JoinBranchPaths_A78F
label Label_A79B UpdateObjectCollisions_OnZero_A79B
label Label_A79C UpdateObjectCollisions_OnZero_A79C
label Label_A79F CheckObjectScroll
label Label_A7B0 CheckObjectScroll_OnNonzero_A7B0
label Label_A7B8 CheckObjectScroll_OnZero_A7B8
label Label_A7BF CheckObjectScroll_OnNonnegative_A7BF
label Label_A7CA CheckObjectScroll_OnNegative_A7CA
label Label_A7E1 CheckObjectScroll_OnNonzero_A7E1
label Label_A7E8 CheckObjectScroll_OnNonzero_A7E8
label Label_A7FD CheckObjectScroll_JoinBranchPaths_A7FD
label Label_A800 CheckObjectScroll_OnNonnegative_A800
label Label_A82F ClearScrollLatchAlt
label Label_A833 ClearScrollLatchAlt_OnCarryClear_A833
label Label_A834 UpdateObjectSprite
label Label_A842 UpdateObjectSprite_OnCarryClear_A842
label Label_A856 UpdateObjectSprite_OnCarrySet_A856
label Label_A862 UpdateObjectSprite_OnZero_A862
label Label_A884 SetObjectFlags
label Label_A89D SetObjectFlags_OnCarryClear_A89D
label Label_A8D1 AdvanceObjectFrame
label Label_A8E9 TestObjectActive
label Label_A8F9 TestObjectActive_OnNonzero_A8F9
label Label_A916 TestObjectActive_OnNonnegative_A916
label Label_A936 TestObjectActive_OnNonzero_A936
label Label_A949 UpdateObjectAnimations
label Label_A952 UpdateObjectAnimation
label Label_A982 UpdateObjectAnimation_OnCarryClear_A982
label Label_A991 UpdateObjectAnimation_JoinBranchPaths_A991
label Label_A992 UpdateObjectTimer
label Label_A99E DecrementObjectCounter
label Label_A9A4 DecrementObjectCounter_OnZero_A9A4
label Label_A9AA DecrementObjectCounter_JoinBranchPaths_A9AA
label Label_A9AB UpdateObjectState
label Label_A9C9 UpdateObjectState_OnCarrySet_A9C9
label Label_A9CD UpdateObjectState_OnZero_A9CD
label Label_A9D6 UpdateObjectState_OnNegative_A9D6
label Label_A9D8 ToggleScrollRegionFlip
label Label_A9E9 ToggleScrollRegionFlip_OnNonzero_A9E9
label Label_A9EA ToggleScrollRegionFlip_OnCarrySet_A9EA
label Label_A9FF BuildObjectList
label Label_AA55 ToggleScrollRegionFlip_OnCarrySet_AA55
label Label_AA56 ReadControllers
label Label_AA63 ReadControllerShiftRegister
label Label_AA69 ReadControllerShiftRegister_OnNonzero_AA69
label Label_AA82 ReadControllerShiftRegister_JoinBranchPaths_AA82
label Label_AA98 ReadControllerShiftRegister_OnZero_AA98
label Label_AA9D ReadControllerShiftRegister_OnCarrySet_AA9D
label Label_AAA1 ReadControllerShiftRegister_OnCarrySet_AAA1
label Label_AAA8 ReadControllerShiftRegister_OnCarrySet_AAA8
label Label_AAAE ReadControllerShiftRegister_OnCarryClear_AAAE
label Label_AAB4 ReadControllerShiftRegister_OnCarrySet_AAB4
label Label_AAB8 StoreControllerButtonBits
label Label_AAC0 StoreControllerButtonBits_OnZero_AAC0
label Label_AACC StoreControllerButtonBits_OnZero_AACC
label Label_AACD EnableRendering
label Label_AADC DisableRenderingAndClearNametables
label Label_AAEF ClearNametablePattern
label Label_AAFF ClearNametablePattern_OnNonzero_AAFF
label Label_AB0B ClearNametablePattern_OnNonzero_AB0B
label Label_AB68 CopyPaletteFromTable
label Label_AB7D CopyPaletteFromTable_OnNonnegative_AB7D
label Label_AB98 LoadShadowOamBlock
label Label_ABA3 FillShadowOamBlock
label Label_ABA8 FillShadowOamBlock_OnNonnegative_ABA8
label Label_ABB1 UploadPalette
label Label_ABC4 UploadPalette_OnCarryClear_ABC4
label Label_ABE4 ApplyPpuScrollAndControl
label Label_ABF7 ShiftAccumulatorRight4
label Label_ABFC ClearOamShadow
label Label_AC03 ClearOamShadow_OnNonzero_AC03
label Label_AC0D SelectLevelVramWriter
label Label_AC3B SetLevelVramStream
label Label_AC43 FillAttributeBlock
label Label_AC4C WriteAttributeBlock
label Label_AC56 WriteAttributeBlock_OnNonzero_AC56
label Label_AC62 LoadAttributeStream
label Label_AC78 SetPpuAddressHighAnd40
label Label_AC82 WriteCompressedVramStream
label Label_AC88 AdvanceSourceByte
label Label_AC96 DecodeVramStreamToken
label Label_AC9E AdvanceSourceByte_OnCarrySet_AC9E
label Label_ACA1 AdvanceSourceByte_OnZero_ACA1
label Label_ACA7 WriteVramRunToken
label Label_ACB5 AdvanceSourceByte_OnNonzero_ACB5
label Label_ACC9 AdvanceDestinationWord
label Label_ACD7 AdvanceCountWord
label Label_ACE5 WithRenderingEnabled
label Label_ACF5 WriteCompressedVramBlocks
label Label_AD01 WriteCompressedVramBlocks_OnNonzero_AD01
label Label_AD19 ComputeCollisionBits
label Label_AD36 ComputePlayerOverlapBits
label Label_AD71 ComputePlayerOverlapBits_OnCarrySet_AD71
label Label_AD73 ComputePlayerOverlapBits_OnNonzero_AD73
label Label_AD7A ComputePlayerOverlapBits_JoinBranchPaths_AD7A
label Label_AD84 ComputePlayerOverlapBits_OnCarrySet_AD84
label Label_AD8B ComputePlayerOverlapBits_OnZero_AD8B
label Label_AD91 ComputePlayerOverlapBits_OnCarrySet_AD91
label Label_AD94 ComputePlayerOverlapBits_JoinBranchPaths_AD94
label Label_ADAD ComputePlayerOverlapBits_OnNonnegative_ADAD
label Label_ADAF ComputePlayerOverlapBits_OnNonzero_ADAF
label Label_ADB1 ComputePlayerOverlapBits_OnCarryClear_ADB1
label Label_ADC2 ComputePlayerOverlapBits_JoinBranchPaths_ADC2
label Label_AE01 ComputePlayerOverlapBits_OnCarrySet_AE01
label Label_AE03 ComputePlayerOverlapBits_OnNonzero_AE03
label Label_AE0B ComputePlayerOverlapBits_OnNegative_AE0B
label Label_AE0F ComputePlayerOverlapBits_JoinBranchPaths_AE0F
label Label_AE11 ComputePlayerOverlapBits_OnNonzero_AE11
label Label_AE15 ComputePlayerOverlapBits_OnCarryClear_AE15
label Label_AE16 ComputePlayerOverlapBits_OnZero_AE16
label Label_AE45 SetDefaultOverlapBits
label Label_AE51 SetDefaultOverlapBits_OnNonzero_AE51
label Label_AE53 SetDefaultOverlapBits_OnNonzero_AE53
label Label_AE56 SetDefaultOverlapBits_OnCarryClear_AE56
label Label_AE63 SetDefaultOverlapBits_OnCarrySet_AE63
label Label_AE72 SetDefaultOverlapBits_OnCarrySet_AE72
label Label_AE80 SetDefaultOverlapBits_OnNegative_AE80
label Label_AE82 SetDefaultOverlapBits_OnNonzero_AE82
label Label_AE88 SetDefaultOverlapBits_OnCarrySet_AE88
label Label_AE90 SetDefaultOverlapBits_OnNegative_AE90
label Label_AE92 SetDefaultOverlapBits_OnNonzero_AE92
label Label_AE96 SetDefaultOverlapBits_OnNonzero_AE96
label Label_AE9B ComputeEdgeOverlapBits
label Label_AEBE ComputeEdgeOverlapBits_OnNonzero_AEBE
label Label_AECA ComputeEdgeOverlapBits_JoinBranchPaths_AECA
label Label_AEDC ComputeEdgeOverlapBits_JoinBranchPaths_AEDC
label Label_AEE3 ComputeEdgeOverlapBits_OnZero_AEE3
label Label_AEE9 ComputeEdgeOverlapBits_JoinBranchPaths_AEE9
label Label_AEEA ComputeEdgeOverlapBits_JoinBranchPaths_AEEA
label Label_AEFA ComputeEdgeOverlapBits_OnZero_AEFA
label Label_AF01 ComputeEdgeOverlapBits_JoinBranchPaths_AF01
label Label_AF24 ComputeEdgeOverlapBits_JoinBranchPaths_AF24
label Label_AF25 InitializeSoundEngine
label Label_AF3B UpdateSoundFrame
label Label_AF40 UpdateAllSoundChannels
label Label_AF43 UpdateSoundChannel
label Label_AF55 AdvanceSoundChannelNote
label Label_AF68 UpdateSoundChannel_JoinBranchPaths_AF68
label Label_AF69 WriteSoundChannelState
label Label_AF6B RebuildApuEnableMask
label Label_AF73 StartSoundChannelNote
label Label_AFAB AdvanceSoundSequencePointer
label Label_AFC5 ComputeEnvelopeMask
label Label_AFD5 ComputeEnvelopeMask_OnZero_AFD5
label Label_AFD9 ComputeTonePeriod
label Label_B000 ShiftNoteTableIndex
label Label_B007 WriteToneRegisters
label Label_B028 ComputeTonePeriod_OnCarrySet_B028
label Label_B029 WriteFixedToneRegisters
label Label_B036 ComputeTonePeriod_OnCarrySet_B036
label Label_B037 ComputeTonePeriod_OnCarrySet_B037
label Label_B03A ReadNoteDuration
label Label_B049 StoreNoteDuration
label Label_B058 ReadNoteDuration_OnZero_B058
label Label_B059 StoreShortNoteDuration
label Label_B05D BuildApuChannelMask
label Label_B062 WriteApuEnable
label Label_B069 WriteApuEnable_OnNegative_B069
label Label_B06C ApplySoundCommand
label Label_B083 WriteApuControlRegister
label Label_B08C AdvanceSoundSequenceStep
label Label_B08E AdvanceSoundSequenceStepAlt
label Label_B095 ReturnFromSoundCommand
label Label_B096 ReadLoopFlag
label Label_B09D HandleNoteTerminator
label Label_B0A9 HandleSustainCounter
label Label_B0B3 LoadSoundSequenceStep
label Label_B0BB LoadSoundSequenceStep_OnCarrySet_B0BB
label Label_B0C6 DecrementSustainCounter