[Back to WIN-OS2 SWAG index]  [Back to Main SWAG index]  [Original]

{
Author : GREGORY P. SMITH

> Is there any way to detect OS/2 (in a Dos box) sessions and Windows
> Sessions? I'd like to throw in support For these multitaskers so I can
> run an idlekey Program.

Actual code is always the best example For me..  Look at this Unit (and use
it, I think you'll like it).  Check With someone else if you want to
specifically detect winslows.  This Unit will, however, give up time to any
multitasker.
}

(* Public Domain Unit by Gregory P. Smith, No Rights Reserved *)
(* ...  This also means no guarantees  ... *)

Unit OS_Test; { DESQview, OS/2, & 386 v86 machine Interfaces }

{$X+,S-,R-,F-,O-,D-,G-} { extended syntax, nothing else }

Interface

Const
  In_DV  : Boolean = False; { are we in DESQview? }
  In_VM  : Boolean = False; { are we in a 386+ virtual machine? }
  In_OS2 : Boolean = False; { are we in OS/2? }

Function  OS2_GetVersion: Word; { Get OS/2 version # }
Function  DV_GetVersion: Word; { update In_DV and get version # }
Function  DV_Get_Video_Buffer(vseg:Word): Word; { get the alt video buffer }
Procedure DV_Pause; { give up time slice }
Procedure MT_Pause; Inline($cd/$28); { give up time in most multitaskers }
Procedure KillTime; { Release time in any situation }
Procedure DV_begin_Critical; { don't slice away }
  Inline($b8/$1b/$10/$cd/$15);
Procedure DV_end_Critical; { allow slicing again }
  Inline($b8/$1c/$10/$cd/$15);
Procedure DV_Sound(freq,dur:Integer); { Create a Sound in the Bkg }

Implementation

Function OS2_GetVersion: Word; Assembler;
Asm
  MOV    AH, 30h  { Dos Get Version Call }
  INT    21h      { AL = major version * 10, AH = minor version }
  MOV    BH, AH   { save minor version }
  xor    AH, AH
  MOV    CL, 10
  div    CL       { divide by 10 to get the major version }
  MOV    AH, BH   { restore minor version }
  XCHG   AH, AL   { AH = major, AL = minor }
end;

Function DV_GetVersion: Word; Assembler;
Asm
  MOV    CX,'DE'     { CX+DX to 'DESQ' (invalid date) }
  MOV    DX,'SQ'
  MOV    AX,02B01H   { Dos' set date funct. }
  INT    21H         { call Dos }
  CMP    AL,0FFH     { Was it invalid? }
  JE     @No_dv      { yep, no dv }
  MOV    AX,BX       { AH=major AL=minor }
  MOV    In_DV,1     { Set In_DV flag }
  JMP    @DvGv_x     { other routines }
 @No_dv:
  xor    AX,AX       { Return 0 or no DV }
 @DvGv_x:
end; { DV_GetVersion }

Function DV_Get_Video_Buffer(vseg:Word): Word; Assembler;
Asm                      { Modified by Scott Samet April 1992 }
  CALL   DV_GetVersion   { Returns AX=0 if not in DV }
  MOV    ES,vseg         { Put current segment into ES }
  TEST   AX,AX           { In DV? }
  JZ     @DVGVB_X        { Jump if not }
  MOV    AH,0FEH         { DV's get video buffer Function }
  INT    10H             { Returns ES:DI of alt buffer }
 @DVGVB_X:
  MOV    AX,ES           { Return video buffer }
end; { DV_Get_Video_Buffer }

Procedure DV_Pause;
begin
  if In_DV then
  Asm
    MOV AX, 1000h    { pause Function }
    INT 15h
  end;
end; { DV_Pause }

Procedure KillTime;
begin
  if In_VM then
  Asm
    MOV AX, 1680h    { give up VM time slice }
    INT 2Fh
  end
  else
  if In_DV then
  Asm
    MOV AX, 1000h    { DV pause call }
    INT 15h
  end
  else
    MT_Pause;      { Dos Idle call }
end;

(* Procedure DV_begin_Critical; Assembler;
Asm
  MOV AX,$101B       { DV begin critical Function }
  INT 15h
end; { DV_begin_Critical }

Procedure DV_end_Critical; Assembler;
Asm
  MOV AX,$101C       { DV end critical Function }
  INT 15h
end; { DV_end_Critical }  *)

Procedure DV_Sound(freq,dur:Integer); Assembler; { Sound a tone }
Asm
  MOV   AX,1019H
  MOV   BX,freq  { frequency above 20 Hz }
  MOV   CX,dur   { duration in clock ticks }
  INT   15H
end;

{ ** -- initalization -- ** }

begin
  DV_GetVersion; { discard answer.  Just update In_DV }
  Asm
    MOV AX, 1680h
    INT 2Fh          { Gives up time slice in most 386+ virtual machines }
    not AL           { AL = 00h if supported, remains 80h if not }
    MOV CL, 7
    SHR AL, CL       { move bit 7 to bit 0 For a Boolean }
    MOV In_VM, AL    { update the flag }
  end;
  In_OS2 := (OS2_GetVersion >= $0100); { version 1.0 or greater }
end.


[Back to WIN-OS2 SWAG index]  [Back to Main SWAG index]  [Original]