{"id":467,"date":"2008-05-06T05:13:02","date_gmt":"2008-05-06T05:13:02","guid":{"rendered":"http:\/\/6teen.ru\/?p=349"},"modified":"2008-05-06T05:13:02","modified_gmt":"2008-05-06T05:13:02","slug":"6568","status":"publish","type":"post","link":"http:\/\/pblog.ru\/lab\/?p=467","title":{"rendered":"\u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430"},"content":{"rendered":"<p>\u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<br \/>\n<!--more--><\/p>\n<pre class=\"alt2\" style=\"margin:0px; padding:6px; border:1px inset; width:580px; height:320px; overflow:auto\"><div>\u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\n\n\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u044e\u043d\u0438\u0442\u043e\u043c:\n\nunit CpuId;\ninterface\nuses Windows, Mmsystem, Sysutils, Math, Dialogs;\ntype\n    TCpuRec=record\n       Name:string[128];\n       Vendor:string[12];\n       Frequency:word;\n       Family:integer;\n       Model:integer;\n       Stepping:integer;\n       L1DCache:word;\n       L1ICache:word;\n       L2Cache:word;\n     end;\n    TCpuType = (cpu8086, cpu286, cpu386, cpu486, cpuPentium);\n    TCpuData=object\n      function GetCPUIDSupport:Boolean;\n      function GetVendorString:string;\n      function GetCPUFrequency:word;\n      procedure GetFMS(var Family,Model,Stepping:byte);\n      function GetMaxCpuId:dword;\n      function CheckFPU:Boolean;\n      function CheckTSC:Boolean;\n      function CheckMSR:Boolean;\n      function CheckMPS:Boolean;\n      function GetNoCpus:cardinal;\n      function CheckPN:Boolean;\n      function CheckCMPXCHG8B:Boolean;\n      function CheckCMOVe:Boolean;\n      function CheckSelfSnoop:Boolean;\n      function CheckDebugTraceStore:Boolean;\n      function CheckFXSAVEFXRSTOR:Boolean;\n      function CheckMMX:Boolean;\n      function CheckMMXplus:Boolean;\n      function CheckSSE:Boolean;\n      function CheckSSE2:Boolean;\n      function CheckAMD3DNow:Boolean;\n      function CheckAMD3DNowPlus:Boolean;\n      function GetMaxExtendedFunctions:dword;\n      procedure GetExtendedFMS(var Family,Model,Stepping:byte);\n      function GetExtendedCpuName:string;\n      function GetExtendedL1DCache:word;\n      function GetExtendedL1ICache:word;\n      function GetExtendedL2Cache:word;\n\n      function CheckCeleron:Boolean;\n      function CheckPentiumIII:Boolean;\n      function CheckXeon:Boolean;\n      function CheckPentium4:Boolean;\n      function CheckIthanium:Boolean;\n\n\/\/****Aici am conrectat****\n      function IntelP5N:string;\n      function IntelP6N:string;\n\/\/****Pana aici****\n      function AMDK5N:string;\n      function Cyrix686N:string;\n      function GenericCpuN:string;\n      function P5CacheL1DI:word;\n      function P6CacheL1DI:word;\n      function P6CacheL2:word;\n\n      function AuthenticAMD:TCpuRec;\n\n      function GenuineIntel:TCpuRec;\n      function CyrixInstead:TCpuRec;\n      function GenericCPU:TCpuRec;\n     end;\nconst\nIntel486:array[0..8] of string=\n(''Intel 486 DX'',\n  ''Intel 486 DX'',\n  ''Intel 486 SX'',\n  ''Intel 486 DX2'',\n  ''Intel 486 SL'',\n  ''Intel 486 SX2'',\n  ''Intel 486 DX2'',\n  ''Intel 486 DX4'',\n  ''Intel 486 DX4'');\nUMC486:array[0..1] of string=\n(''UMC U5D'',\n  ''UMC U5S'');\nAMD486:array[0..5] of string=\n(''AMD 486 DX2'',\n  ''AMD 486 DX2'',\n  ''AMD 486 DX4'',\n  ''AMD 486 DX4'',\n  ''AMD 5x86'',\n  ''AMD 5x86'');\nIntelP5:array[0..6] of string=\n(''Intel Pentium P5 A-Step'',\n  ''Intel Pentium P5'',\n  ''Intel Pentium P54C'',\n  ''Intel Pentium P24T Overdrive'',\n  ''Intel Pentium MMX P55C'',\n  ''Intel Pentium P54C'',\n  ''Intel Pentium MMX P55C'');\n  NexGenNx586=''NexGen Nx586'';\n  Cyrix4x86=''VIA Cyrix 4x86'';\n  Cyrix5x86=''VIA Cyrix 5x86'';\n  CyrixMediaGX=''VIA Cyrix Media GX'';\n  CyrixM1=''VIA Cyrix 6x86'';\n  CyrixM2=''VIA Cyrix 6x86MX'';\n  CyrixIII=''VIA Cyrix III'';\n  AMDK5:array[0..3] of string=\n  (''AMD SSA5 (PR75\/PR90\/PR100)'',\n   ''AMD 5k86 (PR120\/PR133)'',\n   ''AMD 5k86 (PR166)'',\n   ''AMD 5k86 (PR200)'');\n  AMDK6:array[0..4] of string=\n  (''AMD K6 (166~233)'',\n   ''AMD K6 (266~300)'',\n   ''AMD K6-2'',\n   ''AMD K6-III'',\n   ''AMD K6-2+ or K6-III+'');\n   Centaur:array[0..2] of string=\n   (''Centaur C6'',\n    ''Centaur C2'',\n    ''Centaur C3'');\n   Rise:array[0..1] of string=\n   (''Rise mP6'',\n    ''Rise mP6'');\n   IntelP6:array[0..7] of string=\n   (''Intel Pentium Pro A-Step'',\n    ''Intel Pentium Pro'',\n    ''Intel Pentium II'',\n    ''Intel Pentium II'',\n    ''Intel Pentium II'',\n    ''Intel Pentium III'',\n    ''Intel Pentium III'',\n    ''Intel Pentium III'');\n   AMDK7:array[0..3] of string=\n    (''AMD Athlon(tm) Processor'',\n     ''AMD Athlon(tm) Processor'',\n     ''AMD Duron(tm) Processor'',\n     ''AMD Thunderbird Processor'');\n   IntelP4=''Intel Pentium 4'';\nvar CpuData:TCpuData;\nimplementation\nfunction TCpuData.GetCPUIDSupport:Boolean;\nvar TempDetect:dword;\nbegin\nasm\n  pushf\n  pushfd\n  push eax\n  push ebx\n  push ecx\n  push edx\n\n  pushfd\n  pop eax\n  mov ebx,eax\n  xor eax,$00200000\n  push eax\n  popfd\n  pushfd\n  pop eax\n  push ebx\n  popfd\n  xor eax,ebx\n  mov TempDetect,eax\n\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  popfd\n  popf\nend;\nGetCPUIDSupport:=(TempDetect=$00200000);\nend;\nfunction TCpuData.GetVendorString:string;\nvar s1,s2,s3:array[0..3] of char;\n    TempVendor:string;\n    i:integer;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,0\n  db $0F,$A2                \/\/\/ cpuid\n  mov s1,ebx\n  mov s2,edx\n  mov s3,ecx\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nTempVendor:='''';\nfor i:=0 to 3 do\n  TempVendor:=TempVendor+s1[i];\nfor i:=0 to 3 do\n  TempVendor:=TempVendor+s2[i];\nfor i:=0 to 3 do\n  TempVendor:=TempVendor+s3[i];\nGetVendorString:=TempVendor;\nend;\nfunction TCpuData.GetCPUFrequency:word;\nvar TimeStart:integer;\n    TimeStop:integer;\n    StartTicks:dword;\n    EndTicks:dword;\n    TotalTicks:dword;\n    cpuSpeed:dword;\n    NeverExit:Boolean;\nbegin\nTimeStart:=0;\nTimeStop:=0;\nStartTicks:=0;\nEndTicks:=0;\nTotalTicks:=0;\ncpuSpeed:=0;\nNeverExit:=True;\nTimeStart:=timeGetTime;\nwhile NeverExit do\n  begin\n  TimeStop:=timeGetTime;\n  if ((TimeStop-TimeStart)>1) then\n      begin\n       asm\n        xor eax,eax\n        xor ebx,ebx\n        xor ecx,ecx\n        xor edx,edx\n        db $0F,$A2                \/\/\/ cpuid\n        db $0F,$31                \/\/\/ rdtsc\n        mov StartTicks,eax\n       end;\n      Break;\n      end;\n  end;\n  TimeStart:=TimeStop;\n  while NeverExit do\n   begin\n   TimeStop:=timeGetTime;\n   if ((TimeStop-TimeStart)>1000) then\n       begin\n        asm\n         xor eax,eax\n         xor ebx,ebx\n         xor ecx,ecx\n         xor edx,edx\n         db $0F,$A2                \/\/\/ cpuid\n         db $0F,$31                \/\/\/ rdtsc\n         mov EndTicks,eax\n        end;\n        Break;\n       end;\n    end;\n   TotalTicks:=EndTicks-StartTicks;\n   cpuSpeed:=TotalTicks div 1000000;\n   GetCPUFrequency:=cpuSpeed;\nend;\nprocedure TCpuData.GetFMS(var Family,Model,Stepping:byte);\nvar TempFlags:dword;\n    BinFlags:array[0..31] of byte;\n    i,pos:integer;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  mov TempFlags,eax\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nfor i:=0 to 31 do\n  begin\n   BinFlags[i]:=TempFlags mod 2;\n   TempFlags:=TempFlags div 2;\n  end;\nfamily:=0;\nmodel:=0;\nstepping:=0;\n  pos:=0;\n  for i:=0 to 3 do\n   begin\n    stepping:=stepping+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));\n    inc(pos);\n   end;\n  pos:=4;\n  for i:=0 to 3 do\n   begin\n    model:=model+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));\n    inc(pos);\n   end;\n  pos:=8;\n  for i:=0 to 3 do\n   begin\n    family:=family+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));\n    inc(pos);\n   end;\nend;\nfunction TCpuData.GetMaxCpuId:dword;\nvar TempMax:dword;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,0\n  db $0F,$A2                \/\/\/ cpuid\n  mov TempMax,eax\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nGetMaxCpuId:=TempMax;\nend;\nfunction TCpuData.CheckFPU:Boolean;\nlabel NoFpu;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$1\n  jz NoFpu\n  mov edx,0\n  mov TempCheck,edx\nNoFpu:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckFpu:=(TempCheck=0);\nend;\nfunction TCpuData.CheckTSC:Boolean;\nlabel NoTSC;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$10\n  jz NoTSC\n  mov edx,0\n  mov TempCheck,edx\nNoTSC:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckTSC:=(TempCheck=0);\nend;\nfunction TCpuData.CheckMSR:Boolean;\nlabel NoMSR;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$20\n  jz NoMSR\n  mov edx,0\n  mov TempCheck,edx\nNoMSR:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckMSR:=(TempCheck=0);\nend;\nfunction TCpuData.CheckMPS:Boolean;\nvar SysInfo:TSystemInfo;\nbegin\nGetSysTemInfo(SysInfo);\nCheckMPS:=(SysInfo.dwNumberOfProcessors>1);\nend;\nfunction TCpuData.GetNoCpus:cardinal;\nvar SysInfo:TSystemInfo;\nbegin\nGetSystemInfo(SysInfo);\nGetNoCpus:=SysInfo.dwNumberOfProcessors;\nend;\nfunction TCpuData.CheckPN:Boolean;\nlabel NoPN;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$40000\n  jz NoPN\n  mov edx,0\n  mov TempCheck,edx\nNoPN:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckPN:=(TempCheck=0);\nend;\nfunction TCpuData.CheckCMPXCHG8B:Boolean;\nlabel NoCMPXCHG8B;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$100\n  jz NoCMPXCHG8B\n  mov edx,0\n  mov TempCheck,edx\nNoCMPXCHG8B:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckCMPXCHG8B:=(TempCheck=0);\nend;\nfunction TCpuData.CheckCMOVe:Boolean;\nlabel NoCMOVe;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$8000\n  jz NoCMOVe\n  mov edx,0\n  mov TempCheck,edx\nNoCMOVe:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckCMOVe:=(TempCheck=0);\nend;\nfunction TCpuData.CheckSelfSnoop:Boolean;\nlabel NoSelfSnoop;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$8000000\n  jz NoSelfSnoop\n  mov edx,0\n  mov TempCheck,edx\nNoSelfSnoop:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckSelfSnoop:=(TempCheck=0);\nend;\nfunction TCpuData.CheckDebugTraceStore:Boolean;\nlabel NoDebugTraceStore;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$200000\n  jz NoDebugTraceStore\n  mov edx,0\n  mov TempCheck,edx\nNoDebugTraceStore:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckDebugTraceStore:=(TempCheck=0);\nend;\nfunction TCpuData.CheckFXSAVEFXRSTOR:Boolean;\nlabel NoFXSAVEFXRSTOR;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$1000000\n  jz NoFXSAVEFXRSTOR\n  mov edx,0\n  mov TempCheck,edx\nNoFXSAVEFXRSTOR:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckFXSAVEFXRSTOR:=(TempCheck=0);\nend;\nfunction TCpuData.CheckMMX:Boolean;\nlabel NoMMX;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$800000\n  jz NoMMX\n  mov edx,0\n  mov TempCheck,edx\nNoMMX:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckMMX:=(TempCheck=0);\nend;\nfunction TCpuData.CheckMMXplus:Boolean;\nlabel NoMMXplus;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,$80000001\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$400000\n  jz NoMMXplus\n  mov edx,0\n  mov TempCheck,edx\nNoMMXplus:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckMMXplus:=(TempCheck=0);\nend;\nfunction TCpuData.CheckSSE:Boolean;\nlabel NoSSE;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$2000000\n  jz NoSSE\n  mov edx,0\n  mov TempCheck,edx\nNoSSE:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckSSE:=(TempCheck=0);\nend;\nfunction TCpuData.CheckSSE2:Boolean;\nlabel NoSSE2;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$4000000\n  jz NoSSE2\n  mov edx,0\n  mov TempCheck,edx\nNoSSE2:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckSSE2:=(TempCheck=0);\nend;\nfunction TCpuData.CheckAMD3DNow:Boolean;\nlabel NoAMD3DNow;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,$80000001\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$80000000\n  jz NoAMD3DNow\n  mov edx,0\n  mov TempCheck,edx\nNoAMD3DNow:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckAMD3DNow:=(TempCheck=0);\nend;\nfunction TCpuData.CheckAMD3DNowPlus:Boolean;\nlabel NoAMD3DNowPlus;\nvar TempCheck:dword;\nbegin\nTempCheck:=1;\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,$80000001\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  test edx,$40000000\n  jz NoAMD3DNowPlus\n  mov edx,0\n  mov TempCheck,edx\nNoAMD3DNowPlus:\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\n  end;\nCheckAMD3DNowPlus:=(TempCheck=0);\nend;\nfunction TCpuData.GetMaxExtendedFunctions:dword;\nvar TempExt:dword;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,$80000000\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  shl eax,1\n  shr eax,1\n  mov TempExt,eax\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nGetMaxExtendedFunctions:=TempExt;\nend;\n\nprocedure TCpuData.GetExtendedFMS(var family,model,stepping:byte);\nvar TempFlags:dword;\n    BinFlags:array[0..31] of byte;\n    i,pos:integer;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,$80000001\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  mov TempFlags,eax\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nfor i:=0 to 31 do\n  begin\n   BinFlags[i]:=TempFlags mod 2;\n   TempFlags:=TempFlags div 2;\n  end;\nfamily:=0;\nmodel:=0;\nstepping:=0;\n  pos:=0;\n  for i:=0 to 3 do\n   begin\n    stepping:=stepping+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));\n    inc(pos);\n   end;\n  pos:=4;\n  for i:=0 to 3 do\n   begin\n    model:=model+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));\n    inc(pos);\n   end;\n  pos:=8;\n  for i:=0 to 3 do\n   begin\n    family:=family+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i))));\n    inc(pos);\n   end;\nend;\n\nfunction TCpuData.GetExtendedCpuName:string;\nvar s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12:array[0..3] of char;\n    TempCpuName:string;\n    i:integer;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,$80000002\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  mov s1,eax\n  mov s2,ebx\n  mov s3,ecx\n  mov s4,edx\n  mov eax,$80000003\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  mov s5,eax\n  mov s6,ebx\n  mov s7,ecx\n  mov s8,edx\n  mov eax,$80000004\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  mov s9,eax\n  mov s10,ebx\n  mov s11,ecx\n  mov s12,edx\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\n  TempCpuName:='''';\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s1[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s2[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s3[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s4[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s5[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s6[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s7[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s8[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s9[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s10[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s11[i];\n  for i:=0 to 3 do\n   TempCpuName:=TempCpuName+s12[i];\n  GetExtendedCpuName:=TempCpuName;\nend;\nfunction TCpuData.GetExtendedL1DCache:word;\nvar L1D,TempL1D:dword;\n    BinArray:array[0..31] of byte;\n    i,p:integer;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,$80000005\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  mov L1D,ecx\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nfor i:=0 to 31 do\n  begin\n   BinArray[i]:=L1D mod 2;\n   L1D:=L1D div 2;\n  end;\nTempL1D:=0;\np:=0;\nfor i:=24 to 31 do\n  begin\n   TempL1D:=TempL1D+(BinArray[i]*StrToInt(FloatToStr(Power(2,p))));\n   inc(p);\n  end;\nGetExtendedL1DCache:=TempL1D;\nend;\nfunction TCpuData.GetExtendedL1ICache:word;\nvar L1I,TempL1I:dword;\n    BinArray:array[0..31] of byte;\n    i,p:integer;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,$80000005\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  mov L1I,edx\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nfor i:=0 to 31 do\n  begin\n   BinArray[i]:=L1I mod 2;\n   L1I:=L1I div 2;\n  end;\nTempL1I:=0;\np:=0;\nfor i:=24 to 31 do\n  begin\n   TempL1I:=TempL1I+(BinArray[i]*StrToInt(FloatToStr(Power(2,p))));\n   inc(p);\n  end;\nGetExtendedL1ICache:=TempL1I;\nend;\nfunction TCpuData.GetExtendedL2Cache:word;\nvar L2,TempL2:dword;\n    BinArray:array[0..31] of byte;\n    i,p:integer;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,$80000006\n  mov ebx,0\n  mov ecx,0\n  mov edx,0\n  db $0F,$A2                \/\/\/ cpuid\n  mov L2,ecx\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nfor i:=0 to 31 do\n  begin\n   BinArray[i]:=L2 mod 2;\n   L2:=L2 div 2;\n  end;\nTempL2:=0;\np:=0;\nfor i:=16 to 31 do\n  begin\n   TempL2:=TempL2+(BinArray[i]*StrToInt(FloatToStr(Power(2,p))));\n   inc(p);\n  end;\nGetExtendedL2Cache:=TempL2;\nend;\nfunction TCpuData.CheckCeleron:Boolean;\nvar BId:byte;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  mov BId,bl\n  pop edx\n  pop ecx\n  pop ebx\n\n  pop eax\nend;\nCheckCeleron:=(BId=$1);\nend;\nfunction TCpuData.CheckPentiumIII:Boolean;\nvar BId:byte;\nbegin\nCheckPentiumIII:=(CheckMMX and CheckSSE);\nend;\nfunction TCpuData.CheckXeon:Boolean;\nvar BId:byte;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  mov BId,bl\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nCheckXeon:=(BId=$3);\nend;\nfunction TCpuData.CheckPentium4:Boolean;\nvar BId:byte;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  mov BId,bl\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nCheckPentium4:=(BId=$8);\nend;\nfunction TCpuData.CheckIthanium:Boolean;\nvar res:dword;\n    BinArray:array[0..31] of byte;\n    i:byte;\nbegin\nasm\n  push eax\n  push ebx\n  push ecx\n  push edx\n  mov eax,1\n  db $0F,$A2                \/\/\/ cpuid\n  mov res,edx\n  pop edx\n  pop ecx\n  pop ebx\n  pop eax\nend;\nfor i:=0 to 31 do\n  begin\n   BinArray[i]:=res mod 2;\n   res:=res div 2;\n  end;\nCheckIthanium:=(CheckPentium4 and (BinArray[30]=1));\nend;\nfunction TCpuData.IntelP5N:string;\nbegin\nIf CheckMMX then IntelP5N:=''Intel Pentium(r) MMX(tm)''\nelse IntelP5N:=''Intel Pentium(r)'';\nend;\nfunction TCpuData.IntelP6N:string;\nbegin\nif CheckCeleron then IntelP6N:=''Intel Celeron(r)''\nelse\nif CheckPentiumIII then IntelP6N:=''Intel Pentium(r) III''\nelse\nif CheckXeon then IntelP6N:=''Intel Pentium(r) III Xeon(tm)''\nelse\nif not CheckMMX then IntelP6N:=''Intel Pentium(r) PRO''\nelse IntelP6N:=''Intel Pentium(r) II'';\nend;\nfunction TCpuData.AMDK5N:string;\nvar Family,Model,Stepping:byte;\nbegin\nGetFMS(Family,Model,Stepping);\nif Model=0 then AMDK5N:=''AMD K5''\nelse AMDK5N:=GetExtendedCpuName;\nend;\nfunction TCpuData.Cyrix686N:string;\nbegin\nif CpuData.GetMaxExtendedFunctions>0 then Cyrix686N:=GetExtendedCpuName\nelse\nif CheckMMX then Cyrix686N:=''VIA Cyrix 6x86MII''\nelse\nCyrix686N:=''VIA Cyrix 6x86'';\nend;\nfunction TCpuData.GenericCpuN:string;\nvar SysInfo:TSystemInfo;\nbegin\nGetSystemInfo(SysInfo);\nif SysInfo.dwProcessorType=386\n    then GenericCpuN:=''Generic 386 CPU''\nelse\nif SysInfo.dwProcessorType=486\n    then GenericCpuN:=''Generic 486 CPU''\nelse\nif SysInfo.dwProcessorType=586\n    then GenericCpuN:=''Pentium Class CPU''\nelse GenericCpuN:=''Unknown CPU'';\nend;\nfunction TCpuData.P5CacheL1DI:word;\nbegin\nif CheckMMX then P5CacheL1DI:=16\nelse P5CacheL1DI:=8;\nend;\nfunction TCpuData.P6CacheL1DI:word;\nbegin\nif not CheckMMX then P6CacheL1DI:=8\nelse P6CacheL1DI:=16;\nend;\nfunction TCpuData.P6CacheL2:word;\nvar Family,Model,Stepping:byte;\nbegin\nif CheckCeleron then P6CacheL2:=128\nelse\nif CheckPentiumIII then begin\n                          GetFMS(Family,Model,Stepping);\n                          if Model=7 then P6CacheL2:=512\n                          else if Model=8 then P6cacheL2:=256\n                          else P6CacheL2:=512;\n                         end\nelse if not CheckMMX then P6CacheL2:=512\nelse P6CacheL2:=512;\nend;\nfunction TCpuData.AuthenticAMD:TCpuRec;\nvar Family,Model,Stepping:byte;\n    EFamily,EModel,EStepping:byte;\nbegin\nGetFMS(Family,Model,Stepping);\nIf Family=4 then begin\n                   AuthenticAMD.Name:=''AMD 486'';\n                   AuthenticAMD.Vendor:=GetVendorString;\n                   AuthenticAMD.Frequency:=0;\n                   AuthenticAMD.Family:=Family;\n                   AuthenticAMD.Model:=Model;\n                   AuthenticAMD.Stepping:=Stepping;\n                   AuthenticAMD.L1DCache:=8;\n                   AuthenticAMD.L1ICache:=8;\n                   AuthenticAMD.L2Cache:=0;\n                  end\nelse\nif Family=5 then begin\n                   if GetMaxExtendedFunctions>4 then\n                      begin\n                       AuthenticAMD.Name:=GetExtendedCpuName;\n                       AuthenticAMD.Vendor:=GetVendorString;\n                       AuthenticAMD.Frequency:=GetCPUFrequency;\n                       GetExtendedFMS(EFamily,EModel,EStepping);\n                       AuthenticAMD.Family:=EFamily;\n                       AuthenticAMD.Model:=EModel;\n                       AuthenticAMD.Stepping:=EStepping;\n                       AuthenticAMD.L1DCache:=GetExtendedL1DCache;\n                       AuthenticAMD.L1ICache:=GetExtendedL1ICache;\n                       AuthenticAMD.L2Cache:=0;\n                      end\n                   else\n                   begin\n                    AuthenticAMD.Name:=AMDK5N;\n                    AuthenticAMD.Vendor:=GetVendorString;\n                    AuthenticAMD.Frequency:=GetCPUFrequency;\n                    AuthenticAMD.Family:=Family;\n                    AuthenticAMD.Model:=Model;\n                    AuthenticAMD.Stepping:=Stepping;\n                    AuthenticAMD.L1DCache:=16;\n                    AuthenticAMD.L1ICache:=16;\n                    AuthenticAMD.L2Cache:=0;\n                   end;\n                  end\nelse if family>5 then\n                 begin\n                  AuthenticAMD.Name:=GetExtendedCpuName;\n                  AuthenticAMD.Name:=GetExtendedCpuName;\n                  AuthenticAMD.Vendor:=GetVendorString;\n                  AuthenticAMD.Frequency:=GetCPUFrequency;\n                  GetExtendedFMS(EFamily,EModel,EStepping);\n                  AuthenticAMD.Family:=EFamily;\n                  AuthenticAMD.Model:=EModel;\n                  AuthenticAMD.Stepping:=EStepping;\n                  AuthenticAMD.L1DCache:=GetExtendedL1DCache;\n                  AuthenticAMD.L1ICache:=GetExtendedL1ICache;\n                  AuthenticAMD.L2Cache:=GetExtendedL2Cache;\n                 end;\n\n\nend;\nfunction TCpuData.GenuineIntel:TCpuRec;\nvar Family,Model,Stepping:byte;\nbegin\nGetFMS(Family,Model,Stepping);\nif Family=4 then begin\n                   GenuineIntel.Name:=''Intel 486'';\n                   GenuineIntel.Vendor:=GetVendorString;\n                   GenuineIntel.Frequency:=0;\n                   GenuineIntel.Family:=Family;\n                   GenuineIntel.Model:=Model;\n                   GenuineIntel.Stepping:=Stepping;\n                   GenuineIntel.L1DCache:=8;\n                   GenuineIntel.L1ICache:=8;\n                   GenuineIntel.L2Cache:=0;\n                  end\nelse\nif Family=5 then begin\n                   GenuineIntel.Name:=IntelP5N;\n                   GenuineIntel.Vendor:=GetVendorString;\n                   GenuineIntel.Frequency:=GetCPUFrequency;\n                   GenuineIntel.Family:=Family;\n                   GenuineIntel.Model:=Model;\n                   GenuineIntel.Stepping:=Stepping;\n                   GenuineIntel.L1DCache:=P5CacheL1DI;\n                   GenuineIntel.L1ICache:=P5CacheL1DI;\n                   GenuineIntel.L2Cache:=0;\n                  end\nelse\nif Family=6 then begin\n                   GenuineIntel.Name:=IntelP6N;\n                   GenuineIntel.Vendor:=GetVendorString;\n                   GenuineIntel.Frequency:=GetCPUFrequency;\n                   GenuineIntel.Family:=Family;\n                   GenuineIntel.Model:=Model;\n                   GenuineIntel.Stepping:=Stepping;\n                   GenuineIntel.L1DCache:=P6CacheL1DI;\n                   GenuineIntel.L1ICache:=P6CacheL1DI;\n                   GenuineIntel.L2Cache:=P6CacheL2;\n                  end\nelse\nif Family=$F then begin\n                    if CheckPentium4 then\n                     begin\n                      GenuineIntel.Name:=''Intel Pentium(r) 4'';\n                      GenuineIntel.Vendor:=GetVendorString;\n                      GenuineIntel.Frequency:=GetCPUFrequency;\n                      GenuineIntel.Family:=32;\n                      GenuineIntel.Model:=Model;\n                      GenuineIntel.Stepping:=Stepping;\n                      GenuineIntel.L1DCache:=8;\n                      GenuineIntel.L1ICache:=12;\n                      GenuineIntel.L2Cache:=256;\n                     end\n                    else if CheckIthanium then\n                      begin\n                       GenuineIntel.Name:=''Intel Ithanium'';\n                       GenuineIntel.Vendor:=GetVendorString;\n                       GenuineIntel.Frequency:=GetCPUFrequency;\n                       GenuineIntel.Family:=64;\n                       GenuineIntel.Model:=Model;\n                       GenuineIntel.Stepping:=Stepping;\n                       GenuineIntel.L1DCache:=0;\n                       GenuineIntel.L1ICache:=0;\n                       GenuineIntel.L2Cache:=0;\n                      end;\n                     end;\nend;\nfunction TCpuData.CyrixInstead:TCpuRec;\nvar Family,Model,Stepping:byte;\n    EFamily,EModel,EStepping:byte;\nbegin\nGetFMS(Family,Model,Stepping);\nif Family=4 then begin\n                   CyrixInstead.Name:=''VIA Cyrix 4x86'';\n                   CyrixInstead.Vendor:=GetVendorString;\n                   CyrixInstead.Frequency:=0;\n                   CyrixInstead.Family:=Family;\n                   CyrixInstead.Model:=Model;\n                   CyrixInstead.Stepping:=Stepping;\n                   CyrixInstead.L1DCache:=8;\n                   CyrixInstead.L1ICache:=8;\n                   CyrixInstead.L2Cache:=0;\n                  end\nelse\nif Family=5 then begin\n                   CyrixInstead.Name:=''VIA Cyrix 5x86'';\n                   CyrixInstead.Vendor:=GetVendorString;\n                   CyrixInstead.Frequency:=GetCPUFrequency;\n                   CyrixInstead.Family:=Family;\n                   CyrixInstead.Model:=Model;\n                   CyrixInstead.Stepping:=Stepping;\n                   CyrixInstead.L1DCache:=8;\n                   CyrixInstead.L1ICache:=8;\n                   CyrixInstead.L2Cache:=0;\n                  end\nelse begin\n       if GetMaxExtendedFunctions>0 then\n           Begin\n            CyrixInstead.Name:=GetExtendedCpuName;\n            CyrixInstead.Vendor:=GetVendorString;\n            CyrixInstead.Frequency:=GetCPUFrequency;\n            GetExtendedFMS(EFamily,EModel,EStepping);\n            CyrixInstead.Family:=EFamily;\n            CyrixInstead.Model:=EModel;\n            CyrixInstead.Stepping:=EStepping;\n            CyrixInstead.L1DCache:=GetExtendedL1DCache;\n            CyrixInstead.L1ICache:=GetExtendedL1ICache;\n            CyrixInstead.L2Cache:=GetExtendedL2Cache;\n           end\n       else begin\n             CyrixInstead.Name:=Cyrix686N;\n             CyrixInstead.Vendor:=GetVendorString;\n             CyrixInstead.Frequency:=GetCPUFrequency;\n             CyrixInstead.Family:=Family;\n             CyrixInstead.Model:=Model;\n             CyrixInstead.Stepping:=Stepping;\n             CyrixInstead.L1DCache:=32;\n             CyrixInstead.L1ICache:=32;\n             CyrixInstead.L2Cache:=0;\n            end;\n     end;\nend;\n\nfunction TCpuData.GenericCPU:TCpuRec;\nvar Family,Model,Stepping:byte;\n    EFamily,EModel,EStepping:byte;\nbegin\nif not GetCPUIDSupport then\n    begin\n     MessageDlg(''This CPU does not support the CPUID instruction!!!'',mtWarning,\n     [mbOk],0);\n     GenericCPU.Name:=''Unidentified CPU'';\n     GenericCPU.Vendor:=''Unidentified'';\n     GenericCPU.Frequency:=0;\n     GenericCPU.Family:=-1;\n     GenericCPU.Model:=-1;\n     GenericCPU.Stepping:=-1;\n     GenericCPU.L1DCache:=0;\n     GenericCPU.L1ICache:=0;\n     GenericCPU.L2Cache:=0;\n    end\nelse\nbegin\n  GetFMS(Family,Model,Stepping);\nif GetMaxExtendedFunctions>0 then\n     begin\n      GenericCPU.Name:=GetExtendedCPUName;\n      GenericCPU.Vendor:=GetVendorString;\n      GenericCPU.Frequency:=GetCPUFrequency;\n      CpuData.GetExtendedFMS(EFamily,EModel,EStepping);\n      GenericCPU.Family:=EFamily;\n      GenericCPU.Model:=EFamily;\n      GenericCPU.Stepping:=EStepping;\n      GenericCPU.L1DCache:=GetExtendedL1DCache;\n      GenericCPU.L1ICache:=GetExtendedL1ICache;\n      GenericCPU.L2Cache:=GetExtendedL2Cache;\n     end\nelse begin\n       GenericCPU.Name:=GenericCpuN;\n       GenericCPU.Vendor:=GetVendorString;\n       if Family<=4 then GenericCPU.Frequency:=0\n       else GenericCPU.Frequency:=GetCPUFrequency;\n       GenericCPU.Family:=Family;\n       GenericCPU.Model:=Model;\n       GenericCPU.Stepping:=Stepping;\n       GenericCPU.L1DCache:=0;\n       GenericCPU.L1ICache:=0;\n       GenericCPU.L2Cache:=0;\n      end;\nend;\nend;\nend.\n<\/div><\/pre>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[433,1083],"tags":[1509,1646,1790],"_links":{"self":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts\/467"}],"collection":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=467"}],"version-history":[{"count":0,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts\/467\/revisions"}],"wp:attachment":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}