Endlich da! GFA-Basic 3.0

Bild 1: Ein einfaches Beispiehl für eine Mehrfachverzweigung mit SELECT und CASE.

Es war einmal, vor langer, langer Zeit, da wurde jedem ATARI ST-Käufer ein ziemlich langsamer BASIC-Interpreter namens “ST-BASIC” mitgeliefert. Mit extrem wenigen Befehlen konnte der Aufsteiger seine Programmierkenntnisse nutzen, die er bereits anderweitig erworben hatte, denn mit dem (anfangs noch englischen) Handbuch war dies kaum möglich. Abgesehen davon lagen die Geschwindigkeiten, die die Programme erreichten, noch unter denen eines Commodore 64.

Lang ersehnt erschien gegen Juli 1986 endlich ein neues BASIC, das GFA-BASIC V1.0. Überglücklich wagte man sich ans Programmieren, was nach Umstellung auf die fehlenden Zeilennummern zu einem richtigen Vergnügen ausartete. Nicht nur die vielen zusätzlichen Funktionen, auch die Geschwindigkeit begeisterte. Etwas später wurde es erweitert zum GFA-BASIC V2.0. Wieder zollten die BASIC-Programmierer GFA hohes Lob, da die Version V2.0 alles bisher Dagewesene übertraf. Dann erschien das OMIKRON-BASIC, was noch besser, noch schneller, aber in der Bedienung doch ganz anders war.

Aber nun schlug GFA-Systemtechnik in Düsseldorf zurück!

Am 30. März 1988 wurde uns anläßlich einer Pressekonferenz die Vorabversion des neuen GFA-BASICs, Version 3.0, übergeben. Wir hatten Gelegenheit, die Vorabversion des neuen Super-BASICs zu testen und waren mehr als überrascht, was in dem neuen GFA-BASIC V3.0, das nicht einmal 90 KByte umfaßt, alles drinsteckt.

Dieses BASIC übertrifft mit Abstand alle bisher auf dem ATARI ST bekannten BASIC-Dialekte in Bezug auf die Befehls- und Funktionsvielfalt. Hatte die Version V1.0 schon rund 180 Befehle und Funktionen, so brachte es die Version V2.0 auf immerhin etwa 210. Die neue Version V3.0 wirft ca. 390 Befehle in die Waagschale, wobei hier natürlich die neu eingebundenen AES- und Line-A-Befehle den Löwenanteil stellen. Da immer noch der Streit zwischen den Programmierfreaks herrscht, ob BASIC als Programmiersprache überhaupt ernst zu nehmen sei, wurde mit GFA 3.0 nun ihr Ansehen weiter gesteigert. Schließlich ist BASIC im Home- und Personal-Computerbereich noch immer eine der am weitesten verbreiteten Programmiersprachen überhaupt, nicht nur wegen der äußerst leichten und schnellen Erlernbarkeit.

Wir wollen hier jedoch nur die Erweiterungen und Veränderungen gegenüber der Version 2.0 erwähnen, da sonst der Umfang des ganzen Heftes gesprengt würde.

Der Editor

“Schneller, höher, weiter”, das war schon das Prinzip der alten Römer. Dies hat auch GFA erkannt und den Editor noch weiter verbessert. Gegenüber der alten Version wurde vieles verändert und erweitert.

Am auffälligsten ist sicherlich die Uhrzeit, die ständig angezeigt wird. Hier kann sich der Programmierer freuen, der um 22 Uhr ins Bett wollte, und um 5 Uhr morgens bemerkt, daß es “ja schon so spät” ist. Abgesehen davon wird ständig die aktuelle Programmzeile angezeigt, in der sich der Cursor gerade befindet. Dies ist vor allem dann extrem nützlich, wenn man mit Hilfe einer Cross-Referenzliste versucht, irgendwelche Fehler zu finden und zu entfernen. Ferner ist es möglich, direkt die Nummer der Programmzeile einzugeben, in die man springen will, was prompt vom Interpreter erledigt wird.

Nun kann man außerdem zwischen mehreren Programmzeilen wechseln, ohne daß sich der Cursor dauernd an den Anfang der Zeile bewegt. Um dies noch zu erleichtern, läßt sich der Ziffernblock der Tastatur als Cursortastenblock umbelegen. Hier hat man dann die Möglichkeit, ähnlich einem PC, seinen Cursor um ein Zeichen in alle Richtungen zu bewegen, eine Seite vor- oder zurückzublättern, beziehungsweise gleich ans Ende oder den Anfang des Programmes zu springen. Weiterhin wurden sehr viele Tasten in Kombination mit der CONTROL-Taste überaus nützlich belegt, was viel Arbeit spart.

