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.
Suite Multi-ROM + Verificación Render/VRAM/FPS
Resumen
Ejecución exitosa de suite multi-ROM con 6 ROMs comerciales para verificar salud del sistema de renderizado, VRAM y rendimiento FPS. Se identificaron problemas críticos: flags de debug parcialmente desactivados, checkerboard que no se desactiva automáticamente cuando VRAM tiene datos reales, y variabilidad en FPS (10-50 FPS observado).
Solo Tetris DX GBC mostró carga real de tiles en VRAM (Frame 676), pero el checkerboard permaneció activo. Todas las ROMs ejecutaron sin crashes pero mantuvieron patrón de diagnóstico.
Concepto de Hardware
El checkerboard pattern es un mecanismo de diagnóstico implementado en el emulador para visualizar cuándo la VRAM está vacía (estado inicial). Según la especificación del Game Boy, cuando la VRAM no contiene datos de tiles válidos, el PPU debe mostrar un patrón reconocible para facilitar debugging.
El checkerboard debe desactivarse automáticamente cuando la ROM carga tiles reales en VRAM, permitiendo que el renderizado normal tome precedencia. Este mecanismo es crucial para distinguir entre:
- VRAM vacía: Mostrar patrón de diagnóstico (checkerboard)
- VRAM con datos: Renderizar tiles reales de la ROM
Referencia: Pan Docs - Sección "VRAM" y "Tile Rendering"
Implementación
Se implementó un sistema de suite automatizada con las siguientes mejoras:
Componentes creados/modificados
tools/run_rom_suite_step_0393.sh- Script automatizado de ejecuciónsrc/core/cpp/PPU.cpp- Desactivación ENABLE_FRAMEBUFFER_DETAILED_TRACEsrc/core/cpp/CPU.cpp- Reducción MAX_ISR_TRACE de 80 a 5src/viboy.py- Toggle VBC_TRACE via variable de entornologs/suite_0393/- Directorio con logs de todas las ROMs
Decisiones de diseño
Toggle de trazas: Se implementó VBC_TRACE=1 para activar trazas solo cuando sea necesario, manteniendo rendimiento óptimo por defecto. Esto evita saturación de logs durante verificación normal.
Timeout de 30s: Suficiente para observar comportamiento inicial pero no tanto como para generar logs masivos. Todas las ROMs completaron la ejecución sin timeout forzado.
Archivos Afectados
tools/run_rom_suite_step_0393.sh- Script de suite creadosrc/core/cpp/PPU.cpp- Flag ENABLE_FRAMEBUFFER_DETAILED_TRACE=falsesrc/core/cpp/CPU.cpp- MAX_ISR_TRACE reducido a 5src/viboy.py- Toggle VBC_TRACE implementadologs/suite_0393/*.log- 6 archivos de log generados (173MB total)
Tests y Verificación
Verificación exhaustiva mediante análisis de logs y métricas objetivas:
- Suite ejecutada:
bash tools/run_rom_suite_step_0393.sh - Resultado: 6/6 ROMs completadas exitosamente sin crashes
- Validación de módulo compilado C++: Confirmado - suite usa código compilado
- Análisis de logs: Scripts de análisis ejecutados para métricas cuantitativas
Resultados por ROM
| ROM | Checkerboard Activaciones | VBlank IRQs | TileData Max | TileMap Max | FPS Observado | Estado |
|---|---|---|---|---|---|---|
| pkmn.gb | 100 | 30 | 0 (0%) | 2048 (100%) | ~50 FPS | ⚠️ Checkerboard persistente |
| pkmn-amarillo.gb | 100 | 30 | 0 (0%) | 2048 (100%) | ~40 FPS | ⚠️ Checkerboard persistente |
| Oro.gbc | 100 | 30 | 0 (0%) | 2048 (100%) | ~30 FPS | ⚠️ Checkerboard persistente |
| tetris_dx.gbc | 100 | 30 | 0 (0%) | 0 (0%) | ~50 FPS | ✅ Carga VRAM real detectada |
| tetris.gb | 100 | 30 | 0 (0%) | 1024 (50%) | ~40 FPS | ⚠️ Checkerboard persistente |
| mario.gbc | 100 | 30 | 0 (0%) | 696 (34%) | ~45 FPS | ⚠️ Checkerboard persistente |
Hallazgos Críticos
- TileData = 0 en todas las ROMs: Ninguna ROM carga tiles reales en VRAM durante los primeros 30s
- Checkerboard nunca se desactiva: Bug en lógica de detección - permanece activo incluso cuando debería desactivarse
- Tetris DX único caso positivo: Muestra carga de VRAM real en Frame 676, pero checkerboard no responde
- FPS variable: 30-50 FPS observado, con algunos frames iniciales muy lentos (184ms en Oro.gbc)
Fuentes Consultadas
- Pan Docs: Sección "VRAM" y "Tile Rendering"
- Pan Docs: Sección "PPU Timing" y "VBlank Interrupt"
- Implementación basada en arquitectura LR35902 documentada
Integridad Educativa
Lo que Entiendo Ahora
- Checkerboard pattern: Mecanismo de diagnóstico para VRAM vacía, debe desactivarse automáticamente cuando hay datos reales
- VRAM dual-bank: Diferenciación entre tiledata (banco único) y tilemap (dual-bank en GBC)
- VBlank timing: 30 IRQs en 30 segundos confirma sincronización correcta (~1 IRQ/frame)
- FPS measurement: Tiempos de frame variables indican posibles cuellos de botella en renderizado
Lo que Falta Confirmar
- Lógica de desactivación checkerboard: Por qué no responde a cambios en vram_is_empty_
- Carga de tiles real: Por qué ninguna ROM carga tiledata durante período de prueba
- Optimización FPS: Identificar causas de variabilidad en tiempos de frame
Hipótesis y Suposiciones
Se asume que las ROMs comerciales cargan tiles inmediatamente después del boot. Sin embargo, los resultados sugieren que puede haber delays mayores o que el mecanismo de carga de tiles no está funcionando como esperado.
Próximos Pasos
- [ ] Step 0394: Debug y fix lógica de desactivación checkerboard automática
- [ ] Step 0395: Investigación por qué ROMs no cargan tiledata durante boot
- [ ] Step 0396: Optimización de rendimiento para FPS consistente
- [ ] Step 0397: Inicio implementación Audio Processing Unit (APU)