237. Enrutamiento del área chr en el bus de la ppu

Enruta las lecturas del área CHR de PpuBus a través del mapper.

Lección 237 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_237_ppu_bus_chr_area_routing.py

Archivo a actualizar

emulator/bus/ppu_bus.py

Constantes a añadir/usar

CHR_START = 0x0000
CHR_END = 0x1FFF

¿Qué es el área CHR? El rango de direcciones de la PPU $0000-$1FFF es el área de la pattern table. Contiene los bytes de gráficos de tiles usados más adelante para los píxeles de fondo y de sprites.

Dato importante de la NES

Esta área a menudo pertenece al cartucho, no a la VRAM interna.

CHR ROM cartridge:
    PPU reads pattern bytes from cartridge CHR ROM.

CHR RAM cartridge:
    PPU can write pattern bytes into cartridge CHR RAM.

Alcance actual

Por ahora, PpuBus debe detectar las direcciones del área CHR. Las lecturas deben usar mapper.read_chr(addr) cuando exista un mapper.

Deliberadamente no fijamos el comportamiento de escritura de CHR en esta prueba. Un paso futuro puede añadir mapper.write_chr(addr, value) para soporte de CHR RAM, y esta prueba no debería bloquear esa evolución.

Pseudocódigo de lectura sugerido

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

    if CHR_START <= addr <= CHR_END:
        if self.mapper is not None:
            return self.mapper.read_chr(addr)
        return self.vram.read(addr)

    return self.vram.read(addr)

Posible pseudocódigo de escritura actual

def write(self, addr: int, value: int) -> None:
    addr = addr & PPU_ADDRESS_MASK

    if CHR_START <= addr <= CHR_END:
        if self.mapper is not None:
            raise ValueError("CHR writes are not supported yet")
        self.vram.write(addr, value)
        return

    self.vram.write(addr, value)

Posible pseudocódigo de escritura futuro

if CHR_START <= addr <= CHR_END and self.mapper is not None:
    self.mapper.write_chr(addr, value)
    return

Regiones futuras

$2000-$3EFF:
    currently backed by big VRAM, later nametable VRAM/mirroring

$3F00-$3FFF:
    currently backed by big VRAM, later palette RAM/mirroring

Ejecutar esta lección

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