Saltar al contenido
PS5PCEM

Implementación

Cómo funciona PS5PCEM

Cada página es un mecanismo que el emulador realmente ejecuta: qué hace la consola, qué hace el código Zig y qué falta todavía.

Notas del repositorio hasta el 17 de octubre de 2026

Firmware y HLE

HLE es la forma en que PS5PCEM responde a las llamadas de firmware que importa un título. Cada NID numérico se convierte en una función de Zig sobre una pila del anfitrión, y en Windows se conserva la convención de llamada System V del invitado.

Cómo funciona

AMPR en PS5PCEM es un modelo en software, local al proceso, de los comandos de contador y de finalización de la consola. Ciento veintiocho contadores aceptan stores, actualizaciones atómicas de campo, lecturas emparejadas y esperas enmascaradas, en el orden de envío.

Cómo funciona

APR resuelve un archivo del título una vez y después lleva un identificador local al proceso en los búferes de comandos posteriores. Las lecturas diferidas de AMPR reabren ese mismo archivo de solo lectura de /app0 sin conservar un descriptor del anfitrión para siempre.

Cómo funciona

Las direcciones del invitado son direcciones reales del anfitrión. La memoria directa es un pool físico compartido y disperso mapeado en ese espacio, y MemoryPool añade reserva, confirmación y operaciones por lotes sobre el mismo respaldo.

Cómo funciona

Una ranura de partida montada se convierte en un /savedata0 con escritura. El título usa la API de archivos ordinaria, y el siguiente arranque encuentra los mismos archivos bajo el código de producto que publica el título.

Cómo funciona

libSceFont rasteriza caras TrueType y OpenType aportadas por el título con FreeType. Las peticiones de fuente del sistema usan el sustituto Noto Sans incluido para latino, griego y cirílico.

Cómo funciona

El codificador PNG escribe archivos RGB o RGBA de 8 bits a partir de píxeles RGBA o BGRA con pitch. El descodificador lee imágenes no entrelazadas en escala de grises, paleta, RGB y RGBA hacia un búfer del invitado comprobado.

Cómo funciona

RTC comprueba los campos de calendario, convierte FILETIME de Windows y hace aritmética comprobada sobre ticks. El invitado ve un reloj coherente sin la conversión de horario de verano del anfitrión.

Cómo funciona

En Windows, cada fibra de libSceFiber es una fibra real de Windows, de modo que un cambio conserva los registros del invitado y la pila del invitado. Los hilos de nivel de usuario arrancan por la misma ruta pthread.

Cómo funciona

Gráficos

Un título de PS5 construye paquetes de GPU en su propia memoria y envía el búfer. PS5PCEM descodifica ese flujo PM4, conserva el estado de los registros y ejecuta dibujos y despachos en orden.

Cómo funciona

Los shaders de PlayStation 5 son código de máquina RDNA2. PS5PCEM descodifica las familias GFX10, construye un grafo de flujo de control y rebaja las operaciones admitidas a SPIR-V 1.5 para Vulkan.

Cómo funciona

Los programas de vértice NGG fusionados, incluido un fetch shader que continúa con S_SETPC_B64, se traducen como una sola etapa de gráficos. El programa de exportación conserva su propia ventana de user-data.

Cómo funciona

IMAGE_LOAD_BY2, BY4, PCK2 y PCK4, incluidas las formas con mip explícito, se ejecutan para los formatos 2D nativos medidos. Una carga BY devuelve texels consecutivos. Una carga PCK empaqueta sus bits en crudo en un registro.

Cómo funciona

IMAGE_GATHER4H e IMAGE_GATHER4H_PCK reúnen un canal a lo largo de un grupo horizontal de texels. El subconjunto directo 1D y 2D medido está cubierto por 1,242 despachos de GPU.

Cómo funciona

S_SWAPPC_B64 y S_CALL_B64 guardan una dirección de retorno completa y ejecutan una subrutina local acotada, incluido un llamado que queda después de ENDPGM. Un fetch shader de AGC verificado puede enlazarse del mismo modo.

Cómo funciona

El backend de Vulkan carga el controlador en tiempo de ejecución, exige Vulkan 1.2 y presenta los fotogramas del invitado a través de un swapchain. Los destinos de render, las imágenes de almacenamiento y los pipelines permanecen residentes entre dibujos.

Cómo funciona

