diff options
author | red031000 <rubenru09@aol.com> | 2020-06-02 20:21:29 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-06-02 20:21:29 +0100 |
commit | 09505884e8ea49d7c32b87c15f73b1e328a5c110 (patch) | |
tree | 95ef013877279fd23986b63ff5ff989acfce5d85 | |
parent | 600ff98d9d691c5f5997ce69b4acf1501d04954f (diff) |
OSi_ReloadRomData
-rw-r--r-- | arm9/asm/arm9_itcm.s | 60 | ||||
-rw-r--r-- | arm9/global.inc | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_reset.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 1 | ||||
-rw-r--r-- | arm9/lib/src/OS_reset.c | 48 |
5 files changed, 50 insertions, 61 deletions
diff --git a/arm9/asm/arm9_itcm.s b/arm9/asm/arm9_itcm.s index e08b6500..13f0ad5c 100644 --- a/arm9/asm/arm9_itcm.s +++ b/arm9/asm/arm9_itcm.s @@ -3,66 +3,6 @@ .section .text ; OS - arm_func_start OSi_ReloadRomData ;OS_reset.c -OSi_ReloadRomData: ; 0x01FF83C4 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - ldr r0, _01FF8484 - ldr sl, [r0] - cmp sl, #32768 ; 0x8000 - bcc _01FF83EC - ldr r1, _01FF8488 - mov r0, sl - mov r2, #352 ; 0x160 - bl OSi_ReadCardRom32 -_01FF83EC: - ldr r5, _01FF848C - ldr r4, _01FF8490 - ldr r3, _01FF8494 - ldr r2, _01FF8498 - ldr r1, _01FF849C - ldr r9, [r5] - ldr r0, _01FF84A0 - ldr r8, [r4] - ldr r7, [r3] - ldr r6, [r2] - ldr r5, [r1] - ldr r4, [r0] - bl OS_DisableInterrupts ; 0x1e02b0 - mov fp, r0 - bl DC_StoreAll ; 0x1df064 - bl DC_InvalidateAll ; 0x1df058 - mov r0, fp - bl OS_RestoreInterrupts ; 0x1e02c4 - bl IC_InvalidateAll ; 0x1df12c - bl DC_WaitWriteBufferEmpty ; 0x1df120 - add r9, r9, sl - cmp r9, #32768 ; 0x8000 - rsbcc r0, r9, #32768 ; 0x8000 - addcc r8, r8, r0 - subcc r7, r7, r0 - movcc r9, #32768 ; 0x8000 - add r6, r6, sl - mov r0, r9 - mov r1, r8 - mov r2, r7 - bl OSi_ReadCardRom32 ; 0x10b234 - mov r0, r6 - mov r1, r5 - mov r2, r4 - bl OSi_ReadCardRom32 - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_01FF8484: .word 0x027FFC2C -_01FF8488: .word 0x027FFE00 -_01FF848C: .word 0x027FFE20 -_01FF8490: .word 0x027FFE28 -_01FF8494: .word 0x027FFE2C -_01FF8498: .word 0x027FFE30 -_01FF849C: .word 0x027FFE38 -_01FF84A0: .word 0x027FFE3C - arm_func_start OSi_DoResetSystem ;OS_reset.c OSi_DoResetSystem: ; 0x01FF84A4 stmfd sp!, {lr} diff --git a/arm9/global.inc b/arm9/global.inc index 153dd133..e298bf3e 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -7291,6 +7291,7 @@ .extern OSi_PreviousVCount
.extern OSi_ReadCardRom32
.extern OSi_ReferSymbol
+.extern OSi_ReloadRomData
.extern OSi_RemoveMutexLinkFromQueue
.extern OSi_RescheduleCount
.extern OSi_SetTimerReserved
diff --git a/arm9/lib/include/OS_reset.h b/arm9/lib/include/OS_reset.h index d3cb4355..fd918370 100644 --- a/arm9/lib/include/OS_reset.h +++ b/arm9/lib/include/OS_reset.h @@ -18,6 +18,7 @@ static void OSi_SendToPxi(u16 data); void OS_ResetSystem(u32 parameter); void OSi_DoBoot(void); static void OSi_CpuClear32(register u32 data, register void *destp, register u32 size); +void OSi_ReloadRomData(void); void OSi_ReadCardRom32(u32 src, void *dst, s32 len); static inline u32 OS_GetResetParameter(void) diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h index 386ee0e4..c43e65b6 100644 --- a/arm9/lib/include/mmap.h +++ b/arm9/lib/include/mmap.h @@ -29,6 +29,7 @@ extern u32 SDK_AUTOLOAD_DTCM_START[]; #define HW_DOWNLOAD_PARAMETER_SIZE 0x00000020 #define HW_RESET_PARAMETER_BUF (HW_MAIN_MEM + 0x007ffc20) +#define HW_ROM_BASE_OFFSET_BUF (HW_MAIN_MEM + 0x007ffc2c) #define HW_WM_BOOT_BUF (HW_MAIN_MEM + 0x007ffc40) #define HW_ARENA_INFO_BUF (HW_MAIN_MEM + 0x007ffda0) // Arena data structure #define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c index a5ef6987..b7bf5f0b 100644 --- a/arm9/lib/src/OS_reset.c +++ b/arm9/lib/src/OS_reset.c @@ -7,6 +7,7 @@ #include "MB_mb.h" #include "OS_terminate_proc.h" #include "OS_interrupt.h" +#include "OS_system.h" #include "sections.h" static u16 OSi_IsInitReset = 0; @@ -18,6 +19,10 @@ extern void PXI_SetFifoRecvCallback(u32 param1, void* callback); extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2); extern void CARD_LockRom(u16 lockId); extern void MI_StopDma(u32 dma); +extern void DC_StoreAll(void); +extern void DC_InvalidateAll(void); +extern void IC_InvalidateAll(void); +extern void DC_WaitWriteBufferEmpty(void); extern void OSi_DoResetSystem(void); //in itcm, should technically be in this file ARM_FUNC void OS_InitReset(void) { @@ -136,7 +141,48 @@ enum CARD_ENUM_END }; -void OSi_ReadCardRom32(u32 src, void *dst, s32 len) //should be static, can't mark as such + +ARM_FUNC void OSi_ReloadRomData(void) +{ + u32 header = (u32)HW_ROM_HEADER_BUF; + const u32 rom_base = *(u32 *)HW_ROM_BASE_OFFSET_BUF; + + if (rom_base >= 0x8000) + { + OSi_ReadCardRom32(rom_base, (void *)header, 0x160); + } + + u32 src_arm9 = *(u32 *)(header + 0x20); + u32 dst_arm9 = *(u32 *)(header + 0x28); + u32 len_arm9 = *(u32 *)(header + 0x2c); + u32 src_arm7 = *(u32 *)(header + 0x30); + u32 dst_arm7 = *(u32 *)(header + 0x38); + u32 len_arm7 = *(u32 *)(header + 0x3c); + + OSIntrMode prevIntrMode = OS_DisableInterrupts(); + DC_StoreAll(); + DC_InvalidateAll(); + (void)OS_RestoreInterrupts(prevIntrMode); + + IC_InvalidateAll(); + DC_WaitWriteBufferEmpty(); + + src_arm9 += rom_base; + src_arm7 += rom_base; + + if (src_arm9 < 0x8000) + { + u32 diff = 0x8000 - src_arm9; + src_arm9 = 0x8000; + dst_arm9 += diff; + len_arm9 -= diff; + } + OSi_ReadCardRom32(src_arm9, (void *)dst_arm9, (s32)len_arm9); + + OSi_ReadCardRom32(src_arm7, (void *)dst_arm7, (s32)len_arm7); +} + +ARM_FUNC void OSi_ReadCardRom32(u32 src, void *dst, s32 len) //should be static, can't mark as such { vu32 *const hdr_GAME_BUF = (vu32 *)(HW_ROM_HEADER_BUF + 0x60); |