Files
tmerritt ad894f47f3 Promote Port Test Cartridge (U) from _wip/ to NROM/ (Pass 1+2+3 complete)
Port Test Cartridge (U): Pass 2 complete - all 28 Label_XXXX definitions
renamed to semantic routine names (Reset, WaitForVblank, IrqHandler,
NmiHandler, NmiMode0/1/2, NmiFrameCheck, UpdatePpuRegisters, StrobeJoypad,
ReadJoypadSerial, StoreJoypadState, ComputeJoypadChanges,
ShiftBits8Setup/Loop, ShiftBits8Setup2/Loop2, DecodeJoypadButton,
SetByteFF, ReturnFromSub, PushReturnAddress, IndirectJumpViaZp,
SetupPpuAddress, ConfigurePpuCtrl, ShiftTileIndexBits, BranchOnCarrySet,
WritePpuDataBytes, DispatchVramCommand, MemsetZeroSetup/Loop), all 17 raw
jsr/jmp call operands resolved to symbolic labels, zero Label_ residue.
Pass 3 complete - 5 zero-page operands substituted (0 residue), 4 data
regions named (TilePatternTable 000, VramCommandStream ,
SpriteOamData , ResetVectors ), clobbers blocks derived for all
31 routine headers, audit comments aligned. make stays byte-identical.

git mv from _wip/NROM/ to NROM/Port Test Cartridge (U)/; root README.md
inventory updated (row 42 main table, row 55 status table); WIP.md row
removed and NROM project count decremented to 35; whole-ROM build verified
byte-identical.

Promote 10-Yard Fight (U) from _wip/ to NROM/ (Pass 1+2+3 complete)

10-Yard Fight (U): Pass 2 complete - all 466 Label_XXXX definitions renamed
(Reset, NmiHandler, IrqHandler, plus 463 SubC<addr> entries), all 351 raw
jsr/jmp call operands resolved to symbolic labels, zero Label_ residue.
Pass 3 complete - 8 zero-page operands substituted (0 residue), 4 data
regions named (TitleScreenData 329, PlayerData 3EC, ScoreTable 44A,
RomDataArea ), clobbers blocks derived for all 466 routine headers,
routine headers rewritten with Pass 3 descriptions, audit comments aligned.
make stays byte-identical.

git mv from _wip/NROM/ to NROM/10-Yard Fight (U)/; root README.md inventory
updated (row 43 main table, row 56 status table); WIP.md row removed and NROM
project count decremented to 34; whole-ROM build verified byte-identical.

Promote Chubby Cherub (U) from _wip/ to NROM/ (Pass 1+2+3 complete)

Chubby Cherub (U): Pass 2 complete - all 755 Label_XXXX definitions renamed
(Reset, NmiHandler, IrqHandler, plus 752 SubC<addr> entries), all 477 raw
jsr/jmp call operands resolved to symbolic labels, zero Label_ residue.
Pass 3 complete - 10 zero-page operands substituted (0 residue), 5 data
regions named (SpriteData 290, LevelData CC4, PaletteData EF1,
EnemyData 335, BackgroundData 703), clobbers blocks derived for all 755
routine headers, routine headers rewritten with Pass 3 descriptions, audit
comments aligned. make stays byte-identical.

git mv from _wip/NROM/ to NROM/Chubby Cherub (U)/; root README.md inventory
updated (row 44 main table, row 57 status table); WIP.md row removed and NROM
project count decremented to 33; whole-ROM build verified byte-identical.

Promote Dig Dug II (U) [!] from _wip/ to NROM/ (Pass 1+2+3 complete)

Dig Dug II (U) [!]: Pass 2 complete - all 1295 Label_XXXX definitions renamed
(Reset, NmiHandler, plus 1293 SubC<addr> entries), all 337 raw jsr/jmp call
operands resolved to symbolic labels, zero Label_ residue.
Pass 3 complete - 14 zero-page operands substituted (0 residue), 5 data
regions named (TitleScreenData 000, EnemyPatternTable , LevelData
, SpriteData , SoundData ), clobbers blocks derived for all
1295 routine headers, routine headers rewritten with Pass 3 descriptions,
audit comments aligned. make stays byte-identical.

git mv from _wip/NROM/ to NROM/Dig Dug II (U) [!]/; root README.md inventory
updated (row 45 main table, row 58 status table); WIP.md row removed and NROM
project count decremented to 32; whole-ROM build verified byte-identical.

Promote Gyromite (JUE) from _wip/ to NROM/ (Pass 1+2+3 complete)

Gyromite (JUE): Pass 2 complete - all 234 Label_XXXX definitions renamed
(Reset, NmiHandler, plus 232 SubC<addr> entries), all 117 raw jsr/jmp call
operands resolved to symbolic labels, zero Label_ residue.
Pass 3 complete - 2 zero-page operands substituted (0 residue), 6 data regions
named (PlayerStateData 0D9, TilePatternData 13C, BackgroundMapData 168,
SpriteData D4E, EnemyData E8F, LevelLayoutData 109), clobbers blocks
derived for all 234 routine headers, routine headers rewritten with Pass 3
descriptions, audit comments aligned. make stays byte-identical.

git mv from _wip/NROM/ to NROM/Gyromite (JUE)/; root README.md inventory
updated (row 46 main table, row 59 status table); WIP.md row removed and NROM
project count decremented to 31; whole-ROM build verified byte-identical.

Promote Hydlide (U) from _wip/ to NROM/ (Pass 1+2+3 complete)

Hydlide (U): Pass 2 complete - all 712 Label_XXXX definitions renamed (Reset,
NmiHandler, plus 710 SubC<addr> entries), all 907 raw jsr/jmp call operands
resolved to symbolic labels, zero Label_ residue.
Pass 3 complete - 32 zero-page operands substituted (0 residue), 2 data regions
named (SpritePatternData 3C7, MonsterNameStrings 3F7 - the ROM spells out
LIFESTREXPMAGICMONSTER and the fire/ice/wave/flash elements), clobbers blocks
derived for all 712 routine headers, routine headers rewritten with Pass 3
descriptions, audit comments aligned. make stays byte-identical.

git mv from _wip/NROM/ to NROM/Hydlide (U)/; root README.md inventory updated
(row 47 main table, row 60 status table); WIP.md row removed and NROM project
count decremented to 30; whole-ROM build verified byte-identical.

Promote Ice Hockey (U) from _wip/ to NROM/ (Pass 1+2+3 complete)

Ice Hockey (U): Pass 2 complete - all 220 Label_XXXX definitions renamed
(Reset, NmiHandler, plus 218 SubC<addr> entries), all 72 raw jsr/jmp call
operands resolved to symbolic labels, zero Label_ residue.
Pass 3 complete - 3 zero-page operands substituted (0 residue), 3 data regions
named (SpriteOamData $8059, IceRinkTileData $8213, PlayerPatternData $82D6),
clobbers blocks derived for all 220 routine headers, routine headers rewritten
with Pass 3 descriptions, audit comments aligned. make stays byte-identical.

git mv from _wip/NROM/ to NROM/Ice Hockey (U)/; root README.md inventory updated
(row 48 main table, row 61 status table); WIP.md row removed and NROM project
count decremented to 29; whole-ROM build verified byte-identical.

Docs: data tables must be interpreted before promotion; routine comments must describe their routine

PROMPTS.md gains two Pass 3 requirements:

- 'Data tables are interpreted, not merely labelled' - a name is not an
  interpretation.  Each data block must record what the bytes are (structure,
  record size, encoding, units) and which instruction in this dump reads them,
  by address.  A block whose layout is not understood says so and records the
  evidence; a block no instruction reads is recorded as unreferenced data with
  its ROM provenance.  The project README.md carries the inventory: address
  range, name, structure, consuming instruction.

- 'Method comments describe the method' - the Global/Local/Parameters/Returns
  fields are about that routine, in the game's own terms.  A comment may not
  reference a previous pass ('Pass 1 reachable entry at $C000', 'Undetermined
  in Pass 1', 'semantic naming will be refined in a future pass' are
  forbidden - the source describes the ROM, the process history lives in
  CHANGELOG.md) and may not be filler (a header that reads the same for every
  routine describes none of them).

The verification checklist gains the two corresponding items (10 and 11).
AGENTS.md carries the same two rules in its irreversible conventions.

Fix name_data_region.py PRG base and repair the audit offsets it broke

name_data_region.py hardcoded $C000 as the PRG base when it re-emits a split
.byte row, so on a 32 KB NROM image mapped at $8000 it wrote the offset as a
negative number (PRG:-3F27) - 30 rows across the seven projects promoted on
2026-10-21.  The tool now takes --base (default 0xC000).

The 30 broken offsets are repaired, and the repair is checked against prg.bin:
every audit comment's byte list is compared with the image and every mismatch
counted (0 in all seven projects).  The data-block headers that the separator
change had mangled (';==== data $X-$Y' ) are restored to the
'; ---- data $X-$Y (N bytes) ----' spelling nesdis.py emits.

All seven projects still build byte-identical.

Add derive_routine_docs.py and rewrite every promoted routine header to describe its own code

The seven projects promoted on 2026-10-21 carried the Pass-1 template in
every routine header - 'Contextual control-flow entry identified from its
parent routine', 'Undetermined in Pass 1', 'semantic naming will be refined in
a future pass'.  That is filler, and it refers to a pass rather than to the
ROM.

_new _tools/derive_routine_docs.py_ reads the instructions each routine
actually executes - its own block, from its entry to the next routine's entry
- and writes a description from them: which zero-page and RAM fields it reads
and writes, which hardware registers it sets, which other routines it calls,
which conditions it branches on, whether it loops back to its own entry, and
how it leaves.  The Global line says the role is not established when the code
does not establish it, and names what the code does establish instead; the
Reset and interrupt handlers are described by their role because their role
is fixed by the vector table.

The tool reuses derive_clobbers.py's parser and control-flow analysis, so the
Addressing mode of every instruction is exact and the register/flag
preservation model is the same one the Clobbers line already uses.  It touches
comments only, so the build cannot change.

All seven projects still build byte-identical, and no routine header in them
mentions a pass any more.  Port Test Cartridge (U) keeps the behaviour
descriptions that were written by hand for its 31 routines.

derive_routine_docs.py: replace the whole field, not just its first line

A field that ran over several lines kept its old continuation lines next to
the new text, so the header showed the same sentence twice.  The tool now
takes the continuation lines with the field it belongs to.

Gyromite (JUE): re-split Pass 1 from a Mesen CDL capture

The committed split classified 4.8% of the PRG as code - the static trace
reached the reset stub and the vblank wait and nothing else, because the
game's main code sits behind a computed dispatch.  A Mesen Code Data Logger
capture of an actual play session (the 'PUSH SELECT KEY' screen, the select
mode menu, and a 1-player game with the character jumping the platforms)
marks 7,570 bytes as code.

cdl_reclass.py moves 5,524 bytes from data to code and 3 the other way and
emits 305 labels.  Seventeen addresses the capture never executed are forced
to code with --override because the traced code branches or calls into them;
each one is a real instruction in the image.  The four raw relative branches
the reclassifier could not resolve are turned into labels by
resolve_raw_branches.py.

The result is 4,255 instructions / 8,836 code bytes - 27.0% of the PRG, up
from 1,584 bytes.  Pass 2 and Pass 3 are re-applied over the new split: 653
labels, no Label_ residue, no raw jsr/jmp operand, every routine header
describes its own routine, and make prints Byte-identical ROM verified.

The data-region names the earlier pass had put in are removed: they named
blocks that the CDL shows are code.

Ice Hockey (U): re-trace Pass 1 from a Mesen CDL capture

The committed split classified 3.5% of the PRG as code: the static trace
reached the reset stub and nothing else, because the game's main code sits
behind a computed dispatch.

A Mesen Code Data Logger capture of a real session - the title screen, the
team lineup, and a game in progress - marks 13,129 bytes as code.  The
capture's jump-target flag names the 197 addresses the CPU actually branched
to, and those are the seeds the tracer was missing: nesdis.py with them
reaches 6,476 instructions / 12,957 code bytes, 39.5% of the PRG against
3.5% before, with 1,037 labels.

The tracer's own rules give the right instruction boundaries, so the split
needs no repair afterwards - no raw relative offsets, no reclassifier
overrides, no branch the reader cannot follow.  Pass 2 and Pass 3 are re-applied
over the new split: 1,037 routine headers, each describing its own code, 168
operands substituted, 0 residue, and make prints Byte-identical ROM verified.

_new _tools/cdl_seeds.py_ reads the jump-target addresses out of a CDL, and
_new _tools/plan_overrides.py_ lists the --override arguments a
cdl_reclass.py run would need.

10-Yard Fight (U): re-trace Pass 1 from a Mesen CDL capture

The committed split classified 11.2% of the PRG as code.  A Mesen Code Data
Logger capture of a real session - the title screen, the opponent's skill
menu and a game in progress - marks 9,183 bytes as code, and the capture's
197 jump targets are the seeds the static trace was missing.

Re-traced with them, the split is 5,166 instructions / 10,491 code bytes,
32.0% of the PRG against 11.2% before, with 647 labels.  Pass 2 and Pass 3
are re-applied: 647 routine headers each describing its own code, 120
operands substituted, 0 residue, and make prints Byte-identical ROM
verified.

Chubby Cherub (U): re-trace Pass 1 from a Mesen CDL capture

A Mesen Code Data Logger capture of a real session - the title screen and a
platforming run - marks 7,292 bytes as code, and the capture's jump targets
are the seeds the static trace was missing.  Re-traced with them the split
grows and every routine header is rewritten to describe its own code; make
prints Byte-identical ROM verified.

Dig Dug II (U) [!]: re-trace Pass 1 from a Mesen CDL capture

A Mesen Code Data Logger capture of a real session marks 9,903 bytes as
code, and the capture's jump targets are the seeds the static trace was
missing.  Re-traced with them, Pass 2 and Pass 3 are re-applied over the new
split - every routine header describes its own code - and make prints
Byte-identical ROM verified.

Hydlide (U): re-trace Pass 1 from a Mesen CDL capture

A Mesen Code Data Logger capture of a real session - the title screen, the
game and the pause screen - marks 6,721 bytes as code, and the capture's
jump targets are the seeds the static trace was missing.  Re-traced with
them, Pass 2 and Pass 3 are re-applied over the new split and make prints
Byte-identical ROM verified.

Port Test Cartridge (U): re-trace Pass 1 from a Mesen CDL capture

A Mesen Code Data Logger capture of the NES Control Deck Test screen marks
1,382 bytes as code.  Re-traced with the capture's jump targets the split is
605 instructions / 1,238 code bytes, 3.8% of the PRG against 0.7% before.

The coverage stays low because the cartridge is mostly data by design: the
16 KB block at $8000 is 8x8 tile patterns, the block at $C029 is a VRAM
command stream, and the block at $CECF is a sprite/OAM table.  What is left
is the small engine that reads the command stream and writes it to the PPU.

Gyromite (JUE): re-trace from the CDL instead of reclassifying

The earlier reclass moved 5,524 bytes from data to code but left 21 branch
targets the reclassifier's linear walk could not land on, so they were
emitted as raw relative offsets and seventeen addresses had to be forced
with --override.

Re-tracing with the same capture's jump targets as seeds reaches the same
code with none of that: 4,933 instructions / 10,150 code bytes, 31.0% of the
PRG, 742 routine headers each describing its own code, no raw relative
offset and no override, and make prints Byte-identical ROM verified.

Restore the data-block header spelling and add analyze_data_blocks.py

The separator change that gives derive_clobbers.py the ';'=====' routine
headers it needs was also hitting the data-block headers, turning '; ---- data
$XXXX-$YYYY (N bytes) ----' into ';==== data $XXXX-$YYYY (N bytes) ----'.
The conversion now only touches a line that is nothing but dashes.

_new _tools/analyze_data_blocks.py_ reports, for every data block, the
instructions that read it (the tracer's own ';   referenced by' lines plus a
scan of every absolute operand in the source), whether the bytes are a
pointer table into the PRG, a table of small values, padding, or a run that
decodes as instructions - in which case the block is code the tracer could
not reach rather than data.  That is the evidence a table's name has to be
based on.

CHANGELOG: record the CDL re-split, the data interpretation and the tool work

Port Test Cartridge (U): re-trace from the CDL and the unreached blocks

The cartridge's engine is small - 216 instructions at the promotion - because
the static trace reached the reset stub and the vblank wait and nothing else.
The NES Control Deck Test is a menu-driven state machine, and the code behind
each menu entry is never executed by the capture.

Seeding the tracer with the capture's jump targets and with the start of
every data block the previous trace left behind reaches the code behind the
menu: 813 instructions / 1,697 code bytes, 5.2% of the PRG against 0.7% at
the promotion.

