summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/arm9_itcm.s84
-rw-r--r--arm9/global.inc1
-rw-r--r--arm9/lib/include/OS_reset.h1
-rw-r--r--arm9/lib/include/registers.h4
-rw-r--r--arm9/lib/src/OS_reset.c64
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)
+ {
+ (&reg_CARD_CMD)[0] = (u8)(CARD_CMD_READ_PAGE);
+ (&reg_CARD_CMD)[1] = (u8)(src >> 24);
+ (&reg_CARD_CMD)[2] = (u8)(src >> 16);
+ (&reg_CARD_CMD)[3] = (u8)(src >> 8);
+ (&reg_CARD_CMD)[4] = (u8)(src >> 0);
+ (&reg_CARD_CMD)[5] = 0;
+ (&reg_CARD_CMD)[6] = 0;
+ (&reg_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