[Project64] Make GetCicChipID just in one location in the CN64Rom class

This commit is contained in:
zilmar 2016-04-15 08:38:02 +10:00
parent 71454df424
commit 4b70b1c941
4 changed files with 33 additions and 44 deletions

View File

@ -149,7 +149,7 @@ bool CN64Rom::AllocateAndLoadZipImage(const char * FileLoc, bool LoadBootCodeOnl
while (port == UNZ_OK && !FoundRom) while (port == UNZ_OK && !FoundRom)
{ {
unz_file_info info; unz_file_info info;
char zname[_MAX_PATH]; char zname[260];
unzGetCurrentFileInfo(file, &info, zname, sizeof(zname), NULL, 0, NULL, 0); unzGetCurrentFileInfo(file, &info, zname, sizeof(zname), NULL, 0, NULL, 0);
if (unzLocateFile(file, zname, 1) != UNZ_OK) if (unzLocateFile(file, zname, 1) != UNZ_OK)
@ -267,35 +267,48 @@ void CN64Rom::ByteSwapRom()
} }
} }
CICChip CN64Rom::GetCicChipID(uint8_t * RomData, uint64_t * CRC)
{
uint64_t crc = 0;
int32_t count;
for (count = 0x40; count < 0x1000; count += 4)
{
crc += *(uint32_t *)(RomData + count);
}
if (CRC != NULL) { *CRC = crc; }
switch (crc)
{
case 0x000000D0027FDF31: return CIC_NUS_6101;
case 0x000000CFFB631223: return CIC_NUS_6101;
case 0x000000D057C85244: return CIC_NUS_6102;
case 0x000000D6497E414B: return CIC_NUS_6103;
case 0x0000011A49F60E96: return CIC_NUS_6105;
case 0x000000D6D5BE5580: return CIC_NUS_6106;
case 0x000001053BC19870: return CIC_NUS_5167; //64DD CONVERSION CIC
case 0x000000D2E53EF008: return CIC_NUS_8303; //64DD IPL
default:
return CIC_UNKNOWN;
}
}
void CN64Rom::CalculateCicChip() void CN64Rom::CalculateCicChip()
{ {
int64_t CRC = 0; uint64_t CRC = 0;
if (m_ROMImage == NULL) if (m_ROMImage == NULL)
{ {
m_CicChip = CIC_UNKNOWN; m_CicChip = CIC_UNKNOWN;
return; return;
} }
m_CicChip = GetCicChipID(m_ROMImage, &CRC);
for (int count = 0x40; count < 0x1000; count += 4) if (m_CicChip == CIC_UNKNOWN)
{ {
CRC += *(uint32_t *)(m_ROMImage + count);
}
switch (CRC) {
case 0x000000D0027FDF31: m_CicChip = CIC_NUS_6101; break;
case 0x000000CFFB631223: m_CicChip = CIC_NUS_6101; break;
case 0x000000D057C85244: m_CicChip = CIC_NUS_6102; break;
case 0x000000D6497E414B: m_CicChip = CIC_NUS_6103; break;
case 0x0000011A49F60E96: m_CicChip = CIC_NUS_6105; break;
case 0x000000D6D5BE5580: m_CicChip = CIC_NUS_6106; break;
case 0x000001053BC19870: m_CicChip = CIC_NUS_5167; break; //64DD CONVERSION CIC
case 0x000000D2E53EF008: m_CicChip = CIC_NUS_8303; break; //64DD IPL
default:
if (bHaveDebugger()) if (bHaveDebugger())
{ {
g_Notify->DisplayError(stdstr_f("Unknown CIC checksum:\n%I64X.", CRC).c_str()); g_Notify->DisplayError(stdstr_f("Unknown CIC checksum:\n%I64X.", CRC).c_str());
} }
m_CicChip = CIC_UNKNOWN; break;
} }
} }

View File

