235. Ppu 总线的 vram 读写

为 PpuBus 添加基本的读写转发到 VRAM。

235 / 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_235_ppu_bus_vram_read_write.py

要更新的文件

emulator/bus/ppu_bus.py

要实现的方法

PpuBus.read(addr: int) -> int
PpuBus.write(addr: int, value: int) -> None

为什么需要这一步

在 PPUADDR/PPUDATA 能够写入视频内存之前,PPU 需要一个类似总线的对象,能够接受 PPU 地址并执行内存访问。

在这第一步读写实现中,先不要测试 CHR 区域 $0000-$1FFF。CHR 将单独测试,因为它涉及卡带 mapper 的行为。

目前先使用非 CHR 地址,例如 $2000:

PpuBus.write($2000, $AA)
PpuBus.read($2000) -> $AA

非 CHR/默认区域的建议实现伪代码

def read(self, addr: int) -> int:
    addr = addr & PPU_ADDRESS_MASK
    return self.vram.read(addr)

def write(self, addr: int, value: int) -> None:
    addr = addr & PPU_ADDRESS_MASK
    self.vram.write(addr, value)

之后,这些方法会为以下部分增加代码

  • CHR 区域: $0000-$1FFF
  • 名称表区域: $2000-$3EFF
  • 调色板区域: $3F00-$3FFF

运行本课

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