In one paragraph

Sierra’s Johnny Castaway is a 1992 Windows 3.1 screensaver about a small man on a small island. This is a fan port of it to the original PlayStation. It is a labor of love by Hunter Davis. Hunter does not own or have a license to the Johnny Castaway character; the original creator generously allows fan ports. If you paid for this, you were cheated. The technical short version: the project does not run Sierra’s original ADS / TTM bytecode on the PS1 at all. A desktop host runs the real engine, captures every visible foreground draw plus every PLAY_SAMPLE event, and writes the result into a small per-scene binary called an FG2 pack. The PS1 build loads packs from the disc and replays them, while owning only the narrow runtime it must: background, wave animation, holiday overlay, controller input, SPU audio. That trade is why a 63-scene screensaver fits onto a CD-ROM and inside 2 MB of RAM at all.

Current release: v0.8.12-ps1. Validated scenes: 63 / 63 under the project’s acceptance bar (pixel-perfect visuals plus synced SFX, signed off by human visual and audible review across every applicable variant).

The hybrid pipeline (one sketch)

A pack is a small binary file that records every visible bitblit in a scene – what was drawn, where, when, and against what background – plus a per-frame sound-event table. There is one high-tide pack and one low-tide pack per scene. Each pack carries its own palette, frame-timing table, base-frame full-render, and per-frame diff spans. The PS1 build’s job is to replay them in step with its own background and overlay layers; it never has to interpret a Sierra bytecode op at runtime.

That choice is the whole shape of the project. The PS1 has 2 MB of main RAM, 1 MB of VRAM, 512 KB of SPU RAM, and a 2x CD drive with ~150ms cold-seek latency. Sierra’s TTM/ADS interpreter on the desktop side cheerfully resolves resources by name out of a flat filesystem and replays prior scenes to establish state. None of that is workable on a console with no syscall layer, no filesystem cache, and a sprite engine that wants pre-mangled CLUT-indexed bitmaps. The hybrid pipeline punts every piece of “smart” work back to the host build where RAM and CPU are not constraints, and ships the PS1 a deterministic flipbook to render.

[ original Sierra engine ]   --plays a scene-->  [ host capture ]
                                                    |
                                                    v
                                             [ FG2 packs:  one
                                               per ADS+tag ]
                                                    |
                                                    v
                       [ CD-ROM image ]   <-bundles--+
                                                    |
                                                    v
                                            [ PS1 GPU replay ]

The price: each scene needs a verified host capture and a successful PS1 replay before it joins the validated count. There is no shortcut. At v0.8.12-ps1, all 63 of 63 scenes are signed off — every row in the per-scene ledger clears the FISHING 1 bar across every applicable variant. The hard cluster near the end was the foreground-only multi-view scenes (MISCGAG 1, MISCGAG 2, STAND 1, the wide LILLIPUTIAN arrival), which all needed the generic normal / far-left / far-right host stitch before their packs replayed cleanly.

The second ledger — the performance battle card — is its own bar, separate on purpose. At v0.8.12-ps1 the matrix averages 99.7% target speed across all 126 timing-bearing scene/tide rows; the reference manual explains what each column means and the retrospective on how it got there walks through which experiments landed and which didn’t.

What this isn’t

A few things this project is deliberately not trying to be:

  • Not an emulator. It does not run Sierra’s original Win16 binary. It does not interpret ADS or TTM bytecode on the PS1. It replays packs.
  • Not a re-creation. No one is rewriting the engine in pure C++ and calling it homage. The packs are derived from the real desktop runtime running real Sierra data files.
  • Not a polished commercial product. It boots in DuckStation, it should boot on a real PS1, the regtest harness is the source of truth for what works, and the visible bugs are documented rather than papered over.
  • Not a community hub. Issues and PRs on huntergdavis/johnny-castaway-ps1 are welcome but unscheduled. There is no Discord, no roadmap survey, no roadmap voting, no Patreon.

