diff --git a/Source/Project64-core/Multilanguage.h b/Source/Project64-core/Multilanguage.h index 617d206d3..ed067a7f6 100644 --- a/Source/Project64-core/Multilanguage.h +++ b/Source/Project64-core/Multilanguage.h @@ -556,6 +556,7 @@ enum LanguageStringID MSG_SET_LLE_GFX_MSG = 2055, MSG_SET_HLE_AUD_TITLE = 2056, MSG_SET_HLE_AUD_MSG = 2057, + MSG_FAIL_IMAGE_IPL = 2058, /********************************************************************************* * Android * diff --git a/Source/Project64-core/Multilanguage/LanguageClass.cpp b/Source/Project64-core/Multilanguage/LanguageClass.cpp index 2b43c103f..4f0642622 100644 --- a/Source/Project64-core/Multilanguage/LanguageClass.cpp +++ b/Source/Project64-core/Multilanguage/LanguageClass.cpp @@ -522,6 +522,7 @@ void CLanguage::LoadDefaultStrings(void) DEF_STR(MSG_SET_LLE_GFX_MSG, "Graphics LLE is not for general use!!!\nIt is advisable that you only use this for testing and not for playing games.\n\nChange to graphics LLE?"); 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."); /********************************************************************************* * Android * diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index 80c24feda..cb7f48580 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -363,94 +363,6 @@ bool CN64System::LoadFileImage(const char * FileLoc) return true; } -bool CN64System::RunFileImage(const char * FileLoc) -{ - //Uninitialize g_Disk and g_DDRom to prevent exception when ending emulation of a regular ROM after playing 64DD content previously. - if (g_Disk != NULL) - { - g_Disk->UnallocateDiskImage(); - delete g_Disk; - g_Disk = NULL; - } - if (g_DDRom != NULL) - { - g_DDRom->UnallocateRomImage(); - delete g_DDRom; - g_DDRom = NULL; - } - if (!LoadFileImage(FileLoc)) - { - return false; - } - g_Settings->SaveBool(Setting_EnableDisk, false); - if (g_Settings->LoadBool(Setting_AutoStart) != 0) - { - WriteTrace(TraceN64System, TraceDebug, "Automattically starting rom"); - RunLoadedImage(); - } - return true; -} - -bool CN64System::RunDiskImage(const char * FileLoc) -{ - if (!LoadFileImage(g_Settings->LoadStringVal(File_DiskIPLPath).c_str())) - { - g_Settings->SaveString(File_DiskIPLPath, ""); - return false; - } - if (!LoadDiskImage(FileLoc, false)) - { - return false; - } - g_Settings->SaveBool(Setting_EnableDisk, true); - if (g_Settings->LoadBool(Setting_AutoStart) != 0) - { - WriteTrace(TraceN64System, TraceDebug, "Automattically starting rom"); - RunLoadedImage(); - } - return true; -} - -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; - } - if (!LoadFileImage(FileLoc)) - { - return false; - } - g_Settings->SaveBool(Setting_EnableDisk, true); - if (g_Settings->LoadBool(Setting_AutoStart) != 0) - { - WriteTrace(TraceN64System, TraceDebug, "Automattically starting rom"); - RunLoadedImage(); - } - return true; -} - - -void CN64System::RunLoadedImage(void) -{ - WriteTrace(TraceN64System, TraceDebug, "Start"); - g_BaseSystem = new CN64System(g_Plugins, (uint32_t)time(NULL), false, false); - if (g_BaseSystem) - { - g_BaseSystem->StartEmulation(true); - } - else - { - WriteTrace(TraceN64System, TraceError, "Failed to create CN64System"); - } - WriteTrace(TraceN64System, TraceDebug, "Done"); -} - bool CN64System::LoadFileImageIPL(const char * FileLoc) { CloseSystem(); @@ -555,6 +467,102 @@ bool CN64System::LoadDiskImage(const char * FileLoc, const bool Expansion) return true; } +bool CN64System::RunFileImage(const char * FileLoc) +{ + //Uninitialize g_Disk and g_DDRom to prevent exception when ending emulation of a regular ROM after playing 64DD content previously. + if (g_Disk != NULL) + { + g_Disk->UnallocateDiskImage(); + delete g_Disk; + g_Disk = NULL; + } + if (g_DDRom != NULL) + { + g_DDRom->UnallocateRomImage(); + delete g_DDRom; + g_DDRom = NULL; + } + if (!LoadFileImage(FileLoc)) + { + return false; + } + g_Settings->SaveBool(Setting_EnableDisk, false); + if (g_Settings->LoadBool(Setting_AutoStart) != 0) + { + WriteTrace(TraceN64System, TraceDebug, "Automattically starting rom"); + RunLoadedImage(); + } + return true; +} + +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->CicChipID() != CIC_NUS_8303 && g_Rom->CicChipID() != CIC_NUS_DDUS) + { + g_Notify->DisplayError(MSG_FAIL_IMAGE_IPL); + g_Settings->SaveString(File_DiskIPLPath, ""); + return false; + } + } + if (!LoadDiskImage(FileLoc, false)) + { + return false; + } + g_Settings->SaveBool(Setting_EnableDisk, true); + if (g_Settings->LoadBool(Setting_AutoStart) != 0) + { + WriteTrace(TraceN64System, TraceDebug, "Automattically starting rom"); + RunLoadedImage(); + } + return true; +} + +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; + } + if (!LoadFileImage(FileLoc)) + { + return false; + } + g_Settings->SaveBool(Setting_EnableDisk, true); + if (g_Settings->LoadBool(Setting_AutoStart) != 0) + { + WriteTrace(TraceN64System, TraceDebug, "Automattically starting rom"); + RunLoadedImage(); + } + return true; +} + +void CN64System::RunLoadedImage(void) +{ + WriteTrace(TraceN64System, TraceDebug, "Start"); + g_BaseSystem = new CN64System(g_Plugins, (uint32_t)time(NULL), false, false); + if (g_BaseSystem) + { + g_BaseSystem->StartEmulation(true); + } + else + { + WriteTrace(TraceN64System, TraceError, "Failed to create CN64System"); + } + WriteTrace(TraceN64System, TraceDebug, "Done"); +} + void CN64System::CloseSystem() { WriteTrace(TraceN64System, TraceDebug, "Start"); diff --git a/Source/Project64-core/N64System/N64Class.h b/Source/Project64-core/N64System/N64Class.h index a9ac0920e..8ba217fca 100644 --- a/Source/Project64-core/N64System/N64Class.h +++ b/Source/Project64-core/N64System/N64Class.h @@ -58,11 +58,11 @@ public: //Methods static bool LoadFileImage(const char * FileLoc); + static bool LoadFileImageIPL(const char * FileLoc); + static bool LoadDiskImage(const char * FileLoc, const bool Expansion); static bool RunFileImage(const char * FileLoc); static bool RunDiskImage(const char * FileLoc); static bool RunDiskComboImage(const char * FileLoc, const char * FileLocDisk); - static bool LoadFileImageIPL(const char * FileLoc); - static bool LoadDiskImage(const char * FileLoc, const bool Expansion); static void RunLoadedImage(void); static void CloseSystem(void); diff --git a/Source/Project64-core/N64System/N64RomClass.cpp b/Source/Project64-core/N64System/N64RomClass.cpp index 6e7732bcb..c1a7fcd09 100644 --- a/Source/Project64-core/N64System/N64RomClass.cpp +++ b/Source/Project64-core/N64System/N64RomClass.cpp @@ -680,13 +680,13 @@ bool CN64Rom::LoadN64ImageIPL(const char * FileLoc, bool LoadBootCodeOnly) g_Notify->DisplayMessage(5, MSG_LOADING); if (!ZipFile.GetFile(i, m_ROMImage, RomFileSize)) { - SetError(MSG_FAIL_IMAGE); + SetError(MSG_FAIL_IMAGE_IPL); return false; } if (!IsValidRomImage(m_ROMImage)) { - SetError(MSG_FAIL_IMAGE); + SetError(MSG_FAIL_IMAGE_IPL); return false; } g_Notify->DisplayMessage(5, MSG_BYTESWAP); @@ -748,6 +748,12 @@ bool CN64Rom::LoadN64ImageIPL(const char * FileLoc, bool LoadBootCodeOnly) WriteTrace(TraceN64System, TraceDebug, "Ident: %s", m_RomIdent.c_str()); CalculateCicChip(); + if (CicChipID() != CIC_NUS_8303 && CicChipID() != CIC_NUS_DDUS) + { + SetError(MSG_FAIL_IMAGE_IPL); + return false; + } + if (!LoadBootCodeOnly && g_DDRom == this) { g_Settings->SaveBool(GameRunning_LoadingInProgress, false);