NES TDD

253. Отображение VRAM таблицы имён шины PPU

Реализуйте отображение адресов VRAM таблицы имён PpuBus.

Урок 253 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_253_ppu_bus_nametable_vram_mapping.py

Справка

https://www.nesdev.org/wiki/PPU_memory_map
https://www.nesdev.org/wiki/PPU_nametables

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

emulator/bus/ppu_bus.py

Константы для добавления

NAMETABLE_START = 0x2000
NAMETABLE_END = 0x3EFF
NAMETABLE_SIZE = 0x0800

Что такое таблица имён? Таблица имён — это память макета фона. Она не хранит пиксели. Она хранит номера плиток, которые говорят PPU, какую плитку CHR рисовать в каждой позиции фона.

Простой пример

PPU memory $2000 contains $24

Значение

the top-left background cell uses CHR tile index $24

PPU предоставляет четыре логические области таблицы имён размером 1 КБ

$2000-$23FF
$2400-$27FF
$2800-$2BFF
$2C00-$2FFF

Диапазон $3000-$3EFF зеркалирует $2000-$2EFF.

Упрощение в учебнике

Пока используйте существующий большой резервный VRAM и нормализуйте адреса таблицы имён в простое окно размером 2 КБ. Не создавайте отдельный объект RAM таблицы имён.

Предлагаемый пример реализации

NAMETABLE_START = 0x2000
NAMETABLE_END = 0x3EFF
NAMETABLE_SIZE = 0x0800

def normalize_nametable_addr(self, addr: int) -> int:
    if 0x3000 <= addr <= 0x3EFF:
        addr -= 0x1000

    index = (addr - NAMETABLE_START) % NAMETABLE_SIZE
    return NAMETABLE_START + index

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

    if CHR_START <= addr <= CHR_END:
        ...

    if NAMETABLE_START <= addr <= NAMETABLE_END:
        return self.vram.read(self.normalize_nametable_addr(addr))

    if PALETTE_START <= addr <= PALETTE_END:
        ...

    return self.vram.read(addr)

Вне области действия

  • горизонтальное/вертикальное зеркалирование картриджа
  • четырёхэкранное зеркалирование
  • интерпретация таблицы атрибутов
  • рендеринг
  • перемещение хранилища таблицы имён из большого резервного VRAM

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

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