Ataquarium - Ein Kessel Buntes

In [1] schrieb ich, das es zwei Pilot-Interpreter gibt (Taylor Pilot und Tiny Pilot). Mittlerweile ist jedoch ein dritter Pilot-Interpreter aufgetaucht, das eSTeem COPILOT. Dabei handelt es sich um ein älteres Shareware-Produkt aus den USA. Neben dem freien Run-Time-Modul gab es ein käuflich zu erwerbendes PILOT (eSTeem PILOT), mit einer 220-seitigen Anleitung(!). Das die Sprache geringfügig erweitert wurde, versteht sich da von selbst. Neben der Ansteuerung des ST-Soundchips, Joysticks, CD-ROM, Disk I/O Kommandos und eingebauten Laderoutinen für IMG- und Degas-Bilder gibt es doch tatsächlich Befehle für "Interaktive Laserdisk-Player". Wer diesen Vorgänger der DVD nicht kennt: Laserdisks sind Schallplattengroße CDs, die einen ganzen Film fassen können. Pioneer führte die Player gerne zusammen mit ihren MSX-Computern vor und Don Bluth (Feivel, der Mauswanderer) designte das bekannteste Laserdiskspiel "Dragon's Lair". Die Interaktivität hielt sich bei diesen Spielen in Grenzen. Das eSTeem PILOT hat aber auch ein paar gute Erweiterungen, die sich vielleicht in Taylor Pilot wiederfinden werden.

Nachgeholt werden soll auch eine Erwähnung des GnuC-Pakets, das Prof. Herbert Walz auf seiner Homepage [2] geschnürt hat. Das Paket enthält ein weitgehend vorkonfiguriertes GnuC mit der Entwicklungsumgebung Agnus. Das Archiv ist etwa 3,6 MB groß und für Multitaskingsysteme ausgelegt. Eine Alternative gibt es von Oliver Landemarre: sein "kit_gcc" verzichtet auf Agnus zugunsten einer anderen Shell und des EZ-Edit. Sein Archiv ist 7,6 MB groß, was nicht zuletzt auch an einer 1,45 MB großen HTML-Datei liegt...

Mit diesen Zusammenstellungen läßt sich schon einiges anfangen. Vor allem konsolenorientierte Anwendungen (keine Grafik, nur Text) aus der Unix-Welt lassen sich häufig schon per "make" auf den ST portieren.

Dank dem X11-Server [3] können grafische Anwendungen ebenfalls leichter angepasst werden, sofern sie nicht andere Libraries benötigen, die es auf dem ST noch nicht gibt.

Mach' mit, bleib' Fit!

Jetzt wo jeder einen funktionsfähigen C-Compiler auf seiner Platte haben kann, werden Beispielsourcen wichtiger. Davon gibt es auch auf dem Atari jede Menge, was es so an interessanten Sourcecodes derzeit gibt, habe ich in Tabelle 1 zusammengestellt. Berücksichtigt wurden dabei nur Sourcecodes, die derzeit auch noch gepflegt werden.

Die Frage beim Anblick von einem Dutzend bis hunderten C-Dateien ist wohl, wo der Einstieg gemacht werden sollte. Das "Trial & Error"-Prinzip (Änderung, testen, Crash, alles wieder von vorne) kann in C ganz schön frustrierend sein.

Wer schon einmal meine Homepage [4] besucht hat, wird wissen, dass ich derzeit drei "große" Open-Source-Projekte betreue: STemBoy (Sourcecode-Veröffentlichung noch in Vorbereitung), Taylor-Pilot und das Bywater Basic. Alle drei sind in ganz normalem Ansi-C geschrieben und werden unter PureC entwickelt, müßten aber auch unter GnuC compilieren.

BW-Basic

Das Bywater Basic ist eine ideale Grundlage, um ein schönes Basic zu bauen. Die komplizierten Strukturbefehle, z.B. Prozeduren, Funktionen, SELECT-CASE und mehrzeilige IF-Bedingungen, sind bereits vom BW-Basic-Autor eingebaut. Das Basic kann zudem auch ohne Zeilennummern arbeiten. Damit fehlen eigentlich "nur" noch ein paar Befehle, um den etablierten Basic-Dialekten das Fürchten zu lehren.

BW-Basic besteht aus 22 C-Dateien sowie fünf Header-Dateien. Die C-Dateien sind nach Funktionsgruppen geordnet, "bwb_mth.c" enthält bspw. die Mathe-Befehle. Diese Ordnung dient in erster Linie der Übersicht, d.h. es können dort durchaus auch Sound-Befehle reingepackt werden.

Da es für C alles mögliche an Libraries gibt, kann mit BW-Basic ein Basic gebastelt werden, das z.B. per LOADPIC (X)IMG-Bilder lädt oder über einen einzigen Befehl eine CD auswirft. Dank einiger DEFINEs kann BW-Basic sogar zu einem 70er Jahre Minimal-Basic degradiert werden.

Am einfachsten ist es, eine neue mathematische Funktion einzubauen. Öffnen Sie dazu bwb_math.c im Texteditor. Im Abschnitt fnc_core finden sich die Definitionen für alle Basic-Grundbefehle (also SIN, COS etc. ). fnc_core ist nur aktiv, wenn COMPRESS_FUNCS aus bwbasic.h TRUE ist. Dies ist eigentlich immer der Fall, denn ansonsten müssten Sie eine extra Funktion schreiben, was für einen simplen mathematischen Befehl etwas unnötig erscheint. Im Rest von bwb_math.c werden Sie für jede Kurzdefinition aus fnc_core eine lange Funktion finden, für den Fall, das COMPRESS_FUNCS auf FALSE gesetzt wird. Im Grunde bringt die lange Definition außer einer etwas ausführlicheren Meldung für den Basic- und C-Programmierer keine Vorteile:

