Rastersplit

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Als Rastersplit bezeichnet man einen Split-Screen, bei dem mehrere Anzeigemodi des VIC parallel genutzt werden. Meist handelt es sich um horizontale Rastersplits; dann befinden sich die unterschiedlichen Anzeigebereiche untereinander. Mit zahlreichen Einschränkungen ist es aber auch möglich, diese nebeneinander zu platzieren.[1]

Die häufigste Anwendung dürfte darin bestehen, dass Grafik und Text gleichzeitig auf dem Bildschirm dargestellt werden. Aber auch in Spielen werden Rastersplits oft benutzt, so werden beispielsweise Scores und dergleichen oftmals als Text dargestellt, während das eigentliche Spielfeld Grafik ist oder einen Mehrfarben-Textmodus benutzt.

Beispiel[Bearbeiten | Quelltext bearbeiten]

Ausgabe des Demoprogramms: Alle 5 Anzeigemodi des VIC gleichzeitig: Von oben nach unten: erweiterter Hintergrundfarbenmodus, normaler Textmodus, Mehrfarben-Textmodus, Mehrfarben-Grafik, normale Grafik.

Das nachfolgende Programm demonstriert dies mit allen fünf Anzeigemodi des VIC. Der Einfachheit halber, wird der Text-Bereich des Bildschirms fortlaufend mit den Zeichen von 0 bis 199 beschrieben und die Grafik besteht nur aus senkrechten Linien, die im Mehrfarbenmodus alle vier Farben zeigen.

*=$c000
         jsr init        ; Bildschirm und Grafik rudimentär initialisieren

         sei             ; vorübergehend Interrupt abschalten

         lda #50         ; Raster-Interrupt auf Zeile 50 setzen
         sta $d012
         lda $d011
         and #$7f
         sta $d011

         lda $d01a       ; Raster-Interrupt anschalten
         ora #$01
         sta $d01a

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

         cli
         rts

sys_irq  lda $dc0d       ; Timer-Interrupt bereits jetzt bestätigen
         cli             ; und neue Interrupts freigeben, damit
         jmp $ea31       ; Raster-Interrupts nicht aufgehalten werden

irq50    lda $d019       ; Auf Raster-Interrupt testen
         bpl sys_irq
         lda 1023        ; 6 Taktzyklen warten
         nop
         ldy #%00010101  ; Text bei $0400
         lda #%01011011  ; Bitmap-Grafik ausschalten und ECM anschalten
         sta $d011
         sty $d018

         ldx #<irq90     ; Interrupt-Routine für Zeile 90
         ldy #>irq90
         lda #90
         bne irq_ende

irq90    lda $d019       ; Auf Raster-Interrupt testen
         bpl sys_irq
         lda 1023        ; 8 Taktzyklen warten
         lda 1023
         lda #%00011011  ; ECM ausschalten
         sta $d011

         ldx #<irq130    ; Interrupt-Routine für Zeile 130
         ldy #>irq130
         lda #130
         bne irq_ende

irq130   lda $d019       ; Auf Raster-Interrupt testen
         bpl sys_irq
         lda 1023        ; 8 Taktzyklen warten
         lda 1023
         lda #%00011000  ; Mehrfarben-Modus anschalten
         sta $d016

         ldx #<irq170    ; Interrupt-Routine für Zeile 170
         ldy #>irq170
         lda #170
         bne irq_ende

irq170   lda $d019       ; Auf Raster-Interrupt testen
         bpl sys_irq
         lda 1023        ; 6 Taktzyklen warten
         nop
         ldy #%00011101  ; Bitmapgrafiken bei $8000
         lda #%00111011  ; Bitmap-Grafik anschalten
         sta $d011
         sty $d018

         ldx #<irq210    ; Interrupt-Routine für Zeile 210
         ldy #>irq210
         lda #210
         bne irq_ende

irq210   lda $d019       ; Auf Raster-Interrupt testen
         bpl sys_irq
         lda 1023        ; 8 Taktzyklen warten
         lda 1023
         lda #%00001000  ; Mehrfarbenmodus ausschalten
         sta $d016

         ldx #<irq50     ; Interrupt-Routione für Zeile 50
         ldy #>irq50
         lda #50
         bne irq_ende