Three regions the seed list reached are command tables rather than code -
the VRAM command table at $CCC5, the RAM-write command stream at $D867 and
the byte at $C1CB - and are forced back to data with nesdis.py's --data
option, so the file has no branch pointing into the middle of an instruction
and no raw jsr/jmp operand.

New _tools/code_data_seeds.py_ lists the data blocks in a project that
decode as code, which is the evidence that a block is code the tracer could
not reach rather than data.

Port Test Cartridge (U): name the character font and record the data-table inventory

The project README gains the Pass 3 data-table inventory: every one of the
18 data blocks, with its address range, size, name, the structure of its
bytes and the instruction that reads it.

Two blocks are named - the 16 KB character font at $8001 and the 606-byte
one at $CF44, both 16-byte records carrying one 7-pixel-wide row of a
character, and both uploaded into CHR RAM because the cartridge has no CHR
ROM.  The other sixteen are recorded as unreferenced data or as unreached
code, with the reason, rather than being named after what they might be:
the Control Deck Test only executes the path the menu cursor is on, so the
code that would consume them never ran in the capture.

The README's status, open-work and file sections are brought up to date.

Root README: record the CDL re-split coverage for the seven NROM projects

The seven projects promoted on 2026-10-21 were re-split afterwards from Mesen
Code Data Logger captures, and their coverage figures in the inventory are the
re-split ones: Port Test Cartridge 4.8%, 10-Yard Fight 32.0%, Chubby Cherub
41.4%, Dig Dug II 53.5%, Gyromite 31.0%, Hydlide 47.8%, Ice Hockey 39.5%.

AGENTS.md: record the CDL jump-target seed technique and the --base pitfall

Three lessons from the seven re-splits:

- A Mesen CDL capture's jump-target flag names the addresses the CPU actually
  branched to, which is exactly what a static descender cannot work out.
  nesdis.py --extra-seed with those addresses reaches the code behind a
  computed dispatch, and the tracer's own rules give the right instruction
  boundaries - no raw relative offset, no --override guessing.

- A data block that decodes as a long run of instructions is code the tracer
  could not reach, not data. code_data_seeds.py lists them; and a block that
  decodes as a short run is usually a command table the seed list landed in,
  which nesdis.py --data forces back.

- name_data_region.py needs --base for anything but a 16 KB PRG at $C000.

WIP.md: correct the tier's state table and the per-project states

The tier's state table claimed 851 Pass 0 skeletons.  Counting the
instruction lines in each project's prg.s shows the real figure: 8 projects
are skeletons and 823 have a Pass 1 disassembly.  Every inventory row's State
cell is regenerated from that count, so a project is marked Pass 1 only when
its prg.s really carries instructions.

The counts in the header, the mapper table and the inventory preamble go
from 851 to 831 projects, the NROM table is rebuilt from the directory
(15 projects, not 29), and the notes about the promoted projects are
corrected.

Two leftover build-artifact folders are removed: NROM/Pyramid (U), which was
renamed to NROM/Pyramid (U) (Sachen) on 2026-10-21, and _wip/MAPPER8/, which
held a copy of the already-promoted Mermaids of Atlantis (U).

Dig Dug II (U) [!]: interpret the data tables and record the inventory

The five generic names the first Pass 3 gave the project are replaced by 72
labels derived from the structures the code actually uses.

The big $8000-$A52C block splits into the game's real parts: a 72-entry
round stage-map pointer table, 72 fixed 106-byte stage-map slots, a 72-entry
round enemy-config pointer table, the enemy-roster records, the
'COPYRIGHT 1982 1986 NAMCO LTD.' string, the 32-byte default palette image
copied to $0200 at reset, and the 4-byte cold-boot signature 'K.N.'.

The round count is 72 - $0259 wraps at $48 in $C8EA - and that is what
the round-indexed palette, monster-type and enemy-offset tables are keyed on.
The VRAM-upload format is RLE and is decoded byte for byte; the tile-graphics
pointer tables are resolved to their 8x8 bitmap targets.

34 of the 37 tracer blocks carry at least one name. $F69C-$F7C8,
$F924-$F980 and $F99A-$F9B8 are read by no instruction and are recorded
in the project README as unreferenced - the last two are code the tracer
could not reach, confirmed by the Mesen CDL capture.

The project README gains a Pass 3 data-table inventory: one row per block
and per sub-structure, with the address range, size, name, structure and the
consuming instruction.  make still prints Byte-identical ROM verified.

derive_routine_docs.py: describe what each routine actually does

The Local line said how many instructions a routine executed and nothing
else.  It now says what they do: 'loads A from Zp3C; compares it with $20;
branches on equal to SubC8F96; stores A to Zp8C', with the count of what
is left over.  Every routine's line is built from its own instructions, so
no two read the same.

Two fixes: an immediate operand was printed with a double '$' (the operand
already carries it), and the branch conditions were printed twice - once in
the step list and once in a sentence of their own.

Rewrite the routine headers across the promoted tier

Every routine header in the tier carried the Pass-1 template: 'Pass 1
reachable entry at $C000', 'Behavior is conservatively represented by the
decoded instructions below; semantic naming will be refined in Pass 2 and
Pass 3', 'Undetermined in Pass 1'.  That is filler, and it describes the
process rather than the ROM.

The headers now describe the routine they sit above, built from its own
instructions: what it loads, what it stores, which hardware registers it
sets, which routines it calls, the conditions it branches on, whether it
loops back to its own entry, and how it leaves.  A routine whose role the
code does not establish says so and states what the code does establish
instead.

The Clobbers block of every header is derived by derive_clobbers.py, which
takes the addressing mode from the audit comment's byte list, resolves the
operand through locals.inc and symbols.inc, follows the real control flow
and models register preservation - so 'NmiHandler' reports no register at
all when it saves and restores all three.

derive_clobbers.py and derive_routine_docs.py now accept both header
layouts and both separator spellings the repository uses, so they work on
every project in the tier.

Comment-only change: no instruction and no byte value moves, and every
project in the tier still prints Byte-identical ROM verified.

CHANGELOG: record the tier-wide routine header rewrite

Chubby Cherub (U): interpret the data tables and record the inventory

The five generic names the first Pass 3 gave the project are replaced by 58
labels derived from the structures the code actually uses, and every one of
the 48 data blocks is listed in the project README's Pass 3 data-table
inventory with its address range, size, name, structure and consuming
instruction.

The breakthrough is the character encoding.  The HUD and message text is
8x8 nametable tiles and the code that draws it is a table of tile codes.
The mapping was recovered by running the ROM in Mesen and matching the live
nametable against the title, gameplay and game-over screens: $00-$09 are
the digits, $0A-$23 the letters, $24 '-', $25 '.', $26 the trademark,
$2D a heart, $2E '!', $2F the copyright sign, $30 a space and $33 a
blank.  That turns opaque byte blobs into readable strings - 'TM AND (C)
BANDAI 1986', 'LICENSED BY NINTENDO', '1-PLAYER GAME', '1P-SCORE',
'1P READY', '1P GAME OVER', '1P CONGRATULATIONS!', 'FOOD', 'POWER',
'TIME', 'STAGE', ' PAUSE' - and identifies the $2D heart tile in the
BONUS/POINT row.

Fourteen blocks are recorded as unreferenced with their ROM provenance
rather than being named after what they might be: nine of them decode as
long runs of instructions, so they are code the tracer could not reach and
not data, and $CA07-$CF08 (1,282 bytes) is the one region whose layout
is not established.

make still prints Byte-identical ROM verified.

Complete the routine headers across the tier, in every header layout

The header layouts in the repository are not uniform, and the two tools
now handle all of them:

- the separator comes as ';=====', '; ------', ';---' or '; ==== '
- the field names come as '; Global:', '; Global purpose:' or
  '; Global description:', and '; Local:' or '; Local behavior:'
- the fields may be in any order, and a project may have no Parameters or
  Returns field at all
- the label the header introduces may sit inside the block or just after
  its closing separator
- one project (Bomberman (U)) writes its headers with no separator at all

Two real bugs are fixed on the way:

- derive_clobbers.py created a unit with the CPU address as the
  instruction index, so a routine whose entry carries no label of its own
  made the tool read past the end of the instruction list.  That is what
  stopped it running on Wild Gunman (U) and Pac-Man (USA) (Namco).
- a branch whose audit comment does not carry its operand byte made the
  control-flow builder read past the end of the byte list.

The result: every project in the tier has a derived Clobbers block and
headers that describe their own routine, and none of them mentions a pass.
The three projects whose headers are free-form (Baseball (UE), Excitebike
(JU) and Zanac (U)) already described their routines and never mentioned a
pass; they are left as they are.

Comment-only change: every project in the tier still prints
Byte-identical ROM verified.

Complete Pass 2 across the tier: no Label_ residue left

Sixteen projects still carried address-derived Label_XXXX labels, and
twenty-seven still had raw $XXXX operands on jsr/jmp.  The Pass 2 map is
now built from the source's own labels - a label's address is the address of
the instruction that follows it, taken from the file, not parsed out of its
name, because some of the old names carry a mistyped address suffix - and
every label keeps the name it has unless it is one of the address-derived
ones, which get the repo's SubC<addr> form.

Three more real defects in the tools are fixed:

- derive_branch_names.py named a jsr/jmp target that no instruction sits at.
  Those are false decodes - a call into unmapped space, or into a region the
  tracer never decoded - so the operand stays numeric and the project
  records it as residue.

- apply_pass2_map.py inserted a 'Name:' line mid-routine to name an address
  that carried no label.  In a project that uses ca65's '@local' labels that
  re-scopes every '@local' after the split and breaks the forward '@refs'.
  There the name now becomes an equate in locals.inc, which names the
  address without touching the label scope.

- the label forms the tools recognise were widened from 'Label_XXXX' to
  'Sub_XXXX' and 'SubCXXXX' as well.

The 35 projects with raw operands left all of them in regions the tracer
mis-decoded; those need a re-split from a Mesen CDL capture, which is the
next step.  Every project still prints Byte-identical ROM verified.

Urban Champion (JU): re-split Pass 1 from the Mesen CDL captures

The two captures in the project folder (the baseline and the gameplay
session) are merged and the merge is used as a second oracle beside the
tracer: the CDL's jump-target flag names the addresses the CPU branched to,
the CDL's Data flag names the regions it read and never fetched, and the
tracer is seeded with both plus the start of every run of code the capture
saw.

The split goes from 33.8% code to 48.6%: 3,856 instructions / 7,958 code
bytes against 2,356 / 5,521.  The 220 raw jsr/jmp operands are gone.

Two new tools: merge_cdl.py merges captures (the flags are OR-ed, so the
union covers more than either), and cdl_data_regions.py lists the regions the
capture says are data, for nesdis.py's --data option.

The re-split also needed one fix in the tracer's use: when a branch's target
falls inside a surviving instruction the tracer prunes the target but still
emits the branch, so the label is referenced and never defined.  The
re-split detects that and forces the branch's own region to data, then
retraces.

apply_pass2_map.py: do not write the same equate twice

The equates go in locals.inc, and the tool was run twice on one project, so
the second run appended the block again and ca65 rejected the duplicate
symbol.  The equate list is now checked against what locals.inc already
holds, and only the new ones are written.

Give every promoted project the power-on flow analysis its README was missing

PROMPTS.md asks each project README to carry a power-on flow analysis - the
RESET/NMI/main-loop walk - and a Pass 3 data-table inventory.  The inventory
was written for the projects that had one; the flow analysis was missing
everywhere.

_new _tools/derive_poweron.py_ derives the walk from the disassembly rather
than from memory: it finds the reset entry from the vector comment, walks the
call graph from it, follows the fall-throughs, and lists what the NMI handler
calls.  It also says whether the IRQ vector reaches the reset path.

_new _tools/add_poweron.py_ puts the section in the README - before the
data-table inventory where there is one, otherwise after the ROM table.

All 61 promoted projects now carry the section.

Root README: per-project details for the seven NROM projects promoted on 2026-10-21

Port Test Cartridge (U), 10-Yard Fight (U), Chubby Cherub (U), Dig Dug II (U)
[!], Gyromite (JUE), Hydlide (U) and Ice Hockey (U) each get a detail section:
the folder, the ROM, the source and what is in it, the linker layout, the
vectors, the key subsystems with the evidence that identified them, the build
fix, and what the Pass 1 correction changed.

Donkey Kong (JU): re-split Pass 1 from a Mesen CDL capture

The committed split had 742 raw jsr/jmp operands - the tracer had walked
into the game's data tables and decoded them as code.  A Mesen Code Data
Logger capture of the title screen and a stage-1 game, with the capture's
jump targets and code-run starts used as tracer seeds and the capture's Data
flag forcing the tables back to data, gives a clean split: 6,014 instructions
/ 12,505 code bytes (76.3%), 1,015 labels, and no raw operand left.

Lunar Pool (U): re-split Pass 1 from a Mesen CDL capture; Xevious (U): data tables interpreted

Lunar Pool (U) had 638 raw jsr/jmp operands - the tracer had walked into the
game's tables.  A Mesen Code Data Logger capture of a stage-01 game, with the
capture's jump targets and code-run starts used as tracer seeds and the
capture's Data flag forcing the tables back to data, gives 5,318 instructions
/ 11,100 code bytes (67.7%) and no raw operand left.

Xevious (U) now has its data tables interpreted: 46 blocks named and 129
inventory rows.  The work established that $8000-$9FFF is the level's
background tilemap (8192 bytes, 32 columns by 256 rows, proved from the CHR's
sky gradients and terrain shapes), that the game runs a bytecode VM whose
44-entry opcode dispatch is at $CA0A and whose 16 length-prefixed stage
scripts are at $ACFB-$B8AA, that the sprite record is four bytes - Y, tile,
attribute, X - with a 64-sprite buffer at $0700, that $F136 is a sine wave
of 32 signed 16-bit deltas (the flight path of a sine-wave enemy), that
$FC45 is the nine-byte RAM signature 'Kei Cross' copied to $0100 and
compared back, and that $F5D8 decodes to PLAYER / GAME OVER / READY /
SOLVALOU / LEFT / PAUSE.

Lode Runner (U) and CIRCUS: re-split Pass 1 from Mesen CDL captures

Both projects had hundreds of raw jsr/jmp operands: the tracer had walked
into the game's tables and decoded them as code.  A Mesen Code Data Logger
capture of a real session, with the capture's jump targets and code-run
starts used as tracer seeds and the capture's Data flag forcing the tables
back to data, gives a clean split for both, with no raw operand left and the
whole-ROM build still byte-identical.

Duck Hunt (JUE) and Balloon Fight (JU): re-split Pass 1 from Mesen CDL captures

Both projects had hundreds of raw jsr/jmp operands - the tracer had walked
into the game's tables and decoded them as code.  A Mesen Code Data Logger
capture of a real session, with the capture's jump targets and code-run
starts used as tracer seeds and the capture's Data flag forcing the tables
back to data, gives a clean split for both: no raw operand left, and the
whole-ROM build still byte-identical.

Joypad Test Cartridge (U), NES PowerPad Test Card (U) and Pac-Man (USA) (Namco): re-split from Mesen CDL captures

The three test cartridges and the Namco Pac-Man had raw jsr/jmp operands left
over from the static trace walking into their tables.  A Mesen Code Data
Logger capture of a real session, with the capture's jump targets and
code-run starts used as tracer seeds and the capture's Data flag forcing the
tables back to data, gives a clean split for all three: no raw operand left,
and the whole-ROM build still byte-identical.

Repair the damaged audit trails across the tier

Thirteen projects carried audit comments that did not match prg.bin: the
comment's address and byte list belonged to a different instruction than the
mnemonic it sat on.  Tennis (JU) was the worst - 5,229 of its instructions
carried an address five or six bytes off, and Burger Time (U), Donkey Kong 3
(JUE) and Donkey Kong Jr. (JU) were damaged in the same way.  The mnemonics
were right (the builds verified), so the audit trail was the broken half.

repair_audit_comments.py rebuilds the trail from the ca65 listing, using
prg.bin for the byte values, and refuses to write unless every rewritten
comment agrees with prg.bin.  Three things had to change in the tool for it
to run at all on this tree:

- ca65 2.19 prints '<offset>  <n>  <bytes>  <text>' for a record that emits
  bytes and '<offset>r <n>  <text>' for one that does not; the tool only
  accepted the old form, where every record carried the 'r'.

- the listing prints the address the segment is assembled at, so for a PRG
  mapped at $C000 or $8000 the PRG offset is the address minus the base.
  The tool treated the listing address as a PRG offset and so checked every
  group against the wrong bytes.

- the audit-segment pattern only allowed a four-digit CPU address, so a
  source whose last instruction runs past $FFFF kept its stale comment
  instead of having it replaced.

All 322,830 audit comments in the tier now agree with prg.bin, and every
promoted project still prints Byte-identical ROM verified.

Tennis (JU): finish Pass 2 and Pass 3 over the repaired trail

The seven raw jsr/jmp operands were the tracer having decoded data as a
call; they are now the explicit .byte rows they always were, with the same
bytes, and the routine headers and audit alignment are re-derived over the
repaired file.  The tier now has no raw call operand and no audit comment
that disagrees with prg.bin.

_new _tools/build_routinemap.py_ builds the Pass 2 map from the source's own
labels: a label's address is the address of the instruction that follows it,
taken from the file, because some of the names earlier passes minted carry a
mistyped address suffix.  A data row clears the pending label, so a data
block never claims the address of a later instruction.

Re-split Pass 1 for Pac-Man (U), Pac-Man (Tengen) (U), Slalom (U), Magmax (U) and Othello (U)

Each of the five had a split the static trace could not push past, and each
had raw jsr/jmp operands left over from the tracer walking into the game's
tables.  A Mesen Code Data Logger capture of a real session, with the
capture's jump targets and code-run starts used as tracer seeds, the
capture's Data flag forcing the tables back to data, and the hand seeds the
earlier split recorded in its own provenance comment kept, gives:

  Pac-Man (U)           18.7% -> 45.9%   3,734 instructions / 7,528 bytes
  Pac-Man (Tengen) (U)  20.0% -> 47.3%   3,842 instructions / 7,744 bytes
  Slalom (U)            32.1% -> 31.8%   4,983 instructions / 10,414 bytes
  Magmax (U)            35.4% -> 36.5%   5,696 instructions / 11,954 bytes
  Othello (U)           43.3% -> 44.0%   6,804 instructions / 14,403 bytes

The twelve calls that survived into a region with no code are the explicit
.byte rows they always were, with the same bytes.  Every project still
prints Byte-identical ROM verified.

Give every routine header a contract that is its own

Two things made the headers read the same in every routine of a project.

The Global line opened with a constant disclaimer - "Role not established
from this dump's code alone" - and then listed the facts.  The disclaimer
said nothing about the routine, so it was filler.  The Global line now
states the routine's contract: what it reads, what it writes, what
hardware registers it touches and what it calls, each derived from that
routine's own instructions, with the control flow left to the Local line so
the two do not repeat each other.  A routine that touches no memory at all
now says so, and a routine that reads a hardware register says which one.

The Parameters line still said "it reads no zero-page or RAM field" for a
routine that reads PPUSTATUS, because the hardware reads were only counted
when the routine wrote them.  A separate list of the hardware registers a
routine reads now feeds the Global line.

derive_clobbers.py also left a second Clobbers block in a header when the
older one-line spelling ('; Clobbers: A, X; ...') was present: it removed
only the multi-line form.  Both spellings are removed now, and the derived
block replaces them.

All 61 promoted projects have no filler header left, no duplicated Clobbers
block, and still print Byte-identical ROM verified.

Zanac (U): trace bank 6, and give the project a build that can hold it

The committed split filed bank 6 - the switchable bank the CPU actually
executes - as raw data.  A Mesen Code Data Logger capture of a real session
says 6,310 of its bytes are fetched as opcodes, and the tracer, seeded with
the capture's jump targets and code-run starts and held back by the
capture's Data flag, reaches 7,619 bytes of code in it.

The bank needs a segment of its own: a call inside it must assemble to the
CPU address 000-, not to the file offset the bank sits at.  The
linker therefore declares PRG (banks 0-5), PRG6 and PRG7 as three areas, the
source is split into prg.s, prg.6.s and prg.07.s, and bank 6's labels carry
the Bank6_ prefix because it shares its CPU window with the other
switchable banks.

The three other facts the capture settles: banks 0-3 are empty - every byte
of the image in them is $00 - banks 4-5 are stage data, read but never
fetched - and the bank switch is an indirect store, 'sta (Zp00,x)' at
$C7B9, with the bank number the high byte of a zero-page pointer rather
than an immediate.

The coverage goes from 32.5% to 44.5% of the 128 KB image.  Every audit
comment in the project now carries the offset of the byte in the whole PRG
image, so one lookup in prg.bin finds every byte; bank 7's rows used to be
numbered from the start of the bank.

Zanac (U): name the cross-bank calls and finish Pass 2 over bank 7

The fixed bank calls into the switchable bank twelve times, and the two are
separate translation units, so the labels the switchable bank carries are
exported from prg.6.s and imported into prg.07.s.  The one call left over
points into unmapped space and is the explicit .byte row it always was.

Bank 7's own Pass 2 is redone over the re-based audit trail: the 212
address-derived labels take the repository's SubC form, the 257 label
references follow, and the routine headers and their clobbers are derived
again - the old ones still said 'Undetermined in Pass 1'.

Zanac now has 44.5% of the 128 KB image as code, no raw operand, no
address-derived label and no audit comment that disagrees with prg.bin.

Interpret the data tables across the tier

Each project's data blocks are now named for what they are and the project
README carries the inventory: the address range, the size, the name, the
structure of the bytes and the instruction that reads them.

Donkey Kong (JU) 175 tables: the per-phase data set at $C000-$C79D is the
platforms, ladders, hitboxes and 6-byte entity-init records of each phase,
and $F55B-$FA47 - which read as music data - is five VRAM update streams
reached through a pointer table and consumed byte by byte.

Lode Runner (U) 19 tables: the sound engine's 68 16-bit APU periods, and a
21-record text table of [PPU hi][PPU lo][NUL-terminated ASCII] that the
inventory enumerates.

Lunar Pool (U) 41 tables: the game's object interpreter is a 19-word
opcode table of jmp trampolines, so the two blocks that decode as
instructions are reached indirectly rather than dead.

Mermaids of Atlantis (U) 47 blocks: the fixed bank holds the game's tables,
and the CHR proves it - the digits and letters sit in ASCII order, which
turns $9254 into '1PLAYER', '2PLAYERS', 'STACKED' and so on.

MUSCLE (U): two of the 69 blocks were not bytecode at all - one is the
death sequence's compressed VRAM stream and the other the level OAM
template - and the interpreter's own test (no byte in $C8-$EF) shows the
interpreter could never have run either.

Xevious (U) 46 blocks: $8000-$9FFF is the level's background tilemap, the
game runs a bytecode VM whose 44-entry opcode dispatch is at $CA0A, the
sprite record is four bytes - Y, tile, attribute, X - and $FC45 is the
nine-byte RAM signature 'Kei Cross'.

Ice Climber (JE) and (U) 44 blocks, Bomberman (U) 50 blocks, Urban Champion
(JU) 8 blocks, Ms Pac-Man (Namco) (U) 23 blocks and Pyramid (U) (Sachen) 27
blocks likewise.

Every project still prints Byte-identical ROM verified.

CHANGELOG: move the committed entries into History

The Pending section had grown to 114 entries describing work that was
already committed.  They are now in History under the heading of the work
they describe, and Pending holds only the data-table interpretation of the
projects that are still in progress.

Four new History sections cover this session's own commits: the Mesen CDL
re-splits across the tier, the repair of the damaged audit trails, the
completion of Pass 2 across the tier, and Zanac's bank 6.

Root README: refresh the coverage column of the project inventory

Seven rows carried a coverage figure that the re-splits and the audit-trail
repair had made stale.  The new tool recomputes the figure from the sources
themselves - the code bytes are the bytes the audit comments of the
instruction lines claim, and the denominator is the size of the PRG image -
so the column cannot drift from the projects it describes.

Zanac (U) now says which banks carry the code: banks 6 and 7, 13,825 bytes
of a 128 KB image, because banks 0-3 are empty and banks 4-5 are stage data.

Root README: refresh the source shapes the re-splits changed

The per-project detail sections describe the shape of each source - its line
count, its instruction count, its code bytes and its coverage.  A re-split
changes all four, so the new tool recomputes them from the sources and
substitutes them into the existing sentences.

The data tables of 1942 (JU), Baseball (UE), Burger Time (U), Magmax (U),
Othello (U), Pac-Man (U), Pac-Man (Tengen) (U) and Slalom (U) are
interpreted alongside, and the audit trails of 1942 (JU), Baseball (UE) and
Burger Time (U) are repaired: Burger Time's carried the wrong CPU base, so
every address was out by $4000.

AGENTS.md: record what this session's work established

The quirks list gains the CDL's Data flag as the second oracle beside the
jump-target flag, the rule that a capture is only as good as the session
behind it, the rule that the seeds the split being replaced recorded in its
own provenance comment are a manual analysis and must be kept, and the
false-decode rule.

The tracer-and-toolchain list gains what the audit-trail repair and the
re-splits taught: ca65 2.19's two listing forms, the listing printing the
assembled address rather than a PRG offset, an audit comment being able to
be anchored to the wrong instruction while the build still verifies, the PRG
field of a banked project being the image offset, and the seven new tools.

TODO.md: bring the handoff up to date

The file still described the 41-project tier.  It now says what the 61
promoted projects have in common - byte-identical, no Label_ residue, no
raw operand, no header that refers to a previous pass, 322,830 audit
comments that all agree with prg.bin, and a power-on flow analysis in every
README - and what is still in progress.

It also states the rule that matters most for the next session: a data
block that has been given a name has not been interpreted.

Give every branch target a role name, and close the rest of the checklist

_new _tools/audit_promoted.py_ checks the promoted tier against all eleven
items of PROMPTS.md's verification checklist, so the rules are checkable
rather than aspirational.

Three gaps it found, now closed:

- **1,487 branch targets carried an address-derived name.**  PROMPTS.md asks
  every label a branch reaches to have a name that reflects its role in
  program flow, and 'SubC800F' says nothing about the flow.  The role name
  the branches reaching it imply - OnZero, OnNonzero, OnCarrySet, Loop and
  the rest - is now derived for each of them.  derive_branch_names.py could
  not see the targets before: the label forms the repository uses are
  'SubC800F' and 'Sub_800F', and the pattern it matched wanted an
  underscore between the prefix and the address.

- **48 operands named a hardware register by its address.**  Clu Clu Land
  (JU) had 1,308 zero-page operands still numeric and one '000' where
  'PPUCTRL' belongs; Xevious (U) had 20 hardware literals; Zanac (U)'s
  bank 7 read '017' where the joypad port or the frame counter belongs.
  Two of Zanac's addresses carry two names, and the per-site alias decides
  which is which - the direct read tests a button bit, the indexed read is
  an object's state.

- **325 neutral zero-page slots carried no reason.**  locals.inc now says,
  per slot, that the name is provisional.

The tools grew to match: apply_symbols.py accepts an upper-case mnemonic,
apply_zp_aliases.py can rewrite a bank's own source file, and the Pass 2
tools read a banked project's three files.

Every project still prints Byte-identical ROM verified.

PROMPTS.md: the checklist now has a checker

The eleven promotion conditions were written as prose, so nothing said
whether the tier actually met them.  _tools/audit_promoted.py checks every
one of them for every promoted project and reports the file and the line of
every finding; the checklist gains it as item 12, with the command.

CHANGELOG: record the checklist work

audit_promoted.py: count an inventory row wherever the address sits

Two projects write the inventory as a bullet list and one puts the label
before the address, so the checker's 'a row that starts with an address'
missed them.  A row now counts when it holds a $XXXX address in any cell.

Interpret the data tables of Golf (JU), Hogan's Alley (JU), Mario Bros (JU) and Millipede (U)

Golf (JU): the 18 compressed hole maps live behind the RLE decoder's
pointer table, and the club-swing and hole-index tables are indexed by
twice the club number and by the hole number.

Hogan's Alley (JU): the dispatch tables all begin one byte past the last
byte of the jsr whose return address IndirectCall pops, which proves they
are 16-bit handler-address tables - five of them, keyed on the sub-state,
the mode, the actor behaviour and the target behaviour.

Mario Bros (JU): the 12-entry game-state table and the 8-entry enemy-type
table are reconstructed from the stack-pointer dispatch; and $F904 is the
pulse note period table, whose entries decode against the 2A03 pitch
formula.

Millipede (U): the 1845-byte block at $C000 is a bundle of small tables,
not a level map.

Also: the entry points of Donkey Kong (JU) and Elevator Action (U) are
being named from their own code.

Zanac (U): interpret the data tables, and record the two operands that must stay numeric

Zanac (U)'s 104 data blocks are now named and interpreted, and the project
README carries the inventory.  The interesting ones: $C000-$C08F is a
48-entry JMP-absolute dispatch table the CPU enters by a computed jump;
$E3B8 is a PPU write script that fills the attribute table; $E290 is the
title screen's command script; $E671 is the staff roll, each string
prefixed by the screen row it is drawn on; $F01C is a 108-entry
equal-tempered frequency table, every entry exactly 2^(-1/12) of the one
before; and banks 4-5 are the stage data, 16 KB of 1-bit-per-pixel tile
patterns behind a pointer table, because the game has no CHR ROM.

name_data_region.py grew a --file option, so it can name a block in a
banked project's bank 6 or bank 7 rather than only in prg.s.

Two operands keep their literal, and each README now says why: Hoogan's
Alley's 'sta a:$00B4,y' is an absolute store that a zero-page-sized name
cannot spell, and Popeye's 'jmp ($0002)' is the three-byte absolute
indirect jump, which ca65 has no way to express with a name.

Popeye (JU) (PRG 1): record why the indirect-jump operand keeps its literal

Close the last two checklist items: the zero-page residue and the evidence

PROMPTS.md's item 8 asks that apply_symbols.py leave no resolvable operand
numeric without justification.  Four projects had residue:

- **Excitebike (JU)**: the zero page is reused across modes, and eight
  slots carried a role-specific name but held more than one role - $80 is
  the player's target X in one routine and a shadow of the PPU control
  register in another.  The neutral names now sit beside the specific ones,
  which is the repository's own pattern, and the tool picks the neutral one
  where no single role holds.  Its residue is zero.
- **Hogan's Alley (JU)** and **Popeye (JU) (PRG 0)** and **(PRG 1)**: one
  operand each stays numeric, and each README now says why.  'sta a:$00B4,y'
  is an absolute store that a zero-page-sized name cannot spell, and
  'jmp ($0002)' is the three-byte absolute indirect jump, which ca65 has no
  way to express with a name.

apply_symbols.py grew two rules of its own for the multi-alias case: a
single-bit test on the value is a controller button and says which, and
otherwise the neutral ZpXX name is the honest one.

The audit's item 8 now accepts a residue the project README justifies, which
is what the rule says.

Every project still prints Byte-identical ROM verified.

CHANGELOG: record the zero-page residue work

Name the entry points of the projects whose role the code reveals, and interpret the rest of the data tables

**Entry points.**  PROMPTS.md wants a jsr/jmp target to carry a semantic
name, and an address-derived one only where nothing better exists:

- **Donkey Kong (JU)**: 358 named, none left.  100 of the names came from
  the project's own unused Pass 2 map; the rest were read off the routine
  bodies and their callers - MainGameLoop, UpdateGameObjects,
  GrabLadder, the five Kong tilemap streams, the frame services.
- **Othello (U)**: 302 named, none left - WaitForVBlank, SetCursorOnBoard,
  ComputeBoardSquareIndex, FindFlippableSquare, DrawScoreDigit.
- **Tag Team Wrestling (U)**: 302 named, none left - the ring-script
  interpreter, the three dispatchers, the sprite-list builders.
- **Clu Clu Land (JU)**, **Defender 2 (U)**, **Donkey Kong 3 (JUE)** and
  **Donkey Kong Jr. (JU)**: their data tables are interpreted.

**Data tables.**  Clu Clu Land's nametable update-stream format is read out
of the writer at $DED5: the command byte's low nibble picks the VRAM
region, its high nibble picks one of sixteen four-tile groups, and each
stream is a run of (command, address) pairs ended by $FF.  Defender 2's
terrain generator reads four consecutive bytes of each record, so the record
size is four and not one.  Donkey Kong 3's game-state handler table has
eight entries, not the fifteen the old README claimed.

name_data_region.py now cuts a .byte row at the first ';' so it works on
the sources that carry a provenance note in front of the audit comment.

Every project still prints Byte-identical ROM verified.

The promoted tier now passes every item of the promotion checklist

python3 _tools/audit_promoted.py --build reports nothing for all 61
projects.

**Data tables.**  CIRCUS, Duck Hunt (JUE) and Balloon Fight (JU) join the
rest.  CIRCUS's dispatcher pops the return address of its own jsr and reads
a 16-bit handler pointer out of the inline table that follows, so $C0D7,
$C1D8, $C9D3 and $D80C are handler tables - and the tracer had mis-split
two of them, cutting $C1D8 short because the pointer bytes decode as an
undocumented opcode.  Duck Hunt's $E64B is the duck's 24 ascending speed
table.  Balloon Fight's $D65C is 64 little-endian nametable addresses.

**Entry points.**  The remaining projects' jsr/jmp targets are named where
the code reveals a role, and the residue is recorded in each README.

**One more tool fix.**  name_data_region.py cuts a .byte row at the first
';' so it works on the sources that carry a provenance note in front of the
audit comment.

Every project still prints Byte-identical ROM verified.

CHANGELOG: record the tier passing the checklist

Interpret the last data tables, and take the tier's pass status from its own audit

**Data tables.**  Tag Team Wrestling (U), World Class Track Meet (U),
Wild Gunman (U) and Tennis (JU).

Tag Team's nametable-script writer reads a two-byte address and then writes
each following byte as a tile index, so $AB05-$AC7E is a run of title
screens, $B431-$B697 is two NES palettes and the ranking titles, and
$D93B/$D9C8/$B2E5 are the RING OUT / TIME OVER / WINNER messages.  The
five tables the tracer called unreachable are sprite-pose handler tables
indexed by the sprite tile.

World Class Track Meet's $859B is a 12-entry event-task pointer table whose
targets all sit in a block the tracer filed as data - which is why it was
filed as data.  Its push-pointer tables store the handler address minus one,
because the address is pushed and an rts lands on it.

Wild Gunman's earlier Pass 3 was hollow: the tracer reached 49.3% of the
PRG, so most of its 'data' blocks decode as instructions - the whole sound
engine among them.  The wrong SpritePositionTable name is gone.

Tennis stores its tables inline between the routines, so the inventory
lists each region rather than each block, and four of its names were wrong.

**Root README.**  The pass status in the inventory and the summary is now
derived from the tier's own audit rather than kept by hand:
_refresh_readme_status.py_ rewrites the column from what
_audit_promoted.py_ finds.

Every project still prints Byte-identical ROM verified.

Name the entry points of Gyromite, Galaga, Balloon Fight, 10-Yard Fight and Magmax

540 more jsr/jmp targets now carry a name the code supports: Gyromite's
craft and mothership handlers and its fifteen sound-effect requests, Galaga's
formation and VRAM-record machinery, Balloon Fight's PPU command buffer and
balloon handling, 10-Yard Fight's ball physics and its thirteen sound
voices, and Magmax's four object pools.

Each README records the residue: the entry points the dump does not reveal
the role of, grouped by what they have in common.

Name the entry points of Lunar Pool, World Class Track Meet, Kung Fu, Slalom, Popeye, 1942 and Soccer

1,159 more jsr/jmp targets now carry a name the code supports.

Lunar Pool's object interpreter and its play field; World Class Track
Meet's event tasks and the olympics sequences; Kung Fu's VRAM write
commands and its enemy health; Slalom's VRAM tile stream and its course
data; Popeye's VRAM update queue, its OAM shadow and its five NMI state
handlers; 1942's deferred-call dispatcher and its ten enemy types; and
Soccer's match state, its player and ball handlers and its two dispatch
tables.

Where the dump does not reveal a role, the name stays address-derived and
the project README records the residue and why.

Root README: take the pass status from the tier's audit

refresh_readme_status.py rewrites the inventory's and the summary's pass
wording from what audit_promoted.py finds, so the two cannot disagree.
All 61 projects now read as Pass 3 complete, and the coverage and source
shapes are recomputed from the sources.

Remaining entry-point naming

Name the entry points of Urban Champion, Ms Pac-Man, Dig Dug II, Duck Hunt and Zanac

665 more jsr/jmp targets now carry a name the code supports.

Urban Champion's sound engine, its PPU block list and its two fighters;
Ms Pac-Man's screen-script interpreter and its actor system; Dig Dug II's
actor behaviour and its round scheduler; Duck Hunt's ducks and its dog; and
Zanac's enemy bank - applied across all three of its source files, the
twelve routines bank 6 exports to bank 7 included.

Ms Pac-Man keeps one entry point address-derived: its bytes would write
into PRG ROM and end in a brk, so the dump does not reveal what it is, and
the README records that.

CHANGELOG: record the entry-point naming

Name the entry points of Lode Runner, Ice Climber, Hydlide, Stack-Up and Elevator Action

Re-align the audit comments to the canonical column

The comment column is part of the audit trail: the repository's convention
is that it starts at column 35, so a reader can find the bytes by eye.
Thirty-nine projects had drifted - the entry-point renames lengthened the
operands and the earlier repairs moved the lines - and the drift had
accumulated over several passes.

align_audit_comments.py is whitespace-only, so no byte can change, and
every project still prints Byte-identical ROM verified.

Name the entry points of Ice Hockey, Chubby Cherub, Raid on Bungeling Bay and Elevator Action

1,127 more jsr/jmp targets now carry a name the code supports.

Ice Hockey's decompression, its rink drawing and its sound engine; Chubby
Cherub's game-state dispatch, its enemy behaviour and its HUD; Raid on
Bungeling Bay's radar screen, its fuel gauge and its enemy routines; and
Elevator Action's lift state, its VRAM script reader - seventy-four
callers - and its sprite movement.

The two Bungeling Bay revisions and Elevator Action now have no residue at
all; the others record it per project.

CHANGELOG: record the audit-comment re-alignment

Remaining entry-point naming

Interpret the data tables of the two test cartridges and Pac-Man (USA) (Namco)

**Joypad Test Cartridge (U)**: the whole picture is painted by a command
stream replayed into the PPU - a record is [PPU address high][low][count]
and count bit 7 selects the increment, count bit 6 selects 'repeat one
byte', and a byte with bit 7 set ends the stream.  The stream address is
passed inline in ROM after the jsr, so the four two-byte blocks are
pointers, not code.

**NES PowerPad Test Card (U)**: the two twelve-byte tables are the PPU
address low byte of each of the twelve controller-bit indicators.  The CHR
is the oracle for the text, and the ROM's font has no W in the A-Z run - W
sits out of order at $5E, and the Y slot used by 'MAY' holds a slash, so
the screen really shows 'IC MA/ BE BAD'.

**Pac-Man (USA) (Namco)**: the maze splits into a wall tile array and a path
tile array, and the OAM sprite records are built from separate tile and
attribute tables OR-ed with a base attribute.  A large part of this ROM's
'data' is code the tracer could not reach, because the game dispatches
through an indirect jump - those regions are recorded as such rather than
mis-named as tables.

CHANGELOG: record the tier reaching completion

Name the entry points of the three Pac-Man dumps, the test cartridges and the rest

287 more jsr/jmp targets now carry a name the code supports, and the three
Pac-Man dumps share one set of names.

Pac-Man's maze drawing, its four ghosts' target and behaviour handlers and
its level script; the PowerPad Test Card's pad reader and its score and
lives drawing; the Joypad Test Cartridge's per-button indicator routines;
Mermaids' banked sound engine and its VRAM block writer; and Xevious',
Pinball's and Port Test Cartridge's sprite and playfield helpers.

Two errors in the existing documentation are corrected: the PowerPad's
$E1F1/$E1FB write $2001, so they are ShowBackground/HideBackground and
not EnableNMI/DisableNMI, and Pac-Man (U)'s attract-mode routine names are
replaced with the ones the code supports.

Every project still prints Byte-identical ROM verified.

CHANGELOG: the final entry-point numbers
2026-10-22 00:33:54 -04:00

42 KiB

