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


unit win_ver; {detect Windows = present, version, & mode }
  {NOTE: use post 3.1 version detection before pre 3.1}
interface
  {post 3.1}
  procedure windows_version( var major, minor : byte );
  procedure windows_mode( var mode : byte );
  {pre 3.1}
  procedure enhanced_mode_present ( var present : boolean);
  procedure windows_present( var present : boolean );
  procedure windows_386_present( var present : boolean );
  procedure windows_3_0_mode( var mode : byte );
implementation
  {win 3.1+ only}
  procedure windows_version( var major, minor : byte ); {0,0 = not detected}
  begin asm
       push es;
       mov ax, 160ah; int 2fh

       cmp ax,0
       je  @windows_present
       @windows_not_present:
       mov byte ptr major, 0; mov byte ptr minor, 0
       jmp @end_procedure
       @windows_present:
       mov al, bh; les di, major; stosB
       mov al, bl; les di, minor; stosB

       @end_procedure:
       pop es
  end; end;
  {win 3.1+ only}
  procedure windows_mode(var mode : byte ); {0=unknown}
  begin asm
       push es
       mov ax, 160ah; int 2fh

       cmp ax,0
       jne  @windows_not_present
       @windows_present:
       mov ax, cx;
       jmp @end_procedure
       @windows_not_present:
       mov ax, 0
       @end_procedure:
       les di, mode; stosB
       pop es
  end; end;
  {pre win 3.1}
  { ax=1600h := windows not running  }
  { ax=80h or ffh := win/386 running }
  procedure enhanced_mode_present (var present : boolean);
  begin asm
       push es
       mov ax, 1600h; int 2fh

       cmp ax, 1600h
       jne @enhanced_mode_present
       @not_endhanced_mode:
       mov ax, 0
       jmp @end_function
       @enhanced_mode_present:
       mov ax, 0ffffh

       @end_function:
       les di, present; stosB
       pop es
  end; end;
  {pre win 3.1}
  {al = ff or 80 = windows/386 running}
  procedure windows_386_present( var present : boolean );
  begin asm
       push es
       mov ax,4680h; int 2fh

       cmp ax,0
       jne @not_present
       cmp al,0ffh
       je   @present
       cmp al,080h
       jne  @not_present
       @present:
       mov ax, 0ffffh
       jmp @end_procedure
       @not_present:
       mov ax, 0

       @end_procedure:
       les di, present; stosB
       pop es
  end; end;
  {pre win 3.1}
  procedure windows_present( var present : boolean );
  begin asm
       push es
       mov ax,4680h; int 2fh

       cmp ax,0
       jne @not_present
       @present:
       mov ax, 0ffffh
       jmp @end_function
       @not_present:
       mov ax, 0h

       @end_function:
       les di, present; stosB
       pop es
  end; end;
  { call only if 3.0 has been identified }
  { mode = 2 := real mode } { mode = 1 := standard mode }
  { mode = 0 := unknown }
  procedure windows_3_0_mode(var mode : byte);
  begin asm
       push es
       mov ax,1605h; xor cx,cx; int 2fh  {simulate "windows restart"}

       cmp cx, 0ffffh
       jne @real_mode
       @standard_mode:
       mov ax, 2              { 2 = standard mode }
       jmp @end_procedure
       @real_mode:
       cmp cx,0
       je  @is_real_mode
       mov ax, 0              { 0 = mode unknown }
       jmp @end_procedure
       @is_real_mode:
       mov ax, 1              { 1 = real mode }

       @end_procedure:
       les di, mode; stosB
       {termination notice should be here!}
       pop es
  end; end;
end.

{  --------- Test driver for win_ver ---------------- }

uses win_ver;  var maj, min, mode : byte; bol:boolean;
begin
  windows_version( maj, min );
  writeln(' win maj.min ',maj,'.',min);
  windows_mode( mode );
  writeln(' win mode :[3=enhance,2=standard,1=real(not_supported)] =',mode);
  enhanced_mode_present( bol );
  writeln(' enhanced mode? ',bol);
  windows_present( bol );
  writeln(' windows present (pre 3.1) ? ',bol);
  windows_386_present( bol );
  writeln(' windows 386 present(pre 3.1) ? ',bol);
  windows_3_0_mode( mode );
  writeln(' 3.0 mode [2 = standard, 1 = real, 0 = ?] = ',mode);
end.

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