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

Archivo a actualizar

emulator/memory/ram.py

Ubicaciones

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] = value

Invariante 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