home *** CD-ROM | disk | FTP | other *** search
-
- (*--------------------------------------------------------------------------*)
- (*
- Fuer DOS-Versionen, die die Register SS und SP bei Durchfuehrung
- der Funktion $4B nicht erhalten, muss die Funktion EXEC durch
- die nachfolgende Version ersetzt werden: *)
-
- FUNCTION Exec (VAR Program_Name : asciiz;
- VAR Parameter_String : anystr) : INTEGER;
-
- CONST
- Save_SS : INTEGER = -1; (* Bereich im Code-Segment *)
- Save_SP : INTEGER = -1; (* zur Sicherung von SS:SP *)
- ErrorCode : INTEGER = -1; (* DOS Fehlercode *)
-
- VAR
- LCB : ARRAY [1..7] OF INTEGER; (* Load Control Block *)
- FCB_1, FCB_2 : ARRAY [1..12] OF BYTE; (* File Control Blocks *)
-
- BEGIN
-
- (* File Control Blocks erzeugen *)
-
- Move (Mem [CSeg:$5C], FCB_1, 12);
- 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 *)
- /$C5/$96 (* LDS DX,[BP]Program_Name *)
- /Program_Name (* ; 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;