185. Jsr absolute

подключить опкод JSR absolute $20.

Урок 185 из 356 · tests/chapter_01_cpu/test_185_JSR_absolute.py

Предусловие: на шаге 184 была добавлена `jsr. На этом шаге внесите следующие изменения в emulator/cpu/opcodes.py`:

from emulator.cpu.instructions import jsr
from emulator.cpu.addressing_modes import absolute

def jsr_absolute(cpu: CPU):
    addr = absolute(cpu)
    jsr(cpu, addr)

OPCODE_TABLE = {
    # existing entries...
    0x20: jsr_absolute,
}

Опкод

0x20 -> JSR $hhhh

Цель

создать jsr_absolute(cpu), использовать absolute(cpu), затем jsr(cpu, addr).

Рекомендации

JSR absolute использует 16-битный операнд в порядке little-endian как адрес подпрограммы.

Пример

20 34 12 -> JSR $1234

Шаги выполнения

1. CPU.step() fetches opcode 0x20.
2. absolute(cpu) fetches operand bytes 34 12 and returns $1234.
3. PC now points to the next instruction, $8003 in these tests.
4. jsr(cpu, $1234) pushes return address $8002.
5. PC becomes $1234.

Частая ошибка

Не вызывайте jmp(cpu, addr). JSR должна сначала сохранить адрес возврата.

Зачем нужен этот шаг

`absolute считывает двухбайтовый адрес назначения, оставляя PC на следующей инструкции, чтобы jsr` могла записать PC-минус-один и выполнить переход. Инварианты: один шаг потребляет опкод и операнд, записывает сначала старший, затем младший байт, дважды уменьшает S, изменяет PC на целевой адрес и сохраняет статус. Заблуждение: общий режим адресации с JMP не делает JSR обычным переходом.

За рамками шага: `rts` и опкод $60 — шаги 186–187. BRK, RTI и последующие общие вспомогательные функции стека не являются частью этого перехода.

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

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