238. Ppu 拥有 ppu 总线

将 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 锁存行为
  • 通过 PpuBus 进行的 PPUDATA 写入
  • 调色板/名称表的精确性
  • CHR RAM 写入

运行本课

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