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 PpuBusPPU 不应该永远直接写入原始的 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