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