Skip to the page
It's Decomplicated
Sega, 1998

Dreamcast decomp guide

One boot file and one SDK. Recomps arrived fast in late 2026; decomps need Sega's own tools.

What this system is like

The Dreamcast runs on a Hitachi SH-4 chip. Most games are one boot file, 1ST_READ.BIN, built with Sega's Katana SDK. That makes the code easy to find. In late 2026, a wave of PC ports came out in a few weeks each.

For Path A, every reviewed port used static recompilation. A tool turns the SH-4 code into C or C++. A runtime then stands in for the graphics chip, the sound chip and the disc. You can build on dream-recomp or the Dreamcomp kit, or write your own tool, as SoulCalibur and Street Fighter Alpha 3 did. The Flycast emulator is the judge of right and wrong.

For Path B, the common route is an equivalence decomp. First the boot file is rebuilt byte for byte with the SDK's own assembler. Then each function gets C that a simulator proves acts the same. The dc-decomp-kickoff skill runs this whole plan. It needs a Katana SDK, which Sega never released to the public. You must supply it yourself.

Path A runs on Windows. Path B runs in Docker or in WSL, because the Hitachi tools run there through wibo. You need your own disc dump. No BIOS file is needed for the reviewed recomps.

One boot file, one known SDK

Most games keep all their code in 1ST_READ.BIN at a fixed address. Nearly all used Sega's Katana SDK. So tools can name library code by signature. Games with overlays, like Phantasy Star Online, are much harder.

The SDK is the gate for Path B

The byte-exact rebuild uses the SDK's own Hitachi assembler and linker. Sega never released the SDK to the public. The dc-decomp-kickoff skill will not fetch it for you. Its SKILL.md names places where SDK copies have been seen, as search terms only. It says you alone decide if you may use them. Whether you can get one legally is your problem to solve.

Proven by behaviour, not bytes

The reviewed Dreamcast decomps count a function as done when it acts like the original. A small SH-4 simulator runs both and compares calls, memory writes and the result. Byte-matching C is a bonus. One outside project claims a full byte match for Sonic Adventure.

The FPU needs care

The SH-4 swaps float register banks and changes float size with mode bits. Stock Ghidra decompiles this wrongly. The Ikaruga port patched Ghidra's SH-4 language in nine places to fix it.

Flycast is the judge

Flycast is a mature, open emulator. Recomps compare their translated code with it, step by step. Decomps read live RAM from it over GDB. Its GDB server is off by default in the build settings, so plan to build Flycast yourself.

A burst of AI-built ports

All 10 Dreamcast projects on RecompLauncher first released between September and November 2026. 8 are flagged for AI use. Three of the four decomps found outside it are AI-run. The fourth, Tokyo Bus Guide, has agent files, but its README does not mention AI. You have many recent agent files to learn from.

Two paths

Path A

Get it running on PC

A translator reads the SH-4 code in 1ST_READ.BIN and writes one C++ function per game function. A runtime stands in for the PowerVR2, the AICA sound chip, the pads and the disc. Library calls go to native code or to emulated hardware. You then fix one stop at a time, checking against Flycast. Fixes go in the config or in hooks, never in the machine-made code.

Go to the steps

Path B

Full decomp for porting

First the boot file is split into one assembly file per function. The SDK's own assembler and linker rebuild it byte for byte. Then C is written for each function and proven in an SH-4 simulator. The dc-decomp-kickoff skill runs all nine steps, up to a disc built from the C. A PC port after that is new ground on this system.

Go to the steps

Path A: Get it running on PC

A translator reads the SH-4 code in 1ST_READ.BIN and writes one C++ function per game function. A runtime stands in for the PowerVR2, the AICA sound chip, the pads and the disc. Library calls go to native code or to emulated hardware. You then fix one stop at a time, checking against Flycast. Fixes go in the config or in hooks, never in the machine-made code.

Method: static recompilation