Ein weiterer riesiger Vorteil besteht darin, daß sich die Funktionstasten endlich mit Texten belegen lassen. Über SHIFT und ALTERNATE stehen insgesamt 20 Funktionstasten zur beliebigen Belegung mit Befehlen, Texten oder anderem zur Verfügung. Die alten Funktionstastenbelegungen bleiben jedoch weiterhin erhalten. Weiter verbessert wurde auch die Such- und Ersatztexteingabe. Hatte man sich früher einmal vertippt, so mußte man den gesamten Suchtext erneut eingeben. Jetzt wird der alte Text angezeigt und kann jederzeit nach Belieben verändert werden. Eine weitere Augenfreude für den Programmierer ist die Möglichkeit, seine Prozeduren auf- oder zuzu”klappen”. Man kann durch kurzen Tastendruck eine ganze Unterprozedur auf eine Zeile verkürzen. Dies schafft mehr Übersichtlichkeit bei längeren Programmen. Somit lassen sich im Listing äußerst übersichtliche Programme darstellen, die scheinbar nur aus sehr wenigen Zeilen bestehen.

Noch mehr Datentypen

Bei der Version 2.0 gab es die “normalen” Integerzahlen, die 32 Bit (4 Byte) lang waren, die Fließkommazahlen mit 48 Bit (6 Byte), die Stringvariablen mit einer Maximallänge von 32767 Zeichen und die Boolean-Variablen, die die Werte -1 (TRUE) und 0 (FALSE) annehmen konnten und nur 1 Bit umfaßten (in Arrays, sonst 1 Byte).

Bei der neuen Version existieren die Typen BOOLEAN (1 Bit), BYTE (1 Byte lang), CARD (2 Byte, ohne Vorzeichen), INT (2 Byte, mit Vorzeichen), LONGINTEGER (4 Byte), SINGLE (4 Byte, IEEE-Format -einfache Genauigkeit), DOUBLE (8 Byte, IEEE-Format - doppelte Genauigkeit), FLOAT (8 Byte, GFA-3.0 Format) und CHAR (Zeichenkette mit Nullbyte). Gekennzeichnet werden die einzelnen Variablen ebenso wie im OMIKRON BASIC mit sogenannten Postfixen, Dies sind Zeichen, die der Variablen hintenangestellt werden, zum Beispiel a% für die Integer-Variable a usw.

Außerdem können den Variablen, die mit einem bestimmten definierbaren Buchstaben beginnen, feste Datentypen zugewiesen werden, zum Beispiel alle Variablen mit b sind integer, alle mit c float usw.

Die Arithmetikgenauigkeit wurde von 11 Stellen auf 13 Stellen erhöht. Die Trigonometrischen Funktionen wurden um ASIN, ACOS (Arcussinus, Arcustangens), SINQ und COSQ (interpolierter Sinus und Cosinus) ergänzt.

Bild 2: Auch die AES-Routinen sind jetzt implementiert.

Bitoperationen

Um die Geschwindigkeit der Programme weiter erhöhen zu können, wurden diesesmal auch maschinennahe Befehle implementiert, die die Beeinflussung von einzelnen Bits ermöglichen und somit das lästige ODERn und UNDen endlich in Vergessenheit geraten lassen. Es lassen sich einzelne Bits löschen (BCLR), setzen (BSET), abfragen (BTST) und auch negieren (= exklusiv verodem, BCHG). In Anlehnung an die Maschinensprache wurden auch Bit-Verschiebebefehle installiert. Hiermit kann man Bytes, Worte oder Langworte um eine beliebige Anzahl an Bits nach links (SHL) oder rechts (SHR) verschieben. Außerdem lassen sich die Bits auch rotieren (ROL, ROR); d.h. daß die “rausgeschobenen” auf der anderen Seite wieder “hereingeschoben” werden. Und für diejenigen, die oft mit Langworten jonglieren müssen, gibt es die Möglichkeit, LO- und HI-Wort zu vertauschen (SWAPO). Ferner lassen sich auch Zahlenwerte ganz einfach mit AND(), OR(), XOR(), IMP() und EQV() manipulieren. Genauso kann man aus mehreren Bits (zum Beispiel aus einem Langwort mit 32 Bit) einen Teil auslesen, zum Beispiel 8 Bit (BYTE(), CARD(), WORD()).

