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