diff options
-rw-r--r-- | arm7/arm7.lsf | 1 | ||||
-rw-r--r-- | arm7/asm/OS_alarm.s | 359 | ||||
-rw-r--r-- | arm7/asm/dtcm.s | 355 | ||||
-rw-r--r-- | arm9/asm/arm9_itcm.s | 60 | ||||
-rw-r--r-- | arm9/global.inc | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_reset.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 1 | ||||
-rw-r--r-- | arm9/lib/src/OS_reset.c | 48 |
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); |