Skip to content

Instantly share code, notes, and snippets.

@GOROman
Last active August 30, 2026 15:41
Show Gist options
  • Select an option

  • Save GOROman/efaf2f293fd7c39bf736bda44387ad87 to your computer and use it in GitHub Desktop.

Select an option

Save GOROman/efaf2f293fd7c39bf736bda44387ad87 to your computer and use it in GitHub Desktop.
PS1 BIOS Audio Ripper SX Burst Edition — English

PS1 BIOS Audio Ripper SX — Burst Edition (English)

Language: 日本語 · English · 简体中文

logo

Extract an original PlayStation BIOS through sound—not video or serial—and aim to finish in under 180 seconds.

What is it?

The 512 KiB BIOS travels from an owned original PlayStation to a browser over analog stereo audio. With no FPU on the PS1, the transmitter relies on fixed-point arithmetic, SPU ADPCM, and double-buffered DMA. Payload transport is OFDM only—not FSK—at 44.1 kHz stereo with a 512-point FFT, 64-sample CP, 96 carriers, and QPSK.

It started with Hamu's idea

The project began with an idea from Hamu (@Imaha486): let an original PlayStation read its own BIOS and carry the data out through interfaces the console already has, without soldering to the motherboard or requiring a dedicated ROM programmer. The goal is a backup from hardware the user owns, using an unmodified console as much as possible.

That idea grew into a complete browser-side recovery system: receive the signal, detect errors, repair missing data, reconstruct all 512 KiB, verify it, and only then offer a download.

From ZX to SX to Burst Edition

PS1 BIOS Ripper ZX explored video as the transport. The PlayStation drew encoded patterns, a capture device digitized them, and the browser reconstructed the data from images. ZX established the visual hierarchy, block tracking, CRC workflow, browser-only reconstruction, and downloadable CD boot image.

SX moved the transport from video to analog stereo audio. That changed the problem completely: SPU ADPCM, audio cables, capture-interface filters, clock drift, and Web Audio replaced pixels and color conversion. ZX and SX share presentation and architecture, but their wire protocols are independent.

The regular SX line first prioritized reliable physical recovery. Burst Edition became the speed-focused branch: payload FSK was removed, stereo OFDM became the only data transport, and FEC, WASM demodulation, and Worker parallelism were added to pursue the under-180-second target.

What the git history reveals

ZX commits repeatedly mention temporal decoding, real UVC tracking, and self-calibration for eight-color physical transmission. Synthetic frames were easy; real capture introduced duplicated or missing frames, color drift, and timing variation. The response was multithreaded decoding, an NTSC simulator, palette self-calibration, native 60 fps reception, mobile layout fixes, and visible LZSS progress.

SX shows an even rougher path. The history moves through a corrected PS1 OFDM modulator, a 44.1 kHz AudioContext, windowed-sinc resampling, a C demodulator, WASM integration, and RS(16+4). It also records important reversals: enlarging buffering from 2048 to 8192 was reverted; moving block metadata from FSK to OFDM was reverted; a 300-to-400-baud FSK experiment was rolled back. SPU playback boundaries, the FSK-to-OFDM transition, mono transport, and stale one-channel audio all required physical investigation. Only later does the log record verified physical BIOS recovery.

Burst Edition's first major implementation touched 55 files and added roughly 4,700 lines: transmitter, receiver, FEC, WASM, synthetic WAV tests, PS1 UI, and Web UI together. Later commits added the start cue, multilingual UI, disc image, and recovery refinements. The design came from accumulated ZX and SX failures, not from a clean first attempt.

Why the interface became Formula 1

The 180-second target turned transfer time into a lap time. A received block feels like distance covered; a CRC error is lost pace; FEC is a pit-stop repair; an unrecoverable group is a crash. A racing circuit expressed that reality better than another rectangular progress bar.

Blocks became laps, the driven section of track fills with color, CRC trouble makes the car spin, the final block carries a chequered flag, and completion triggers GOAL and confetti. The 2 → 1 → GO! audio cue follows the same race-start language.

The spectacle still rests on Hamu's original idea: recover a PS1 BIOS through outputs already available on the machine. The F1 theme does not replace that origin; it is a respectful way to visualize the under-180-second challenge and the repeated return from emulator success to difficult physical hardware.

Two beeps, then GO!

The PS1 plays a triangle-wave ADPCM start sequence: two short beeps, a rest, then one long beep. The browser responds with 2 → 1 → GO!. It is not just theatre: the sound is an audible input-gain reference, analogous to FSK carrier calibration. Actual payload data still uses OFDM only.

Finishing despite damaged audio

Each group has up to 32 data and 4 parity shards. A GF(256) Cauchy matrix (polynomial 0x11d) is used; CRC failures are treated as erasures and missing shards are recovered with Gaussian elimination. Packet, block, and whole-image CRC32 are checked after recovery. Heavy OFDM FFT/synchronization/demodulation code is fixed-point C/C++-style WebAssembly in a dedicated Worker, with a JavaScript fallback.

Analog capture is never perfectly repeatable. Gain, channel balance, sample-clock mismatch, interface filtering, and short noise bursts can damage isolated packets. The receiver therefore tries confidence-guided candidates and CRC-guided single-bit repair before asking the 32+4 FEC layer to reconstruct missing shards. Shards are interleaved over time so one dropout is less likely to destroy several members of the same FEC group. If every recovery layer fails, reception stops instead of saving a corrupted BIOS.

Why SPU ADPCM needed special treatment

The PlayStation SPU uses predictive 4-bit ADPCM with block history. Ideal PC-generated OFDM does not leave the analog output unchanged: quantization, predictor state, block boundaries, end flags, and DMA timing all matter. Some failures appeared only on physical hardware, including stale audio seeming to return on one channel after a buffer transition.

The start sound, payload, and SPU RAM regions were separated; stale buffers are not reused; short fades tame edges; and all PS1-side math remains fixed point. A triangle wave was chosen for the race-start cue because it survives SPU ADPCM predictably and gives the browser a clear level/frequency reference.

From emulator to real hardware

The only development Mac was a MacBook Neo with 8 GB memory, using Codex. PS1 builds ran on a 512 GB Mac Studio. After DuckStation validation, CUE/BIN was burned to CD-R and tested on physical hardware.

Signal path: PS1 analog L/R → EP-136 stereo input → browser AudioWorklet. Stereo 44.1 kHz input is required; AGC, noise suppression, and echo cancellation are disabled.

Validation proceeded in distinct layers: host codec tests, synthetic PCM/WAV loopback, DuckStation, CD-R, physical PlayStation audio, and finally whole-image CRC in the browser. Emulator success was never treated as proof of the analog path. The racing UI—track, car, FEC spin, lap timing, and finish celebration—turns a long demodulation run into something visible rather than a silent progress bar.

Equipment purchased

Item Source
SCPH-3500 and SCPH-7500 Mercari
Video capture and audio cables Mercari
CD-R media Akibaoo
Apple USB SuperDrive Mercari

The two consoles, capture device, and audio cables cost about ¥10,000 total.

Download

Credits

Role Credit
Concept and inspiration Hamu (@Imaha486)
Web and PlayStation applications Developed with Codex
Logo and visual artwork Generated with ChatGPT
Development and hardware testing GOROman
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment