home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / Pascal / Samples / MOUSLIB8.ARJ / TPDESQ.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-02-25  |  7.2 KB  |  195 lines

  1. (******************************************************************************
  2. *                                   tpDESQ                                    *
  3. * Turbo-Pascal 6.0 DESQview interface unit, (c) 1991, Loewy Ron.              *
  4. ******************************************************************************)
  5. unit tpDESQ;
  6. {$ifdef ovl}
  7.    {$F+}
  8. {$endif}
  9. interface
  10.  
  11. uses
  12.    dos
  13. {$ifndef cmdline}
  14.    ,crt
  15. {$endif}
  16.    ;
  17.  
  18. const
  19.    DESQviewActive : boolean = false; { true if running under DESQview }
  20.    DESQviewMajor  : byte    = 0;
  21.    DESQviewMinor  : byte    = 0;
  22.  
  23. procedure detectDESQview;
  24. function getDESQviewTextBuffer : pointer;
  25. procedure DESQviewApiCall(func : word);
  26. procedure DESQviewPause;
  27. procedure DESQviewBeginCritical;
  28. procedure DESQviewEndCritical;
  29. procedure makeDESQviewAware;
  30. procedure DESQviewHercules43Lines(page : byte);
  31. function  DESQviewCurrentWindow : byte;
  32. function  DESQviewDirectScreenWrite : boolean;
  33. function  extendedDESQview : boolean; { true if xdv }
  34.  
  35. implementation
  36.  
  37. var
  38.    regs  : registers;
  39.  
  40. (******************************************************************************
  41. *                               detectDESQview                                *
  42. * Set DESQviewActive flag to TRUE if DV is active, and set Major and Minor    *
  43. * DESQview version.                                                           *
  44. ******************************************************************************)
  45. procedure detectDESQview;
  46. begin
  47.    regs.cx := $4445;
  48.    regs.dx := $5351; { date cx = DE, dx = SQ }
  49.    regs.ax := $2B01; { dos set date function }
  50.    msdos(regs);
  51.    if (regs.al = $ff) then
  52.       DESQviewActive := false { if dos detected an error, no DV active }
  53.    else begin
  54.       DESQviewActive := true;
  55.       DESQviewMajor  := regs.bh;
  56.       DESQviewMinor  := regs.bl;
  57.    end;
  58. end; {detectDESQview}
  59.  
  60. (******************************************************************************
  61. *                            getDESQviewTextBuffer                            *
  62. ******************************************************************************)
  63. function getDESQviewTextBuffer;
  64. begin
  65.    regs.ah := $fe; { DESQview get buffer function API }
  66.    intr($10, regs);
  67.    getDESQviewTextBuffer := ptr(word(regs.es), word(regs.di));
  68. end; {getDESQviewTextBuffer}
  69.  
  70. (******************************************************************************
  71. *                               DESQviewApiCall                               *
  72. ******************************************************************************)
  73. procedure DESQviewApiCall; assembler;
  74. asm
  75.    push ds
  76.    push bp
  77.    push sp
  78.    push ss
  79.    mov ax, $101A  ; { switch to DV stack }
  80.    int $15
  81.    mov ax, func   ; { perform API call }
  82.    int $15
  83.    mov ax, $1025  ; { switch off DV stack }
  84.    int $15
  85.    pop ss
  86.    pop sp
  87.    pop bp
  88.    pop ds
  89. end; {DESQviewApiCall}
  90.  
  91. (******************************************************************************
  92. *                                DESQviewPause                                *
  93. * give up programs time slice, (Waiting for an event ... )                    *
  94. ******************************************************************************)
  95. procedure DESQviewPause;
  96. begin
  97.    DESQviewApiCall($1000);
  98. end; {DESQviewPause}
  99.  
  100. (******************************************************************************
  101. *                            DESQviewBeginCritical                            *
  102. * Tell DV not to slice away until a DESQviewEndCritical is issued             *
  103. ******************************************************************************)
  104. procedure DESQviewBeginCritical;
  105. begin
  106.    DESQviewApiCall($101B);
  107. end; {DESQviewBeginCritical}
  108.  
  109. (******************************************************************************
  110. *                             DESQviewEndCritical                             *
  111. ******************************************************************************)
  112. procedure DESQviewEndCritical;
  113. begin
  114.    DESQviewApiCall($101C);
  115. end; {DESQviewEndCritical}
  116.  
  117. (******************************************************************************
  118. *                              makeDESQviewAware                              *
  119. ******************************************************************************)
  120. procedure makeDESQviewAware;
  121. begin
  122. {$ifndef cmdline}
  123.    directVideo := false;
  124. {$endif}
  125. end; {makeDESQviewAware}
  126.  
  127. (******************************************************************************
  128. *                           DESQviewHercules43Lines                           *
  129. * DV uses INT 10h, service 00 - set video mode to display more then 25 lines, *
  130. * no errors are checked, use at your own risk.                                *
  131. ******************************************************************************)
  132. procedure DESQviewHercules43Lines;
  133. begin
  134.    regs.ah := 0; { set video mode }
  135.    regs.al := page + $21; 
  136.    { an error will occur if other then page 0, or 1 is given, procedure does }
  137.    { not check for this error !, check by your self !                        }
  138.    intr($10, regs);
  139. end; {DESQviewHercules43Lines}
  140.  
  141. (******************************************************************************
  142. *                        DESQviewGetCurrentWindowInfo                         *
  143. * internal DV 2.0+ window information service.                                *
  144. ******************************************************************************)
  145. procedure DESQviewGetCurrentWindowInfo;
  146. begin
  147.    regs.ah := $82;
  148.    regs.dx := $4456; { DV magic number }
  149.    intr($10, regs);
  150. end; {DESQviewGetCurrentWindowInfo}
  151.  
  152. (******************************************************************************
  153. *                            DESQviewCurrentWindow                            *
  154. * this function returns the number of the current window we run in            *
  155. ******************************************************************************)
  156. function DESQviewCurrentWindow;
  157. begin
  158.    DESQviewGetCurrentWindowInfo;
  159.    DESQviewCurrentWindow := regs.al;
  160. end; {DESQviewCurrentWindow}
  161.  
  162. (******************************************************************************
  163. *                          DESQviewDirectScreenWrite                          *
  164. ******************************************************************************)
  165. function DESQviewDirectScreenWrite;
  166. begin
  167.    DESQviewGetCurrentWindowInfo;
  168.    if (regs.bl = 1) then
  169.       DESQviewDirectScreenWrite := true
  170.    else
  171.       DESQviewDirectScreenWrite := false;
  172. end; {DESQviewDirectScreenWrite}
  173.  
  174. (******************************************************************************
  175. *                              extendedDESQview                               *
  176. ******************************************************************************)
  177. function extendedDESQview;
  178. begin
  179.    asm
  180.       mov ax, $11DE
  181.       mov @result, 0
  182.       jnc @noXdv
  183.       mov @result, 1
  184.    @noXdv:
  185.    end; { asm }
  186. end; {extendedDESQview}
  187.  
  188. (******************************************************************************
  189. *                                    MAIN                                     *
  190. ******************************************************************************)
  191. begin
  192.    detectDESQview;
  193. end.
  194. 
  195.