Languages: 日本語 | English | 简体中文
考案: はむ(@Imaha486)さん
PS1 BIOS Video Ripper ZXは、自分が所有する初代PlayStationの512 KiB BIOSを、PS1の映像出力とUVCキャプチャ機器を使ってバックアップするための実験的なツールです。
PS1側プログラムはBIOSを読み出し、圧縮したデータをカラーセルの集合として画面へ連続表示します。ブラウザ側はカメラ映像から各セルを読み取り、フレームを検証・結合し、最終的に ps1-bios.bin を生成します。映像の解析と復元はブラウザ内で完結し、BIOSデータをサーバーへ送信しません。
自分が所有する本体のBIOSをバックアップする用途で使用してください。
- PS1上で専用プログラムを起動する
- PS1の映像出力をUVCキャプチャ機器へ入力する
- ブラウザで受信ページを開き、UVCカメラを選択する
- PS1コントローラーのSTARTを押して送信を開始する
- ブラウザが全フレームを受信・検証する
- 完了後に
ps1-bios.binを保存する
BIOSは物理アドレス 0xBFC00000 から524,288バイト読み出します。送信前にBIOS全体のCRC32を計算し、LZSS圧縮によってデータ量が減る場合は圧縮データを送信します。圧縮効果がない場合はRAWデータを使います。
送信データは複数の映像フレームへ分割されます。PS1は同じフレームを複数回表示し、最後のフレームまで到達すると先頭へ戻って周回します。このため、一度取りこぼしたフレームも次の周回で補えます。
映像内には48×34個のデータセルがあり、1セルが複数ビットを表します。
- COLOR4: 4色、1セルあたり2ビット
- COLOR8: 8色、1セルあたり3ビット
ブラウザは画面内の位置ずれや色の変化を補正しながらセルを分類します。PS1側ではSELECTボタンで色モードを切り替えられますが、切り替えると送信シーケンスがリセットされるため、受信途中の変更は避けます。
各フレームには32バイトのヘッダーとデータ本体が含まれます。主な情報は次のとおりです。
- マジック値
PS1V - プロトコルバージョン
- フレーム番号と反転値
- 総フレーム数
- ペイロード長
- BIOS内オフセット
- 復元後のBIOSサイズ
- BIOS全体のCRC32
- フレームCRC32
フレーム番号、長さ、オフセット、プロトコル、CRCが矛盾するデータは採用しません。
ブラウザは getUserMedia() でUVC映像を取得し、JavaScript、Web Worker、WebAssemblyデコーダーを組み合わせて解析します。
- 映像内の基準パターンを検出する
- セル中心の色をサンプリングする
- COLOR4またはCOLOR8を自動判定する
- ヘッダーとペイロードを復号する
- フレームCRC32を検証する
- 正常なフレームを番号ごとに保持する
- 全フレーム受信後に連結する
- 必要ならLZSSを展開する
- BIOS全体のCRC32を検証する
- 一致した場合だけダウンロードを有効にする
CRCに失敗したフレームは完成データへ混ぜず、次の表示または次の周回を待ちます。同じフレームの複数サンプルを使った補正が成功した場合は、受信ブロック表示で修正済みとして区別されます。
単に全フレーム番号が揃っただけでは完了になりません。次の条件をすべて満たしたときだけ ps1-bios.bin を保存できます。
- 必要な全フレームを受信済み
- 各フレームのCRC32が有効
- LZSS展開後のサイズが524,288バイト
- 復元したBIOS全体のCRC32がPS1側の値と一致
この設計により、不完全または破損したデータを正常なBIOSとして保存することを防ぎます。
- HTTPSで配信されたページから使用してください。カメラAPIは通常、安全なコンテキストを必要とします。
- 640×480、60 fpsに対応したUVCキャプチャ環境を推奨します。
- 受信前にブラウザ側のカメラを開始し、その後PS1側でSTARTを押します。
- 進捗が止まった場合は、PS1側の送信が一時停止していないか確認してください。
- ブラウザが生成するBIOSファイルは、エミュレーターや保存用途など、適法かつ個人的な範囲で扱ってください。
ソフトウェア上では、フレームの組み立て、CRC検証、LZSS展開、ブラウザおよびネイティブ受信処理が実装されています。環境によってUVC機器の色変換、フレームレート、遅延、ノイズ特性が異なるため、すべてのキャプチャ機器で同じ受信性能を保証するものではありません。
通常の映像取得と高速な一次判定はメインスレッドで行い、失敗したフレームの再探索をWeb Workerへ渡します。Worker数は論理CPU数からメインスレッド分を引いた値を基準にし、1〜8本の範囲で自動決定します。これにより、画面表示やカメラ取得を止めずに、位置ずれ・色パレット・サンプリング位置の別候補を並列に試せます。
エラー候補は32個のスロットで管理し、Workerへ渡す画像は320×240 RGBへ縮小します。転送時はArrayBufferの所有権をWorkerへ移すため、大きな映像バッファのコピーを避けています。復号済みフレームが後から別経路で確定した場合は、同じフレームに対する待ちジョブを捨てて無駄な計算を減らします。
CRC32そのものは誤りを直す符号ではなく、復号結果が正しいかを判定するために使います。CRCに失敗した同一フレームはすぐ捨てず、独立した複数回の観測結果として保存します。
メイン側では直近最大8サンプル、Worker側では異なるエラースロットから最大32サンプルを保持し、3サンプル以上集まると各バイトの各ビットを多数決します。多数決後のフレームがCRC32を通った場合だけ修正成功として採用します。つまり、多数決が訂正を担当し、CRC32が訂正結果の正しさを確認する役割です。
各映像フレームにはフレーム単位のCRC32があり、壊れたブロックを早い段階で拒否します。全ブロックを連結し、必要ならLZSS展開した後には、512 KiB BIOS全体のCRC32をもう一度検証します。局所的な検査と最終成果物の検査を分けることで、不完全なBIOSをダウンロード可能にしません。
PS1側は最終フレームまで送ると先頭へ戻り、停止するまで同じデータを周回送信します。ブラウザはCRC検証済みのフレーム番号をMapで保持し、すでに受信済みのフレームは高速にスキップします。そのため、2周目以降は不足しているフレームだけが埋まり、瞬間的なノイズやUVCのフレーム落ちから回復できます。
受信側はCOLOR4とCOLOR8を自動判定し、基準パターンから画面の変形や位置ずれを推定します。各セルは一点だけでなく周辺を複数回サンプリングして色を投票し、学習済みの成功候補を次のフレーム探索へ再利用します。映像キャプチャ機器ごとの色変換や微妙なクロップ差へ追従しやすくしています。
映像解析、LZSS展開、CRC検証、BIOSファイル生成はすべてブラウザ内で行います。受信データを外部サーバーへアップロードする処理はありません。画面にはメイン+Worker数、処理中Worker数、エラーバッファ使用量、待ちジョブ、独立票数、CRC・ヘッダー・長さなどのエラー種別を表示し、どこで詰まっているかを確認できるようにしています。
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/>GitHub PagesをHTTPSで開く"]
WEB --> DEC["映像フレーム復号<br/>多数決訂正・CRC32検証・LZSS展開"]
DEC --> BIOS["ps1-bios.bin<br/>512 KiB"]
- PS1のAV MULTI OUTからコンポジット映像をUVCキャプチャ機器へ接続します。
- UVCキャプチャ機器をPCまたはMacのUSB端子へ接続します。
- HTTPSの受信ページを開き、対象のUVCカメラを選んで「カメラ開始」を押します。
- 受信待機になってからPS1コントローラーのSTARTを押します。
- 全フレームとBIOS全体のCRC32が一致すると、ps1-bios.binを保存できます。
音声入力やネットワークへのBIOS送信は不要です。映像経路だけで受信し、復元処理はブラウザ内で完結します。
