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