AMPR 计数器
PS5PCEM 中的 AMPR 是游戏机计数器与完成命令的进程本地软件模型。一百二十八个计数器按提交顺序接受存储、字段的原子更新、成对读取和带掩码的等待。
仓库笔记截至 2026年10月10日
游戏用 AMPR 做什么
在游戏机上,AMPR 是异步引擎,负责搬运文件数据,并更新 CPU 和 GPU 可以等待的计数器。游戏用它得知一次读取已经落地,或者后面的通道可以开始,而不必在共享变量上空转。PS5PCEM 并不模拟 AMPR 硬件块。它在进程内部执行游戏建好的命令流,并通过游戏注册的 AMPR 事件队列报告完成。
计数器组有 128 个 32 位字。一对是偶数计数器加上下一个字,作为同一个 64 位值读写。一把锁同时覆盖两半以及每一次读改写,因此读取者不会观察到被撕裂的一对。访问可以指名整对、32 位字、两个 16 位半字中的任意一个,或四个字节中的一个。
存储、等待与时间戳
写入可以是存储、按位 OR、与补码相与、XOR,或回绕加法,作用在被选中的字段上。等待在掩码下把该字段与一个参考值比较。比较有相等、大于、小于、不等、到达某个序列值,以及大于和小于的有符号形式。序列比较把字段的符号位移到第 63 位,因此同一条规则在 8、16、32 和 64 位上都成立。
已经满足的等待就地完成。尚未满足的等待保留提交时的快照,并在该流上更晚的写入和事件之前恢复,包括同一客户机线程上更晚的一次提交提供了这个值的情况。普通 API 与 _04_00 API 的参数列表彼此分开。时间戳随计数器命令一起记录。游戏正在导入的完成大小查询已经注册,因此这些调用能够解析。
这条路径被观察到做了什么
ReleaseSafe 中有二十二个针对性 AMPR 测试通过,其中包括经由真实导出表面的调用。Grand Theft Auto III 的启动执行了超过 10,000 次 APR 文件读取提交,并写下超过 350 个 AMPR 完成事件,该路径上没有匹配到的 AMPR 错误。那次启动本身并不调用计数器 API。计数器的工作由测试,以及确实会等待这些值的游戏来覆盖。
这是模拟器所执行命令的 API 覆盖。它不是游戏机内存控制器的周期级模型,也不声称具备硬件的时序。
已经实现的部分
- 一百二十八个计数器,带一致的 64 位对,以及字节、半字和字字段。
- 存储、OR、与补码相与、XOR 和回绕加法,以及带掩码的等待和有符号等待。
- 阻塞的等待保持自己在命令流中的位置,并在值到达时恢复。
- 有序完成经由已注册的 AMPR 事件队列交付。
尚未实现的部分
- WaitOnAddress 仍是占位实现。
- 真实 AMPR 块的硬件时序没有被复现。
- 解码器无法识别的计数器命令不会被静默当作成功。
相关机制
这些页面说明什么