Ir para o conteúdo
PS5PCEM

Implementação

Como o PS5PCEM funciona

Cada página é um mecanismo que o emulador realmente executa: o que o console faz, o que o código Zig faz e o que ainda falta.

Notas do repositório até 17 de outubro de 2026

Firmware e HLE

HLE é como o PS5PCEM responde às chamadas de firmware que um título importa. Cada NID numérico vira uma função Zig numa pilha do anfitrião, com a convenção de chamada System V do convidado preservada no Windows.

Como funciona

O AMPR no PS5PCEM é um modelo em software, local ao processo, dos comandos de contador e de conclusão do console. Cento e vinte e oito contadores aceitam armazenamentos, atualizações atômicas de campo, leituras em par e esperas mascaradas, na ordem de envio.

Como funciona

O APR resolve um arquivo do título uma vez e depois carrega um identificador local ao processo nos buffers de comando seguintes. Leituras AMPR adiadas reabrem esse mesmo arquivo /app0 somente leitura sem manter um descritor do anfitrião para sempre.

Como funciona

Endereços convidados são endereços reais do anfitrião. A memória direta é um pool físico compartilhado e esparso mapeado nesse espaço, e o MemoryPool acrescenta reserva, commit e operações em lote sobre o mesmo suporte.

Como funciona

Savedata

Funciona

Um slot de save montado vira um /savedata0 gravável. O título usa a API de arquivo comum, e a execução seguinte encontra os mesmos arquivos sob o código de produto que o título publica.

Como funciona

A libSceFont rasteriza faces TrueType e OpenType fornecidas pelo título com FreeType. Pedidos de fonte do sistema usam o substituto Noto Sans incluído para latim, grego e cirílico.

Como funciona

O codificador de PNG escreve arquivos RGB ou RGBA de 8 bits a partir de pixels RGBA ou BGRA com pitch. O decodificador lê imagens não entrelaçadas em escala de cinza, paleta, RGB e RGBA para um buffer convidado verificado.

Como funciona

O RTC verifica campos de calendário, converte FILETIME do Windows e faz aritmética verificada de ticks. O convidado vê um relógio coerente sem a conversão de horário de verão do anfitrião.

Como funciona

No Windows, cada fibra da libSceFiber é uma fibra real do Windows, então uma troca preserva os registradores convidados e a pilha convidada. Threads de nível de usuário começam pelo mesmo caminho de pthread.

Como funciona

Gráficos

Um título de PS5 monta pacotes de GPU na própria memória e envia o buffer. O PS5PCEM decodifica esse fluxo PM4, mantém o estado dos registradores e executa desenhos e dispatches em ordem.

Como funciona

Os shaders de PlayStation 5 são código de máquina RDNA2. O PS5PCEM decodifica as famílias GFX10, monta um grafo de fluxo de controle e rebaixa as operações suportadas para SPIR-V 1.5 destinado ao Vulkan.

Como funciona

Programas de vértice NGG fundidos, inclusive um shader de fetch que continua com S_SETPC_B64, são traduzidos como um único estágio de gráficos. O programa de exportação guarda a própria janela de user data.

Como funciona

IMAGE_LOAD_BY2, BY4, PCK2 e PCK4, inclusive as formas com mip explícito, executam para os formatos 2D nativos medidos. Uma carga BY devolve texels consecutivos. Uma carga PCK empacota os bits brutos deles num registrador.

Como funciona

IMAGE_GATHER4H e IMAGE_GATHER4H_PCK reúnem um canal ao longo de um grupo horizontal de texels. O subconjunto direto 1D e 2D medido é coberto por 1,242 dispatches de GPU.

Como funciona

S_SWAPPC_B64 e S_CALL_B64 salvam um endereço de retorno completo e executam uma sub-rotina local limitada, inclusive um chamado que fica depois de ENDPGM. Um shader de fetch do AGC verificado pode ser ligado do mesmo modo.

Como funciona

O backend Vulkan carrega o driver em tempo de execução, exige Vulkan 1.2 e apresenta quadros convidados por uma swapchain. Alvos de renderização, imagens de armazenamento e pipelines permanecem residentes entre desenhos.

Como funciona

