![]() |
VOOZH | about |
Der IRQ (Interrupt ReQuest oder maskierbarer Interrupt) ist wie der NMI eine Interruptleitung der CPU. Im Gegensatz zum NMI ist die Leitung Low-aktiv, und der Prozessor ignoriert bei gesetztem Interrupt-Flag die IRQ-Leitung. Dieses Flag kann mit dem Assembler-Befehl SEI gesetzt und per CLI gelöscht werden. Außerdem setzt die CPU das Flag automatisch bei der Auslösung eines IRQs.
Der Programmteil, der einen IRQ abarbeitet, wird Interrupt Service Routine (ISR) genannt.
Folgende Möglichkeiten bestehen, um einen Low-Pegel (0) auf der IRQ-Leitung zu erzeugen.
Ferner löst der BRK-Befehl einen Interrupt aus, zieht aber nicht die IRQ-Leitung auf Low.
Das Signal an der IRQ-Leitung wird ab dem 2. Takt bis zum letzten Takt einer Instruktion erkannt.
Eine zeitgleich mit einer IRQ-Anforderung anliegende NMI-Anforderung hat Vorrang.[1]
Das Löschen des I-Flags führt üblicherweise dazu, dass eine etwaige bereits wieder anstehende Anforderung zu berücksichtigen ist. Das passiert aber bei den das I-Flag manipulierenden Instruktionen zu unterschiedlichen Zeitpunkten:[2]
Der exakte Ablauf auf Hardware-Ebene lässt sich per Visual6502[3] nachvollziehen.
Bei der originalen ISR wird bei Adresse $FF58 der Befehl JMP ($0314) ausgeführt. Hier besteht nun die Möglichkeit, diesen Vektor (LSB = $0314 ; MSB = $0315) "umzubiegen", um in eine eigene ISR springen zu können (siehe Beispielprogramm). Alternativ muss bei ausgeblendetem ROM direkt die Adresse der eigenen Interrupt-Service-Routine an den Vektor $FFFE/$FFFF geschrieben werden.
| Vektor-Name | Hardware Vektor | Adresse |
|---|---|---|
| NMI | $FFFA / $FFFB | $FE43 |
| Reset | $FFFC / $FFFD | $FCE2 |
| IRQ | $FFFE / $FFFF | $FF48 |