Promotes Lunar Pool

This commit is contained in:
tmerritt committed 2026-10-18 16:47:03 -04:00
1 parent 837007843d
commit 62866563ba
53 files changed
+115746 -4100

No files matched your search

@@ -0,0 +1,152 @@
# Pass 1 compressed and packed-data parser audit
## Summary
Four distinct packed-data consumers are confirmed. Only one is a general
run-length decoder. The others are pointer-selected sprite/object lists or
cell-code interpreters.
## 1. `$CBEA`: pointer-selected OAM sprite-list parser
Inputs:
- `$15` selects a sprite-list variant.
- `$16 == 4` selects the pointer tables at `$CC3E/$CC44`; other values select
`$CC24/$CC31`.
- `$33` is added to the generated OAM X coordinate.
- X is the destination OAM-shadow offset.
Format:
- One source byte per sprite.
- `$FF` terminates the list early.
- A hard limit of `$15` (21) source entries prevents runaway parsing.
- The source byte is both the CHR tile index and the index into coordinate
tables `$CC4A` and `$CC5F`.
Output record at `$0200,X`:
- byte 0: `$88 + table_CC5F[tile]` (Y)
- byte 1: source byte (tile)
- byte 2: `$00` (attributes)
- byte 3: `$33 + table_CC4A[tile]` (X)
This is a compact sprite-layout parser, not RLE compression.
## 2. `$DD78-$DE39`: primary course-map RLE decoder
Pointer selection:
- `$2B` is the zero-based hole index.
- `$E6C3,Y` and `$E6D5,Y` form the source pointer in `$04/$05`.
- Destination begins at `$0300` through `$06/$07`.
Header:
- First three source bytes are copied to `$19-$1B`.
- Source pointer then advances by three bytes.
Commands:
- `$FF`: end primary stream.
- `$00-$0F`: emit header byte 0, `(low_nibble + 1)` times.
- `$10-$1F`: emit header byte 1, `(low_nibble + 1)` times.
- `$20-$2F`: emit header byte 2, `(low_nibble + 1)` times.
- `$A0-$AF`: emit `(low_nibble + 1)` values cycling through `$AB-$AD` using
state byte `$8D`.
- `$30-$9F` and `$B0-$FE`: emit the command byte literally.
Output is divided into 16-byte units. After each unit, `$04/$05` advances by
`$1C` consumed source bytes and `$06/$07` advances by `$10` destination bytes.
### Hole 2 / Hole 3 length correction
The decoder does not enforce a 480-byte limit. RAM `$0300-$04FF` is cleared
before decoding, providing a 512-byte destination area. Therefore the measured
outputs are valid:
- Hole 2: 482 bytes
- Hole 3: 483 bytes
- Other currently measured streams: 480 bytes
The earlier 480-byte expectation came from the common case of 30 16-byte
units, not from a decoder bound. Both longer streams remain within the 512-byte
course buffer and do not indicate malformed pointers or an incorrect opcode
model.
## 3. `$DE3B-$DE5D`: optional auxiliary block parser
After the primary `$FF`, the decoder advances the source pointer past the
primary stream and examines the next byte.
- `$55` is a sentinel meaning the optional block is absent.
- Otherwise, records are copied in four-byte groups from the source into
`$0104+`.
- X begins at `$04` and increases by four per record.
- After each group, `$D4F2` advances the corresponding destination/object
bookkeeping.
- Parsing ends when X reaches `$44`, allowing at most 16 four-byte groups.
- `$04/$05` is then advanced by the number of consumed source bytes.
This is a bounded fixed-record block, not a terminator-scanned RLE stream.
## 4. `$DE5E-$DF52`: per-hole OAM/object package parser
The parser begins at the source position following the optional auxiliary
block.
### Fixed setup record
The first bytes initialize OAM-shadow entries beginning at `$0298` and setup
fields `$65-$66`, `$57`, `$1A-$1B`. Tables at `$E37D-$E3DE` expand one compact
source selector into multiple sprite records.
### Variable object list
At `$DF03`, each object record begins with:
- byte 0: object/shape selector, or `$FF` terminator
- byte 1: X/base-position adjustment
- byte 2: Y/base-position adjustment
The selector indexes span tables at `$E283/$E284`, then source tables at
`$E2EB`, `$E2A2`, and `$E334`. One compact three-byte object record expands to
one or more four-byte OAM entries.
- `$FF` terminates the variable object list.
- Values at or above table position `$2B` select OAM attribute `$42`; lower
positions select `$02` through the intentional overlapping-instruction idiom
at `$DF3A/$DF3B`.
- The parser resumes at the next source record using `$1C` as the consumed-byte
offset.
This is a table-expanded object/sprite list, not a byte-run compressor.
## 5. `$D72D-$D7FF`: course-cell code interpreter
This routine reads one byte through `($19),Y` from the generated course map. It
is not a stream decompressor. It interprets cell codes for collision or terrain
response:
- `$EF` and `$FD` are special sentinels.
- Other values index the property table at `$D80D`.
- Property values `$10`, `$20`, `$40`, and `$FF` select distinct collision or
response paths.
- Fine X/Y bits are converted into a bit mask and tested against the selected
property byte.
The `$FF` comparison at `$D74D` belongs to this cell-property dispatch and must
not be mistaken for a compressed-stream terminator.
## Parser-boundary conclusions
- `$CBEA` sprite layouts are bounded by `$FF` or 21 entries.
- Primary hole streams are bounded by their first `$FF` and decode into a
512-byte RAM area, not a fixed 480-byte area.
- Optional auxiliary blocks are bounded by `$55` or 16 four-byte groups.
- Per-hole object lists are bounded by a secondary `$FF` and expand through
fixed lookup tables.
- `$D72D` is a map-cell interpreter, not another compressed-data parser.
No remaining `$FF` comparison in reachable code has been found that represents
an unclassified compressed-stream parser.
+1 -1
View File
@@ -1,5 +1,5 @@
all: reconstructed_prg.bin verify
prg.o: prg.s symbols.inc prg.bin
prg.o: prg.s symbols.inc locals.inc course_streams.inc sprite_object_tables.inc prg.bin
ca65 -g -o $@ prg.s
reconstructed_prg.bin: prg.o linker.cfg
ld65 -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ prg.o
+10
View File
@@ -0,0 +1,10 @@
all: reconstructed_prg.bin verify
prg.o: prg.s symbols.inc prg.bin
ca65 -g -o $@ prg.s
reconstructed_prg.bin: prg.o linker.cfg
ld65 -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ prg.o
verify: reconstructed_prg.bin prg.bin
cmp reconstructed_prg.bin prg.bin
@echo BYTE-IDENTICAL
clean:
rm -f prg.o reconstructed_prg.bin reconstructed.map reconstructed.lbl
@@ -0,0 +1,109 @@
# Pass 1 NMI callback audit
## Dispatcher
The hardware NMI vector enters `$C0A6`. The fixed prologue saves A/X/Y, performs
OAM DMA from page `$02`, then executes `JMP ($0002)`. Every installed callback
must therefore finish through the common epilogue at `$C0B8` or deliberately
reset/restart the program.
`$C888` is the generic installer:
- Y -> `$0002` (callback low byte)
- X -> `$0003` (callback high byte)
- PPU NMI remains enabled through the shadow value at `$00`
## Confirmed callback installations
### `$C6C8` installed at `$C0EC`
Caller loads Y=`$C8`, X=`$C6`, then calls `$C888`.
Role: early/main gameplay display callback. It updates OAM entries at
`$0214-$0217` and `$0284-$0287`, advances animation counters `$8E/$8F`, and
terminates with `JMP $C0B8`.
### `$CFAA` installed at `$CF5C`
Caller loads Y=`$AA`, X=`$CF`, then calls `$C888`.
Role: gameplay sequencing callback. It decrements/increments `$32`, updates OAM
coordinates, and changes the callback vector to one of the following mid-routine
continuations as state thresholds are crossed:
- `$CFC3`
- `$D03E`
- `$D08A`
The routine ultimately reaches the gameplay display tail at `$C6C8`, which exits
through `$C0B8`.
### `$DAA2` installed at `$DA27`
Caller loads Y=`$A2`, X=`$DA`, then calls `$C888`.
Role: title/menu/attract controller callback. It polls controller port `$4016`,
updates `$09/$0A/$0D`, writes one OAM cursor entry at `$0200-$0203`, and either:
- jumps to `$C0B8` for the normal NMI epilogue,
- restarts title/game initialization through `$DA2F/$DA4C`, or
- restarts the initial state through `$C0C7`.
Important correction: `$DB0D` (`78 88 98`) is used as OAM Y-position data for
`$0200`, not as an NMI callback-low-byte table. Consequently `$BA78/$BA88/$BA98`
are not callbacks.
### `$C5A0` installed at `$FC8E`
Caller loads Y=`$A0`, X=`$C5`, then calls `$C888`.
Role: active gameplay controller/animation callback. It serially reads `$4016`,
updates input-derived state `$2E/$30`, angle/selection fields `$17/$44/$45`, OAM
entries, and then enters `$C6C8` before returning through `$C0B8`.
## Direct callback-vector transitions
The following direct writes to `$02/$03` are confirmed executable and are part
of the `$CFAA-$D121` callback state machine:
- `$CFB6/$CFBA`: install `$CFC3`
- `$CFDA/$CFDE`: install `$D03E`
- `$D006/$D00A`: install `$D03E`
- `$D02B/$D02F`: install `$D08A`
- `$D05E/$D062`: install `$D08A`
- `$D07A/$D07E`: install `$D08A`
These are mid-routine continuation entries, not independent top-level systems.
They share state in `$17/$1D/$1E/$1F/$32/$34/$35` and converge on `$C6C8`.
## Confirmed callback set
Top-level callback installations:
- `$C5A0`
- `$C6C8`
- `$CFAA`
- `$DAA2`
Dynamic continuation callbacks:
- `$CFC3`
- `$D03E`
- `$D08A`
Common normal exit:
- `$C0B8`
No other verified executable write to `$0002/$0003` has been found. Apparent
writes inside compressed hole packages are data and are excluded.
## Source conversion
The previously retained callback spans are now emitted as annotated instructions:
- `$C5A0-$C71D`: gameplay input/display callback chain
- `$CFAA-$D123`: gameplay sequence callback and dynamic continuation entries
The three bytes at `$C71E-$C720` remain data because execution at `$C71B` jumps
directly to the NMI epilogue and cannot fall through into them.
+44
View File
@@ -0,0 +1,44 @@
# Pass 1 overlap-entry audit
The 19 held-back decoded entries reduce to nine intentional overlapping-instruction
idioms plus one non-entry byte (`$D9DA`). These are valid 6502 size/speed tricks,
not ambiguous code/data boundaries.
## General idiom
`BIT absolute` consumes the following two bytes without changing A. Entering one
byte later interprets the low/high operand bytes as a useful instruction stream.
This permits conditional constant selection without a branch around the second
load. Because ca65 cannot emit two overlapping instruction streams linearly,
Pass 1 preserves each byte sequence in a localized `.incbin` span and documents
all valid entry points.
## Resolutions
- `$C198`: `BIT $00A9`; alternate entry `$C199`: `LDA #$00` from branch `$C194`.
Both entries valid. `$C198` is fall-through constant-selection path.
- `$D424`: `BIT $40A9`; alternate entry `$D425`: `LDA #$40` from `$D49B`.
Both entries valid.
- `$D9D8`: `BIT $0838`; alternate entry `$D9D9`: `SEC` from `$FE28`.
`$D9DA` (`PHP`) has no caller and is only the third byte of the BIT operand;
it is not an independent entry point.
- `$D9F9`: `BIT $FFA9`; alternate entry `$D9FA`: `LDA #$FF` from `$D9F4`.
Both entries valid.
- `$DF3A`: `BIT $02A9`; alternate entry `$DF3B`: `LDA #$02` from `$DF36`.
Both entries valid.
- `$FB24`: `BIT $B8A9`; alternate entry `$FB25`: `LDA #$B8` from `$FAE4/$FBAB`.
Both entries valid and implement the already traced terrain fallback selection.
- `$FB83`: `BIT $FFA9`; alternate entry `$FB84`: `LDA #$FF` from `$FB5C`.
Both entries valid.
- `$FC6B`: `BIT $18`; alternate entry `$FC6C`: `CLC` from `$FC68`.
Both entries valid. The BIT path preserves carry set by the preceding `SEC`;
the alternate path explicitly clears carry before return.
- `$FF00`: `BIT $00A9`; alternate entry `$FF01`: `LDA #$00` from `$FEFC`.
Both entries valid.
## Pass 1 source treatment
All nine physical byte sequences remain localized `.incbin` spans in `prg.s`.
Named entry constants may point into these spans, but the overlapping bytes must
not be emitted twice. Pass 2 may replace each span with explicit `.byte` values
and entry aliases while retaining the dual interpretation in comments.
+59
View File
@@ -0,0 +1,59 @@
# Golf (JU) Pass 1 status
## Confirmed
- 16 KiB NROM PRG, CPU window $C000-$FFFF mirrored at $8000-$BFFF.
- Vectors: NMI $C0A6, RESET $C000, IRQ $C0C4.
- Dynamic NMI vector in RAM $0002/$0003, installed through $C888.
- Direct recursive trace currently closes over 136 direct JSR/JMP targets.
- 4,063 instructions / 8,441 PRG bytes reached by the current direct trace.
- $DB0D (`78 88 98`) is an OAM cursor Y-position table used by $DAA2; it is not an NMI callback table.
- $E6C3/$E6D5 is the split 18-entry primary course-stream pointer table.
- Primary course streams and first $FF terminators are bounded in
course_streams.inc.
- $FA35-$FC23 contains course-grid normalization, connectivity-to-CHR lookup,
and associated tables.
- $FC98 uploads an 84-byte 12x7 course panel from $009C-$00EF to PPU $2222.
## Still required before declaring Pass 1 complete
1. **NMI callback set audited — DONE.** All four top-level callbacks ($C5A0=`GameplayInputNmiCallback`, $C6C8, $CFAA, $DAA2) and the three dynamic continuations ($CFC3, $D03E, $D08A) are emitted as annotated instruction source; none sit inside an `.incbin` span. See `NMI_CALLBACK_AUDIT.md`.
2. **Compressed/packed-data parsers audited; parser-adjacent tables converted to source — DONE.** Primary course-stream split pointer table at $E6C3/$E6D5 (18 entries) is explicit `.byte` source (`CourseLayoutPointerLo`/`CourseLayoutPointerHi`, resolving to `course_streams.inc` stream labels). Bit-mask table $D6F4–$D6FB (`BitMaskTable`) and PPU write table $FD0A–$FD11 (`PpuTableFd0a`) converted to explicit `.byte` source; both confirmed consumed via indexed loads in `SubCD6FC` ($D6D3/$D7EF) and at $FCFD respectively. Parser formats documented in `COMPRESSED_PARSER_AUDIT.md`.
3. **Controller-input and attract-mode return-to-title paths audited — DONE.** Title/menu/attract controller callback $DAA2 and title init $C0C7 (`InitializeRuntimeState`) are emitted as instruction source; return-to-title paths flow through $DA2F/$DA4C/$C0C7 per `NMI_CALLBACK_AUDIT.md`.
4. **Classify all remaining gaps as code, structured data, or localized incbin — DONE.** Every `.incbin` span has zero code entry points (no JSR/JMP/branch target falls inside) and is confirmed data; the only indirect jump is the dynamic NMI vector at $C0B5.
5. Emit remaining documented instruction source with CPU address and byte comments — DONE (all 4,063 reachable instructions are explicit source).
6. Obtain/build ca65 and verify reconstructed_prg.bin is byte-identical — DONE.
**Pass 1 complete.**
## Overlap-entry audit
The 19 held-back decodes are resolved. They represent nine deliberate overlapping
6502 instruction idioms; `$D9DA` is not independently reachable. See
`OVERLAP_AUDIT.md`. They remain localized `.incbin` spans because a linear ca65
instruction stream cannot encode both interpretations simultaneously.
## Sprite and object table audit
The sprite-layout tables at `$CC15+` and object expansion tables at
`$E283-$E3DD` have been structurally classified. See
`SPRITE_OBJECT_TABLE_AUDIT.md`. These ranges are confirmed data and must be
excluded from future executable tracing.
## Audited data emitted as ca65 source
The following formerly retained data spans are now explicit `.byte` source with
address and expected-byte comments:
- `$CC15-$CD84`: sprite layout remap, pointer tables, coordinate tables, and lists
- `$E1B8-$E1D7`: gameplay PPU palette
- `$E282-$E3DD`: variable and fixed object expansion tables
Only the unaudited tails of the original enclosing spans remain as `.incbin`.
## NES hardware symbols implemented
All decoded instruction operands now use the reusable names from `symbols.inc`
for PPU, OAM DMA, APU, and controller registers. Expected-byte comments retain
the original numeric encoding. Structured `.byte` data and `.incbin` offsets are
unchanged.
+59
View File
@@ -0,0 +1,59 @@
# Golf (JU) Pass 2 naming plan and progress
Pass 1 baseline: ca65/ld65 build verified byte-identical.
## Batch 1: startup, interrupt, PPU helpers, title/menu backbone
- Rename high-confidence startup and interrupt-local labels.
- Name NMI vector fields and PPU shadow values in `locals.inc`.
- Name the title/menu selection and input-latch fields where usage is proven.
- Name the menu cursor Y-position table at `$DB0D`.
- Keep uncertain gameplay temporaries numerical.
## Later batches
1. Controller polling and shot-selection state.
2. Gameplay NMI sequence fields and callbacks.
3. Course decompressor fields and package tables.
4. Golfer sprite-layout routines and states.
5. Course object expansion and collision routines.
6. Terrain-grid generator and course overview.
7. Audio engine and command tables.
Every batch must complete `make clean && make` with `BYTE-IDENTICAL` before the
next naming batch is accepted.
## Batch 2 completed: controller and shot-selection callback
Named the controller serial scan, repeat latch, club-selection index, aim index,
aim direction, animation counters, major callback phases, and OAM-update loops
within `$C5A0-$C71D`.
## Batch 3 completed: gameplay sequence NMI chain
Named the sequence position, three bounds, phase and completion fields, dynamic
NMI continuations, position/frame selection loops, and threshold tables in
`$CF87-$D13D`.
### Batch 3 correction
The branch at `$D09C` must target the trampoline at `$D0A6`, not the frame
selector at `$D0A9`. The target is now `JumpToSelectSequenceFrame`, preserving
the original displacement `$08` and byte sequence `90 08`.
## Subroutine-entry Label_ cleanup (Pass 2 residue)
All 112 `Label_` definitions that are JSR/JMP subroutine entry points have been
renamed:
- 4 with established semantics: `WaitForFramePreservingY` ($C881),
`SpriteOffsetForController` ($C894), `SetPpuScrollAndMask` ($C89D),
`MultiplyABy32` ($C8BB).
- 108 as address-based `SubC<addr>` names where behaviour is not yet
established (e.g. `SubC84D`, `SubC89A`, `SubCE64`).
The remaining 349 `Label_` definitions are internal branch targets within
routines; per repo convention these do not need semantic names for the call
graph to be readable and are intentionally left as `Label_`.
Build verified `BYTE-IDENTICAL` after the rename.
@@ -0,0 +1,201 @@
# Pass 1 sprite and object table audit
## Scope
This audit covers tables consumed by `ParseSpriteLayout` at `$CBEA` and the
per-hole object expansion path at `$DE5E-$DF52`. All addresses are CPU addresses
in the fixed `$C000-$FFFF` PRG view.
## A. Sprite-layout subsystem at `$CC15-$CCA6`
### `$CC15-$CC23`: sprite-layout selection map
15 bytes. The caller indexes this table with a selection/state value and obtains
one of five logical layout groups (`$00-$04`). This is an index-remap table, not
sprite data.
### `$CC24-$CC30`: standard layout pointer-low table
13 bytes:
`74 89 9E B3 C8 DD C8 B3 F2 07 1C 31 46`
These are low bytes of layout-list addresses. The matching high-byte table at
`$CC31-$CC3D` is predominantly `$CC`, with `$CD` used when a list crosses into
the next page.
Resolved standard pointers:
- `$CC74`
- `$CC89`
- `$CC9E`
- `$CCB3`
- `$CCC8`
- `$CCDD`
- `$CCC8`
- `$CCB3`
- `$CCF2`
- `$CD07`
- `$CD1C`
- `$CD31`
- `$CD46`
Repeated pointers are intentional mirroring of animation/layout states.
### `$CC31-$CC3D`: standard layout pointer-high table
13 bytes paired one-for-one with `$CC24-$CC30`.
### `$CC3E-$CC43`: alternate layout pointer-low table
6 bytes:
`5B 70 9E 70 5B 74`
### `$CC44-$CC49`: alternate layout pointer-high table
6 bytes paired with `$CC3E-$CC43`.
Resolved alternate pointers:
- `$CD5B`
- `$CD70`
- `$CC9E`
- `$CD70`
- `$CD5B`
- `$CC74`
This table shares existing lists instead of duplicating them.
### `$CC4A-$CC5E`: sprite X-offset table
21 signed/unsigned screen offsets indexed by the tile/list byte. Values repeat
`$00,$08,$10` patterns, matching three-column sprite construction.
### `$CC5F-$CC73`: sprite Y-offset table
21 offsets indexed by the same tile/list byte. Values progress by eight pixels
from `$00` to `$30`, producing row-aligned sprite positions.
### `$CC74-$CD5A`: terminated sprite-index lists
The pointer tables select variable-length byte lists in this range. Each byte is
both:
- the OAM tile value, and
- an index into `$CC4A` and `$CC5F` for X/Y placement.
Each list terminates with `$FF`; the parser also has a hard 21-entry limit.
The lists share suffixes and are deliberately referenced more than once.
### `$CD5B-$CD84` and later alternate lists
The alternate pointer table reaches `$CD5B` and `$CD70`. These are additional
terminated tile-index lists using the same coordinate tables and OAM expansion
format. Bytes beyond the last referenced terminator require separate consumer
analysis before being named as part of this family.
## B. Hole-object expansion tables at `$E283-$E3DE`
### `$E283-$E2A1`: object span-end table
31 monotonically increasing values:
`03 07 09 0B 0E 10 12 14 16 19 1B 1E 20 23 25 27 29 2B 2E 31 34 38 3A 3C 3E 40 43 45 47 49`
The parser loads the selected value into `$1D` as the exclusive end index for a
shape. The corresponding start index comes from the preceding entry at
`$E282,Y`, making `$E282/$E283` a compact prefix-boundary pair.
### `$E2A2-$E2EA`: object CHR-tile sequence table
73 bytes. For each expanded OAM sprite, the parser reads one tile value from
this table. Values are concentrated in `$E0-$F2`, matching the object/sprite CHR
region.
### `$E2EB-$E333`: object X-offset table
73 bytes paired with `$E2A2-$E2EA`. Values are mostly `$00`, `$08`, and `$10`,
with a few compact adjustments. The parser adds each value to the record's base
X byte.
### `$E334-$E37C`: object Y-offset table
73 bytes paired with the tile and X-offset tables. The parser adds each value
to the record's base Y byte.
Together these three 73-byte arrays form a structure-of-arrays representation:
- tile[index]
- x_offset[index]
- y_offset[index]
The span-end table maps an object selector to a contiguous slice of these
parallel arrays.
### `$E37D-$E383`: fixed setup span boundaries
Seven bytes:
`00 03 06 0B 10 17 1E`
The fixed setup parser uses a selector-derived range from the first two tables
around `$E37D/$E37E`. These values are prefix boundaries for larger fixed
sprite groups.
### `$E384-$E3A1`: fixed setup X-offset table
30 bytes. Values are chiefly `$00`, `$04`, and `$08`, defining compact sprite
clusters around a base position.
### `$E3A2-$E3BF`: fixed setup tile table
30 bytes. Values are concentrated in `$F5-$FC`, identifying a separate CHR
family from the variable object table.
### `$E3C0-$E3DD`: fixed setup attribute table
30 bytes. Values are primarily `$02` and `$42`, with `$82` and `$C2` variants.
The high bits encode OAM flipping while the low bits select palette 2.
The fixed setup arrays are parallel and are consumed together when constructing
OAM entries beginning near `$0298`.
### `$E3DE+`: following data
`$E3DE` begins another sequence (`08 08 00 ...`) not indexed by either audited
object expansion loop. It remains a separate table until its consumer is
identified.
## C. Per-hole object record format
After the fixed setup portion, `ParseHoleObjectList` consumes three-byte records:
- byte 0: object selector, or `$FF` terminator
- byte 1: base X adjustment
- byte 2: base Y adjustment
Selector `n` obtains a slice:
- start = span boundary `n`
- end = span boundary `n + 1`
Each slice element expands to one OAM entry using the tile/X/Y parallel arrays.
Selectors whose expanded table index reaches `$2B` use OAM attribute `$42`;
earlier entries use `$02`.
## D. Classification conclusions
Confirmed structured data:
- `$CC15-$CC23`: layout-group remap
- `$CC24-$CC49`: split pointer tables
- `$CC4A-$CC73`: paired coordinate tables
- `$CC74` onward: `$FF`-terminated sprite-index lists
- `$E283-$E2A1`: object span boundaries
- `$E2A2-$E37C`: three parallel 73-byte object expansion arrays
- `$E37D-$E3DD`: fixed setup boundaries and three parallel 30-byte arrays
No executable entry point exists inside these audited table ranges. Any legal
6502 opcode sequence found inside them is data and must be excluded from recursive
code tracing.
+38
View File
@@ -0,0 +1,38 @@
; Golf (JU) - Pass 1 compressed primary course-stream bounds.
; End labels are exclusive and include the primary $FF terminator.
CourseLayoutStream01 = $E6E7
CourseLayoutStream01_End = $E7A5
CourseLayoutStream02 = $EAAF
CourseLayoutStream02_End = $EB7B
CourseLayoutStream03 = $F2E8
CourseLayoutStream03_End = $F3A5
CourseLayoutStream04 = $F4BC
CourseLayoutStream04_End = $F5B5
CourseLayoutStream05 = $E991
CourseLayoutStream05_End = $EA7B
CourseLayoutStream06 = $EEF3
CourseLayoutStream06_End = $EFAF
CourseLayoutStream07 = $F0C5
CourseLayoutStream07_End = $F1B9
CourseLayoutStream08 = $F7BC
CourseLayoutStream08_End = $F8D5
CourseLayoutStream09 = $F6BA
CourseLayoutStream09_End = $F78E
CourseLayoutStream10 = $EFE3
CourseLayoutStream10_End = $F0B0
CourseLayoutStream11 = $EDEC
CourseLayoutStream11_End = $EECB
CourseLayoutStream12 = $ED09
CourseLayoutStream12_End = $EDDA
CourseLayoutStream13 = $E7BA
CourseLayoutStream13_End = $E89E
CourseLayoutStream14 = $E8CF
CourseLayoutStream14_End = $E982
CourseLayoutStream15 = $F3D3
CourseLayoutStream15_End = $F48E
CourseLayoutStream16 = $EBAC
CourseLayoutStream16_End = $ECD8
CourseLayoutStream17 = $F5C7
CourseLayoutStream17_End = $F6A8
CourseLayoutStream18 = $F1EA
CourseLayoutStream18_End = $F2B4
+47 -2
View File
@@ -1,2 +1,47 @@
; Golf (JU) zero-page aliases (declared during Pass 2).
; These intentionally conservative names will be refined in Passes 2 and 3.
; =============================================================================
; Golf (JU) application-specific RAM aliases
; =============================================================================
; Pass 2 names are introduced only where usage is established. RAM reused by
; unrelated subsystems remains numeric until the owning routines are audited.
; PPU/NMI infrastructure
ppu_ctrl_shadow = $00
ppu_mask_shadow = $01
nmi_vector_lo = $02
nmi_vector_hi = $03
source_pointer_lo = $04
source_pointer_hi = $05
destination_pointer_lo = $06
destination_pointer_hi = $07
nmi_complete_flag = $08
; Title/menu state
title_input_mode = $09
menu_input_latch = $0A
menu_selection = $0D
current_hole_index = $2B
; Course overview/grid generation
grid_inner_index = $6F
grid_group_index = $70
; Gameplay controller and shot-selection callback ($C5A0-$C71D)
active_controller_index = $7A ; 0 selects JOY1, 1 selects JOY2
primary_action_pressed = $2E ; first serial controller bit, normalized to 0/1
directional_input_index = $30 ; serial direction position, $FF when none found
directional_repeat_latch = $18 ; prevents immediate repeated club changes
club_selection_index = $17 ; wraps through $00-$0D
aim_angle_index = $44 ; low-nibble aim/angle phase
aim_adjust_direction = $45 ; zero/increment vs nonzero/decrement direction
animation_tick_counter = $8E
animation_frame_index = $8F
; Gameplay sequence callback chain ($CF87-$D123)
sequence_position = $32 ; mirrored into OAM Y fields $027B/$027F
sequence_phase = $34 ; selects forward vs return frame tables
sequence_return_complete = $35 ; set when the return bound is reached
sequence_lower_bound = $1E ; lower endpoint used by the decrementing phase
sequence_upper_bound = $1D ; upper endpoint used by the incrementing phase
sequence_return_bound = $1F ; endpoint used by the return phase
sequence_frame_index = $15 ; layout/frame selector passed to sprite refresh
sequence_frame_limit = $20 ; cap applied to one forward frame-table result
+2
View File
@@ -0,0 +1,2 @@
; Golf (JU) zero-page aliases (declared during Pass 2).
; These intentionally conservative names will be refined in Passes 2 and 3.
@@ -0,0 +1,26 @@
; =============================================================================
; Golf (JU) application-specific RAM aliases
; =============================================================================
; Pass 2 names are introduced only where usage is established. RAM reused by
; unrelated subsystems remains numeric until the owning routines are audited.
; PPU/NMI infrastructure
ppu_ctrl_shadow = $00
ppu_mask_shadow = $01
nmi_vector_lo = $02
nmi_vector_hi = $03
source_pointer_lo = $04
source_pointer_hi = $05
destination_pointer_lo = $06
destination_pointer_hi = $07
nmi_complete_flag = $08
; Title/menu state
title_input_mode = $09
menu_input_latch = $0A
menu_selection = $0D
current_hole_index = $2B
; Course overview/grid generation
grid_inner_index = $6F
grid_group_index = $70
@@ -0,0 +1,37 @@
; =============================================================================
; Golf (JU) application-specific RAM aliases
; =============================================================================
; Pass 2 names are introduced only where usage is established. RAM reused by
; unrelated subsystems remains numeric until the owning routines are audited.
; PPU/NMI infrastructure
ppu_ctrl_shadow = $00
ppu_mask_shadow = $01
nmi_vector_lo = $02
nmi_vector_hi = $03
source_pointer_lo = $04
source_pointer_hi = $05
destination_pointer_lo = $06
destination_pointer_hi = $07
nmi_complete_flag = $08
; Title/menu state
title_input_mode = $09
menu_input_latch = $0A
menu_selection = $0D
current_hole_index = $2B
; Course overview/grid generation
grid_inner_index = $6F
grid_group_index = $70
; Gameplay controller and shot-selection callback ($C5A0-$C71D)
active_controller_index = $7A ; 0 selects JOY1, 1 selects JOY2
primary_action_pressed = $2E ; first serial controller bit, normalized to 0/1
directional_input_index = $30 ; serial direction position, $FF when none found
directional_repeat_latch = $18 ; prevents immediate repeated club changes
club_selection_index = $17 ; wraps through $00-$0D
aim_angle_index = $44 ; low-nibble aim/angle phase
aim_adjust_direction = $45 ; zero/increment vs nonzero/decrement direction
animation_tick_counter = $8E
animation_frame_index = $8F
@@ -0,0 +1,37 @@
; =============================================================================
; Golf (JU) application-specific RAM aliases
; =============================================================================
; Pass 2 names are introduced only where usage is established. RAM reused by
; unrelated subsystems remains numeric until the owning routines are audited.
; PPU/NMI infrastructure
ppu_ctrl_shadow = $00
ppu_mask_shadow = $01
nmi_vector_lo = $02
nmi_vector_hi = $03
source_pointer_lo = $04
source_pointer_hi = $05
destination_pointer_lo = $06
destination_pointer_hi = $07
nmi_complete_flag = $08
; Title/menu state
title_input_mode = $09
menu_input_latch = $0A
menu_selection = $0D
current_hole_index = $2B
; Course overview/grid generation
grid_inner_index = $6F
grid_group_index = $70
; Gameplay controller and shot-selection callback ($C5A0-$C71D)
active_controller_index = $7A ; 0 selects JOY1, 1 selects JOY2
primary_action_pressed = $2E ; first serial controller bit, normalized to 0/1
directional_input_index = $30 ; serial direction position, $FF when none found
directional_repeat_latch = $18 ; prevents immediate repeated club changes
club_selection_index = $17 ; wraps through $00-$0D
aim_angle_index = $44 ; low-nibble aim/angle phase
aim_adjust_direction = $45 ; zero/increment vs nonzero/decrement direction
animation_tick_counter = $8E
animation_frame_index = $8F
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+576
View File
@@ -0,0 +1,576 @@
al 00FF85 .FF85PpuValueTable
al 00FF82 .Label_FF82
al 00FF76 .Label_FF76
al 00FF6C .Label_FF6C
al 00FF68 .Label_FF68
al 00FF58 .Label_FF58
al 00FF4C .Label_FF4C
al 00FF42 .Label_FF42
al 00FF3E .Label_FF3E
al 00FF00 .Label_FF00
al 00FF01 .Label_FF01
al 00FEFA .Label_FEFA
al 00FEF2 .Label_FEF2
al 00FEEA .Label_FEEA
al 00FEE2 .Label_FEE2
al 00FF03 .Label_FF03
al 00FEDA .Label_FEDA
al 00FECB .Label_FECB
al 00FEB2 .SubCFEB2
al 00FEAB .Label_FEAB
al 00FE97 .SubCFE97
al 00FEB5 .SubCFEB5
al 00FE8E .Label_FE8E
al 00FE48 .Label_FE48
al 00FE44 .Label_FE44
al 00FE3E .SubCFE3E
al 00FE35 .Label_FE35
al 00FDF7 .Label_FDF7
al 00FDED .Label_FDED
al 00FDE7 .Label_FDE7
al 00FE61 .SubCFE61
al 00FE50 .SubCFE50
al 00FD81 .Label_FD81
al 00FD70 .Label_FD70
al 00FD69 .Label_FD69
al 00FD5E .Label_FD5E
al 00FD24 .Label_FD24
al 00FD0A .PpuTableFd0a
al 00FCFD .Label_FCFD
al 00FCDB .Label_FCDB
al 00FCCE .Label_FCCE
al 00FCB7 .Label_FCB7
al 00FCA8 .Label_FCA8
al 00FC7D .Label_FC7D
al 00FC6B .Label_FC6B
al 00FC6C .Label_FC6C
al 00FC64 .Label_FC64
al 00FC5A .Label_FC5A
al 00FC3F .Label_FC3F
al 00FC43 .Label_FC43
al 00FBBE .Label_FBBE
al 00FBB2 .NormalizeStateEntry
al 00FBA3 .Label_FBA3
al 00FB83 .Label_FB83
al 00FB62 .Label_FB62
al 00FB84 .Label_FB84
al 00FB48 .Label_FB48
al 00FB3D .Label_FB3D
al 00FB3B .Label_FB3B
al 00FB30 .Label_FB30
al 00FB24 .Label_FB24
al 00FB27 .Label_FB27
al 00FB0D .Label_FB0D
al 00FAFB .Label_FAFB
al 00FAFF .Label_FAFF
al 00FBA4 .StoreSpecialGridCoordinate
al 00FAED .Label_FAED
al 00FB25 .SubCFB25
al 00FAE2 .Label_FAE2
al 00FACA .Label_FACA
al 00FABB .Label_FABB
al 00FAAF .Label_FAAF
al 00FC66 .CompareObjectState
al 00FAA1 .Label_FAA1
al 00FA90 .SubCFA90
al 00FA8C .SubCFA8C
al 00FA88 .Label_FA88
al 00FA78 .Label_FA78
al 00FBAE .NormalizeStatePair
al 00FA80 .Label_FA80
al 00FA3D .Label_FA3D
al 00FA39 .Label_FA39
al 00FA35 .NormalizeCourseGrid
al 00FC6E .GetGridObjectIndex
al 00FA1A .Label_FA1A
al 00FA14 .Label_FA14
al 00FA0E .Label_FA0E
al 00FA08 .Label_FA08
al 00FA18 .Label_FA18
al 00F9DF .Label_F9DF
al 00F9D4 .Label_F9D4
al 00F9B2 .Label_F9B2
al 00F9AB .Label_F9AB
al 00F9A2 .Label_F9A2
al 00F99E .SubCF99E
al 00F99D .Label_F99D
al 00F99B .Label_F99B
al 00F983 .SubCF983
al 00F982 .Label_F982
al 00F953 .SubCF953
al 00F94B .Label_F94B
al 00F93F .Label_F93F
al 00F93B .Label_F93B
al 00F929 .Label_F929
al 00F918 .Label_F918
al 00E6D5 .CourseLayoutPointerHi
al 00E6C3 .CourseLayoutPointerLo
al 00E585 .SubCE585
al 00E576 .Label_E576
al 00E559 .SubCE559
al 00E54A .Label_E54A
al 00E52C .Label_E52C
al 00E4CB .Label_E4CB
al 00E4D4 .Label_E4D4
al 00E4B5 .Label_E4B5
al 00E4DF .Label_E4DF
al 00E4A1 .Label_E4A1
al 00E48D .SubCE48D
al 00E48B .SubCE48B
al 00E46E .Label_E46E
al 00E45A .Label_E45A
al 00E458 .Label_E458
al 00E447 .Label_E447
al 00E437 .Label_E437
al 00E3C0 .FixedObjectAttributeTable
al 00E3A2 .FixedObjectTileTable
al 00E384 .FixedObjectXOffsets
al 00E37D .FixedObjectSpanBounds
al 00E334 .ObjectYOffsetTable
al 00E2EB .ObjectXOffsetTable
al 00E2A2 .ObjectTileTable
al 00E283 .ObjectSpanEnds
al 00E282 .ObjectSpanStartZero
al 00E1B8 .GameplayPpuPalette
al 00E1B5 .Label_E1B5
al 00E18B .Label_E18B
al 00E16C .Label_E16C
al 00E16A .Label_E16A
al 00E156 .Label_E156
al 00E141 .Label_E141
al 00E121 .Label_E121
al 00E0ED .Label_E0ED
al 00E0D8 .Label_E0D8
al 00E0CD .SubCE0CD
al 00E0CA .Label_E0CA
al 00E0BE .SubCE0BE
al 00E0A4 .Label_E0A4
al 00E0B5 .Label_E0B5
al 00E0A0 .Label_E0A0
al 00E07C .SubCE07C
al 00E079 .Label_E079
al 00E06D .Label_E06D
al 00E052 .Label_E052
al 00E045 .Label_E045
al 00E043 .Label_E043
al 00E1A1 .SubCE1A1
al 00DFF5 .Label_DFF5
al 00DFF1 .Label_DFF1
al 00DFD9 .Label_DFD9
al 00DFCD .Label_DFCD
al 00DFAE .Label_DFAE
al 00DF9B .SubCDF9B
al 00DF91 .Label_DF91
al 00DF6C .Label_DF6C
al 00DFB8 .SubCDFB8
al 00DF3A .Label_DF3A
al 00DF3B .Label_DF3B
al 00DF23 .Label_DF23
al 00DF54 .Label_DF54
al 00DF03 .ParseHoleObjectList
al 00DEA5 .Label_DEA5
al 00DE4B .Label_DE4B
al 00DE5E .ParseHoleObjectPackage
al 00DE30 .Label_DE30
al 00DE14 .Label_DE14
al 00DE03 .Label_DE03
al 00DDF7 .Label_DDF7
al 00DE0E .Label_DE0E
al 00DE1A .SubCDE1A
al 00DDE7 .Label_DDE7
al 00DE3C .Label_DE3C
al 00DDC9 .Label_DDC9
al 00E1AB .SubCE1AB
al 00DDBC .Label_DDBC
al 00DE35 .SubCDE35
al 00E3FC .SubCE3FC
al 00DDA4 .Label_DDA4
al 00DD94 .Label_DD94
al 00DD89 .Label_DD89
al 00DD7F .Label_DD7F
al 00DC4A .Label_DC4A
al 00DC53 .Label_DC53
al 00DC3D .Label_DC3D
al 00DC07 .Label_DC07
al 00DBDE .Label_DBDE
al 00DBC5 .Label_DBC5
al 00DBAC .Label_DBAC
al 00DB94 .Label_DB94
al 00DB84 .Label_DB84
al 00DB7E .Label_DB7E
al 00DB78 .Label_DB78
al 00DB72 .Label_DB72
al 00DB69 .Label_DB69
al 00DB5B .Label_DB5B
al 00DB44 .Label_DB44
al 00DB38 .Label_DB38
al 00DB18 .Label_DB18
al 00DB0A .Label_DB0A
al 00DAFD .Label_DAFD
al 00DADA .StoreMenuSelection
al 00DADC .LatchMenuInput
al 00DAE6 .ReleaseMenuInputLatch
al 00DB0D .MenuCursorYPositions
al 00DAEC .Label_DAEC
al 00DAA2 .TitleAndAttractNmi
al 00FCF1 .SubCFCF1
al 00DA61 .Label_DA61
al 00DA4C .SubCDA4C
al 00DB10 .SubCDB10
al 00DA2F .SubCDA2F
al 00DA1C .SubCDA1C
al 00DA15 .Label_DA15
al 00D9F9 .Label_D9F9
al 00D9FA .Label_D9FA
al 00D9F6 .Label_D9F6
al 00D9F2 .Label_D9F2
al 00D9EA .Label_D9EA
al 00D9D9 .SubCD9D9
al 00D9D8 .Label_D9D8
al 00D9CC .Label_D9CC
al 00D9B9 .SubCD9B9
al 00D9B8 .Label_D9B8
al 00D988 .D988ScoreAdjustTable
al 00D984 .Label_D984
al 00D968 .Label_D968
al 00D960 .Label_D960
al 00D951 .Label_D951
al 00D94E .Label_D94E
al 00D947 .Label_D947
al 00D974 .Label_D974
al 00D93F .Label_D93F
al 00D937 .Label_D937
al 00D92D .Label_D92D
al 00D8ED .SubCD8ED
al 00D822 .Label_D822
al 00D81D .Label_D81D
al 00D7FF .Label_D7FF
al 00D7C7 .Label_D7C7
al 00D796 .Label_D796
al 00D78F .Label_D78F
al 00DA1D .SubCDA1D
al 00D7F5 .SubCD7F5
al 00D767 .Label_D767
al 00D75D .Label_D75D
al 00D7A8 .Label_D7A8
al 00D79E .Label_D79E
al 00D771 .Label_D771
al 00D773 .Label_D773
al 00D774 .Label_D774
al 00D714 .Label_D714
al 00D6F4 .BitMaskTable
al 00D6E4 .Label_D6E4
al 00D6E7 .Label_D6E7
al 00D6CB .Label_D6CB
al 00D6BF .Label_D6BF
al 00D6AE .Label_D6AE
al 00D6B0 .Label_D6B0
al 00D69C .Label_D69C
al 00D6A0 .Label_D6A0
al 00D6E9 .Label_D6E9
al 00D6E3 .Label_D6E3
al 00D663 .SubCD663
al 00D6FC .SubCD6FC
al 00D562 .Label_D562
al 00D551 .Label_D551
al 00FD67 .SubCFD67
al 00D539 .Label_D539
al 00FC27 .SubCFC27
al 00FC24 .SubCFC24
al 00F906 .SubCF906
al 00D514 .Label_D514
al 00D4ED .Label_D4ED
al 00D4E1 .Label_D4E1
al 00D4D6 .Label_D4D6
al 00D4D1 .Label_D4D1
al 00D4DF .Label_D4DF
al 00D4C2 .Label_D4C2
al 00D4BB .SubCD4BB
al 00D4B9 .Label_D4B9
al 00D4F0 .Label_D4F0
al 00D481 .Label_D481
al 00D473 .Label_D473
al 00D46D .Label_D46D
al 00D453 .SubCD453
al 00D482 .Label_D482
al 00D425 .SubCD425
al 00D424 .Label_D424
al 00D422 .SubCD422
al 00D41C .Label_D41C
al 00D419 .Label_D419
al 00D3C9 .Label_D3C9
al 00D301 .Label_D301
al 00D2E0 .Label_D2E0
al 00D2C8 .Label_D2C8
al 00D2F8 .SubCD2F8
al 00D275 .Label_D275
al 00D2AF .Label_D2AF
al 00D25F .Label_D25F
al 00D24C .Label_D24C
al 00D239 .Label_D239
al 00D21D .SubCD21D
al 00D2EE .SubCD2EE
al 00D217 .Label_D217
al 00D3B7 .SubCD3B7
al 00D214 .Label_D214
al 00D4F7 .SubCD4F7
al 00D201 .Label_D201
al 00D2C2 .SubCD2C2
al 00D1FA .Label_D1FA
al 00D515 .SubCD515
al 00D1F1 .Label_D1F1
al 00D505 .SubCD505
al 00D1CA .Label_D1CA
al 00D1BF .Label_D1BF
al 00D1BA .Label_D1BA
al 00D1B3 .Label_D1B3
al 00D1B0 .Label_D1B0
al 00D1A5 .Label_D1A5
al 00D1A1 .Label_D1A1
al 00D190 .Label_D190
al 00D17C .Label_D17C
al 00D14D .Label_D14D
al 00D118 .Label_D118
al 00D135 .FinalSequenceThresholds
al 00D10C .Label_D10C
al 00D102 .Label_D102
al 00D0F8 .ClampReturnSequenceFrame
al 00D12D .ReturnSequenceThresholds
al 00D0EC .FindReturnSequenceFrame
al 00D10A .FindFinalSequenceFrame
al 00D121 .FinishSequenceNmi
al 00D0D8 .ApplyTerminalSequenceFrame
al 00D12A .TerminalSequenceThresholds
al 00D0CE .FindTerminalSequenceFrame
al 00D138 .ForwardSequenceFrameLimits
al 00D0BF .ApplyForwardSequenceFrame
al 00D124 .ForwardSequenceThresholds
al 00D0B5 .FindForwardSequenceFrame
al 00D0CC .SelectTerminalSequenceFrame
al 00D0E0 .SelectReturnSequenceFrame
al 00D0A6 .JumpToSelectSequenceFrame
al 00D098 .Label_D098
al 00D08A .GameplaySequenceNmiContinue3
al 00D085 .Label_D085
al 00D064 .Label_D064
al 00D048 .Label_D048
al 00D03E .GameplaySequenceNmiContinue2
al 00D0A9 .SelectSequenceFrame
al 00D021 .AdvanceSequenceToNextParity
al 00D039 .AdvanceSequencePosition
al 00D025 .InitializeSequenceReturnPhase
al 00CFC3 .GameplaySequenceNmiContinue1
al 00CFEA .PollSequenceActionButton
al 00CFC0 .UpdateSequenceInput
al 00CFAA .GameplaySequenceNmiCallback
al 00DA1E .SubCDA1E
al 00CF9D .WaitForSequenceStart
al 00CF8E .InitializeSequenceBounds
al 00CF87 .DeriveAimAngleNibble
al 00FC78 .SubCFC78
al 00CF51 .Label_CF51
al 00CF48 .Label_CF48
al 00CF2F .Label_CF2F
al 00CF03 .Label_CF03
al 00CEF3 .Label_CEF3
al 00CEBB .Label_CEBB
al 00CC74 .SpriteLayoutLists
al 00CC5F .SpriteLayoutYOffsets
al 00CC4A .SpriteLayoutXOffsets
al 00CC44 .AltSpriteLayoutPointerHi
al 00CC3E .AltSpriteLayoutPointerLo
al 00CC31 .SpriteLayoutPointerHi
al 00CC24 .SpriteLayoutPointerLo
al 00CC15 .SpriteLayoutGroupMap
al 00D4F2 .SubCD4F2
al 00CC0F .Label_CC0F
al 00CBEA .ParseSpriteLayout
al 00CBE6 .SubCCBE6
al 00CBDE .Label_CBDE
al 00CBA2 .Label_CBA2
al 00CB6E .Label_CB6E
al 00CBCB .SubCCBCB
al 00CB3A .Label_CB3A
al 00CB60 .SubCCB60
al 00D4F1 .SubCD4F1
al 00CB0F .SubCCB0F
al 00CB0C .Label_CB0C
al 00CAF9 .Label_CAF9
al 00CB97 .SubCCB97
al 00CB63 .SubCCB63
al 00CAE8 .Label_CAE8
al 00CAEB .Label_CAEB
al 00CB2C .Label_CB2C
al 00CAA1 .Label_CAA1
al 00CA9D .SubCCA9D
al 00CA9C .Label_CA9C
al 00CA88 .Label_CA88
al 00CA85 .Label_CA85
al 00CA7B .Label_CA7B
al 00CA78 .Label_CA78
al 00CA60 .Label_CA60
al 00CA55 .SubCCA55
al 00CA70 .SubCCA70
al 00CA53 .SubCCA53
al 00CA0F .Label_CA0F
al 00CA26 .Label_CA26
al 00CA06 .Label_CA06
al 00C9AB .Label_C9AB
al 00C9BA .Label_C9BA
al 00C998 .Label_C998
al 00C971 .Label_C971
al 00C9E6 .Label_C9E6
al 00C96B .Label_C96B
al 00CA30 .SubCCA30
al 00C935 .Label_C935
al 00C945 .Label_C945
al 00C931 .Label_C931
al 00C946 .SubCC946
al 00C906 .Label_C906
al 00C8FB .Label_C8FB
al 00C8EC .Label_C8EC
al 00C8E8 .ClearOamShadowLoop
al 00C8D9 .Label_C8D9
al 00C8BC .MultiplyBy32
al 00C8BB .MultiplyABy32
al 00C89A .SubCC89A
al 00C89D .SetPpuScrollAndMask
al 00C872 .Label_C872
al 00C751 .Label_C751
al 00C752 .SubCC752
al 00C73F .Label_C73F
al 00C72F .Label_C72F
al 00D9C7 .SubCD9C7
al 00C70E .WriteSecondaryMarkerOam
al 00C70C .SelectSecondaryMarkerTile
al 00C71B .FinishGameplayNmi
al 00C6DA .WriteAnimationMarkerOam
al 00C6D8 .SelectAnimationMarkerTile
al 00C6D4 .ShowAnimationMarker
al 00C69F .DecrementAimAngle
al 00C6A3 .StoreWrappedAimAngle
al 00C686 .InitializeAimDirection
al 00C6C8 .GameplayDisplayNmiCallback
al 00C721 .SubCC721
al 00C650 .PositionAimOamEntries
al 00C640 .InitializeAimOamLoop
al 00C642 .UpdateAimOamEntryLoop
al 00C67E .HandleAimDirectionChange
al 00C62D .HandleAimAdjustmentInput
al 00CAA8 .RefreshSequenceSpriteLayout
al 00C5ED .WrapClubSelectionIndex
al 00C604 .BuildGameplayOam
al 00C600 .ResetDirectionalRepeatLatch
al 00C5F5 .RefreshClubSelectionDisplay
al 00C5CD .HandleClubSelectionInput
al 00C5C3 .StoreDirectionalInputIndex
al 00C5B9 .ScanDirectionalSerialBits
al 00C5A0 .GameplayInputNmiCallback
al 00C599 .SubCC599
al 00C589 .SubCC589
al 00C586 .SubCC586
al 00C57B .StrobeAndReadController
al 00C563 .Label_C563
al 00C575 .Label_C575
al 00C8F5 .SubCC8F5
al 00C527 .Label_C527
al 00C542 .Label_C542
al 00FF2B .SubCFF2B
al 00C519 .Label_C519
al 00C517 .Label_C517
al 00C51F .Label_C51F
al 00C501 .Label_C501
al 00C4F7 .Label_C4F7
al 00C504 .Label_C504
al 00D9B1 .SubCD9B1
al 00C4DC .Label_C4DC
al 00C4EB .Label_C4EB
al 00C4BA .Label_C4BA
al 00C4B8 .Label_C4B8
al 00C49C .Label_C49C
al 00C4A7 .Label_C4A7
al 00C909 .WaitFrameGroups
al 00C481 .Label_C481
al 00C44E .Label_C44E
al 00D48B .SubCD48B
al 00C3FF .Label_C3FF
al 00D906 .SubCD906
al 00C3BF .Label_C3BF
al 00C4CB .SubCC4CB
al 00C39F .Label_C39F
al 00C3AE .Label_C3AE
al 00C369 .Label_C369
al 00C41B .SubCC41B
al 00E52F .SubCE52F
al 00C336 .Label_C336
al 00C593 .SubCC593
al 00C33E .Label_C33E
al 00C907 .SubCC907
al 00C380 .SubCC380
al 00C383 .SubCC383
al 00FEBF .SubCFEBF
al 00FD12 .SubCFD12
al 00C2BF .Label_C2BF
al 00C286 .Label_C286
al 00C2D9 .Label_C2D9
al 00C305 .SubCC305
al 00C27A .Label_C27A
al 00C2C2 .Label_C2C2
al 00D65A .SubCD65A
al 00C3B1 .SubCC3B1
al 00C26C .Label_C26C
al 00C2BA .Label_C2BA
al 00CA8E .SubCCA8E
al 00C8B5 .RestorePpuCtrlShadow
al 00C881 .WaitForFramePreservingY
al 00D13E .SubCD13E
al 00C238 .Label_C238
al 00C240 .Label_C240
al 00CE64 .SubCCE64
al 00D9FF .SubCD9FF
al 00D65D .SubCD65D
al 00C1EF .Label_C1EF
al 00C894 .SpriteOffsetForController
al 00FCE6 .SubCFCE6
al 00C916 .SubCC916
al 00FE72 .SubCFE72
al 00FC98 .UploadGeneratedCourseGrid
al 00C1CD .Label_C1CD
al 00C1D1 .Label_C1D1
al 00C1CA .Label_C1CA
al 00C1BC .Label_C1BC
al 00DD78 .DecodeCoursePackage
al 00C84D .SubCC84D
al 00C8F3 .WaitForFrame
al 00C198 .Label_C198
al 00C199 .Label_C199
al 00C484 .SubCC484
al 00C192 .Label_C192
al 00C184 .Label_C184
al 00F931 .SubCF931
al 00C160 .Label_C160
al 00C17C .Label_C17C
al 00C182 .Label_C182
al 00C14A .Label_C14A
al 00C17E .Label_C17E
al 00C136 .SubCC136
al 00E6B0 .SubCE6B0
al 00C8C8 .ClearNametableAndOam
al 00C888 .InstallNmiCallback
al 00C0E8 .SubCC0E8
al 00C0C7 .InitializeRuntimeState
al 00C0C4 .IrqLoop
al 00C0B8 .NmiEpilogue
al 00C0A6 .NmiHandler
al 00C09B .DiscardPpuBlockByteLoop
al 00C08F .ReadPpuBlockByteLoop
al 00C08D .ReadPpuBlockBytes
al 00C8C1 .SetPpuAddress
al 00DA23 .InitializeTitleAndGame
al 00C087 .ReadPpuBlocks
al 00C05D .CopyStartupTableLoop
al 00C055 .Label_C055
al 00C04F .Label_C04F
al 00C041 .ClearStartupRamLoop
al 00C007 .WaitForFirstVblank
al 00C000 .Reset
@@ -0,0 +1,3 @@
; Address aliases not emitted as labels remain here.
; Golf (JU) Pass 1 sprite/object table address aliases.