186. Instrucción rts

añadir el comportamiento de RTS independiente del modo de direccionamiento.

Lección 186 de 356 · tests/chapter_01_cpu/test_186_instruction_rts.py

Requisito previo: los pasos 184-185 añadieron el comportamiento de JSR y su conexión de opcode. En este paso, añade `emulator/cpu/instructions.py::rts`:

Instrucción

RTS -> Return from Subroutine

Objetivo

implementar rts(cpu) en instructions.py.

Guía para el estudiante

RTS es la instrucción de retorno que corresponde a JSR. JSR guarda una dirección de retorno en la pila, y RTS desapila esa dirección, y luego le suma 1 para continuar la ejecución después de la instrucción JSR original.

Detalles importantes

  • La pila reside en la página $0100.
  • S es solo el byte bajo de la dirección de la pila.
  • Al desapilar, primero se incrementa S, y luego se lee de $0100 | S.
  • RTS desapila primero el byte bajo, luego el byte alto.
  • RTS asigna a PC el valor pulled_address + 1.

Ejemplo

If the stack contains return address $8002:

    $01FC = $02  low byte
    $01FD = $80  high byte
    S = $FB

Then RTS pulls $8002 and sets PC to $8003.

Forma de implementación de ejemplo

cpu.s = (cpu.s + 1) & 0xFF
low = cpu.bus.read(0x0100 | cpu.s)

cpu.s = (cpu.s + 1) & 0xFF
high = cpu.bus.read(0x0100 | cpu.s)

addr = (high << 8) | low
cpu.pc = (addr + 1) & 0xFFFF

Por qué existe este paso

JSR almacenó PC-menos-uno, así que RTS reconstruye esa palabra y avanza una vez hasta la continuación. Invariantes: cada desapilamiento incrementa el S de 8 bits antes de su lectura; el byte bajo se desapila antes que el alto; el PC final se envuelve a 16 bits; el estado, el resto de registros y la memoria no cambian. Concepto erróneo: leer antes de incrementar S, u omitir el incremento final de PC, no invierte el protocolo de pila de JSR.

Fuera de alcance: importar/mapear el opcode $60 es el paso 187. BRK/RTI y los ayudantes compartidos de pila de la CPU corresponden a pasos posteriores.

Ejecutar esta lección

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