分享
 
 
 

get CPU id (很全的)

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

//This unit can be used to detect the cpu model.

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;

function IntelP5N:string;

function IntelP6N:string;

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;

const

timePeriod= 1000;

var

HighFreq,TestFreq,Count1,Count2:int64;

TimeStart:integer;

TimeStop:integer;

ElapsedTime:dword;

StartTicks:dword;

EndTicks:dword;

TotalTicks:dword;

begin

StartTicks:=0;

EndTicks:=0;

if QueryPerformanceFrequency(HighFreq) then begin

TestFreq:=HighFreq div 100;

QueryPerformanceCounter(Count1);

repeat

QueryPerformanceCounter(Count2);

until Count1<>Count2;

asm

push ebx

xor eax,eax

xor ebx,ebx

xor ecx,ecx

xor edx,edx

db $0F,$A2 /// cpuid

db $0F,$31 /// rdtsc

mov StartTicks,eax

pop ebx

end;

repeat

QueryPerformanceCounter(Count1);

until Count1-Count2>=TestFreq;

asm

push ebx

xor eax,eax

xor ebx,ebx

xor ecx,ecx

xor edx,edx

db $0F,$A2 /// cpuid

db $0F,$31 /// rdtsc

mov EndTicks,eax

pop ebx

end;

ElapsedTime:=MulDiv(Count1-Count2,1000000,HighFreq);

end

else begin

timeBeginPeriod(1);

TimeStart:=timeGetTime;

repeat

TimeStop:=timeGetTime;

until TimeStop <> TimeStart;

asm

push ebx

xor eax,eax

xor ebx,ebx

xor ecx,ecx

xor edx,edx

db $0F,$A2 /// cpuid

db $0F,$31 /// rdtsc

mov StartTicks,eax

pop ebx

end;

repeat

TimeStart:=timeGetTime;

until TimeStart-TimeStop>=timePeriod;

asm

push ebx

xor eax,eax

xor ebx,ebx

xor ecx,ecx

xor edx,edx

db $0F,$A2 /// cpuid

db $0F,$31 /// rdtsc

mov EndTicks,eax

pop ebx

end;

timeEndPeriod(1);

ElapsedTime:=(TimeStart-TimeStop)*1000;

end;

TotalTicks:=EndTicks-StartTicks;

result:=TotalTicks div ElapsedTime;

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

if CheckMMX and CheckSSE then CheckPentiumIII:=True

else CheckPentiumIII:=False;

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.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有