COMPRESS_FUNCS TRUE:

Basic-Fehlermeldung: Not enough parameters () to core function.
C: in fnc_core(): nvar type (Typ); calling findnval()

COMPRESS_FUNCS FALSE:

Basic: Not enough parameters () to function TAN().
C: in fnc_tan(): received f arg: (arguments)

Es wird im folgenden auf die lange Definition verzichtet, da selbst die einfache Tangens-Funktion schon 71 Zeilen lang ist (inkl. Kommentaren und Leerzeilen).

Nachgerüstet werden soll der Befehl log10. Dieser Befehl ist in C schon vorhanden, daher läßt er sich sehr einfach in BW-Basic einbauen. In dem switch (unique_id) Bereich werden folgende Zeilen eingefügt:

case F_LOG10:*var_findnval( &nvar, nvar.array_pos )   = 
(bnumber) log10( (double) var_getnval( &( argv[ 0 ] ) ) );
break;

Mit var_getnval wird ein numerischer Wert abgeholt, für Strings gibt es var_getsval. Alle Definitionen sind nach dem obigen Schema aufgebaut - erst var_findnval/var_findsval, dann die Funktion.

Wird BW-Basic jetzt kompiliert, gibt es eine Fehlermeldung, denn das Symbol F_LOG10 ist nicht definiert.

In bwb_tbl.c stehen die Tabellen, die BW-Basic benutzt, um Befehle zu identifizieren und die entsprechenden Funktionen anzuspringen. Am Ende der Datei stehen die "core functions defined for ANSI Minimal BASIC". Ob LOG10 nun zum Urvater aller Basic-Standards gehört, dürfte nur für Sprach-Puristen interessant sein. Dort wird jedenfalls folgende Zeile eingefügt:

{ "LOG10",     NUMBER,         1,   fnc_core,     
(struct bwb_function *) NULL, F_LOG10 },

Der Reihe nach:

Der erste Parameter ist das Basic-Schlüsselwort. Wenn ein String zurückgegeben wird (z.B. STR$), wird noch ein Dollar-Zeichen angehängt. Dieses Zeichen ist nur für die Optik wichtig, denn der zweite Parameter...

...definiert den Typ des Rückgabewerts. Steht dort NUMBER, wird eine Zahl zurückgegeben, bei STRING ein Text.

Als drittes gibt es die Zahl der Parameter, die der Basic-Befehl benötigt. LOG10 benötigt nur einen Übergabeparameter.

Als nächstes steht der Funktionsname, der den Befehl ausführen soll. Alle Kurzdefinitionen stehen in fnc_core.

Der fünfte Parameter ist ein Zeiger auf die bwb_function-Struktur.

Der Symbol-Name bildet das Schlußlicht. Für Befehle, die nicht in fnc_core stehen, wird hier 0 eingetragen:

{ "TIMER",   NUMBER,         0,   fnc_timer,   
(struct bwb_function *) NULL, 0 },

Das Symbol F_LOG10 wird in bwbasic.h definiert. Diese Datei ist groß (ca. 65 KB) und enthält alle Funktions-Prototypen sowie Einstellungen für den Sprachumfang des Basic. Die Symbol-Definition ist zum Glück ganz am Ende der Datei zu finden. Dort ist eine Liste von DEFINEs: jedem Symbol wird eine Nummer zugeordnet:

#define         F_LOG10          23

Das Symbol ist BW-Basic nun bekannt und alles was jetzt noch fehlt ist, einen Zählen hochzusetzen. Suchen Sie im Quelltext nach folgender Zeile:

#define FUNCS_BASE

Um dieses Zeile herum sind noch viele andere Zähler, denn wie bereits erwähnt ist BW-Basic sehr flexibel, was im Quelltext leider auf Kosten der Übersichtlichkeit geht.

Weitere neue Befehle

Nachdem jetzt die Basics des Basic klar sein sollten, sind weitere Funktionserweiterungen kinderleicht:

case F_POW:
* var_findnval( &nvar, nvar.array_pos ) =
(bnumber) pow( (double) var_getnval( &( argv[ 0 ] ) ),
(double) var_getnval( &( argv[ 1 ] ) ) );
break;

Pow liefert das Ergebnis der Berechnung x^y und benötigt zwei Zahl vom Typ double. In bwb_tbl.c:

{ "POW",    NUMBER,         2,  fnc_core, 	
(struct bwb_function *) NULL, F_POW },
case F_COOKIEJARSIZE:
* var_findnval( &nvar, nvar.array_pos ) = (bnumber) CK_JarSize();
break;
{ "COOKIEJARSIZE",   NUMBER,		0,   fnc_core,  
(struct bwb_function *) NULL, F_COOKIEJARSIZE    },

Wenn Sie interessante Befehlserweiterungen für BW-Basic geschrieben haben, dann schicken Sie sie mir doch unter mjaap[ÄT]atariuptodate.de zu.

Draconis-News

Abschließend noch eine News aus dem Internet-Bereich. Kurz nach der Version 2.0 des Emailers Marathon wurde auch die Socket-Library in der 2.0-Version [5] veröffentlicht. Eine stärkere Anlehnung an MiNTNet und die Unterstützung von C und Basic sind die Hauptneuerungen.


Mia Jaap
Aus: ST-Computer 12 / 2001, Seite 30

Links

Copyright-Bestimmungen: siehe Über diese Seite