home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / t_power / execwin.pas < prev    next >
Pascal/Delphi Source File  |  1988-12-11  |  4KB  |  129 lines

  1. {
  2.  This unit interfaces one procedure, ExecWindow, which uses the ExecDos
  3.  routine from Turbo Professional's TPDOS unit to run a child process. In
  4.  addition to what the ExecDos routine does, ExecWindow attempts to keep the
  5.  video output of the child process within a specified window on the screen.
  6.  This is useful for some programs, as exemplified by the INSTALL.EXE program
  7.  used for installation of Turbo Professional files.
  8.  
  9.  The technique used is to grab interrupt 21h and thus control all writes to
  10.  the standard output and error devices. These are rerouted to the screen,
  11.  within the specified window. Note that the technique will not work for
  12.  programs that write directly to video memory, through the BIOS, or through
  13.  some other file handle assigned to the console. It does work with standard
  14.  DOS commands, with the TPC.EXE compiler, and with other command line
  15.  utilities like ARCX.COM.
  16.  
  17.  Written by Kim Kokkonen, TurboPower Software
  18.  Released to the public domain
  19.  Version 1.0 - 10/09/88
  20.  Version 1.01 - 11/14/88
  21.    save BP register in ISR since some int 10 BIOS handlers trash it
  22. }
  23.  
  24. {$R-,S-,I-,B-,F-,V-}
  25.  
  26. unit ExecWin;
  27.   {-Exec a program in a window}
  28.  
  29. interface
  30.  
  31. uses
  32.   Dos,
  33.   TpDos;
  34.  
  35. function ExecWindow(Command : string; UseSecond : Boolean;
  36.                     Xlo, Ylo, Xhi, Yhi : Byte;
  37.                     Attr : Byte) : Integer;
  38.   {-Exec a program in a window.
  39.     Command and UseSecond are defined just as for ExecDos.
  40.     Xlo, Ylo, Xhi, Yhi are the window boundaries, just as for a Window() call.
  41.     Attr is the video attribute for all writes within the window.
  42.     Returns error codes just like ExecDos.
  43.   }
  44.  
  45.   {=======================================================================}
  46.  
  47. implementation
  48.  
  49. type
  50.   ByteCast =
  51.     record
  52.       LoB, HiB : Byte;
  53.     end;
  54.  
  55. var
  56.   SaveInt21 : Pointer;
  57.   WindPos : Word;
  58.   WindLo : Word;
  59.   WindHi : Word;
  60.   WindAttr : Byte;
  61.  
  62.   {$L EXECWIN}
  63.   procedure SetCsInts; external;
  64.   procedure NewInt21; external;
  65.  
  66.   function ExecWindow(Command : string; UseSecond : Boolean;
  67.                       Xlo, Ylo, Xhi, Yhi : Byte;
  68.                       Attr : Byte) : Integer;
  69.     {-Exec a program in a window}
  70.   begin
  71.     {Validate window}
  72.     if (Xlo > Xhi) or (Ylo > Yhi) or (Xlo < 1) or (Ylo < 1) then begin
  73.       ExecWindow := 99;
  74.       Exit;
  75.     end;
  76.  
  77.     {Store global copies of window data for interrupt handler}
  78.     WindAttr := Attr;
  79.     ByteCast(WindLo).LoB := Xlo-1;
  80.     ByteCast(WindLo).HiB := Ylo-1;
  81.     ByteCast(WindHi).LoB := Xhi-1;
  82.     ByteCast(WindHi).HiB := Yhi-1;
  83.  
  84.     {Assure cursor is in window}
  85.     inline
  86.     (
  87.      {;get cursor pos}
  88.      $B4/$03/                     {  mov ah,3}
  89.      $30/$FF/                     {  xor bh,bh}
  90.      $CD/$10/                     {  int $10}
  91.      {;assure it's within window}
  92.      $8B/$0E/>WindLo/             {  mov cx,[>windlo]}
  93.      $38/$EE/                     {  cmp dh,ch ;row above minimum?}
  94.      $73/$02/                     {  jae okxlo ;jump if so}
  95.      $88/$EE/                     {  mov dh,ch}
  96.      {okxlo:}
  97.      $38/$CA/                     {  cmp dl,cl ;col above minimum?}
  98.      $73/$02/                     {  jae okylo ;jump if so}
  99.      $88/$CA/                     {  mov dl,cl}
  100.      {okylo:}
  101.      $8B/$0E/>WindHi/             {  mov cx,[>windhi]}
  102.      $38/$EE/                     {  cmp dh,ch ;row below maximum?}
  103.      $76/$02/                     {  jbe okxhi ;jump if so}
  104.      $88/$EE/                     {  mov dh,ch}
  105.      {okxhi:}
  106.      $38/$CA/                     {  cmp dl,cl ;col below maximum?}
  107.      $76/$02/                     {  jbe okyhi ;jump if so}
  108.      $88/$CA/                     {  mov dl,cl}
  109.      {okyhi:}
  110.      $89/$16/>WindPos/            {  mov [>windpos],dx ;save current position}
  111.      {;position cursor}
  112.      $B4/$02/                     {  mov ah,2}
  113.      $30/$FF/                     {  xor bh,bh}
  114.      $CD/$10);                    {  int $10}
  115.  
  116.     {Take over interrupt}
  117.     GetIntVec($21, SaveInt21);
  118.     SetCsInts;
  119.     SetIntVec($21, @NewInt21);
  120.  
  121.     {Exec the program}
  122.     ExecWindow := ExecDos(Command, UseSecond, nil);
  123.  
  124.     {Restore interrupt}
  125.     SetIntVec($21, SaveInt21);
  126.   end;
  127.  
  128. end.
  129.