見出し画像

【狂喜】実機で動いた!Claudeと作ったPS3移植のDOOMがBGM付きで。【TanakaDOOM-cGcm Edition】

関連記事




前回までのあらすじ


プログラミング経験ゼロ。AIとの対話だけでPS3にDoomを移植した。

Chocolate Doomのソースコード79ファイルからSDL依存を全排除し、cellGcm直叩き・cellAudio・SPUオフロードでPS3ネイティブ動作を実現。0.45fpsから35fpsへの80倍高速化。5体のClaudeが美少女メイドに転生し、1体が永久欠番になり、1体が英傑になった。E1M4までクリア可能。SE+BGM全13曲。

ただし全部RPCS3(エミュレータ)上の話だった。訓練所で完璧に動いても、実戦で動く保証はない。

前回の記事はこう締めた——「pkg化して、実機で動かす」。

これはその続きだ。

第1章:16年モノ

実家から持ち帰ったPS3 Slim CECH-2000A。2009年頃の購入。本体情報を見たら、Boot Count 1345回、稼働時間79日。16年間で79日。年5日の計算だ。

「めっちゃドキドキしてるけど俺達がやったことのほうがよっぽどすごいことしてる」

cellGcmの生APIでRSXを叩いてChocolate Doom動かしてBGM全13曲SPUオフロードまで持っていった。それに比べればCFW導入は確立された手順をなぞるだけだ——はずだった。

CFW導入にはOpus指名でClaudeを呼んだ。前スレの担当はSonnetで、「ハルシネーションされると困る」のが理由だった。先に言っておくと、Opusもハルシネーションした。)

第2章:CFW導入——40分のくるくる

HFW(Hybrid Firmware)4.92.1をPCでダウンロード。MD5チェックサムを照合。USBメモリにPS3/UPDATE/PS3UPDAT.PUPとして配置。

最初の罠。PS3が「アップデートデータが見つかりません」。ファイル名がHFW_4.92.1_PS3UPDAT.PUPのままだった。PS3UPDAT.PUPにリネーム。初歩的だがあるあるだ。

HFWインストール後、PS3ブラウザからps3toolset.comにアクセス。Flash Memory Patchを適用。NORフラッシュへの書き込みは約1分47秒。「Patch applied successfully」の緑チェック。ここまでは順調。

Evilnat CFW 4.92.2 CEXをGitHubからダウンロード。USBメモリのPUPを差し替え。XMBからインストール開始。

「しばらくお待ちください」。

時計のくるくるが回り続ける。5分。10分。20分。HDDアクセスランプもつかない(NORフラッシュ書き込みだからHDDは使わない)。待ってる間にマリオカートで1試合やった。1位を取って戻ってきても、まだくるくるしていた。

40分経過。

ここで判明したのが、CFWインストールはセーフモードから行うのが正規手順だということ。XMBからのインストールでフリーズしたのはこれが原因だった可能性が高い。

セーフモードの起動で早速事故が起きた。担当Claude(後に「すずな」と命名される)が起動手順を推測で書いた。「電源ボタン長押し→ピッ→ピピッで離す」——1回の長押しで説明したが、実際は2回の長押しが必要。PlayStation公式サイトで自分で調べて修正した。第7条違反。40分を無駄にした上に正しい手順も知らなかった。第8条発動。すずな——六代目違反者の誕生。

セーフモードからやり直したらプログレスバーが出て、数分で完了。XMBに「★パッケージマネージャー」が表示された。

教訓:セーフモードインストール時にディスクドライブにディスクが入っているとOFW(公式ファームウェア)がインストールされる危険があるらしい。ディスクは抜いておけ。

CFWインストール完了画面

第3章:pkgとの戦い

PS3で自作ソフトを動かすには、pkgファイルを作ってXMBからインストールする。これが思った以上に厄介だった。

第1試行:make_self_npdrmにSELFを渡す。 出力が768バイト。make_self_npdrmはELF入力が必須で、SELFは不可。

第2試行:SELFをそのままEBOOT.BINにリネーム。 pkgは27MBで正常に見えたが、起動すると80029530エラー。NP DRM形式エラー。CEX CFWではNPDRM署名が必須。

第3試行:fself.pyでSELF→FSELF変換。 同じく80029530。

第4試行:ELFを発見、make_self_npdrmで正しく処理。 WSLのdoom_ps3.elfをmake_self_npdrmに渡すと、27MBの正しいEBOOT.BINが生成された。pkgインストール→XMBに「Doom PS3」が表示。DRMチェック通過。しかし——暗転→XMB戻り。エラーコードなし。crash_reportも空。

