Hyperscreen
Von einem Hyperscreen spricht man, wenn der Bildschirmrahmen teilweise oder ganz entfernt wird. Dadurch werden Grafikelemente in diesen Bereichen sichtbar, die sonst vom Bildschirmrahmen überdeckt worden wären. Man sagt dann auch, dass man den Rahmen öffnet. Wichtigste Anwendungen des Hyperscreen sind Rahmensprites und das Grafikformat OSCAR.
| Hinweis: Die Programme und die Timing-Angaben in den nachfolgenden Abschnitten beziehen sich auf die im deutschsprachigen Raum übliche Version des VIC (6569), die einen PAL-Monitor benötigt. Für einen VIC mit NTSC-Anschluss muss das Timing leicht angepasst werden, da dort ein oder zwei Taktzyklen mehr pro Zeile zur Verfügung stehen. |
Rahmeneinteilung und Darstellung[Bearbeiten | Quelltext bearbeiten]

Bei Betrachtungen zum Hyperscreen ist es hilfreich, den Rahmen in einen vertikalen und einen horizontalen Rahmen zu unterteilen. Der vertikale Rahmen ist der Bereich, der sich oberhalb und unterhalb des normalen Sichtbereichs befindet. Der horizontale Rahmen ist der Bereich am linken und rechten Rand. Analog spricht man auch von einem vertikalen und einem horizontalen Hyperscreen.
Die vier Ecken des Bildschirms verhalten sich genau wie der Rest des horizontalen Rahmens, weshalb sie im Allgemeinen zum horizontalen Hyperscreen dazugezählt werden. Einen Unterschied gibt es aber: Wenn der horizontale Hyperscreen in den Ecken angeschaltet wird, der vertikale aber nicht, wird automatisch auch der untere und obere Rand zu einem horizontalen(!) Hyperscreen - damit ist es dann auch möglich, nur den oberen oder nur den unteren Rand zu öffnen.
Grundsätzlich wird bei einem Hyperscreen die Hintergrundfarbe dargestellt. Im Falle des vertikalen Hyperscreens besteht zusätzlich die Möglichkeit, einzelne Punkte schwarz zu färben. Das dafür verwendete Bitmuster befindet sich in Speicherzelle $3FFF des VIC-Adressbereichs; im Falle des Extended-Color-Mode wird stattdessen die Speicherzelle $39FF benutzt.
Weiterhin werden in beiden Bereichen Sprites dargestellt. Hierbei ist zu beachten, dass Sprites mit kleiner Y-Koordinate zweimal auf dem Bildschirm erscheinen: Sowohl im oberen Bereich des Rahmens, als auch im unteren. Schaltet man die Sprites in geeigneten Rasterzeilen ein und aus, kann dies vermieden werden. Alternativ kann man auch einen Sprite-Multiplexer verwenden, um im oberen und im unteren Rahmen unterschiedliche Sprites darzustellen.
Während der vertikale Hyperscreen immer vollständig oder gar nicht aktiviert ist, kann man beim horizontalen auch nur einige Zeilen öffnen. Man beachte dabei aber, dass die geöffneten Zeilen auf der linken Seite gegenüber den geöffneten Zeilen auf der rechten Seite immer um eine Zeile nach unten versetzt sind.
Techniken[Bearbeiten | Quelltext bearbeiten]

In beiden Fällen geschieht das Abschalten des Rahmens dadurch, dass man dafür sorgt, dass der Rasterstrahl nie die Grenze zwischen Anzeigefenster und Rahmen erreicht, indem man diese im richtigen Zeitpunkt verschiebt. Die nebenstehende Abbildung illustriert dies: Wenn der Rasterstrahl kurz vor der Grenze angekommen ist, versetzt man diese nach links (beziehungsweise beim vertikalen Hyperscreen nach oben). Der Rasterstrahl ist dann bereits hinter der Grenze und aktiviert dadurch den Rahmen nicht. Kurz darauf kann man die Grenze wieder zurücksetzen.
Vertikaler Hyperscreen[Bearbeiten | Quelltext bearbeiten]
Beim vertikalen Hyperscreen nutzt man aus, dass man beim VIC einstellen kann, ob vom Bildschirm 24 oder 25 Zeilen angezeigt werden sollen. Befindet sich der Rasterstrahl im unteren Bereich der 25. Zeile (Rasterzeilen 248-250), löscht man Bit 3 des Registers $D011. Ab Rasterzeile 252 kann man das Bit dann wieder setzen, um den Trick beim nächsten Durchgang wiederholen zu können.
Das nachfolgende Programm zeigt, wie das geht. In richtigen Programmen kann man vor dem Rücksprung zu loop weitere Befehle ausführen. Diese dürfen aber ca. 18000 Taktzyklen nicht übersteigen. Alternativ kann man für das Timing auch einen Rasterzeilen-Interrupt benutzen.

