005. Interfaz de memoria
Introducir la interfaz común de dispositivo de memoria.
Lección 5 de 356 · tests/chapter_01_cpu/test_005_memory_interface.py
Archivo a crear
emulator/memory/memory_device.pyArchivo a actualizar
emulator/memory/ram.pyUbicaciones
class MemoryDevice
class RAM(MemoryDevice)Por qué existe este paso
CpuBus pronto enrutará accesos a distintos dispositivos. Una pequeña interfaz abstracta permite que el bus dependa del comportamiento de lectura/escritura en lugar de la representación concreta de la RAM.
Implementación de ejemplo completa
# emulator/memory/memory_device.py
from abc import ABC, abstractmethod
class MemoryDevice(ABC):
@abstractmethod
def read(self, addr: int) -> int:
...
@abstractmethod
def write(self, addr: int, value: int) -> None:
...
# emulator/memory/ram.py
from dataclasses import dataclass, field
from emulator.memory.memory_device import MemoryDevice
@dataclass
class RAM(MemoryDevice):
_data: bytearray = field(
default_factory=lambda: bytearray(0x800),
init=False,
)
def read(self, addr: int) -> int:
return self._data[addr]
def write(self, addr: int, value: int) -> None:
self._data[addr] = valueInvariante importante
MemoryDevice define las operaciones pero no posee el almacenamiento ni el mapeo de direcciones.
Error común
Una clase base abstracta no hace que el contenido de la RAM sea abstracto. La RAM sigue teniendo un almacenamiento de bytes concreto; solo se comparte su límite invocable.
Fuera de alcance
- FakeROM, introducida en el Test 006
- mapeo de la ROM de programa en el bus
- comportamiento de solo lectura del cartucho
Ejecutar esta lección
uv run pytest tests/chapter_01_cpu/test_005_memory_interface.py -v