diff options
Diffstat (limited to 'rtl/nds/cprt09.as')
-rw-r--r-- | rtl/nds/cprt09.as | 154 |
1 files changed, 110 insertions, 44 deletions
diff --git a/rtl/nds/cprt09.as b/rtl/nds/cprt09.as index 75bfd6b64c..5807ce289f 100644 --- a/rtl/nds/cprt09.as +++ b/rtl/nds/cprt09.as @@ -1,3 +1,9 @@ +/*-------------------------------------------------------------------------------- + This Source Code Form is subject to the terms of the Mozilla Public License, + v. 2.0. If a copy of the MPL was not distributed with this file, You can + obtain one at https://mozilla.org/MPL/2.0/. +--------------------------------------------------------------------------------*/ + @--------------------------------------------------------------------------------- @ DS processor selection @--------------------------------------------------------------------------------- @@ -8,7 +14,7 @@ .equ _libnds_argv,0x02FFFE70 @--------------------------------------------------------------------------------- - .section ".init" + .section ".crt0","ax" .global _start @--------------------------------------------------------------------------------- .align 4 @@ -16,7 +22,7 @@ @--------------------------------------------------------------------------------- _start: @--------------------------------------------------------------------------------- - mov r0, #0x04000000 @ IME = 0; + mov r0, #0x04000000 @ IME = 0; str r0, [r0, #0x208] @ set sensible stacks to allow bios call @@ -31,7 +37,7 @@ _start: sub r1,r1,#0x100 mov sp,r1 - ldr r3,=__libnds_mpu_setup + ldr r3, =__libnds_mpu_setup blx r3 mov r0, #0x12 @ Switch to IRQ Mode @@ -46,23 +52,47 @@ _start: msr cpsr, r0 ldr sp, =__sp_usr @ Set user stack + mov r12, #0x4000000 @ Read system ROM status (NTR/TWL) + ldrb r11, [r12,r12,lsr #12] + and r11, r11, #0x3 + + mov r9, #(0x0<<8) @ Synchronize with ARM7 + str r9, [r12, #0x180] + mov r9, #0x9 + bl IPCSync + mov r9, #(0xA<<8) + str r9, [r12, #0x180] + mov r9, #0xB + bl IPCSync + mov r9, #(0xC<<8) + str r9, [r12, #0x180] + mov r9, #0xD + bl IPCSync + mov r9, r11, lsl #8 + str r9, [r12, #0x180] + mov r9, #0 + bl IPCSync + str r9, [r12, #0x180] + ldr r1, =__itcm_lma @ Copy instruction tightly coupled memory (itcm section) from LMA to VMA ldr r2, =__itcm_start ldr r4, =__itcm_end bl CopyMemCheck - ldr r1, =__vectors_lma @ Copy reserved vectors area (itcm section) from LMA to VMA - ldr r2, =__vectors_start - ldr r4, =__vectors_end - - bl CopyMemCheck + ldr r1, =__vectors_lma @ Copy reserved vectors area (itcm section) from LMA to VMA + ldr r2, =__vectors_start + ldr r4, =__vectors_end + bl CopyMemCheck ldr r1, =__dtcm_lma @ Copy data tightly coupled memory (dtcm section) from LMA to VMA ldr r2, =__dtcm_start ldr r4, =__dtcm_end bl CopyMemCheck - bl checkARGV @ check and process argv trickery + cmp r11, #1 + ldrne r10, =__end__ @ (DS mode) heap start + ldreq r10, =__twl_end__ @ (DSi mode) heap start + bl checkARGV @ check and process argv trickery ldr r0, =__bss_start__ @ Clear BSS section ldr r1, =__bss_end__ @@ -73,64 +103,88 @@ _start: ldr r1, =__sbss_end sub r1, r1, r0 bl ClearMem - - ldr r0, =_libnds_argv + + cmp r11, #1 + bne NotTWL + ldr r9, =__dsimode @ set DSi mode flag + strb r11, [r9] + + @ Copy TWL area (arm9i section) from LMA to VMA + ldr r1, =0x02ffe1c8 @ Get ARM9i LMA from header + ldr r1, [r1] + + ldr r2, =__arm9i_start__ + cmp r1, r2 @ skip copy if LMA=VMA + ldrne r4, =__arm9i_end__ + blne CopyMemCheck + + ldr r0, =__twl_bss_start__ @ Clear TWL BSS section + ldr r1, =__twl_bss_end__ + sub r1, r1, r0 + bl ClearMem + +NotTWL: + ldr r0, =_libnds_argv @ reset heap base - ldr r2, [r0,#20] @ newheap base - ldr r1,=fake_heap_start - str r2,[r1] + ldr r2, [r0,#20] @ newheap base + cmp r2, #0 + moveq r2, r10 + ldr r1, =fake_heap_start @ set heap start + str r2, [r1] ldr r1, =fake_heap_end @ set heap end - sub r8,r8,#0xc000 + sub r8, r8,#0xc000 str r8, [r1] - push {r0} - ldr r3, =initSystem - blx r3 @ system initialisation - ldr r3, =__libc_init_array @ global constructors - blx r3 - pop {r0} + push {r0} + ldr r0, =__secure_area__ + ldr r3, =initSystem + blx r3 @ system initialisation + + ldr r3, =__libc_init_array @ global constructors + blx r3 - ldr r1, [r0,#16] @ argv - ldr r0, [r0,#12] @ argc + pop {r0} + ldr r1, [r0,#16] @ argv + ldr r0, [r0,#12] @ argc ldr r3, =main - ldr lr,=__libnds_exit + ldr lr, =__libnds_exit bx r3 @ jump to user code @--------------------------------------------------------------------------------- -@ check for a commandline +@ check for a commandline @--------------------------------------------------------------------------------- checkARGV: @--------------------------------------------------------------------------------- - ldr r0, =_libnds_argv @ argv structure + ldr r0, =_libnds_argv @ argv structure mov r1, #0 - str r1, [r0,#12] @ clear argc - str r1, [r0,#16] @ clear argv - + str r1, [r0,#12] @ clear argc + str r1, [r0,#16] @ clear argv + ldr r3, [r0] @ argv magic number ldr r2, =0x5f617267 @ '_arg' cmp r3, r2 - strne r1,[r0,#20] - bxne lr @ bail out if no magic - - ldr r1, [r0, #4] @ command line address - ldr r2, [r0, #8] @ length of command line + strne r1, [r0,#20] + bxne lr @ bail out if no magic + + ldr r1, [r0, #4] @ command line address + ldr r2, [r0, #8] @ length of command line @ copy to heap - ldr r3, =__end__ @ initial heap base - str r3, [r0, #4] @ set command line address - - cmp r2, #0 - subnes r4, r3, r1 @ dst-src - bxeq lr @ dst == src || len==0 : nothing to do. + mov r3, r10 @ initial heap base + str r3, [r0, #4] @ set command line address - cmphi r2, r4 @ len > (dst-src) + cmp r2, #0 + subnes r4, r3, r1 @ dst-src + bxeq lr @ dst == src || len==0 : nothing to do. + + cmphi r2, r4 @ len > (dst-src) bhi .copybackward -.copyforward: +.copyforward: ldrb r4, [r1], #1 strb r4, [r3], #1 subs r2, r2, #1 @@ -148,7 +202,7 @@ checkARGV: ldr r3, =build_argv blx r3 pop {lr} - bx lr + bx lr @--------------------------------------------------------------------------------- @@ -199,8 +253,20 @@ CIDLoop: bne CIDLoop bx lr + +@--------------------------------------------------------------------------------- +@ Synchronize with ARM7 +@--------------------------------------------------------------------------------- +IPCSync: +@--------------------------------------------------------------------------------- + ldr r10, [r12, #0x180] + and r10, r10, #0xF + cmp r10, r9 + bne IPCSync + bx lr + @--------------------------------------------------------------------------------- .align .pool .end -@--------------------------------------------------------------------------------- +@---------------------------------------------------------------------------------
\ No newline at end of file |