QUICK-Ecke Teil 12 von Harald Schönfeld Nach den schwierigeren Themen der letz- ten beiden Ausgaben, folgt heute ein kleines, wohlbekanntes XL-Grafikdemo, daß vor allem dazu dienen soll, die ho- he Geschwindigkeit der QUICK-Programme zu veranschaulichen. Die Normalgrafik Wie man weiß, kann der XL in üblichen Grafikmodi aus einer Farbpalette von 128 Farben nur bis zu 4 verschiedene gleichzeitig darstellen. Um mehr (ja sogar alle!) auf dem Bildschirm ver- wenden zu können, muß man ein wenig in die "direkte Hardwareprogrammierung" einsteigen, wie sie eben nur mit QUICK (oder Assembler) möglich ist. Schattenregister ade Benutzt man im BASIC den Setcolor-Be- fehl, so wird der gewünschte Farbwert in eines der Farbregister COLOR0 bis COLOR4 (708 bis 712) geschrieben. Das- selbe tut der QUICK Setcol-Befehl. Durch das Setzen dieser sogenannten Schattenregister wird jedoch noch nicht direkt die wirkliche Bildschirmfarbe bestimmt. Die eigentlich für die Farbe entschei- denden Register sind nämlich die Hard- wareregister COLPF0 bis COLBK (53270 bis 53274), die direkt im Grafikchip liegen. Diese Register bestimmen zu jeder Mikrosekunde die Farben auf dem Bildschirm. Damit die, mit dem Setcol-Befehl ge- wählten Farben dann auch wirklich auf dem Schirm auftauchen, werden diese Schattenregister- Werte jede 50tel Sekunde von neuem in die Hardware- register kopiert. Dies geschieht, wie üblich , im VBI. Die Zeit drängt Wenn wir nun also viele Farben gleich- zeitig darstellen wollen, müssen wir innerhalb kurzer Zeit verschiedene Werte in die Hardware- Register schrei- ben. Da ein Bildaufbau 1/50 Sekunde dauert, haben wir ja genügend Zeit dafür (in einer schnellen Programmier- sprache). Wollen wir z.B. Regenbogenfarben er- zeugen, so müssen wir einfach alle Werte von 0 bis 254 nacheinander (mit einer kleinen Wartepause) in eines der Register eintragen. Die Folge ist, daß auf dem Schirm nacheinander verschie- dene Farbe erscheinen. Die Regenbogenfarben Um einen schönen Regenbogeneffekt zu erzielen, wollen wir in jeder Zeile des Bildschirms eine andere Farbe dar- stellen. Dabei kommt uns der Grafikchip zu Hilfe: Benutzt man in irgend einer Weise die Seicherzelle WSYNC (54282), so wir der Prozessor solange gestoppt, bis der Elektronenstrahl, am rechten Rand der Zeile angekommen ist. Wird das Programm wieder gestartet, ist für uns der richtige Zeitpunkt gekommen die Frabe zu ändern, denn während der Strahl von rechts nach links zurück- läuft, ist er unsichtbar. Damit ist die Farbänderung nicht auf de Schirm zu sehen. Nun bleibt nur noch ein Problem: Wollen wir ein ruhiges Bild erhalten, so müssen wir dafür sorgen, daß bei jedem Bild das wir aufbauen, in der ersten Zeile die selbe Farbe verwendet wird. Würden wir in der ersten Zeile mit irgend einer Farbe anfangen, so wäre die Frabgestaltung jede 50tel Sekunde ja völlig anders. Aber wie erkennen wir denn, daß wir am Anfang des Bildes stehen? Direkt gar nicht. Ein Programm, das eine Endloschleife darstellt, die ständig Werte in ein Hardwareregister schreibt führt deswegen nicht zum Ziel. Der Rettungsanker ...ist wie immer der VBI. Da der VBI jede 50tel Sekunde, zur selben Zeit am Bildschimende aufgerufen wird, gilt das auch für unsere kleine Routine. Wenn wir unsere Routine im VBI laufen lassen, können wir also sicher sein, daß sie immer gerade am Ende des aktuellen Bildschirmaufbaus aufgerufen wird. Warten wir nun lange genug (z.B. ca. 100 Zeilen lang), so befinden wir uns immer an der selben Stelle im NÄCHSTEN Bildaufbau. Damit können wir problemlos mit einer definierten Farbe an einer definierten Stelle des Bildes beginnen. Der einfache VBI sähe dann etwa so aus: INTER SIMPLVBI BEGIN I=0 REPEAT WSYNC=0 COLBK=I I+ I+ UNTIL I=0 ENDVBI Wir starten also jeden Schirm mit Schwarz (I=0) und durchlaufen eine Schleife. WSYNC=0 greift auf WSYNC zu, und ist somit ein Wartebefel bis zum Zeilenende (damits nicht flackert). Dann schreiben wir die neue Farbe I ins Hardwareregister, erhöhen I um 2 ( ungerade Farben werden ja wie gerade dargestellt!) und tun das ganze solange, bis I=254 war, d.h nun I=0 (254+2 = "256" = 0) ist, denn mehr Farben gibt es nicht. Damit ist unser VBI, der sicher schon 1/100 Sekunde dauert beendet. Kurz daurauf wird der nächste VBI am Bildschirmende von neuem gestartet. Bewegte Regenbogen Der Effekt ist noch ein bißchen ein- drucksvoller, wenn wir jeden Bild- schirmaufbau eben nicht mit der selben, sondern immer mit der nächsten Farbe beginnen. D.h. beim ersten Schirm zei- gen wie die Farben von 0 bis 254, beim zweiten von 2 bis 256 (=0), beim drit- ten 4 bis 258 (=2), ... Damit wird ein nach oben, bzw. nach unten Laufen der Farben erzeugt. Wenn wir nun nicht nur eines, sondern 2 Farbregister ändern, so können wir natürlich die eine Farbe nach oben, die andere nach unten laufen lassen. Damit wir davon aber was sehen, müssen wir natürlich zuvor etwas in der 2ten Farbe auf den Bildschirm zeichen. In unserem Fall malen wir einfach 3 Rechtecke auf den Schirm. Die "Bewegung" erzielen wir, indem wir zu dem immer von 0 bis 254 laufenden I einen Wert S zählen, den wir nach jedem VBI um 2 erhöhen oder erniedrigen. Wenn man versucht mehr als 2 Farben pro Zeile zu ändern ( und dabei auch noch ständig S zu addieren), dann muß man feststellen, daß auch QUICK nicht mehr schnell genug ist und alles zu flackern beginnt. Wenn man Pech hat, stürzt der XL auch ab, weil der VBI nicht mehr schnell genug beendet wird. Das Programm Das folgende Listing zeigt genau das oben Beschriebene. Man kann daran sehen, wie leicht es in QUICK ist, solche Effekte zu erzielen, wenn man sich ein wenig mit der Hardware der XL/XE auskennt. Bei diesem Programm wird am VBI-Ende die Textfensterfarbe zusätzlich geändert, so daß der dort stehende Text ebenfalls seine Farbe ändert. Das hat mit dem Regenbogen eigentlich nichts zu tun. Quick-Sourcetext D1:COLOR.QIK ---------------- BYTE (+ (= Eckige Klammer) * zur Synchronisation am Zeilenende WSYNC=54282 * Schleifenzaehler I * Hardware-Farbregister CPF0=53270,CPF1=53271 CPF2=53272,CPF4=53274 * Zaehler S1,S4,C * Cursordarstellung CURS=752 )+ (entspricht eckiger Klammer) MAIN *Grafik 15 mit Textfenster oeffnen CLOSE(6) OPEN(6,24,15,"S:") SETCOL(2,0,0) SETCOL(1,0,0) * Cursor unsichtbar CURS=1 ? ?(" 128-Farben-Demo in QUICK") * Farbzaehler initialisieren S4=0 S1=0 * Rechtecke zeichnen I=50 COLOR(2) REPEAT PLOT(I,56) DRAW(I,136) I+ UNTIL I=110 I=70 COLOR(0) REPEAT PLOT(I,76) DRAW(I,116) I+ UNTIL I=90 I=76 COLOR(2) REPEAT PLOT(I,86) DRAW(I,106) I+ UNTIL I=84 * Farblauf starten VBI(ALLCOLORS) ENDMAIN * Laesst Farben in 2 Farbregistern * zeilenweise durchlaufen INTER ALLCOLORS BEGIN * Warten bis in Bildschirmmitte (von * oberer Kante aus) I=0 REPEAT WSYNC=0 I+ UNTIL I=120 * 128 Zeilen lang jeweils eine andere * Farbe darstellen I=0 REPEAT * Erst synchronisieren WSYNC=0 * In die beiden Register mit einem * bestimmten Vorlauf schreiben ADD(I,S4,CPF4) ADD(I,S1,CPF1) I+ I+ UNTIL I=0 WSYNC=0 * Textfensterfarben anpassen CPF4=0 ADD(I,S1,C) AND(C,240,CPF2) * Vorlauf aendern um Bewegung zu * erhalten S4+ S4+ S1- S1- ENDVBI Das Bespiellisting ist auf der zweiten Seite der Diskette ebenfalls vorhanden (siehe dazu DIE PROGRAMME DIESER AUSGABE). Geladen werden muß es von dem QUICK-Editor in der dafür üblichen Weise.