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