原始构想:はむ(@Imaha486)
PS1 BIOS Audio Ripper SX 是一款实验性工具,用于通过初代 PlayStation 的模拟音频输出,备份您本人所拥有主机中的 512 KiB BIOS。
PS1 端程序读取 BIOS,对数据进行压缩、分块和纠错编码,再转换为 FSK 与 OFDM 音频。浏览器通过 Web Audio API 采集声音,并完成解调、FEC 恢复、CRC32 校验和 LZSS 解压。BIOS 数据不会上传到服务器;全部恢复过程都在浏览器本地完成。
请仅将本工具用于备份您本人所拥有硬件中的 BIOS。
- 在 PS1 上启动专用 CD-R。
- 将 PS1 正常工作的音频输出声道连接到 PC 或 Mac 的音频输入。
- 打开 HTTPS 接收页面,选择输入设备,然后点击“开始音频输入”。
- PS1 先发送 FSK 头部,再发送 OFDM 数据。
- 浏览器对每个数据包、数据块以及最终 BIOS 镜像执行 CRC32 校验。
- 只有全部校验成功后,才能保存
ps1-bios.bin。
- 读取地址:
0xBFC00000 - 原始大小:524,288 bytes
- 独立数据块:16 KiB
- 压缩:4 KiB 窗口、最大匹配长度 18 bytes 的 LZSS
- 如果压缩后没有变小,则以 RAW 形式保存该块
- 保存 stored-block CRC32、解压后 block CRC32 和完整 BIOS CRC32
每个压缩块相互独立,因此一个块损坏时,其解压历史不会影响其他块。
传输开始时使用 300 baud BFSK:
- Space:1,200 Hz
- Mark:2,400 Hz
- 采样率:44.1 kHz
- 每个 symbol:147 samples
- UART:ASCII / 8N1
- 开始时进行三秒声道检查:仅左声道、仅右声道、立体声
- 交替 mark/space 同步序列、协商字符串、带 CRC 的数据块头部
数据主体使用 OFDM:
- FFT:512 samples
- 循环前缀:64 samples
- 载波:96 个,bin 24–119
- 导频:8 个
- 调制:QPSK
- Packet:176 bytes,其中 payload 为 144 bytes
- FEC:16 个数据分片 + 4 个校验分片
- Packet CRC32 和 block CRC32
线路格式包含明确的版本号,以便尽量保持与已经发布的解码器兼容。
SX v0.3 默认使用把同一 OFDM 信号同时发送到 L/R 的单声道模式。即使只有一个声道正常也能接收;两个声道都可用时,接收端会根据各声道功率进行加权合并。
接收端通过同步符号估算全部 96 个载波的复数信道响应,在进行 QPSK 判决之前校正每个频率上的振幅和相位误差。如果某一侧没有信号,该声道的合并权重实际上会变为零。
包含 FEC 后,单声道 OFDM 的理论净速率约为 7.84 kbps。一个 4 KiB 线路数据块需要 40 个 packet。
- OFDM 区间:约 4.72 秒
- FSK 同步和两份头部:约 1.03 秒
- OFDM 开始保护间隔:约 0.09 秒
- 普通 4 KiB 数据块总计:约 5.85 秒
- 包含块边界的有效速率:约 5.6 kbps(约 700 B/s)
第一个数据块还包含三秒声道检查和协商,因此约需 12.8 秒。整个 BIOS 的实际传输时间取决于 LZSS 压缩后的容器大小。
初代 PlayStation 的 CPU 没有 FPU(浮点运算单元)。因此调制器完全避免浮点运算,使用定点 IFFT 生成 OFDM 波形。生成的 PCM 被转换为 SPU ADPCM,并通过 SPU RAM 双缓冲和 DMA 连续播放。PS1 画面会显示发送模式、数据块编号、CRC 和进度。
SPU ADPCM 不是 BIOS 数据本身的压缩格式,它只是通过 PS1 SPU 播放已生成 OFDM 波形时使用的存储格式。176-byte packet 被映射为 QPSK;IFFT 产生的 44.1 kHz / 16-bit PCM 以每 28 samples 为一组处理。每个 ADPCM 块为 16 bytes,由 2-byte 头部和 28 个 4-bit 量化采样(14 bytes)组成。
当前的高速实时编码器使用 filter 0,并根据每个块的峰值选择量化 shift。L/R 的 ADPCM 数据流分别通过 DMA 传输到 SPU RAM,并把 voice 0 分配给 L、voice 1 分配给 R。SPU 在硬件中还原出模拟 PCM 波形,浏览器再将其作为 OFDM 解调;浏览器并不会直接读取 ADPCM 数据。
立体声模式下,L/R 承载不同的 QPSK 数据。单声道模式下,同一 PCM 波形复制到 L/R,再分别编码为独立的 SPU ADPCM 数据流。即使最终只采集到一个声道,也仍可解调相同的线路格式。
浏览器请求立体声音频输入,并关闭回声消除、降噪和自动增益控制。
- AudioWorklet:实时输入、电平/RMS/peak 测量、FSK 解调
- OFDM Worker:重采样、同步搜索、FFT、均衡、QPSK 解调
- FEC Worker:在 GF(256) 上恢复缺失分片
- UI:显示 L/R 电平、同步相关度、SNR、EVM、packet CRC 和数据块状态
输入电平约以 29 Hz 更新,开销较大的波形快照则限制在约 9.6 Hz。界面在每个动画帧只应用最新值,不让过期更新堆积在队列中。
在满足以下所有条件之前,BIOS 下载功能不会启用:
- 已接收全部必要数据块
- 每个 stored-block CRC32 一致
- 每个数据块在 LZSS 解压后的 CRC32 一致
- 恢复后的大小为 524,288 bytes
- 完整镜像 CRC32 与 PS1 端报告的值一致
截至 2026-08-30:
- Codec / packet / FEC 单元测试:PASS
- 合成 PCM + SPU ADPCM 回环:160/160 packets,最终 CRC 一致
- 单侧无声时的单声道接收测试:PASS
- Docker PSn00bSDK 构建:PASS
- CD-R 写入以及物理 PlayStation 的读取/启动:已确认
- localhost 上实时音频电平表更新:已确认
- 从物理 PlayStation 音频到浏览器的完整 512 KiB 恢复:PENDING / UNVERIFIED