скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Как определить тип процессора




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


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.

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






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook