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) | low

Coloca 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