234. Ppu 总线的基本形态

创建 PpuBus 的基本形态。

234 / 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_234_ppu_bus_basic_shape.py

要创建/更新的文件

emulator/bus/ppu_bus.py

要实现的类

PpuBus

为什么需要这一步

NES 有两个不同的地址空间

CPU address space: $0000-$FFFF
    routed by CpuBus

PPU address space: $0000-$3FFF
    routed by PpuBus

PPU 不应该永远直接写入原始的 VRAM,而应该与一个稳定的对象通信,即

PPU 地址空间边界

PPU -> PpuBus -> VRAM / mapper CHR / palette RAM later

这使得 PPUDATA 的行为可以保持稳定,即使 PpuBus 内部随着时间推移变得更加精确。

重要常量

PPU_ADDRESS_MASK = 0x3FFF

为什么

PPU 地址是 14 位的。用 0x3FFF 进行掩码运算,可以把任何地址折叠到 PPU 可寻址范围 $0000-$3FFF 内。

初始存储方式

目前,PpuBus 拥有一个大的 VRAM 存储区。这是一种临时的简化方案,让我们能够在实现完整的名称表/调色板精确性之前先构建 PPUADDR/PPUDATA。

建议实现的伪代码

from dataclasses import dataclass, field
from typing import Optional

from emulator.memory.vram import VRAM
from emulator.cartridge.mapper_interface import MapperInterface

PPU_ADDRESS_MASK = 0x3FFF


@dataclass
class PpuBus:
    vram: VRAM = field(default_factory=VRAM)
    mapper: Optional[MapperInterface] = None

运行本课

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