home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / utility / misc / master / source / om_sys.txt < prev    next >
Text File  |  1989-04-05  |  6KB  |  119 lines

  1.  ' --------------------------------------------------------------------------
  2.  ' Beispielprogramm zum Shellaufruf in Omikron Basic
  3.  '
  4. -Start
  5.  PRINT "Beispielprogramm zum Shellaufruf in Omikron Basic"
  6.  INPUT "Gewuensches Kommando (Programmstop mit ENDE) ";Shell_Cmd$
  7.  IF Shell_Cmd$="ENDE" OR Shell_Cmd$="Ende" OR Shell_Cmd$="ende" THEN CLS : END
  8.  CLS
  9.  GOSUB System_Call
  10.  PRINT "Rueckgabe der Shell: ";S_Exitcode
  11.  GOTO Start
  12.  END
  13.  '
  14.  '
  15.  '
  16.  ' ##########################################################################
  17.  ' SYSTEM_CALL
  18.  ' Eingabe  :   Shell_cmd$ enthaelt eine Kommandozeile fuer eine Shell
  19.  ' Rueckgabe :   S_Exitcode enthaelt entweder -999 falls keine Shell vorhanden
  20.  '                                     oder den Rueckgabewert des Shellaufrufs
  21.  '
  22.  ' Verwendete Variablen
  23.  '    S_Init   --- internes Flag 0=Nicht initialisiert 1=Initialisiert
  24.  '    Shelltyp --- Art der Shell, wird selbststaendig initialisiert
  25.  '                 0 = Keine Shell vorhanden
  26.  '                 1 = Unbekannte Shell vorhanden
  27.  '                 2 = GULAM vorhanden
  28.  '                 3 = MASTER >= 5.0 vorhanden
  29.  '    S_Adr    --- interne Adresse fuer Uebergabewerte an die Unterroutine
  30.  '    S_Ptr    --- interne Adresse fuer den Kommandostring
  31.  '    S_I      --- interner Allzweckzaehler
  32.  '
  33.  ' Benutzte Labels
  34.  '    Systemcall           - die Routine fuer den Benutzer
  35.  '      Exit_Systemcall    - internes Label
  36.  '    Init_System_Call     - interne Installationsroutine
  37.  '      Mc68000code        - interne DATA Werte fuer das Maschinenunterprogramm
  38.  '      Install_Systemcall - internes Label
  39.  '      Exit_Init          - internes Label
  40.  ' ##########################################################################
  41.  '
  42. -System_Call
  43.  S_Exitcode=-999'                         * Defaultwert falls keine Shell da ist
  44.  IF S_Init=0 THEN GOSUB Init_System_Call' * Installation einer Unterroutine
  45.  IF Shelltyp<2 THEN GOTO Exit_Systemcall' * unbekannte oder keine Shell
  46.  ' else
  47.    S_Ptr= MEMORY(Shell_Cmd$)'             * einen C-String mit Nullende bauen
  48.    '
  49.    ' jetzt pruefen, ob eine interaktive Shell erwuenscht ist
  50.    ' fuer MASTER wird "-i" uebergeben, der fuer GULAM
  51.    ' in einem Leerstring "" umgesetzt werden muss
  52.    IF Shelltyp=2 AND Shell_Cmd$="-i" THEN S_Ptr= MEMORY("")
  53.    LPOKE S_Adr,S_Ptr'                     * Stringadresse in die Unterroutine
  54.    CALL S_Subroutine'                     * schreiben und diese aufrufen
  55.    S_Exitcode= WPEEK(S_Adr)'              * den Rueckgabewert jetzt auslesen
  56.   -Exit_Systemcall
  57.  RETURN
  58.  '
  59.  '
  60.  '
  61. -Init_System_Call
  62.  IF S_Init=1 THEN GOTO Exit_Init'                 * nicht doppelt installieren
  63.    Shell_P= LPEEK($4F6)'                          * Systemvariable auslesen
  64.    IF Shell_P=0 THEN Shelltyp=0: GOTO Exit_Init'  * Nullpointer -> keine Shell
  65.    ' else
  66.      Shelltyp=1'                                  * default unbekannte Shell
  67.      '
  68.      ' GULAM magicnumber pruefen
  69.      IF LPEEK(Shell_P-10)=$420135 THEN Shelltyp=2: GOTO Install_Systemcall
  70.      ' else
  71.        ' MASTER magicnumber fuer >=5.4 pruefen
  72.        IF LPEEK(Shell_P-8)=$4D415354 THEN Shelltyp=3: GOTO Install_Systemcall
  73.        ' MASTER magicnumber fuer 5.0 pruefen, da mit &CDCEC5D2 Probleme mit
  74.        ' dem 8. Bit auftauchen, wird dieses ausmaskiert
  75.        IF NOT(( WPEEK(Shell_P-4) AND $7FFF)=$4DCE) THEN GOTO Exit_Init
  76.        IF NOT(( WPEEK(Shell_P-2) AND $7FFF)=$45D2) THEN GOTO Exit_Init
  77.        ' else
  78.          Shelltyp=3'                              * MASTER gefunden
  79.   -Install_Systemcall
  80.          S_Adr= MEMORY(36)'                       * Platz fuer Unterprogramm
  81.          RESTORE Mc68000code'                     * beschaffen und das pc-
  82.          FOR S_I=S_Adr TO S_Adr+34 STEP 2'        * relative Programm einbauen
  83.            READ A: WPOKE S_I,A
  84.          NEXT S_I
  85.   -Mc68000code
  86.          DATA $0,$0,$0,$0,$2F08,$41FA,$FFF4,$2F10,$41FA,$FFF2,$2050,$4E90,$588F,              $41FA,$FFE4,$3080,$205F,$4E75
  87.          S_Subroutine=S_Adr+8'                    * und den Zeiger auf die
  88.          LPOKE S_Adr+4,Shell_P'                   * Shell einbauen
  89.          S_Init=1'                                * Initialisierung fertig
  90.   -Exit_Init
  91.  RETURN
  92.  '
  93.  ' Assemblertext fuer die Maschinenunterroutine
  94.  '
  95.  ' cmd_line: .DC.l 0
  96.  ' shell_p:  .DC.l 0
  97.  '           move.l    a0,-(sp)        ; register a0 retten
  98.  '           lea.l     cmd_line(pc),a0
  99.  '           move.l    (a0),-(sp)      ; zeiger auf die kommandozeile uebergeben
  100.  '           lea.l     shell_p(pc),a0
  101.  '           movea.l   (a0),a0         ; den zeiger auf die shell holen
  102.  '           jsr       (a0)            ; und die shell anspringen
  103.  '           addq.l    #4,sp
  104.  '           lea.l     cmd_line(pc),a0
  105.  '           move.w    d0,(a0)         ; den rueckgabewert aus d0 holen
  106.  '           movea.l   (sp)+,a0        ; und a0 restaurieren
  107.  '           rts       
  108.  '
  109.  ' --------------------------------------------------------------------------
  110.  '
  111.  ' Anmerkung: Werden ueber die Shell weitere Programme gestartet, kann es 
  112.  '            leicht zu Speicherplatzmangel kommen. Unter MASTER kann dieses
  113.  '            Problem umgangen werden, wenn vor Start des Interpreters mit
  114.  '            SHRINK der Speicher zunaechst verkleinert wird und dann im
  115.  '            Interpreter via Shellaufruf mit FREE wieder freigegeben wird.
  116.  '            Externe Programme koennen nun diesen Platz komplett nutzen.
  117.  '
  118.  ' --------------------------------------------------------------------------
  119.