Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Как определить тип процессора


Приходит мужик в компьютерный салон:
- Я у вас вчера компьютер прикупил...
- У вас проблемы?
- Сгорел он...
- Нет проблем, - он на гарантии. А что у вас сгорело?
- Все!
- Ну так не бывает. Процесор цел?
- Сгорел.
- А винчестер?
- Сгорел.
- А память?
- Сгорела.
- А монитор?
- Сгорел.
- Господи! Что же вы с ним делали?
- Да у меня пожар вчера был.


unit CpuId;

interface

uses
  Windows, Mmsystem, Sysutils, Math, Dialogs;

type
  TCpuRec = record
  name: string[128];
  Vendor: string[12];
  Frequency: word;
  Family: integer;
  Model: integer;
  Stepping: integer;
  L1DCache: word;
  L1ICache: word;
  L2Cache: word;
end;

TCpuType = (cpu8086, cpu286, cpu386, cpu486, cpuPentium);

TCpuData = object
  function GetCPUIDSupport:Boolean;
  function GetVendorString:string;
  function GetCPUFrequency:word;
  procedure GetFMS(var Family,Model,Stepping:byte);
  function GetMaxCpuId:dword;
  function CheckFPU:Boolean;
  function CheckTSC:Boolean;
  function CheckMSR:Boolean;
  function CheckMPS:Boolean;
  function GetNoCpus:cardinal;
  function CheckPN:Boolean;
  function CheckCMPXCHG8B:Boolean;
  function CheckCMOVe:Boolean;
  function CheckSelfSnoop:Boolean;
  function CheckDebugTraceStore:Boolean;
  function CheckFXSAVEFXRSTOR:Boolean;
  function CheckMMX:Boolean;
  function CheckMMXplus:Boolean;
  function CheckSSE:Boolean;
  function CheckSSE2:Boolean;
  function CheckAMD3DNow:Boolean;
  function CheckAMD3DNowPlus:Boolean;
  function GetMaxExtendedFunctions:dword;
  procedure GetExtendedFMS(var Family,Model,Stepping:byte);
  function GetExtendedCpuName:string;
  function GetExtendedL1DCache:word;
  function GetExtendedL1ICache:word;
  function GetExtendedL2Cache:word;

  function CheckCeleron:Boolean;
  function CheckPentiumIII:Boolean;
  function CheckXeon:Boolean;
  function CheckPentium4:Boolean;
  function CheckIthanium:Boolean;

  //****Aici am conrectat****
  function IntelP5N:string;
  function IntelP6N:string;
  //****Pana aici****
  function AMDK5N:string;
  function Cyrix686N:string;
  function GenericCpuN:string;
  function P5CacheL1DI:word;
  function P6CacheL1DI:word;
  function P6CacheL2:word;

  function AuthenticAMD:TCpuRec;

  function GenuineIntel:TCpuRec;
  function CyrixInstead:TCpuRec;
  function GenericCPU:TCpuRec;
end;

