179. Bvs с относительной адресацией
подключить BVS к её относительному опкоду.
Урок 179 из 356 · tests/chapter_01_cpu/test_179_BVS_relative.py
Предварительное условие: на шаге 171 была добавлена `instructions.bvs. На этом шаге добавьте эти фрагменты в emulator/cpu/opcodes.py`:
from emulator.cpu.instructions import bvs
def bvs_relative(cpu: CPU):
offset = relative(cpu)
bvs(cpu, offset)
OPCODE_TABLE[0x70] = bvs_relativeВстройте импорт и сопоставление в существующие сгруппированные структуры.
Зачем нужен этот шаг
`relative считывает смещение и преобразует его в знаковое, а затем instructions.bvs` из шага 171 выполняет переход относительно PC после операнда, когда флаг переполнения установлен.
Инварианты: `0x70` сопоставляется с обработчиком с одним аргументом и считывает свой операнд на обоих путях; при установленном флаге переполнения применяется смещение, а при сброшенном флаге переполнения PC остаётся после операнда. Флаги и память не изменяются. Заблуждение: BVS не устанавливает флаг переполнения, а невыполненный переход всё равно занимает и считывает два байта инструкции, включая её опкод.
Вне рамок этого шага: шаг 180 независимо добавляет `addressing_modes.indirect для JMP. Инструкция jmp` и API опкодов абсолютного/косвенного JMP появляются только на последующих шагах 181–183 и не должны добавляться здесь.
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_179_BVS_relative.py -v