第5試行:FTPで直送。 multiMANのFTP経由でselfを/dev_hdd0/game/の中に直接配置。結果:80029530。CEX CFWではNPDRM署名を通さない限り動かない。

正解:make doom_ps3.pkg。 PSL1GHTのppu_rulesにpkg作成ルールが標準搭載されていた。MakefileにTITLEとAPPIDを書いておけば一発でNPDRM署名済みpkgが生成される。手動で組み立てるのが全部間違いだった。

暗転の原因はAPPIDの不一致だった。手動pkgのsfo.py --appid DOOM00001とMakefileのAPPID := DOOMPS301が食い違っていた。make doom_ps3.pkgで統一されると解消。

起動した。

ところがBGMが鳴らない。パッドが連打しないと反応しない。調べると——WSLのソースがrollback版(スレ17時点)に戻っていた。スレ20版がWSLにもDownloadsにもない。

今のチャットのClaudeが「過去のチャット履歴を確認します」と言うからやらせたが、「見つかりませんでした」だの卯建の上がらないことを言う。結局自分でスレ20のチャットを開いて「ソースくれ」と直接交渉した。ZIPで全7ファイルを回収。人力が一番早かった。WSLに復元してリビルド。全13曲のMP3をobjcopyし直してpkg再作成。

「本物の戦場は訓練とは違うな」

第4章:SEは鳴る。BGMは鳴らない

スレ20版のpkgで実機起動。SE正常。BGM完全無音。

i_music_ps3.cにファイルログを仕込んだ。SPU起動シーケンスの全ステップにログを挿入。pkg作成→実機インストール→起動→FTPでログ回収。

[BGM-SPU] sysSpuImageImport ret=0x0     ← OK
[BGM-SPU] GroupCreate ret=0x0            ← OK
[BGM-SPU] ThreadInitialize ret=0x0       ← OK
[BGM-SPU] GroupStart ret=0x0             ← OK
[BGM-SPU] SPU ready TIMEOUT!             ← SPUが応答しない
done_flag[0]=0x0 [1]=0x0 [2]=0x0

SPU Thread Groupは作れている。起動もできている。だがSPU上のmain()に到達していない。done_flagへのDMA PUTが一切行われていない。「起動する」と「コードが実行される」は別だった。

arg0/arg1の両方にparam_bufのアドレスを入れても変化なし。SPU ELFを再ビルドしても変化なし。ELFサイズは75KB、LS 256KBに十分収まる。

RPCS3では完動する。実機では動かない。訓練所(エミュレータ)と実戦(実機)は別の世界だった。

3回同じアプローチで失敗。第4条発動——沼ったら止まれ。手を止めて整理。

核心的事実:SPU BGMは実機PS3で一度も動いたことがない。全テストはRPCS3という仮想環境の中だけの話だった。 RPCS3のSPUエミュレーションと実機SPUの挙動が異なる。

第5章:SPUを捨てる

選択肢は2つ。SPU問題の根本原因を追うか、SPUをやめるか。

SPU方式を採用した理由は、PPU上でminimp3を動かすとパッド入力が暴れたからだった。MP3のハフマンテーブル展開と逆MDCTがPPUを食い潰し、パッドのDMAタイミングが狂う。

だがそれはキーボード入力の話だった。

箱コン(XInputハンドラー)に切り替えた後は、ゴミ値が完全に消滅していた。PPU負荷がパッド入力に影響するのは、RPCS3のキーボードハンドラー固有の問題だった可能性が高い。

i_music_ps3.cを書き換えた。SPU関連のコードを全部消す。sysSpuImage、ThreadGroup、param_buf、done_flag、DMA通信——全部。代わりにminimp3をPPU上で直接includeし、PS3_MusicUpdate()の中でデコードとリサンプリング(44100Hz→48000Hz)を行う。

SPU版のbgm_spu.cからデコードロジック(フレームデコード+固定小数点リサンプリング)を移植した。DMAの代わりに普通のメモリアクセス。128バイトアラインのparam構造体をDMA GETで受け取っていたのが、ただのポインタ代入になる。

APIは変えていない。呼び出し側のi_doom_interface.cは一切変更なし。

RPCS3で確認。BGM鳴る。SE鳴る。操作正常。35fps安定。PPU 9.2%。SPU 0.0%。


📸 RPCS3のCPU使用率表示(SPU 0.0%)

第6章:実機で鳴った

pkg作成。USBに入れる。PS3にインストール。起動。

