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 SubroutineObjetivo
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) & 0xFFFFPor 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