?? getcpuid.pas
字號:
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -