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
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.
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.
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.
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.mdand 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, thenpip 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 inspectexits with code 1 if it finds Windows CE markers. Those games are out of scope fordream-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 intoSCOPE.md. - Search GitHub and RecompLauncher for the game plus
recomp,decompandport. Check thedream-recomptable 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 ClaudeGOAL: 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.mdprints 6, the file holds the boot file hash, and its last line isApproved: <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;inspectexit code 1 on Windows CE;manifesthashes), 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)- Dump your own disc. Keep the image outside any repo, like
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-recompand 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 andgit. The 2022 tools are on Microsoft's older downloads page now. For a window, add the Vulkan SDK, SDL3 andglslc. - In the
dream-recompfolder from step 1, build:cmake -S . -B build -DDREAM_DEV_INTERPRETER=ON, thencmake --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
Dreamcompon Windows:python tools/dc.py doctor, thenpython tools/dc.py deps. It wrapsdream-recompand adds Claude Code skills. - Make
extracted/,gen/andbuild/ignored. Add a pre-commit hook that refuses.bin,.gdi,.chd,.cdiand generated code.Dreamcompshipstools/audit.pyfor 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--bootsave a picture with the run flag--screenshot-at N.
Prompt for ClaudeGOAL: 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-onlyprints PASS,ctestpasses in thedream-recompbuild, andgit statusshows 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 Nfor 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)- Install Build Tools for Visual Studio 2022 with C++, plus
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 readsIP.BIN, extracts the files, and writesgames/<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.BINin Ghidra as raw binary with languageSuperH4:LE:32:default. Bomberman Online says to use the0x0C...base, not0x8C.... - 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 ClaudeGOAL: 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.csvpasses 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 fromdream-translate), Bomberman Online Recomp (Ghidra 12.1.4 with SuperH4, P0 addresses), Voldorium (about 130 library functions replaced by native code)- Set the title up:
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] extraseeds 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 600prints the same run report, andpython tools/dc.py shots <port> --at 300,900saves pictures. - Split the generated C++ into several files. Bomberman Online split 179 MB into eight parts to avoid a 20-minute compile.
Prompt for ClaudeGOAL: 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 60saves 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 reportwith 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)- Build the title:
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-recompcompares its translated code with Flycast's interpreter, step by step. See itsdocs/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 1000000so two runs act the same. Use--write-hash FILEto 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 ClaudeGOAL: 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)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
F11on a wrong frame. You get five files,capture-000.ppm,.ta,.vram,.vram.regsand.txt: the picture, the display list, video memory, the graphics registers and a note.--capture-at Ndoes 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 ClaudeGOAL: 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)- Press
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.mdmakes 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 --historyin CI.
Prompt for ClaudeGOAL: 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 --regresspasses 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 --historyin CI)- Record input scripts that both Flycast and your build can play. Blue Stinger does this with
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-mingwand Zig; Hail to the King fetchesllvm-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 ClaudeGOAL: 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.batdownloads 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.
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-kickofflists 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.mdanddcdisc 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.mdwith the disc serial, boot file hash, SDK release, mode (equivalentormatching) and what is out of scope.
Prompt for ClaudeGOAL: 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.mdprints 5, and its last line isApproved: <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)
- Search GitHub for
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.gdiand 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 infomust 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 pinnedwibo,unshield, JDK 21 and Ghidra. Thensource ~/dc-tools/env.shand setDC_LOCAL=1. - Check
python3 --versionprints 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 ClaudeGOAL: 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), anddocker infoorsetup_tools.sh --checkpasses.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 underwiboin Docker;DC_LOCAL=1on Linux)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.shmust printMATCH. 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,lnkandelf2bin. - Check the gate by hand:
bash build.shmust printMATCH. functions.txtis the source of truth for names and sizes. Rename only there, rerunsplit_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 ClaudeGOAL: 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.shprintsMATCH, andpython3 tools/progress.pyreports the named and unnamed counts.Proof this works: Crazy Taxi decomp (
build.shprints MATCH; SDK names by unique signature match), Zombie Revenge decomp (names only infunctions.txt; build still MATCH), https://consolesplayingconsoles.github.io/dc-shuriken-explorer/- Let the skill run step 2. It uses Ghidra, splits the code, and builds with
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 inbuild/gen_failed.txt. - Run
python3 tools/5-generated/gen_equiv --retestto widen weak test coverage. - Pick one small file. Write its C and cases in
tests/<file>/<function>.json, split intodevandholdout. - 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 ClaudeGOAL: 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>.cshows every function Equivalent on dev and holdout cases, andbash build.shstill printsMATCH.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 withsh4objtest: original and C run against one test spec)- If you have the SDK's library source, run
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>.cfor their files. - Use RAM dumps from the running game for functions that need world state.
tools/4-boosts/live.pyreads 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.shandpython3 tools/progress.py, then commits. - Run
python3 tools/consistency.pyafter runs overlap. It finds C defined twice and cases with no C.
Prompt for ClaudeGOAL: 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.shprintsMATCH,consistency.pyis clean, andprogress.pyshows 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.pyneeds RetroArch with the Flycast core), Zombie Revenge decomp (all 5,189 C-able functions Equivalent in about four weeks)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 withpython3 tools/5-generated/gen_equiv --regen <name>. - For the matching tier, write a whole unit with an
@unitheader. Iterate untilbuild.shprintsMATCH. - 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 ClaudeGOAL: 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.pyreports no difference,equiv.pyshows all Equivalent, andbash build.shprintsMATCH.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)- Run
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.shand the expected hash with aPreToolUsehook. Exit code 2 blocks the edit. - Check that every function in
tests/equivalent.txthas holdout cases and an entry indocs/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 ClaudeGOAL: 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 passesbash build.shwithMATCH,consistency.pyis 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 aPreToolUsecall)- Turn on the progress hook once per clone:
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
keepinlayout.txt. Their hand-written code passes state in registers. - Build:
make c, thenmake 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.txtonly with proof: BUILDS FROM C, BOOTS TO MENU, PLAYABLE, STABLE.
Prompt for ClaudeGOAL: 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 cbuilds an image of the original size, the disc boots in Flycast to the named point, andstatus.txtcites the proof.Proof this works: Virtua Tennis decomp (all four
status.txtticks; 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 optionENABLE_GDB_SERVER, default off)- Shrink code that is too big:
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 pcbuilds a PC game from your disc, andENGINE.mddescribes 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.pyfirst. It runs the PC build with a fixed input script and passes only when the named point shows in the log.
Prompt for ClaudeGOAL: 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 printsMATCH.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)- Read how the Sonic Adventure decomp does it. Its
Tools you need
| Tool | What it does | How to get it | How 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 SDK | tool 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 WSL | Docker 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 download | decompme/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 it | tool 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 repo | tool 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 steps | RetroArch 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
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)
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
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
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
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
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
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
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
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)
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)
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.
| Job | What it means on this system | Max 20x (now called Ultra) | Max 5x (now called Max) |
|---|---|---|---|
| Plan the project | Inspect 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 highOne session. This choice shapes months of work. | Opus 5.5 effort highUse Fable 5.2 for this one session if you have weekly room. |
| Set up the project | Build 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 file | Find 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 mediumRaise to high for function edges and data layouts. A mistake there spreads. |
| Bulk units | Path 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 mediumHaiku 5.5 for the plainest units. | Sonnet 5.5 effort mediumFewer workers at once. Haiku 5.5 for the plainest units. |
| Hard units | Functions that failed five tries, FPU bank tricks, byte matching with SHC, and dropped-argument trampolines found by the arity scan. | Fable 5.2 effort highGo to xhigh only after a failed try at high. | Opus 5.5 effort highSend only the last few that still fail to Fable 5.2. |
| Build the runtime | Fix 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 mediumRaise to high for timing and graphics bugs. |
| Find a bug | Find 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 highAfter two failed tries with full evidence, move to Fable 5.2. | Opus 5.5 effort highOne bug at a time. |
| Check the work | A 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 mediumAlways a new session, never the one that did the work. | Sonnet 5.5 effort highAlways a new session, never the one that did the work. |
| Keep the records | Update 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
- 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.mdshort 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'sAGENTS.mdsays 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.txtandtests/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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 detour | The 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 AI | How sure | |
|---|---|---|---|---|
| Path A: running on PC | 3 to 10 weeks | 7 to 25 weeks | 1 to 3 years | medium confidence |
| Path B: full decomp | 10 to 30 weeks | 25 to 80 weeks | 3 to 8 years | low 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-recompalready 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
| Project | What happened | Link |
|---|---|---|
| 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 Recompiled | First 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 Recompiled | First 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 - Recompiled | First commit 2026-10-21. First release 2026-10-27, on the Dreamcomp kit. Two contributors, AI agents. | source |
| Crazy Taxi decomp | First 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 decomp | First 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 decomp | First 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.mdor 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,lnkandelf2bin. 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
Dreamcompskills. Only/dc-playtest,/dc-investigateand/dc-auditwere read. - The
static-recomp-scope-planinstall. Its skills.sh page said on 2026-11-13 that it is not listed, though itsSKILL.mdis still on GitHub. Whethernpx skills addstill 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 Nsaves its picture. The docs say it writes the same picture asF12, 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.pyandmake_release.pyscripts are ones you write. Their names follow the reviewed projects but are not standard tools. - Whether
tools/new-game.shfromdream-recompruns on Windows. This guide usesdcdisc new-gameinstead. - Whether Claude Code installs and runs smoothly inside WSL for Path B. The kickoff assumes
~/.claude/skillson 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
glslcwere not confirmed here.
Sources
- dream-recomp README
- dcdisc README (dream-recomp)
- dream-recomp dev-setup.md (run flags, F11 files, oracle core)
- Dreamcomp project skills
- dc-decomp-kickoff SKILL.md
- Visual Studio older downloads (Build Tools 2022)
- Microsoft Learn: Clang/LLVM support in Visual Studio
- Microsoft Learn: CMake projects in Visual Studio
- Ninja releases
- RetroArch README
- static-recomp-scope-plan SKILL.md (GitHub)
- Dreamcomp README
- dc-decomp-kickoff README and SKILL.md
- Crazy Taxi decomp AGENTS.md
- Flycast README
- Flycast CMakeLists.txt (ENABLE_GDB_SERVER)
- Ghidra README
- Ghidra SuperH4 language definitions
- GhidraMCP README
- wibo README
- decomp.me compilers: Dreamcast SHC releases
- objdiff README
- sh4objtest README
- Tokyo Bus Guide decomp README
- Sonic Adventure matching decomp README
- dcrecomp README (sp00nznet)
- Shuriken Explorer README
- llvm-mingw README
- Capstone README
- Docker Desktop WSL 2 backend
- Dreamcast Wiki: Hardware overview
- Dreamcast Wiki: Boot process
- Dreamcast Wiki: Memory map
- Dreamcast Programming by Marcus Comstedt
- KallistiOS README
- Claude Code hooks