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 funcionaImplementació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
Contadores AMPR
ParcialAMPR 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 funcionaAPR 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 funcionaLas 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 funcionaPartidas guardadas
FuncionaUna 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 funcionaRenderizado de fuentes
ParciallibSceFont 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 funcionaEl 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 funcionaReloj de tiempo real
ParcialRTC 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 funcionaEn 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 funcionaLa API AIO del kernel acepta un lote de lecturas y devuelve un identificador. PS5PCEM realiza el lote en el momento del envío, lo que la interfaz permite, y el título recoge un resultado ya terminado.
Cómo funcionaGrá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 funcionaShaders RDNA2 a SPIR-V
ParcialLos 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 funcionaShaders de vértice NGG
ParcialLos 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 funcionaIMAGE_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 funcionaGathers horizontales
ParcialIMAGE_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 funcionaLlamadas escalares de shader
ParcialS_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 funcionaRenderizador Vulkan
FuncionaEl 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 funcionaBackend Direct3D 12
ParcialUn 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 funcionaMSAA
ParcialLos 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 funcionaHTILE, DCC, CMASK y FMASK
ParcialHTILE, 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 funcionaDesentramado de texturas
ParcialLas 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 funcionaEl 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 funcionaVideoOut
FuncionaVideoOut 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 funcionaAudio y vídeo
AudioOut
FuncionaAudioOut 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 funcionaConvolución ACM
ParcialLa 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 funcionaCódecs AJM
ParcialAJM 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 funcionaNGS2
ParcialNGS2 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 funcionaAvPlayer
FuncionaSceAvPlayer 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 funcionaCPU, cargador y herramientas
Ejecución nativa del invitado
FuncionaEn 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 funcionaCarga de ELF y SELF
FuncionaEl 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 funcionaMandos y teclado
FuncionaDualSense, 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 funcionaExtractor de PKG
Parcialpkgextractor 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 funcionaQué describen estas páginas