Strukturbefehle

Die Essenz eines jeden Programms besteht meist aus den hunderten von Vergleichen. IF ... THEN ... ELSE ... ENDIF. Bisher war man auf diese vier Befehle beschränkt. Doch jetzt wird das Programmiererherz wieder höher schlagen. Zur Verfügung stehen auch ELSEIF, SELECT, CASE TO, DEFAULT, OTHERWISE, ENDSE-LECT und CONT. Damit ist endlich eine gezielte Mehrfachabfrage möglich. Man muß nicht mehr viele IFs hintereinanderschachteln, sondern kann mittels CASE ganz einfach jeden einzelnen Fall auswerten.

Um Umsteigern von anderen Programmiersprachen den Weg zu erleichtern, wurden die Befehle wie NEXT, UNTIL, WEND, LOOP um zusätzliche erweitert: ENDFOR, ENDREPEAT, ENDWHILE, END-DO. Die einfache DO ... LOOP-Endlosschleife wurde wesentlich verbessert. Neu sind DO WHILE, DO UNTIL, LOOP WHILE, und LOOP UNTIL, die eine noch effektivere Schleifenprogrammierung ermöglichen. Auch bei den Unterprogrammen ist man nicht mehr stur gezwungen, RETURN ans Ende zu setzen. ENDPROC und ENDSUB stehen zusätzlich zur Verfügung.

Mehrzeilige Funktionsprogrammierung

Ließen sich früher Funktionen mittels DEFFN immer nur einzeilig entwerfen, so gibt es nun die Möglichkeit, sie mehrzeilig wie eine Prozedur zu definieren (FUNCTION, END-FUNC). Außerdem läßt sich am Schluß ein ganz bestimmter Variablenwert zurückgeben (RETURN x). Für einige Anwendungszwecke ist es nötig, Variablen direkt zu manipulieren und am Ende eines Unterprogrammes den neuen Wert an die alte Variable zurückzugeben. Bei Version 2.0 mußte man im Unterprogramm entweder den gleichen Variablennamen benutzen, was spätestens beim zweiten Aufruf zu Kollisionen führte und äußerst unflexibel war. Oder man mußte über Pointer die Variable indirekt verändern, was jedoch meist etwas umständlich verlief. Doch auch diesem kleinen Manko wurde abgeholfen. Ab sofort ist es möglich, eine Variable nicht als Wert zu übergeben, sondern als Variable selbst (VAR). Somit kann man den Variableninhalt beliebig oft verändern, ohne den gleichen Variablennamen benutzen zu müssen. Aber dennoch ist es möglich, ein solches Unterprogramm individuell zu nutzen. Diese Möglichkeit wird in erster Linie auch denjenigen große Erleichterung bringen, die gerne mit rekursiven Prozeduren - also Unterprogrammen, die sich selbst aufrufen - arbeiten.

Interruptprogrammierung

Bei OMIKRON hat man wohl die Möglichkeit der Interruptprogrammierung abgeschaut, hat diese jedoch wesentlich eleganter gelöst. Es ist nicht nur der stupide Aufruf eines Unterprogrammes nach einer bestimmten Zeit möglich, der Aufruf kann einmalig oder unendlich oft geschehen. Die Zeit kann in tausendstel Sekunden angegeben werden, wobei jedoch höchstens alle zwei Millisekunden ein Aufruf stattfinden kann. Hierzu dienen die Befehle EVERY und AFTER. Die Anwendungsmöglichkeiten der Interruptprogrammierung sind äußerst weit gestreut, von der nebenbei ablaufenden SOUND-Demonstration, über Bildschirmschwarzschaltung nach bestimmter Zeit, Passwortabfragen bis hin zu Bildschirmspielereien oder eventuell sogar periodisch auftauchenden Viren (hoffentlich gutartige).

Fehlersuche

Aber es wurde auch an die genervten Programmierer gedacht, die nach stundenlanger Fehlersuche oft beabsichtigten den Computer aus dem Fenster zu werfen, weil der Programmfehler immer noch nicht entdeckt war. Waren sie früher noch auf TRON und TROFF angewiesen, so können sei heute mittels TRON PROCEDURE nach jeder Befehlsausführung auch in eine TRACE-Prozedur hineinspringen und dort den letzten Befehl, der in der Variable TRACE$ zu finden ist, auswerten. Auch muß sich der Anwender nicht mehr mühsam alle Felder eines Arrays per Hand im Direktmodus ausprinten lassen. Mit dem Befehl DUMP lassen sich alle Variableninhalte auf den Bildschirm oder in eine Datei ausgeben.

