Initial LegendOfZeldaALinkToThePastSNESRecomp scaffold

This commit is contained in:
setup committed 2026-10-30 11:35:37 +00:00
commit 0cd0e5555c
24 files changed
+1253

No files matched your search

+115
View File
@@ -0,0 +1,115 @@
# Legend of Zelda: A Link to the Past Recomp
A native recompilation of **Legend of Zelda: A Link to the Past** (USA), built on
[snesrecomp](https://github.com/RetroPortingToolKit/snesrecomp).
_Add a short description here._
> **You must legally own a copy of the game.** No ROM data is distributed with
> this project, in the repository or in any release. The recompiled C is
> generated locally from your own copy and is never committed.
## Status
Scaffolded on 2026-10-30 — **not yet a working port.** The layout, build,
regeneration pipeline, CI, and packaging are wired up; the game does not run
until the host work in `src/game_rtl.c` is done. See
[Porting from here](#porting-from-here).
## ROM identity
| | |
|---|---|
| File | `Legend of Zelda, The - A Link to the Past (USA).sfc` |
| Publisher | — |
| Developer | — |
| Year | — |
| Mapping | lorom |
| Region | USA (North America) |
| Coprocessor | none |
| CRC32 | `777aac2f` |
| SHA-256 | `66871d66be19ad2c34c927d6b14cd8eb6fc3181965b6e517cb361f7316009cfb` |
`tools/regen.sh` refuses to run against anything else, so a mismatched
revision fails immediately instead of producing subtly wrong output.
## Build
```sh
git submodule update --init --recursive
bash tools/regen.sh --rom /path/to/Legend of Zelda, The - A Link to the Past (USA).sfc
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
```
The ROM does not have to live in the repository — keeping it on your own
drive is the better habit, and `SNESRECOMP_ROM` sets the path once for a
shell. Without either, `tools/regen.sh` finds `Legend of Zelda, The - A Link to the Past (USA).sfc` at the repo root,
then the path the setup wizard recorded in `rom.cfg`; `.gitignore` blocks
both from ever being committed.
`tools/regen.sh` verifies the ROM, generates `src/gen/*.c`, and re-syncs
`recomp/funcs.h`. Re-run it whenever you change anything under `recomp/`.
## Run
```sh
./build/LegendOfZeldaALinkToThePastSNESRecomp # launcher picks the ROM
./build/LegendOfZeldaALinkToThePastSNESRecomp /path/to/Legend of Zelda, The - A Link to the Past (USA).sfc # or name it and skip the launcher
```
With no ROM on the command line the build opens the recomp-ui launcher: a ROM
picker with a verification badge, plus display / audio / input settings. Your
choice is cached in `rom.cfg` beside the executable, so the next launch opens
on it and "Skip launcher on boot" makes it immediate. If the launcher is not
built in (`--no-recomp-ui`), the host falls back to a native file picker.
Either way the ROM is checked against the digests above before anything boots
— a dump that could not have produced this build is refused at the door rather
than mis-executing ten frames in.
## Layout
| Path | What lives there |
|---|---|
| `recomp/` | Analysis input: `bank*.cfg`, `symbols.toml`, generated `funcs.h` |
| `rom_identity.txt` | ROM digests — read by the build, `tools/regen.sh` and CI |
| `src/` | Host code you own: `main.c`, `game_rtl.c` |
| `src/gen/` | Generated C. Never committed — regenerate locally |
| `snesrecomp/` | Framework submodule (owns `lib/recomp-net`, `lib/retcomm-rbengine`) |
| `tools/` | `regen.sh` — the ROM → C pipeline |
| `scripts/` | `package_release.sh` — player-facing zip |
| `framework_pins.txt` | Exact framework commits this project was scaffolded against |
## Porting from here
The scaffold stops where the game-specific work starts. In rough order:
1. **Make it boot.** `src/game_rtl.c` holds the frame driver. It starts on
the framework's beam-aligned driver (`snesrecomp/runner/src/beam_frame_driver.h`):
one frame per PPU field, interrupts taken where the beam latches them,
the field rasterized from the raster journal. A title whose main loop it
does not fit replaces those calls with its own driver.
2. **Name things.** Add entries to `recomp/symbols.toml` as you identify
routines, then re-run `tools/regen.sh`. Set `emit = true` to promote one
into ahead-of-time analysis; leave it false to keep it interpreted.
Regen synchronizes the marked blocks in each bank cfg, creating missing
configs. Only proven variants become AOT code. See `recomp/README.md`.
3. **Resolve dispatch misses.** After every run, deal with unresolved
indirect targets before anything else — they are the reason a port
diverges, and they are cheap to fix early.
4. **Never synthesise a result** to get past uncovered code, and never edit
`src/gen/` by hand. Fix the config or the framework and regenerate.
## Multiplayer
Single player.
## License
This project's own source is under the license in `LICENSE`. The framework
carries its own terms — see `snesrecomp/LICENSE` and
`snesrecomp/THIRD_PARTY_ATTRIBUTION.md`. Neither covers the game data, which
is not distributed here.