diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2021-09-05 11:57:22 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2021-09-05 11:57:22 -0400 |
commit | 0d9bae230d89aae4872911ebdd66cf3c8ff4a220 (patch) | |
tree | 53922e8ba486613957118ea605fc7a10edb1796b | |
parent | 9449d6126933d30b2e65014ca1bb531dc7342120 (diff) |
Better structure for unk_02022450
-rw-r--r-- | arm9/lib/NitroSDK/include/CARD_rom.h | 38 | ||||
-rw-r--r-- | arm9/src/unk_02022450.c | 41 |
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)) { |