172. Bcc с относительной адресацией
подключить BCC к её относительному опкоду.
Урок 172 из 356 · tests/chapter_01_cpu/test_172_BCC_relative.py
На этом шаге добавьте эти фрагменты в `emulator/cpu/opcodes.py`:
from emulator.cpu.instructions import bcc
from emulator.cpu.addressing_modes import relative
def bcc_relative(cpu: CPU):
offset = relative(cpu)
bcc(cpu, offset)
OPCODE_TABLE[0x90] = bcc_relativeИмпорты можно встроить в существующие сгруппированные импорты файла, а запись таблицы должна войти в её литерал.
Зачем нужен этот шаг
`CPU.step уже считал опкод, relative считывает однобайтовый операнд и преобразует его в знаковый, а bcc` из шага 164 применяет это смещение только при сброшенном флаге переноса.
Инварианты: опкод `0x90 сопоставляется с обработчиком с одним аргументом; на любом пути операнд считывается, поэтому невыполненный переход завершается на 0x8002, а переход со смещением +5 ведёт на 0x8007`. Сам обработчик не изменяет флаги и память. Заблуждение: смещение задаётся относительно PC после операнда, а не относительно адреса опкода, и оно должно считываться даже тогда, когда флаг переноса не даёт выполнить переход.
Вне рамок этого шага: обработчики/записи таблицы для BCS, BEQ, BNE, BPL, BMI, BVC и BVS — это шаги 173–179. Косвенная адресация JMP начинается с шага 180.
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_172_BCC_relative.py -v