Where to go from here

  • /about/method/ – the technical deep-dive: pipeline, pack format, hardware gotchas hit on the way (SPI pad polling, FntFlush, dirty-rect bookkeeping, SPU HLE divergence, TTY printf).
  • /about/status/ – component-level status. Renderer, audio, input, captions, holidays, pause menu, memcard, regtest harness, host capture, CD packaging.
  • /about/history/ – the timeline. Pre-port era, first PS1 attempts, the hybrid pivot, the 63-scene grind, where it stands at v0.8.12-ps1.
  • /about/voice/ – the editorial standard the prose on this site holds itself to. Read it before writing a new page.
  • /about/dev-environment/ – the actual desk behind the work, photographed. Six windows: the Dunking Bird auto-poker, the fresh editor, two LLM sub-agents (Claude + Codex), DuckStation running the latest build, and a bottom-monitor system-telemetry panel — all on KDE Plasma.
  • /scenes/ – live per-scene ledger. All 63 rows clear the FISHING 1 bar; family jump nav, per-scene case studies, last-verified release tag.
  • /perf/ – the second ledger: 126-variant headless-perf battle card with sortable columns and color-coded Target Speed cells.
  • /devlog/ – the dated worklogs that drove each phase, in original form.
  • /archaeology/ – older status surfaces, retired tooling, the harness era, the restore-pilot era, and other paths that did not become the active methodology.
  • /lab/ – seventeen feature-length retrospectives, newest first. The per-scene hero rollout, the chapter-select grind, the v0.8.1 soak freeze, the post-validation performance loop, the site itself as a small program, the 24/7 build farm, the 63-scene grind, the LLM pass, hallucination engineering, regression as a lifestyle, why this is the fifth port, and the rest.
  • /hack/ – a learning path for hackers who want to read the C, port to another machine, or understand the debugging loops.
  • /docs/ – twenty reference manuals covering build, captions, holidays, pause menu, freeplay, story-loop walks, regtest, scripted input, performance, hardware, devices, audio, infrastructure, file formats, AI sub-agents, vision-classifier, the SDL2 → PSn00bSDK API mapping, dev workflow, feeds + well-known endpoints, and the project glossary.
  • /source/ and /resources/ – the complete documentation shelf and asset catalog.
  • /play/ – the download page: latest .bin / .cue, DuckStation quickstart, controller map, freeplay controls, real-hardware notes.
  • /faq/ – author-written answers to “what is this,” “do I need Sierra files,” “is this legal,” “can I sponsor or donate,” “does it run at native rate,” and the other recurring questions.
  • /releases/ – short notes on every tagged version with links to the full release notes and the disc image.
  • /credits/ – attribution shelf for the people, tools, and fonts behind the project: Sierra for the original screensaver and characters, the upstream reverse-engineering ports, the PSn00bSDK / mkpsxiso / DuckStation toolchain, spicyjpeg’s MPL pad-poll example, the four self-hosted SIL OFL fonts, and the CC0 ocean-ambience source.

The repository is at huntergdavis/johnny-castaway-ps1. Open source under GPL-3.0, inherited from upstream jno6809/jc_reborn – without that engine decode this port would not exist.

Pointing at this work

If you’re linking this project from a blog post, a paper, a retro-dev podcast’s notes file, or anywhere a stable reference is more useful than a bare URL — here’s the canonical format. The version pin matters; this is an active project and behavior changes between releases.

One-line web reference:

Hunter Davis. Johnny Castaway PS1. v0.8.12-ps1. https://hunterdavis.com/johnny-castaway-ps1/

BibTeX:

@misc{johnny-castaway-ps1,
  author       = {Hunter Davis},
  title        = {Johnny Castaway {PS1}: A fan port of Sierra's 1992 screensaver to the original PlayStation},
  year         = {2026},
  version      = "v0.8.12-ps1",
  howpublished = {\url{https://hunterdavis.com/johnny-castaway-ps1/}},
  note         = {Open source under GPL-3.0; code repository at \url{https://github.com/huntergdavis/johnny-castaway-ps1}}
}

The version field tracks the current release tag, not the project’s start date. For citing a specific release tagged in the past, swap in that tag (v0.7.0-ps1, v0.8.1-ps1, etc.) and adjust the year to match — the release notes index carries the dated headlines.