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.
Tile Map Inspector
Resumen
Este Step instrumenta la PPU para inspeccionar el Tile Map que se está utilizando durante el renderizado. El Step 0262 confirmó que MBC1 funciona perfectamente y que la ROM se lee correctamente, pero la pantalla sigue vacía. La hipótesis es que hay un desajuste en la configuración de la PPU (Tile Map vs Tile Data) o que el Tile Map está vacío. Esta instrumentación nos permitirá verificar si el área de memoria que la PPU está usando como Tile Map contiene índices de tiles válidos o está completamente vacía.
Concepto de Hardware
Tile Map (Mapa de Tiles): El Tile Map es una tabla de 32x32 bytes (1024 bytes) que contiene los índices de los tiles que se deben dibujar en cada posición del fondo. La PPU lee el Tile Map para determinar qué tile dibujar en cada posición de la pantalla.
Configuración de Tile Map: El registro LCDC (0xFF40) controla qué área de VRAM se usa como Tile Map:
- Bit 3: Background Tile Map Area (`0=9800`, `1=9C00`).
- Bit 4: Background & Window Tile Data Area (`0=8800`, `1=8000`).
El problema del desajuste: Si el juego usa el mapa en `9C00` pero nosotros miramos en `9800` (o viceversa), veremos blanco. Si el juego usa tiles en `8000` pero nosotros usamos `8800` (signed), veremos basura o blanco. Si el Tile Map está completamente vacío (todos los bytes son `00`), la PPU renderizará solo el tile 0, que puede ser blanco o transparente.
La inspección del Tile Map: Para diagnosticar el problema, necesitamos verificar qué contiene realmente el Tile Map que la PPU está utilizando. Si todos los bytes son `00`, el mapa está vacío y no se ha copiado el mapa. Si hay bytes variados, el mapa tiene datos y deberíamos ver algo en pantalla.
Fuente: Pan Docs - "LCD Control (LCDC)", "Tile Map", "Tile Data"
Implementación
Se modificó el método render_scanline() de PPU.cpp para inspeccionar el Tile Map una sola vez cuando LY=100 (mitad de pantalla). El inspector muestra el valor de LCDC, la dirección base del Tile Map, la dirección base de Tile Data, y los primeros 16 bytes del Tile Map.
Componentes modificados
- PPU::render_scanline(): Añadido código de inspección que se ejecuta una sola vez cuando LY=100, mostrando la configuración de la PPU y los primeros 16 bytes del Tile Map.
- MMU.cpp: Comentados los logs de diagnóstico
[VRAM],[ROM-READ]y[MBC1]para reducir el ruido en la salida y permitir ver claramente el log del inspector.
Decisiones de diseño
Inspección única: El inspector se ejecuta una sola vez cuando LY=100 usando un flag estático map_inspected. Esto evita saturar los logs con información repetida y permite ver el estado del Tile Map después de que el juego haya tenido tiempo de inicializarse.
Información completa: El inspector muestra LCDC (para ver la configuración), las direcciones base del Tile Map y Tile Data (para verificar qué áreas se están usando), y los primeros 16 bytes del Tile Map (para ver si contiene datos o está vacío).
Limpieza de logs: Se comentaron los logs de diagnóstico anteriores ([VRAM], [ROM-READ], [MBC1]) para reducir el ruido en la salida y permitir ver claramente el log del inspector. El log crítico de [MBC1 CRITICAL] se mantiene activo para detectar errores graves.
Archivos Afectados
src/core/cpp/PPU.cpp- Modificado métodorender_scanline()para inspeccionar el Tile Map (Step 0263).src/core/cpp/MMU.cpp- Comentados logs de diagnóstico[VRAM],[ROM-READ]y[MBC1]para reducir ruido (Step 0263).
Tests y Verificación
Para validar esta instrumentación:
- Recompilar:
.\rebuild_cpp.ps1 - Ejecutar:
python main.py roms/pkmn.gb(Pokémon Red es ideal porque tiene 1024KB de ROM y necesita múltiples bancos). - Observar los logs:
- Buscar
[PPU INSPECT]- Muestra la configuración de la PPU y los primeros 16 bytes del Tile Map. - Si los bytes del mapa son todos `00`: El mapa está vacío -> No se ha copiado el mapa. El juego puede estar limpiando la VRAM antes de copiar los datos, o puede haber un problema en la lógica de copia de datos a VRAM.
- Si los bytes son variados: El mapa tiene datos -> Deberíamos ver algo en pantalla. Si la pantalla sigue vacía, el problema está en otro lado (posiblemente en el renderizado de la PPU o en la configuración de Tile Data).
- Buscar
Validación esperada: Si el Tile Map contiene datos variados pero la pantalla sigue vacía, necesitamos verificar la configuración de Tile Data (signed vs unsigned addressing) o el renderizado de la PPU. Si el Tile Map está vacío, necesitamos esperar más tiempo o verificar por qué el juego no está copiando el mapa a la VRAM.
Fuentes Consultadas
- Pan Docs: LCD Control (LCDC)
- Pan Docs: Tile Data
- Pan Docs: Tile Map
Integridad Educativa
Lo que Entiendo Ahora
- Tile Map: El Tile Map es una tabla de 32x32 bytes que contiene los índices de los tiles que se deben dibujar en cada posición del fondo. La PPU lee el Tile Map para determinar qué tile dibujar.
- Configuración de LCDC: El registro LCDC controla qué área de VRAM se usa como Tile Map (bit 3) y qué área se usa como Tile Data (bit 4). Un desajuste en esta configuración puede resultar en una pantalla vacía.
- Diagnóstico de Tile Map: Si el Tile Map está vacío (todos los bytes son `00`), la PPU renderizará solo el tile 0, que puede ser blanco o transparente. Si el Tile Map contiene datos pero la pantalla sigue vacía, el problema está en otro lado.
Lo que Falta Confirmar
- Contenido del Tile Map: ¿El Tile Map contiene índices de tiles válidos o está completamente vacío? Los logs nos dirán si el mapa tiene datos o si está vacío.
- Configuración correcta: ¿La PPU está usando la misma configuración de Tile Map y Tile Data que el juego espera? El inspector nos mostrará qué áreas se están usando.
- Correlación con renderizado: Si el Tile Map contiene datos pero la pantalla sigue vacía, ¿el problema está en el renderizado de la PPU o en la configuración de Tile Data?
Hipótesis y Suposiciones
Hipótesis principal: Si MBC1 funciona (Step 0262) y la ROM se lee correctamente, pero la pantalla sigue vacía, es posible que:
- El Tile Map está vacío: El juego puede estar limpiando la VRAM antes de copiar los datos, o puede haber un problema en la lógica de copia de datos a VRAM.
- Desajuste en la configuración: El juego puede estar usando una configuración diferente de Tile Map o Tile Data que la que la PPU está utilizando.
- Problema en el renderizado: Si el Tile Map contiene datos pero la pantalla sigue vacía, el problema está en el renderizado de la PPU o en la configuración de Tile Data.
Esta instrumentación nos permitirá distinguir entre estos casos y determinar dónde está el problema real.
Próximos Pasos
- [ ] Ejecutar
python main.py roms/pkmn.gby observar el log del inspector. - [ ] Si el Tile Map está vacío, verificar por qué el juego no está copiando el mapa a la VRAM o esperar más tiempo.
- [ ] Si el Tile Map contiene datos pero la pantalla sigue vacía, verificar la configuración de Tile Data o el renderizado de la PPU.
- [ ] Correlacionar el contenido del Tile Map con la configuración de LCDC para determinar si hay un desajuste.
- [ ] Si es necesario, instrumentar también la lectura de Tile Data para verificar si los tiles están cargados correctamente.