Un renderizador nativo y experimental para Windows añadido después de la 0.3.5. Comparte con Vulkan el decodificador PM4 y la traducción de shaders RDNA2, y después ejecuta y presenta mediante D3D12 y DXGI. Vulkan sigue siendo el predeterminado y los juegos todavía no pasan por esta ruta.

Cómo funciona

MSAA

Parcial

Los recuentos de muestras de color y de profundidad coincidentes de 2×, 4× y 8× permanecen en la imagen del anfitrión hasta una resolución posterior. Asterix usa esa ruta para la profundidad y el stencil MSAA, lo que eliminó una lectura de vuelta accidental y grande.

Cómo funciona

HTILE, DCC, CMASK y FMASK son los metadatos comprimidos de profundidad y de color de la consola. PS5PCEM sigue los punteros, limpia HTILE en los casos que entiende y rechaza un layout que, de otro modo, desentramaría de forma incorrecta.

Cómo funciona

Las texturas de PS5 se almacenan en patrones de swizzle GFX10, no en filas lineales. PS5PCEM aplica las ecuaciones de dirección en la CPU, y en la GPU para las superficies grandes de 4, 8 y 16 bytes que cumplen las condiciones.

Cómo funciona

El rastreador de páginas, de activación explícita, vigila páginas invitadas de 16 KiB. La primera escritura nativa de la CPU provoca un fallo, avanza una generación e invalida la copia de la GPU para que las páginas sin cambios no se hasheen ni se suban en cada fotograma.

Cómo funciona

VideoOut

Funciona

VideoOut registra los búferes de presentación del invitado y completa un flip solo después de que el callback de presentación ha aceptado el fotograma. La ventana del anfitrión es un swapchain de Vulkan a 1080p SDR.

Cómo funciona

Audio y vídeo

AudioOut

Funciona

AudioOut reproduce PCM del invitado en un dispositivo de Windows a 48 kHz. Los puertos heredados tienen sus propios flujos y colas, de modo que la música y los efectos suenan juntos, y un underrun conserva el orden de las muestras.

Cómo funciona

La convolución ACM ejecuta en la CPU la reverberación particionada de FMOD. Los lotes de entrada compartida transforman una señal seca, aplican particiones de impulso en float o half-float y hacen overlap-add del resultado húmedo.

Cómo funciona

AJM descodifica ATRAC9, MP3, AAC de MPEG-4 y Opus. Cada instancia de códec conserva su propio estado, y un códec desconocido se rechaza en lugar de informarse como un éxito silencioso.

Cómo funciona

NGS2

Parcial

NGS2 conserva handles de sistema, de rack y de voz, analiza datos RIFF/WAVE ordinarios y marca el ritmo de un grano silencioso de 48 kHz para que un worker de DSP en software no pueda girar. La síntesis de voz en sí está incompleta.

Cómo funciona

AvPlayer

Funciona

SceAvPlayer descodifica contenedores de película con FFmpeg hacia fotogramas NV12 que posee el título y PCM estéreo de 48 kHz. La reproducción termina cuando pasa la duración de la fuente, aunque el título nunca lea uno de los flujos.

Cómo funciona

CPU, cargador y herramientas

En Windows x86-64 el código de máquina del invitado se ejecuta de forma directa. Un worker del anfitrión lleva cada pthread invitado, y la base de FS se restaura después de cada llamada bloqueante porque Windows no la conserva.

Cómo funciona

El cargador mapea módulos SELF de PS5 descifrados y ELF64 desnudos, aplica reubicaciones y resuelve las importaciones contra el registro HLE. El título recibe después handles estables para los módulos que él mismo arranca.

Cómo funciona

DualSense, DualSense Edge y DualShock 4 se leen por HID, en USB y Bluetooth. Los mandos compatibles con Xbox usan XInput. El teclado se asigna a los sticks mediante un perfil del lanzador.

Cómo funciona

pkgextractor desempaqueta los diseños FPKG de depuración observados en el desarrollo: el paquete exterior, el PFS interno, los mapas de nombres NAPS y las cargas útiles comprimidas con Kraken. Los paquetes comerciales cifrados quedan fuera de alcance.

Cómo funciona

Qué describen estas páginas

El texto sigue las notas de arquitectura y los informes de octubre de 2026 del repositorio PS5PCEM. Un test concreto que pasa no es una tasa de fotogramas nueva ni una partida terminada nueva.