182. Jmp absoluto
conectar el opcode JMP absoluto $4C.
Lección 182 de 356 · tests/chapter_01_cpu/test_182_JMP_absolute.py
Requisito previo: el paso 181 añadió `jmp. En este paso, añade estos cambios en emulator/cpu/opcodes.py` (incluyendo importaciones y entrada en la tabla):
from emulator.cpu.instructions import jmp
from emulator.cpu.addressing_modes import absolute
def jmp_absolute(cpu: CPU):
addr = absolute(cpu)
jmp(cpu, addr)
OPCODE_TABLE = {
# existing entries...
0x4C: jmp_absolute,
}Opcode
0x4C -> JMP $hhhhObjetivo
crear jmp_absolute(cpu), usar absolute(cpu), y luego jmp(cpu, addr).
Guía para el estudiante
JMP absoluto es diferente de LDA absoluto.
Para LDA $1234:
A = memory[$1234]Para JMP $1234:
PC = $1234Por eso el manejador del opcode no debe leer de memoria en la dirección destino. El operando absoluto ya es el nuevo valor de PC.
Por qué existe este paso
`absolute consume los dos bytes del operando en formato little-endian y devuelve su valor de 16 bits; jmp lo asigna. Invariantes: un paso consume tres bytes antes de reemplazar PC, se preservan flags/registros/pila/memoria, y solo se mapea $4C. Concepto erróneo: a diferencia de los manejadores de carga, este manejador no debe leer cpu.bus.read(addr)`.
Fuera de alcance: JMP indirecto y el opcode $6C son el paso 183; JSR y sus efectos sobre la pila son los pasos 184-185.
Ejecutar esta lección
uv run pytest tests/chapter_01_cpu/test_182_JMP_absolute.py -v