diff options
-rw-r--r-- | arm9/asm/arm9_itcm.s | 84 | ||||
-rw-r--r-- | arm9/global.inc | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_reset.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/registers.h | 4 | ||||
-rw-r--r-- | arm9/lib/src/OS_reset.c | 64 |
5 files changed, 70 insertions, 84 deletions
diff --git a/arm9/asm/arm9_itcm.s b/arm9/asm/arm9_itcm.s index 33a26758..e08b6500 100644 --- a/arm9/asm/arm9_itcm.s +++ b/arm9/asm/arm9_itcm.s @@ -3,90 +3,6 @@ .section .text ; OS - arm_func_start OSi_ReadCardRom32 ;OS_reset.c -OSi_ReadCardRom32: ; 01FF8294 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - ldr r4, _01FF8390 - ldr r3, _01FF8394 - ldr r4, [r4] - and r3, r0, r3 - bic r4, r4, #117440512 ; 0x7000000 - orr sl, r4, #-1593835520 ; 0xa1000000 - rsb r9, r3, #0 - ldr r4, _01FF8398 -_01FF82BC: - ldr r3, [r4] - ands r3, r3, #-2147483648 ; 0x80000000 - bne _01FF82BC - ldr r3, _01FF839C - mov r4, #128 ; 0x80 - cmp r9, r2 - addge sp, sp, #4 - strb r4, [r3] - add r0, r0, r9 - ldmgeia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bxge lr - ldr r3, _01FF83A0 - ldr ip, _01FF8398 - ldr r5, _01FF83A4 - ldr r4, _01FF83A8 - mov r7, r0, lsr #8 - mov r6, #183 ; 0xb7 - mov lr, #0 -_01FF8304: - strb r6, [r5] - mov r8, r0, lsr #24 - strb r8, [r4] - ldr r8, _01FF83AC - mov fp, r0, lsr #16 - strb fp, [r8] - ldr r8, _01FF83B0 - strb r7, [r8] - ldr r8, _01FF83B4 - strb r0, [r8] - ldr r8, _01FF83B8 - strb lr, [r8] - ldr r8, _01FF83BC - strb lr, [r8] - ldr r8, _01FF83C0 - strb lr, [r8] - str sl, [ip] -_01FF8348: - ldr r8, [ip] - ands fp, r8, #8388608 ; 0x800000 - beq _01FF836C - cmp r9, #0 - ldr fp, [r3] - blt _01FF8368 - cmp r9, r2 - strlt fp, [r1, r9] -_01FF8368: - add r9, r9, #4 -_01FF836C: - ands r8, r8, #-2147483648 ; 0x80000000 - bne _01FF8348 - cmp r9, r2 - add r7, r7, #2 - add r0, r0, #512 ; 0x200 - blt _01FF8304 - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_01FF8390: .word 0x027FFE60 -_01FF8394: .word 0x000001FF -_01FF8398: .word 0x040001A4 -_01FF839C: .word 0x040001A1 -_01FF83A0: .word 0x04100010 -_01FF83A4: .word 0x040001A8 -_01FF83A8: .word 0x040001A9 -_01FF83AC: .word 0x040001AA -_01FF83B0: .word 0x040001AB -_01FF83B4: .word 0x040001AC -_01FF83B8: .word 0x040001AD -_01FF83BC: .word 0x040001AE -_01FF83C0: .word 0x040001AF - arm_func_start OSi_ReloadRomData ;OS_reset.c OSi_ReloadRomData: ; 0x01FF83C4 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} diff --git a/arm9/global.inc b/arm9/global.inc index 1484bd14..e067e59a 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -7289,6 +7289,7 @@ .extern OSi_MainExArenaEnabled
.extern OSi_NeedResetTimer
.extern OSi_PreviousVCount
+.extern OSi_ReadCardRom32
.extern OSi_ReferSymbol
.extern OSi_RemoveMutexLinkFromQueue
.extern OSi_RescheduleCount
diff --git a/arm9/lib/include/OS_reset.h b/arm9/lib/include/OS_reset.h index 1efc3f2d..d3cb4355 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_ReadCardRom32(u32 src, void *dst, s32 len); static inline u32 OS_GetResetParameter(void) { diff --git a/arm9/lib/include/registers.h b/arm9/lib/include/registers.h index 366f4654..a1536eb8 100644 --- a/arm9/lib/include/registers.h +++ b/arm9/lib/include/registers.h @@ -98,9 +98,12 @@ #define reg_PXI_SEND_FIFO (*(REGType32v *)0x4000188) #define reg_MI_MCCNT0 (*(REGType16v *)0x40001a0) +#define reg_CARD_MASTERCNT (*(REGType8v *)0x40001a1) //? #define reg_MI_MCD0 (*(REGType16v *)0x40001a2) #define reg_MI_MCCNT1 (*(REGType32v *)0x40001a4) +#define reg_CARD_CNT (*(REGType32v *)0x40001a4) //? #define reg_MI_MCCMD0 (*(REGType32v *)0x40001a8) +#define reg_CARD_CMD (*(REGType8v *)0x40001a8) //? #define reg_MI_MCCMD1 (*(REGType32v *)0x40001ac) #define reg_MI_EXMEMCNT (*(REGType16v *)0x4000204) @@ -355,6 +358,7 @@ #define reg_PXI_RECV_FIFO (*(REGType32v *)0x4100000) #define reg_MI_MCD1 (*(REGType32v *)0x4100010) +#define reg_CARD_DATA (*(REGType32v *)0x4100010) //? #define REG_PAD_KEYINPUT_L_SHIFT 9 #define REG_PAD_KEYINPUT_L_SIZE 1 diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c index 6389fe45..dd3cc073 100644 --- a/arm9/lib/src/OS_reset.c +++ b/arm9/lib/src/OS_reset.c @@ -121,4 +121,68 @@ _01FF8284: blt _01FF8284 bx lr } + +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); + + enum + { + CARD_MASTER_SELECT_ROM = 0x0, + CARD_MASTER_ENABLE = 0x80, + CARD_CMD_READ_PAGE = 0xb7, + CARD_CTRL_CMD_MASK = 0x07000000, + CARD_CTRL_CMD_PAGE = 0x01000000, + CARD_CTRL_READ = 0x00000000, + CARD_CTRL_RESET_HI = 0x20000000, + CARD_CTRL_START = 0x80000000, + CARD_CTRL_READY = 0x00800000, + CARD_ENUM_END + }; + + const u32 ctrl_start = (u32)((*hdr_GAME_BUF &~CARD_CTRL_CMD_MASK) + | (CARD_CTRL_CMD_PAGE | CARD_CTRL_READ + | CARD_CTRL_START | CARD_CTRL_RESET_HI)); + + s32 pos = -(s32)(src & 511); + + while ((reg_CARD_CNT & CARD_CTRL_START)) + {} + reg_CARD_MASTERCNT = (u32)(CARD_MASTER_SELECT_ROM | CARD_MASTER_ENABLE); + + for (src = (u32)(src + pos); pos < len; src += 512) + { + (®_CARD_CMD)[0] = (u8)(CARD_CMD_READ_PAGE); + (®_CARD_CMD)[1] = (u8)(src >> 24); + (®_CARD_CMD)[2] = (u8)(src >> 16); + (®_CARD_CMD)[3] = (u8)(src >> 8); + (®_CARD_CMD)[4] = (u8)(src >> 0); + (®_CARD_CMD)[5] = 0; + (®_CARD_CMD)[6] = 0; + (®_CARD_CMD)[7] = 0; + + reg_CARD_CNT = ctrl_start; + for (;;) + { + u32 ctrl = reg_CARD_CNT; + + if ((ctrl & CARD_CTRL_READY)) + { + const u32 data = reg_CARD_DATA; + + if ((pos >= 0) && (pos < len)) + { + *(u32 *)((u32)dst + pos) = data; + } + + pos += sizeof(u32); + } + + if (!(ctrl & CARD_CTRL_START)) + { + break; + } + } + } +} #pragma section ITCM end |