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 $hhhh

Objetivo

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 = $1234

Por 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