mirror of
https://github.com/pret/pokediamond.git
synced 2026-10-01 21:07:01 -05:00
Better structure for unk_02022450
This commit is contained in:
@@ -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 *);
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user