1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191:
| 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; |