Skip to content

Instantly share code, notes, and snippets.

@GOROman
Last active August 29, 2026 01:49
Show Gist options
  • Select an option

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

Select an option

Save GOROman/bd86551864c4ba597b53d0771fd89b1f to your computer and use it in GitHub Desktop.
PS1 BIOS Video Ripper ZX 技术说明(简体中文)

Languages: 日本語 | English | 简体中文

PS1 BIOS Video Ripper ZX — 技术说明

PS1 BIOS Video Ripper ZX 标志

设计构想:はむ(@Imaha486)

概述

PS1 BIOS Video Ripper ZX是一款实验性的浏览器工具,用于备份您本人所拥有的初代PlayStation的512 KiB BIOS。PS1端程序读取BIOS,将数据编码为彩色单元并连续显示为视频画面。UVC采集设备把视频送入浏览器,浏览器完成解码、校验、合并,并保存为 ps1-bios.bin。所有处理均在浏览器本地完成,不会把BIOS上传到服务器。

请仅将本工具用于备份您本人所拥有设备的BIOS。

连接示例

flowchart LR
    PAD["PS1手柄<br/>按START开始传输"] -. 操作 .-> PS1["初代PlayStation<br/>运行专用程序"]
    PS1 -->|"AV MULTI OUT<br/>复合视频"| UVC["UVC采集设备<br/>建议640×480 / 60 fps"]
    UVC -->|USB| PC["PC / Mac"]
    PC --> WEB["PS1 BIOS Video Ripper ZX<br/>通过HTTPS打开"]
    WEB --> DEC["视频帧解码<br/>多数表决纠错 · CRC32 · LZSS"]
    DEC --> BIOS["ps1-bios.bin<br/>512 KiB"]
Loading

使用步骤

  1. 在PS1上运行专用程序。
  2. 将PS1复合视频输出连接至UVC采集设备。
  3. 打开接收页面,选择摄像头并点击“启动摄像头”。
  4. 浏览器进入等待状态后,按下PS1手柄的START键。
  5. 等待所有数据块及完整BIOS通过CRC32校验。
  6. 保存 ps1-bios.bin

PS1端处理

程序从物理地址 0xBFC00000 读取524,288字节,并计算完整BIOS的CRC32。如果LZSS压缩能够减小数据量则发送压缩数据,否则发送原始数据。数据被拆分为多个视频帧;每帧重复显示。发送到最后一帧后会从头循环,因此先前遗漏的帧可以在后续循环中补齐。

彩色单元视频格式

画面包含48×34个数据单元:

  • COLOR4: 4种颜色,每个单元2位
  • COLOR8: 8种颜色,每个单元3位

接收器通过定位图案估计画面位置与形变,在每个单元周围进行多点采样,并自动判断COLOR4或COLOR8。

帧格式与校验

每帧由32字节头部和数据载荷组成,主要字段包括:

  • PS1V 魔数
  • 协议版本
  • 帧编号及其反码
  • 总帧数
  • 载荷长度和BIOS偏移
  • 还原后的BIOS大小
  • 完整BIOS的CRC32
  • 当前帧CRC32

帧编号、反码、长度、偏移、协议、会话信息或CRC不一致时,该帧不会被采用。

浏览器端复原流程

浏览器结合JavaScript、Web Worker和WebAssembly解码器:

  1. 检测定位图案。
  2. 采样单元颜色。
  3. 自动识别COLOR4或COLOR8。
  4. 解码头部和载荷。
  5. 校验帧CRC32。
  6. 按帧编号保存有效数据。
  7. 合并全部载荷。
  8. 必要时进行LZSS解压。
  9. 校验完整BIOS的CRC32。
  10. 只有全部检查通过后才允许下载。

实现上的优化

根据CPU核心数进行多线程解码

视频获取和快速初次判定在主线程进行,失败帧的重新搜索交给Web Worker。Worker数量根据逻辑CPU数自动选择,范围为1至8个,并为主线程保留一个核心。错误候选使用32个槽位。发送给Worker的图像缩小为320×240 RGB,并通过转移ArrayBuffer所有权避免大块复制。

CRC引导的多数表决纠错

CRC32用于发现错误,本身不负责修复。同一帧解码失败的多个独立观测会被保留。主路径最多保留最近8个样本,Worker恢复路径最多保留32个样本。样本达到3个后,对每个字节的每一位进行多数表决。修复结果只有再次通过CRC32才会被采用。多数表决负责纠错,CRC32负责确认纠错结果。

两级完整性检查

每个视频帧都带有独立CRC32。全部帧合并并完成LZSS解压后,还会校验完整512 KiB BIOS的CRC32。因此不完整或损坏的BIOS不会被当作成功结果下载。

循环发送补齐遗漏帧

PS1会循环发送全部帧。浏览器使用Map保存已通过校验的帧编号并快速跳过重复帧。后续循环只需补齐缺失帧,可从瞬时噪声或UVC丢帧中恢复。

自动调整颜色与位置

接收器会学习成功的采样候选并用于后续帧。每个单元周围的多个样本通过投票决定颜色,以提高对采集设备色彩转换、轻微裁切和位置偏移的容忍度。

浏览器本地处理与诊断

视频解码、LZSS解压、CRC校验和BIOS文件生成全部在浏览器内完成。诊断信息会显示主线程与Worker数量、正在工作的Worker、错误缓冲区、等待任务、独立样本数、帧率及错误类型。

完成条件

只有同时满足以下条件才会提供下载:

  • 已接收所有必需帧;
  • 每个采用的帧均通过CRC32;
  • LZSS解压结果恰好为524,288字节;
  • 还原BIOS的CRC32与PS1端计算值一致。

注意事项

  • 摄像头API需要安全上下文,请使用HTTPS页面。
  • 建议使用640×480、60 fps的UVC采集环境。
  • 请先启动浏览器摄像头,再按PS1上的START。
  • 不同UVC设备的颜色转换、延迟和丢帧特性可能不同。

链接

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment