Rastersplit
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.
Splitscreen der Programmiersprache Commodore-Logo: Oben Grafik, unten Text.
Splitscreen mit Mehrfarben-Textmodus oben und normalem Textmodus unten im Spiel "Nippon".
Splitscreens waren auch typisch für die bekannten Grafik- und Point-and-Click-Adventure mit dem Spiel als Grafik oben und unten die Aktionswörter als Text (Beispiel aus "Zak McKracken and the Alien Mindbenders).
Beispiel[Bearbeiten | Quelltext bearbeiten]
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]
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.