238. PPU владеет PpuBus
Соединить PPU с PpuBus.
Урок 238 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_238_ppu_owns_ppu_bus.py
Файл для обновления
emulator/ppu/ppu.pyПоле для добавления
ppu_bus: PpuBus = field(default_factory=PpuBus)Зачем нужен этот шаг
У PPU есть регистры, к которым CPU может обращаться через CpuBus, но у PPU также есть собственное адресное пространство:
PPU address space: $0000-$3FFFЭто адресное пространство должно маршрутизироваться PpuBus.
Это создаёт стабильную границу, необходимую перед реализацией PPUADDR/PPUDATA:
CPU writes $2006 / $2007
-> CpuBus routes to PPU.write_register(...)
-> PPU uses internal PPU address state
-> PPU writes through PpuBusВажное направление зависимости
PPU -> PpuBus -> VRAM / mapper CHR laterНет
PPU -> raw VRAM directlyПочему это важно
Поведение PPUDATA не должно требовать изменений, когда PpuBus позже станет более точным. Сегодня PpuBus может использовать большую VRAM. Позже он может маршрутизировать:
$0000-$1FFF -> mapper CHR ROM/RAM
$2000-$3EFF -> nametable VRAM/mirrors
$3F00-$3FFF -> palette RAM/mirrorsПредлагаемый псевдокод реализации
from dataclasses import dataclass, field
from emulator.bus.ppu_bus import PpuBus
@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
ppu_bus: PpuBus = field(default_factory=PpuBus)Вне области действия
- поведение защёлки PPUADDR
- записи PPUDATA через PpuBus
- точность палитры/таблиц имён
- записи в CHR RAM
Запустить этот урок
uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_238_ppu_owns_ppu_bus.py -v