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