nds_test1

annotate src/startup/arm9entry.s @ 0:ab2afb70001a

initial commit test1 without libnds
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 27 Jan 2018 23:38:00 +0200
parents
children
rev   line source
nuclear@0 1 @ vi:set filetype=armasm:
nuclear@0 2 .arch armv5te
nuclear@0 3 .cpu arm946e-s
nuclear@0 4 .section ".crt0","ax"
nuclear@0 5 .global _start
nuclear@0 6 .align 4
nuclear@0 7 .arm
nuclear@0 8 _start:
nuclear@0 9 mov r0, #0x04000000 @ IME = 0;
nuclear@0 10 str r0, [r0, #0x208]
nuclear@0 11
nuclear@0 12 @ set sensible stacks to allow bios call
nuclear@0 13
nuclear@0 14 mov r0, #0x13 @ Switch to SVC Mode
nuclear@0 15 msr cpsr, r0
nuclear@0 16 mov r1,#0x03000000
nuclear@0 17 sub r1,r1,#0x1000
nuclear@0 18 mov sp,r1
nuclear@0 19 mov r0, #0x1F @ Switch to System Mode
nuclear@0 20 msr cpsr, r0
nuclear@0 21 sub r1,r1,#0x100
nuclear@0 22 mov sp,r1
nuclear@0 23
nuclear@0 24 ldr r3, =mpu_setup
nuclear@0 25 blx r3
nuclear@0 26
nuclear@0 27 mov r0, #0x12 @ Switch to IRQ Mode
nuclear@0 28 msr cpsr, r0
nuclear@0 29 ldr sp, =__sp_irq @ Set IRQ stack
nuclear@0 30
nuclear@0 31 mov r0, #0x13 @ Switch to SVC Mode
nuclear@0 32 msr cpsr, r0
nuclear@0 33 ldr sp, =__sp_svc @ Set SVC stack
nuclear@0 34
nuclear@0 35 mov r0, #0x1F @ Switch to System Mode
nuclear@0 36 msr cpsr, r0
nuclear@0 37 ldr sp, =__sp_usr @ Set user stack
nuclear@0 38
nuclear@0 39 mov r12, #0x4000000 @ Read system ROM status (NTR/TWL)
nuclear@0 40 ldrb r11, [r12,r12,lsr #12]
nuclear@0 41 and r11, r11, #0x3
nuclear@0 42
nuclear@0 43 b skip_sync
nuclear@0 44
nuclear@0 45 mov r9, #(0x0<<8) @ Synchronize with ARM7
nuclear@0 46 str r9, [r12, #0x180]
nuclear@0 47 mov r9, #0x9
nuclear@0 48 bl IPCSync
nuclear@0 49 mov r9, #(0xA<<8)
nuclear@0 50 str r9, [r12, #0x180]
nuclear@0 51 mov r9, #0xB
nuclear@0 52 bl IPCSync
nuclear@0 53 mov r9, #(0xC<<8)
nuclear@0 54 str r9, [r12, #0x180]
nuclear@0 55 mov r9, #0xD
nuclear@0 56 bl IPCSync
nuclear@0 57 mov r9, r11, lsl #8
nuclear@0 58 str r9, [r12, #0x180]
nuclear@0 59 mov r9, #0
nuclear@0 60 bl IPCSync
nuclear@0 61 str r9, [r12, #0x180]
nuclear@0 62
nuclear@0 63 skip_sync:
nuclear@0 64
nuclear@0 65 ldr r1, =__itcm_lma @ Copy instruction tightly coupled memory (itcm section) from LMA to VMA
nuclear@0 66 ldr r2, =__itcm_start
nuclear@0 67 ldr r4, =__itcm_end
nuclear@0 68 bl CopyMemCheck
nuclear@0 69
nuclear@0 70 ldr r1, =__vectors_lma @ Copy reserved vectors area (itcm section) from LMA to VMA
nuclear@0 71 ldr r2, =__vectors_start
nuclear@0 72 ldr r4, =__vectors_end
nuclear@0 73 bl CopyMemCheck
nuclear@0 74
nuclear@0 75 ldr r1, =__dtcm_lma @ Copy data tightly coupled memory (dtcm section) from LMA to VMA
nuclear@0 76 ldr r2, =__dtcm_start
nuclear@0 77 ldr r4, =__dtcm_end
nuclear@0 78 bl CopyMemCheck
nuclear@0 79
nuclear@0 80 cmp r11, #1
nuclear@0 81 ldrne r10, =__end__ @ (DS mode) heap start
nuclear@0 82 ldreq r10, =__twl_end__ @ (DSi mode) heap start
nuclear@0 83
nuclear@0 84 ldr r0, =__bss_start__ @ Clear BSS section
nuclear@0 85 ldr r1, =__bss_end__
nuclear@0 86 sub r1, r1, r0
nuclear@0 87 bl ClearMem
nuclear@0 88
nuclear@0 89 ldr r0, =__sbss_start @ Clear SBSS section
nuclear@0 90 ldr r1, =__sbss_end
nuclear@0 91 sub r1, r1, r0
nuclear@0 92 bl ClearMem
nuclear@0 93
nuclear@0 94 cmp r11, #1
nuclear@0 95 bne NotTWL
nuclear@0 96 ldr r9, =__dsimode @ set DSi mode flag
nuclear@0 97 strb r11, [r9]
nuclear@0 98
nuclear@0 99 @ Copy TWL area (arm9i section) from LMA to VMA
nuclear@0 100 ldr r1, =0x02ffe1c8 @ Get ARM9i LMA from header
nuclear@0 101 ldr r1, [r1]
nuclear@0 102
nuclear@0 103 ldr r2, =__arm9i_start__
nuclear@0 104 cmp r1, r2 @ skip copy if LMA=VMA
nuclear@0 105 ldrne r4, =__arm9i_end__
nuclear@0 106 blne CopyMemCheck
nuclear@0 107
nuclear@0 108 ldr r0, =__twl_bss_start__ @ Clear TWL BSS section
nuclear@0 109 ldr r1, =__twl_bss_end__
nuclear@0 110 sub r1, r1, r0
nuclear@0 111 bl ClearMem
nuclear@0 112
nuclear@0 113 NotTWL:
nuclear@0 114 ldr r0, =__secure_area__
nuclear@0 115 ldr r3, =main
nuclear@0 116 bx r3 @ jump to user code
nuclear@0 117 infloop:
nuclear@0 118 b infloop
nuclear@0 119
nuclear@0 120
nuclear@0 121
nuclear@0 122 @---------------------------------------------------------------------------------
nuclear@0 123 @ Clear memory to 0x00 if length != 0
nuclear@0 124 @ r0 = Start Address
nuclear@0 125 @ r1 = Length
nuclear@0 126 @---------------------------------------------------------------------------------
nuclear@0 127 ClearMem:
nuclear@0 128 @---------------------------------------------------------------------------------
nuclear@0 129 mov r2, #3 @ Round down to nearest word boundary
nuclear@0 130 add r1, r1, r2 @ Shouldn't be needed
nuclear@0 131 bics r1, r1, r2 @ Clear 2 LSB (and set Z)
nuclear@0 132 bxeq lr @ Quit if copy size is 0
nuclear@0 133
nuclear@0 134 mov r2, #0
nuclear@0 135 ClrLoop:
nuclear@0 136 stmia r0!, {r2}
nuclear@0 137 subs r1, r1, #4
nuclear@0 138 bne ClrLoop
nuclear@0 139
nuclear@0 140 bx lr
nuclear@0 141
nuclear@0 142 @---------------------------------------------------------------------------------
nuclear@0 143 @ Copy memory if length != 0
nuclear@0 144 @ r1 = Source Address
nuclear@0 145 @ r2 = Dest Address
nuclear@0 146 @ r4 = Dest Address + Length
nuclear@0 147 @---------------------------------------------------------------------------------
nuclear@0 148 CopyMemCheck:
nuclear@0 149 @---------------------------------------------------------------------------------
nuclear@0 150 sub r3, r4, r2 @ Is there any data to copy?
nuclear@0 151 @---------------------------------------------------------------------------------
nuclear@0 152 @ Copy memory
nuclear@0 153 @ r1 = Source Address
nuclear@0 154 @ r2 = Dest Address
nuclear@0 155 @ r3 = Length
nuclear@0 156 @---------------------------------------------------------------------------------
nuclear@0 157 CopyMem:
nuclear@0 158 @---------------------------------------------------------------------------------
nuclear@0 159 mov r0, #3 @ These commands are used in cases where
nuclear@0 160 add r3, r3, r0 @ the length is not a multiple of 4,
nuclear@0 161 bics r3, r3, r0 @ even though it should be.
nuclear@0 162 bxeq lr @ Length is zero, so exit
nuclear@0 163 CIDLoop:
nuclear@0 164 ldmia r1!, {r0}
nuclear@0 165 stmia r2!, {r0}
nuclear@0 166 subs r3, r3, #4
nuclear@0 167 bne CIDLoop
nuclear@0 168
nuclear@0 169 bx lr
nuclear@0 170
nuclear@0 171 @ Synchronize with ARM7
nuclear@0 172 IPCSync:
nuclear@0 173 ldr r10, [r12, #0x180]
nuclear@0 174 and r10, r10, #0xF
nuclear@0 175 cmp r10, r9
nuclear@0 176 bne IPCSync
nuclear@0 177 bx lr
nuclear@0 178
nuclear@0 179
nuclear@0 180 .align
nuclear@0 181 .pool
nuclear@0 182
nuclear@0 183 .data
nuclear@0 184 .global __dsimode
nuclear@0 185 __dsimode:
nuclear@0 186 .word 0
nuclear@0 187
nuclear@0 188 .section ".secure","a"
nuclear@0 189 .align 2
nuclear@0 190 .global __secure_area__
nuclear@0 191 __secure_area__:
nuclear@0 192 .space 2048, 0