Component-level state after v0.8.9-ps1
Status
What's working, what's broken, what's in motion -- one row per subsystem.
~9 min read · 2266 words
Headline
Current release is v0.8.12-ps1. Scenes validated
under the project’s acceptance bar (pixel-perfect visuals plus synced
SFX, signed off across every applicable variant – night, low-tide,
holiday, raft-stage):
63 / 63.
v0.8.9-ps1 is the current release: every row in the live per-scene
ledger is signed off, all 126 high/low scene variants are routed and
timing-bearing, deterministic BOOTMODE scene selection is logged and gated,
VISITOR5 high/low now share green 30..46 retained-read baselines, and the
latest WALKSTUF1 low in-place payload reductions are promoted. The
chapter-select grid in the in-game
Scene Explorer
keeps the custom on-PS1-captured thumbnails for every one of the 63 scenes
from v0.8.4-ps1 while streaming previews without a large paused-menu heap
allocation. The public headless battle card is +0.2708% over
target / 99.7337% target speed; the raw signed optimization matrix is
-0.4963% / 100.5160%.
The newest accepted BUILDING2 low pack promotion trims dead draw-tail payload
without changing pack size/LBA or the PS-EXE bucket, improving low to
1339/1317, overrun 22, blocking/read time 53/150, reads 37, and due
12. BUILDING4 low remains on the accepted offscreen PAL4 draw-span clip at
2853/2816, overrun 37, blocking/read time 40/215, and prefetch overrun
34; v746 now shrinks frame 291 in-place, preserving offsets while reducing
active payload 855284 -> 849109 with exact-flat timing. The newest WALKSTUF1 baselines are same-speed late-tail work-volume
clips: high v654 clips frames 194..210 and keeps 1476/1434,
blocking/refill 81/23, reads/due 65/16; low v653 clips frames 202..210
and keeps 1478/1431, blocking/refill 64/20, with v705 plus v760 bringing
loop reads/read time to 60/272 and due misses to 11, and v747/v749/v750/v751/v753/v755/v756/v757/v759/v762/v763/v766/v767/v769/v770/v771/v772/v773/v774/v775/v776/v777/v779/v780/v781/v782/v783/v784/v785/v786/v787/v788/v789/v790/v791
also shrinking low frames 51/49/47/61/62/58/45/37/35/43/41/57/33/67/68/69/32/133/5/141/70/30/6/71/72/142/73/131/74/19/28/138/145/75/76 in-place to 801103 active payload after the release merge. Both drop
draw pixels/spans/rows without changing timing/CD counters. VISITOR3 high keeps the compact tail-pack promotion at 1063/1040, and
VISITOR5 high/low both remain green on the matching 30..46 retained-read
shape. The VISITOR3 low frame132/frame137 setup-prime relocation keeps the
fixed 1555450 byte VIST3LOW footprint, LBA/sectors 23371/760, and
217088 byte PS-EXE bucket while improving low to 1062/1040, overrun 22,
blocking 42, reads/due 7/7. WALKSTUF1 high/low now measure 1476/1434
and 1478/1431; the latest WALKSTUF1 scalar and post-prepare scheduler
closures kept that timing unchanged and moved the next attempt toward
generated ownership or pack-side work. BUILDING2 low now adds the accepted
218..229 slack-8 retained-read row plus v739 draw-tail trimming, improving to
1339/1317, overrun 22, blocking/refill 53/0, reads/read time 37/150,
and due 12. BUILDING2 high currently measures
1351/1311, overrun 40, blocking 54, hidden refill 18, and due misses
7; same-speed offscreen clips now reduce its runtime rows/spans/pixels to
18030/105645/446246.
The live ledger is at
/scenes/; the per-scene workflow
that drives the bar is in
docs/ps1/scene-status.md.
The narrative below is per-component, not per-scene. The regtest
harness (config/ps1/regtest-scenes.txt + scripts/run-regtest.sh)
is the source of truth for “does this still build and boot.” Human
visual + audible signoff is the source of truth for “is this scene
done.”
Per-component status
| Component | Status | Notes |
|---|---|---|
| Build system (Docker + CMake + mkpsxiso) | Complete | config/ps1/Dockerfile.ps1 on linux/amd64; PSn00bSDK 0.24; scripts/rebuild-and-let-run.sh is the one-command entry. |
CD-ROM I/O (cdrom_ps1.c, ~2,570 lines) |
Complete | Reimplements fopen/fread against CD sectors. CdSearchFile / CdRead / CdSync integration. The rest of resource.c is unchanged from upstream. |
Renderer (graphics_ps1.c, ~4,900+ lines) |
Complete | 4-bit indexed sprite format (indexedPixels), palette LUT compositing, 4-pixel unrolled inner loop, opaque sprite fast-path, dirty-rect background restore (~80-95% reduction in per-frame data movement), black-backdrop temporal cleanup for full-screen scenes like JOHNNY 1, and grForceFullRedrawNextFrame for pause-menu resume. FntFlush is empirically broken in the scene-runtime context – do not regress on-screen text to it. |
Audio (sound_ps1.c, ~445 lines) + SPU |
Working | All 23 VAG SFX preloaded into SPU RAM at boot. Round-robin over 8 voices. Captured 0xC051 PLAY_SAMPLE events ship in the FG2 pack and fire from foreground_pilot.c with a 3-frame key-on delay. Mute writes the SPU master-volume registers directly because SpuSetCommonMasterVolume is not honored by DuckStation HLE. The VAG encoder (scripts/wav2vag.py) was extensively debugged during the v0.3.6-ps1 milestone (commit 355227fa); see that commit for the full bug list. |
Input (events_ps1.c + src/spi.c) |
Complete | Direct SPI driver, timer-2 + SIO0 IRQ at 250 Hz, lifted from spicyjpeg’s pads example. The BIOS pad path (InitPAD/StartPAD) is unusable in PSn00bSDK 0.24 + DuckStation. Poll TX is tx_len=5, not 4 – DuckStation only delivers button bytes when the full 5-byte sequence comes from the TX buffer. |
Closed captions (src/ps1_captions.{c,h}) |
Working | On/off via Pause -> Accessibility -> Captions. Dark band at the bottom of the frame for ~5 seconds at scene start with descriptive subtitle text. Glyph atlas shared with the pause menu. Caption corpus from the upstream closed_captions branch of jc_reborn; the original sequential ADS-tag map had ~20 mismatches and was re-audited (docs/ps1/caption-audit-2026-04-26.yaml). HIGH-confidence matches dominate; LOW-confidence slots remain on STAND idles and a few VISITOR / WALKSTUF edges. |
| Holidays (36 of them, code-generated) | Working | Holiday emblem sprite sheet packed into the PS1 holiday overlay. Selectable via Pause -> World Options -> Holidays and BOOTMODE.TXT. Generation is offline; design notes in docs/ps1/holidays-expansion-design.md. |
Story-loop walks (walk_pilot.c, walk_render.c) |
Working | Johnny walks between scene endpoints using Sierra’s original walk_data.h routes instead of teleporting. The runtime restores from a persistent tight clean buffer, keeps waves moving, re-stamps holiday overlays behind Johnny during walk frames, and covers Johnny behind the palm trunk/leaves. v0.7.2 adds a backdrop-key guard so walks only run when the next scene matches the previous rendered tide, raft, night, holiday, and island X/Y state; v0.8.0 adds a clean-rect retry path; v0.8.1 counts wave-band/split-rect clean pressure before allocation. |
Freeplay/debug mode (scene_freeplay.c) |
Working | v0.5.0-ps1 promotes direct-control Johnny: D-pad/analog walking, L2/R2 speed modifiers, fishing, immediate R1+D-pad world toggles, gag/visitor debug catalogs, sound test, Select clear-screen rebuild, frog-clock loading transitions, and a no-allocation steady-state frame loop. |
Pause menu (pause_menu.c) |
Complete | Start opens the overlay mid-scene; custom embedded 8x8 ASCII font (because FntFlush is broken in scene context); POLY_F4 dim quad + panel quads. Twelve sub-screens: Scene Set, Scene Explorer, Freeplay Options, Controls, World Options, Holidays, Set Island Position, Accessibility, Sound Test, System, Set Time/Date, Set RNG Seed. |
Memcard persistence (memcard.c) |
Working / expanding | Pause-menu choices persist to bu00: block 0. Save/load wired; restore-on-boot wired. v6 saves persist holiday mode separately from manual holiday id. Broader menu-option persistence remains future work. |
| Telemetry / debug overlay | Complete | Five-panel left-edge overlay; gated by grPs1TelemetryEnabled in graphics_ps1.c with row writes scattered through src/ads.c and helpers like grPs1SetLastBmpTelemetry. Off by default in release builds. Decoded out of captured frames by scripts/decode-ps1-bars.py into telemetry.json during regtest. The historical visual-debug substrate when TTY printf was unsafe; still the right tool for per-frame state since text I/O can perturb timing. |
Perf instrumentation (ps1_perf.c) |
Complete | Level-gated JCPERF / JCPERF2 TTY lines. Levels: OFF, SUMMARY, DETAIL, DEBUG. Set via ps1PerfSetLevel. Off in normal operation; the user feeds JCPERF output to a perf-debug agent when chasing regressions. |
| TTY printf | Reliable | Restored 2026-04-25 on PSn00bSDK 0.24 + DuckStation through bounded vprintf plus DuckStation TTY/file logging. Gated BOOTMODE probes (printf-test, logtest). Must not be called per-frame – text I/O alters timing. |
| Regtest harness | Working | config/ps1/regtest-scenes.txt + scripts/run-regtest.sh drive a headless DuckStation pass. Source of truth for “boots and renders something.” Not the source of truth for “looks right” – that’s still human signoff. |
| Host capture pipeline | Working | scripts/capture-host-scene.sh runs the desktop build under controlled boot state; emits high/low PNG frames, frame-meta.json, sound-events.jsonl. scripts/export-scene-foreground-pilot.sh now defaults new scene bring-up to normal/far-left/far-right foreground-only multi-view stitching before compiling FG2. |
| CD packaging (mkpsxiso) | Complete | config/ps1/cd_layout.xml. Routed scenes contribute high-tide + low-tide pack entries; the full FG2 corpus is ~343 MB, of which a selected subset rides on the disc. Build outputs jcreborn.bin + jcreborn.cue. CD image at v0.8.12-ps1 is ~79 MB; PS-EXE is ~208 KiB after legacy ADS/TTM/FG1 paths were stripped from the linker pass. |
What’s currently broken
Honest list, narrowed to specifics:
- Post-validation regressions. Scene coverage is complete at 63/63, but
future bugfixes can still be needed when broader play, new features, or
performance changes disturb a signed-off path.
v0.8.1fixed the latest random-run clean-rect pressure freeze; the scene ledger remains the acceptance source after each fix. - Memcard fresh-card edge cases. Save / load works on a card that already holds the project’s block. Behavior on a freshly formatted card or a card with a corrupted block is still being shaken out.
SpuSetCommonMasterVolumeHLE divergence. Worked around with direct register writes; the divergence itself is a DuckStation HLE quirk, not a project bug, but it does mean audio-on-real- hardware needs verification before any release calls itself hardware-confirmed.- Real hardware soak. Smoke-tested on an SCPH-7501 via the
TonyHax softmod path —
the disc boots and runs. Long-term observations on real
hardware (extended idle, real SPU register behavior, real CD
seek timing under random-position scene picks) are still on
the wishlist. The
SpuSetCommonMasterVolumeHLE divergence above is a concrete reason to keep treating hardware audio as unverified until the soak loop covers it. - Older count-based status models (
25/63,27/63,60/63,63/63) from prior validation eras are retired, not current. They are preserved incurrent-status.mdfor searchability and demoted explicitly. Do not cite them as current progress.
If a specific bug isn’t called out here, it lives either in the GitHub issue tracker on huntergdavis/johnny-castaway-ps1 or in the dated worklogs under /devlog/. The regtest harness output is the SoT for build-and-boot regressions.
What’s currently in motion
Pulled from the live narrative in
docs/ps1/current-status.md:
- Optimization after full validation. With all 63 scenes signed off, the
next focus is preserving pixel-perfect playback while improving speed,
loading, memory pressure, and release polish.
v0.8.12-ps1has the public-capped headless baseline at99.7%target speed across all 126 timing-bearing rows after the VISITOR3, WALKSTUF1, MARY3, BUILDING, ACTIVITY9, JOHNNY1, and WALKSTUF3 promotion arc. The bring-up loop remains indocs/ps1/development-workflow.md. - Scene-by-scene FG2 routing. All 63 scenes have generated high-tide and low-tide FG2 packs sitting in the corpus; routing them onto the CD image is selective during bring-up so the image stays manageable.
- Memcard hardening. Closing the fresh-card and corrupted- block edge cases.
- Persisted-options continuation.
v0.7.1shipped the holiday-mode slice:AUTO DATE:ORIG4is now the fresh/no-card default and memory-card schema v6 stores automatic policy separately from manual holiday id. Captions, Scene Set, tide, raft, island-position, freeplay/perf preferences, and menu cursor defaults remain future work. - Caption audit follow-through. Two layers, with one done in
v0.8.4-ps1and one still open. Done: the website’s description of which caption belongs to which scene was reconciled against the on-PS1 packs during the chapter-select grind — per-sceneindex.mdtitles + bodies,scenes.ymlnotes,scene-status.mdNotes column, and the in-game Scene Explorer display strings. The runtime evidence overturned a substantial fraction of the audit’s confidence ratings, including two HIGH-rated FISHING entries (FISHING 2boot,FISHING 3crab) that were exact text-pack mismatches and theVISITOR 5NO_MATCHcandidate that turned out to be a clear unambiguous gag. Open: the runtimecaptionSceneMap[]array insrc/ps1_captions.cwas not changed inv0.8.4-ps1; the on-screen caption band continues to play whatever caption the original audit picked, even on rows where the website now disagrees with that pick. Repointing the runtime mapping (or blanking the rows where text and pack can’t be reconciled) is a future-release item. The post-validation runtime corrections section lists the named mismaps. fgpilot-> “PS1 scene playback” naming migration. The internal code-name inforeground_pilot.cand friends remainsfgpilot; the public-facing name is moving to “PS1 scene playback.” The migration plan lives indocs/ps1/ps1-branch-cleanup-plan.yamlunderfgpilot_naming_migration_plan.- Milestone release cadence.
v0.8.9-ps1promotes the current mainline optimization set: VISITOR5 low reuses the green30..46retained-read shape, BUILDING2 low carries the218..229slack8 row plus v739 draw-tail trim, and WALKSTUF1 low carries no-shift frame51/49/47/61/62/58/45/37/35in-place payload reductions.v0.8.8-ps1promotes the VISITOR5 high30..46retained-read group on top of the v0.8.7 stability hardening.v0.8.7-ps1is the deterministic BOOTMODE scene selection and Scene Explorer preview stability point release on top of the v0.8.6 performance follow-through: direct-scene boots are logged and gated, Suzy backdrop cleanup restores scene state, and Scene Explorer thumbnails stream without a large heap allocation.v0.8.6-ps1is the WALKSTUF1 / VISITOR3 setup-segment compaction follow-through point release on top of v0.8.5’s full 126-row baseline (WALKSTUF1 low gap6-prefix + slack-guard, WALKSTUF1 high window-prefetch / slack4 guard, VISITOR3 high/low setup-segment resident copies for frames131/128).v0.8.5-ps1is the full 126-row headless performance matrix release.v0.8.4-ps1is the chapter-select thumbnails content release — 63 custom on-PS1-captured grid slots and a scene-page reconciliation pass against the actual on-PS1 packs.v0.8.3-ps1is the WALKSTUF1 compact foreground performance pass.v0.8.2-ps1is the VISITOR3 guarded-read performance pass.v0.8.1-ps1is the clean-rect pressure stability point release.v0.8.0-ps1is the complete-scene performance baseline.v0.7.2-ps1fixes stale-backdrop story-loop walks.v0.7.1-ps1adds the original-four auto holiday default and persisted holiday mode.v0.7.0-ps1validates all 63 scenes and moves the project into bugfix/optimization mode.v0.6.10-ps1validatesMARY 5after theNORAFTraft clamp andFIRSTfull-wipe transition fix.v0.6.8-ps1validatesMARY 2after the wide multi-view stitch and fish thought-bubble repair.v0.6.6-ps1removes the old FISHING7/FISHING8 runtime pins after far-left recapture proved both packs are random-position safe.v0.5.0-ps1is the freeplay/debug release.v0.4.20-ps1was the walking-loop stability release.v0.3.9-ps1was the fishing3-loop-stability release;v0.3.6-ps1was fishing1 with full SFX across all variants.
For dated context on any of the above, see /devlog/.
Related pages
- About: Method — the canonical methodology essay this status page tracks the implementation of.
- About: History — how the components above got to “complete” or “in motion.”
- About: dev environment — the workflow photograph behind every row in the component-level table.
- Scene ledger — the visual signoff bar; the per-scene status the table summarizes.
- Performance battle card — the second ledger; per-scene/tide timing for every component listed under “performance” above.
- Releases — short notes on every tagged version named in the milestone-cadence list above.
- Glossary —
vocabulary anchor for
FntFlush,clean-rect,fgpilot,BOOTMODE.TXT, and the rest of the terms this page uses without scaffolding.