' ----------------------------------------------------------------------------
'     Beispielprogramm zum Test des Shellaufrufs fr GFA Basic 3.0
'
DO
  PRINT "Beispielroutine zum Shellaufruf"
  INPUT "Gewnschtes Kommando oder ENDE fr Programmstop: ",a$
  EXIT IF a$="ENDE" OR a$="Ende" OR a$="ende"
  RESERVE 2560     ! Minimalspeicher zurckbehalten, den Rest freigeben
  exit_status=@system_call(a$)
  RESERVE          ! wieder allen Speicher holen
  PRINT "Systemaufruf mit ";exit_status;" beendet."
LOOP
END
'
'
' Die eigentliche Schnittstelle zur Shell fr GFA-BASIC 3.0
'
FUNCTION system_call(shell_cmd$)
  ' Eingabe: Ein String mit dem auzufhrenden Kommando
  ' Ausgabe: -999 fuer nicht ausgefhrte Kommandos oder
  '          der Rckgabewert der aufgerufenen Shell
  '
  '
  LOCAL exit_code%    ! Der Rckgabewert
  LOCAL shell_p%      ! Adresse der Shell
  LOCAL shelltyp%     ! Art der Shell: 0=Keine Shell
  '                                    1=Unbekannte Shell
  '                                    2=GULAM
  '                                    3=MASTER
  '
  ' Zeiger auf die Shell aus der entsprechenden Systemvariablen holen
  shell_p%=LPEEK(&H4F6)
  '
  ' Zun„chst die Art der eventuell vorhandenen Shell bestimmen
  IF shell_p%=0 THEN
    shelltyp%=0                                 ! Keine Shell vorhanden
  ELSE
    shelltyp%=1                                 ! Irgendeine Shell vorhanden
    IF LPEEK(shell_p%-10)=&H420135 THEN         ! dann genauer unterscheiden:
      shelltyp=2                                ! Die Shell GULAM
    ELSE
      IF LPEEK(shell_p%-4)=&HCDCEC5D2 OR LPEEK(shell_p%-8)=&H4D415354 THEN
        shelltyp=3                              ! Die Shell MASTER
      ENDIF
    ENDIF
  ENDIF
  '
  ' Nur wenn GULAM oder MASTER vorhanden sind, diese aufrufen
  IF shelltyp>1 THEN
    IF shelltyp=2 AND shell_cmd$="-i" THEN      ! Interaktive Shell
      shell_cmd$=""                             ! "" fšr GULAM  "-i" fšr MASTER
    ENDIF
    shell_cmd$=shell_cmd$+CHR$(0)               ! C-String endet mit Nullbyte
    exit_code%=C:shell_p%(L:VARPTR(shell_cmd$)) ! und aufrufen
  ELSE
    exit_code%=-999                             ! Kommando NICHT ausgefhrt
  ENDIF
  '
  '
  RETURN exit_code
ENDFUNC
'
'
' Anmerkung #1: Die Žnderungen fr die alten Gfa Basic Versionen liegen
'               nur am dort fehlenden FUNKTION ENDFUNC Befehlspaar. So
'               kann dort dies z.B. mit PROCEDURE simuliert werden, wenn
'               exit_code% GLOBAL zug„nglich ist:
'
' @system_call(a$)
' PRINT "Rckgabe des Shellaufrufs: "; exit_code%
' ...
' END
'
' PROCEDURE system_call...
'   ' LOCAL exit_code%
'   ...
' RETURN
'
' Anmerkung #2: Da sich Gfa Basic zun„chst allen Speicher grabscht, muss
'               mit dem RESERVE Befehl zuerst die fr den Interpreter not-
'               wendige Anzahl reserviert werden, sodass der Rest fr die
'               Shell und zu startende Programme nutzbar wird. Anschliessend
'               muss jedoch dieser Platz mit einem weiteren RESERVE Befehl
'               wieder zusammengefgt werden, da sonst der Gesamtspeicher
'               sich immer mehr verkleinert.
'
' ----------------------------------------------------------------------------
