220. Фабрика mapper

Создайте фабрику mapper.

Урок 220 из 356 · tests/chapter_02_rom_loading/test_220_mapper_factory.py

Файл для создания

emulator/cartridge/mapper_factory.py

Функция для реализации

create_mapper(cartridge: Cartridge)

Зачем нужен этот шаг

Объект Cartridge хранит факты, загруженные из ROM

Cartridge(prg_rom, chr_rom, mapper_number)

Но CPU/PPU не обращаются напрямую к сырым байтам PRG/CHR. Они обращаются через mapper, потому что mapper — это аппаратура картриджа, транслирующая адреса эмулятора в смещения ROM.

Текущий поток

raw .nes bytes
    -> Cartridge.from_ines_bytes(data)
    -> create_mapper(cartridge)
    -> Mapper000(prg_rom, chr_rom)

Обязанности фабрики

  • проверять cartridge.mapper_number
  • создавать правильный объект mapper
  • явно завершаться с ошибкой для неподдерживаемых mapper

Чего фабрика НЕ должна делать

  • разбирать байты iNES
  • выполнять трансляцию адресов CPU
  • знать о маршрутизации CpuBus
  • изменять Cartridge

Ожидаемая форма реализации

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}")

Почему это отделено от CpuBus

CpuBus должна маршрутизировать чтения и записи. Она не должна становиться ответственной за каждое правило выбора mapper картриджа. Хранение создания mapper здесь снижает связанность до того, как мы интегрируем поддерживаемые картриджем чтения PRG ROM в шину.

Запустить этот урок

uv run pytest tests/chapter_02_rom_loading/test_220_mapper_factory.py -v