home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / sonderh1 / exec4bh.pas < prev    next >
Pascal/Delphi Source File  |  1987-12-22  |  4KB  |  68 lines

  1.  
  2. (*--------------------------------------------------------------------------*)
  3. (*
  4.     Fuer DOS-Versionen, die die Register SS und SP bei Durchfuehrung
  5.     der Funktion $4B nicht erhalten, muss die Funktion EXEC durch
  6.     die nachfolgende Version ersetzt werden:                                *)
  7.  
  8. FUNCTION Exec (VAR Program_Name     : asciiz;
  9.                VAR Parameter_String : anystr) : INTEGER;
  10.  
  11. CONST
  12.   Save_SS   : INTEGER = -1;                      (* Bereich im Code-Segment *)
  13.   Save_SP   : INTEGER = -1;                      (* zur Sicherung von SS:SP *)
  14.   ErrorCode : INTEGER = -1;                      (* DOS Fehlercode          *)
  15.  
  16. VAR
  17.   LCB          : ARRAY [1..7] OF INTEGER;        (* Load Control Block      *)
  18.   FCB_1, FCB_2 : ARRAY [1..12] OF BYTE;          (* File Control Blocks     *)
  19.  
  20. BEGIN
  21.  
  22. (* File Control Blocks erzeugen *)
  23.  
  24.   Move (Mem [CSeg:$5C], FCB_1, 12);
  25.   Move (Mem [CSeg:$6C], FCB_2, 12);
  26.  
  27. (* Load Control Block erzeugen *)
  28.  
  29.   LCB [1] := 0;                 (* Umgebung des aufrufenden Programms *)
  30.   LCB [2] := Ofs (Parameter_String);
  31.   LCB [3] := Seg (Parameter_String);
  32.   LCB [4] := Ofs (FCB_1);
  33.   LCB [5] := Seg (FCB_1);
  34.   LCB [6] := Ofs (FCB_2);
  35.   LCB [7] := Seg (FCB_2);
  36.  
  37.   Inline($55                 (*    Push  BP        ; Sichern von Registern  *)
  38.         /$1E                 (*    Push  DS                                 *)
  39.         /$C5/$96             (*    LDS   DX,[BP]Program_Name                *)
  40.             /Program_Name    (*                    ; Zeiger DS:DX auf       *)
  41.         /$42                 (*    Inc   DX        ; ASCIIZ Program_Name    *)
  42.         /$8C/$D0             (*    Mov   AX,SS     ; Stackregister laden    *)
  43.         /$8E/$C0             (*    Mov   ES,AX     ; Zeiger ES:BX auf LCB   *)
  44.         /$8D/$9E/LCB         (*    LEA   BX,[BP]LCB                         *)
  45.         /$2E/$A3/Save_SS     (*    Mov   CS:Save_SS,AX ; Sichern von SS:SP  *)
  46.         /$8B/$C4             (*    Mov   AX,SP                              *)
  47.         /$2E/$A3/Save_SP     (*    Mov   CS:Save_SP,AX                      *)
  48.         /$FC                 (*    ClD             ; Clear Direction-Flag   *)
  49.         /$B8/$00/$4B         (*    Mov   AX,4B00h  ; DOS Exec Funktion 4Bh  *)
  50.         /$CD/$21             (*    Int   21h                                *)
  51.                              (* Kritische Phase, Stackregister in Unordnung *)
  52.         /$FA                 (*    ClI             ; Interrupt disable      *)
  53.         /$72/$02             (*    JB    Run_Error ; Aufruf erfolgreich ?   *)
  54.         /$32/$C0             (*    XOr   AL,AL     ; Ja, Fehlercode = 0     *)
  55.                              (* Run_Error:                                  *)
  56.         /$32/$E4             (*    XOr   AH,AH     ; Nein, DOS Fehler in AL *)
  57.         /$2E/$8B/$16/Save_SS (*    Mov   DX,CS:Save_SS ; Wiederherstellen   *)
  58.         /$8E/$D2             (*    Mov   SS,DX         ;   von              *)
  59.         /$2E/$8B/$16/Save_SP (*    Mov   DX,CS:Save_SP ;  SS:SP             *)
  60.         /$8B/$E2             (*    Mov   SP,DX                              *)
  61.         /$FB                 (*    StI             ; Interrupt enable       *)
  62.         /$1F                 (*    Pop   DS        ; Register herstellen    *)
  63.         /$5D                 (*    Pop   BP                                 *)
  64.         /$2E/$A3/ErrorCode); (*    Mov   CS:ErrorCode,AX                    *)
  65.  
  66.   Exec := ErrorCode;
  67. END;
  68.