← ST-Computer 04 / 1987

ST-Tips: Die Anwendung des EXEC-Befehls in GfA-BASIC

Aktuelles

Oft möchte man bei der Programmentwicklung in GfA-Basic die Leistungen eines beliebigen Maschinenprogrammes, das auf der Diskette gespeichert ist, nutzen.

Bei einem konventionellen 8-Bit-Computer hatte man dabei Schwierigkeiten. Ein Maschinenprogramm ist normalerweise so eingerichtet, das es an einer bestimmten Adresse im Arbeitsspeicher stehen muß. Bei Aufruf eines neuen Programmes kam es deshalb leicht zu Überschneidungen im Adressbereich.

Nicht so beim Atari ST mit seinem 68000er-Prozessor: Hier haben die Entwickler des Betriebssystems Vorsorge getroffen. Soll ein Programm ausgefĂŒhrt werden, sucht das GEMDOS zunĂ€chst freien Speicher. Am Anfang des freien Speichers wird zunĂ€chst eine Base Page von 256 Bytes installiert; hier werden nach dem Laden des Programmes eine Reihe von Informationen eingetragen. Unter anderem stehen hier alle Daten zur Festlegung des benötigten Speicherplatzes.

Als nĂ€chstes wird das Programm relo-ziert, d. h. alle notwendigen Adressen von Sprungbefehlen, Zeigern usw. im Maschinencode werden angepaßt. Erst danach wird das Programm gestartet. Beim ordnungsgemĂ€ĂŸen Verlassen des nachgeladenen Programmes wird dessen Speicherplatz automatisch wieder freigegeben und steht fĂŒr andere Anwendungen zur VerfĂŒgung.

Was bedeutet das fĂŒr den GfA-Basic-Programmierer? Wenn man den Interpreter lĂ€dt, belegt er normalerweise allen zur VerfĂŒgung stehenden Speicherplatz. Um Platz fĂŒr ein nachzuladendes Programm zu schaffen, steht der Befehl 'RESERVE’ bereit; mit der Anweisung RESERVE FRE(0)—100000 werden z. B. 100000 Byte vom BA-SlC-Speicher abgetrennt und stehen oberhalb von HIMEM zur Benutzung frei. RESERVE FRE(0) +100000 macht diese Manipulation wieder rĂŒckgĂ€ngig.

Der Basic-Befehl EXEC bewirkt genau das oben beschriebene Laden und AusfĂŒhren von Maschinenprogrammen oder kompilierten Programmen von der Diskette.

Die genaue Syntax lautet als Befehl:

EXEC mode%, nam$,cmd$,env$

als Funktion:

var% = EXEC(mode%,nam$,cmd$,env$)

’mode%’ darf die Werte 0, 3, 4 oder 5 enthalten. ’mode% = 0’ ist die sogenannte LOAD’N GO-Option: In diesem Fall wird die Datei, die mit nam$ spezifiziert ist, von der Disk geladen und umgehend ausgefĂŒhrt. Den sogenannten Environment-String ’env$’ können wir hier außer acht lassen und einen Leer-String (” ”) setzen.

Mit ’cmd$’ kann, wie man es von TTP-Programmen kennt, ein Kommando-String ĂŒbergeben werden. Das aufgerufene Programm findet ihn in der Base Page ab Position $80 relativ zum Beginn der Base-Page-Adresse.

’mode% = 3’ bewirkt lediglich das Laden des angegebenen Files ohne AusfĂŒhrung; wird EXEC als Funktion verwendet, erhĂ€lt man in ’var%’ die Base-Page-Adresse des nachgeladenen Programmes zurĂŒck. Mit ’mode% = 4’ sollte ein zuvor mit ’mode% = 3’ geladenes Programm gestartet werden können. Mir ist dies jedoch bisher trotz intensiver BemĂŒhungen, auch in Assembler, noch nicht gelungen. Die letzte Option ’mode% = 5’ legt eine leere Base Page im Speicher an und dĂŒrfte fĂŒr Basic-Programmierer weniger interessant sein.

Nun zu einer konkreten Anwendung.

Wer Besitzer des neuen GfA-Basic-Com-pilers ist, kann mit einer kleinen Pro-cedure eine Art „Micro-Shell“ im Interpreter zur VerfĂŒgung haben. GrundsĂ€tzlich empfiehlt sich das Arbeiten mit einer RAM-Floppy; auf diese kopiert man den Compiler und das entsprechende RSC-File.

An das Programm, das man gerade im Interpreter bearbeitet, „merged“ man das in Listing 1 gezeigte Unterprogramm.

Nun speichert man sein Programm ab (die zusÀtzliche Procedure wird kaum stören) und geht mit einem Druck auf die ESC-Taste in den Direktmodus des Interpreters.

Mit Exc (oder GOSUB Exc) ruft man nun den Compiler auf und kann das zuletzt bearbeitete oder ein beliebiges anderes BAS-File ĂŒbersetzen. Nachdem man den Compiler mit „Abbruch“ verlassen hat, besteht die Möglichkeit, das entstandene Machwerk gleich auszuprobieren. Ist kein katastrophaler Absturz aufgetreten, kehrt man nach Beendigung dieses Programmes wieder zum GfA-Interpreter zurĂŒck und kann evtl, entdeckte Programmierfehler beheben.

Im abgedruckten Beispiel wurden 100000 Bytes an freiem Speicherplatz vorgesehen; dies sollte fĂŒr normale Programme völlig ausreichen. Einer Anpassung steht nur die maximale ArbeitsspeichergrĂ¶ĂŸe entgegen. Mit dieser Anregung lassen sich bestimmt eine ganze Menge nĂŒtzlicher Anwendungen finden.

Viel Erfolg beim Experimentieren!

(H. Bauch)

Literatur:

Atari ST Intern, Data Becker
GfA-BASIC-Anwenderdokumentation, GfA-Systemtechnik

Procedure Exc Cls Reserve Fre (0) - 100000 Exec 0," GFA_BCOM.PRG “" Cls Print "PROGRAMM AUSFÜHREN:“ Fileselect "/*.PRG","", Fil_n$ If Exist ( Fil_n$ ) Exec 0, Fil_n$, "", "" Endif Reserve Fre (0) + 100000 Return

Listing 1