Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
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.