[Core & UI] Handle and Select IPLs depending on Disk Country Code

- Removes 64DD IPL loading when not found, so the user has to either load the IPL ROMs once or set them in the settings
This commit is contained in:
LuigiBlood 2019-08-12 13:39:56 +02:00
parent 53da2eca49
commit cf576246e1
10 changed files with 118 additions and 111 deletions

View File

@ -559,6 +559,8 @@ enum LanguageStringID
MSG_FAIL_IMAGE_IPL = 2058,
MSG_IPL_REQUIRED = 2059,
MSG_MSGBOX_WARNING_TITLE = 2060,
MSG_USA_IPL_REQUIRED = 2061,
MSG_TOOL_IPL_REQUIRED = 2062,
/*********************************************************************************
* Android *

View File

@ -524,7 +524,9 @@ void CLanguage::LoadDefaultStrings(void)
DEF_STR(MSG_SET_HLE_AUD_TITLE, "Audio High-Level Emulation");
DEF_STR(MSG_SET_HLE_AUD_MSG, "Audio HLE requires a third-party plugin!!!\nIf you do not use a third-party audio plugin that supports HLE, you will hear no sound.\n\nChange to audio HLE?");
DEF_STR(MSG_FAIL_IMAGE_IPL, "File loaded does not appear to be a valid 64DD IPL ROM.\n\nVerify your ROMs with GoodN64.");
DEF_STR(MSG_IPL_REQUIRED, "Nintendo 64DD IPL ROM not found.\nIt is required to play 64DD disks.\n\nPlease select the required ROM.");
DEF_STR(MSG_IPL_REQUIRED, "Nintendo 64DD Japanese Retail IPL ROM not found.\nIt is required to play japanese region 64DD disk images.\n\nPlease select the required ROM in the Settings.");
DEF_STR(MSG_USA_IPL_REQUIRED, "Nintendo 64DD American Retail IPL ROM not found.\nIt is required to play american region 64DD disk images.\n\nPlease select the required ROM in the Settings.");
DEF_STR(MSG_TOOL_IPL_REQUIRED, "Nintendo 64DD Development IPL ROM not found.\nIt is required to play development 64DD disk images.\n\nPlease select the required ROM in the Settings.");
/*********************************************************************************
* Android *

View File

@ -336,12 +336,17 @@ bool CN64System::LoadFileImage(const char * FileLoc)
g_DDRom = new CN64Rom();
}
g_DDRom->LoadN64ImageIPL(FileLoc);
if (g_DDRom->CicChipID() == CIC_NUS_8303)
g_Settings->SaveString(File_DiskIPLPath, FileLoc);
else if (g_DDRom->CicChipID() == CIC_NUS_DDUS)
g_Settings->SaveString(File_DiskIPLUSAPath, FileLoc);
else if (g_DDRom->CicChipID() == CIC_NUS_DDTL)
g_Settings->SaveString(File_DiskIPLTOOLPath, FileLoc);
}
g_System->RefreshGameSettings();
if (!g_Rom->IsLoadedRomDDIPL())
if (g_Disk == NULL || !g_Rom->IsLoadedRomDDIPL())
{
g_Settings->SaveString(Game_File, FileLoc);
}
@ -403,7 +408,12 @@ bool CN64System::LoadFileImageIPL(const char * FileLoc)
g_System->RefreshGameSettings();
if (g_DDRom->CicChipID() == CIC_NUS_8303)
g_Settings->SaveString(File_DiskIPLPath, FileLoc);
else if (g_DDRom->CicChipID() == CIC_NUS_DDUS)
g_Settings->SaveString(File_DiskIPLUSAPath, FileLoc);
else if (g_DDRom->CicChipID() == CIC_NUS_DDTL)
g_Settings->SaveString(File_DiskIPLTOOLPath, FileLoc);
//g_Settings->SaveString(Game_File, FileLoc);
g_Settings->SaveBool(GameRunning_LoadingInProgress, false);
@ -487,6 +497,16 @@ bool CN64System::RunFileImage(const char * FileLoc)
return false;
}
g_Settings->SaveBool(Setting_EnableDisk, g_Rom->IsLoadedRomDDIPL());
if (g_Rom->IsLoadedRomDDIPL())
{
if (g_Rom->CicChipID() == CIC_NUS_8303)
g_Settings->SaveString(File_DiskIPLPath, FileLoc);
else if (g_Rom->CicChipID() == CIC_NUS_DDUS)
g_Settings->SaveString(File_DiskIPLUSAPath, FileLoc);
else if (g_Rom->CicChipID() == CIC_NUS_DDTL)
g_Settings->SaveString(File_DiskIPLTOOLPath, FileLoc);
}
if (g_Settings->LoadBool(Setting_AutoStart) != 0)
{
WriteTrace(TraceN64System, TraceDebug, "Automattically starting rom");
@ -497,24 +517,17 @@ bool CN64System::RunFileImage(const char * FileLoc)
bool CN64System::RunDiskImage(const char * FileLoc)
{
if (!LoadFileImage(g_Settings->LoadStringVal(File_DiskIPLPath).c_str()))
{
g_Settings->SaveString(File_DiskIPLPath, "");
return false;
}
else
{
if (!g_Rom->IsLoadedRomDDIPL())
{
g_Notify->DisplayError(MSG_FAIL_IMAGE_IPL);
g_Settings->SaveString(File_DiskIPLPath, "");
return false;
}
}
if (!LoadDiskImage(FileLoc, false))
{
return false;
}
//Select IPL ROM depending on Disk Country Code
if (!SelectAndLoadFileImageIPL(g_Disk->GetCountry(), false))
{
return false;
}
g_Settings->SaveBool(Setting_EnableDisk, true);
if (g_Settings->LoadBool(Setting_AutoStart) != 0)
{
@ -526,11 +539,6 @@ bool CN64System::RunDiskImage(const char * FileLoc)
bool CN64System::RunDiskComboImage(const char * FileLoc, const char * FileLocDisk)
{
if (!LoadFileImageIPL(g_Settings->LoadStringVal(File_DiskIPLPath).c_str()))
{
g_Settings->SaveString(File_DiskIPLPath, "");
return false;
}
if (!LoadDiskImage(FileLocDisk, true))
{
return false;
@ -539,6 +547,13 @@ bool CN64System::RunDiskComboImage(const char * FileLoc, const char * FileLocDis
{
return false;
}
//Select IPL ROM depending on Disk Country Code
if (!SelectAndLoadFileImageIPL(g_Disk->GetCountry(), true))
{
return false;
}
g_Settings->SaveBool(Setting_EnableDisk, true);
if (g_Settings->LoadBool(Setting_AutoStart) != 0)
{
@ -576,6 +591,67 @@ void CN64System::CloseSystem()
WriteTrace(TraceN64System, TraceDebug, "Done");
}
bool CN64System::SelectAndLoadFileImageIPL(Country country, bool combo)
{
delete g_DDRom;
g_DDRom = NULL;
SettingID IPLROMPathSetting;
LanguageStringID IPLROMError;
switch (country)
{
case Country::Japan:
IPLROMPathSetting = File_DiskIPLPath;
IPLROMError = MSG_IPL_REQUIRED;
break;
case Country::USA:
IPLROMPathSetting = File_DiskIPLUSAPath;
IPLROMError = MSG_USA_IPL_REQUIRED;
break;
case Country::UnknownCountry:
default:
IPLROMPathSetting = File_DiskIPLTOOLPath;
IPLROMError = MSG_TOOL_IPL_REQUIRED;
break;
}
if (!CPath(g_Settings->LoadStringVal(IPLROMPathSetting).c_str()).Exists())
{
g_Notify->DisplayWarning(IPLROMError);
return false;
}
if (combo)
{
if (!LoadFileImageIPL(g_Settings->LoadStringVal(IPLROMPathSetting).c_str()))
{
g_Settings->SaveString(IPLROMPathSetting, "");
g_Notify->DisplayWarning(IPLROMError);
return false;
}
}
else
{
if (!LoadFileImage(g_Settings->LoadStringVal(IPLROMPathSetting).c_str()))
{
g_Settings->SaveString(IPLROMPathSetting, "");
g_Notify->DisplayWarning(IPLROMError);
return false;
}
else
{
if (!g_Rom->IsLoadedRomDDIPL())
{
//g_Notify->DisplayError(MSG_FAIL_IMAGE_IPL);
g_Notify->DisplayWarning(IPLROMError);
g_Settings->SaveString(IPLROMPathSetting, "");
return false;
}
}
}
return true;
}
bool CN64System::EmulationStarting(CThread * thread)
{
WriteTrace(TraceN64System, TraceDebug, "Starting (hThread: %p ThreadId: %d)", thread, thread->ThreadID());

View File

@ -60,6 +60,7 @@ public:
static bool LoadFileImage(const char * FileLoc);
static bool LoadFileImageIPL(const char * FileLoc);
static bool LoadDiskImage(const char * FileLoc, const bool Expansion);
static bool SelectAndLoadFileImageIPL(Country country, bool combo);
static bool RunFileImage(const char * FileLoc);
static bool RunDiskImage(const char * FileLoc);
static bool RunDiskComboImage(const char * FileLoc, const char * FileLocDisk);

View File

@ -328,6 +328,8 @@ void CSettings::AddHowToHandleSetting(const char * BaseDirectory)
AddHandler(UserInterface_BasicMode, new CSettingTypeApplication("Settings", "Basic Mode", (uint32_t)true));
AddHandler(File_DiskIPLPath, new CSettingTypeApplicationPath("Settings", "Disk IPL ROM Path", Default_None));
AddHandler(File_DiskIPLUSAPath, new CSettingTypeApplicationPath("Settings", "Disk IPL USA ROM Path", Default_None));
AddHandler(File_DiskIPLTOOLPath, new CSettingTypeApplicationPath("Settings", "Disk IPL TOOL ROM Path", Default_None));
AddHandler(Debugger_Enabled, new CSettingTypeApplication("Debugger", "Debugger", false));
AddHandler(Debugger_ShowTLBMisses, new CSettingTypeApplication("Debugger", "Show TLB Misses", false));

View File

@ -232,6 +232,8 @@ enum SettingID
//File Info
File_DiskIPLPath,
File_DiskIPLUSAPath,
File_DiskIPLTOOLPath,
//Debugger
Debugger_Enabled,

View File

@ -117,27 +117,18 @@ void CMainMenu::OnOpenRom(HWND hWnd)
{
return;
}
stdstr ext = CPath(File).GetExtension();
if ((_stricmp(ext.c_str(), "ndd") != 0) && (_stricmp(ext.c_str(), "d64") != 0))
{
delete g_DDRom;
g_DDRom = NULL;
g_BaseSystem->RunFileImage(File.c_str());
return;
}
// Open Disk
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists() || !g_BaseSystem->RunDiskImage(File.c_str()))
else
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists()) { g_Notify->DisplayWarning(MSG_IPL_REQUIRED); }
CPath FileNameIPL;
const char * Filter = "64DD IPL ROM Image (*.zip, *.7z, *.?64, *.rom, *.usa, *.jap, *.pal, *.bin)\0*.?64;*.zip;*.7z;*.bin;*.rom;*.usa;*.jap;*.pal\0All files (*.*)\0*.*\0";
if (FileNameIPL.SelectFile(hWnd, g_Settings->LoadStringVal(RomList_GameDir).c_str(), Filter, true))
{
g_Settings->SaveString(File_DiskIPLPath, (const char *)FileNameIPL);
g_BaseSystem->RunDiskImage(File.c_str());
}
}
}
void CMainMenu::OnRomInfo(HWND hWnd)
{
@ -550,21 +541,9 @@ bool CMainMenu::ProcessMessage(HWND hWnd, DWORD /*FromAccelerator*/, DWORD MenuI
if ((CPath(FileName).GetExtension() != "ndd") && (CPath(FileName).GetExtension() != "d64"))
g_BaseSystem->RunFileImage(FileName.c_str());
else
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists() || !g_BaseSystem->RunDiskImage(FileName.c_str()))
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists()) { g_Notify->DisplayWarning(MSG_IPL_REQUIRED); }
CPath FileNameIPL;
const char * Filter = "64DD IPL ROM Image (*.zip, *.7z, *.?64, *.rom, *.usa, *.jap, *.pal, *.bin)\0*.?64;*.zip;*.7z;*.bin;*.rom;*.usa;*.jap;*.pal\0All files (*.*)\0*.*\0";
if (FileNameIPL.SelectFile(hWnd, g_Settings->LoadStringVal(RomList_GameDir).c_str(), Filter, true))
{
g_Settings->SaveString(File_DiskIPLPath, (const char *)FileNameIPL);
g_BaseSystem->RunDiskImage(FileName.c_str());
}
}
}
}
}
if (MenuID >= ID_RECENT_DIR_START && MenuID < ID_RECENT_DIR_END)
{
int Offset = MenuID - ID_RECENT_DIR_START;

View File

@ -993,18 +993,8 @@ LRESULT CALLBACK CMainGui::MainGui_Proc(HWND hWnd, DWORD uMsg, DWORD wParam, DWO
}
else
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists() || !g_BaseSystem->RunDiskImage(_this->CurrentedSelectedRom()))
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists()) { g_Notify->DisplayWarning(MSG_IPL_REQUIRED); }
CPath FileName;
const char * Filter = "64DD IPL ROM Image (*.zip, *.7z, *.?64, *.rom, *.usa, *.jap, *.pal, *.bin)\0*.?64;*.zip;*.7z;*.bin;*.rom;*.usa;*.jap;*.pal\0All files (*.*)\0*.*\0";
if (FileName.SelectFile(hWnd, g_Settings->LoadStringVal(RomList_GameDir).c_str(), Filter, true))
{
g_Settings->SaveString(File_DiskIPLPath, (const char *)FileName);
g_BaseSystem->RunDiskImage(_this->CurrentedSelectedRom());
}
}
}
break;
}
case ID_POPUPMENU_PLAYGAMEWITHDISK:
@ -1013,19 +1003,9 @@ LRESULT CALLBACK CMainGui::MainGui_Proc(HWND hWnd, DWORD uMsg, DWORD wParam, DWO
const char * Filter = "N64DD Disk Image (*.ndd, *.d64)\0*.ndd;*.d64\0All files (*.*)\0*.*\0";
if (FileName.SelectFile(hWnd, g_Settings->LoadStringVal(RomList_GameDir).c_str(), Filter, true))
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists() || !g_BaseSystem->RunDiskComboImage(_this->CurrentedSelectedRom(), FileName))
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists()) { g_Notify->DisplayWarning(MSG_IPL_REQUIRED); }
CPath FileNameIPL;
const char * Filter = "64DD IPL ROM Image (*.zip, *.7z, *.?64, *.rom, *.usa, *.jap, *.pal, *.bin)\0*.?64;*.zip;*.7z;*.bin;*.rom;*.usa;*.jap;*.pal\0All files (*.*)\0*.*\0";
if (FileNameIPL.SelectFile(hWnd, g_Settings->LoadStringVal(RomList_GameDir).c_str(), Filter, true))
{
g_Settings->SaveString(File_DiskIPLPath, (const char *)FileNameIPL);
g_BaseSystem->RunDiskComboImage(_this->CurrentedSelectedRom(), FileName);
}
}
}
}
break;
case ID_POPUPMENU_ROMDIRECTORY: _this->SelectRomDir(); break;
case ID_POPUPMENU_REFRESHROMLIST: _this->RefreshRomList(); break;
@ -1174,24 +1154,11 @@ LRESULT CALLBACK CMainGui::MainGui_Proc(HWND hWnd, DWORD uMsg, DWORD wParam, DWO
stdstr ext = CPath(filename).GetExtension();
if ((!(_stricmp(ext.c_str(), "ndd") == 0)) && (!(_stricmp(ext.c_str(), "d64") == 0)))
{
delete g_DDRom;
g_DDRom = NULL;
CN64System::RunFileImage(filename);
}
else
{
// Open Disk
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists() || !g_BaseSystem->RunDiskImage(filename))
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists()) { g_Notify->DisplayWarning(MSG_IPL_REQUIRED); }
CPath FileName;
const char * Filter = "64DD IPL ROM Image (*.zip, *.7z, *.?64, *.rom, *.usa, *.jap, *.pal, *.bin)\0*.?64;*.zip;*.7z;*.bin;*.rom;*.usa;*.jap;*.pal\0All files (*.*)\0*.*\0";
if (FileName.SelectFile(hWnd, g_Settings->LoadStringVal(RomList_GameDir).c_str(), Filter, true))
{
g_Settings->SaveString(File_DiskIPLPath, (const char *)FileName);
g_BaseSystem->RunDiskImage(filename);
}
}
CN64System::RunDiskImage(filename);
}
}
break;

