AMPR カウンター
PS5PCEM の AMPR は、本体のカウンターと完了コマンドを、プロセス内のソフトウェアでモデル化したものです。128 個のカウンターが、送信順に書き込み、アトミックなフィールド更新、ペアの読み取り、マスク付きの待機を受け付けます。
2026年10月10日 までのリポジトリノート
タイトルが AMPR を何に使うか
本体の AMPR は、ファイルのデータを移動し、CPU と GPU が待機できるカウンターを更新する非同期エンジンです。ゲームはこれを使って、共有変数をスピンせずに、読み取りが届いたことや後のパスを開始してよいことを知ります。PS5PCEM は AMPR のハードウェアブロックをエミュレートしません。タイトルが組み立てたコマンドストリームをプロセス内で実行し、タイトルが登録した AMPR のイベントキューを通じて完了を伝えます。
カウンターバンクは 32 ビットのワードを 128 個持ちます。ペアは偶数番のカウンターと次のワードで、ひとつの 64 ビット値として読み書きされます。ひとつのロックが両方の半分とすべての読み取り・変更・書き込みを覆うので、読み手がちぎれたペアを観測することはありません。アクセスはペア全体、32 ビットのワード、どちらかの 16 ビットの半分、4 バイトのいずれかを指定できます。
書き込み、待機、タイムスタンプ
書き込みは、選んだフィールドに対する代入、ビット単位の OR、補数との AND、XOR、または折り返しのある加算です。待機は、そのフィールドをマスクの下で参照値と比較します。比較は、等しい、大きい、小さい、等しくない、到達したシーケンス値、そして大きい/小さいの符号付きの形です。シーケンスの比較はフィールドの符号ビットを 63 ビット目にシフトするため、同じ規則が 8、16、32、64 ビットで動きます。
すでに満たされている待機はその場で完了します。満たされていない待機は送信時のスナップショットを保持し、そのストリームのその後の書き込みとイベントより前に再開します。値が同じゲストスレッドの後の送信から来る場合も同様です。通常の API と _04_00 の API は引数リストが別々です。タイムスタンプはカウンターのコマンドとともに記録されます。タイトルがインポートしていた完了サイズの問い合わせは登録済みなので、これらの呼び出しは解決されます。
この経路で観測されたこと
本物のエクスポート面を通した呼び出しを含め、AMPR に絞ったテスト 22 件が ReleaseSafe で合格しています。Grand Theft Auto III の起動では 10,000 回を超える APR のファイル読み取りの送信と 350 件を超える AMPR の完了イベントが発生し、この経路で該当する AMPR のエラーはありません。この起動自体はカウンターの API を呼びません。カウンターの処理は、テストと、実際に値を待つタイトルでカバーされています。
これはエミュレーターが実行するコマンドの API カバレッジです。本体のメモリーコントローラーのサイクル単位のモデルではなく、ハードウェアのタイミングを主張するものでもありません。
実装済みのこと
- 一貫した 64 ビットのペアと、バイト、ハーフ、ワードのフィールドを持つ 128 個のカウンター。
- 代入、OR、補数との AND、XOR、折り返しのある加算、そしてマスク付き・符号付きの待機。
- コマンドストリーム内の位置を保ち、値が届くと再開するブロックされた待機。
- 登録された AMPR のイベントキューを通じて届く、順序どおりの完了。
まだ足りないこと
- WaitOnAddress はまだプレースホルダーです。
- 本物の AMPR ブロックのハードウェアのタイミングは再現していません。
- デコーダーが認識しないカウンターのコマンドを、黙って成功として扱うことはありません。
関連するしくみ
これらのページについて