Skip to content

Commit

Permalink
Improve retail/homebrew detection by first checking for retail, befor…
Browse files Browse the repository at this point in the history
…e assuming homebrew

Closes #1753
  • Loading branch information
RocketRobz committed Sep 10, 2024
1 parent ca1dd25 commit f35fcf1
Show file tree
Hide file tree
Showing 4 changed files with 172 additions and 131 deletions.
63 changes: 37 additions & 26 deletions quickmenu/arm9/source/iconTitle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -303,8 +303,8 @@ void getGameInfo(int num, bool isDir, const char* name)
bnrWirelessIcon[num] = 0;
customIcon[num] = 0;
isDSiWare[num] = false;
isHomebrew[num] = false;
isModernHomebrew[num] = false;
isHomebrew[num] = true;
isModernHomebrew[num] = true;
infoFound[num] = false;

if (ms().showCustomIcons) {
Expand Down Expand Up @@ -502,32 +502,43 @@ void getGameInfo(int num, bool isDir, const char* name)

fseek(fp, ndsHeader.arm9romOffset + ndsHeader.arm9executeAddress - ndsHeader.arm9destination, SEEK_SET);
fread(arm9StartSig, sizeof(u32), 4, fp);
if (arm9StartSig[0] == 0xE3A00301
&& arm9StartSig[1] == 0xE5800208
&& arm9StartSig[2] == 0xE3A00013
&& arm9StartSig[3] == 0xE129F000) {
isHomebrew[num] = true;
isModernHomebrew[num] = true; // Homebrew is recent (supports reading from SD without a DLDI driver)
if (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000) {
if ((ndsHeader.arm9binarySize == 0xC9F68 && ndsHeader.arm7binarySize == 0x12814) // Colors! v1.1
|| (ndsHeader.arm9binarySize == 0x1B0864 && ndsHeader.arm7binarySize == 0xDB50) // Mario Paint Composer DS v2 (Bullet Bill)
|| (ndsHeader.arm9binarySize == 0xE78FC && ndsHeader.arm7binarySize == 0xF068) // SnowBros v2.2
|| (ndsHeader.arm9binarySize == 0xD45C0 && ndsHeader.arm7binarySize == 0x2B7C) // ikuReader v0.058
|| (ndsHeader.arm9binarySize == 0x7A124 && ndsHeader.arm7binarySize == 0xEED0) // PPSEDS r11
|| (ndsHeader.arm9binarySize == 0x54620 && ndsHeader.arm7binarySize == 0x1538) // XRoar 0.24fp3
|| (ndsHeader.arm9binarySize == 0x2C9A8 && ndsHeader.arm7binarySize == 0xFB98) // NitroGrafx v0.7
|| (ndsHeader.arm9binarySize == 0x22AE4 && ndsHeader.arm7binarySize == 0xA764)) { // It's 1975 and this man is about to show you the future
isModernHomebrew[num] = false; // Have nds-bootstrap load it (in case if it doesn't)
if (arm9StartSig[0] == 0xE3A0C301
&& arm9StartSig[1] == 0xE58CC208) {
// Title seems to be developed with Nintendo SDK, verify
if ((arm9StartSig[2] >= 0xEB000000 && arm9StartSig[2] < 0xEC000000) // SDK 2 & TWL SDK 5
&& (arm9StartSig[3] >= 0xE3A00000 && arm9StartSig[3] < 0xE3A01000)) {
isHomebrew[num] = false;
isModernHomebrew[num] = false;
} else
if (arm9StartSig[2] == 0xE1DC00B6 // SDK 3-5
&& arm9StartSig[3] == 0xE3500000) {
isHomebrew[num] = false;
isModernHomebrew[num] = false;
}
}

if (isHomebrew[num]) {
if (arm9StartSig[0] == 0xE3A00301
&& arm9StartSig[1] == 0xE5800208
&& arm9StartSig[2] == 0xE3A00013
&& arm9StartSig[3] == 0xE129F000) {
// isModernHomebrew[num] = true; // Homebrew is recent (supports reading from SD without a DLDI driver)
if (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000) {
if ((ndsHeader.arm9binarySize == 0xC9F68 && ndsHeader.arm7binarySize == 0x12814) // Colors! v1.1
|| (ndsHeader.arm9binarySize == 0x1B0864 && ndsHeader.arm7binarySize == 0xDB50) // Mario Paint Composer DS v2 (Bullet Bill)
|| (ndsHeader.arm9binarySize == 0xE78FC && ndsHeader.arm7binarySize == 0xF068) // SnowBros v2.2
|| (ndsHeader.arm9binarySize == 0xD45C0 && ndsHeader.arm7binarySize == 0x2B7C) // ikuReader v0.058
|| (ndsHeader.arm9binarySize == 0x7A124 && ndsHeader.arm7binarySize == 0xEED0) // PPSEDS r11
|| (ndsHeader.arm9binarySize == 0x54620 && ndsHeader.arm7binarySize == 0x1538) // XRoar 0.24fp3
|| (ndsHeader.arm9binarySize == 0x2C9A8 && ndsHeader.arm7binarySize == 0xFB98) // NitroGrafx v0.7
|| (ndsHeader.arm9binarySize == 0x22AE4 && ndsHeader.arm7binarySize == 0xA764)) { // It's 1975 and this man is about to show you the future
isModernHomebrew[num] = false; // Have nds-bootstrap load it (in case if it doesn't)
}
}
} else if ((ndsHeader.unitCode == 0) && ((memcmp(ndsHeader.gameTitle, "NMP4BOOT", 8) == 0)
|| (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000))) {
isModernHomebrew[num] = false; // Homebrew is old (requires a DLDI driver to read from SD)
}
} else if ((memcmp(ndsHeader.gameTitle, "NDS.TinyFB", 10) == 0)
|| (memcmp(ndsHeader.gameTitle, "MAGIC FLOOR", 11) == 0)
|| (memcmp(ndsHeader.gameTitle, "UNLAUNCH.DSI", 12) == 0)) {
isHomebrew[num] = true;
isModernHomebrew[num] = true; // No need to use nds-bootstrap
} else if ((memcmp(ndsHeader.gameTitle, "NMP4BOOT", 8) == 0)
|| (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000)) {
isHomebrew[num] = true; // Homebrew is old (requires a DLDI driver to read from SD)
} else if (ndsHeader.unitCode != 0 && (ndsHeader.accessControl & BIT(4))) {
isDSiWare[num] = true; // Is a DSiWare game
}
Expand Down
80 changes: 45 additions & 35 deletions romsel_aktheme/arm9/source/iconTitle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -933,8 +933,8 @@ void getGameInfo(int num, bool isDir, const char* name)
toncset(gameTid[num], 0, 4);
isTwlm[num] = false;
isDSiWare[num] = false;
isHomebrew[num] = false;
isModernHomebrew[num] = false;
isHomebrew[num] = true;
isModernHomebrew[num] = true;
requiresRamDisk[num] = false;
requiresDonorRom[num] = false;
infoFound[num] = false;
Expand Down Expand Up @@ -1196,43 +1196,53 @@ void getGameInfo(int num, bool isDir, const char* name)

fseek(fp, ndsHeader.arm9romOffset + ndsHeader.arm9executeAddress - ndsHeader.arm9destination, SEEK_SET);
fread(arm9StartSig, sizeof(u32), 4, fp);
if (arm9StartSig[0] == 0xE3A00301
&& arm9StartSig[1] == 0xE5800208
&& arm9StartSig[2] == 0xE3A00013
&& arm9StartSig[3] == 0xE129F000) {
isHomebrew[num] = true;
isModernHomebrew[num] = true; // Homebrew is recent (supports reading from SD without a DLDI driver)
if (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000) {
if ((ndsHeader.arm9binarySize == 0xC9F68 && ndsHeader.arm7binarySize == 0x12814) // Colors! v1.1
|| (ndsHeader.arm9binarySize == 0x1B0864 && ndsHeader.arm7binarySize == 0xDB50) // Mario Paint Composer DS v2 (Bullet Bill)
|| (ndsHeader.arm9binarySize == 0xE78FC && ndsHeader.arm7binarySize == 0xF068) // SnowBros v2.2
|| (ndsHeader.arm9binarySize == 0xD45C0 && ndsHeader.arm7binarySize == 0x2B7C) // ikuReader v0.058
|| (ndsHeader.arm9binarySize == 0x7A124 && ndsHeader.arm7binarySize == 0xEED0) // PPSEDS r11
|| (ndsHeader.arm9binarySize == 0x54620 && ndsHeader.arm7binarySize == 0x1538) // XRoar 0.24fp3
|| (ndsHeader.arm9binarySize == 0x2C9A8 && ndsHeader.arm7binarySize == 0xFB98) // NitroGrafx v0.7
|| (ndsHeader.arm9binarySize == 0x22AE4 && ndsHeader.arm7binarySize == 0xA764)) { // It's 1975 and this man is about to show you the future
isModernHomebrew[num] = false; // Have nds-bootstrap load it (in case if it doesn't)
}
if (arm9StartSig[0] == 0xE3A0C301
&& arm9StartSig[1] == 0xE58CC208) {
// Title seems to be developed with Nintendo SDK, verify
if ((arm9StartSig[2] >= 0xEB000000 && arm9StartSig[2] < 0xEC000000) // SDK 2 & TWL SDK 5
&& (arm9StartSig[3] >= 0xE3A00000 && arm9StartSig[3] < 0xE3A01000)) {
isHomebrew[num] = false;
isModernHomebrew[num] = false;
} else
if (arm9StartSig[2] == 0xE1DC00B6 // SDK 3-5
&& arm9StartSig[3] == 0xE3500000) {
isHomebrew[num] = false;
isModernHomebrew[num] = false;
}
} else if ((memcmp(ndsHeader.gameTitle, "NDS.TinyFB", 10) == 0)
|| (memcmp(ndsHeader.gameTitle, "MAGIC FLOOR", 11) == 0)
|| (memcmp(ndsHeader.gameTitle, "UNLAUNCH.DSI", 12) == 0)) {
isHomebrew[num] = true;
isModernHomebrew[num] = true; // No need to use nds-bootstrap
} else if ((memcmp(ndsHeader.gameTitle, "NMP4BOOT", 8) == 0)
|| (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000)) {
isHomebrew[num] = true; // Homebrew is old (requires a DLDI driver to read from SD)
} else if (ndsHeader.unitCode != 0 && (ndsHeader.accessControl & BIT(4))) {
isDSiWare[num] = true; // Is a DSiWare game
}

if (isHomebrew[num] && !ms().secondaryDevice) {
if ((ndsHeader.arm9binarySize == 0x98F70 && ndsHeader.arm7binarySize == 0xED94) // jEnesisDS 0.7.4
|| (ndsHeader.arm9binarySize == 0x48950 && ndsHeader.arm7binarySize == 0x74C4) // SNEmulDS06-WIP2
|| (ndsHeader.arm9binarySize == 0xD45C0 && ndsHeader.arm7binarySize == 0x2B7C) // ikuReader v0.058
|| (ndsHeader.arm9binarySize == 0x54620 && ndsHeader.arm7binarySize == 0x1538)) { // XRoar 0.24fp3
requiresRamDisk[num] = true;
if (isHomebrew[num]) {
if (arm9StartSig[0] == 0xE3A00301
&& arm9StartSig[1] == 0xE5800208
&& arm9StartSig[2] == 0xE3A00013
&& arm9StartSig[3] == 0xE129F000) {
// isModernHomebrew[num] = true; // Homebrew is recent (supports reading from SD without a DLDI driver)
if (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000) {
if ((ndsHeader.arm9binarySize == 0xC9F68 && ndsHeader.arm7binarySize == 0x12814) // Colors! v1.1
|| (ndsHeader.arm9binarySize == 0x1B0864 && ndsHeader.arm7binarySize == 0xDB50) // Mario Paint Composer DS v2 (Bullet Bill)
|| (ndsHeader.arm9binarySize == 0xE78FC && ndsHeader.arm7binarySize == 0xF068) // SnowBros v2.2
|| (ndsHeader.arm9binarySize == 0xD45C0 && ndsHeader.arm7binarySize == 0x2B7C) // ikuReader v0.058
|| (ndsHeader.arm9binarySize == 0x7A124 && ndsHeader.arm7binarySize == 0xEED0) // PPSEDS r11
|| (ndsHeader.arm9binarySize == 0x54620 && ndsHeader.arm7binarySize == 0x1538) // XRoar 0.24fp3
|| (ndsHeader.arm9binarySize == 0x2C9A8 && ndsHeader.arm7binarySize == 0xFB98) // NitroGrafx v0.7
|| (ndsHeader.arm9binarySize == 0x22AE4 && ndsHeader.arm7binarySize == 0xA764)) { // It's 1975 and this man is about to show you the future
isModernHomebrew[num] = false; // Have nds-bootstrap load it (in case if it doesn't)
}
}
} else if ((ndsHeader.unitCode == 0) && ((memcmp(ndsHeader.gameTitle, "NMP4BOOT", 8) == 0)
|| (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000))) {
isModernHomebrew[num] = false; // Homebrew is old (requires a DLDI driver to read from SD)
}
if (!ms().secondaryDevice && num < 40) {
if ((ndsHeader.arm9binarySize == 0x98F70 && ndsHeader.arm7binarySize == 0xED94) // jEnesisDS 0.7.4
|| (ndsHeader.arm9binarySize == 0x48950 && ndsHeader.arm7binarySize == 0x74C4) // SNEmulDS06-WIP2
|| (ndsHeader.arm9binarySize == 0xD45C0 && ndsHeader.arm7binarySize == 0x2B7C) // ikuReader v0.058
|| (ndsHeader.arm9binarySize == 0x54620 && ndsHeader.arm7binarySize == 0x1538)) { // XRoar 0.24fp3
requiresRamDisk[num] = true;
}
}
} else if (ndsHeader.unitCode != 0 && (ndsHeader.accessControl & BIT(4))) {
isDSiWare[num] = true; // Is a DSiWare game
}

if (!isHomebrew[num]) {
Expand Down
80 changes: 45 additions & 35 deletions romsel_dsimenutheme/arm9/source/iconTitle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,8 @@ void getGameInfo(bool isDir, const char *name, int num, bool fromArgv) {
isTwlm[num] = false;
isUnlaunch[num] = false;
isDSiWare[num] = false;
isHomebrew[num] = false;
isModernHomebrew[num] = false;
isHomebrew[num] = true;
isModernHomebrew[num] = true;
requiresRamDisk[num] = false;
requiresDonorRom[num] = false;
if (!fromArgv) {
Expand Down Expand Up @@ -461,43 +461,53 @@ void getGameInfo(bool isDir, const char *name, int num, bool fromArgv) {

fseek(fp, ndsHeader.arm9romOffset + ndsHeader.arm9executeAddress - ndsHeader.arm9destination, SEEK_SET);
fread(arm9StartSig, sizeof(u32), 4, fp);
if (arm9StartSig[0] == 0xE3A00301
&& arm9StartSig[1] == 0xE5800208
&& arm9StartSig[2] == 0xE3A00013
&& arm9StartSig[3] == 0xE129F000) {
isHomebrew[num] = true;
isModernHomebrew[num] = true; // Homebrew is recent (supports reading from SD without a DLDI driver)
if (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000) {
if ((ndsHeader.arm9binarySize == 0xC9F68 && ndsHeader.arm7binarySize == 0x12814) // Colors! v1.1
|| (ndsHeader.arm9binarySize == 0x1B0864 && ndsHeader.arm7binarySize == 0xDB50) // Mario Paint Composer DS v2 (Bullet Bill)
|| (ndsHeader.arm9binarySize == 0xE78FC && ndsHeader.arm7binarySize == 0xF068) // SnowBros v2.2
|| (ndsHeader.arm9binarySize == 0xD45C0 && ndsHeader.arm7binarySize == 0x2B7C) // ikuReader v0.058
|| (ndsHeader.arm9binarySize == 0x7A124 && ndsHeader.arm7binarySize == 0xEED0) // PPSEDS r11
|| (ndsHeader.arm9binarySize == 0x54620 && ndsHeader.arm7binarySize == 0x1538) // XRoar 0.24fp3
|| (ndsHeader.arm9binarySize == 0x2C9A8 && ndsHeader.arm7binarySize == 0xFB98) // NitroGrafx v0.7
|| (ndsHeader.arm9binarySize == 0x22AE4 && ndsHeader.arm7binarySize == 0xA764)) { // It's 1975 and this man is about to show you the future
isModernHomebrew[num] = false; // Have nds-bootstrap load it (in case if it doesn't)
}
if (arm9StartSig[0] == 0xE3A0C301
&& arm9StartSig[1] == 0xE58CC208) {
// Title seems to be developed with Nintendo SDK, verify
if ((arm9StartSig[2] >= 0xEB000000 && arm9StartSig[2] < 0xEC000000) // SDK 2 & TWL SDK 5
&& (arm9StartSig[3] >= 0xE3A00000 && arm9StartSig[3] < 0xE3A01000)) {
isHomebrew[num] = false;
isModernHomebrew[num] = false;
} else
if (arm9StartSig[2] == 0xE1DC00B6 // SDK 3-5
&& arm9StartSig[3] == 0xE3500000) {
isHomebrew[num] = false;
isModernHomebrew[num] = false;
}
} else if ((memcmp(ndsHeader.gameTitle, "NDS.TinyFB", 10) == 0)
|| (memcmp(ndsHeader.gameTitle, "MAGIC FLOOR", 11) == 0)
|| isUnlaunch[num]) {
isHomebrew[num] = true;
isModernHomebrew[num] = true; // No need to use nds-bootstrap
} else if ((memcmp(ndsHeader.gameTitle, "NMP4BOOT", 8) == 0)
|| (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000)) {
isHomebrew[num] = true; // Homebrew is old (requires a DLDI driver to read from SD)
} else if (ndsHeader.unitCode != 0 && (ndsHeader.accessControl & BIT(4))) {
isDSiWare[num] = true; // Is a DSiWare game
}

if (isHomebrew[num] && !ms().secondaryDevice && num < 40) {
if ((ndsHeader.arm9binarySize == 0x98F70 && ndsHeader.arm7binarySize == 0xED94) // jEnesisDS 0.7.4
|| (ndsHeader.arm9binarySize == 0x48950 && ndsHeader.arm7binarySize == 0x74C4) // SNEmulDS06-WIP2
|| (ndsHeader.arm9binarySize == 0xD45C0 && ndsHeader.arm7binarySize == 0x2B7C) // ikuReader v0.058
|| (ndsHeader.arm9binarySize == 0x54620 && ndsHeader.arm7binarySize == 0x1538)) { // XRoar 0.24fp3
requiresRamDisk[num] = true;
if (isHomebrew[num]) {
if (arm9StartSig[0] == 0xE3A00301
&& arm9StartSig[1] == 0xE5800208
&& arm9StartSig[2] == 0xE3A00013
&& arm9StartSig[3] == 0xE129F000) {
// isModernHomebrew[num] = true; // Homebrew is recent (supports reading from SD without a DLDI driver)
if (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000) {
if ((ndsHeader.arm9binarySize == 0xC9F68 && ndsHeader.arm7binarySize == 0x12814) // Colors! v1.1
|| (ndsHeader.arm9binarySize == 0x1B0864 && ndsHeader.arm7binarySize == 0xDB50) // Mario Paint Composer DS v2 (Bullet Bill)
|| (ndsHeader.arm9binarySize == 0xE78FC && ndsHeader.arm7binarySize == 0xF068) // SnowBros v2.2
|| (ndsHeader.arm9binarySize == 0xD45C0 && ndsHeader.arm7binarySize == 0x2B7C) // ikuReader v0.058
|| (ndsHeader.arm9binarySize == 0x7A124 && ndsHeader.arm7binarySize == 0xEED0) // PPSEDS r11
|| (ndsHeader.arm9binarySize == 0x54620 && ndsHeader.arm7binarySize == 0x1538) // XRoar 0.24fp3
|| (ndsHeader.arm9binarySize == 0x2C9A8 && ndsHeader.arm7binarySize == 0xFB98) // NitroGrafx v0.7
|| (ndsHeader.arm9binarySize == 0x22AE4 && ndsHeader.arm7binarySize == 0xA764)) { // It's 1975 and this man is about to show you the future
isModernHomebrew[num] = false; // Have nds-bootstrap load it (in case if it doesn't)
}
}
} else if ((ndsHeader.unitCode == 0) && ((memcmp(ndsHeader.gameTitle, "NMP4BOOT", 8) == 0)
|| (ndsHeader.arm7executeAddress >= 0x037F0000 && ndsHeader.arm7destination >= 0x037F0000))) {
isModernHomebrew[num] = false; // Homebrew is old (requires a DLDI driver to read from SD)
}
if (!ms().secondaryDevice && num < 40) {
if ((ndsHeader.arm9binarySize == 0x98F70 && ndsHeader.arm7binarySize == 0xED94) // jEnesisDS 0.7.4
|| (ndsHeader.arm9binarySize == 0x48950 && ndsHeader.arm7binarySize == 0x74C4) // SNEmulDS06-WIP2
|| (ndsHeader.arm9binarySize == 0xD45C0 && ndsHeader.arm7binarySize == 0x2B7C) // ikuReader v0.058
|| (ndsHeader.arm9binarySize == 0x54620 && ndsHeader.arm7binarySize == 0x1538)) { // XRoar 0.24fp3
requiresRamDisk[num] = true;
}
}
} else if (ndsHeader.unitCode != 0 && (ndsHeader.accessControl & BIT(4))) {
isDSiWare[num] = true; // Is a DSiWare game
}

if (num < 40 && !isHomebrew[num]) {
Expand Down
Loading

0 comments on commit f35fcf1

Please sign in to comment.