Files
disasm/NROM/Golf (JU)/routinemap.tsv
T
tmerritt 691b2bc23c Xevious (U): Pass 1 disassembly
The first _wip project to get a real disassembly.  4,165 instructions /
8,444 code bytes (25.8%), 24,324 data bytes, 0 unclassified -- every byte
of the 32 KB PRG is now classified as code or data.

The split needed three stages, all recorded in prg.s's header:

  * nesdis.py --undocumented --auto-seed at base $8000 gave 3,272
    instructions / 6,555 bytes.  The undocumented opcodes matter here: the
    trace stops dead at the first one it cannot decode.
  * Four hand-seeded entries ($C08B, $DC1E, $E0D5, $E134).  Each is a
    branch target from decoded code that sat inside an untraced data run,
    so the tracer never reached it.
  * A merged four-session Mesen Code Data Logger capture (kept as
    xevious_mesen.cdl) promoted 1,902 bytes from data to code and
    demoted 22 the trace had called code.

Two tool bugs fell out and are fixed here:

  * nesdis.py emitted the undocumented single-byte NOPs ($1A/$3A/$5A/
    $7A/$DA/$FA) as `nop`, which ca65 assembles as the *official* $EA --
    the rebuild stopped being byte-identical at $DF82.  The check now
    keys on the opcode byte, not just the addressing mode.  All three
    `make regen` pipelines (MUSCLE, Pyramid, Urban Champion) are
    unaffected and still reproduce prg.s byte for byte.

  * cdl_reclass.py left the original data-block header in place when the
    CDL split that block, so the file ended up with two region headers
    describing overlapping spans (20 of them here).  The header is now
    dropped with the block it describes; the promoted projects that use
    the tool are byte-for-byte unchanged.

The project README has the power-on flow analysis.  The most interesting
find is at $FC45: the reset path compares RAM $0100-$0107 against the
ASCII string "Kei Cros", and the copyright text at $FF1E reads
"MAIN: KEI CROSS.  SOUND: UHOHOY OHNOGI."  The OAM is at $0700, not
$0200 -- the NMI handler does LDA #$07 / STA $4014.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Add explicit `make wip` / `make wipclean` targets for the _wip tier

The root Makefile's all / clean / <MAPPER> targets deliberately name only
the promoted mapper folders, so nothing in them reaches into _wip/.  Give
the pre-promotion tier its own opt-in targets instead of the manual
`for d in _wip/*/*/; do make -C "$d"; done` loop:

  make wip          # build + verify every _wip/<MAPPER>/<Project>/
  make wipclean     # clean the build artifacts in that tier

Both the Makefile and the four documents that describe the tier (README,
TODO, WIP, AGENTS) are updated together, so the tree stays consistent.

The same commit records Xevious (U) reaching Pass 2 in those documents:
all 487 labels named, every branch and call symbolic, zero Label_XXXX and
zero raw $XXXX operands left.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Update the _wip/ tier documentation; fix the make wip target and the mirroring bug

The WIP tier's four documents (WIP.md, README.md, TODO.md, AGENTS.md) had
drifted away from the tree.  Every number in them was re-derived from the
ROMs and the folder layout rather than carried forward.

Counts and structure
  - The tier holds 854 projects across 29 mapper folders, not "856 across
    30".  Xevious (U) and Zanac (U) were promoted on 2026-10-20 and their
    _wip/ folders were left behind as residue -- "git mv" moves only the
    tracked files, so the old folder survived with its build artifacts and a
    stale README.  Both are removed now; the promotion procedure documents
    the step so it does not recur.
  - _wip/MAPPER8/ holds a copy of the already-promoted Mermaids of
    Atlantis (U) and is excluded from every count and table.
  - Pass 0 skeletons: 852 (was 855).  Xevious (U) left the tier, so the
    two projects with a real disassembly are Golf (JU) and Volleyball (U).
  - PRG sizes 2 / 150 / 42 / 522 / 127 / 10 / 1; 226 projects with no CHR;
    38 keep the CPU-address linker layout; 37 are mapper 0.
  - Every inventory row was re-checked against its ROM: PRG/CHR size,
    mirroring, all three vectors, and the battery / four-screen / footer
    notes.  854 of 854 rows now match.

Fixes
  - The root Makefile used $(WIP) but never defined it, so "make wip" and
    "make wipclean" expanded to "for m in /*/" -- they walked the
    filesystem root instead of the tier.  "WIP := _wip" is now defined, and
    "make wip" builds and verifies the whole tier: 855 of 855 passed, 0
    failures.
  - make_skeleton.py masked header byte 6 with 0x03, so the battery bit
    (bit 1) leaked into the mirroring value and 56 battery-backed ROMs'
    READMEs claimed "Four-screen" while their own "Four-screen VRAM" row
    said "no".  The mask is now 0x01 and the 56 READMEs are corrected.
  - Golf (JU)'s README still described the pre-flatten copilot/ folder and
    the old PRG-only compare; it now describes the whole-ROM build.
  - Pyramid (U)'s audit comments are canonical again, so Golf (JU) is the
    only project in the tree still on the pre-canonical spelling.

New in WIP.md
  - Byte 7's lower nybble is non-zero on 58 of the ROMs -- 55 carry the
    literal "DiskDude!" watermark, two "DisNi0330", one "byKH+KEN".  Only
    the upper nybble carries mapper bits, so the noise is harmless.
  - The twelve ROMs that set the four-screen bit, split by whether their
    board actually supports four-screen VRAM.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Promote Volleyball (U) from _wip/NROM/ to NROM/

Volleyball (U) reached Pass 3 before promotion, so this is a promotion of a
finished disassembly rather than a Pass 0 skeleton.

The disassembly
  - 11,395 instructions / 23,926 code bytes (73.0 % of the PRG image),
    8,842 data bytes, 0 unclassified.
  - The split needed the game-state dispatch table at $85E1 declared to the
    tracer (--table 85E1:11) -- without it only 66 % of the image traced --
    plus a Mesen Code Data Logger capture taken while a random-input bot
    played the attract demo, which promoted 1,757 bytes from data to code.
  - Pass 2 named all 1,989 labels: 730 read out of the code by hand, 1,221
    internal branch targets derived mechanically.  Zero Label_XXXX, zero raw
    $XXXX call or branch operands, zero SubC residue.
  - Pass 3 named the zero page, the $0500 ball structure and all 37 data
    blocks.  apply_symbols.py --report: 0 pending substitutions, 0
    multi-alias residue.  align_audit_comments.py: no column drift.
  - cdl_check.py cross-checks the finished prg.s against the capture: 0
    CDL-code bytes not covered by an instruction, 0 CDL-data bytes that
    start one.
  - 29 neutral ZpXX zero-page slots remain, each with its reason recorded
    in locals.inc, as the promotion rules allow.

The promotion
  - git mv "_wip/NROM/Volleyball (U)" "NROM/Volleyball (U)".  Mapper 0, so
    it lands in NROM/.  The whole-ROM build was already in place, so there
    was no build surgery; the project builds byte-identically at its new
    home and the old folder is gone (git mv moves the untracked build
    artifacts too, so no residue was left behind).
  - Root README.md: new inventory row 39 and a per-project detail section,
    plus the WIP-tier counts.  The detail sections for Xevious (U) and
    Zanac (U) were numbered one too high against the inventory rows and
    are now aligned; a leftover editing note in the same place is gone.
  - WIP.md: the Volleyball row leaves the inventory, and the tier is now
    853 projects across 29 mapper folders (36 in _wip/NROM/), 852 of them
    Pass 0 skeletons.  Golf (JU) is the only project left in the tier with
    a real disassembly.
  - TODO.md and AGENTS.md: the same counts, and the promoted tier is now
    40 projects (39 under NROM/).

