home *** CD-ROM | disk | FTP | other *** search
- (*------------------------------------------------------------------------*)
- (* EXEC4BH.INC *)
- (* aus "Externe Kommandos in Turbo Pascal" (PASCAL 4/87, Seite 72 ff) mit *)
- (* der Modifikation aus PASCAL 9/87. Hier wurde noch eine weitere Aender- *)
- (* ung durchgefuehrt, so dass keine VAR-Parameter mehr noetig sind. Auch *)
- (* wird nun "Program_Name" hier automatisch zu einem ASCIIZ-String. *)
- (* Funktionswert = 0, wenn Erzeugung des Tochterprozesses erfolgreich *)
- (* = 2, wenn zu startendes Programm nicht gefunden wurde *)
- (* = 8, wenn nicht mehr genuegend Speicher fuer Prog. frei *)
- (* =10, wenn Environment (Umgebung) fehlerhaft *)
- (* =11, das aufgerufene Programm ist eine EXE-Datei ohne *)
- (* gueltigen Inhalt *)
- (* System: Turbo Pascal 3.0 & MS-DOS *)
-
- TYPE ExeStr = STRING[255]; (* interner String-Typ *)
-
- FUNCTION Exec (Program_Name, Parameter_String : ExeStr) : INTEGER;
-
- CONST
- Save_SS : INTEGER = -1; (* Bereich im Code-Segment *)
- Save_SP : INTEGER = -1; (* zur Sicherung von SS:SP *)
- ErrorCode : INTEGER = -1; (* DOS Fehlercode *)
- Prog : ExeStr = ''; (* ASCIIZ-String *)
-
- VAR
- LCB : ARRAY [1..7] OF INTEGER; (* Load Control Block *)
- FCB_1, FCB_2 : ARRAY [1..12] OF BYTE; (* File Control Blocks *)
-
- BEGIN
- Prog := Concat(Program_Name,Chr(0));
-
- Move (Mem [CSeg:$5C], FCB_1, 12); (* File Control Blocks erzeugen *)
- Move (Mem [CSeg:$6C], FCB_2, 12);
- (* Load Control Block erzeugen: *)
- LCB [1] := 0; (* Umgebung des aufrufenden Programms *)
- LCB [2] := Ofs (Parameter_String);
- LCB [3] := Seg (Parameter_String);
- LCB [4] := Ofs (FCB_1);
- LCB [5] := Seg (FCB_1);
- LCB [6] := Ofs (FCB_2);
- LCB [7] := Seg (FCB_2);
-
- INLINE($55 (* Push BP ; Sichern von Registern *)
- /$1E (* Push DS *)
- /$8C/$C8 (* Mov AX,CS ; CS nach DS bringen *)
- /$8E/$D8 (* Mov DS,AX *)
- /$BA/Prog (* Mov DX,Prog ; Zeiger DS:DX auf *)
- /$42 (* Inc DX ; ASCIIZ Program_Name *)
- /$8C/$D0 (* Mov AX,SS ; Stackregister laden *)
- /$8E/$C0 (* Mov ES,AX ; Zeiger ES:BX auf LCB *)
- /$8D/$9E/LCB (* LEA BX,[BP]LCB *)
- /$2E/$A3/Save_SS (* Mov CS:Save_SS,AX ; Sichern von SS:SP *)
- /$8B/$C4 (* Mov AX,SP *)
- /$2E/$A3/Save_SP (* Mov CS:Save_SP,AX *)
- /$FC (* ClD ; Clear Direction-Flag *)
- /$B8/$00/$4B (* Mov AX,4B00h ; DOS Exec Funktion 4Bh *)
- /$CD/$21 (* Int 21h *)
- (* Kritische Phase, Stackregister in Unordnung *)
- /$FA (* ClI ; Interrupt disable *)
- /$72/$02 (* JB Run_Error ; Aufruf erfolgreich ? *)
- /$32/$C0 (* XOr AL,AL ; Ja, Fehlercode = 0 *)
- (* Run_Error: *)
- /$32/$E4 (* XOr AH,AH ; Nein, DOS Fehler in AL *)
- /$2E/$8B/$16/Save_SS (* Mov DX,CS:Save_SS ; Wiederherstellen *)
- /$8E/$D2 (* Mov SS,DX ; von *)
- /$2E/$8B/$16/Save_SP (* Mov DX,CS:Save_SP ; SS:SP *)
- /$8B/$E2 (* Mov SP,DX *)
- /$FB (* StI ; Interrupt enable *)
- /$1F (* Pop DS ; Register herstellen *)
- /$5D (* Pop BP *)
- /$2E/$A3/ErrorCode); (* Mov CS:ErrorCode,AX *)
- Exec := ErrorCode;
- END;
- (*------------------------------------------------------------------------*)
- (* EXEC4BH.INC *)
-