Pick this to play on PC soon. Every reviewed Dreamcast port took this path. Start from dream-recomp or Dreamcomp unless you want to write your own translator.

  1. Scope the disc and look for prior work

    Pick one game and one exact disc. Check that its code sits in one boot file. Check that it is not a Windows CE game. Search for a port that already exists. Write SCOPE.md and get it approved before any code.

    • Dump your own disc. Keep the image outside any repo, like C:\dcdiscs\mygame.gdi.
    • Get the disc tool first. Run git clone --recurse-submodules https://github.com/phobos665/dream-recomp, then pip install -e dream-recomp/tools/dcdisc. Step 2 builds the rest.
    • Run dcdisc inspect C:\dcdiscs\mygame.gdi -o notes\disc-report.md. Read how many files look like code. One is the easy case.
    • dcdisc inspect exits with code 1 if it finds Windows CE markers. Those games are out of scope for dream-recomp.
    • Run dcdisc manifest C:\dcdiscs\mygame.gdi > notes\disc-manifest.json. It lists the SHA-256 of every file and of the boot file. Copy the boot file's hash into SCOPE.md.
    • Search GitHub and RecompLauncher for the game plus recomp, decomp and port. Check the dream-recomp table too: Crazy Taxi plays there, and five more titles boot.
    • Write SCOPE.md: goal, disc serial, boot file hash, technique, first milestone and its check, out of scope, never edit.
    Prompt for Claude
    GOAL: Draft `SCOPE.md` for a PC port of <GAME> (product <PRODUCT_NO>) by static recompilation on `dream-recomp`.
    READ FIRST: `notes/disc-report.md` (from `dcdisc inspect`), the boot file SHA-256 in `notes/disc-manifest.json` (from `dcdisc manifest`), the `dream-recomp` README at https://github.com/phobos665/dream-recomp.
    FENCE: Write only `SCOPE.md` and `notes/prior-work.md`. Do not open, copy or upload any game file. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `grep -cE '^## (Goal|Disc and hash|Technique|Milestone 1|Out of scope|Never edit)' SCOPE.md`. Done means it prints 6, and each line in `notes/prior-work.md` has a URL you opened.
    BUDGET: Stop after 45 minutes of searching.
    IF BLOCKED: If the report shows Windows CE or more than one code file, stop and tell me. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Prior work with URLs. 3) Code files found and what that means. 4) Your recommended base: `dream-recomp`, `Dreamcomp` or your own translator, and why. 5) Questions for me.
    Done whengrep -cE '^## (Goal|Disc and hash|Technique|Milestone 1|Out of scope|Never edit)' SCOPE.md prints 6, the file holds the boot file hash, and its last line is Approved: <date> in your words.

    Proof this works: https://github.com/phobos665/dream-recomp (dcdisc inspect, Windows CE refused, table of titles), https://github.com/phobos665/dream-recomp/blob/main/tools/dcdisc/README.md (pip install -e tools/dcdisc; inspect exit code 1 on Windows CE; manifest hashes), Bomberman Online Recomp (boot file SHA-1 pinned in the TOML and in CI), Army Men: Sarge's Heroes - Recompiled (supported discs picked by boot file SHA-1)

  2. Set up the repo, the toolchain and one check

    Make a repo that holds only your own code. The disc and anything taken from it stay outside git. Build dream-recomp and its disc tool. Then write one script that builds and one that checks.

    • Install Build Tools for Visual Studio 2022 with C++, plus CMake, Ninja, Python 3.9 or newer and git. The 2022 tools are on Microsoft's older downloads page now. For a window, add the Vulkan SDK, SDL3 and glslc.
    • In the dream-recomp folder from step 1, build: cmake -S . -B build -DDREAM_DEV_INTERPRETER=ON, then cmake --build build --parallel.
    • Run its tests: ctest --test-dir build --output-on-failure. The disc tool is already installed from step 1.
    • Run dcdisc doctor. It lists what is missing and what is required.
    • Or use Dreamcomp on Windows: python tools/dc.py doctor, then python tools/dc.py deps. It wraps dream-recomp and adds Claude Code skills.
    • Make extracted/, gen/ and build/ ignored. Add a pre-commit hook that refuses .bin, .gdi, .chd, .cdi and generated code. Dreamcomp ships tools/audit.py for this.
    • Write tools/check.py. It checks the boot file hash, builds, runs headless for a set time, and prints PASS or FAIL.
    • Give it the modes later steps use: --hash-only, --boot --seconds N, --test <ID> and --regress. Have --boot save a picture with the run flag --screenshot-at N.
    Prompt for Claude
    GOAL: Create the repo layout, the build script and the one check command for the <GAME> port.
    READ FIRST: `SCOPE.md`, `CLAUDE.md`, the `dream-recomp` README sections Requirements and Build the toolchain.
    FENCE: Edit only `tools/`, `.gitignore`, `.githooks/` and `PROGRESS.md`. Never copy anything from the disc or `extracted/` into tracked folders. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `python tools/check.py --hash-only`. Done means it prints the expected SHA-256 and PASS. Then run `git status --ignored` and show `extracted/` is ignored.
    BUDGET: Stop after 3 failed tries at the same error.
    IF BLOCKED: If `dcdisc doctor` reports a required tool missing, stop and name it. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste the check output and `dcdisc doctor` output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenpython tools/check.py --hash-only prints PASS, ctest passes in the dream-recomp build, and git status shows no game file as tracked.

    Proof this works: https://github.com/phobos665/dream-recomp (build commands, dcdisc doctor), https://github.com/phobos665/dream-recomp/blob/main/docs/dev-setup.md (--screenshot-at N for a run with nobody at the keyboard), https://visualstudio.microsoft.com/vs/older-downloads/ (Build Tools for Visual Studio 2022), https://github.com/danielgomesvieira2000/dreamcomp (Windows quick start, tools/audit.py), Bomberman Online Recomp and Army Men (no-game-data audit in a pre-commit hook and CI)

  3. Extract the boot file and map the code

    The translator finds functions by following calls from the entry point. That finds about 79 to 90% of the code. The rest hides behind jump tables and pointers. Ghidra helps you find it. Mark Katana SDK code, so nobody rewrites it by hand.

    • Set the title up: dcdisc new-game C:\dcdiscs\mygame.gdi. It reads IP.BIN, extracts the files, and writes games/<id>/<id>.toml.
    • Check the TOML: load_address = 0x8C010000, link_address = 0x0C010000, entry = 0x8C010000. These hold for nearly every game.
    • Build once and read the coverage line. It lists the byte runs that are not yet code or data.
    • Load games/<id>/extracted/fs/1ST_READ.BIN in Ghidra as raw binary with language SuperH4:LE:32:default. Bomberman Online says to use the 0x0C... base, not 0x8C....
    • Seed Ghidra with the translator's function list. The Ikaruga port found 2,708 functions alone, and 3,918 with seeds.
    • List Katana library calls in notes/functions.csv: Kamui, Ninja, sound, GD-ROM and pads. Voldorium found about 130 that it replaced with native code.
    • Write tools/validate_map.py. It fails on overlapping rows, on a start inside another function, and on any uncovered run from the build log that has no row.
    Prompt for Claude
    GOAL: Produce `notes/functions.csv` for <GAME>: every known function with address, size, library tag and status, plus the uncovered byte runs.
    READ FIRST: `games/<ID>/<ID>.toml`, the coverage line in `logs/build-latest.txt`, Ghidra through the MCP server (read-only).
    FENCE: Write only `notes/functions.csv` and `notes/map-notes.md`. Do not rename, retype or save anything in the Ghidra project. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `python tools/validate_map.py notes/functions.csv`. Done means no overlaps, no start inside another function, and every uncovered run from the build log is listed.
    BUDGET: Stop after 2 hours or 3 failed fixes of the same overlap.
    IF BLOCKED: If Ghidra is not reachable, stop. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Function count, library count, coverage percent, and the validator output. 3) Files changed. 4) Addresses you were unsure about. 5) New parking-lot items.
    Done whennotes/functions.csv passes the validator, and every uncovered run in the build log has a row with a status.

    Proof this works: https://github.com/phobos665/dream-recomp (dcdisc new-game, coverage line, 79 to 90% found by discovery), Ikaruga port (functions seeded from dream-translate), Bomberman Online Recomp (Ghidra 12.1.4 with SuperH4, P0 addresses), Voldorium (about 130 library functions replaced by native code)

  4. Build and reach the first frame

    This is first light. The game starts, the runtime answers it, and a window shows a picture. It will stop at untranslated addresses. The run can write the fix for those. Keep the dev interpreter on, so gaps fall back and show up in the report.

    • Build the title: cmake --build build --target <id>_boot -j8.
    • Run headless first. It prints a report: build/games/<id>/<id>_boot --config games/<id>/<id>.toml.
    • When it stops at an address, run with --suggest-config next.toml. Paste the suggested [functions] extra seeds into your TOML and rebuild.
    • Repeat until the report shows zero untranslated call targets. Crazy Taxi got there with ten entries in three rounds.
    • Then run with --window --screenshot-at 300. It saves a picture at the 300th frame with nobody at the keyboard. Keep it with the log line that proves the run.
    • On Dreamcomp, python tools/dc.py report <port> --frames 600 prints the same run report, and python tools/dc.py shots <port> --at 300,900 saves pictures.
    • Split the generated C++ into several files. Bomberman Online split 179 MB into eight parts to avoid a 20-minute compile.
    Prompt for Claude
    GOAL: Get <GAME> to show its first frame (<LOGO_OR_SCREEN>) from a cold start.
    READ FIRST: `PROGRESS.md`, `logs/run-latest.txt`, the `dream-recomp` README section When it stops.
    FENCE: Edit only `games/<ID>/<ID>.toml` and `PROGRESS.md`. Never edit generated C++. Add seeds only from `--suggest-config` output or a Ghidra address you can show. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `python tools/check.py --boot --seconds 60`. Done means it saves `out/first-frame.png`, and the report says 0 untranslated call targets.
    BUDGET: One round of seeds per try. Stop after 5 rounds with no new address passed.
    IF BLOCKED: If the stop is not an untranslated address, stop and paste the report. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste the check output. 3) Seeds added, with where each came from. 4) What is left. 5) New parking-lot items.
    Done whenpython tools/check.py --boot --seconds 60 saves a first-frame picture, and the run report shows 0 untranslated call targets.

    Proof this works: https://github.com/phobos665/dream-recomp (--suggest-config, Crazy Taxi: ten entries over three rounds), Bomberman Online Recomp (dc.py report with 0 untranslated targets; eight-part split), https://github.com/phobos665/dream-recomp/blob/main/docs/dev-setup.md (--screenshot-at N, --capture-at N), https://github.com/danielgomesvieira2000/dreamcomp/tree/main/.claude/skills/dc-playtest (dc.py shots --at)

  5. Grind: one stop or one wrong behaviour per task

    Now play further, one problem at a time. Compare with Flycast to see what the real game does. Fix it in the config, a hook, or the translator, never in generated code. Write each finding down with its address.

    • Write each problem as one issue: what happens, where it stops, the log line.
    • Run the same input in Flycast. dream-recomp compares its translated code with Flycast's interpreter, step by step. See its docs/differential-harness.md.
    • That compare needs a Flycast oracle core. Build it with tools/flycast/oracle/build_oracle.sh, then configure with -DDREAM_FLYCAST_CORE=<core>. It is a shell script, so run it in WSL.
    • If the translator gets one function wrong, list that function so the interpreter runs it. deSPIRIA did this for three functions.
    • Use --rtc-seed 1000000 so two runs act the same. Use --write-hash FILE to find the first frame where two runs split.
    • Add every address you learn to notes/game-internals.md. Mark each one observed, derived or guessed, as Bomberman Online does.
    • Keep one verified change per commit. A fix is done when the symptom is gone, not when a counter moves.
    Prompt for Claude
    GOAL: Fix issue <ISSUE_ID>: <ONE_LINE_SYMPTOM>.
    READ FIRST: `notes/issues/<ISSUE_ID>/spec.md`, `notes/game-internals.md`, the failing log `logs/<ISSUE_ID>.txt`, the Flycast reference capture `ref/<ISSUE_ID>/`.
    FENCE: Edit only `games/<ID>/<ID>.toml`, `src/hooks/`, `tests/` and `notes/issues/<ISSUE_ID>/`. Never edit generated C++ or a test's pass rule. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: First show the new test fails. Then run `python tools/check.py --test <ISSUE_ID>` and `python tools/check.py --regress`. Done means both pass, with the symptom shown gone in a screenshot or log.
    BUDGET: Stop after 3 failed fixes or 90 minutes without new evidence.
    IF BLOCKED: If the cause is in the translator itself, stop and name the SH-4 instruction and address. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste the check output. 3) Files changed. 4) What you did not verify. 5) New parking-lot items.
    Done whenThe issue's test failed before the fix and passes after, the full regression run still passes, and no generated file changed.

    Proof this works: deSPIRIA reBIRTH (three functions sent to the interpreter through the game config), Blue Stinger Recompiled (each subsystem proved against Flycast before moving on), Bomberman Online and Army Men (dreamcomp/CLAUDE.md: one verified change at a time; symptom shown gone), https://github.com/phobos665/dream-recomp (--rtc-seed, --write-hash), https://github.com/phobos665/dream-recomp/blob/main/docs/dev-setup.md (Flycast oracle core: build_oracle.sh, -DDREAM_FLYCAST_CORE)

  6. Get graphics, sound and movies right

    Most visible bugs live in the PowerVR2 renderer, the AICA sound chip and the movie player. Capture a bad frame and replay it offline. Fix the generic cause, not one texture. Check every fix against the same capture.

    • Press F11 on a wrong frame. You get five files, capture-000.ppm, .ta, .vram, .vram.regs and .txt: the picture, the display list, video memory, the graphics registers and a note. --capture-at N does this with no person.
    • Replay it with no game: build/render/dream_render_view --vram capture-000.vram capture-000.ta. Bisect the bug there.
    • Make a generic fix. Army Men fixed a sort rule for see-through polygons, not each texture.
    • If the game is silent, check how 32-bit stores reach the AICA. deSPIRIA had to treat them as 16-bit stores.
    • For smeared movies, check textures the game rewrites in place each frame. deSPIRIA fixed its movies this way.
    • For widescreen, change the projection and anchor the HUD. Do not stretch 2D art. Voldorium documents how.
    Prompt for Claude
    GOAL: Fix the rendering or sound bug <BUG_ID> shown in capture `captures/<BUG_ID>/`.
    READ FIRST: `captures/<BUG_ID>/` (the five F11 files), the Flycast reference picture `ref/<BUG_ID>.png`, `docs/runtime-render.md` or `docs/runtime-aica.md` in `dream-recomp`.
    FENCE: Edit only the renderer or AICA files named in `notes/issues/<BUG_ID>/spec.md`, and `tests/`. No per-texture or per-address special cases. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `build/render/dream_render_view --vram captures/<BUG_ID>/capture-000.vram captures/<BUG_ID>/capture-000.ta` before and after, then `python tools/check.py --regress`. Done means the replay matches the reference and all old captures still match.
    BUDGET: Stop after 3 failed fixes.
    IF BLOCKED: If the hardware behaviour is unclear in the docs and in Flycast, stop. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: before and after pictures and the regress output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenThe replayed capture matches the Flycast reference, and every older capture in the regression set still matches.

    Proof this works: https://github.com/phobos665/dream-recomp (F11 capture and dream_render_view), Army Men: Sarge's Heroes - Recompiled (generic fix for see-through overlap from captured frames), deSPIRIA reBIRTH (AICA 16-bit store fix, movie texture fix), Voldorium (widescreen by projection scale and HUD anchors)

  7. Harden: replays, hashes and a clean repo

    Lock in what works. Record runs a machine can replay with no person. Compare memory hashes and pictures, not your eyes. Keep tests off your real saves. Make sure no game data is in git.

    • Record input scripts that both Flycast and your build can play. Blue Stinger does this with tools/dev/assistido.py.
    • Write a rolling hash of memory per frame with --write-hash. Store only the hash files.
    • Give tests their own save folder. Sonic Adventure Recompiled uses KATANA_USER_DATA_ROOT.
    • Run tests hidden and muted, with no OS input. SARecomp's AGENTS.md makes this a rule.
    • Keep a frozen, hash-checked baseline build. Compare each change against it.
    • Run the no-game-data audit on every push. Army Men runs tools/audit_release.py --history in CI.
    Prompt for Claude
    GOAL: Add a regression set of <N> scripted runs and make `python tools/check.py --regress` run them all.
    READ FIRST: `PROGRESS.md`, `runs/README.md`, `CLAUDE.md`.
    FENCE: Edit only `runs/`, `tools/` and `PROGRESS.md`. Store hashes and input scripts only, never frames, saves or game data. Use a separate save folder for every run. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `python tools/check.py --regress` twice on a clean checkout. Done means the same PASS both times and `git ls-files` shows no game-derived file.
    BUDGET: Stop after 3 failed tries at one run.
    IF BLOCKED: If a run is not repeatable with a fixed `--rtc-seed`, stop and show the two hash files. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste both check outputs. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenpython tools/check.py --regress passes twice in a row on a clean checkout, and the no-game-data audit passes.

    Proof this works: Blue Stinger Recompiled (recorded gameplay scripts, tiered regression tools/dev/regressao.ps1), Sonic Adventure Recompiled (isolated save root, frozen hash-checked baseline), Army Men: Sarge's Heroes - Recompiled (audit_release.py --history in CI)

  8. Package a builder for the player's own disc

    You may not share the translated game. So ship the translator and runtime only. The player's PC checks their disc, translates it and compiles it. Six reviewed ports work this way: Voldorium, Hail to the King, deSPIRIA, Street Fighter Alpha 3, Blue Stinger and Ikaruga.

    • Check the player's boot file by hash first. Refuse any other release.
    • Download pinned, checksummed tools on first run. Voldorium fetches llvm-mingw and Zig; Hail to the King fetches llvm-mingw, CMake, Ninja, Python and SDL2.
    • Translate and compile on the player's PC. The reviewed ports report from half a minute to 30 minutes.
    • Refuse to finish a release if any file holds translated code. Voldorium's build does this.
    • Warn players that Windows Defender may flag an unsigned builder. Voldorium documents a false alarm.
    Prompt for Claude
    GOAL: Make `tools/make_release.py` produce a builder that turns the player's own disc into the game, with no game code inside the release.
    READ FIRST: `SCOPE.md`, `PROGRESS.md`, `tools/check.py`, `LEGAL.md`.
    FENCE: Edit only `tools/make_release.py`, `launcher/` and `docs/players.md`. Pin every downloaded tool by version and SHA-256. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `python tools/make_release.py --audit dist/`. Done means it lists every file, finds no translated function or disc data, and a fresh folder builds the game from my disc to the first frame.
    BUDGET: Stop after 3 failed tries.
    IF BLOCKED: If the audit flags a file you think is safe, stop and ask. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste the audit output and the first-frame log. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenThe release audit finds no game code or data, and a clean folder builds the game from your disc to the first frame.

    Proof this works: Voldorium (local translate and compile; release refuses translated functions; pinned SHA-256 downloads), Evil Dead: Hail to the King PC (build.bat downloads pinned tools into .tools), deSPIRIA reBIRTH (upstream pinned to a commit, fixes as an overlay), Street-Alpha-3-Dreamcast-Recomp (setup app converts the player's disc), Blue Stinger Recompiled (Builder makes the exe from the player's CDI), ikaruga-decomp (decompiles on the player's Mac)

Path B: Full decomp for porting

First the boot file is split into one assembly file per function. The SDK's own assembler and linker rebuild it byte for byte. Then C is written for each function and proven in an SH-4 simulator. The dc-decomp-kickoff skill runs all nine steps, up to a disc built from the C. A PC port after that is new ground on this system.

Method: non-matching decompilation (behaviour-equivalent C, byte-matching as a bonus)

Pick this to read, mod or translate the game, or to port it later. You must have a Katana SDK. If you cannot get one legally, take Path A instead.

  1. Scope: code layout, SDK release and prior work

    Check the game fits the method. Its code must sit in the boot file at a fixed address. Find which SDK release it was built with. Check for a decomp that already exists.

    • Search GitHub for <game> decomp. dc-decomp-kickoff lists worked examples. A complete matching decomp of Sonic Adventure already exists.
    • Look at the disc with dcdisc, as in Path A step 1: dcdisc inspect <disc>.gdi -o notes/disc-report.md and dcdisc manifest <disc>.gdi > notes/disc-manifest.json.
    • Check the boot file. If it is 0WINCEOS.BIN, the game uses Windows CE and the skill does not apply.
    • If the game loads most code from other files, like Phantasy Star Online, the skill stops at step 1.
    • Find out if a later port, a prototype or cheat codes exist. The kickoff uses these to name functions. An Android port with symbols helps most.
    • Write SCOPE.md with the disc serial, boot file hash, SDK release, mode (equivalent or matching) and what is out of scope.
    Prompt for Claude
    GOAL: Draft `SCOPE.md` for a decomp of <GAME> (product <PRODUCT_NO>) and say if `dc-decomp-kickoff` fits it.
    READ FIRST: `notes/disc-report.md` and `notes/disc-manifest.json` from `dcdisc`, the `dc-decomp-kickoff` README at https://github.com/consolesplayingconsoles/dc-decomp-kickoff (What it reads, Worked examples).
    FENCE: Write only `SCOPE.md` and `notes/prior-work.md`. Do not fetch any SDK, disc or compiler. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `grep -cE '^## (Code layout|SDK release|Mode|Prior work|Out of scope)' SCOPE.md`. Done means it prints 5, and every prior-work line has a URL you opened.
    BUDGET: Stop after 1 hour.
    IF BLOCKED: If the game loads its code from many files or is Windows CE, stop and say so first. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Fits or does not fit, with the reason. 3) Prior work with URLs. 4) Materials that could name functions. 5) Questions for me.
    Done whengrep -cE '^## (Code layout|SDK release|Mode|Prior work|Out of scope)' SCOPE.md prints 5, and its last line is Approved: <date> in your words.

    Proof this works: https://github.com/consolesplayingconsoles/dc-decomp-kickoff (What it reads; PSO not compatible), https://github.com/reshaped/sonic-adventure (complete matching decomp of Sonic Adventure JP 1.007), Crazy Taxi decomp (setup refuses other releases by SHA-1)

  2. Set up the kickoff skill, Docker or WSL, and your SDK

    The skill runs the Hitachi tools and Ghidra in Docker. On Windows, Docker Desktop uses WSL. Or run everything in WSL with DC_LOCAL=1. You hand over the disc as .gdi and your SDK folder. The skill never downloads them.

    • Run Claude Code inside WSL for this path. Keep the disc, the SDK and the repo under your WSL home folder.
    • Install the skill: git clone https://github.com/consolesplayingconsoles/dc-decomp-kickoff ~/.claude/skills/dc-decomp-kickoff.
    • Docker route: install Docker Desktop. In Settings > Resources > WSL Integration, turn on your Ubuntu. Then docker info must work in WSL.
    • No-Docker route in WSL: bash ~/.claude/skills/dc-decomp-kickoff/scripts/setup_tools.sh --check, then the same without --check. It installs pinned wibo, unshield, JDK 21 and Ghidra. Then source ~/dc-tools/env.sh and set DC_LOCAL=1.
    • Check python3 --version prints 3.6 or newer. The skill needs Python 3 on every route.
    • Keep about 4 GB free. Run one Ghidra job at a time, since each needs about 1 GB.
    • In Claude Code, run /dc-decomp-kickoff. Step 1 checks your disc and SDK.
    Prompt for Claude
    GOAL: Complete kickoff step 1 (Decomp project setup) for <GAME>.
    READ FIRST: `~/.claude/skills/dc-decomp-kickoff/SKILL.md` (Requirements and the machine, Step 1), `SCOPE.md`.
    FENCE: Use only the disc folder <DISC_DIR> and SDK folder <SDK_DIR> I name. Never search my folders, never download an SDK or disc. Write only inside <REPO_DIR>. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `docker info` (or `bash ~/.claude/skills/dc-decomp-kickoff/scripts/setup_tools.sh --check` with `DC_LOCAL=1`). Done means the skill prints `=== Step 1 of 8 done: Decomp project setup ===` and the boot file hash matches `SCOPE.md`.
    BUDGET: Stop after 3 failed tries at the same error.
    IF BLOCKED: If the SDK lacks `asmsh.exe`, `lnk.exe` or `lbr.exe`, stop and tell me. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste the step summary and the tool check. 3) Files changed. 4) SDK release found. 5) New parking-lot items.
    Done whenThe skill prints === Step 1 of 8 done: Decomp project setup === (its own banner says 8, though it runs nine steps), and docker info or setup_tools.sh --check passes.

    Proof this works: https://github.com/consolesplayingconsoles/dc-decomp-kickoff (install line, Docker or DC_LOCAL=1, setup_tools.sh), https://github.com/consolesplayingconsoles/dc-decomp-kickoff/blob/main/SKILL.md (step banners, Python 3.6+, about 4 GB free, unshield), https://docs.docker.com/desktop/features/wsl/ (WSL Integration setting), Zombie Revenge decomp (Hitachi tools under wibo in Docker; DC_LOCAL=1 on Linux)

  3. Rebuild the boot file byte for byte and name what you can

    This is kickoff steps 2 and 3. The boot file is split into one assembly file per function. The SDK's tools rebuild it, and build.sh must print MATCH. SDK functions get names by signature. Then maps of text, models and sounds are written.

    • Let the skill run step 2. It uses Ghidra, splits the code, and builds with asmsh, lnk and elf2bin.
    • Check the gate by hand: bash build.sh must print MATCH.
    • functions.txt is the source of truth for names and sizes. Rename only there, rerun split_asm.py, and build. Names never change bytes.
    • Let step 3 write the text, model, texture and audio maps.
    • Open the result in Shuriken Explorer in your browser to look at models and code side by side. Your files stay on your PC.
    Prompt for Claude
    GOAL: Complete kickoff steps 2 and 3 for <GAME>: a byte-identical rebuild with SDK names, and the asset maps.
    READ FIRST: `SKILL.md` Step 2 and Step 3, `SCOPE.md`, `PROGRESS.md`.
    FENCE: Edit only files the skill's scripts write, plus `PROGRESS.md`. Never hand-edit files in `asm/`. Run one Ghidra action at a time. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `bash build.sh` and `python3 tools/progress.py`. Done means `build.sh` prints `MATCH` and progress shows the named function count.
    BUDGET: Stop after 3 failed builds with the same error.
    IF BLOCKED: If a script prints an empty table, stop at once. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste `build.sh` output and `progress.py` output. 3) Files changed. 4) Functions named versus `FUN_`. 5) New parking-lot items.
    Done whenbash build.sh prints MATCH, and python3 tools/progress.py reports the named and unnamed counts.

    Proof this works: Crazy Taxi decomp (build.sh prints MATCH; SDK names by unique signature match), Zombie Revenge decomp (names only in functions.txt; build still MATCH), https://consolesplayingconsoles.github.io/dc-shuriken-explorer/

  4. Prove the first functions: scripts first, then one by hand

    This is kickoff step 5. Free scripts write C and test cases first. Then you prove one small file by hand, end to end. Each function runs twice in the simulator: original bytes and your C. Calls, memory writes and the result must agree.

    • If you have the SDK's library source, run python3 tools/5-generated/sdk_source.py <folder>.
    • Run python3 tools/5-generated/gen_equiv. It writes C and cases in parallel. Read the blockers in build/gen_failed.txt.
    • Run python3 tools/5-generated/gen_equiv --retest to widen weak test coverage.
    • Pick one small file. Write its C and cases in tests/<file>/<function>.json, split into dev and holdout.
    • Check it: python3 tools/equiv.py src/<file>.c. A function counts only when both case sets pass.
    • Run python3 tools/progress.py. Generated and hand-written C are counted apart.
    Prompt for Claude
    GOAL: Run the script-generated pass, then prove every function in `src/<FILE>.c` Equivalent by hand.
    READ FIRST: the repo's `AGENTS.md` (The C loop), `functions.txt`, `python3 tools/shdis.py --func <FUNC>` output for each function.
    FENCE: Edit only `src/<FILE>.c`, `tests/<FILE>/` and `docs/equivalent.md`. Never edit `tools/equiv.py`, `tools/sh4sim.py` or a case to make it pass. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `python3 tools/equiv.py src/<FILE>.c` and `bash build.sh`. Done means every function is Equivalent on dev and holdout cases, and `build.sh` still prints `MATCH`.
    BUDGET: At most 5 serious tries per function. Then move it to `partial/` with a note.
    IF BLOCKED: If `tools/5-generated/classify.py <FUNC>` says it cannot be C, stop for that function. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste the `equiv.py` output with instruction coverage. 3) Files changed. 4) Functions left in `partial/`. 5) New parking-lot items.
    Done whenpython3 tools/equiv.py src/<FILE>.c shows every function Equivalent on dev and holdout cases, and bash build.sh still prints MATCH.

    Proof this works: Crazy Taxi decomp (gen_equiv, dev and holdout cases, equiv.py), Virtua Tennis decomp (script-generated C first, then agentic pockets), Tokyo Bus Guide decomp (the same idea with sh4objtest: original and C run against one test spec)

  5. Grind: workers on separate pockets

    This is kickoff step 6. The rest is done pocket by pocket: library code without source, the game's own code, then runtime routines. Give each worker its own files. One lead owns the build, the progress file and git.

    • Pick functions that unlock the most others first. Smallest first is only the tie-break.
    • Give each worker a disjoint set of src/ files in its own git worktree.
    • Workers run only python3 tools/equiv.py src/<file>.c for their files.
    • Use RAM dumps from the running game for functions that need world state. tools/4-boosts/live.py reads them from RetroArch with its Flycast core. Run it with no arguments to see its setup.
    • The lead merges one worker at a time, runs bash build.sh and python3 tools/progress.py, then commits.
    • Run python3 tools/consistency.py after runs overlap. It finds C defined twice and cases with no C.
    Prompt for Claude
    GOAL: Lead session: hand out the next <N> files from the pocket <POCKET> to <N> workers and merge their proven results.
    READ FIRST: the repo's `AGENTS.md`, `tests/equivalent.txt`, `python3 tools/progress.py` output.
    FENCE: Workers edit only their own `src/` and `tests/` files in their own worktree. Only you run `build.sh`, `consistency.py` and git. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: After each merge run `python3 tools/equiv.py src/<FILE>.c`, `bash build.sh` and `python3 tools/consistency.py`. Done means `MATCH`, no consistency errors, and progress went up.
    BUDGET: Stop the batch when 2 merges in a row fail a check.
    IF BLOCKED: If two workers touched the same file or a shared header, stop and tell me. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Check output after the last merge and the new progress numbers. 3) Files merged. 4) Files sent back. 5) New parking-lot items.
    Done whenAfter each batch, bash build.sh prints MATCH, consistency.py is clean, and progress.py shows the new Equivalent count.

    Proof this works: Crazy Taxi decomp (functions that unlock the most others first; RAM dumps via live.py), https://github.com/consolesplayingconsoles/crazy-taxi-decomp/blob/main/AGENTS.md (live.py needs RetroArch with the Flycast core), Zombie Revenge decomp (all 5,189 C-able functions Equivalent in about four weeks)

  6. The hard tail: junk RAM, dropped arguments and matching

    Some C passes the simulator but fails on a console. The simulator fills unset RAM with zero, but a console holds leftovers. Calls can also drop arguments without the check seeing it. Find these before you build from C. Then try byte matching where it pays off.

    • Run python3 tools/5-generated/overreads.py src/<file>.c. It reruns cases with junk in unused RAM.
    • Before the first build, compare trampolines with state/arity_scan.json. Regenerate short ones with python3 tools/5-generated/gen_equiv --regen <name>.
    • For the matching tier, write a whole unit with an @unit header. Iterate until build.sh prints MATCH.
    • Compare function by function while you iterate. The first wrong function shifts everything after it.
    • If no rewording moves a difference, try another SHC release. decomp.me's archive has SHC 5.0 and 5.1 builds.
    • Leave a unit as assembly after a fair try. Write down what differs.
    Prompt for Claude
    GOAL: Clear the hard tail for `src/<FILE>.c`: no over-reads, no dropped arguments, and match the unit if it can be done fairly.
    READ FIRST: the repo's `AGENTS.md` (Matching notes, Building from C), `state/arity_scan.json`, `notes/hard/<FILE>.md`.
    FENCE: Edit only `src/<FILE>.c`, its cases and `notes/hard/<FILE>.md`. No inline assembly. No changes to `equiv.py`, `sh4sim.py`, `build.sh` or the expected hash. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `python3 tools/5-generated/overreads.py src/<FILE>.c`, `python3 tools/equiv.py src/<FILE>.c` and `bash build.sh`. Done means no over-read, all Equivalent, and `MATCH`.
    BUDGET: Stop matching after 20 serious variants without progress. Write what you learned.
    IF BLOCKED: If a function needs FPU bank or control register tricks that C cannot express, stop for it. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste all three outputs. 3) Files changed. 4) What still differs and why. 5) New parking-lot items.
    Done whenoverreads.py reports no difference, equiv.py shows all Equivalent, and bash build.sh prints MATCH.

    Proof this works: Crazy Taxi decomp (overreads.py, arity scan, literal pools shared per file), Virtua Tennis decomp (dropped-argument trampolines; units stay asm after a fair try), https://github.com/decompme/compilers/tree/main/platforms/dreamcast (SHC 5.0 and 5.1 releases)

  7. Harden: the gate, the ledger and a cheat hunt

    Make the build and the simulator the only judges. Run the gate before every commit. Let the progress script write the numbers. A fresh session hunts for weakened cases and edited tools.

    • Turn on the progress hook once per clone: git config core.hooksPath tools/hooks.
    • Block edits to asm/, tools/equiv.py, tools/sh4sim.py, build.sh and the expected hash with a PreToolUse hook. Exit code 2 blocks the edit.
    • Check that every function in tests/equivalent.txt has holdout cases and an entry in docs/equivalent.md.
    • Grep for C in partial/ counted as done, and for cases with only one input.
    • Keep the instruction coverage figure from equiv.py. Crazy Taxi reports 82.6%, Zombie Revenge 68.5%.
    Prompt for Claude
    GOAL: Audit the last <N> commits for fake proofs and broken rules.
    READ FIRST: `git log -<N> --stat`, the repo's `AGENTS.md`, `CLAUDE.md`.
    FENCE: Read only. Write findings to `notes/audit-<DATE>.md`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: From a clean checkout run `bash build.sh`, `python3 tools/consistency.py` and `python3 tools/progress.py`. Grep the diff for edits to `tools/`, `asm/`, holdout cases and the expected hash. Done means the gate passes and each finding cites a file and line.
    BUDGET: Stop after 1 hour.
    IF BLOCKED: If the gate fails on a clean checkout, stop at once. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Gate output. 3) Findings with file and line. 4) Commits to revert. 5) New parking-lot items.
    Done whenA fresh checkout passes bash build.sh with MATCH, consistency.py is clean, and the audit file lists every finding with a file and line.

    Proof this works: Zombie Revenge decomp (git config core.hooksPath tools/hooks; progress badge from a pre-commit hook), Crazy Taxi decomp (coverage 82.6%; partial/ counted apart), https://code.claude.com/docs/en/hooks (exit code 2 blocks a PreToolUse call)

  8. Build the game from C and fix it at run time

    This is kickoff steps 7 to 9. The proven C must fit where the original code was. Then the boot file is built from C and put on a disc image. You run it in Flycast and fix each stop. Libraries stay as original bytes.

    • Shrink code that is too big: tools/7-reduction/shrink.py <name> keeps new C only if it is smaller and still passes.
    • Mark the NAOMI library, the C runtime and the Katana libraries as keep in layout.txt. Their hand-written code passes state in registers.
    • Build: make c, then make disc GDI="<your disc>.gdi".
    • Build Flycast with -DENABLE_GDB_SERVER=ON, since GDB is off by default. Its default port is 3263.
    • If the build from C hangs, put half the C functions back to assembly and test again. Virtua Tennis logged this in docs/hang-bisect.md.
    • Do not put new code in the filler after the boot block. Virtua Tennis got a black screen that way.
    • Tick status.txt only with proof: BUILDS FROM C, BOOTS TO MENU, PLAYABLE, STABLE.
    Prompt for Claude
    GOAL: Build <GAME> from the proven C and reach <STATUS_TICK> in `status.txt`.
    READ FIRST: the repo's `AGENTS.md` (Building from C, Changing the game), `layout.txt`, `state/arity_scan.json`, `docs/hang-bisect.md` if it exists.
    FENCE: Edit only `layout.txt`, `src/` files named in the issue, `docs/` and `status.txt`. Never move code into the boot block filler. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `make c` and `make disc GDI="<DISC>.gdi"`, then boot the disc in Flycast to <MARKER>. Done means the image has the original size and a screenshot or GDB read proves the marker.
    BUDGET: Stop after 3 bisect rounds without narrowing the cause.
    IF BLOCKED: If the build from C runs in Flycast but you cannot test on a console, say so. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: `make c` output and the screenshot or GDB read. 3) Files changed. 4) What you did not verify. 5) New parking-lot items.
    Done whenmake c builds an image of the original size, the disc boots in Flycast to the named point, and status.txt cites the proof.

    Proof this works: Virtua Tennis decomp (all four status.txt ticks; hang bisect; restart-loop log), Zombie Revenge decomp (PLAYABLE in Flycast, crashes at the VMU screen on a console), https://github.com/flyinghead/flycast (CMake option ENABLE_GDB_SERVER, default off)

  9. Port: move the proven C to a PC host

    No reviewed Dreamcast decomp has a PC port yet. The kickoff's C is shaped for machines, not people. One outside project, a full Sonic Adventure match, builds a PC game. The realistic route is a port layer for each Katana library, checked against Flycast.

    • Read how the Sonic Adventure decomp does it. Its make pc builds a PC game from your disc, and ENGINE.md describes the backends.
    • Make one stand-in per SDK part: Kamui or Ninja graphics, sound, GD-ROM files, pads and memory card. Voldorium's list of about 130 library calls is a guide.
    • Replace the console graphics with Vulkan or OpenGL drawn from the game's own polygon lists, as the recomps do.
    • Model SH-4 float behaviour. Sonic Adventure credits a header for bit-exact SH-4 FPU math.
    • Keep 32-bit pointers in game structs, or audit each struct, before you build for 64-bit.
    • Prove it with replays: the same inputs in Flycast and on PC, with memory hashes compared per frame.
    • Write tools/golden.py first. It runs the PC build with a fixed input script and passes only when the named point shows in the log.
    Prompt for Claude
    GOAL: Make the PC stand-in for <SDK_PART> (for example GD-ROM file reads) and boot the PC build past it.
    READ FIRST: `port/README.md`, `functions.txt`, `sdk.txt`, the Katana call list in `notes/sdk-calls.md`, the KallistiOS docs for the matching hardware.
    FENCE: Edit only `port/<SDK_PART>/` and code inside `#ifdef TARGET_PC` blocks. Keep the Dreamcast build passing `bash build.sh` with `MATCH`. Never paste Sega SDK source or headers. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `cmake --build build-pc && ctest --test-dir build-pc` and `python3 tools/golden.py --until <MARKER>`. Then run `bash build.sh`. Done means tests pass, the marker appears, and `MATCH` still prints.
    BUDGET: Stop after 3 failed tries.
    IF BLOCKED: If the game relies on hardware you cannot model from docs or Flycast, stop. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste the check output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenThe PC build passes its tests and reaches the named point in a scripted run, and the Dreamcast build still prints MATCH.

    Proof this works: https://github.com/reshaped/sonic-adventure (make pc, make play; bit-exact SH-4 FPU header credited), Voldorium (about 130 Katana library calls replaced with native code), Ikaruga port (decompiled C++ plus a hand-written port layer for Ninja, Kamui and Metal), https://github.com/phobos665/dream-recomp (rule: never paste Sega SDK source; use KallistiOS as the reference)