View File

@ -804,25 +804,11 @@ void CRomBrowser::RomList_OpenRom(uint32_t /*pnmh*/)
if (!pRomInfo) { return; }
m_StopRefresh = true;
delete g_DDRom;
g_DDRom = NULL;
if ((CPath(pRomInfo->szFullFileName).GetExtension() != "ndd") && (CPath(pRomInfo->szFullFileName).GetExtension() != "d64"))
CN64System::RunFileImage(pRomInfo->szFullFileName);
else
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists() || !g_BaseSystem->RunDiskImage(pRomInfo->szFullFileName))
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists()) { g_Notify->DisplayWarning(MSG_IPL_REQUIRED); }
CPath FileName;
const char * Filter = "64DD IPL ROM Image (*.zip, *.7z, *.?64, *.rom, *.usa, *.jap, *.pal, *.bin)\0*.?64;*.zip;*.7z;*.bin;*.rom;*.usa;*.jap;*.pal\0All files (*.*)\0*.*\0";
if (FileName.SelectFile(m_MainWindow, g_Settings->LoadStringVal(RomList_GameDir).c_str(), Filter, true))
{
g_Settings->SaveString(File_DiskIPLPath, (const char *)FileName);
g_BaseSystem->RunDiskImage(pRomInfo->szFullFileName);
}
}
}
CN64System::RunDiskImage(pRomInfo->szFullFileName);
}
void CRomBrowser::RomList_PopupMenu(uint32_t /*pnmh*/)