Grafikprogrammierung

Sicherlich kennt man von Malprogrammen (wie zum Beispiel STAD) die Möglichkeit, einen ausgefüllten Kreis mit oder ohne Begrenzungslinie zeichnen zu lassen. Mußte man diesen Parameter früher mühsam über die VDI-Routinen einstellen, so genügt nun ein einziger Befehl, die Begrenzung ein oder auszuschalten: BOUNDARY.

Auch bei dem Befehl FILL hat man sich in Düsseldorf etwas einfallen lassen, was bereits bei besseren Grafikprogrammen Anwendung gefunden hat. War eine Fläche einmal nicht bis auf den letzten Punkt begrenzt, so konnte es schon einmal Vorkommen, daß der Füllvorgang “übergelaufen” ist und die ganze Zeichnung zerstört war. Nun kann man auch so füllen, daß die Füllfarbe nicht mehr zu weit fließt, sondern bei Berühren bestimmter Punktfarben oder Begrenzungen mit kleiner Lücke stoppt. Aber auch die Fans der Programmiersprache LOGO sollten nicht zu kurz kommen. Sicherlich habe sich einige an die Befehle FORWARD 10, RIGHT 90, BACK 20, LEFT 45 usw. gewöhnt. Im GFA-BASIC 3.0 können ab sofort die gleichen Befehle verwendet werden. Zur Verfügung stehen FD (Forward), BK (Backward), SX und SY (Scale x/y), LT (Left) und RT (Right) zur Bewegung des Zeichenstiftes und zur Drehung in eine bestimmte Richtung. Die Richtung kann auch gradweise absolut bestimmt werden mit TT (Tum To). Mit MA (Move Absolut) läßt sich der Stift an eine bestimmte Koordinate setzen bzw. kann mit DA (Draw Absolute) von der aktuellen Position an die neue eine Linie gezeichnet werden. Mit MR (Move Relative) und DR (Draw Relative) kann man den letzten Punkt als Bezugsnullpunkt verwenden. Mit CO (Color) läßt sich die Zeichenfarbe des Stiftes bestimmen. Ebenso wie in LOGO kann auch der Zeichenstift vom Papier abgehoben (PU - Pen Up) oder wieder auf das Papier heruntergelassen (PD - Pen Down) werden. Mit den sechs Variablen DRAW(O) bis DRAW(5) lassen sich die X- und die Y-Position abfragen. Außerdem können der Wert des momentan eingestellten Winkels des Zeichenstiftes, die Skalierung in X-und in Y-Richtung und der Zustand des Stiftes (-1=PD, 0=PU) ermittelt werden.

Die Besitzer eines MEGA ST’s können aufatmen. Der Programmierer des GFA-BASICs 3.0 hat auch daran gedacht, die Maus an eine bestimmte Position setzen zu können. Diese Möglichkeit wird ja bereits bei manchen Programmen erfolgreich angewandt. Den Trick der Mauskoordinatenmanipulation ist in Ausgabe 4 (April) in der ST-Ecke auf Seite 143 genauer beschrieben. Da dieser jedoch vom neuen TOS abhängig ist, kann man mittels des Befehls SET-MOUSE x,y nicht auf allen ST's die Mauskoordinaten einstellen.

LINE-A Routinen nun implementiert

Und wieder ging ein Traum in Erfüllung. GFA-Systemtechnik hat sich hingesetzt und die LINE-A Routinen gleich als Befehle eingearbeitet.

Dies bringt in erster Linie einen Geschwindigkeitsvorteil. Nichtsdestotrotz blieben alte und bewährte Befehle, wie zum Beispiel PLOT oder LINE erhalten. Für die LINE-A Benutzer stehen jedoch insgesamt neun Routinen zur Verfügung.

