summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-06-02 20:21:29 +0100
committerred031000 <rubenru09@aol.com>2020-06-02 20:21:29 +0100
commit09505884e8ea49d7c32b87c15f73b1e328a5c110 (patch)
tree95ef013877279fd23986b63ff5ff989acfce5d85
parent600ff98d9d691c5f5997ce69b4acf1501d04954f (diff)
OSi_ReloadRomData
-rw-r--r--arm9/asm/arm9_itcm.s60
-rw-r--r--arm9/global.inc1
-rw-r--r--arm9/lib/include/OS_reset.h1
-rw-r--r--arm9/lib/include/mmap.h1
-rw-r--r--arm9/lib/src/OS_reset.c48
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);