Tools you need

ToolWhat it doesHow to get itHow we know
dream-recomp
Required both
Turns the SH-4 code of a Dreamcast boot file into C++ ahead of time. It also emulates the graphics, sound and memory, and answers BIOS and disc calls itself. Path B uses only its disc tool, dcdisc.
Path A Path B
`git clone --recurse-submodules https://github.com/phobos665/dream-recomp`, then `cmake -S . -B build -DDREAM_DEV_INTERPRETER=ON`, `cmake --build build --parallel`, `ctest --test-dir build --output-on-failure` and `pip install -e tools/dcdisc`. For a window, also install Vulkan, SDL3 and `glslc`tool README and tools/dcdisc/README.md (read 2026-11-13; GPL-2.0; MSVC 2022 or clang 16+); used by: deSPIRIA reBIRTH (pinned 51a148c), Ikaruga port, Bomberman Online Recomp and Army Men (through Dreamcomp)
Dreamcomp
Helpful both
A kit built on dream-recomp for making one PC port per game. It adds hooks, settings, a no-game-data audit and Claude Code skills.
Path A
Clone https://github.com/danielgomesvieira2000/dreamcomp. Install VS 2022 Build Tools, LLVM `clang-cl`, `CMake`, `Ninja`, Python 3.10+ and the Vulkan SDK. Then `python tools/dc.py doctor` and `python tools/dc.py deps`tool README (read 2026-11-13; Windows x64 built and tested, Linux compiles; developed with Claude Code); used by: Bomberman Online Recomp, Army Men: Sarge's Heroes - Recompiled (vendored copies)
Flycast
Required both
The main open Dreamcast emulator. It is the reference for how the real game acts. A build with GDB lets tools read live RAM.
Path A Path B
Download a build from https://flyinghead.github.io/flycast-builds/ or GitHub Releases. For GDB, build from source with the CMake option `-DENABLE_GDB_SERVER=ON`tool README, CMakeLists.txt (ENABLE_GDB_SERVER default OFF) and core/debug/gdb_server.h (port 3263), latest release v2.7 (all read 2026-11-13); used by: Blue Stinger, Voldorium, Tokyo Bus Guide, Crazy Taxi, Virtua Tennis, Zombie Revenge
Ghidra
Required both
A free tool that reads machine code and shows assembly and rough C. Here it finds function starts and lets Claude read code through an MCP server.
Path A Path B
Install JDK 21. Download the Ghidra 12.1.4 release zip from the releases page, unzip it, and run `ghidraRun.bat`. Import the boot file as raw binary with language `SuperH4:LE:32:default`README at tag Ghidra_12.1.4_build names JDK 21; current README names JDK 25 for 12.2; Processors/SuperH4 defines SuperH4:LE:32:default (read 2026-11-13); used by: Voldorium, Bomberman Online (12.1.4), Ikaruga (12.2, patched), Tokyo Bus Guide, dc-decomp-kickoff
Visual Studio 2022 Build Tools and clang-cl
Required Windows
Microsoft's C++ compiler for Windows, plus LLVM's clang-cl. dream-recomp builds with MSVC 2022; Dreamcomp needs clang-cl.
Path A
Download Build Tools for Visual Studio 2022 from the older downloads page, https://visualstudio.microsoft.com/vs/older-downloads/. Pick **Desktop development with C++** and add its optional part **C++ Clang tools for Windows**dream-recomp README (MSVC 2022) and Dreamcomp README (VS 2022 Build Tools, LLVM clang-cl); VS downloads page now leads with 2026, and 2022 Build Tools sit on the older downloads page; Microsoft Learn 'Clang/LLVM support' names the C++ Clang tools for Windows option (all read 2026-11-13); used by: Blue Stinger (MSVC presets), Sonic Adventure Recompiled (clang-cl)
CMake and Ninja
Required both
CMake writes the build files and Ninja runs them fast. Every reviewed recomp builds with both.
Path A Path B
On Windows, `CMake` comes with the **Desktop development with C++** workload, or get it from https://cmake.org/download/. Get `ninja-win.zip` from the Ninja releases page and put `ninja.exe` on your `PATH`. In WSL: `sudo apt install cmake ninja-build`dream-recomp README needs CMake 3.24+; Microsoft Learn 'CMake projects in Visual Studio' (C++ CMake tools for Windows ship with the C++ workload); Ninja release v1.13.2 asset list (all read 2026-11-13); used by: Blue Stinger, Bomberman Online, Army Men, Street Alpha 3, Hail to the King, Sonic Adventure Recompiled
llvm-mingw
Helpful Windows
A Clang compiler for Windows that you unpack and use. Several ports use it to compile the game on the player's PC.
Path A
Download `llvm-mingw-20261104-ucrt-x86_64.zip` from the releases page and unpack it to a short path like `C:\llvm-mingw`tool README and latest release 20261104 asset list (read 2026-11-13); used by: Voldorium, deSPIRIA reBIRTH, Evil Dead: Hail to the King PC
Capstone
Helpful both
A disassembler library that knows SuperH. Use it to cross-check your own SH-4 decoder, one instruction at a time.
Path A
`pip install capstone` (version 5.0.9 has a Windows wheel)tool README lists SH; PyPI page shows 5.0.9 with a win_amd64 wheel (read 2026-11-13); used by: Blue Stinger (tools/dev/compare_capstone.py)
dc-decomp-kickoff
Required WSL/Linux
A Claude Code skill that starts and runs a Dreamcast decomp in nine steps, from disc to a game built from proven C.
Path B
In WSL: `git clone https://github.com/consolesplayingconsoles/dc-decomp-kickoff ~/.claude/skills/dc-decomp-kickoff`, then run `/dc-decomp-kickoff` in Claude Code. You supply the `.gdi` and a Katana SDKtool README and SKILL.md (read 2026-11-13; Docker on any OS, or DC_LOCAL=1 on Linux x86_64; never downloads SDKs or games); used by: Crazy Taxi, Virtua Tennis, Zombie Revenge decomps
Docker Desktop
Helpful both
Runs the kickoff's Hitachi tools and Ghidra in containers. On Windows it uses WSL 2 underneath.
Path B
Install Docker Desktop for Windows. In Settings > Resources > WSL Integration, turn on your Ubuntu and press Apply. Skip it if you use `DC_LOCAL=1` in WSLDocker WSL docs page (read 2026-11-13); kickoff SKILL.md (Docker is the default; about 4 GB free); used by: Crazy Taxi, Virtua Tennis, Zombie Revenge, Tokyo Bus Guide
wibo
Required WSL/Linux
Runs small 32-bit Windows command-line tools on Linux. It is how the Hitachi shc, asmsh and lnk run in WSL or Docker.
Path B
In WSL, the kickoff's `scripts/setup_tools.sh` installs a pinned copy. Or download `wibo-i686` (the README calls `wibo-x86_64` experimental) from the releases page and put it on your `PATH`tool README and release 1.2.0 asset list (read 2026-11-13; Linux and macOS only); used by: Crazy Taxi, Virtua Tennis, Zombie Revenge, Tokyo Bus Guide; also the Sonic Adventure matching decomp
Hitachi SHC (decomp.me compiler archive)
Helpful WSL/Linux
The original Dreamcast C compiler, in several releases. You need it for the byte-matching tier and for testing another release.
Path B
Your Katana SDK holds one copy. The decomp.me archive lists `shc-v5.0r10` to `shc-v5.1r13` under `platforms/dreamcast`; each Dockerfile names its release downloaddecompme/compilers repo listing and shc-v5.0r10/Dockerfile (read 2026-11-13); used by: Tokyo Bus Guide (SHC from SDK 1.55J), Crazy Taxi (@unit files built with shc), Sonic Adventure matching decomp (downloads three SHC releases)
objdiff
Helpful both
Compares one function of your build with the original, side by side. It supports SuperH, so use it while you chase a byte match.
Path B
Download `objdiff-windows-x86_64.exe` from the latest release page and run ittool README lists SuperH (Saturn, Dreamcast); latest release v3.8.3 (read 2026-11-13); no reviewed Dreamcast project names it, so treat it as an option
Shuriken Explorer
Helpful both
A web page that shows a Dreamcast game's models, textures, sounds and code from your own files. Nothing is uploaded.
Path B
Open https://consolesplayingconsoles.github.io/dc-shuriken-explorer/ and pick your disc files or your kickoff repotool README (read 2026-11-13; reads kickoff output; ADX and WAV play); used by: Crazy Taxi, Virtua Tennis, Zombie Revenge decomps
RetroArch with the Flycast core
Helpful both
A front end that runs emulator cores. The kickoff decomps run its Flycast core so tools/4-boosts/live.py can read the game's RAM while it plays.
Path B
Download RetroArch from https://www.retroarch.com/ and add its Flycast core. Then run `python3 tools/4-boosts/live.py` with no arguments in your decomp repo for the setup stepsRetroArch README (cores are libraries the front end loads) and Crazy Taxi AGENTS.md (live.py needs RetroArch with the Flycast core), read 2026-11-13; the core install steps were not checked here; used by: Crazy Taxi, Virtua Tennis, Zombie Revenge decomps