*=$c000
sei ; Interrupt abschalten, der stört
loop lda #250 ; Auf Zeile 250 warten
- cmp $d012
bne -
lda $d011 ; 24-Zeilen-Modus anschalten
and #%11110111
sta $d011
lda #252 ; Auf Zeile 252 warten
- cmp $d012
bne -
lda $d011 ; 25-Zeilen-Modus anschalten
ora #%00001000
sta $d011
bne loop
Ein vertikaler Hyperscreen ist auch in BASIC möglich. Siehe hierzu den entsprechenden Abschnitt bei Rahmensprite.
Horizontaler Hyperscreen[Bearbeiten | Quelltext bearbeiten]
Beim horizontalen Hyperscreen nutzt man aus, dass man beim VIC einstellen kann, ob 38 oder 40 Spalten angezeigt werden. Befindet sich der Rasterstrahl in der 40. Spalte, löscht man Bit 3 des Registers $D016. Das Bit kann (und sollte) direkt danach wieder gesetzt werden, um den Trick in der nächsten Zeile zu wiederholen.
Beim horizontalen Hyperscreen muss man auf diese Weise jede Zeile einzeln öffnen. Zudem ist sehr gutes Timing erforderlich, da man für das Löschen von Bit 3 nur einen einzigen Taktzyklus zur Verfügung hat und zudem die Badlines und Sprites (die ja die Hauptanwendung von Hyperscreens sind) die Anzahl der Taktzyklen pro Zeile verringern.
Im nachfolgenden Beispiel wird der horizontale Hyperscreen in genau zwei Zeilen angeschaltet: Am rechten Rand sind dies die Zeilen 202 und 203, wobei letztere eine Badline ist. Links sind es die Zeilen 203 und 204.

*=$c000
sei ; Interrupt abschalten, der stört nur
loop lda #201 ; Auf Zeile 201 warten
- cmp $d012
bne -
and #$07 ; Badline zur Synchronisation erzeugen
ora #$18
ldy $d011
sta $d011
sty $d011
ldx #09 ; 51 Taktzyklen warten
- dex
bne -
nop
lda 0
lda $d016 ; Bit 3 von $D016 löschen
and #%11110111
sta $d016
ora #%00001000 ; und gleich wieder setzen
sta $d016
nop ; vier Taktzyklen warten
nop
nop
nop
and #%11110111 ; Bit 3 von $D016 löschen
sta $d016
ora #%00001000 ; und gleich wieder setzen
sta $d016
jmp loop
Das Timing des Programms sieht so aus:

