HLE は、タイトルがインポートするファームウェア呼び出しに PS5PCEM が応える仕組みです。数値の NID はそれぞれホストのスタック上で動く Zig の関数になり、Windows でもゲストの System V 呼び出し規約が保たれます。
しくみ実装
PS5PCEM のしくみ
各ページは、エミュレーターが実際に動かしているひとつのしくみを扱います。本体が何をするか、Zig のコードが何をするか、そして何がまだ足りないか。
2026年10月17日 までのリポジトリノート
ファームウェアと HLE
PS5PCEM の AMPR は、本体のカウンターと完了コマンドを、プロセス内のソフトウェアでモデル化したものです。128 個のカウンターが、送信順に書き込み、アトミックなフィールド更新、ペアの読み取り、マスク付きの待機を受け付けます。
しくみAPR はタイトルのファイルを一度だけ解決し、その後のコマンドバッファではプロセス内の識別子を使います。遅延した AMPR の読み取りは、ホストのディスクリプターを持ち続けることなく、同じ読み取り専用の /app0 のファイルを開き直します。
しくみゲストのアドレスは本物のホストのアドレスです。ダイレクトメモリはその空間にマップされる疎な共有の物理プールで、MemoryPool は同じ裏付けの上で予約、コミット、バッチ操作を追加します。
しくみセーブデータ
動作マウントしたセーブスロットは書き込み可能な /savedata0 になります。タイトルは通常のファイル API を使い、次回の起動では、タイトルが公開しているプロダクトコードのもとで同じファイルを見つけます。
しくみフォントの描画
一部libSceFont は、タイトルが提供する TrueType と OpenType のフェイスを FreeType でラスタライズします。システムフォントの要求には、同梱の Noto Sans をラテン文字、ギリシャ文字、キリル文字の代替として使います。
しくみPNG エンコーダーは、行ピッチ付きの RGBA または BGRA のピクセルから 8 ビットの RGB か RGBA のファイルを書き出します。デコーダーは、インターレースなしのグレースケール、パレット、RGB、RGBA の画像を、確認済みのゲストのバッファに読み込みます。
しくみRTC は暦のフィールドを確認し、Windows の FILETIME を変換し、ティックに対して確認付きの演算を行います。ゲストには、ホストの夏時間の変換を含まない、一貫した時計が見えます。
しくみWindows では libSceFiber のファイバーがそれぞれ本物の Windows のファイバーなので、切り替えでゲストのレジスターとゲストのスタックが保たれます。ユーザーレベルスレッドは同じ pthread の経路で始まります。
しくみカーネルの AIO の API は、読み取りのバッチを受け付けて識別子を返します。PS5PCEM はインターフェースが許すとおり送信時にバッチを実行し、タイトルは完了した結果を受け取ります。
しくみグラフィックス
PS5 のタイトルは自分のメモリで GPU のパケットを組み立て、そのバッファを送信します。PS5PCEM はその PM4 ストリームをデコードし、レジスターの状態を保持し、描画とディスパッチを順番に実行します。
しくみPlayStation 5 のシェーダーは RDNA2 の機械語です。PS5PCEM は GFX10 の命令ファミリーをデコードし、制御フローグラフを構築し、対応する操作を Vulkan 用の SPIR-V 1.5 に変換します。
しくみS_SETPC_B64 で続くフェッチシェーダーを含め、統合された NGG の頂点プログラムをひとつのグラフィックスステージとして変換します。エクスポートのプログラムは独自のユーザーデータのウィンドウを保ちます。
しくみIMAGE_LOAD_BY2、BY4、PCK2、PCK4 は、明示的なミップの形も含め、計測したネイティブの 2D 形式で実行されます。BY の読み込みは連続するテクセルを返し、PCK の読み込みはその生のビットをひとつのレジスターに詰めます。
しくみIMAGE_GATHER4H と IMAGE_GATHER4H_PCK は、水平方向に並んだテクセルのグループから 1 つのチャンネルを集めます。計測した直接の 1D と 2D の範囲は、1,242 回の GPU ディスパッチでカバーしています。
しくみS_SWAPPC_B64 と S_CALL_B64 は完全な戻りアドレスを保存し、ENDPGM の後ろにある呼び出し先を含め、範囲付きのローカルなサブルーチンを実行します。検証済みの AGC のフェッチシェーダーも同じ方法でリンクできます。
しくみVulkan のバックエンドは実行時にドライバーを読み込み、Vulkan 1.2 を必要とし、スワップチェーンを通じてゲストのフレームを表示します。レンダーターゲット、ストレージイメージ、パイプラインは描画をまたいで常駐します。
しくみ0.3.5 の後に追加された、実験的なネイティブ Windows レンダラーです。PM4 デコーダーと RDNA2 シェーダー変換を Vulkan と共有し、そのあと D3D12 と DXGI で実行・表示します。既定は引き続き Vulkan で、ゲームはまだこの経路では動きません。
しくみMSAA
一部一致する 2×、4×、8× のカラーと深度のサンプル数は、後のリゾルブまでホストのイメージに留まります。アステリックスは MSAA の深度とステンシルでこの経路を使っており、大きな意図しないリードバックがなくなりました。
しくみHTILE、DCC、CMASK、FMASK は本体の圧縮された深度とカラーのメタデータです。PS5PCEM はポインターを追跡し、理解できる場合には HTILE をクリアし、そうでなければ誤ってデタイルしてしまうレイアウトを拒否します。
しくみPS5 のテクスチャは線形の行ではなく GFX10 のスウィズルのパターンで格納されています。PS5PCEM はアドレス式を CPU で、そして条件を満たす大きな 4、8、16 バイトのサーフェスについては GPU で適用します。
しくみオプトインのページトラッカーは 16 KiB のゲストのページを監視します。最初のネイティブの CPU 書き込みでフォールトが起き、世代を進めて GPU 側のコピーを無効化するため、変化のないページを毎フレームハッシュしてアップロードすることがなくなります。
しくみVideoOut
動作VideoOut はゲストの表示用バッファを登録し、表示のコールバックがフレームを受け付けた後にだけフリップを完了させます。ホストのウィンドウは 1080p SDR の Vulkan のスワップチェーンです。
しくみオーディオとビデオ
AudioOut
動作AudioOut はゲストの PCM を Windows のデバイスで 48 kHz で再生します。レガシーのポートはそれぞれ独自のストリームとキューを持つため、音楽と効果音が一緒に鳴り、アンダーランでもサンプルの順序が保たれます。
しくみACM の畳み込みは、FMOD の分割リバーブを CPU で実行します。共有入力のバッチは 1 つのドライ信号を変換し、浮動小数点か半精度のインパルスの分割を適用し、ウェットの結果をオーバーラップ加算します。
しくみAJM は ATRAC9、MP3、MPEG-4 AAC、Opus をデコードします。各コーデックのインスタンスは独自の状態を持ち、不明なコーデックは、無音の成功として報告するのではなく拒否します。
しくみNGS2
一部NGS2 はシステム、ラック、ボイスのハンドルを保持し、通常の RIFF/WAVE のデータを解析し、ソフトウェア DSP のワーカーが空回りしないよう、無音の 48 kHz のグレインのペースを調整します。ボイスの合成そのものは不完全です。
しくみAvPlayer
動作SceAvPlayer は FFmpeg でムービーのコンテナをデコードし、タイトルが所有する NV12 のフレームと 48 kHz ステレオの PCM にします。タイトルがどちらかのストリームを一度も読まなくても、ソースの長さを過ぎると再生は終了します。
しくみCPU、ローダー、ツール
Windows x86-64 では、ゲストの機械語が直接実行されます。ゲストの pthread ごとにホストのワーカーがひとつ付き、Windows が FS ベースを保持しないため、ブロックする呼び出しのたびに FS ベースを戻します。
しくみローダーは復号済みの PS5 の SELF と素の ELF64 のモジュールをマップし、再配置を適用し、インポートを HLE の登録と照合して解決します。その後、タイトルは自分で起動するモジュールの安定したハンドルを受け取ります。
しくみDualSense、DualSense Edge、DualShock 4 は USB と Bluetooth の HID で読み取ります。Xbox 互換のパッドは XInput を使います。キーボードはランチャーのプロファイルでスティックに割り当てます。
しくみpkgextractor は、開発中に確認したデバッグ FPKG の形式を展開します。外側のパッケージ、内部 PFS、NAPS の名前の対応表、Kraken で圧縮されたデータです。暗号化された製品版パッケージは対象外です。
しくみこれらのページについて