002. Чтение и запись RAM

Реализовать хранилище физической RAM объёмом 2 КиБ.

Урок 2 из 356 · tests/chapter_01_cpu/test_002_ram_read_write.py

Файл для обновления

emulator/memory/ram.py

Расположение

class RAM

Почему этот шаг существует

NES содержит 2 КиБ внутренней RAM CPU. Этот класс отвечает только за хранение физических байтов; зеркалирование адресов шина CPU введёт в следующем уроке.

Полная эталонная реализация

from dataclasses import dataclass, field


@dataclass
class RAM:
    _data: bytearray = field(
        default_factory=lambda: bytearray(0x800),
        init=False,
    )

    def write(self, addr: int, value: int) -> None:
        self._data[addr] = value

    def read(self, addr: int) -> int:
        return self._data[addr]

Важные инварианты

  • хранилище содержит ровно 0x800 байт
  • запись изменяет байт, читаемый по тому же физическому адресу
  • RAM не транслирует и не зеркалирует адреса CPU

Распространённое заблуждение

RAM не обязана понимать адреса $0800, $1000 или $1800. Это псевдонимы физической RAM на шине CPU, относящиеся к механизму отображения, введённому в тесте 003.

Вне рамок

  • общий интерфейс устройства памяти
  • хранилище ROM
  • маршрутизация через шину CPU

Запустить этот урок

uv run pytest tests/chapter_01_cpu/test_002_ram_read_write.py -v