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