Der MOS 6567/6569 Videocontroller (VIC-II) und seine Anwendung im Commodore 64
Inhalt 3. Funktionsweise des VIC
3.12. VIC-Interrupts |
Der VIC besitzt die Möglichkeit, beim Auftreten bestimmter Ereignisse einen Interrupt für den Prozessor zu erzeugen. Dazu dient der IRQ-Ausgang, der direkt mit dem IRQ-Eingang des 6510 verbunden ist. Die VIC-Interrupts sind daher mit dem I-Flag im Statusregister des Prozessors maskierbar. Im VIC gibt es vier Interruptquellen. Zu jeder Quelle gehört ein Bit im Interrupt-Latch (Register $d019) und ein Bit im Interrupt-Enable-Register (Register $d01a). Beim Auftreten eines Interrupts wird das entsprechende Bit im Latch gesetzt. Um es zu löschen, muß der Prozessor dort "von Hand" eine "1" hineinschreiben, der VIC löscht das Latch nicht selbsttätig. Wenn mindestens ein Latch-Bit und das zugehörige Bit im Enable-Register gesetzt sind, wird die IRQ-Leitung auf Low gelegt und damit der Interrupt im Prozessor ausgelöst. Mit den Enable-Bits lassen sich also die vier Interruptquellen getrennt ein- und ausschalten. Da der VIC - wie beschrieben - das Latch nicht selbst löscht, muß dies der Prozessor tun, bevor er das I-Flag löscht bzw. aus dem Interrupt zurückkehrt, denn sonst wird sofort wieder ein Interrupt ausgelöst (der IRQ-Eingang des 6510 ist pegelgetriggert). Die folgende Tabelle beschreibt die vier Interruptquellen und ihre Bits in den Latch- und Enable-Registern:
Bit | Name | Auslöser
0 | RST | Erreichen einer bestimmten Rasterzeile. Die Zeile wird durch Schreiben in Register $d012 und $d011, Bit 7 festgelegt und vom VIC intern für den Vergleich gespeichert. Der Test auf das Erreichen der Interrupt-Rasterzeile findet in jeder Rasterzeile in Zyklus 0 (in Zeile 0 in Zyklus 1) statt.
1 | MBC | Kollision von mindestens einem Sprite mit der Text-/Bitmapgrafik (ein Spritedatensequenzer liefert zum selben Zeitpunkt ein nicht-transparentes Pixel an dem der Grafikdatensequenzer einVordergrundpixel ausgibt)
2 | MMC | Kollision von zwei oder mehr Sprites (zwei Spritedatensequenzer liefern gleichzeitig nicht-transparente Pixel)
3 | LP | Negative Flanke am LP-Eingang (Lightpen)
Bei den MBC- und MMC-Interrupts löst jeweils nur die erste Kollision einen Interrupt aus (d.h. wenn die Kollisionsregister $d01e bzw. $d01f vor der Kollision den Inhalt Null hatten). Um nach einer Kollision weitere Interrupts auszulösen, muß das betreffende Register erst durch Auslesen gelöscht werden. Das Bit 7 im Latch $d019 gibt den invertierten Zustand des IRQ-Ausgangs des VIC wieder.