Files
disasm/_wip/Pinball (JU)/OVERVIEW.md
T
tmerritt 2ae09f78ce Pass 1 complete for all 14 WIP projects; Pinball (JU) Pass 2 complete; tools fixed
- Pass 1 complete for all 14 WIP projects:
  - Donkey Kong (JU): 76.3% code
  - Donkey Kong Jr. Math (U): 81.9% code
  - Duck Hunt (JUE): 37.5% code
  - Hogan's Alley (JU): 41.8% code (needs CDL reclass for E970-E9C9 branch table)
  - Ice Climber (JE/U): 74.7% code
  - Lode Runner (U): 52.6% code
  - Millipede (U): 74.6% code
  - Pac-Man (Tengen) (U): 19.5% code
  - Pac-Man (U): 19.6% code
  - Pinball (JU): 59.5% code
  - Popeye (JU) PRG 0/1: 72.3% code
  - Raid on Bungeling Bay (U): 64.6% code
  - Raid on Bungeling Bay (U) [a2]: 64.3% code

- Pinball (JU) Pass 2 complete: 4,734 instructions, 196 semantic labels, 150 zero-page aliases, BYTE-IDENTICAL

- Tools fixed:
  - cdl_reclass.py: Fixed override logic to always win over CDL conflicts
  - nesdis.py: Fixed a: prefix parsing for JSR/JMP operands; fixed IND mode emission

- Root OVERVIEW.md updated with all Pass 1 completion statuses
- Pinball (JU) and Urban Champion (JU) project OVERVIEW.md updated

All 17 top-level projects pass verify_pass1.py; 13/14 WIP projects build (Hogan's Alley needs CDL reclass for E970-E9C9 branch table)
2026-10-18 20:52:49 -04:00

69 lines
3.7 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.
# Pinball (JU) — Pass 2 Complete
ROM: `_wip/Pinball (JU)/Pinball (JU).nes` (24,592 bytes, iNES). Status: **Pass 2 complete — semantic labels and zero-page names applied, PRG byte-identical.** `copilot/prg.s` now contains a classified disassembly with 4,734 instructions (59.5% code), 196 semantic labels, and 150 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 | `451a201c067bbabad8d762c3fdc2a83cb0b93f26ed0c350cf23bbf486f7addb6` |
| PRG SHA-256 | `1d79f41ef62d5045db2c45c9c75766d54c0a84e167d8067bbb6fb90227ac5619` |
## Interrupt Vectors (taken from PRG $3FFA–$3FFF)
| Vector | Target | Note |
|--------|--------|------|
| NMI | `$C1ED` | per-frame heartbeat |
| RESET | `$C000` | cold start at $C000 — the usual pattern in this repo |
| IRQ | `$C1ED` | target $C1ED — verify during Pass 1 |
## `copilot/` Contents
| File | Purpose |
|------|---------|
| `Pinball (JU).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, 4,734 instructions, 196 labels, audit comments on every emission |
| `symbols.inc` | shared NES hardware constants (PPU/APU/controller, from the skeleton) |
| `locals.inc` | 150 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/Pinball (JU)/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**: 196 of 681 labels renamed to semantic names using `pass2.py apply` with a mapping file (`pinball_label_map.tsv` + `pinball_zp_map.tsv`). Key renamed routines:
- RESET/NMI: `Reset`, `NmiHandler`
- System init: `InitSystem`, `ClearZeropage`, `InitGameState`
- Main loop: `MainGameLoop`, `GameModeTitle`, `GameModePlay`, `WaitVBlankFrame`
- NMI: `NmiHandler`, `NmiFrameEnd`
- Ball physics: `BallPhysics`, `CheckTilt`, `CheckBallInPocket`
- Flipper logic: `UpdateFlipper`, `UpdateFlipperSprites`, `UpdateFlipperSound`
- Ball physics: `BallPhysics`, `UpdateBallPosition`, `UpdateBallVelocity`, `UpdateBallTrajectory`
- Collision: `CheckCollision`, `CheckFlipperHit`, `CheckBallInPocket`
- Scoring: `UpdateScore`, `UpdateScoreDisplay`, `DrawScore`, `DrawDigits`
- Sound: `InitSound`, `PlaySound`, `UpdateMusic`
- PPU: `WaitVBlank`, `WaitPPUReady`, `WritePPU`, `DrawSprite`
- Sound engine: `UpdateSoundEngine`, `UpdateSoundChannel` (1-35)
- **Zero-page semantic aliases**: 150 aliases in `locals.inc` (e.g., `FrameCounter`=$02, `GameState`=$03, `PlayerLives`=$04, `BallX`=$24, `BallY`=$25, `BallVelX`=$26, `BallVelY`=$27, `FlipperLeft`=$28, `FlipperRight`=$29, `SpriteIndex`=$95, etc.)