In Zeile 201 ist zu Beginn noch keine exaktes Timing vorhanden. Durch das künstliche Erzeugen einer Badline mit sta $d011 wird der Prozessor im Laufe der Zeile abgeschaltet. Der genaue Zeitpunkt kann hierbei variieren.
Das Wiederanschalten des Prozessors erfolgt aber immer zum selben Zeitpunkt: in Taktzyklus 55. Ab hier kann man das Programm mit dem Rasterstrahl synchronisieren. Das Löschen von Bit 3 im Register $D016 muss immer im Taktzyklus 56 erfolgen. Für Zeile 201 ist es bereits zu spät, deshalb wird eine (fast) komplette Zeile gewartet, bis in Taktzyklus 56 der Schreibzugriff von sta $d016 erfolgt und dadurch den horizontalen Hyperscreen für Zeile 202 (rechts) und 203 (links) erzeugt.
Auch in Zeile 203 wird auf Taktzyklus 56 gewartet. Allerdings handelt es sich bei dieser Zeile um eine natürliche Badline. Das bedeutet, dass der Prozessor in den Takten 12 bis 54 abgeschaltet ist. Dies muss beim Timing berücksichtigt werden. Insbesondere muss der Befehl sta $d016 diesmal bereits vor dem Abschalten des Prozessors begonnen werden, damit der Speicherzugriff in Taktzyklus 56 erfolgen kann.
In der Ausgabe des Programms sind drei Blöcke zu sehen. Diese Artefakte entstehen beim künstlichen Erzeugen einer Badline. Man hat mehrere Möglichkeiten, wie man damit umgehen kann.
- Man kann ein anderes Verfahren zur exakten Synchronisation nutzen. Dabei muss man allerdings bedenken, dass jedes Verfahren seine Vor- und Nachteile hat. Hier wurden Badlines benutzt, weil dieses Verfahren vergleichsweise einfach ist und der Code kurz bleibt.
- Man kann die Blöcke kaschieren, indem man sie in der Hintergrundfarbe einfärbt (siehe nächsten Abschnitt für ein Beispiel).
- Man kann, nachdem einmalig eine exakte Synchronisation erzeugt wurde, diese für den Rest des Programms aufrecht erhalten, was man bei einem vollständigen horizontalen Hyperscreen ohnehin machen muss. In diesem Fall blitzen die Artefakte nur einmalig kurz auf, falls man mit einer Badline synchronisiert.
Bitmuster im vertikalen Hyperscreen[Bearbeiten | Quelltext bearbeiten]
Durch geeignetes Verändern der Speicherzelle $3FFF (im Extended-Color-Modus $39FF) kann man in einem vertikalen Hyperscreen ein Bitmuster aus schwarzen Punkten und Punkten in der Hintergrundfarbe erzeugen. Hierbei ist zu beachten, dass sich eine Änderung dieser Speicherzelle erst mit drei Taktzyklen Verzögerung auf die Ausgabe auswirkt.
Ein Beispiel[Bearbeiten | Quelltext bearbeiten]
Das nachfolgenden Programm zeigt, dass man damit durchaus auch nichttriviale Ergebnisse erreichen kann, auch wenn die Möglichkeiten eingeschränkt sind.

*=$c000
sei ; Interrupt abschalten
lda #246 ; Rasterzeilen-Interrupt auf Zeile 246
sta $d012
lda $d011
and #$7f
sta $d011
lda $d01a ; Rasterzeilen-Interrupt anschalten
ora #$01
sta $d01a
lda #<irq ; Interrupt-Routine verbiegen
sta $0314
lda #>irq
sta $0315
cli
rts
irq lda $d019 ; Auf Interrupt vom VIC testen
bmi vic_irq
lda $dc0d ; Timer-Interrupt bestätigen
cli ; und Interrupts zulassen, damit
jmp $ea31 ; die VIC-Interrupts nicht blockiert werden
vic_irq sta $d019 ; Interrupt bestätigen
lda #247 ; Auf Zeile 247 warten
- cmp $d012
bne -
and #$07 ; Künstlich eine Badline für exaktes
ora #$18 ; Timing erzeugen
ldy $d011
sta $d011
inc 2 ; Dummy-Befehl für blaue Farbe bei den Artefakten
tya
and #%11110111 ; Hyperscreen einschalten
sta $d011 ; Der letzte Taktzyklus dieses Befehls ist bereits
; in Zeile 248
ldy #$ff ; Index für Zeichendaten
lda #250 ; Auf letzte Bildschirmzeile warten
- cmp $d012
bne -
stx $3fff ; für korrektes Timing
- sta $3fff ; Hauptschleife: schreibt die
stx $3fff ; Bitdaten für die Grafik
sta $3fff
stx $3fff
sta $3fff
stx $3fff
sta $3fff
stx $3fff
sta $3fff
stx $3fff
lda $d012 ; Hintergrundfarbe ändern
sta $d021
iny ; neue Bitdaten laden
lda tabx,y
tax
lda taba,y
bne - ; Ende der Schleife; die Schleife
; dauert exakt 63 Taktzyklen
lda #$06 ; Hintergrund wieder blau
sta $d021
lda #%00011011 ; Hyperscreen abschalten
sta $d011
lda $d019 ; Interrupt nochmal bestätigen
sta $d019
pla ; Interrupt-Routine koordiniert
tay ; verlassen
pla
tax
pla
rti
*=$c100 ; Die nachfolgenden Tabellen dürfen wegen Timing nicht über eine
Seiten-Grenze liegen.
taba !by 255,255,255,255,255,255,255
!by 195,153,159,159,159,153,195,255 ; C
!by 195,153,159,131,153,153,195,255 ; 6
!by 249,241,225,153,128,249,249,255 ; 4
; Schwarz
!by 255,255,255,255,255,255,255,255,255,255,255,255,255,255
!by 255,255,255,255,255,255,255,255,255,255,255,255,255,255
!by 255,255,255,255,255,255,255,255,255,255,255,255,255,255
!by 255,255,255,255,255,255,255
; Muster
!by 195,225,240,120,60,30,15,135,195,225,240,120,60,30,15
!by 30,60,120,240,225,195,135,15,30,60,120,240,225,195,135
!by 255
!by 0 ; Ende-Kennung
tabx !by 255,255,255
!by 255,156,156,148,128,136,156,255 ; W
!by 195,231,231,231,231,231,195,255 ; I
!by 153,147,135,143,135,147,153,255 ; K
!by 195,231,231,231,231,231,195,255 ; I
; Schwarz
!by 255,255,255,255,255,255,255,255,255,255,255,255,255,255
!by 255,255,255,255,255,255,255,255,255,255,255,255,255,255
!by 255,255,255,255,255,255,255,255,255,255,255,255,255,255
!by 255,255,255
; Muster
!by 195,135,15,30,60,120,240,225,195,135,15,30,60,120,240
!by 120,60,30,15,135,195,225,240,120,60,30,15,135,195,225
; letzte Zeile blau
!by 0
Und so sieht das Timing der Schleife aus:

Man beachte, dass der erste STA-Befehl für die Bitpattern-Daten bereits in Taktzyklus 15 schreibt, obwohl die Darstellung erst in Taktzyklus 19 beginnt. Dies liegt an der Verzögerung von 3 Taktzyklen, die nach dem Lesen des Werts in $3fff durch den VIC erfolgt.
Zusammenspiel mit Sprites[Bearbeiten | Quelltext bearbeiten]

Ganz grundsätzlich können Sprites unabhängig von diesen Bitmustern benutzt werden.
Wenn die Sprites durch Register 27 ($D01B) des VIC hinter dem Vordergrund dargestellt werden, so überdecken die Spritepunkte zwar die farbigen Punkte des Bitmusters (die gelöschten Bits, die ja der Hintergrund sind), nicht jedoch die schwarzen Punkte (die gesetzen Bits).
Dies ist in nebenstehendem Bild gut zu sehen: Dort wurden zwei Sprites in den unteren Rahmen platziert, beide sind vollständig ausgefüllte Rechtecke. Das rote Sprite auf der linken Seite ist hinter dem (schwarzen) Vordergrund, aber vor dem (bunten) Hintergrund. Das weiße Sprite auf der rechten Seite ist vor beidem.
In Demos[Bearbeiten | Quelltext bearbeiten]

Im Demo Krestage der Gruppe Crest wird diese Technik gleich zweifach angewandt:
- Im oberen Bereich wird mit dem Bitmuster ein Schachbrettmuster erstellt, welches zeilenweise eingefärbt ist. An der selben Stelle liegen schwarze Sprites, die einen Teil des Musters verdecken und dadurch die Schrift erzeugen.
- Im unteren Bereich wird senkrechte Scrollschrift dargestellt. Auch diese wird über Bitmuster im Rahmen realisiert. Diesmal sind keine Sprites im Einsatz (diese werden für den KRESTAGE-Schriftzug benötigt). Stattdessen wird ausgenutzt, dass eine Änderung der Speicherzelle $3FFF (hier in Wirklichkeit $39FF, da im Extended-Color-Modus) erst mit drei Taktzyklen Verzögerung wirksam wird, während eine Änderung der Hintergrundfarbe sich sofort auswirkt. Dadurch ist es möglich, ein Muster (statt viermal, wie im Beispiel oben) nur einmalig auf den Bildschirm zu bringen; die anderen Exemplare des Musters sind einfach schwarz auf schwarz und von daher nicht sichtbar.
Beim C128[Bearbeiten | Quelltext bearbeiten]
Beim C128 ist es möglich, das Bitmuster in jeder Zeichenspalte zu ändern. Dazu nutzt man aus, dass die CPU im C128-Fast-Mode die vollständige Kontrolle über den Adressbus übernimmt. Daher liest der VIC in diesem Modus immer jenes Byte das auch die CPU liest. Wenn man nun sein Programm taktgenau auf den VIC sysnchronisiert, kann man durch eine Folge einfacher Ladebefehle (wie z.B. LDA #255, LDX #5, ...) jedes beliebige Muster ausgeben.
Horizontaler Hyperscreen und Sprites[Bearbeiten | Quelltext bearbeiten]
Beim Öffnen des Rahmens stellen Sprites ein gewisses Problem dar, denn mit jedem Sprite verringern sich die Taktzyklen, die innerhalb einer Rasterzeile zur Verfügung stehen. Gleichzeitig sind Sprites aber auch unabdingbar für praktische Anwendungen eines horizontalen Hyperscreens, da sie die einzige Möglichkeit für eine Anzeige im geöffneten Bereich darstellen.
Hierbei gilt es, zwei Probleme zu unterscheiden: Zum einen schränkt die Anwesenheit von Sprite 0 die Aktionsmöglichkeiten im kritischen Taktzyklus 56 ein, zum anderen sorgen zu vielen Sprites in Kombination mit einer Badline dafür, das in der Zeile so wenige Taktzyklen zur Verfügung stehen, dass kein horizontaler Hyperscreen mehr erzeugt werden kann.
Sprite 0[Bearbeiten | Quelltext bearbeiten]
Der VIC schaltet gelegentlich den Prozessor ab, um zusätzliche Zugriffe auf den Speicher durchführen zu können. Für jedes Sprite in einer Zeile sind zwei zusätzliche Zugriffe notwendig. Bei Sprite 0 handelt es sich dabei um Zugriffe in den Taktzyklen 58 und 59.
In den drei Taktzyklen davor (55, 56 und 57) befindet sich der Prozessor bereits in der Vorbereitung auf das Abschalten und kann deswegen nur noch Schreibzugriffe durchführen. Sobald ein Lesezugriff erfolgen würde, wird der Prozessor angehalten. Die Änderung von Register 22 ($D016) des VIC ist ein Schreibzugriff, stellt demnach erst einmal kein Problem dar. Allerdings muss auch im Taktzyklus davor ein Schreibzugriff stattfinden und es gibt nur sehr wenige Assemblerbefehle, bei denen zwei Schreibzugriffe nacheinander erfolgen.
Neben Interrupt-Befehlen, die hier nicht genutzt werden können, sind das nur noch die sogenannten Read-Modify-Write-Befehle (ASL, LSR, ROL, ROR, INC, DEC, sowie sechs illegale Opcodes, die hier keinen zusätzlichen Nutzen bringen). Aus nicht ganz geklärten Gründen, schreiben diese Befehle im vorletzten Taktzyklus den alten Wert der Speicherzelle nochmal in diese zurück, bevor sie dann im letzten Taktzyklus den neuen Wert schreiben.
Von den oben genannten sechs Befehlen bietet sich der DEC-Befehl an, um Bit 3 zu löschen. Hierzu müssen allerdings die Bits 0-2 vor dem Befehl gelöscht sein. Im Standardzustand des Bildschirms ist das der Fall, weshalb im nachfolgenden Programm darauf verzichtet wurde, diese explizit zu löschen.

*=$c000
ldy #63 ; Spritedaten mit 255 füllen
lda #255
- sta 832,y
dey
bpl -
lda #13 ; Spritedatenzeiger für Sprite 0 setzen
sta 2040
lda #190 ; Sprite 0 auf Koordinaten 190/190 setzen
sta $d000
sta $d001
lda #1 ; Sprite 0 einschalten
sta $d015
sei ; Interrupt abschalten, der stört nur
loop lda #200 ; Auf Zeile 200 warten
- cmp $d012
bne -
and #$07 ; Badline zur Synchronisation erzeugen
ora #$18
ldy $d011
sta $d011
sty $d011
ldx #09 ; 50 Taktzyklen warten
- dex
bne -
nop
nop
dec $d016 ; Bit 3 von $D016 löschen
inc $d016 ; und gleich wieder setzen
jmp loop
Das folgende Diagramm enthält das Timing des Programms:

In Zeile 200 wird eine künstliche Badline erzeugt, um ein exaktes Timing zu erreichen. Danach wird gewartet, bis in Zeile 201 durch den DEC-Befehl in Taktzyklus 56 der Rahmen geöffnet werden kann.
Vergleicht man die Abschaltzeiten des Prozessors, die durch Sprite 0 entstehen, in den Zeilen 200 und 201, so stellt man fest, dass in Zeile 201 nur drei Taktzyklen ausfallen, während es in Zeile 200 noch fünf waren. Das liegt daran, dass die beiden Taktzyklen vor dem Abschalten in Zeile 201 Schreibzugriffe enthalten (der DEC-Befehl wurde ja extra deswegen benutzt), während es in Zeile 200 Lesebefehle wären, die aufgeschoben werden.
Zu viele Sprites in einer Badline[Bearbeiten | Quelltext bearbeiten]
In einer Badline wird der Prozessor von Zyklus 15 bis Zyklus 54 abgeschaltet. Ist Sprite 0 angeschaltet, setzt sich die Abschaltung sogar direkt danach fort, weshalb dann in Taktzyklus 56 kein Schreibzugriff stattfinden kann. Das heißt, dass es in einer Badline, in der Sprite 0 angeschaltet ist, nicht möglich ist, einen horizontalen Hyperscreen aufrecht zu erhalten.
Wie viele Sprites sind in einer Badline möglich? Insgesamt gibt es in einer Rasterzeile 63 Taktzyklen. Von diesen gehen in einer Badline 40 ab. Mindestens sechs weitere Taktzyklen, nämlich die vor Zyklus 15, sowie die vor den ersten Sprite-Zugriffen, können nur Schreibzugriffe haben, da in dieser Zeit der Prozessor bereits dabei ist, sich auf das Abschalten vorzubereiten. Bleiben noch 17 Taktzyklen übrig. Für einen Hyperscreen werden minimal 8 Taktzyklen davon benötigt. Für die Sprites verbleiben demnach noch 9 Taktzyklen. Jedes Sprite benötigt zwei davon, weshalb man bei vier Sprites auskommt.
Jetzt könnte man hoffen, das es gelingt einen Schreibzugriff in die Abschaltphase zu verlegen, um noch ein fünftes Sprite möglich zu machen. Das klappt allerdings nicht, weil einer der Schreibzugriffe zwingend in Taktzyklus 56 sein muss und der andere dann aufgrund von ungünstigen Paritäten niemals auf einen ersten Abschaltzyklus fallen kann.
Alles in allem: Es sind maximal vier Sprites in einer Badline mit geöffnetem horizontalem Rahmen möglich.
Die benutzten Sprites kann man sich dabei nicht frei auswählen: es müssen vier aufeinanderfolgende sein und das Sprite 0 darf nicht dabei sein. Im nachfolgenden Beispiel werden die Sprites 2 bis 5 benutzt:

*=$c000
ldy #63 ; Spritedaten mit 255 füllen
lda #255
- sta 832,y
dey
bpl -
lda #13 ; Spritedatenzeiger setzen
sta 2042
sta 2043
sta 2044
sta 2045
lda #190 ; Spritekoordinaten setzen
sta $d005
sta $d007
sta $d009
sta $d00b
lda #50
sta $d004
lda #100
sta $d006
lda #150
sta $d008
lda #200
sta $d00a
lda #7 ; Sprite 5 gelb (da Hintergrund schon blau)
sta $d02c
lda #%00111100 ; Sprites 2-5 anschalten.
sta $d015
sei ; Interrupt abschalten, der stört nur
loop lda #201 ; Auf Zeile 201 warten
- cmp $d012
bne -
and #$07 ; Badline zur Synchronisation erzeugen
ora #$18
ldy $d011
sta $d011
sty $d011
ldx #07 ; 40 Taktzyklen warten
- dex
bne -
nop
nop
lda #$00 ; Register vorbereiten
ldx #$08
ldy #$00
sta $d016 ; Hyperscreen in Zeile 202
stx $d016
sta $d016,y ; Hyperscreen in Zeile 203
stx $d016
jmp loop
Dem nachfolgenden Timingdiagramm kann man gleich zweierlei entnehmen:

Zum einen sieht man, dass in der Badline (Zeile 203) nur noch sehr wenige Taktzyklen zur Verfügung stehen, die der Prozessor überhaupt nutzen kann, nämlich genau 9 Stück.
Zum anderen zeigt sich ein weiteres Problem: Es sind 9 Taktzyklen vorhanden, die beiden Speicherbefehle würden normalerweise aber nur 8 dieser 9 Taktzyklen ausschöpfen. Da es keinen Befehl gibt der nur einen Taktzyklus lang ist, muss man hier zu einem weiteren Trick greifen: Statt des STA-Befehls wird hier STA,Y benutzt. Dieser Befehl benötigt einen Taktzyklus mehr als der normale STA-Befehl, wodurch das Timing wieder stimmt.
Man kann das Limit bei der Anzahl der Sprites umgehen, indem man die Badlines ausschaltet. Das hat allerdings den Nachteil, dass man beim restlichen Inhalt des Bildschirms starke Einschränkungen in Kauf nehmen muss: So werden im Textmodus immer wieder die gleichen Zeichen ausgegeben und im Grafikmodus fehlen die Farbinformationen.
Geschichte[Bearbeiten | Quelltext bearbeiten]
Der erste vertikale Hyperscreen in einer Veröffentlichung war im Demo Flash XI vorhanden. Dieses Demo wurde am 11. Oktober 1985 veröffentlicht. Bereits im darauffolgenden Jahr fand diese Technik auch in Spielen ihre Anwendung. Hier war das Spiel Paperboy das erste.
Im Rennen um das erste Demo mit horizontalem Hyperscreen gab es ziemliche Zwistigkeiten zwischen TSI von 1001 Cracking Crew und Sodan: Im Demo ESCOS I, veröffentlicht im April 1986, sind Bilder zu sehen, die den kompletten Rahmenbereich überdecken, es wird heutzutage als das erste Demo angesehen, bei dem der horizontale Rahmen geöffnet wurde. Im Demo Sodan's Letter I vom 21. April 1986 ist Laufschrift am unteren Rand zu sehen, die den linken und rechten Rahmen mit überspannt. Dort wird auf ESCOS I Bezug genommen und behauptet früher gewesen zu sein. Ein weiteres Demo von April 1986 ist Border Letter I (von TSI), bei dem ebenfalls eine Laufschrift (mit hämischen, an Sodan gewandten Worten) am unteren Rand den linken und rechten Rahmen überspannt.
Es ist derzeit unklar, welches Spiel als erstes einen horizontalen Hyperscreen benutzt hatte. Jars' Revenge aus dem Jahr 2011 zeigt jedenfalls, dass es derartige Spiele gibt.
-
Demo Flash XI, das erste Demo mit einem vertikalen Hyperscreen
-
Paperboy, erstes Spiel mit vertikalem Hyperscreen
-
Demo ESCOS 1, das erste Demo mit einem horizontalen Hyperscreen
-
Sodan's Letter 1, Demo mit partiellem horizontalem Hyperscreen
-
Border Letter 1, Demo mit partiellem horizontalem Hyperscreen
-
Jar's Revenge, ein Spiel mit horizontalem Hyperscreen (die Anzeige besteht ausschließlich aus Sprites)
Siehe hierzu auch die Zeittafeln der C64-Demos, C64-Anwendungen und C64-Spiele.
Verwandte Themen[Bearbeiten | Quelltext bearbeiten]
Weblinks[Bearbeiten | Quelltext bearbeiten]
- Der MOS 6567/6569 Videocontroller (VIC-II) und seine Anwendung im Commodore 64, Abschnitt 3.14.1. Hyperscreen
- Demo Flash XI (1. Hyperscreen)
- Demo ESCOS I (1. horizontaler Hyperscreen)
- Demo Sodan's Letter I (partieller horizontaler Hyperscreen mit Laufschrift)
- Demo Border Letter I (partieller horizontaler Hyperscreen mit Laufschrift)
- Demo Krestage (Bitpatternanzeige im Hyperscreen)