191. Instrucción rti
implementar el comportamiento de RTI.
Lección 191 de 356 · tests/chapter_01_cpu/test_191_instruction_rti.py
En este paso, modifica únicamente `emulator/cpu/instructions.py añadiendo rti(cpu)`. Requisito previo: el paso 188 introdujo las API necesarias de interrupciones y del flag Break.
Por qué existe este paso
La entrada de una interrupción deja el estado, el byte bajo de retorno del PC y el byte alto de retorno del PC en las tres siguientes posiciones de la pila. RTI debe extraer esos bytes en ese orden LIFO y restaurar el PC exacto; a diferencia de RTS, no debe sumar uno.
Implementación sugerida
cpu.s = (cpu.s + 1) & 0xFF
flags = cpu.bus.read(0x0100 | cpu.s)
cpu.p = flags & 0b1100_1111
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)
cpu.pc = (high << 8) | lowColoca esas sentencias en `def rti(cpu: CPU)`.
Invariantes: incrementa el S de 8 bits antes de cada lectura; lee solo la página de pila $0100; sustituye P tras enmascarar los bits 4 y 5; extrae primero el byte bajo y después el alto; incrementa S tres veces; deja el PC restaurado sin incrementar.
Concepto erróneo: RTI no es un RTS para interrupciones. Aplicar el `+ 1` final de RTS hace que se retorne a la instrucción equivocada.
Fuera de alcance: la importación/registro del opcode en $40 corresponde al paso 192. El comportamiento de NMI corresponde a pasos posteriores y no debe añadirse aquí.
Ejecutar esta lección
uv run pytest tests/chapter_01_cpu/test_191_instruction_rti.py -v