NES TDD

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