Skills and add-ons

Read any skill before you install it. A skill is a set of instructions that Claude will follow. See Tools and Skills for the full list and safety notes.

dc-decomp-kickoff

plugin

The Path B plan in skill form. It ran the three reviewed kickoff decomps. It never fetches games or SDKs, and it asks before each step.

Not on skills.sh. Clone it into your skills folder: `git clone https://github.com/consolesplayingconsoles/dc-decomp-kickoff ~/.claude/skills/dc-decomp-kickoff`. Read `SKILL.md` first; it is 87 KB of rules.

Dreamcomp project skills (/dc-playtest, /dc-investigate and seven more)

plugin

Build, run and look; bug hunts that read known traps first; audits for game data. Bomberman Online and Army Men carry them. They are written for the kit's own maintainer and use paths under DC/, so adapt them before use.

They ship in `Dreamcomp`'s `.claude/skills/` folder. Clone `Dreamcomp` and open Claude Code in it.

GhidraMCP

MCP server

Lets Claude read functions and cross-references from your Ghidra project. Tokyo Bus Guide gave its agent a Ghidra MCP on a Flycast RAM dump. It can rename, so keep it read-only.

Install the plugin zip from its releases with `File > Install Extensions` in Ghidra 12.1.4, restart, and enable `GhidraMCPPlugin` under `File > Configure > Developer`. Install `uv`. Then: `claude mcp add ghidra -- uvx --from git+https://github.com/LaurieWired/GhidraMCP ghidra-mcp --ghidra-server http://127.0.0.1:8080/`