irq_ende stx $0314       ; Interrupt verbiegen
         sty $0315
         sta $d012       ; Nächsten Rasterzeilen-Interrupt programmieren
         lda $d019       ; Interrupt bestätigen
         sta $d019

         pla             ; Interrupt geordnet beenden
         tay
         pla
         tax
         pla
         rti

init     lda #147        ; Bildschirm löschen
         jsr $ffd2

         ldy #0          ; Zeichen von 0 bis 199 in jeden Abschnitt schreiben
loop1    tya
         sta $0400,y
         sta $04C8,y
         sta $0590,y
         sta $0658,y
         sta $0720,y
         iny
         cpy #$c8
         bne loop1

         lda #216        ; Bitmap-Grafik mit 216 füllen
         ldy #0
loop2    sta $32c0,y
         iny
         bne loop2
         inc loop2+2
         lda loop2+2
         cmp #$40
         bne loop2
         rts

Vertikale Rastersplits[Bearbeiten | Quelltext bearbeiten]

Vertikler Rastersplit im Demo Ice Cream Castle von Crest (Schokolade): Im oberen Bereich trennt ein grün-weißer Streifen den linken Text von der Grafik rechts. Allerdings wird hier etwas beschummelt: In zwei von acht Zeilen findet kein Rastersplit statt. Man sieht das nur nicht, weil diese Zeilen auf der linken Seite leer sind.
Ausschnitt aus dem vorigen Bild, mit rot umrandetem Textbereich. Zudem wurden die Sprites, die die beiden Bereiche trennen, ausgeblendet. Man sieht hier gut die Artefakte im Übergangsbereich.

In der Praxis dürften vertikale Rastersplits kaum eine Rolle spielen, da diese sehr zeitkritisch und zudem nur mit zahlreichen Einschränkungen möglich sind. Das größte Problem stellen die Badlines dar, denn in diesen Zeilen ist der Prozessor abgeschaltet und es besteht von daher keine Möglichkeit, den Anzeigemodus zu ändern. Um dies zu umgehen, muss man die Badlines abschalten, was aber bedeutet, dass im Textmodus die Information, welcher Text angezeigt werden soll, nicht mehr vom VIC gelesen werden kann. Es wird dann immer wieder die selbe Zeile ausgegeben. Im Grafikmodus sorgen fehlende Badlines dafür, dass Farbinformationen verloren gehen, weshalb man hier geringere Möglichkeiten bei der Farbwahl hat.

Um überhaupt ein Ergebnis zu erhalten, muss demnach links der Grafikmodus zu sehen sein, bei dem die Farbinformationen fehlen, und rechts der Textmodus. Das funktioniert, weil man in der Mitte der Zeile die Badline wieder anschalten kann und dann die Text-Information wieder geladen wird.

Ein weiteres Problem stellen Artefakte dar, die direkt nach dem Umstellen des Grafikmodus angezeigt werden. Man kann diese Artefakte nicht unterdrücken, lediglich kaschieren. Dadurch entsteht aber ein mindestens 5 Zeichen breiter Bereich in der Mitte der Bildschirms der für keinen der beiden Modi genutzt werden kann. Es ist lediglich möglich, in diesem Bereich Sprites anzeigen zu lassen, wobei diese das Timing durcheinander bringen können...

Zuletzt stellt auch der Zeichensatz ein Problem dar, denn dieser muss sich aus Timing-Gründen an der selben Stelle befinden, wie die Bitmap-Informationen für die Grafiken. Da aber nur ein Teil der Bitmap-Informationen ausgegeben wird, kann man die verbleibenden Bereiche nutzen, um dort den Zeichensatz unterzubringen; ist dann aber natürlich in der Anzahl der Zeichen beschränkt.

Crest ist im Demo Ice Cream Castle von 1990 einen anderen Weg gegangen, um einen vertikalen Rastersplit zu ermöglichen: Dieser ist schlicht unvollständig: Von je acht Zeilen werden nur sechs gesplittet, in den anderen beiden Zeilen ist der Textbereich in Wirklichkeit schwarze Grafik. Die Badlines liegen hier alle in den ungesplitteten Zeilen, wodurch die oben geschilderten Probleme weitgehend wegfallen.

Quellen und Referenzen[Bearbeiten | Quelltext bearbeiten]