⚠️ Clean-Room / Educativo

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.

El Estetoscopio: Signos Vitales del Emulador

Fecha: 2025-12-22 Step ID: 0222 Estado: Draft

Resumen

Tras la limpieza final del código, la pantalla aparece verde (vacía), lo que técnicamente es correcto pero funcionalmente decepcionante. Para diagnosticar por qué el juego no muestra gráficos sin recurrir a logs masivos que saturan el buffer, implementamos un monitor de estado en Python que imprime signos vitales (PC, LCDC, VRAM) una vez por segundo. Este "estetoscopio" nos revelará si la CPU está atascada, si el hardware gráfico no está configurado, o si los gráficos simplemente no se han copiado aún.

Concepto de Hardware

En un emulador, cuando la pantalla aparece completamente verde (Color 0 de la paleta), significa que el renderizador funciona correctamente (dibuja el color de fondo) y la PPU funciona (envía índices 0), pero el problema es que la PPU solo envía ceros. Esto puede ocurrir por tres razones principales:

  1. LCDC Bit 0 apagado: El juego aún no ha activado el fondo mediante el registro LCDC (0xFF40). El bit 0 de LCDC controla si el fondo está habilitado.
  2. VRAM vacía: El juego no ha copiado los gráficos desde la ROM a la VRAM (0x8000-0x9FFF). Los tiles deben estar en la VRAM antes de poder ser renderizados.
  3. TileMap vacío: El juego no ha configurado el TileMap (0x9800-0x9BFF) para indicar qué tile dibujar en cada posición de la pantalla.

Sin logs masivos, es imposible saber si la CPU está ejecutando código, si está en un bucle infinito, o si simplemente está esperando algo. El "estetoscopio" es una sonda no intrusiva que imprime información clave cada 60 frames (1 segundo) sin afectar el rendimiento, permitiéndonos diagnosticar el estado del emulador en tiempo real.

Implementación

Se añadió un bloque de diagnóstico en el método run() de viboy.py que se ejecuta cada 60 frames (aproximadamente 1 segundo). Este diagnóstico lee directamente del hardware los siguientes signos vitales:

  • PC (Program Counter): Dirección de memoria donde está ejecutándose la CPU. Si no cambia, la CPU está atascada en un bucle infinito.
  • LCDC (0xFF40): Registro de control de la LCD. El bit 0 indica si el fondo está habilitado. Si es 0x80 o 0x90 (bit 0 apagado), el juego ha desactivado el fondo.
  • TileMap[0x9904]: Un byte del TileMap donde debería estar el logo de Nintendo. Si es 0x00, el TileMap está vacío y el juego no ha configurado qué tiles dibujar.
  • TileData[0x8010]: Un byte de los datos de tiles donde debería estar parte del logo. Si es 0x00, la VRAM está vacía y el juego no ha copiado los gráficos.

Componentes modificados

  • src/viboy.py: Añadido bloque de diagnóstico en el método run() dentro del bucle principal, ejecutándose cada 60 frames.

Decisiones de diseño

Se eligió imprimir cada 60 frames (1 segundo) para balancear la utilidad del diagnóstico con el impacto en el rendimiento. Un diagnóstico más frecuente saturaría la consola, mientras que uno menos frecuente no capturaría cambios rápidos. El diagnóstico se ejecuta solo cuando se usa el core C++ (modo principal), con un fallback para el modo Python.

Se eligieron direcciones específicas (0x9904 para TileMap y 0x8010 para TileData) porque son ubicaciones típicas donde el logo de Nintendo se almacena durante el boot. Sin embargo, estos valores son solo indicativos; el diagnóstico principal es el PC y el LCDC.

Archivos Afectados

  • src/viboy.py - Añadido bloque de diagnóstico "El Estetoscopio" en el método run() (líneas ~819-840)

Tests y Verificación

Para validar el diagnóstico, ejecutar el emulador y observar la salida de la consola:

python main.py roms/tetris.gb

Cada segundo aparecerá una línea con el formato:

[VITAL] PC: 02B4 | LCDC: 91 | Map[9904]: 00 | Data[8010]: 00

Análisis de resultados:

  • Caso A (PC estático): Si el PC no cambia entre líneas, la CPU está en un bucle infinito (deadlock lógico).
  • Caso B (LCDC apagado): Si LCDC es 0x90 o 0x80 (bit 0 apagado), el juego ha desactivado el fondo explícitamente y espera algo para encenderlo.
  • Caso C (VRAM vacía): Si Map[9904] y Data[8010] son 0x00, la CPU corre pero NO ha copiado los gráficos a la VRAM.

Este diagnóstico nos permitirá identificar rápidamente el problema sin necesidad de activar logs masivos que saturan el buffer y rompen la conexión con el servidor de IA.

Fuentes Consultadas

Integridad Educativa

Lo que Entiendo Ahora

  • Diagnóstico no intrusivo: Un monitor de estado periódico puede proporcionar información valiosa sin afectar el rendimiento ni saturar los logs.
  • Signos vitales del emulador: El PC, LCDC y VRAM son indicadores clave del estado del sistema. Si el PC no cambia, la CPU está atascada. Si LCDC tiene el bit 0 apagado, el fondo está deshabilitado. Si la VRAM está vacía, los gráficos no se han copiado.
  • Balance entre diagnóstico y rendimiento: Imprimir cada 60 frames (1 segundo) proporciona suficiente información sin saturar la consola.

Lo que Falta Confirmar

  • Valores esperados: Necesitamos ejecutar el emulador y observar qué valores muestra el diagnóstico para determinar si la CPU está corriendo, si el LCDC está configurado, y si la VRAM contiene datos.
  • Comportamiento del juego: Una vez que tengamos los valores del diagnóstico, podremos determinar si el problema es un deadlock, una configuración incorrecta del hardware, o simplemente que el juego aún no ha copiado los gráficos.

Hipótesis y Suposiciones

Asumimos que las direcciones 0x9904 (TileMap) y 0x8010 (TileData) son ubicaciones típicas donde el logo de Nintendo se almacena, pero esto puede variar según el juego. El diagnóstico principal es el PC y el LCDC, que son universales.

Próximos Pasos

  • [ ] Ejecutar el emulador y observar los valores del diagnóstico
  • [ ] Analizar los valores para determinar si la CPU está corriendo, si el LCDC está configurado, y si la VRAM contiene datos
  • [ ] Basado en el análisis, implementar la corrección correspondiente (desbloquear CPU, configurar LCDC, o verificar la copia de gráficos)