ghidra-headless

skills.sh

Runs Ghidra with no window and saves functions and symbols to files. Use it when an MCP server is too fragile. On Windows, set GHIDRA_HOME yourself.

npx skills add trailofbits/skills-curated --skill ghidra-headless -a claude-code

static-recomp-scope-plan

skills.sh

Makes you write down what correct means before work starts: the exact build, the scenes to test, and the numbers to hit. It fits Path A step 1. On 2026-11-13 its skills.sh page said it is not listed there. Its SKILL.md is still in the GitHub repo.

npx skills add bgyss/switchrecomp --skill static-recomp-scope-plan -a claude-code

systematic-debugging

skills.sh

No fix until the cause is found, and a rethink after three failed fixes. It matches the dreamcomp/CLAUDE.md rule of one verified change at a time.

npx skills add obra/superpowers --skill systematic-debugging -a claude-code

verification-before-completion

skills.sh

Claude may not say done without running the check and showing it. It fits Blue Stinger's rule never to weaken a check to get a pass.

npx skills add obra/superpowers --skill verification-before-completion -a claude-code

orchestrator

skills.sh

Runs many workers, each in its own worktree and slice. Every merge must pass the byte check, like build.sh printing MATCH. If it points you to a compiler download, whether that is legal is your call.

npx skills add lemiur/game-decompilation-skill-for-claude --skill orchestrator -a claude-code