@ -36,6 +36,7 @@ public:
//Get a message id for the reason that you failed to load the rom //Get a message id for the reason that you failed to load the rom
LanguageStringID GetError() const { return m_ErrorMsg; } LanguageStringID GetError() const { return m_ErrorMsg; }
static CICChip GetCicChipID(uint8_t * RomData, uint64_t * CRC = NULL);
private: private:
bool AllocateRomImage(uint32_t RomFileSize); bool AllocateRomImage(uint32_t RomFileSize);

View File

@ -265,7 +265,7 @@ void CRomList::FillRomList(strlist & FileList, const CPath & BaseDirectory, cons
RomHeader += stdstr_f("%08X", *((uint32_t *)&RomData[x])); RomHeader += stdstr_f("%08X", *((uint32_t *)&RomData[x]));
} }
WriteTrace(TraceUserInterface, TraceDebug, "11a %s", RomHeader.c_str()); WriteTrace(TraceUserInterface, TraceDebug, "11a %s", RomHeader.c_str());
int32_t CicChip = GetCicChipID(RomData); int32_t CicChip = CN64Rom::GetCicChipID(RomData);
//save this info //save this info
WriteTrace(TraceUserInterface, TraceDebug, "12"); WriteTrace(TraceUserInterface, TraceDebug, "12");
@ -462,7 +462,7 @@ bool CRomList::FillRomInfo(ROM_INFO * pRomInfo)
pRomInfo->Country = *(RomData + 0x3D); pRomInfo->Country = *(RomData + 0x3D);
pRomInfo->CRC1 = *(uint32_t *)(RomData + 0x10); pRomInfo->CRC1 = *(uint32_t *)(RomData + 0x10);
pRomInfo->CRC2 = *(uint32_t *)(RomData + 0x14); pRomInfo->CRC2 = *(uint32_t *)(RomData + 0x14);
pRomInfo->CicChip = GetCicChipID(RomData); pRomInfo->CicChip = CN64Rom::GetCicChipID(RomData);
FillRomExtensionInfo(pRomInfo); FillRomExtensionInfo(pRomInfo);
return true; return true;
} }
@ -843,27 +843,3 @@ bool CRomList::GetRomFileNames(strlist & FileList, const CPath & BaseDirectory,
} while (SearchPath.FindNext()); } while (SearchPath.FindNext());
return true; return true;
} }
int32_t CRomList::GetCicChipID(uint8_t * RomData)
{
__int64 CRC = 0;
int32_t count;
for (count = 0x40; count < 0x1000; count += 4)
{
CRC += *(uint32_t *)(RomData + count);
}
switch (CRC)
{
case 0x000000D0027FDF31: return CIC_NUS_6101;
case 0x000000CFFB631223: return CIC_NUS_6101;
case 0x000000D057C85244: return CIC_NUS_6102;
case 0x000000D6497E414B: return CIC_NUS_6103;
case 0x0000011A49F60E96: return CIC_NUS_6105;
case 0x000000D6D5BE5580: return CIC_NUS_6106;
case 0x000001053BC19870: return CIC_NUS_5167; //64DD CONVERSION CIC
case 0x000000D2E53EF008: return CIC_NUS_8303; //64DD IPL
default:
return CIC_UNKNOWN;
}
}

View File

@ -88,7 +88,6 @@ private:
static void WatchRomDirChanged(CRomList * _this); static void WatchRomDirChanged(CRomList * _this);
static void RefreshRomListStatic(CRomList * _this); static void RefreshRomListStatic(CRomList * _this);
static void ByteSwapRomData(uint8_t * Data, int DataLen); static void ByteSwapRomData(uint8_t * Data, int DataLen);
static int32_t GetCicChipID(uint8_t * RomData);
CIniFile * m_NotesIniFile; CIniFile * m_NotesIniFile;
CIniFile * m_ExtIniFile; CIniFile * m_ExtIniFile;