218. Mapper000 nrom
crea
Lección 218 de 356 · tests/chapter_02_rom_loading/test_218_mapper000_nrom.py
crea emulator/cartridge/mapper000.py::Mapper000.read_prg para el mapeo de CPU de NROM.
Por qué existe este paso
NROM-128 refleja (mirror) un único banco de 16 KiB en $8000-$FFFF; NROM-256 mapea 32 KiB directamente. Mantener esta traducción en el mapper evita que Cartridge se convierta en comportamiento de hardware. Utiliza las cargas útiles de PRG y CHR expuestas en la lección 217.
Implementación sugerida en el límite de 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_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]Invariantes: acepta solo direcciones de CPU $8000-$FFFF y exactamente 16 o 32 KiB de PRG; refleja solo en el caso de 16 KiB; conserva el orden del constructor de PRG/CHR. Un error común es indexar prg_rom directamente con la dirección de la CPU o implementar la traducción en Cartridge. read_chr, el enrutamiento hacia la PPU, la CHR RAM, las escrituras, el reflejo (mirroring) y el cambio de bancos quedan fuera de alcance para este paso.
Fuera de alcance para este paso
1. Lesson 219 adds `read_chr` for the PPU-side CHR range.
2. Lesson 220 adds mapper selection.
3. PPU routing, CHR RAM, writes, mirroring, and bank switching come later.Ejecutar esta lección
uv run pytest tests/chapter_02_rom_loading/test_218_mapper000_nrom.py -v