const
  Intel486:array[0..8] of string=
  ('Intel 486 DX',
  'Intel 486 DX',
  'Intel 486 SX',
  'Intel 486 DX2',
  'Intel 486 SL',
  'Intel 486 SX2',
  'Intel 486 DX2',
  'Intel 486 DX4',
  'Intel 486 DX4');

  UMC486:array[0..1] of string=
  ('UMC U5D',
  'UMC U5S');

  AMD486:array[0..5] of string=
  ('AMD 486 DX2',
  'AMD 486 DX2',
  'AMD 486 DX4',
  'AMD 486 DX4',
  'AMD 5x86',
  'AMD 5x86');

  IntelP5:array[0..6] of string=
  ('Intel Pentium P5 A-Step',
  'Intel Pentium P5',
  'Intel Pentium P54C',
  'Intel Pentium P24T Overdrive',
  'Intel Pentium MMX P55C',
  'Intel Pentium P54C',
  'Intel Pentium MMX P55C');

  NexGenNx586='NexGen Nx586';
  Cyrix4x86='VIA Cyrix 4x86';
  Cyrix5x86='VIA Cyrix 5x86';
  CyrixMediaGX='VIA Cyrix Media GX';
  CyrixM1='VIA Cyrix 6x86';
  CyrixM2='VIA Cyrix 6x86MX';
  CyrixIII='VIA Cyrix III';

  AMDK5:array[0..3] of string=
  ('AMD SSA5 (PR75/PR90/PR100)',
  'AMD 5k86 (PR120/PR133)',
  'AMD 5k86 (PR166)',
  'AMD 5k86 (PR200)');

  AMDK6:array[0..4] of string=
  ('AMD K6 (166~233)',
  'AMD K6 (266~300)',
  'AMD K6-2',
  'AMD K6-III',
  'AMD K6-2+ or K6-III+');

  Centaur:array[0..2] of string=
  ('Centaur C6',
  'Centaur C2',
  'Centaur C3');

  Rise:array[0..1] of string=
  ('Rise mP6',
  'Rise mP6');

  IntelP6:array[0..7] of string=
  ('Intel Pentium Pro A-Step',
  'Intel Pentium Pro',
  'Intel Pentium II',
  'Intel Pentium II',
  'Intel Pentium II',
  'Intel Pentium III',
  'Intel Pentium III',
  'Intel Pentium III');

  AMDK7:array[0..3] of string=
  ('AMD Athlon(tm) Processor',
  'AMD Athlon(tm) Processor',
  'AMD Duron(tm) Processor',
  'AMD Thunderbird Processor');
  IntelP4='Intel Pentium 4';

var
  CpuData: TCpuData;

implementation

function TCpuData.GetCPUIDSupport: Boolean;
var
  TempDetect: dword;
begin
  asm
    pushf
    pushfd
    push eax
    push ebx
    push ecx
    push edx

    pushfd
    pop eax
    mov ebx,eax
    xor eax,$00200000
    push eax
    popfd
    pushfd
    pop eax
    push ebx
    popfd
    xor eax,ebx
    mov TempDetect,eax

    pop edx
    pop ecx
    pop ebx
    pop eax
    popfd
    popf
  end;
  GetCPUIDSupport:=(TempDetect=$00200000);
end;

function TCpuData.GetVendorString:string;
var
  s1, s2, s3: array [0..3] of char;
  TempVendor: string;
  i: integer;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,0
    db $0F,$A2 /// cpuid
    mov s1,ebx
    mov s2,edx
    mov s3,ecx
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  TempVendor:='';
  for i:=0 to 3 do
    TempVendor:=TempVendor+s1[i];
  for i:=0 to 3 do
    TempVendor:=TempVendor+s2[i];
  for i:=0 to 3 do
    TempVendor:=TempVendor+s3[i];
  GetVendorString:=TempVendor;
end;

function TCpuData.GetCPUFrequency: word;
var
  TimeStart: integer;
  TimeStop: integer;
  StartTicks: dword;
  EndTicks: dword;
  TotalTicks: dword;
  cpuSpeed: dword;
  NeverExit: Boolean;
begin
  TimeStart:=0;
  TimeStop:=0;
  StartTicks:=0;
  EndTicks:=0;
  TotalTicks:=0;
  cpuSpeed:=0;
  NeverExit:=True;
  TimeStart:=timeGetTime;
  while NeverExit do
  begin
    TimeStop:=timeGetTime;
    if ((TimeStop-TimeStart)>1) then
    begin
      asm
        xor eax,eax
        xor ebx,ebx
        xor ecx,ecx
        xor edx,edx
        db $0F,$A2 /// cpuid
        db $0F,$31 /// rdtsc
        mov StartTicks,eax
      end;
      Break;
    end;
  end;
  TimeStart:=TimeStop;
  while NeverExit do
  begin
    TimeStop:=timeGetTime;
    if ((TimeStop-TimeStart)>1000) then
    begin
      asm
        xor eax,eax
        xor ebx,ebx
        xor ecx,ecx
        xor edx,edx
        db $0F,$A2 /// cpuid
        db $0F,$31 /// rdtsc
        mov EndTicks,eax
      end;
      Break;
    end;
  end;
  TotalTicks:=EndTicks-StartTicks;
  cpuSpeed:=TotalTicks div 1000000;
  GetCPUFrequency:=cpuSpeed;
