Rasterbars

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

CBM prg Studio
Stylische Balken anzeigen

Die Rasterbars (wer vom Amiga kommt kennt diesen Effekt evtl. als Copper-Bars) werden sehr häufig in Demos verwendet. Sie sind zunächst mal relativ einfach zu erzeugen und sehen bei entsprechender Farbgebung klasse aus.

Das Prinzip ist dabei sehr einfach. Man wartet bis zur gewünschten Rasterzeile und setzt dann für die folgenden Zeilen die Hintergrund- und / oder Rahmenfarbe auf die gewünschten Werte. Natürlich ist es in der Praxis wieder etwas hakeliger 😉 .

Da wir gleich einen stabilen Rasterzeileninterrupt verwenden, solltet ihr die unter ‚Der Rasterzeileninterrupt zufindenden Beiträge gelesen haben.
Besonders das Wissen aus ‚Raster-IRQ: Endlich stabil!!!‚ wird vorausgesetzt!

Ausgangspunkt für unser Programm ist also ein stabiler Rasterzeileninterrupt. Das folgende Programm sollte euch vor keine besonderen Probleme stellen, es richtet nur den Raster-IRQ (wie in den eben erwähnten Beiträgen beschrieben) ein.

Systemvoraussetzung: PAL mit 63TZ !

Das Programm zu starten macht aktuell noch keinen Sinn. Es richtet nur den Rasterzeileninterrupt so ein, dass wir ‘stabil‚ in der letzten Zeile vor dem Ausgabebereich beginnen (s. Konstante  RASTER = 47). Das Hauptprogramm bleibt in einer Endlosschleife hängen  JMP *. Erwähnen möchte ich noch den Sprung am Schluß des Raster-IRQs. Bisher sind wir fast immer nach $EA31 gesprungen, um den Systeminterrupt zu verarbeiten. Da wir den hier nicht benötigen springen wir einfach nach  $EA81, dort werden die Register zurückgeholt und dann der Interrupt mit RTI verlassen. Schaut mit dem VICE-Monitor einfach mal nach.

Jetzt sorgen wir noch für einen ‘sauberen‚ Bildschirm und setzen die Rahmen- & Hintergrundfarbe auf schwarz. Fügt die folgenden Zeilen einfach direkt zu Beginn hinter main ein.

Das einzig Unbekannte ist evtl. das Löschen über die Kernal-Routine ab  $E544. Die Funktion sollte euch aber nicht beunruhigen 😉 , sie löscht halt den Bildschirm für uns.

Nun ist es an der Zeit bei MyIRQ_Main unseren Rasterbar zu erzeugen. Wir wollen jetzt also in jeder Zeile eine andere Hintergrundfarbe verwenden, um unseren Balken auf den Bildschirm zu bringen. Wer jetzt auf die Idee kommt einfach für jede Zeile einen eigenen Rasterinterrupt zu erzeugen, der sollte die oben im roten Block erwähnten Beiträge noch mal studieren. Spätestens bei den Bad-Lines werden wir Probleme bekommen. Wir können nun natürlich für jede Farbe einen eigenen Code-Block entwickeln, der die richtig Anzahl an Taktzyklen verwendet, aber das ist doch etwas aufwendig und unflexibel. Ich gehe hier den Weg über zwei Tabellen.
Die erste Tabelle rowcolortable bestimmt die Farbe der jeweiligen Zeile. Hier hinterlegen wir ein möglichst harmonisches ‚Muster‚ für einen stylischen Rasterbar. Das Ende kennzeichnen wir mit $F0. Fügt die Tabelle ganz am Schluß unseres Listings ein.

Die 16 Farben des C64.
Hier nochmal die 16 Farben des C64.
Dies ist noch KEIN Rasterbar 😉

Wir können so eine Schleife bauen, die beendet wird, sobald die Tabelle einen negativen Wert enthält. Da für die 16 möglichen Farben nur 4-Bit benötigt werden, sorgt das untere Nibble unseres Schlußkennzeichen außerdem automatisch dafür, dass die Hintergrundfarbe nach dem Rasterbar wieder korrekt gesetzt wird. Das $F0 kennzeichnet also nicht nur das Ende des Rasterbars, sondern sorgt auch wieder für einen schwarzen Hintergrund. Möchtet ihr lieber gelb als Hintergrundfarbe, dann könnt ihr einfach $F7 verwenden.

In einer zweite Tabelle  delaytable tragen wir die Wartezeit für die jeweilige Rasterzeile ein. Diese Zeiten müssen wir abhängig von unserer Hauptschleife berechnen / ermitteln. Wir wissen, dass wir 63 bzw. 20-23 Taktzyklen in einer Rasterzeile zur Verfügung haben und wieviele Zyklen die einzelnen Mnemonics benötigen. Nett, wie ich bin 😉 , habe ich euch die Arbeit abgenommen, fügt also die folgende Tabelle am Ende des Programms ein.

Da wir nur die Hintergrundfarbe ändern kommt es hier nicht auf 100% Genauigkeit an. Wir stellen einfach nur sicher, dass im Ausgabebereich immer eine durchgängige Line zu sehen ist.

