220. Fábrica de mappers
Crea una fábrica de mappers.
Lección 220 de 356 · tests/chapter_02_rom_loading/test_220_mapper_factory.py
Archivo a crear
emulator/cartridge/mapper_factory.pyFunción a implementar
create_mapper(cartridge: Cartridge)Por qué existe este paso
El objeto Cartridge almacena hechos cargados desde la ROM
Cartridge(prg_rom, chr_rom, mapper_number)Pero la CPU/PPU no hablan directamente con los bytes en bruto de PRG/CHR. Hablan a través de un mapper, porque el mapper es el hardware del cartucho que traduce las direcciones del emulador en desplazamientos de la ROM.
Flujo actual
raw .nes bytes
-> Cartridge.from_ines_bytes(data)
-> create_mapper(cartridge)
-> Mapper000(prg_rom, chr_rom)Responsabilidades de la fábrica
- inspeccionar cartridge.mapper_number
- crear el objeto de mapper correcto
- fallar de forma ruidosa ante mappers no soportados
Lo que la fábrica NO debe hacer
- analizar los bytes de iNES
- realizar la traducción de direcciones de la CPU
- conocer el enrutamiento de CpuBus
- mutar el Cartridge
Forma de implementación esperada
from emulator.cartridge.cartridge import Cartridge
from emulator.cartridge.mapper000 import Mapper000
def create_mapper(cartridge: Cartridge):
if cartridge.mapper_number == 0:
return Mapper000(
prg_rom=cartridge.prg_rom,
chr_rom=cartridge.chr_rom,
)
raise ValueError(f"Unsupported mapper: {cartridge.mapper_number}")Por qué esto está separado de CpuBus
CpuBus debería encargarse de enrutar las lecturas y escrituras. No debería volverse responsable de cada regla de selección de mapper de cartucho. Mantener aquí la creación del mapper reduce el acoplamiento antes de integrar en el bus las lecturas de PRG ROM respaldadas por el cartucho.
Ejecutar esta lección
uv run pytest tests/chapter_02_rom_loading/test_220_mapper_factory.py -v