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