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