258. Construir la cuadrícula de depuración de la tabla de patrones

Implementa una cuadrícula de depuración de la tabla de patrones.

Lección 258 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_258_build_pattern_table_debug_grid.py

Referencia

https://www.nesdev.org/wiki/PPU_pattern_tables

Archivo a modificar

emulator/ppu/chr_decoder.py

Función a implementar

build_pattern_table_debug_grid(decoded_tiles: PatternTable) -> PatternTableDebugGrid

Constantes a añadir

PATTERN_TABLE_TILES_PER_ROW = 16
CHR_TILE_WIDTH = 8
CHR_TILE_HEIGHT = 8
PATTERN_TABLE_DEBUG_GRID_SIZE = 128

Qué hace este paso

Las pruebas anteriores decodificaron una tabla de patrones en 256 tiles independientes de 8x8. Este paso organiza esos tiles en una única cuadrícula de 128x128 de índices de color.

Disposición

16 tiles across
16 tiles down
each tile is 8x8 pixels
16 * 8 = 128 pixels

Ejemplos

tile 0   -> top-left,     x=0,   y=0
tile 1   -> right of it,  x=8,   y=0
tile 16  -> next row,     x=0,   y=8
tile 255 -> bottom-right, x=120, y=120

Ejemplo de implementación sugerida

def build_pattern_table_debug_grid(decoded_tiles: PatternTable) -> PatternTableDebugGrid:
    if len(decoded_tiles) != PATTERN_TABLE_TILE_COUNT:
        raise ValueError("Pattern table debug grid requires 256 decoded tiles")

    grid = [
        [0 for _ in range(PATTERN_TABLE_DEBUG_GRID_SIZE)]
        for _ in range(PATTERN_TABLE_DEBUG_GRID_SIZE)
    ]

    for tile_index, tile in enumerate(decoded_tiles):
        tile_x = (tile_index % PATTERN_TABLE_TILES_PER_ROW) * CHR_TILE_WIDTH
        tile_y = (tile_index // PATTERN_TABLE_TILES_PER_ROW) * CHR_TILE_HEIGHT

        for row in range(CHR_TILE_HEIGHT):
            for col in range(CHR_TILE_WIDTH):
                grid[tile_y + row][tile_x + col] = tile[row][col]

    return grid

Nota sobre datos sintéticos

Esta prueba usa una pequeña tabla de patrones sintética generada dentro del archivo de la prueba.

Fuera de alcance

  • generación de archivos
  • salida de imagen
  • colores RGB/paleta de la NES
  • renderizado de fondo de nametable
  • temporización de la PPU

Ejecutar esta lección

uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_258_build_pattern_table_debug_grid.py -v