Rasterzeilen-Interrupt
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
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]
Wikipedia: Rasterzeileninterrupt |