(* ------------------------------------------------------------ *)

{ This unit adds support for the DESQview" multi-tasking enviroment
  By Joel Bergen  last revised: 9/17/90  }

{$A+,B-,D+,E+,F-,I+,L+,N-,O+,R+,S+,V+}
{$M 1024,0,0}

UNIT DESQview;

INTERFACE

USES DOS;

VAR
  Dv_Loaded  : BOOLEAN; {True if running under DESQview                  }
  Dv_Version : WORD;    {DESQview" version number                        }
                        {Returns "0" if DESQview" is not loaded.         }
                        {Use:                                            }
                        {WRITELN(Hi(Dv_Version)+Lo(Dv_Version)/100:4:2); }
                        {to display the version of "Desqview" correctly. }


FUNCTION  Dv_There : BOOLEAN;     {True if Desqview loaded. Sets Dv_Version}
PROCEDURE Dv_Pause;               {Give up the rest of our timeslice}
PROCEDURE Dv_Begin_Critical;      {Turn switching off for time critical ops}
PROCEDURE Dv_End_Critical;        {Turn switching back on}
FUNCTION  Dv_Video_Buffer : WORD; {returns address of video buffer}

IMPLEMENTATION

VAR
  Reg : REGISTERS;

FUNCTION Dv_There;
BEGIN
  Reg.CX:=$4445;
  Reg.DX:=$5351;
  Reg.AX:=$2B01;
  INTR($21,Reg);
  Dv_Loaded:=(Reg.AL<>$0FF);
  IF Dv_Loaded THEN Dv_Version:=Reg.BX ELSE Dv_Version:=0;
  Dv_There:=Dv_Loaded;
END;

PROCEDURE Dv_Pause;
BEGIN
  IF DV_Loaded THEN BEGIN
    Reg.AX:=$1000;
    INTR($15,Reg);
  END;
END;

PROCEDURE Dv_Begin_Critical;
BEGIN
  IF DV_Loaded THEN BEGIN
    Reg.AX:=$101B;
    INTR($15,Reg);
  END;
END;

PROCEDURE Dv_End_Critical;
BEGIN
  IF DV_Loaded THEN BEGIN
    Reg.AX:=$101C;
    INTR($15,Reg);
  END;
END;

FUNCTION DV_Video_Buffer;
BEGIN
  Reg.AH:=$0F;
  INTR($10,Reg);
  IF Reg.AL=7 THEN Reg.ES:=$B000 ELSE Reg.ES:=$B800;
  IF DV_Loaded THEN BEGIN
    Reg.DI:=0;
    Reg.AX:=$FE00;
    INTR($10,Reg);
  END;
  DV_Video_Buffer:=Reg.ES;
END;

BEGIN { Checks to see if desqview is loaded at startup. }
  Dv_Loaded:=Dv_There;
END.

