319. Limpiar sprite 0 hit en el prerenderizado

Limpia sprite 0 hit en el límite simplificado de prerenderizado.

Lección 319 de 356 · tests/chapter_11_sprite_zero_hit/test_319_clear_sprite_zero_hit_pre_render.py

Archivo a actualizar

emulator/ppu/ppu.py

Por qué existe este paso

Sprite 0 hit es el bit 6 de PPUSTATUS. Los juegos pueden usarlo como señal de temporización esperando a que el flag transicione a través de este ciclo de vida:

visible frame overlap -> sprite 0 hit becomes set
pre-render boundary   -> sprite 0 hit becomes clear
next visible frame    -> sprite 0 hit may become set again

Antes de implementar la detección de solapamiento o de establecer el flag, este paso establece el invariante de limpieza/reinicio. Sin este reinicio, un futuro sprite 0 hit podría quedar activado para siempre y romper los juegos que esperan a que el flag se limpie antes de esperar al siguiente hit.

Modelo de temporización actual

El proyecto actualmente avanza la temporización en las transiciones de scanline. Por tanto, este paso limpia el flag cuando comienza el scanline 261. La temporización exacta a nivel de dot del hardware es un refinamiento de precisión futuro.

Fragmento de implementación de ejemplo

if self.scanline == PPU_PRE_RENDER_SCANLINE:
    self.status &= ~VBLANK_STARTED

    # --- NEW BLOCK: CLEAR SPRITE 0 HIT FOR THE NEXT FRAME ---
    self.status &= ~SPRITE_ZERO_HIT
    # --- END NEW BLOCK ---

Invariante importante

Leer PPUSTATUS limpia el bit 7 de VBlank, pero no debe limpiar el bit 6 de sprite 0 hit. En el modelo actual, solo el evento del ciclo de vida de prerenderizado limpia sprite 0 hit.

Política actual de ROM manual

Continúa usando MarioBros.nes para las comprobaciones manuales actuales. La validación con Super Mario Bros. se pospone hasta que se implementen la detección de solapamiento y el establecimiento cronometrado del hit.

Fuera de alcance

  • detectar el solapamiento entre sprite 0 y el fondo
  • establecer sprite 0 hit
  • hits fijos/falsos de scanline
  • desbordamiento de sprites
  • cambios en Console
  • cambios en el renderizado
  • validación con Super Mario Bros.

Ejecutar esta lección

uv run pytest tests/chapter_11_sprite_zero_hit/test_319_clear_sprite_zero_hit_pre_render.py -v