Hierzu gehört ACLIP. Mit diesem Befehl läßt sich am Bildschirm ein Begrenzungsrechteck festlegen und ein- bzw. ausschalten. Alle Grafikausgaben, die dann über diesen Bereich hinaus erfolgen, werden abgeschnitten. Die Funktion wird also in etwa der eines Fensters gerecht. Mittels dem Befehls PSET lassen sich Punkte am Bildschirm in einer gewünschten Farbe setzen. Der Befehl entspricht also in etwa PLOT. Mit PTST kann die Farbe eines Punktes ermittelt werden. Hierzu wird die Farbe aus dem Speicher ausgelesen und übergeben (wie bei POINT()). Mit dem Befehl ALINE kann man eine Linie zwischen zwei Koordinaten zeichnen. Außerdem kann die Punktfarbe vorgegeben und ein Linienmuster festgelegt werden. Zusätzlich wird noch der Grafikmodus eingestellt (Replace, Transparent, Invertiert oder Revers). Mit HLINE kann man horizontale Linien zwischen zwei Punkten auf gleicher Höhe zeichnen lassen. Diese Funktion ist noch schneller als ALINE. Auch hier lassen sich Linienmuster, Graphikmodus und Farbe angeben. Mit ARECT kann man ein gefülltes Rechteck mit eckigen Ecken auf den Bildschirm bringen. Hier lassen sich Füllfarbe und ein beliebiges Füllmuster (bitweise) angeben (entspricht in etwa PBOX).

Fensterverwaltung

Bei der Fensterverwaltung kam nicht allzuviel hinzu. W_HAND liefert die Handle Nummer eines GEM-Fensters. Mit W_INDEX kann man die Fensternummer an ein GEM-Handle zurückmelden. Der Befehl TOPW (Topwindow) wurde eingeführt, um dem Benutzer das aufwendige Anklicken eines der hintenliegenden Fenster zu ersparen. Ruft man ihn auf, so wird das Fenster mit der entsprechenden Nummer aktiv und kommt wieder in den Vordergrund.

VDI-Aufrufe

Es wurde auch an die GEM-Routinen gedacht. Um den Umgang mit dem VDI nicht weiterhin mühsam über DPOKEs einstellen zu müssen, kann ein Teil der CONTRL, INTIN und PTSIN Variablen direkt über den Befehlsaufruf vorgegeben werden. Außerdem läßt sich auch der Subopcode, also die Unterroutine einer VDI-Routine mit dem Befehl VDI-SYS spezifieren.

Dazu wurde ein WORK_OUT() Array installiert, mit dem sich alle nötigen Parameter abfragen lassen. Dies kann die Bildschirmbreite, -höhe, die Anzahl der verfügbaren Farben und vieles andere eines angeschlossenen Gerätes (zum Beispiel Monitor) sein.

Bild 3: Die Menüleiste des GFA-BASICs mit dem Ergebnis des kleinen Programms aus Bild 2.

GEM-AES, Benutzung ganz einfach

Wieder wurde an die Assembler-Programmierer gedacht. Die einzelnen Datenregister DO bis D7 lassen <ch genauso wie die Adressregister AO bis A6 mittels RCALL mit beliebigen Werten vorbelegen. Somit hat das mühsame gePOKEe um Werte an Maschinenspracheprogramme zu übergeben endlich ein Ende. Natürlich können über dieses Array auch Werte aus den Datenregistern ausgelesen werden, so daß ein reger Datenaustausch möglich ist.

Die Routinen des AES wurden reichlich implementiert. Zu finden sind verschiedene Bibliotheken. Zum einen die applications library. In ihr finden sich die Befehle, die mit Applikationen zu tun haben. Dies sind APPL_INIT, APPL_EXIT, die bei Start oder Ende des GFA-Programmes automatisch ausgeführt werden. Mit APPL_READ lassen sich Bytes aus dem Ereignisbuffer lesen, mit APPL_WRITE in den Buffer schreiben. Durch APPL_FIND läßt sich eine Anwendung finden und die Identifikationsnummer kann ermittelt werden. Die Befehle APPL_TPLAY und APPL_TRECORD zum Abspielen und Aufzeichnen bestimmter Ereignisse vervollständigen die Reihe der Applikationsbefehle.

Aber es wurde auch die event library implementiert. Mit Hilfe von EVNT_KEYBD kann auf ein Tastaturereignis gewartet werden. Mit EVNT_BUTTON kann man auf Mausklicks warten. Durch den Befehl EVNT_MOUSE kann man darauf warten, daß die Maus einen rechteckigen Bildschirmbereich verläßt oder betritt. Dies kann zum Beispiel dazu verwendet werden, um bei einem Grafikprogramm die Maus im Zeichenfeld als Pinsel erscheinen zu .assen usw. Durch EVNT_MESAG sann eine Mitteilung in den Ereignisbuffer geschrieben werden. EVNT_TIMER wartet eine angegebene Zeit von Millisekunden. Der wohl interessanteste Befehl für events ist EVNT_MULTI. Mit ihm lassen sich die verschiedensten Ereignisse kontrollieren. Zu guter letzt kann mit EVNT_DCLICK die Geschwindigkeit für Doppelklicks der Maus eingestellt werden.

