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;