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.
Paciencia y Puntería: Buscando en el Mapa Correcto
Resumen
La autopsia anterior mostró que la CPU avanza (salió del bucle de arranque) y que el Timer funciona. Sin embargo, el LCD sigue apagado. Observamos que `LCDC` tiene el Bit 3 activado, lo que indica que el juego usa el segundo mapa de tiles (`0x9C00`), no el primero (`0x9800`) que estábamos inspeccionando. Ajustamos la autopsia para leer el mapa correcto según la configuración del juego y aumentamos el tiempo de espera a 10 segundos para descartar lentitud en la carga.
Concepto de Hardware
El registro LCDC (LCDC Control, dirección 0xFF40) controla múltiples aspectos del sistema de vídeo de la Game Boy. El Bit 3 de este registro determina qué región de VRAM se usa como mapa de tiles (Tile Map) para el fondo (Background):
- Bit 3 = 0: Tile Map Base = 0x9800 (rango 0x9800-0x9BFF)
- Bit 3 = 1: Tile Map Base = 0x9C00 (rango 0x9C00-0x9FFF)
Si el juego configura el Bit 3 en 1 y escribe datos en el mapa 0x9C00, pero nuestra herramienta de diagnóstico lee siempre desde 0x9800, veremos datos vacíos aunque el juego haya escrito correctamente en la región correcta. Esto es un error clásico de diagnóstico: inspeccionar la región de memoria incorrecta.
Fuente: Pan Docs - LCD Control Register (LCDC), Tile Map Addressing
Implementación
Se modificó la función de autopsia en `viboy.py` para:
- Leer LCDC dinámicamente: Antes de inspeccionar el Tile Map, leemos el registro LCDC (0xFF40) y verificamos el Bit 3.
- Seleccionar el mapa correcto: Si Bit 3 está activo, leemos desde 0x9C00; si no, desde 0x9800.
- Aumentar tiempo de espera: Cambiamos el trigger de la autopsia de 180 frames (3 segundos) a 600 frames (10 segundos) para dar más tiempo al juego a completar su inicialización.
Componentes modificados
src/viboy.py: Función de autopsia mejorada con lectura inteligente del Tile Map
Cambios específicos
# Antes (Step 0225):
if not self._autopsy_done and self.frame_count >= 180:
# ...
print(f"\nVRAM Tile Map (0x9900 - Centro aprox):")
map_sample = [f"{self._mmu.read(0x9900 + i):02X}" for i in range(16)]
# Después (Step 0234):
if not self._autopsy_done and self.frame_count >= 600:
# ...
lcdc = self._mmu.read(0xFF40)
bg_map_base = 0x9C00 if (lcdc & 0x08) else 0x9800
print(f"\nVRAM Tile Map (Base 0x{bg_map_base:04X} - según LCDC Bit 3):")
map_sample = [f"{self._mmu.read(bg_map_base + i):02X}" for i in range(16)]
Archivos Afectados
src/viboy.py- Modificación de la función de autopsia (Step 0234)
Tests y Verificación
La verificación se realizará ejecutando el emulador y observando la salida de la autopsia:
- Comando:
python main.py roms/tetris.gb - Resultado esperado: Tras 10 segundos (600 frames), la autopsia mostrará:
- El valor de LCDC con indicación del mapa seleccionado
- Datos del Tile Map leídos desde la región correcta (0x9C00 si Bit 3 está activo)
- Estado de la CPU mostrando que el juego avanzó más allá del bucle inicial
Validación: Si el Tile Map muestra datos no nulos en la región correcta, confirmaremos que el juego está escribiendo correctamente y que el problema podría estar en el encendido de la pantalla (LCDC Bit 7) o en la renderización.
Fuentes Consultadas
- Pan Docs: LCDC Control Register
- Pan Docs: Video Display - Tile Maps
Integridad Educativa
Lo que Entiendo Ahora
- LCDC Bit 3: Controla qué región de VRAM se usa como Tile Map base. Es crítico leer esta configuración antes de inspeccionar la memoria, ya que el juego puede usar cualquiera de las dos regiones disponibles.
- Diagnóstico inteligente: Las herramientas de diagnóstico deben adaptarse al estado actual del hardware emulado, no asumir valores fijos. Esto es especialmente importante en sistemas con múltiples modos de operación o regiones de memoria alternativas.
Lo que Falta Confirmar
- Datos en el mapa correcto: Verificar si el Tile Map en 0x9C00 contiene datos válidos después de 10 segundos de ejecución.
- Estado del LCD: Confirmar si el LCDC Bit 7 (LCD Enable) se activa durante la inicialización del juego o si permanece apagado por alguna razón.
Hipótesis y Suposiciones
Hipótesis principal: El juego está escribiendo datos en el Tile Map correcto (0x9C00), pero nuestra herramienta de diagnóstico anterior leía desde la región incorrecta (0x9800), mostrando datos vacíos aunque el juego funcionara correctamente.
Suposición: Si el Tile Map muestra datos válidos en la región correcta, el problema podría estar en:
- El LCD no se enciende (LCDC Bit 7 permanece en 0)
- La renderización no está leyendo el Tile Map correcto
- El juego requiere más tiempo para completar la inicialización
Próximos Pasos
- [ ] Ejecutar el emulador y observar la autopsia tras 10 segundos
- [ ] Verificar si el Tile Map en la región correcta contiene datos
- [ ] Si hay datos pero la pantalla sigue apagada, investigar el estado de LCDC Bit 7 (LCD Enable)
- [ ] Si el LCD está encendido pero no se renderiza, verificar la lógica de renderizado de la PPU