mirror of
https://github.com/pret/pokediamond.git
synced 2026-04-26 00:11:26 -05:00
OSi_ReloadRomData
This commit is contained in:
parent
600ff98d9d
commit
09505884e8
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user