Rasterzeilen-Interrupt

Aus C64-Wiki
Zur Navigation springenZur Suche springen
AFL 1970-Intro vom 19.01.1989:Gut sichtbar die weiß-blaue Rasterzeile mit Text in der Bildschirmmitte.

Mit Rasterzeilen-Interrupts bezeichnet man Interrupts, die während des Grafikaufbaus auf dem Monitor an einer genau festgelegten Bildschirmzeile ausgelöst werden. Mit diesem Mechanismus können Programme an einer bestimmten Stelle des Bildes Änderungen vornehmen, beispielsweise an einem Register des Videochips (beim C64: VIC), und so verschiedene Videoeffekte umsetzen.

Durch diese Manipulation lassen sich zum Beispiel verschiedene Anzeigemodi kombinieren (sogenanntes horizontales Splitting - etwa oben Grafik und unten Text), Farbeffekte umsetzen (siehe Rasterbar) oder die Anzahl der Sprites drastisch erhöhen (siehe Sprite-Multiplexer). Beim C64/C128 wurden Rasterzeilen-Interrupts oft in Computerspielen und in Demos benutzt.

Auch andere 8-Bit-Computersysteme wie der Atari 800, MSX-Heimcomputer und der Schneider CPC stellen Rasterzeilen-Interrupts zur Verfügung. Eine große Ausnahme bildet hier der C128 im 80-Zeichen-Modus, was erklärt, warum es außer Risen from Oblivion (2001) kein ansprechendes Demo für den C128/VDC gibt.


Programmierung beim VIC[Bearbeiten | Quelltext bearbeiten]

Beim VIC muss zum einen die Rasterzeile angegeben werden, bei der ein Interrupt ausgelöst werden soll. Dies passiert in den Registern 18 ($D012) und dem höchstwertigen Bit von Register 17 ($D011). Anschließend muss der Rasterzeilen-Interrupt noch durch Setzen des 0-Bit in Register 26 ($D01A) angeschaltet werden.

Zuvor sollte allerdings auch noch die entsprechende Interrupt-Routine angepasst werden. Beim C64 ist die Interrupt-Leitung des VIC mit dem IRQ verbunden. Dementsprechend muss dort der IRQ angepasst werden.

Wichtig ist, dass die Interrupt-Routine den Interrupt bestätigt, damit der VIC das Interrupt-Signal wieder abschalten kann. Sonst würde, sobald die Interrupt-Routine beendet wurde, direkt ein neuer Interrupt ausgelöst werden. Dies geschieht, indem Bit 0 in Register 25 ($D019) gesetzt wird.

Da es auch noch andere Quellen für den IRQ gibt, sollte die Interrupt-Routine zudem prüfen, ob der aktuelle Interrupt tatsächlich durch einen Rasterzeilen-Interrupt ausgelöst wurde. Dafür kann man Register 25 ($D019) auslesen. Wenn dort Bit 7 (Interrupt durch VIC) und Bit 0 (Rasterzeilen-Interrupt) gesetzt sind, handelt es sich um einen Rasterzeilen-Interrupt.


Beispiel

Ausgabe des Beispielprogramms: In der Mitte des Bildschirms ist der Extended-Color-Modus an, sonst aus.

Das nachfolgende Beispielprogramm erzeugt einen Split-Screen, bei dem in der Mitte des Bildschirms der Extended-Color-Modus eingeschaltet ist, oben und unten aber nicht.

*=$c000
         sei

         lda #106       ; Rasterzeile 106
         sta $d012
         lda $d011      ; High-Bit löschen
         and #$7f
         sta $d011

         lda $d01a      ; Rasterzeilen-Interrupt einschalten
         ora #$01
         sta $d01a

         lda #<irq      ; Interrupt-Routine verbiegen
         sta $0314
         lda #>irq
         sta $0315

         cli
         rts

irq      lda $d019      ; Test auf VIC-Interrupt
         bmi vic_irq

         lda $dc0d      ; Timer-Interrupt bestätigen
         cli            ; Neuen VIC-Interrupt zulasen
         jmp $ea31      ; System-Interrupt ausführen

vic_irq  sta $d019      ; VIC-Interrupt bestätigen

         lda $d012      ; Prüfen, in welcher Zeile der
         cmp #106       ; Rasterzeilen-Interrupt auftrat
         bne +

         lda $d011      ; Extended-Color-Modus einschalten
         ora #%01000000
         sta $d011
         lda #202       ; Nächster Rasterzeilen-Interrupt
         sta $d012      ; in Zeile 202
         bne ++

+        lda $d011      ; Extended-Color-Modus abschalten
         and #%10111111
         sta $d011
         lda #106       ; Nächster Rasterzeilen-Interrupt
         sta $d012      ; in Zeile 106

++       pla            ; Interrupt geordnet beenden
         tay
         pla
         tax
         pla
         rti

Nachdem man das Programm mit SYS49152 gestartet hat, kann man das Ergebnis allenfalls an der geänderten Farbe des Cursors erahnen. Mit dem nachfolgenden BASIC-Programm kann man den Unterschied sichtbar machen.

10 print"abcABC<rvs on>abcABC<rvs off>"
20 goto10

Weblinks[Bearbeiten | Quelltext bearbeiten]

WP-W11.png Wikipedia: Rasterzeileninterrupt