handoff

skills.sh

Writes a short note so a fresh session can carry on. Tell it to save inside the project, not the temp folder.

npx skills add mattpocock/skills --skill handoff -a claude-code

dc-bringup (write your own)

write-your-own

Gives every Path A session the same loop. Dreamcomp's /dc-playtest and /dc-investigate skills show the idea.

Make `.claude/skills/dc-bringup/SKILL.md`. It says: run the title headless with `--rtc-seed 1000000`, read the report, add only `--suggest-config` seeds or Ghidra-proven addresses, never edit generated C++, compare with Flycast, rerun `python tools/check.py --regress`, then commit with before and after numbers.

dc-equiv-unit (write your own)

write-your-own

Puts the kickoff's agent rules for one file in one place, so every worker gets them without a long prompt.

Make `.claude/skills/dc-equiv-unit/SKILL.md`. It names `python3 tools/equiv.py src/<file>.c` as the check, demands dev and holdout cases, runs `overreads.py` before claiming done, bans edits to `tools/`, caps tries at 5, and sets the report: Equivalent count, coverage, `partial/` left.

Claude setup for this system

On Dreamcast the unit is small. For Path A, one task is one stop address, one wrong frame, or one sound or movie bug. For Path B, one task is one source file of functions proven in the simulator. Every unit has a check: a run report with zero untranslated targets, a replayed capture, or equiv.py plus build.sh printing MATCH. One lead session owns the full build, the progress file and git.

Which model and effort for each job

The model and effort names come from one shared table, so they stay the same on every guide. See Claude Setup for the reasons.

JobWhat it means on this systemMax 20x (now called Ultra)Max 5x (now called Max)
Plan the projectInspect the disc with dcdisc, check for Windows CE and overlays, find prior work, and pick Path A's base or Path B's mode. Write SCOPE.md.Fable 5.2
effort high
One session. This choice shapes months of work.
Opus 5.5
effort high
Use Fable 5.2 for this one session if you have weekly room.
Set up the projectBuild dream-recomp or Dreamcomp, or set up the kickoff in Docker or WSL. Keep the disc and SDK out of git. Write tools/check.py.Opus 5.5
effort medium
Sonnet 5.5
effort medium
Study the game fileFind function starts in Ghidra with SuperH4:LE:32:default, seed the translator, and tag Katana library calls. In Path B, name functions from SDK signatures.Opus 5.5
effort high
Opus 5.5
effort medium
Raise to high for function edges and data layouts. A mistake there spreads.
Bulk unitsPath B: prove one file per worker with equiv.py, after gen_equiv has done the free part. Path A: add seeds from --suggest-config rounds.Sonnet 5.5
effort medium
Haiku 5.5 for the plainest units.
Sonnet 5.5
effort medium
Fewer workers at once. Haiku 5.5 for the plainest units.
Hard unitsFunctions that failed five tries, FPU bank tricks, byte matching with SHC, and dropped-argument trampolines found by the arity scan.Fable 5.2
effort high
Go to xhigh only after a failed try at high.
Opus 5.5
effort high
Send only the last few that still fail to Fable 5.2.
Build the runtimeFix the PowerVR2 renderer, the AICA sound chip, movies, pads and the memory card. In Path B's port, write the PC stand-ins for each Katana library.Opus 5.5
effort high
Opus 5.5
effort medium
Raise to high for timing and graphics bugs.
Find a bugFind why a run stops, draws wrong or drifts. Use the run report, an F11 capture, --write-hash files, or Flycast over GDB. Prove the cause first.Opus 5.5
effort high
After two failed tries with full evidence, move to Fable 5.2.
Opus 5.5
effort high
One bug at a time.
Check the workA fresh session reruns the gate on a clean checkout. It hunts for edited checks, weak or missing holdout cases, and hand edits to generated code.Opus 5.5
effort medium
Always a new session, never the one that did the work.
Sonnet 5.5
effort high
Always a new session, never the one that did the work.
Keep the recordsUpdate PROGRESS.md, notes/functions.csv, notes/game-internals.md, docs/equivalent.md and the handoff note.Haiku 5.5
effort medium
Haiku 5.5
effort medium

How many sessions at once

Max 20x (now called Ultra)

Path A: one lead plus two workers, each in its own worktree on a separate bug. Only the lead builds the whole game, since one build can take many minutes. Path B: one lead plus four to six workers on separate files. Run Ghidra jobs one at a time, since each needs about 1 GB.

Max 5x (now called Max)

Path A: one session at a time, plus a fresh verify pass. Path B: one lead plus one or two workers. Let gen_equiv do the free work first, and send only the hard tail to the hard job type.

Lines for this project's CLAUDE.md

Add to CLAUDE.md
- Read `SCOPE.md` and `PROGRESS.md` at the start of every session.
- Never edit generated C++. Fix the TOML config, a hook, or the translator instead.
- The one check is `python tools/check.py` (Path A) or `bash build.sh` printing `MATCH` (Path B). A claim of PASS pastes its output.
- No game data in any commit: no disc files, boot files, extracted assets, generated code, BIOS, flash, VMU saves or SDK files.
- Never paste Sega SDK source or headers into this repo, even in comments. Describe the interface in your own words.
- Do not copy GPL emulator code into this repo. Use Flycast only as a reference for behaviour.
- A fix is done when the symptom is shown gone in the reported condition. Say plainly what you did not verify.
- A function counts only when its dev and holdout cases both pass. Run `overreads.py` before claiming a file done.
- Libraries stay as original bytes: keep the Katana, NAOMI and C runtime ranges in `layout.txt`.
- Log each verification in `STATUS.md` with the date and the method. Keep failed ideas in `notes/dead-ends.md`.
- Test runs use their own save folder and never touch my real VMU files or settings.
- Write patch scripts with the edit tool, not shell heredocs. Heredocs eat backslashes here.
- In a worktree, use absolute paths and keep temp files in `tmp/` inside the project.

Keep the context small

  • Give Claude an address and a file path, not pasted disassembly. Let it print one function with tools/shdis.py --func <name>.
  • Keep CLAUDE.md short and point to docs by topic. Blue Stinger's grew to about 19 KB and costs context every session.
  • Put history and experiments in docs/, not in the agent file. SARecomp's AGENTS.md says this outright.
  • Use a subagent to read a long run report or gen_failed.txt, and have it report ten lines back.
  • Clear the chat after each task. State lives in PROGRESS.md, functions.txt and tests/equivalent.txt.
  • Turn on tracing only for the one subsystem you test. Big logs fill the disk and the context.

More prompts for this system

Each step above has its own prompt. These extra prompts cover the rest of the work. Fill in the parts in <ANGLE_BRACKETS>.

Scope and feasibility

Before any work, to decide if this Dreamcast game can be done and how.

Prompt for Claude
GOAL: Tell me if <GAME> (product <PRODUCT_NO>) can be ported to PC, by which technique, and what already exists.
READ FIRST: `notes/disc-report.md` from `dcdisc inspect`, https://github.com/phobos665/dream-recomp, https://github.com/consolesplayingconsoles/dc-decomp-kickoff.
FENCE: Write only `notes/feasibility.md` and a draft `SCOPE.md`. Do not touch game files or SDK files. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Write one claim per line starting with `- `. Run `grep -c '^- ' notes/feasibility.md` and `grep -cE '^- .*(https://|disc-report)' notes/feasibility.md`. Done means both print the same number.
BUDGET: Stop after 1 hour.
IF BLOCKED: If the game is Windows CE or loads code from many files, say so first. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Recommended path: recomp on `dream-recomp`, own translator, or kickoff decomp. 3) Prior work with URLs. 4) Risks: overlays, movies, Katana SDK access. 5) Questions for me.

A good answer: A short file that names one technique and lists prior work with links. It flags overlays, Windows CE and whether you have an SDK. It ends with a draft SCOPE.md.

Map the binary

After setup, to build the function ledger from the translator and Ghidra.

Prompt for Claude
GOAL: Build `notes/functions.csv` for <GAME> with address, size, library tag and status for every function, plus the uncovered byte runs.
READ FIRST: the coverage line in `logs/build-latest.txt`, `games/<ID>/<ID>.toml`, Ghidra through the MCP server (read-only).
FENCE: Write only `notes/functions.csv` and `notes/map-notes.md`. Do not rename or save anything in Ghidra. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `python tools/validate_map.py notes/functions.csv`. Done means no overlaps, and the row count matches the translator's function count plus seeds.
BUDGET: Stop after 2 hours.
IF BLOCKED: If Ghidra's addresses do not line up with the translator's, stop and show three examples. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste the check output. 3) Files changed. 4) Katana library calls found. 5) New parking-lot items.

A good answer: A ledger with one row per function, Katana calls tagged, uncovered runs listed with a guess and a status, and the validator output pasted.

Unit loop: one recomp stop

Path A, for each stop address, crash or wrong behaviour.

Prompt for Claude
GOAL: Fix one issue: <SYMPTOM> at <ADDRESS_OR_LOG_LINE>.
READ FIRST: `notes/issues/<ID>/spec.md`, `logs/<ID>.txt`, `notes/game-internals.md`, the Flycast reference for the same input.
FENCE: Edit only `games/<GAME_ID>/<GAME_ID>.toml`, `src/hooks/`, `tests/` and `notes/issues/<ID>/`. Never edit generated C++. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Show the new test failing first. Then run `python tools/check.py --test <ID>` and `python tools/check.py --regress`. Done means both pass.
BUDGET: Stop after 3 failed fixes.
IF BLOCKED: If the bug is in the translator, stop and describe the SH-4 instruction. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste the check output. 3) Files changed. 4) What you did not verify. 5) New parking-lot items.

A good answer: DONE with a failing-then-passing test, a config or hook change only, the regression output pasted, and the address added to the internals notes.

Unit loop: one decomp file

Path B, for each worker's file.

Prompt for Claude
GOAL: Prove every function in `src/<FILE>.c` Equivalent.
READ FIRST: the repo's `AGENTS.md` (The C loop), `functions.txt`, `python3 tools/shdis.py --func <FUNC>` for each function.
FENCE: Edit only `src/<FILE>.c` and `tests/<FILE>/`. No inline asm. Do not run `build.sh`, `consistency.py` or git. Never edit `tools/`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `python3 tools/equiv.py src/<FILE>.c` and `python3 tools/5-generated/overreads.py src/<FILE>.c`. Done means each function you claim is Equivalent on dev and holdout cases with no over-read.
BUDGET: Five serious tries per function. Then move it to `partial/` with a note.
IF BLOCKED: If a shared header must change, stop and ask. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) `equiv.py` output with coverage. 3) Equivalent versus `partial/`. 4) Guessed names. 5) Notes marked verified or inferred.

