NES TDD

277. Таблица имён с палитрой NES

Рендеринг фреймбуфера таблицы имён с использованием палитры NES по умолчанию.

Урок 277 из 356 · tests/chapter_05_rendering_pipeline/test_277_nametable_with_nes_palette.py

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

emulator/rendering/nametable_renderer.py

Почему этот шаг важен

Универсальный рендерер таблицы имён поддерживает пользовательские палитры

nametable_to_framebuffer(nametable_bytes, pattern_table_bytes, palette)

Это полезно для тестов и отладочных палитр. Теперь, когда у нас есть NES_PALETTE_RGB, добавим вспомогательную функцию с палитрой по умолчанию:

nametable_to_nes_framebuffer(nametable_bytes, pattern_table_bytes)

Это повторяет вспомогательную функцию таблицы шаблонов из предыдущего шага рендеринга.

Что она должна делать

nametable_to_nes_framebuffer(nametable_bytes, pattern_table_bytes)
    -> nametable_to_framebuffer(
           nametable_bytes,
           pattern_table_bytes,
           NES_PALETTE_RGB,
       )

Пример возможной реализации

from emulator.rendering.nes_palette import NES_PALETTE_RGB


def nametable_to_nes_framebuffer(
    nametable_bytes: bytes,
    pattern_table_bytes: bytes,
) -> Framebuffer:
    return nametable_to_framebuffer(
        nametable_bytes,
        pattern_table_bytes,
        NES_PALETTE_RGB,
    )

Важное упрощение

Здесь по-прежнему используется одна общая палитра для каждого тайла. Пока не декодируется 64-байтная таблица атрибутов и не читается палитровая RAM PPU по адресам $3F00-$3F1F. Это полезно как отладочный/простой рендерер. Более поздний рендерер будет использовать таблицу атрибутов для выбора между разными фоновыми палитрами.

Важное правило для фикстур

Используйте только синтетические байты таблицы имён/CHR. Не используйте в этом тесте данные из коммерческих ROM.

Вне рамок этого шага

  • выбор палитры по таблице атрибутов
  • поиск в палитровой RAM PPU
  • скроллинг
  • спрайты
  • OAMDMA
  • отображение через pygame

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

uv run pytest tests/chapter_05_rendering_pipeline/test_277_nametable_with_nes_palette.py -v