Files
disasm/_wip/Duck Hunt (JUE)/OVERVIEW.md
T
tmerritt 1b0682042f Duck Hunt (JUE): Pass 2 complete
- 3,058 instructions (37.5% code), 48 semantic labels, 174 zero-page aliases
- BYTE-IDENTICAL build verified
- Key routines: Reset, NmiHandler, MainGameLoop, GameModeDispatcher, InitPPU, InitVariables, UpdateController, UpdateSprites
- Zero-page aliases: PPUCtrlShadow (/bin/bash8), PPUMaskShadow (/bin/bash9), GameMode (4), RoundIndex (6), DispatchIndex (A)
- Root OVERVIEW.md updated to reflect Pass 2 completion and correct mirroring (Horizontal)
2026-10-18 21:24:56 -04:00

68 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Duck Hunt (JUE) — Pass 2 Complete
ROM: `_wip/Duck Hunt (JUE)/Duck Hunt (JUE).nes` (24,592 bytes, iNES). Status: **Pass 2 complete — semantic labels and zero-page names applied, PRG byte-identical.** `copilot/prg.s` contains a classified disassembly with 3,058 instructions (37.5% code), 48 semantic labels, and 174 zero-page semantic aliases. The build is **BYTE-IDENTICAL** at the PRG level.
## 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 | `ca0d31e6f3aa70204fa5af67803c6533851a28fa48a133e15d772d3667fa675a` |
| PRG SHA-256 | `bcdd22fbe343ebd33c7fd19309510079150d1e4dc052f65382b64d197d6ba080` |
## Interrupt Vectors (taken from PRG $3FFA–$3FFF)
| Vector | Target | Note |
|--------|--------|------|
| NMI | `$C086` | per-frame heartbeat |
| RESET | `$C000` | cold start at $C000 — the usual pattern in this repo |
| IRQ | `$C000` | redirects to RESET — unused placeholder |
## `copilot/` Contents
| File | Purpose |
|------|---------|
| `Duck Hunt (JUE).nes` | original ROM image (reference) |
| `prg.bin` / `header.bin` / `chr.bin` | split image, produced by `_tools/splitnes.py` |
| `prg.s` | Pass 1/2: classified code/data split, 3,058 instructions, 48 semantic labels, audit comments on every emission |
| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) |
| `locals.inc` | 174 zero-page semantic aliases (filled in by 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. 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/Duck Hunt (JUE)/copilot"
make # → cmp reconstructed_prg.bin prg.bin → "BYTE-IDENTICAL"
```
## Next Steps (per `PROMPTS.md`)
1. **Pass 3** — name data tables/structures; release provisional flags.
2. **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.
## Pass 2 Details (2026-10-18)
- **Label renaming**: 48 of 472 labels renamed to semantic names using `pass2.py apply` with a mapping file (`duckhunt_label_map.tsv` + `locals.inc` for zero-page). Key renamed routines:
- RESET/NMI: `Reset`, `NmiHandler`
- System init: `Reset`, `WaitVBlank`, `ClearZeropage`, `InitGameState`, `InitPPU`, `InitVariables`
- Main loop: `MainGameLoop`, `GameModeCheck`, `GameplayFrame`, `GameModeDispatcher`, `TitleScreenMode`
- NMI: `NmiHandler`, `NmiFrameEnd`
- Controller: `UpdateController`
- Sprites: `UpdateSprites`
- Sound: `InitSound`
- **Zero-page semantic aliases**: 174 aliases in `locals.inc` (see `locals.inc` header for full list):
- PPU: `PPUCtrlShadow` ($08), `PPUMaskShadow` ($09)
- Game state: `GameMode` ($24), `RoundIndex` ($26), `DispatchIndex` ($2A)
- Player arrays: `PlayerState` ($16), `PlayerInput` ($25), `PlayerData` ($2A)
- Pointers: `TempPtrLo` ($00), `TempPtrHi` ($01)