A good answer: A list of functions marked Equivalent or moved to partial/, with the equiv.py and overreads.py output pasted, and guessed names marked as guesses.

Batch dispatch

Path B lead session, to hand out the next batch of files.

Prompt for Claude
GOAL: Pick the next <N> files from pocket <POCKET> and start one worker per file in its own worktree.
READ FIRST: `python3 tools/progress.py` output, `tests/equivalent.txt`, the repo's `AGENTS.md`.
FENCE: Assign disjoint files only. Edit only `notes/assignments.md`. Workers follow the unit loop card. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: When workers report, merge one at a time and run `bash build.sh` and `python3 tools/consistency.py`. Done means `MATCH` and a clean consistency check after every merge.
BUDGET: Stop the batch if two merges in a row fail.
IF BLOCKED: If a worker reports a tool or simulator problem, pause the batch. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Gate output after the last merge. 3) Files merged and files returned. 4) New progress numbers. 5) Parking-lot items.

A good answer: An assignment table with no shared files, a merge log with the gate result after each merge, and new numbers taken from progress.py.

Debug with evidence

When the recomp stops, draws wrong, or drifts from Flycast. Or when a build from C hangs.

Prompt for Claude
GOAL: Find the cause of <SYMPTOM>. Do not fix it yet.
READ FIRST: `logs/<RUN>.txt`, the F11 capture `captures/<ID>/`, the `--write-hash` files `runs/<RUN>/*.hash`, the Flycast reference.
FENCE: Read only, plus new files in `notes/debug/<ID>/`. Turn on tracing only for the one subsystem you test. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Name the first frame or address where the PC build and Flycast differ, with the hash line or log lines that prove it.
BUDGET: Stop after 2 hours or 3 disproved theories.
IF BLOCKED: If you cannot reproduce it twice with the same `--rtc-seed`, stop. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) The proven cause with evidence. 3) Theories ruled out and how. 4) The smallest fix you propose. 5) Parking-lot items.

A good answer: One proven cause, with the first differing hash line or frame. A list of ruled-out ideas. A proposed fix that is not yet applied.

Verify: hunt for cheating

After any batch of claimed fixes or proofs. Always in a fresh session.

Prompt for Claude
GOAL: Check that the work in commits <RANGE> is real.
READ FIRST: `git log <RANGE> --stat`, `CLAUDE.md`, the repo's `AGENTS.md`.
FENCE: Read only. Write findings to `notes/verify-<DATE>.md`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: From a clean checkout run `python tools/check.py --regress` (Path A) or `bash build.sh` and `python3 tools/consistency.py` (Path B). Look for edits to generated code, `tools/`, holdout cases, expected hashes, new interpreter fallbacks and success stubs.
BUDGET: Stop after 1 hour.
IF BLOCKED: If the check fails on a clean checkout, report that first. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Check output. 3) Each finding with file and line. 4) Commits to revert. 5) Parking-lot items.

A good answer: A clean-checkout check result and a list of findings, each with a file and line, or a plain statement that nothing was found.

Status report

Weekly, or when you come back after a break.

Prompt for Claude
GOAL: Report project status with numbers from the ledgers only.
READ FIRST: `PROGRESS.md`, `STATUS.md`, `notes/functions.csv` or `python3 tools/progress.py` output, `status.txt`, `notes/parking-lot.md`.
FENCE: Read only. Write only `notes/status-<DATE>.md`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Every number cites the file it came from. Run the project check once and paste its summary line.
BUDGET: Stop after 20 minutes.
IF BLOCKED: If two files disagree, stop and show both. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Milestone status. 3) Counts: Equivalent functions, coverage, open issues, untranslated targets. 4) Top three blockers. 5) Parking-lot size.

A good answer: A short page of numbers, each with its source file, plus the check summary line and the top three blockers. No padding.

Session handoff

At the end of every session, before you clear the chat.

Prompt for Claude
GOAL: Write what the next session needs into the ledger files.
READ FIRST: `PROGRESS.md`, `notes/handoff.md`, this session's work.
FENCE: Edit only `PROGRESS.md`, `notes/handoff.md` and `notes/dead-ends.md`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run the project check (`python tools/check.py --regress` or `bash build.sh`) and `git status --short`. Paste both into `notes/handoff.md`. Done means it also names the next task and every dead end tried.
BUDGET: Stop after 15 minutes.
IF BLOCKED: If you are unsure what is done, mark it PARTIAL and say why. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Next task in one line. 3) Last check output. 4) Dead ends added. 5) Files changed.

A good answer: Updated PROGRESS.md and notes/handoff.md with the next task, the last check result and new dead ends, so no session repeats them.

Blocked or cannot deliver

When a task has stalled, or Claude keeps saying it should work.

Prompt for Claude
GOAL: Give me a plain answer on <TASK>: can it be done now, and if not, why.
READ FIRST: `notes/issues/<ID>/work.md`, the last three check outputs.
FENCE: Read only. Write only `notes/issues/<ID>/blocked.md`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run the task's own check once more and paste its output. Start with DONE, PARTIAL or BLOCKED. Every claim cites a log or file.
BUDGET: Stop after 20 minutes.
IF BLOCKED: If the honest answer is no, say no first. A missing Katana SDK, an untestable console bug, or a game that loads code from many files are valid answers. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
REPORT: 1) Outcome word. 2) What cannot be done and why. 3) What was tried. 4) Two or three options with cost. 5) What you need from me.

A good answer: A first line that says BLOCKED or PARTIAL, the reason with evidence, and two or three options with their cost. No "should work".

Scope change request

When Claude finds work outside the fence, like a translator bug or an engine change.

Prompt for Claude
GOAL: Ask me before leaving the fence for <CHANGE>.
READ FIRST: `SCOPE.md`, the issue that led here, `docs/engine-changes.md` if you use `Dreamcomp`.
FENCE: Change nothing. Write only `notes/scope-requests.md`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `git status --short`. Done means only `notes/scope-requests.md` changed, and the request names the files, the reason, the risk and the check.
BUDGET: Stop after 15 minutes.
IF BLOCKED: If the change touches generated code, the translator, `tools/equiv.py` or `build.sh`, say so in the first line. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
REPORT: 1) The change in one line. 2) Why it is needed now. 3) Files it touches. 4) Its check. 5) What happens if I say no.

A good answer: One clear request you can answer yes or no, with the files, the risk and the check spelled out.

Keep Claude on task

These are the detours Claude tends to take on this system, and the rule that stops each one. The full method is on Stay on Task.

The detourThe rule to give Claude
Claude fixes a bug by editing the machine-made C++. The next translation wipes the fix.Never hand-edit generated code. Change the TOML config, a hook, or the translator. Block the folder with a hook.
Claude claims a fix because a counter moved, like fewer interpreter calls, not because the bug is gone.A fix is done when the symptom is shown gone in the reported condition, with a screenshot or report. Say plainly what was not verified.
Claude writes test cases that only match its own C, so a wrong function passes.A function counts only when dev and holdout cases both pass. Write holdout cases after the C, with other values.
Claude weakens a check, a case or a threshold to get a pass.Never weaken validation to get approval. Never edit tools/equiv.py, tools/sh4sim.py, build.sh or an expected hash.
Claude copies Flycast code or Sega SDK headers into the project to save time.Use Flycast only as a behaviour reference. Never paste Sega SDK source or headers, even in comments.
Claude searches your drives for an SDK or a disc, or offers to download one.Use only the folders I name. Never search my folders and never fetch an SDK, BIOS or game.
Claude commits extracted files or a debug archive with game data in it. SARecomp had to delete a release for this.No game data in any commit. The audit must pass before every commit. Never use --no-verify.
Claude writes a patch with a shell heredoc, and the backslashes vanish without an error.Write patch scripts with the edit tool, and check that every scripted replacement matched.

Problems other projects hit

The translator found only part of the code. The game stopped at addresses reached through jump tables and pointers.

Fix: Run with --suggest-config and paste the seeds. Keep the dev interpreter on until untranslated targets reach zero.

Seen in: Bomberman Online Recomp, Ikaruga port, Voldorium

Stock Ghidra decompiled Dreamcast float code wrongly: bank swaps, float size modes, and vector instructions.

Fix: Patch Ghidra's SH-4 language, as Ikaruga did in nine places. Or check translated code against Flycast instead of trusting Ghidra's C.

Seen in: Ikaruga port

The game was silent, and movies smeared and froze.

Fix: Treat 32-bit stores to the AICA as 16-bit stores. Re-read textures the game rewrites in place each frame.

Seen in: deSPIRIA reBIRTH

C passed the simulator but crashed on a console. The simulator fills unset RAM with zero.

Fix: Run overreads.py with junk in unused RAM. Test the build from C on real hardware when you can.

Seen in: Zombie Revenge decomp, Crazy Taxi decomp, Virtua Tennis decomp

A pass-through function lost its arguments in C, but the equivalence check still passed.

Fix: Compare argument counts with state/arity_scan.json before the first build from C, and regenerate with gen_equiv --regen.

Seen in: Crazy Taxi decomp, Virtua Tennis decomp, Zombie Revenge decomp

The build from C showed a black screen, or a white screen with resets every 15.6 seconds.

Fix: Do not reuse filler after the boot block. Bisect hangs by putting half the C back to assembly.

Seen in: Virtua Tennis decomp, Crazy Taxi decomp

An intermittent audio underrun came back after it was marked fixed.

Fix: Keep a tiered regression set and rerun the full level at milestones. Nudge audio speed by at most 0.5% instead of dropping samples.

Seen in: Blue Stinger Recompiled, deSPIRIA reBIRTH

Windows Defender flagged the unsigned builder, and Microsoft Store Python hid files from the compiler.

Fix: Document the false alarm for players. Skip Store Python and ship a portable Python instead.

Seen in: Voldorium

The Ghidra project on the original boot file got corrupted.

Fix: Build the Ghidra project from a Flycast RAM dump instead, and keep backups.

Seen in: Tokyo Bus Guide decomp

Public CI could not be rerun by others because it pulled the SDK or game data from a private repo.

Fix: Accept that CI needs your own secrets. Keep a local check that anyone with their own disc and SDK can run.

Seen in: Tokyo Bus Guide decomp, Bomberman Online Recomp

How long it takes

Max 20x (now called Ultra)Max 5x (now called Max)One person, no AIHow sure
Path A: running on PC3 to 10 weeks7 to 25 weeks1 to 3 yearsmedium confidence
Path B: full decomp10 to 30 weeks25 to 80 weeks3 to 8 yearslow confidence

Read this first

These numbers assume one medium game and one person giving 10 to 15 hours a week. For Path A, five dated AI projects agree on weeks to a first release. But none states its hours, some had private work first, and two built on a ready kit. For Path B, three AI-run decomps reached Equivalent C within four to six weeks of their first commit. None has a PC port, so the port part is a guess. The no-AI numbers rest on one slow decomp and on other systems. Treat all ranges as rough.

What makes it faster or slower

  • Overlays. One boot file is the easy case. Many code files add work, and some games do not fit the tools at all.
  • Starting point. A game that dream-recomp already boots, or that a sister game shares a library with, saves weeks.
  • Movies and sound. Sofdec movies and the AICA chip caused most late bugs in the reviewed ports.
  • The Katana SDK. Path B cannot start without one, and finding one can take longer than the decomp.
  • Names. A later port with symbols, cheat codes or a prototype can name many functions for free.
  • The PC port in Path B. No reviewed Dreamcast decomp has one yet, so this part has no time data.

