From d62a2b46b60dd3d2ad29aa246facda76fe5c1e57 Mon Sep 17 00:00:00 2001 From: Deletecat Date: Thu, 19 Mar 2026 12:44:25 +0000 Subject: [PATCH 1/5] add per-rom game loader setting --- arm9/source/rominfownd.cpp | 20 ++++++++++---------- arm9/source/romlauncher.cpp | 17 +++++------------ arm9/source/savemngr.h | 14 +++++++------- 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/arm9/source/rominfownd.cpp b/arm9/source/rominfownd.cpp index f891bf16..17e46d02 100644 --- a/arm9/source/rominfownd.cpp +++ b/arm9/source/rominfownd.cpp @@ -285,7 +285,7 @@ void cRomInfoWnd::onShow() { } #define ITEM_SAVETYPE 0, 0 -#define ITEM_NDSBOOTSTRAP 0, 1 +#define ITEM_LOADER 0, 1 #define ITEM_CHEATS 1, 0 #define ITEM_SAVESLOT 1, 1 @@ -312,14 +312,14 @@ void cRomInfoWnd::pressSaveType(void) { LANG("save type", "text"), _values, cSaveManager::SaveTypeToDisplaySaveType((SAVE_TYPE)_romInfo.saveInfo().saveType)); -#ifdef __KERNEL_LAUNCHER_SUPPORT__ - _values.clear(); - _values.push_back("kernel"); - _values.push_back("nds-bootstrap"); - _values.push_back(LANG("save type", "default")); - settingWnd.addSettingItem(LANG("loader", "text"), _values, - _romInfo.saveInfo().getNdsBootstrap()); -#endif // __KERNEL_LAUNCHER_SUPPORT__ + if (fsManager().isFlashcart()){ + _values.clear(); + _values.push_back("Pico-Loader"); + _values.push_back("nds-bootstrap"); + _values.push_back(LANG("save type", "default")); + settingWnd.addSettingItem(LANG("nds bootstrap", "loader"), _values, + _romInfo.saveInfo().getLoader()); + } settingWnd.addSettingTab(LANG("save type", "tab2")); @@ -383,7 +383,7 @@ void cRomInfoWnd::pressSaveType(void) { _romInfo.saveInfo().setFlags( 0, 0, 0, settingWnd.getItemSelection(ITEM_CHEATS), settingWnd.getItemSelection(ITEM_SAVESLOT), 2, 0, 0, 2, 0, 0, - settingWnd.getItemSelection(ITEM_NDSBOOTSTRAP)); + settingWnd.getItemSelection(ITEM_LOADER)); saveManager().updateCustomSaveList(_romInfo.saveInfo()); } diff --git a/arm9/source/romlauncher.cpp b/arm9/source/romlauncher.cpp index 15ce3a02..9372dbd4 100644 --- a/arm9/source/romlauncher.cpp +++ b/arm9/source/romlauncher.cpp @@ -245,23 +245,16 @@ TLaunchResult launchRom(const std::string& aFullPath, DSRomInfo& aRomInfo, bool if (aRomInfo.saveInfo().isLinkage()) flags |= PATCH_LINKAGE; u8 language = aRomInfo.saveInfo().getLanguage(); if (language) flags |= (language << PATCH_LANGUAGE_SHIFT) & PATCH_LANGUAGE_MASK; -#ifndef __KERNEL_LAUNCHER_SUPPORT__ - if(gs().pico && aFullPath[0] != 's'){ //roms can only be launched from the sd with nds-bootstrap + + u8 loader = aRomInfo.saveInfo().getLoader(); + // loader = 0: pico, 1: nds-bootstrap, 2: global + if(((gs().pico && loader == 2) || loader == 0) && aFullPath[0] != 's'){ //roms can only be launched from the sd with nds-bootstrap launcher = new DSpicoLauncher(); } else { launcher = new NdsBootstrapLauncher(); } -#else // __KERNEL_LAUNCHER_SUPPORT__ - if (aRomInfo.saveInfo().isNdsBootstrap()) - launcher = new NdsBootstrapLauncher(); - else -#ifdef __TTLAUNCHER__ - launcher = new TopToyLauncher(); -#else // __TTLAUNCHER__ - launcher = new AcekardLauncher(); -#endif // __TTLAUNCHER__ -#endif // __KERNEL_LAUNCHER_SUPPORT__ + } else { if (!aMenu) saveManager().saveLastInfo(aFullPath); if (gs().hbStrap == 1) diff --git a/arm9/source/savemngr.h b/arm9/source/savemngr.h index f1c4c5cb..776ee364 100644 --- a/arm9/source/savemngr.h +++ b/arm9/source/savemngr.h @@ -80,8 +80,8 @@ enum DISPLAY_SAVE_TYPE { #define SAVE_INFO_EX_GLOBAL_SD_SAVE (BIT(9)) #define SAVE_INFO_EX_LANGUAGE_MASK 0x00001c00 #define SAVE_INFO_EX_LANGUAGE_SHIFT 10 -#define SAVE_INFO_EX_NDSBOOTSTRAP (BIT(13)) -#define SAVE_INFO_EX_GLOBAL_NDSBOOTSTRAP (BIT(14)) +#define SAVE_INFO_EX_LOADER (BIT(13)) +#define SAVE_INFO_EX_GLOBAL_LOADER (BIT(14)) typedef struct SAVE_INFO_EX_T { u8 gameTitle[12]; @@ -108,8 +108,8 @@ typedef struct SAVE_INFO_EX_T { u8 getLanguage(void) { return (flags2 & SAVE_INFO_EX_LANGUAGE_MASK) >> SAVE_INFO_EX_LANGUAGE_SHIFT; } - u8 getNdsBootstrap(void) { - return getFlag(SAVE_INFO_EX_NDSBOOTSTRAP, SAVE_INFO_EX_GLOBAL_NDSBOOTSTRAP, true); + u8 getLoader(void) { + return getFlag(SAVE_INFO_EX_LOADER, SAVE_INFO_EX_GLOBAL_LOADER, true); }; bool isDownloadPlay(void) { return getState(SAVE_INFO_EX_DOWNLOAD_PLAY, SAVE_INFO_EX_GLOBAL_DOWNLOAD_PLAY, false, @@ -131,7 +131,7 @@ typedef struct SAVE_INFO_EX_T { return getState(SAVE_INFO_EX_SD_SAVE, SAVE_INFO_EX_GLOBAL_SD_SAVE, gs().sdsave, true); }; bool isNdsBootstrap(void) { - return getState(SAVE_INFO_EX_NDSBOOTSTRAP, SAVE_INFO_EX_GLOBAL_NDSBOOTSTRAP, + return getState(SAVE_INFO_EX_LOADER, SAVE_INFO_EX_GLOBAL_LOADER, gs().romLauncher, true); }; void setFlags(u8 rumble, u8 downloadplay, u8 reset, u8 cheat, u8 slot, u8 dma, u8 protection, @@ -148,7 +148,7 @@ typedef struct SAVE_INFO_EX_T { flags2 |= (icon << SAVE_INFO_EX_ICON_SHIFT) & SAVE_INFO_EX_ICON_MASK; setFlag(SAVE_INFO_EX_SD_SAVE, SAVE_INFO_EX_GLOBAL_SD_SAVE, sdsave, true); flags2 |= (language << SAVE_INFO_EX_LANGUAGE_SHIFT) & SAVE_INFO_EX_LANGUAGE_MASK; - setFlag(SAVE_INFO_EX_NDSBOOTSTRAP, SAVE_INFO_EX_GLOBAL_NDSBOOTSTRAP, ndsbootstrap, true); + setFlag(SAVE_INFO_EX_LOADER, SAVE_INFO_EX_GLOBAL_LOADER, ndsbootstrap, true); }; u8 getFlag(u32 personal, u32 global, bool style) { return (flags2 & global) ? 2 : ((style ? (flags2 & personal) : (flags & personal)) ? 1 : 0); @@ -184,7 +184,7 @@ typedef struct SAVE_INFO_EX_T { flags = 0; flags2 = SAVE_INFO_EX_GLOBAL_SOFT_RESET | SAVE_INFO_EX_GLOBAL_CHEAT | SAVE_INFO_EX_GLOBAL_DMA | SAVE_INFO_EX_GLOBAL_SD_SAVE | - SAVE_INFO_EX_GLOBAL_NDSBOOTSTRAP; + SAVE_INFO_EX_GLOBAL_LOADER; reserved[0] = reserved[1] = 0; }; } SAVE_INFO_EX; From 0f4fce622c2e89b82f3965671cd92b82862b3200 Mon Sep 17 00:00:00 2001 From: Deletecat Date: Thu, 19 Mar 2026 15:27:03 +0000 Subject: [PATCH 2/5] rominfownd: fix per-rom icon setting --- arm9/source/rominfownd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arm9/source/rominfownd.cpp b/arm9/source/rominfownd.cpp index 17e46d02..92bbf4bf 100644 --- a/arm9/source/rominfownd.cpp +++ b/arm9/source/rominfownd.cpp @@ -382,7 +382,7 @@ void cRomInfoWnd::pressSaveType(void) { } _romInfo.saveInfo().setFlags( 0, 0, 0, settingWnd.getItemSelection(ITEM_CHEATS), - settingWnd.getItemSelection(ITEM_SAVESLOT), 2, 0, 0, 2, 0, 0, + settingWnd.getItemSelection(ITEM_SAVESLOT), 2, 0, 0, settingWnd.getItemSelection(ITEM_ICON), 0, 0, settingWnd.getItemSelection(ITEM_LOADER)); saveManager().updateCustomSaveList(_romInfo.saveInfo()); From 49cc1c17eb4b364e5bd85959acdefdb067818fe5 Mon Sep 17 00:00:00 2001 From: Deletecat Date: Thu, 19 Mar 2026 15:45:23 +0000 Subject: [PATCH 3/5] dsrom: fix firmware icon drawing in small mode --- arm9/source/dsrom.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arm9/source/dsrom.cpp b/arm9/source/dsrom.cpp index 2dbf7619..1608c841 100644 --- a/arm9/source/dsrom.cpp +++ b/arm9/source/dsrom.cpp @@ -183,7 +183,11 @@ void DSRomInfo::drawDSRomIcon(u8 x, u8 y, GRAPHICS_ENGINE engine, bool small) { skiptransparent = true; break; case SAVE_INFO_EX_ICON_FIRMWARE: - gdi().maskBlt(icon_bg_bin, x, y, 32, 32, engine); + if (small) { + gdi().maskBlt(icon_bg_bin, x, y, 16, 16, engine); + } else { + gdi().maskBlt(icon_bg_bin, x, y, 32, 32, engine); + } break; } From 403fd13c112aa2bf5363ecfcf9850c994e3876f6 Mon Sep 17 00:00:00 2001 From: Deletecat Date: Thu, 19 Mar 2026 16:14:53 +0000 Subject: [PATCH 4/5] add nds-bootstrap version toggle to per-rom setting --- arm9/source/launcher/NdsBootstrapLauncher.cpp | 2 +- arm9/source/rominfownd.cpp | 12 +++++++++++- arm9/source/savemngr.h | 10 ++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/arm9/source/launcher/NdsBootstrapLauncher.cpp b/arm9/source/launcher/NdsBootstrapLauncher.cpp index 15ffda5b..304a67d3 100644 --- a/arm9/source/launcher/NdsBootstrapLauncher.cpp +++ b/arm9/source/launcher/NdsBootstrapLauncher.cpp @@ -290,7 +290,7 @@ bool NdsBootstrapLauncher::launchRom(std::string romPath, std::string savePath, progressWnd().setPercent(0); //Check which nds-bootstrap version has been selected - if(gs().nightly){ + if((gs().nightly && _romInfo.saveInfo().getNightly() == 2) || _romInfo.saveInfo().getNightly() == 1){ if(access(ndsBootstrapPathNightly.c_str(), F_OK) != 0){ progressWnd().hide(); printLoaderNotFound(ndsBootstrapPathNightly); diff --git a/arm9/source/rominfownd.cpp b/arm9/source/rominfownd.cpp index 92bbf4bf..2d9d38f4 100644 --- a/arm9/source/rominfownd.cpp +++ b/arm9/source/rominfownd.cpp @@ -286,6 +286,7 @@ void cRomInfoWnd::onShow() { #define ITEM_SAVETYPE 0, 0 #define ITEM_LOADER 0, 1 +#define ITEM_NDSBS_VER 0,2 #define ITEM_CHEATS 1, 0 #define ITEM_SAVESLOT 1, 1 @@ -321,6 +322,15 @@ void cRomInfoWnd::pressSaveType(void) { _romInfo.saveInfo().getLoader()); } + if((!gs().pico && _romInfo.saveInfo().getLoader() == 2) || _romInfo.saveInfo().getLoader() == 1){ + _values.clear(); + _values.push_back(LANG("nds bootstrap", "release")); + _values.push_back(LANG("nds bootstrap", "nightly")); + _values.push_back(LANG("save type", "default")); + settingWnd.addSettingItem(LANG("nds bootstrap", "text"), _values, + _romInfo.saveInfo().getNightly()); + } + settingWnd.addSettingTab(LANG("save type", "tab2")); _values.clear(); @@ -383,7 +393,7 @@ void cRomInfoWnd::pressSaveType(void) { _romInfo.saveInfo().setFlags( 0, 0, 0, settingWnd.getItemSelection(ITEM_CHEATS), settingWnd.getItemSelection(ITEM_SAVESLOT), 2, 0, 0, settingWnd.getItemSelection(ITEM_ICON), 0, 0, - settingWnd.getItemSelection(ITEM_LOADER)); + settingWnd.getItemSelection(ITEM_LOADER), settingWnd.getItemSelection(ITEM_NDSBS_VER)); saveManager().updateCustomSaveList(_romInfo.saveInfo()); } diff --git a/arm9/source/savemngr.h b/arm9/source/savemngr.h index 776ee364..733b8641 100644 --- a/arm9/source/savemngr.h +++ b/arm9/source/savemngr.h @@ -82,6 +82,8 @@ enum DISPLAY_SAVE_TYPE { #define SAVE_INFO_EX_LANGUAGE_SHIFT 10 #define SAVE_INFO_EX_LOADER (BIT(13)) #define SAVE_INFO_EX_GLOBAL_LOADER (BIT(14)) +#define SAVE_INFO_EX_NIGHTLY (BIT(15)) +#define SAVE_INFO_EX_GLOBAL_NIGHTLY (BIT(16)) typedef struct SAVE_INFO_EX_T { u8 gameTitle[12]; @@ -111,6 +113,9 @@ typedef struct SAVE_INFO_EX_T { u8 getLoader(void) { return getFlag(SAVE_INFO_EX_LOADER, SAVE_INFO_EX_GLOBAL_LOADER, true); }; + u8 getNightly(void) { + return getFlag(SAVE_INFO_EX_NIGHTLY, SAVE_INFO_EX_GLOBAL_NIGHTLY, true); + }; bool isDownloadPlay(void) { return getState(SAVE_INFO_EX_DOWNLOAD_PLAY, SAVE_INFO_EX_GLOBAL_DOWNLOAD_PLAY, false, false); @@ -135,7 +140,7 @@ typedef struct SAVE_INFO_EX_T { gs().romLauncher, true); }; void setFlags(u8 rumble, u8 downloadplay, u8 reset, u8 cheat, u8 slot, u8 dma, u8 protection, - u8 linkage, u8 icon, u8 sdsave, u8 language, u8 ndsbootstrap) { + u8 linkage, u8 icon, u8 sdsave, u8 language, u8 ndsbootstrap, u8 nightly) { flags = rumble & SAVE_INFO_EX_RUMBLE; flags2 = 0; setFlag(SAVE_INFO_EX_DOWNLOAD_PLAY, SAVE_INFO_EX_GLOBAL_DOWNLOAD_PLAY, downloadplay, false); @@ -149,6 +154,7 @@ typedef struct SAVE_INFO_EX_T { setFlag(SAVE_INFO_EX_SD_SAVE, SAVE_INFO_EX_GLOBAL_SD_SAVE, sdsave, true); flags2 |= (language << SAVE_INFO_EX_LANGUAGE_SHIFT) & SAVE_INFO_EX_LANGUAGE_MASK; setFlag(SAVE_INFO_EX_LOADER, SAVE_INFO_EX_GLOBAL_LOADER, ndsbootstrap, true); + setFlag(SAVE_INFO_EX_NIGHTLY, SAVE_INFO_EX_GLOBAL_NIGHTLY, nightly, true); }; u8 getFlag(u32 personal, u32 global, bool style) { return (flags2 & global) ? 2 : ((style ? (flags2 & personal) : (flags & personal)) ? 1 : 0); @@ -184,7 +190,7 @@ typedef struct SAVE_INFO_EX_T { flags = 0; flags2 = SAVE_INFO_EX_GLOBAL_SOFT_RESET | SAVE_INFO_EX_GLOBAL_CHEAT | SAVE_INFO_EX_GLOBAL_DMA | SAVE_INFO_EX_GLOBAL_SD_SAVE | - SAVE_INFO_EX_GLOBAL_LOADER; + SAVE_INFO_EX_GLOBAL_LOADER | SAVE_INFO_EX_GLOBAL_NIGHTLY; reserved[0] = reserved[1] = 0; }; } SAVE_INFO_EX; From eb461fee0cff57658469254ddead1fd8c2d45dc8 Mon Sep 17 00:00:00 2001 From: Deletecat Date: Thu, 19 Mar 2026 16:41:07 +0000 Subject: [PATCH 5/5] fixup! add nds-bootstrap version toggle to per-rom setting --- arm9/source/rominfownd.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/arm9/source/rominfownd.cpp b/arm9/source/rominfownd.cpp index 2d9d38f4..2d59c834 100644 --- a/arm9/source/rominfownd.cpp +++ b/arm9/source/rominfownd.cpp @@ -285,8 +285,6 @@ void cRomInfoWnd::onShow() { } #define ITEM_SAVETYPE 0, 0 -#define ITEM_LOADER 0, 1 -#define ITEM_NDSBS_VER 0,2 #define ITEM_CHEATS 1, 0 #define ITEM_SAVESLOT 1, 1 @@ -390,10 +388,19 @@ void cRomInfoWnd::pressSaveType(void) { LANG("save type", stLangStrings[_romInfo.saveInfo().saveType]).c_str()); addCode(); } + + u8 loader_choice = 2, nightly_choice = 2; + if (fsManager().isFlashcart()) { + loader_choice = settingWnd.getItemSelection(0,1); + nightly_choice = settingWnd.getItemSelection(0,2); + } else { + nightly_choice = settingWnd.getItemSelection(0,1); + } + _romInfo.saveInfo().setFlags( 0, 0, 0, settingWnd.getItemSelection(ITEM_CHEATS), settingWnd.getItemSelection(ITEM_SAVESLOT), 2, 0, 0, settingWnd.getItemSelection(ITEM_ICON), 0, 0, - settingWnd.getItemSelection(ITEM_LOADER), settingWnd.getItemSelection(ITEM_NDSBS_VER)); + loader_choice, nightly_choice); saveManager().updateCustomSaveList(_romInfo.saveInfo()); }