Promotes Lunar Pool
This commit is contained in:
1 parent
837007843d
commit
62866563ba
53 files changed
+115746
-4100
No files matched your search
Binary file not shown.
@@ -0,0 +1,268 @@
|
||||
# Lunar Pool (U)
|
||||
|
||||
ROM: `Lunar Pool (U).nes` (24,592 bytes, iNES). Status: **PASSES 1-3 COMPLETE; PROMOTED TO THE TOP LEVEL 2026-10-18** — 5,300 instructions / **11,077 code bytes (67.6%)** / 5,301 data bytes / the 6 vector bytes as `.word`, byte accounting exact (11,077 + 5,301 + 6 = 16,384), and **BYTE-IDENTICAL for the whole ROM** (header + PRG + CHR) via `cmp reconstructed.nes rom.nes`. Pass 2 named all **705** labels — `Label_<addr>` is gone — and Pass 3 named 33 data structures and finished the zero-page audit (38 semantic aliases, 66 deliberately neutral `ZpXX`, ten former phantom aliases deleted). The ~354 bytes the CDL could not settle stay `.byte` on purpose; they are itemised under *Known remaining gaps*.
|
||||
|
||||
|
||||
## 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 | Vertical |
|
||||
| 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 — the tracer has to seed it explicitly (`--extra-seed 0xE80C`) |
|
||||
| IRQ | `$FF64` | a bare `rti` sitting immediately before the NMI handler, so IRQs are effectively ignored |
|
||||
|
||||
## 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** | Static code/data split, then reclassified against a Mesen Code Data Logger capture (see below). As Pass 1 delivered it: 5,285 instructions / **11,041 bytes emitted as instructions (67.4%)** / 5,343 bytes emitted as data (`.byte`, plus the six vector bytes as `.word`); 11,041 + 5,343 = 16,384 exactly. Labels: 640 `Label_<addr>` plus `Reset`/`NmiHandler`/`IrqHandler`. |
|
||||
| Pass 2 | **Complete** | NES hardware constants in `symbols.inc`; zero-page aliases in `locals.inc`; and **all 705 labels named — `Label_<addr>` is gone from the file**. 17 dispatch targets that carried no label at all (`UpdateObjects_Render_Sound` `$C05C`, `SetupRound` `$EB60`, `PrintStageNumber` `$E21A`, `SetPpuAddr` `$F989`, …) were given labels and routine headers. Naming rule used: PascalCase for `jsr`/`jmp` targets and logical block heads, `<Block>_<Role>` (`_Loop`, `_Next`, `_Alt`, `_Done`, `_Skip`, `_Return`, `_Store`, …) for targets *inside* a routine; `jsr`/`jmp` operands stay raw numeric — this file's convention, as in `Joypad Test Cartridge (U)` — while branch operands are symbolic. (Earlier revisions claimed 218 entries renamed, 195 of them `SubC<addr>`; no `SubC` label ever existed — `git log -S SubC` finds no commit that added one.) |
|
||||
| Pass 3 | **Complete** | Zero-page audit: **38 semantic aliases** (object core, VRAM write queue, VRAM read-back, PPU helpers) and **66 neutral `ZpXX`** whose roles are documented as deliberately unproven in `locals.inc`. Data structures: **33 tables/blocks named** (table below). Vectors are `.word NmiHandler, Reset, IrqHandler`. What is still unnamed is the residue listed under *Known remaining gaps* — it stays `.byte` on purpose. |
|
||||
|
||||
## Pass 3 — the named data structures
|
||||
|
||||
33 tables and blocks were named. The code in this ROM bases several tables one entry
|
||||
early (`lda $C478,y`, `lda $D4F8,y`, `lda $E9B9,x`), so entry 0 is dead and the label
|
||||
sits on the first *live* entry; that is noted per table in `prg.s`.
|
||||
|
||||
| Address | Label | What it is |
|
||||
|---------|-------|-----------|
|
||||
| `$C000` | `ResetStub` | Unreachable three-byte `jmp Reset` — the reset vector points at `$E80C` directly |
|
||||
| `$C0C0` | `ObjectOpcodeHandlerTable` | 19 words: object-script opcodes `$80`-`$92` → handler address − 1 |
|
||||
| `$C3B4` | `SoundChannelMask` | `01 02 04 08 FE FD FB F7` — APU channel mask/enable bytes |
|
||||
| `$C47A` | `ObjectStatePointerTable` | 84 words: per-object state pointers, indexed by `(obj_ptr_lo + $0519,x) * 2` |
|
||||
| `$C522` | `SpawnObjectTable` | 16 words: spawn-record pointers for ids 1-15 (id 0 dead), picked from the `$0060-$0067` queue |
|
||||
| `$C543` | `StateTimerTable` | Per-state timers `1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,0`, indexed by script opcode − `$DF` |
|
||||
| `$C552` | `AnimationPointerTable` | Frame-sequence pointers |
|
||||
| `$C559` | `SpriteAnimationTable` | Per-sprite animation descriptors used by the draw path |
|
||||
| `$CF40` | `VsCommandList` | Inline `RunCommandList` script issued when loading a VS-COMP scene |
|
||||
| `$D057` | `DrawCellRun_TileTable` | Corner tiles `$3C $69 $C3 $96` selected by row bits in `DrawCellRun` |
|
||||
| `$D4FA` | `LayoutScriptTable` | 30 words: per-stage layout-script pointers |
|
||||
| `$D559` | `LayoutData` | 2,757 bytes of per-stage layout records |
|
||||
| `$E862` | `BootSignatureText` | `"JEMINI DAZO!!"` plus the warm-boot signature compared against the RAM copy at `$0440-$044F`; the title attribute row at `$E870-$E87F` overlaps its tail |
|
||||
| `$E9A3` | `TitleColorCycleTable` | 22 colour codes cycled into the `$0085-$0087` palette shadow each frame |
|
||||
| `$E9B9` | `StartGameAttributeRow` | 16 attribute bytes copied to the `$0140-$014F` shadow when a game starts |
|
||||
| `$EA00` | `TitleCommandList` | Inline `RunCommandList` script for the title screen |
|
||||
| `$EC2A` | `StageAttributeTable` | 16 per-stage attribute bytes copied to the attribute shadow |
|
||||
| `$ED3F` | `SpritePaletteTable` | 4 × 4 sprite palettes, copied to the `$0090-$009F` palette shadow by `Reset_LoadSpritePalettes` |
|
||||
| `$EEE9` | `BallAppearTiles` | Tiles for the ball-appear step animation (indexed by the step at `$0340`) |
|
||||
| `$EF2A` | `BallSinkTiles` | Tiles for the ball-sink step animation |
|
||||
| `$F098` | `TileCollisionTable` | 27 words: collision flags per tile |
|
||||
| `$F5E4` | `EndingCommandList` | Inline `RunCommandList` script for the ending screen |
|
||||
| `$F762` | `AimPhaseTable0` | Three parallel 8-byte colour sequences shimmered into the `$008B`/`$008F`/`$0092` palette shadow while aiming |
|
||||
| `$F786` | `StrPlayer1`, `StrShot`, `StrPlayer2`, `StrGameOver`, `StrPlayer3`, `StrHiScore`, `StrPerfect` | The seven `jsr $CBDC` inline strings ($F786-$F861) |
|
||||
| `$FAC9` | `PaletteColorTable` | 12 rows of 4 colour codes → PPU palette entries (`MapColorCodeToPalette`) |
|
||||
| `$FECE` | `SineTable` | 64 entries read by `GetSine` |
|
||||
| `$FF90` | `PaddingFf` | 106 bytes of `$FF` filler between the last table and the vectors |
|
||||
|
||||
|
||||
|
||||
The Pass 1 split came from a static trace only, and a static trace cannot see code that
|
||||
is reached through computed dispatch, nor can it tell inline string data from an
|
||||
instruction that happens to decode from the same bytes. Both errors were present.
|
||||
|
||||
Ground truth came from the emulator: Mesen's Code Data Logger marks every byte the CPU
|
||||
**fetched as an opcode** (Code) and every byte it **read as data** (Data). Playing the
|
||||
ROM through title → 1P → game over → VS COMP marked 10,028 PRG bytes Code (61.2%) and
|
||||
1,534 Data; that is the classification oracle for every byte it observed. Where the CDL
|
||||
is silent the previous classification is kept, never guessed.
|
||||
|
||||
| | code bytes | data bytes |
|
||||
|---|---|---|
|
||||
| As originally emitted by Pass 1 | 9,403 | 6,981 |
|
||||
| After the CDL reclassification | **11,041** | **5,343** |
|
||||
|
||||
1,738 bytes that Pass 1 had emitted as `.byte` are executed code and are now
|
||||
instructions; 100 bytes it had emitted as instructions are read as data and are now
|
||||
`.byte`.
|
||||
|
||||
The result reconciles with the CDL exactly, with no disagreement in either direction:
|
||||
|
||||
| emitted as | CDL says Code | CDL says Data | CDL never saw it |
|
||||
|---|---:|---:|---:|
|
||||
| instructions | 10,028 | **0** | 1,013 |
|
||||
| data (`.byte`/`.word`) | **0** | 1,534 | 3,809 |
|
||||
|
||||
Every byte the CDL observed is therefore classified the way the CPU used it. The 1,013
|
||||
instruction bytes the CDL never saw are Pass 1 static code plus the two inference steps
|
||||
below; the 3,809 unseen data bytes are the residue — 45 of them carry an undocumented
|
||||
opcode's disassembly in the audit comment (Pass 1 read them as code statically, but the
|
||||
CDL never watched the session fetch them, and ca65 V2.19 cannot encode those opcodes
|
||||
anyway, so they stay `.byte` with the disassembly recorded).
|
||||
|
||||
As an independent structural check, all 1,183 control-flow targets in the file — 633
|
||||
`jsr`/`jmp` operands and 550 branch targets — land exactly on an instruction boundary;
|
||||
none points into an operand or a `.byte` run.
|
||||
|
||||
The rewrite is reproducible with `_tools/cdl_reclass.py` (dry run by default). Capture a
|
||||
CDL from the Mesen MCP with
|
||||
`mesen_cdl_file(action:'save', memoryType:'NesPrgRom', filepath:'lunar.cdl')` — the
|
||||
capture is cumulative, so it does not reset — then:
|
||||
|
||||
```bash
|
||||
python3 _tools/cdl_reclass.py --dir "copilot" --cdl lunar.cdl \
|
||||
--override 0xC0C0-0xC0E5:D \
|
||||
--override 0xF81A-0xF825:C --override 0xF826-0xF82E:D --override 0xF82F-0xF83A:C \
|
||||
--override 0xF83B-0xF846:D --override 0xF847-0xF84B:C --override 0xF84C-0xF857:C \
|
||||
--override 0xF858-0xF861:D --override 0xF862-0xF866:C
|
||||
```
|
||||
|
||||
Its output differs from this `prg.s` only in this provenance header, the `.word` vector
|
||||
split, and three `jsr Label_CAA3` → `jsr $CAA3` operand spellings (this file spells
|
||||
`jsr`/`jmp` operands as raw addresses and branch operands as `Label_<addr>`). Always run
|
||||
`make` afterwards.
|
||||
|
||||
Two inference steps were needed beyond the CDL because the capture never reached the
|
||||
hi-score screen. They are marked as inference, not ground truth:
|
||||
|
||||
* `$C0C0–$C0E5` is a 19-entry little-endian 16-bit pointer table (read as
|
||||
`lda $C0C0,y` / `lda $C0C1,y`). Pass 1 had decoded it as a `cmp (ZpXX,x)` chain; the
|
||||
CDL only observed the few entries the current game state walked. Code resumes at
|
||||
`$C0E6` (`tax`), which is a real branch target from `$C101`.
|
||||
* `$F81A` (hi-score) and `$F84C` ("perfect") are text routines. They are never reached
|
||||
in normal play until a hi-score is beaten, so the CDL is silent; their inline-string
|
||||
structure is inferred from the CDL-confirmed twins `$F77A` and `$F7E8`.
|
||||
|
||||
### The inline-string dispatcher (this is not a jump gate)
|
||||
|
||||
`$CBDC` (and its variant `$CBC9`, which also clears the PPU destination first) is a
|
||||
**print-inline-string-and-return-after-it** helper:
|
||||
|
||||
```
|
||||
$CBDC pla / sta ptr_lo ; pop the caller's return address = the string address
|
||||
$CBDF pla / sta ptr_hi
|
||||
$CBE2 jsr $CB5A ; prepare the PPU destination
|
||||
$CBE5 ldy #$00
|
||||
$CBE7 lda (ptr_lo),y ; next character
|
||||
$CBE9 beq $CBF4 ; $00 terminates
|
||||
$CBEB jsr $CC29 ; emit it (advances ptr_lo/hi)
|
||||
$CBEE jsr $CB5A
|
||||
$CBF1 jmp $CBE5
|
||||
$CBF4 lda ptr_hi / pha ; push the address of the byte after the $00 ...
|
||||
$CBF7 lda ptr_lo / pha
|
||||
$CBFA rts ; ... and rts to it
|
||||
```
|
||||
|
||||
So every `jsr $CBDC` in the image is immediately followed by a `$00`-terminated string
|
||||
that begins with the control byte `$81` (`$81` also acts as the word separator), and
|
||||
execution resumes after the terminator:
|
||||
|
||||
| site | bytes | text |
|
||||
|------|-------|------|
|
||||
| `$F786` | `$81player$81$00` | player |
|
||||
| `$F79B` | `$81shot$81$00` | shot |
|
||||
| `$F7F4` | `$81player$81$00` | player |
|
||||
| `$F809` | `$81game$81over$81$00` | game over |
|
||||
| `$F826` | `$81player$81$00` | player |
|
||||
| `$F83B` | ``$81hi`score__$00`` | hi`score__ |
|
||||
| `$F858` | `$81perfect_$00` | perfect_ |
|
||||
|
||||
**Earlier revisions of this document claimed a `jmp ($7961)` RAM-pointer dispatch at
|
||||
`$F788`/`$F7F6`/`$F828`. That was a flat-tracer phantom.** The bytes after `jsr $CBDC`
|
||||
are the strings above; the decoder happened to start an instruction two bytes into
|
||||
`player`, reading `$6C $61 $79` as `jmp ($7961)` — the operand is the middle of the word
|
||||
"player". Nothing in the ROM ever writes `$7961`/`$7962`, and `$6000–$7FFF` is unmapped
|
||||
on NROM, so such a jump could not work. The three sites are gone from the classification;
|
||||
no instruction in the corrected file is an indirect `jmp`.
|
||||
|
||||
The genuine computed dispatch that remains is small and resolved. `$CBE5` re-reads its
|
||||
string pointer through `ptr_lo`/`ptr_hi` and re-enters its loop with it — plain code.
|
||||
`$F193` does the reverse: it pushes `Zp17`/`Zp16` and `rts`es, so a caller sets that pair
|
||||
and the `rts` transfers control to it; the pattern is named in `locals.inc` and every
|
||||
target is inside CDL-covered code.
|
||||
|
||||
### Code the CDL proved but Pass 1 missed (largest runs)
|
||||
|
||||
| Range | Bytes | What it is |
|
||||
|-------|------:|-----------|
|
||||
| `$EA00–$EBAF` | 432 | VS-COMP / select-screen logic (`$EB16` is still unreached and stays data) |
|
||||
| `$EBF3–$ED4E` | 348 | menu/round state machine |
|
||||
| `$CE35–$CF9A` | 358 | collision/entity maths |
|
||||
| `$D4FA–$E01D` | 2,852 | `$D4FA` 30-entry pointer table (`$D4FA–$D535`), the 35-byte code helper at `$D536–$D558`, then variable-length records from `$D559` |
|
||||
| `$F897–$F98F` | 249 | high-score / attract handling |
|
||||
| `$C0F2–$C18C` | 155 | object update chain (branches back to `$C0E6`) |
|
||||
| `$D325–$D391`, `$D2A0–$D2D3`, `$D1BB–$D209` | 240 | further record/table walkers |
|
||||
|
||||
### Tracer fixes required during Pass 1
|
||||
|
||||
Three undocumented opcodes were missing from `_tools/nesdis.py` and were added, with the
|
||||
`--undocumented` switch (default off, so existing `make regen` pipelines stay byte-stable):
|
||||
|
||||
* `$72` — `RRA abs` (the `RRA` family had `$63`/`$67`/`$6F`/`$73`/`$77`/`$7B`/`$7F` but not `$72`).
|
||||
* `$42` — `NOP #imm` (the family had `$80`/`$82`/`$89`/`$C2`/`$E2` but not `$42`).
|
||||
* `$FA` — `NOP abs,X` (the family had `$1C`/`$3C`/`$5C`/`$7C`/`$DC`/`$FC` but not `$FA`).
|
||||
|
||||
One emitter fix: ca65 silently rewrites an operand whose high byte is `$00` into 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 static tracer reported two overlaps (`$C3BB` — resolved with `--data 0xC3BB:1` —
|
||||
and `$F0EF`) and three rejected mis-aligned stubs. The residue that remains is the
|
||||
CDL's: 5,343 bytes (32.6%) are still emitted as data (`.byte`, plus the six vector
|
||||
bytes as `.word`).
|
||||
* Unreached in the CDL session, therefore still unclassified: the hi-score entry screen
|
||||
(`$F81A`+ / `$F84C`+ are inferred by symmetry, above), the 2-player-only branches, and
|
||||
`$EB16` (a poll loop behind `beq` at `$EB11`, emitted as a raw `beq *+$05`).
|
||||
* `locals.inc` carries 104 aliases: **38 semantic** (see the Pass 3 notes at the foot of
|
||||
the file) and 66 neutral `ZpXX`. Ten further aliases were deleted by the
|
||||
reclassification: they were phantoms — `$49`/`$84`/`$8A`/`$AA`/`$C0` came from the
|
||||
mis-decoded `$C0C0` table, and `$3B`/`$65`/`$67`/`$72`/`$81` were ASCII characters of
|
||||
the inline strings read as operands.
|
||||
|
||||
## `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` | disassembly: 5,285 instructions with per-instruction address/byte audit comments, unclassified bytes kept as `.byte`/`.word` |
|
||||
| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) |
|
||||
| `locals.inc` | project-local zero-page aliases — 38 semantic, 66 neutral `ZpXX`; Pass 3 evidence notes at the foot of the file |
|
||||
| `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. The split is CDL-verified; the remaining `.byte` runs are either
|
||||
data (string/table/record bytes) or CDL-unreached code (above).
|
||||
2. **Pass 2** — partial: the hardware constants and the zero-page aliases are named. The
|
||||
remaining Pass 2 work is routine-label renaming — all 640 entries are address-derived
|
||||
`Label_<addr>`, and `git log -S SubC` shows this was never done for this project.
|
||||
3. **Pass 3** — in progress. Zero-page audit complete (38 semantic + 66 neutral), and the
|
||||
`$FFFA–$FFFF` vectors are now `.word NmiHandler, Reset, IrqHandler`.
|
||||
Remaining: name the data tables and structures — the `$D4FA` 30-entry pointer table and
|
||||
the variable-length records at `$D559+`, the `$C0C0` entry-point table, the
|
||||
`$C47A–$CA20` block.
|
||||
4. **Promotion** — move to a top-level `<name>/copilot/` folder, add a 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.
|
||||
@@ -0,0 +1,25 @@
|
||||
CA65 ?= ca65
|
||||
LD65 ?= ld65
|
||||
|
||||
all: reconstructed.nes verify
|
||||
|
||||
prg.o: prg.s symbols.inc locals.inc
|
||||
$(CA65) -g -o $@ $<
|
||||
|
||||
header.o: header.s header.bin
|
||||
$(CA65) -g -o $@ $<
|
||||
|
||||
chr.o: chr.s chr.bin
|
||||
$(CA65) -g -o $@ $<
|
||||
|
||||
reconstructed.nes: header.o prg.o chr.o linker.cfg
|
||||
$(LD65) -C linker.cfg -m reconstructed.map -Ln reconstructed.lbl -o $@ header.o prg.o chr.o
|
||||
|
||||
verify: reconstructed.nes rom.nes
|
||||
cmp reconstructed.nes rom.nes
|
||||
@echo "Byte-identical ROM verified."
|
||||
|
||||
clean:
|
||||
rm -f *.o reconstructed.nes reconstructed.map reconstructed.lbl
|
||||
|
||||
.PHONY: all verify clean
|
||||
Binary file not shown.
@@ -0,0 +1,2 @@
|
||||
.segment "CHR"
|
||||
.incbin "chr.bin"
|
||||
Binary file not shown.
@@ -0,0 +1,2 @@
|
||||
.segment "HEADER"
|
||||
.incbin "header.bin"
|
||||
@@ -0,0 +1,10 @@
|
||||
MEMORY {
|
||||
HEADER: start = $0000, size = $0010, file = %O, fill = yes;
|
||||
PRG: start = $C000, size = $4000, file = %O, fill = yes;
|
||||
CHR: start = $0000, size = $2000, file = %O, fill = yes;
|
||||
}
|
||||
SEGMENTS {
|
||||
HEADER: load = HEADER, type = ro;
|
||||
PRG: load = PRG, type = ro;
|
||||
CHR: load = CHR, type = ro;
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
; Lunar Pool (U) application-specific RAM aliases
|
||||
; Generated from every direct zero-page operand in reachable code.
|
||||
; ref counts are reads+writes; `used at` lists up to four distinct CPU addresses.
|
||||
; A reference is an operand-position mention in the disassembled instruction stream,
|
||||
; including the "-- <disasm>" comment of a .byte line that stands in for an
|
||||
; undocumented opcode. sta/stx/sty write; inc/dec/asl/lsr/rol/ror and the
|
||||
; undocumented read-modify-write set slo/rla/sre/rra/dcp/isc read and write;
|
||||
; everything else reads. The counts were refreshed after the Pass 3
|
||||
; reclassification below, so they describe the current prg.s, not the Pass 1 trace.
|
||||
; ZpXX names indicate storage with a role not yet unique enough for a behavioral name.
|
||||
; Pass 2 named the entries whose role was already unambiguous.
|
||||
; Pass 3 re-traced every remaining ZpXX and named the ones whose behaviour is provable
|
||||
; from the instruction contexts that touch them; the rest stay neutral on purpose.
|
||||
; See the Pass 3 notes at the bottom of this file for the evidence and the residue.
|
||||
|
||||
timer_lo = $00 ; 28 refs; reads=16 writes=12; used at $CB45, CB49, CB52, CB61, +21 more
|
||||
timer_hi = $01 ; 32 refs; reads=17 writes=15; used at $CA79, CB4D, CB50, CB66, +26 more
|
||||
Zp02 = $02 ; 6 refs; reads=4 writes=2; used at $E295, E844, EAFA, EB0D, +1 more
|
||||
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 ; 3 refs; reads=1 writes=2; used at $EE32, F2E5
|
||||
Zp07 = $07 ; 22 refs; reads=16 writes=6; used at $EE55, EE57, EEC7, EF04, +16 more
|
||||
Zp08 = $08 ; 7 refs; reads=5 writes=2; used at $F032, F236, F287, F2BC, +2 more
|
||||
Zp09 = $09 ; 3 refs; reads=1 writes=2; used at $CFC4, D2BC, D2E7
|
||||
Zp0C = $0C ; 4 refs; reads=2 writes=2; used at $E29A, E300, E309
|
||||
Zp0D = $0D ; 7 refs; reads=4 writes=3; used at $E240, E302, E314, E8F0, +1 more
|
||||
Zp0E = $0E ; 5 refs; reads=3 writes=2; used at $E245, E31A, EBFD, 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 ; 4 refs; reads=3 writes=1; used at $E666, F2A0, FBCC, FC8E
|
||||
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 ; 4 refs; reads=2 writes=2; used at $E698, E6CA, FC79, FCB3
|
||||
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 ; 9 refs; reads=5 writes=4; used at $E625, E673, EF6C, F1EC, +5 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 ; 26 refs; reads=10 writes=16; used at $E3D6, E3EF, E6AB, E6BC, +20 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 ; 5 refs; reads=2 writes=3; used at $E31F, E34D, E373, E3BB, +1 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
|
||||
Zp5F = $5F ; 6 refs; reads=3 writes=3; used at $C3C0, E85D, E8A6, F2EF, +1 more
|
||||
spawn_queue = $60 ; 4 refs; reads=2 writes=2; used at $C00E, C019, C3E0, C3E6
|
||||
Zp61 = $61 ; 2 refs; reads=1 writes=1; used at $F521
|
||||
game_flag = $68 ; 3 refs; reads=1 writes=2; used at $C003, C3F7, CE37
|
||||
obj_script_lo = $69 ; 17 refs; reads=13 writes=4; used at $C085, C096, C0BD, C0E9, +12 more
|
||||
obj_script_hi = $6A ; 6 refs; reads=2 writes=4; used at $C08A, C0EB, C1E7, C401, +1 more
|
||||
obj_ptr_lo = $6B ; 35 refs; reads=20 writes=15; used at $C0F8, C13D, C141, C146, +30 more
|
||||
obj_ptr_hi = $6C ; 12 refs; reads=4 writes=8; used at $C199, C1AD, C209, C217, +7 more
|
||||
obj_index = $6D ; 17 refs; reads=14 writes=3; used at $C00C, C015, C02C, C02E, +12 more
|
||||
Zp6E = $6E ; 5 refs; reads=2 writes=3; used at $C231, C283, C39F, C404, +1 more
|
||||
Zp6F = $6F ; 19 refs; reads=9 writes=10; used at $C024, C150, C156, C15E, +14 more
|
||||
Zp70 = $70 ; 1 refs; reads=1 writes=0; used at $C072
|
||||
Zp74 = $74 ; 2 refs; reads=1 writes=1; used at $EBF1
|
||||
Zp7F = $7F ; 2 refs; reads=0 writes=2; used at $E832, FA93
|
||||
; --- palette shadow $0080-$009F ------------------------------------------------
|
||||
; The 32 bytes FlushPaletteToPpu writes to PPU $3F00-$3F1F at the end of every NMI.
|
||||
; $0080-$008F are the four background palettes and $0090-$009F the four sprite
|
||||
; palettes; Reset_LoadSpritePalettes fills the sprite half from the ROM table at
|
||||
; $ED3F. The ZpXX entries below are the individual slots that reachable code
|
||||
; touches directly (the title colour cycle writes $85-$87, the aiming display
|
||||
; writes $8B/$8F/$92).
|
||||
palette_shadow = $80
|
||||
sprite_palette_shadow = $90
|
||||
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
|
||||
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 ; 2 refs; reads=0 writes=2; used at $EABF, EDD8
|
||||
vram_buf = $A0 ; 1 refs; reads=0 writes=1; used at $CC50
|
||||
ZpA5 = $A5 ; 1 refs; reads=1 writes=0; used at $F0CF
|
||||
vram_slot_len = $D0 ; 5 refs; reads=3 writes=2; used at $CC05, CC36, CC4B, CC7F
|
||||
vram_slot_ofs = $D1 ; 2 refs; reads=0 writes=2; used at $CC19, CC47
|
||||
vram_slot_addr_lo = $D2 ; 1 refs; reads=0 writes=1; used at $CC3C
|
||||
vram_slot_addr_hi = $D3 ; 1 refs; reads=0 writes=1; used at $CC40
|
||||
vram_read_len = $E8 ; 4 refs; reads=2 writes=2; used at $CCC5, CCE2, F7BA, F7BC
|
||||
vram_read_addr_lo = $E9 ; 4 refs; reads=3 writes=1; used at $CCCF, F7AB, F7C2, F7D0
|
||||
vram_read_addr_hi = $EA ; 4 refs; reads=3 writes=1; used at $CCCA, F7A9, F7C0, F7CE
|
||||
vram_read_dst_lo = $EB ; 2 refs; reads=0 writes=2; used at $CCDC, F7B6
|
||||
vram_read_dst_hi = $EC ; 1 refs; reads=0 writes=1; used at $F7B2
|
||||
vram_slot_idx = $ED ; 3 refs; reads=1 writes=2; used at $CC12, CC34, CC8A
|
||||
vram_queue_len = $EE ; 9 refs; reads=6 writes=3; used at $CBFD, CC17, CC2E, CC45, +4 more
|
||||
vram_update_checksum = $EF ; 5 refs; reads=3 writes=2; used at $CAB4, CAB6, CDBB, CDC9, +1 more
|
||||
ppu_ctrl_shadow = $F0 ; 14 refs; reads=9 writes=5; used at $CA38, CA3F, CA48, CA4C, +8 more
|
||||
ppu_mask_shadow = $F1 ; 7 refs; reads=4 writes=3; used at $CA24, CA2B, CA2E, CA32, +3 more
|
||||
nt_base_hi = $F2 ; 6 refs; reads=3 writes=3; used at $CA68, CA7F, CA88, CB19, +2 more
|
||||
nt_base_lo = $F3 ; 5 refs; reads=2 writes=3; used at $CA6C, CA83, CA8C, CD4B, +1 more
|
||||
ppu_addr_save_lo = $F4 ; 2 refs; reads=1 writes=1; used at $CC20, CC3A
|
||||
ppu_addr_save_hi = $F5 ; 2 refs; reads=1 writes=1; used at $CC24, CC3E
|
||||
ppu_addr_temp_lo = $F6 ; 68 refs; reads=35 writes=33; used at $CAFB, CAFD, CB01, CB05, +52 more
|
||||
ppu_addr_temp_hi = $F7 ; 42 refs; reads=20 writes=22; used at $CAF9, CAFF, CB03, CB07, +29 more
|
||||
ppu_src_lo = $F8 ; 55 refs; reads=28 writes=27; used at $CE4E, CE7A, CEB4, CEE7, +46 more
|
||||
ppu_src_hi = $F9 ; 41 refs; reads=20 writes=21; used at $CE4C, CE7E, CEB8, CEE5, +36 more
|
||||
ptr_lo = $FA ; 68 refs; reads=24 writes=44; used at $CB71, CB87, CB95, CB9B, +61 more
|
||||
ptr_hi = $FB ; 67 refs; reads=25 writes=42; used at $CB9D, CBA3, CBCD, CBD5, +58 more
|
||||
ppu_addr_lo = $FC ; 153 refs; reads=63 writes=90; used at $CAA8, CB97, CB99, CBAB, +129 more
|
||||
ppu_addr_hi = $FD ; 111 refs; reads=45 writes=66; used at $CAA3, CB9F, CBA1, CBA9, +94 more
|
||||
ppu_addr_src_lo = $FE ; 40 refs; reads=23 writes=17; used at $CDD8, CE19, CE83, CECB, +36 more
|
||||
ppu_addr_src_hi = $FF ; 22 refs; reads=9 writes=13; used at $CDD6, CE14, CE86, CEC8, +18 more
|
||||
|
||||
; =================================================================================
|
||||
; Pass 3 notes - zero-page audit (rebuild re-verified byte-identical after the pass)
|
||||
;
|
||||
; Named in Pass 3 (20 entries; the proof is the instruction context on each line):
|
||||
;
|
||||
; Object core ($C000-$C4FF)
|
||||
; obj_index $6D current object slot 0..4; indexes the $0500/$0514/$056E
|
||||
; per-object arrays and is saved/restored around jsr $C404.
|
||||
; obj_script_lo $69 per-object behaviour-script pointer. Copied from the
|
||||
; obj_script_hi $6A $0528/$052D pointer tables, read with (..),y to fetch the
|
||||
; next script byte, advanced by $C3FC/$C401, saved per object
|
||||
; in $0546/$054B.
|
||||
; spawn_queue $60 8-slot FIFO of entity-type spawn requests: filled by $C3DA
|
||||
; (`lda #imm / jsr $C3DA`), drained by the $C00C loop which
|
||||
; hands each entry to $C404 and clears the slot.
|
||||
;
|
||||
; VRAM write queue ($CBFD-$CC91)
|
||||
; vram_buf $A0 staging buffer base; queued bytes land in vram_buf,x where
|
||||
; x is the running queue length.
|
||||
; vram_queue_len $EE bytes currently staged, 0..$30. $CC49 increments it per
|
||||
; byte, $CC7B/$CCC3 reset it, and the guards at $CBFD/$CC2E
|
||||
; spin while it equals $30 (buffer full).
|
||||
; vram_slot_idx $ED descriptor slot being filled (stride 4), set at $CC12/$CC8A.
|
||||
; vram_slot_len $D0 per-slot byte count )
|
||||
; vram_slot_ofs $D1 buffer offset for the slot ) four-byte descriptor at $D0+slot,
|
||||
; vram_slot_addr_lo $D2 VRAM destination low ) consumed by the drain at $CC91
|
||||
; vram_slot_addr_hi $D3 VRAM destination high ) (PPUADDR hi then lo, then copy).
|
||||
;
|
||||
; VRAM read-back ($CCBA-$CCE5, $F7A7)
|
||||
; vram_read_len $E8 transfer length; nonzero while a read is pending, and the
|
||||
; busy flag the callers spin on at $F7BC.
|
||||
; vram_read_addr_lo $E9 PPU source address, written to PPUADDR second (low byte).
|
||||
; vram_read_addr_hi $EA PPU source address, written to PPUADDR first (high byte).
|
||||
; vram_read_dst_lo $EB destination pointer for the copied bytes ($0420 in $F7A7).
|
||||
; vram_read_dst_hi $EC
|
||||
;
|
||||
; PPU helpers
|
||||
; nt_base_hi $F2 screen/nametable base address, $2000 or $2440 depending on
|
||||
; nt_base_lo $F3 the select tested at $CA77; added to row offsets at
|
||||
; $CB19/$CD4B and used to fetch tiles at $CD94/$CD9D/$CDAC.
|
||||
; ppu_addr_save_lo $F4 running PPU write address, captured from ppu_addr_lo/hi when
|
||||
; ppu_addr_save_hi $F5 a slot opens ($CC20/$CC24) and copied into the descriptor at
|
||||
; $CC3A/$CC3E; advanced by the $CB61 counter.
|
||||
;
|
||||
; Left neutral on purpose - role not provable from static context:
|
||||
; * $10-$37, $61, $7F, $A5 (the $E3xx-$E98x
|
||||
; and $EFxx-$FBxx engines): scratch operands of the collision/scoring/entity maths.
|
||||
; They are written and consumed inside single routines and reused across routines,
|
||||
; so any behavioural name would be a guess. Examples: $2C/$2D hold a computed pair
|
||||
; only between $E3C1 and $E43B; $16/$17 serves as a push/rts jump vector at $F193 yet
|
||||
; is compared as a 16-bit value at $F29D.
|
||||
; * $02-$0F, $5F, $6E, $6F, $70, $74, $09: layout/name-table bytes and further
|
||||
; single-routine temporaries with no repeating, self-describing pattern.
|
||||
;
|
||||
; Named in Pass 3 by the table audit: $85-$8F and $92 are not general scratch. They
|
||||
; are slots of the $0080-$009F palette shadow that FlushPaletteToPpu sends to $3F00-$3F1F
|
||||
; every NMI - $85/$86/$87 come from the title colour cycle, $8B/$8F/$92 from the three
|
||||
; aiming-display colour sequences at $F762/$F76A/$F772. See palette_shadow above.
|
||||
;
|
||||
; Removed by the Pass 3 reclassification (the aliases are gone from the list above).
|
||||
; These ten addresses had NO real reference: every one of them was produced by the
|
||||
; flat tracer decoding data as code, and the bytes it "operated on" are the characters
|
||||
; of the inline text strings and the values of the lookup tables.
|
||||
; * $49, $84, $8A, $AA, $C0: the 16-bit pointer table at $C0C0-$C0E5, decoded as a
|
||||
; `cmp (ZpXX,x)` chain. $C0C0-$C0E5 is now .byte and $C0E6 resumes as `tax`.
|
||||
; * $3B, $65, $67, $72: ASCII ";" "e" "g" "r" read as operands inside the $F7xx and
|
||||
; $EBxx text/table data ($F85C ror Zp65, $F85A adc Zp72, ...).
|
||||
; * $81: the string delimiter $81 of "$81player$81$00", read as `sta (Zp81,x)`.
|
||||
;
|
||||
; Existing Pass 1/2 names this audit found imprecise. Not renamed again (to avoid
|
||||
; churn), recorded here instead:
|
||||
; * timer_lo/timer_hi ($00/$01): not a 16-bit counter pair in practice. The counter
|
||||
; routines at $CB39-$CB61 are generic - their stubs pick the target with X =
|
||||
; $F8/$FA/$FC/$FE, so index 0 is never a target. $00 is a frame/sub-phase counter
|
||||
; tested with and #$01/#$04/#$08/#$10; $01 is a status/flag byte (and #$7F/#$90/#$F7,
|
||||
; ora #$08/#$20/#$30).
|
||||
; * ppu_addr_temp_lo/hi ($F6/$F7): a general 16-bit accumulator used by the
|
||||
; $FD8B-$FDE6 shift/add multiply and many address builders, not a PPU address.
|
||||
; * obj_ptr_lo/hi ($6B/$6C): a scratch 16-bit pointer (also used at $C22F/$C3DA), not
|
||||
; exclusively an object pointer.
|
||||
Binary file not shown.
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,705 @@
|
||||
al 00FF90 .PaddingFf
|
||||
al 00FF65 .NmiHandler
|
||||
al 00FF64 .IrqHandler
|
||||
al 00FF5B .WaitFrames_Loop
|
||||
al 00FF56 .WaitFrames
|
||||
al 00FF50 .RotateCoord270
|
||||
al 00FF43 .RotateVector270
|
||||
al 00FF3D .RotateCoord180
|
||||
al 00FF2B .RotateVector180
|
||||
al 00FF25 .RotateCoord90
|
||||
al 00FF18 .RotateVector90
|
||||
al 00FF11 .GetCosine_Lookup
|
||||
al 00FF0E .GetCosine
|
||||
al 00FECE .SineTable
|
||||
al 00FECD .GetSine_Done
|
||||
al 00FEBD .GetSine_Lookup
|
||||
al 00FEC5 .GetSine_Ninety
|
||||
al 00FEA8 .GetSine
|
||||
al 00FE95 .SquareRoot16_Next
|
||||
al 00FE8E .SquareRoot16_Subtract
|
||||
al 00FE6A .SquareRoot16_Loop
|
||||
al 00FE5A .SquareRoot16
|
||||
al 00FE4A .SignExtendFixed
|
||||
al 00FE49 .NegatePtr_Done
|
||||
al 00FE37 .NegatePtr
|
||||
al 00FE36 .NegatePpuAddr_Done
|
||||
al 00FE24 .NegatePpuAddr
|
||||
al 00FE17 .SignedDivide16_Negate
|
||||
al 00FE1A .SignedDivide16_Return
|
||||
al 00FE1F .SignedDivide16_CheckDivisor
|
||||
al 00FE0E .SignedDivide16_Divide
|
||||
al 00FE06 .SignedDivide16_DivisorDone
|
||||
al 00FDFE .SignedDivide16
|
||||
al 00FDFA .Divide16_Borrow
|
||||
al 00FDE0 .Divide16_Loop
|
||||
al 00FDD8 .Divide16
|
||||
al 00FDD4 .MultiplyByte16_NextPair
|
||||
al 00FDBF .MultiplyByte16_NextBit
|
||||
al 00FDAA .MultiplyByte16_Loop
|
||||
al 00FDA8 .MultiplyByte16
|
||||
al 00FD98 .Multiply16_LowByte
|
||||
al 00FD8B .Multiply16
|
||||
al 00FD85 .ProjectCoordinate_High
|
||||
al 00FD88 .ProjectCoordinate_Done
|
||||
al 00FD60 .ProjectCoordinate
|
||||
al 00FD32 .ProjectObjectPosition_Store
|
||||
al 00FD2D .ProjectObjectPosition_Skip
|
||||
al 00FC6C .ProjectObjectPosition
|
||||
al 00FBD1 .ComputeBallVelocity_Moving
|
||||
al 00FBC2 .ComputeBallVelocity
|
||||
al 00FBA5 .ResolveBallCollision_Rotate
|
||||
al 00FBC1 .ResolveBallCollision_Done
|
||||
al 00FB99 .ResolveBallCollision
|
||||
al 00FB90 .CollisionAngleLimitTable
|
||||
al 00FB87 .ComputeCollisionAngle_Quadrant2
|
||||
al 00FB8D .ComputeCollisionAngle_Quadrant3
|
||||
al 00FB7A .ComputeCollisionAngle_Quadrant1
|
||||
al 00FB69 .ComputeCollisionAngle_ApplySigns
|
||||
al 00FB4C .ComputeCollisionAngle_Mirror
|
||||
al 00FB38 .ComputeCollisionAngle_Reject
|
||||
al 00FB39 .ComputeCollisionAngle_Steep
|
||||
al 00FB55 .ComputeCollisionAngle_Shallow
|
||||
al 00FB2C .ComputeCollisionAngle
|
||||
al 00FAF9 .ComputeFieldCellAddress
|
||||
al 00FAC9 .PaletteColorTable
|
||||
al 00FAB1 .MapColorCodeToPalette_Disabled
|
||||
al 00FAB4 .MapColorCodeToPalette_High
|
||||
al 00FA99 .MapColorCodeToPalette
|
||||
al 00FA8D .BuildPaletteFromShadeTable_Loop
|
||||
al 00FA8B .BuildPaletteFromShadeTable
|
||||
al 00FA7F .FadeInPalette_Loop
|
||||
al 00FA7D .FadeInPalette
|
||||
al 00FA6F .FadeOutPalette_Loop
|
||||
al 00FA6D .FadeOutPalette
|
||||
al 00FA5F .CopyScoreToHighScore_Loop
|
||||
al 00FA56 .CopyScoreToHighScore
|
||||
al 00FA4A .GetPlayerScoreIndex
|
||||
al 00FA40 .CompareScoreToHighScore_Next
|
||||
al 00FA34 .CompareScoreToHighScore_Loop
|
||||
al 00FA2B .CompareScoreToHighScore
|
||||
al 00FA1F .AddScoreDigit_Overflow
|
||||
al 00FA26 .ScoreRoutine_Return
|
||||
al 00FA07 .AddScoreDigit_Loop
|
||||
al 00F9F9 .AddScoreDigit
|
||||
al 00F9E4 .CountUpScore_WaitFrame
|
||||
al 00F9D9 .CountUpScore_PointLoop
|
||||
al 00F9D6 .CountUpScore_MultiplierLoop
|
||||
al 00F9CE .CountUpScore
|
||||
al 00F9BD .IncrementTurnBallCount_CheckBonus
|
||||
al 00F9B0 .IncrementTurnBallCount
|
||||
al 00F9AD .IncrementPlayerBallCount_Redraw
|
||||
al 00F9A0 .IncrementPlayerBallCount
|
||||
al 00F998 .SetBallSpriteTile
|
||||
al 00F990 .SetBallSpriteAttributes
|
||||
al 00F989 .SetPpuAddr
|
||||
al 00F988 .StampBallMarker_Abort
|
||||
al 00F908 .StampBallMarker_BottomRight
|
||||
al 00F8EE .StampBallMarker_BottomLeft
|
||||
al 00F8D4 .StampBallMarker_TopRight
|
||||
al 00F924 .StampBallMarker_IfEmpty
|
||||
al 00F8AB .StampBallMarker_CheckColumn
|
||||
al 00F8BB .StampBallMarker_TopLeft
|
||||
al 00F89B .StampBallMarker_Done
|
||||
al 00F89C .StampBallMarker_CheckRow
|
||||
al 00F897 .StampBallMarker
|
||||
al 00F88A .SaveHighScore_Loop
|
||||
al 00F87F .SaveHighScore
|
||||
al 00F872 .LoadHighScore_Loop
|
||||
al 00F867 .LoadHighScore
|
||||
al 00F858 .StrPerfect
|
||||
al 00F84C .ShowPerfectText
|
||||
al 00F83B .StrHiScore
|
||||
al 00F826 .StrPlayer3
|
||||
al 00F81A .ShowPlayerHiScoreText
|
||||
al 00F809 .StrGameOver
|
||||
al 00F7F4 .StrPlayer2
|
||||
al 00F7E8 .ShowPlayerGameOverText
|
||||
al 00F7DD .RestoreVramOverlay_Loop
|
||||
al 00F7CB .RestoreVramOverlay
|
||||
al 00F7BC .BeginVramOverlay_Wait
|
||||
al 00F7A7 .BeginVramOverlay
|
||||
al 00F79B .StrShot
|
||||
al 00F786 .StrPlayer1
|
||||
al 00F77A .ShowPlayerShotText
|
||||
al 00F762 .AimPhaseTable0
|
||||
al 00F73F .DrawBlinkingBallSprite_Visible
|
||||
al 00F728 .DrawBlinkingBallSprite
|
||||
al 00F725 .BuildBallSprites_Done
|
||||
al 00F71A .BuildBallSprites_Next
|
||||
al 00F6CF .BuildBallSprites_Draw2x2
|
||||
al 00F6C1 .BuildBallSprites_CheckSpecial
|
||||
al 00F69D .BuildBallSprites_Loop
|
||||
al 00F683 .BuildBallSprites
|
||||
al 00F67D .WaitForObjectSlot_Spin
|
||||
al 00F674 .WaitForObjectSlot
|
||||
al 00F66B .FillAttributeTable_Loop
|
||||
al 00F669 .FillAttributeTable
|
||||
al 00F654 .FillNametable
|
||||
al 00F5E4 .EndingCommandList
|
||||
al 00F5D6 .ShowEndingScreen_ClearRow2
|
||||
al 00F5C6 .ShowEndingScreen_ClearRow1
|
||||
al 00F585 .ShowEndingScreen_RestorePlayer
|
||||
al 00F574 .ShowEndingScreen_SwapPlayer
|
||||
al 00F56C .ShowEndingScreen
|
||||
al 00F557 .ShowGameOverScreen_CheckInput
|
||||
al 00F54C .ShowGameOverScreen_WaitLoop
|
||||
al 00F542 .ShowGameOverScreen_QueueSpawn
|
||||
al 00F540 .ShowGameOverScreen_SpawnAlt
|
||||
al 00F4B1 .TurnEnd_NextPlayer
|
||||
al 00F4DF .TurnEnd_StartTurn
|
||||
al 00F49B .TurnEnd_SaveCounts
|
||||
al 00F4F6 .ShowGameOverScreen
|
||||
al 00F487 .TurnEnd_PlayerOut_CheckCountdown
|
||||
al 00F476 .TurnEnd_PlayerOut
|
||||
al 00F457 .TurnEnd_TableCleared_Continue
|
||||
al 00F44D .TurnEnd_TableCleared_DecCount
|
||||
al 00F435 .TurnEnd_TableCleared
|
||||
al 00F41B .TurnEnd_CheckTable
|
||||
al 00F413 .RoundFinish_NoPotPenalty
|
||||
al 00F410 .StartNextRound_ShowEnding
|
||||
al 00F406 .StartNextRound_AllStagesDone
|
||||
al 00F3E4 .StartNextRound_Store
|
||||
al 00F3D2 .StartNextRound
|
||||
al 00F3AD .RoundFinish_Wait
|
||||
al 00F3BB .RoundFinish_Tail
|
||||
al 00F387 .RoundFinish_Clear
|
||||
al 00F36E .RoundFinish_Score_Loop
|
||||
al 00F377 .RoundFinish_Advance
|
||||
al 00F365 .RoundFinish_Score
|
||||
al 00F344 .RoundFinish_Collect_Store
|
||||
al 00F33D .RoundFinish_Collect_Empty
|
||||
al 00F341 .RoundFinish_Collect_X
|
||||
al 00F327 .RoundFinish_Collect_Loop
|
||||
al 00F31F .RoundFinish_Collect
|
||||
al 00F312 .RoundFinish
|
||||
al 00F30F .BallUpdateEnd_Next
|
||||
al 00F302 .BallUpdateEnd_Idle
|
||||
al 00F2EC .BallUpdateEnd
|
||||
al 00F2E5 .BallCollisionScan_Repeat
|
||||
al 00F2DB .BallCollisionScan_NextOuter
|
||||
al 00F2CB .BallCollisionScan_NextInner
|
||||
al 00F270 .BallCollisionScan_DY
|
||||
al 00F25B .BallCollisionScan_DX
|
||||
al 00F241 .BallCollisionScan_Next
|
||||
al 00F244 .BallCollisionScan_Test
|
||||
al 00F238 .BallCollisionScan_Inner
|
||||
al 00F233 .BallCollisionScan_Pair
|
||||
al 00F225 .BallCollisionScan_Loop
|
||||
al 00F221 .BallCollisionScan
|
||||
al 00F218 .BallFrameEnd
|
||||
al 00F211 .BallPhysicsNextStep
|
||||
al 00F206 .BallSlotAdvance
|
||||
al 00F1F6 .BallDecelerate
|
||||
al 00F1E2 .BallCommitPosition
|
||||
al 00F1D3 .BallRememberTile
|
||||
al 00F1B9 .BallBounceCommit_TestC0
|
||||
al 00F1AF .BallBounceCommit_Test80
|
||||
al 00F1BC .BallBounceCommit_Store
|
||||
al 00F19A .BallBounceCommit
|
||||
al 00F16A .BallReflectVector
|
||||
al 00F193 .BallBounceExit
|
||||
al 00F149 .BallFlipXVelocity
|
||||
al 00F13F .BallReflectX_Do
|
||||
al 00F148 .BallReflectX_Done
|
||||
al 00F125 .BallReflectX
|
||||
al 00F0EF .BallTileHandler8_Exit
|
||||
al 00F0DF .BallTileHandler8
|
||||
al 00F0DC .BallTileHandler5_Reflect
|
||||
al 00F0CE .BallTileHandler5
|
||||
al 00F098 .TileCollisionTable
|
||||
al 00F07B .BallBounce_TestC0
|
||||
al 00F071 .BallBounce_Test80
|
||||
al 00F07E .BallBounce_JumpTable
|
||||
al 00F04D .BallBounce
|
||||
al 00F031 .SinkRemainingBalls_Next
|
||||
al 00F019 .SinkRemainingBalls_Loop
|
||||
al 00F017 .SinkRemainingBalls
|
||||
al 00F037 .BallPocketed_CueBall
|
||||
al 00EFF5 .BallPocketed
|
||||
al 00F045 .BallMove_TestTile
|
||||
al 00EFD9 .BallMove_SubTile
|
||||
al 00EFD5 .BallMove_StoreTile
|
||||
al 00EFB4 .BallMove_OffTable
|
||||
al 00EFB8 .BallMove_ReadTile
|
||||
al 00EF84 .BallMove_CheckTile
|
||||
al 00EF53 .BallMove_Advance
|
||||
al 00EF50 .BallMove_Stopped
|
||||
al 00EF3A .BallMove_Step
|
||||
al 00EF31 .BallMove
|
||||
al 00EF2A .BallSinkTiles
|
||||
al 00EF27 .BallSinkAnim_Done
|
||||
al 00EEF0 .BallSinkAnim
|
||||
al 00EEE9 .BallAppearTiles
|
||||
al 00EEE0 .BallAppearAnim_Next
|
||||
al 00EEE6 .BallAppearAnim_Done
|
||||
al 00EEB9 .BallAppearAnim
|
||||
al 00EE80 .BallLaunch
|
||||
al 00EE76 .BallSlotUpdate_Next
|
||||
al 00EE79 .BallSlotUpdate_State1
|
||||
al 00EE6F .BallSlotUpdate_Case
|
||||
al 00EE57 .BallSlotUpdate
|
||||
al 00EE53 .BallPhysicsStep_Skip
|
||||
al 00EE3E .BallPhysicsStep
|
||||
al 00EE3A .BallPhysicsPass
|
||||
al 00EE2C .BallPhysicsBegin_Alt
|
||||
al 00EE30 .BallPhysicsBegin
|
||||
al 00EDBA .PlayPhaseLoop
|
||||
al 00EDB7 .InitBallSlots_BeginPlay
|
||||
al 00ED8B .InitBallSlots_Next
|
||||
al 00ED86 .InitBallSlots_MarkActive
|
||||
al 00ED5D .InitBallSlots_Loop
|
||||
al 00ED3F .SpritePaletteTable
|
||||
al 00ED4F .InitBallSlots
|
||||
al 00ED16 .LoadStageScene_StartPlay
|
||||
al 00ECF2 .LoadStageScene_LoadLayout_Next
|
||||
al 00ECE7 .LoadStageScene_LoadLayout_Loop
|
||||
al 00ECD5 .LoadStageScene_LoadLayout_Clear
|
||||
al 00ECD3 .LoadStageScene_LoadLayout
|
||||
al 00ECA2 .LoadStageScene_VaryTiles_Write
|
||||
al 00ECAE .LoadStageScene_VaryTiles_Next
|
||||
al 00EC87 .LoadStageScene_VaryTiles
|
||||
al 00EC63 .LoadStageScene_PlaceBalls
|
||||
al 00EC3C .LoadStageScene_CopyAttrs
|
||||
al 00EC3A .LoadStageScene
|
||||
al 00EC2A .StageAttributeTable
|
||||
al 00EBB0 .DrawStageBanner
|
||||
al 00EB7A .ClearRoundState
|
||||
al 00EB60 .SetupRound
|
||||
al 00EB06 .AimLoop_UpdatePower
|
||||
al 00EAFF .AimLoop_DecreasePower
|
||||
al 00EAEF .AimLoop_StoreStage
|
||||
al 00EAE9 .AimLoop_ClampStage
|
||||
al 00EAF5 .AimLoop_IncreasePower
|
||||
al 00EADE .AimLoop_AdjustStage
|
||||
al 00EB0D .AimLoop_FireCheck
|
||||
al 00EA9F .AimLoop_UpdatePlayers
|
||||
al 00EAB1 .AimLoop_Update
|
||||
al 00EA86 .AimLoop_CyclePlayers
|
||||
al 00EA7B .AimLoop_CheckSelect
|
||||
al 00EA75 .AimLoop_NoStart
|
||||
al 00EA51 .AimLoop
|
||||
al 00EA00 .TitleCommandList
|
||||
al 00E9CC .StartGame_CopyAttrs
|
||||
al 00E9CA .StartGame
|
||||
al 00E9B9 .StartGameAttributeRow
|
||||
al 00E9A3 .TitleColorCycleTable
|
||||
al 00E980 .UpdateTitleColors_Store
|
||||
al 00E974 .UpdateTitleColors
|
||||
al 00E971 .TitleScreenLoop_Next
|
||||
al 00E95D .TitleScreenLoop_SetPalette
|
||||
al 00E947 .TitleScreenLoop_Animate
|
||||
al 00E928 .TitleScreenLoop_WaitFrame
|
||||
al 00E923 .TitleScreenLoop
|
||||
al 00E8FF .EnterTitleScreen_CopyAttrs
|
||||
al 00E8B3 .EnterTitleScreen
|
||||
al 00E88F .Reset_InitPlayerRecords
|
||||
al 00E882 .Reset_CopySignature
|
||||
al 00E862 .BootSignatureText
|
||||
al 00E880 .Reset_ColdInit
|
||||
al 00E852 .Reset_CheckSignature
|
||||
al 00E848 .Reset_LoadSpritePalettes
|
||||
al 00E830 .Reset_ClearShadowTables
|
||||
al 00E81E .Reset_WaitVblank2
|
||||
al 00E817 .Reset_WaitVblank
|
||||
al 00E80C .Reset
|
||||
al 00E802 .CheckTileCollision_Next
|
||||
al 00E7C0 .CheckTileCollision_Probe
|
||||
al 00E7B5 .CheckTileCollision_Loop
|
||||
al 00E7B1 .CheckTileCollision
|
||||
al 00E78B .FindPocketInPath_DiffAbs
|
||||
al 00E7A6 .FindPocketInPath_Next
|
||||
al 00E771 .FindPocketInPath_Loop
|
||||
al 00E76D .FindPocketInPath
|
||||
al 00E748 .FindBlockingBall_DiffAbs
|
||||
al 00E763 .FindBlockingBall_Next
|
||||
al 00E721 .FindBlockingBall_Loop
|
||||
al 00E71D .FindBlockingBall
|
||||
al 00E71B .ComputeAngleFromDelta_Quad1
|
||||
al 00E71C .ComputeAngleFromDelta_Done
|
||||
al 00E706 .ComputeAngleFromDelta_Quad2
|
||||
al 00E70F .ComputeAngleFromDelta_PosX
|
||||
al 00E6F7 .ComputeAngleFromDelta_Adjust
|
||||
al 00E6F8 .ComputeAngleFromDelta_Quadrant
|
||||
al 00E6E4 .ComputeAngleFromDelta_TableUp
|
||||
al 00E6ED .ComputeAngleFromDelta_Found
|
||||
al 00E6D9 .ComputeAngleFromDelta_TableLoop
|
||||
al 00E6D0 .ComputeAngleFromDelta_Divide
|
||||
al 00E696 .ComputeAngleFromDelta_RatioSetup
|
||||
al 00E68C .ComputeAngleFromDelta_Ratio
|
||||
al 00E683 .ComputeAngleFromDelta_ZeroY
|
||||
al 00E67A .ComputeAngleFromDelta
|
||||
al 00E63E .ComputePotAimPoint_Scale
|
||||
al 00E60B .ComputePotAimPoint
|
||||
al 00E60A .ScoreShotLineup_Done
|
||||
al 00E5F2 .ScoreShotLineup_Record
|
||||
al 00E5DF .ScoreShotLineup_Tolerance
|
||||
al 00E5E7 .ScoreShotLineup_Accept
|
||||
al 00E5FE .ScoreShotLineup_Next
|
||||
al 00E598 .ScoreShotLineup_AfterAbs
|
||||
al 00E586 .ScoreShotLineup_Loop
|
||||
al 00E582 .ScoreShotLineup
|
||||
al 00E572 .PlanBestShot_VaryAngle
|
||||
al 00E570 .PlanBestShot_VaryFar
|
||||
al 00E564 .PlanBestShot_VaryLoop
|
||||
al 00E57B .PlanBestShot_SetShot
|
||||
al 00E550 .PlanBestShot_StorePower
|
||||
al 00E54A .PlanBestShot_ClampPowerLow
|
||||
al 00E53E .PlanBestShot_PowerBucket
|
||||
al 00E517 .PlanBestShot_AimAtPoint
|
||||
al 00E50B .PlanBestShot_TargetPointX
|
||||
al 00E4F9 .PlanBestShot_TargetPointY
|
||||
al 00E4DC .PlanBestShot_FallbackAccept
|
||||
al 00E4E6 .PlanBestShot_FallbackNext
|
||||
al 00E4C1 .PlanBestShot_FallbackLoop
|
||||
al 00E4B9 .PlanBestShot_Fallback
|
||||
al 00E4AA .PlanBestShot_Next
|
||||
al 00E48D .PlanBestShot_Evaluate
|
||||
al 00E473 .PlanBestShot_StoreBall
|
||||
al 00E43B .PlanBestShot_Measure
|
||||
al 00E47B .PlanBestShot_AdvanceBall
|
||||
al 00E429 .PlanBestShot_BallPoint
|
||||
al 00E417 .PlanBestShot_ScanLoop
|
||||
al 00E415 .PlanBestShot_ScanStart
|
||||
al 00E40E .PlanBestShot
|
||||
al 00E405 .ComputeDeltaVector_StoreHigh
|
||||
al 00E3FB .ComputeDeltaVector_Square
|
||||
al 00E3E7 .ComputeDeltaVector_AbsY
|
||||
al 00E3CE .ComputeDeltaVector_AbsX
|
||||
al 00E3BF .ComputeDeltaVector
|
||||
al 00E3BE .UpdateCpuAim_Steer_Done
|
||||
al 00E3B1 .UpdateCpuAim_Steer_SetButtons
|
||||
al 00E3AB .UpdateCpuAim_Steer_TurnLeft
|
||||
al 00E3AF .UpdateCpuAim_Steer_AngleMatch
|
||||
al 00E39C .UpdateCpuAim_Steer_LengthKey
|
||||
al 00E392 .UpdateCpuAim_Steer_LengthDown
|
||||
al 00E39A .UpdateCpuAim_Steer_LengthMatch
|
||||
al 00E381 .UpdateCpuAim_Steer
|
||||
al 00E37C .UpdateCpuAim_Check
|
||||
al 00E370 .UpdateCpuAim
|
||||
al 00E367 .TestShootButton_Ready
|
||||
al 00E364 .TestShootButton_Fail
|
||||
al 00E34A .TestShootButton
|
||||
al 00E349 .ReadPlayerButtons_Done
|
||||
al 00E341 .ReadPlayerButtons_ReturnToCaller
|
||||
al 00E333 .ReadPlayerButtons_CheckPlayer
|
||||
al 00E322 .ReadPlayerButtons
|
||||
al 00E31D .ResetAimPhase
|
||||
al 00E318 .ByteToDecimal3_Units
|
||||
al 00E30F .ByteToDecimal3_Tens
|
||||
al 00E30D .ByteToDecimal3_AfterHundreds
|
||||
al 00E304 .ByteToDecimal3_Hundreds
|
||||
al 00E2FE .ByteToDecimal3
|
||||
al 00E2DB .DrawTurnMarker_Store
|
||||
al 00E2D7 .DrawTurnMarker_Alt
|
||||
al 00E2C8 .DrawTurnMarker
|
||||
al 00E2BB .DrawShotIcons_Store
|
||||
al 00E2B2 .DrawShotIcons_Loop
|
||||
al 00E2A2 .DrawShotIcons
|
||||
al 00E286 .PrintMenuPower
|
||||
al 00E275 .PrintBallCount_Blank
|
||||
al 00E270 .PrintBallCount_Value
|
||||
al 00E25C .PrintBallCount
|
||||
al 00E24F .PrintRate
|
||||
al 00E240 .PrintTwoDigitValue_Units
|
||||
al 00E22F .PrintTwoDigitValue
|
||||
al 00E22D .PrintTwoDigitValue_Stage
|
||||
al 00E225 .PrintStageNumberTop
|
||||
al 00E21A .PrintStageNumber
|
||||
al 00E215 .PrintHiScore_Source
|
||||
al 00E20D .PrintHiScoreHud
|
||||
al 00E202 .PrintHiScoreMenu
|
||||
al 00E1F2 .PrintMenuPlayerScore
|
||||
al 00E1ED .PrintPlayer2Score_Source
|
||||
al 00E1BB .PrintScoreDigits_Loop
|
||||
al 00E1AE .PrintScoreDigits
|
||||
al 00E1AC .PrintPlayer1Score_Source
|
||||
al 00E1E5 .PrintPlayer2Score
|
||||
al 00E1A4 .PrintPlayer1Score
|
||||
al 00E19D .PrintCurrentPlayerScore
|
||||
al 00E194 .UpdateAimInput_PowerBar_Next
|
||||
al 00E17C .UpdateAimInput_PowerBar_Fill
|
||||
al 00E171 .UpdateAimInput_PowerBar_Loop
|
||||
al 00E162 .UpdateAimInput_PowerBar
|
||||
al 00E15D .UpdateAimInput_ClampTop
|
||||
al 00E147 .UpdateAimInput_RescaleY
|
||||
al 00E145 .UpdateAimInput_ClampBottom
|
||||
al 00E14E .UpdateAimInput_NegY
|
||||
al 00E118 .UpdateAimInput_TraceY
|
||||
al 00E113 .UpdateAimInput_ClampLeft
|
||||
al 00E0E7 .UpdateAimInput_Rescale
|
||||
al 00E0E3 .UpdateAimInput_RescaleX
|
||||
al 00E0FE .UpdateAimInput_StoreEndX
|
||||
al 00E0E1 .UpdateAimInput_ClampRight
|
||||
al 00E104 .UpdateAimInput_NegX
|
||||
al 00E0BA .UpdateAimInput_Trace
|
||||
al 00E0B1 .UpdateAimInput_StoreLength
|
||||
al 00E0A4 .UpdateAimInput_LengthDown
|
||||
al 00E089 .UpdateAimInput_PowerMeterBounce
|
||||
al 00E094 .UpdateAimInput_LengthUp
|
||||
al 00E079 .UpdateAimInput_PowerMeterDown
|
||||
al 00E055 .UpdateAimInput_AimRight
|
||||
al 00E062 .UpdateAimInput_PowerMeter
|
||||
al 00E048 .UpdateAimInput_AimLeft
|
||||
al 00E040 .UpdateAimInput_RepeatDelay
|
||||
al 00E02F .UpdateAimInput_RepeatStart
|
||||
al 00E01E .UpdateAimInput
|
||||
al 00D559 .LayoutData
|
||||
al 00D536 .ComputeStageLayoutAddress
|
||||
al 00D4FA .LayoutScriptTable
|
||||
al 00D4ED .SelectLayoutScript_Index
|
||||
al 00D4E4 .SelectLayoutScript
|
||||
al 00D4CC .ReadStageLayoutId
|
||||
al 00D4C4 .ClassifyLayoutTile_Bits
|
||||
al 00D4BD .ClassifyLayoutTile_Mid
|
||||
al 00D4B6 .ClassifyLayoutTile_High
|
||||
al 00D4AF .ClassifyLayoutTile
|
||||
al 00D4AD .GetConnectionIndex_Result
|
||||
al 00D48F .GetConnectionIndex
|
||||
al 00D488 .PlaceLayoutTile_Neighbour_Clear
|
||||
al 00D487 .PlaceLayoutTile_Neighbour_Skip
|
||||
al 00D45E .PlaceLayoutTile_Neighbour_Compose
|
||||
al 00D444 .PlaceLayoutTile_Neighbour_Pick
|
||||
al 00D449 .PlaceLayoutTile_Neighbour_Blend
|
||||
al 00D45D .PlaceLayoutTile_Neighbour_Return
|
||||
al 00D41F .PlaceLayoutTile_Neighbour
|
||||
al 00D405 .PlaceLayoutTile_Cell
|
||||
al 00D400 .PlaceLayoutTile_Row
|
||||
al 00D3E5 .PlaceLayoutTile_Simple
|
||||
al 00D41E .PlaceLayoutTile_Done
|
||||
al 00D3D3 .PlaceLayoutTile
|
||||
al 00D3CB .DrawPocketCorner_RemapC7
|
||||
al 00D3BF .DrawPocketCorner_RemapC6
|
||||
al 00D3B3 .DrawPocketCorner_RemapC5
|
||||
al 00D3A0 .DrawPocketCorner_Remap
|
||||
al 00D39F .DrawPocketCorner_Return
|
||||
al 00D392 .DrawPocketCorner
|
||||
al 00D384 .DefinePockets_Next
|
||||
al 00D325 .DefinePockets
|
||||
al 00D31B .DrawCellGrid_NextColumn
|
||||
al 00D317 .DrawCellGrid_TileNext
|
||||
al 00D30D .DrawCellGrid_TileCell
|
||||
al 00D2DF .DrawCellGrid_AttrLoop
|
||||
al 00D300 .DrawCellGrid_TileRow
|
||||
al 00D2D4 .DrawCellGrid
|
||||
al 00D2A0 .RunCellCommandList
|
||||
al 00D29C .RemapTileIndex_Found
|
||||
al 00D291 .RemapTileIndex_Loop
|
||||
al 00D28F .RemapTileIndex
|
||||
al 00D22C .FixIsolatedCells_Fix
|
||||
al 00D222 .FixIsolatedCells_Next
|
||||
al 00D212 .FixIsolatedCells_Loop
|
||||
al 00D20A .FixIsolatedCells
|
||||
al 00D1FB .UploadFieldMap_Store
|
||||
al 00D1F5 .UploadFieldMap_Found
|
||||
al 00D1EB .UploadFieldMap_HighNibbleSearch
|
||||
al 00D1E8 .UploadFieldMap_HighNibble
|
||||
al 00D1DA .UploadFieldMap_LowNibble
|
||||
al 00D1CC .UploadFieldMap_Loop
|
||||
al 00D1BB .UploadFieldMap
|
||||
al 00D1BA .PlaceFieldTile_Done
|
||||
al 00D197 .PlaceFieldTile_NorthEdge
|
||||
al 00D174 .PlaceFieldTile_WestEdge
|
||||
al 00D151 .PlaceFieldTile_SouthEdge
|
||||
al 00D129 .PlaceFieldTile_KeepTile
|
||||
al 00D12C .PlaceFieldTile_Store
|
||||
al 00D0F3 .PlaceFieldTile
|
||||
al 00D0E4 .DrawCellRun_Vertical
|
||||
al 00D0D5 .DrawCellRun_Horizontal
|
||||
al 00D073 .DrawCellRun_Block2x2
|
||||
al 00D088 .DrawCellRun_Corner2x2
|
||||
al 00D057 .DrawCellRun_TileTable
|
||||
al 00D0C3 .DrawCellRun_DiagonalAlt
|
||||
al 00D0B1 .DrawCellRun_Diagonal
|
||||
al 00D047 .DrawCellRun_SetTile
|
||||
al 00D03D .DrawCellRun_PickTile
|
||||
al 00D05B .DrawCellRun_TileFromBit
|
||||
al 00D02D .DrawCellRun_Kind40
|
||||
al 00D026 .DrawCellRun_Kind20
|
||||
al 00D017 .DrawCellRun
|
||||
al 00D00D .RunSceneScript_Advance
|
||||
al 00D004 .RunSceneScript_Next
|
||||
al 00CFE5 .RunSceneScript
|
||||
al 00CFDE .RunCommandList_Done
|
||||
al 00CFA6 .RunCommandList_Loop
|
||||
al 00CF9B .RunCommandList
|
||||
al 00CF87 .LoadScene_Done
|
||||
al 00CF70 .LoadScene_CheckVsMode
|
||||
al 00CF40 .VsCommandList
|
||||
al 00CF15 .DrawLayoutRows_Cell
|
||||
al 00CF10 .DrawLayoutRows
|
||||
al 00CEEE .ClearFieldMap
|
||||
al 00CE9E .UploadFieldRows
|
||||
al 00CE55 .FillFieldEmpty
|
||||
al 00CE35 .LoadScene
|
||||
al 00CE25 .WritePpuDataAtTemp
|
||||
al 00CE14 .ReadPpuDataAtSrc
|
||||
al 00CDF4 .PrintTextToNametable_Char
|
||||
al 00CDE4 .PrintTextToNametable_RowStart
|
||||
al 00CE09 .PrintTextToNametable_NextRow
|
||||
al 00CDDA .PrintTextToNametable_Row
|
||||
al 00CDD3 .PrintTextToNametable
|
||||
al 00CDB9 .MixChecksum
|
||||
al 00CDAE .UploadAttributeShadow_Loop
|
||||
al 00CD9D .UploadAttributeShadow
|
||||
al 00CD73 .SetAttributeCell_Align
|
||||
al 00CD7E .SetAttributeCell_Store
|
||||
al 00CD65 .SetAttributeCell
|
||||
al 00CD5F .GetAttributeCell_Read
|
||||
al 00CD58 .GetAttributeCell_Column
|
||||
al 00CD3C .GetAttributeCell
|
||||
al 00CD1C .ReadControllers_Loop
|
||||
al 00CD0E .ReadControllers
|
||||
al 00CCF3 .FlushPaletteToPpu_Loop
|
||||
al 00CCD9 .DrainVramQueue_ReadLoop
|
||||
al 00CCE5 .FlushPaletteToPpu
|
||||
al 00CCA9 .DrainVramQueue_CopyLoop
|
||||
al 00CCBA .DrainVramQueue_NextSlot
|
||||
al 00CC91 .DrainVramQueue_Slot
|
||||
al 00CC8F .DrainVramQueue
|
||||
al 00CC7D .ResetVramQueue_Loop
|
||||
al 00CC7B .ResetVramQueue
|
||||
al 00CC49 .QueueVramByte_Store
|
||||
al 00CC5E .QueueVramByte_NewSlot
|
||||
al 00CC2E .QueueVramByte_WaitSpace
|
||||
al 00CC29 .QueueVramByte
|
||||
al 00CC12 .BeginVramWrite_Alloc
|
||||
al 00CC05 .BeginVramWrite_FindSlot
|
||||
al 00CBFD .BeginVramWrite_WaitSpace
|
||||
al 00CBFB .BeginVramWrite
|
||||
al 00CBF4 .PrintInlineString_Done
|
||||
al 00CBE5 .PrintInlineString_Loop
|
||||
al 00CBDC .PrintInlineString
|
||||
al 00CBC9 .PrintInlineStringToVram
|
||||
al 00CBC8 .WriteStringToPpuData_Done
|
||||
al 00CBB9 .WriteStringToPpuData
|
||||
al 00CBB2 .FillOamOffscreen_Loop
|
||||
al 00CBAE .FillOamOffscreen
|
||||
al 00CBA9 .SetPpuAddrFromXY
|
||||
al 00CB92 .SwapPpuAddrAndPtr
|
||||
al 00CB82 .CopyFromVram_Loop
|
||||
al 00CB7F .CopyFromVram
|
||||
al 00CB6F .CopyToVram_Loop
|
||||
al 00CB69 .CopyToVram
|
||||
al 00CB66 .IncCount16_Hi
|
||||
al 00CB61 .IncCount16
|
||||
al 00CB5F .IncPpuAddr
|
||||
al 00CB5A .IncPtr
|
||||
al 00CB4F .DecCount16_Return
|
||||
al 00CB50 .DecCount16_Borrow
|
||||
al 00CB45 .DecCount16
|
||||
al 00CB39 .DecPpuSrcCount
|
||||
al 00CB30 .FillVramByte_Loop
|
||||
al 00CB2B .FillVramByte
|
||||
al 00CB25 .TriggerOamDma
|
||||
al 00CB1D .SetPpuCtrlAndMask
|
||||
al 00CAF7 .ComputeTileAddress
|
||||
al 00CABD .WritePpuData
|
||||
al 00CAB9 .ReadPpuData
|
||||
al 00CAAE .ReadVramByte
|
||||
al 00CAA3 .WritePpuAddr
|
||||
al 00CA8F .SetNtBaseFromA
|
||||
al 00CA86 .UpdateNtBaseFromPpuCtrl_Base0
|
||||
al 00CA77 .UpdateNtBaseFromPpuCtrl
|
||||
al 00CA6F .SetNtSelectBit
|
||||
al 00CA60 .SetNtBase2000
|
||||
al 00CA52 .WritePpuCtrlAndResetScroll
|
||||
al 00CA48 .EnableNmi
|
||||
al 00CA42 .EnableNmiAndRendering
|
||||
al 00CA3C .WritePpuCtrl
|
||||
al 00CA38 .DisableNmi
|
||||
al 00CA2E .EnableRendering
|
||||
al 00CA21 .DisableRendering
|
||||
al 00C559 .SpriteAnimationTable
|
||||
al 00C552 .AnimationPointerTable
|
||||
al 00C543 .StateTimerTable
|
||||
al 00C522 .SpawnObjectTable
|
||||
al 00C47A .ObjectStatePointerTable
|
||||
al 00C475 .SpawnObject_NextSlot
|
||||
al 00C445 .SpawnObject_CopyField
|
||||
al 00C471 .SpawnObject_EndRecord
|
||||
al 00C429 .SpawnObject_SlotLoop
|
||||
al 00C415 .SpawnObject_Return
|
||||
al 00C416 .SpawnObject_Create
|
||||
al 00C409 .SpawnObject_JumpTable
|
||||
al 00C404 .SpawnObject
|
||||
al 00C401 .AdvanceScriptPtr_HiCarry
|
||||
al 00C3FC .AdvanceScriptPtr
|
||||
al 00C3F5 .ResetGameState
|
||||
al 00C3F0 .QueueSpawnRequest_Done
|
||||
al 00C3EB .QueueSpawnRequest_NextSlot
|
||||
al 00C3E0 .QueueSpawnRequest_FindSlot
|
||||
al 00C3DA .QueueSpawnRequest
|
||||
al 00C3C7 .ClearGameState_LoopArrays
|
||||
al 00C3BE .ClearGameState_LoopByte
|
||||
al 00C3BC .ClearGameState
|
||||
al 00C3B4 .SoundChannelMask
|
||||
al 00C3AE .UpdateObjectSound_CheckVolume
|
||||
al 00C392 .UpdateObjectSound_EnableChannel
|
||||
al 00C38A .UpdateObjectSound_UseVolume
|
||||
al 00C39F .UpdateObjectSound_Sustain
|
||||
al 00C331 .UpdateObjectSound_Return
|
||||
al 00C332 .UpdateObjectSound_Emit
|
||||
al 00C321 .UpdateObjectSound_Silence
|
||||
al 00C32A .UpdateObjectSound_Check
|
||||
al 00C314 .UpdateObjectSound
|
||||
al 00C304 .AdvanceAnimFrame_ReadCount
|
||||
al 00C2FE .AdvanceAnimFrame_Restart
|
||||
al 00C2EC .AdvanceAnimFrame_Relative
|
||||
al 00C306 .AdvanceAnimFrame_Commit
|
||||
al 00C2CB .AdvanceAnimFrame_Next
|
||||
al 00C2CA .AdvanceAnimFrame_Return
|
||||
al 00C2BB .AdvanceAnimFrame
|
||||
al 00C2B8 .DecodeAnimOffset_Literal
|
||||
al 00C2AD .DecodeAnimOffset_Restart
|
||||
al 00C29E .DecodeAnimOffset_Relative
|
||||
al 00C294 .DecodeAnimOffset_Back
|
||||
al 00C28D .DecodeAnimOffset
|
||||
al 00C275 .BuildObjectSprite_ClampY
|
||||
al 00C286 .BuildObjectSprite_NoAnim
|
||||
al 00C22F .BuildObjectSprite
|
||||
al 00C21C .SetObjPtr_FromStateTable
|
||||
al 00C20C .SetObjPtr_NonZero
|
||||
al 00C205 .SetObjPtr
|
||||
al 00C200 .AdvanceScriptPtrKeepA
|
||||
al 00C1DA .EnterObjectState
|
||||
al 00C1D5 .SetObjectState_Store
|
||||
al 00C1D1 .SetObjectState_Table
|
||||
al 00C1C0 .SetObjectState_Resolve
|
||||
al 00C1A2 .ObjOp_LowOpcode
|
||||
al 00C18D .SetStateFromOpcode
|
||||
al 00C18B .ObjOp8F_StateFromScriptPtr
|
||||
al 00C185 .ObjOp8A_SpawnFromScript
|
||||
al 00C175 .ObjOp8E_SkipTwoBytes
|
||||
al 00C16F .ObjOp86_SetFlags
|
||||
al 00C166 .ObjOp89_StoreNibble
|
||||
al 00C15E .ObjOp89_ClampNibble
|
||||
al 00C14A .ObjOp89_SetFlagsNibble
|
||||
al 00C13D .ComputeRecordIndex
|
||||
al 00C12B .ObjOp8C_SetRecordByte
|
||||
al 00C125 .ObjOp84_StoreSpeed
|
||||
al 00C11F .ObjOp_AddSpeed
|
||||
al 00C119 .ObjOp87_SetAnimSelector
|
||||
al 00C113 .ObjOp83_SetSoundParam
|
||||
al 00C109 .ObjOp82_StopScript
|
||||
al 00C0F2 .ObjOp81_Loop
|
||||
al 00C0E6 .ObjOp80_SetScriptPtr
|
||||
al 00C0C0 .ObjectOpcodeHandlerTable
|
||||
al 00C0A9 .DispatchObjectScript_Table
|
||||
al 00C0A1 .DispatchObjectScript_High
|
||||
al 00C092 .DispatchObjectScript
|
||||
al 00C08F .NextScriptOpcode
|
||||
al 00C082 .ResumeObjectScript
|
||||
al 00C07C .FlushSoundRegisters_Next
|
||||
al 00C072 .FlushSoundRegisters_Loop
|
||||
al 00C06A .FlushSoundRegisters
|
||||
al 00C05C .UpdateObjects_Render_Sound
|
||||
al 00C054 .UpdateObjects_Render
|
||||
al 00C05F .UpdateObjects_Next
|
||||
al 00C02E .UpdateObjects
|
||||
al 00C024 .ClearObjectWork_Loop
|
||||
al 00C01B .DrainSpawnQueue_Next
|
||||
al 00C00C .DrainSpawnQueue_Loop
|
||||
al 00C00A .DrainSpawnQueue
|
||||
al 00C003 .RunObjectFrame
|
||||
al 00C000 .ResetStub
|
||||
@@ -0,0 +1,32 @@
|
||||
Modules list:
|
||||
-------------
|
||||
header.o:
|
||||
HEADER Offs=000000 Size=000010 Align=00001 Fill=0000
|
||||
prg.o:
|
||||
PRG Offs=000000 Size=004000 Align=00001 Fill=0000
|
||||
chr.o:
|
||||
CHR Offs=000000 Size=002000 Align=00001 Fill=0000
|
||||
|
||||
|
||||
Segment list:
|
||||
-------------
|
||||
Name Start End Size Align
|
||||
----------------------------------------------------
|
||||
CHR 000000 001FFF 002000 00001
|
||||
HEADER 000000 00000F 000010 00001
|
||||
PRG 00C000 00FFFF 004000 00001
|
||||
|
||||
|
||||
Exports list by name:
|
||||
---------------------
|
||||
|
||||
|
||||
|
||||
Exports list by value:
|
||||
----------------------
|
||||
|
||||
|
||||
|
||||
Imports list:
|
||||
-------------
|
||||
|
||||
Binary file not shown.
Symlink
+1
@@ -0,0 +1 @@
|
||||
../Lunar Pool (U).nes
|
||||
@@ -0,0 +1,108 @@
|
||||
; =============================================================================
|
||||
; 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
|
||||
Reference in new issue
Block a user