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