253. Mapeo de la VRAM de nametable en el bus de la PPU

Implementa el mapeo de direcciones de la VRAM de nametable en PpuBus.

Lección 253 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_253_ppu_bus_nametable_vram_mapping.py

Referencia

https://www.nesdev.org/wiki/PPU_memory_map
https://www.nesdev.org/wiki/PPU_nametables

Archivo a modificar

emulator/bus/ppu_bus.py

Constantes a añadir

NAMETABLE_START = 0x2000
NAMETABLE_END = 0x3EFF
NAMETABLE_SIZE = 0x0800

¿Qué es un nametable? Un nametable es memoria de disposición del fondo. No almacena píxeles. Almacena números de tile que indican a la PPU qué tile de CHR dibujar en cada posición del fondo.

Ejemplo simple

PPU memory $2000 contains $24

Significado

the top-left background cell uses CHR tile index $24

La PPU expone cuatro áreas lógicas de nametable de 1KB

$2000-$23FF
$2400-$27FF
$2800-$2BFF
$2C00-$2FFF

El rango $3000-$3EFF duplica $2000-$2EFF.

Simplificación del tutorial

Por ahora, usa el gran almacenamiento de VRAM existente y normaliza las direcciones de nametable en una ventana simple de 2KB. Todavía no crees un objeto de RAM de nametable independiente.

Ejemplo de implementación sugerida

NAMETABLE_START = 0x2000
NAMETABLE_END = 0x3EFF
NAMETABLE_SIZE = 0x0800

def normalize_nametable_addr(self, addr: int) -> int:
    if 0x3000 <= addr <= 0x3EFF:
        addr -= 0x1000

    index = (addr - NAMETABLE_START) % NAMETABLE_SIZE
    return NAMETABLE_START + index

def read(self, addr: int) -> int:
    addr = addr & PPU_ADDRESS_MASK

    if CHR_START <= addr <= CHR_END:
        ...

    if NAMETABLE_START <= addr <= NAMETABLE_END:
        return self.vram.read(self.normalize_nametable_addr(addr))

    if PALETTE_START <= addr <= PALETTE_END:
        ...

    return self.vram.read(addr)

Fuera de alcance

  • duplicado horizontal/vertical del cartucho
  • duplicado de cuatro pantallas
  • interpretación de la tabla de atributos
  • renderizado
  • sacar el almacenamiento de nametable del gran array de VRAM

Ejecutar esta lección

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