NES TDD

237. Маршрутизация области CHR в PpuBus

Маршрутизировать чтения области CHR в PpuBus через маппер.

Урок 237 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_237_ppu_bus_chr_area_routing.py

Файл для обновления

emulator/bus/ppu_bus.py

Константы для добавления/использования

CHR_START = 0x0000
CHR_END = 0x1FFF

Что такое область CHR? Диапазон PPU-адресов $0000-$1FFF — это область таблиц паттернов. Она содержит байты графики тайлов, используемые позже для пикселей фона и спрайтов.

Важный факт о NES

Эта область часто принадлежит картриджу, а не внутренней VRAM.

CHR ROM cartridge:
    PPU reads pattern bytes from cartridge CHR ROM.

CHR RAM cartridge:
    PPU can write pattern bytes into cartridge CHR RAM.

Текущая область действия

Пока PpuBus должен распознавать адреса области CHR. Чтения должны использовать mapper.read_chr(addr), когда маппер присутствует.

Мы намеренно не фиксируем поведение записи CHR в этом тесте. Будущий шаг может добавить mapper.write_chr(addr, value) для поддержки CHR RAM, и этот тест не должен блокировать такую эволюцию.

Предлагаемый псевдокод чтения

def read(self, addr: int) -> int:
    addr = addr & PPU_ADDRESS_MASK

    if CHR_START <= addr <= CHR_END:
        if self.mapper is not None:
            return self.mapper.read_chr(addr)
        return self.vram.read(addr)

    return self.vram.read(addr)

Возможный текущий псевдокод записи

def write(self, addr: int, value: int) -> None:
    addr = addr & PPU_ADDRESS_MASK

    if CHR_START <= addr <= CHR_END:
        if self.mapper is not None:
            raise ValueError("CHR writes are not supported yet")
        self.vram.write(addr, value)
        return

    self.vram.write(addr, value)

Возможный будущий псевдокод записи

if CHR_START <= addr <= CHR_END and self.mapper is not None:
    self.mapper.write_chr(addr, value)
    return

Будущие области

$2000-$3EFF:
    currently backed by big VRAM, later nametable VRAM/mirroring

$3F00-$3FFF:
    currently backed by big VRAM, later palette RAM/mirroring

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

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