62 lines
1.7 KiB
ArmAsm
62 lines
1.7 KiB
ArmAsm
|
|
||
|
.arm
|
||
|
@---------------------------------------------------------------------------------
|
||
|
.global swi_SoftReset
|
||
|
.type swi_SoftReset STT_FUNC
|
||
|
swi_SoftReset:
|
||
|
@---------------------------------------------------------------------------------
|
||
|
mov r3, #0x04000000
|
||
|
@ Read flag from 0x3007FFA
|
||
|
@ 00h=8000000h (ROM), or 01h-FFh=2000000h (RAM)
|
||
|
@ This must be done before init because it gets cleared in init
|
||
|
ldrb r2, [r3,#-6]
|
||
|
bl init
|
||
|
cmp r2, #0
|
||
|
ldmdb r3, {r0-r12}
|
||
|
movne lr, #0x02000000
|
||
|
moveq lr, #0x08000000
|
||
|
mov r0, #0x1F
|
||
|
msr cpsr_cf, r0
|
||
|
mov r0, #0
|
||
|
bx lr
|
||
|
|
||
|
@---------------------------------------------------------------------------------
|
||
|
.global init
|
||
|
init:
|
||
|
@ Requires r3 to be set to 0x04000000 already.
|
||
|
@---------------------------------------------------------------------------------
|
||
|
@ Reset the stack locations
|
||
|
mov r0, #0xD3
|
||
|
msr cpsr_cf, r0
|
||
|
ldr sp, Cpu_Stack_SVC
|
||
|
mov lr, #0
|
||
|
msr spsr_cf, lr
|
||
|
mov r0, #0xD2
|
||
|
msr cpsr_cf, r0
|
||
|
ldr sp, Cpu_Stack_IRQ
|
||
|
mov lr, #0
|
||
|
msr spsr_cf, lr
|
||
|
mov r0, #0x5F
|
||
|
msr cpsr_cf, r0
|
||
|
ldr sp, Cpu_Stack_USR
|
||
|
|
||
|
movs r0, #0
|
||
|
subs r1, r0, #0x200
|
||
|
|
||
|
@ Clear top 0x200 bytes of IWRAM 03007E00 -> 03008000
|
||
|
|
||
|
init_loop:
|
||
|
str r0, [r3,r1]
|
||
|
adds r1, r1, #4
|
||
|
blt init_loop
|
||
|
|
||
|
bx lr
|
||
|
|
||
|
@---------------------------------------------------------------------------------
|
||
|
@---------------------------------------------------------------------------------
|
||
|
|
||
|
Cpu_Stack_USR: .word 0x03007F00
|
||
|
Cpu_Stack_IRQ: .word 0x03007FA0
|
||
|
Cpu_Stack_SVC: .word 0x03007FE0
|
||
|
|
||
|
@---------------------------------------------------------------------------------
|