考案: はむ(@Imaha486)さん
プロジェクト: PS1 BIOS Audio Ripper SX
所有する初代PlayStationの512 KiB BIOSをアナログ音声出力からブラウザへ送り、全ブロックの受信、CRC32検証、LZSS展開、最終BIOS CRC32検証、ダウンロードまで完了した。
回収ファイルは同一機種の既知ダンプとバイト単位で一致した。BIOS本体はGitHub、Gist、Pagesへ保存していない。
- PS1側: FPUを使わない固定小数点処理
- 音声出力: SPU ADPCM + SPU DMA
- FSK: 300 baud、1,200/2,400 Hz
- OFDM: 44.1 kHz、512 FFT、64 CP、96 carriers、QPSK
- FEC: 16 data + 4 parity shards
- データ: 独立ブロック、LZSSまたはRAW
- 検証: packet CRC32、stored/restored block CRC32、whole-image CRC32
- 受信: AudioWorklet + OFDM/FEC Worker
実機回収成功時点の基準コミットは 32d87fd。
FSKブロックヘッダーを300 baudから400 baudへ高速化したが、エミュレーター上の送信処理と実際の受信安定性に問題が見られたため不採用とした。
400 baud試験以降の変更はstashへ退避し、コードとPS1イメージを実機回収成功版 32d87fd へ戻した。現時点では、わずかなFSK時間短縮より300 baudの安定性を優先する。
メモリ8 GiBの開発MacではDocker/Colimaを動かさず、Mac Studio上だけでPSn00bSDKビルドを行う構成にした。
Apple Silicon上で使用したPS1ツールチェインイメージはx86_64専用なので、--platform linux/amd64 を明示する。
docker run --platform linux/amd64 --rm \
-v "$PWD":/src -w /src \
luksamuk/psxtoolchain:latest \
"cmake --build build --clean-first"生成した次の成果物だけを開発Macへ戻す。
build/ps1sx.exebuild/ps1sx.binbuild/ps1sx.cue
Dockerビルド成功は実機回収成功とは別の検証段階として扱う。
新しい実行ファイルへ更新した後、DuckStationが古い自動再開ステートを読み込み、黒画面と ゲーム: 0 FPS で停止したように見える問題が起きた。
対処は次の通り。
- 既存DuckStationプロセスを完全終了する
- 古い自動再開ステートを使わない
- 生成したCUEを直接指定してコールドブートする
pkill -x DuckStation 2>/dev/null || true
/Applications/DuckStation.app/Contents/MacOS/DuckStation \
./build/ps1sx.cueまた、LZSS圧縮や音声生成中はPS1側処理がブロッキングするため、DuckStationが一時的に低FPSまたは0 FPSと表示しても、ブロック番号や進捗が更新されていれば処理は継続している。
- 静的チェック・codec/packet/FECテスト: PASS
- 合成PCM/SPU ADPCMループバック: PASS
- エミュレーター起動: PASS
- CD-R起動: PASS
- 物理PlayStation音声のブラウザ受信: PASS
- 512 KiB再構築、全CRC32: PASS
- 既知ダンプとのバイト比較: PASS
- 400 baud FSK: 不採用
- 300 baud成功版への復帰: 完了