269. Validación de la ruta NMI de VBlank en la consola

VALIDACIÓN: Console.step ejecuta la ruta completa de NMI de VBlank.

Lección 269 de 356 · tests/chapter_04_ppu_timing_and_vblank/test_269_VALIDATION_console_vblank_nmi_path.py

No debería ser necesaria ninguna implementación nueva para esta prueba si los pasos 259-268 están completos.

Referencias

https://www.nesdev.org/wiki/PPU_registers#PPUCTRL
https://www.nesdev.org/wiki/PPU_registers#Vblank_NMI
https://www.nesdev.org/wiki/CPU_interrupts

Por qué existe esta validación

Las pruebas anteriores verificaron cada mecanismo por separado

PPU.step() advances timing
PPU enters VBlank and sets VBLANK_STARTED
PPUCTRL bit 7 enables NMI requests
CPU.step() returns CPU cycles
Console.step() advances PPU by cpu_cycles * 3
Console consumes ppu.nmi_requested
CPU.interrupt_nmi() jumps through $FFFA/$FFFB

Esta prueba valida que esas piezas funcionan juntas en un pequeño escenario a nivel de máquina.

Ruta de extremo a extremo que se valida

CPU executes LDA #$80
    -> A = $80

CPU executes STA $2000
    -> CpuBus routes $2000 to PPUCTRL
    -> PPUCTRL bit 7 enables NMI

Console.step() keeps advancing CPU and PPU together
    -> CPU cycles advance PPU by cycles * 3
    -> PPU enters VBlank
    -> PPU sets nmi_requested = True
    -> Console consumes the request
    -> CPU.interrupt_nmi() reads $FFFA/$FFFB
    -> CPU jumps to the NMI handler address

Pequeño programa usado en esta validación

$8000: A9 80       LDA #$80       ; set PPUCTRL NMI-enable bit
$8002: 8D 00 20    STA $2000      ; write A to PPUCTRL
$8005: EA          NOP            ; wait while PPU reaches VBlank
$8006: EA          NOP
...

Configuración del vector NMI

$FFFA = $00
$FFFB = $90

Resultado esperado

CPU PC becomes $9000 after Console consumes the VBlank NMI request.

Importante

Esta es todavía una temporización simplificada. La prueba coloca intencionalmente la PPU cerca del VBlank para que la validación sea rápida y determinista. Esto no es una prueba de latencia NMI precisa a nivel de punto.

Fuera de alcance

  • renderizado de píxeles
  • comportamiento de sprites de la PPU
  • OAM DMA
  • entrada de controlador
  • latencia exacta de NMI
  • penalizaciones dinámicas de ciclo de la CPU

Ejecutar esta lección

uv run pytest tests/chapter_04_ppu_timing_and_vblank/test_269_VALIDATION_console_vblank_nmi_path.py -v