182. Jmp absolute
подключить опкод JMP absolute $4C.
Урок 182 из 356 · tests/chapter_01_cpu/test_182_JMP_absolute.py
Предусловие: на шаге 181 была добавлена `jmp. На этом шаге внесите следующие изменения в emulator/cpu/opcodes.py` (включая импорт и запись в таблице):
from emulator.cpu.instructions import jmp
from emulator.cpu.addressing_modes import absolute
def jmp_absolute(cpu: CPU):
addr = absolute(cpu)
jmp(cpu, addr)
OPCODE_TABLE = {
# existing entries...
0x4C: jmp_absolute,
}Опкод
0x4C -> JMP $hhhhЦель
создать jmp_absolute(cpu), использовать absolute(cpu), затем jmp(cpu, addr).
Рекомендации
JMP absolute отличается от LDA absolute.
Для LDA $1234:
A = memory[$1234]Для JMP $1234:
PC = $1234Поэтому обработчик опкода не должен читать память по целевому адресу. Операнд absolute уже является новым значением PC.
Зачем нужен этот шаг
`absolute считывает два операндных байта в порядке little-endian и возвращает их 16-битное значение; jmp присваивает его. Инварианты: один шаг потребляет три байта перед заменой PC, сохраняет флаги/регистры/стек/память и отображает только $4C. Заблуждение: в отличие от обработчиков загрузки, этот обработчик не должен вызывать cpu.bus.read(addr)`.
За рамками шага: JMP indirect и опкод $6C — шаг 183; JSR и его влияние на стек — шаги 184–185.
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_182_JMP_absolute.py -v