Zur Programmierung von Pull-Down-Menüs gibt es die Befehle MENU_BAR zum Zeichnen eines Menüs, MENIUCHECK um Häkchen vor einem Eintrag zu setzen oder zu löschen, mit MENU_IENABLE lassen sie sich als anwählbar oder nicht anwählbar darstellen. MENU_TNORMAL stellt einen Eintrag normal oder invers dar. MENU_REGISTER gibt die Namen der maximal sechs Accessories aus.

Zur Manipulation und Darstellung von Dialogboxen und ähnlichem gibt es die object library, mit den Befehlen OBJC_ADD, OBJC_DELETE, OBJC_DRAW um ein Objekt zu zeichnen, OBJC_FIND zum finden, OBJC_ORDER um die Objektreihenfolge zu beeinflussen, OBJC_ OFFSET zu Koordinatenberechnung, OBJC_EDIT und OBJC_CHANGE.

Speziell zu Kontrolle dient die form library mit FORM_DO, FORM_DIAL, FORM_ALERT, FORM_ERROR, FORM_KEYBD und FORM_BUTTON.

Die graphics library mit GRAF_ RUBBERBOX ist zum Zeichnen bestimmter Markierungen, zum Beispiel ein sich bewegendes Rechteck, gedacht. Weiterhin stehen GRAF_ DRAGBOX, GRAF_MOVEBOX, GRAF_GROWBOX, GRAF_ SHRINKBOX, GRAF_WATCH-BOX, GRAF_SLIDEBOX und GRAF_HANDLE zur Verfügung, deren Name meist schon auf ihre Funktion hindeutet. GRAF_ MOUSE und GRAF _MKSTATE runden die Befehlsvielfalt ab.

Durch SCRP_READ und SCRP_ WRITE ist der Datenaustausch zwischen verschiedenen Applikationen möglich. Auch die Fensterverwaltung wurde wesentlich vereinfacht. Mit WIND_CREATE, WIND_ OPEN, WIND_CLOSE, WIND_ DELETE, WIND_GET, WIND_ SET sind dem “fensterln” ebenso wenig Grenzen gesetzt, wie mit WIND_UPDATE und WIND_ CALC.

Die Benutzung von Resource-Code-Files wurde durch verschiedene Befehle ebenfalls erleichtert: RSRC_ LOAD, RSRC_FREE, RSRC_GADDR, RSRC_SADDR und RSRC_OBFIX lassen sich direkt als Befehle ansprechen. Abschließend soll hier noch die SHELL-Bibliothek erwähnt werden, auf die wir jedoch nicht näher eingehen möchten.

Zusammenfassung

GFA-BASIC V3.0 ist im Moment wohl der wohl leistungsfähigste BASIC-Interpreter auf dem ATARI ST und mit seiner Befehlsvielfalt von fast 400 Befehlen kaum zu überbieten (Es bleibt allerdings abzuwarten, was sich als Antwort im Hause OMIKRON tut). Für jede Anwendung lassen sich überaus nützliche Befehle einsetzen. Die Geschwindigkeit gegenüber Version V2.0 konnte im Interpreterbereich ebenfalls gesteigert werden. Der Editor überzeugt durch seine gut konzipierten Eigenschaften und durch die Syntaxüberprüfung jedes einzelnen Befehles direkt bei der Eingabe. Die Tastenbelegungen sind ebenfalls gut durchdacht und sparen dem Programmierer viel Zeit. Durch die Fehlersuchmöglichkeiten bleibt auch hier kaum ein Wunsch offen. Das Handbuch ist hervorragend aufgebaut und erläutert jeden Befehl äußerst ausführlich und genau, es ist stets ein Beispielprogramm abgedruckt, das die Funktion genau aufzeigt und die Syntax demonstriert. Vor allem auch die LINE-A und die AES-Implementation beeindrucken durch ihre einfache Benutzbarkeit und Vielfalt. Oft sind gleiche Befehle mit verschiedenen Worten ansprechbar (NEXT / ENDFOR), was sicher auch vielen Umsteigem von anderen Sprachen eine große Hilfe ist. Durch die 13-stellige Rechengenauigkeit kommen auch mathematisch Interessierte auf ihre Kosten.

