Este proyecto es educativo y Open Source. No se copia código de otros emuladores. Implementación basada únicamente en documentación técnica y tests permitidas.
WRAM Writer Profiler
Resumen
El análisis del Step 0245 reveló un resultado desconcertante: cero actividad detectada. Esto contradice parcialmente al Step 0244 (que sí vio escrituras de `0xFD`), lo que sugiere que el emulador puede estar entrando en el bucle de espera antes de llegar a la escritura, o que el script de análisis filtró demasiado.
La conclusión neta es que el juego NO usa DMA (`FF46`) ni lee la HRAM (`FF8D`) para copiarla. Sin embargo, el juego BUSCA datos en WRAM y se cuelga porque está vacía.
Este Step implementa un profiler de escrituras en WRAM que registra las primeras 100 escrituras en el rango `0xC000-0xDFFF` para determinar si la memoria se está inicializando siquiera, o si permanece completamente virgen (solo ceros).
Concepto de Hardware
La Work RAM (WRAM) del Game Boy es una región de memoria de 8KB ubicada en el rango `0xC000-0xDFFF`. Esta memoria es utilizada por los juegos para almacenar variables de estado, buffers temporales, y datos de trabajo durante la ejecución.
Durante el arranque de un juego, típicamente ocurre una rutina de inicialización que copia datos desde el cartucho (ROM) hacia la WRAM. Esta rutina puede ser:
- Rutina de copia masiva (memcpy): Mueve bloques de datos desde la ROM hacia la WRAM.
- Rutina de inicialización de variables: Escribe valores específicos en direcciones concretas de la WRAM.
- Rutina de limpieza: Llena la WRAM con ceros o valores por defecto.
Si la WRAM permanece vacía (llena de ceros), significa que esa rutina de copia nunca ocurrió o escribió ceros. Esto puede deberse a:
- El Program Counter (PC) tomó un camino erróneo antes de llegar al `CALL` de copia.
- La rutina de inicialización falló silenciosamente.
- El emulador se saltó completamente la fase de inicialización de memoria.
Fuente: Pan Docs - "Memory Map", "Work RAM (WRAM)"
Implementación
Se implementa un profiler de escrituras en WRAM que registra las primeras 100 escrituras en el rango `0xC000-0xDFFF`. Este profiler nos permitirá determinar:
- Escenario A (Silencio Total): No se detectan escrituras en WRAM. Diagnóstico: La CPU se salta la inicialización. El `PC` toma un camino erróneo antes de llegar al `CALL` de copia.
- Escenario B (Escrituras detectadas): Se detectan escrituras en WRAM. Análisis: Si los valores son todo `00`, es una rutina de limpieza (`XOR A`). Si los valores son variados (`12`, `F0`, `FD`), es una rutina de copia de datos.
Componentes creados/modificados
src/core/cpp/MMU.cpp: Añadido bloque de instrumentación en `MMU::write` para registrar las primeras 100 escrituras en WRAM. Se eliminó la instrumentación de los Steps 0244 y 0245 para limpiar el ruido.
Decisiones de diseño
Límite de 100 escrituras: Se limita el registro a las primeras 100 escrituras para evitar saturar la salida de la consola y mantener el rendimiento del emulador. Este número es suficiente para determinar si la memoria se está inicializando o permanece virgen.
Rango WRAM (0xC000-0xDFFF): Se filtra por dirección lógica, incluyendo Echo RAM si se redirige, pero el filtro se aplica antes de la redirección para mantener la coherencia.
Limpieza de instrumentación anterior: Se eliminaron los bloques de instrumentación de los Steps 0244 y 0245 para reducir el ruido en los logs y facilitar el análisis de los resultados.
Archivos Afectados
src/core/cpp/MMU.cpp- Añadido profiler de escrituras en WRAM (Step 0246). Eliminada instrumentación de Steps 0244 y 0245.
Tests y Verificación
La verificación se realiza mediante ejecución del emulador y observación de la salida de la consola:
- Recompilación:
.\rebuild_cpp.ps1 - Ejecución:
python main.py roms/tetris.gb - Observación: Se observa la consola para detectar mensajes
[WRAM-WRITE]
Resultados esperados:
- Escenario A (Silencio Total): No se ven mensajes
[WRAM-WRITE]. Esto confirma que la CPU se salta la inicialización. - Escenario B (Escrituras detectadas): Se ven mensajes
[WRAM-WRITE #N]con direcciones y valores. Esto confirma que la memoria se está inicializando, pero necesitamos analizar los valores para determinar si son datos válidos o ceros.
Validación de módulo compilado C++: El profiler está implementado directamente en el código C++ de la MMU, por lo que requiere recompilación para activarse. La instrumentación se ejecuta en el bucle crítico de escritura de memoria, por lo que debe ser eficiente para no degradar el rendimiento del emulador.
Fuentes Consultadas
- Pan Docs: Memory Map - Sección "Work RAM (WRAM)"
- Pan Docs: Memory Map - Sección "Echo RAM"
Integridad Educativa
Lo que Entiendo Ahora
- Rutina de inicialización de memoria: Los juegos de Game Boy típicamente ejecutan una rutina de inicialización que copia datos desde la ROM hacia la WRAM al inicio de la ejecución. Si esta rutina no se ejecuta, la WRAM permanece vacía y el juego puede colgarse buscando datos que nunca existieron.
- Profiling de memoria: Instrumentar las escrituras en memoria es una técnica efectiva para diagnosticar problemas de inicialización. Al registrar las primeras escrituras, podemos determinar si la memoria se está inicializando o permanece virgen.
Lo que Falta Confirmar
- Resultados del profiler: Necesitamos ejecutar el emulador y observar si se detectan escrituras en WRAM. Si no se detectan, confirmaremos que la CPU se salta la inicialización. Si se detectan, analizaremos los valores para determinar si son datos válidos o ceros.
- Ruta de ejecución del PC: Si no se detectan escrituras, necesitaremos rastrear el Program Counter para determinar por qué la rutina de inicialización no se ejecuta.
Hipótesis y Suposiciones
Hipótesis principal: El juego debería estar ejecutando una rutina de copia masiva (tipo `memcpy`) que mueve bloques de datos desde el Cartucho (ROM) hacia la RAM de trabajo (WRAM) al inicio. Si la WRAM está vacía, significa que esa rutina de copia nunca ocurrió o escribió ceros.
Suposición: Asumimos que el límite de 100 escrituras es suficiente para determinar si la memoria se está inicializando. Si el juego escribe más de 100 veces en WRAM durante la inicialización, perderemos información, pero las primeras 100 escrituras deberían ser suficientes para diagnosticar el problema.
Próximos Pasos
- [ ] Ejecutar el emulador y observar la salida del profiler de WRAM
- [ ] Analizar los resultados: ¿Se detectan escrituras? ¿Qué valores se escriben?
- [ ] Si no se detectan escrituras: Rastrear el Program Counter para determinar por qué la rutina de inicialización no se ejecuta
- [ ] Si se detectan escrituras pero son ceros: Investigar por qué la rutina de copia escribe ceros en lugar de datos válidos
- [ ] Si se detectan escrituras con valores variados: Confirmar que la memoria se está inicializando correctamente y buscar el problema en otra parte