[Project64] Clean up N64 Rom Class.cpp
This commit is contained in:
parent
165bdc160b
commit
63096c99d3
|
@ -28,60 +28,60 @@ CN64Rom::~CN64Rom()
|
|||
UnallocateRomImage();
|
||||
}
|
||||
|
||||
bool CN64Rom::AllocateAndLoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
||||
bool CN64Rom::AllocateAndLoadN64Image(const char * FileLoc, bool LoadBootCodeOnly) {
|
||||
//Try to open the target file
|
||||
HANDLE hFile = CreateFile(FileLoc,GENERIC_READ,FILE_SHARE_READ,NULL,
|
||||
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
|
||||
HANDLE hFile = CreateFile(FileLoc, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
|
||||
NULL);
|
||||
if (hFile == INVALID_HANDLE_VALUE) { return false; }
|
||||
|
||||
//Read the first 4 bytes and make sure it is a valid n64 image
|
||||
DWORD dwRead; BYTE Test[4];
|
||||
|
||||
SetFilePointer(hFile,0,0,FILE_BEGIN);
|
||||
ReadFile(hFile,Test,4,&dwRead,NULL);
|
||||
SetFilePointer(hFile, 0, 0, FILE_BEGIN);
|
||||
ReadFile(hFile, Test, 4, &dwRead, NULL);
|
||||
if (!IsValidRomImage(Test)) {
|
||||
CloseHandle( hFile );
|
||||
CloseHandle(hFile);
|
||||
return false;
|
||||
}
|
||||
|
||||
//Get the size of the rom and try to allocate the memory needed.
|
||||
DWORD RomFileSize = GetFileSize(hFile,NULL);
|
||||
DWORD RomFileSize = GetFileSize(hFile, NULL);
|
||||
//if loading boot code then just load the first 0x1000 bytes
|
||||
if (LoadBootCodeOnly) { RomFileSize = 0x1000; }
|
||||
|
||||
BYTE * Image = (BYTE *)VirtualAlloc(NULL,RomFileSize,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
|
||||
BYTE * Image = (BYTE *)VirtualAlloc(NULL, RomFileSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||
if (Image == NULL) {
|
||||
SetError(MSG_MEM_ALLOC_ERROR);
|
||||
CloseHandle( hFile );
|
||||
CloseHandle(hFile);
|
||||
return false;
|
||||
}
|
||||
|
||||
//Load the n64 rom to the allocated memory
|
||||
g_Notify->DisplayMessage(5,MSG_LOADING);
|
||||
SetFilePointer(hFile,0,0,FILE_BEGIN);
|
||||
g_Notify->DisplayMessage(5, MSG_LOADING);
|
||||
SetFilePointer(hFile, 0, 0, FILE_BEGIN);
|
||||
|
||||
DWORD count, TotalRead = 0;
|
||||
for (count = 0; count < (int)RomFileSize; count += ReadFromRomSection) {
|
||||
DWORD dwToRead = RomFileSize - count;
|
||||
if (dwToRead > ReadFromRomSection) { dwToRead = ReadFromRomSection; }
|
||||
|
||||
if (!ReadFile(hFile,&Image[count],dwToRead,&dwRead,NULL)) {
|
||||
VirtualFree(Image,0,MEM_RELEASE);
|
||||
CloseHandle( hFile );
|
||||
if (!ReadFile(hFile, &Image[count], dwToRead, &dwRead, NULL)) {
|
||||
VirtualFree(Image, 0, MEM_RELEASE);
|
||||
CloseHandle(hFile);
|
||||
SetError(MSG_FAIL_IMAGE);
|
||||
return false;
|
||||
}
|
||||
TotalRead += dwRead;
|
||||
|
||||
//Show Message of how much % wise of the rom has been loaded
|
||||
g_Notify->DisplayMessage(0,stdstr_f("%s: %.2f%c",GS(MSG_LOADED),((float)TotalRead/(float)RomFileSize) * 100.0f,'%').ToUTF16().c_str());
|
||||
g_Notify->DisplayMessage(0, stdstr_f("%s: %.2f%c", GS(MSG_LOADED), ((float)TotalRead / (float)RomFileSize) * 100.0f, '%').ToUTF16().c_str());
|
||||
}
|
||||
dwRead = TotalRead;
|
||||
|
||||
if (RomFileSize != dwRead) {
|
||||
VirtualFree(Image,0,MEM_RELEASE);
|
||||
CloseHandle( hFile );
|
||||
VirtualFree(Image, 0, MEM_RELEASE);
|
||||
CloseHandle(hFile);
|
||||
SetError(MSG_FAIL_IMAGE);
|
||||
return false;
|
||||
}
|
||||
|
@ -91,12 +91,12 @@ bool CN64Rom::AllocateAndLoadN64Image ( const char * FileLoc, bool LoadBootCodeO
|
|||
m_ROMImage = Image;
|
||||
m_RomFileSize = RomFileSize;
|
||||
|
||||
g_Notify->DisplayMessage(5,MSG_BYTESWAP);
|
||||
g_Notify->DisplayMessage(5, MSG_BYTESWAP);
|
||||
ByteSwapRom();
|
||||
|
||||
//Protect the memory so that it can not be written to.
|
||||
DWORD OldProtect;
|
||||
VirtualProtect(m_ROMImage,m_RomFileSize,PAGE_READONLY,&OldProtect);
|
||||
VirtualProtect(m_ROMImage, m_RomFileSize, PAGE_READONLY, &OldProtect);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -110,30 +110,30 @@ bool CN64Rom::AllocateAndLoadZipImage(const char * FileLoc, bool LoadBootCodeOnl
|
|||
bool FoundRom = false;
|
||||
|
||||
//scan through all files in zip to a suitable file is found
|
||||
while(port == UNZ_OK && !FoundRom) {
|
||||
while (port == UNZ_OK && !FoundRom) {
|
||||
unz_file_info info;
|
||||
char zname[_MAX_PATH];
|
||||
|
||||
unzGetCurrentFileInfo(file, &info, zname, sizeof(zname), NULL,0, NULL,0);
|
||||
if (unzLocateFile(file, zname, 1) != UNZ_OK ) {
|
||||
unzGetCurrentFileInfo(file, &info, zname, sizeof(zname), NULL, 0, NULL, 0);
|
||||
if (unzLocateFile(file, zname, 1) != UNZ_OK) {
|
||||
SetError(MSG_FAIL_ZIP);
|
||||
break;
|
||||
}
|
||||
if( unzOpenCurrentFile(file) != UNZ_OK ) {
|
||||
if (unzOpenCurrentFile(file) != UNZ_OK) {
|
||||
SetError(MSG_FAIL_ZIP);
|
||||
break;
|
||||
}
|
||||
|
||||
//Read the first 4 bytes to check magic number
|
||||
BYTE Test[4];
|
||||
unzReadCurrentFile(file,Test,sizeof(Test));
|
||||
unzReadCurrentFile(file, Test, sizeof(Test));
|
||||
if (IsValidRomImage(Test)) {
|
||||
//Get the size of the rom and try to allocate the memory needed.
|
||||
DWORD RomFileSize = info.uncompressed_size;
|
||||
if (LoadBootCodeOnly) {
|
||||
RomFileSize = 0x1000;
|
||||
}
|
||||
BYTE * Image = (BYTE *)VirtualAlloc(NULL,RomFileSize,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
|
||||
BYTE * Image = (BYTE *)VirtualAlloc(NULL, RomFileSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||
if (Image == NULL) {
|
||||
SetError(MSG_MEM_ALLOC_ERROR);
|
||||
unzCloseCurrentFile(file);
|
||||
|
@ -141,33 +141,33 @@ bool CN64Rom::AllocateAndLoadZipImage(const char * FileLoc, bool LoadBootCodeOnl
|
|||
}
|
||||
|
||||
//Load the n64 rom to the allocated memory
|
||||
g_Notify->DisplayMessage(5,MSG_LOADING);
|
||||
memcpy(Image,Test,4);
|
||||
g_Notify->DisplayMessage(5, MSG_LOADING);
|
||||
memcpy(Image, Test, 4);
|
||||
|
||||
DWORD dwRead, count, TotalRead = 0;
|
||||
for (count = 4; count < (int)RomFileSize; count += ReadFromRomSection) {
|
||||
DWORD dwToRead = RomFileSize - count;
|
||||
if (dwToRead > ReadFromRomSection) { dwToRead = ReadFromRomSection; }
|
||||
|
||||
dwRead = unzReadCurrentFile(file,&Image[count],dwToRead);
|
||||
dwRead = unzReadCurrentFile(file, &Image[count], dwToRead);
|
||||
if (dwRead == 0) {
|
||||
SetError(MSG_FAIL_ZIP);
|
||||
VirtualFree(Image,0,MEM_RELEASE);
|
||||
VirtualFree(Image, 0, MEM_RELEASE);
|
||||
unzCloseCurrentFile(file);
|
||||
break;
|
||||
}
|
||||
TotalRead += dwRead;
|
||||
|
||||
//Show Message of how much % wise of the rom has been loaded
|
||||
g_Notify->DisplayMessage(5,stdstr_f("%s: %.2f%c",GS(MSG_LOADED),((float)TotalRead/(float)RomFileSize) * 100.0f,'%').ToUTF16().c_str());
|
||||
g_Notify->DisplayMessage(5, stdstr_f("%s: %.2f%c", GS(MSG_LOADED), ((float)TotalRead / (float)RomFileSize) * 100.0f, '%').ToUTF16().c_str());
|
||||
}
|
||||
dwRead = TotalRead + 4;
|
||||
|
||||
if (RomFileSize != dwRead) {
|
||||
VirtualFree(Image,0,MEM_RELEASE);
|
||||
VirtualFree(Image, 0, MEM_RELEASE);
|
||||
unzCloseCurrentFile(file);
|
||||
SetError(MSG_FAIL_ZIP);
|
||||
g_Notify->DisplayMessage(1,L"");
|
||||
g_Notify->DisplayMessage(1, L"");
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -177,13 +177,13 @@ bool CN64Rom::AllocateAndLoadZipImage(const char * FileLoc, bool LoadBootCodeOnl
|
|||
m_RomFileSize = RomFileSize;
|
||||
FoundRom = true;
|
||||
|
||||
g_Notify->DisplayMessage(5,MSG_BYTESWAP);
|
||||
g_Notify->DisplayMessage(5, MSG_BYTESWAP);
|
||||
ByteSwapRom();
|
||||
|
||||
//Protect the memory so that it can not be written to.
|
||||
DWORD OldProtect;
|
||||
VirtualProtect(m_ROMImage,m_RomFileSize,PAGE_READONLY,&OldProtect);
|
||||
g_Notify->DisplayMessage(1,L"");
|
||||
VirtualProtect(m_ROMImage, m_RomFileSize, PAGE_READONLY, &OldProtect);
|
||||
g_Notify->DisplayMessage(1, L"");
|
||||
}
|
||||
unzCloseCurrentFile(file);
|
||||
|
||||
|
@ -200,10 +200,10 @@ void CN64Rom::ByteSwapRom() {
|
|||
|
||||
switch (*((DWORD *)&m_ROMImage[0])) {
|
||||
case 0x12408037:
|
||||
for( count = 0 ; count < m_RomFileSize; count += 4 ) {
|
||||
m_ROMImage[count] ^= m_ROMImage[count+2];
|
||||
for (count = 0; count < m_RomFileSize; count += 4) {
|
||||
m_ROMImage[count] ^= m_ROMImage[count + 2];
|
||||
m_ROMImage[count + 2] ^= m_ROMImage[count];
|
||||
m_ROMImage[count] ^= m_ROMImage[count+2];
|
||||
m_ROMImage[count] ^= m_ROMImage[count + 2];
|
||||
m_ROMImage[count + 1] ^= m_ROMImage[count + 3];
|
||||
m_ROMImage[count + 3] ^= m_ROMImage[count + 1];
|
||||
m_ROMImage[count + 1] ^= m_ROMImage[count + 3];
|
||||
|
@ -211,10 +211,10 @@ void CN64Rom::ByteSwapRom() {
|
|||
break;
|
||||
case 0x40072780: //64DD IPL
|
||||
case 0x40123780:
|
||||
for( count = 0 ; count < m_RomFileSize; count += 4 ) {
|
||||
m_ROMImage[count] ^= m_ROMImage[count+3];
|
||||
for (count = 0; count < m_RomFileSize; count += 4) {
|
||||
m_ROMImage[count] ^= m_ROMImage[count + 3];
|
||||
m_ROMImage[count + 3] ^= m_ROMImage[count];
|
||||
m_ROMImage[count] ^= m_ROMImage[count+3];
|
||||
m_ROMImage[count] ^= m_ROMImage[count + 3];
|
||||
m_ROMImage[count + 1] ^= m_ROMImage[count + 2];
|
||||
m_ROMImage[count + 2] ^= m_ROMImage[count + 1];
|
||||
m_ROMImage[count + 1] ^= m_ROMImage[count + 2];
|
||||
|
@ -222,7 +222,7 @@ void CN64Rom::ByteSwapRom() {
|
|||
break;
|
||||
case 0x80371240: break;
|
||||
default:
|
||||
g_Notify->DisplayError(stdstr_f("ByteSwapRom: %X",m_ROMImage[0]).ToUTF16().c_str());
|
||||
g_Notify->DisplayError(stdstr_f("ByteSwapRom: %X", m_ROMImage[0]).ToUTF16().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -237,7 +237,7 @@ void CN64Rom::CalculateCicChip()
|
|||
}
|
||||
|
||||
for (int count = 0x40; count < 0x1000; count += 4) {
|
||||
CRC += *(DWORD *)(m_ROMImage+count);
|
||||
CRC += *(DWORD *)(m_ROMImage + count);
|
||||
}
|
||||
switch (CRC) {
|
||||
case 0x000000D0027FDF31: m_CicChip = CIC_NUS_6101; break;
|
||||
|
@ -255,7 +255,6 @@ void CN64Rom::CalculateCicChip()
|
|||
}
|
||||
m_CicChip = CIC_UNKNOWN; break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CN64Rom::CalculateRomCrc()
|
||||
|
@ -345,46 +344,47 @@ CICChip CN64Rom::CicChipID()
|
|||
return m_CicChip;
|
||||
}
|
||||
|
||||
bool CN64Rom::IsValidRomImage ( BYTE Test[4] ) {
|
||||
if ( *((DWORD *)&Test[0]) == 0x40123780 ) { return true; }
|
||||
if ( *((DWORD *)&Test[0]) == 0x12408037 ) { return true; }
|
||||
if ( *((DWORD *)&Test[0]) == 0x80371240 ) { return true; }
|
||||
if ( *((DWORD *)&Test[0]) == 0x40072780 ) { return true; } //64DD IPL
|
||||
bool CN64Rom::IsValidRomImage(BYTE Test[4]) {
|
||||
if (*((DWORD *)&Test[0]) == 0x40123780) { return true; }
|
||||
if (*((DWORD *)&Test[0]) == 0x12408037) { return true; }
|
||||
if (*((DWORD *)&Test[0]) == 0x80371240) { return true; }
|
||||
if (*((DWORD *)&Test[0]) == 0x40072780) { return true; } //64DD IPL
|
||||
return false;
|
||||
}
|
||||
|
||||
void CN64Rom::NotificationCB ( LPCWSTR Status, CN64Rom * /*_this*/ )
|
||||
void CN64Rom::NotificationCB(LPCWSTR Status, CN64Rom * /*_this*/)
|
||||
{
|
||||
g_Notify->DisplayMessage(5,stdstr_f("%s",Status).ToUTF16().c_str());
|
||||
g_Notify->DisplayMessage(5, stdstr_f("%s", Status).ToUTF16().c_str());
|
||||
}
|
||||
|
||||
bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
||||
bool CN64Rom::LoadN64Image(const char * FileLoc, bool LoadBootCodeOnly) {
|
||||
UnallocateRomImage();
|
||||
m_ErrorMsg = EMPTY_STRING;
|
||||
|
||||
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
|
||||
_splitpath(FileLoc,drive,dir,fname,ext);
|
||||
_splitpath(FileLoc, drive, dir, fname, ext);
|
||||
bool Loaded7zFile = false;
|
||||
|
||||
if (strstr(FileLoc,"?") != NULL || strcmp(ext,".7z") == 0)
|
||||
if (strstr(FileLoc, "?") != NULL || strcmp(ext, ".7z") == 0)
|
||||
{
|
||||
char FullPath[MAX_PATH + 100];
|
||||
strcpy(FullPath,FileLoc);
|
||||
strcpy(FullPath, FileLoc);
|
||||
|
||||
//this should be a 7zip file
|
||||
char * SubFile = strstr(FullPath,"?");
|
||||
char * SubFile = strstr(FullPath, "?");
|
||||
if (SubFile == NULL)
|
||||
{
|
||||
//Pop up a dialog and select file
|
||||
//allocate memory for sub name and copy selected file name to var
|
||||
//return false; //remove once dialog is done
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
*SubFile = '\0';
|
||||
SubFile += 1;
|
||||
}
|
||||
|
||||
C7zip ZipFile(FullPath);
|
||||
ZipFile.SetNotificationCallback((C7zip::LP7ZNOTIFICATION)NotificationCB,this);
|
||||
ZipFile.SetNotificationCallback((C7zip::LP7ZNOTIFICATION)NotificationCB, this);
|
||||
for (int i = 0; i < ZipFile.NumFiles(); i++)
|
||||
{
|
||||
CSzFileItem * f = ZipFile.FileItem(i);
|
||||
|
@ -408,24 +408,24 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
|||
//if loading boot code then just load the first 0x1000 bytes
|
||||
if (LoadBootCodeOnly) { RomFileSize = 0x1000; }
|
||||
|
||||
BYTE * Image = (BYTE *)VirtualAlloc(NULL,RomFileSize,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
|
||||
BYTE * Image = (BYTE *)VirtualAlloc(NULL, RomFileSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||
if (Image == NULL) {
|
||||
SetError(MSG_MEM_ALLOC_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//Load the n64 rom to the allocated memory
|
||||
g_Notify->DisplayMessage(5,MSG_LOADING);
|
||||
if (!ZipFile.GetFile(i,Image,RomFileSize))
|
||||
g_Notify->DisplayMessage(5, MSG_LOADING);
|
||||
if (!ZipFile.GetFile(i, Image, RomFileSize))
|
||||
{
|
||||
VirtualFree(Image,0,MEM_RELEASE);
|
||||
VirtualFree(Image, 0, MEM_RELEASE);
|
||||
SetError(MSG_FAIL_IMAGE);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!IsValidRomImage(Image))
|
||||
{
|
||||
VirtualFree(Image,0,MEM_RELEASE);
|
||||
VirtualFree(Image, 0, MEM_RELEASE);
|
||||
SetError(MSG_FAIL_IMAGE);
|
||||
return false;
|
||||
}
|
||||
|
@ -434,12 +434,12 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
|||
m_ROMImage = Image;
|
||||
m_RomFileSize = RomFileSize;
|
||||
|
||||
g_Notify->DisplayMessage(5,MSG_BYTESWAP);
|
||||
g_Notify->DisplayMessage(5, MSG_BYTESWAP);
|
||||
ByteSwapRom();
|
||||
|
||||
//Protect the memory so that it can not be written to.
|
||||
DWORD OldProtect;
|
||||
VirtualProtect(m_ROMImage,m_RomFileSize,PAGE_READONLY,&OldProtect);
|
||||
VirtualProtect(m_ROMImage, m_RomFileSize, PAGE_READONLY, &OldProtect);
|
||||
|
||||
Loaded7zFile = true;
|
||||
break;
|
||||
|
@ -454,14 +454,14 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
|||
//Try to open the file as a zip file
|
||||
if (!Loaded7zFile)
|
||||
{
|
||||
if (!AllocateAndLoadZipImage(FileLoc,LoadBootCodeOnly)) {
|
||||
if (!AllocateAndLoadZipImage(FileLoc, LoadBootCodeOnly)) {
|
||||
if (m_ErrorMsg != EMPTY_STRING) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//other wise treat if normal file and open the passed file
|
||||
HANDLE hFile = CreateFile(FileLoc,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,NULL);
|
||||
HANDLE hFile = CreateFile(FileLoc, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
|
||||
if (hFile == INVALID_HANDLE_VALUE) { SetError(MSG_FAIL_OPEN_IMAGE); return false; }
|
||||
|
||||
//Create a file map
|
||||
|
@ -474,7 +474,7 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
|||
|
||||
//Map the file to a memory pointer .. ie a way of pretending to load the rom
|
||||
//loose the bonus of being able to flip it on the fly tho.
|
||||
BYTE * Image = (PBYTE)MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0);
|
||||
BYTE * Image = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
|
||||
if (Image == NULL) {
|
||||
CloseHandle(hFileMapping);
|
||||
CloseHandle(hFile);
|
||||
|
@ -483,7 +483,7 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
|||
}
|
||||
|
||||
if (!IsValidRomImage(Image)) {
|
||||
UnmapViewOfFile (Image);
|
||||
UnmapViewOfFile(Image);
|
||||
CloseHandle(hFileMapping);
|
||||
CloseHandle(hFile);
|
||||
SetError(MSG_FAIL_IMAGE);
|
||||
|
@ -494,9 +494,10 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
|||
m_hRomFile = hFile;
|
||||
m_hRomFileMapping = hFileMapping;
|
||||
m_ROMImage = Image;
|
||||
m_RomFileSize = GetFileSize(hFile,NULL);
|
||||
} else {
|
||||
if (!AllocateAndLoadN64Image(FileLoc,LoadBootCodeOnly)) { return false; }
|
||||
m_RomFileSize = GetFileSize(hFile, NULL);
|
||||
}
|
||||
else {
|
||||
if (!AllocateAndLoadN64Image(FileLoc, LoadBootCodeOnly)) { return false; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -504,34 +505,36 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
|||
char RomName[260];
|
||||
int count;
|
||||
//Get the header from the rom image
|
||||
memcpy(&RomName[0],(void *)(m_ROMImage + 0x20),20);
|
||||
for( count = 0 ; count < 20; count += 4 ) {
|
||||
RomName[count] ^= RomName[count+3];
|
||||
memcpy(&RomName[0], (void *)(m_ROMImage + 0x20), 20);
|
||||
for (count = 0; count < 20; count += 4) {
|
||||
RomName[count] ^= RomName[count + 3];
|
||||
RomName[count + 3] ^= RomName[count];
|
||||
RomName[count] ^= RomName[count+3];
|
||||
RomName[count] ^= RomName[count + 3];
|
||||
RomName[count + 1] ^= RomName[count + 2];
|
||||
RomName[count + 2] ^= RomName[count + 1];
|
||||
RomName[count + 1] ^= RomName[count + 2];
|
||||
}
|
||||
|
||||
//truncate all the spaces at the end of the string
|
||||
for( count = 19 ; count >= 0; count -- ) {
|
||||
for (count = 19; count >= 0; count--) {
|
||||
if (RomName[count] == ' ') {
|
||||
RomName[count] = '\0';
|
||||
} else if (RomName[count] == '\0') {
|
||||
} else {
|
||||
}
|
||||
else if (RomName[count] == '\0') {
|
||||
}
|
||||
else {
|
||||
count = -1;
|
||||
}
|
||||
}
|
||||
RomName[20] = '\0';
|
||||
if (strlen(RomName) == 0) {
|
||||
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
|
||||
_splitpath(FileLoc,drive,dir,fname,ext);
|
||||
strcpy(RomName,fname);
|
||||
_splitpath(FileLoc, drive, dir, fname, ext);
|
||||
strcpy(RomName, fname);
|
||||
}
|
||||
|
||||
//remove all /,\,: from the string
|
||||
for( count = 0 ; count < (int)strlen(RomName); count ++ ) {
|
||||
for (count = 0; count < (int)strlen(RomName); count++) {
|
||||
switch (RomName[count]) {
|
||||
case '/': case '\\': RomName[count] = '-'; break;
|
||||
case ':': RomName[count] = ';'; break;
|
||||
|
@ -548,7 +551,7 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
|||
}
|
||||
|
||||
m_Country = (Country)m_ROMImage[0x3D];
|
||||
m_RomIdent.Format("%08X-%08X-C:%X",*(DWORD *)(&m_ROMImage[0x10]),*(DWORD *)(&m_ROMImage[0x14]),m_ROMImage[0x3D]);
|
||||
m_RomIdent.Format("%08X-%08X-C:%X", *(DWORD *)(&m_ROMImage[0x10]), *(DWORD *)(&m_ROMImage[0x14]), m_ROMImage[0x3D]);
|
||||
CalculateCicChip();
|
||||
|
||||
if (!LoadBootCodeOnly && g_Rom == this)
|
||||
|
@ -567,29 +570,29 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
|||
|
||||
//Save the settings of the loaded rom, so all loaded settings about rom will be identified with
|
||||
//this rom
|
||||
void CN64Rom::SaveRomSettingID ( bool temp )
|
||||
void CN64Rom::SaveRomSettingID(bool temp)
|
||||
{
|
||||
g_Settings->SaveBool(Game_TempLoaded,temp);
|
||||
g_Settings->SaveString(Game_GameName,m_RomName.c_str());
|
||||
g_Settings->SaveString(Game_IniKey,m_RomIdent.c_str());
|
||||
g_Settings->SaveBool(Game_TempLoaded, temp);
|
||||
g_Settings->SaveString(Game_GameName, m_RomName.c_str());
|
||||
g_Settings->SaveString(Game_IniKey, m_RomIdent.c_str());
|
||||
|
||||
switch (GetCountry())
|
||||
{
|
||||
case Germany: case french: case Italian:
|
||||
case Europe: case Spanish: case Australia:
|
||||
case X_PAL: case Y_PAL:
|
||||
g_Settings->SaveDword(Game_SystemType,SYSTEM_PAL);
|
||||
g_Settings->SaveDword(Game_SystemType, SYSTEM_PAL);
|
||||
break;
|
||||
default:
|
||||
g_Settings->SaveDword(Game_SystemType,SYSTEM_NTSC);
|
||||
g_Settings->SaveDword(Game_SystemType, SYSTEM_NTSC);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CN64Rom::ClearRomSettingID()
|
||||
{
|
||||
g_Settings->SaveString(Game_GameName,"");
|
||||
g_Settings->SaveString(Game_IniKey,"");
|
||||
g_Settings->SaveString(Game_GameName, "");
|
||||
g_Settings->SaveString(Game_IniKey, "");
|
||||
}
|
||||
|
||||
void CN64Rom::SetError(LanguageStringID ErrorMsg)
|
||||
|
@ -600,7 +603,7 @@ void CN64Rom::SetError(LanguageStringID ErrorMsg)
|
|||
void CN64Rom::UnallocateRomImage()
|
||||
{
|
||||
if (m_hRomFileMapping) {
|
||||
UnmapViewOfFile (m_ROMImage);
|
||||
UnmapViewOfFile(m_ROMImage);
|
||||
CloseHandle(m_hRomFileMapping);
|
||||
m_ROMImage = NULL;
|
||||
m_hRomFileMapping = NULL;
|
||||
|
@ -613,7 +616,7 @@ void CN64Rom::UnallocateRomImage()
|
|||
//if this value is still set then the image was not created a map
|
||||
//file but created with VirtualAllocate
|
||||
if (m_ROMImage) {
|
||||
VirtualFree(m_ROMImage,0,MEM_RELEASE);
|
||||
VirtualFree(m_ROMImage, 0, MEM_RELEASE);
|
||||
m_ROMImage = NULL;
|
||||
}
|
||||
}
|
|
@ -27,31 +27,31 @@ class CN64Rom :
|
|||
LanguageStringID m_ErrorMsg;
|
||||
stdstr m_RomName, m_FileName, m_MD5, m_RomIdent;
|
||||
|
||||
bool AllocateAndLoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly );
|
||||
bool AllocateAndLoadZipImage ( const char * FileLoc, bool LoadBootCodeOnly );
|
||||
void ByteSwapRom ();
|
||||
void SetError ( LanguageStringID ErrorMsg );
|
||||
static void __stdcall NotificationCB ( LPCWSTR Status, CN64Rom * _this );
|
||||
void CalculateCicChip ();
|
||||
void CalculateRomCrc ();
|
||||
bool AllocateAndLoadN64Image(const char * FileLoc, bool LoadBootCodeOnly);
|
||||
bool AllocateAndLoadZipImage(const char * FileLoc, bool LoadBootCodeOnly);
|
||||
void ByteSwapRom();
|
||||
void SetError(LanguageStringID ErrorMsg);
|
||||
static void __stdcall NotificationCB(LPCWSTR Status, CN64Rom * _this);
|
||||
void CalculateCicChip();
|
||||
void CalculateRomCrc();
|
||||
|
||||
public:
|
||||
CN64Rom();
|
||||
~CN64Rom();
|
||||
|
||||
bool LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly = false );
|
||||
static bool IsValidRomImage( BYTE Test[4] );
|
||||
void SaveRomSettingID ( bool temp );
|
||||
void ClearRomSettingID ();
|
||||
CICChip CicChipID ();
|
||||
BYTE * GetRomAddress () { return m_ROMImage; }
|
||||
DWORD GetRomSize () const { return m_RomFileSize; }
|
||||
stdstr GetRomMD5 () const { return m_MD5; }
|
||||
stdstr GetRomName () const { return m_RomName; }
|
||||
stdstr GetFileName () const { return m_FileName; }
|
||||
Country GetCountry () const { return m_Country; }
|
||||
void UnallocateRomImage ();
|
||||
bool LoadN64Image(const char * FileLoc, bool LoadBootCodeOnly = false);
|
||||
static bool IsValidRomImage(BYTE Test[4]);
|
||||
void SaveRomSettingID(bool temp);
|
||||
void ClearRomSettingID();
|
||||
CICChip CicChipID();
|
||||
BYTE * GetRomAddress() { return m_ROMImage; }
|
||||
DWORD GetRomSize() const { return m_RomFileSize; }
|
||||
stdstr GetRomMD5() const { return m_MD5; }
|
||||
stdstr GetRomName() const { return m_RomName; }
|
||||
stdstr GetFileName() const { return m_FileName; }
|
||||
Country GetCountry() const { return m_Country; }
|
||||
void UnallocateRomImage();
|
||||
|
||||
//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; }
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue