003. Bus de CPU a RAM
Enrutar las direcciones de la RAM de la CPU a través de CpuBus.
Lección 3 de 356 · tests/chapter_01_cpu/test_003_cpu_bus_to_ram.py
Archivo a actualizar
emulator/bus/cpu_bus.pyUbicación
class CpuBusReferencia
https://www.nesdev.org/wiki/CPU_memory_mapPor qué existe este paso
La CPU usa un espacio de direcciones de 16 bits, mientras que la RAM interna solo contiene 0x800 bytes físicos. Las direcciones $0000-$1FFF repiten esa misma RAM cuatro veces.
Implementación de ejemplo completa
from dataclasses import dataclass, field
from emulator.memory.ram import RAM
@dataclass
class CpuBus:
ram: RAM = field(default_factory=RAM)
def read(self, addr: int) -> int:
if 0x0000 <= addr <= 0x1FFF:
return self.ram.read(addr & 0x07FF)
raise ValueError(f"Unsupported CPU bus read: {addr:04X}")
def write(self, addr: int, value: int) -> None:
if 0x0000 <= addr <= 0x1FFF:
self.ram.write(addr & 0x07FF, value)
return
raise ValueError(f"Unsupported CPU bus write: {addr:04X}")Invariante importante
physical_ram_address = cpu_address & 0x07FFEjemplo mínimo
Escribir $42 en la dirección de CPU $0800 cambia el byte físico de RAM $0000, de modo que leer $0000, $0800, $1000 o $1800 observa el mismo almacenamiento.
Error común
El espejado no reserva cuatro arrays de RAM. El bus traduce cuatro rangos de la CPU hacia un único dispositivo de RAM. En este paso, las direcciones no soportadas lanzan ValueError, mientras que el propio bytearray rechaza valores fuera del rango de 8 bits sin signo.
Fuera de alcance
- enrutamiento de la ROM de programa
- registros de la PPU y del mando
- ejecución de la CPU
Ejecutar esta lección
uv run pytest tests/chapter_01_cpu/test_003_cpu_bus_to_ram.py -v