Initial LegendOfZeldaALinkToThePastSNESRecomp scaffold
This commit is contained in:
commit
0cd0e5555c
24 files changed
+1253
No files matched your search
@@ -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.
|
||||
Reference in new issue
Block a user