Verified: make wip builds and verifies the whole tier (854 of 854 passed,
0 failures) and make builds the promoted tier (39 of 39 passed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Rename NROM/Pyramid (U) to NROM/Pyramid (U) (Sachen)

The promoted inventory row had read "Pyramid (U) (Sachen)" since the
project was promoted on 2026-10-20, but the folder was named "Pyramid (U)" --
so the row pointed at a folder that did not exist.  The folder now matches
the row, and the project's own README title, its ROM file name
("Pyramid (U) (Sachen).nes") and the parenthetical convention the rest of
the promoted tier already uses (Popeye (JU) (PRG 0/1), Raid on Bungeling
Bay (U) [a2], Pac-Man (Tengen) (U)).

What changed inside the project
  - The Makefile's regen target passes --project "Pyramid (U) (Sachen)", so
    the tracer writes the matching header line.  prg.s and locals.inc were
    updated to that header line and nothing else -- the disassembly is
    byte-identical to before.
  - make regen still reproduces prg.s and locals.inc byte for byte.
  - The project's README's build-verification line now names the new folder.

References updated: the root README.md (inventory prose, the row-33 detail
section, the build-status table, and the notable-observations bullet),
TODO.md (the promoted-projects table and the Pyramid notes) and AGENTS.md
(the recently-promoted list and the unlicensed-titles quirk).

Verified: make builds the promoted tier (39 of 39 passed) and the project
rebuilds byte-identically at its new path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Rebuild Mermaids of Atlantis (U): bank-aware Pass 1, Pass 2/3 names

The promoted project did not build: a Pass 2 rename had been applied
half-way, leaving eight undefined symbols and two jumps that pointed at
the wrong routine, while the root README already claimed the project was
byte identical.  The _wip copy still built, because it held the un-renamed
Pass 1 source.

The disassembly is now derived from the ROM itself, with the Mesen Code
Data Logger as the oracle for the code/data split:

* _tools/banked_dis.py traces every MMC3 bank separately, each with the CPU
  window it is visible at, seeded from a CDL capture so the code a static
  trace cannot reach is disassembled too.  The CDL is the authority: a
  decode the CPU never fetched is dropped, and so is the fall-through
  behind a call whose target never returns (the game's dispatchers have
  their jump table right behind the call).
* One segment per bank (PRG0..PRG7) with its own .org, so the assembler
  knows the CPU address of every label while the linker still writes the
  bytes to the bank's file offset.  A flat segment cannot do both: a call
  would encode the file offset instead of the CPU address.
* Pass 2 names every label - 494 routines, no Label_XXXX and no raw
  $XXXX branch or jump operand left.  Pass 3 applies 13 semantic zero-page
  aliases and writes the routine headers.
* 8,075 bytes of code (12.3% of the 64 KB PRG), up from 200 bytes.

The banking turned out to be unusual and is documented: the fixed bank is
the fourth 8 KB bank (file $6000-$7FFF), not the last one, and the image
carries the reset stub and the vector table twice.  The live NMI vector
is $808F - the frame handler - while the copy at the end of the image
names $8189, which is a BRK in the first half.  The game's text table
lives at CPU $F1D6, which is the fixed window, and that is what settles
the question.

Also: the leftover _wip/MAPPER8 folder is removed, as it is for every
other promotion.

The project builds byte identical:

    Byte-identical ROM verified.

Add CHANGELOG.md: the pass history of every project

A project goes through four milestones - Pass 1 (the code/data split),
Pass 2 (the labels replaced by names), Pass 3 (the semantic naming) and
Promotion (the move into the top-level mapper folder) - and the history
of those milestones was scattered over the commit log, the project
READMEs and the root README.

CHANGELOG.md gathers it: one section per project with a row for each
milestone, the date, and a sentence saying what the milestone produced.
The numbers are the ones the project README and the root README already
carry - instruction count, code coverage, named labels, semantic
zero-page aliases, named data tables - so a reader can see at a glance
which projects are done and which are not.  Golf (JU), the only project
still in _wip/ with a real disassembly, is listed with its open
milestones, and the other 852 _wip/ projects are covered as a tier.

The requirement is now part of the workflow contract: PROMPTS.md gains a
"Pass 3: Changelog entry" section and a ninth checklist item, and
AGENTS.md points at the file.  A milestone and its changelog row go in
the same commit, so the changelog and the source never disagree.

Balloon Fight (JU): repair the audit trail and complete the routine headers

The per-instruction audit trail was stale by two bytes from
ResetInitializationData ($C085) onward.  5,944 of the 6,007 comments named
the wrong CPU address and PRG offset, because the three-byte .byte "HAL"
signature at $C082-$C084 had been counted as one byte when the trail was
first generated - the routine headers and the linker labels were right all
along, so the source and its own headers disagreed with each other.  The
trail was rebuilt from the ca65 -l listing with
_tools/repair_audit_comments.py, and every rewritten comment was re-checked
against prg.bin.  The comments were also moved into the canonical column-35
field: they had sat two spaces after the mnemonic, with no column discipline
at all, unlike every other promoted project.

All 63 routine headers now carry a ; Clobbers: block, so the headers carry
the full template AGENTS.md describes.  The blocks are derived, not written by
hand.  The new _tools/derive_clobbers.py takes the opcode from the audit
comment's byte list, so the addressing mode is exact and a data directive is
never mistaken for an instruction; it resolves the operand through
locals.inc and symbols.inc to name what is written; it follows the real
control flow, so a jsr to another named entry is a call (the callee's
clobbers count) while a branch or a fall-through is not; and it models
register preservation, so NmiHandler reports *no register* - it saves and
restores A, X and Y around the frame - and FlushPpuCommandPreserved reports
only A, because X and Y come back unchanged.

Two tools changed.  derive_clobbers.py is new.  align_audit_comments.py had
an off-by-one: it tested the indented code length against 31 instead of
against 35, so code texts of 28-31 characters were never padded into the
column.

The change is comments only.  The code text of all 8,538 lines is unchanged,
make still prints "Byte-identical ROM verified.", the 6,007 audit comments
still re-check against prg.bin, all 63 routine headers agree with the
instructions they describe, and every label agrees with reconstructed.lbl.
ReflectObjectYVelocity and UpdateSpecialObjectSystem moved out of locals.inc
and became labels in prg.s at their real addresses.

CHANGELOG.md becomes the repository's running log: a Pending list of the
changes to be put in the next commit, a History of the commits already made,
and the per-project milestone index at the end.  The next commit's message is
written from the Pending entries, so the two cannot drift apart.  PROMPTS.md
and AGENTS.md describe the new shape.  WIP.md drops the _wip/MAPPER8/ note:
the folder held a copy of Mermaids of Atlantis (U) that had already been
promoted.

World Class Track Meet (U): Pass 1, the code/data split

Pass 1 is done.  The split is 8,400 instructions / 18,028 code bytes (55.0 %)
of the 32 KB PRG, with 884 routine entries, 55 data blocks and 102 zero-page
aliases.  The PRG is CNROM (mapper 3) and maps whole at $8000-$FFFF, so the
linker moved the PRG segment from a .nes file offset to $8000 and the build
still compares byte identical.

Four dispatch tables had to be seeded by hand.  The event table at $F796 (5
entries) is read at $F780 and jumped to through `jmp ($001F)`.  The three
push-pointer tables - $BFC4 (16 entries), $BFE4 (2) and $E5F2 (7) - push a
handler address and `rts` into it, and the 6502's `rts` adds one to the
address it pops, so each table stores the entry address minus one; the seeds
are the table values plus one.  The tracer runs with --undocumented: the code
uses undocumented NMOS opcodes as ordinary code (ANC $37 at $BFF8, and the
RRA/RLA/SLO and NOP forms elsewhere).  Seeding the tables takes the coverage
from 27.8 % to 55.0 %.

$C0BE-$C0C5 is forced back to data: the IRQ vector $C0C0 points into the
middle of the `jmp $C047` at $C0BE, and the game never executes CLI, so the
vector is dead.  `make pass1` regenerates prg.s and locals.inc from prg.bin
and reproduces the committed prg.s byte for byte.

The project README records the split, the four dispatch tables, the dead IRQ
vector, the wrong CHR size field in the header, and what is still data.  The
milestone index in CHANGELOG.md gains the project; WIP.md, README.md and
AGENTS.md follow the tier counts and the layout.

nesdis.py gains a --mapping-note option, so the header's "PRG mapped at" line
can describe a board that is not NROM - CNROM's whole 32 KB at $8000-$FFFF is
not "mirrored to the upper half".

Replaces runs of $00 and $FF with .res <run>, <byte>

Golf (JU) and World Class Track Meet (U): Pass 2/3 complete, promoted from _wip/

- World Class Track Meet (U) - Pass 2 complete: all 884 Label_<addr>
  definitions replaced (651 semantic routine names + 233 Sub_<addr>), all 731
  raw $XXXX jsr/jmp call operands resolved to symbolic labels, all branch
  targets given role-based names; routinemap.tsv added; make stays
  byte-identical.
- World Class Track Meet (U) - Pass 3 complete: 24 semantic zero-page
  aliases applied via apply_symbols.py (0 residue), 78 neutral ZpXX slots
  documented with reasons in locals.inc, all hardware-register operands use
  symbols.inc names, project README rewritten with Pass 2/Pass 3 sections and
  data-table inventory; promoted out of _wip/CNROM/.
- World Class Track Meet (U) - project README documents the five event-table
  entries at $F796 and marks the olympics mode as not yet proven.
- Golf (JU) - audit comments converted from pre-canonical (; C000: A9 00)
  to the canonical ; CPU:$C000 PRG:0000  A9 00 form at column 35; 4,156
  comments re-aligned, comment/whitespace only, whole-ROM build stays
  byte-identical.
- Golf (JU) - 339 internal branch-target Label_ labels given role-based names
  via _tools/derive_branch_names.py; 0 raw $XXXX branch/jump operands remain.
- Golf (JU) - 275 zero-page operands substituted with locals.inc aliases via
  apply_symbols.py; 0 residue; promoted out of _wip/NROM/.
- Xevious (U) - runs of $FF padding replaced with .res <count>, $FF in prg.s;
  whole-ROM build stays byte-identical.
- Both projects promoted via git mv; leftover _wip/ folders removed; root
  README.md inventory rows added; WIP.md rows removed.

World Class Track Meet (U): apply zero-page symbol substitutions

Run apply_symbols.py to substitute ZpXX zero-page operands with
semantic locals.inc aliases (SlotState, GameMode, etc.) at proven
sites; 0 residue, whole-ROM build stays byte-identical.

Xevious (U): re-split Pass 1 from the Mesen CDL and decode the data tables

- Xevious (U) - Pass 1 re-split from the Mesen CDL (xevious_mesen.cdl) with
  _tools/cdl_reclass.py: 1,158 bytes data->code, 48 code->data, 42 labels
  emitted and 3 branch targets labelled; code 11,321->12,455 bytes
  (34.5%->38.0%), instructions 5,513->6,002. The 45 recovered entry points
  are named Sub_XXXX, so no Label_XXXX remains; six CDL-silent raw call
  operands are documented as residue.
- Xevious (U) - the 4,448-byte block at $A74B-$B8AA is split into six proven
  tables: VramWritePtrTable (15 pointers), VramWriteData, DataStreamPtrTable
  (16), ObjTilePtrTable (99), ObjTileData and DataStreamData. The $D833
  pointer table is corrected to base $D833 (4 entries; the old ObjCodePtrTable
  at $D834 was one byte late). $F957-$FAF5 is split into ObjSpeedTable,
  ObjSpeedTable2, SpriteLayoutPtrTable (19) and SpriteLayoutData;
  $FEE6-$FF1C into PaletteData and OamAttrTable. $F5D8 is decoded as
  TextTileData (font tile indices: PLAYER, GAME OVER, READY, SOLVALOU, LEFT,
  PAUSE); $F53C becomes AttrAddrTable, $F89E HandlerPtrTable and $EF3B
  SpriteLayoutData2. Project README rewritten with the corrected stats, a
  32-entry table inventory and the Pass 1 residue.
- _tools/cdl_reclass.py - preserve the data label(s) between a data-block
  header and its first .byte row when the block stays data; the $DF78 split
  dropped Data_DF78 and the rebuild failed with an undefined symbol.
- _tools/resolve_raw_branches.py - handle negative relative offsets
  (beq *-$0B); the pattern only matched *+$NN and *$NN.

Docs: refresh the tier counts to 41 promoted / 851 _wip, add the WCTM row

- Docs - tier counts refreshed to the post-promotion state across AGENTS.md,
  root README.md, WIP.md, TODO.md and CHANGELOG.md: 41 promoted projects
  (38 under NROM/, plus CNROM/World Class Track Meet (U), UNROM/Zanac (U) and
  MAPPER8/Mermaids of Atlantis (U)) and 851 _wip/ projects, every one of them
  a Pass 0 skeleton. The stale "39/40 promoted", "853 _wip", "Golf (JU) is
  still in _wip/" and "Golf is the last pre-canonical project" statements are
  corrected.
- Root README.md - the promoted inventory gained the missing World Class Track
  Meet (U) row (row 41, mapper 3, 32 KB PRG / 32 KB CHR), and the "All 38 are
  mapper 0 / 16 KB PRG" sentence is replaced with the actual split (36 of the
  41 rows are mapper 0 / 16 KB; Xevious and Volleyball are 32 KB, World Class
  Track Meet is mapper 3, Zanac mapper 2 and Mermaids mapper 8).
