オープンソースプロジェクト
ran-j/PS2Recomp avatar
ran-j/PS2Recomp

ps2xIOP: PS2Recomp の IOP HLE サブシステム

ran-j/PS2Recompは実運用向けに使える実用的なオープンソース実装で、再利用可能な導入ルートを持つプロジェクトです。

スター 3,261フォーク 132C++GPL-3.0
GitHub

ひと目でわかる

これは何?
再コンパイルされたPlayStation 2ゲームにSIF RPCおよびDMAサービスを提供するIOP高レベルエミュレーションサブシステムについて。
誰に向いている?
ps2xIOPは、再コンパイルされたゲームがSIF RPCおよびDMA上で期待するIOPサービスを実装するC++20静的ライブラリであり、IOPのCPUをエミュレートしません。定義されたプロファイルシステム、少数の組み込みサービス、プロファイルカタログを拡張するためのオプションのネイティブプラグインABIを提供します。
商用利用できる?
条件付きでできます。GPL-3.0 はコピーレフトのライセンスで、これを含むソフトウェアを配布する場合、そのソフトウェアのソースコードを同じライセンスで公開する必要があります。配布せず社内で使うだけなら、この義務は生じません。
今もメンテナンスされている?
されています。最後のコミットは 2 日前です。
何の言語で書かれている?
主に C++ です(GitHub の言語統計による)。

回答はプロジェクトの GitHub データ(最終同期:2026年9月15日)と当サイトの分析に基づくもので、法的助言ではありません。

オープンソース詳細解説

PS2RecompのELFからC++への変換範囲

ps2xIOPはPS2Recompプロジェクト内のサブシステムであり、具体的にはps2xRuntimeが使用します。SIF RPCおよびDMAを介して公開されるIOPサービスに対してゲームが期待する動作を実装します。IOPのR3000A CPUをエミュレートせず、IRXバイナリをロードまたは実行しません。スコープは再コンパイルされたゲームに必要なRPC/DMA動作に限定されます。実装はps2_iop(ps2x::iopとも呼ばれる)というC++20静的ライブラリで、ランタイムにリンクされます。オプションの.dllおよび.soファイルは、そのライブラリによってロードされるネイティブプロファイルプラグインです。プロファイルカタログを拡張し、コアライブラリ、レジストリ、ホストブリッジ、SIFトランスポートを置き換えるものではありません。

ps2xAnalyzer、Recomp、Runtime、IOP

サブシステムはEEゲームとホストの間に位置します。ランタイムトランスポートはRpcRequest、RpcResult、SifTransferオブジェクトをIopSubsystemに渡し、選択されたプロファイルサービスとコアサービスを経由して、検証済みのゲストメモリ、ファイル、オーディオ、メモリカード、ロギング、EE関数呼び出しを提供するIopHostブリッジにルーティングします。3つの層が定義されています。モジュール実装はTSNDDRV、CRI DTX、CLFILE、SDRDRVなどの再利用可能なプロトコルエンジンです。バインディングにはSID、EEアドレス、コールバック、ゲストアリーナなどのビルド固有の値が含まれます。プロファイルは1つのゲームビルドに一致し、そのビルドのバインディングでモジュール実装を作成します。組み込みコアサービスは常にアクティブで、MCSERV(SID 0x80000400、0x80000480)、LIBSD(0x80000701)、DBCMAN(0x80001300)です。現在、recvx-us、lotr-two-towers-us、fatal-frame-usの3つのゲームプロファイルが組み込まれています。すべての組み込みマッチャーはELFベース名のみを宣言します。エントリポイントやCRC32は制約しません。ベース名の一致は大文字と小文字を区別しません。

GhidraのTOMLとCSVを優先する理由

ELFがロードされると、ランタイムはELFベース名、エントリポイント、および完全なELFファイルに対するCRC-32/IEEE(一般的なZIP CRC-32)からなるGameIdentityを計算します。プロファイルマッチャーはこれらのフィールドの任意の組み合わせを宣言できます。宣言された各フィールドは一致する必要があります。宣言されたフィールド数が最も多いマッチャーが勝ちます。2つの一致するプロファイルの特異性が等しい場合、loadELF()は静かに選択する代わりに失敗します。同じサービスレイヤー内の重複するSIDはエラーです。プロファイルがコアSIDをシャドウし、handled = 0を返した場合、サブシステムはシャドウされたコアサービスを介して2回目の試行を行いません。

R5900命令、stubs、skipの生成規則

