NES TDD

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