end;

procedure TCpuData.GetFMS(var Family,Model,Stepping:byte);
var
  TempFlags: dword;
  BinFlags: array [0..31] of byte;
  i, pos: integer;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    mov TempFlags,eax
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  for i:=0 to 31 do
  begin
    BinFlags[i]:=TempFlags mod 2;
    TempFlags:=TempFlags div 2;
  end;
  family:=0;
  model:=0;
  stepping:=0;
  pos:=0;
  for i:=0 to 3 do
  begin
    stepping:=stepping+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));
    inc(pos);
  end;
  pos:=4;
  for i:=0 to 3 do
  begin
    model:=model+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));
    inc(pos);
  end;
  pos:=8;
  for i:=0 to 3 do
  begin
    family:=family+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));
    inc(pos);
  end;
end;

function TCpuData.GetMaxCpuId:dword;
var
  TempMax: dword;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,0
    db $0F,$A2 /// cpuid
    mov TempMax,eax
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  GetMaxCpuId:=TempMax;
end;

function TCpuData.CheckFPU: Boolean;
label
  NoFpu;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$1
    jz NoFpu
    mov edx,0
    mov TempCheck,edx
    NoFpu:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckFpu:=(TempCheck=0);
end;

function TCpuData.CheckTSC: Boolean;
label
  NoTSC;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$10
    jz NoTSC
    mov edx,0
    mov TempCheck,edx
    NoTSC:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckTSC:=(TempCheck=0);
end;

function TCpuData.CheckMSR: Boolean;
label
  NoMSR;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$20
    jz NoMSR
    mov edx,0
    mov TempCheck,edx
    NoMSR:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckMSR:=(TempCheck=0);
end;

function TCpuData.CheckMPS: Boolean;
var
  SysInfo: TSystemInfo;
begin
  GetSysTemInfo(SysInfo);
  CheckMPS:=(SysInfo.dwNumberOfProcessors>1);
end;

function TCpuData.GetNoCpus:cardinal;
var
  SysInfo: TSystemInfo;
begin
  GetSystemInfo(SysInfo);
  GetNoCpus:=SysInfo.dwNumberOfProcessors;
end;

function TCpuData.CheckPN:Boolean;
label
  NoPN;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$40000
    jz NoPN
    mov edx,0
    mov TempCheck,edx
    NoPN:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckPN:=(TempCheck=0);
end;

function TCpuData.CheckCMPXCHG8B:Boolean;
label
  NoCMPXCHG8B;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$100
    jz NoCMPXCHG8B
    mov edx,0
    mov TempCheck,edx
    NoCMPXCHG8B:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckCMPXCHG8B:=(TempCheck=0);
end;

function TCpuData.CheckCMOVe: Boolean;
label
  NoCMOVe;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$8000
    jz NoCMOVe
    mov edx,0
    mov TempCheck,edx
    NoCMOVe:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckCMOVe:=(TempCheck=0);
end;

function TCpuData.CheckSelfSnoop: Boolean;
label
  NoSelfSnoop;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$8000000
    jz NoSelfSnoop
    mov edx,0
    mov TempCheck,edx
    NoSelfSnoop:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckSelfSnoop:=(TempCheck=0);
end;

function TCpuData.CheckDebugTraceStore: Boolean;
label
  NoDebugTraceStore;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$200000
    jz NoDebugTraceStore
    mov edx,0
    mov TempCheck,edx
    NoDebugTraceStore:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckDebugTraceStore:=(TempCheck=0);
end;