IopSubsystemはランタイムが使用する5つの操作を公開します。configure(GameIdentity)はアクティブなプロファイルを選択して作成します。reset()はコアおよびプロファイルサービスをリセットします。selectRpcAbi(...)は、デフォルトのデコーダが不十分な場合にサービスがレジスタまたはスタックRPCレイアウトを選択できるようにします。handleRpc(...)はSIDでリクエストをルーティングし、ペイロード結果とトランスポートポリシーの両方を返します。onSifTransfer(...)はSetDmaおよびGetOtherDataコピーの前後にサービスに通知します。RpcResult::handledはサービスがリクエストを消費したかどうかを示します。結果は完了セマフォ信号を要求でき、ランタイムのデフォルトのEEコールバックまたは登録済みサーバーディスパッチを抑制できます。トランスポートはそれらのアクションを実行します。サービスはランタイム内部に決して触れません。転送フックは意図的に汎用です。TSNDDRVは互換性のバックフィルに使用し、CRI DTXはDMAの観察に使用しますが、SIFトランスポートにはゲーム名、ゲームアドレス、またはそれらのモジュールのブランチは含まれません。RPC ABIの選択はコアサービスの前にすべてのアクティブなプロファイルサービスに提供され、すべてのアクティブなサービスが各SIF転送通知を受け取ります。実装は関連するSID/関数または転送の種類/フェーズ/アドレス範囲を自分でフィルタリングする必要があります。

CMakeとC++20で生成物を組み込む

静的ライブラリはtarget_link_libraries(my_runtime PRIVATE ps2x::iop)でリンクされます。パブリックC++ APIはinclude/ps2x/iop/iop_subsystem.hで宣言されています。PS2Runtimeを使用するアプリケーションは通常、サブシステムを直接構築しません。ランタイムがIopHostアダプタとともに作成します。READMEには、CMakeスニペットとヘッダーの場所以外の統合例はありません。

GameIdentityとIOPプロファイル選択

動的プロファイルプラグインはオプションで、デフォルトでは無効です。WindowsまたはLinuxでPS2X_IOP_ENABLE_PLUGINS=ONを使用して有効にします。サポートされている形式は、Windowsでは.dll、Linuxでは.soです。デフォルトでは、ランタイムは実行可能ファイルの隣のiop_plugins/を非再帰的にスキャンします。埋め込みアプリケーションは、initialize()を呼び出す前に検索ディレクトリを置き換えることができます。各ネイティブモジュールは1つ以上のプロファイルを公開できます。欠落しているクエリシンボル、互換性のないABIバージョン、不正なディスクリプタ、サポートされていないモジュールは、診断とともに無視されます。プロファイルの曖昧さ、アクティブレイヤーのSID競合、または選択したプロファイルの作成失敗により、loadELF()は明確なエラーで失敗します。v1ローダーは、プラグインごとに最大256プロファイル、プロファイルごとに最大256 SIDを受け入れます。プロファイルには、空でないID、少なくとも1つのマッチャーフィールド、少なくとも1つのSID、および有効なcreate、destroy、reset、handle_rpcコールバックが必要です。プラグインABIはplugin_api.hで定義され、ps2x_iop_query_v1という1つのCエントリポイントをエクスポートします。固定のC関数テーブルとPODデータを使用し、ポインタの寿命に関する制約があり、境界を越えてSTL型を渡すことはできません。READMEは詳細についてPluginExample.mdを指しています。

プラグインABIとゲーム固有override

debugSnapshot()は、アクティブなプロファイル、そのプロバイダ、登録されたコアおよびプロファイルサービス、サービスメトリクス、ローダー診断、最後の選択エラーを公開します。ランタイムデバッガはこのデータをIOP/SIFタブに表示します。レジストリの動作、インスタンスの分離、リセット、組み込みサービス、プロファイルの優先順位、プラグインの検出、ABIの拒否、曖昧さ、ディスパッチ、破棄、モジュールのライフタイムはps2_iop_tests.cppでカバーされています。プロジェクトはGPL-3.0でライセンスされています。ライセンステキストはソフトウェアのコピー、配布、変更の権利を付与し、変更されたバージョンが変更されたとマークされることを要求します。また、保証がないと述べています。ライセンスはセキュリティ態勢、サポート、または特定のパフォーマンス保証については扱っていません。

編集部の結論

ps2xIOPは、再コンパイルされたゲームがSIF RPCおよびDMA上で期待するIOPサービスを実装するC++20静的ライブラリであり、IOPのCPUをエミュレートしません。定義されたプロファイルシステム、少数の組み込みサービス、プロファイルカタログを拡張するためのオプションのネイティブプラグインABIを提供します。プロジェクトはGPL-3.0でライセンスされています。

公式情報源

  1. Official README
  2. Project repository
  3. Release notes
コミュニティノート

コミュニティノート