008. Вектор сброса CPU
Инициализировать состояние CPU из вектора сброса.
Урок 8 из 356 · tests/chapter_01_cpu/test_008_cpu_reset_vector.py
Файл для обновления
emulator/cpu/cpu.pyРасположение
CPU.resetСсылка
https://www.nesdev.org/wiki/CPU_power_up_stateПочему этот шаг существует
CPU не выбирает адрес начала программы напрямую. При сбросе он считывает через CpuBus 16-битный вектор в формате little-endian из адресов CPU $FFFC-$FFFD.
Полная эталонная реализация
class CPU:
# Keep the constructor and fetch helpers from Test 004.
def reset(self) -> None:
low = self.bus.read(0xFFFC)
high = self.bus.read(0xFFFD)
self.pc = low | (high << 8)
self.s = 0xFD
self.p = 0x04Важные инварианты
- младший байт вектора берётся из $FFFC
- старший байт вектора берётся из $FFFD
- сброс читает через шину, а не напрямую индексирует FakeROM
Минимальный пример
Смещения FakeROM $7FFC=$00 и $7FFD=$80 появляются по адресам CPU $FFFC-$FFFD и устанавливают PC в $8000. Следующая выборка поэтому читает смещение FakeROM $0000.
Распространённое заблуждение
Сброс не должен увеличивать PC при чтении вектора. Он присваивает PC значение из фиксированных адресов шины; выборка инструкций начинается уже после этого.
Вне рамок
- диспетчеризация опкодов
- вход в прерывание
- тайминг циклов
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_008_cpu_reset_vector.py -v