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