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.pyReferencia
https://www.nesdev.org/wiki/Mirroring#Nametable_MirroringPor 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
$2C00El bit 0 de iNES flags 6 selecciona el modo básico de mirroring:
bit 0 clear -> horizontal mirroring
bit 0 set -> vertical mirroringPara el alcance incremental actual, exponer esto como una única propiedad booleana
is_vertical_mirroring is False -> horizontal
is_vertical_mirroring is True -> verticalEjemplo 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