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의 시작 과정은 APR 파일 읽기 제출을 10,000회 넘게 수행하고 AMPR 완료 이벤트를 350개 넘게 쓰며, 이 경로에서 일치하는 AMPR 오류는 없습니다. 그 시작 과정 자체는 카운터 API를 호출하지 않습니다. 카운터 작업은 테스트와, 실제로 값을 기다리는 타이틀이 다룹니다.
이는 에뮬레이터가 실행하는 명령에 대한 API 지원 범위입니다. 콘솔 메모리 컨트롤러의 사이클 단위 모델이 아니며, 하드웨어의 타이밍을 재현한다고 주장하지 않습니다.
구현된 것
- 일관된 64비트 쌍과 바이트, 절반, 워드 필드를 갖춘 카운터 128개.
- 저장, OR, 보수 AND, XOR, 감싸는 덧셈, 그리고 마스크 대기와 부호 있는 대기.
- 명령 스트림 안의 자리를 지키다가 값이 도착하면 재개하는 차단 대기.
- 등록된 AMPR 이벤트 큐로 전달되는 순서 있는 완료.
아직 빠진 것
- WaitOnAddress는 아직 자리 표시자입니다.
- 실제 AMPR 블록의 하드웨어 타이밍은 재현하지 않습니다.
- 디코더가 알아보지 못한 카운터 명령을 조용히 성공으로 처리하지 않습니다.
관련 메커니즘
이 페이지들에 대하여