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