Als negativ wurde von uns sehr wenig empfunden. Dazu gehört, daß die VDI-Routinen noch nicht komplett implementiert sind, so wie es mit den AES-Routinen geschehen ist. Hier wäre eine Implementation wünschenswert, zumindest von den Funktionen, die noch nicht durch jegliche Befehle benutzbar sind. Der passende Compiler soll in etwa einem halben Jahr erscheinen, es bleibt jedoch noch abzuwarten, wann dieser fehlerfrei zu haben sein wird. Aber es kann sich bis zur endgültigen Version ja noch einiges verändern. Inwieweit noch mehr Neuerungen eingebaut werden, bleibt abzuwarten, aber schon jetzt ist wirklich fast alles Denkbare vorhanden.

Übersicht über die Befehle und Funktionen des neuen GFABASIC 3.0

DEFxxx DEFLIST

Felder
DIM DIM? OPTION BASE ARRAYFILL

Typumwandlung
ASC() CHR$() STR$() BIN$() OCT$() HEX$() VAL() VAL?() CVx() MKx$() CINT() CFLOAT()

Pointeroperationen

Löschen und Vertauschen
CLEAR CLR ERASE SWAP SSORT QSORT INSERT DELETE

Reservierte Variablen
FALSE TRUE PI DATE$ TIME$ TIMER SETTIME

Spezielles
LET VOID

Speicherverwaltung
FRE BMOVE BASEPAGE HIMEM RESERVE MALLOC MSHRINK

MFREE

Mathematische Funktionen
ABS SGN ODD EVEN INT TRUNC FIX FRAC ROUND MAX MIN SQR EXP LOG LOG 10 SIN COS SINQ COSQ TAN ATN

Zufallszahlengenerator
RND RANDOM RAND RANDOMIZE

Befehle und Arithmetik
DEC INC ADD SUB MUL DIV PRED() SUCC() ADD() SUB() MUL() DIV() MOD()

BIT-Operationen
BCLR BSET BTST BCHG SHL SHR ROL ROR AND() OR() XOR() IMP() EQV()

SWAP() BYTE() CARD()

Zeichenkettenverwaltung
LEFT$ RIGHT$ MID$ (als Befehl und Funktion) PRED SUCC LEN INSTR RINSTR STRINGS SPACE$ SPC UPPERS LSET RSET

Tastatureingabe
INKEY$ INPUT LINE INPUT FORM INPUT FORM INPUT AS

Bildschirmausgabe
PRINT PRINT AT() LOCATE PRINT USING PRINT AT() USING DEFNUM CRSCOL CRSLIN POS TAB HTAB VTAB KEYPAD KEYTEST KEYGET KEYLOOK KEYPRESS KEYDEF

Datenzeilen
DATA READ RESTORE

Dateiverwaltung_
DFREE() CHDRIVE DIR$ CHDIR DIR TO FILES TO MKDIR RMDIR

Dateien
EXIST OPEN LOF() LOC() EOF() CLOSE TOUCH NAME AS KILL BLOAD BSAVE BGET BPUT

Sequentieller/Indexseq. Zugriff
INP# OUT# INPUT$# INPUT# LINE INPUT# STORE# RECALL# PRINT# PRINT# USING SEEK RELSEEK

Wahlfreier Zugriff
FIELD AS AT RECORD GET# PUT#

Byteweise Ein- und Ausgabe
INP() INP?() OUT() OUT?()

Serielle/MIDl Schnittstelle
INPAUX$ INPMID$

Maus und Joystick
MOUSEX MOUSEY MOUSEK MOESE SETMOUSE HlDEM SHOWM STICK x STICK() STRIG

Drucker
LPRINT LPOS() HARDCOPY

Tonerzeugung
SOUND WAVE

Entscheidungsanweisungen
IF THEN ELSE ELSEIF ENDIF

Mehrfachverzweigungen
ON GOSUB SELECT CASE TO DEFAULT OTHERWISE ENDSELECT CONT

Schleifen
FOR TO STEP NEXT ENDFOR REPEAT UNTIL ENDREPEAT WHILE WEND ENDWHILE DO LOOP EN DDO DO WHILE DO UNTIL LOOP WHILE LOOP UNTIL EXIT IF

