255. Декодер плиток CHR
Реализуйте декодер плиток CHR.
Урок 255 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_255_chr_tile_decoder.py
Справка
https://www.nesdev.org/wiki/PPU_pattern_tablesФайл для создания
emulator/ppu/chr_decoder.pyФункция для реализации
decode_chr_tile(tile_bytes: bytes) -> list[list[int]]Что такое плитка CHR? Плитка CHR — это одна графическая плитка размером 8x8, хранящаяся в виде 16 байтов.
Она не хранит финальные цвета RGB. Она хранит 2-битные индексы цветов:
0, 1, 2, or 3Эти индексы позже будут объединены с памятью палитры для выбора фактических цветов NES.
Макет байтов плитки CHR
bytes 0-7 -> low bitplane, one byte per row
bytes 8-15 -> high bitplane, one byte per rowДля каждой строки
low_byte = tile_bytes[row]
high_byte = tile_bytes[row + 8]Для каждого столбца читайте биты слева направо
column 0 -> bit 7
column 1 -> bit 6
...
column 7 -> bit 0Предлагаемый пример реализации
def decode_chr_tile(tile_bytes: bytes) -> list[list[int]]:
if len(tile_bytes) != 16:
raise ValueError("To decode CHR tile, tile must be 16 bytes")
rows = []
for row in range(8):
low_byte = tile_bytes[row]
high_byte = tile_bytes[row + 8]
columns = []
for col in range(8):
bit_position = 7 - col
low = (low_byte >> bit_position) & 1
high = (high_byte >> bit_position) & 1
pixel = (high << 1) | low
columns.append(pixel)
rows.append(columns)
return rowsВне области действия
- рендеринг таблицы шаблонов
- цвета палитры RGB/NES
- рендеринг фона таблицы имён
- рендеринг спрайтов
- синхронизация PPU
Запустить этот урок
uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_255_chr_tile_decoder.py -v