function TCpuData.CheckFXSAVEFXRSTOR: Boolean;
label
  NoFXSAVEFXRSTOR;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$1000000
    jz NoFXSAVEFXRSTOR
    mov edx,0
    mov TempCheck,edx
    NoFXSAVEFXRSTOR:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckFXSAVEFXRSTOR:=(TempCheck=0);
end;

function TCpuData.CheckMMX: Boolean;
label
  NoMMX;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$800000
    jz NoMMX
    mov edx,0
    mov TempCheck,edx
    NoMMX:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckMMX:=(TempCheck=0);
end;

function TCpuData.CheckMMXplus: Boolean;
label
  NoMMXplus;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000001
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    test edx,$400000
    jz NoMMXplus
    mov edx,0
    mov TempCheck,edx
    NoMMXplus:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckMMXplus:=(TempCheck=0);
end;

function TCpuData.CheckSSE: Boolean;
label
  NoSSE;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$2000000
    jz NoSSE
    mov edx,0
    mov TempCheck,edx
    NoSSE:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckSSE:=(TempCheck=0);
end;

function TCpuData.CheckSSE2: Boolean;
label
  NoSSE2;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    test edx,$4000000
    jz NoSSE2
    mov edx,0
    mov TempCheck,edx
    NoSSE2:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckSSE2:=(TempCheck=0);
end;

function TCpuData.CheckAMD3DNow: Boolean;
label
  NoAMD3DNow;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000001
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    test edx,$80000000
    jz NoAMD3DNow
    mov edx,0
    mov TempCheck,edx
    NoAMD3DNow:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckAMD3DNow:=(TempCheck=0);
end;

function TCpuData.CheckAMD3DNowPlus: Boolean;
label
  NoAMD3DNowPlus;
var
  TempCheck: dword;
begin
  TempCheck:=1;
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000001
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    test edx,$40000000
    jz NoAMD3DNowPlus
    mov edx,0
    mov TempCheck,edx
    NoAMD3DNowPlus:
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckAMD3DNowPlus:=(TempCheck=0);
end;

function TCpuData.GetMaxExtendedFunctions: dword;
var
  TempExt: dword;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000000
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    shl eax,1
    shr eax,1
    mov TempExt,eax
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  GetMaxExtendedFunctions:=TempExt;
end;

procedure TCpuData.GetExtendedFMS(var family, model, stepping: byte);
var
  TempFlags: dword;
  BinFlags: array [0..31] of byte;
  i, pos:integer;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000001
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    mov TempFlags,eax
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  for i:=0 to 31 do
  begin
    BinFlags[i]:=TempFlags mod 2;
    TempFlags:=TempFlags div 2;
  end;
  family:=0;
  model:=0;
  stepping:=0;
  pos:=0;
  for i:=0 to 3 do
  begin
    stepping:=stepping+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));
    inc(pos);
  end;
  pos:=4;
  for i:=0 to 3 do
  begin
    model:=model+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));
    inc(pos);
  end;
  pos:=8;
  for i:=0 to 3 do
  begin
    family:=family+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));
    inc(pos);
  end;
end;