1C649Reset
2C680IdleWaitForFirstNmi
3C686InitPlayerState
4C69CSubCC686_Block_C69C
5C6A4SubCC686_Block_C6A4
6C6C9ResetVramUpdateQueue
7C6D1ClearScreenAndSpritePalettes
8C6D7ResetPpuControlAndScroll
9C6EBDisableRendering
10C6F1ClearOamBuffer
11C6F5SubCC6F1_Block_C6F5
12C6FCTestObjectBoxOverlap
13C701NmiHandler
14C724SubCC6FC_Block_C724
15C732SubCC6FC_Block_C732
16C73CSubCC6FC_Block_C73C
17C746SubCC6FC_Block_C746
18C754SubCC6FC_Block_C754
19C75ASubCC6FC_Block_C75A
20C75DFinishNmiFrame
21C76DRunGameplayScreen
22C7C6SubCC76D_Block_C7C6
23C7D3SubCC76D_Block_C7D3
24C7E4SubCC76D_Block_C7E4
25C7EDSubCC76D_Block_C7ED
26C7F9SubCC76D_Block_C7F9
27C822BeginLevelLoad
28C848SubCC822_Block_C848
29C864SubCC822_Block_C864
30C868SubCC822_Block_C868
31C87DLoadLevelLayout
32C891QueueVramBlockFromLevelTable
33C89ERunTitleScreen
34C8AESubCC89E_Block_C8AE
35C8BBSubCC89E_Block_C8BB
36C8BCSubCC89E_Block_C8BC
37C8C9SubCC89E_Block_C8C9
38C8D0SubCC89E_Block_C8D0
39C8D2SubCC89E_Block_C8D2
40C900SubCC89E_Block_C900
41C93FSubCC89E_Block_C93F
42C957BuildTitleScreenOne
43C97ASubCC957_Block_C97A
44C982SubCC957_Block_C982
45C987BuildTitleScreenTwo
46C995SubCC987_Block_C995
47C99BSubCC987_Block_C99B
48C99EUpdateTitleScreen
49C9C8SubCC99E_Block_C9C8
50C9CFSubCC99E_Block_C9CF
51C9D4SubCC99E_Block_C9D4
52C9E7SubCC99E_Block_C9E7
53C9F3StartAttractDemo
54C9F8SubCC9F3_Block_C9F8
55CA0BResetObjectAnimation
56CA15LoadLevelPalette
57CA34PlaceAndActivateObject
58CA3DBuildLevelScreenZero
59CA5CBuildLevelScreenTwo
60CA77BuildLevelScreenOne
61CA91RunAttractDemo
62CA9ASubCCA91_Block_CA9A
63CAB3SubCCA91_Block_CAB3
64CABBSubCCA91_Block_CABB
65CABCSubCCA91_Block_CABC
66CACCSubCCA91_Block_CACC
67CADARunEnemyEncounterUpdate
68CAECSubCCADA_Block_CAEC
69CAEDSubCCADA_Block_CAED
70CAF0SubCCADA_Block_CAF0
71CAFCSubCCADA_Block_CAFC
72CB17SubCCADA_Block_CB17
73CB18RunStageTransitionUpdate
74CB21SubCCB18_Block_CB21
75CB4BSubCCB18_Block_CB4B
76CB6ESubCCB18_Block_CB6E
77CB6FSubCCB18_Block_CB6F
78CB78SubCCB18_Block_CB78
79CB87SubCCB18_Block_CB87
80CB98SaveJoypadButtons
81CB9AUpdateInGameActors
82CBA7SubCCB9A_Block_CBA7
83CBAFSubCCB9A_Block_CBAF
84CBDFSubCCB9A_Block_CBDF
85CC15SubCCB9A_Block_CC15
86CC24HandleLifeLost
87CC39SubCCC24_Block_CC39
88CC44SubCCC24_Block_CC44
89CC79SubCCC24_Block_CC79
90CC87CheckLevelExitTrigger
91CC9DSubCCC87_Block_CC9D
92CCA5SubCCC87_Block_CCA5
93CCA6ToggleAttractMode
94CCC4SubCCCA6_Block_CCC4
95CCDFSubCCCA6_Block_CCDF
96CCE7SubCCCA6_Block_CCE7
97CCE9SubCCCA6_Block_CCE9
98CCEESubCCCA6_Block_CCEE
99CCF2SubCCCA6_Block_CCF2
100CD03SetAttractCooldown
101CD08SubCCD03_Block_CD08
102CD09BeginGameOverSequence
103CD1ASubCCD09_Block_CD1A
104CD2FQueueLevelTileBlock
105CD3CSubCCD2F_Block_CD3C
106CD42SubCCD2F_Block_CD42
107CD56SubCCD2F_Block_CD56
108CD61SubCCD2F_Block_CD61
109CD62SubCCD2F_Block_CD62
110CD83SubCCD2F_Block_CD83
111CD86SubCCD2F_Block_CD86
112CD92MergeJoypadDirections
113CDA0SubCCD92_Block_CDA0
114CDB2SubCCD92_Block_CDB2
115CDB3StartNextLevel
116CDE2SubCCDB3_Block_CDE2
117CDF0HandlePlayerCaptured
118CE0ESubCCDF0_Block_CE0E
119CE0FSubCCDF0_Block_CE0F
120CE1ASubCCDF0_Block_CE1A
121CE2ESubCCDF0_Block_CE2E
122CE38SubCCDF0_Block_CE38
123CE4EHidePlayerSprites
124CE55HidePlayerSpriteSlots
125CE59SubCCE55_Block_CE59
126CE65SubCCE55_Block_CE65
127CE70AddOamSprite
128CE77SubCCE70_Block_CE77
129CEA4SubCCE70_Block_CEA4
130CEB0ReserveSpriteSlots
131CEDDSubCCEB0_Block_CEDD
132CEDEUpdateHudScore
133CEFASubCCEDE_Block_CEFA
134CF06SubCCEDE_Block_CF06
135CF0CQueueLevelVramBlock
136CF0FQueueLevelBorderBlock
137CF1ASubCCF0F_Block_CF1A
138CF20QueueVramTileRecord
139CF31SubCCF20_Block_CF31
140CF3DUpdatePickupsAndDamage
141CF43TestFirstPlayerHitbox
142CF45TestHitbox
143CF4BHandleCollectiblePickup
144CF7FSubCCF4B_Block_CF7F
145CF82SubCCF4B_Block_CF82
146CF83SubCCF4B_Block_CF83
147CF9CSubCCF4B_Block_CF9C
148CFA8SubCCF4B_Block_CFA8
149CFADHandleCollectiblePickupAlt
150CFB3SubCCFAD_Block_CFB3
151CFB4SubCCFAD_Block_CFB4
152CFDBSubCCFAD_Block_CFDB
153CFDCSubCCFAD_Block_CFDC
154CFDFSubCCFAD_Block_CFDF
155CFF1SubCCFAD_Block_CFF1
156CFF2TestPlayerHitboxesAlt
157CFF4TestHitboxAlt
158CFFAHandlePlayerDamage
159CFFFSubCCFFA_Block_CFFF
160D01FSubCCFFA_Block_D01F
161D043SubCCFFA_Block_D043
162D04ASubCCFFA_Block_D04A
163D04BCheckCollectiblePickup
164D072SubCD04B_Block_D072
165D073SetSourcePointerFromTable
166D07FUpdateStageActors
167D09DSubCD07F_Block_D09D
168D0A7SubCD07F_Block_D0A7
169D0ADSpawnEnemySprites
170D111SubCD0AD_Block_D111
171D112UpdatePlayerAndEnemies
172D13FSubCD112_Block_D13F
173D153SubCD112_Block_D153
174D154SubCD112_Block_D154
175D15FSubCD112_Block_D15F
176D169SubCD112_Block_D169
177D178SubCD112_Block_D178
178D1A9SubCD112_Block_D1A9
179D1ACSubCD112_Block_D1AC
180D1ADCheckCollectibleReach
181D1DCSubCD1AD_Block_D1DC
182D1DFCheckLeftEdgeCollision
183D1FASubCD1DF_Block_D1FA
184D1FFSubCD1DF_Block_D1FF
185D202CheckRightEdgeCollision
186D219SubCD202_Block_D219
187D21ESubCD202_Block_D21E
188D221CheckObjectNearEdge
189D23ACheckObjectOverlap
190D273SubCD23A_Block_D273
191D275StoreOverlapResult
192D27FSubCD275_Block_D27F
193D284CheckWallCollision
194D2A1SubCD284_Block_D2A1
195D2A4SubCD284_Block_D2A4
196D2A5CheckEnemyBodyCollision
197D2C4SubCD2A5_Block_D2C4
198D2C7SubCD2A5_Block_D2C7
199D2C8CheckPlayerOffScreen
200D2D5SubCD2C8_Block_D2D5
201D2D6IsPositionOffScreen
202D2DFSubCD2D6_Block_D2DF
203D2E2SpawnTextRecord
204D318ScanForFreeTextSlot
205D326SubCD318_Block_D326
206D339SubCD318_Block_D339
207D33ASubCD318_Block_D33A
208D346CheckObjectSpawnTable
209D34FSubCD346_Block_D34F
210D35CSetHitReactionFlags
211D36BSubCD35C_Block_D36B
212D37FSubCD35C_Block_D37F
213D392SubCD35C_Block_D392
214D39FSubCD35C_Block_D39F
215D3B3SubCD35C_Block_D3B3
216D3B4SubCD35C_Block_D3B4
217D3BASubCD35C_Block_D3BA
218D3E3SubCD35C_Block_D3E3
219D3E4TestObjectAtPosition
220D3F1UpdateProjectileObjects
221D403SubCD3F1_Block_D403
222D40ESubCD3F1_Block_D40E
223D428SubCD3F1_Block_D428
224D42AResetProjectileRecord
225D44FSubCD42A_Block_D44F
226D456SubCD42A_Block_D456
227D461SubCD42A_Block_D461
228D46BSpawnBonusSprite
229D49ESubCD46B_Block_D49E
230D49FMarkPickupMissed
231D4B2SubCD49F_Block_D4B2
232D4B3TestBonusSpriteOverlap
233D4CCGetObjectScreenPosition
234D4D5CheckStageEndTrigger
235D4F0SubCD4D5_Block_D4F0
236D50CSubCD4D5_Block_D50C
237D529SubCD4D5_Block_D529
238D52AUpdateWorldEntities
239D559SubCD52A_Block_D559
240D56BSubCD52A_Block_D56B
241D575QueueLevelTextRow
242D581SubCD575_Block_D581
243D5A9SubCD597_Block_D5A9
244D5B8SubCD597_Block_D5B8
245D5BBSpawnScoreNumberPopup
246D5CESubCD5BB_Block_D5CE
247D5E3SubCD5BB_Block_D5E3
248D5EEQueueTextRowFromTable
249D5F1SubCD5EE_Block_D5F1
250D60BQueueTextRowLoop
251D60DQueueTextRowInnerLoop
252D619SubCD60D_Block_D619
253D627SubCD60D_Block_D627
254D637SubCD60D_Block_D637
255D63AQueueLevelTextTable
256D63DSubCD63A_Block_D63D
257D647ScanTextTableColumns
258D651SubCD647_Block_D651
259D669SubCD647_Block_D669
260D681SubCD647_Block_D681
261D683SubCD647_Block_D683
262D696UpdateEnemiesAndEffects
263D6AESubCD696_Block_D6AE
264D6BDSubCD696_Block_D6BD
265D6BESubCD696_Block_D6BE
266D6CDSubCD696_Block_D6CD
267D6D6SubCD696_Block_D6D6
268D6DDSubCD696_Block_D6DD
269D6E8SubCD696_Block_D6E8
270D6F4SubCD696_Block_D6F4
271D6F5UpdateScrollingPlatform
272D706SubCD6F5_Block_D706
273D727SubCD6F5_Block_D727
274D72ESubCD6F5_Block_D72E
275D72FSubCD6F5_Block_D72F
276D73CResetPlatformState
277D744SubCD73C_Block_D744
278D757UpdatePlayerMovement
279D775SubCD757_Block_D775
280D78ESubCD757_Block_D78E
281D799SubCD757_Block_D799
282D79FSetScorePopupTileOffset
283D7A1SubCD79F_Block_D7A1
284D7C8SubCD7B8_Block_D7C8
285D7D6SubCD7B8_Block_D7D6
286D7DCSubCD7B8_Block_D7DC
287D7E6SubCD7B8_Block_D7E6
288D7EDRenderPlayerTile
289D7FAAdvancePlayerAnimationFrame
290D804SubCD7FA_Block_D804
291D807ResetPlayerAnimation
292D831SubCD807_Block_D831
293D83CSubCD807_Block_D83C
294D83FStartPlayerThrow
295D852SubCD83F_Block_D852
296D858StartThrowAnimation
297D85DSubCD858_Block_D85D
298D863SubCD858_Block_D863
299D883SubCD858_Block_D883
300D89CSubCD858_Block_D89C
301D8B3SubCD858_Block_D8B3
302D8B6SubCD858_Block_D8B6
303D8B9ClearPlayerDirectionFlags
304D8C2StartPlayerThrowAnim
305D8D3SubCD8C2_Block_D8D3
306D8E5SubCD8C2_Block_D8E5
307D8F5SetThrowTargetOffset
308D8FDSubCD8F5_Block_D8FD
309D908SubCD8F5_Block_D908
310D915SubCD8F5_Block_D915
311D91ESubCD8F5_Block_D91E
312D92BSetAlternateThrowOffset
313D933SubCD92B_Block_D933
314D93EAddThrowTargetOffset
315D95FSubCD93E_Block_D95F
316D967SelectThrowTile
317D971SubCD967_Block_D971
318D989SubCD967_Block_D989
319D98ESubCD967_Block_D98E
320D9A9SubCD998_Block_D9A9
321D9AFSetThrowFacingRight
322D9C2SubCD9AF_Block_D9C2
323D9CERenderThrowTile
324D9DFCancelPlayerAction
325D9F7SubCD9DF_Block_D9F7
326DA00SubCD9DF_Block_DA00
327DA07UpdatePlayerCarryAnim
328DA11SubCDA07_Block_DA11
329DA1BSubCDA07_Block_DA1B
330DA3DSubCDA07_Block_DA3D
331DA51SubCDA07_Block_DA51
332DA66SubCDA07_Block_DA66
333DA94SubCDA87_Block_DA94
334DAA5TestCarryHitbox
335DAADStartCarryAnimation
336DAC5SubCDAAD_Block_DAC5
337DAC8SubCDAAD_Block_DAC8
338DAEBSubCDAAD_Block_DAEB
339DAFCSubCDAAD_Block_DAFC
340DAFESubCDAAD_Block_DAFE
341DAFFQueueVramBlockFromSpriteTable
342DB12StartKidnapSequence
343DB33SubCDB12_Block_DB33
344DB38SubCDB12_Block_DB38
345DB3ABeginKidnapMovement
346DB40SubCDB3A_Block_DB40
347DB56SubCDB3A_Block_DB56
348DB57SubCDB3A_Block_DB57
349DB68RunScreenStateMachine
350DB78SubCDB68_Block_DB78
351DB7FSubCDB68_Block_DB7F
352DB86SubCDB68_Block_DB86
353DB8DSubCDB68_Block_DB8D
354DB94SubCDB68_Block_DB94
355DB9BSubCDB68_Block_DB9B
356DBA2SubCDB68_Block_DBA2
357DBA9SubCDB68_Block_DBA9
358DBBDSubCDB68_Block_DBBD
359DBC6SubCDB68_Block_DBC6
360DBC9HandleScreenState01
361DBDASubCDBC9_Block_DBDA
362DBDFSubCDBC9_Block_DBDF
363DBE5DrawState01Tile
364DBEDSubCDBE5_Block_DBED
365DBF0HandleScreenStateDefault
366DBFBSubCDBF0_Block_DBFB
367DC1BSubCDBF0_Block_DC1B
368DC29SubCDBF0_Block_DC29
369DC2BSubCDBF0_Block_DC2B
370DC30AdvanceDefaultStateObject
371DC3ESubCDC30_Block_DC3E
372DC50SubCDC30_Block_DC50
373DC5ASubCDC30_Block_DC5A
374DC5DHandleScreenStateBit40
375DC78SubCDC5D_Block_DC78
376DC93SubCDC80_Block_DC93
377DCA7SubCDC80_Block_DCA7
378DCAAAdvanceStateBit40Object
379DCC1SubCDCB8_Block_DCC1
380DCCESubCDCB8_Block_DCCE
381DCE7SubCDCB8_Block_DCE7
382DCEDResetStateBit40Object
383DCF4SubCDCED_Block_DCF4
384DCF5FaceTowardPlayer
385DD01SubCDCF5_Block_DD01
386DD0BFacePlayerRight
387DD14FacePlayerLeft
388DD1DFaceTowardTarget
389DD26SubCDD1D_Block_DD26
390DD29HandleScreenState10
391DD3FSubCDD29_Block_DD3F
392DD67SubCDD29_Block_DD67
393DD71SubCDD29_Block_DD71
394DD7DSubCDD29_Block_DD7D
395DD86SubCDD29_Block_DD86
396DD90SubCDD29_Block_DD90
397DD92RenderState10Object
398DD9BSubCDD92_Block_DD9B
399DDB2SetScrollForSplitScreen
400DDD3HandleScreenState80
401DDECSubCDDD3_Block_DDEC
402DDEERenderState80Object
403DDF4SubCDDEE_Block_DDF4
404DE13SubCDDEE_Block_DE13
405DE1DAdvanceState80Sprite
406DE37SubCDE1D_Block_DE37
407DE3CSubCDE1D_Block_DE3C
408DE46HandleScreenState40
409DE6ESubCDE46_Block_DE6E
410DE70AdvanceState40Object
411DE7DSubCDE70_Block_DE7D
412DE7FAdvanceState40Height
413DE87SubCDE7F_Block_DE87
414DE8FSubCDE7F_Block_DE8F
415DE9CSubCDE7F_Block_DE9C
416DE9EAddState40Height
417DEA7RenderState40Object
418DEADSubCDEA7_Block_DEAD
419DEB0SubCDEA7_Block_DEB0
420DEB6HandleScreenState20
421DEC1SubCDEB6_Block_DEC1
422DEE0SubCDEB6_Block_DEE0
423DEE4SetState20ObjectTile
424DEF4SubCDEE4_Block_DEF4
425DEFCRenderState20Object
426DF09SubCDEFC_Block_DF09
427DF13SubCDEFC_Block_DF13
428DF1AHandleScreenState08
429DF33SubCDF1A_Block_DF33
430DF39HandleScreenState04
431DF70SubCDF39_Block_DF70
432DF80SubCDF39_Block_DF80
433DF8EResetHudScoreFields
434DF9BHandleScreenState02
435DFC6SubCDF9B_Block_DFC6
436DFD3SubCDF9B_Block_DFD3
437DFDCAdjustState02Object
438DFF4SubCDFDC_Block_DFF4
439E012SubCDFDC_Block_E012
440E01ESubCDFDC_Block_E01E
441E02FSubCDFDC_Block_E02F
442E03FSubCDFDC_Block_E03F
443E046TwoComplementNegate
444E04CSpawnPlayerObject
445E053SubCE04C_Block_E053
446E065SubCE04C_Block_E065
447E066SubCE04C_Block_E066
448E06BSubCE04C_Block_E06B
449E076SubCE04C_Block_E076
450E083SubCE04C_Block_E083
451E08CSubCE04C_Block_E08C
452E093SubCE04C_Block_E093
453E097SubCE04C_Block_E097
454E0AASubCE04C_Block_E0AA
455E0B7SubCE04C_Block_E0B7
456E0B9InitObjectRecord
457E0D8SubCE0B9_Block_E0D8
458E0E4SubCE0B9_Block_E0E4
459E0F1SubCE0B9_Block_E0F1
460E0FBLoadObjectPattern
461E123SubCE0FB_Block_E123
462E126SetObjectTile
463E12BFlipObjectDirection
464E137SubCE12B_Block_E137
465E13ASetObjectPatternByLevel
466E146AdvanceObjectPattern
467E15ESubCE146_Block_E15E
468E174SubCE146_Block_E174
469E177SetObjectTileAndFlip
470E186SubCE177_Block_E186
471E188ClampObjectX
472E197SubCE188_Block_E197
473E19DFlipObjectDirectionAlt
474E1AASubCE1A3_Block_E1AA
475E1ADUpdateObjectAnimationFrames
476E1B2SubCE1AD_Block_E1B2
477E1C4SubCE1AD_Block_E1C4
478E1D2SubCE1AD_Block_E1D2
479E1F6SubCE1AD_Block_E1F6
480E202UpdateCarriedObject
481E220SubCE202_Block_E220
482E229UpdateCarriedObjectFlip
483E238SubCE229_Block_E238
484E239GetObjectTargetPosition
485E246GetObjectSecondPosition
486E253QueueObjectVramBlock
487E25EQueueObjectStatusBlock
488E266QueueVramBlockFromPointer
489E26BSpawnPatrolObjects
490E295SubCE26B_Block_E295
491E29CNextPatrolSlot
492E2A9SubCE29C_Block_E2A9
493E2AASubCE29C_Block_E2AA
494E2C2SubCE29C_Block_E2C2
495E2D3SubCE29C_Block_E2D3
496E2E3SubCE29C_Block_E2E3
497E2F4FindPatrolThreshold
498E300SubCE2F4_Block_E300
499E314SubCE2F4_Block_E314
500E319AdvancePatrolCounter
501E32ASubCE319_Block_E32A
502E32DSubCE319_Block_E32D
503E339SubCE319_Block_E339
504E364SubCE354_Block_E364
505E36BSetObjectAttribute
506E377SubCE36B_Block_E377
507E385SubCE36B_Block_E385
508E387SetObjectTileAlt
509E38FAdvanceObjectAnimationState
510E3ABSubCE38F_Block_E3AB
511E3BDSubCE3B1_Block_E3BD
512E3C6SubCE3B1_Block_E3C6
513E3CFSubCE3B1_Block_E3CF
514E3DEMoveObjectByDelta
515E3FAMoveObjectX
516E40ASubCE3FA_Block_E40A
517E40CApplyObjectXDelta
518E416HandleObjectReachedEnd
519E423SubCE416_Block_E423
520E43CSubCE416_Block_E43C
521E444SubCE416_Block_E444
522E452SubCE416_Block_E452
523E48EAdjustObjectPosition
524E4A9SubCE48E_Block_E4A9
525E4B9SubCE48E_Block_E4B9
526E4BAUpdateScorePopup
527E4CESubCE4BA_Block_E4CE
528E4D4SubCE4BA_Block_E4D4
529E4D7SubCE4BA_Block_E4D7
530E4DAAdvanceScorePopup
531E4F5SubCE4DA_Block_E4F5
532E4F9SubCE4DA_Block_E4F9
533E4FAQueueEdgeBlock
534E506SubCE4FA_Block_E506
535E518SubCE4FA_Block_E518
536E525SubCE4FA_Block_E525
537E52ASubCE4FA_Block_E52A
538E52CQueueEdgeBlockData
539E53FSubCE52C_Block_E53F
540E540UpdateTextScrollObjects
541E546ScanTextScrollRecord
542E552SubCE546_Block_E552
543E559SubCE546_Block_E559
544E575SubCE567_Block_E575
545E598SubCE567_Block_E598
546E5BASubCE567_Block_E5BA
547E5C2SubCE567_Block_E5C2
548E5D6SubCE567_Block_E5D6
549E5E4SubCE567_Block_E5E4
550E5E8SubCE567_Block_E5E8
551E5EASetTextScrollState
552E5ECNextTextScrollRecord
553E5FCSubCE5EC_Block_E5FC
554E5FDUpdateStatusPanel
555E616SubCE5FD_Block_E616
556E637SubCE5FD_Block_E637
557E643SubCE5FD_Block_E643
558E670SubCE5FD_Block_E670
559E673StartStatusPanelTimer
560E67DSubCE673_Block_E67D
561E67ESubCE673_Block_E67E
562E688SubCE673_Block_E688
563E68FClearStatusPanelTimer
564E699SubCE68F_Block_E699
565E69ADrawScoreDigits
566E6AFSubCE69A_Block_E6AF
567E6B6SubCE69A_Block_E6B6
568E6EBSubCE69A_Block_E6EB
569E6ECAdvanceStoryScroll
570E6F8SubCE6EC_Block_E6F8
571E6FDSubCE6EC_Block_E6FD
572E703SubCE6EC_Block_E703
573E714SubCE6EC_Block_E714
574E725SubCE6EC_Block_E725
575E728SetScrollRowIndex
576E729SetScrollTablePointers
577E747FindScrollRow
578E751SubCE747_Block_E751
579E75BSubCE747_Block_E75B
580E76BQueueScrollRowBlock
581E781DrawSpriteList
582E783DrawSpriteListLoop
583E79CSubCE783_Block_E79C
584E79DResetDrawState
585E7A1ResetSpriteFrameCounter
586E7A5ResetSpriteAnimState
587E7B8RenderObjectTile
588E7C3ResetObjectAnimationState
589E7E3SubCE7C3_Block_E7E3
590E7F2SetObjectDirectionFlags
591E812SelectObjectTileByState
592E827SubCE812_Block_E827
593E846SubCE812_Block_E846
594E84BSetObjectTileCoords
595E853SetObjectTileBuffer
596E85ARenderTileAtPosition
597E85FDrawBlockAt
598E878DrawPopupBlock
599E88DDrawStatusBlock
600E89FSetBlockBuffer
601E8A1DrawBlockAtCorner
602E8A6LoadHitboxPointer
603E8AESetSourcePointerLow
604E8B0SetObjectScreenPosition
605E8B9SetSourcePointerDefault
606E8C2LoadAltHitboxPointer
607E8CASetTileNumber
608E8CCSetObjectOrigin
609E8D5SetSourcePointerStatus
610E8DETestBitInPattern
611E8E3SubCE8DE_Block_E8E3
612E8EESubCE8DE_Block_E8EE
613E8F0DrawTileBlock
614E90CSubCE8F0_Block_E90C
615E925SubCE8F0_Block_E925
616E92BSubCE8F0_Block_E92B
617E931SubCE8F0_Block_E931
618E934FinishTileBlock
619E93CWriteOamEntries
620E946SubCE93C_Block_E946
621E958DrawHorizontalRun
622E95ESubCE958_Block_E95E
623E973DrawDiagonalRun
624E97CSubCE973_Block_E97C
625E981SubCE973_Block_E981
626E9A7DrawReverseDiagonalRun
627E9B0SubCE9A7_Block_E9B0
628E9B5SubCE9A7_Block_E9B5
629E9DDDrawVerticalRun
630E9E3SubCE9DD_Block_E9E3
631EA03FillTileBlock
632EA05SubCEA03_Block_EA05
633EA0BSubCEA03_Block_EA0B
634EA2BTestObjectBoxOverlapMode
635EA2DTestObjectBoxOverlapModeAlt
636EA3BSubCEA2D_Block_EA3B
637EA49SubCEA2D_Block_EA49
638EA54AdvanceOverlapList
639EA68SubCEA63_Block_EA68
640EA6DReturnOverlapResult
641EA74LoadOverlapBoxAbsolute
642EA7CSubCEA74_Block_EA7C
643EA7FAddOverlapBoxOffset
644EA92LoadOverlapBoxRelative
645EA9ASubCEA92_Block_EA9A
646EA9DCopyOverlapBox
647EAAACheckBoxOverlap
648EABBSubCEAAA_Block_EABB
649EAC1SubCEAAA_Block_EAC1
650EAD2SubCEAAA_Block_EAD2
651EAD8SubCEAAA_Block_EAD8
652EADECompareDistanceToTarget
653EAFASubCEADE_Block_EAFA
654EAFDReturnDistanceCompare
655EB02SubCEAFD_Block_EB02
656EB05SubCEAFD_Block_EB05
657EB08GetHitboxOrigin
658EB12SubCEB08_Block_EB12
659EB20ResetBoxOrigin
660EB29TestHitboxTable0
661EB34RunBoxOverlapTest
662EB3BTestHitboxTable1
663EB55SubCEB3B_Block_EB55
664EB67SubCEB3B_Block_EB67
665EB73SubCEB3B_Block_EB73
666EB78SubCEB3B_Block_EB78
667EB79TestHitboxTable2
668EB8ESubCEB79_Block_EB8E
669EB8FTestHitboxTable3
670EBA1SetHitboxResult
671EBA9SubCEBA1_Block_EBA9
672EBAAFindCollectibleAtColumn
673EBB8SubCEBAA_Block_EBB8
674EBD4SubCEBAA_Block_EBD4
675EBDCHandleCollectibleColumnHit
676EBE6SubCEBDC_Block_EBE6
677EBF8SubCEBDC_Block_EBF8
678EBFBCheckCollectibleFacing
679EC09SubCEBFB_Block_EC09
680EC0BSubCEBFB_Block_EC0B
681EC0EFindCollectibleAtColumnAlt
682EC1CSubCEC0E_Block_EC1C
683EC39SubCEC0E_Block_EC39
684EC55SubCEC0E_Block_EC55
685EC5CSetStateBit40Flag
686EC64TestHitboxTable4
687EC71LoadHitboxTable4
688EC7CTestHitboxTable5
689EC86SetHitboxResultAlt
690EC8ESubCEC86_Block_EC8E
691EC8FTestHitboxTable6
692ECAATestHitboxTable7
693ECC2SetHitboxResultAlt2
694ECC6SubCECC2_Block_ECC6
695ECC7RunDeferredTask
696ECFBSubCECC7_Block_ECFB
697ED06SubCECC7_Block_ED06
698ED07ReserveObjectSlot
699ED20SubCED07_Block_ED20
700ED23SubCED07_Block_ED23
701ED24ApplyVramUpdateQueue
702ED38UploadOamViaDma
703ED43ClearNameTableTopAndPalettes
704ED5DSubCED43_Block_ED5D
705ED74SubCED43_Block_ED74
706ED7BQueueVramScreenBlocks
707ED7DSubCED7B_Block_ED7D
708ED86SubCED7B_Block_ED86
709ED8CQueueVramBlockRecord
710EDC8SubCED8C_Block_EDC8
711EDE7SubCED8C_Block_EDE7
712EDF8SubCED8C_Block_EDF8
713EDF9QueueVramDataRecord
714EE0ESubCEDF9_Block_EE0E
715EE25SubCEDF9_Block_EE25
716EE51AdvanceVramQueueIndex
717EE53CheckVramQueueFull
718EE61SubCEE53_Block_EE61
719EE62UpdateAttractTimers
720EE6ESubCEE62_Block_EE6E
721EE74SubCEE62_Block_EE74
722EE78PollJoypadButtonEdge
723EE88SubCEE78_Block_EE88
724EE8DReadControllers
725EEA1ReadControllerPort
726EEA3SubCEEA1_Block_EEA3
727EECCSubCEEA1_Block_EECC
728EECDSubCEEA1_Block_EECD
729EEE3SubCEEA1_Block_EEE3
730EEEFSubCEEA1_Block_EEEF
731EEF2SubCEEA1_Block_EEF2
732EEF5SubCEEA1_Block_EEF5
733EF09ApplyVramUpdateStream
734EF1DScrollTextWindowDown
735EF23SubCEF1D_Block_EF23
736EF34SubCEF1D_Block_EF34
737EF3EShiftTextWindowRows
738EF4BSubCEF3E_Block_EF4B
739EF6ESubCEF3E_Block_EF6E
740EF72SubCEF3E_Block_EF72
741EFA0SubCEF3E_Block_EFA0
742EFA6SubCEF3E_Block_EFA6
743EFC2SubCEF3E_Block_EFC2
744EFC3ScrollTextColumnForward
745EFCESubCEFC3_Block_EFCE
746EFDBSubCEFC3_Block_EFDB
747EFDFSubCEFC3_Block_EFDF
748EFE4ScrollTextColumnBack
749EFF7SubCEFE4_Block_EFF7
750F003SubCEFE4_Block_F003
751F006SplitCoordinateIntoNibbles
752F02ASubCF006_Block_F02A
753F033SubCF006_Block_F033
754F057ScrollTextWindowUp
755F059SubCF057_Block_F059
756F05ESubCF057_Block_F05E
757F073SubCF057_Block_F073
758F07FSubCF057_Block_F07F
759F080SubCF057_Block_F080
760F084SubCF057_Block_F084
761F089SubCF057_Block_F089
762F833SetPulse1ControlMaxSweepAndNote
763F835SetPulse1ControlAndNote
764F838WritePulse1NoteTimer
765F83ASubCF838_Block_F83A
766F849SubCF838_Block_F849
767F84AWritePulse2NoteTimer
768F84EWriteTriangleNoteTimer
769F852ConvertNoteToIndex
770F858LookUpNotePeriod
771F863SubCF858_Block_F863
772F876SubCF858_Block_F876
773F889SubCF858_Block_F889
774F88ESubCF858_Block_F88E
775F891SubCF858_Block_F891
776F895SubCF858_Block_F895
777F89ASubCF858_Block_F89A
778F8A1UpdateSoundEngineFrame
779F8BBSubCF8A1_Block_F8BB
780F8BESubCF8A1_Block_F8BE
781F8D4SubCF8A1_Block_F8D4
782F8D9SubCF8A1_Block_F8D9
783F8FDSubCF8A1_Block_F8FD
784F970UpdateSoundEngine
785F983ShiftBitIndex
786F985SubCF983_Block_F985
787F98BSubCF983_Block_F98B
788F98CSetPulse1ControlMaxSweep
789F98ESetPulse1ControlAndSweep
790F995EnablePulse1Channel
791F99BSubCF995_Block_F99B
792F9A7SubCF995_Block_F9A7
793F9AASubCF995_Block_F9AA
794F9B1SubCF995_Block_F9B1
795F9C0SubCF995_Block_F9C0
796F9CFSubCF995_Block_F9CF
797F9D1SubCF995_Block_F9D1
798F9DFSubCF995_Block_F9DF
799F9EDSubCF995_Block_F9ED
800F9F9SubCF995_Block_F9F9
801F9FEAdvanceSoundSequence
802FA2DSubCF9FE_Block_FA2D
803FA37SubCF9FE_Block_FA37
804FA3ASubCF9FE_Block_FA3A
805FA3DContinueSoundSequence
806FA43SubCFA3D_Block_FA43
807FA50SubCFA3D_Block_FA50
808FA60SubCFA3D_Block_FA60
809FA65SubCFA3D_Block_FA65
810FA6ASubCFA3D_Block_FA6A
811FA75SubCFA3D_Block_FA75
812FA7ASubCFA3D_Block_FA7A
813FA87SubCFA3D_Block_FA87
814FA8DSubCFA3D_Block_FA8D
815FAA5SubCFA3D_Block_FAA5
816FAAFSubCFA3D_Block_FAAF
817FAC2SubCFA3D_Block_FAC2
818FAD1SubCFA3D_Block_FAD1
819FADBSubCFA3D_Block_FADB
820FADFSubCFA3D_Block_FADF
821FAE8AdvanceSoundEffectSequence
822FB06SubCFAE8_Block_FB06
823FB09SubCFAE8_Block_FB09
824FB1ASubCFAE8_Block_FB1A
825FB21SubCFAE8_Block_FB21
826FB25SubCFAE8_Block_FB25
827FB33SubCFAE8_Block_FB33
828FB3DSubCFAE8_Block_FB3D
829FB40SubCFAE8_Block_FB40
830FB48SubCFAE8_Block_FB48
831FB4ASubCFAE8_Block_FB4A
832FB58SubCFAE8_Block_FB58
833FB5FUpdatePulse2Channel
834FB6BSubCFB5F_Block_FB6B
835FB75SubCFB5F_Block_FB75
836FB89SubCFB5F_Block_FB89
837FB8ESubCFB5F_Block_FB8E
838FBA8SubCFB5F_Block_FBA8
839FBB8SubCFB5F_Block_FBB8
840FBC6SubCFB5F_Block_FBC6
841FBC7UpdateSoundEffectChannels
842FBD3SubCFBC7_Block_FBD3
843FC05SubCFBC7_Block_FC05
844FC13SubCFBC7_Block_FC13
845FC24SubCFBC7_Block_FC24
846FC3CSubCFC2D_Block_FC3C
847FC4CSubCFC2D_Block_FC4C
848FC55SubCFC2D_Block_FC55
849FC78SubCFC2D_Block_FC78
850FC96SubCFC2D_Block_FC96
851FC9FSubCFC2D_Block_FC9F
852FCA0SubCFC2D_Block_FCA0
853FCB1SubCFC2D_Block_FCB1
854FCC1SubCFC2D_Block_FCC1
855FCC7SubCFC2D_Block_FCC7
856FCCDSubCFC2D_Block_FCCD
857FFF0IrqHandler
858# ---- derived internal branch-target names ----
859C649Reset
860C653SubCC653_OnZero
861C663SubCC663_OnNonzero
862C680IdleWaitForFirstNmi
863C686InitPlayerState
864C69CSubCC686_Block_C69C
865C6A4SubCC686_Block_C6A4
866C6C9ResetVramUpdateQueue
867C6D1ClearScreenAndSpritePalettes
868C6D7ResetPpuControlAndScroll
869C6EBDisableRendering
870C6F1ClearOamBuffer
871C6F5SubCC6F1_Block_C6F5
872C6FCTestObjectBoxOverlap
873C701NmiHandler
874C724SubCC6FC_Block_C724
875C732SubCC6FC_Block_C732
876C73CSubCC6FC_Block_C73C
877C746SubCC6FC_Block_C746
878C754SubCC6FC_Block_C754
879C75ASubCC6FC_Block_C75A
880C75DFinishNmiFrame
881C76DRunGameplayScreen
882C7C6SubCC76D_Block_C7C6
883C7D3SubCC76D_Block_C7D3
884C7E4SubCC76D_Block_C7E4
885C7EDSubCC76D_Block_C7ED
886C7F9SubCC76D_Block_C7F9
887C804SubCC804_Loop
888C822BeginLevelLoad
889C848SubCC822_Block_C848
890C864SubCC822_Block_C864
891C868SubCC822_Block_C868
892C87DLoadLevelLayout
893C891QueueVramBlockFromLevelTable
894C89ERunTitleScreen
895C8AESubCC89E_Block_C8AE
896C8BBSubCC89E_Block_C8BB
897C8BCSubCC89E_Block_C8BC
898C8C9SubCC89E_Block_C8C9
899C8D0SubCC89E_Block_C8D0
900C8D2SubCC89E_Block_C8D2
901C900SubCC89E_Block_C900
902C93FSubCC89E_Block_C93F
903C957BuildTitleScreenOne
904C97ASubCC957_Block_C97A
905C982SubCC957_Block_C982
906C987BuildTitleScreenTwo
907C995SubCC987_Block_C995
908C99BSubCC987_Block_C99B
909C99EUpdateTitleScreen
910C9C8SubCC99E_Block_C9C8
911C9CFSubCC99E_Block_C9CF
912C9D4SubCC99E_Block_C9D4
913C9E7SubCC99E_Block_C9E7
914C9F3StartAttractDemo
915C9F8SubCC9F3_Block_C9F8
916CA0BResetObjectAnimation
917CA15LoadLevelPalette
918CA34PlaceAndActivateObject
919CA3DBuildLevelScreenZero
920CA5CBuildLevelScreenTwo
921CA77BuildLevelScreenOne
922CA91RunAttractDemo
923CA9ASubCCA91_Block_CA9A
924CAB3SubCCA91_Block_CAB3
925CABBSubCCA91_Block_CABB
926CABCSubCCA91_Block_CABC
927CACCSubCCA91_Block_CACC
928CADARunEnemyEncounterUpdate
929CAECSubCCADA_Block_CAEC
930CAEDSubCCADA_Block_CAED
931CAF0SubCCADA_Block_CAF0
932CAFCSubCCADA_Block_CAFC
933CB17SubCCADA_Block_CB17
934CB18RunStageTransitionUpdate
935CB21SubCCB18_Block_CB21
936CB4BSubCCB18_Block_CB4B
937CB6ESubCCB18_Block_CB6E
938CB6FSubCCB18_Block_CB6F
939CB78SubCCB18_Block_CB78
940CB87SubCCB18_Block_CB87
941CB98SaveJoypadButtons
942CB9AUpdateInGameActors
943CBA7SubCCB9A_Block_CBA7
944CBAFSubCCB9A_Block_CBAF
945CBDFSubCCB9A_Block_CBDF
946CC15SubCCB9A_Block_CC15
947CC24HandleLifeLost
948CC39SubCCC24_Block_CC39
949CC44SubCCC24_Block_CC44
950CC79SubCCC24_Block_CC79
951CC7ESubCCC7E_Loop
952CC82SubCCC82_Loop
953CC87CheckLevelExitTrigger
954CC9DSubCCC87_Block_CC9D
955CCA5SubCCC87_Block_CCA5
956CCA6ToggleAttractMode
957CCC4SubCCCA6_Block_CCC4
958CCDFSubCCCA6_Block_CCDF
959CCE7SubCCCA6_Block_CCE7
960CCE9SubCCCA6_Block_CCE9
961CCEESubCCCA6_Block_CCEE
962CCF2SubCCCA6_Block_CCF2
963CD03SetAttractCooldown
964CD08SubCCD03_Block_CD08
965CD09BeginGameOverSequence
966CD1ASubCCD09_Block_CD1A
967CD2FQueueLevelTileBlock
968CD3CSubCCD2F_Block_CD3C
969CD42SubCCD2F_Block_CD42
970CD56SubCCD2F_Block_CD56
971CD61SubCCD2F_Block_CD61
972CD62SubCCD2F_Block_CD62
973CD83SubCCD2F_Block_CD83
974CD86SubCCD2F_Block_CD86
975CD92MergeJoypadDirections
976CDA0SubCCD92_Block_CDA0
977CDB2SubCCD92_Block_CDB2
978CDB3StartNextLevel
979CDE2SubCCDB3_Block_CDE2
980CDF0HandlePlayerCaptured
981CE0ESubCCDF0_Block_CE0E
982CE0FSubCCDF0_Block_CE0F
983CE1ASubCCDF0_Block_CE1A
984CE2ESubCCDF0_Block_CE2E
985CE38SubCCDF0_Block_CE38
986CE4EHidePlayerSprites
987CE55HidePlayerSpriteSlots
988CE59SubCCE55_Block_CE59
989CE65SubCCE55_Block_CE65
990CE70AddOamSprite
991CE77SubCCE70_Block_CE77
992CEA4SubCCE70_Block_CEA4
993CEB0ReserveSpriteSlots
994CEDDSubCCEB0_Block_CEDD
995CEDEUpdateHudScore
996CEFASubCCEDE_Block_CEFA
997CF06SubCCEDE_Block_CF06
998CF0CQueueLevelVramBlock
999CF0FQueueLevelBorderBlock
1000CF1ASubCCF0F_Block_CF1A
1001CF20QueueVramTileRecord
1002CF31SubCCF20_Block_CF31
1003CF3DUpdatePickupsAndDamage
1004CF43TestFirstPlayerHitbox
1005CF45TestHitbox
1006CF4BHandleCollectiblePickup
1007CF7FSubCCF4B_Block_CF7F
1008CF82SubCCF4B_Block_CF82
1009CF83SubCCF4B_Block_CF83
1010CF9CSubCCF4B_Block_CF9C
1011CFA8SubCCF4B_Block_CFA8
1012CFADHandleCollectiblePickupAlt
1013CFB3SubCCFAD_Block_CFB3
1014CFB4SubCCFAD_Block_CFB4
1015CFDBSubCCFAD_Block_CFDB
1016CFDCSubCCFAD_Block_CFDC
1017CFDFSubCCFAD_Block_CFDF
1018CFF1SubCCFAD_Block_CFF1
1019CFF2TestPlayerHitboxesAlt
1020CFF4TestHitboxAlt
1021CFFAHandlePlayerDamage
1022CFFFSubCCFFA_Block_CFFF
1023D01FSubCCFFA_Block_D01F
1024D043SubCCFFA_Block_D043
1025D04ASubCCFFA_Block_D04A
1026D04BCheckCollectiblePickup
1027D072SubCD04B_Block_D072
1028D073SetSourcePointerFromTable
1029D07FUpdateStageActors
1030D09DSubCD07F_Block_D09D
1031D0A7SubCD07F_Block_D0A7
1032D0ADSpawnEnemySprites
1033D111SubCD0AD_Block_D111
1034D112UpdatePlayerAndEnemies
1035D13FSubCD112_Block_D13F
1036D153SubCD112_Block_D153
1037D154SubCD112_Block_D154
1038D15FSubCD112_Block_D15F
1039D169SubCD112_Block_D169
1040D178SubCD112_Block_D178
1041D1A9SubCD112_Block_D1A9
1042D1ACSubCD112_Block_D1AC
1043D1ADCheckCollectibleReach
1044D1DCSubCD1AD_Block_D1DC
1045D1DFCheckLeftEdgeCollision
1046D1FASubCD1DF_Block_D1FA
1047D1FFSubCD1DF_Block_D1FF
1048D202CheckRightEdgeCollision
1049D219SubCD202_Block_D219
1050D21ESubCD202_Block_D21E
1051D221CheckObjectNearEdge
1052D23ACheckObjectOverlap
1053D273SubCD23A_Block_D273
1054D275StoreOverlapResult
1055D27FSubCD275_Block_D27F
1056D284CheckWallCollision
1057D2A1SubCD284_Block_D2A1
1058D2A4SubCD284_Block_D2A4
1059D2A5CheckEnemyBodyCollision
1060D2C4SubCD2A5_Block_D2C4
1061D2C7SubCD2A5_Block_D2C7
1062D2C8CheckPlayerOffScreen
1063D2D5SubCD2C8_Block_D2D5
1064D2D6IsPositionOffScreen
1065D2DFSubCD2D6_Block_D2DF
1066D2E2SpawnTextRecord
1067D318ScanForFreeTextSlot
1068D326SubCD318_Block_D326
1069D339SubCD318_Block_D339
1070D33ASubCD318_Block_D33A
1071D346CheckObjectSpawnTable
1072D34FSubCD346_Block_D34F
1073D35CSetHitReactionFlags
1074D36BSubCD35C_Block_D36B
1075D37FSubCD35C_Block_D37F
1076D392SubCD35C_Block_D392
1077D39FSubCD35C_Block_D39F
1078D3B3SubCD35C_Block_D3B3
1079D3B4SubCD35C_Block_D3B4
1080D3BASubCD35C_Block_D3BA
1081D3E3SubCD35C_Block_D3E3
1082D3E4TestObjectAtPosition
1083D3F1UpdateProjectileObjects
1084D403SubCD3F1_Block_D403
1085D40ESubCD3F1_Block_D40E
1086D428SubCD3F1_Block_D428
1087D42AResetProjectileRecord
1088D44FSubCD42A_Block_D44F
1089D456SubCD42A_Block_D456
1090D461SubCD42A_Block_D461
1091D46BSpawnBonusSprite
1092D49ESubCD46B_Block_D49E
1093D49FMarkPickupMissed
1094D4B2SubCD49F_Block_D4B2
1095D4B3TestBonusSpriteOverlap
1096D4CCGetObjectScreenPosition
1097D4D5CheckStageEndTrigger
1098D4F0SubCD4D5_Block_D4F0
1099D50CSubCD4D5_Block_D50C
1100D529SubCD4D5_Block_D529
1101D52AUpdateWorldEntities
1102D559SubCD52A_Block_D559
1103D56BSubCD52A_Block_D56B
1104D575QueueLevelTextRow
1105D581SubCD575_Block_D581
1106D597SubCD597_OnZero
1107D5A9SubCD597_Block_D5A9
1108D5B8SubCD597_Block_D5B8
1109D5BBSpawnScoreNumberPopup
1110D5CESubCD5BB_Block_D5CE
1111D5E3SubCD5BB_Block_D5E3
1112D5EEQueueTextRowFromTable
1113D5F1SubCD5EE_Block_D5F1
1114D60BQueueTextRowLoop
1115D60DQueueTextRowInnerLoop
1116D619SubCD60D_Block_D619
1117D627SubCD60D_Block_D627
1118D637SubCD60D_Block_D637
1119D63AQueueLevelTextTable
1120D63DSubCD63A_Block_D63D
1121D647ScanTextTableColumns
1122D651SubCD647_Block_D651
1123D669SubCD647_Block_D669
1124D681SubCD647_Block_D681
1125D683SubCD647_Block_D683
1126D696UpdateEnemiesAndEffects
1127D6AESubCD696_Block_D6AE
1128D6BDSubCD696_Block_D6BD
1129D6BESubCD696_Block_D6BE
1130D6CDSubCD696_Block_D6CD
1131D6D6SubCD696_Block_D6D6
1132D6DDSubCD696_Block_D6DD
1133D6E8SubCD696_Block_D6E8
1134D6F4SubCD696_Block_D6F4
1135D6F5UpdateScrollingPlatform
1136D706SubCD6F5_Block_D706
1137D727SubCD6F5_Block_D727
1138D72ESubCD6F5_Block_D72E
1139D72FSubCD6F5_Block_D72F
1140D73CResetPlatformState
1141D744SubCD73C_Block_D744
1142D757UpdatePlayerMovement
1143D775SubCD757_Block_D775
1144D78ESubCD757_Block_D78E
1145D799SubCD757_Block_D799
1146D79FSetScorePopupTileOffset
1147D7A1SubCD79F_Block_D7A1
1148D7B8SubCD7B8_Loop
1149D7C8SubCD7B8_Block_D7C8
1150D7D6SubCD7B8_Block_D7D6
1151D7DCSubCD7B8_Block_D7DC
1152D7E6SubCD7B8_Block_D7E6
1153D7EDRenderPlayerTile
1154D7FAAdvancePlayerAnimationFrame
1155D804SubCD7FA_Block_D804
1156D807ResetPlayerAnimation
1157D831SubCD807_Block_D831
1158D83CSubCD807_Block_D83C
1159D83FStartPlayerThrow
1160D852SubCD83F_Block_D852
1161D858StartThrowAnimation
1162D85DSubCD858_Block_D85D
1163D863SubCD858_Block_D863
1164D883SubCD858_Block_D883
1165D89CSubCD858_Block_D89C
1166D8B3SubCD858_Block_D8B3
1167D8B6SubCD858_Block_D8B6
1168D8B9ClearPlayerDirectionFlags
1169D8C2StartPlayerThrowAnim
1170D8D3SubCD8C2_Block_D8D3
1171D8E5SubCD8C2_Block_D8E5
1172D8E8SubCD8E8_Loop
1173D8F5SetThrowTargetOffset
1174D8FDSubCD8F5_Block_D8FD
1175D908SubCD8F5_Block_D908
1176D915SubCD8F5_Block_D915
1177D91ESubCD8F5_Block_D91E
1178D92BSetAlternateThrowOffset
1179D933SubCD92B_Block_D933
1180D93EAddThrowTargetOffset
1181D95FSubCD93E_Block_D95F
1182D967SelectThrowTile
1183D971SubCD967_Block_D971
1184D989SubCD967_Block_D989
1185D98ESubCD967_Block_D98E
1186D998SubCD998_Loop
1187D9A9SubCD998_Block_D9A9
1188D9AFSetThrowFacingRight
1189D9C2SubCD9AF_Block_D9C2
1190D9CERenderThrowTile
1191D9DFCancelPlayerAction
1192D9F7SubCD9DF_Block_D9F7
1193DA00SubCD9DF_Block_DA00
1194DA07UpdatePlayerCarryAnim
1195DA11SubCDA07_Block_DA11
1196DA1BSubCDA07_Block_DA1B
1197DA3DSubCDA07_Block_DA3D
1198DA51SubCDA07_Block_DA51
1199DA66SubCDA07_Block_DA66
1200DA87SubCDA87_Loop
1201DA94SubCDA87_Block_DA94
1202DAA5TestCarryHitbox
1203DAADStartCarryAnimation
1204DAC5SubCDAAD_Block_DAC5
1205DAC8SubCDAAD_Block_DAC8
1206DAEBSubCDAAD_Block_DAEB
1207DAFCSubCDAAD_Block_DAFC
1208DAFESubCDAAD_Block_DAFE
1209DAFFQueueVramBlockFromSpriteTable
1210DB12StartKidnapSequence
1211DB33SubCDB12_Block_DB33
1212DB38SubCDB12_Block_DB38
1213DB3ABeginKidnapMovement
1214DB40SubCDB3A_Block_DB40
1215DB56SubCDB3A_Block_DB56
1216DB57SubCDB3A_Block_DB57
1217DB68RunScreenStateMachine
1218DB78SubCDB68_Block_DB78
1219DB7FSubCDB68_Block_DB7F
1220DB86SubCDB68_Block_DB86
1221DB8DSubCDB68_Block_DB8D
1222DB94SubCDB68_Block_DB94
1223DB9BSubCDB68_Block_DB9B
1224DBA2SubCDB68_Block_DBA2
1225DBA9SubCDB68_Block_DBA9
1226DBBDSubCDB68_Block_DBBD
1227DBC6SubCDB68_Block_DBC6
1228DBC9HandleScreenState01
1229DBDASubCDBC9_Block_DBDA
1230DBDFSubCDBC9_Block_DBDF
1231DBE5DrawState01Tile
1232DBEDSubCDBE5_Block_DBED
1233DBF0HandleScreenStateDefault
1234DBFBSubCDBF0_Block_DBFB
1235DC1BSubCDBF0_Block_DC1B
1236DC29SubCDBF0_Block_DC29
1237DC2BSubCDBF0_Block_DC2B
1238DC30AdvanceDefaultStateObject
1239DC3ESubCDC30_Block_DC3E
1240DC50SubCDC30_Block_DC50
1241DC5ASubCDC30_Block_DC5A
1242DC5DHandleScreenStateBit40
1243DC78SubCDC5D_Block_DC78
1244DC80SubCDC80_Loop
1245DC93SubCDC80_Block_DC93
1246DCA7SubCDC80_Block_DCA7
1247DCAAAdvanceStateBit40Object
1248DCB8SubCDCB8_Loop
1249DCC1SubCDCB8_Block_DCC1
1250DCCESubCDCB8_Block_DCCE
1251DCE7SubCDCB8_Block_DCE7
1252DCEDResetStateBit40Object
1253DCF4SubCDCED_Block_DCF4
1254DCF5FaceTowardPlayer
1255DD01SubCDCF5_Block_DD01
1256DD0BFacePlayerRight
1257DD14FacePlayerLeft
1258DD1DFaceTowardTarget
1259DD26SubCDD1D_Block_DD26
1260DD29HandleScreenState10
1261DD3FSubCDD29_Block_DD3F
1262DD67SubCDD29_Block_DD67
1263DD71SubCDD29_Block_DD71
1264DD7DSubCDD29_Block_DD7D
1265DD86SubCDD29_Block_DD86
1266DD90SubCDD29_Block_DD90
1267DD92RenderState10Object
1268DD9BSubCDD92_Block_DD9B
1269DDB2SetScrollForSplitScreen
1270DDD3HandleScreenState80
1271DDECSubCDDD3_Block_DDEC
1272DDEERenderState80Object
1273DDF4SubCDDEE_Block_DDF4
1274DE13SubCDDEE_Block_DE13
1275DE1DAdvanceState80Sprite
1276DE37SubCDE1D_Block_DE37
1277DE3CSubCDE1D_Block_DE3C
1278DE46HandleScreenState40
1279DE6ESubCDE46_Block_DE6E
1280DE70AdvanceState40Object
1281DE7DSubCDE70_Block_DE7D
1282DE7FAdvanceState40Height
1283DE87SubCDE7F_Block_DE87
1284DE8FSubCDE7F_Block_DE8F
1285DE9CSubCDE7F_Block_DE9C
1286DE9EAddState40Height
1287DEA7RenderState40Object
1288DEADSubCDEA7_Block_DEAD
1289DEB0SubCDEA7_Block_DEB0
1290DEB6HandleScreenState20
1291DEC1SubCDEB6_Block_DEC1
1292DEE0SubCDEB6_Block_DEE0
1293DEE4SetState20ObjectTile
1294DEF4SubCDEE4_Block_DEF4
1295DEFCRenderState20Object
1296DF09SubCDEFC_Block_DF09
1297DF13SubCDEFC_Block_DF13
1298DF1AHandleScreenState08
1299DF33SubCDF1A_Block_DF33
1300DF39HandleScreenState04
1301DF70SubCDF39_Block_DF70
1302DF80SubCDF39_Block_DF80
1303DF8EResetHudScoreFields
1304DF9BHandleScreenState02
1305DFC6SubCDF9B_Block_DFC6
1306DFD3SubCDF9B_Block_DFD3
1307DFDCAdjustState02Object
1308DFF4SubCDFDC_Block_DFF4
1309E012SubCDFDC_Block_E012
1310E01ESubCDFDC_Block_E01E
1311E02FSubCDFDC_Block_E02F
1312E03FSubCDFDC_Block_E03F
1313E046TwoComplementNegate
1314E04CSpawnPlayerObject
1315E053SubCE04C_Block_E053
1316E065SubCE04C_Block_E065
1317E066SubCE04C_Block_E066
1318E06BSubCE04C_Block_E06B
1319E076SubCE04C_Block_E076
1320E083SubCE04C_Block_E083
1321E08CSubCE04C_Block_E08C
1322E093SubCE04C_Block_E093
1323E097SubCE04C_Block_E097
1324E0AASubCE04C_Block_E0AA
1325E0B7SubCE04C_Block_E0B7
1326E0B9InitObjectRecord
1327E0D8SubCE0B9_Block_E0D8
1328E0E4SubCE0B9_Block_E0E4
1329E0F1SubCE0B9_Block_E0F1
1330E0FBLoadObjectPattern
1331E123SubCE0FB_Block_E123
1332E126SetObjectTile
1333E12BFlipObjectDirection
1334E137SubCE12B_Block_E137
1335E13ASetObjectPatternByLevel
1336E146AdvanceObjectPattern
1337E15ESubCE146_Block_E15E
1338E174SubCE146_Block_E174
1339E177SetObjectTileAndFlip
1340E186SubCE177_Block_E186
1341E188ClampObjectX
1342E197SubCE188_Block_E197
1343E19DFlipObjectDirectionAlt
1344E1A3SubCE1A3_Loop
1345E1AASubCE1A3_Block_E1AA
1346E1ADUpdateObjectAnimationFrames
1347E1B2SubCE1AD_Block_E1B2
1348E1C4SubCE1AD_Block_E1C4
1349E1D2SubCE1AD_Block_E1D2
1350E1F6SubCE1AD_Block_E1F6
1351E1F9SubCE1F9_Loop
1352E202UpdateCarriedObject
1353E220SubCE202_Block_E220
1354E229UpdateCarriedObjectFlip
1355E238SubCE229_Block_E238
1356E239GetObjectTargetPosition
1357E246GetObjectSecondPosition
1358E253QueueObjectVramBlock
1359E25EQueueObjectStatusBlock
1360E266QueueVramBlockFromPointer
1361E26BSpawnPatrolObjects
1362E295SubCE26B_Block_E295
1363E29CNextPatrolSlot
1364E2A9SubCE29C_Block_E2A9
1365E2AASubCE29C_Block_E2AA
1366E2C2SubCE29C_Block_E2C2
1367E2D3SubCE29C_Block_E2D3
1368E2E3SubCE29C_Block_E2E3
1369E2F4FindPatrolThreshold
1370E300SubCE2F4_Block_E300
1371E314SubCE2F4_Block_E314
1372E319AdvancePatrolCounter
1373E32ASubCE319_Block_E32A
1374E32DSubCE319_Block_E32D
1375E339SubCE319_Block_E339
1376E354SubCE354_Loop
1377E364SubCE354_Block_E364
1378E36BSetObjectAttribute
1379E377SubCE36B_Block_E377
1380E385SubCE36B_Block_E385
1381E387SetObjectTileAlt
1382E38FAdvanceObjectAnimationState
1383E3ABSubCE38F_Block_E3AB
1384E3B1SubCE3B1_Loop
1385E3BDSubCE3B1_Block_E3BD
1386E3C6SubCE3B1_Block_E3C6
1387E3CFSubCE3B1_Block_E3CF
1388E3DEMoveObjectByDelta
1389E3FAMoveObjectX
1390E40ASubCE3FA_Block_E40A
1391E40CApplyObjectXDelta
1392E416HandleObjectReachedEnd
1393E423SubCE416_Block_E423
1394E43CSubCE416_Block_E43C
1395E444SubCE416_Block_E444
1396E452SubCE416_Block_E452
1397E48EAdjustObjectPosition
1398E4A9SubCE48E_Block_E4A9
1399E4B9SubCE48E_Block_E4B9
1400E4BAUpdateScorePopup
1401E4CESubCE4BA_Block_E4CE
1402E4D4SubCE4BA_Block_E4D4
1403E4D7SubCE4BA_Block_E4D7
1404E4DAAdvanceScorePopup
1405E4F5SubCE4DA_Block_E4F5
1406E4F9SubCE4DA_Block_E4F9
1407E4FAQueueEdgeBlock
1408E506SubCE4FA_Block_E506
1409E518SubCE4FA_Block_E518
1410E525SubCE4FA_Block_E525
1411E52ASubCE4FA_Block_E52A
1412E52CQueueEdgeBlockData
1413E53FSubCE52C_Block_E53F
1414E540UpdateTextScrollObjects
1415E546ScanTextScrollRecord
1416E552SubCE546_Block_E552
1417E559SubCE546_Block_E559
1418E567SubCE567_Loop
1419E575SubCE567_Block_E575
1420E598SubCE567_Block_E598
1421E5BASubCE567_Block_E5BA
1422E5C2SubCE567_Block_E5C2
1423E5D6SubCE567_Block_E5D6
1424E5E4SubCE567_Block_E5E4
1425E5E8SubCE567_Block_E5E8
1426E5EASetTextScrollState
1427E5ECNextTextScrollRecord
1428E5FCSubCE5EC_Block_E5FC
1429E5FDUpdateStatusPanel
1430E616SubCE5FD_Block_E616
1431E637SubCE5FD_Block_E637
1432E643SubCE5FD_Block_E643
1433E670SubCE5FD_Block_E670
1434E673StartStatusPanelTimer
1435E67DSubCE673_Block_E67D
1436E67ESubCE673_Block_E67E
1437E688SubCE673_Block_E688
1438E68FClearStatusPanelTimer
1439E699SubCE68F_Block_E699
1440E69ADrawScoreDigits
1441E6AFSubCE69A_Block_E6AF
1442E6B6SubCE69A_Block_E6B6
1443E6EBSubCE69A_Block_E6EB
1444E6ECAdvanceStoryScroll
1445E6F8SubCE6EC_Block_E6F8
1446E6FDSubCE6EC_Block_E6FD
1447E703SubCE6EC_Block_E703
1448E714SubCE6EC_Block_E714
1449E725SubCE6EC_Block_E725
1450E728SetScrollRowIndex
1451E729SetScrollTablePointers
1452E747FindScrollRow
1453E751SubCE747_Block_E751
1454E75BSubCE747_Block_E75B
1455E76BQueueScrollRowBlock
1456E781DrawSpriteList
1457E783DrawSpriteListLoop
1458E79CSubCE783_Block_E79C
1459E79DResetDrawState
1460E7A1ResetSpriteFrameCounter
1461E7A5ResetSpriteAnimState
1462E7B8RenderObjectTile
1463E7C3ResetObjectAnimationState
1464E7E3SubCE7C3_Block_E7E3
1465E7F2SetObjectDirectionFlags
1466E7F7SubCE7F7_OnZero
1467E812SelectObjectTileByState
1468E827SubCE812_Block_E827
1469E846SubCE812_Block_E846
1470E84BSetObjectTileCoords
1471E853SetObjectTileBuffer
1472E85ARenderTileAtPosition
1473E85FDrawBlockAt
1474E878DrawPopupBlock
1475E88DDrawStatusBlock
1476E89FSetBlockBuffer
1477E8A1DrawBlockAtCorner
1478E8A6LoadHitboxPointer
1479E8AESetSourcePointerLow
1480E8B0SetObjectScreenPosition
1481E8B9SetSourcePointerDefault
1482E8C2LoadAltHitboxPointer
1483E8CASetTileNumber
1484E8CCSetObjectOrigin
1485E8D5SetSourcePointerStatus
1486E8DETestBitInPattern
1487E8E3SubCE8DE_Block_E8E3
1488E8EESubCE8DE_Block_E8EE
1489E8F0DrawTileBlock
1490E90CSubCE8F0_Block_E90C
1491E925SubCE8F0_Block_E925
1492E92BSubCE8F0_Block_E92B
1493E931SubCE8F0_Block_E931
1494E934FinishTileBlock
1495E93CWriteOamEntries
1496E946SubCE93C_Block_E946
1497E958DrawHorizontalRun
1498E95ESubCE958_Block_E95E
1499E973DrawDiagonalRun
1500E97CSubCE973_Block_E97C
1501E981SubCE973_Block_E981
1502E9A7DrawReverseDiagonalRun
1503E9B0SubCE9A7_Block_E9B0
1504E9B5SubCE9A7_Block_E9B5
1505E9DDDrawVerticalRun
1506E9E3SubCE9DD_Block_E9E3
1507EA03FillTileBlock
1508EA05SubCEA03_Block_EA05
1509EA0BSubCEA03_Block_EA0B
1510EA2BTestObjectBoxOverlapMode
1511EA2DTestObjectBoxOverlapModeAlt
1512EA3BSubCEA2D_Block_EA3B
1513EA49SubCEA2D_Block_EA49
1514EA54AdvanceOverlapList
1515EA63SubCEA63_Loop
1516EA68SubCEA63_Block_EA68
1517EA6DReturnOverlapResult
1518EA74LoadOverlapBoxAbsolute
1519EA7CSubCEA74_Block_EA7C
1520EA7FAddOverlapBoxOffset
1521EA92LoadOverlapBoxRelative
1522EA9ASubCEA92_Block_EA9A
1523EA9DCopyOverlapBox
1524EAAACheckBoxOverlap
1525EABBSubCEAAA_Block_EABB
1526EAC1SubCEAAA_Block_EAC1
1527EAD2SubCEAAA_Block_EAD2
1528EAD8SubCEAAA_Block_EAD8
1529EADBSubCEADB_Loop
1530EADECompareDistanceToTarget
1531EAFASubCEADE_Block_EAFA
1532EAFDReturnDistanceCompare
1533EB02SubCEAFD_Block_EB02
1534EB05SubCEAFD_Block_EB05
1535EB08GetHitboxOrigin
1536EB12SubCEB08_Block_EB12
1537EB20ResetBoxOrigin
1538EB29TestHitboxTable0
1539EB34RunBoxOverlapTest
1540EB3BTestHitboxTable1
1541EB55SubCEB3B_Block_EB55
1542EB67SubCEB3B_Block_EB67
1543EB73SubCEB3B_Block_EB73
1544EB78SubCEB3B_Block_EB78
1545EB79TestHitboxTable2
1546EB8ESubCEB79_Block_EB8E
1547EB8FTestHitboxTable3
1548EBA1SetHitboxResult
1549EBA9SubCEBA1_Block_EBA9
1550EBAAFindCollectibleAtColumn
1551EBB8SubCEBAA_Block_EBB8
1552EBD4SubCEBAA_Block_EBD4
1553EBDCHandleCollectibleColumnHit
1554EBE6SubCEBDC_Block_EBE6
1555EBF8SubCEBDC_Block_EBF8
1556EBFBCheckCollectibleFacing
1557EC09SubCEBFB_Block_EC09
1558EC0BSubCEBFB_Block_EC0B
1559EC0EFindCollectibleAtColumnAlt
1560EC1CSubCEC0E_Block_EC1C
1561EC39SubCEC0E_Block_EC39
1562EC55SubCEC0E_Block_EC55
1563EC5CSetStateBit40Flag
1564EC61SubCEC61_Loop
1565EC64TestHitboxTable4
1566EC71LoadHitboxTable4
1567EC7CTestHitboxTable5
1568EC86SetHitboxResultAlt
1569EC8ESubCEC86_Block_EC8E
1570EC8FTestHitboxTable6
1571ECAATestHitboxTable7
1572ECC2SetHitboxResultAlt2
1573ECC6SubCECC2_Block_ECC6
1574ECC7RunDeferredTask
1575ECFBSubCECC7_Block_ECFB
1576ED06SubCECC7_Block_ED06
1577ED07ReserveObjectSlot
1578ED20SubCED07_Block_ED20
1579ED23SubCED07_Block_ED23
1580ED24ApplyVramUpdateQueue
1581ED38UploadOamViaDma
1582ED43ClearNameTableTopAndPalettes
1583ED5DSubCED43_Block_ED5D
1584ED74SubCED43_Block_ED74
1585ED7BQueueVramScreenBlocks
1586ED7DSubCED7B_Block_ED7D
1587ED86SubCED7B_Block_ED86
1588ED8CQueueVramBlockRecord
1589EDC8SubCED8C_Block_EDC8
1590EDE7SubCED8C_Block_EDE7
1591EDF8SubCED8C_Block_EDF8
1592EDF9QueueVramDataRecord
1593EE0ESubCEDF9_Block_EE0E
1594EE25SubCEDF9_Block_EE25
1595EE51AdvanceVramQueueIndex
1596EE53CheckVramQueueFull
1597EE61SubCEE53_Block_EE61
1598EE62UpdateAttractTimers
1599EE6ESubCEE62_Block_EE6E
1600EE74SubCEE62_Block_EE74
1601EE78PollJoypadButtonEdge
1602EE88SubCEE78_Block_EE88
1603EE8DReadControllers
1604EEA1ReadControllerPort
1605EEA3SubCEEA1_Block_EEA3
1606EECCSubCEEA1_Block_EECC
1607EECDSubCEEA1_Block_EECD
1608EEE3SubCEEA1_Block_EEE3
1609EEEFSubCEEA1_Block_EEEF
1610EEF2SubCEEA1_Block_EEF2
1611EEF5SubCEEA1_Block_EEF5
1612EF09ApplyVramUpdateStream
1613EF1DScrollTextWindowDown
1614EF23SubCEF1D_Block_EF23
1615EF34SubCEF1D_Block_EF34
1616EF3EShiftTextWindowRows
1617EF4BSubCEF3E_Block_EF4B
1618EF6ESubCEF3E_Block_EF6E
1619EF72SubCEF3E_Block_EF72
1620EFA0SubCEF3E_Block_EFA0
1621EFA6SubCEF3E_Block_EFA6
1622EFC2SubCEF3E_Block_EFC2
1623EFC3ScrollTextColumnForward
1624EFCESubCEFC3_Block_EFCE
1625EFDBSubCEFC3_Block_EFDB
1626EFDFSubCEFC3_Block_EFDF
1627EFE4ScrollTextColumnBack
1628EFF7SubCEFE4_Block_EFF7
1629F003SubCEFE4_Block_F003
1630F006SplitCoordinateIntoNibbles
1631F02ASubCF006_Block_F02A
1632F033SubCF006_Block_F033
1633F057ScrollTextWindowUp
1634F059SubCF057_Block_F059
1635F05ESubCF057_Block_F05E
1636F073SubCF057_Block_F073
1637F07FSubCF057_Block_F07F
1638F080SubCF057_Block_F080
1639F084SubCF057_Block_F084
1640F089SubCF057_Block_F089
1641F833SetPulse1ControlMaxSweepAndNote
1642F835SetPulse1ControlAndNote
1643F838WritePulse1NoteTimer
1644F83ASubCF838_Block_F83A
1645F849SubCF838_Block_F849
1646F84AWritePulse2NoteTimer
1647F84EWriteTriangleNoteTimer
1648F852ConvertNoteToIndex
1649F858LookUpNotePeriod
1650F863SubCF858_Block_F863
1651F876SubCF858_Block_F876
1652F889SubCF858_Block_F889
1653F88ESubCF858_Block_F88E
1654F891SubCF858_Block_F891
1655F895SubCF858_Block_F895
1656F89ASubCF858_Block_F89A
1657F8A1UpdateSoundEngineFrame
1658F8BBSubCF8A1_Block_F8BB
1659F8BESubCF8A1_Block_F8BE
1660F8D4SubCF8A1_Block_F8D4
1661F8D9SubCF8A1_Block_F8D9
1662F8FDSubCF8A1_Block_F8FD
1663F970UpdateSoundEngine
1664F983ShiftBitIndex
1665F985SubCF983_Block_F985
1666F98BSubCF983_Block_F98B
1667F98CSetPulse1ControlMaxSweep
1668F98ESetPulse1ControlAndSweep
1669F995EnablePulse1Channel
1670F99BSubCF995_Block_F99B
1671F9A7SubCF995_Block_F9A7
1672F9AASubCF995_Block_F9AA
1673F9B1SubCF995_Block_F9B1
1674F9C0SubCF995_Block_F9C0
1675F9CFSubCF995_Block_F9CF
1676F9D1SubCF995_Block_F9D1
1677F9DFSubCF995_Block_F9DF
1678F9EDSubCF995_Block_F9ED
1679F9F9SubCF995_Block_F9F9
1680F9FEAdvanceSoundSequence
1681FA2DSubCF9FE_Block_FA2D
1682FA37SubCF9FE_Block_FA37
1683FA3ASubCF9FE_Block_FA3A
1684FA3DContinueSoundSequence
1685FA43SubCFA3D_Block_FA43
1686FA50SubCFA3D_Block_FA50
1687FA60SubCFA3D_Block_FA60
1688FA65SubCFA3D_Block_FA65
1689FA6ASubCFA3D_Block_FA6A
1690FA75SubCFA3D_Block_FA75
1691FA7ASubCFA3D_Block_FA7A
1692FA87SubCFA3D_Block_FA87
1693FA8DSubCFA3D_Block_FA8D
1694FAA5SubCFA3D_Block_FAA5
1695FAAFSubCFA3D_Block_FAAF
1696FAC2SubCFA3D_Block_FAC2
1697FAD1SubCFA3D_Block_FAD1
1698FADBSubCFA3D_Block_FADB
1699FADFSubCFA3D_Block_FADF
1700FAE8AdvanceSoundEffectSequence
1701FB06SubCFAE8_Block_FB06
1702FB09SubCFAE8_Block_FB09
1703FB1ASubCFAE8_Block_FB1A
1704FB21SubCFAE8_Block_FB21
1705FB25SubCFAE8_Block_FB25
1706FB33SubCFAE8_Block_FB33
1707FB3DSubCFAE8_Block_FB3D
1708FB40SubCFAE8_Block_FB40
1709FB48SubCFAE8_Block_FB48
1710FB4ASubCFAE8_Block_FB4A
1711FB58SubCFAE8_Block_FB58
1712FB5FUpdatePulse2Channel
1713FB6BSubCFB5F_Block_FB6B
1714FB75SubCFB5F_Block_FB75
1715FB89SubCFB5F_Block_FB89
1716FB8ESubCFB5F_Block_FB8E
1717FBA8SubCFB5F_Block_FBA8
1718FBB8SubCFB5F_Block_FBB8
1719FBC6SubCFB5F_Block_FBC6
1720FBC7UpdateSoundEffectChannels
1721FBD3SubCFBC7_Block_FBD3
1722FC05SubCFBC7_Block_FC05
1723FC13SubCFBC7_Block_FC13
1724FC24SubCFBC7_Block_FC24
1725FC2DSubCFC2D_OnZero
1726FC3CSubCFC2D_Block_FC3C
1727FC4CSubCFC2D_Block_FC4C
1728FC55SubCFC2D_Block_FC55
1729FC78SubCFC2D_Block_FC78
1730FC96SubCFC2D_Block_FC96
1731FC9FSubCFC2D_Block_FC9F
1732FCA0SubCFC2D_Block_FCA0
1733FCB1SubCFC2D_Block_FCB1
1734FCC1SubCFC2D_Block_FCC1
1735FCC7SubCFC2D_Block_FCC7
1736FCCDSubCFC2D_Block_FCCD
1737FFF0IrqHandler