269. Проверка: путь NMI при VBlank через Console

ПРОВЕРКА: Console.step проводит весь путь NMI при VBlank.

Урок 269 из 356 · tests/chapter_04_ppu_timing_and_vblank/test_269_VALIDATION_console_vblank_nmi_path.py

Новая реализация для этого теста не должна потребоваться, если шаги 259-268 выполнены.

Справочные материалы

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

Зачем нужна эта проверка

Предыдущие тесты проверяли каждый механизм по отдельности

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

Этот тест проверяет, что эти части работают вместе в одном небольшом сценарии на уровне машины.

Проверяемый сквозной путь

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

Крошечная программа, используемая в этой проверке

$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
...

Настройка вектора NMI

$FFFA = $00
$FFFB = $90

Ожидаемый результат

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

Важно

Это по-прежнему упрощённая синхронизация. Тест намеренно помещает PPU около начала VBlank, чтобы проверка была быстрой и детерминированной. Это не тестирование задержки NMI с точностью до точки.

Выходит за рамки

  • рендеринг пикселей
  • поведение спрайтов PPU
  • OAM DMA
  • ввод с контроллеров
  • точная задержка NMI
  • динамические штрафы тактов CPU

Запустить этот урок

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