Как определить тип процессора
Для этого можно воспользоваться следующим
юнитом:
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.
|