home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / utility / misc / master / source / system.lst < prev    next >
File List  |  1989-04-04  |  3KB  |  88 lines

  1. ' ----------------------------------------------------------------------------
  2. '     Beispielprogramm zum Test des Shellaufrufs für GFA Basic 3.0
  3. '
  4. DO
  5.   PRINT "Beispielroutine zum Shellaufruf"
  6.   INPUT "Gewünschtes Kommando oder ENDE für Programmstop: ",a$
  7.   EXIT IF a$="ENDE" OR a$="Ende" OR a$="ende"
  8.   RESERVE 2560     ! Minimalspeicher zurückbehalten, den Rest freigeben
  9.   exit_status=@system_call(a$)
  10.   RESERVE          ! wieder allen Speicher holen
  11.   PRINT "Systemaufruf mit ";exit_status;" beendet."
  12. LOOP
  13. END
  14. '
  15. '
  16. ' Die eigentliche Schnittstelle zur Shell für GFA-BASIC 3.0
  17. '
  18. FUNCTION system_call(shell_cmd$)
  19.   ' Eingabe: Ein String mit dem auzuführenden Kommando
  20.   ' Ausgabe: -999 fuer nicht ausgeführte Kommandos oder
  21.   '          der Rückgabewert der aufgerufenen Shell
  22.   '
  23.   '
  24.   LOCAL exit_code%    ! Der Rückgabewert
  25.   LOCAL shell_p%      ! Adresse der Shell
  26.   LOCAL shelltyp%     ! Art der Shell: 0=Keine Shell
  27.   '                                    1=Unbekannte Shell
  28.   '                                    2=GULAM
  29.   '                                    3=MASTER
  30.   '
  31.   ' Zeiger auf die Shell aus der entsprechenden Systemvariablen holen
  32.   shell_p%=LPEEK(&H4F6)
  33.   '
  34.   ' Zunächst die Art der eventuell vorhandenen Shell bestimmen
  35.   IF shell_p%=0 THEN
  36.     shelltyp%=0                                 ! Keine Shell vorhanden
  37.   ELSE
  38.     shelltyp%=1                                 ! Irgendeine Shell vorhanden
  39.     IF LPEEK(shell_p%-10)=&H420135 THEN         ! dann genauer unterscheiden:
  40.       shelltyp=2                                ! Die Shell GULAM
  41.     ELSE
  42.       IF LPEEK(shell_p%-4)=&HCDCEC5D2 OR LPEEK(shell_p%-8)=&H4D415354 THEN
  43.         shelltyp=3                              ! Die Shell MASTER
  44.       ENDIF
  45.     ENDIF
  46.   ENDIF
  47.   '
  48.   ' Nur wenn GULAM oder MASTER vorhanden sind, diese aufrufen
  49.   IF shelltyp>1 THEN
  50.     IF shelltyp=2 AND shell_cmd$="-i" THEN      ! Interaktive Shell
  51.       shell_cmd$=""                             ! "" fÜr GULAM  "-i" fÜr MASTER
  52.     ENDIF
  53.     shell_cmd$=shell_cmd$+CHR$(0)               ! C-String endet mit Nullbyte
  54.     exit_code%=C:shell_p%(L:VARPTR(shell_cmd$)) ! und aufrufen
  55.   ELSE
  56.     exit_code%=-999                             ! Kommando NICHT ausgeführt
  57.   ENDIF
  58.   '
  59.   '
  60.   RETURN exit_code
  61. ENDFUNC
  62. '
  63. '
  64. ' Anmerkung #1: Die Änderungen für die alten Gfa Basic Versionen liegen
  65. '               nur am dort fehlenden FUNKTION ENDFUNC Befehlspaar. So
  66. '               kann dort dies z.B. mit PROCEDURE simuliert werden, wenn
  67. '               exit_code% GLOBAL zugänglich ist:
  68. '
  69. ' @system_call(a$)
  70. ' PRINT "Rückgabe des Shellaufrufs: "; exit_code%
  71. ' ...
  72. ' END
  73. '
  74. ' PROCEDURE system_call...
  75. '   ' LOCAL exit_code%
  76. '   ...
  77. ' RETURN
  78. '
  79. ' Anmerkung #2: Da sich Gfa Basic zunächst allen Speicher grabscht, muss
  80. '               mit dem RESERVE Befehl zuerst die für den Interpreter not-
  81. '               wendige Anzahl reserviert werden, sodass der Rest für die
  82. '               Shell und zu startende Programme nutzbar wird. Anschliessend
  83. '               muss jedoch dieser Platz mit einem weiteren RESERVE Befehl
  84. '               wieder zusammengefügt werden, da sonst der Gesamtspeicher
  85. '               sich immer mehr verkleinert.
  86. '
  87. ' ----------------------------------------------------------------------------
  88.