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.py

Funció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