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.
Corrección de Direccionamiento de Tiles y Verificación Visual
Resumen
Corrección del problema de direccionamiento de tiles identificado en Step 0313. El problema era que `load_test_tiles()` configuraba LCDC a 0x91 (signed addressing, tile data base = 0x9000) pero cargaba tiles en 0x8000-0x803F, causando que la PPU no encontrara los tiles.
Se corrigió LCDC a 0x99 (unsigned addressing, tile data base = 0x8000) para que coincida con donde se cargan los tiles. El módulo C++ fue recompilado con la corrección.
Concepto de Hardware
El registro LCDC (0xFF40) bit 4 controla el modo de direccionamiento de tiles:
- Bit 4 = 1 (Unsigned addressing): Tile data base = 0x8000, tile IDs 0-255
- Bit 4 = 0 (Signed addressing): Tile data base = 0x9000, tile IDs -128 a 127
Los tiles deben cargarse donde la PPU los busca según el modo de direccionamiento. Si se usan IDs de tiles 0-3 (unsigned), los tiles deben estar en 0x8000+ y LCDC bit 4 debe ser 1. Si se usa signed addressing (bit 4 = 0), la PPU busca en 0x9000+ y no encontrará tiles en 0x8000+.
Fuente: Pan Docs - "LCDC Register" (0xFF40), "Tile Data" section
Implementación
Problema Identificado
- LCDC actual: 0x91 = `10010001` en binario
- Bit 7 = 1 (LCD Enable ✅)
- Bit 4 = 0 (Signed addressing → tile data base = 0x9000 ❌)
- Bit 0 = 1 (BG Display ✅)
- Tiles cargados: 0x8000-0x803F (tiles 0-3 en unsigned addressing)
- Consecuencia: PPU busca tiles en 0x9000+ pero están en 0x8000+, no los encuentra
Corrección Aplicada
Cambio de LCDC a 0x99 = `10011001` en binario:
- Bit 7 = 1 (LCD Enable ✅)
- Bit 4 = 1 (Unsigned addressing → tile data base = 0x8000 ✅)
- Bit 0 = 1 (BG Display ✅)
Componentes Modificados
src/core/cpp/MMU.cpp(línea ~1208): Cambio de LCDC 0x91 → 0x99 en `load_test_tiles()`
Código Modificado
// --- Step 0314: Corrección de direccionamiento de tiles ---
// LCDC bit 4 = 1 para unsigned addressing (tile data base = 0x8000)
// Esto coincide con donde se cargan los tiles (0x8000-0x803F)
// Si bit 4 = 0 (signed addressing), la PPU buscaría en 0x9000+ y no encontraría los tiles
memory_[0xFF40] = 0x99; // LCD Enable (bit 7) + Unsigned addressing (bit 4) + BG Display (bit 0)
printf("[LOAD-TEST-TILES] LCDC configurado: 0x%02X -> 0x99 (Unsigned addressing + BG Display habilitado)\n", current_lcdc);
Archivos Afectados
src/core/cpp/MMU.cpp- Corrección de LCDC en load_test_tiles()CORRECCION_DIRECCIONAMIENTO_STEP_0314.md- Documentación de la corrección
Tests y Verificación
Validación de la corrección:
- Compilación: Módulo C++ recompilado exitosamente con
python setup.py build_ext --inplace - Código fuente: Verificado que LCDC se configura a 0x99 en lugar de 0x91
- Logs esperados:
[LOAD-TEST-TILES] LCDC configurado: ... -> 0x99[TILEMAP-INSPECT] BG Data Base: 8000(no 9000)
- Verificación visual: Pendiente de ejecución (ver próximos pasos)
Fuentes Consultadas
- Pan Docs: "LCDC Register" (0xFF40), sección "Tile Data"
- Pan Docs: Direccionamiento de tiles (Signed vs Unsigned)
Integridad Educativa
Lo que Entiendo Ahora
- Direccionamiento de tiles: El bit 4 de LCDC determina dónde busca la PPU los tiles (0x8000 vs 0x9000). Los tiles deben estar en la dirección correcta según este modo.
- Consistencia: Es crítico que el modo de direccionamiento (LCDC bit 4) coincida con dónde se cargan los tiles en VRAM.
Lo que Falta Confirmar
- Renderizado visual: Verificar que los tiles se muestren correctamente en pantalla después de la corrección.
- Patrones: Confirmar que se ven los patrones esperados (checkerboard, líneas horizontales, líneas verticales).
Hipótesis y Suposiciones
La corrección debería resolver el problema de pantalla blanca relacionado con direccionamiento de tiles. El FPS bajo (8.0 FPS) es un problema separado que requiere más investigación.
Próximos Pasos
- [ ] Ejecutar verificación visual del renderizado (30 segundos, observar patrón de tiles)
- [ ] Confirmar que los tiles se muestran correctamente (no pantalla blanca)
- [ ] Verificar logs de configuración (LCDC 0x99, BG Data Base 8000)
- [ ] Si funciona correctamente, documentar resultado exitoso
- [ ] Si hay problemas, investigar causa adicional
- [ ] Abordar problema de FPS bajo (8.0 FPS) en steps posteriores