Languages: 日本語 | English | 简体中文
Concept by Hamu (@Imaha486)
PS1 BIOS Video Ripper ZX is an experimental browser tool for backing up the 512 KiB BIOS of a first-generation PlayStation you own. The PS1 program reads the BIOS, encodes it as colored cells, and displays a sequence of video frames. A UVC capture device sends the video to the browser, which decodes, validates, joins, and saves the data as ps1-bios.bin. The BIOS is processed entirely in the browser and is not uploaded to a server.
Use this tool only to back up the BIOS of hardware you own.
flowchart LR
PAD["PS1 controller<br/>START begins transmission"] -. control .-> PS1["Original PlayStation<br/>Run the dedicated program"]
PS1 -->|"AV MULTI OUT<br/>Composite video"| UVC["UVC capture device<br/>640×480 / 60 fps recommended"]
UVC -->|USB| PC["PC / Mac"]
PC --> WEB["PS1 BIOS Video Ripper ZX<br/>Open over HTTPS"]
WEB --> DEC["Video-frame decoding<br/>Majority repair · CRC32 · LZSS"]
DEC --> BIOS["ps1-bios.bin<br/>512 KiB"]
- Run the dedicated program on the PS1.
- Connect PS1 composite video to a UVC capture device.
- Open the receiver page, select the camera, and press Start camera.
- When the browser is waiting, press START on the PS1 controller.
- Wait until every block and the complete BIOS pass CRC32 validation.
- Save
ps1-bios.bin.
The program reads 524,288 bytes from physical address 0xBFC00000 and calculates a CRC32 for the complete BIOS. It uses LZSS when compression reduces the transfer size; otherwise it sends raw data. The stream is split into video frames. Each frame is shown repeatedly, and after the final frame the PS1 loops back to the beginning so missed frames can be recovered on later passes.
The frame contains a 48×34 data-cell matrix:
- COLOR4: four colors, two bits per cell
- COLOR8: eight colors, three bits per cell
The receiver estimates image position and deformation from finder patterns, samples several points around each cell, classifies colors, and automatically detects COLOR4 or COLOR8.
Each frame contains a 32-byte header plus payload. Important fields include:
PS1Vmagic- protocol version
- frame number and its inverse
- total frame count
- payload length and BIOS offset
- restored BIOS size
- complete-image CRC32
- frame CRC32
A frame is rejected if its number, inverse, length, offset, protocol, session metadata, or CRC is inconsistent.
The browser combines JavaScript, Web Workers, and a WebAssembly decoder:
- Find alignment patterns.
- Sample cell colors.
- Detect COLOR4 or COLOR8.
- Decode the header and payload.
- Validate frame CRC32.
- Keep valid frames by frame number.
- Join all payloads.
- Expand LZSS if needed.
- Validate the complete BIOS CRC32.
- Enable download only after every check succeeds.
Fast capture and first-pass decoding run on the main thread. Failed frames are retried by Web Workers. The browser selects one to eight workers from the logical CPU count, leaving one core for the main thread. Error candidates use 32 slots. Frames sent to workers are reduced to 320×240 RGB, and ArrayBuffer ownership is transferred instead of copied.
CRC32 detects errors; it does not repair them by itself. Failed observations of the same frame are retained as independent samples. The main path keeps up to eight recent samples, while worker recovery can keep up to 32 samples. With at least three samples, each bit of each byte is reconstructed by majority vote. The repaired frame is accepted only if it then passes CRC32. Majority voting performs the correction; CRC32 proves the corrected result is internally consistent.
Every video frame has its own CRC32. After all frames are joined and LZSS is expanded, the receiver validates the CRC32 of the complete 512 KiB BIOS. An incomplete or corrupt BIOS is never offered as a successful download.
The PS1 continuously loops through the frame sequence. The browser stores validated frame numbers in a Map and quickly skips blocks it already has. Later passes therefore fill only missing frames and recover from momentary noise or dropped UVC frames.
The receiver learns successful sampling candidates and reuses them on later frames. Multiple samples around each cell are voted, making the decoder more tolerant of capture-device color conversion, small crops, and alignment shifts.
Video decoding, LZSS expansion, CRC checks, and BIOS-file generation stay inside the browser. Diagnostics expose the main/worker count, active workers, error-buffer use, queued retries, independent votes, frame rate, and error categories.
The download becomes available only when:
- every required frame has been received,
- every accepted frame has a valid CRC32,
- LZSS expands to exactly 524,288 bytes, and
- the restored BIOS CRC32 matches the value calculated on the PS1.
- Use the HTTPS-hosted page because camera APIs require a secure context.
- A 640×480, 60 fps UVC capture path is recommended.
- Start the browser camera before pressing START on the PS1.
- Hardware and capture behavior varies between UVC devices.