Jetzt brauchen wir natürlich auch noch eine Funktion, die auf die diese Tabellen zugreift. Fügt diese Zeile direkt hinter dem Label MyIRQ_Main ein:

Das X-Register dient als Schleifenzähler. Da der Ausgabebereich max. 200 Zeilen hat, sollte das sogar für einen ‚riesigen‚ Rasterbar reichen. Da die erste Anweisung in der Schleife @loop der Befehl  INX ist, wird das X-Register mit $FF (also -1) initialisiert. In der Schleife erhöhen wir als erstes X und holen damit die Wartezeit für die aktuelle Zeile aus  delaytable ins Y-Register. Wir zählen zum Warten einfach Y herunter, bis es null ist.
Eine Besonderheit stellt übrigens der erste ‚Wartewert‚ dar. Wir befinden uns in der letzten Rahmenzeile, wenn wir bei MyIRQ_Main ankommen. Dort haben wir erst drei Zyklen verbraucht und nutzen die Zeit für unsere Vorbereitungen (hier nur die Initialisierung des X-Registers), den Rest müssen wir abbummeln.
Dann holen wir die Farbe für diese Rasterzeile aus der Tabelle rowcolortable und schreiben sie ins Register für die Hintergrundfarbe. Dies geschieht übrigens am Ende der aktuellen Rasterzeile. Das  NOP dient nur dazu, etwas Zeit zu verbummeln. War die Farbe positiv, dann springen wir zurück an den Schleifenbeginn nach @loop und fahren mit der nächsten Zeile fort.

Ein Start zeigt uns nun den erhofften Rasterbar.

Der erste Rasterbar...
Der erste Rasterbar…

Da man bekanntlich auf einem Bein nicht stehen kann, fügen wir doch noch einige Balken mehr hinzu. Niemand hindert uns daran, den ganzen Bildschirm mit Rasterbars zu füllen. Wir müssen dazu nur unsere beiden Tabellen erweitern.

Ich habe bei delaytable immer fünf Zeilen als Block abgesetzt. Wenn ihr die Werte später kontrolliert, werdet ihr feststellen, dass der Beginn eines jeden Blocks immer nach der gleiche Zahl Taktzyklen stattfindet. Übernehmt ihr die obigen Tabellen und startet das Programm, dann sieht fast alles gut aus. Aber leider kommt es doch zu Problemen:

Am Ende kommt es doch zum Versatz!
Am Ende kommt es doch zum Versatz!

Sind meine Werte doch falsch? Schaut euch die Daten und den Source (besonders die Befehle für den Zugriff auf die Tabellen) nochmal an, bevor ihr fortfahrt und überlegt selbst einmal, wo das Problem liegt.

 

 

 

 

 

 

 

 

 

Nicht luschern… 😉

 

 

 

Wie ein Blick auf die Mnemonics verrät, benötigt der LDY $$$$,X-Befehl einen weiteren Taktzyklus, wenn beim Zugriff die Pagegrenze überschritten wird. Genau dies verhagelt uns hier das Timing! Wir haben nun soviele Werte in den Tabellen, dass die Pagegrenze überschritten wird. Abhilfe schafft ein ALIGN 256 vor jeder Tabelle. Sobald ihr die beiden hinzugefügt habt, sollte die Anzeige wie erhofft sein.

Jetzt sieht es gut aus.
Jetzt sieht es gut aus.

Wie ihr am Quellcode erkennen könnt, händeln wir die ganze Geschichte, vom Prinzip her, wie den oben kurz erwähnten ‚riesigen‚ Rasterbar. Wir decken mit unserer Tabelle den gesamten sichtbaren Bereich (es ist sogar etwas mehr) ab.

 


Eigentlich habt ihr nun alles, was ihr als Ausgangsbasis für eigene Projekte benötigt. Spielt ein Wenig mit der Tabelle rowcolortable und variiert einfach die Farbe und Größe der Rasterbars oder fügt etwas Color-Cycling hinzu, damit es noch ‘spektakulärer‚ wird.

Wie so etwas aussehen kann könnt ihr im Java-Emulator kontrollieren oder euch als D64-Image herunterladen.

Die nächste Steigerung wäre es natürlich voneinander unabhängige Rasterbars frei zu bewegen oder diese vor und hinter einem Objekt entlangzuführen. Auch das Hinzufügen von Sprites wertet die ganze Sachen noch auf. Es gibt für euch also noch viel zu entdecken.

 


Schrott!!Naja...Geht so...Ganz gut...SUPER! (2 Bewertungen | Ø 5,00 von 5 | 100,00%)

Loading...


 

<<< zurück |

 

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

Schreibe einen Kommentar


Beachtet bitte, dass ich eure Kommentare erst manuell freigegeben muß, bevor sie auf der Seite erscheinen! Da ich nicht pausenlos am Rechner sitze, kann es schon mal etwas dauern, bis ein Kommentar für alle sichtbar ist.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Protected by WP Anti Spam