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

Ajuste de Coordenadas: Centrado del Logo

Fecha: 2025-12-21 Step ID: 0207 Estado: ✅ VERIFIED

Resumen

El análisis del Step 0206 reveló un error de cálculo geométrico en la posición del logo. El tilemap se colocó en la dirección `0x9A00` (Fila 16), lo que situaba el logo en el borde inferior de la pantalla, fuera del área de muestreo de los logs y difícil de ver. Corregimos la dirección del tilemap a `0x9904` (Fila 8, Columna 4), colocando el logo en el centro absoluto de la pantalla, haciéndolo visible y detectable por los logs.

Concepto de Hardware: El Mapa de Tiles (Tilemap)

La Game Boy tiene una pantalla de 20×18 tiles (160×144 píxeles). El mapa de fondo (`0x9800`) es una cuadrícula de 32×32 tiles que se extiende más allá de los límites visibles de la pantalla, permitiendo scroll y efectos de parallax.

Cálculo de direcciones en el Tilemap:

  • Base del Tilemap: `0x9800` (inicio del mapa de fondo)
  • Fila 0: `0x9800` (primeros 32 bytes, tiles 0-31)
  • Fila 8 (Centro Y): `0x9800 + (8 × 32) = 0x9900` (centro vertical de la pantalla)
  • Columna 4 (Centro X aprox): `0x9900 + 4 = 0x9904` (centro horizontal aproximado)
  • Fila 16: `0x9800 + (16 × 32) = 0x9A00` (muy cerca del borde inferior, Y=128px)

El error del Step 0206: Se calculó incorrectamente la dirección como `0x9A00`, que corresponde a la Fila 16. Esto coloca el logo en los píxeles Y=128 a 136, muy cerca del borde inferior de la pantalla (144px). Además, el sistema de logs muestrea los píxeles del centro de la pantalla (aproximadamente Fila 9), por lo que al estar el logo en la Fila 16, el log leía la Fila 9 (vacía) y mostraba `muestra índices: [0, 0, 0, 0, 0, 0]`.

La corrección: Al escribir el tilemap en `0x9904` (Fila 8, Columna 4), el logo aparece centrado vertical y horizontalmente en la pantalla, haciéndolo visible para el usuario y detectable por los logs.

Fuente: Pan Docs - "Tile Map", "Background Map"

Implementación

Corregimos el cálculo de la dirección del tilemap en el constructor de `MMU::MMU()` para colocar el logo en el centro de la pantalla.

Modificación en MMU.cpp

En src/core/cpp/MMU.cpp, dentro del constructor MMU::MMU(), cambiamos la dirección de destino del tilemap de `0x9A00` a `0x9904`:

// 2. Cargar Tilemap del Logo en VRAM Map (0x9904 - Fila 8, Columna 4, centrado)
// CORRECCIÓN Step 0207: Usar 0x9904 para centrar en Fila 8, Columna 4.
// Antes estaba en 0x9A00 (Fila 16), demasiado abajo y fuera del área visible.
// Cálculo: 0x9800 (base) + (8 * 32) = 0x9900 (Fila 8) + 4 = 0x9904 (centrado horizontal)
// 32 bytes = 1 fila completa del mapa de tiles (32 tiles horizontales)
for (size_t i = 0; i < sizeof(VIBOY_LOGO_MAP); ++i) {
    memory_[0x9904 + i] = VIBOY_LOGO_MAP[i];
}

Explicación del cálculo:

  • Base del tilemap: `0x9800`
  • Fila 8: `0x9800 + (8 × 32) = 0x9900` (cada fila tiene 32 tiles = 32 bytes)
  • Columna 4: `0x9900 + 4 = 0x9904` (centrado horizontal aproximado, considerando que el logo tiene 6 tiles de ancho)

Archivos Afectados

  • src/core/cpp/MMU.cpp - Corrección de la dirección del tilemap del logo (líneas 113-120)

Tests y Verificación

La verificación se realizó mediante ejecución del emulador y observación visual del logo:

  • Comando ejecutado: python main.py roms/tetris.gb
  • Resultado esperado: El logo "VIBOY COLOR" aparece centrado en la pantalla
  • Logs: El log [Renderer] Frame #0 ahora debería mostrar índices distintos de cero (ej: [3, 3, 2, 0...]), confirmando que la PPU está leyendo los datos del logo

Validación de módulo compilado C++: El módulo C++ se recompiló usando .\rebuild_cpp.ps1 para aplicar los cambios.

Fuentes Consultadas

Integridad Educativa

Lo que Entiendo Ahora

  • Cálculo de direcciones en Tilemap: El tilemap es una cuadrícula de 32×32 tiles. Cada fila ocupa 32 bytes (32 tiles × 1 byte por tile). Para calcular la dirección de una posición específica: `base + (fila × 32) + columna`.
  • Coordenadas de pantalla vs. coordenadas de tilemap: La pantalla visible es de 20×18 tiles (160×144 píxeles), pero el tilemap es de 32×32 tiles. El centro de la pantalla visible corresponde aproximadamente a la Fila 8, Columna 4 del tilemap.
  • Debugging geométrico: Cuando un elemento gráfico no aparece donde se espera, es importante verificar los cálculos de direcciones de memoria, no solo la lógica de renderizado.

Lo que Falta Confirmar

  • Scroll del fondo: Los registros SCX y SCY permiten desplazar el tilemap. Necesitamos verificar que el logo sigue siendo visible cuando el juego aplica scroll.
  • Prioridad de capas: Si el juego activa sprites o ventana, necesitamos verificar que el logo no se oculte incorrectamente.

Hipótesis y Suposiciones

Asumimos que el logo debe estar en el centro de la pantalla para ser visible. Si el juego aplica scroll o cambia la configuración de LCDC, el logo podría moverse o desaparecer. Esto es esperado y correcto según el comportamiento del hardware.

Próximos Pasos

  • [ ] Verificar que el logo es visible en diferentes ROMs
  • [ ] Verificar el comportamiento del logo cuando el juego aplica scroll (SCX/SCY)
  • [ ] Optimizar la posición del logo si es necesario para diferentes resoluciones de ventana
  • [ ] Implementar sistema de logs más robusto que muestree múltiples áreas de la pantalla