From 9c9a1adf6175228908772103ed7906a2dcd2206c Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 2 Jul 2026 09:01:36 +0000 Subject: [PATCH 01/19] gitignore: exclude games/ (copyrighted discs/EXEs, not distributable) Same treatment as the existing bios/ ignore: game dumps live locally under games// and must never reach the remote. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 239e6494..51275319 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,6 @@ __pycache__/ # DuckStation oracle (local-only; private fork at git@github.com:mstan/duckstation.git) /duckstation/ _wip/ + +# Game discs/EXEs (copyrighted, not distributable) +games/ From 198a27b33faf2404e4512491e9001938741a8c6d Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 09:19:37 +0000 Subject: [PATCH 02/19] recompiler: accept KUSEG-addressed PS-X EXE headers + Kula World game config Kula World (SCES-01000) stores its header addresses in KUSEG form (load 0x00011000, pc 0x00069F60) instead of the usual KSEG0 form. KUSEG 0x0-0x1FFFFFFF mirrors the same physical RAM, so parse_buffer now normalizes header addresses into KSEG0 before validation instead of rejecting the EXE. Only addresses inside the 2 MB RAM mirror are remapped; zero-valued unused fields stay zero. L2 structural: 42/42 ok. With that fix the recompiler runs end-to-end on the Kula World EXE: 5297 functions discovered, generated C compiles clean. games/kula/ game.toml records the header-derived config; the gitignore now tracks per-game tomls while keeping discs/EXEs/generated output untracked. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- .gitignore | 6 ++++-- games/kula/game.toml | 23 +++++++++++++++++++++++ recompiler/src/ps1_exe_parser.cpp | 16 ++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 games/kula/game.toml diff --git a/.gitignore b/.gitignore index 51275319..4b38b1e3 100644 --- a/.gitignore +++ b/.gitignore @@ -79,5 +79,7 @@ __pycache__/ /duckstation/ _wip/ -# Game discs/EXEs (copyrighted, not distributable) -games/ +# Game discs/EXEs and recompiler output (copyrighted, not distributable). +# Only the per-game config (game.toml) is tracked. +games/*/* +!games/*/game.toml diff --git a/games/kula/game.toml b/games/kula/game.toml new file mode 100644 index 00000000..263dc3d8 --- /dev/null +++ b/games/kula/game.toml @@ -0,0 +1,23 @@ +# Kula World (Europe) — SCES-01000 +# Values read from the PS-X EXE header of SCES_010.00 (extracted from the +# disc root, LBA 24). Note: the header stores KUSEG addresses (0x00011000); +# the parser normalizes them to KSEG0. + +[game] +id = "SCES-01000" +exe = "games/kula/SCES_010.00" +load_address = "0x80011000" +entry_pc = "0x80069F60" +text_size = "0x93000" +stack_base = "0x801FFFF0" +disc = "games/kula/Kula World (Europe).cue" + +[recompiler] +out_dir = "games/kula/generated" +strict = true + +[runtime] +debug_port = 4370 +window_title = "Kula World (PSXRecomp)" +controller = "digital" +memcard_dir = "." diff --git a/recompiler/src/ps1_exe_parser.cpp b/recompiler/src/ps1_exe_parser.cpp index d4cdad8b..65b23144 100644 --- a/recompiler/src/ps1_exe_parser.cpp +++ b/recompiler/src/ps1_exe_parser.cpp @@ -160,6 +160,22 @@ std::optional<PS1Executable> PS1ExeParser::parse_buffer( // Copy header (first 2048 bytes) std::memcpy(&exe.header, buffer.data(), sizeof(PS1ExeHeader)); + // Some EXEs (e.g. Kula World SCES-01000) store KUSEG addresses + // (0x00011000) instead of KSEG0 (0x80011000). KUSEG 0x0-0x1FFFFFFF + // mirrors the same physical RAM, so normalize to KSEG0 before + // validation. Only remap addresses that fall inside the 2 MB RAM + // mirror; 0 stays 0 (unused fields like initial_gp). + auto to_kseg0 = [](uint32_t& addr) { + if (addr != 0 && addr < 0x00200000) addr |= 0x80000000; + }; + to_kseg0(exe.header.initial_pc); + to_kseg0(exe.header.initial_gp); + to_kseg0(exe.header.load_address); + to_kseg0(exe.header.memfill_start); + to_kseg0(exe.header.initial_sp); + to_kseg0(exe.header.initial_fp); + to_kseg0(exe.header.stack_base); + // Validate header if (!validate_header(exe.header, error_msg)) { return std::nullopt; From 45469e0d6c1a1e0d2f9dd4b36c50ddf18930ce83 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 13:23:20 +0000 Subject: [PATCH 03/19] runtime: Linux port + RAM-mirror fix; kula-runtime target boots Kula World MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Linux port (2 fixes — the POSIX paths largely existed already): - overlay_loader.c: portable atomic for the async-cache dirty flag (InterlockedExchange/LONG behind _WIN32, __atomic_exchange_n on POSIX) - code_provider.c: missing <stddef.h> for NULL memory.c — main-RAM mirroring (the Kula World boot-wedge root cause): the 2 MB RAM is mirrored 4x across the first 8 MB of each segment (mem-ctrl RAM_SIZE default 0x0B88) and Kula World's crt0 parks $sp in the 4th mirror (0x807FFFF8). Guest accesses to mirrors fell into the open-bus no-op: stack writes vanished, $ra loaded back 0, and the game jumped to address 0 at frame ~891 (fntrace-verified call chain). All guest access paths now fold mirrors via psx_phys_addr(). fntrace.c — null-page dispatch guard: a dispatch whose phys target is below 0x40 latches the capture freeze, so the always-on ring preserves the window that led to a null jump instead of the wedge storm evicting it. This is how the mirror bug was pinned: the frozen ring showed crt0 set sp=0x807FFFF8, then ra came back 0 from the first mirrored-stack return. runtime/CMakeLists.txt: kula-runtime target (SCES-01000), guarded on the locally-generated game C existing so clones without the (untracked) game dump still configure. Verified on Linux/Xvfb: BIOS-only psx-runtime boots to the shell menu; kula-runtime boots the disc, game code runs native (mirror stack live), VBLANK event callback ticks, CD streams the HIRO directory. Software renderer + TCP debug server work unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- .gitignore | 1 + games/kula/game.toml | 3 +++ games/kula/seeds.txt | 0 runtime/CMakeLists.txt | 20 ++++++++++++++++++++ runtime/src/code_provider.c | 2 ++ runtime/src/fntrace.c | 11 +++++++++-- runtime/src/memory.c | 27 ++++++++++++++++++++------- runtime/src/overlay_loader.c | 10 ++++++++-- 8 files changed, 63 insertions(+), 11 deletions(-) create mode 100644 games/kula/seeds.txt diff --git a/.gitignore b/.gitignore index 4b38b1e3..401cdaf2 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,4 @@ _wip/ # Only the per-game config (game.toml) is tracked. games/*/* !games/*/game.toml +!games/*/seeds.txt diff --git a/games/kula/game.toml b/games/kula/game.toml index 263dc3d8..21d3c8fc 100644 --- a/games/kula/game.toml +++ b/games/kula/game.toml @@ -4,6 +4,7 @@ # the parser normalizes them to KSEG0. [game] +name = "Kula World" id = "SCES-01000" exe = "games/kula/SCES_010.00" load_address = "0x80011000" @@ -13,6 +14,8 @@ stack_base = "0x801FFFF0" disc = "games/kula/Kula World (Europe).cue" [recompiler] +# No Ghidra seeds yet — discovery walks the call graph from entry_pc alone. +seeds = "games/kula/seeds.txt" out_dir = "games/kula/generated" strict = true diff --git a/games/kula/seeds.txt b/games/kula/seeds.txt new file mode 100644 index 00000000..e69de29b diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt index 77bb4d0e..9fc42ab7 100644 --- a/runtime/CMakeLists.txt +++ b/runtime/CMakeLists.txt @@ -111,3 +111,23 @@ if(NOT MSVC AND EXISTS "${BEETLE_LIB}") elseif(NOT MSVC) message(STATUS "psx-beetle: libmednafen_psx.a not found - skipping psx-beetle") endif() + +# ---- Kula World target (SCES-01000) ---- +# +# Only defined when the locally-recompiled game output exists (the disc dump, +# EXE, and generated C are untracked — see games/*/* in .gitignore), so a +# fresh clone without the game still configures cleanly. + +set(KULA_GENERATED "${PSXRECOMP_ROOT}/games/kula/generated") +if(EXISTS "${KULA_GENERATED}/SCES_010.00_full.c") + psxrecomp_add_runtime_target(kula-runtime + GAME_GENERATED_FULL_C "${KULA_GENERATED}/SCES_010.00_full.c" + GAME_GENERATED_DISPATCH_C "${KULA_GENERATED}/SCES_010.00_dispatch.c" + DEBUG_PORT 4370 + WINDOW_TITLE "Kula World (PSXRecomp)" + DEFAULT_BIOS_PATH "${PSXRECOMP_ROOT}/bios/SCPH1001.BIN" + DEFAULT_GAME_CONFIG_PATH "${PSXRECOMP_ROOT}/games/kula/game.toml" + ) +else() + message(STATUS "kula-runtime: games/kula/generated/SCES_010.00_full.c not found - skipping") +endif() diff --git a/runtime/src/code_provider.c b/runtime/src/code_provider.c index ed5a9041..18930588 100644 --- a/runtime/src/code_provider.c +++ b/runtime/src/code_provider.c @@ -7,6 +7,8 @@ * overlay_backend_resolve (env PSX_OVERLAY_BACKEND > [runtime] overlay_backend > * auto; auto => gcc if a compile cmd is wired, else sljit). gcc is the default. */ +#include <stddef.h> + #include "code_provider.h" #include "autocompile.h" #include "overlay_sljit.h" diff --git a/runtime/src/fntrace.c b/runtime/src/fntrace.c index a3ad1883..62780754 100644 --- a/runtime/src/fntrace.c +++ b/runtime/src/fntrace.c @@ -53,11 +53,18 @@ void fntrace_record(CPUState* cpu, uint32_t target) { boot_state_trigger_capture(cpu); } } - if (!armed_match(target)) return; /* Honor the one-shot capture freeze (insn_freeze): once latched, the ring * preserves the pre-divergence window instead of evicting it. */ extern int g_insn_log_frozen; - if (g_insn_log_frozen) return; + int was_frozen = g_insn_log_frozen; + /* Null-page dispatch guard: a dispatch whose phys target sits below the + * exception vectors (0x80/0xA0) is a jump through a null/garbage pointer — + * the wedge itself, never legitimate code. Latch the capture freeze so the + * ring preserves the window that led here (this culprit entry, with its + * ra, still records; the wedge storm after it does not). */ + if ((target & 0x1FFFFFFFu) < 0x40u) g_insn_log_frozen = 1; + if (!armed_match(target)) return; + if (was_frozen) return; uint64_t idx = g_fntrace_seq++ & (FNTRACE_RING_CAP - 1); FntraceEntry* e = &g_fntrace_ring[idx]; e->frame = (uint32_t)s_frame_count; diff --git a/runtime/src/memory.c b/runtime/src/memory.c index 0747d4d7..7edbea15 100644 --- a/runtime/src/memory.c +++ b/runtime/src/memory.c @@ -30,6 +30,19 @@ static uint8_t ram[RAM_SIZE]; static uint8_t scratchpad[SCRATCHPAD_SIZE]; static uint8_t bios_rom[BIOS_ROM_SIZE]; +/* Physical address translation for guest accesses. The 2 MB main RAM is + * mirrored 4x across the first 8 MB of each segment (mem-ctrl RAM_SIZE + * register, default 0x0B88) and games rely on it — Kula World's crt0 + * parks $sp in the 4th mirror (0x807FFFF8). Fold the mirrors here so the + * RAM bounds checks below see canonical offsets; without this, mirror + * writes fell into the open-bus no-op and mirror reads returned 0 (the + * guest's stack silently vanished and $ra came back as 0). */ +static inline uint32_t psx_phys_addr(uint32_t addr) { + uint32_t phys = addr & 0x1FFFFFFFu; + if (phys < 0x00800000u) phys &= (uint32_t)(RAM_SIZE - 1); + return phys; +} + /* Expose RAM pointer for oracle comparison (find_first_divergence). */ uint8_t *memory_get_ram_ptr(void) { return ram; } uint8_t *memory_get_scratchpad_ptr(void) { return scratchpad; } @@ -648,7 +661,7 @@ uint32_t psx_read_word(uint32_t addr) { /* KSEG2 cache control — before physical translation. */ if (addr == 0xFFFE0130u) return cache_ctrl; - uint32_t phys = addr & 0x1FFFFFFFu; + uint32_t phys = psx_phys_addr(addr); if (phys < RAM_SIZE) { return (uint32_t)ram[phys] @@ -689,7 +702,7 @@ void psx_write_word(uint32_t addr, uint32_t val) { * We have no cache model, so silently discard RAM/scratchpad writes. */ if (sr_ptr && (*sr_ptr & 0x10000u)) return; - uint32_t phys = addr & 0x1FFFFFFFu; + uint32_t phys = psx_phys_addr(addr); if (phys < RAM_SIZE) { debug_server_trace_write_check(phys, read_ram_word(phys), val, 4); @@ -730,7 +743,7 @@ void psx_write_word(uint32_t addr, uint32_t val) { } uint16_t psx_read_half(uint32_t addr) { - uint32_t phys = addr & 0x1FFFFFFFu; + uint32_t phys = psx_phys_addr(addr); if (phys < RAM_SIZE) { return (uint16_t)ram[phys] | ((uint16_t)ram[phys + 1] << 8); @@ -754,7 +767,7 @@ uint16_t psx_read_half(uint32_t addr) { void psx_write_half(uint32_t addr, uint16_t val) { if (sr_ptr && (*sr_ptr & 0x10000u)) return; - uint32_t phys = addr & 0x1FFFFFFFu; + uint32_t phys = psx_phys_addr(addr); if (phys < RAM_SIZE) { debug_server_trace_write_check(phys, (uint32_t)read_ram_half(phys), (uint32_t)val, 2); @@ -786,7 +799,7 @@ void psx_write_half(uint32_t addr, uint16_t val) { } uint8_t psx_read_byte(uint32_t addr) { - uint32_t phys = addr & 0x1FFFFFFFu; + uint32_t phys = psx_phys_addr(addr); if (phys < RAM_SIZE) { return ram[phys]; @@ -823,7 +836,7 @@ uint8_t psx_read_byte(uint32_t addr) { extern void psx_advance_cycles(uint32_t cycles); static inline void charge_main_ram_read(uint32_t addr) { - if ((addr & 0x1FFFFFFFu) < RAM_SIZE) psx_advance_cycles(PSX_RAM_READ_WAIT_CYCLES); + if (psx_phys_addr(addr) < RAM_SIZE) psx_advance_cycles(PSX_RAM_READ_WAIT_CYCLES); } uint32_t psx_guest_read_word(uint32_t addr) { charge_main_ram_read(addr); return psx_read_word(addr); } @@ -833,7 +846,7 @@ uint8_t psx_guest_read_byte(uint32_t addr) { charge_main_ram_read(addr); return void psx_write_byte(uint32_t addr, uint8_t val) { if (sr_ptr && (*sr_ptr & 0x10000u)) return; - uint32_t phys = addr & 0x1FFFFFFFu; + uint32_t phys = psx_phys_addr(addr); if (phys < RAM_SIZE) { debug_server_trace_write_check(phys, (uint32_t)ram[phys], (uint32_t)val, 1); diff --git a/runtime/src/overlay_loader.c b/runtime/src/overlay_loader.c index 8e5614a4..2d239c96 100644 --- a/runtime/src/overlay_loader.c +++ b/runtime/src/overlay_loader.c @@ -422,7 +422,13 @@ static void persist_sljit_shard(uint32_t entry_phys, uint32_t lo, uint32_t len, * sets s_async_cache_dirty; the DISPATCH thread rescans-and-registers on its * next miss (candidate table stays single-threaded). PSX_SLJIT_SYNC=1 forces * the legacy synchronous JIT-on-miss path. */ +#ifdef _WIN32 static volatile LONG s_async_cache_dirty = 0; +# define async_cache_dirty_exchange(v) InterlockedExchange(&s_async_cache_dirty, (v)) +#else +static volatile int s_async_cache_dirty = 0; +# define async_cache_dirty_exchange(v) __atomic_exchange_n(&s_async_cache_dirty, (v), __ATOMIC_SEQ_CST) +#endif static int g_sljit_async = 1; /* MASTER SAFETY GATE (2026-06-25): the sljit EMITTER mistranslates some overlay @@ -725,7 +731,7 @@ void overlay_loader_async_publish(uint32_t entry_phys, uint32_t lo, uint32_t len if (!wok) { remove(tmp); return; } if (!MoveFileExA(tmp, path, MOVEFILE_REPLACE_EXISTING)) { remove(tmp); return; } s_sljit_persist_writes++; /* telemetry-only; benign cross-thread incr */ - InterlockedExchange(&s_async_cache_dirty, 1); + async_cache_dirty_exchange(1); #else (void)entry_phys; (void)lo; (void)len; (void)crc; (void)blob; (void)blob_size; #endif @@ -1179,7 +1185,7 @@ int overlay_loader_dispatch(CPUState *cpu, uint32_t addr) { if (head < 0 && s_active && overlay_cache_window_contains(phys)) { /* Pick up shards the background compile worker just published (idempotent * rescan; runs only when a publish has flipped the dirty flag). */ - if (g_sljit_tier_enabled && g_sljit_async && InterlockedExchange(&s_async_cache_dirty, 0)) { + if (g_sljit_tier_enabled && g_sljit_async && async_cache_dirty_exchange(0)) { scan_sljit_cache_dir(); head = idx_head(phys); } From 21e57a82cc1db47d57c40650eacdaa8d7d542936 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 17:08:19 +0000 Subject: [PATCH 04/19] docs+patch: psx-beetle oracle on Linux (pinned beetle-psx base + SIO trace hook) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit beetle_libretro.cpp targets the C++ beetle-psx tree; upstream master has been converted to plain C and no longer compiles against it. Documented the working recipe: pin beetle-psx at 5759277b (the wtrace patch's base, located via the patch's own blob hash), apply beetle_wtrace_hook.patch, and apply the new beetle_sio_trace_hook.patch — FrontIO::SetSIOTraceCallback (fires once per completed SIO byte exchange), a hook beetle_libretro.cpp required that was missing from the committed patch set. Verified on Linux/Xvfb: psx-beetle boots Kula World to demo gameplay and serves ping/screenshot over the shared TCP debug protocol, alongside kula-runtime — the two-process oracle setup from CLAUDE.md §16 now works in this environment. Runtime-created per-game .mcr files are gitignored. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- .gitignore | 4 ++++ docs/beetle-linux.md | 41 ++++++++++++++++++++++++++++++++ docs/beetle_sio_trace_hook.patch | 35 +++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 docs/beetle-linux.md create mode 100644 docs/beetle_sio_trace_hook.patch diff --git a/.gitignore b/.gitignore index 401cdaf2..f77307f6 100644 --- a/.gitignore +++ b/.gitignore @@ -84,3 +84,7 @@ _wip/ games/*/* !games/*/game.toml !games/*/seeds.txt + +# Per-game memcards created at runtime +*.mcr +!dummy.*.mcr diff --git a/docs/beetle-linux.md b/docs/beetle-linux.md new file mode 100644 index 00000000..f95dd678 --- /dev/null +++ b/docs/beetle-linux.md @@ -0,0 +1,41 @@ +# Building psx-beetle on Linux + +The psx-beetle oracle builds and runs on Linux with the same wire protocol +as on Windows. Verified 2026-07-02 (Kula World boots to demo gameplay; +ping/screenshot served over the TCP debug protocol). + +## beetle-psx checkout + +`runtime/src/beetle_libretro.cpp` targets the C++ beetle-psx tree. Upstream +master has since been converted to plain C (`libretro.cpp` -> `libretro.c`, +`PS_CPU` class dropped), which no longer compiles against our integration. +Pin the checkout to the last compatible commit — the same base +`docs/beetle_wtrace_hook.patch` was generated from: + +```bash +git clone https://github.com/libretro/beetle-psx-libretro.git beetle-psx +cd beetle-psx +git checkout 5759277b # "audit pass" — last C++-tree base we target +patch -p1 < ../docs/beetle_wtrace_hook.patch +patch -p1 < ../docs/beetle_sio_trace_hook.patch +``` + +`beetle_sio_trace_hook.patch` adds `FrontIO::SetSIOTraceCallback` (fires per +completed SIO byte exchange) — an integration hook beetle_libretro.cpp needs +that predated the committed wtrace patch. + +## Build + +```bash +# Static lib. On unix the artifact is named mednafen_psx_libretro.so but is +# an ar archive (STATIC_LINKING=1); stage it under the name cmake expects. +make platform=unix STATIC_LINKING=1 HAVE_LIGHTREC=0 -j"$(nproc)" +cp mednafen_psx_libretro.so libmednafen_psx.a + +cd ../runtime +cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DPSX_LAUNCHER=OFF -DPSX_DEBUG_TOOLS=ON +ninja -C build psx-beetle + +# Headless run (picks the next free port from 4380 if taken; watch stderr) +xvfb-run -a ./runtime/build/psx-beetle ../bios/SCPH1001.BIN --disc <game.cue> +``` diff --git a/docs/beetle_sio_trace_hook.patch b/docs/beetle_sio_trace_hook.patch new file mode 100644 index 00000000..935b5315 --- /dev/null +++ b/docs/beetle_sio_trace_hook.patch @@ -0,0 +1,35 @@ +diff --git a/mednafen/psx/frontio.cpp b/mednafen/psx/frontio.cpp +index a35b022f..02e7ce0b 100644 +--- a/mednafen/psx/frontio.cpp ++++ b/mednafen/psx/frontio.cpp +@@ -783,6 +783,10 @@ int32_t FrontIO::Update(int32_t timestamp) + ReceiveInProgress = false; + ReceiveBufferAvail = true; + ++ /* PSXRecomp oracle hook: byte exchange complete. */ ++ if(MDFN_UNLIKELY(sio_trace_cb)) ++ sio_trace_cb(TransmitBuffer, ReceiveBuffer, (uint16_t)Control); ++ + if(Control & 0x800) + { + istatus = true; +diff --git a/mednafen/psx/frontio.h b/mednafen/psx/frontio.h +index 8a67f5af..d9a260ca 100644 +--- a/mednafen/psx/frontio.h ++++ b/mednafen/psx/frontio.h +@@ -95,8 +95,15 @@ class FrontIO + + int StateAction(StateMem* sm, int load, int data_only); + ++ /* PSXRecomp oracle hook: fires once per completed SIO byte exchange ++ * (tx byte sent, rx byte received, current Control register). */ ++ typedef void (*sio_trace_cb_t)(uint8_t tx, uint8_t rx, uint16_t ctrl); ++ void SetSIOTraceCallback(sio_trace_cb_t cb) { sio_trace_cb = cb; } ++ + private: + ++ sio_trace_cb_t sio_trace_cb = nullptr; ++ + void DoDSRIRQ(void); + void CheckStartStopPending(int32_t timestamp, bool skip_event_set = false); + From b82e72cb0b9b2f951d4a5f234ba5f9993cae0349 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 18:09:49 +0000 Subject: [PATCH 05/19] cdrom: GetID reports the inserted disc's real license region (fixes Kula World CD wedge) GetID's last four response bytes were hardcoded 'SCEI' (NTSC-J). Real hardware reports the region of the INSERTED disc. Kula World uses the BIOS CD API, and the kernel CD driver revalidates the disc (ReadTOC + GetID, polled with irq_enable=0x18) when it reinitializes after the game's first file load. Seeing a 'Japanese' disc, it fell into the endless GetStat/Init retry loop: CD delivery froze at sector 307 (LBA 318, just before the first level directory) and the game waited forever on a black screen. Diagnosed from the always-on cdrom trace ring (grabbed via gdb from the live process): 307 sectors stream cleanly, Pause completes, then the BIOS's own ROM CD firmware (0xBFC0Dxxx) masks INTC delivery, issues ReadTOC + GetID, reads the response... and rejects it. Beetle PSX (the oracle; boots the same dump + BIOS to demo gameplay) derives the SCEx string from the disc's SYSTEM.CNF boot serial - so we now do the same: cdrom_set_disc_scex() is fed at launch from the existing disc_identity module (PAL->SCEE, NTSC-J->SCEI, NTSC-U->SCEA; default SCEA matches the one supported BIOS). Verified so far: launch log reports 'disc region PAL (serial SCES-01000)'; the sector-counter wall-break run is in flight. Framework-wide note: Tomba/MMX6 (NTSC-U, own CD drivers) never hit this path but now get 'SCEA' - matching real hardware - instead of 'SCEI'; regression-test before any master merge. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- runtime/include/cdrom.h | 3 +++ runtime/src/cdrom.c | 23 +++++++++++++++++++---- runtime/src/main.cpp | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/runtime/include/cdrom.h b/runtime/include/cdrom.h index d8388865..63d571da 100644 --- a/runtime/include/cdrom.h +++ b/runtime/include/cdrom.h @@ -8,6 +8,9 @@ extern "C" { #endif void cdrom_init(const char* cue_path); +/* Disc license region for GetID ("SCEE"/"SCEA"/"SCEI"); derived from the + * mounted disc's boot serial at launch. Defaults to "SCEA" (SCPH1001). */ +void cdrom_set_disc_scex(const char scex[4]); /* Set disc speed multiplier immediately. divisor=0 → instant, 1 → 1x, 2 → 2x. */ void cdrom_set_speed(int divisor); diff --git a/runtime/src/cdrom.c b/runtime/src/cdrom.c index 2d8e0438..4e26a8a8 100644 --- a/runtime/src/cdrom.c +++ b/runtime/src/cdrom.c @@ -43,6 +43,21 @@ static uint8_t request_reg; static uint8_t irq_enable; static uint8_t irq_flag; +/* Disc license region string returned in GetID's last four response bytes + * ("SCEE" PAL / "SCEA" NTSC-U / "SCEI" NTSC-J). Real hardware reports the + * region of the INSERTED DISC (mechacon reads it from the license area); + * the BIOS CD driver revalidates it when the kernel CD subsystem + * reinitializes mid-game, and a mismatch throws it into an endless + * GetStat/Init retry loop (Kula World wedged at its first level load this + * way). Set from the mounted disc's SYSTEM.CNF serial at launch + * (main.cpp); the default matches the console region of the one supported + * BIOS (SCPH1001, NTSC-U). */ +static uint8_t disc_scex[4] = { 'S', 'C', 'E', 'A' }; + +void cdrom_set_disc_scex(const char scex[4]) { + memcpy(disc_scex, scex, 4); +} + /* CPS-native CD interrupt single-outstanding latch. * * The CD controller serializes responses: it presents one INT to the CPU @@ -1261,10 +1276,10 @@ static void process_pending(uint32_t cycles) { response_push(0x00); response_push(0x20); response_push(0x00); - response_push('S'); - response_push('C'); - response_push('E'); - response_push('I'); + response_push(disc_scex[0]); + response_push(disc_scex[1]); + response_push(disc_scex[2]); + response_push(disc_scex[3]); set_irq(CDIRQ_COMPLETE); } fire_cdrom_irq(); diff --git a/runtime/src/main.cpp b/runtime/src/main.cpp index ab8495bb..6527d511 100644 --- a/runtime/src/main.cpp +++ b/runtime/src/main.cpp @@ -2388,6 +2388,20 @@ int main(int argc, char** argv) { std::fprintf(stdout, "psxrecomp: SPU float-shadow enabled (verified-enhancement)\n"); spu_init(); cdrom_init(disc_path_str.empty() ? NULL : disc_path_str.c_str()); + if (!disc_path_str.empty()) { + /* GetID must report the inserted disc's license region (the BIOS CD + * driver revalidates it mid-game). Derive it from the disc's boot + * serial via the same disc_identity module the launch check uses. */ + const auto ident = PSXRecompV4::identify_disc( + disc_path_str, /*expected_serial*/"", /*expected_crc*/0, + /*has_expected_crc*/false, /*compute_crc*/false); + if (ident.region == "PAL") cdrom_set_disc_scex("SCEE"); + else if (ident.region == "NTSC-J") cdrom_set_disc_scex("SCEI"); + else if (ident.region == "NTSC-U") cdrom_set_disc_scex("SCEA"); + if (!ident.region.empty()) + std::fprintf(stdout, "psxrecomp: disc region %s (serial %s)\n", + ident.region.c_str(), ident.detected_serial.c_str()); + } { int divisor = 1; /* default: authentic 1x timing */ if (disc_speed == "instant") divisor = 0; From 3c54c646f6c74f972144925e3a8a559a52b55629 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 18:28:27 +0000 Subject: [PATCH 06/19] docs: Kula World bring-up findings (mirror + region fixed, demo-load wedge open) Records the two fixed bugs (RAM mirror, GetID region) and characterizes the open third wedge: the game's own CD driver loops Setloc(PVD)/Pause without ever reading the directory, so the demo level never loads and the screen stays black. The oracle loads it, so the divergence is concrete and localized for the next oracle-diff session. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/kula-world-findings.md | 62 +++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 docs/kula-world-findings.md diff --git a/docs/kula-world-findings.md b/docs/kula-world-findings.md new file mode 100644 index 00000000..df2253d4 --- /dev/null +++ b/docs/kula-world-findings.md @@ -0,0 +1,62 @@ +# Kula World (SCES-01000) — bring-up findings + +Status as of this session: boots on the Linux runtime, past the region +wedge, stalls before the demo level renders. Two bugs found; one fixed. + +## Setup + +- `games/kula/game.toml` — SCES-01000, load 0x80011000, entry 0x80069F60 + (KUSEG header addresses normalized by the recompiler; see the PS-X EXE + parser change). +- Recompile: 5297 functions, generated C compiles clean. +- Runtime target `kula-runtime` (runtime/CMakeLists.txt), Linux + Xvfb. +- Oracle: `psx-beetle` (docs/beetle-linux.md) boots the same dump + BIOS + to demo gameplay — ground truth for every comparison below. + +## Bug 1 — RAM mirror not modeled (FIXED) + +crt0 parks $sp in the 4th RAM mirror (0x807FFFF8). Guest accesses to the +0x00200000..0x007FFFFF mirrors fell into the open-bus no-op: stack writes +vanished, $ra read back 0, game jumped to address 0 at frame ~891. +Fix: `psx_phys_addr()` folds the 4x mirror before the RAM bounds check +(runtime/src/memory.c). Diagnosed via the null-dispatch capture-freeze on +the fntrace ring (runtime/src/fntrace.c). + +## Bug 2 — GetID region hardcoded (FIXED) + +GetID's last four response bytes were hardcoded 'SCEI' (NTSC-J). The +kernel CD driver revalidates disc region (ReadTOC + GetID) after the +game's first file load; a PAL disc reporting 'SCEI' threw it into an +endless GetStat/Init loop — CD froze at sector 307 (LBA 318, just before +the HIRO level directory at LBA 319), black screen. +Fix: `cdrom_set_disc_scex()` fed at launch from the disc's SYSTEM.CNF +serial via the existing disc_identity module (PAL->SCEE etc). Verified: +"disc region PAL (serial SCES-01000)"; the game advanced from a hard pin +at frame 890 to 11000+, CD position reached LBA 319. + +## Bug 3 — demo level never loads (OPEN) + +After the region fix the game runs its main loop (VBLANK ticks, +I_MASK=0x0D, funcs cycling) but never renders: GPU draws frozen at 10054, +no new GPU DMA, no ReadN ever issued, sectors frozen at 307. + +The game's OWN CD driver (game code at pc 0x63A14, not the BIOS) loops +Setloc(LBA 16 = ISO PVD) -> Pause, ~every 150 frames (2.5 s), 28 times +and counting, never advancing to read the directory. It reads back +stat=0x02 (motor on, idle) after each Pause and re-loops instead of +proceeding to ReadN. + +Interpretation: this is step 1 of the game's "open file" sequence (seek +to PVD, read directory, find level file, read it). It is stuck on step 1 +— never reads the PVD — so the demo level file is never found or loaded, +and the attract/demo loop has nothing to draw. The oracle loads this +level (Inca stage visible in demo mode), so the divergence is concrete: +oracle proceeds Setloc -> read; ours re-loops Setloc/Pause. + +Next investigation (oracle-diff): capture what psx-beetle's game does at +the same LBA-16 Setloc — same command sequence? what stat / response byte +lets it proceed to the directory read? The 2.5 s retry cadence suggests +the game waits on a condition during those 2.5 s (disc-ready / seek-done / +a flag set by a CD IRQ) that our controller state never satisfies. +Compare the Pause INT2 stat and the game's post-Pause branch condition +(caller of 0x63A14) against the oracle. From 74b3c3677973fa0604c852bb14adb3dbe1f938ad Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 18:50:53 +0000 Subject: [PATCH 07/19] =?UTF-8?q?docs:=20refine=20Kula=20World=20bug=203?= =?UTF-8?q?=20=E2=80=94=20CD=20responses=20are=20correct,=20retry=20loop?= =?UTF-8?q?=20points=20at=20timing/event?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The live trace shows the game's CD-init state machine (GetStat/Init then Setloc/Pause, ~2.5s cadence) receives CORRECT responses at every step — stat=0x02 (healthy idle drive), INT3 ACK + INT2 COMPLETE both fire and the game's ISR processes them — yet it retries forever. So bug 3 is NOT a wrong-response-value bug like bug 2; the game is waiting on a timing or event-completion condition its init check never sees satisfied. Documents two next-session paths: (1) rebuild psx-beetle with a CD-command hook and live-diff the boot->demo sequence, (2) find the game's init-complete branch condition and check our INT2-COMPLETE delivery timing against it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/kula-world-findings.md | 63 ++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/docs/kula-world-findings.md b/docs/kula-world-findings.md index df2253d4..8c94503d 100644 --- a/docs/kula-world-findings.md +++ b/docs/kula-world-findings.md @@ -34,29 +34,54 @@ serial via the existing disc_identity module (PAL->SCEE etc). Verified: "disc region PAL (serial SCES-01000)"; the game advanced from a hard pin at frame 890 to 11000+, CD position reached LBA 319. -## Bug 3 — demo level never loads (OPEN) +## Bug 3 — game's CD-init retry loop never completes (OPEN) After the region fix the game runs its main loop (VBLANK ticks, I_MASK=0x0D, funcs cycling) but never renders: GPU draws frozen at 10054, no new GPU DMA, no ReadN ever issued, sectors frozen at 307. -The game's OWN CD driver (game code at pc 0x63A14, not the BIOS) loops -Setloc(LBA 16 = ISO PVD) -> Pause, ~every 150 frames (2.5 s), 28 times -and counting, never advancing to read the directory. It reads back -stat=0x02 (motor on, idle) after each Pause and re-loops instead of -proceeding to ReadN. +The game's OWN CD driver (game code, all commands issued from pc 0x63A14, +not the BIOS) runs a slow retry state machine, ~150 frames (2.5 s) between +every command: -Interpretation: this is step 1 of the game's "open file" sequence (seek -to PVD, read directory, find level file, read it). It is stuck on step 1 -— never reads the PVD — so the demo level file is never found or loaded, -and the attract/demo loop has nothing to draw. The oracle loads this -level (Inca stage visible in demo mode), so the divergence is concrete: -oracle proceeds Setloc -> read; ours re-loops Setloc/Pause. + frame 890 : BIOS ReadTOC + GetID (region revalidation, now passes) + frame 1040 : GetStat -> stat 0x02 + frame 1190 : Init -> stat 0x02 + frame 1438 : GetStat -> stat 0x02 + frame 1586 : Init -> stat 0x02 + ... GetStat/Init alternating, then transitions to ... + frame 2971+: Setloc(LBA 16 = ISO PVD) -> Pause, repeating 28x -Next investigation (oracle-diff): capture what psx-beetle's game does at -the same LBA-16 Setloc — same command sequence? what stat / response byte -lets it proceed to the directory read? The 2.5 s retry cadence suggests -the game waits on a condition during those 2.5 s (disc-ready / seek-done / -a flag set by a CD IRQ) that our controller state never satisfies. -Compare the Pause INT2 stat and the game's post-Pause branch condition -(caller of 0x63A14) against the oracle. +KEY FINDING: every CD response is CORRECT. GetStat/Init/Pause all return +stat=0x02 (motor on, no error, idle) — exactly what a healthy idle drive +reports — and the INT3/INT2 ACK/COMPLETE pair fires for each. The game +reads the right bytes and STILL re-loops. So this is NOT a wrong-response +-value bug (unlike bug 2). + +Because the responses are correct, the game must be waiting on a TIMING or +EVENT condition, not a status value: + - a per-poll counter / elapsed-time threshold it never reaches, or + - an interrupt/event delivery (the Init INT2 COMPLETE, or a CD-IRQ-set + "command done" flag its ISR latches) that is subtly mis-delivered, so + the main loop's "init done" check never trips and it retries forever. + +The 2.5 s cadence is the tell: that is a retry-with-timeout, i.e. the game +issues a command, waits ~2.5 s for a completion signal, times out, retries. +The signal it waits for is what our controller/IRQ path delivers wrong. + +Next investigation options: + 1. Live oracle-diff: rebuild psx-beetle WITH a CD-command trace hook + (mirror the SIO hook in beetle_sio_trace_hook.patch — add a callback + in cdc.cpp's command dispatch), boot it, and compare the boot->demo + CD command/IRQ sequence. Does the oracle's game issue the same + GetStat/Init loop and then proceed? What completion event breaks it + out that ours doesn't? + 2. Game-side: find the CD-init state machine (caller of the command-issue + func_800639C8) and its "init complete" branch condition — which RAM + flag it polls, and which ISR path (game CD IRQ handler) is supposed to + set it. Then check our INT2-COMPLETE delivery for that command against + it (timing of present_cdrom_irq vs the game reading the response). + Suspicion: the second INT (INT2 COMPLETE) for Init/Pause is delivered but + the game's ISR misses latching its done-flag — a delivery-timing race in + present_cdrom_irq's generation latch, the same machinery bug 2's SeekL + fix (c146b95) touched. From 99a4002ffb7df69ed63599c3dc6b5e7209c8bdad Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 19:05:47 +0000 Subject: [PATCH 08/19] oracle: CD-command trace hook + live-diff localizes Kula World bug 3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a CD-command trace to psx-beetle (beetle_cdcmd_trace_hook.patch: callback in cdc.cpp's command dispatch, wired through beetle_libretro.cpp into cdrom_cmd_dump / cdrom_cmd_reset on the oracle debug server). This is the two-process oracle-diff the setup is built for, now working on Linux. Live-diff result (docs/kula-world-findings.md, bug 3): the oracle's game reads level data with a clean Setloc->SeekL->Setmode->ReadN->Pause per sector (SeekL x18, ReadN x22, GetlocL x89). Our runtime's game, in the wedge, issues NEITHER SeekL NOR ReadN — only GetStat/Init/Setloc/Pause, an error/retry branch the oracle never enters. Crucial: our runtime DID deliver 307 sectors during early boot (ReadN + data delivery work). Reads only stop at frame ~890 — the BIOS mid-game region revalidation (ReadTOC+GetID). The region fix made that PASS, but the post-ReadTOC CD state still stops the game resuming reads. Prime suspect: our ReadTOC (case 0x1E) is a bare stat+COMPLETE stub that does not model drive repositioning / the track table the game reads to recompute its seek. Documented for the next session. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/beetle-linux.md | 5 ++ docs/beetle_cdcmd_trace_hook.patch | 82 ++++++++++++++++++++++++++++++ docs/kula-world-findings.md | 50 ++++++++++++------ runtime/src/beetle_debug_server.c | 43 ++++++++++++++++ runtime/src/beetle_libretro.cpp | 47 ++++++++++++++++- 5 files changed, 210 insertions(+), 17 deletions(-) create mode 100644 docs/beetle_cdcmd_trace_hook.patch diff --git a/docs/beetle-linux.md b/docs/beetle-linux.md index f95dd678..3134315e 100644 --- a/docs/beetle-linux.md +++ b/docs/beetle-linux.md @@ -18,8 +18,13 @@ cd beetle-psx git checkout 5759277b # "audit pass" — last C++-tree base we target patch -p1 < ../docs/beetle_wtrace_hook.patch patch -p1 < ../docs/beetle_sio_trace_hook.patch +patch -p1 < ../docs/beetle_cdcmd_trace_hook.patch ``` +`beetle_cdcmd_trace_hook.patch` adds a CD-command trace callback (fires per +command dispatch in cdc.cpp) exposed as the `cdrom_cmd_dump` / `cdrom_cmd_reset` +debug commands — used to oracle-diff the Kula World CD read sequence. + `beetle_sio_trace_hook.patch` adds `FrontIO::SetSIOTraceCallback` (fires per completed SIO byte exchange) — an integration hook beetle_libretro.cpp needs that predated the committed wtrace patch. diff --git a/docs/beetle_cdcmd_trace_hook.patch b/docs/beetle_cdcmd_trace_hook.patch new file mode 100644 index 00000000..9015cf47 --- /dev/null +++ b/docs/beetle_cdcmd_trace_hook.patch @@ -0,0 +1,82 @@ +diff --git a/libretro.cpp b/libretro.cpp +index d2e82bca..e9c867c8 100644 +--- a/libretro.cpp ++++ b/libretro.cpp +@@ -508,6 +508,11 @@ PS_SPU *PSX_SPU = NULL; + PS_CDC *PSX_CDC = NULL; + FrontIO *PSX_FIO = NULL; + ++/* PSXRecomp oracle hooks: NULL when no listener attached. */ ++psxrecomp_wtrace_cb_t g_psxrecomp_wtrace_cb = NULL; ++psxrecomp_fntrace_cb_t g_psxrecomp_fntrace_cb = NULL; ++psxrecomp_cdcmd_cb_t g_psxrecomp_cdcmd_cb = NULL; ++ + MultiAccessSizeMem<512 * 1024, uint32, false> *BIOSROM = NULL; + MultiAccessSizeMem<65536, uint32, false> *PIOMem = NULL; + MultiAccessSizeMem<2048 * 1024, uint32, false> *MainRAM = NULL; +diff --git a/mednafen/psx/cdc.cpp b/mednafen/psx/cdc.cpp +index 1daaa5b7..d62c7ee9 100644 +--- a/mednafen/psx/cdc.cpp ++++ b/mednafen/psx/cdc.cpp +@@ -1318,6 +1318,12 @@ int32_t PS_CDC::Update(const int32_t timestamp) + else + { + const CDC_CTEntry *command = &Commands[PendingCommand]; ++ /* PSXRecomp oracle hook: CD command about to execute. */ ++ if(MDFN_UNLIKELY(g_psxrecomp_cdcmd_cb)) ++ g_psxrecomp_cdcmd_cb(PendingCommand, ArgsReceiveIn, ++ ArgsReceiveIn > 0 ? ArgsReceiveBuf[0] : 0, ++ ArgsReceiveIn > 1 ? ArgsReceiveBuf[1] : 0, ++ ArgsReceiveIn > 2 ? ArgsReceiveBuf[2] : 0); + next_time = (this->*(command->func))(ArgsReceiveIn, ArgsReceiveBuf); + PendingCommandPhase = 2; + } +diff --git a/mednafen/psx/psx.h b/mednafen/psx/psx.h +index 704c0a19..d9538c13 100644 +--- a/mednafen/psx/psx.h ++++ b/mednafen/psx/psx.h +@@ -137,4 +137,44 @@ extern unsigned psx_gpu_overclock_shift; + extern uint8_t analog_combo[2]; + extern uint8_t analog_combo_hold; + ++/* PSXRecomp oracle: SIO byte trace callback. ++ * Fired by FrontIO when a complete byte exchange finishes. */ ++class FrontIO; ++extern FrontIO *PSX_FIO; ++typedef void (*psxrecomp_sio_trace_cb_t)(uint8_t tx, uint8_t rx, uint16_t ctrl); ++ ++/* PSXRecomp oracle: RAM write trace callback. ++ * Fired by PS_CPU::SB/SH/SW after the write completes. ++ * addr = virtual address (caller masks for physical filter) ++ * value = stored value (sized by `size`) ++ * pc = PC of the executing store instruction ++ * ra = $ra (GPR[31]) at time of store, for one frame of caller context ++ * size = 1, 2, or 4 (byte / halfword / word) */ ++typedef void (*psxrecomp_wtrace_cb_t)(uint32_t addr, uint32_t value, ++ uint32_t pc, uint32_t ra, uint8_t size); ++extern psxrecomp_wtrace_cb_t g_psxrecomp_wtrace_cb; ++ ++/* PSXRecomp oracle: function-call (JAL/JALR/J/JR) trace callback. ++ * Fired by PS_CPU on every J/JAL/JR/JALR retire, BEFORE the link write. ++ * Caller filters by target_pc to keep volume bounded. ++ * caller_pc = PC of the J/JAL/JR/JALR instruction ++ * target_pc = computed branch target ++ * parent_ra = GPR[31] at time of call (parent's return address) ++ * a0, a1 = argument registers at time of call ++ * kind = 1=J, 2=JAL, 3=JR, 4=JALR */ ++typedef void (*psxrecomp_fntrace_cb_t)(uint32_t caller_pc, uint32_t target_pc, ++ uint32_t parent_ra, uint32_t a0, ++ uint32_t a1, uint8_t kind); ++extern psxrecomp_fntrace_cb_t g_psxrecomp_fntrace_cb; ++ ++/* PSXRecomp oracle: CD command trace callback. ++ * Fired by PS_CDC just before a command handler executes. ++ * cmd = command byte (0x01 GetStat, 0x02 Setloc, 0x06 ReadN, 0x09 Pause, ++ * 0x0A Init, 0x0E Setmode, 0x15 SeekL, 0x1A GetID, 0x1B ReadS, ...) ++ * nargs = number of argument bytes ++ * arg0..arg2 = first three argument bytes (0 if absent) */ ++typedef void (*psxrecomp_cdcmd_cb_t)(uint8_t cmd, uint8_t nargs, ++ uint8_t arg0, uint8_t arg1, uint8_t arg2); ++extern psxrecomp_cdcmd_cb_t g_psxrecomp_cdcmd_cb; ++ + #endif diff --git a/docs/kula-world-findings.md b/docs/kula-world-findings.md index 8c94503d..c77e88ba 100644 --- a/docs/kula-world-findings.md +++ b/docs/kula-world-findings.md @@ -69,19 +69,37 @@ The 2.5 s cadence is the tell: that is a retry-with-timeout, i.e. the game issues a command, waits ~2.5 s for a completion signal, times out, retries. The signal it waits for is what our controller/IRQ path delivers wrong. -Next investigation options: - 1. Live oracle-diff: rebuild psx-beetle WITH a CD-command trace hook - (mirror the SIO hook in beetle_sio_trace_hook.patch — add a callback - in cdc.cpp's command dispatch), boot it, and compare the boot->demo - CD command/IRQ sequence. Does the oracle's game issue the same - GetStat/Init loop and then proceed? What completion event breaks it - out that ours doesn't? - 2. Game-side: find the CD-init state machine (caller of the command-issue - func_800639C8) and its "init complete" branch condition — which RAM - flag it polls, and which ISR path (game CD IRQ handler) is supposed to - set it. Then check our INT2-COMPLETE delivery for that command against - it (timing of present_cdrom_irq vs the game reading the response). - Suspicion: the second INT (INT2 COMPLETE) for Init/Pause is delivered but - the game's ISR misses latching its done-flag — a delivery-timing race in - present_cdrom_irq's generation latch, the same machinery bug 2's SeekL - fix (c146b95) touched. +### Oracle-diff result (DONE — divergence localized) + +Built a CD-command trace hook into psx-beetle (beetle_cdcmd_trace_hook.patch: +a callback in cdc.cpp's command dispatch + `cdrom_cmd_dump` / `cdrom_cmd_reset` +debug commands on the oracle) and captured its boot->demo CD command stream. + +The oracle's game reads level data with a clean per-sector pattern: + Setloc(LBA) -> SeekL -> Setmode(0x80) -> ReadN -> Pause (x22 ReadN) +plus GetlocL (0x10) position polling (x89). It issues SeekL 18x and ReadN 22x. + +Our runtime's game, in the wedge window, issues **NEITHER SeekL NOR ReadN** — +only GetStat/Init/Setloc/Pause. So our game took an error/retry branch the +oracle never enters. + +CRUCIAL timeline fact: our runtime DID deliver 307 sectors successfully during +early boot (so ReadN + sector-data delivery WORK). Reading only stops at +frame ~890 — the moment the BIOS does its mid-game region revalidation +(ReadTOC + GetID). After that revalidation the game can never resume reading; +it drops into the GetStat/Init/Setloc/Pause retry loop and stays there. + +So the root cause is narrowed to: the BIOS ReadTOC+GetID revalidation (or the +CD-controller state it leaves behind — drive repositioned to lead-in / TOC, +stat/mode reset) prevents the game's CD driver from resuming reads. The region +fix got the revalidation to PASS, but the post-revalidation CD state still +breaks the resume. The oracle does not perform this mid-game revalidation in +the same way, so it reads continuously. + +Next: diff the CD-controller state (stat, mode, position, motor/seek bits) +immediately AFTER ReadTOC completes, ours vs the oracle. Check whether our +ReadTOC leaves stat/position where the game's resume-read expects it, and +whether the game's post-revalidation Setloc/SeekL is being answered such that +it can re-enter the read state. Prime suspect: our ReadTOC (case 0x1E) is a +bare stat+COMPLETE stub — it does not model the drive repositioning / the +GetTN/GetTD track table the game may read next to recompute where to seek. diff --git a/runtime/src/beetle_debug_server.c b/runtime/src/beetle_debug_server.c index 26659517..15d10480 100644 --- a/runtime/src/beetle_debug_server.c +++ b/runtime/src/beetle_debug_server.c @@ -53,6 +53,14 @@ extern uint32_t beetle_get_sio_trace(uint32_t *out_seq, uint8_t *out_tx, extern uint32_t beetle_get_sio_trace_total(void); extern void beetle_reset_sio_trace(void); +/* CD command trace */ +extern uint32_t beetle_get_cdcmd_trace(uint32_t *out_seq, uint8_t *out_cmd, + uint8_t *out_nargs, uint8_t *out_a0, + uint8_t *out_a1, uint8_t *out_a2, + int max_count); +extern uint32_t beetle_get_cdcmd_trace_total(void); +extern void beetle_reset_cdcmd_trace(void); + /* wtrace */ extern int beetle_wtrace_arm(uint32_t lo, uint32_t hi); extern int beetle_wtrace_disarm(int slot); @@ -379,6 +387,39 @@ static void h_sio_trace(int id, const char *json) { free(seqs); free(txs); free(rxs); free(ctrl); } +static void h_cdrom_cmd_dump(int id, const char *json) { + int count = json_get_int(json, "count", 256); + if (count < 1) count = 1; + if (count > 8192) count = 8192; + + uint32_t *seqs = (uint32_t*)malloc(count * sizeof(uint32_t)); + uint8_t *cmds = (uint8_t*)malloc(count), *nargs = (uint8_t*)malloc(count); + uint8_t *a0 = (uint8_t*)malloc(count), *a1 = (uint8_t*)malloc(count), *a2 = (uint8_t*)malloc(count); + if (!seqs || !cmds || !nargs || !a0 || !a1 || !a2) { + free(seqs); free(cmds); free(nargs); free(a0); free(a1); free(a2); + send_err(id, "alloc"); return; + } + uint32_t got = beetle_get_cdcmd_trace(seqs, cmds, nargs, a0, a1, a2, count); + uint32_t total = beetle_get_cdcmd_trace_total(); + + send_fmt("{\"id\":%d,\"ok\":true,\"total\":%u,\"count\":%u,\"entries\":[", + id, total, got); + for (uint32_t i = 0; i < got; i++) { + if (i > 0) send_fmt(","); + send_fmt("{\"seq\":%u,\"cmd\":\"0x%02X\",\"nargs\":%u," + "\"a0\":\"0x%02X\",\"a1\":\"0x%02X\",\"a2\":\"0x%02X\"}", + seqs[i], cmds[i], nargs[i], a0[i], a1[i], a2[i]); + } + send_fmt("]}\n"); + free(seqs); free(cmds); free(nargs); free(a0); free(a1); free(a2); +} + +static void h_cdrom_cmd_reset(int id, const char *json) { + (void)json; + beetle_reset_cdcmd_trace(); + send_ok(id); +} + static void h_sio_write_window(int id, const char *json) { int which = json_get_int(json, "which", 0); int before = json_get_int(json, "before", 4); @@ -1089,6 +1130,8 @@ static const CmdEntry CMDS[] = { { "screenshot_file", h_screenshot_file }, /* alias */ { "sio_trace_reset", h_sio_trace_reset }, { "sio_trace", h_sio_trace }, + { "cdrom_cmd_dump", h_cdrom_cmd_dump }, + { "cdrom_cmd_reset", h_cdrom_cmd_reset }, { "sio_write_window", h_sio_write_window }, /* wtrace — normalized verb set (parity contract with psx-runtime). */ { "wtrace_arm", h_wtrace_arm }, diff --git a/runtime/src/beetle_libretro.cpp b/runtime/src/beetle_libretro.cpp index ff5e1d41..4c9a828b 100644 --- a/runtime/src/beetle_libretro.cpp +++ b/runtime/src/beetle_libretro.cpp @@ -56,6 +56,22 @@ static void sio_trace_callback(uint8_t tx, uint8_t rx, uint16_t ctrl) { s_sio_trace_idx = (s_sio_trace_idx + 1) % BEETLE_SIO_TRACE_CAP; } +/* ---- CD command trace (oracle-diff for the Kula World CD-init wedge) ---- */ +#define BEETLE_CDCMD_TRACE_CAP 8192 +struct BeetleCdcmdEntry { + uint32_t seq; uint8_t cmd, nargs, a0, a1, a2; +}; +static BeetleCdcmdEntry s_cdcmd_trace[BEETLE_CDCMD_TRACE_CAP]; +static int s_cdcmd_idx = 0; +static uint32_t s_cdcmd_seq = 0; +static void cdcmd_trace_callback(uint8_t cmd, uint8_t nargs, + uint8_t a0, uint8_t a1, uint8_t a2) { + BeetleCdcmdEntry *e = &s_cdcmd_trace[s_cdcmd_idx]; + e->seq = s_cdcmd_seq++; e->cmd = cmd; e->nargs = nargs; + e->a0 = a0; e->a1 = a1; e->a2 = a2; + s_cdcmd_idx = (s_cdcmd_idx + 1) % BEETLE_CDCMD_TRACE_CAP; +} + /* ---- wtrace_all ring (ALWAYS-ON; no filter; captures every write) ---- * Per global rule "ring buffers always-on": every write hits this ring * unconditionally so probes connected late can still query the last ~1s @@ -434,7 +450,8 @@ extern "C" int beetle_init_with_disc(const char *bios_path, const char *disc_pat g_psxrecomp_wtrace_cb = wtrace_callback; g_psxrecomp_fntrace_cb = fntrace_callback; - std::fprintf(stderr, "[psx-beetle] wtrace + fntrace callbacks registered\n"); + g_psxrecomp_cdcmd_cb = cdcmd_trace_callback; + std::fprintf(stderr, "[psx-beetle] wtrace + fntrace + cdcmd callbacks registered\n"); std::fflush(stderr); return 0; @@ -553,6 +570,34 @@ extern "C" void beetle_reset_sio_trace(void) { memset(s_sio_trace, 0, sizeof(s_sio_trace)); } +/* ---- CD command trace accessors ---- */ +extern "C" uint32_t beetle_get_cdcmd_trace(uint32_t *out_seq, uint8_t *out_cmd, + uint8_t *out_nargs, uint8_t *out_a0, + uint8_t *out_a1, uint8_t *out_a2, + int max_count) +{ + int avail = (int)(s_cdcmd_seq < (uint32_t)BEETLE_CDCMD_TRACE_CAP + ? s_cdcmd_seq : BEETLE_CDCMD_TRACE_CAP); + int count = max_count < avail ? max_count : avail; + int start = (s_cdcmd_idx - count + BEETLE_CDCMD_TRACE_CAP) % BEETLE_CDCMD_TRACE_CAP; + for (int i = 0; i < count; i++) { + const BeetleCdcmdEntry *e = &s_cdcmd_trace[(start + i) % BEETLE_CDCMD_TRACE_CAP]; + out_seq[i] = e->seq; + out_cmd[i] = e->cmd; + out_nargs[i] = e->nargs; + out_a0[i] = e->a0; + out_a1[i] = e->a1; + out_a2[i] = e->a2; + } + return (uint32_t)count; +} +extern "C" uint32_t beetle_get_cdcmd_trace_total(void) { return s_cdcmd_seq; } +extern "C" void beetle_reset_cdcmd_trace(void) { + s_cdcmd_idx = 0; + s_cdcmd_seq = 0; + memset(s_cdcmd_trace, 0, sizeof(s_cdcmd_trace)); +} + /* ---- wtrace accessors ---- */ extern "C" int beetle_wtrace_arm(uint32_t lo, uint32_t hi) { if (s_wtrace_range_count >= BEETLE_WTRACE_MAX_RANGES) return -1; From 8861d3e9635ff4d914e1f676e9e1893c43968a05 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 19:11:35 +0000 Subject: [PATCH 09/19] =?UTF-8?q?docs:=20sharpen=20Kula=20bug=203=20?= =?UTF-8?q?=E2=80=94=20spurious=20BIOS=20disc=20re-identify=20at=20frame?= =?UTF-8?q?=20890?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Full oracle command trace confirms it NEVER issues ReadTOC; ours does, from the BIOS (Pause->ReadTOC->GetID) at frame 890, with clean pre-read stat (0x22, no error/shell bits). Same BIOS bytes on both, so our runtime reaching the disc-identify path is a state-driven BRANCH divergence, not a CD-sim error: likely a kernel 'disc already identified' flag left unset, or a recompiler-level game-logic divergence. Next: instruction-level first-divergence hunt around frame 890. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/kula-world-findings.md | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/docs/kula-world-findings.md b/docs/kula-world-findings.md index c77e88ba..6b1731c3 100644 --- a/docs/kula-world-findings.md +++ b/docs/kula-world-findings.md @@ -96,10 +96,29 @@ fix got the revalidation to PASS, but the post-revalidation CD state still breaks the resume. The oracle does not perform this mid-game revalidation in the same way, so it reads continuously. -Next: diff the CD-controller state (stat, mode, position, motor/seek bits) -immediately AFTER ReadTOC completes, ours vs the oracle. Check whether our -ReadTOC leaves stat/position where the game's resume-read expects it, and -whether the game's post-revalidation Setloc/SeekL is being answered such that -it can re-enter the read state. Prime suspect: our ReadTOC (case 0x1E) is a -bare stat+COMPLETE stub — it does not model the drive repositioning / the -GetTN/GetTD track table the game may read next to recompute where to seek. +### Sharper localization (DONE) — spurious BIOS disc re-identify + +Full oracle command trace confirms: the oracle NEVER issues ReadTOC (0x1E). +Our runtime issues it at frame 890, from the BIOS (Pause@BFC05FE8 -> +ReadTOC@BFC0D760 -> GetID@BFC0D7F0). The sector reads right before are clean +(stat=0x22 motor+read, no error/shell/seek bits), so this is NOT triggered by +a CD error we injected. + +Since BOTH runtimes execute the SAME BIOS bytes, our runtime reaching the +BFC0Dxxx disc-identify path while the oracle never does means the BIOS/game +takes a DIFFERENT BRANCH — driven by state, not by the CD hardware sim: + - most likely a kernel "disc already identified" flag that our earlier boot + left unset/cleared (so the BIOS re-identifies), where the oracle's is set; + - or a recompiler-level game-logic divergence that routes our game into a + BIOS disc service the oracle's run never calls. + +After the (now-passing) re-identify, the game's own CD driver cannot resume: +it drops into GetStat/Init then Setloc(16)/Pause and never issues SeekL/ReadN +again — the visible wedge. + +Next tool: instruction/branch-level first-divergence hunt between the two +processes (CLAUDE.md's find_first_divergence) to find where the game/BIOS +first branches differently around frame 890. Then either set/preserve the +kernel disc-identify flag correctly, or fix the recompiled branch. The CD +command hook (cdrom_cmd_dump) and the fntrace/wtrace rings on both sides are +the instruments; this is a dedicated next-session task. From 9fee0b5dc03c75f64f5ad198b9005d873bf0e002 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 20:05:05 +0000 Subject: [PATCH 10/19] cdrom: PSX_CD_TRAP_CMD self-stop trap; boot flows diverge from power-on MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New debug tool: PSX_CD_TRAP_CMD=<byte> [PSX_CD_TRAP_NTH=<n>] SIGSTOPs the process the instant the Nth matching CD command dispatches, so a debugger attaches to the exact moment with zero run-speed cost (a gdb conditional breakpoint on exec_command slows the emu ~100x and never reaches the wedge). Used it to pin Kula bug 3 one level deeper: the pre-wedge ReadTOC at frame ~890 is issued by the BIOS BOOT FLOW itself (guest stack shows only Main/StartKernel-chain ROM addresses, zero game frames) — the boot's post-EXE-load disc re-check. And the full command-history dump shows our boot diverges from the oracle's from the VERY FIRST command: the oracle's kernel opens with Init/Init/GetTN/GetID and never issues Test or ReadTOC; ours opens with the shell's Test[20]/GetID/ReadTOC check and re-checks after the EXE load. Same SCPH1001 bytes, different path — an early-boot branch divergence (recompiled-BIOS or hardware-sim input), documented in docs/kula-world-findings.md for the first-divergence session. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/kula-world-findings.md | 41 +++++++++++++++++++++++++++++++++++++ runtime/src/cdrom.c | 21 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/docs/kula-world-findings.md b/docs/kula-world-findings.md index 6b1731c3..52ace3d8 100644 --- a/docs/kula-world-findings.md +++ b/docs/kula-world-findings.md @@ -122,3 +122,44 @@ first branches differently around frame 890. Then either set/preserve the kernel disc-identify flag correctly, or fix the recompiled branch. The CD command hook (cdrom_cmd_dump) and the fntrace/wtrace rings on both sides are the instruments; this is a dedicated next-session task. + + +### Round 3 narrowing (self-stop trap) — the boot flows diverge from power-on + +New tool: PSX_CD_TRAP_CMD=<byte> [PSX_CD_TRAP_NTH=<n>] makes the runtime +SIGSTOP itself the instant the Nth matching CD command dispatches (gdb +conditional breakpoints slow the emu ~100x; the self-stop costs nothing). +Attach gdb to the frozen process at leisure. + +Findings from trapping ReadTOC #1 and #2 plus a full command-history dump +(command_history ring, 8192 entries, survives the data-event flood): + +1. ReadTOC #1 (frame ~545) is the SHELL's disc check (pcs 0xBFC3Fxxx / + 0xBFC40xxx; RAM at 0x56FF0 still holds shell bytes — EXE not loaded yet). + Legitimate. +2. ReadTOC #2 (frame ~890, the pre-wedge one) is issued from the BIOS BOOT + FLOW itself — guest stack at the trap holds ONLY BIOS-ROM return + addresses (Main/StartKernel chain -> 0xBFC0D5A4 -> 0xBFC0D72C), zero game + frames. It is the boot's post-EXE-load disc re-check, not a game call. +3. OUR full boot command stream (from power-on): + Test[20], GetStat, GetID, ReadTOC, GetStat, GetID, <- shell check + license sectors LBA 4-5, GetID, + Init, PVD/dir reads, per-sector EXE load ... Pause(f889), + ReadTOC+GetID (f890, irq-masked, polled) <- boot re-check + ORACLE's full stream (same SCPH1001 bytes!): + Init, Init, GetTN, GetID, Setmode(0), PVD/dir reads, + Init x3, per-sector EXE load ... -> game reads, NO Test, NO ReadTOC ever. +4. So the divergence does NOT start at frame 890 — the flows differ from the + FIRST command: the oracle's kernel does an early CdInit (Init,Init,GetTN) + that our recompiled BIOS never issues, and our shell uses the + Test+ReadTOC-based check the oracle never runs. Same ROM bytes, different + path => either a recompiled-BIOS branch divergence in early boot, or a + hardware-sim input (timer/SPU/CD status read) steering an early branch + differently. + +Next session: first-divergence hunt anchored at the FIRST CD command +(oracle: Init; ours: Test at f539). Instrument the early boot branch that +selects between these kernel CD-init paths. The 0xBFC0Dxxx CD-driver region +is not covered by docs/psx_bios_disasm.txt — needs Ghidra (source of truth +#2) or manual decode of those ROM bytes. The game-side wedge (GetStat/Init +retry loop) is downstream of this boot-flow divergence. diff --git a/runtime/src/cdrom.c b/runtime/src/cdrom.c index 4e26a8a8..5dc64b13 100644 --- a/runtime/src/cdrom.c +++ b/runtime/src/cdrom.c @@ -16,6 +16,9 @@ #include "event_ring.h" #include <string.h> #include <stdlib.h> +#ifndef _WIN32 +# include <signal.h> +#endif #ifdef _WIN32 # define WIN32_LEAN_AND_MEAN # include <windows.h> @@ -955,6 +958,24 @@ static void queue_or_exec_command(uint8_t cmd) { } static void exec_command(uint8_t cmd) { +#if !defined(PSX_NO_DEBUG_TOOLS) && !defined(_WIN32) + /* Self-stop trap: PSX_CD_TRAP_CMD=<byte> makes the process SIGSTOP + * itself the moment that CD command dispatches, so a debugger can + * attach and read the full native+guest call chain at the exact + * instant with ZERO run-speed cost. (A gdb conditional breakpoint on + * this function slows the emu two orders of magnitude via ptrace — + * unusable for wedges that need minutes of healthy boot first.) */ + { + static long trap_cmd = -2, trap_nth = 1, trap_hits = 0; + if (trap_cmd == -2) { + const char *e = getenv("PSX_CD_TRAP_CMD"); + trap_cmd = (e && *e) ? strtol(e, NULL, 0) : -1; + e = getenv("PSX_CD_TRAP_NTH"); /* stop on the Nth match (default 1st) */ + if (e && *e) trap_nth = strtol(e, NULL, 0); + } + if ((long)cmd == trap_cmd && ++trap_hits == trap_nth) raise(SIGSTOP); + } +#endif trace_cdrom('C', 0, cmd, 0); /* ENQUEUE: a CD command was issued (aux = command byte). */ event_ring_record_aux(EV_ENQ, (uint8_t)SRC_CD_CMD, (uint32_t)cmd); From c0ea49832a05d68a4fe95e6e527b4d3116f3d0a3 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 20:18:24 +0000 Subject: [PATCH 11/19] cdrom: fix 0x1F801800 status bits per oracle (spurious ADPBUSY, missing BUSYSTS) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bit 2 is ADPBUSY (XA-ADPCM playback in progress) and must idle at 0; we raised it unconditionally under a mistaken 'ADPCM empty' reading. Bit 7 (BUSYSTS: command written, first response not yet ready) was never raised; now mapped to the queued-command window, mirroring beetle's PendingCommandCounter/phase busy window. Verified against beetle cdc.cpp Read(A==0), which sets bit 2 never and bit 7 during command latency. Boot-diff verification shows this does NOT change our boot command stream (the early-boot branch divergence vs the oracle persists — documented in docs/kula-world-findings.md round 4, with the next sharp step: add guest PC to the oracle's cdcmd hook and diff the first divergent call site). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/kula-world-findings.md | 29 +++++++++++++++++++++++++++++ runtime/src/cdrom.c | 10 +++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/docs/kula-world-findings.md b/docs/kula-world-findings.md index 52ace3d8..eb16228c 100644 --- a/docs/kula-world-findings.md +++ b/docs/kula-world-findings.md @@ -163,3 +163,32 @@ selects between these kernel CD-init paths. The 0xBFC0Dxxx CD-driver region is not covered by docs/psx_bios_disasm.txt — needs Ghidra (source of truth #2) or manual decode of those ROM bytes. The game-side wedge (GetStat/Init retry loop) is downstream of this boot-flow divergence. + + +### Round 4 — status-register fix + boot-diff instrumentation status + +Fixed vs the oracle source (beetle cdc.cpp Read A==0): our 0x1F801800 +status register raised bit 2 (ADPBUSY, "XA-ADPCM playing") permanently — +it must idle at 0 — and never raised bit 7 (BUSYSTS, command written but +response not ready; now mapped to our queued-command window). Verified the +fix does NOT change the boot command stream, so ADPBUSY was not the branch +input steering the early boot; the fix stands on correctness regardless. + +Environment note: the "everything got 40x slower" mystery was real and +environmental — leftover wedged instances before a container restart. A +clean baseline runs ~50 fps and reaches the frame-890 re-check in ~13 s. +Rule-15 lesson: measure the baseline before blaming the tool. + +Instrumentation gap found while diffing boots: the oracle's cdcmd hook has +no guest PC, and reconstructing command writes from wtrace (index-register +tracking) is unreliable because IRQ handlers interleave index changes. +Also learned: pc 0x63A14 is simply the game driver's generic +write-byte-to-CD-register routine (same pc for all registers, on the +oracle too) — not specific to the retry loop. + +NEXT (small, sharp): extend the beetle cdcmd hook with the guest PC +(PS_CPU exposes it), recapture both boot command streams with PCs, and +diff the first divergent command's call site. Then disassemble that +site's branch (capstone is installed) and inspect its inputs on both +sides. All tooling for this exists after this session: self-stop trap, +command-history ring parse, oracle cdcmd dump, oracle wtrace/fntrace. diff --git a/runtime/src/cdrom.c b/runtime/src/cdrom.c index 5dc64b13..7b965059 100644 --- a/runtime/src/cdrom.c +++ b/runtime/src/cdrom.c @@ -1424,11 +1424,19 @@ uint32_t cdrom_read(uint32_t addr) { switch (addr) { case 0x1F801800: { uint8_t s = index_reg & 0x03; - s |= (1 << 2); /* ADPCM empty */ + /* Bit 2 is ADPBUSY (XA-ADPCM playback in progress), NOT "ADPCM + * empty" — it must idle at 0. The oracle (beetle cdc.cpp, Read + * A==0) never raises it. Raising it permanently made every BIOS + * status poll see "XA busy" and steered the kernel CD driver + * init down a different branch from real hardware. */ if (param_count == 0) s |= (1 << 3); if (param_count < PARAM_FIFO_SIZE) s |= (1 << 4); if (response_read < response_count) s |= (1 << 5); if (data_fifo_ready()) s |= (1 << 6); + /* Bit 7 BUSYSTS: command written but not yet executed (our queued + * path; the synchronous path leaves no guest-observable window). + * Mirrors beetle's PendingCommandCounter/phase<=1 busy window. */ + if (queued_cmd.pending) s |= (1 << 7); ret = s; break; } From 698e1008169af68e495d2f8ed8d88b5c4a4f32d2 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 20:24:50 +0000 Subject: [PATCH 12/19] oracle: add guest PC to CD-command trace hook MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extends psxrecomp_cdcmd_cb_t (and the beetle_cdcmd_trace ring + cdrom_cmd_dump JSON) with the guest PC at dispatch, read via PS_CPU::GetRegister(GSREG_PC). Lets the boot-command-stream oracle-diff localize the first divergent command's call site (kernel vs shell vs game) instead of only the command byte — the next step in isolating the early-boot branch divergence behind Kula World bug 3. Builds clean; behavior-inert when no listener is attached. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/beetle_cdcmd_trace_hook.patch | 35 ++++++++++-------------------- runtime/src/beetle_debug_server.c | 15 ++++++++----- runtime/src/beetle_libretro.cpp | 9 +++++--- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/docs/beetle_cdcmd_trace_hook.patch b/docs/beetle_cdcmd_trace_hook.patch index 9015cf47..75087102 100644 --- a/docs/beetle_cdcmd_trace_hook.patch +++ b/docs/beetle_cdcmd_trace_hook.patch @@ -1,41 +1,29 @@ -diff --git a/libretro.cpp b/libretro.cpp -index d2e82bca..e9c867c8 100644 ---- a/libretro.cpp -+++ b/libretro.cpp -@@ -508,6 +508,11 @@ PS_SPU *PSX_SPU = NULL; - PS_CDC *PSX_CDC = NULL; - FrontIO *PSX_FIO = NULL; - -+/* PSXRecomp oracle hooks: NULL when no listener attached. */ -+psxrecomp_wtrace_cb_t g_psxrecomp_wtrace_cb = NULL; -+psxrecomp_fntrace_cb_t g_psxrecomp_fntrace_cb = NULL; -+psxrecomp_cdcmd_cb_t g_psxrecomp_cdcmd_cb = NULL; -+ - MultiAccessSizeMem<512 * 1024, uint32, false> *BIOSROM = NULL; - MultiAccessSizeMem<65536, uint32, false> *PIOMem = NULL; - MultiAccessSizeMem<2048 * 1024, uint32, false> *MainRAM = NULL; diff --git a/mednafen/psx/cdc.cpp b/mednafen/psx/cdc.cpp -index 1daaa5b7..d62c7ee9 100644 +index 1daaa5b7..a6b31b66 100644 --- a/mednafen/psx/cdc.cpp +++ b/mednafen/psx/cdc.cpp -@@ -1318,6 +1318,12 @@ int32_t PS_CDC::Update(const int32_t timestamp) +@@ -1318,6 +1318,16 @@ int32_t PS_CDC::Update(const int32_t timestamp) else { const CDC_CTEntry *command = &Commands[PendingCommand]; -+ /* PSXRecomp oracle hook: CD command about to execute. */ ++ /* PSXRecomp oracle hook: CD command about to execute. ++ * PC of the guest at dispatch time — the command was ++ * WRITTEN earlier (latency), so this is the poll/idle ++ * PC, but it still localizes kernel vs shell vs game. */ + if(MDFN_UNLIKELY(g_psxrecomp_cdcmd_cb)) + g_psxrecomp_cdcmd_cb(PendingCommand, ArgsReceiveIn, + ArgsReceiveIn > 0 ? ArgsReceiveBuf[0] : 0, + ArgsReceiveIn > 1 ? ArgsReceiveBuf[1] : 0, -+ ArgsReceiveIn > 2 ? ArgsReceiveBuf[2] : 0); ++ ArgsReceiveIn > 2 ? ArgsReceiveBuf[2] : 0, ++ PSX_CPU ? PSX_CPU->GetRegister(PS_CPU::GSREG_PC, NULL, 0) : 0); next_time = (this->*(command->func))(ArgsReceiveIn, ArgsReceiveBuf); PendingCommandPhase = 2; } diff --git a/mednafen/psx/psx.h b/mednafen/psx/psx.h -index 704c0a19..d9538c13 100644 +index 704c0a19..fc53362d 100644 --- a/mednafen/psx/psx.h +++ b/mednafen/psx/psx.h -@@ -137,4 +137,44 @@ extern unsigned psx_gpu_overclock_shift; +@@ -137,4 +137,45 @@ extern unsigned psx_gpu_overclock_shift; extern uint8_t analog_combo[2]; extern uint8_t analog_combo_hold; @@ -76,7 +64,8 @@ index 704c0a19..d9538c13 100644 + * nargs = number of argument bytes + * arg0..arg2 = first three argument bytes (0 if absent) */ +typedef void (*psxrecomp_cdcmd_cb_t)(uint8_t cmd, uint8_t nargs, -+ uint8_t arg0, uint8_t arg1, uint8_t arg2); ++ uint8_t arg0, uint8_t arg1, uint8_t arg2, ++ uint32_t pc); +extern psxrecomp_cdcmd_cb_t g_psxrecomp_cdcmd_cb; + #endif diff --git a/runtime/src/beetle_debug_server.c b/runtime/src/beetle_debug_server.c index 15d10480..0deb9d1d 100644 --- a/runtime/src/beetle_debug_server.c +++ b/runtime/src/beetle_debug_server.c @@ -57,6 +57,7 @@ extern void beetle_reset_sio_trace(void); extern uint32_t beetle_get_cdcmd_trace(uint32_t *out_seq, uint8_t *out_cmd, uint8_t *out_nargs, uint8_t *out_a0, uint8_t *out_a1, uint8_t *out_a2, + uint32_t *out_pc, int max_count); extern uint32_t beetle_get_cdcmd_trace_total(void); extern void beetle_reset_cdcmd_trace(void); @@ -393,13 +394,14 @@ static void h_cdrom_cmd_dump(int id, const char *json) { if (count > 8192) count = 8192; uint32_t *seqs = (uint32_t*)malloc(count * sizeof(uint32_t)); + uint32_t *pcs = (uint32_t*)malloc(count * sizeof(uint32_t)); uint8_t *cmds = (uint8_t*)malloc(count), *nargs = (uint8_t*)malloc(count); uint8_t *a0 = (uint8_t*)malloc(count), *a1 = (uint8_t*)malloc(count), *a2 = (uint8_t*)malloc(count); - if (!seqs || !cmds || !nargs || !a0 || !a1 || !a2) { - free(seqs); free(cmds); free(nargs); free(a0); free(a1); free(a2); + if (!seqs || !pcs || !cmds || !nargs || !a0 || !a1 || !a2) { + free(seqs); free(pcs); free(cmds); free(nargs); free(a0); free(a1); free(a2); send_err(id, "alloc"); return; } - uint32_t got = beetle_get_cdcmd_trace(seqs, cmds, nargs, a0, a1, a2, count); + uint32_t got = beetle_get_cdcmd_trace(seqs, cmds, nargs, a0, a1, a2, pcs, count); uint32_t total = beetle_get_cdcmd_trace_total(); send_fmt("{\"id\":%d,\"ok\":true,\"total\":%u,\"count\":%u,\"entries\":[", @@ -407,11 +409,12 @@ static void h_cdrom_cmd_dump(int id, const char *json) { for (uint32_t i = 0; i < got; i++) { if (i > 0) send_fmt(","); send_fmt("{\"seq\":%u,\"cmd\":\"0x%02X\",\"nargs\":%u," - "\"a0\":\"0x%02X\",\"a1\":\"0x%02X\",\"a2\":\"0x%02X\"}", - seqs[i], cmds[i], nargs[i], a0[i], a1[i], a2[i]); + "\"a0\":\"0x%02X\",\"a1\":\"0x%02X\",\"a2\":\"0x%02X\"," + "\"pc\":\"0x%08X\"}", + seqs[i], cmds[i], nargs[i], a0[i], a1[i], a2[i], pcs[i]); } send_fmt("]}\n"); - free(seqs); free(cmds); free(nargs); free(a0); free(a1); free(a2); + free(seqs); free(pcs); free(cmds); free(nargs); free(a0); free(a1); free(a2); } static void h_cdrom_cmd_reset(int id, const char *json) { diff --git a/runtime/src/beetle_libretro.cpp b/runtime/src/beetle_libretro.cpp index 4c9a828b..dcdae897 100644 --- a/runtime/src/beetle_libretro.cpp +++ b/runtime/src/beetle_libretro.cpp @@ -59,15 +59,16 @@ static void sio_trace_callback(uint8_t tx, uint8_t rx, uint16_t ctrl) { /* ---- CD command trace (oracle-diff for the Kula World CD-init wedge) ---- */ #define BEETLE_CDCMD_TRACE_CAP 8192 struct BeetleCdcmdEntry { - uint32_t seq; uint8_t cmd, nargs, a0, a1, a2; + uint32_t seq; uint32_t pc; uint8_t cmd, nargs, a0, a1, a2; }; static BeetleCdcmdEntry s_cdcmd_trace[BEETLE_CDCMD_TRACE_CAP]; static int s_cdcmd_idx = 0; static uint32_t s_cdcmd_seq = 0; static void cdcmd_trace_callback(uint8_t cmd, uint8_t nargs, - uint8_t a0, uint8_t a1, uint8_t a2) { + uint8_t a0, uint8_t a1, uint8_t a2, + uint32_t pc) { BeetleCdcmdEntry *e = &s_cdcmd_trace[s_cdcmd_idx]; - e->seq = s_cdcmd_seq++; e->cmd = cmd; e->nargs = nargs; + e->seq = s_cdcmd_seq++; e->pc = pc; e->cmd = cmd; e->nargs = nargs; e->a0 = a0; e->a1 = a1; e->a2 = a2; s_cdcmd_idx = (s_cdcmd_idx + 1) % BEETLE_CDCMD_TRACE_CAP; } @@ -574,6 +575,7 @@ extern "C" void beetle_reset_sio_trace(void) { extern "C" uint32_t beetle_get_cdcmd_trace(uint32_t *out_seq, uint8_t *out_cmd, uint8_t *out_nargs, uint8_t *out_a0, uint8_t *out_a1, uint8_t *out_a2, + uint32_t *out_pc, int max_count) { int avail = (int)(s_cdcmd_seq < (uint32_t)BEETLE_CDCMD_TRACE_CAP @@ -588,6 +590,7 @@ extern "C" uint32_t beetle_get_cdcmd_trace(uint32_t *out_seq, uint8_t *out_cmd, out_a0[i] = e->a0; out_a1[i] = e->a1; out_a2[i] = e->a2; + out_pc[i] = e->pc; } return (uint32_t)count; } From 536ad0f88642438f76e1000b94467f6670bd5089 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 20:48:04 +0000 Subject: [PATCH 13/19] debug: PSX_FNTRACE_ALL boot trace; root mechanism of Kula bug 3 found Adds PSX_FNTRACE_ALL=1 (records every dispatch from power-on) and documents the full mechanistic chain of the wedge (docs/kula-world-findings.md round 5): The frame-890 ReadTOC that breaks the game's CD reads is gated by kernel flag [0xA000DFFC]: the CD-open function 0xBFC0D570 does 'beqz [0xDFFC], skip; jal ReadTOC'. On ours [0xDFFC]=1 -> ReadTOC -> wedge; on the oracle it stays 0 -> reads continue. The flag is set to 1 by func_1FC1DF50 (a CD control routine) called from shell code at ra=0x80036024. The shells run the same verbatim bytes but diverge early (ours 0x35000-0x39000 issuing Test/ReadTOC, oracle 0x30D00-0x33200 issuing Init/GetTN), so a branch input differs. Traced via self-stop trap + fntrace-all + gdb watchpoint on [0xDFFC] + capstone. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/beetle_cdcmd_trace_hook.patch | 16 +++++++++++++ docs/kula-world-findings.md | 37 ++++++++++++++++++++++++++++++ runtime/src/fntrace.c | 7 ++++++ 3 files changed, 60 insertions(+) diff --git a/docs/beetle_cdcmd_trace_hook.patch b/docs/beetle_cdcmd_trace_hook.patch index 75087102..58f1da54 100644 --- a/docs/beetle_cdcmd_trace_hook.patch +++ b/docs/beetle_cdcmd_trace_hook.patch @@ -1,3 +1,19 @@ +diff --git a/libretro.cpp b/libretro.cpp +index d2e82bca..e9c867c8 100644 +--- a/libretro.cpp ++++ b/libretro.cpp +@@ -508,6 +508,11 @@ PS_SPU *PSX_SPU = NULL; + PS_CDC *PSX_CDC = NULL; + FrontIO *PSX_FIO = NULL; + ++/* PSXRecomp oracle hooks: NULL when no listener attached. */ ++psxrecomp_wtrace_cb_t g_psxrecomp_wtrace_cb = NULL; ++psxrecomp_fntrace_cb_t g_psxrecomp_fntrace_cb = NULL; ++psxrecomp_cdcmd_cb_t g_psxrecomp_cdcmd_cb = NULL; ++ + MultiAccessSizeMem<512 * 1024, uint32, false> *BIOSROM = NULL; + MultiAccessSizeMem<65536, uint32, false> *PIOMem = NULL; + MultiAccessSizeMem<2048 * 1024, uint32, false> *MainRAM = NULL; diff --git a/mednafen/psx/cdc.cpp b/mednafen/psx/cdc.cpp index 1daaa5b7..a6b31b66 100644 --- a/mednafen/psx/cdc.cpp diff --git a/docs/kula-world-findings.md b/docs/kula-world-findings.md index eb16228c..b39bb649 100644 --- a/docs/kula-world-findings.md +++ b/docs/kula-world-findings.md @@ -192,3 +192,40 @@ diff the first divergent command's call site. Then disassemble that site's branch (capstone is installed) and inspect its inputs on both sides. All tooling for this exists after this session: self-stop trap, command-history ring parse, oracle cdcmd dump, oracle wtrace/fntrace. + + +### Round 5 — ROOT MECHANISM FOUND: kernel flag [0xDFFC] drives the frame-890 ReadTOC + +New tool: PSX_FNTRACE_ALL=1 records every dispatch from power-on (fntrace.c), +so the ring holds the earliest boot execution for offline diffs. + +Full mechanistic chain of the wedge, traced with the self-stop trap + +fntrace-all + a gdb watchpoint + capstone disassembly of the ROM: + +1. The frame-890 ReadTOC is issued by the kernel CD-open function at + 0xBFC0D570 (called from the boot EXE-load path at 0xBFC06C78 / 0xBFC06E98, + a0=name ptr, a1=1). Its body: + lw $t7, -0x2004($t6) ; t7 = [0xA000DFFC] + beqz $t7, skip_readtoc ; flag==0 -> SKIP ReadTOC + jal 0xBFC0D72C ; flag!=0 -> ReadTOC (0x1E) then GetID +2. Kernel flag [0xDFFC] (physical 0xDFFC, just below the kernel heap at + 0xE000) is the discriminator: + ours : [0xDFFC] = 1 at frame 890 -> ReadTOC -> wedge + oracle : [0xDFFC] = 0 at the decision -> skip -> reads continue + Confirmed: at frame 539 (first CD cmd) [0xDFFC]==0 on ours; it flips to 1 + at frame 541. +3. The setter is func_1FC1DF50 (ROM 0xBFC1DF50), called from SHELL code + (ra=0x80036024). Its store `sw $t6,-0x2004($t7)` with $t6=1 writes + [0xDFFC]=1 on the a2==7 path; a sibling path writes 0 (0xBFC1DF5C). +4. The shells diverge: our shell runs functions at RAM 0x35000-0x39000 + (reaching the flag-setter at 0x36024, issuing Test[0x20]/ReadTOC), while + the oracle's shell runs 0x30D00-0x33200 (issuing Init/GetTN) and never + calls the flag-setter. Same verbatim shell bytes (RAM 0x30D00 == ROM + 0x18D00 confirmed) -> a BRANCH divergence, driven by an input, not code. + +So bug 3's root is: our shell takes a different early branch, calls the CD +control func that sets [0xDFFC]=1, and the boot's CD-open then does an extra +ReadTOC that breaks the game's CD reads. The oracle's shell never sets the +flag. REMAINING: the single shell branch (in 0x30000-0x35DC8) that sends our +shell down the 0x36000 path vs the oracle's 0x30000 path, and the hardware/ +memory input it reads. That input is the true first divergence. diff --git a/runtime/src/fntrace.c b/runtime/src/fntrace.c index 62780754..087cc8e1 100644 --- a/runtime/src/fntrace.c +++ b/runtime/src/fntrace.c @@ -33,6 +33,13 @@ void fntrace_set_game_range(uint32_t lo, uint32_t hi) { int fntrace_is_game_started(void) { return s_game_started; } static inline int armed_match(uint32_t target) { + /* PSX_FNTRACE_ALL=1 records every dispatch from power-on — the ring + * then holds the earliest boot execution (before any TCP client can + * arm it) for offline first-divergence diffs. Checked once. */ + static int boot_all = -1; + if (boot_all == -1) { const char *e = getenv("PSX_FNTRACE_ALL"); + boot_all = (e && *e && *e != '0') ? 1 : 0; } + if (boot_all) return 1; if (s_arm_record_all) return 1; /* Hot path: when nothing is armed, record nothing. Recording every * dispatch by default makes the ring fill in seconds and burns ~10% From a3f57ec5701b73c6b46fe243cbfea4a3b6b0eb76 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 23:10:31 +0000 Subject: [PATCH 14/19] cdrom: Test 0x20 reports SCPH-1001 CD version (0x94..), removing spurious boot ReadTOC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The shell CD-init (ROM 0x1DF50) sets kernel flag [0xA000DFFC]=1 when the CD controller version high byte (Test sub-cmd 0x20) is >= 0x95; the boot CD-open (0xBFC0D570) then issues a ReadTOC gated on that flag. We returned the PSone-era 0x97 0x01 0x10 0xC2 (copied from beetle, which hardcodes it) — wrong for the SCPH-1001 BIOS, whose 1994 sub-CPU reports 0x94 0x09 0x19 0xC0. With the correct value the flag stays clear, the spurious frame-890 ReadTOC is gone, and the boot command stream matches the oracle exactly. Found via self-stop trap + fntrace-all + gdb watchpoint on [0xDFFC] + capstone tracing the flag setter and its version check. Also adds a symmetric self-stop trap to psx-beetle's CD-command hook so the oracle can be frozen at the same boot point for state diffs. Honest status: this closes the boot-flow divergence but the game still wedges downstream in its OWN CD-init retry (GetStat/Init loop from game pc 0x63A14); that is a separate issue, documented in docs/kula-world-findings.md round 6. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/kula-world-findings.md | 25 +++++++++++++++++++++++++ runtime/src/beetle_libretro.cpp | 14 ++++++++++++++ runtime/src/cdrom.c | 17 +++++++++++++---- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/docs/kula-world-findings.md b/docs/kula-world-findings.md index b39bb649..aa1e04a9 100644 --- a/docs/kula-world-findings.md +++ b/docs/kula-world-findings.md @@ -229,3 +229,28 @@ ReadTOC that breaks the game's CD reads. The oracle's shell never sets the flag. REMAINING: the single shell branch (in 0x30000-0x35DC8) that sends our shell down the 0x36000 path vs the oracle's 0x30000 path, and the hardware/ memory input it reads. That input is the true first divergence. + + +### Round 6 — version fix removes the spurious ReadTOC (boot now matches oracle) + +func_1FC1DF50 (the shell CD-init) sets [0xDFFC]=1 when the CD controller +version byte (Test 0x20, response[0]) is >= 0x95. Our cdrom.c returned the +PSone-era 0x97 0x01 0x10 0xC2 (copied from beetle, which hardcodes it for all +BIOSes) — wrong for the SCPH-1001 BIOS, whose real 1994 sub-CPU reports +0x94 0x09 0x19 0xC0 (high byte 0x94 < 0x95). Fixed cdrom.c Test 0x20 to the +SCPH-1001 value. + +RESULT: [0xDFFC] no longer becomes 1 (reads 0x6458, a pointer, like the +oracle's 0x3660); the frame-890 ReadTOC is GONE; the boot command stream now +matches the oracle's (Setloc->SeekL->Setmode->ReadN->Pause x8, no ReadTOC). +This is a genuine correctness fix and closes the boot-flow divergence. + +BUT the game still wedges: from ~frame 1039 the GAME's own CD driver (pc +0x63A14, game code) loops GetStat/Init every ~150 frames and never proceeds +to SeekL/ReadN. So the frame-890 ReadTOC was NOT the wedge cause (round 5's +conclusion was wrong) — it was a real but separate inaccuracy. The true wedge +is downstream, in the GAME's CD-init retry, and persists with the boot now +oracle-matched. funcs still cycle (0xf40/0x2dbc) and frames advance, so it is +a spin-wait: the game polls a condition its CD-init never satisfies. NEXT: +diff the game-phase CD command/response sequence (pc 0x63A14) against the +oracle's game, which does the same GetStat/Init but then proceeds to read. diff --git a/runtime/src/beetle_libretro.cpp b/runtime/src/beetle_libretro.cpp index dcdae897..23842b7d 100644 --- a/runtime/src/beetle_libretro.cpp +++ b/runtime/src/beetle_libretro.cpp @@ -15,6 +15,7 @@ #include <cstdlib> #include <cstring> #include <cstdarg> +#include <csignal> #include "libretro.h" #include "mednafen/psx/psx.h" @@ -67,6 +68,19 @@ static uint32_t s_cdcmd_seq = 0; static void cdcmd_trace_callback(uint8_t cmd, uint8_t nargs, uint8_t a0, uint8_t a1, uint8_t a2, uint32_t pc) { + /* Symmetric self-stop trap (mirror of the runtime's PSX_CD_TRAP_CMD): + * SIGSTOP on the Nth matching CD command so a debugger can freeze the + * oracle at the exact boot point and diff its state against ours. */ + { + static long trap_cmd = -2, trap_nth = 1, hits = 0; + if (trap_cmd == -2) { + const char *e2 = getenv("PSX_CD_TRAP_CMD"); + trap_cmd = (e2 && *e2) ? strtol(e2, NULL, 0) : -1; + const char *e3 = getenv("PSX_CD_TRAP_NTH"); + if (e3 && *e3) trap_nth = strtol(e3, NULL, 0); + } + if ((long)cmd == trap_cmd && ++hits == trap_nth) raise(SIGSTOP); + } BeetleCdcmdEntry *e = &s_cdcmd_trace[s_cdcmd_idx]; e->seq = s_cdcmd_seq++; e->pc = pc; e->cmd = cmd; e->nargs = nargs; e->a0 = a0; e->a1 = a1; e->a2 = a2; diff --git a/runtime/src/cdrom.c b/runtime/src/cdrom.c index 7b965059..b6cf6227 100644 --- a/runtime/src/cdrom.c +++ b/runtime/src/cdrom.c @@ -1213,10 +1213,19 @@ static void exec_command(uint8_t cmd) { case 0x19: /* Test */ if (param_count >= 1 && param_fifo[0] == 0x20) { - response_push(0x97); - response_push(0x01); - response_push(0x10); - response_push(0xC2); + /* CD controller firmware version (BCD date + region). This BIOS is + * SCPH-1001, whose sub-CPU reports the 1994 controller: 94/09/19 C0. + * The value must be < 0x95 in the high byte — the shell's CD-init + * (func at ROM 0x1DF50) sets kernel flag [0xA000DFFC]=1 when the + * version byte >= 0x95, which later makes the boot CD-open + * (0xBFC0D570) issue a spurious ReadTOC that wedges the game's + * streaming reads. Beetle hardcodes the PSone-era 0x97 regardless of + * BIOS, which is wrong for SCPH-1001; matching the real 1994 + * controller keeps the flag clear (Kula World demo-load wedge). */ + response_push(0x94); + response_push(0x09); + response_push(0x19); + response_push(0xC0); set_irq(CDIRQ_ACK); } else { response_push(stat_reg); From 7c8298b12e020a7ea5eb2874e053b735b0d5f369 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Thu, 2 Jul 2026 23:13:55 +0000 Subject: [PATCH 15/19] =?UTF-8?q?docs:=20round=207=20=E2=80=94=20remaining?= =?UTF-8?q?=20Kula=20wedge=20is=20unserviced=20CD=20IRQ=20(libcd=20CdSync?= =?UTF-8?q?=20never=20completes)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With the boot fixed, live state during the game's retry loop shows the CDROM interrupt is raised (i_stat bit2) AND enabled (i_mask bit2) and the CPU takes exceptions (VBLANK cleared each frame), yet the CDROM bit is never cleared and the response FIFO never drained (irq_flag=0x03, response_read=0). The game's libcd CD interrupt handler in the BIOS IntRP chain is not servicing the CD IRQ, so CdSync never completes. Distinct from the CD-response-value bugs fixed today; a BIOS-IRQ-chain / libcd-handler matter. Documents the next step and the full session tally in docs/kula-world-findings.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/kula-world-findings.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/kula-world-findings.md b/docs/kula-world-findings.md index aa1e04a9..b3bbc08d 100644 --- a/docs/kula-world-findings.md +++ b/docs/kula-world-findings.md @@ -254,3 +254,39 @@ oracle-matched. funcs still cycle (0xf40/0x2dbc) and frames advance, so it is a spin-wait: the game polls a condition its CD-init never satisfies. NEXT: diff the game-phase CD command/response sequence (pc 0x63A14) against the oracle's game, which does the same GetStat/Init but then proceeds to read. + + +### Round 7 — remaining wedge localized: CD IRQ pending+enabled but never serviced + +With the boot fixed, the visible wedge is the game's libcd CD-init retry. +Live state during the loop (gdb): + i_stat = 0x05 (bit0 VBLANK + bit2 CDROM) <- CD IRQ IS raised to the CPU + i_mask = 0x0d (bits 0,2,3 enabled) <- CD IRQ IS enabled + cdrom: irq_flag=0x03 (INT3 unacked), response_count=1, response_read=0 + funcs cycle 0xf40 (ReturnFromException) + 0x2dbc -> CPU DOES take exceptions + +So a CD command completed (INT3 + response waiting), the CDROM interrupt is +pending AND unmasked, and the CPU is taking exceptions (VBLANK bit0 gets +cleared each frame) -- yet the CDROM bit (bit2) is NEVER cleared and the +response FIFO is never drained. The game's/libcd's CD interrupt handler in the +BIOS IRQ chain (IntRP) is not servicing the CD IRQ. libcd's CdSync therefore +never completes -> the GetStat/Init retry loop -> black screen. + +This is a distinct, deeper issue from everything fixed today (it is a BIOS- +IRQ-chain / libcd-handler / possibly dynamic-handler-install matter, CLAUDE.md +rule 18 territory), not a CD-response-value bug. NEXT: inspect the BIOS IntRP +handler chain and whether libcd's CD handler is installed + run; check our CD +IRQ presentation vs the BIOS root handler's expectations (present_cdrom_irq +generation latch, and whether the handler that should drain the response FIFO +and ack is being dispatched at all). + +## Session tally (fixes shipped) +- Bug 1 RAM mirror (memory.c) — FIXED +- Bug 2 GetID region (cdrom.c + main.cpp) — FIXED +- Bug 3a CD status bits ADPBUSY/BUSYSTS (cdrom.c) — FIXED (correctness) +- Bug 3b CD controller version 0x94.. for SCPH-1001 (cdrom.c) — FIXED; removes + the spurious boot ReadTOC, boot command stream now matches the oracle +- Bug 3c (OPEN) libcd CD-IRQ not serviced -> game CD-init never completes +Tooling built: null-dispatch fntrace freeze, PSX_CD_TRAP_CMD self-stop trap +(runtime + oracle), PSX_FNTRACE_ALL boot trace, oracle cdrom_cmd_dump hook, +Linux port of runtime+oracle, beetle-linux build docs + patches. From 590c236933b7a29ec7b1856bfc5025ce10f10433 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Fri, 3 Jul 2026 06:02:35 +0000 Subject: [PATCH 16/19] =?UTF-8?q?dirty=5Fram=5Finterp:=20poll=20interrupts?= =?UTF-8?q?=20at=20interpreter=20entry=20=E2=80=94=20fixes=20Kula=20World?= =?UTF-8?q?=20wedge=20(title=20screen=20renders)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ROOT CAUSE of the Kula World black-screen wedge: a guest wait loop (libcd's CdSync spin) that lives entirely in dirty RAM re-enters the dirty-RAM interpreter once per short (~7-insn) block. The interpreter's only interrupt poll was gated by the PER-INVOCATION (insns_executed & 0xFFF) counter, which short blocks never reach — and when the loop exits to dispatch each iteration that path isn't reached at all. So the interpreter ran millions of instructions with psx_check_interrupts never called, while SR (IEc+IM2) and Cause (IP2) fully satisfied the MIPS interrupt-take condition and i_stat had CDROM+VBLANK pending. The CD IRQ that sets libcd's wait-flag was never serviced; the loop spun ~14s per cycle until a rare timeout re-dispatched. Fix: poll interrupts at the interpreter's per-invocation entry, gated by a global invocation counter (every 64 entries), cpu->pc set for a coherent resume — the interpreter analogue of a static block-leader poll. RESULT: Kula World now boots to its title screen and menu. Diagnosed with the self-stop trap + gdb sampling of SR/Cause/i_stat + the interrupt gate globals (in_exception, total_checks) + g_dirty_ram_insns_run, which isolated 'CPU spinning in the interpreter without polling interrupts'. General fix: any dirty-RAM spin-loop now yields to interrupts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/kula-world-findings.md | 43 ++++++++++++++++++++++++++++++++-- runtime/src/dirty_ram_interp.c | 17 ++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/docs/kula-world-findings.md b/docs/kula-world-findings.md index b3bbc08d..a56199c7 100644 --- a/docs/kula-world-findings.md +++ b/docs/kula-world-findings.md @@ -1,7 +1,8 @@ # Kula World (SCES-01000) — bring-up findings -Status as of this session: boots on the Linux runtime, past the region -wedge, stalls before the demo level renders. Two bugs found; one fixed. +Status: SOLVED — Kula World boots to its title screen + menu (Arcade / Time +Trial / Load Game). Five bugs found and fixed this session; the final one was +the wedge. ## Setup @@ -290,3 +291,41 @@ and ack is being dispatched at all). Tooling built: null-dispatch fntrace freeze, PSX_CD_TRAP_CMD self-stop trap (runtime + oracle), PSX_FNTRACE_ALL boot trace, oracle cdrom_cmd_dump hook, Linux port of runtime+oracle, beetle-linux build docs + patches. + + +### Round 8 — ROOT CAUSE FOUND AND FIXED: dirty-RAM interpreter interrupt latency + +The wedge: at ~frame 1039 the game froze in bursts of ~14s, then advanced. +During each freeze: + SR = 0x40000401 (IEc=1, IM2=1) -> interrupts enabled + hw line unmasked + Cause = 0x400 (IP2=1) -> hardware interrupt pending + i_stat & i_mask = 0x5 -> VBLANK + CDROM pending and enabled + in_exception=0, cooldown irrelevant + total_checks FROZEN -> psx_check_interrupts is NOT being called + g_dirty_ram_insns_run advancing ~15M/s, blocks_run ~2M/s + +So the MIPS interrupt-take condition (IEc && IM2 && IP2) was fully satisfied, +yet no interrupt was taken because psx_check_interrupts was never called. The +CPU was in the DIRTY-RAM INTERPRETER running libcd's CdSync spin-wait (a guest +loop that lives entirely in dirty RAM), re-entering the interpreter once per +short (~7-insn) block. The interpreter's only interrupt poll was on the +local-dirty-flow path gated by the PER-INVOCATION `(insns_executed & 0xFFF)` +counter, which for short blocks never reaches 0x1000 and, when the loop exits +to dispatch each iteration, is never reached at all. So the spin ran millions +of instructions with no interrupt poll; the CD IRQ that sets libcd's wait-flag +was never serviced; the loop only broke when a rare timeout re-dispatched. + +FIX (runtime/src/dirty_ram_interp.c): poll interrupts at the interpreter's +per-invocation entry, gated by a GLOBAL invocation counter (every 64 entries), +with cpu->pc set so the resume is coherent. This is the interpreter analogue +of a static block-leader poll. psx_check_interrupts runs the handler and +returns with registers restored, so the loop safely continues and immediately +sees its wait-flag set. + +RESULT: Kula World boots to the title screen and menu (Arcade / Time Trial / +Load Game / Back). Pixels on screen — bug 3 SOLVED. + +Why this only bit Kula and not Tomba/MMX6: Kula uses the BIOS/libcd CD path +whose CdSync spin-waits in a dirty-RAM loop; the working titles use their own +CD drivers / loop shapes that hit the interrupt poll differently. This fix is +general — any dirty-RAM guest spin-loop now yields to interrupts. diff --git a/runtime/src/dirty_ram_interp.c b/runtime/src/dirty_ram_interp.c index 4a18ed12..b6148142 100644 --- a/runtime/src/dirty_ram_interp.c +++ b/runtime/src/dirty_ram_interp.c @@ -1456,6 +1456,23 @@ static int dirty_ram_dispatch_inner(CPUState* cpu, uint32_t addr, uint32_t stop_ enum { MAX_INSNS_PER_DISPATCH = 1000000 }; uint32_t pc = addr; int insns_executed = 0; + /* Async-interrupt latency fix. A guest wait loop that lives ENTIRELY in + * dirty RAM (e.g. libcd's CdSync spin, as in Kula World) re-enters this + * interpreter once per short (~7-insn) block and exits before the + * per-invocation `(insns_executed & 0xFFF)` gate below can fire — so a + * pending, IEc+IM2-enabled interrupt is never taken and the loop spins for + * seconds while the CD IRQ that would set its wait-flag is never serviced. + * Poll on a GLOBAL invocation counter so short-block loops still yield to + * interrupts (this is the interpreter analogue of a block-leader poll in + * static code). psx_check_interrupts runs the handler and returns with + * registers restored, so continuing the loop afterward is safe. */ + { + static uint32_t s_interp_entry_poll = 0; + if ((++s_interp_entry_poll & 0x3Fu) == 0) { + cpu->pc = pc; + psx_check_interrupts(cpu); + } + } for (int i = 0; i < MAX_INSNS_PER_DISPATCH; i++) { uint32_t next_pc = 0; uint32_t insn = fetch_word(pc & 0x1FFFFFFFu); From a6ee29a4ea8af36cdb221eaabcf9d48178d0bc35 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Fri, 3 Jul 2026 06:07:31 +0000 Subject: [PATCH 17/19] =?UTF-8?q?readme:=20Kula=20World=20bring-up=20on=20?= =?UTF-8?q?Linux=20=E2=80=94=20title=20screen=20+=20the=205=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds this fork's Kula World (SCES-01000) end-to-end target to the README with a title-screen screenshot and a summary of the five runtime bugs fixed during bring-up (four of them game-agnostic framework improvements): the dirty-RAM interpreter interrupt-latency fix, the main-RAM mirror, GetID region derivation, CD status bits, and the SCPH-1001 CD controller version. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- README.md | 26 +++++++++++++++++++++++++ docs/assets/kula-world-titlescreen.png | Bin 0 -> 246099 bytes 2 files changed, 26 insertions(+) create mode 100644 docs/assets/kula-world-titlescreen.png diff --git a/README.md b/README.md index bf206dfe..ce0cefeb 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,32 @@ targets are: - [TombaRecomp](https://github.com/mstan/TombaRecomp) — *Tomba!* - [MegaManX6Recomp](https://github.com/mstan/MegaManX6Recomp) — *Mega Man X6* +### This fork — *Kula World* (SCES-01000) on Linux + +This fork brings up *Kula World* (a.k.a. *Roll Away*) as a new end-to-end +target and ports the framework (recompiler + runtime + Beetle-PSX oracle) to +Linux. It boots to the title screen and menu, recompiled + interpreted, no +HLE: + +<p align="center"> + <img src="docs/assets/kula-world-titlescreen.png" alt="Kula World title screen running on PSXRecomp" width="480"> +</p> + +The bring-up surfaced and fixed five runtime bugs — most of them +game-agnostic framework improvements (see `docs/kula-world-findings.md`): + +1. **Dirty-RAM interpreter interrupt latency** — a guest spin-wait living in + dirty RAM (libcd `CdSync`) never polled interrupts, so a pending, enabled + CD IRQ was never taken and the game wedged. Now the interpreter polls at + its per-invocation entry on a global counter — general to any dirty-RAM + spin-loop. +2. **Main-RAM 4× mirror** not modeled (crt0 parks `$sp` at `0x807FFFF8`). +3. **GetID region** hard-coded to `SCEI`; now derived from the disc serial + (Tomba/MMX6 get correct `SCEA` too). +4. **CD status bits** ADPBUSY/BUSYSTS corrected against the oracle. +5. **CD controller version** returned the PSone `0x97`; the SCPH-1001 sub-CPU + reports `0x94 09 19 C0`, which the shell's CD-init requires. + ## Philosophy — toward 100% static recompilation The goal is simple and absolute: **a PS1 game should run as native code, not be diff --git a/docs/assets/kula-world-titlescreen.png b/docs/assets/kula-world-titlescreen.png new file mode 100644 index 0000000000000000000000000000000000000000..7a42726b1d4dd662374daffef3993bf14fa5386e GIT binary patch literal 246099 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 literal 0 HcmV?d00001 From b8673b0ad0b6ab620cf83ffa6eb31e1d6edc4f39 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Fri, 3 Jul 2026 07:03:11 +0000 Subject: [PATCH 18/19] docs: Windows 11 build/run handoff for Kula World Step-by-step instructions for an AI agent to reproduce the working Kula World recomp on Windows: prerequisites (MSYS2 mingw64 + SDL2), clone the branch, user-supplied BIOS/disc, extract the boot EXE, build the recompiler, generate BIOS + game C, build the kula-runtime target, run, controls, and an honest verified/unverified status list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BdjxoRB1f9VQsNzZayCgGS --- docs/WINDOWS_BUILD_KULA.md | 238 +++++++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 docs/WINDOWS_BUILD_KULA.md diff --git a/docs/WINDOWS_BUILD_KULA.md b/docs/WINDOWS_BUILD_KULA.md new file mode 100644 index 00000000..f34efaf0 --- /dev/null +++ b/docs/WINDOWS_BUILD_KULA.md @@ -0,0 +1,238 @@ +# Building & running Kula World (PSXRecomp) on Windows 11 — AI handoff + +**Audience:** an AI coding agent (e.g. Claude Code) running on the user's +Windows 11 machine. Follow this top to bottom. The goal: produce a native +Windows build of Kula World that boots to its menu and plays in 3D, exactly +as it already does on Linux. + +--- + +## 0. Context — what already works and what you are doing + +This repo is a fork of Matthew Stanley's **PSXRecomp v4**: a *static +recompiler* that translates the PS1 BIOS (`SCPH1001.BIN`) and a game's MIPS +executable into native **C**, which links into an SDL2 runtime that simulates +the PS1 hardware (CPU state, GPU rasterizer, GTE 3D coprocessor, SPU, CD-ROM). +There is **no interpreter for static code, no HLE, no stubs** — read +`CLAUDE.md` before touching anything; those rules are strict and load-bearing. + +**What was done in a prior Linux session (already on this branch):** + +1. Ported the runtime's platform layer from Windows-only to cross-platform + (sockets, `dlopen`, atomics, misc WIN32) — all behind `#ifdef` guards, so + **Windows still builds unchanged**. +2. Taught the recompiler to accept Kula World's KUSEG-addressed EXE header. +3. Fixed five real bugs that were wedging Kula at boot/first-level-load: + RAM-mirror folding, per-disc GetID region, CD status bits, the SCPH-1001 + CD-controller version, and an interrupt-latency bug in the dirty-RAM + interpreter. + +Result on Linux: BIOS → title → menu → **select Arcade → 3D level plays, ball +rolls under control.** Your job is to reproduce that on Windows. None of the +above needs redoing — it is all committed. You are just **building** here. + +**Branch to use:** `claude/repo-commit-history-1oayou` +(it contains the Linux port + the five fixes + the Kula config + the +`kula-runtime` build target). + +--- + +## 1. Files the USER must supply (copyrighted — NOT in the repo) + +These are `.gitignore`d and will not be in a fresh clone. Ask the user to +place them exactly here (paths are relative to the repo root): + +| File | Where it goes | What it is | +|---|---|---| +| `SCPH1001.BIN` | `bios/SCPH1001.BIN` | The PS1 BIOS dump (512 KiB). Must be **SCPH1001** (NTSC-U). | +| `Kula World (Europe).bin` | `games/kula/Kula World (Europe).bin` | The user's own disc dump (raw 2352-byte/sector image, ~255 MB). | +| `Kula World (Europe).cue` | `games/kula/Kula World (Europe).cue` | The cue sheet pointing at the `.bin`. | + +Do **not** download these. The user has their own legal dump — they provide +them. If they are missing, stop and ask the user for them; do not proceed. + +You will additionally **extract one file from the disc** in step 4. + +--- + +## 2. Prerequisites — MSYS2 / mingw-w64 toolchain + +PSXRecomp builds with the **MSYS2 mingw64** GCC toolchain (not MSVC — the +generated C and the runtime assume GCC). If MSYS2 is not installed, install it +from https://www.msys2.org/, then open the **"MSYS2 MinGW 64-bit"** shell and: + +```bash +pacman -Syu # update; may ask you to reopen the shell, then run again +pacman -S --needed \ + mingw-w64-x86_64-gcc \ + mingw-w64-x86_64-cmake \ + mingw-w64-x86_64-ninja \ + mingw-w64-x86_64-SDL2 \ + mingw-w64-x86_64-pkgconf \ + git +``` + +Always work from the **MinGW 64-bit** shell so the toolchain is on PATH. If in +doubt, prefix commands with `PATH=/c/msys64/mingw64/bin:$PATH`. + +--- + +## 3. Clone the fork and check out the branch + +```bash +git clone https://github.com/chrisking1981/psxrecomp_kula_world.git +cd psxrecomp_kula_world +git checkout claude/repo-commit-history-1oayou +``` + +**Submodules are NOT needed.** `lib/RmlUi` and `lib/freetype` are only used by +the optional launcher GUI, which we disable. The recompiler's own deps +(`fmt`, `rabbitizer`, `toml11`, `ELFIO`) and the runtime's `sljit` are vendored +in-tree and already present after clone. Do not run `git submodule update`. + +Now drop in the three user-supplied files from step 1. + +--- + +## 4. Extract the game's boot executable from the disc + +The recompiler translates the game's **EXE**, read from a file. `game.toml` +expects it at `games/kula/SCES_010.00`. It is the boot binary named in the +disc's `SYSTEM.CNF` (`BOOT = cdrom:\SCES_010.00;1`), living at the disc root. + +Extract it to `games/kula/SCES_010.00` (should be **604160 bytes**). Options: + +- **Recommended:** `dumpsxiso` from **mkpsxiso** + (https://github.com/Lameguy64/mkpsxiso). Run it on the `.cue`/`.bin`, then + copy the extracted `SCES_010.00` into `games/kula/`. +- **Or** any tool that reads an ISO9660 filesystem from a raw Mode-2/2352 + PS1 image (the `.bin` is 2352 bytes/sector, not a plain 2048 ISO). +- **Or** write a small extractor: parse the ISO9660 primary volume descriptor + (sector 16), walk the root directory to find `SCES_010.00`, and copy its + extent — remembering each 2352-byte sector carries a 2048-byte user payload + at a 24-byte offset (Mode 2 Form 1). + +Verify: `SCES_010.00` starts with the ASCII magic `PS-X EXE`. + +--- + +## 5. Build the recompiler + +The recompiler is a standalone CMake project under `recompiler/`: + +```bash +cmake -S recompiler -B recompiler/build -G Ninja -DCMAKE_BUILD_TYPE=Release +cmake --build recompiler/build -j8 +``` + +This produces `recompiler/build/psxrecomp-bios.exe` and +`recompiler/build/psxrecomp-game.exe`. + +--- + +## 6. Generate the C (BIOS once, game once) + +Both outputs are `.gitignore`d, so you must generate them on this machine. + +```bash +# 6a. BIOS -> generated/SCPH1001_full.c + SCPH1001_dispatch.c +./recompiler/build/psxrecomp-bios.exe bios/SCPH1001.BIN generated + +# 6b. Game -> games/kula/generated/SCES_010.00_full.c + _dispatch.c +# (reads all paths from games/kula/game.toml, incl. out_dir) +./recompiler/build/psxrecomp-game.exe --config games/kula/game.toml +``` + +Sanity check afterwards: + +```bash +ls -la generated/SCPH1001_full.c games/kula/generated/SCES_010.00_full.c +``` + +Both must exist and be multi-MB. `games/kula/generated/SCES_010.00_full.c` is +what makes the `kula-runtime` target appear in the runtime build. + +--- + +## 7. Build the runtime (produces the playable binary) + +```bash +cmake -S runtime -B runtime/build -G Ninja -DCMAKE_BUILD_TYPE=Release \ + -DPSX_LAUNCHER=OFF -DPSX_ENABLE_VULKAN=OFF -DPSX_DEBUG_TOOLS=OFF +cmake --build runtime/build --target kula-runtime -j8 +``` + +Output: `runtime/build/kula-runtime.exe`. The recompiled BIOS **code**, the +recompiled game **code**, and the whole runtime are compiled *into* this one +binary. (`PSX_DEBUG_TOOLS=OFF` gives a lean play build; turn it `ON` only if +you later want the TCP debug server on port 4370.) + +--- + +## 8. Run and play + +Run **from the repo root** (so the relative BIOS/disc paths resolve): + +```bash +./runtime/build/kula-runtime.exe +``` + +You should see `psxrecomp: disc region PAL (serial SCES-01000)` in the console, +then a window: Sony logo boot → **KULA WORLD** title → menu. If SDL2.dll is not +found, copy `/c/msys64/mingw64/bin/SDL2.dll` next to `kula-runtime.exe` (or keep +the MinGW `bin` on PATH). + +**Keyboard controls** (from `pad_from_keyboard` in `runtime/src/main.cpp`): + +| Key | PS1 button | +|---|---| +| Arrow keys | D-pad (roll the ball / move cursor) | +| **X** | Cross — **confirm / select** | +| **S** | Circle — back/cancel | +| Z | Square | +| A | Triangle | +| Enter | Start | +| Right Shift | Select | +| Q / W | L1 / R1 | +| E / R | L2 / R2 | + +An SDL game controller also works — just plug it in. + +To reach gameplay: at the menu press **Down/Up** to highlight **Arcade**, then +**X** to start a level. Roll the ball with the arrow keys. + +--- + +## 9. Notes, gotchas, and honest status + +- **This is not one self-contained file.** The `.exe` has all the *code* baked + in, but at runtime it still needs, next to it / under the repo root: + `bios/SCPH1001.BIN`, the disc image (`games/kula/Kula World (Europe).cue` + + `.bin`), `games/kula/game.toml`, and `SDL2.dll`. It also creates + `card1.mcd` / `card2.mcd` for saves. Game assets (levels, textures, audio, + video) live on the disc image and are streamed through the simulated CD-ROM + — the recomp translates the *program*, not the *data*. +- **BIOS must be SCPH1001.** The CD-controller version fix (`94 09 19 C0`) is + specific to that BIOS revision. A different BIOS dump may misbehave. +- **Verified working:** boot → menu → navigation → select Arcade → 3D level → + ball control. **Not yet verified:** completing a level and all mechanics, + audio output, FMV/MDEC video, in-practice memory-card save/load. Treat those + as untested, not as known-good. If something breaks there, that is new work — + diagnose it per the `CLAUDE.md` rules (oracle-verify against Beetle PSX; no + printf, no stubs), don't paper over it. +- **If the recompiler or a build step fails**, fix the tool/root cause — do not + route around it (CLAUDE.md §15). +- Building `psx-beetle` (the Beetle PSX oracle) is **optional** and only needed + for cross-checking against real-hardware behavior, not for playing. Skip it + unless you are debugging a divergence. + +--- + +### One-shot summary for the agent + +> Clone the fork, check out `claude/repo-commit-history-1oayou`, install the +> MSYS2 mingw64 toolchain + SDL2, have the user drop in `SCPH1001.BIN` and their +> Kula `.bin`/`.cue`, extract `SCES_010.00` from the disc, build the recompiler, +> generate the BIOS C and game C, build the `kula-runtime` target with the +> launcher/vulkan/debug options off, then run `kula-runtime.exe` from the repo +> root and confirm the menu appears and Arcade launches a 3D level. From 6e711e0f2d929d84a0080ac19c17618794bb6ba3 Mon Sep 17 00:00:00 2001 From: ai-tdd-labs <aitddlabs@gmail.com> Date: Fri, 3 Jul 2026 09:41:37 +0200 Subject: [PATCH 19/19] macos: build & run Kula World natively on Apple Silicon The Windows->Linux POSIX port left the recompiler and runtime almost portable; two small platform gaps remained on macOS (AppleClang, arm64), both guarded so Windows/Linux are unaffected: - runtime/src/autocompile.c: add #include <stdlib.h> for getenv. glibc and windows.h leak that declaration transitively; the macOS SDK does not, so AppleClang errored on the implicit declaration. - recompiler/src/main_bios.cpp: the C-compiler probe used ">NUL" (Windows null device). On POSIX that misdirects the redirect and drops a stray "NUL" file in the cwd; now #ifdef'd to /dev/null. The ucontext fiber backend already carried the _XOPEN_SOURCE/_DARWIN_C_SOURCE guards it needs; SDL2 (Homebrew) selects the Metal backend automatically. Verified end to end on macOS 15.5 / Apple Silicon: BIOS -> KULA WORLD title -> menu -> 1 Player -> a 3D level that rolls under control. Adds docs/MACOS_BUILD_KULA.md and a macOS gameplay screenshot; README notes the port. Ignores the local dist/ .app bundle (recompiled-BIOS derivative). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --- .gitignore | 3 + README.md | 26 +++++ docs/MACOS_BUILD_KULA.md | 167 +++++++++++++++++++++++++++++++ docs/assets/kula-world-macos.png | Bin 0 -> 75083 bytes recompiler/src/main_bios.cpp | 10 +- runtime/src/autocompile.c | 1 + 6 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 docs/MACOS_BUILD_KULA.md create mode 100644 docs/assets/kula-world-macos.png diff --git a/.gitignore b/.gitignore index f77307f6..cd81a53b 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,6 @@ games/*/* # Per-game memcards created at runtime *.mcr !dummy.*.mcr + +# macOS .app bundle (contains recompiled BIOS-derived binary — not distributable) +/dist/ diff --git a/README.md b/README.md index ce0cefeb..e36b8d81 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,32 @@ game-agnostic framework improvements (see `docs/kula-world-findings.md`): 5. **CD controller version** returned the PSone `0x97`; the SCPH-1001 sub-CPU reports `0x94 09 19 C0`, which the shell's CD-init requires. +### Now also on macOS (Apple Silicon) + +Those **five runtime fixes** are what got *Kula World* actually *playing* — and +they are game-agnostic, so they benefit every target, not just this one. On top +of the earlier Windows→Linux POSIX port, bringing the same build up on **macOS +(Apple Silicon / arm64, AppleClang)** needed only **one** extra build fix plus a +small POSIX cleanup — the recompiler and runtime are otherwise portable C: + +1. `runtime/src/autocompile.c` — added `#include <stdlib.h>` for `getenv` + (glibc and `windows.h` leak that declaration; the macOS SDK does not). +2. `recompiler/src/main_bios.cpp` — the compiler-probe's `>NUL` (Windows null + device) is now `#ifdef`'d to `/dev/null` on POSIX (it was misdirecting the + redirect and dropping a stray `NUL` file). + +The ucontext fiber backend already had the `_XOPEN_SOURCE`/`_DARWIN_C_SOURCE` +guards it needs on macOS, and SDL2 (Homebrew) picks the **Metal** backend +automatically. Result: BIOS → title → menu → a 3D level that rolls under +control, running natively on Apple Silicon. Full macOS steps in +[`docs/MACOS_BUILD_KULA.md`](docs/MACOS_BUILD_KULA.md). + +<p align="center"> + <img src="docs/assets/kula-world-macos.png" alt="Kula World running natively on macOS (Apple Silicon)" width="480"> + <br> + <em>Kula World, statically recompiled, running natively on macOS (Apple Silicon).</em> +</p> + ## Philosophy — toward 100% static recompilation The goal is simple and absolute: **a PS1 game should run as native code, not be diff --git a/docs/MACOS_BUILD_KULA.md b/docs/MACOS_BUILD_KULA.md new file mode 100644 index 00000000..2d57178b --- /dev/null +++ b/docs/MACOS_BUILD_KULA.md @@ -0,0 +1,167 @@ +# Building & running Kula World (PSXRecomp) on macOS — AI/dev handoff + +**Audience:** a developer or AI coding agent on macOS (Apple Silicon or Intel). +Goal: a native macOS build of *Kula World* that boots to its menu and plays in +3D, exactly as it already does on Linux and Windows. + +This is the macOS counterpart to [`WINDOWS_BUILD_KULA.md`](WINDOWS_BUILD_KULA.md). +The pipeline (clone → user-supplied BIOS+disc → extract the boot EXE → build the +recompiler → generate BIOS C + game C → build `kula-runtime` → run) is identical; +only the toolchain and a couple of platform specifics differ. Read `CLAUDE.md` +first — the no-interpreter / no-HLE / no-stubs rules are load-bearing. + +Verified on: **macOS 15.5, Apple Silicon (arm64), AppleClang 17**. The static +path is portable C (an emulator, not a JIT), so Intel Macs should work too. + +--- + +## 1. Files the USER must supply (copyrighted — NOT in the repo) + +Same as the Windows doc. Place them relative to the repo root: + +| File | Where it goes | What it is | +|---|---|---| +| `SCPH1001.BIN` | `bios/SCPH1001.BIN` | PS1 BIOS dump, 512 KiB, **SCPH1001** (`md5 924e392ed05558ffdb115408c263dccf`). | +| `Kula World (Europe).bin` | `games/kula/Kula World (Europe).bin` | Your own disc dump (raw 2352-byte/sector, ~255 MB). | +| `Kula World (Europe).cue` | `games/kula/Kula World (Europe).cue` | The cue sheet pointing at the `.bin`. | + +Do **not** download these — the user provides their own legal dump. + +--- + +## 2. Toolchain (Homebrew instead of MSYS2) + +```bash +brew install sdl2 cmake ninja pkg-config +``` + +Verify SDL2 is visible to pkg-config (the runtime's CMake uses +`pkg_check_modules(SDL2)` on non-MSVC, which Homebrew's `sdl2.pc` satisfies): + +```bash +pkg-config --cflags --libs sdl2 +# -I/opt/homebrew/include -I/opt/homebrew/include/SDL2 ... -lSDL2 +``` + +If that prints nothing, add Homebrew's pkgconfig dir to `PKG_CONFIG_PATH` +(`export PKG_CONFIG_PATH="$(brew --prefix)/lib/pkgconfig"`). AppleClang builds +the very large generated C fine; `brew install gcc` is optional and not needed. + +--- + +## 3. Clone, check out the branch, drop in the files + +```bash +git clone https://github.com/chrisking1981/psxrecomp_kula_world.git +cd psxrecomp_kula_world +git checkout claude/repo-commit-history-1oayou +``` + +Submodules are not needed. Now place the three user-supplied files from §1. + +--- + +## 4. Extract the game's boot EXE from the disc + +`game.toml` expects `games/kula/SCES_010.00` (604160 bytes, ASCII magic +`PS-X EXE`). It is the `BOOT = cdrom:\SCES_010.00;1` binary at the disc root. +Use `dumpsxiso` (from mkpsxiso), or any tool that reads an ISO9660 filesystem +from a raw Mode-2/2352 PS1 image, or a tiny extractor that walks the ISO9660 +root directory and copies the extent (each 2352-byte sector carries 2048 bytes +of payload at a 24-byte offset — Mode 2 Form 1). LBA 24 on this disc. + +```bash +# sanity check +head -c 8 games/kula/SCES_010.00 # -> PS-X EXE +``` + +--- + +## 5. Build the recompiler + +```bash +cmake -S recompiler -B recompiler/build -G Ninja -DCMAKE_BUILD_TYPE=Release +cmake --build recompiler/build -j8 +``` + +Produces `recompiler/build/psxrecomp-bios` and `recompiler/build/psxrecomp-game`. + +--- + +## 6. Generate the C (BIOS once, game once) + +```bash +# 6a. Full BIOS -> generated/SCPH1001_full.c + SCPH1001_dispatch.c +# NOTE: use --emit-full with the phase-2 seeds. The bare positional form +# (psxrecomp-bios <bios> <out>) runs the Phase-1a boot-slice validator, which +# does NOT emit the full BIOS the runtime links against. +./recompiler/build/psxrecomp-bios bios/SCPH1001.BIN generated \ + --emit-full recompiler/seeds/phase2_ghidra_seeds.json + +# 6b. Game -> games/kula/generated/SCES_010.00_full.c + _dispatch.c +./recompiler/build/psxrecomp-game --config games/kula/game.toml +``` + +Sanity check — both must exist and be multi-MB: + +```bash +ls -la generated/SCPH1001_full.c games/kula/generated/SCES_010.00_full.c +``` + +(One skipped BIOS function, a COP1/FPU opcode `0x11`, is expected — the PS1 has +no FPU. `games/kula/generated/SCES_010.00_full.c` is what makes the +`kula-runtime` target appear in the runtime build.) + +--- + +## 7. Build the runtime (the playable binary) + +```bash +cmake -S runtime -B runtime/build -G Ninja -DCMAKE_BUILD_TYPE=Release \ + -DPSX_LAUNCHER=OFF -DPSX_ENABLE_VULKAN=OFF -DPSX_DEBUG_TOOLS=OFF +cmake --build runtime/build --target kula-runtime -j8 +``` + +Output: `runtime/build/kula-runtime` (native Mach-O, links SDL2; SDL picks the +Metal backend on Apple Silicon). Set `-DPSX_DEBUG_TOOLS=ON` for the TCP debug +server on port 4370 (`set_input`, `screenshot`, `pad_status`, …). + +--- + +## 8. Run and play + +From the repo root (so the relative disc path resolves): + +```bash +./runtime/build/kula-runtime +``` + +Console shows `psxrecomp: disc region PAL (serial SCES-01000)`, then a window: +Sony boot → **KULA WORLD** title + menu (1 Player / 2 Player / Scores / +Options). At the title, **Start** exits the attract demo; select **1 Player** +with **X** to reach a level and roll the ball with the arrow keys. + +Keyboard: arrows = D-pad, **X** = Cross/confirm, **S** = Circle, **Enter** = +Start, **Right Shift** = Select. An SDL game controller works too. + +--- + +## 9. macOS platform notes + +- **The runtime is POSIX** thanks to the Linux port (BSD sockets, `dlopen`, + `__atomic`, ucontext fiber backend). Only two small platform gaps needed + fixing for macOS, both guarded so Windows/Linux stay intact: + 1. `runtime/src/autocompile.c` — added `#include <stdlib.h>` for `getenv`. + glibc and `windows.h` leak that declaration transitively; the macOS SDK + does not, so AppleClang errored on the implicit declaration. + 2. `recompiler/src/main_bios.cpp` — the compiler-probe used `>NUL`, which is + the Windows null device. On POSIX that both misdirects the redirect and + drops a stray `NUL` file in the cwd; now `#ifdef`'d to `/dev/null`. +- The **ucontext fiber backend** (`runtime/src/psx_fiber.c`) already carried the + `_XOPEN_SOURCE`/`_DARWIN_C_SOURCE` guards needed for `makecontext`/ + `swapcontext` on macOS — it compiled and ran with no change. +- **No Xvfb needed** — SDL opens a real window. +- **`~/Downloads` is TCC-protected.** If you keep the repo under `~/Downloads` + and launch via a `.app` bundle or Finder, macOS prompts once for Downloads + access (needed to read the BIOS/disc). Launching from a terminal that already + has file access does not prompt. diff --git a/docs/assets/kula-world-macos.png b/docs/assets/kula-world-macos.png new file mode 100644 index 0000000000000000000000000000000000000000..85a6eee6ecf2ad0f8cba419b53b6fc6a507db5f5 GIT binary patch literal 75083 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"Xk9BjOP}w=t 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�n!+$ml93pW>-lFU^3sQ)Sft6ZmNp>+Lu`_K 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 ZzX8$>z=T{x)g}M{002ovPDHLkV1k6Wb2<P3 literal 0 HcmV?d00001 diff --git a/recompiler/src/main_bios.cpp b/recompiler/src/main_bios.cpp index b8588bc9..9f410a9f 100644 --- a/recompiler/src/main_bios.cpp +++ b/recompiler/src/main_bios.cpp @@ -304,7 +304,15 @@ std::string find_c_compiler(const std::optional<std::string>& cli_override) { static const std::array<const char*, 3> candidates = { "gcc", "clang", "cl" }; for (const char* c : candidates) { // Probe with --version. We don't parse output; non-zero exit means not present. - const std::string probe = std::string(c) + " --version >NUL 2>&1"; + // The null device differs by platform: NUL on Windows, /dev/null on + // POSIX. Using ">NUL" on macOS/Linux both misdirects the redirect and + // leaves a stray file named "NUL" in the cwd. +#ifdef _WIN32 + const std::string null_dev = "NUL"; +#else + const std::string null_dev = "/dev/null"; +#endif + const std::string probe = std::string(c) + " --version >" + null_dev + " 2>&1"; if (std::system(probe.c_str()) == 0) { return c; } diff --git a/runtime/src/autocompile.c b/runtime/src/autocompile.c index 58753fce..868dddc0 100644 --- a/runtime/src/autocompile.c +++ b/runtime/src/autocompile.c @@ -5,6 +5,7 @@ #include <stdint.h> #include <stdio.h> +#include <stdlib.h> /* getenv — declared here; glibc/windows.h leak it, macOS SDK does not */ #include <string.h> #ifdef _WIN32