324. Flag de mirroring vertical de iNES

Decodificar el mirroring horizontal/vertical de nametables a partir del bit 0 de iNES flags 6.

Lección 324 de 356 · tests/chapter_12_mirroring/test_324_ines_vertical_mirroring_flag.py

Archivo a actualizar

emulator/cartridge/ines.py

Referencia

https://www.nesdev.org/wiki/Mirroring#Nametable_Mirroring

Por qué existe este paso

Antes de implementar un viewport con scrolling, el emulador debe saber cómo el cartucho conecta los nametables lógicos del PPU sobre la RAM física de nametables.

El mirroring no voltea una imagen visualmente. Controla el mapeo de memoria entre las cuatro regiones lógicas de nametable:

$2000
$2400
$2800
$2C00

El bit 0 de iNES flags 6 selecciona el modo básico de mirroring:

bit 0 clear -> horizontal mirroring
bit 0 set   -> vertical mirroring

Para el alcance incremental actual, exponer esto como una única propiedad booleana

is_vertical_mirroring is False -> horizontal
is_vertical_mirroring is True  -> vertical

Ejemplo de implementación sugerido

FLAGS6_VERTICAL_MIRRORING = 1 << 0


@dataclass(frozen=True)
class INesHeader:
    prg_rom_banks: int
    chr_rom_banks: int
    mapper_number: int
    has_trainer: bool
    flags_6: int
    flags_7: int

    @property
    def is_vertical_mirroring(self) -> bool:
        return (self.flags_6 & FLAGS6_VERTICAL_MIRRORING) != 0

¿Por qué una propiedad calculada? flags_6 sigue siendo la única fuente de verdad y el constructor existente de INesHeader no necesita cambiar. Eso conserva los tests y el código llamante de versiones anteriores del tutorial.

Extensión futura

El mirroring de cuatro pantallas puede añadir más adelante una propiedad is_four_screen comprobada antes de is_vertical_mirroring. El almacenamiento y el enrutamiento de cuatro pantallas no se implementan aquí.

Fuera del alcance

  • cambiar Cartridge
  • cambiar Mapper000
  • cambiar el mapeo de nametables de PpuBus
  • RAM de nametables de cuatro pantallas
  • scrolling
  • fixtures de ROM comerciales

Ejecutar esta lección

uv run pytest tests/chapter_12_mirroring/test_324_ines_vertical_mirroring_flag.py -v