163. Direccionamiento relativo

decodificar un desplazamiento de salto relativo de ocho bits.

Lección 163 de 356 · tests/chapter_01_cpu/test_163_relative_addressing.py

Por qué existe este paso

Un salto condicional almacena un desplazamiento con signo respecto al PC posterior a su operando en lugar de un destino completo, por lo que la decodificación debe estar separada de la decisión de salto.

En este paso, añade únicamente esta implementación a `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 lee el operando y avanza PC una vez; restar 0x100 para valores con el bit 7 activado mapea el rango sin signo 0x80..0xFF al rango con signo -128..-1, preservando 0x00..0x7F como 0..127`.

Invariantes: este auxiliar siempre consume exactamente un byte y nunca cambia PC según el desplazamiento devuelto. No inspecciona flags ni altera registros, memoria o el estado. Concepto erróneo: `relative` decodifica un desplazamiento; no decide si se toma el salto ni calcula un destino absoluto por sí mismo.

Fuera de alcance: `instructions.bcc` pertenece a la lección 164. El resto de la semántica de saltos son las lecciones 165-171, y los manejadores de opcode/entradas de tabla son las lecciones 172-179.

Ejecutar esta lección

uv run pytest tests/chapter_01_cpu/test_163_relative_addressing.py -v