{
>  Well is there a way to find out if Norton Cache is installed?

Test For SmartDrv.* , HyperDsk only.    ! Others Untested !
}

Program IsThereAnyCache;
Uses
  Dos;

Const
  AktCache   : Byte = 0;
  CacheNames : Array[0..10] of String[25] = (
     '*NO* Disk-Cache found','SmartDrv.Exe','SmartDrv.Sys',
     'Compaq SysPro','PC-Cache V6.x','PC-Cache V5.x',
     'HyperDsk ?', 'NCache-F','NCache-S',
     'IBMCache.Sys','Q-Cache (?)');

Var
  Version : Integer;
  Regs    : Registers;

Function SmartDrvVersion:Integer;
Var
  Bytes : Array[0..$27] of Byte; { return Buffer }
  TFile : Text;
begin
  SmartDrvVersion := -1;  { assume NO smartdrv ! }
  {--------Check For SmartDrv.EXE---------- }
  FillChar( Regs, Sizeof(Regs), 0 );
  Regs.AX := $4A10;  { install-check }
  Intr( $2F, Regs );
  if Regs.FLAGS and FCARRY = 0 then  { OK! }
  begin
    if Regs.AX = $BABE then          { the MAGIC-# }
    begin
      SmartDrvVersion := Integer(Regs.BP);
      AktCache := 1;
      Exit;
    end;
  end;
  { -------Check For SmartDrv.SYS----------- }
  Assign(TFile,'SMARTAAR');
  {$I-}
  Reset(TFile);
  {$I+}
  if IOResult <> 0 then
    Exit; { No SmartDrv }
  FillChar( Regs, Sizeof(Regs), 0 );
  Regs.AX := $4402; { IoCtl }
  Regs.BX := TextRec(TFile).Handle;
  Regs.CX := Sizeof(Bytes);
  Regs.DS := Seg(Bytes);
  Regs.DX := Ofs(Bytes);
  MsDos(Regs); { int 21h }
  Close(TFile);
  if Regs.FLAGS and FCARRY <> 0 then
    Exit;  { Error-# in Regs.AX ...}
  SmartDrvVersion :=  Bytes[$E] + 256 * Bytes[$F];
  AktCache := 2;
end;

Function CompaqPro : Integer;
begin
  CompaqPro := -1;
  Regs.AX := $F400;
  Intr($16, Regs);
  if Regs.AH <> $E2 then
    Exit;
  if Regs.AL in[1,2] then
    AktCache := 3;
  CompaqPro := $100;
end;

Function PC6 : Integer;   { PCTools v6, v5 }
begin
  PC6 := -1;
  Regs.AX := $FFA5;
  Regs.CX := $1111;
  Intr($16, Regs);
  if Regs.CH <> 0 then
    Exit;
  PC6 := $600;
  AktCache := 4;
end;

Function PC5 : Integer;
begin
  PC5 := -1;
  Regs.AH := $2B;
  Regs.CX := $4358; {'CX'}
  Intr($21, Regs);
  if Regs.AL <> 0 then
    Exit;
  PC5 := $500;
  AktCache := 5;
end;

Function HyperDsk : Integer;   { 4.20+ ... }
begin
  Hyperdsk:= -1;
  Regs.AX := $DF00;
  Regs.BX := $4448; {'DH'}
  Intr($2F, Regs);
  if Regs.AL <> $FF   then
    Exit;
  if Regs.CX <> $5948 then
    Exit; { not a "Hyper" product }
  HyperDsk := Regs.DX;
  AktCache := 6;
end;

Function Norton : Integer;
begin
  Norton := -1;
  Regs.AX := $FE00;
  Regs.DI := $4E55; {'NU'}
  Regs.SI := $4353; {'CS' test For Ncache-S v5 }
  Intr($2F, Regs);
  if Regs.AH = $00 then
  begin
    Norton := $500;
    AktCache := 7;
    Exit;
  end;
  { Test For Ncache-F v5 / v6 }
  Regs.AX := $FE00;
  Regs.DI := $4E55; {'NU'}
  Regs.SI := $4353; {'CF' test For Ncache-F v5, V6+ }
  Intr($2F, Regs);
  if Regs.AH <> $00 then
    Exit;
  Norton := $600;
  AktCache := 8;
end;

Function IBM : Integer;
begin
  IBM:= -1;
  Regs.AX := $1D01;
  Regs.Dl := $2; { drive C: }
  Intr($13, Regs);
  if Regs.Flags and FCarry <> 0 then
    Exit;
  { ES:(BX+$22) -> ASCII-Version-# }
  Inc( Regs.BX, $22 );
  Regs.AH := (Mem[Regs.ES : Regs.BX] - $30 ) shl 4;
  Regs.AH := Regs.AH or (Mem[Regs.ES : Regs.BX + 1] - $30 );
  Regs.AL := (Mem[Regs.ES : Regs.BX + 2] - $30 ) shl 4;
  Regs.AL := Regs.AL or (Mem[Regs.ES : Regs.BX + 3] - $30 );
  IBM := Regs.AX;
  AktCache := 9;
end;

Function QCache : Integer;
begin
  QCache := -1;
  Regs.AH := $27;
  Regs.BX := 0;
  intr($13,Regs);
  if Regs.BX = 0 then
    Exit;
  QCache := Regs.BX;  { ??? }
  AktCache := 10;
end;

begin
  Writeln('DISK-CACHE-CHECK v1.00    Norbert Igl ''1/93');
  Version := SmartDrvVersion;
  if Aktcache = 0 then
    Version := Hyperdsk;
  if Aktcache = 0 then
    Version := Norton;
  if Aktcache = 0 then
    Version := PC6;
  if Aktcache = 0 then
    Version := PC5;
  if Aktcache = 0 then
    Version := IBM;
  if Aktcache = 0 then
    Version := QCache;
  if Aktcache = 0 then
    Version := CompaqPro;

  Write(CacheNames[AktCache]);
  if AktCache <> 0 then
    Writeln(' (V', Version div 256, '.', Version mod 256, ') installed.');
  Writeln;
end.
