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.py

Ubicación

class CpuBus

Referencia

https://www.nesdev.org/wiki/CPU_memory_map

Por 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 & 0x07FF

Ejemplo 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