Unterprogrammbildung
GOSUB PROCEDURE RETURN ENDPROC ENDSUB LOCAL VAR FUNCTION ENDFUNC RETURN x DEFFN

Ereignisbezogene Verzweigungen
ON BREAK ON BREAK CONT ON BREAK GOSUB ON ERROR ON ERROR GOSUB RESUME RESU ME NEXT ERROR ERR ERRS FATAL

Interrupt-Programmierung
EVERY EVERYSTOP EVERYCONT AFTER ATTER STOP ALTER CONT

Sonstige
REM GOTO PAUSE DELAY END EDIT STOP SYSTEM QUIT

Fehlerbehandlung
TRON TROFF TRON PROCEDURE TRACES DUMP

Grafik-Definitionsbefehle
SETCOLOR COLOR ! DEFMOUSE DEFMARK DEFFILL BOUNDARY OFFLINE DEFTEXT GRAPHMODE

Allgemeine Grafikbefehle
PLOT LINE DRAW DRAW TO BOX PBOX RBOX PRBOX CIRCLE PCIRCLE ELLIPSE PELLIPSE POLYLINE OFFSET POLYMARK OFFSET POLYFILL OFFSET POINT() FILL CLS TEXT SPRITE

Bildschirmausschnitte
SGET SPUT GET PUT

Ereignisverwaltung
ON MENU MENU() ON MENU BUTTON ON MENU KEY GOSUB ON MENU IBOX GOSUB ON MENU OBOX GOSUB ON MENU MESSAGE GOSUB

Pull-Down-Menüs
ON MENU GOSUB MENU m$() MENU OFF MENU KILL MENU

Fensterbefehle
OPENW CLOSEW CLEARW TITLEW INFOW TOPW FULLW WINDTAB

Sonstige
ALERT FILESELECT

Systemroutinen
L: W: OEM DOS BIOS XBIOS

Line-A Aufrufe
PSET PTST ALINE HLINE ARECT APOLY TO BITBLT ACHAR ATEXT ACLIP

VDI-Aufrufe
CONTRL INTIN PTSIN PTSOUT INTOUT PTSOUT VDISYS VDIBASE WORK_OUT()

GEM-AES Aufrufe
GCONTRL ADDRIN ADDROUT GlNTIN GINTOUT GB GEMSYS

Unterroutinenaufruf
C: MONITOR CALL RCALL EXEC

Applikationsbibliothek (application library)
APPL_INIT APPL READ APPL_WRITE APPL_FIND APPL_PLAY APPL_TRECORD APPL_EXIT

Ereignis-Bibliothek (event library)
EVNT_KEYBD EVNT_BUTTON EVNT_MOUSE EVNT_MESAG EVNT_TIMER EVNT_MULIT EVNT_DCLICK

Menü-Bibliothek (menu library)
MENU_BAR MENU_ICHECK MENU_IENABLE MENU_TNORMAL MENU_TEXT MENU_REGISTER

Objekt-Bibliothek (object library)
OBJC_ADD OBJC_DELETE OBJC_DRAW OBJC_FIND OBJC_OFFSET OBJC_ORDER OBJC_EDIT OBJC_CHANGE

Formular-Bibliotheken (form library)
FORM_DO FORM_DIAL FORM_ALERT FORM_ERRROR FORM_CENTER FORM_KEYBD FORM_BUTTON

Grafik-Bibliothek (graphics library)
GRAF_RUBBERBOX GRAF_DRAGBOX GRAF_MOVEBOX GRAF_GROWBOX GRAF_SHRINKBOX GRAF_WATCHBOX GRAF_SLIDEBOX GRAF_HANDLE GRAF_MOUSE GRAF_MKSTATE

Scrap-Bibliothek (scrap library)
SCRP_READ SCRP_WRITE

Dateiauswahl-Bibliothek (file selector library)
FSEL_INPUT

Fenster-Bibliothek (window library)
WIND_CREATE WiND_OPEN WIND_CLOSE WIND_DELETE WIND_GET WIND_SET WIND_FIND WIND_UPDATE WIND_CALC

Resource-Bibliothek (resource library)
RSRC_LOAD RSRC_FREE RSRC_GADDR RSRC_SADDR RSRC_OBFIX

Shell-Bibliothek (shell library)
SHEL_READ SHEL_WRITE SHEL_GET SHEL_PUT SHEL_FIND SHEL_ENVRN



Aus: ST-Computer 05 / 1988, Seite 40

Links

Copyright-Bestimmungen: siehe Über diese Seite