View File

@ -36,18 +36,8 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /
}
else
{
//Ext is *.ndd, so it should be a disk file.
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists() || !g_BaseSystem->RunDiskImage(g_Settings->LoadStringVal(Cmd_RomFile).c_str()))
{
if (!CPath(g_Settings->LoadStringVal(File_DiskIPLPath)).Exists()) { g_Notify->DisplayWarning(MSG_IPL_REQUIRED); }
CPath FileNameIPL;
const char * Filter = "64DD IPL ROM Image (*.zip, *.7z, *.?64, *.rom, *.usa, *.jap, *.pal, *.bin)\0*.?64;*.zip;*.7z;*.bin;*.rom;*.usa;*.jap;*.pal\0All files (*.*)\0*.*\0";
if (FileNameIPL.SelectFile(NULL, g_Settings->LoadStringVal(RomList_GameDir).c_str(), Filter, true))
{
g_Settings->SaveString(File_DiskIPLPath, (const char *)FileNameIPL);
g_BaseSystem->RunDiskImage(g_Settings->LoadStringVal(Cmd_RomFile).c_str());
}
}
//Ext is *.ndd/*.d64, so it should be a disk file.
CN64System::RunDiskImage(g_Settings->LoadStringVal(Cmd_RomFile).c_str());
}
}
else