RTI

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Mnemonic: RTI
Opcode: $40
Anzahl der Bytes: 1
Befehlsgruppe: Sprungbefehl
Adressierung: implizit
Beeinflusste Flags im Statusregister:
Carry-Flag
Negative-Flag
Overflow-Flag
Zero-Flag
Interrupt-Flag
Break-Flag
Decimal-Flag
Taktzyklen: 6


Der Assembler-Befehl RTI beendet die Abarbeitung einer Interrupt-Service-Routine (ausgelöst von einem IRQ, NMI oder dem BRK-Befehl) und kehrt wieder ins Hauptprogramm zurück.

Der Programmierer muss darauf achten, dass alle Bytes, die in der Interrupt-Service-Routine auf den Stapel geschoben wurden, wieder entfernt werden müssen, bevor der Rücksprung mit RTI erfolgt.

Bei der Rückkehr ins Hauptprogramm löscht RTI im Allgemeinen das Interrupt-Flag, weil das Statusregister vom Stapel zurückgeholt wird (vergleiche dazu PLP). Allerdings bleibt das Interrupt-Flag gesetzt, wenn

  • eine IRQ-Routine, während sie zwar mit gesetztem Interrupt-Flag weitere IRQs unterbindet, dennoch von einem nicht maskierbaren Interrupt (NMI) unterbrochen wurde
    oder
  • dort ein BRK zur Ausführung gelangte

und von dort dann zur IRQ-Routine zurückgekehrt wird.

Die genauen Schritte, die bei RTI ablaufen, sind wie folgt:

  1. Byte vom Stapel holen (St)
  2. St in Statusregister schreiben
  3. Byte vom Stapel holen (Lo)
  4. Byte vom Stapel holen (Hi)
  5. Springe zur Adresse Hi*256 + Lo

Im Gegensatz zu RTS wird auf dem Stapel die exakte Rücksprungadresse erwartet und der Prozessorstatus vom Stapel geholt.

Funktionsprinzip

Ass befehl 40.gif

Bedeutung der Buchstaben im Befehl

RTI ReTurn from Interrupt
Rückkehr vom Interrupt

Beispiel

; Dieses Programm stellt eine Interrupt-Service-Routine dar, die die Rahmenfarbe ändert.
; Die Register Akku, X und Y werden am Beginn gesichert und am Ende wieder herstellt,
; obwohl dies für die hier dargestellte Aufgabe nicht notwendig und nur exemplarisch
; zeigt, wie der CPU-Status vollständig unbeeinflusst bleibt, falls in der ISR
; auch beliebig andere Register gebraucht werden.

*=$c000   ; Startadresse der Interrupt-Service-Routine
 
isr       pha            ; Akku am Stapel sichern.
          txa
          pha            ; X-Register am Stapel sichern.
          tya
          pha            ; Y-Register am Stapel sichern.
 
          inc $d020      ; Erhöht den Inhalt von $d020 (Rahmenfarbe) um eins.

          pla
          tay            ; Y-Register wiederherstellen
          pla
          tax            ; X-Register wiederherstellen
          pla            ; Akku wiederherstellen
          rti            ; Status wiederherstellen und
                         ; Rücksprung zur Unterbrechungsstelle

Speicherauszug:

.c000 48        pha
.c001 8a        txa
.c002 48        pha
.c003 98        tya
.c004 48        pha
.c005 ee 20 d0  inc $d020
.c008 68        pla
.c009 a8        tay
.c00a 68        pla
.c00b aa        tax
.c00c 68        pla
.c00d 40        rts

Beispielprogramme