[Back to DESQVIEW SWAG index] [Back to Main SWAG index] [Original]
{ Does anyone know the routine For making a Program DV aware, and if it
finds it, can you get it to make calls to it instead of Dos?
}
Here is a desqview Unit I have used in the past.
Unit DESQVIEW ;
{$O+,F+}
Interface
Uses Dos ;
Var
DV_ACTIVE : Boolean ; { True if running under DESQview }
Win_ACTIVE : Boolean ; { True if Windows 3.x Enhanced Mode }
DV_VERSION : Word ; { desqVIEW version number }
DV_VSEG : Word ;
DV_VMODE : Byte Absolute $0040:$0049 ;
DV_VWIDTH : Byte ;
DV_VROWS : Byte ;
DV_VofS : Word ;
Procedure DV_RQM ; { Give up the rest of our timeslice }
Procedure DV_begin_CRITICAL ; { Turn Task Switching off. }
Procedure DV_end_CRITICAL ; { Turn switching back on. }
Procedure DV_VIDEO_BUFFER ; { Set Global Video Variables }
Function DV_Window_NUMBER : Byte ; { Returns Window Number }
Procedure DV_COMMON_MEMorY(Var AVAIL, LARGEST, toTAL: Word) ;
Procedure DV_CONV_MEMorY (Var AVAIL, LARGEST, toTAL: Word) ;
Procedure DV_EMS_MEMorY (Var AVAIL, LARGEST, toTAL: Word) ;
Procedure DV_FASTWrite (X,Y: Word; STR: String; FG,BG: Word) ;
Implementation
Var
REG : Registers ;
Procedure DV_RQM ;
begin
if DV_ACTIVE then begin
Asm
mov ax, 1000h
int 15h
end ;
end else begin
if Win_ACTIVE then begin
Asm
mov ax, 1680h
int 2fh
end ;
end ;
end ;
end { dv_rqm };
Procedure DV_begin_CRITICAL ;
begin
if DV_ACTIVE then begin
Asm
mov ax, $101b
int 15h
end ;
end else begin
if Win_ACTIVE then begin
Asm
mov ax, 1681h
int 2fh
end ;
end ;
end ;
end ; { dv_begin_critical }
Procedure DV_end_CRITICAL ;
begin
if DV_ACTIVE then begin
Asm
mov ax, $101c
int 15h
end ;
end else begin
if Win_ACTIVE then begin
Asm
mov ax, $1682
int 2fh
end ;
end ;
end ;
end ; { dv_end_critical }
Procedure DV_VIDEO_BUFFER ;
begin
if DV_ACTIVE then begin
Asm
mov ax, $2b02
mov bx, $4445 ; { DE }
mov dx, $5351 ; { SQ }
int 21h
mov DV_VSEG, dx
mov DV_VWIDTH, bl
mov DV_VROWS, bh
mov DV_VofS, 0
end ;
end else begin
if (DV_VMODE = 7) then DV_VSEG := $b000 else DV_VSEG := $b800 ;
DV_VWIDTH := memw[$0040:$004a] ;
DV_VROWS := 25 ;
DV_VofS := memw[$0040:$004e] ;
end ;
end ; { dv_video_buffer }
Function DV_Window_NUMBER ;
begin
if DV_ACTIVE then begin
Asm
mov ax, $de07
int 15h
mov @RESULT, al
end ;
end else begin
DV_Window_NUMBER := 0 ;
end ;
end ;
Procedure DV_COMMON_MEMorY ;
begin
if DV_ACTIVE then begin
Asm
mov ax, $de04
int 15h
les di, AVAIL
mov es:[di], bx
les di, LARGEST
mov es:[di], cx
les di, toTAL
mov es:[di], dx
end ;
end else begin
AVAIL := 0 ;
LARGEST := 0 ;
toTAL := 0 ;
end ;
end ;
Procedure DV_CONV_MEMorY ;
begin
if DV_ACTIVE then begin
Asm
mov ax, $de05
int 15h
les di, AVAIL
mov es:[di], bx
les di, LARGEST
mov es:[di], cx
les di, toTAL
mov es:[di], dx
end ;
end else begin
AVAIL := 0 ;
LARGEST := 0 ;
toTAL := 0 ;
end ;
end ;
Procedure DV_EMS_MEMorY ;
begin
if DV_ACTIVE then begin
Asm
mov ax, $de06
int 15h
les di, AVAIL
mov es:[di], bx
les di, LARGEST
mov es:[di], cx
les di, toTAL
mov es:[di], dx
end ;
end else begin
AVAIL := 0 ;
LARGEST := 0 ;
toTAL := 0 ;
end ;
end ;
Procedure DV_FASTWrite ;
Var
I : Word ;
begin
X := DV_VofS + ((Y-1) * DV_VWIDTH + (X-1)) * 2 ;
For I := 1 to length(STR) do begin
MEMW[DV_VSEG:X] := (((BG shl 4) + FG) shl 8) + ord(STR[I]) ;
X := X + 2 ;
end ;
end ;
begin { main }
REG.AX := $2b01 ;
REG.CX := $4445 ; { DE }
REG.DX := $5351 ; { SQ }
intr($21,REG) ;
Win_ACTIVE := False ;
DV_ACTIVE := (REG.AL <> $ff) ;
DV_VERSION := 0 ;
if DV_ACTIVE then begin
DV_VERSION := REG.BX ;
REG.AX := $de0b ;
REG.BX := $0200 ; { Minimum of Desqview 2.00 }
intr($15,REG) ;
end else begin
REG.AX := $1600 ;
intr($2f,REG) ;
Case REG.AL of
$00 : ; { An enhanced Windows API is not Running }
$80 : ; { An enhanced Windows API is not Running }
$01 : ; { Windows / 386 Version 2.x }
$ff : ; { Windows / 386 Version 2.x }
else begin
Win_ACTIVE := True ;
DV_VERSION := swap(REG.AX) ;
end ;
end ;
end ;
DV_VIDEO_BUFFER ;
end. { main }
[Back to DESQVIEW SWAG index] [Back to Main SWAG index] [Original]