summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm7/arm7.lsf1
-rw-r--r--arm7/asm/OS_alarm.s359
-rw-r--r--arm7/asm/dtcm.s355
-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
8 files changed, 410 insertions, 416 deletions
diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf
index e047081a..bec96da5 100644
--- a/arm7/arm7.lsf
+++ b/arm7/arm7.lsf
@@ -28,6 +28,7 @@ Autoload WRAM
Object OS_alloc.o
Object OS_timer.o
Object OS_tick.o
+ Object OS_alarm.o
Object dtcm.o
Object libsyscall.o
Object dtcm2.o
diff --git a/arm7/asm/OS_alarm.s b/arm7/asm/OS_alarm.s
new file mode 100644
index 00000000..d8fb813c
--- /dev/null
+++ b/arm7/asm/OS_alarm.s
@@ -0,0 +1,359 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start OSi_AlarmHandler
+OSi_AlarmHandler: ; 0x037FA540
+ stmdb sp!, {r0, lr}
+ bl OSi_ArrangeTimer
+ ldmia sp!, {r0, lr}
+ bx lr
+
+ arm_func_start OSi_ArrangeTimer
+OSi_ArrangeTimer: ; 0x037FA550
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ mov r1, #0
+ ldr r0, _037FA644 ; =0x04000106
+ strh r1, [r0]
+ mov r0, #16
+ bl OS_DisableIrqMask
+ ldr r1, _037FA648 ; =0x0380FFF8
+ ldr r0, [r1]
+ orr r0, r0, #16
+ str r0, [r1]
+ bl OS_GetTick
+ ldr r2, _037FA64C ; =_03807934
+ ldr r4, [r2]
+ cmp r4, #0
+ beq _037FA638
+ ldr ip, [r4, #12]
+ ldr r3, [r4, #16]
+ cmp r1, r3
+ cmpeq r0, ip
+ bcs _037FA5B0
+ mov r0, r4
+ bl OSi_SetTimer
+ b _037FA638
+_037FA5B0:
+ ldr r1, [r4, #24]
+ str r1, [r2]
+ cmp r1, #0
+ moveq r0, #0
+ streq r0, [r2, #4]
+ movne r0, #0
+ strne r0, [r1, #20]
+ ldr r5, [r4]
+ ldr r2, [r4, #28]
+ ldr r1, [r4, #32]
+ mov r0, #0
+ cmp r1, r0
+ cmpeq r2, r0
+ streq r0, [r4]
+ cmp r5, #0
+ beq _037FA5FC
+ ldr r0, [r4, #4]
+ mov lr, pc
+ bx r5
+_037FA5FC:
+ ldr r2, [r4, #28]
+ ldr r0, [r4, #32]
+ mov r1, #0
+ cmp r0, r1
+ cmpeq r2, r1
+ beq _037FA624
+ str r5, [r4]
+ mov r0, r4
+ mov r2, r1
+ bl OSi_InsertAlarm
+_037FA624:
+ ldr r0, _037FA64C ; =_03807934
+ ldr r0, [r0]
+ cmp r0, #0
+ beq _037FA638
+ bl OSi_SetTimer
+_037FA638:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_037FA644: .word 0x04000106
+_037FA648: .word 0x0380FFF8
+_037FA64C: .word _03807934
+
+ arm_func_start OS_CancelAlarm
+OS_CancelAlarm: ; 0x037FA650
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ mov r5, r0
+ bl OS_DisableInterrupts
+ mov r4, r0
+ ldr r1, [r5]
+ cmp r1, #0
+ bne _037FA678
+ bl OS_RestoreInterrupts
+ b _037FA6D0
+_037FA678:
+ ldr r0, [r5, #24]
+ cmp r0, #0
+ ldreq r2, [r5, #20]
+ ldreq r1, _037FA6DC ; =_03807934
+ streq r2, [r1, #4]
+ ldrne r1, [r5, #20]
+ strne r1, [r0, #20]
+ ldr r1, [r5, #20]
+ cmp r1, #0
+ strne r0, [r1, #24]
+ bne _037FA6B8
+ ldr r1, _037FA6DC ; =_03807934
+ str r0, [r1]
+ cmp r0, #0
+ beq _037FA6B8
+ bl OSi_SetTimer
+_037FA6B8:
+ mov r0, #0
+ str r0, [r5]
+ str r0, [r5, #28]
+ str r0, [r5, #32]
+ mov r0, r4
+ bl OS_RestoreInterrupts
+_037FA6D0:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_037FA6DC: .word _03807934
+
+ arm_func_start OS_SetPeriodicAlarm
+OS_SetPeriodicAlarm: ; 0x037FA6E0
+ stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
+ sub sp, sp, #4
+ movs r4, r0
+ mov r9, r1
+ mov r8, r2
+ mov r7, r3
+ ldr r6, [sp, #32]
+ beq _037FA70C
+ ldr r0, [r4]
+ cmp r0, #0
+ beq _037FA710
+_037FA70C:
+ bl FUN_037FB1F0
+_037FA710:
+ bl OS_DisableInterrupts
+ mov r5, r0
+ str r7, [r4, #28]
+ str r6, [r4, #32]
+ str r9, [r4, #36] ; 0x24
+ str r8, [r4, #40] ; 0x28
+ ldr r0, [sp, #36] ; 0x24
+ str r0, [r4]
+ ldr r0, [sp, #40] ; 0x28
+ str r0, [r4, #4]
+ mov r0, r4
+ mov r1, #0
+ mov r2, r1
+ bl OSi_InsertAlarm
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
+ bx lr
+
+ arm_func_start OS_SetAlarm
+OS_SetAlarm: ; 0x037FA75C
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ movs r7, r0
+ mov r6, r1
+ mov r5, r2
+ mov r8, r3
+ beq _037FA780
+ ldr r0, [r7]
+ cmp r0, #0
+ beq _037FA784
+_037FA780:
+ bl FUN_037FB1F0
+_037FA784:
+ bl OS_DisableInterrupts
+ mov r4, r0
+ mov r0, #0
+ str r0, [r7, #28]
+ str r0, [r7, #32]
+ str r8, [r7]
+ ldr r0, [sp, #24]
+ str r0, [r7, #4]
+ bl OS_GetTick
+ mov r2, r0
+ mov r0, r7
+ adds r3, r6, r2
+ adc r2, r5, r1
+ mov r1, r3
+ bl OSi_InsertAlarm
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+
+ arm_func_start OSi_InsertAlarm
+OSi_InsertAlarm: ; 0x037FA7D0
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ mov r8, r0
+ mov r7, r1
+ mov r6, r2
+ ldr r2, [r8, #28]
+ ldr r1, [r8, #32]
+ mov r0, #0
+ cmp r1, r0
+ cmpeq r2, r0
+ beq _037FA84C
+ bl OS_GetTick
+ ldr r7, [r8, #36] ; 0x24
+ ldr r6, [r8, #40] ; 0x28
+ cmp r6, r1
+ cmpeq r7, r0
+ bcs _037FA84C
+ ldr r5, [r8, #28]
+ ldr r4, [r8, #32]
+ subs r0, r0, r7
+ sbc r1, r1, r6
+ mov r2, r5
+ mov r3, r4
+ bl _ll_udiv
+ mov r2, #1
+ adds r2, r0, r2
+ adc r0, r1, #0
+ umull r3, r1, r5, r2
+ mla r1, r5, r0, r1
+ mla r1, r4, r2, r1
+ adds r7, r7, r3
+ adc r6, r6, r1
+_037FA84C:
+ str r7, [r8, #12]
+ str r6, [r8, #16]
+ ldr r0, _037FA8FC ; =_03807934
+ ldr r4, [r0]
+ mov r1, #0
+ b _037FA8B8
+_037FA864:
+ ldr r2, [r4, #12]
+ ldr r0, [r4, #16]
+ subs r3, r7, r2
+ sbc r2, r6, r0
+ subs r0, r3, r1
+ sbcs r0, r2, r1
+ bge _037FA8B4
+ ldr r0, [r4, #20]
+ str r0, [r8, #20]
+ str r8, [r4, #20]
+ str r4, [r8, #24]
+ ldr r0, [r8, #20]
+ cmp r0, #0
+ strne r8, [r0, #24]
+ bne _037FA8F4
+ ldr r0, _037FA8FC ; =_03807934
+ str r8, [r0]
+ mov r0, r8
+ bl OSi_SetTimer
+ b _037FA8F4
+_037FA8B4:
+ ldr r4, [r4, #24]
+_037FA8B8:
+ cmp r4, #0
+ bne _037FA864
+ mov r0, #0
+ str r0, [r8, #24]
+ ldr r0, _037FA8FC ; =_03807934
+ ldr r1, [r0, #4]
+ str r8, [r0, #4]
+ str r1, [r8, #20]
+ cmp r1, #0
+ strne r8, [r1, #24]
+ bne _037FA8F4
+ str r8, [r0, #4]
+ str r8, [r0]
+ mov r0, r8
+ bl OSi_SetTimer
+_037FA8F4:
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+_037FA8FC: .word _03807934
+
+ arm_func_start OS_CreateAlarm
+OS_CreateAlarm: ; 0x037FA900
+ mov r1, #0
+ str r1, [r0]
+ str r1, [r0, #8]
+ bx lr
+
+ arm_func_start OS_IsAlarmAvailable
+OS_IsAlarmAvailable: ; 0x037FA910
+ ldr r0, _037FA91C ; =_03807930
+ ldrh r0, [r0]
+ bx lr
+_037FA91C: .word _03807930
+
+ arm_func_start OS_InitAlarm
+OS_InitAlarm: ; 0x037FA920
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ ldr r1, _037FA968 ; =_03807930
+ ldrh r0, [r1]
+ cmp r0, #0
+ bne _037FA95C
+ mov r0, #1
+ strh r0, [r1]
+ bl OSi_SetTimerReserved
+ mov r1, #0
+ ldr r0, _037FA96C ; =_03807934
+ str r1, [r0]
+ str r1, [r0, #4]
+ mov r0, #16
+ bl OS_DisableIrqMask
+_037FA95C:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_037FA968: .word _03807930
+_037FA96C: .word _03807934
+
+ arm_func_start OSi_SetTimer
+OSi_SetTimer: ; 0x037FA970
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ mov r4, r0
+ bl OS_GetTick
+ mov r2, #0
+ ldr r3, _037FA9FC ; =0x04000106
+ strh r2, [r3]
+ ldr ip, [r4, #12]
+ ldr r3, [r4, #16]
+ subs r5, ip, r0
+ sbc r4, r3, r1
+ mov r0, #1
+ ldr r1, _037FAA00 ; =OSi_AlarmHandler
+ bl OSi_EnterTimerCallback
+ mov r1, #0
+ subs r0, r5, r1
+ sbcs r0, r4, r1
+ ldrlt r1, _037FAA04 ; =0x0000FFFE
+ blt _037FA9D4
+ mov r0, #65536 ; 0x10000
+ subs r0, r5, r0
+ sbcs r0, r4, r1
+ mvnlt r0, r5
+ movlt r0, r0, lsl #16
+ movlt r1, r0, lsr #16
+_037FA9D4:
+ ldr r0, _037FAA08 ; =0x04000104
+ strh r1, [r0]
+ mov r1, #193 ; 0xc1
+ ldr r0, _037FA9FC ; =0x04000106
+ strh r1, [r0]
+ mov r0, #16
+ bl OS_EnableIrqMask
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_037FA9FC: .word 0x04000106
+_037FAA00: .word OSi_AlarmHandler
+_037FAA04: .word 0x0000FFFE
+_037FAA08: .word 0x04000104
diff --git a/arm7/asm/dtcm.s b/arm7/asm/dtcm.s
index a403919a..a78cefc2 100644
--- a/arm7/asm/dtcm.s
+++ b/arm7/asm/dtcm.s
@@ -2,361 +2,6 @@
.include "global.inc"
.section .text
- arm_func_start FUN_037FA540
-FUN_037FA540: ; 0x037FA540
- stmdb sp!, {r0, lr}
- bl FUN_037FA550
- ldmia sp!, {r0, lr}
- bx lr
-
- arm_func_start FUN_037FA550
-FUN_037FA550: ; 0x037FA550
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r1, #0
- ldr r0, _037FA644 ; =0x04000106
- strh r1, [r0]
- mov r0, #16
- bl OS_DisableIrqMask
- ldr r1, _037FA648 ; =0x0380FFF8
- ldr r0, [r1]
- orr r0, r0, #16
- str r0, [r1]
- bl OS_GetTick
- ldr r2, _037FA64C ; =_03807934
- ldr r4, [r2]
- cmp r4, #0
- beq _037FA638
- ldr ip, [r4, #12]
- ldr r3, [r4, #16]
- cmp r1, r3
- cmpeq r0, ip
- bcs _037FA5B0
- mov r0, r4
- bl FUN_037FA970
- b _037FA638
-_037FA5B0:
- ldr r1, [r4, #24]
- str r1, [r2]
- cmp r1, #0
- moveq r0, #0
- streq r0, [r2, #4]
- movne r0, #0
- strne r0, [r1, #20]
- ldr r5, [r4]
- ldr r2, [r4, #28]
- ldr r1, [r4, #32]
- mov r0, #0
- cmp r1, r0
- cmpeq r2, r0
- streq r0, [r4]
- cmp r5, #0
- beq _037FA5FC
- ldr r0, [r4, #4]
- mov lr, pc
- bx r5
-_037FA5FC:
- ldr r2, [r4, #28]
- ldr r0, [r4, #32]
- mov r1, #0
- cmp r0, r1
- cmpeq r2, r1
- beq _037FA624
- str r5, [r4]
- mov r0, r4
- mov r2, r1
- bl FUN_037FA7D0
-_037FA624:
- ldr r0, _037FA64C ; =_03807934
- ldr r0, [r0]
- cmp r0, #0
- beq _037FA638
- bl FUN_037FA970
-_037FA638:
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037FA644: .word 0x04000106
-_037FA648: .word 0x0380FFF8
-_037FA64C: .word _03807934
-
- arm_func_start OS_CancelAlarm
-OS_CancelAlarm: ; 0x037FA650
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- bl OS_DisableInterrupts
- mov r4, r0
- ldr r1, [r5]
- cmp r1, #0
- bne _037FA678
- bl OS_RestoreInterrupts
- b _037FA6D0
-_037FA678:
- ldr r0, [r5, #24]
- cmp r0, #0
- ldreq r2, [r5, #20]
- ldreq r1, _037FA6DC ; =_03807934
- streq r2, [r1, #4]
- ldrne r1, [r5, #20]
- strne r1, [r0, #20]
- ldr r1, [r5, #20]
- cmp r1, #0
- strne r0, [r1, #24]
- bne _037FA6B8
- ldr r1, _037FA6DC ; =_03807934
- str r0, [r1]
- cmp r0, #0
- beq _037FA6B8
- bl FUN_037FA970
-_037FA6B8:
- mov r0, #0
- str r0, [r5]
- str r0, [r5, #28]
- str r0, [r5, #32]
- mov r0, r4
- bl OS_RestoreInterrupts
-_037FA6D0:
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037FA6DC: .word _03807934
-
- arm_func_start OS_SetPeriodicAlarm
-OS_SetPeriodicAlarm: ; 0x037FA6E0
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #4
- movs r4, r0
- mov r9, r1
- mov r8, r2
- mov r7, r3
- ldr r6, [sp, #32]
- beq _037FA70C
- ldr r0, [r4]
- cmp r0, #0
- beq _037FA710
-_037FA70C:
- bl FUN_037FB1F0
-_037FA710:
- bl OS_DisableInterrupts
- mov r5, r0
- str r7, [r4, #28]
- str r6, [r4, #32]
- str r9, [r4, #36] ; 0x24
- str r8, [r4, #40] ; 0x28
- ldr r0, [sp, #36] ; 0x24
- str r0, [r4]
- ldr r0, [sp, #40] ; 0x28
- str r0, [r4, #4]
- mov r0, r4
- mov r1, #0
- mov r2, r1
- bl FUN_037FA7D0
- mov r0, r5
- bl OS_RestoreInterrupts
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-
- arm_func_start OS_SetAlarm
-OS_SetAlarm: ; 0x037FA75C
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- movs r7, r0
- mov r6, r1
- mov r5, r2
- mov r8, r3
- beq _037FA780
- ldr r0, [r7]
- cmp r0, #0
- beq _037FA784
-_037FA780:
- bl FUN_037FB1F0
-_037FA784:
- bl OS_DisableInterrupts
- mov r4, r0
- mov r0, #0
- str r0, [r7, #28]
- str r0, [r7, #32]
- str r8, [r7]
- ldr r0, [sp, #24]
- str r0, [r7, #4]
- bl OS_GetTick
- mov r2, r0
- mov r0, r7
- adds r3, r6, r2
- adc r2, r5, r1
- mov r1, r3
- bl FUN_037FA7D0
- mov r0, r4
- bl OS_RestoreInterrupts
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-
- arm_func_start FUN_037FA7D0
-FUN_037FA7D0: ; 0x037FA7D0
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r8, r0
- mov r7, r1
- mov r6, r2
- ldr r2, [r8, #28]
- ldr r1, [r8, #32]
- mov r0, #0
- cmp r1, r0
- cmpeq r2, r0
- beq _037FA84C
- bl OS_GetTick
- ldr r7, [r8, #36] ; 0x24
- ldr r6, [r8, #40] ; 0x28
- cmp r6, r1
- cmpeq r7, r0
- bcs _037FA84C
- ldr r5, [r8, #28]
- ldr r4, [r8, #32]
- subs r0, r0, r7
- sbc r1, r1, r6
- mov r2, r5
- mov r3, r4
- bl _ll_udiv
- mov r2, #1
- adds r2, r0, r2
- adc r0, r1, #0
- umull r3, r1, r5, r2
- mla r1, r5, r0, r1
- mla r1, r4, r2, r1
- adds r7, r7, r3
- adc r6, r6, r1
-_037FA84C:
- str r7, [r8, #12]
- str r6, [r8, #16]
- ldr r0, _037FA8FC ; =_03807934
- ldr r4, [r0]
- mov r1, #0
- b _037FA8B8
-_037FA864:
- ldr r2, [r4, #12]
- ldr r0, [r4, #16]
- subs r3, r7, r2
- sbc r2, r6, r0
- subs r0, r3, r1
- sbcs r0, r2, r1
- bge _037FA8B4
- ldr r0, [r4, #20]
- str r0, [r8, #20]
- str r8, [r4, #20]
- str r4, [r8, #24]
- ldr r0, [r8, #20]
- cmp r0, #0
- strne r8, [r0, #24]
- bne _037FA8F4
- ldr r0, _037FA8FC ; =_03807934
- str r8, [r0]
- mov r0, r8
- bl FUN_037FA970
- b _037FA8F4
-_037FA8B4:
- ldr r4, [r4, #24]
-_037FA8B8:
- cmp r4, #0
- bne _037FA864
- mov r0, #0
- str r0, [r8, #24]
- ldr r0, _037FA8FC ; =_03807934
- ldr r1, [r0, #4]
- str r8, [r0, #4]
- str r1, [r8, #20]
- cmp r1, #0
- strne r8, [r1, #24]
- bne _037FA8F4
- str r8, [r0, #4]
- str r8, [r0]
- mov r0, r8
- bl FUN_037FA970
-_037FA8F4:
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_037FA8FC: .word _03807934
-
- arm_func_start OS_CreateAlarm
-OS_CreateAlarm: ; 0x037FA900
- mov r1, #0
- str r1, [r0]
- str r1, [r0, #8]
- bx lr
-
- arm_func_start OS_IsAlarmAvailable
-OS_IsAlarmAvailable: ; 0x037FA910
- ldr r0, _037FA91C ; =_03807930
- ldrh r0, [r0]
- bx lr
-_037FA91C: .word _03807930
-
- arm_func_start OS_InitAlarm
-OS_InitAlarm: ; 0x037FA920
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r1, _037FA968 ; =_03807930
- ldrh r0, [r1]
- cmp r0, #0
- bne _037FA95C
- mov r0, #1
- strh r0, [r1]
- bl OSi_SetTimerReserved
- mov r1, #0
- ldr r0, _037FA96C ; =_03807934
- str r1, [r0]
- str r1, [r0, #4]
- mov r0, #16
- bl OS_DisableIrqMask
-_037FA95C:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FA968: .word _03807930
-_037FA96C: .word _03807934
-
- arm_func_start FUN_037FA970
-FUN_037FA970: ; 0x037FA970
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r4, r0
- bl OS_GetTick
- mov r2, #0
- ldr r3, _037FA9FC ; =0x04000106
- strh r2, [r3]
- ldr ip, [r4, #12]
- ldr r3, [r4, #16]
- subs r5, ip, r0
- sbc r4, r3, r1
- mov r0, #1
- ldr r1, _037FAA00 ; =FUN_037FA540
- bl OSi_EnterTimerCallback
- mov r1, #0
- subs r0, r5, r1
- sbcs r0, r4, r1
- ldrlt r1, _037FAA04 ; =0x0000FFFE
- blt _037FA9D4
- mov r0, #65536 ; 0x10000
- subs r0, r5, r0
- sbcs r0, r4, r1
- mvnlt r0, r5
- movlt r0, r0, lsl #16
- movlt r1, r0, lsr #16
-_037FA9D4:
- ldr r0, _037FAA08 ; =0x04000104
- strh r1, [r0]
- mov r1, #193 ; 0xc1
- ldr r0, _037FA9FC ; =0x04000106
- strh r1, [r0]
- mov r0, #16
- bl OS_EnableIrqMask
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037FA9FC: .word 0x04000106
-_037FAA00: .word FUN_037FA540
-_037FAA04: .word 0x0000FFFE
-_037FAA08: .word 0x04000104
-
arm_func_start FUN_037FAA0C
FUN_037FAA0C: ; 0x037FAA0C
stmdb sp!, {r4, lr}
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);