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 tilesPPU 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