diff --git a/Source/Project64-core/Multilanguage.h b/Source/Project64-core/Multilanguage.h index f9aa8bf0e..0fa12dc53 100644 --- a/Source/Project64-core/Multilanguage.h +++ b/Source/Project64-core/Multilanguage.h @@ -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 * diff --git a/Source/Project64-core/Multilanguage/LanguageClass.cpp b/Source/Project64-core/Multilanguage/LanguageClass.cpp index 2cce8c19b..2f6376e85 100644 --- a/Source/Project64-core/Multilanguage/LanguageClass.cpp +++ b/Source/Project64-core/Multilanguage/LanguageClass.cpp @@ -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 * diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index c4f5292ba..2157e7380 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -336,12 +336,17 @@ bool CN64System::LoadFileImage(const char * FileLoc) g_DDRom = new CN64Rom(); } g_DDRom->LoadN64ImageIPL(FileLoc); - g_Settings->SaveString(File_DiskIPLPath, 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(); - g_Settings->SaveString(File_DiskIPLPath, 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_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()); diff --git a/Source/Project64-core/N64System/N64Class.h b/Source/Project64-core/N64System/N64Class.h index 8ba217fca..895337f04 100644 --- a/Source/Project64-core/N64System/N64Class.h +++ b/Source/Project64-core/N64System/N64Class.h @@ -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); diff --git a/Source/Project64-core/Settings.cpp b/Source/Project64-core/Settings.cpp index bfafa8753..afacbd066 100644 --- a/Source/Project64-core/Settings.cpp +++ b/Source/Project64-core/Settings.cpp @@ -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)); diff --git a/Source/Project64-core/Settings/SettingsID.h b/Source/Project64-core/Settings/SettingsID.h index 7a2627967..29ade0e98 100644 --- a/Source/Project64-core/Settings/SettingsID.h +++ b/Source/Project64-core/Settings/SettingsID.h @@ -232,6 +232,8 @@ enum SettingID //File Info File_DiskIPLPath, + File_DiskIPLUSAPath, + File_DiskIPLTOOLPath, //Debugger Debugger_Enabled, diff --git a/Source/Project64/UserInterface/MainMenu.cpp b/Source/Project64/UserInterface/MainMenu.cpp index d1fb1664a..76091fb52 100644 --- a/Source/Project64/UserInterface/MainMenu.cpp +++ b/Source/Project64/UserInterface/MainMenu.cpp @@ -117,25 +117,16 @@ 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()); - } + g_BaseSystem->RunDiskImage(File.c_str()); } } @@ -550,19 +541,7 @@ 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()); - } - } - } + g_BaseSystem->RunDiskImage(FileName.c_str()); } } if (MenuID >= ID_RECENT_DIR_START && MenuID < ID_RECENT_DIR_END) diff --git a/Source/Project64/UserInterface/MainWindow.cpp b/Source/Project64/UserInterface/MainWindow.cpp index dd6c671b4..39e24cbd9 100644 --- a/Source/Project64/UserInterface/MainWindow.cpp +++ b/Source/Project64/UserInterface/MainWindow.cpp @@ -993,17 +993,7 @@ 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()); - } - } + g_BaseSystem->RunDiskImage(_this->CurrentedSelectedRom()); } break; } @@ -1013,17 +1003,7 @@ 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); - } - } + g_BaseSystem->RunDiskComboImage(_this->CurrentedSelectedRom(), FileName); } } 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; diff --git a/Source/Project64/UserInterface/RomBrowserClass.cpp b/Source/Project64/UserInterface/RomBrowserClass.cpp index 7e5bfbd95..d165dff43 100644 --- a/Source/Project64/UserInterface/RomBrowserClass.cpp +++ b/Source/Project64/UserInterface/RomBrowserClass.cpp @@ -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*/) diff --git a/Source/Project64/main.cpp b/Source/Project64/main.cpp index a76e367b0..58cde2d79 100644 --- a/Source/Project64/main.cpp +++ b/Source/Project64/main.cpp @@ -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