NES TDD

257. Декодирование таблицы шаблонов

Реализуйте полное декодирование таблицы шаблонов.

Урок 257 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_257_decode_pattern_table.py

Справка

https://www.nesdev.org/wiki/PPU_pattern_tables

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

emulator/ppu/chr_decoder.py

Функция для реализации

decode_pattern_table(pattern_table_bytes: bytes) -> PatternTable

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

PATTERN_TABLE_SIZE = 0x1000
CHR_TILE_SIZE = 16
PATTERN_TABLE_TILE_COUNT = 256

Что такое таблица шаблонов? Таблица шаблонов — это блок графических данных CHR, содержащий 256 плиток.

Базовая математика

one CHR tile      = 16 bytes
one pattern table = 4096 bytes = $1000
4096 / 16         = 256 tiles

PPU NES имеет два диапазона адресов таблицы шаблонов

$0000-$0FFF -> pattern table 0
$1000-$1FFF -> pattern table 1

Этот шаг только декодирует одну таблицу шаблонов размером 4096 байтов в 256 уже декодированных плиток. Он ещё не рисует изображение.

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

PATTERN_TABLE_SIZE = 0x1000
CHR_TILE_SIZE = 16
PATTERN_TABLE_TILE_COUNT = 256

PatternTile = list[list[int]]
PatternTable = list[PatternTile]

def decode_pattern_table(pattern_table_bytes: bytes) -> PatternTable:
    if len(pattern_table_bytes) != PATTERN_TABLE_SIZE:
        raise ValueError("Pattern table must be 4096 bytes")

    tiles = []

    for tile_index in range(PATTERN_TABLE_TILE_COUNT):
        start = tile_index * CHR_TILE_SIZE
        end = start + CHR_TILE_SIZE
        tiles.append(decode_chr_tile(pattern_table_bytes[start:end]))

    return tiles

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

  • расположение плиток в сетку отладки 128x128
  • вывод PNG/изображения
  • цвета палитры RGB/NES
  • рендеринг фона таблицы имён
  • синхронизация PPU

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

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