2026-10-21 11:36:32 -04:00

21 KiB

1C000Reset
2C007WaitForFirstVblank
3C041ClearStartupRamLoop
4C05DCopyStartupTableLoop
5C087ReadPpuBlocks
6C08DReadPpuBlockBytes
7C08FReadPpuBlockByteLoop
8C09BDiscardPpuBlockByteLoop
9C0A6NmiHandler
10C0B8NmiEpilogue
11C0C4IrqLoop
12C0C7InitializeRuntimeState
13C0E8SubCC0E8
14C136SubCC136
15C305SubCC305
16C380SubCC380
17C383SubCC383
18C3B1SubCC3B1
19C41BSubCC41B
20C484SubCC484
21C4CBSubCC4CB
22C57BStrobeAndReadController
23C586SubCC586
24C589SubCC589
25C593SubCC593
26C599SubCC599
27C5A0GameplayInputNmiCallback
28C5B9ScanDirectionalSerialBits
29C5C3StoreDirectionalInputIndex
30C5CDHandleClubSelectionInput
31C5EDWrapClubSelectionIndex
32C5F5RefreshClubSelectionDisplay
33C600ResetDirectionalRepeatLatch
34C604BuildGameplayOam
35C62DHandleAimAdjustmentInput
36C640InitializeAimOamLoop
37C642UpdateAimOamEntryLoop
38C650PositionAimOamEntries
39C67EHandleAimDirectionChange
40C686InitializeAimDirection
41C69FDecrementAimAngle
42C6A3StoreWrappedAimAngle
43C6C8GameplayDisplayNmiCallback
44C6D4ShowAnimationMarker
45C6D8SelectAnimationMarkerTile
46C6DAWriteAnimationMarkerOam
47C70CSelectSecondaryMarkerTile
48C70EWriteSecondaryMarkerOam
49C71BFinishGameplayNmi
50C721SubCC721
51C752SubCC752
52C84DSubCC84D
53C881WaitForFramePreservingY
54C888InstallNmiCallback
55C894SpriteOffsetForController
56C89ASubCC89A
57C89DSetPpuScrollAndMask
58C8B5RestorePpuCtrlShadow
59C8BBMultiplyABy32
60C8BCMultiplyBy32
61C8C1SetPpuAddress
62C8C8ClearNametableAndOam
63C8E8ClearOamShadowLoop
64C8F3WaitForFrame
65C8F5SubCC8F5
66C907SubCC907
67C909WaitFrameGroups
68C916SubCC916
69C946SubCC946
70CA30SubCCA30
71CA53SubCCA53
72CA55SubCCA55
73CA70SubCCA70
74CA8ESubCCA8E
75CA9DSubCCA9D
76CAA8RefreshSequenceSpriteLayout
77CB0FSubCCB0F
78CB60SubCCB60
79CB63SubCCB63
80CB97SubCCB97
81CBCBSubCCBCB
82CBE6SubCCBE6
83CBEAParseSpriteLayout
84CC15SpriteLayoutGroupMap
85CC24SpriteLayoutPointerLo
86CC31SpriteLayoutPointerHi
87CC3EAltSpriteLayoutPointerLo
88CC44AltSpriteLayoutPointerHi
89CC4ASpriteLayoutXOffsets
90CC5FSpriteLayoutYOffsets
91CC74SpriteLayoutLists
92CE64SubCCE64
93CF87DeriveAimAngleNibble
94CF8EInitializeSequenceBounds
95CF9DWaitForSequenceStart
96CFAAGameplaySequenceNmiCallback
97CFC0UpdateSequenceInput
98CFC3GameplaySequenceNmiContinue1
99CFEAPollSequenceActionButton
100D021AdvanceSequenceToNextParity
101D025InitializeSequenceReturnPhase
102D039AdvanceSequencePosition
103D03EGameplaySequenceNmiContinue2
104D08AGameplaySequenceNmiContinue3
105D0A6JumpToSelectSequenceFrame
106D0A9SelectSequenceFrame
107D0B5FindForwardSequenceFrame
108D0BFApplyForwardSequenceFrame
109D0CCSelectTerminalSequenceFrame
110D0CEFindTerminalSequenceFrame
111D0D8ApplyTerminalSequenceFrame
112D0E0SelectReturnSequenceFrame
113D0ECFindReturnSequenceFrame
114D0F8ClampReturnSequenceFrame
115D10AFindFinalSequenceFrame
116D121FinishSequenceNmi
117D124ForwardSequenceThresholds
118D12ATerminalSequenceThresholds
119D12DReturnSequenceThresholds
120D135FinalSequenceThresholds
121D138ForwardSequenceFrameLimits
122D13ESubCD13E
123D21DSubCD21D
124D2C2SubCD2C2
125D2EESubCD2EE
126D2F8SubCD2F8
127D3B7SubCD3B7
128D422SubCD422
129D425SubCD425
130D453SubCD453
131D48BSubCD48B
132D4BBSubCD4BB
133D4F1SubCD4F1
134D4F2SubCD4F2
135D4F7SubCD4F7
136D505SubCD505
137D515SubCD515
138D65ASubCD65A
139D65DSubCD65D
140D663SubCD663
141D6F4BitMaskTable
142D6FCSubCD6FC
143D7F5SubCD7F5
144D8EDSubCD8ED
145D906SubCD906
146D988D988ScoreAdjustTable
147D9B1SubCD9B1
148D9B9SubCD9B9
149D9C7SubCD9C7
150D9D9SubCD9D9
151D9FFSubCD9FF
152DA1CSubCDA1C
153DA1DSubCDA1D
154DA1ESubCDA1E
155DA23InitializeTitleAndGame
156DA2FSubCDA2F
157DA4CSubCDA4C
158DAA2TitleAndAttractNmi
159DADAStoreMenuSelection
160DADCLatchMenuInput
161DAE6ReleaseMenuInputLatch
162DB0DMenuCursorYPositions
163DB10SubCDB10
164DD78DecodeCoursePackage
165DE1ASubCDE1A
166DE35SubCDE35
167DE5EParseHoleObjectPackage
168DF03ParseHoleObjectList
169DF9BSubCDF9B
170DFB8SubCDFB8
171E07CSubCE07C
172E0BESubCE0BE
173E0CDSubCE0CD
174E1A1SubCE1A1
175E1ABSubCE1AB
176E1B8GameplayPpuPalette
177E282ObjectSpanStartZero
178E283ObjectSpanEnds
179E2A2ObjectTileTable
180E2EBObjectXOffsetTable
181E334ObjectYOffsetTable
182E37DFixedObjectSpanBounds
183E384FixedObjectXOffsets
184E3A2FixedObjectTileTable
185E3C0FixedObjectAttributeTable
186E3FCSubCE3FC
187E48BSubCE48B
188E48DSubCE48D
189E52FSubCE52F
190E559SubCE559
191E585SubCE585
192E6B0SubCE6B0
193E6C3CourseLayoutPointerLo
194E6D5CourseLayoutPointerHi
195F906SubCF906
196F931SubCF931
197F953SubCF953
198F983SubCF983
199F99ESubCF99E
200FA35NormalizeCourseGrid
201FA8CSubCFA8C
202FA90SubCFA90
203FB25SubCFB25
204FBA4StoreSpecialGridCoordinate
205FBAENormalizeStatePair
206FBB2NormalizeStateEntry
207FC24SubCFC24
208FC27SubCFC27
209FC66CompareObjectState
210FC6EGetGridObjectIndex
211FC78SubCFC78
212FC98UploadGeneratedCourseGrid
213FCE6SubCFCE6
214FCF1SubCFCF1
215FD0APpuTableFd0a
216FD12SubCFD12
217FD67SubCFD67
218FE3ESubCFE3E
219FE50SubCFE50
220FE61SubCFE61
221FE72SubCFE72
222FE97SubCFE97
223FEB2SubCFEB2
224FEB5SubCFEB5
225FEBFSubCFEBF
226FF2BSubCFF2B
227FF85FF85PpuValueTable
228C000Reset
229C007WaitForFirstVblank
230C041ClearStartupRamLoop
231C05DCopyStartupTableLoop
232C087ReadPpuBlocks
233C08DReadPpuBlockBytes
234C08FReadPpuBlockByteLoop
235C09BDiscardPpuBlockByteLoop
236C0A6NmiHandler
237C0B8NmiEpilogue
238C0C4IrqLoop
239C0C7InitializeRuntimeState
240C0E8SubCC0E8
241C136SubCC136
242C305SubCC305
243C380SubCC380
244C383SubCC383
245C3B1SubCC3B1
246C41BSubCC41B
247C484SubCC484
248C4CBSubCC4CB
249C57BStrobeAndReadController
250C586SubCC586
251C589SubCC589
252C593SubCC593
253C599SubCC599
254C5A0GameplayInputNmiCallback
255C5B9ScanDirectionalSerialBits
256C5C3StoreDirectionalInputIndex
257C5CDHandleClubSelectionInput
258C5EDWrapClubSelectionIndex
259C5F5RefreshClubSelectionDisplay
260C600ResetDirectionalRepeatLatch
261C604BuildGameplayOam
262C62DHandleAimAdjustmentInput
263C640InitializeAimOamLoop
264C642UpdateAimOamEntryLoop
265C650PositionAimOamEntries
266C67EHandleAimDirectionChange
267C686InitializeAimDirection
268C69FDecrementAimAngle
269C6A3StoreWrappedAimAngle
270C6C8GameplayDisplayNmiCallback
271C6D4ShowAnimationMarker
272C6D8SelectAnimationMarkerTile
273C6DAWriteAnimationMarkerOam
274C70CSelectSecondaryMarkerTile
275C70EWriteSecondaryMarkerOam
276C71BFinishGameplayNmi
277C721SubCC721
278C752SubCC752
279C84DSubCC84D
280C881WaitForFramePreservingY
281C888InstallNmiCallback
282C894SpriteOffsetForController
283C89ASubCC89A
284C89DSetPpuScrollAndMask
285C8B5RestorePpuCtrlShadow
286C8BBMultiplyABy32
287C8BCMultiplyBy32
288C8C1SetPpuAddress
289C8C8ClearNametableAndOam
290C8E8ClearOamShadowLoop
291C8F3WaitForFrame
292C8F5SubCC8F5
293C907SubCC907
294C909WaitFrameGroups
295C916SubCC916
296C946SubCC946
297CA30SubCCA30
298CA53SubCCA53
299CA55SubCCA55
300CA70SubCCA70
301CA8ESubCCA8E
302CA9DSubCCA9D
303CAA8RefreshSequenceSpriteLayout
304CB0FSubCCB0F
305CB60SubCCB60
306CB63SubCCB63
307CB97SubCCB97
308CBCBSubCCBCB
309CBE6SubCCBE6
310CBEAParseSpriteLayout
311CC15SpriteLayoutGroupMap
312CC24SpriteLayoutPointerLo
313CC31SpriteLayoutPointerHi
314CC3EAltSpriteLayoutPointerLo
315CC44AltSpriteLayoutPointerHi
316CC4ASpriteLayoutXOffsets
317CC5FSpriteLayoutYOffsets
318CC74SpriteLayoutLists
319CE64SubCCE64
320CF87DeriveAimAngleNibble
321CF8EInitializeSequenceBounds
322CF9DWaitForSequenceStart
323CFAAGameplaySequenceNmiCallback
324CFC0UpdateSequenceInput
325CFC3GameplaySequenceNmiContinue1
326CFEAPollSequenceActionButton
327D021AdvanceSequenceToNextParity
328D025InitializeSequenceReturnPhase
329D039AdvanceSequencePosition
330D03EGameplaySequenceNmiContinue2
331D08AGameplaySequenceNmiContinue3
332D0A6JumpToSelectSequenceFrame
333D0A9SelectSequenceFrame
334D0B5FindForwardSequenceFrame
335D0BFApplyForwardSequenceFrame
336D0CCSelectTerminalSequenceFrame
337D0CEFindTerminalSequenceFrame
338D0D8ApplyTerminalSequenceFrame
339D0E0SelectReturnSequenceFrame
340D0ECFindReturnSequenceFrame
341D0F8ClampReturnSequenceFrame
342D10AFindFinalSequenceFrame
343D121FinishSequenceNmi
344D124ForwardSequenceThresholds
345D12ATerminalSequenceThresholds
346D12DReturnSequenceThresholds
347D135FinalSequenceThresholds
348D138ForwardSequenceFrameLimits
349D13ESubCD13E
350D21DSubCD21D
351D2C2SubCD2C2
352D2EESubCD2EE
353D2F8SubCD2F8
354D3B7SubCD3B7
355D422SubCD422
356D425SubCD425
357D453SubCD453
358D48BSubCD48B
359D4BBSubCD4BB
360D4F1SubCD4F1
361D4F2SubCD4F2
362D4F7SubCD4F7
363D505SubCD505
364D515SubCD515
365D65ASubCD65A
366D65DSubCD65D
367D663SubCD663
368D6F4BitMaskTable
369D6FCSubCD6FC
370D7F5SubCD7F5
371D8EDSubCD8ED
372D906SubCD906
373D988D988ScoreAdjustTable
374D9B1SubCD9B1
375D9B9SubCD9B9
376D9C7SubCD9C7
377D9D9SubCD9D9
378D9FFSubCD9FF
379DA1CSubCDA1C
380DA1DSubCDA1D
381DA1ESubCDA1E
382DA23InitializeTitleAndGame
383DA2FSubCDA2F
384DA4CSubCDA4C
385DAA2TitleAndAttractNmi
386DADAStoreMenuSelection
387DADCLatchMenuInput
388DAE6ReleaseMenuInputLatch
389DB0DMenuCursorYPositions
390DB10SubCDB10
391DD78DecodeCoursePackage
392DE1ASubCDE1A
393DE35SubCDE35
394DE5EParseHoleObjectPackage
395DF03ParseHoleObjectList
396DF9BSubCDF9B
397DFB8SubCDFB8
398E07CSubCE07C
399E0BESubCE0BE
400E0CDSubCE0CD
401E1A1SubCE1A1
402E1ABSubCE1AB
403E1B8GameplayPpuPalette
404E282ObjectSpanStartZero
405E283ObjectSpanEnds
406E2A2ObjectTileTable
407E2EBObjectXOffsetTable
408E334ObjectYOffsetTable
409E37DFixedObjectSpanBounds
410E384FixedObjectXOffsets
411E3A2FixedObjectTileTable
412E3C0FixedObjectAttributeTable
413E3FCSubCE3FC
414E48BSubCE48B
415E48DSubCE48D
416E52FSubCE52F
417E559SubCE559
418E585SubCE585
419E6B0SubCE6B0
420E6C3CourseLayoutPointerLo
421E6D5CourseLayoutPointerHi
422F906SubCF906
423F931SubCF931
424F953SubCF953
425F983SubCF983
426F99ESubCF99E
427FA35NormalizeCourseGrid
428FA8CSubCFA8C
429FA90SubCFA90
430FB25SubCFB25
431FBA4StoreSpecialGridCoordinate
432FBAENormalizeStatePair
433FBB2NormalizeStateEntry
434FC24SubCFC24
435FC27SubCFC27
436FC66CompareObjectState
437FC6EGetGridObjectIndex
438FC78SubCFC78
439FC98UploadGeneratedCourseGrid
440FCE6SubCFCE6
441FCF1SubCFCF1
442FD0APpuTableFd0a
443FD12SubCFD12
444FD67SubCFD67
445FE3ESubCFE3E
446FE50SubCFE50
447FE61SubCFE61
448FE72SubCFE72
449FE97SubCFE97
450FEB2SubCFEB2
451FEB5SubCFEB5
452FEBFSubCFEBF
453FF2BSubCFF2B
454FF85FF85PpuValueTable
455# ---- derived internal branch-target names ----
456C000Reset
457C007WaitForFirstVblank
458C041ClearStartupRamLoop
459C04FClearStartupRamLoop_Loop
460C055ClearStartupRamLoop_Loop2
461C05DCopyStartupTableLoop
462C087ReadPpuBlocks
463C08DReadPpuBlockBytes
464C08FReadPpuBlockByteLoop
465C09BDiscardPpuBlockByteLoop
466C0A6NmiHandler
467C0B8NmiEpilogue
468C0C4IrqLoop
469C0C7InitializeRuntimeState
470C0E8SubCC0E8
471C136SubCC136
472C14ASubCC136_Loop
473C160SubCC136_Loop2
474C17CSubCC136_Loop3
475C17ESubCC136_Loop4
476C182SubCC136_Loop5
477C184SubCC136_Loop6
478C192SubCC136_Loop7
479C199SubCC136_Loop8
480C1BCSubCC136_Loop9
481C1CASubCC136_Loop10
482C1CDSubCC136_Loop11
483C1D1SubCC136_Loop12
484C1EFSubCC136_Loop13
485C238SubCC136_Loop14
486C240SubCC136_Loop15
487C26CSubCC136_Loop16
488C27ASubCC136_Loop17
489C286SubCC136_Loop18
490C2BASubCC136_Loop19
491C2BFSubCC136_Loop20
492C2C2SubCC136_Loop21
493C2D9SubCC136_Loop22
494C305SubCC305
495C336SubCC305_Loop
496C33ESubCC305_Loop2
497C369SubCC305_Loop3
498C380SubCC380
499C383SubCC383
500C39FSubCC383_Loop
501C3AESubCC383_Loop2
502C3B1SubCC3B1
503C3BFSubCC3B1_Loop
504C3FFSubCC3B1_OnNonzero
505C41BSubCC41B
506C44ESubCC41B_Loop
507C481SubCC41B_Loop2
508C484SubCC484
509C49CSubCC484_Loop
510C4A7SubCC484_Loop2
511C4B8SubCC484_Loop3
512C4BASubCC484_Loop4
513C4CBSubCC4CB
514C4DCSubCC4CB_Loop
515C4EBSubCC4CB_Loop2
516C4F7SubCC4CB_Loop3
517C501SubCC4CB_Loop4
518C504SubCC4CB_Loop5
519C517SubCC4CB_Loop6
520C519SubCC4CB_Loop7
521C51FSubCC4CB_Loop8
522C527SubCC4CB_OnNonnegative
523C542SubCC4CB_Loop9
524C563SubCC4CB_Loop10
525C575SubCC4CB_Loop11
526C57BStrobeAndReadController
527C586SubCC586
528C589SubCC589
529C593SubCC593
530C599SubCC599
531C5A0GameplayInputNmiCallback
532C5B9ScanDirectionalSerialBits
533C5C3StoreDirectionalInputIndex
534C5CDHandleClubSelectionInput
535C5EDWrapClubSelectionIndex
536C5F5RefreshClubSelectionDisplay
537C600ResetDirectionalRepeatLatch
538C604BuildGameplayOam
539C62DHandleAimAdjustmentInput
540C640InitializeAimOamLoop
541C642UpdateAimOamEntryLoop
542C650PositionAimOamEntries
543C67EHandleAimDirectionChange
544C686InitializeAimDirection
545C69FDecrementAimAngle
546C6A3StoreWrappedAimAngle
547C6C8GameplayDisplayNmiCallback
548C6D4ShowAnimationMarker
549C6D8SelectAnimationMarkerTile
550C6DAWriteAnimationMarkerOam
551C70CSelectSecondaryMarkerTile
552C70EWriteSecondaryMarkerOam
553C71BFinishGameplayNmi
554C721SubCC721
555C72FSubCC721_Loop
556C73FSubCC721_Loop2
557C751SubCC721_Loop3
558C752SubCC752
559C84DSubCC84D
560C872SubCC84D_OnCarryClear
561C881WaitForFramePreservingY
562C888InstallNmiCallback
563C894SpriteOffsetForController
564C89ASubCC89A
565C89DSetPpuScrollAndMask
566C8B5RestorePpuCtrlShadow
567C8BBMultiplyABy32
568C8BCMultiplyBy32
569C8C1SetPpuAddress
570C8C8ClearNametableAndOam
571C8D9ClearNametableAndOam_OnNonzero
572C8E8ClearOamShadowLoop
573C8ECClearOamShadowLoop_OnNonzero
574C8F3WaitForFrame
575C8F5SubCC8F5
576C8FBSubCC8F5_OnZero
577C906SubCC8F5_Loop
578C907SubCC907
579C909WaitFrameGroups
580C916SubCC916
581C931SubCC916_Loop
582C935SubCC916_Loop2
583C945SubCC916_Loop3
584C946SubCC946
585C96BSubCC946_Loop
586C971SubCC946_Loop2
587C998SubCC946_Loop3
588C9ABSubCC946_Loop4
589C9BASubCC946_Loop5
590C9E6SubCC946_Loop6
591CA06SubCC946_Loop7
592CA0FSubCC946_Loop8
593CA26SubCC946_Loop9
594CA30SubCCA30
595CA53SubCCA53
596CA55SubCCA55
597CA60SubCCA55_Loop
598CA70SubCCA70
599CA78SubCCA70_Loop
600CA7BSubCCA70_Loop2
601CA85SubCCA70_Loop3
602CA88SubCCA70_Loop4
603CA8ESubCCA8E
604CA9CSubCCA8E_Loop
605CA9DSubCCA9D
606CAA1SubCCA9D_OnNonnegative
607CAA8RefreshSequenceSpriteLayout
608CAE8RefreshSequenceSpriteLayout_Loop
609CAEBRefreshSequenceSpriteLayout_Loop2
610CAF9RefreshSequenceSpriteLayout_OnCarryClear
611CB0CRefreshSequenceSpriteLayout_Loop3
612CB0FSubCCB0F
613CB2CSubCCB0F_Loop
614CB3ASubCCB0F_OnCarryClear
615CB60SubCCB60
616CB63SubCCB63
617CB6ESubCCB63_OnCarryClear
618CB97SubCCB97
619CBA2SubCCB97_OnCarryClear
620CBCBSubCCBCB
621CBDESubCCBCB_Loop
622CBE6SubCCBE6
623CBEAParseSpriteLayout
624CC0FParseSpriteLayout_Loop
625CC15SpriteLayoutGroupMap
626CC24SpriteLayoutPointerLo
627CC31SpriteLayoutPointerHi
628CC3EAltSpriteLayoutPointerLo
629CC44AltSpriteLayoutPointerHi
630CC4ASpriteLayoutXOffsets
631CC5FSpriteLayoutYOffsets
632CC74SpriteLayoutLists
633CE64SubCCE64
634CEBBSubCCE64_Loop
635CEF3SubCCE64_Loop2
636CF03SubCCE64_Loop3
637CF2FSubCCE64_Loop4
638CF48SubCCE64_Loop5
639CF51SubCCE64_OnZero
640CF87DeriveAimAngleNibble
641CF8EInitializeSequenceBounds
642CF9DWaitForSequenceStart
643CFAAGameplaySequenceNmiCallback
644CFC0UpdateSequenceInput
645CFC3GameplaySequenceNmiContinue1
646CFEAPollSequenceActionButton
647D021AdvanceSequenceToNextParity
648D025InitializeSequenceReturnPhase
649D039AdvanceSequencePosition
650D03EGameplaySequenceNmiContinue2
651D048GameplaySequenceNmiContinue2_Loop
652D064GameplaySequenceNmiContinue2_Loop2
653D085GameplaySequenceNmiContinue2_Loop3
654D08AGameplaySequenceNmiContinue3
655D098GameplaySequenceNmiContinue3_Loop
656D0A6JumpToSelectSequenceFrame
657D0A9SelectSequenceFrame
658D0B5FindForwardSequenceFrame
659D0BFApplyForwardSequenceFrame
660D0CCSelectTerminalSequenceFrame
661D0CEFindTerminalSequenceFrame
662D0D8ApplyTerminalSequenceFrame
663D0E0SelectReturnSequenceFrame
664D0ECFindReturnSequenceFrame
665D0F8ClampReturnSequenceFrame
666D102ClampReturnSequenceFrame_Loop
667D10AFindFinalSequenceFrame
668D10CFindFinalSequenceFrame_OnCarryClear
669D118FindFinalSequenceFrame_Loop
670D121FinishSequenceNmi
671D124ForwardSequenceThresholds
672D12ATerminalSequenceThresholds
673D12DReturnSequenceThresholds
674D135FinalSequenceThresholds
675D138ForwardSequenceFrameLimits
676D13ESubCD13E
677D14DSubCD13E_Loop
678D17CSubCD13E_Loop2
679D190SubCD13E_Loop3
680D1A1SubCD13E_Loop4
681D1A5SubCD13E_OnCarryClear
682D1B0SubCD13E_Loop5
683D1B3SubCD13E_Loop6
684D1BASubCD13E_Loop7
685D1BFSubCD13E_Loop8
686D1CASubCD13E_Loop9
687D1F1SubCD13E_Loop10
688D1FASubCD13E_Loop11
689D201SubCD13E_OnNonzero
690D214SubCD13E_Loop12
691D217SubCD13E_Loop13
692D21DSubCD21D
693D239SubCD21D_Loop
694D24CSubCD21D_Loop2
695D25FSubCD21D_Loop3
696D275SubCD21D_OnNonzero
697D2AFSubCD21D_Loop4
698D2C2SubCD2C2
699D2C8SubCD2C2_OnNonzero
700D2E0SubCD2C2_Loop
701D2EESubCD2EE
702D2F8SubCD2F8
703D301SubCD2F8_Loop
704D3B7SubCD3B7
705D3C9SubCD3B7_Loop
706D419SubCD3B7_Loop2
707D41CSubCD3B7_Loop3
708D422SubCD422
709D425SubCD425
710D453SubCD453
711D46DSubCD453_Loop
712D473SubCD453_Loop2
713D481SubCD453_Loop3
714D482SubCD453_Loop4
715D48BSubCD48B
716D4B9SubCD48B_Loop
717D4BBSubCD4BB
718D4C2SubCD4BB_Loop
719D4D1SubCD4BB_Loop2
720D4D6SubCD4BB_Loop3
721D4DFSubCD4BB_Loop4
722D4E1SubCD4BB_Loop5
723D4EDSubCD4BB_Loop6
724D4F0SubCD4BB_Loop7
725D4F1SubCD4F1
726D4F2SubCD4F2
727D4F7SubCD4F7
728D505SubCD505
729D514SubCD505_Loop
730D515SubCD515
731D539SubCD515_OnZero
732D551SubCD515_Loop
733D562SubCD515_Loop2
734D65ASubCD65A
735D65DSubCD65D
736D663SubCD663
737D69CSubCD663_Loop
738D6A0SubCD663_Loop2
739D6AESubCD663_Loop3
740D6B0SubCD663_Loop4
741D6BFSubCD663_Loop5
742D6CBSubCD663_Loop6
743D6E3SubCD663_OnZero
744D6E4SubCD663_Loop7
745D6E7SubCD663_Loop8
746D6E9SubCD663_Loop9
747D6F4BitMaskTable
748D6FCSubCD6FC
749D714SubCD6FC_Loop
750D75DSubCD6FC_Loop2
751D767SubCD6FC_Loop3
752D771SubCD6FC_Loop4
753D773SubCD6FC_Loop5
754D774SubCD6FC_Loop6
755D78FSubCD6FC_Loop7
756D796SubCD6FC_Loop8
757D79ESubCD6FC_Loop9
758D7A8SubCD6FC_Loop10
759D7C7SubCD6FC_OnNonnegative
760D7F5SubCD7F5
761D7FFSubCD7F5_OnNonnegative
762D81DSubCD7F5_Loop
763D822SubCD7F5_Loop2
764D8EDSubCD8ED
765D906SubCD906
766D92DSubCD906_Loop
767D937SubCD906_Loop2
768D93FSubCD906_Loop3
769D947SubCD906_OnNonzero
770D94ESubCD906_Loop4
771D951SubCD906_Loop5
772D960SubCD906_OnNonzero2
773D968SubCD906_Loop6
774D974SubCD906_Loop7
775D984SubCD906_Loop8
776D988D988ScoreAdjustTable
777D9B1SubCD9B1
778D9B8SubCD9B1_Loop
779D9B9SubCD9B9
780D9C7SubCD9C7
781D9CCSubCD9C7_Loop
782D9D9SubCD9D9
783D9EASubCD9D9_Loop
784D9F2SubCD9D9_Loop2
785D9F6SubCD9D9_Loop3
786D9FASubCD9D9_Loop4
787D9FFSubCD9FF
788DA15SubCD9FF_Loop
789DA1CSubCDA1C
790DA1DSubCDA1D
791DA1ESubCDA1E
792DA23InitializeTitleAndGame
793DA2FSubCDA2F
794DA4CSubCDA4C
795DA61SubCDA4C_Loop
796DAA2TitleAndAttractNmi
797DADAStoreMenuSelection
798DADCLatchMenuInput
799DAE6ReleaseMenuInputLatch
800DAECReleaseMenuInputLatch_Loop
801DAFDReleaseMenuInputLatch_Loop2
802DB0AReleaseMenuInputLatch_Loop3
803DB0DMenuCursorYPositions
804DB10SubCDB10
805DB18SubCDB10_OnNonzero
806DB38SubCDB10_OnCarryClear
807DB44SubCDB10_OnCarryClear2
808DB5BSubCDB10_Loop
809DB69SubCDB10_OnCarryClear3
810DB72SubCDB10_Loop2
811DB78SubCDB10_Loop3
812DB7ESubCDB10_Loop4
813DB84SubCDB10_Loop5
814DB94SubCDB10_OnCarryClear4
815DBACSubCDB10_OnCarryClear5
816DBC5SubCDB10_OnCarryClear6
817DBDESubCDB10_OnCarryClear7
818DC07SubCDB10_OnCarryClear8
819DC3DSubCDB10_Loop6
820DC4ASubCDB10_Loop7
821DC53SubCDB10_Loop8
822DD78DecodeCoursePackage
823DD7FDecodeCoursePackage_Loop
824DD89DecodeCoursePackage_OnNonzero
825DD94DecodeCoursePackage_OnNonnegative
826DDA4DecodeCoursePackage_Loop2
827DDBCDecodeCoursePackage_OnCarryClear
828DDC9DecodeCoursePackage_OnZero
829DDE7DecodeCoursePackage_Loop3
830DDF7DecodeCoursePackage_OnNonnegative2
831DE03DecodeCoursePackage_Loop4
832DE0EDecodeCoursePackage_Loop5
833DE14DecodeCoursePackage_OnNonnegative3
834DE1ASubCDE1A
835DE30SubCDE1A_Loop
836DE35SubCDE35
837DE3CSubCDE35_Loop
838DE4BSubCDE35_OnNonzero
839DE5EParseHoleObjectPackage
840DEA5ParseHoleObjectPackage_OnCarryClear
841DF03ParseHoleObjectList
842DF23ParseHoleObjectList_OnCarryClear
843DF3BParseHoleObjectList_Loop
844DF54ParseHoleObjectList_Loop2
845DF6CParseHoleObjectList_Loop3
846DF91ParseHoleObjectList_Loop4
847DF9BSubCDF9B
848DFAESubCDF9B_Loop
849DFB8SubCDFB8
850DFCDSubCDFB8_OnNonnegative
851DFD9SubCDFB8_OnCarryClear
852DFF1SubCDFB8_Loop
853DFF5SubCDFB8_OnCarryClear2
854E043SubCDFB8_Loop2
855E045SubCDFB8_OnCarryClear3
856E052SubCDFB8_OnNonnegative2
857E06DSubCDFB8_OnCarryClear4
858E079SubCDFB8_Loop3
859E07CSubCE07C
860E0A0SubCE07C_Loop
861E0A4SubCE07C_Loop2
862E0B5SubCE07C_Loop3
863E0BESubCE0BE
864E0CASubCE0BE_Loop
865E0CDSubCE0CD
866E0D8SubCE0CD_Loop
867E0EDSubCE0CD_Loop2
868E121SubCE0CD_OnCarryClear
869E141SubCE0CD_OnCarryClear2
870E156SubCE0CD_OnNonnegative
871E16ASubCE0CD_Loop3
872E16CSubCE0CD_OnNonnegative2
873E18BSubCE0CD_OnCarryClear3
874E1A1SubCE1A1
875E1ABSubCE1AB
876E1B5SubCE1AB_Loop
877E1B8GameplayPpuPalette
878E282ObjectSpanStartZero
879E283ObjectSpanEnds
880E2A2ObjectTileTable
881E2EBObjectXOffsetTable
882E334ObjectYOffsetTable
883E37DFixedObjectSpanBounds
884E384FixedObjectXOffsets
885E3A2FixedObjectTileTable
886E3C0FixedObjectAttributeTable
887E3FCSubCE3FC
888E437SubCE3FC_OnCarryClear
889E447SubCE3FC_Loop
890E458SubCE3FC_Loop2
891E45ASubCE3FC_Loop3
892E46ESubCE3FC_Loop4
893E48BSubCE48B
894E48DSubCE48D
895E4A1SubCE48D_Loop
896E4B5SubCE48D_Loop2
897E4CBSubCE48D_OnNonnegative
898E4D4SubCE48D_Loop3
899E4DFSubCE48D_Loop4
900E52CSubCE48D_Loop5
901E52FSubCE52F
902E54ASubCE52F_Loop
903E559SubCE559
904E576SubCE559_Loop
905E585SubCE585
906E6B0SubCE6B0
907E6C3CourseLayoutPointerLo
908E6D5CourseLayoutPointerHi
909F906SubCF906
910F918SubCF906_OnNonzero
911F929SubCF906_Loop
912F931SubCF931
913F93BSubCF931_Loop
914F93FSubCF931_Loop2
915F94BSubCF931_Loop3
916F953SubCF953
917F982SubCF953_Loop
918F983SubCF983
919F99BSubCF983_Loop
920F99DSubCF983_OnNonzero
921F99ESubCF99E
922F9A2SubCF99E_OnNonnegative
923F9ABSubCF99E_OnNonnegative2
924F9B2SubCF99E_OnNonnegative3
925F9D4SubCF99E_OnNonnegative4
926F9DFSubCF99E_OnNonnegative5
927FA08SubCF99E_Loop
928FA0ESubCF99E_Loop2
929FA14SubCF99E_Loop3
930FA18SubCF99E_Loop4
931FA1ASubCF99E_Loop5
932FA35NormalizeCourseGrid
933FA39NormalizeCourseGrid_OnNonnegative
934FA3DNormalizeCourseGrid_OnNonnegative2
935FA80NormalizeCourseGrid_Loop
936FA88NormalizeCourseGrid_OnZero
937FA8CSubCFA8C
938FA90SubCFA90
939FAA1SubCFA90_Loop
940FAAFSubCFA90_Loop2
941FABBSubCFA90_Loop3
942FACASubCFA90_Loop4
943FAE2SubCFA90_Loop5
944FAEDSubCFA90_Loop6
945FAFBSubCFA90_OnZero
946FAFFSubCFA90_Loop7
947FB0DSubCFA90_Loop8
948FB25SubCFB25
949FB27SubCFB25_Loop
950FB30SubCFB25_Loop2
951FB3BSubCFB25_Loop3
952FB3DSubCFB25_OnNonnegative
953FB48SubCFB25_Loop4
954FB62SubCFB25_OnNonnegative2
955FB84SubCFB25_Loop5
956FBA3SubCFB25_Loop6
957FBA4StoreSpecialGridCoordinate
958FBAENormalizeStatePair
959FBB2NormalizeStateEntry
960FBBENormalizeStateEntry_Loop
961FC24SubCFC24
962FC27SubCFC27
963FC3FSubCFC27_Loop
964FC43SubCFC27_Loop2
965FC5ASubCFC27_Loop3
966FC64SubCFC27_Loop4
967FC66CompareObjectState
968FC6CCompareObjectState_Loop
969FC6EGetGridObjectIndex
970FC78SubCFC78
971FC7DSubCFC78_Loop
972FC98UploadGeneratedCourseGrid
973FCA8UploadGeneratedCourseGrid_OnCarryClear
974FCB7UploadGeneratedCourseGrid_OnNonnegative
975FCCEUploadGeneratedCourseGrid_Loop
976FCDBUploadGeneratedCourseGrid_OnNonnegative2
977FCE6SubCFCE6
978FCF1SubCFCF1
979FCFDSubCFCF1_OnNonnegative
980FD0APpuTableFd0a
981FD12SubCFD12
982FD24SubCFD12_OnNonzero
983FD5ESubCFD12_Loop
984FD67SubCFD67
985FD69SubCFD67_OnNonnegative
986FD70SubCFD67_Loop
987FD81SubCFD67_Loop2
988FDE7SubCFD67_Loop3
989FDEDSubCFD67_Loop4
990FDF7SubCFD67_Loop5
991FE35SubCFD67_Loop6
992FE3ESubCFE3E
993FE44SubCFE3E_Loop
994FE48SubCFE3E_OnNonzero
995FE50SubCFE50
996FE61SubCFE61
997FE72SubCFE72
998FE8ESubCFE72_Loop
999FE97SubCFE97
1000FEABSubCFE97_Loop
1001FEB2SubCFEB2
1002FEB5SubCFEB5
1003FEBFSubCFEBF
1004FECBSubCFEBF_OnNonnegative
1005FEDASubCFEBF_Loop
1006FEE2SubCFEBF_Loop2
1007FEEASubCFEBF_Loop3
1008FEF2SubCFEBF_Loop4
1009FEFASubCFEBF_Loop5
1010FF01SubCFEBF_Loop6
1011FF03SubCFEBF_Loop7
1012FF2BSubCFF2B
1013FF3ESubCFF2B_Loop
1014FF42SubCFF2B_Loop2
1015FF4CSubCFF2B_OnNonnegative
1016FF58SubCFF2B_Loop3
1017FF68SubCFF2B_Loop4
1018FF6CSubCFF2B_Loop5
1019FF76SubCFF2B_OnNonnegative2
1020FF82SubCFF2B_Loop6
1021FF85FF85PpuValueTable