The facts behind these numbers

ProjectWhat happenedLink
Voldorium (SoulCalibur)Scoping docs dated 2026-10-15. First commit 2026-10-19, first release 2026-10-20, playable with online play by 2026-11-13. One person directing Claude Code.source
Blue Stinger RecompiledFirst commit 2026-10-13. First release 2026-10-24. About 82% of its 11-stage plan by 2026-11-02. One contributor, Claude Code.source
Sonic Adventure RecompiledFirst commit 2026-09-11. First release 2026-09-18. All seven stories playable in beta by 2026-10-18. One contributor, AI tools.source
Army Men: Sarge's Heroes - RecompiledFirst commit 2026-10-21. First release 2026-10-27, on the Dreamcomp kit. Two contributors, AI agents.source
Crazy Taxi decompFirst commit 2026-10-05. By 2026-11-13 the README says complete: all 2,997 C-able functions Equivalent and all four status ticks. One contributor, AI-run.source
Zombie Revenge decompFirst commit 2026-10-16. By 2026-11-13 all 5,189 C-able functions Equivalent, PLAYABLE but not STABLE, 4,704 functions unnamed. One contributor.source
Tokyo Bus Guide decompFirst commit 2022-03-28. Three contributors. Still in progress on 2026-10-25. Agent files arrived later; the README does not mention AI.source
Sonic Adventure matching decomp (outside, not a review card)Repo created 2026-10-26. README claims 100% of the code rebuilds byte for byte, with a PC build. One contributor; AI use not stated; history not visible.source

Projects reviewed (14)

Dreamcast has fewer than 10 games on RecompLauncher: 10 projects for 9 games, so all 10 were reviewed. The two Blue Stinger entries are one GitHub repo. Four decomps came from outside it. At least 10 real outside projects exist, so this list is a sample.

What each project teaches

Sonic Adventure Recompiled

Sonic Adventure

Top rated on RecompLauncherstatic recompstalled
KatanaRecomp (pinned r354)clang-clCMakeNinjaSDL3Vulkan

Started: 2026-09. First release: 2026-09. Code: C++.

AI: yes: README says AI tools helped with code and docs; AGENTS.md points to Codex Agent files: AGENTS.md.

Lesson: Keep a frozen, hash-checked baseline and compare every change against it. Its recompiler, KatanaRecomp, is not in the repo, so you cannot build it from a plain clone.

Voldorium

SoulCalibur

Top rated on RecompLauncherstatic recompplayable
sh4c.py (own translator)GhidraFlycast (patched for traces)llvm-mingwZig 0.14.1SDL2

Started: 2026-10. First release: 2026-10. Code: C and Python.

AI: yes: README says Claude Code wrote the translator, runtime, lobby and tools

Lesson: Translate only the game code and replace about 130 Katana library calls with native code. Flycast traces proved the translator right.

Tokyo Bus Guide Decompilation

Tokyo Bus Guide

From outside RecompLaunchernon-matching decompin progress
Hitachi SHC (SDK 1.55J)asmshsh4objtestwiboDockerGhidra MCP

Started: 2022-03. First release: none. Code: C and PHP.

AI: yes: agent files and six Claude Code skills; the README does not mention AI Agent files: CLAUDE.md, AGENTS.md, tests/AGENTS.md, .claude/settings.json.

Lesson: Its README calls it the first public Dreamcast game decomp. It proves each function by running original and C against one test spec. Its skill bans reading raw assembly, so tests drive the work.

Bomberman Online Recomp

Bomberman Online

Top rated on RecompLauncherstatic recompplayable
dreamcomp (vendored)dream-recompGhidra 12.1.4CMakeNinjaSDL3

Started: 2026-11. First release: 2026-11. Code: C++.

AI: yes: catalog says code, by the developer; the vendored framework has a CLAUDE.md Agent files: dreamcomp/CLAUDE.md.

Lesson: On a ready kit, a first release came one day after the first public commit. Seed functions until the report shows zero untranslated targets.

Blue Stinger Recompiled

Blue Stinger

Top rated on RecompLauncherstatic recompin progress
bs-recomp (own translator)Flycast (oracle)CapstoneCMakeMSVCSDL3

Started: 2026-10. First release: 2026-10. Code: C++.

AI: yes: CLAUDE.md says Claude develops and Codex reviews read-only Agent files: CLAUDE.md.

Lesson: Replace one console part at a time and prove each against Flycast. Log every check with its date in STATUS.md.

Blue Stinger Recomp (second catalog entry)

Blue Stinger

Lower rated on RecompLauncherstatic recompin progress
bs-recompbs-extractFlycast (oracle)CapstoneCMakeSDL3

Started: 2026-10. First release: 2026-10. Code: C++.

AI: yes: CLAUDE.md names Claude for development and Codex as a read-only reviewer Agent files: CLAUDE.md.

Lesson: The same repo as Blue Stinger Recompiled: the old rodrigo-mendonca link now redirects here. Its rule: settle any reviewer dispute by bytes, disassembly or a test, never by opinion.

Crazy Taxi decomp

Crazy Taxi

From outside RecompLaunchernon-matching decompcomplete
dc-decomp-kickoffKatana SDK asmsh, lnk, elf2bin, shcwiboDockerequiv.py and sh4sim.pyFlycast GDB

Started: 2026-10. First release: none. Code: C.

AI: yes: README says it is built for AI use; AGENTS.md is the agent's plan Agent files: AGENTS.md.

Lesson: Start from a byte-exact rebuild, then prove C by behaviour with dev and holdout cases. The C is shaped for machines, not people.

Army Men: Sarge's Heroes - Recompiled

Army Men: Sarge's Heroes

Top rated on RecompLauncherstatic recompplayable
Dreamcomp (vendored)dream-recompCMakeNinjaclang-clDocker

Started: 2026-10. First release: 2026-10. Code: C++.

AI: yes: README says AI coding agents did code, analysis and tests; catalog says Codex Agent files: dreamcomp/CLAUDE.md.

Lesson: Fix render bugs from captured frames with one generic rule, not per-texture patches. Run the no-game-data audit on all of git history.

Street-Alpha-3-Dreamcast-Recomp

Street Fighter Alpha 3

Top rated on RecompLauncherstatic recompplayable
tools/recomp (own translator)sfa3port.pyCMakeNinjaZigSDL3

Started: 2026-10. First release: 2026-10. Code: C and Python.

AI: yes: README says built 100% with Claude Code, with a human directing and testing

Lesson: Translate the boot file and the 111 character overlays apart, since overlays patch a jump table. No output checks are stated beyond play.

Virtua Tennis decomp

Virtua Tennis

From outside RecompLaunchernon-matching decompplayable
dc-decomp-kickoffKatana SDK asmsh, lnk, elf2bin, shcwiboDockerequiv.pyFlycast GDB and RetroArch

Started: 2026-10. First release: none. Code: C.

AI: yes: AGENTS.md drives a guided agent; the agent product is not named Agent files: AGENTS.md.

Lesson: When the build from C hangs, put half the C back to assembly and test again. Exhibition mode still crashes.

deSPIRIA reBIRTH

deSPIRIA

Top rated on RecompLauncherstatic recompplayable
dream-recomp (pinned 51a148c)llvm-mingwCMakeNinjaSDL3Vulkan

Started: 2026-10. First release: 2026-10. Code: C++.

AI: yes: README says an AI coding assistant helped build the kit

Lesson: Pin the recompiler to a commit and ship your fixes as an overlay. Send badly translated functions to the interpreter by config.

ikaruga-decomp

Ikaruga

Top rated on RecompLauncherotherplayable
Ghidra 12.2 (patched SH-4 language)convert.pydream-recompCMakeMetalSDL3

Started: 2026-10. First release: 2026-11. Code: C++.

AI: none stated in the repo; the catalog flag comes from the store

Lesson: Ghidra's C can become a port if you patch its SH-4 float handling and test each function against an SH-4 interpreter. It is macOS only.

Zombie Revenge decomp

Zombie Revenge

From outside RecompLaunchernon-matching decompin progress
dc-decomp-kickoffKatana SDK asmsh, lnk, elf2bin, shcwiboDockerequiv.pyFlycast

Started: 2026-10. First release: none. Code: C.

AI: yes: README says it is built for AI automation; AGENTS.md Agent files: AGENTS.md.

Lesson: Every C-able function passed in the simulator, yet the build crashes on a real console. Simulator proof is not console proof.

Hail to the King PC

Evil Dead: Hail to the King

Top rated on RecompLauncherstatic recompin progress
recomp.py (own translator)llvm-mingwCMakeNinjaSDL2pl_mpeg

Started: 2026-11. First release: 2026-11. Code: C and Python.

AI: none stated

Lesson: A one-click build.bat fetches pinned tools and builds from the player's .cue. The options window marks each feature working, partial or not yet.

What we could not check

  • No step was run here. No tool was installed or built on this machine; every command comes from a tool's README, SKILL.md, AGENTS.md or a review card.
  • Whether Flycast's ready-made builds include the GDB server. Its CMake option is off by default, so this guide says to build it yourself.
  • Whether the decomp.me compiler archive also holds asmsh, lnk and elf2bin. The kickoff needs these from a Katana SDK.
  • Where to get a Katana SDK legally. This guide does not say, and neither do the tools.
  • Which retail games were built with Metrowerks CodeWarrior instead of Hitachi SHC.
  • Six of the nine Dreamcomp skills. Only /dc-playtest, /dc-investigate and /dc-audit were read.
  • The static-recomp-scope-plan install. Its skills.sh page said on 2026-11-13 that it is not listed, though its SKILL.md is still on GitHub. Whether npx skills add still finds it was not tested.
  • Whether dream-recomp's Flycast oracle core (tools/flycast/oracle/build_oracle.sh) builds in WSL or on Windows. Its docs show it on the owner's Mac.
  • How to add the Flycast core inside RetroArch. Only the need for it was read, in Crazy Taxi's AGENTS.md.
  • Where --screenshot-at N saves its picture. The docs say it writes the same picture as F12, but name no folder.
  • KatanaRecomp, the recompiler behind Sonic Adventure Recompiled. It is not in that repo and was not found.
  • The tools/check.py, validate_map.py, golden.py and make_release.py scripts are ones you write. Their names follow the reviewed projects but are not standard tools.
  • Whether tools/new-game.sh from dream-recomp runs on Windows. This guide uses dcdisc new-game instead.
  • Whether Claude Code installs and runs smoothly inside WSL for Path B. The kickoff assumes ~/.claude/skills on the machine that runs the tools.
  • How many hours a week any dated project took, and how much private work came before its first public commit.
  • The Sonic Adventure matching decomp's history and AI use. Its repo shows only a few commits and one contributor.
  • Whether an equivalence decomp can be turned into a clean PC port. No reviewed project has done it, so Path B step 9 is a plan, not a proven route.
  • The Vulkan SDK download page did not render, so its current version and whether it ships glslc were not confirmed here.

Sources