Files
disasm/NROM/10-Yard Fight (U)/routinemap.tsv
T
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

15 KiB

18000Reset
2803ASubC803A
38069SubC8069
480ACSubC80AC
5815ASubC815A
6815DSubC815D
781A2SubC81A2
88219SubC8219
982AASubC82AA
1082DDSubC82DD
118390SubC8390
128399SubC8399
1383ADSubC83AD
148420SubC8420
15842BSubC842B
168444SubC8444
178456SubC8456
188471NmiHandler
1984F3SubC84F3
2084F6SubC84F6
2184FASubC84FA
2284FFIrqHandler
238500SubC8500
24853BSubC853B
258549SubC8549
26857FSubC857F
2785B0SubC85B0
2885D6SubC85D6
2985EFSubC85EF
308839SubC8839
31888DSubC888D
3288A1SubC88A1
3388C8SubC88C8
3488FBSubC88FB
358953SubC8953
368999SubC8999
3789ADSubC89AD
3889B7SubC89B7
3989C1SubC89C1
408A95SubC8A95
418B14SubC8B14
428B5BSubC8B5B
438B73SubC8B73
448B8ESubC8B8E
458BB8SubC8BB8
468C30SubC8C30
478C47SubC8C47
488CA4SubC8CA4
498CC2SubC8CC2
508D28SubC8D28
518D31SubC8D31
528D67SubC8D67
538D73SubC8D73
548DBESubC8DBE
558DE2SubC8DE2
568E36SubC8E36
578EC4SubC8EC4
588EF1SubC8EF1
598EFCSubC8EFC
608F00SubC8F00
618F37SubC8F37
628F4ASubC8F4A
638F59SubC8F59
648F62SubC8F62
658F6ASubC8F6A
668FFCSubC8FFC
67902FSubC902F
68903CSubC903C
69908DSubC908D
7090D2SubC90D2
7190FDSubC90FD
729109SubC9109
739152SubC9152
749179SubC9179
75927BSubC927B
769298SubC9298
77929ESubC929E
7892ADSubC92AD
7992B0SubC92B0
809372SubC9372
8193DBSubC93DB
8293EASubC93EA
83945FSubC945F
849465SubC9465
859474SubC9474
86947BSubC947B
8794DFSubC94DF
889586SubC9586
8995B7SubC95B7
909633SubC9633
91968FSubC968F
9296E8SubC96E8
9398F4SubC98F4
94998BSubC998B
9599E0SubC99E0
969A00SubC9A00
979A1FSubC9A1F
989DD7SubC9DD7
999E04SubC9E04
1009E77SubC9E77
1019ECFSubC9ECF
1029F49SubC9F49
1039FA9SubC9FA9
104A00ASubCA00A
105A038SubCA038
106A1D6SubCA1D6
107A24FSubCA24F
108A278SubCA278
109A318SubCA318
110A348SubCA348
111A3C5SubCA3C5
112A3D8SubCA3D8
113A415SubCA415
114A534SubCA534
115A5D5SubCA5D5
116A779SubCA779
117A780SubCA780
118A798SubCA798
119A7B7SubCA7B7
120A8AASubCA8AA
121A905SubCA905
122A934SubCA934
123A946SubCA946
124A9A4SubCA9A4
125A9C8SubCA9C8
126A9D9SubCA9D9
127AACFSubCAACF
128AAE4SubCAAE4
129AAF3SubCAAF3
130AC3ESubCAC3E
131ADE2SubCADE2
132AE49SubCAE49
133AE5ESubCAE5E
134AF04SubCAF04
135AF21SubCAF21
136AFADSubCAFAD
137B031SubCB031
138B03FSubCB03F
139B097SubCB097
140B0ADSubCB0AD
141B62CSubCB62C
142B6D7SubCB6D7
143B703SubCB703
144B72DSubCB72D
145B813SubCB813
146B872SubCB872
147B8A3SubCB8A3
148B8FCSubCB8FC
149BE8DSubCBE8D
150BEA3SubCBEA3
151BEB4SubCBEB4
152BEC5SubCBEC5
153BF19SubCBF19
154BF33SubCBF33
155BF47SubCBF47
156BFC3SubCBFC3
157BFD2SubCBFD2
158BFF7SubCBFF7
159BFFCSubCBFFC
160C006SubCC006
161C016SubCC016
162C02ESubCC02E
163C037SubCC037
164C05ESubCC05E
165C076SubCC076
166C088SubCC088
167C09ASubCC09A
168C0B1SubCC0B1
169C0C3SubCC0C3
170C0D5SubCC0D5
171C0E7SubCC0E7
172C0F1SubCC0F1
173C106SubCC106
174C113SubCC113
175C126SubCC126
176C133SubCC133
177C140SubCC140
178C14DSubCC14D
179C157SubCC157
180C161SubCC161
181C16DSubCC16D
182C337SubCC337
183C4F9SubCC4F9
184C543SubCC543
185C558SubCC558
186C56FSubCC56F
187C5CFSubCC5CF
188C5F3SubCC5F3
189C75FSubCC75F
190C82BSubCC82B
191C85ASubCC85A
192C8AESubCC8AE
193C8EFSubCC8EF
194CA15SubCCA15
195CA38SubCCA38
196CA59SubCCA59
197CB37SubCCB37
198CB67SubCCB67
199CBBCSubCCBBC
200# ---- derived internal branch-target names ----
2018000Reset
2028007SubC8007_OnNonnegative
2038012SubC8012_OnNonnegative
204803ASubC803A
2058069SubC8069
206807ASubC807A_Loop
207808DSubC808D_Loop
20880A4SubC80A4_Loop
20980ACSubC80AC
210811ASubC811A_OnNonzero
211812DSubC812D_OnZero
2128149SubC8149_Loop
2138151SubC8151_Loop
214815ASubC815A
215815DSubC815D
2168181SubC8181_Loop
2178194SubC8194_Loop
21881A2SubC81A2
21981A5SubC81A5_Loop
22081BESubC81BE_OnZero
22181E4SubC81E4_OnNonzero
22281FCSubC81FC_OnZero
2238219SubC8219
2248228SubC8228_Loop
225822DSubC822D_Loop
2268233SubC8233_Loop
2278275SubC8275_OnNonzero
2288289SubC8289_OnZero
22982A7SubC82A7_Loop
23082AASubC82AA
23182B8SubC82B8_OnNegative
23282D2SubC82D2_Loop
23382DDSubC82DD
23482E9SubC82E9_Loop
235831ESubC831E_Loop
2368390SubC8390
2378399SubC8399
23883ADSubC83AD
23983B5SubC83B5_Loop
24083C0SubC83C0_Loop
24183C6SubC83C6_Loop
2428420SubC8420
2438424SubC8424_OnNonzero
244842BSubC842B
2458441SubC8441_Loop
2468444SubC8444
2478456SubC8456
2488464SubC8464_OnNonnegative
249846ESubC846E_Loop
2508471NmiHandler
251848ASubC848A_Loop
2528493SubC8493_Loop
25384A5SubC84A5_Loop
25484AASubC84AA_Loop
25584B2SubC84B2_Loop
25684F3SubC84F3
25784F6SubC84F6
25884FASubC84FA
25984FFIrqHandler
2608500SubC8500
261851ESubC851E_Loop
2628531SubC8531_Loop
263853ASubC853A_Loop
264853BSubC853B
265853DSubC853D_OnNonnegative
2668549SubC8549
267854BSubC854B_OnNonnegative
268857FSubC857F
269858ASubC858A_Loop
270858ESubC858E_OnNegative
2718595SubC8595_Loop
27285AFSubC85AF_Loop
27385B0SubC85B0
27485BFSubC85BF_Loop
27585CESubC85CE_Loop
27685D6SubC85D6
27785E4SubC85E4_Loop
27885ECSubC85EC_Loop
27985EFSubC85EF
2808602SubC8602_Loop
2818604SubC8604_OnCarryClear
2828612SubC8612_OnCarryClear
2838644SubC8644_Loop
284865FSubC865F_OnCarrySet
285866ASubC866A_OnNonnegative
286868ESubC868E_Loop
2878839SubC8839
2888850SubC8850_OnCarryClear
2898856SubC8856_OnCarryClear
2908866SubC8866_Loop
291887DSubC887D_Loop
292888DSubC888D
29388A0SubC88A0_Loop
29488A1SubC88A1
29588B5SubC88B5_Loop
29688C0SubC88C0_Loop
29788C8SubC88C8
29888CASubC88CA_OnNonnegative
29988F3SubC88F3_OnCarrySet
30088FBSubC88FB
3018902SubC8902_OnNonzero
3028910SubC8910_OnZero
303892BSubC892B_Loop
304893DSubC893D_Loop
3058946SubC8946_Loop
3068953SubC8953
3078979SubC8979_Loop
3088991SubC8991_Loop
3098999SubC8999
31089A4SubC89A4_Loop
31189A8SubC89A8_Loop
31289AASubC89AA_Loop
31389ADSubC89AD
31489B7SubC89B7
31589C1SubC89C1
31689E6SubC89E6_Loop
31789EDSubC89ED_OnZero
3188A11SubC8A11_Loop
3198A1ESubC8A1E_OnNonzero
3208A3ESubC8A3E_Loop
3218A4ESubC8A4E_OnNonzero
3228A55SubC8A55_Loop
3238A85SubC8A85_OnNonzero
3248A8CSubC8A8C_Loop
3258A95SubC8A95
3268A9DSubC8A9D_Loop
3278AA0SubC8AA0_OnCarryClear
3288B14SubC8B14
3298B3DSubC8B3D_Loop
3308B5ASubC8B5A_Loop
3318B5BSubC8B5B
3328B6FSubC8B6F_Loop
3338B70SubC8B70_Loop
3348B73SubC8B73
3358B8ESubC8B8E
3368BA6SubC8BA6_Loop
3378BB1SubC8BB1_OnNonzero
3388BB8SubC8BB8
3398BF6SubC8BF6_Loop
3408C19SubC8C19_Loop
3418C2ASubC8C2A_Loop
3428C30SubC8C30
3438C42SubC8C42_Loop
3448C44SubC8C44_Loop
3458C47SubC8C47
3468C5ASubC8C5A_Loop
3478CA4SubC8CA4
3488CC0SubC8CC0_Loop
3498CC2SubC8CC2
3508D28SubC8D28
3518D2FSubC8D2F_Loop
3528D31SubC8D31
3538D43SubC8D43_Loop
3548D4ESubC8D4E_Loop
3558D60SubC8D60_Loop
3568D67SubC8D67
3578D72SubC8D72_Loop
3588D73SubC8D73
3598D75SubC8D75_OnCarryClear
3608DBCSubC8DBC_Loop
3618DBESubC8DBE
3628DC7SubC8DC7_OnCarryClear
3638DE2SubC8DE2
3648DFBSubC8DFB_Loop
3658E1DSubC8E1D_Loop
3668E35SubC8E35_Loop
3678E36SubC8E36
3688E4ESubC8E4E_OnNonzero
3698E93SubC8E93_Loop
3708E94SubC8E94_Loop
3718EB7SubC8EB7_Loop
3728EC4SubC8EC4
3738ED4SubC8ED4_OnNonzero
3748EDESubC8EDE_OnCarryClear
3758EE8SubC8EE8_OnNonzero
3768EF1SubC8EF1
3778EF5SubC8EF5_OnNonzero
3788EFCSubC8EFC
3798F00SubC8F00
3808F02SubC8F02_Loop
3818F17SubC8F17_OnCarryClear
3828F37SubC8F37
3838F4ASubC8F4A
3848F59SubC8F59
3858F62SubC8F62
3868F6ASubC8F6A
3878F81SubC8F81_OnNonzero
3888F9BSubC8F9B_OnNonzero
3898FB5SubC8FB5_OnNonzero
3908FCFSubC8FCF_Loop
3918FFCSubC8FFC
392901ASubC901A_OnCarryClear
393901BSubC901B_Loop
394902FSubC902F
395903CSubC903C
3969048SubC9048_Loop
397906CSubC906C_OnCarryClear
398907BSubC907B_Loop
399907FSubC907F_Loop
4009081SubC9081_OnCarryClear
401908DSubC908D
40290AFSubC90AF_OnNonnegative
40390B1SubC90B1_OnCarryClear
40490C1SubC90C1_OnCarryClear
40590D2SubC90D2
40690D4SubC90D4_OnNonnegative
40790D6SubC90D6_OnCarryClear
40890FDSubC90FD
4099109SubC9109
4109111SubC9111_OnNonnegative
4119121SubC9121_Loop
4129123SubC9123_OnNonnegative
413912ESubC912E_OnNonnegative
4149146SubC9146_Loop
4159152SubC9152
4169165SubC9165_OnNonzero
4179171SubC9171_Loop
4189179SubC9179
4199194SubC9194_Loop
42091A9SubC91A9_Loop
42191AESubC91AE_Loop
42291B0SubC91B0_Loop
423927BSubC927B
4249298SubC9298
425929ESubC929E
42692A0SubC92A0_OnNonzero
42792ADSubC92AD
42892B0SubC92B0
42992B2SubC92B2_OnNonzero
43092D3SubC92D3_OnCarryClear
4319372SubC9372
43293B5SubC93B5_Loop
43393DBSubC93DB
43493EASubC93EA
43593EDSubC93ED_OnNonzero
4369440SubC9440_Loop
4379450SubC9450_Loop
4389452SubC9452_Loop
4399457SubC9457_Loop
440945ESubC945E_Loop
441945FSubC945F
4429465SubC9465
4439467SubC9467_OnCarryClear
4449474SubC9474
445947BSubC947B
4469483SubC9483_Loop
44794BBSubC94BB_Loop
44894CBSubC94CB_Loop
44994CDSubC94CD_Loop
45094DCSubC94DC_OnNegative
45194DFSubC94DF
45294FESubC94FE_OnCarryClear
453950BSubC950B_Loop
4549510SubC9510_OnCarryClear
4559547SubC9547_OnCarryClear
4569569SubC9569_Loop
457957CSubC957C_Loop
4589586SubC9586
459958ESubC958E_Loop
46095A0SubC95A0_Loop
46195AFSubC95AF_Loop
46295B7SubC95B7
46395CASubC95CA_OnNonzero
46495D7SubC95D7_Loop
46595F5SubC95F5_OnCarryClear
4669603SubC9603_OnNonzero
467960FSubC960F_Loop
4689613SubC9613_Loop
4699627SubC9627_Loop
4709629SubC9629_OnNonnegative
4719633SubC9633
4729647SubC9647_OnNonnegative
4739664SubC9664_OnCarryClear
474967BSubC967B_Loop
475968FSubC968F
4769691SubC9691_OnNonnegative
47796A3SubC96A3_Loop
47896BFSubC96BF_Loop
47996CASubC96CA_Loop
48096E8SubC96E8
48196FFSubC96FF_Loop
482970CSubC970C_Loop
4839718SubC9718_OnCarryClear
4849747SubC9747_Loop
4859756SubC9756_OnCarryClear
4869785SubC9785_Loop
48797A9SubC97A9_Loop
48897ABSubC97AB_Loop
48997C0SubC97C0_Loop
49097C2SubC97C2_Loop
49197C5SubC97C5_OnCarryClear
49297FBSubC97FB_Loop
493980CSubC980C_Loop
4949871SubC9871_Loop
495988CSubC988C_Loop
49698F4SubC98F4
4979902SubC9902_OnCarryClear
498990BSubC990B_Loop
4999926SubC9926_OnCarryClear
500998BSubC998B
501998DSubC998D_OnCarryClear
50299A0SubC99A0_Loop
50399A7SubC99A7_OnCarryClear
50499E0SubC99E0
5059A00SubC9A00
5069A06SubC9A06_OnNonnegative
5079A10SubC9A10_OnNonnegative
5089A1FSubC9A1F
5099DD7SubC9DD7
5109DE1SubC9DE1_OnNonzero
5119DF3SubC9DF3_Loop
5129E04SubC9E04
5139E06SubC9E06_OnNonnegative
5149E18SubC9E18_Loop
5159E22SubC9E22_OnNonnegative
5169E2DSubC9E2D_Loop
5179E30SubC9E30_Loop
5189E77SubC9E77
5199E87SubC9E87_Loop
5209E8BSubC9E8B_Loop
5219EB3SubC9EB3_Loop
5229EC6SubC9EC6_Loop
5239ECFSubC9ECF
5249F02SubC9F02_Loop
5259F16SubC9F16_Loop
5269F21SubC9F21_Loop
5279F2ASubC9F2A_Loop
5289F36SubC9F36_Loop
5299F3FSubC9F3F_Loop
5309F49SubC9F49
5319F5FSubC9F5F_Loop
5329F83SubC9F83_OnNonnegative
5339FA9SubC9FA9
534A00ASubCA00A
535A02ESubCA02E_Loop
536A030SubCA030_Loop
537A038SubCA038
538A03DSubCA03D_OnCarryClear
539A03FSubCA03F_OnCarryClear
540A054SubCA054_Loop
541A05CSubCA05C_OnCarryClear
542A1D6SubCA1D6
543A1F3SubCA1F3_Loop
544A214SubCA214_Loop
545A224SubCA224_Loop
546A239SubCA239_Loop
547A24ESubCA24E_Loop
548A24FSubCA24F
549A26CSubCA26C_Loop
550A278SubCA278
551A283SubCA283_Loop
552A289SubCA289_Loop
553A290SubCA290_Loop
554A297SubCA297_Loop
555A318SubCA318
556A31ASubCA31A_OnCarryClear
557A331SubCA331_OnCarryClear
558A348SubCA348
559A356SubCA356_Loop
560A375SubCA375_Loop
561A38ASubCA38A_Loop
562A398SubCA398_Loop
563A39ESubCA39E_Loop
564A3A2SubCA3A2_Loop
565A3C5SubCA3C5
566A3D3SubCA3D3_Loop
567A3D8SubCA3D8
568A3E0SubCA3E0_OnNonnegative
569A415SubCA415
570A43ASubCA43A_Loop
571A43FSubCA43F_Loop
572A451SubCA451_Loop
573A534SubCA534
574A545SubCA545_Loop
575A548SubCA548_Loop
576A55ASubCA55A_OnCarryClear
577A56FSubCA56F_OnCarryClear
578A589SubCA589_OnCarryClear
579A5D5SubCA5D5
580A5E7SubCA5E7_OnCarryClear
581A60BSubCA60B_Loop
582A611SubCA611_Loop
583A779SubCA779
584A780SubCA780
585A798SubCA798
586A7A5SubCA7A5_OnNonnegative
587A7B7SubCA7B7
588A7CBSubCA7CB_Loop
589A7CCSubCA7CC_Loop
590A7D2SubCA7D2_Loop
591A7DBSubCA7DB_Loop
592A7DDSubCA7DD_Loop
593A8AASubCA8AA
594A8B4SubCA8B4_Loop
595A8E1SubCA8E1_OnCarryClear
596A904SubCA904_Loop
597A905SubCA905
598A90DSubCA90D_Loop
599A929SubCA929_Loop
600A933SubCA933_Loop
601A934SubCA934
602A946SubCA946
603A94ESubCA94E_Loop
604A980SubCA980_OnNonzero
605A9A4SubCA9A4
606A9C8SubCA9C8
607A9D9SubCA9D9
608A9E8SubCA9E8_OnNonnegative
609AA07SubCAA07_Loop
610AA0DSubCAA0D_OnCarrySet
611AA2ASubCAA2A_Loop
612AA36SubCAA36_Loop
613AA43SubCAA43_Loop
614AA47SubCAA47_OnNonzero
615AA54SubCAA54_Loop
616AA6CSubCAA6C_OnCarryClear
617AA73SubCAA73_Loop
618AA7BSubCAA7B_OnCarryClear
619AA82SubCAA82_Loop
620AA98SubCAA98_Loop
621AACFSubCAACF
622AADESubCAADE_Loop
623AAE4SubCAAE4
624AAF3SubCAAF3
625AC3ESubCAC3E
626AC52SubCAC52_Loop
627AC79SubCAC79_Loop
628ADE2SubCADE2
629AE01SubCAE01_Loop
630AE1BSubCAE1B_Loop
631AE1CSubCAE1C_Loop
632AE24SubCAE24_Loop
633AE37SubCAE37_Loop
634AE3DSubCAE3D_Loop
635AE49SubCAE49
636AE5ESubCAE5E
637AE60SubCAE60_OnCarryClear
638AF04SubCAF04
639AF21SubCAF21
640AF23SubCAF23_OnNonnegative
641AF3DSubCAF3D_Loop
642AFADSubCAFAD
643AFB6SubCAFB6_Loop
644AFC6SubCAFC6_OnCarryClear
645AFD4SubCAFD4_Loop
646AFDBSubCAFDB_Loop
647AFE6SubCAFE6_Loop
648AFEBSubCAFEB_Loop
649AFF2SubCAFF2_Loop
650B031SubCB031
651B03ESubCB03E_OnNonnegative
652B03FSubCB03F
653B047SubCB047_Loop
654B04ESubCB04E_OnNonzero
655B06CSubCB06C_Loop
656B077SubCB077_Loop
657B07ASubCB07A_Loop
658B085SubCB085_Loop
659B097SubCB097
660B0A9SubCB0A9_Loop
661B0ADSubCB0AD
662B0CASubCB0CA_Loop
663B0EBSubCB0EB_Loop
664B0FBSubCB0FB_Loop
665B110SubCB110_Loop
666B125SubCB125_Loop
667B62CSubCB62C
668B63ASubCB63A_Loop
669B63DSubCB63D_Loop
670B643SubCB643_Loop
671B656SubCB656_Loop
672B674SubCB674_Loop
673B682SubCB682_Loop
674B695SubCB695_Loop
675B697SubCB697_Loop
676B6A9SubCB6A9_Loop
677B6ABSubCB6AB_Loop
678B6B3SubCB6B3_Loop
679B6D6SubCB6D6_Loop
680B6D7SubCB6D7
681B6E4SubCB6E4_Loop
682B702SubCB702_Loop
683B703SubCB703
684B710SubCB710_Loop
685B72CSubCB72C_Loop
686B72DSubCB72D
687B76BSubCB76B_Loop
688B78ESubCB78E_Loop
689B7BFSubCB7BF_Loop
690B7C7SubCB7C7_Loop
691B7DESubCB7DE_Loop
692B7E3SubCB7E3_Loop
693B813SubCB813
694B832SubCB832_Loop
695B843SubCB843_Loop
696B856SubCB856_Loop
697B871SubCB871_Loop
698B872SubCB872
699B89DSubCB89D_Loop
700B8A0SubCB8A0_Loop
701B8A3SubCB8A3
702B8B4SubCB8B4_OnCarrySet
703B8B5SubCB8B5_OnOverflowSet
704B8EBSubCB8EB_Loop
705B8F6SubCB8F6_OnNegative
706B8FCSubCB8FC
707B90CSubCB90C_Loop
708B90ESubCB90E_OnCarryClear
709B929SubCB929_Loop
710B92ESubCB92E_Loop
711B944SubCB944_Loop
712BE8DSubCBE8D
713BEA3SubCBEA3
714BEB4SubCBEB4
715BEC5SubCBEC5
716BED8SubCBED8_Loop
717BED9SubCBED9_Loop
718BEE0SubCBEE0_Loop
719BF19SubCBF19
720BF33SubCBF33
721BF43SubCBF43_Loop
722BF47SubCBF47
723BF6ESubCBF6E_OnNonnegative
724BF75SubCBF75_OnZero
725BF96SubCBF96_Loop
726BF97SubCBF97_Loop
727BF98SubCBF98_OnCarrySet
728BF9ESubCBF9E_Loop
729BFC3SubCBFC3
730BFD2SubCBFD2
731BFE1SubCBFE1_Loop
732BFE2SubCBFE2_Loop
733BFF7SubCBFF7
734BFFCSubCBFFC
735C003SubCC003_Loop
736C006SubCC006
737C016SubCC016
738C022SubCC022_Loop
739C023SubCC023_Loop
740C02ESubCC02E
741C037SubCC037
742C039SubCC039_OnNonzero
743C041SubCC041_Loop
744C048SubCC048_Loop
745C054SubCC054_Loop
746C05ESubCC05E
747C066SubCC066_Loop
748C071SubCC071_Loop
749C076SubCC076
750C088SubCC088
751C09ASubCC09A
752C0AASubCC0AA_OnNonzero
753C0B1SubCC0B1
754C0C3SubCC0C3
755C0D5SubCC0D5
756C0E7SubCC0E7
757C0F1SubCC0F1
758C103SubCC103_Loop
759C106SubCC106
760C113SubCC113
761C125SubCC125_Loop
762C126SubCC126
763C12ESubCC12E_OnNonzero
764C133SubCC133
765C140SubCC140
766C14DSubCC14D
767C157SubCC157
768C161SubCC161
769C16DSubCC16D
770C337SubCC337
771C355SubCC355_OnNonnegative
772C364SubCC364_OnCarryClear
773C36ESubCC36E_Loop
774C38DSubCC38D_OnCarryClear
775C3A1SubCC3A1_OnCarryClear
776C3B5SubCC3B5_OnCarryClear
777C3C2SubCC3C2_OnNonnegative
778C4F9SubCC4F9
779C4FBSubCC4FB_OnCarryClear
780C543SubCC543
781C545SubCC545_OnCarryClear
782C557SubCC557_Loop
783C558SubCC558
784C561SubCC561_OnNonnegative
785C56FSubCC56F
786C59ESubCC59E_OnCarryClear
787C5ACSubCC5AC_Loop
788C5CFSubCC5CF
789C5F1SubCC5F1_Loop
790C5F3SubCC5F3
791C5FBSubCC5FB_Loop
792C600SubCC600_Loop
793C619SubCC619_Loop
794C635SubCC635_Loop
795C63CSubCC63C_Loop
796C654SubCC654_Loop
797C656SubCC656_Loop
798C65ASubCC65A_Loop
799C75FSubCC75F
800C76FSubCC76F_OnCarryClear
801C778SubCC778_Loop
802C78ESubCC78E_Loop
803C790SubCC790_Loop
804C794SubCC794_Loop
805C796SubCC796_Loop
806C7CDSubCC7CD_Loop
807C7F8SubCC7F8_Loop
808C825SubCC825_Loop
809C82BSubCC82B
810C845SubCC845_Loop
811C857SubCC857_Loop
812C859SubCC859_Loop
813C85ASubCC85A
814C886SubCC886_Loop
815C893SubCC893_OnZero
816C899SubCC899_Loop
817C89ASubCC89A_Loop
818C8A9SubCC8A9_Loop
819C8AESubCC8AE
820C8C2SubCC8C2_OnCarryClear
821C8C5SubCC8C5_OnNonzero
822C8CDSubCC8CD_Loop
823C8D0SubCC8D0_Loop
824C8E3SubCC8E3_Loop
825C8EFSubCC8EF
826C901SubCC901_OnNonnegative
827C9B2SubCC9B2_OnNonzero
828C9B8SubCC9B8_OnZero
829C9F4SubCC9F4_OnNonnegative
830C9FFSubCC9FF_OnNonnegative
831CA15SubCCA15
832CA26SubCCA26_OnNonzero
833CA32SubCCA32_Loop
834CA38SubCCA38
835CA4BSubCCA4B_OnCarryClear
836CA59SubCCA59
837CA5BSubCCA5B_OnNonzero
838CA5DSubCCA5D_OnNonzero
839CA5FSubCCA5F_OnNonzero
840CB37SubCCB37
841CB48SubCCB48_OnNonzero
842CB4DSubCCB4D_Loop
843CB62SubCCB62_Loop
844CB67SubCCB67
845CB70SubCCB70_Loop
846CB7ESubCCB7E_Loop
847CBBCSubCCBBC