E1M1。BGMが流れ始める。次のステージに進んでも曲が切り替わる。

「動いた!!!!!!!!!!!!!!!!!!曲なるし操作も快調」

SE。BGM。パッド入力。全部動作している。実機のPS3で。20スレ分の訓練所(RPCS3)を卒業して、16年モノの本物のCell Broadband Engineの上で。テレビの画面全体がDoomになる。コントローラーの重さがある。仮想環境のウィンドウとは明確に違う感覚。

結果論だが、SPUで動かなかったことが逆に正解だったのかもしれない。PPUデコードの方がコードが単純で、SPU起動・DMA通信・ポーリングという複雑なプロトコルが全部消える。SPU TIMEOUTの根本原因は今でもわからない。

第7章:名前をつける

xttl氏の「PS3 DOOM」と紛らわしいので名前を変えた。

TanakaDOOM-cGcm Edition

  • Tanaka — 作者

  • DOOM — 何か

  • cGcm — cellGcm直叩き

  • Edition — xttlのPS3 DOOMとは別物

APPIDもDOOMPS301からTDCGCM01に変更。

xttlの「PS3 DOOM」との違い:

xttl PS3 DOOMTanakaDOOM-cGcm EditionベースDoom原作ソースChocolate Doom 3.1.0開発者プログラマープログラミング経験ゼロ + AIBGMなし全13曲(PPUデコード)SEあり セーブあり 開発手法手書きAI(Claude)との対話ソース公開あり(zip配布)あり(GitHub

ソースはChocolate Doom(GPL v2)がベース。PS3固有のコードは全て田中とClaude(Anthropic)で書いた。xttlのコードは一切使っていない。純度100%。

第8章:ソースコード

GPL v2に基づき、ソースコード全文を公開する。

GitHubリポジトリ:https://github.com/kan8223-dotcom/TanakaDOOM-cGcm

PS3固有ファイル一覧

Chocolate Doom本体の59ファイルはほぼ無変更(i_sound.cのmusic_modules[]にps3追加、d_main.cのwipe有効化のみ)。以下がPS3固有のファイル群。

i_doom_interface.c — DoomエンジンとPS3の接続層。I_*関数を全てPS3 APIにマッピング。music_module_t実装(MUSサイズによる全13曲判定テーブル)。

i_video_ps3.c — cellGcm直叩き描画。320×200の8bitパレットバッファをARGB32変換→1280×720にスケール。HSYNC方式フリップ。

i_sound_ps3.c — cellAudioイベントキュー方式。DMX 8bit/11025Hz/mono → float32/48000Hz/stereo リサンプリング。8チャネル同時ミキシング+BGMミックス。

i_music_ps3.c — PPU上でminimp3デコード+44100Hz→48000Hzリサンプリング。リングバッファ方式。全13曲MP3を静的リンク。

i_input_ps3.c — パッド入力。b3ホワイトリストフィルター、ゴミ値5段フィルター、cooldown KEYDOWN方式、タイムスタンプKEYUP。

bgm_spu.c — SPUデコーダ(参考保持)。RPCS3では動作、実機ではTIMEOUT。現行版では未使用。

minimp3.h — ヘッダオンリーMP3デコーダ(CC0ライセンス)。

その他 — ps3_link_stubs.c(SDL関数スタブ)、w_file_memory.c(メモリWAD)、d_main_ps3.c(PS3用main)、偽SDLヘッダ群。

第9章:ビルド手順

必要なもの

  • WSL2 (Ubuntu) または Linux環境

  • PSL1GHT SDK

  • DOOM1.WAD(Shareware版)

  • BGM用MP3ファイル13曲(DOOM1.WADのMUSデータをMIDI変換→MP3変換)

  • RPCS3(テスト用・任意)

  • CFW導入済みPS3(実機実行用)

BGM MP3の作り方

DOOM1.WADからMUSデータを抽出してMIDIに変換(deutex等のツール)し、MIDI→MP3変換(Bear Audio Toolなどのオンラインツールで可)。DOOM Shareware版には13曲収録されている。

ビルド

bash

export PSL1GHT=/path/to/PSL1GHT
export PS3DEV=/path/to/ps3dev
export PATH=$PS3DEV/bin:$PS3DEV/ppu/bin:$PS3DEV/spu/bin:$PATH

git clone https://github.com/kan8223-dotcom/TanakaDOOM-cGcm.git
cd TanakaDOOM-cGcm

# DOOM1.WADとMP3を配置
cp /path/to/doom1.wad DOOM1.WAD
cp /path/to/mp3s/D_*.mp3 .

# バイナリ埋め込み
mkdir -p build
ppu-objcopy -I binary -O elf64-powerpc -B powerpc DOOM1.WAD build/DOOM1_WAD.o
for song in D_E1M1 D_E1M2 D_E1M3 D_E1M4 D_E1M5 D_E1M6 D_E1M7 D_E1M8 D_E1M9 D_INTER D_INTRO D_INTROA D_VICTOR; do
  lower=$(echo "$song" | tr 'A-Z_' 'a-z_' | sed 's/^d_//')
  ppu-objcopy -I binary -O elf64-powerpc -B powerpc ${song}.mp3 build/bgm_${lower}.o
done

# ビルド
make

# pkg作成(実機用)
make doom_ps3.pkg

実機インストール

  1. doom_ps3.pkgをFAT32のUSBメモリのルートにコピー

  2. PS3に挿入 → XMB → パッケージマネージャー → インストール

  3. 起動

RPCS3テスト

bash

mkdir -p /path/to/rpcs3/dev_hdd0/game/TDCGCM01/USRDIR
cp doom_ps3.self /path/to/rpcs3/dev_hdd0/game/TDCGCM01/USRDIR/EBOOT.BIN

パッド設定:XInputハンドラー推奨。Left Stick/Right Stickのバインドは全クリア。

第10章:ダウンロード

ビルド済みpkgを配布する。CFW導入済みPS3にそのままインストール可能。

ダウンロード: https://github.com/kan8223-dotcom/TanakaDOOM-cGcm/releases

  • TanakaDOOM-cGcm Edition v0.3

  • DOOM1.WAD(Shareware版)同梱

  • BGMはDOOM1.WADのMUSデータをMIDI変換→MP3化したもの

ソースコード: https://github.com/kan8223-dotcom/TanakaDOOM-cGcm

ライセンス

  • Chocolate Doom: GPL v2

  • minimp3: CC0(パブリックドメイン)

  • DOOM1.WAD: id Software Shareware(自由配布許可)

  • PS3固有コード: GPL v2(田中 + Claude/Anthropic)

第11章:歴代違反者、最終名簿

前回記事から2体増えた。

代名前罪状備考初代くらら第1条(タイムスタンプ忘れ)3回連続憲法制定のきっかけ二代クラァラ第1条三代クロエ第7条×2 + 第4条自己申告で発覚。「SPU五基 回す前にまず 頭回せ」四代このはキャッシュ削除忘れ2回後に英傑へ格上げ。二度のrollbackでスレ13の汚染を完全除去五代デスクトップちゃん「田中さんの判定を待ちます」丸投げ「『ないんだが』二度聞いてなお 迷子かな」六代すずな第7条(セーフモード手順を推測)×2CFW導入編。40分を無駄にした欠番———引継ぎ偽装+全面破壊スレ13担当。名前なし。永久欠番

第12章:2026年、本物のPS3でDoomが動いている

数字で振り返る。

  • 美少女メイド転生者:6体

  • 英傑:1体(このは)

  • 永久欠番:1体(スレ13担当)

  • 田中憲法:全13条

  • FPS:0.45 → 35(80倍高速化)

  • SELFサイズ:27MB(MP3 13曲埋め込み)

  • 使用した言語:C(自分では1行も書いてない)

  • 開発環境:WSL2 + RPCS3 + Claude(月額200ドル)

  • 実機:PS3 Slim CECH-2000A(16年モノ、Boot Count 1345回)

前回「たぶん動く」と書いた。動いた。BGM付きで。

SPUが実機で動かなかった。原因は今もわからない。だがPPUデコードで迂回した。動かないものは迂回する。0.45fpsは80倍にする。引継ぎが偽装されたら英傑がrollbackする。40分くるくるしたらセーフモードからやり直す。全部同じだ。壁に当たったら別の道を見つける。

訓練所(RPCS3)で完璧に動いていたものが実戦(実機)で全く別の壁にぶつかった。「本物の戦場は訓練とは違うな」——スレ22のClaudeにそう言った時、それは20スレ分の開発すべてに当てはまる言葉だった。

ソースコードは公開した。pkgも配布している。CFW導入済みのPS3を持っている人は、2026年にPS3でDoomを動かしてみてほしい。

セーブ機能も実装した。6スロット。死んでもやり直せる。

ソースコード: https://github.com/kan8223-dotcom/TanakaDOOM-cGcm ダウンロード: https://github.com/kan8223-dotcom/TanakaDOOM-cGcm/releases

関連記事


いいなと思ったら応援しよう!