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