Mega Code Archive

 
Categories / Delphi / Hardware
 

Is my CPU branded

Title: Is my CPU branded? Question: Recent Intel and AMD processors have an extend CPUID function call, that returns the name of the processor. In earlier cpu models you had to use the version and feature information function of CPUID to look up names in a string list of your own. The function GetBrandString shows how to access the brand tring, provided the CPUID instuction is available. Answer: function GetBrandString:string; {Newer AMD (K5 Model 1/2/3,K6 Model 6/7, K6 -2 Model 8, K6-III Model 9, all Athlon and Duron) and Intel (Pentium IV) support a Processor Name String that is a 0 byte terminated string that can be a up to 47 characters long (terminating 0 byte excluded) terminating. } function CPUIDAvail:boolean;assembler; {Thests wheter the CPUID instruction is available} asm pushfd // get flags into ax pop eax // save a copy on the stack mov edx,eax xor eax, 0200000h // flip bit 21 push eax // load new value into flags popfd // get them back pushfd pop eax xor eax,edx and eax, 0200000h // clear all but bit 21 shr eax, 21 end; const CPUID=$a20f; var s:array[0..48] of char; begin fillchar(s,sizeof(s),0); if CPUIDAvail then begin asm //save regs push ebx push ecx push edx //check if necessary extended CPUID calls are supported, if not return null string mov eax,080000000h dw CPUID cmp eax,080000004h jb @@endbrandstr //get first name part mov eax,080000002h dw CPUID mov longword(s[0]),eax mov longword(s[4]),ebx mov longword(s[8]),ecx mov longword(s[12]),edx //get second name part mov eax,080000003h dw CPUID mov longword(s[16]),eax mov longword(s[20]),ebx mov longword(s[24]),ecx mov longword(s[28]),edx //get third name part mov eax,080000004h dw CPUID mov longword(s[32]),eax mov longword(s[36]),ebx mov longword(s[40]),ecx mov longword(s[44]),edx @@endbrandstr: //restore regs pop edx pop ecx pop ebx end; end; result:=StrPas(s); end;