Счётчики AMPR
AMPR в PS5PCEM — это локальная для процесса программная модель команд счётчиков и завершения консоли. 128 счётчиков принимают записи, атомарные обновления полей, парные чтения и маскированные ожидания в порядке подачи.
Заметки репозитория по 10 октября 2026 г.
Для чего игра использует AMPR
На консоли AMPR — асинхронный механизм, который переносит данные файлов и обновляет счётчики, которых могут ждать CPU и GPU. Игры используют его, чтобы узнать, что чтение дошло, или что более поздний проход может начаться, не крутясь на общей переменной. PS5PCEM не эмулирует аппаратный блок AMPR. Он исполняет поток команд, который собрала игра, внутри процесса и сообщает о завершении через очередь событий AMPR, которую игра зарегистрировала.
Банк счётчиков хранит 128 слов по 32 бита. Пара — это чётный счётчик плюс следующее слово, читаемые и записываемые как одно 64-битное значение. Одна блокировка покрывает обе половины и каждую операцию чтение-модификация-запись, поэтому читатель не может увидеть разорванную пару. Обращение может назвать всю пару, 32-битное слово, любую из 16-битных половин или один из четырёх байтов.
Записи, ожидания и метки времени
Запись — это сохранение, побитовое OR, AND с дополнением, XOR или сложение с обёртыванием, применённое к выбранному полю. Ожидание сравнивает это поле с опорным значением под маской. Сравнения — это равно, больше, меньше, не равно, достигнутое значение последовательности и знаковые формы больше и меньше. Сравнения последовательности сдвигают знаковый бит поля на бит 63, поэтому одно и то же правило работает для 8, 16, 32 и 64 бит.
Ожидание, которое уже выполнено, завершается на месте. Ожидание, которое не выполнено, сохраняет снимок подачи и возобновляется раньше более поздних записей и событий этого потока, в том числе когда более поздняя подача на том же гостевом потоке даёт нужное значение. Обычный API и API _04_00 имеют раздельные списки аргументов. Метки времени записываются вместе с командами счётчиков. Запросы размера завершения, которые игры импортировали, зарегистрированы, поэтому эти вызовы разрешаются.
Что на этом пути уже наблюдалось
22 точечных теста AMPR проходят в ReleaseSafe, включая вызовы через настоящую поверхность экспорта. При запуске Grand Theft Auto III выполняется более 10000 подач чтения файлов APR и записывается более 350 событий завершения AMPR, и на этом пути нет совпавшей ошибки AMPR. Сам этот запуск не вызывает API счётчиков. Работа счётчиков покрыта тестами и играми, которые действительно ждут значений.
Это покрытие API для команд, которые исполняет эмулятор. Это не потактовая модель контроллера памяти консоли, и временные характеристики аппаратуры не заявляются.
Что реализовано
- 128 счётчиков с согласованными 64-битными парами и полями байта, половины и слова.
- Запись, OR, AND с дополнением, XOR и сложение с обёртыванием, а также маскированные и знаковые ожидания.
- Заблокированные ожидания, которые сохраняют место в потоке команд и возобновляются, когда приходит значение.
- Упорядоченное завершение, доставляемое через зарегистрированную очередь событий AMPR.
Чего ещё нет
- WaitOnAddress остаётся заглушкой.
- Временные характеристики настоящего блока AMPR не воспроизводятся.
- Команда счётчика, которую декодер не узнаёт, молча не считается успехом.
Связанные механизмы
Чему посвящены эти страницы