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