273. Tabla de patrones a framebuffer

Renderizar una cuadrícula de depuración de tabla de patrones en un framebuffer.

Lección 273 de 356 · tests/chapter_05_rendering_pipeline/test_273_pattern_table_to_framebuffer.py

Archivo a crear

emulator/rendering/pattern_table_renderer.py

Por qué existe este paso

El emulador ya tiene ayudantes CHR puros

decode_pattern_table(pattern_table_bytes)
    -> 256 decoded 8x8 tiles of color indexes

build_pattern_table_debug_grid(decoded_tiles)
    -> 128x128 color-index debug grid

Y la canalización de renderizado ahora tiene

color_index_grid_to_framebuffer(grid, palette)
    -> RGB Framebuffer

Este paso compone esas piezas en un único ayudante puro

pattern_table bytes + RGB palette -> 128x128 Framebuffer

¿Qué es un framebuffer de depuración de tabla de patrones? Una tabla de patrones contiene 256 tiles. Cada tile mide 8x8 píxeles. Para depuración, organizamos esos tiles como:

16 tiles across * 8 pixels = 128 pixels wide
16 tiles down   * 8 pixels = 128 pixels high

Ejemplo de implementación sugerida

from emulator.ppu.chr_decoder import (
    build_pattern_table_debug_grid,
    decode_pattern_table,
)
from emulator.rendering.color_index_renderer import color_index_grid_to_framebuffer
from emulator.rendering.framebuffer import Framebuffer, RGBColor


def pattern_table_to_framebuffer(
    pattern_table_bytes: bytes,
    palette: list[RGBColor],
) -> Framebuffer:
    decoded_tiles = decode_pattern_table(pattern_table_bytes)
    grid = build_pattern_table_debug_grid(decoded_tiles)
    return color_index_grid_to_framebuffer(grid, palette)

Regla de arquitectura

Este renderizador debería componer funciones puras existentes. No dupliques aquí la lógica de decodificación CHR.

Regla importante de fixtures

Usa únicamente bytes CHR sintéticos. No uses datos CHR de una ROM comercial en este test.

Fuera de alcance

  • pantalla de pygame
  • escritura de archivos de imagen
  • renderizado de nametables
  • búsqueda en la RAM de paletas
  • renderizado de sprites

Ejecutar esta lección

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