Um renderizador nativo e experimental para Windows, adicionado depois da 0.3.5. Ele compartilha com o Vulkan o decodificador PM4 e a tradução de shaders RDNA2 e depois executa e apresenta por D3D12 e DXGI. O Vulkan continua sendo o padrão, e os jogos ainda não passam por esse caminho.

Como funciona

MSAA

Parcial

Contagens coincidentes de 2×, 4× e 8× amostras de cor e de profundidade permanecem na imagem do anfitrião até um resolve posterior. Asterix usa esse caminho para profundidade e stencil com MSAA, o que removeu um grande readback acidental.

Como funciona

HTILE, DCC, CMASK e FMASK são os metadados comprimidos de profundidade e de cor do console. O PS5PCEM rastreia os ponteiros, limpa o HTILE nos casos que entende e recusa um layout que, de outro modo, faria detile de forma incorreta.

Como funciona

As texturas de PS5 ficam armazenadas em padrões de swizzle GFX10, não em linhas lineares. O PS5PCEM aplica as equações de endereço na CPU e, na GPU, para as superfícies grandes de 4, 8 e 16 bytes que se qualificam.

Como funciona

O rastreador de páginas, de adesão explícita, vigia páginas convidadas de 16 KiB. O primeiro armazenamento nativo da CPU gera uma falha, avança uma geração e invalida a cópia da GPU, para que páginas inalteradas não sejam submetidas a hash e enviadas a cada quadro.

Como funciona

VideoOut

Funciona

O VideoOut registra os buffers de exibição do convidado e só conclui um flip depois que o callback de apresentação aceitou o quadro. A janela do anfitrião é uma swapchain Vulkan em 1080p SDR.

Como funciona

Áudio e vídeo

AudioOut

Funciona

O AudioOut reproduz PCM do convidado num dispositivo Windows a 48 kHz. As portas legadas têm fluxos e filas próprios, então música e efeitos tocam juntos, e um underrun preserva a ordem das amostras.

Como funciona

A convolução ACM executa na CPU a reverberação particionada do FMOD. Lotes de entrada compartilhada transformam um sinal seco, aplicam partições de impulso em float ou em meia precisão e fazem overlap-add do resultado úmido.

Como funciona

Codecs AJM

Parcial

O AJM decodifica ATRAC9, MP3, AAC MPEG-4 e Opus. Cada instância de codec guarda o próprio estado, e um codec desconhecido é rejeitado em vez de ser informado como sucesso silencioso.

Como funciona

NGS2

Parcial

O NGS2 guarda handles de sistema, de rack e de voz, analisa dados RIFF/WAVE comuns e ritma um grão silencioso de 48 kHz para que um worker de DSP em software não entre em espera ativa. A síntese de voz, em si, está incompleta.

Como funciona

AvPlayer

Funciona

O SceAvPlayer decodifica contêineres de filme com FFmpeg para quadros NV12 que pertencem ao título e para PCM estéreo de 48 kHz. A reprodução termina quando passa a duração da origem, mesmo que o título nunca leia um dos fluxos.

Como funciona

CPU, carregador e ferramentas

No Windows x86-64, o código de máquina do convidado roda diretamente. Um worker do anfitrião carrega cada pthread do convidado, e a base de FS é restaurada depois de toda chamada bloqueante porque o Windows não a conserva.

Como funciona

O carregador mapeia módulos SELF de PS5 já descriptografados e módulos ELF64 simples, aplica as relocações e resolve as importações contra o registro do HLE. O título então recebe handles estáveis para os módulos que ele mesmo inicia.

Como funciona

DualSense, DualSense Edge e DualShock 4 são lidos por HID, em USB e em Bluetooth. Controles compatíveis com Xbox usam XInput. O teclado é mapeado para os analógicos por um perfil do lançador.

Como funciona

O pkgextractor desempacota os layouts FPKG de depuração observados no desenvolvimento: o pacote externo, o PFS interno, os mapas de nomes NAPS e os payloads comprimidos com Kraken. Pacotes de varejo criptografados estão fora do escopo.

Como funciona

O que estas páginas descrevem

O texto segue as notas de arquitetura e os relatórios de outubro de 2026 no repositório do PS5PCEM. Um teste pontual que passa não é uma nova taxa de quadros nem uma nova conclusão de jogo.