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