NES TDD

236. Протокол интерфейса маппера

Создать MapperInterface как протокол для границы шина/маппер.

Урок 236 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_236_mapper_interface_protocol.py

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

emulator/cartridge/mapper_interface.py

Protocol для реализации

MapperInterface

Зачем нужен этот вспомогательный класс

PpuBus не должен зависеть напрямую от Mapper000. Mapper000 — лишь один из мапперов картриджа. Мапперы в дальнейшем могут по-другому переключать банки PRG/CHR, но PpuBus должен нуждаться лишь в небольшом интерфейсе:

read_prg(addr)
read_chr(addr)

Это позволяет PpuBus учитывать маппер, не делая его привязанным к Mapper000.

Что такое Protocol? Protocol описывает методы, которые объект должен предоставлять. Классу не нужно явно наследоваться от Protocol. Если у объекта есть нужные методы, он структурно соответствует протоколу.

Предлагаемый псевдокод реализации

from typing import Protocol


class MapperInterface(Protocol):
    def read_prg(self, addr: int) -> int:
        ...

    def read_chr(self, addr: int) -> int:
        ...

Заметка на будущее

Когда будут реализованы записи в CHR RAM, этот протокол может вырасти

write_chr(addr, value)

Пока не требуйте его, потому что Mapper000 на этом этапе не реализует записи в CHR.

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

uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_236_mapper_interface_protocol.py -v