009. Шаг CPU

Выполнить первый опкод: непосредственная LDA ($A9).

Урок 9 из 356 · tests/chapter_01_cpu/test_009_cpu_step.py

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

emulator/cpu/cpu.py

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

CPU.step

Ссылка

https://www.nesdev.org/wiki/Instruction_reference#LDA

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

CPU.step вводит минимальный цикл выборка-декодирование-выполнение. Непосредственная LDA считывает байт, идущий сразу после опкода $A9, и сохраняет его в аккумуляторе A.

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

class CPU:
    # Keep the state, fetch, and reset behavior from earlier tests.

    def step(self) -> None:
        opcode = self.fetch_byte()

        if opcode == 0xA9:
            self.a = self.fetch_byte()
            return

        raise NotImplementedError(
            f"Opcode {opcode:02X} not implemented"
        )

Временная шкала выполнения

PC=$8000 -> fetch $A9 -> PC=$8001
PC=$8001 -> fetch operand $42 -> PC=$8002 -> A=$42

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

  • один шаг выполняет ровно одну инструкцию
  • неизвестный опкод завершается видимой ошибкой
  • непосредственная LDA потребляет в сумме два байта

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

Операнд $42 — это значение, а не адрес. Непосредственный режим не выполняет ещё одно обращение к шине по адресу $0042.

Вне рамок

  • обновление флагов Zero и Negative, вводимое в тесте 010
  • другие режимы адресации LDA
  • таблицы опкодов и подсчёт циклов

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

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