NES TDD

224. Ppu dataclass register attributes

Создание dataclass PPU с явными атрибутами регистров.

Урок 224 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_224_ppu_dataclass_register_attributes.py

Файл для создания

emulator/ppu/ppu.py

Класс для реализации

PPU

Почему этот шаг нужен

CPU взаимодействует с графическим процессором NES (Picture Processing Unit) через видимые для CPU аппаратные регистры по адресам $2000-$2007. Это не обычные байты RAM; это именованные аппаратные регистры с конкретным назначением.

На этом первом шаге для PPU мы создаём только состояние регистров. Мы пока не реализуем чтение, запись, рендеринг, VBlank, скроллинг, VRAM или DMA.

Этот тест проверяет, что существуют исходные поля регистров PPU, видимые для CPU. Он не требует, чтобы это были единственные поля навсегда. Более поздние шаги могут добавить внутреннее состояние PPU, такое как ppu_bus, vram_addr или addr_latch.

Окно регистров PPU, видимых для CPU

$2000 PPUCTRL   -> ctrl
$2001 PPUMASK   -> mask
$2002 PPUSTATUS -> status
$2003 OAMADDR   -> oam_addr
$2004 OAMDATA   -> oam_data
$2005 PPUSCROLL -> scroll
$2006 PPUADDR   -> addr
$2007 PPUDATA   -> data

Важное архитектурное решение

Используйте явные целочисленные поля, аналогично регистрам CPU. Это упрощает отладку и делает аппаратную модель наглядной:

assert ppu.ctrl == 0x80

Не добавляйте здесь OAMDMA. OAMDMA доступен по адресу CPU $4014 и запускает 256-байтовое DMA-копирование в память спрайтов. Он связан с PPU, но не является частью обычного окна регистров PPU $2000-$2007.

Предлагаемый псевдокод реализации

from dataclasses import dataclass


@dataclass
class PPU:
    ctrl: int = 0
    mask: int = 0
    status: int = 0
    oam_addr: int = 0
    oam_data: int = 0
    scroll: int = 0
    addr: int = 0
    data: int = 0

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

uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_224_ppu_dataclass_register_attributes.py -v