function TCpuData.GetExtendedCpuName: string; 
var
  s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12: array[0..3] of char;
  TempCpuName: string;
  i: integer;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000002
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    mov s1,eax
    mov s2,ebx
    mov s3,ecx
    mov s4,edx
    mov eax,$80000003
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    mov s5,eax
    mov s6,ebx
    mov s7,ecx
    mov s8,edx
    mov eax,$80000004
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    mov s9,eax
    mov s10,ebx
    mov s11,ecx
    mov s12,edx
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  TempCpuName:='';
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s1[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s2[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s3[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s4[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s5[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s6[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s7[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s8[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s9[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s10[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s11[i];
  for i:=0 to 3 do
    TempCpuName:=TempCpuName+s12[i];
  GetExtendedCpuName := TempCpuName;
end;

function TCpuData.GetExtendedL1DCache: word;
var
  L1D, TempL1D: dword;
  BinArray: array [0..31] of byte;
  i, p: integer;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000005
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    mov L1D,ecx
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  for i:=0 to 31 do
  begin
    BinArray[i]:=L1D mod 2;
    L1D:=L1D div 2;
  end;
  TempL1D:=0;
  p:=0;
  for i:=24 to 31 do
  begin
    TempL1D:=TempL1D+(BinArray[i]*StrToInt(FloatToStr(Power(2,p))));
    inc(p);
  end;
  GetExtendedL1DCache:=TempL1D;
end;

function TCpuData.GetExtendedL1ICache: word;
var
  L1I, TempL1I: dword;
  BinArray: array [0..31] of byte;
  i, p: integer;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000005
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    mov L1I,edx
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  for i:=0 to 31 do
  begin
    BinArray[i]:=L1I mod 2;
    L1I:=L1I div 2;
  end;
  TempL1I:=0;
  p:=0;
  for i:=24 to 31 do
  begin
    TempL1I:=TempL1I+(BinArray[i]*StrToInt(FloatToStr(Power(2,p))));
    inc(p);
  end;
  GetExtendedL1ICache:=TempL1I;
end;

function TCpuData.GetExtendedL2Cache: word;
var
  L2, TempL2: dword;
  BinArray: array [0..31] of byte;
  i, p: integer;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,$80000006
    mov ebx,0
    mov ecx,0
    mov edx,0
    db $0F,$A2 /// cpuid
    mov L2,ecx
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  for i:=0 to 31 do
  begin
    BinArray[i]:=L2 mod 2;
    L2:=L2 div 2;
  end;
  TempL2:=0;
  p:=0;
  for i:=16 to 31 do
  begin
    TempL2:=TempL2+(BinArray[i]*StrToInt(FloatToStr(Power(2,p))));
    inc(p);
  end;
  GetExtendedL2Cache:=TempL2;
end;

function TCpuData.CheckCeleron: Boolean;
var
  BId: byte;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    mov BId,bl
    pop edx
    pop ecx
    pop ebx

    pop eax
  end;
  CheckCeleron:=(BId=$1);
end;

function TCpuData.CheckPentiumIII: Boolean;
var
  BId: byte;
begin
  CheckPentiumIII:=(CheckMMX and CheckSSE);
end;

function TCpuData.CheckXeon: Boolean;
var
  BId: byte;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    mov BId,bl
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckXeon:=(BId=$3);
end;

function TCpuData.CheckPentium4: Boolean;
var
  BId: byte;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    mov BId,bl
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  CheckPentium4:=(BId=$8);
end;

function TCpuData.CheckIthanium: Boolean;
var
  res: dword;
  BinArray: array [0..31] of byte;
  i: byte;
begin
  asm
    push eax
    push ebx
    push ecx
    push edx
    mov eax,1
    db $0F,$A2 /// cpuid
    mov res,edx
    pop edx
    pop ecx
    pop ebx
    pop eax
  end;
  for i:=0 to 31 do
  begin
    BinArray[i]:=res mod 2;
    res:=res div 2;
  end;
  CheckIthanium:=(CheckPentium4 and (BinArray[30]=1));
end;

function TCpuData.IntelP5N: string;
begin
  if CheckMMX then
    IntelP5N:='Intel Pentium(r) MMX(tm)'
  else
    IntelP5N:='Intel Pentium(r)';
end;

function TCpuData.IntelP6N: string;
begin
  if CheckCeleron then
    IntelP6N:='Intel Celeron(r)'
  else
  if CheckPentiumIII then
    IntelP6N:='Intel Pentium(r) III'
  else
  if CheckXeon then
    IntelP6N:='Intel Pentium(r) III Xeon(tm)'
  else
  if not CheckMMX then
    IntelP6N:='Intel Pentium(r) PRO'
  else
    IntelP6N:='Intel Pentium(r) II';
end;

function TCpuData.AMDK5N: string;
var
  Family, Model, Stepping: byte;
begin
  GetFMS(Family,Model,Stepping);
  if Model=0 then
    AMDK5N:='AMD K5'
  else
    AMDK5N:=GetExtendedCpuName;
end;

function TCpuData.Cyrix686N: string;
begin
  if CpuData.GetMaxExtendedFunctions>0 then
    Cyrix686N:=GetExtendedCpuName
  else
  if CheckMMX then
    Cyrix686N:='VIA Cyrix 6x86MII'
  else
    Cyrix686N:='VIA Cyrix 6x86';
end;

function TCpuData.GenericCpuN: string;
var
  SysInfo:TSystemInfo;
begin
  GetSystemInfo(SysInfo);
  if SysInfo.dwProcessorType=386 then
    GenericCpuN:='Generic 386 CPU'
  else
  if SysInfo.dwProcessorType=486 then
    GenericCpuN:='Generic 486 CPU'
  else
  if SysInfo.dwProcessorType=586 then
    GenericCpuN:='Pentium Class CPU'
  else
    GenericCpuN:='Unknown CPU';
end;

function TCpuData.P5CacheL1DI: word;
begin
  if CheckMMX then
    P5CacheL1DI:=16
  else
    P5CacheL1DI:=8;
end;

function TCpuData.P6CacheL1DI: word;
begin
  if not CheckMMX then
    P6CacheL1DI:=8
  else
    P6CacheL1DI:=16;
end;

function TCpuData.P6CacheL2: word;
var
  Family, Model, Stepping: byte;
begin
  if CheckCeleron then
    P6CacheL2:=128
  else
  if CheckPentiumIII then
  begin
    GetFMS(Family,Model,Stepping);
    if Model=7 then
      P6CacheL2:=512
    else
    if Model=8 then
      P6cacheL2:=256
    else
      P6CacheL2:=512;
  end
  else
  if not CheckMMX then
    P6CacheL2:=512
  else
    P6CacheL2:=512;
end;

function TCpuData.AuthenticAMD: TCpuRec;
var
  Family, Model, Stepping: byte;
  EFamily, EModel, EStepping: byte;
begin
  GetFMS(Family,Model,Stepping);
  if Family=4 then
  begin
    AuthenticAMD.name:='AMD 486';
    AuthenticAMD.Vendor:=GetVendorString;
    AuthenticAMD.Frequency:=0;
    AuthenticAMD.Family:=Family;
    AuthenticAMD.Model:=Model;
    AuthenticAMD.Stepping:=Stepping;
    AuthenticAMD.L1DCache:=8;
    AuthenticAMD.L1ICache:=8;
    AuthenticAMD.L2Cache:=0;
  end
  else
  if Family=5 then
  begin
    if GetMaxExtendedFunctions>4 then
    begin
      AuthenticAMD.name:=GetExtendedCpuName;
      AuthenticAMD.Vendor:=GetVendorString;
      AuthenticAMD.Frequency:=GetCPUFrequency;
      GetExtendedFMS(EFamily,EModel,EStepping);
      AuthenticAMD.Family:=EFamily;
      AuthenticAMD.Model:=EModel;
      AuthenticAMD.Stepping:=EStepping;
      AuthenticAMD.L1DCache:=GetExtendedL1DCache;
      AuthenticAMD.L1ICache:=GetExtendedL1ICache;
      AuthenticAMD.L2Cache:=0;
    end
    else
    begin
      AuthenticAMD.name:=AMDK5N;
      AuthenticAMD.Vendor:=GetVendorString;
      AuthenticAMD.Frequency:=GetCPUFrequency;
      AuthenticAMD.Family:=Family;
      AuthenticAMD.Model:=Model;
      AuthenticAMD.Stepping:=Stepping;
      AuthenticAMD.L1DCache:=16;
      AuthenticAMD.L1ICache:=16;
      AuthenticAMD.L2Cache:=0;
    end;
  end
  else
  if family>5 then
  begin
    AuthenticAMD.name:=GetExtendedCpuName;
    AuthenticAMD.name:=GetExtendedCpuName;
    AuthenticAMD.Vendor:=GetVendorString;
    AuthenticAMD.Frequency:=GetCPUFrequency;
    GetExtendedFMS(EFamily,EModel,EStepping);
    AuthenticAMD.Family:=EFamily;
    AuthenticAMD.Model:=EModel;
    AuthenticAMD.Stepping:=EStepping;
    AuthenticAMD.L1DCache:=GetExtendedL1DCache;
    AuthenticAMD.L1ICache:=GetExtendedL1ICache;
    AuthenticAMD.L2Cache:=GetExtendedL2Cache;
  end;
end;

function TCpuData.GenuineIntel: TCpuRec;
var
  Family, Model, Stepping: byte;
begin
  GetFMS(Family,Model,Stepping);
  if Family=4 then
  begin
    GenuineIntel.name:='Intel 486';
    GenuineIntel.Vendor:=GetVendorString;
    GenuineIntel.Frequency:=0;
    GenuineIntel.Family:=Family;
    GenuineIntel.Model:=Model;
    GenuineIntel.Stepping:=Stepping;
    GenuineIntel.L1DCache:=8;
    GenuineIntel.L1ICache:=8;
    GenuineIntel.L2Cache:=0;
  end
  else
  if Family=5 then
  begin
    GenuineIntel.name:=IntelP5N;
    GenuineIntel.Vendor:=GetVendorString;
    GenuineIntel.Frequency:=GetCPUFrequency;
    GenuineIntel.Family:=Family;
    GenuineIntel.Model:=Model;
    GenuineIntel.Stepping:=Stepping;
    GenuineIntel.L1DCache:=P5CacheL1DI;
    GenuineIntel.L1ICache:=P5CacheL1DI;
    GenuineIntel.L2Cache:=0;
  end
  else
  if Family=6 then
  begin
    GenuineIntel.name:=IntelP6N;
    GenuineIntel.Vendor:=GetVendorString;
    GenuineIntel.Frequency:=GetCPUFrequency;
    GenuineIntel.Family:=Family;
    GenuineIntel.Model:=Model;
    GenuineIntel.Stepping:=Stepping;
    GenuineIntel.L1DCache:=P6CacheL1DI;
    GenuineIntel.L1ICache:=P6CacheL1DI;
    GenuineIntel.L2Cache:=P6CacheL2;
  end
  else
  if Family=$F then
  begin
    if CheckPentium4 then
    begin
      GenuineIntel.name:='Intel Pentium(r) 4';
      GenuineIntel.Vendor:=GetVendorString;
      GenuineIntel.Frequency:=GetCPUFrequency;
      GenuineIntel.Family:=32;
      GenuineIntel.Model:=Model;
      GenuineIntel.Stepping:=Stepping;
      GenuineIntel.L1DCache:=8;
      GenuineIntel.L1ICache:=12;
      GenuineIntel.L2Cache:=256;
    end
    else
    if CheckIthanium then
    begin
      GenuineIntel.name:='Intel Ithanium';
      GenuineIntel.Vendor:=GetVendorString;
      GenuineIntel.Frequency:=GetCPUFrequency;
      GenuineIntel.Family:=64;
      GenuineIntel.Model:=Model;
      GenuineIntel.Stepping:=Stepping;
      GenuineIntel.L1DCache:=0;
      GenuineIntel.L1ICache:=0;
      GenuineIntel.L2Cache:=0;
    end;
  end;
end;

function TCpuData.CyrixInstead: TCpuRec;
var
  Family, Model, Stepping: byte;
  EFamily, EModel, EStepping: byte;
begin
  GetFMS(Family,Model,Stepping);
  if Family=4 then
  begin
    CyrixInstead.name:='VIA Cyrix 4x86';
    CyrixInstead.Vendor:=GetVendorString;
    CyrixInstead.Frequency:=0;
    CyrixInstead.Family:=Family;
    CyrixInstead.Model:=Model;
    CyrixInstead.Stepping:=Stepping;
    CyrixInstead.L1DCache:=8;
    CyrixInstead.L1ICache:=8;
    CyrixInstead.L2Cache:=0;
  end
  else
  if Family=5 then
  begin
    CyrixInstead.name:='VIA Cyrix 5x86';
    CyrixInstead.Vendor:=GetVendorString;
    CyrixInstead.Frequency:=GetCPUFrequency;
    CyrixInstead.Family:=Family;
    CyrixInstead.Model:=Model;
    CyrixInstead.Stepping:=Stepping;
    CyrixInstead.L1DCache:=8;
    CyrixInstead.L1ICache:=8;
    CyrixInstead.L2Cache:=0;
  end
  else
  begin
    if GetMaxExtendedFunctions>0 then
    begin
      CyrixInstead.name:=GetExtendedCpuName;
      CyrixInstead.Vendor:=GetVendorString;
      CyrixInstead.Frequency:=GetCPUFrequency;
      GetExtendedFMS(EFamily,EModel,EStepping);
      CyrixInstead.Family:=EFamily;
      CyrixInstead.Model:=EModel;
      CyrixInstead.Stepping:=EStepping;
      CyrixInstead.L1DCache:=GetExtendedL1DCache;
      CyrixInstead.L1ICache:=GetExtendedL1ICache;
      CyrixInstead.L2Cache:=GetExtendedL2Cache;
    end
    else
    begin
      CyrixInstead.name:=Cyrix686N;
      CyrixInstead.Vendor:=GetVendorString;
      CyrixInstead.Frequency:=GetCPUFrequency;
      CyrixInstead.Family:=Family;
      CyrixInstead.Model:=Model;
      CyrixInstead.Stepping:=Stepping;
      CyrixInstead.L1DCache:=32;
      CyrixInstead.L1ICache:=32;
      CyrixInstead.L2Cache:=0;
    end;
  end;
end;

function TCpuData.GenericCPU: TCpuRec;
var
  Family, Model, Stepping: byte;
  EFamily, EModel, EStepping: byte;
begin
  if not GetCPUIDSupport then
  begin
    MessageDlg('This CPU does not support the CPUID instruction!!!',mtWarning,
    [mbOk],0);
    GenericCPU.name:='Unidentified CPU';
    GenericCPU.Vendor:='Unidentified';
    GenericCPU.Frequency:=0;
    GenericCPU.Family:=-1;
    GenericCPU.Model:=-1;
    GenericCPU.Stepping:=-1;
    GenericCPU.L1DCache:=0;
    GenericCPU.L1ICache:=0;
    GenericCPU.L2Cache:=0;
  end
  else
  begin
    GetFMS(Family,Model,Stepping);
    if GetMaxExtendedFunctions>0 then
    begin
      GenericCPU.name:=GetExtendedCPUName;
      GenericCPU.Vendor:=GetVendorString;
      GenericCPU.Frequency:=GetCPUFrequency;
      CpuData.GetExtendedFMS(EFamily,EModel,EStepping);
      GenericCPU.Family:=EFamily;
      GenericCPU.Model:=EFamily;
      GenericCPU.Stepping:=EStepping;
      GenericCPU.L1DCache:=GetExtendedL1DCache;
      GenericCPU.L1ICache:=GetExtendedL1ICache;
      GenericCPU.L2Cache:=GetExtendedL2Cache;
    end
    else
    begin
      GenericCPU.name:=GenericCpuN;
      GenericCPU.Vendor:=GetVendorString;
      if Family<=4 then
        GenericCPU.Frequency:=0
      else
        GenericCPU.Frequency:=GetCPUFrequency;
      GenericCPU.Family:=Family;
      GenericCPU.Model:=Model;
      GenericCPU.Stepping:=Stepping;
      GenericCPU.L1DCache:=0;
      GenericCPU.L1ICache:=0;
      GenericCPU.L2Cache:=0;
    end;
  end;
end;

end.

Готовый проект можно взять здесь

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay