Rasterbar

Aus C64-Wiki
Wechseln zu: Navigation, Suche
Rasterbar - Das Beispiel aus dem Quellcode von codebase64.org

Eine Rasterbar (engl. raster bar; vom englischen Wort "bar" für Balken, Stange) ist ein hauptsächlich in Demos und Intros verwendeter Effekt, der einen Bereich mit horizontalen Linien auf den Bildschirm (und die Bildschirmränder) zeichnet, welcher in jeder Rasterzeile eine eigene Farbe besitzen kann. Geläufig ist auch die Bezeichnung Copperbar, da ähnliche Effekte auf dem Amiga mit Hilfe des Copper-Chips erzeugt wurden. Je nachdem wie die Rasterbar programmiertechnisch erzeugt wird, wird unterschieden zwischen "echte" und "scheinbare" Rasterbars.


"Echte" Rasterbars[Bearbeiten]

"Echte" Rasterbars werden über den Rasterzeilen-Interrupt bzw. über das VIC-Register $D011/$D012 und $D020/$D021 erzeugt. Programmtechnisch wird meistens mit Hilfe von Rasterzeilen-Interrupts in den jeweiligen Rasterzeilen die gewünschte Aktion, also Hintergrund- und Rahmenfarbe ändern via $D020/$D021, ausgeführt. Allerdings vergehen vom Zeitpunkt des Interrupts bis zum Aufruf der eigentlichen Routine mindestens 9 Taktzyklen sowie mindestens 4 weitere Taktzyklen, um ein VIC-Register zu beschreiben. Zu diesem Zeitpunkt befindet sich der Rasterstrahl bereits im sichtbaren Teil des linken Rahmens. Bei Verwendung des originalen IRQ-Handlers vergehen sogar mindestens 38 Taktzyklen und in dieser Zeit hat der Rasterstrahl bereits mehr als die Hälfte der Bildschirmbreite überstrichen (eine Rasterzeile dauert insgesamt - abhängig von der Videonorm - 63 bis 65 Taktzyklen). Zudem ist die IRQ-Reaktionszeit der CPU nicht konstant, sondern abhängig vom gerade ausgeführten Befehl, was zu einem Zittern des Balkens führen kann. Eine Möglichkeit dieses Problem zu lösen besteht darin, den Interrupt eine Zeile früher auszulösen und dann über das VIC-Register 53266 ($D012) zu prüfen, ob der Rasterstrahl des Monitors die gewünschte Zeile erreicht hat.

Man könnte auch auf den Interrupt verzichten und die gewünschte Position nur über die VIC-Register ermitteln, dies würde aber Rechenzeit verschwenden, da die CPU in der Wartezeit anderes wie z.B. eine Musik-Routine ausführen könnte.

"Scheinbare" Rasterbars[Bearbeiten]

In diesem sehr bekannten Intro der Gruppe Fairlight bestehen die bewegten grünen Raster tatsächlich aus Sprites, lediglich die beiden blau- bzw. rosafarbigen Balken, die den Hintergrund des schwarzen Textes bilden, werden über Abfrage des Rasterstrahls und Hintergrundfarbe $D021 erzeugt.

Ein ähnlicher Effekt zu Rasterbars kann prinzipiell auch einfach erzeugt werden, indem entsprechende Grafik gemalt/bewegt wird. Abgesehen davon, dass der Effekt dann den Bildschirmrand auslassen würde, ist das Aktualisieren von Grafik relativ rechenzeitaufwendig und komplex, insbesondere falls der Rasterbar-Effekt nur als Hintergrund für eine andere Grafik dienen soll. Zudem funktionieren Rasterbars auch im Textmodus.

Im Bildbeispiel ist schon verdächtig, dass die Raster nicht über den Rand gehen, $D020 also nicht geändert wird. Stellt man einfach mal die Sprites ab, indem man z.B. im Maschinensprachemonitor das Spriteanzeigeregister $D015 auf $00 setzt, wird klar, dass die bewegten grünen Raster aus Sprites bestehen. Das hat klare Vorteile, so muss man sich zum Beispiel nicht mehr um Badlines kümmern, also das Timing von Rasterzeilen, in denen weniger Zyklen zur Verfügung stehen als in anderen. Auch kann man leicht über das Prioritätsregister festlegen, ob die Raster vor oder hinter Screengrafik liegen sollen bzw. dies bei der Bewegung manipulieren. Aber außer dass der Sideborder (seitlicher Rand) nicht ohne weiteres mit genutzt werden kann, besteht ein weiterer Nachteil darin, dass die Sprites bei Priorität der sonstigen Grafiken eine Multicolorfarbe löschen; wie man erkennt, wenn man gaaanz genau hinschaut, wird hier die Farbe Rot im Fairlight Logo bei Kontakt mit Spriterastern gelöscht, obwohl es eigentlich im Vordergrund sein sollte.

Weblinks[Bearbeiten]

WP-W11.png Wikipedia: Raster bar Sprache:english

Programmierung[Bearbeiten]

Demo-Beispiele[Bearbeiten]