219. Mapper000 chr rom
añade
Lección 219 de 356 · tests/chapter_02_rom_loading/test_219_mapper000_chr_rom.py
añade emulator/cartridge/mapper000.py::Mapper000.read_chr.
Por qué existe este paso
Esto estabiliza el acceso a la carga útil gráfica de 8 KiB de NROM antes de que exista un bus de la PPU. El mapeo de PRG de la lección 218 y la estructura de Mapper000 son requisitos previos.
Ejemplo de implementación completo tras esta lección
from dataclasses import dataclass
PRG_ROM_START = 0x8000
PRG_ROM_END = 0xFFFF
NROM_128_SIZE = 16 * 1024
NROM_256_SIZE = 32 * 1024
CHR_ROM_START = 0x0000
CHR_ROM_END = 0x1FFF
CHR_ROM_SIZE = 8 * 1024
@dataclass(frozen=True)
class Mapper000:
prg_rom: bytes
chr_rom: bytes
def read_prg(self, addr: int) -> int:
if not (PRG_ROM_START <= addr <= PRG_ROM_END):
raise ValueError(
f"Address out of PRG ROM range: {addr:04X}"
)
if len(self.prg_rom) == NROM_128_SIZE:
offset = (addr - PRG_ROM_START) % NROM_128_SIZE
elif len(self.prg_rom) == NROM_256_SIZE:
offset = addr - PRG_ROM_START
else:
raise ValueError(
"Mapper000 supports only 16KB or 32KB PRG ROM"
)
return self.prg_rom[offset]
def read_chr(self, addr: int) -> int:
if not (CHR_ROM_START <= addr <= CHR_ROM_END):
raise ValueError(
f"Address out of CHR ROM range: {addr:04X}"
)
if len(self.chr_rom) != CHR_ROM_SIZE:
raise ValueError("Mapper000 expects 8KB CHR ROM")
offset = addr - CHR_ROM_START
return self.chr_rom[offset]Invariantes: acepta solo direcciones de PPU $0000-$1FFF, exige exactamente 8 KiB de CHR ROM, y mapea los extremos a los desplazamientos 0 y 8191 sin modificar el comportamiento de PRG de la lección 218. No confundas este rango del lado de la PPU con el de PRG de CPU $8000-$FFFF.
Fuera de alcance para este paso
1. Lesson 220 creates mappers from cartridge metadata.
2. PPU/PpuBus wiring and writable CHR RAM come later.
3. Mapper writes, nametable mirroring, and bank switching come later.Ejecutar esta lección
uv run pytest tests/chapter_02_rom_loading/test_219_mapper000_chr_rom.py -v