summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2021-09-05 11:57:22 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2021-09-05 11:57:22 -0400
commit0d9bae230d89aae4872911ebdd66cf3c8ff4a220 (patch)
tree53922e8ba486613957118ea605fc7a10edb1796b
parent9449d6126933d30b2e65014ca1bb531dc7342120 (diff)
Better structure for unk_02022450
-rw-r--r--arm9/lib/NitroSDK/include/CARD_rom.h38
-rw-r--r--arm9/src/unk_02022450.c41
2 files changed, 67 insertions, 12 deletions
diff --git a/arm9/lib/NitroSDK/include/CARD_rom.h b/arm9/lib/NitroSDK/include/CARD_rom.h
index b6fca60b..fb013cfe 100644
--- a/arm9/lib/NitroSDK/include/CARD_rom.h
+++ b/arm9/lib/NitroSDK/include/CARD_rom.h
@@ -35,6 +35,44 @@ typedef struct
}
CARDRomRegion;
+typedef struct CARDRomHeader
+{
+ char game_name[12];
+ u32 game_code;
+ u16 maker_code;
+ u8 product_id;
+ u8 device_type;
+ u8 device_size;
+ u8 reserved_A[9];
+ u8 game_version;
+ u8 property;
+ void *main_rom_offset;
+ void *main_entry_address;
+ void *main_ram_address;
+ u32 main_size;
+ void *sub_rom_offset;
+ void *sub_entry_address;
+ void *sub_ram_address;
+ u32 sub_size;
+ CARDRomRegion fnt;
+ CARDRomRegion fat;
+ CARDRomRegion main_ovt;
+ CARDRomRegion sub_ovt;
+ u8 rom_param_A[8];
+ u32 banner_offset;
+ u16 secure_crc;
+ u8 rom_param_B[2];
+ void *main_autoload_done;
+ void *sub_autoload_done;
+ u8 rom_param_C[8];
+ u32 rom_size;
+ u32 header_size;
+ u8 reserved_B[0x38];
+ u8 logo_data[0x9C];
+ u16 logo_crc;
+ u16 header_crc;
+} CARDRomHeader;
+
typedef struct CARDRomStat
{
void (*read_func) (struct CARDRomStat *);
diff --git a/arm9/src/unk_02022450.c b/arm9/src/unk_02022450.c
index 7984fcc2..2c5b9417 100644
--- a/arm9/src/unk_02022450.c
+++ b/arm9/src/unk_02022450.c
@@ -6,35 +6,52 @@
#include "unk_02022450.h"
-static const char string_saying_rom[] = "rom";
+static inline u32 GetBakRomCode(void) {
+ return ((CARDRomHeader*)HW_MAIN_MEM_SHARED)->game_code;
+}
+
+static inline void SetBakRomCode(u32 newCode) {
+ ((CARDRomHeader*)HW_MAIN_MEM_SHARED)->game_code = newCode;
+}
+
+static inline u16 GetBakRomMaker(void) {
+ return ((CARDRomHeader*)HW_MAIN_MEM_SHARED)->maker_code;
+}
+
+static const char arc_name[] = "rom";
+
+// Multichar constants are encoded big-endian,
+// but this is a little-endian machine.
+#define ROM_CODE_ADAJ_BE 'JADA'
+#define MAKER_CODE_01_BE '01'
/*Replacing (HW_MAIN_MEM_SHARED + 0xC) or (HW_MAIN_MEM_SHARED + 0x10) or defining ADAJ or 01 constants causes match failure*/
-THUMB_FUNC void FUN_02022450 () {
+THUMB_FUNC void FUN_02022450() {
if (!FS_IsAvailable()) {
OS_Terminate();
}
else {
- struct CARD_Header* card_header_buffer = (struct CARD_Header*)HW_MAIN_MEM_SHARED;
+ CARDRomHeader* card_header_buffer = (CARDRomHeader*)HW_MAIN_MEM_SHARED;
- if (!*(u32*)(HW_MAIN_MEM_SHARED + 0xC)) {
+ if (GetBakRomCode() == 0) {
CARD_Init();
MI_CpuCopy8((u8*)HW_ROM_HEADER_BUF, (u8*)card_header_buffer, HW_CARD_ROM_HEADER_SIZE);
MI_CpuCopy8((u8*)HW_ROM_HEADER_BUF, (u8*)HW_CARD_ROM_HEADER, HW_CARD_ROM_HEADER_SIZE);
- *(u32*)(HW_MAIN_MEM_SHARED + 0xC) = 0x4A414441 /*"ADAJ" LE*/;
+ SetBakRomCode(ROM_CODE_ADAJ_BE);
}
- FSArchive * const r0 = FS_FindArchive(string_saying_rom, 3);
- r0->fat = card_header_buffer->header_48;
- r0->fat_size = card_header_buffer->header_4C;
- r0->fnt = card_header_buffer->header_40;
- r0->fnt_size = card_header_buffer->header_44;
- if (*(u32*)(HW_MAIN_MEM_SHARED + 0xC) != 0x4A414441 /*"ADAJ" LE*/ || *(u16*)(HW_MAIN_MEM_SHARED + 0x10) != 0x3130 /*"01" LE*/) {
+ FSArchive * const r0 = FS_FindArchive(arc_name, 3);
+ r0->fat = card_header_buffer->fat.offset;
+ r0->fat_size = card_header_buffer->fat.length;
+ r0->fnt = card_header_buffer->fnt.offset;
+ r0->fnt_size = card_header_buffer->fnt.length;
+ if (GetBakRomCode() != ROM_CODE_ADAJ_BE || GetBakRomMaker() != MAKER_CODE_01_BE) {
OS_Terminate();
}
}
return;
}
-THUMB_FUNC void Reset_To_File (const char* path) {
+THUMB_FUNC void Reset_To_File(const char* path) {
FSFile file;
FS_InitFile(&file);
if (FS_OpenFile(&file, path)) {