From c93295df42312921ec3a1adee8cce165d73827cb Mon Sep 17 00:00:00 2001 From: d0k3 Date: Fri, 10 Feb 2017 17:06:16 +0100 Subject: [PATCH] Improve FIRM v2.1.0 mount code ... maybe all older FIRMS, unsure. --- source/game/firm.h | 1 + source/virtual/vgame.c | 37 ++++++++++++++++++++----------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/source/game/firm.h b/source/game/firm.h index f6b2746..06b8d84 100644 --- a/source/game/firm.h +++ b/source/game/firm.h @@ -9,6 +9,7 @@ #define FIRM_MAX_SIZE 0x400000 // 4MB, due to FIRM partition size #define ARM9BIN_OFFSET 0x800 +#define ARM11V2_OFFSET 0x2B000 // see: https://www.3dbrew.org/wiki/FIRM#Firmware_Section_Headers typedef struct { diff --git a/source/virtual/vgame.c b/source/virtual/vgame.c index 8e1fc3e..3909a1f 100644 --- a/source/virtual/vgame.c +++ b/source/virtual/vgame.c @@ -415,23 +415,26 @@ bool BuildVGameFirmDir(void) { } } else if (section->type == 1) { // ARM11 section, search for modules NcchHeader firm_ncch; - for (u32 p = 0; p < section->size; p += firm_ncch.size * NCCH_MEDIA_UNIT) { - char name[8]; - if ((ReadImageBytes((u8*) &firm_ncch, section->offset + p, 0x200) != 0) || - (ReadImageBytes((u8*) name, section->offset + p + 0x200, 0x8) != 0) || - (ValidateNcchHeader(&firm_ncch) != 0)) - break; - - snprintf(templates[n].name, 32, NAME_FIRM_NCCH, firm_ncch.programId, name, ".app"); - templates[n].offset = section->offset + p; - templates[n].size = firm_ncch.size * NCCH_MEDIA_UNIT; - templates[n].keyslot = 0xFF; - templates[n].flags = VFLAG_NCCH; - n++; - memcpy(templates + n, templates + n - 1, sizeof(VirtualFile)); - snprintf(templates[n].name, 32, NAME_FIRM_NCCH, firm_ncch.programId, name, ""); - templates[n].flags |= VFLAG_DIR; - n++; + for (u32 v = 0; v < 2; v++) { + u32 start = v ? ARM11V2_OFFSET : 0; + for (u32 p = start; p < section->size; p += firm_ncch.size * NCCH_MEDIA_UNIT) { + char name[8]; + if ((ReadImageBytes((u8*) &firm_ncch, section->offset + p, 0x200) != 0) || + (ReadImageBytes((u8*) name, section->offset + p + 0x200, 0x8) != 0) || + (ValidateNcchHeader(&firm_ncch) != 0)) + break; + + snprintf(templates[n].name, 32, NAME_FIRM_NCCH, firm_ncch.programId, name, ".app"); + templates[n].offset = section->offset + p; + templates[n].size = firm_ncch.size * NCCH_MEDIA_UNIT; + templates[n].keyslot = 0xFF; + templates[n].flags = VFLAG_NCCH; + n++; + memcpy(templates + n, templates + n - 1, sizeof(VirtualFile)); + snprintf(templates[n].name, 32, NAME_FIRM_NCCH, firm_ncch.programId, name, ""); + templates[n].flags |= VFLAG_DIR; + n++; + } } } }