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.
Limpieza Post-Diagnóstico: Revertir el "Test del Checkerboard"
Resumen
El "Test del Checkerboard" del Step 0202 ha sido un éxito rotundo. El patrón de tablero de ajedrez que vimos en la pantalla es la prueba irrefutable de que nuestro pipeline de renderizado C++ → Cython → Python funciona perfectamente. El diagnóstico es ahora definitivo: el problema de la pantalla en blanco se debe a que la VRAM está vacía, no a un fallo en el renderizado.
Ahora que hemos validado la tubería de datos, debemos restaurar la lógica de renderizado normal de la PPU para poder investigar por qué la VRAM permanece vacía. Este paso consiste en revertir los cambios temporales del "Test del Checkerboard" y volver a la implementación que lee desde la VRAM.
El resultado esperado es que la pantalla vuelva a ser blanca, pero esta vez con la certeza absoluta de que el problema no está en el renderizado, sino en que la CPU no está ejecutando la rutina que copia los datos del logo desde la ROM a la VRAM.
Concepto de Ingeniería: Limpieza Post-Diagnóstico
Las herramientas de diagnóstico temporales son increíblemente poderosas, pero es crucial eliminarlas una vez que han cumplido su propósito para restaurar el comportamiento normal del sistema. El "Test del Checkerboard" nos ha dado la respuesta que necesitábamos: la tubería de datos funciona. Ahora necesitamos que la PPU vuelva a intentar leer de la VRAM para poder investigar por qué esa VRAM está vacía.
El Tablero de Ajedrez: Nuestro Hito Más Importante
El patrón de tablero de ajedrez que vimos en la pantalla es, en cierto sentido, más hermoso incluso que el logo de Nintendo. No es el resultado de la emulación de un juego; es la prueba irrefutable de que nuestra arquitectura funciona. Cada cuadrado oscuro y claro que vimos es la confirmación de que:
- El framebuffer C++ se está escribiendo correctamente.
- El puntero se está pasando correctamente a través de Cython.
- El
memoryviewde Python está leyendo los datos correctamente. - Pygame está renderizando los píxeles en la pantalla.
El Diagnóstico Definitivo:
Con el "Test del Checkerboard", hemos aislado el problema con precisión quirúrgica. El diagnóstico es definitivo:
- La pantalla en blanco que veíamos se debe a que la VRAM está vacía, no a un problema de renderizado.
- El verdadero culpable es que la CPU, por alguna razón, no está ejecutando la rutina de código que copia los datos del logo de Nintendo desde la ROM a la VRAM.
- La CPU está atrapada en un bucle lógico antes de llegar a ese punto, o la rutina de copia nunca se ejecuta.
¿Por qué carga de arriba hacia abajo? Porque nuestro render_scanline() se llama para cada línea (LY de 0 a 143), dibujando el tablero progresivamente.
¿Por qué desaparece y vuelve a cargar? Porque nuestra limpieza de framebuffer sincronizada con LY=0 (Step 0200) está funcionando a la perfección. Cada vez que LY se resetea a 0 para empezar un nuevo fotograma, el framebuffer se limpia a blanco, y el tablero de ajedrez empieza a dibujarse de nuevo desde la línea 0.
Implementación
La implementación consiste en restaurar la lógica de renderizado normal de la PPU, eliminando el código del "Test del Checkerboard" y volviendo a la implementación que lee desde la VRAM.
Modificación en PPU::render_scanline()
En src/core/cpp/PPU.cpp, restauramos la lógica de renderizado de fondo original:
- Eliminamos el código del "Test del Checkerboard" que generaba el patrón de tablero de ajedrez.
- Restauramos la lógica que lee los registros LCDC, SCY, SCX.
- Restauramos el cálculo de direcciones de tilemap y tile data.
- Restauramos la lectura de IDs de tile desde el tilemap.
- Restauramos la decodificación de datos de tile desde la VRAM.
- Restauramos la escritura del índice de color en el framebuffer.
El código restaurado es similar al que teníamos antes del Step 0202, pero ahora con la certeza de que la tubería de datos funciona correctamente.
Componentes modificados
src/core/cpp/PPU.cpp: Restaurada la lógica de renderizado normal enrender_scanline().
Decisiones de diseño
La decisión de restaurar la lógica normal es obvia: el test de diagnóstico ha cumplido su propósito. Ahora necesitamos que la PPU vuelva a intentar leer de la VRAM para poder investigar por qué esa VRAM está vacía. El siguiente paso de diagnóstico será instrumentar la MMU para monitorear las escrituras en VRAM y entender por qué la CPU no está copiando los datos del logo.
Archivos Afectados
src/core/cpp/PPU.cpp- Restaurada la lógica de renderizado normal enrender_scanline()
Tests y Verificación
La verificación consiste en confirmar que volvemos al estado anterior: una pantalla en blanco, pero esta vez con la certeza de que el problema no está en el renderizado.
- Recompilación del módulo C++:
.\rebuild_cpp.ps1 - Ejecución del emulador:
python main.py roms/tetris.gb - Resultado Esperado: La pantalla debe volver a ser blanca. Esto confirmará que la PPU está intentando leer de una VRAM que, como ahora sabemos, está vacía.
Validación Nativa: Validación de módulo compilado C++.
Fuentes Consultadas
- Pan Docs: LCD Timing, Background Rendering
- Implementación basada en conocimiento general de arquitectura LR35902 y prácticas de ingeniería de software (limpieza post-diagnóstico).
Integridad Educativa
Lo que Entiendo Ahora
- Pipeline de Renderizado: El pipeline C++ → Cython → Python funciona perfectamente. El "Test del Checkerboard" lo ha confirmado de forma inequívoca.
- Diagnóstico Definitivo: El problema de la pantalla en blanco se debe a que la VRAM está vacía, no a un fallo en el renderizado.
- Limpieza Post-Diagnóstico: Es crucial eliminar las herramientas de diagnóstico temporales una vez que han cumplido su propósito para restaurar el comportamiento normal del sistema.
Lo que Falta Confirmar
- Por qué la VRAM está vacía: Necesitamos instrumentar la MMU para monitorear las escrituras en VRAM y entender por qué la CPU no está copiando los datos del logo desde la ROM.
- Rutina de copia del logo: Necesitamos verificar si la CPU está ejecutando la rutina que copia los datos del logo, o si está atrapada en un bucle antes de llegar a ese punto.
Hipótesis y Suposiciones
Suponemos que la CPU no está ejecutando la rutina de copia del logo, o que esa rutina nunca se ejecuta. El siguiente paso de diagnóstico será instrumentar la MMU para monitorear las escrituras en VRAM y confirmar esta hipótesis.
Próximos Pasos
- [ ] Instrumentar la MMU para monitorear las escrituras en VRAM
- [ ] Verificar si la CPU está ejecutando la rutina de copia del logo
- [ ] Entender por qué la VRAM permanece vacía