163. Относительная адресация
декодировать восьмибитное относительное смещение ветвления.
Урок 163 из 356 · tests/chapter_01_cpu/test_163_relative_addressing.py
Зачем нужен этот шаг
Ветвление хранит смещение со знаком от PC после своего операнда, а не полный адрес цели, поэтому декодирование должно быть отделено от решения о ветвлении.
На этом шаге добавьте только эту реализацию в `emulator/cpu/addressing_modes.py::relative`:
def relative(cpu: CPU) -> int:
offset = cpu.fetch_byte()
# Transform to signed integer
# 0x7F -> +127
# 0x80 -> -128
# 0xFF -> -1
if offset & 0x80: # offset has bit 7 active, is negative
offset -= 0x100
return offset`CPU.fetch_byte считывает операнд и продвигает PC на один байт; вычитание 0x100 для значений с установленным битом 7 переводит беззнаковые 0x80..0xFF в знаковые -128..-1, сохраняя 0x00..0x7F как 0..127`.
Инварианты: эта вспомогательная функция всегда потребляет ровно один байт и никогда не изменяет PC на величину возвращаемого смещения. Она не проверяет флаги и не изменяет регистры, память или состояние. Заблуждение: `relative` декодирует смещение; она сама не решает, выполняется ли ветвление, и не вычисляет абсолютную цель.
Вне рамок этого шага: `instructions.bcc` относится к уроку 164. Семантика остальных ветвлений — уроки 165-171, а обработчики кодов операций/записи таблицы — уроки 172-179.
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_163_relative_addressing.py -v