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

Restaurar Hack de Renderizado para LCDC=0x80

Fecha: 2025-12-18 Step ID: 0058 Estado: Draft

Resumen

Se verificó y reforzó el "Hack Educativo" que permite dibujar el fondo incluso cuando el Bit 0 de LCDC está apagado (LCDC=0x80). Este hack es necesario porque juegos como Pokémon Red escriben LCDC=0x80 esperando que el fondo se dibuje (comportamiento CGB), pero nuestro emulador actúa como DMG estricta y lo apagaría. Se añadió un comentario más explícito que confirma que no hay ninguna condición que bloquee el renderizado cuando el Bit 0 está apagado.

Concepto de Hardware

El registro LCDC (LCD Control, 0xFF40) controla el estado del LCD y las capas gráficas de la Game Boy. El Bit 7 controla si el LCD está encendido o apagado, y el Bit 0 controla si el fondo (Background) está habilitado.

En Game Boy clásica (DMG), cuando el Bit 0 está apagado, el fondo no se dibuja. Sin embargo, en Game Boy Color (CGB), el Bit 0 tiene un comportamiento diferente: no apaga completamente el fondo, sino que cambia la prioridad de sprites vs fondo. Muchos juegos CGB escriben LCDC=0x80 (LCD ON, BG OFF) esperando que el fondo se dibuje de todas formas.

Para compatibilidad con estos juegos, implementamos un "Hack Educativo" que ignora el Bit 0 y dibuja el fondo siempre que el LCD esté encendido (Bit 7=1). Este hack es temporal y se reemplazará cuando implementemos el modo CGB completo.

Fuente: Pan Docs - LCD Control Register, Game Boy Color differences

Implementación

Se verificó que el hack educativo estuviera correctamente implementado en el método render_frame de src/gpu/renderer.py. El hack ya estaba presente (documentado en las líneas 281-300), pero se añadió un comentario más explícito que confirma que no hay ninguna condición que bloquee el renderizado cuando el Bit 0 está apagado.

Cambios realizados

  • Comentario reforzado: Se añadió un comentario explícito (líneas 300-304) que confirma que el código continúa directamente a dibujar el fondo sin ninguna condición que lo bloquee cuando el Bit 0 está apagado.
  • Documentación actualizada: Se actualizó la documentación del hack para mencionar específicamente Pokémon Red como ejemplo de juego que requiere este comportamiento.

Código relevante

El hack educativo está implementado en src/gpu/renderer.py, líneas 281-304. El código original que bloqueaba el renderizado cuando Bit 0=0 está comentado (líneas 294-298), y el código continúa directamente a dibujar el fondo sin verificar el Bit 0.

# HACK EDUCATIVO: Ignorar Bit 0 de LCDC (BG Display)
# En Game Boy Color, el Bit 0 no apaga el fondo, sino que cambia la prioridad
# de sprites vs fondo. Pokémon Red y otros juegos escriben LCDC=0x80 (bit 7=1, bit 0=0)
# esperando que el fondo se dibuje (comportamiento CGB), pero nuestro emulador actúa como
# DMG estricta y lo apagaría. Para desbloquear la visualización, ignoramos el
# Bit 0 y dibujamos el fondo siempre que el LCD esté encendido (Bit 7=1).

# CRÍTICO: Asegurar que el fondo se dibuje siempre que LCD esté encendido (Bit 7=1),
# independientemente del estado del Bit 0. Este hack permite que juegos como Pokémon Red
# que escriben LCDC=0x80 puedan mostrar gráficos correctamente.
# No hay ninguna condición que bloquee el renderizado aquí - el código continúa
# directamente a dibujar el fondo.

Archivos Afectados

  • src/gpu/renderer.py - Se añadió comentario explícito que confirma que el hack está correctamente implementado (líneas 300-304)

Tests y Verificación

Estado: Draft - Pendiente de verificación con Pokémon Red

El cambio es puramente documental (comentario añadido). El hack educativo ya estaba implementado correctamente. Sin embargo, si la pantalla sigue azul en Pokémon Red, el problema podría ser:

  • LCD se apaga después de escribir 0x80: El juego podría estar apagando el LCD después de escribirlo, o podría haber un problema con la lectura del registro LCDC.
  • Problema de timing: El juego podría estar esperando una interrupción V-Blank antes de configurar los gráficos, y nuestro emulador podría no estar generando estas interrupciones correctamente.
  • Problema de VRAM: El tilemap o los tiles podrían no estar cargados correctamente en VRAM, resultando en una pantalla blanca o azul incluso si el fondo se está dibujando.

Próximos pasos para verificación:

  • Ejecutar Pokémon Red y verificar si la pantalla sigue azul
  • Si sigue azul, verificar el estado del registro LCDC durante la ejecución
  • Verificar si las interrupciones V-Blank se están generando correctamente
  • Verificar el contenido de VRAM y el tilemap cuando se intenta renderizar

Fuentes Consultadas

Integridad Educativa

Lo que Entiendo Ahora

  • Hack Educativo: El hack que ignora el Bit 0 de LCDC está correctamente implementado. No hay ninguna condición que bloquee el renderizado cuando el Bit 0 está apagado. El código continúa directamente a dibujar el fondo siempre que el LCD esté encendido (Bit 7=1).
  • Comportamiento CGB vs DMG: En Game Boy Color, el Bit 0 de LCDC tiene un comportamiento diferente que en DMG. Muchos juegos CGB escriben LCDC=0x80 esperando que el fondo se dibuje de todas formas.

Lo que Falta Confirmar

  • Pantalla azul en Pokémon Red: Si la pantalla sigue azul después de este cambio, el problema no es el hack educativo (que ya está correctamente implementado), sino algo más: el LCD podría estar apagándose después de escribirlo, podría haber un problema con las interrupciones V-Blank, o podría haber un problema con el contenido de VRAM.
  • Timing de interrupciones: Necesitamos verificar si las interrupciones V-Blank se están generando correctamente y si el juego está esperando estas interrupciones antes de configurar los gráficos.

Hipótesis y Suposiciones

Hipótesis: El hack educativo está correctamente implementado. Si la pantalla sigue azul, el problema es que el LCD se está apagando después de escribir 0x80, o hay un problema con las interrupciones V-Blank o el contenido de VRAM.

Suposición: El hack educativo es temporal y se reemplazará cuando implementemos el modo CGB completo. Por ahora, es necesario para que juegos como Pokémon Red puedan mostrar gráficos correctamente.

Próximos Pasos

  • [ ] Ejecutar Pokémon Red y verificar si la pantalla sigue azul
  • [ ] Si sigue azul, verificar el estado del registro LCDC durante la ejecución (logging temporal)
  • [ ] Verificar si las interrupciones V-Blank se están generando correctamente
  • [ ] Verificar el contenido de VRAM y el tilemap cuando se intenta renderizar
  • [ ] Si el problema persiste, investigar el timing de las interrupciones y la configuración del PPU