Omikron-Basic für den Atari ST bietet Funktionen, die früher in Basic nicht üblich waren: Die von Pascal bekannten Prozeduren machen ein Programm erst richtig übersichtlich.
Im ersten Teil unseres Omikron-Basic-Kurses lernten Sie eine Stärke dieses Basic-Dialekts kennen: mathematische Operationen. Doch Omikron-Basic hat noch andere Stärken. Wer nur einen Farbmonitor oder Farbfernsehgerät besitzt, der konnte das Listing im ersten Teil noch nicht nutzen. Es war nämlich für den Monochrommonitor bestimmt. Damit Sie jedoch auch in den Genuß der Farbe kommen, finden Sie mit Listing 1 eine Umsetzung des Mandelbrot-Listings. Jetzt laufen die Apfelmännchen in der niedrigsten Auflösung mit 320 x 200 Pixel und 16 Farben.
Sie brauchen nur den „Screen“-Befehl durch ein „,16“ ergänzen und die Bildschirmkoordinaten anpassen. In Zeile 15 kommt ein „MOD 16“ statt „MOD 2“, damit Sie alle 16 Farben auf dem Bildschirm darstellen können. Farbenwahl ganz einfach Sie haben jetzt zwar Farbe auf dem Bildschirm, aber die scheint nach dem Zufallsprinzip ausgewählt. Es ist keine erkennbare Ordnung enthalten. Wenn Sie eine Farbpalette aus den gesamten 512 Farben zusammenstellen wollen, dann gibt es den recht mühsamen Weg über das Selbstprogrammieren und den einfacheren Weg mit einem Desk-Accessory. Das Accessory heißt „Control“ (Bild 1), wird jedem ST beigelegt und untersitzt die Änderung der Bildschirmfarbe. Accessories erreichen Sie in Omikron-Basic 3.0 vom Editor aus über das Menü „Run“. Dort steht im letzten Eintrag „Accessory“. Sie gelangen zu einem Hilfsbildschirm, der in der Menüleiste die Accessories enthält. Jetzt können Sie „Kontrollfeld“ aufrufen, und Sie sehen das Kontrollfeld als kleines wie in Bild 1. Wählen Sie jetzt eine der 16 Farben im unteren Drittel des Kontrollfeldes mit dem Mauszeiger an. Anschließend können Sie die Farbe mit den drei Schiebern auf der linken Seite verändern. Die Schieber geben den einzelnen Farbanteil an, und zwar in der Reihenfolge „Rot“, „Grün“ und „Blau“. Alle 512 Farben des ST können aus einer Mischung dieser drei Grundfarben erzeugt werden. Der kompliziertere Weg ist der Omikron-Befehl -„Palette“. Auch dieser Befehl stellt für jede der 16 Farben, die gleichzeitig darstellbar sind, den Rot-, Grün- und Blauanteil ein. Allerdings nicht in Grafik umgesetzt, wie beim Kontrollfeld, sondern anhand von Zahlen.
PALETTE $010, $555, $777
Jeder Eintrag wird durch ein Komma getrennt. Alle 16 Einträge ergeben die komplette Farbpalette, sind es weniger, wie in diesem Beispiel, dann werden nur die Farben mit den Nummern von 1 bis 3 geändert. Das Dollarzeichen ("$") vor den Zahlen gibt an, daß die nachfolgende Ziffer eine Hexadezimalzahl ist. Jede Ziffer repräsentiert den einzelnen Farbanteil einer Farbe, wie die Schieberegler im Kontrollfeld. Die Ziffern können die Werte $000 für Schwarz bis $777 für Weiß annehmen. Alle Zahlenkombinationen zwischen diesen beiden Grenzwerten sind erlaubt. Damit Sie ein Gefühl für die Farbmischung- bekommen, sollten Sie die Einstellungen der Schieberegler vom Kontrollfeld mal etwas genauer untersuchen. Sie werden sicherlich bemerken, daß auch die Schieber acht Stellungen (von 0 bis 7) zulassen. Wenn Sie verschie und die Stellungen der Regler abzählen, dann wissen Sie, welche Farbe im Paletten-Befehl mit dem entsprechenden Zahlenwert erreicht wird. Dies ist gerade während . der Programmierung eine, zwar nicht gerade komfortable, aber doch recht praktische Lösung. Zumal Sie erfahren, welche Farben sich hinter den abstrakten Zahlenwerten befinden.
Jetzt bekommen Sie die Farben so auf den Bildschirm, wie Sie es wollen. Grundsätzlich können Sie alle unsere Beispiel-Listings auf den Farbbildschirm umsetzen. Um das Mandelbrot-Programm erweitern zu können, benutzen wir die wichtigste Form der modularen Programmierung: die Prozedur oder das Unterprogramm. Modulare Programmierung heißt, daß man bei der Programmierung ein große Programm in kleine Modul zerlegt und diese dann au testet. Dadurch gibt es vie weniger Fehler, weil ein Pr blem in einem Teilpr gramm überschaubarer ist. Wir haben unser Mandelbrot-Programm bereits au giebig getestet und wisse daß es einwandfrei läuft. Damit auch unser Programm schön übersichtlich .bleibt, machen wir das Grundprogramm zur Prozedur, wobei die Parametereingabe vom Hauptprogramm übernommen wird. In Listing 2 sehen Sie das Ergebnis.
In Omikron-Basic wird eine Prozedur mit „DEF PROC“ eingeleitet. Anschließend folgt der Name der Prozedur und in Klammern eventuelle Übergabeparameter. In unserem Fall sind die Übergabeparameter die Bildgrenzen „Xmin“, „Xmax“; „Ymin“ und „Ymax“. Um eine Prozedur aufzurufen, gibt man einfach in einer Zeile den Namen und die folgenden Übergabeparameter ein. Zum Beispiel:
Mandel (Xmin!,Xmax!,Ymin!, Ymax!)
Achten Sie auch hier auf die richtigen Variablentypen. Prozeduren haben im Zusammenhang mit Variablen einen Vorteil: die sogenannten lokalen Variablen, die nur innerhalb einer Prozedur gelten. In Bild 2 ist der Zusammenhang zwischen globalen und lokalen Variablen grafisch dargestellt. Der Vorteil der lokalen Variablen ist, daß man Variablen mit gleichem Namen, aber unterschiedlichem Inhalt definieren kann. Zum Beispiel benutzt ein Hauptprogramm eine Variable „Test“. Darin wird der Wert 4 gespeichert. Jetzt wird die Prozedur „Testlauf“ aufgerufen und die Variable „Test“ als lokal definiert. In der Prozedur nimmt Test den Wert 17,33 ein. Nach der Rückkehr aus der Prozedur ins Hauptprogramm enthält Test wieder den Weit 4. Der Wert 17,33 galt nur in der Prozedur.
Variablen sind nur dann als lokal definiert, wenn sie als Übergabeparameter angegeben sind. In Listing 2 sind zum Beispiel „X1!“, „X2!“, „Y1!“ und „Y2!“ lokale Variablen. Wenn Sie mehr Variablen als lokal definieren wollen, dann’ müssen Sie folgendes eingeben:
LOCAL Test, X!, Y$, Z
Alle dem "Local" folgenden Namen sind lokale Variablen, die nur innerhalb der Prozedur gelten, in der sie definiert sind.
In Listing 3 sehen Sie das Hauptprogramm mit dem einfachen Aufbau einer Benutzeroberfläche. Wenn Sie dieses Programm starten, erscheint ein Bildschirm, wie Sie ihn in Bild 3 sehen. Das Hauptprogramm ist in einer Schleife eingebunden „Repeat...Until“, die so lange durchlaufen wird, bis die Bedingung in Zeile 290 erfüllt ist, also die Taste 2 gedrückt wurde. Sonst beginnt das Programm in Zeile. 0. Sie finden in Zeile 10 und 20 drei neue Befehle. Sie heißen „Text Style“, „Text Height“ und „Text“. Auf dem Bildschirm wird mit diesen Befehlen ein Grafiktext ausgegeben, der in der Zeichenkette im „Text“-Befehl steht. Die beiden Zahlenwerte im „Text“ -Befehl geben die Bildschirmposition in Pixel an. Der erste Wert bedeutet die X Richtung, der zweite die Y -Richtung.
Mit „Text Style“ wird das Aussehen des Textes bestimmt. Dies bezieht sich aber nur auf Text, der mit dem „Text“ - Befehl auf dem Bildschirm ausgegeben wird und nicht auf des „Print“-Befehl. In Listing 4 sehen Sie, welche Textformen es gibt, in Bild 4 wie es auf dem Bildschirm aussieht. „Text Height“ gibt die Höhe des auszugebenden Textes an, ebenfalls in Pixel. Sie finden in Zeile 30 einen weiteren Befehl, den Sie bis jetzt noch nicht kannten. Es ist der „Locate“-Befehl. Mit diesem Befehl plazieren Sie den Cursor an eine ganz bestimmte Stelle des Bildschirms. Dieses Mal aber nicht pixelweise, wie es beim Grafiktext der Fall war, sondern Textzeilen- und -spaltenweise. Dabei hat der Bildschirm 25 Zeilen und 80 Spalten. Bei „Locate“ braucht man ebenfalls zwei Parameter, zuerst die Y -Position und anschließend die X-Position.
Damit wären wir am Ende des zweiten Kursteils angelangt. Im dritten Teil in der nächsten Ausgabe beschäftigen wir uns dann mit der GEM-Programmierung.
kl
Bild 1. Mit dem Kontrollfeld steilen Sie die Bildschirm farben ein
Bild z. Lokale Variablen ge ten nur in dem Bereich, in dem sie definiert sind
Listing 1. Das MandelbrotProgramm für den Farbbildschirm
Listing z. Mandelbrot als Prozedur mit Parameter über
0 CLS 1 INPUT "X-min (linke Bildgrenze) ";X1! 2 INPUT "X-max (rechte Bildgrenze) ";X2! 3 INPUT "Y-max (obere Bildgrenze) ";Y1! 4 INPUT "Y-min (untere Bildgrenze) ";Y2! 5 SCREEN 1, MEMORY(32256),16: PRINT CHR$(27)+"f" 6 Xs!=(X2!-X1!)/320:Ys!=(Y1!-Y2!)/200 7 Cy!=Y1!: FOR Y=0 TO 199 8 Cx!=X1!: FOR X=0 TO 319 9 Zr!=0: Zi!=0:I=1 10 Zr2!=2r1 '2rl-2il+Zil+C.I:Zi21e2ZrlZil+Cyl 11 2rl~2~21:Zi!=Zi21 12 IF Zt!'Zrl+Zil'Zil>4 THEN GOTO 15 13 I=I+1: IF I<100 THEN GOTO 10 14 C-0: GOTO 16 15 C-(I+1) MOD 16 16 LINE COLOR .C: DRAW X, Y 17 Cxl=Cx1+X®!: NEXT X:Cyl=Cyl-YSl: NEXT Y 18 END 1000 DEF PROC Mandel(X11,X21,Y11,Y21) 1050 SCREEN 1, NENORY(32256): PRINT CHR$(27)+"f" 1060 X.I=(X21-X11)/640:YSI-(Y11-Y2t)/400 1070 Cyl-Yll: FOR Y-0 TO 399 1080 Cxl-Xlt: FOR X-0 TO 639 1090 Etl=O:ZiI~O:I=1 1100 2r21e'r1 2rl-2il~211+Cx::Zi21=2Zrl+2il+Cyt 1110 2r1-2r21:2i1.2121 1120 IF ZrlZrl+Zi!*Zil>4 THEN GOTO 1150 1130 LI+1: IF I<100 THEN GOTO 1100 1140 C=0: GOTO 1160 1150 C= I 14oD 2 1160 LINS COLOR -C: DRAW X,Y 1170 Cxl=C.I+XSI: NEXT X:CyI=Cyl-YSI: NEXT Y 1180 RETURN
1 Listing 3. Das Hauptprogramm erzeugt die Benutzeroberfläche in Bild 3
Listing 4. Wie der Text auf dem Bildschirm aussieht, zeigt Bild 4
Bild 3. Eine Benutzeroberfläche, die nur mit der Tastatur bedient wird, ist leicht zu programmieren.
10 TEXT HEIGHT =16 20 TEXT STYLE =1 30 TEXT 10 20,"Zeile 20 und 30" 40 TEXT STYLE =2 50 TEXT 10,40,"Zeile 40 und 50" 60 TEXT STYLE =4 70 TEXT 10,60,"Zeile 60 und 70" 80 TEXT STYLE =8 90 TEXT 10,80,"Zeile 80 und 90" 100 TEXT STYLE =16 110 TEXT 10,100,"Zeile 100 und 110" 120 END
Bild 4. Verschiedene Formen von Grafiktext mit Listing 4 erzeugt
0 REPEAT 5 CLS 10 TEXT STYLE =16: TEXT HEIGHT =32 20 TEXT 192,64,"Mandelbrot-Menge" 30 LOCATE 6,28 40 PRINT CHR$(189)+" 1988 by Happy-Computer" 50 LOCATE 8,31 60 PRINT "Omikron-Basic-Kurs" 70 DRAW 0,136 TO 639,136 80 LOCATE 10,38 100 LOCATE 12,,17" 110 PRINT "(1) Parameter-Eingebe" 120 LOCATE 12,55 130 PRINT "(2) Ende" 140 A$= INPUT$(1) 150 IF A$="2" THEN GOTO 300 160 IF A$<>"1" THEN GOTO 5 170 DRAW 0,200 TO 639,200 180 LOCATE 14,35 190 PRINT "Parameter:" 200 LOCATE 16,28 210 INPUT "X-min (linke Bildgranne) ";Xmin1 220 LOCATE 18,28 230 INPUT "X-max (rechte Bildgrenze) ";Xmax1 240 LOCATE 20,28 250 INPUT "Y-max (obere Bildgrenze) ";Ymaxl 260 LOCATE 22,28 270 INPUT "Y-min (untere Bildgrenze) ";Ymin 280 Mandel(Xmin1,Xmax1,Ymax1,Ymin1) 290 UNTIL A$="2" 300 END