NES TDD

281. Nametable с палитрой в RAM

Рендеринг фона nametable с использованием таблицы атрибутов и байтов палитры PPU RAM.

Урок 281 из 356 · tests/chapter_05_rendering_pipeline/test_281_nametable_with_palette_ram.py

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

emulator/rendering/nametable_renderer.py

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

На предыдущих шагах компоненты создавались по отдельности

attribute table
    -> palette ID for each tile coordinate

palette RAM bytes
    -> four RGB background palettes

nametable + attributes + background palettes
    -> framebuffer

На этом шаге эти компоненты объединяются в один чистый вспомогательный рендерер

nametable_with_palette_ram_to_framebuffer(
    nametable_bytes,
    attribute_table,
    pattern_table_bytes,
    palette_ram,
)

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

background_palettes = build_background_palettes_from_palette_ram(palette_ram)

return nametable_with_attributes_to_framebuffer(
    nametable_bytes,
    attribute_table,
    pattern_table_bytes,
    background_palettes,
)

Зачем это нужно

Этот помощник принимает данные, по форме более приближённые к реальным входным данным рендеринга PPU, оставаясь при этом полностью тестируемым:

nametable visible tile bytes
attribute table bytes
pattern table CHR bytes
background palette RAM bytes

По-прежнему чистые данные

Никаких чтений с шины PPU, никакого pygame, никакого окна, никакого цикла кадров.

Важная модель железа

CHR pixel color index 0-3
    -> attribute table selects background palette ID 0-3
    -> palette RAM selects NES color index $00-$3F
    -> NES RGB palette converts to RGB
    -> framebuffer pixel

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

from emulator.rendering.palette_ram import build_background_palettes_from_palette_ram


def nametable_with_palette_ram_to_framebuffer(
    nametable_bytes: bytes,
    attribute_table: bytes,
    pattern_table_bytes: bytes,
    palette_ram: bytes,
) -> Framebuffer:
    background_palettes = build_background_palettes_from_palette_ram(palette_ram)

    return nametable_with_attributes_to_framebuffer(
        nametable_bytes,
        attribute_table,
        pattern_table_bytes,
        background_palettes,
    )

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

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

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

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