| type
|
| TCpuInfo = Record
|
| VendorIDString: String;
|
| Manufacturer: String;
|
| CPU_Name: String;
|
| PType: Byte;
|
| Family: Byte;
|
| Model: Byte;
|
| Stepping: Byte;
|
| Features: Cardinal;
|
| end;
|
|
| TPCInfo = class (TComponent)
|
| public
|
| function GetCPUModel(): String;
|
| end;
|
|
| implementation
|
|
| function TPCInfo.GetCPUModel(): String;
|
| type
|
| regconvert = record
|
| bits0_7: Byte;
|
| bits8_15: Byte;
|
| bits16_23: Byte;
|
| bits24_31: Byte;
|
| end;
|
| var
|
| CPUInfo: TCpuInfo;
|
| TEBX, TEDX, TECX: Cardinal;
|
| TString, VString: String;
|
| begin
|
| asm
|
| MOV [CPUInfo.PType], 0
|
| MOV [CPUInfo.Model], 0
|
| MOV [CPUInfo.Stepping], 0
|
| MOV [CPUInfo.Features], 0
|
|
| push eax
|
| push ebp
|
| push ebx
|
| push ecx
|
| push edi
|
| push edx
|
| push esi
|
|
| @@Check_80486:
|
| MOV [CPUInfo.Family], 4
|
| MOV TEBX, 0
|
| MOV TEDX, 0
|
| MOV TECX, 0
|
| PUSHFD
|
| POP EAX
|
| MOV ECX, EAX
|
| XOR EAX, 200000H
|
| PUSH EAX
|
| POPFD
|
| PUSHFD
|
| POP EAX
|
| XOR EAX, ECX
|
| JE @@DONE_CPU_TYPE
|
|
| @@Has_CPUID_Instruction:
|
| MOV EAX, 0
|
| DB 0FH
|
| DB 0A2H
|
| MOV TEBX, EBX
|
| MOV TEDX, EDX
|
| MOV TECX, ECX
|
| MOV EAX, 1
|
| DB 0FH
|
| DB 0A2H
|
| MOV [CPUInfo.Features], EDX
|
| MOV ECX, EAX
|
| AND EAX, 3000H
|
| SHR EAX, 12
|
| MOV [CPUInfo.PType], AL
|
| MOV EAX, ECX
|
| AND EAX, 0F00H
|
| SHR EAX, 8
|
| MOV [CPUInfo.Family], AL
|
| MOV EAX, ECX
|
| AND EAX, 00F0H
|
| SHR EAX, 4
|
| MOV [CPUInfo.MODEL], AL
|
| MOV EAX, ECX
|
| AND EAX, 000FH
|
| MOV [CPUInfo.Stepping], AL
|
|
| @@DONE_CPU_TYPE:
|
| pop esi
|
| pop edx
|
| pop edi
|
| pop ecx
|
| pop ebx
|
| pop ebp
|
| pop eax
|
| end;
|
| If (TEBX = 0) and (TEDX = 0) and (TECX = 0) and (CPUInfo.Family = 4) then
|
| begin
|
| CPUInfo.VendorIDString := 'Unbekannt';
|
| CPUInfo.Manufacturer := 'Unbekannt';
|
| CPUInfo.CPU_Name := 'Generic 486';
|
| end
|
| else
|
| begin
|
| With regconvert(TEBX) do
|
| begin
|
| TString := CHR(bits0_7) + CHR(bits8_15) + CHR(bits16_23) + CHR(bits24_31);
|
| end;
|
| With regconvert(TEDX) do
|
| begin
|
| TString := TString + CHR(bits0_7) + CHR(bits8_15) + CHR(bits16_23) + CHR(bits24_31);
|
| end;
|
| With regconvert(TECX) do
|
| begin
|
| TString := TString + CHR(bits0_7) + CHR(bits8_15) + CHR(bits16_23) + CHR(bits24_31);
|
| end;
|
| VString := TString;
|
| CPUInfo.VendorIDString := TString;
|
| If (CPUInfo.VendorIDString = 'GenuineIntel') then
|
| begin
|
| CPUInfo.Manufacturer := 'Intel';
|
| Case CPUInfo.Family of
|
| 4: Case CPUInfo.Model of
|
| 1: CPUInfo.CPU_Name := 'Intel 486DX Prozessor';
|
| 2: CPUInfo.CPU_Name := 'Intel 486SX Prozessor';
|
| 3: CPUInfo.CPU_Name := 'Intel DX2 Prozessor';
|
| 4: CPUInfo.CPU_Name := 'Intel 486 Prozessor';
|
| 5: CPUInfo.CPU_Name := 'Intel SX2 Prozessor';
|
| 7: CPUInfo.CPU_Name := 'Intel DX2 Prozessor';
|
| 8: CPUInfo.CPU_Name := 'Intel DX4 Prozessor';
|
| else CPUInfo.CPU_Name := 'Intel 486 Prozessor';
|
| end;
|
| 5: CPUInfo.CPU_Name := 'Pentium';
|
| 6: Case CPUInfo.Model of
|
| 1: CPUInfo.CPU_Name := 'Pentium Pro ';
|
| 3: CPUInfo.CPU_Name := 'Pentium II (Model 3)';
|
| 5: CPUInfo.CPU_Name := 'Pentium II (Model 5)';
|
| 6: CPUInfo.CPU_Name := 'Intel Celeron (Model 6)';
|
| 7: CPUInfo.CPU_Name := 'Pentium II (Model 7)';
|
| 8: CPUInfo.CPU_Name := 'Pentium III (Model 8)';
|
| else CPUInfo.CPU_Name := Format('P6 (Model %d)', [CPUInfo.Model]);
|
| end;
|
| else CPUInfo.CPU_Name := Format('P%d', [CPUInfo.Family]);
|
| end;
|
| end
|
| else if (CPUInfo.VendorIDString = 'CyrixInstead') then
|
| begin
|
| CPUInfo.Manufacturer := 'Cyrix';
|
| Case CPUInfo.Family of
|
| 5: CPUInfo.CPU_Name := 'Cyrix 6x86';
|
| 6: CPUInfo.CPU_Name := 'Cyrix M2';
|
| else CPUInfo.CPU_Name := Format('%dx86', [CPUInfo.Family]);
|
| end;
|
| end
|
| else if (CPUInfo.VendorIDString = 'AuthenticAMD') then
|
| begin
|
| CPUInfo.Manufacturer := 'AMD';
|
| Case CPUInfo.Family of
|
| 4: CPUInfo.CPU_Name := 'Am486 or Am5x86';
|
| 5: Case CPUInfo.Model of
|
| 0: CPUInfo.CPU_Name := 'AMD-K5 (Model 0)';
|
| 1: CPUInfo.CPU_Name := 'AMD-K5 (Model 1)';
|
| 2: CPUInfo.CPU_Name := 'AMD-K5 (Model 2)';
|
| 3: CPUInfo.CPU_Name := 'AMD-K5 (Model 3)';
|
| 6: CPUInfo.CPU_Name := 'AMD-K6 ';
|
| 7: CPUInfo.CPU_Name := 'AMD-K6 (Model 7)';
|
| 8: CPUInfo.CPU_Name := 'AMD-K6-2 (Model 8)';
|
| 9: CPUInfo.CPU_Name := 'AMD-K6-III (Model 9)';
|
| else CPUInfo.CPU_Name := 'Unknown AMD Model';
|
| end;
|
| 6: Case CPUInfo.Model of
|
| 1: CPUInfo.CPU_Name := 'AMD Athlon (Model 1)';
|
| 2: CPUInfo.CPU_Name := 'AMD Athlon (Model 2)';
|
| 3: CPUInfo.CPU_Name := 'AMD Duron ';
|
| 4: CPUINfo.CPU_Name := 'AMD Athlon (Model 4)';
|
| else CPUInfo.CPU_Name := 'Unknown AMD Chip';
|
| end;
|
| end;
|
| end
|
| else
|
| begin
|
| CPUInfo.VendorIDString := TString;
|
| CPUInfo.Manufacturer := 'Unbekannt';
|
|
| CPUInfo.CPU_Name := 'Unbekannt';
|
| end;
|
| end;
|
| Result := CPUInfo.CPU_Name;
|
| end; |