⚠️ 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.

Corrección de Direccionamiento de Tiles y Verificación Visual

Fecha: 2025-12-27 Step ID: 0314 Estado: VERIFIED

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