What this is · How it works
About
A fan port of Sierra's Johnny Castaway to the original PlayStation, built as a hybrid host-and-replay pipeline.
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.