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

+23 -2
View File
@@ -1,6 +1,27 @@
# Golf (JU) — Skeleton Project
# Golf (JU)
ROM: `_wip/Golf (JU)/Golf (JU).nes` (24,592 bytes, iNES). Status: **SKELETON — not yet disassembled.** The entire 16 KB PRG bank is a single unclassified block; `copilot/prg.s` is the default-project skeleton (`default_project.tar.gz`) that reproduces it as one `.incbin`. The skeleton build is **byte-identical** at the PRG level.
ROM: `_wip/Golf (JU)/Golf (JU).nes` (24,592 bytes, iNES). Status: **Pass 1 complete, Pass 2 substantial, Pass 3 started — PAUSED.** PRG build is **byte-identical**.
**Pass 1 (code/data split) — complete.** Reachable code traced from RESET ($C000) and NMI ($C0A6); all 4,063 reachable instructions are explicit source. NMI callbacks ($C5A0=`GameplayInputNmiCallback`, $C6C8, $CFAA, $DAA2; continuations $CFC3/$D03E/$D08A) and controller/attract paths ($DAA2, $C0C7=`InitializeRuntimeState`) are in source. All remaining `.incbin` spans have zero code entry points and are confirmed data.
**Pass 2 (label naming) — substantial.** Startup/NMI/PPU/controller/course-decode routines named (batches 1–3 per `PASS2_PLAN.md`). All 112 subroutine-entry `Label_` labels renamed to `SubC<addr>` (108) or semantic names (4: `WaitForFramePreservingY`, `SpriteOffsetForController`, `SetPpuScrollAndMask`, `MultiplyABy32`); 349 internal branch-target `Label_` labels remain intentionally.
**Pass 3 (data tables) — started, PAUSED.** Conversions completed:
- Interrupt vectors at $FFFA–$FFFF → `.word NmiHandler`/`Reset`/`IrqLoop`
- Course-stream split pointer table at $E6C3/$E6D5 (18 entries) → `CourseLayoutPointerLo`/`CourseLayoutPointerHi`
- Bit-mask table $D6F4–$D6FB → `BitMaskTable` ($80 40 20 10 08 04 02 01)
- PPU write table $FD0A–$FD11 → `PpuTableFd0a`
- Score adjust table $D988–$D9B0 → `D988ScoreAdjustTable`
- PPU value table $FF85–$FF9F → `FF85PpuValueTable`
- Sprite/object tables (`sprite_object_tables.inc`) and gameplay PPU palette ($E1B8–$E1D7) already emitted as structured source.
**Paused:** Remaining `.incbin` spans are largely Iwata's compressed level data ($E6E7–$F905, ~4.6 KB) and opaque lookup tables ($C786–$C84C, $CD85–$CE63, $D304–$D3B6, $D563–$D659, $D823–$D8EC, $DC59–$DD77, $E1D8–$E281, $E3DE–$E3FB, $E588–$E6AF, $FBBF–$FC23). Without runtime tracing / a code/data log to confirm consumers and structure, converting these risks guessy rewrites. Per repo convention, they remain as `.incbin` with address comments.
Remaining `.incbin` spans ($C71E–$C720, $C786–$C84C, $CD85–$CE63, $D304–$D3B6, $D563–$D659, $D823–$D8EC, $DC59–$DD77, $E1D8–$E281, $E3DE–$E3FB, $E588–$E6AF, $E6E7–$F905, $FBBF–$FC23) remain as data per the no-guessy-rewrites convention; convert only when a consumer is identified.
**Next Pass 3 candidates:** when runtime tracing tools are available, remaining structured tables (course-stream data, opaque lookup spans) can be converted where structure is confirmed.
**Promotion:** not yet — `_wip` tier (PRG-only compare). Promotion requires full-ROM build (`header.s`/`chr.s` + vectors) and root inventory entry.
## ROM Facts
@@ -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
File renamed without changes.
@@ -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.
+30
View File
@@ -0,0 +1,30 @@
To make disassembling the 1984 NES classic Hogan's Alley significantly easier, you should focus on its straightforward architecture, unique input handling, and standard sprite structures.
Here is a breakdown of the vital structural details that will save you time when writing a disassembly or configuration file:
1. The Memory Mapper (NROM)
• No Bank Switching: Hogan's Alley uses the NROM-128 (iNES Mapper 0) board. It has exactly 16 KB of PRG ROM (mapped to $C000–$FFFF) and 8 KB of CHR ROM.
• Mirrored Vector Table: Because it is a 16 KB game mirrored into a 32 KB CPU space, the 6502 vectors at $FFFA–$FFFF are identical to the data at $BFFA–$BFFF in the raw PRG data.
2. Zapper Light Gun Mechanics
Since Hogan's Alley is a light gun game, your disassembly will heavily feature input reading from controller port 2 ($4017). Look out for these code patterns:
• The Trigger Pull: Bit 4 of $4017 checks if the Zapper trigger is pulled.
• The Light Sensor: Bit 3 of $4017 checks if the photodiode detects light (0 = light detected, 1 = darkness).
• The Flash Hack: To see which criminal or innocent citizen was shot, the game blanks the screen for one frame, then draws white boxes over the target hitboxes one by one on subsequent frames while checking Bit 3 of $4017. Identifying this routine early will unlock the core game loop logic.
3. CHR Layout and Sprite Construction
• Sprite Mapping: Sprite data is pushed via Sprite DMA ($4014) to Object Attribute Memory (OAM). The targets (gangsters, police, civilians) are large metasprites composed of individual 8x8 tiles.
• The "Flips": Look closely at the sprite attribute byte in OAM. Hogan's Alley flips tiles horizontally (Bit 6) and vertically (Bit 7) to reuse a single side of an arm, leg, or face for the opposite side, minimizing the 8 KB CHR space.
4. Audio Architecture (RP2A03)
The game uses a very early, standard Nintendo audio driver.
• Audio registers reside between $4000 and $4015.
• Sound effects (like the gunshot or the "miss" buzzer) are prioritized over the simple background jingles. Isolating the audio update routine (usually triggered inside the NMI) will let you separate the SFX data tables cleanly from the game logic.
5. Common Pitfalls to Automate
• Indirect Jumps: Watch out for JMP ($xxxx). Early NES games occasionally use jump tables for game states (Title Screen, Game A, Game B, Trick Shot). Ensure your disassembler treats these destination tables as 16-bit pointers rather than raw code instructions.
• Data Arrays: Score counter graphics, timer lookups, and hit detection window delays are stored as raw data arrays embedded right next to the subroutines that use them.
Binary file not shown.
-100
View File
@@ -1,100 +0,0 @@
# Lunar Pool (U) — Skeleton Project
ROM: `_wip/Lunar Pool (U)/Lunar Pool (U).nes` (24,592 bytes, iNES). Status: **PASS 1 COMPLETE** — 4,586 instructions / 9,475 code bytes (57.8%) / 6,909 data bytes, byte accounting exact, **BYTE-IDENTICAL** at the PRG level. Pass 2 and 3 outstanding.
## ROM Facts
| Property | Value |
|----------|-------|
| Mapper | 0 (NROM) — from the iNES header |
| PRG | 16 KB (header claims map at CPU $C000–$FFFF) |
| CHR | 8 KB |
| Mirroring | Horizontal |
| Battery-backed flag | clear |
| ROM SHA-256 | `6da37fd34e8f4eb3df34e9f446726a193db77d0e0bba32aa328ef225993fc8a1` |
| PRG SHA-256 | `43a2f54cd48b38fc1e4a33051e019528e9789a774ace773fa7549c33dc9492c9` |
## Interrupt Vectors (taken from PRG $3FFA–$3FFF)
| Vector | Target | Note |
|--------|--------|------|
| NMI | `$FF65` | per-frame heartbeat |
| RESET | `$E80C` | non-$C000 entry at $E80C — trace from here in Pass 1 |
| IRQ | `$FF64` | target $FF64 — verify during Pass 1 |
## Pass Status
| Pass | Status | Description |
|------|--------|-------------|
| Pass 0 | Superseded | `prg.s` was a 12-line `.incbin` of the whole PRG — no disassembly at all |
| Pass 1 | **Complete** | 4,586 instructions / **9,475 code bytes (57.8%)** / 6,909 data bytes. Byte accounting exact: 9,403 + 6,981 = 16,384. 598 labels, 598 routine headers |
| Pass 2 | Outstanding | ~585 `Label_Cxxxx` to name |
| Pass 3 | Outstanding | Data regions inside the 6,909 unreached bytes need naming |
### How Pass 1 got to 57.8%
| Step | Instructions | Code |
|------|--------------|------|
| Vectors + direct `jsr`/`jmp`/branch, official opcodes | 1,259 | 2,561 B (15.6%) |
| `--undocumented` (108 NMOS opcodes) | 4,572 | 9,436 B (57.6%) |
| `--auto-seed` (48 table-referenced entries) + `--extra-seed 0xE80C` | **4,586** | **9,475 B (57.8%)** |
### The dispatch mechanisms
**1. `jmp ($7961)` at three sites** (`$F788`, `$F7F6`, `$F828`). The target address is read from the RAM pointer at `$7961`/`$7962`, so it cannot be followed statically. These are game-over / hi-score screens: the data blocks that follow them contain the screen text (`"game over"`, `"hi`score__"`, `"shot"`).
**2. Stack-based dispatch at `$CBDC`** — the same pattern as Mario Bros (JU)'s `$CD9E`:
```
$CBDC pla / sta ZpFA
$CBDF pla / sta ZpFB
$CBE7 lda (ZpFA),y ; read the entry, indexed by Y
```
The pointer arrives via `pla`, so it is only knowable in the caller's frame.
### Tracer fixes required to get there
Three undocumented opcodes were missing from `nesdis.py` and were added:
* `$72` — `RRA abs` (the `RRA` family had `$63`/`$67`/`$6F`/`$73`/`$77`/`$7B`/`$7F` but not `$72`).
* `$42` — `NOP #imm` (the NOP-immediate family had `$80`/`$82`/`$89`/`$C2`/`$E2` but not `$42`).
* `$FA` — `NOP abs,X` (the NOP-abs,X family had `$1C`/`$3C`/`$5C`/`$7C`/`$DC`/`$FC` but not `$FA`).
One emitter fix: ca65 silently rewrites an operand whose high byte is `$00` in the shorter zero-page form (`sta $00FF,x` becomes `sta $FF,x`, emitting `$95` instead of `$9D`). `render()` now emits the `a:` prefix for ABS/ABSX/ABSY/IND operands with a high byte of `$00`, forcing the absolute form so the bytes match the ROM. `operand_value()` strips the prefix when parsing.
### Known remaining gaps
* The tracer still reports two overlaps (`$C3BB` — resolved with `--data 0xC3BB:1` — and `$F0EF`) and three rejected mis-aligned stubs.
* 6,909 bytes (42.2%) are still data, gated behind the `jmp ($7961)` and `$CBDC` dispatches.
* `locals.inc` carries 114 generated zero-page aliases, none yet named semantically.
## `copilot/` Contents
| File | Purpose |
|------|---------|
| `Lunar Pool (U).nes` | original ROM image (reference) |
| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` |
| `prg.s` | Pass-1 skeleton: `.incbin "prg.bin", $0000, $4000` (whole PRG) |
| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) |
| `locals.inc` | project-local zero-page aliases — empty for now (filled in Pass 2) |
| `linker.cfg` | PRG at $C000, 16 KB, `fill = yes` |
| `Makefile` | links `reconstructed_prg.bin` and `cmp`s it against `prg.bin` |
| `reconstructed_prg.bin` | build output from the last verified build |
Header/CHR are reproduced verbatim from `header.bin`/`chr.bin` (not linked): `make` verifies **PRG bytes only** at this stage, which is exactly what a skeleton proves. When this project is promoted to a full disassembly, `header.s` / `chr.s` (as e.g. `Burger Time (U)`) and a full-ROM `make` target get added.
## Build
```bash
cd "_wip/Lunar Pool (U)/copilot"
make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL"
```
## Next Steps (per `PROMPTS.md`)
1. **Pass 1** — complete (57.8% code, byte accounting exact).
2. **Pass 2** — name the ~585 remaining `Label_Cxxxx`; fill `locals.inc` with semantic zero-page aliases.
3. **Pass 3** — name data tables/structures in the 6,909 unreached bytes; release provisional flags.
4. **Promotion** — move to a top-level `<name>/copilot/` folder, add full-ROM build (header.s + chr.s + vectors), and write the power-on flow `OVERVIEW.md` in the established style; then it joins the root index's numbered inventory.
Binary file not shown.
Binary file not shown.
-6
View File
@@ -1,6 +0,0 @@
MEMORY {
PRG: start = $C000, size = $4000, file = %O, fill = yes;
}
SEGMENTS {
PRG: load = PRG, type = ro;
}
-120
View File
@@ -1,120 +0,0 @@
; Lunar Pool (U) application-specific RAM aliases - Pass 1
; Generated from every direct zero-page operand in reachable code:
; ref counts are reads/writes, `where` lists the referencing addresses.
; ZpXX names indicate storage with a role not yet unique enough for a behavioral name;
; Pass 2 replaces them with names derived from observed usage.
Zp00 = $00 ; 22 refs; reads=13 writes=9; used at $CB45, CB49, CB52, CB61, +15 more
Zp01 = $01 ; 34 refs; reads=18 writes=16; used at $CA79, CB4D, CB50, CB66, +27 more
Zp02 = $02 ; 4 refs; reads=3 writes=1; used at $C3B4, E295, E844, EE45
Zp03 = $03 ; 8 refs; reads=4 writes=4; used at $E8E6, E9FB, EE48, EE4A, +1 more
Zp04 = $04 ; 3 refs; reads=2 writes=1; used at $F68F, F725
Zp05 = $05 ; 12 refs; reads=6 writes=6; used at $E8EB, EE3C, F211, F2AF, +5 more
Zp06 = $06 ; 5 refs; reads=2 writes=3; used at $EA00, EE32, F2E5
Zp07 = $07 ; 22 refs; reads=16 writes=6; used at $EE55, EE57, EEC7, EF04, +16 more
Zp08 = $08 ; 9 refs; reads=6 writes=3; used at $C3B6, F032, F236, F287, +3 more
Zp09 = $09 ; 2 refs; reads=1 writes=1; used at $CFC4, D2E7
Zp0C = $0C ; 4 refs; reads=2 writes=2; used at $E29A, E300, E309
Zp0D = $0D ; 6 refs; reads=3 writes=3; used at $E240, E302, E314, E8F0
Zp0E = $0E ; 4 refs; reads=2 writes=2; used at $E245, E31A, F5EE
Zp0F = $0F ; 1 refs; reads=0 writes=1; used at $E8A1
Zp10 = $10 ; 3 refs; reads=1 writes=2; used at $E3FF, E655, FBC8
Zp11 = $11 ; 4 refs; reads=2 writes=2; used at $E405, E659, E6F8, FBCA
Zp12 = $12 ; 5 refs; reads=4 writes=1; used at $C0C5, E666, F2A0, FBCC, +1 more
Zp13 = $13 ; 6 refs; reads=5 writes=1; used at $E66A, E6FC, E70F, F2A4, +2 more
Zp15 = $15 ; 2 refs; reads=1 writes=1; used at $F5F0
Zp16 = $16 ; 4 refs; reads=2 writes=2; used at $F080, F14E, F196, F29D
Zp17 = $17 ; 4 refs; reads=2 writes=2; used at $F084, F152, F193, F2A2
Zp18 = $18 ; 5 refs; reads=3 writes=2; used at $C0CD, E698, E6CA, FC79, +1 more
Zp19 = $19 ; 4 refs; reads=2 writes=2; used at $E696, E6ED, FC7B, FCB7
Zp1A = $1A ; 2 refs; reads=1 writes=1; used at $FC99, FCCA
Zp1B = $1B ; 2 refs; reads=1 writes=1; used at $FC9B, FCCE
Zp1C = $1C ; 8 refs; reads=4 writes=4; used at $E61E, E662, EF5A, F1E2, +4 more
Zp1D = $1D ; 8 refs; reads=5 writes=3; used at $EF62, EF8A, EFDF, F1E7, +4 more
Zp1E = $1E ; 13 refs; reads=9 writes=4; used at $C0C7, C0C9, C0CF, C0D5, +9 more
Zp1F = $1F ; 9 refs; reads=6 writes=3; used at $EF74, EF84, EFD9, F1F1, +5 more
Zp20 = $20 ; 5 refs; reads=4 writes=1; used at $FBAD, FBEC, FC3A, FC7D, +1 more
Zp21 = $21 ; 5 refs; reads=4 writes=1; used at $FBA8, FBF0, FC3E, FC81, +1 more
Zp22 = $22 ; 5 refs; reads=4 writes=1; used at $FBBE, FC18, FC51, FC9D, +1 more
Zp23 = $23 ; 5 refs; reads=4 writes=1; used at $FBB9, FC1C, FC55, FCA1, +1 more
Zp24 = $24 ; 21 refs; reads=9 writes=12; used at $E3D6, E3EF, E6AB, E6BC, +16 more
Zp25 = $25 ; 23 refs; reads=11 writes=12; used at $E3D4, E3F5, E6A9, E6C1, +18 more
Zp26 = $26 ; 20 refs; reads=11 writes=9; used at $E3C4, E443, E51A, E59F, +15 more
Zp27 = $27 ; 5 refs; reads=1 writes=4; used at $E3DD, E448, E51F, E5A4, +1 more
Zp28 = $28 ; 8 refs; reads=6 writes=2; used at $E3CE, E67A, E68E, E694, +4 more
Zp29 = $29 ; 5 refs; reads=3 writes=2; used at $E3E7, E683, E6AD, F268, +1 more
Zp2A = $2A ; 6 refs; reads=3 writes=3; used at $C0D7, E31F, E34D, E373, +2 more
Zp2B = $2B ; 4 refs; reads=2 writes=2; used at $E360, E53E, E55D, E57D
Zp2C = $2C ; 9 refs; reads=2 writes=7; used at $E3C1, E43E, E50E, E515, +4 more
Zp2D = $2D ; 9 refs; reads=2 writes=7; used at $E3DA, E43B, E502, E509, +4 more
Zp2E = $2E ; 10 refs; reads=5 writes=5; used at $E487, E4B2, E4D5, E4DE, +6 more
Zp2F = $2F ; 6 refs; reads=2 writes=4; used at $E485, E4BB, E4FB, E529, +2 more
Zp30 = $30 ; 4 refs; reads=2 writes=2; used at $E39D, E555, E55B, E57B
Zp31 = $31 ; 8 refs; reads=4 writes=4; used at $E384, E527, E540, E550, +4 more
Zp32 = $32 ; 23 refs; reads=17 writes=6; used at $E413, E417, E457, E46C, +16 more
Zp33 = $33 ; 17 refs; reads=12 writes=5; used at $E415, E41B, E429, E455, +10 more
Zp34 = $34 ; 17 refs; reads=11 writes=6; used at $E71F, E721, E74F, E763, +11 more
Zp35 = $35 ; 14 refs; reads=7 writes=7; used at $E4E0, E4E4, E55F, E56A, +6 more
Zp36 = $36 ; 2 refs; reads=1 writes=1; used at $E5F8, E617
Zp37 = $37 ; 5 refs; reads=2 writes=3; used at $EBC1, F321, F41B, F41D
Zp3B = $3B ; 1 refs; reads=1 writes=0; used at $EBF5
Zp49 = $49 ; 2 refs; reads=2 writes=0; used at $C0D1, C0D9
Zp5F = $5F ; 6 refs; reads=3 writes=3; used at $C3C0, E85D, E8A6, F2EF, +1 more
Zp60 = $60 ; 4 refs; reads=2 writes=2; used at $C00E, C019, C3E0, C3E6
Zp61 = $61 ; 2 refs; reads=1 writes=1; used at $F521
Zp65 = $65 ; 2 refs; reads=1 writes=1; used at $F85C
Zp67 = $67 ; 1 refs; reads=1 writes=0; used at $EBF3
Zp68 = $68 ; 2 refs; reads=1 writes=1; used at $C003, C3F7
Zp69 = $69 ; 15 refs; reads=11 writes=4; used at $C085, C096, C0BD, C0E9, +10 more
Zp6A = $6A ; 6 refs; reads=2 writes=4; used at $C08A, C0EB, C1E7, C401, +1 more
Zp6B = $6B ; 31 refs; reads=18 writes=13; used at $C194, C1A8, C205, C219, +26 more
Zp6C = $6C ; 12 refs; reads=4 writes=8; used at $C199, C1AD, C209, C217, +7 more
Zp6D = $6D ; 16 refs; reads=13 writes=3; used at $C00C, C015, C02C, C02E, +11 more
Zp6E = $6E ; 6 refs; reads=3 writes=3; used at $C0CB, C231, C283, C39F, +2 more
Zp6F = $6F ; 14 refs; reads=6 writes=8; used at $C024, C23F, C26A, C275, +9 more
Zp70 = $70 ; 5 refs; reads=1 writes=4; used at $C072, F786, F7F4, F826, +1 more
Zp72 = $72 ; 1 refs; reads=1 writes=0; used at $F85A
Zp74 = $74 ; 5 refs; reads=3 writes=2; used at $C0DB, EBF1, F85E
Zp7F = $7F ; 2 refs; reads=0 writes=2; used at $E832, FA93
Zp81 = $81 ; 1 refs; reads=0 writes=1; used at $E27E
Zp84 = $84 ; 1 refs; reads=1 writes=0; used at $C0D3
Zp85 = $85 ; 1 refs; reads=0 writes=1; used at $E9A0
Zp86 = $86 ; 1 refs; reads=0 writes=1; used at $E995
Zp87 = $87 ; 1 refs; reads=0 writes=1; used at $E98A
Zp89 = $89 ; 1 refs; reads=0 writes=1; used at $E963
Zp8A = $8A ; 4 refs; reads=4 writes=0; used at $C0DD, C0DF, C0E1, C0E3
Zp8B = $8B ; 1 refs; reads=0 writes=1; used at $EDE2
Zp8F = $8F ; 2 refs; reads=0 writes=2; used at $E84B, EDDD
Zp92 = $92 ; 1 refs; reads=0 writes=1; used at $EDD8
ZpA0 = $A0 ; 1 refs; reads=0 writes=1; used at $CC50
ZpA5 = $A5 ; 1 refs; reads=1 writes=0; used at $F0CF
ZpAA = $AA ; 1 refs; reads=1 writes=0; used at $C0E5
ZpC0 = $C0 ; 2 refs; reads=2 writes=0; used at $C0C0, C0C2
ZpD0 = $D0 ; 5 refs; reads=3 writes=2; used at $CC05, CC36, CC4B, CC7F
ZpD1 = $D1 ; 2 refs; reads=0 writes=2; used at $CC19, CC47
ZpD2 = $D2 ; 1 refs; reads=0 writes=1; used at $CC3C
ZpD3 = $D3 ; 1 refs; reads=0 writes=1; used at $CC40
ZpE8 = $E8 ; 4 refs; reads=2 writes=2; used at $CCC5, CCE2, F7BA, F7BC
ZpE9 = $E9 ; 3 refs; reads=2 writes=1; used at $CCCF, F7AB, F7C2
ZpEA = $EA ; 3 refs; reads=2 writes=1; used at $CCCA, F7A9, F7C0
ZpEB = $EB ; 2 refs; reads=0 writes=2; used at $CCDC, F7B6
ZpEC = $EC ; 1 refs; reads=0 writes=1; used at $F7B2
ZpED = $ED ; 3 refs; reads=1 writes=2; used at $CC12, CC34, CC8A
ZpEE = $EE ; 9 refs; reads=6 writes=3; used at $CBFD, CC17, CC2E, CC45, +4 more
ZpEF = $EF ; 5 refs; reads=3 writes=2; used at $CAB4, CAB6, CDBB, CDC9, +1 more
ZpF0 = $F0 ; 14 refs; reads=9 writes=5; used at $CA38, CA3F, CA48, CA4C, +8 more
ZpF1 = $F1 ; 9 refs; reads=5 writes=4; used at $CA24, CA2B, CA2E, CA32, +4 more
ZpF2 = $F2 ; 6 refs; reads=3 writes=3; used at $CA68, CA7F, CA88, CB19, +2 more
ZpF3 = $F3 ; 5 refs; reads=2 writes=3; used at $CA6C, CA83, CA8C, CD4B, +1 more
ZpF4 = $F4 ; 4 refs; reads=2 writes=2; used at $CC20, CC3A, FF01
ZpF5 = $F5 ; 2 refs; reads=1 writes=1; used at $CC24, CC3E
ZpF6 = $F6 ; 68 refs; reads=35 writes=33; used at $CAFB, CAFD, CB01, CB05, +52 more
ZpF7 = $F7 ; 42 refs; reads=20 writes=22; used at $CAF9, CAFF, CB03, CB07, +29 more
ZpF8 = $F8 ; 50 refs; reads=27 writes=23; used at $CFB3, D242, D251, D273, +40 more
ZpF9 = $F9 ; 35 refs; reads=19 writes=16; used at $CFAE, D11D, D120, D24C, +30 more
ZpFA = $FA ; 64 refs; reads=24 writes=40; used at $CB71, CB87, CB95, CB9B, +57 more
ZpFB = $FB ; 63 refs; reads=25 writes=38; used at $CB9D, CBA3, CBCD, CBD5, +54 more
ZpFC = $FC ; 135 refs; reads=55 writes=80; used at $CAA8, CB97, CB99, CBAB, +115 more
ZpFD = $FD ; 101 refs; reads=41 writes=60; used at $CAA3, CB9F, CBA1, CBA9, +84 more
ZpFE = $FE ; 28 refs; reads=15 writes=13; used at $CDD8, CE19, CF9C, CFA8, +24 more
ZpFF = $FF ; 16 refs; reads=7 writes=9; used at $CDD6, CE14, CF9F, CFD7, +12 more
Binary file not shown.
File diff suppressed because it is too large. Load diff
@@ -1,595 +0,0 @@
al 00FF65 .NmiHandler
al 00FF64 .IrqHandler
al 00FF5B .Label_FF5B
al 00FF56 .Label_FF56
al 00FF50 .Label_FF50
al 00FF43 .Label_FF43
al 00FF3D .Label_FF3D
al 00FF2B .Label_FF2B
al 00FF25 .Label_FF25
al 00FF18 .Label_FF18
al 00FF11 .Label_FF11
al 00FF0E .Label_FF0E
al 00FEFE .Label_FEFE
al 00FECD .Label_FECD
al 00FEBD .Label_FEBD
al 00FEC5 .Label_FEC5
al 00FEA8 .Label_FEA8
al 00FE95 .Label_FE95
al 00FE8E .Label_FE8E
al 00FE6A .Label_FE6A
al 00FE5A .Label_FE5A
al 00FE4A .Label_FE4A
al 00FE49 .Label_FE49
al 00FE37 .Label_FE37
al 00FE36 .Label_FE36
al 00FE24 .Label_FE24
al 00FE17 .Label_FE17
al 00FE1A .Label_FE1A
al 00FE1F .Label_FE1F
al 00FE0E .Label_FE0E
al 00FE06 .Label_FE06
al 00FDFE .Label_FDFE
al 00FDFA .Label_FDFA
al 00FDE0 .Label_FDE0
al 00FDD8 .Label_FDD8
al 00FDD4 .Label_FDD4
al 00FDBF .Label_FDBF
al 00FDAA .Label_FDAA
al 00FDA8 .Label_FDA8
al 00FD98 .Label_FD98
al 00FD8B .Label_FD8B
al 00FD85 .Label_FD85
al 00FD88 .Label_FD88
al 00FD60 .Label_FD60
al 00FD32 .Label_FD32
al 00FD2D .Label_FD2D
al 00FC6C .Label_FC6C
al 00FBD1 .Label_FBD1
al 00FBC2 .Label_FBC2
al 00FBA5 .Label_FBA5
al 00FBC1 .Label_FBC1
al 00FB99 .Label_FB99
al 00FB90 .Label_FB90
al 00FB87 .Label_FB87
al 00FB8D .Label_FB8D
al 00FB7A .Label_FB7A
al 00FB69 .Label_FB69
al 00FB4C .Label_FB4C
al 00FB38 .Label_FB38
al 00FB39 .Label_FB39
al 00FB55 .Label_FB55
al 00FB2C .Label_FB2C
al 00FAF9 .Label_FAF9
al 00FAB1 .Label_FAB1
al 00FAB4 .Label_FAB4
al 00FA99 .Label_FA99
al 00FA8D .Label_FA8D
al 00FA8B .Label_FA8B
al 00FA7F .Label_FA7F
al 00FA7D .Label_FA7D
al 00FA6F .Label_FA6F
al 00FA6D .Label_FA6D
al 00FA5F .Label_FA5F
al 00FA56 .Label_FA56
al 00FA4A .Label_FA4A
al 00FA40 .Label_FA40
al 00FA34 .Label_FA34
al 00FA2B .Label_FA2B
al 00FA1F .Label_FA1F
al 00FA26 .Label_FA26
al 00FA07 .Label_FA07
al 00F9F9 .Label_F9F9
al 00F9E4 .Label_F9E4
al 00F9D9 .Label_F9D9
al 00F9D6 .Label_F9D6
al 00F9CE .Label_F9CE
al 00F9BD .Label_F9BD
al 00F9B0 .Label_F9B0
al 00F9AD .Label_F9AD
al 00F9A0 .Label_F9A0
al 00F998 .Label_F998
al 00F990 .Label_F990
al 00F88A .Label_F88A
al 00F87F .Label_F87F
al 00F872 .Label_F872
al 00F867 .Label_F867
al 00F84C .Label_F84C
al 00F81A .Label_F81A
al 00F7E8 .Label_F7E8
al 00F7BC .Label_F7BC
al 00F7A7 .Label_F7A7
al 00F7A5 .Label_F7A5
al 00F77A .Label_F77A
al 00F73F .Label_F73F
al 00F728 .Label_F728
al 00F725 .Label_F725
al 00F71A .Label_F71A
al 00F6CF .Label_F6CF
al 00F6C1 .Label_F6C1
al 00F69D .Label_F69D
al 00F683 .Label_F683
al 00F67D .Label_F67D
al 00F674 .Label_F674
al 00F66B .Label_F66B
al 00F669 .Label_F669
al 00F654 .Label_F654
al 00F5D6 .Label_F5D6
al 00F5C6 .Label_F5C6
al 00F585 .Label_F585
al 00F574 .Label_F574
al 00F56C .Label_F56C
al 00F557 .Label_F557
al 00F54C .Label_F54C
al 00F542 .Label_F542
al 00F540 .Label_F540
al 00F4B1 .Label_F4B1
al 00F4DF .Label_F4DF
al 00F49B .Label_F49B
al 00F4F6 .Label_F4F6
al 00F487 .Label_F487
al 00F476 .Label_F476
al 00F457 .Label_F457
al 00F44D .Label_F44D
al 00F435 .Label_F435
al 00F41B .Label_F41B
al 00F413 .Label_F413
al 00F410 .Label_F410
al 00F406 .Label_F406
al 00F3E4 .Label_F3E4
al 00F3D2 .Label_F3D2
al 00F3AD .Label_F3AD
al 00F3BB .Label_F3BB
al 00F387 .Label_F387
al 00F36E .Label_F36E
al 00F377 .Label_F377
al 00F365 .Label_F365
al 00F344 .Label_F344
al 00F33D .Label_F33D
al 00F341 .Label_F341
al 00F327 .Label_F327
al 00F31F .Label_F31F
al 00F312 .Label_F312
al 00F30F .Label_F30F
al 00F302 .Label_F302
al 00F2EC .Label_F2EC
al 00F2E5 .Label_F2E5
al 00F2DB .Label_F2DB
al 00F2CB .Label_F2CB
al 00F270 .Label_F270
al 00F25B .Label_F25B
al 00F241 .Label_F241
al 00F244 .Label_F244
al 00F238 .Label_F238
al 00F233 .Label_F233
al 00F225 .Label_F225
al 00F221 .Label_F221
al 00F218 .Label_F218
al 00F211 .Label_F211
al 00F206 .Label_F206
al 00F1F6 .Label_F1F6
al 00F1E2 .Label_F1E2
al 00F1D3 .Label_F1D3
al 00F1B9 .Label_F1B9
al 00F1AF .Label_F1AF
al 00F1BC .Label_F1BC
al 00F19A .Label_F19A
al 00F193 .Label_F193
al 00F16A .Label_F16A
al 00F149 .Label_F149
al 00F13F .Label_F13F
al 00F148 .Label_F148
al 00F125 .Label_F125
al 00F0EF .Label_F0EF
al 00F0DF .Label_F0DF
al 00F0DC .Label_F0DC
al 00F0CE .Label_F0CE
al 00F07B .Label_F07B
al 00F071 .Label_F071
al 00F07E .Label_F07E
al 00F04D .Label_F04D
al 00F031 .Label_F031
al 00F019 .Label_F019
al 00F017 .Label_F017
al 00F037 .Label_F037
al 00EFF5 .Label_EFF5
al 00F045 .Label_F045
al 00EFD9 .Label_EFD9
al 00EFD5 .Label_EFD5
al 00EFB4 .Label_EFB4
al 00EFB8 .Label_EFB8
al 00EF84 .Label_EF84
al 00EF53 .Label_EF53
al 00EF50 .Label_EF50
al 00EF3A .Label_EF3A
al 00EF31 .Label_EF31
al 00EF27 .Label_EF27
al 00EEF0 .Label_EEF0
al 00EEE0 .Label_EEE0
al 00EEE6 .Label_EEE6
al 00EEB9 .Label_EEB9
al 00EE80 .Label_EE80
al 00EE76 .Label_EE76
al 00EE79 .Label_EE79
al 00EE6F .Label_EE6F
al 00EE57 .Label_EE57
al 00EE53 .Label_EE53
al 00EE3E .Label_EE3E
al 00EE3A .Label_EE3A
al 00EE2C .Label_EE2C
al 00EE30 .Label_EE30
al 00EDBA .Label_EDBA
al 00EDB7 .Label_EDB7
al 00ED8B .Label_ED8B
al 00ED86 .Label_ED86
al 00ED5D .Label_ED5D
al 00ED4F .Label_ED4F
al 00EBB0 .Label_EBB0
al 00E9CC .Label_E9CC
al 00E9CA .Label_E9CA
al 00E980 .Label_E980
al 00E974 .Label_E974
al 00E971 .Label_E971
al 00E95D .Label_E95D
al 00E947 .Label_E947
al 00E928 .Label_E928
al 00E923 .Label_E923
al 00E8FF .Label_E8FF
al 00E8B3 .Label_E8B3
al 00E88F .Label_E88F
al 00E882 .Label_E882
al 00E880 .Label_E880
al 00E852 .Label_E852
al 00E848 .Label_E848
al 00E830 .Label_E830
al 00E81E .Label_E81E
al 00E817 .Label_E817
al 00E80C .Reset
al 00E802 .Label_E802
al 00E7C0 .Label_E7C0
al 00E7B5 .Label_E7B5
al 00E7B1 .Label_E7B1
al 00E78B .Label_E78B
al 00E7A6 .Label_E7A6
al 00E771 .Label_E771
al 00E76D .Label_E76D
al 00E748 .Label_E748
al 00E763 .Label_E763
al 00E721 .Label_E721
al 00E71D .Label_E71D
al 00E71B .Label_E71B
al 00E71C .Label_E71C
al 00E706 .Label_E706
al 00E70F .Label_E70F
al 00E6F7 .Label_E6F7
al 00E6F8 .Label_E6F8
al 00E6E4 .Label_E6E4
al 00E6ED .Label_E6ED
al 00E6D9 .Label_E6D9
al 00E6D0 .Label_E6D0
al 00E696 .Label_E696
al 00E68C .Label_E68C
al 00E683 .Label_E683
al 00E67A .Label_E67A
al 00E63E .Label_E63E
al 00E60B .Label_E60B
al 00E60A .Label_E60A
al 00E5F2 .Label_E5F2
al 00E5DF .Label_E5DF
al 00E5E7 .Label_E5E7
al 00E5FE .Label_E5FE
al 00E598 .Label_E598
al 00E586 .Label_E586
al 00E582 .Label_E582
al 00E572 .Label_E572
al 00E570 .Label_E570
al 00E564 .Label_E564
al 00E57B .Label_E57B
al 00E550 .Label_E550
al 00E54A .Label_E54A
al 00E53E .Label_E53E
al 00E517 .Label_E517
al 00E50B .Label_E50B
al 00E4F9 .Label_E4F9
al 00E4DC .Label_E4DC
al 00E4E6 .Label_E4E6
al 00E4C1 .Label_E4C1
al 00E4B9 .Label_E4B9
al 00E4AA .Label_E4AA
al 00E48D .Label_E48D
al 00E473 .Label_E473
al 00E43B .Label_E43B
al 00E47B .Label_E47B
al 00E429 .Label_E429
al 00E417 .Label_E417
al 00E415 .Label_E415
al 00E40E .Label_E40E
al 00E405 .Label_E405
al 00E3FB .Label_E3FB
al 00E3E7 .Label_E3E7
al 00E3CE .Label_E3CE
al 00E3BF .Label_E3BF
al 00E3BE .Label_E3BE
al 00E3B1 .Label_E3B1
al 00E3AB .Label_E3AB
al 00E3AF .Label_E3AF
al 00E39C .Label_E39C
al 00E392 .Label_E392
al 00E39A .Label_E39A
al 00E381 .Label_E381
al 00E37C .Label_E37C
al 00E370 .Label_E370
al 00E367 .Label_E367
al 00E364 .Label_E364
al 00E34A .Label_E34A
al 00E349 .Label_E349
al 00E341 .Label_E341
al 00E333 .Label_E333
al 00E322 .Label_E322
al 00E31D .Label_E31D
al 00E318 .Label_E318
al 00E30F .Label_E30F
al 00E30D .Label_E30D
al 00E304 .Label_E304
al 00E2FE .Label_E2FE
al 00E2DB .Label_E2DB
al 00E2D7 .Label_E2D7
al 00E2C8 .Label_E2C8
al 00E2BB .Label_E2BB
al 00E2B2 .Label_E2B2
al 00E2A2 .Label_E2A2
al 00E286 .Label_E286
al 00E275 .Label_E275
al 00E270 .Label_E270
al 00E25C .Label_E25C
al 00E24F .Label_E24F
al 00E240 .Label_E240
al 00E22F .Label_E22F
al 00E215 .Label_E215
al 00E20D .Label_E20D
al 00E202 .Label_E202
al 00E1F2 .Label_E1F2
al 00E1ED .Label_E1ED
al 00E1BB .Label_E1BB
al 00E1AE .Label_E1AE
al 00E1AC .Label_E1AC
al 00E1E5 .Label_E1E5
al 00E1A4 .Label_E1A4
al 00E19D .Label_E19D
al 00E194 .Label_E194
al 00E17C .Label_E17C
al 00E171 .Label_E171
al 00E162 .Label_E162
al 00E15D .Label_E15D
al 00E147 .Label_E147
al 00E145 .Label_E145
al 00E14E .Label_E14E
al 00E118 .Label_E118
al 00E113 .Label_E113
al 00E0E7 .Label_E0E7
al 00E0E3 .Label_E0E3
al 00E0FE .Label_E0FE
al 00E0E1 .Label_E0E1
al 00E104 .Label_E104
al 00E0BA .Label_E0BA
al 00E0B1 .Label_E0B1
al 00E0A4 .Label_E0A4
al 00E089 .Label_E089
al 00E094 .Label_E094
al 00E079 .Label_E079
al 00E055 .Label_E055
al 00E062 .Label_E062
al 00E048 .Label_E048
al 00E040 .Label_E040
al 00E02F .Label_E02F
al 00E01E .Label_E01E
al 00D4ED .Label_D4ED
al 00D4E4 .Label_D4E4
al 00D4CC .Label_D4CC
al 00D4C4 .Label_D4C4
al 00D4BD .Label_D4BD
al 00D4B6 .Label_D4B6
al 00D4AF .Label_D4AF
al 00D4AD .Label_D4AD
al 00D48F .Label_D48F
al 00D488 .Label_D488
al 00D487 .Label_D487
al 00D45E .Label_D45E
al 00D444 .Label_D444
al 00D449 .Label_D449
al 00D45D .Label_D45D
al 00D41F .Label_D41F
al 00D405 .Label_D405
al 00D400 .Label_D400
al 00D3E5 .Label_D3E5
al 00D41E .Label_D41E
al 00D3D3 .Label_D3D3
al 00D3CB .Label_D3CB
al 00D3BF .Label_D3BF
al 00D3B3 .Label_D3B3
al 00D3A0 .Label_D3A0
al 00D39F .Label_D39F
al 00D392 .Label_D392
al 00D31B .Label_D31B
al 00D317 .Label_D317
al 00D30D .Label_D30D
al 00D2DF .Label_D2DF
al 00D300 .Label_D300
al 00D2D4 .Label_D2D4
al 00D29C .Label_D29C
al 00D291 .Label_D291
al 00D28F .Label_D28F
al 00D22C .Label_D22C
al 00D222 .Label_D222
al 00D212 .Label_D212
al 00D20A .Label_D20A
al 00D1BA .Label_D1BA
al 00D197 .Label_D197
al 00D174 .Label_D174
al 00D151 .Label_D151
al 00D129 .Label_D129
al 00D12C .Label_D12C
al 00D0F3 .Label_D0F3
al 00D0E4 .Label_D0E4
al 00D0D5 .Label_D0D5
al 00D073 .Label_D073
al 00D088 .Label_D088
al 00D0C3 .Label_D0C3
al 00D0B1 .Label_D0B1
al 00D047 .Label_D047
al 00D03D .Label_D03D
al 00D05B .Label_D05B
al 00D02D .Label_D02D
al 00D026 .Label_D026
al 00D017 .Label_D017
al 00D00D .Label_D00D
al 00D004 .Label_D004
al 00CFE5 .Label_CFE5
al 00CFDE .Label_CFDE
al 00CFA6 .Label_CFA6
al 00CF9B .Label_CF9B
al 00CE25 .Label_CE25
al 00CE14 .Label_CE14
al 00CDF4 .Label_CDF4
al 00CDE4 .Label_CDE4
al 00CE09 .Label_CE09
al 00CDDA .Label_CDDA
al 00CDD3 .Label_CDD3
al 00CDB9 .Label_CDB9
al 00CDAE .Label_CDAE
al 00CD9D .Label_CD9D
al 00CD73 .Label_CD73
al 00CD7E .Label_CD7E
al 00CD65 .Label_CD65
al 00CD5F .Label_CD5F
al 00CD58 .Label_CD58
al 00CD3C .Label_CD3C
al 00CD1C .Label_CD1C
al 00CD0E .Label_CD0E
al 00CCF3 .Label_CCF3
al 00CCD9 .Label_CCD9
al 00CCE5 .Label_CCE5
al 00CCA9 .Label_CCA9
al 00CCBA .Label_CCBA
al 00CC91 .Label_CC91
al 00CC8F .Label_CC8F
al 00CC7D .Label_CC7D
al 00CC7B .Label_CC7B
al 00CC49 .Label_CC49
al 00CC5E .Label_CC5E
al 00CC2E .Label_CC2E
al 00CC29 .Label_CC29
al 00CC12 .Label_CC12
al 00CC05 .Label_CC05
al 00CBFD .Label_CBFD
al 00CBFB .Label_CBFB
al 00CBF4 .Label_CBF4
al 00CBE5 .Label_CBE5
al 00CBDC .Label_CBDC
al 00CBC9 .Label_CBC9
al 00CBC8 .Label_CBC8
al 00CBB9 .Label_CBB9
al 00CBB2 .Label_CBB2
al 00CBAE .Label_CBAE
al 00CBA9 .Label_CBA9
al 00CB92 .Label_CB92
al 00CB82 .Label_CB82
al 00CB7F .Label_CB7F
al 00CB6F .Label_CB6F
al 00CB69 .Label_CB69
al 00CB66 .Label_CB66
al 00CB61 .Label_CB61
al 00CB5A .Label_CB5A
al 00CB4F .Label_CB4F
al 00CB50 .Label_CB50
al 00CB45 .Label_CB45
al 00CB39 .Label_CB39
al 00CB30 .Label_CB30
al 00CB2B .Label_CB2B
al 00CB25 .Label_CB25
al 00CB1D .Label_CB1D
al 00CAF7 .Label_CAF7
al 00CABD .Label_CABD
al 00CAB9 .Label_CAB9
al 00CAAE .Label_CAAE
al 00CAA3 .Label_CAA3
al 00CA8F .Label_CA8F
al 00CA86 .Label_CA86
al 00CA77 .Label_CA77
al 00CA6F .Label_CA6F
al 00CA60 .Label_CA60
al 00CA52 .Label_CA52
al 00CA48 .Label_CA48
al 00CA42 .Label_CA42
al 00CA3C .Label_CA3C
al 00CA38 .Label_CA38
al 00CA2E .Label_CA2E
al 00CA21 .Label_CA21
al 00C475 .Label_C475
al 00C445 .Label_C445
al 00C471 .Label_C471
al 00C429 .Label_C429
al 00C415 .Label_C415
al 00C416 .Label_C416
al 00C409 .Label_C409
al 00C404 .Label_C404
al 00C401 .Label_C401
al 00C3FC .Label_C3FC
al 00C3F5 .Label_C3F5
al 00C3F0 .Label_C3F0
al 00C3EB .Label_C3EB
al 00C3E0 .Label_C3E0
al 00C3DA .Label_C3DA
al 00C3C7 .Label_C3C7
al 00C3BE .Label_C3BE
al 00C3BC .Label_C3BC
al 00C3AE .Label_C3AE
al 00C392 .Label_C392
al 00C38A .Label_C38A
al 00C39F .Label_C39F
al 00C331 .Label_C331
al 00C332 .Label_C332
al 00C321 .Label_C321
al 00C32A .Label_C32A
al 00C314 .Label_C314
al 00C304 .Label_C304
al 00C2FE .Label_C2FE
al 00C2EC .Label_C2EC
al 00C306 .Label_C306
al 00C2CB .Label_C2CB
al 00C2CA .Label_C2CA
al 00C2BB .Label_C2BB
al 00C2B8 .Label_C2B8
al 00C2AD .Label_C2AD
al 00C29E .Label_C29E
al 00C294 .Label_C294
al 00C28D .Label_C28D
al 00C275 .Label_C275
al 00C286 .Label_C286
al 00C22F .Label_C22F
al 00C21C .Label_C21C
al 00C20C .Label_C20C
al 00C205 .Label_C205
al 00C200 .Label_C200
al 00C1DA .Label_C1DA
al 00C1D5 .Label_C1D5
al 00C1D1 .Label_C1D1
al 00C1C0 .Label_C1C0
al 00C1A2 .Label_C1A2
al 00C18D .Label_C18D
al 00C0C0 .Label_C0C0
al 00C0A9 .Label_C0A9
al 00C0A1 .Label_C0A1
al 00C092 .Label_C092
al 00C082 .Label_C082
al 00C07C .Label_C07C
al 00C072 .Label_C072
al 00C06A .Label_C06A
al 00C054 .Label_C054
al 00C05F .Label_C05F
al 00C02E .Label_C02E
al 00C024 .Label_C024
al 00C01B .Label_C01B
al 00C00C .Label_C00C
al 00C00A .Label_C00A
al 00C003 .Label_C003
@@ -1,26 +0,0 @@
Modules list:
-------------
prg.o:
PRG Offs=000000 Size=004000 Align=00001 Fill=0000
Segment list:
-------------
Name Start End Size Align
----------------------------------------------------
PRG 00C000 00FFFF 004000 00001
Exports list by name:
---------------------
Exports list by value:
----------------------
Imports list:
-------------
Binary file not shown.
-108
View File
@@ -1,108 +0,0 @@
; =============================================================================
; Nintendo Entertainment System hardware symbols
; =============================================================================
; -----------------------------------------------------------------------------
; PPU registers
; -----------------------------------------------------------------------------
PPUCTRL = $2000
PPUMASK = $2001
PPUSTATUS = $2002
OAMADDR = $2003
OAMDATA = $2004
PPUSCROLL = $2005
PPUADDR = $2006
PPUDATA = $2007
OAMDMA = $4014
; -----------------------------------------------------------------------------
; Controller ports
;
; $4016:
; Write: controller strobe
; Read: controller port 1
;
; $4017:
; Read: controller port 2
; Write: APU frame counter
; -----------------------------------------------------------------------------
JOY1 = $4016
JOY2 = $4017
; -----------------------------------------------------------------------------
; APU pulse channel 1
; -----------------------------------------------------------------------------
APUPULSE1CTRL = $4000
APUPULSE1SWEEP = $4001
APUPULSE1TIMERLO = $4002
APUPULSE1TIMERHI = $4003
; -----------------------------------------------------------------------------
; APU pulse channel 2
; -----------------------------------------------------------------------------
APUPULSE2CTRL = $4004
APUPULSE2SWEEP = $4005
APUPULSE2TIMERLO = $4006
APUPULSE2TIMERHI = $4007
; -----------------------------------------------------------------------------
; APU triangle channel
; -----------------------------------------------------------------------------
APUTRIANGLECTRL = $4008
APUTRIANGLETIMERLO = $400A
APUTRIANGLETIMERHI = $400B
; -----------------------------------------------------------------------------
; APU noise channel
; -----------------------------------------------------------------------------
APUNOISECTRL = $400C
APUNOISEPERIOD = $400E
APUNOISELENGTH = $400F
; -----------------------------------------------------------------------------
; APU DMC channel
; -----------------------------------------------------------------------------
APUDMCCTRL = $4010
APUDMCDIRECT = $4011
APUDMCADDR = $4012
APUDMCLENGTH = $4013
; -----------------------------------------------------------------------------
; APU status and frame counter
;
; $4015:
; Write: enable or disable the five APU channels
; Read: channel and interrupt status
;
; $4017:
; Write: APU frame-counter mode and IRQ inhibit
; Read: controller port 2
; -----------------------------------------------------------------------------
APUSTATUS = $4015
APUFRAMECOUNTER = $4017
; -----------------------------------------------------------------------------
; Controller masks
; -----------------------------------------------------------------------------
PAD_RIGHT = $01
PAD_LEFT = $02
PAD_DOWN = $04
PAD_UP = $08
PAD_START = $10
PAD_SELECT = $20
PAD_B = $40
PAD_A = $80
PAD_HORIZONTAL = PAD_LEFT | PAD_RIGHT
PAD_VERTICAL = PAD_UP | PAD_DOWN
PAD_DPAD = PAD_HORIZONTAL | PAD_VERTICAL