192 lines
6.6 KiB
C++
Executable File
192 lines
6.6 KiB
C++
Executable File
//-----------------------------------------------------------------------------
|
|
// Torque Game Engine
|
|
// Copyright (C) GarageGames.com, Inc.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
#include "platform/platform.h"
|
|
#include "core/stringTable.h"
|
|
|
|
enum CPUFlags
|
|
{
|
|
BIT_FPU = BIT(0),
|
|
BIT_RDTSC = BIT(4),
|
|
BIT_MMX = BIT(23),
|
|
BIT_SSE = BIT(25),
|
|
BIT_3DNOW = BIT(31),
|
|
};
|
|
|
|
// fill the specified structure with information obtained from asm code
|
|
void SetProcessorInfo(Platform::SystemInfo_struct::Processor& pInfo,
|
|
char* vendor, U32 processor, U32 properties)
|
|
{
|
|
Platform::SystemInfo.processor.properties |= (properties & BIT_FPU) ? CPU_PROP_FPU : 0;
|
|
Platform::SystemInfo.processor.properties |= (properties & BIT_RDTSC) ? CPU_PROP_RDTSC : 0;
|
|
Platform::SystemInfo.processor.properties |= (properties & BIT_MMX) ? CPU_PROP_MMX : 0;
|
|
|
|
if (dStricmp(vendor, "GenuineIntel") == 0)
|
|
{
|
|
pInfo.properties |= (properties & BIT_SSE) ? CPU_PROP_SSE : 0;
|
|
pInfo.type = CPU_Intel_Unknown;
|
|
// switch on processor family code
|
|
switch ((processor >> 8) & 0x0f)
|
|
{
|
|
case 4:
|
|
pInfo.type = CPU_Intel_486;
|
|
pInfo.name = StringTable->insert("Intel 486 class");
|
|
break;
|
|
|
|
// Pentium Family
|
|
case 5:
|
|
// switch on processor model code
|
|
switch ((processor >> 4) & 0xf)
|
|
{
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
pInfo.type = CPU_Intel_Pentium;
|
|
pInfo.name = StringTable->insert("Intel Pentium");
|
|
break;
|
|
case 4:
|
|
pInfo.type = CPU_Intel_PentiumMMX;
|
|
pInfo.name = StringTable->insert("Intel Pentium MMX");
|
|
break;
|
|
default:
|
|
pInfo.type = CPU_Intel_Pentium;
|
|
pInfo.name = StringTable->insert( "Intel (unknown, Pentium family)" );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
// Pentium Pro/II/II family
|
|
case 6:
|
|
// switch on processor model code
|
|
switch ((processor >> 4) & 0xf)
|
|
{
|
|
case 1:
|
|
pInfo.type = CPU_Intel_PentiumPro;
|
|
pInfo.name = StringTable->insert("Intel Pentium Pro");
|
|
break;
|
|
case 3:
|
|
case 5:
|
|
pInfo.type = CPU_Intel_PentiumII;
|
|
pInfo.name = StringTable->insert("Intel Pentium II");
|
|
break;
|
|
case 6:
|
|
pInfo.type = CPU_Intel_PentiumCeleron;
|
|
pInfo.name = StringTable->insert("Intel Pentium Celeron");
|
|
break;
|
|
case 7:
|
|
case 8:
|
|
case 10:
|
|
case 11:
|
|
pInfo.type = CPU_Intel_PentiumIII;
|
|
pInfo.name = StringTable->insert("Intel Pentium III");
|
|
break;
|
|
default:
|
|
pInfo.type = CPU_Intel_PentiumPro;
|
|
pInfo.name = StringTable->insert( "Intel (unknown, Pentium Pro/II/III family)" );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
// Pentium4 Family
|
|
case 0xf:
|
|
pInfo.type = CPU_Intel_Pentium4;
|
|
pInfo.name = StringTable->insert( "Intel Pentium 4" );
|
|
break;
|
|
|
|
default:
|
|
pInfo.type = CPU_Intel_Unknown;
|
|
pInfo.name = StringTable->insert( "Intel (unknown)" );
|
|
break;
|
|
}
|
|
}
|
|
//--------------------------------------
|
|
else
|
|
if (dStricmp(vendor, "AuthenticAMD") == 0)
|
|
{
|
|
// AthlonXP processors support SSE
|
|
pInfo.properties |= (properties & BIT_SSE) ? CPU_PROP_SSE : 0;
|
|
pInfo.properties |= (properties & BIT_3DNOW) ? CPU_PROP_3DNOW : 0;
|
|
// switch on processor family code
|
|
switch ((processor >> 8) & 0xf)
|
|
{
|
|
// K6 Family
|
|
case 5:
|
|
// switch on processor model code
|
|
switch ((processor >> 4) & 0xf)
|
|
{
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
pInfo.type = CPU_AMD_K6_3;
|
|
pInfo.name = StringTable->insert("AMD K5");
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
pInfo.type = CPU_AMD_K6;
|
|
pInfo.name = StringTable->insert("AMD K6");
|
|
break;
|
|
case 8:
|
|
pInfo.type = CPU_AMD_K6_2;
|
|
pInfo.name = StringTable->insert("AMD K6-2");
|
|
break;
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
pInfo.type = CPU_AMD_K6_3;
|
|
pInfo.name = StringTable->insert("AMD K6-3");
|
|
break;
|
|
}
|
|
break;
|
|
|
|
// Athlon Family
|
|
case 6:
|
|
pInfo.type = CPU_AMD_Athlon;
|
|
pInfo.name = StringTable->insert("AMD Athlon");
|
|
break;
|
|
|
|
default:
|
|
pInfo.type = CPU_AMD_Unknown;
|
|
pInfo.name = StringTable->insert("AMD (unknown)");
|
|
break;
|
|
}
|
|
}
|
|
//--------------------------------------
|
|
else
|
|
if (dStricmp(vendor, "CyrixInstead") == 0)
|
|
{
|
|
switch (processor)
|
|
{
|
|
case 0x520:
|
|
pInfo.type = CPU_Cyrix_6x86;
|
|
pInfo.name = StringTable->insert("Cyrix 6x86");
|
|
break;
|
|
case 0x440:
|
|
pInfo.type = CPU_Cyrix_MediaGX;
|
|
pInfo.name = StringTable->insert("Cyrix Media GX");
|
|
break;
|
|
case 0x600:
|
|
pInfo.type = CPU_Cyrix_6x86MX;
|
|
pInfo.name = StringTable->insert("Cyrix 6x86mx/MII");
|
|
break;
|
|
case 0x540:
|
|
pInfo.type = CPU_Cyrix_GXm;
|
|
pInfo.name = StringTable->insert("Cyrix GXm");
|
|
break;
|
|
default:
|
|
pInfo.type = CPU_Cyrix_Unknown;
|
|
pInfo.name = StringTable->insert("Cyrix (unknown)");
|
|
break;
|
|
}
|
|
}
|
|
}
|