home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 03 / format / exec4bh.inc < prev    next >
Encoding:
Text File  |  1987-12-17  |  4.5 KB  |  76 lines

  1. (*------------------------------------------------------------------------*)
  2. (*                               EXEC4BH.INC                              *)
  3. (* aus "Externe Kommandos in Turbo Pascal" (PASCAL 4/87, Seite 72 ff) mit *)
  4. (* der Modifikation aus PASCAL 9/87. Hier wurde noch eine weitere Aender- *)
  5. (* ung durchgefuehrt, so dass keine VAR-Parameter mehr noetig sind. Auch  *)
  6. (* wird nun "Program_Name" hier automatisch zu einem ASCIIZ-String.       *)
  7. (* Funktionswert  = 0, wenn Erzeugung des Tochterprozesses erfolgreich    *)
  8. (*                = 2, wenn zu startendes Programm nicht gefunden wurde   *)
  9. (*                = 8, wenn nicht mehr genuegend Speicher fuer Prog. frei *)
  10. (*                =10, wenn Environment (Umgebung) fehlerhaft             *)
  11. (*                =11, das aufgerufene Programm ist eine EXE-Datei ohne   *)
  12. (*                     gueltigen Inhalt                                   *)
  13. (* System: Turbo Pascal 3.0  &  MS-DOS                                    *)
  14.  
  15. TYPE ExeStr = STRING[255];                         (* interner String-Typ *)
  16.  
  17. FUNCTION Exec (Program_Name, Parameter_String : ExeStr) : INTEGER;
  18.  
  19. CONST
  20.   Save_SS   : INTEGER = -1;                    (* Bereich im Code-Segment *)
  21.   Save_SP   : INTEGER = -1;                    (* zur Sicherung von SS:SP *)
  22.   ErrorCode : INTEGER = -1;                    (* DOS Fehlercode          *)
  23.   Prog      : ExeStr  = '';                    (* ASCIIZ-String           *)
  24.  
  25. VAR
  26.   LCB          : ARRAY [1..7] OF INTEGER;      (* Load Control Block      *)
  27.   FCB_1, FCB_2 : ARRAY [1..12] OF BYTE;        (* File Control Blocks     *)
  28.  
  29. BEGIN
  30.   Prog := Concat(Program_Name,Chr(0));
  31.  
  32.   Move (Mem [CSeg:$5C], FCB_1, 12);       (* File Control Blocks erzeugen *)
  33.   Move (Mem [CSeg:$6C], FCB_2, 12);
  34.                                           (* Load Control Block erzeugen: *)
  35.   LCB [1] := 0;                     (* Umgebung des aufrufenden Programms *)
  36.   LCB [2] := Ofs (Parameter_String);
  37.   LCB [3] := Seg (Parameter_String);
  38.   LCB [4] := Ofs (FCB_1);
  39.   LCB [5] := Seg (FCB_1);
  40.   LCB [6] := Ofs (FCB_2);
  41.   LCB [7] := Seg (FCB_2);
  42.  
  43.   INLINE($55               (*    Push  BP        ; Sichern von Registern  *)
  44.         /$1E               (*    Push  DS                                 *)
  45.         /$8C/$C8           (*    Mov   AX,CS     ; CS nach DS bringen     *)
  46.         /$8E/$D8           (*    Mov   DS,AX                              *)
  47.         /$BA/Prog          (*    Mov   DX,Prog   ; Zeiger DS:DX auf       *)
  48.         /$42               (*    Inc   DX        ; ASCIIZ Program_Name    *)
  49.         /$8C/$D0           (*    Mov   AX,SS     ; Stackregister laden    *)
  50.         /$8E/$C0           (*    Mov   ES,AX     ; Zeiger ES:BX auf LCB   *)
  51.         /$8D/$9E/LCB       (*    LEA   BX,[BP]LCB                         *)
  52.         /$2E/$A3/Save_SS   (*    Mov   CS:Save_SS,AX ; Sichern von SS:SP  *)
  53.         /$8B/$C4           (*    Mov   AX,SP                              *)
  54.         /$2E/$A3/Save_SP   (*    Mov   CS:Save_SP,AX                      *)
  55.         /$FC               (*    ClD             ; Clear Direction-Flag   *)
  56.         /$B8/$00/$4B       (*    Mov   AX,4B00h  ; DOS Exec Funktion 4Bh  *)
  57.         /$CD/$21           (*    Int   21h                                *)
  58.                            (* Kritische Phase, Stackregister in Unordnung *)
  59.         /$FA               (*    ClI             ; Interrupt disable      *)
  60.         /$72/$02           (*    JB    Run_Error ; Aufruf erfolgreich ?   *)
  61.         /$32/$C0           (*    XOr   AL,AL     ; Ja, Fehlercode = 0     *)
  62.                            (* Run_Error:                                  *)
  63.         /$32/$E4           (*    XOr   AH,AH     ; Nein, DOS Fehler in AL *)
  64.         /$2E/$8B/$16/Save_SS (*  Mov   DX,CS:Save_SS ; Wiederherstellen   *)
  65.         /$8E/$D2           (*    Mov   SS,DX         ;   von              *)
  66.         /$2E/$8B/$16/Save_SP (*  Mov   DX,CS:Save_SP ;  SS:SP             *)
  67.         /$8B/$E2           (*    Mov   SP,DX                              *)
  68.         /$FB               (*    StI             ; Interrupt enable       *)
  69.         /$1F               (*    Pop   DS        ; Register herstellen    *)
  70.         /$5D               (*    Pop   BP                                 *)
  71.         /$2E/$A3/ErrorCode); (*  Mov   CS:ErrorCode,AX                    *)
  72.   Exec := ErrorCode;
  73. END;
  74. (*------------------------------------------------------------------------*)
  75. (*                               EXEC4BH.INC                              *)
  76.