prt09.as 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. /*--------------------------------------------------------------------------------
  2. This Source Code Form is subject to the terms of the Mozilla Public License,
  3. v. 2.0. If a copy of the MPL was not distributed with this file, You can
  4. obtain one at https://mozilla.org/MPL/2.0/.
  5. --------------------------------------------------------------------------------*/
  6. @---------------------------------------------------------------------------------
  7. @ DS processor selection
  8. @---------------------------------------------------------------------------------
  9. .arch armv5te
  10. .cpu arm946e-s
  11. @---------------------------------------------------------------------------------
  12. .equ _libnds_argv,0x02FFFE70
  13. @---------------------------------------------------------------------------------
  14. .section ".crt0","ax"
  15. .global _start
  16. @---------------------------------------------------------------------------------
  17. .align 4
  18. .arm
  19. @---------------------------------------------------------------------------------
  20. _start:
  21. @---------------------------------------------------------------------------------
  22. mov r0, #0x04000000 @ IME = 0;
  23. str r0, [r0, #0x208]
  24. @ set sensible stacks to allow bios call
  25. mov r0, #0x13 @ Switch to SVC Mode
  26. msr cpsr, r0
  27. mov r1,#0x03000000
  28. sub r1,r1,#0x1000
  29. mov sp,r1
  30. mov r0, #0x1F @ Switch to System Mode
  31. msr cpsr, r0
  32. sub r1,r1,#0x100
  33. mov sp,r1
  34. ldr r3, =__libnds_mpu_setup
  35. blx r3
  36. mov r0, #0x12 @ Switch to IRQ Mode
  37. msr cpsr, r0
  38. ldr sp, =__sp_irq @ Set IRQ stack
  39. mov r0, #0x13 @ Switch to SVC Mode
  40. msr cpsr, r0
  41. ldr sp, =__sp_svc @ Set SVC stack
  42. mov r0, #0x1F @ Switch to System Mode
  43. msr cpsr, r0
  44. ldr sp, =__sp_usr @ Set user stack
  45. mov r12, #0x4000000 @ Read system ROM status (NTR/TWL)
  46. ldrb r11, [r12,r12,lsr #12]
  47. and r11, r11, #0x3
  48. mov r9, #(0x0<<8) @ Synchronize with ARM7
  49. str r9, [r12, #0x180]
  50. mov r9, #0x9
  51. bl IPCSync
  52. mov r9, #(0xA<<8)
  53. str r9, [r12, #0x180]
  54. mov r9, #0xB
  55. bl IPCSync
  56. mov r9, #(0xC<<8)
  57. str r9, [r12, #0x180]
  58. mov r9, #0xD
  59. bl IPCSync
  60. mov r9, r11, lsl #8
  61. str r9, [r12, #0x180]
  62. mov r9, #0
  63. bl IPCSync
  64. str r9, [r12, #0x180]
  65. ldr r1, =__itcm_lma @ Copy instruction tightly coupled memory (itcm section) from LMA to VMA
  66. ldr r2, =__itcm_start
  67. ldr r4, =__itcm_end
  68. bl CopyMemCheck
  69. ldr r1, =__vectors_lma @ Copy reserved vectors area (itcm section) from LMA to VMA
  70. ldr r2, =__vectors_start
  71. ldr r4, =__vectors_end
  72. bl CopyMemCheck
  73. ldr r1, =__dtcm_lma @ Copy data tightly coupled memory (dtcm section) from LMA to VMA
  74. ldr r2, =__dtcm_start
  75. ldr r4, =__dtcm_end
  76. bl CopyMemCheck
  77. cmp r11, #1
  78. ldrne r10, =__end__ @ (DS mode) heap start
  79. ldreq r10, =__twl_end__ @ (DSi mode) heap start
  80. bl checkARGV @ check and process argv trickery
  81. ldr r0, =__bss_start__ @ Clear BSS section
  82. ldr r1, =__bss_end__
  83. sub r1, r1, r0
  84. bl ClearMem
  85. ldr r0, =__sbss_start @ Clear SBSS section
  86. ldr r1, =__sbss_end
  87. sub r1, r1, r0
  88. bl ClearMem
  89. cmp r11, #1
  90. bne NotTWL
  91. ldr r9, =__dsimode @ set DSi mode flag
  92. strb r11, [r9]
  93. @ Copy TWL area (arm9i section) from LMA to VMA
  94. ldr r1, =0x02ffe1c8 @ Get ARM9i LMA from header
  95. ldr r1, [r1]
  96. ldr r2, =__arm9i_start__
  97. cmp r1, r2 @ skip copy if LMA=VMA
  98. ldrne r4, =__arm9i_end__
  99. blne CopyMemCheck
  100. ldr r0, =__twl_bss_start__ @ Clear TWL BSS section
  101. ldr r1, =__twl_bss_end__
  102. sub r1, r1, r0
  103. bl ClearMem
  104. NotTWL:
  105. ldr r0, =_libnds_argv
  106. @ reset heap base
  107. ldr r2, [r0,#20] @ newheap base
  108. cmp r2, #0
  109. moveq r2, r10
  110. ldr r1, =fake_heap_start @ set heap start
  111. str r2, [r1]
  112. ldr r1, =fake_heap_end @ set heap end
  113. sub r8, r8,#0xc000
  114. str r8, [r1]
  115. push {r0}
  116. ldr r0, =__secure_area__
  117. ldr r3, =initSystem
  118. blx r3 @ system initialisation
  119. ldr r3, =__libc_init_array @ global constructors
  120. blx r3
  121. pop {r0}
  122. ldr r1, [r0,#16] @ argv
  123. ldr r0, [r0,#12] @ argc
  124. ldr r3, =main
  125. ldr lr, =__libnds_exit
  126. bx r3 @ jump to user code
  127. @---------------------------------------------------------------------------------
  128. @ check for a commandline
  129. @---------------------------------------------------------------------------------
  130. checkARGV:
  131. @---------------------------------------------------------------------------------
  132. ldr r0, =_libnds_argv @ argv structure
  133. mov r1, #0
  134. str r1, [r0,#12] @ clear argc
  135. str r1, [r0,#16] @ clear argv
  136. ldr r3, [r0] @ argv magic number
  137. ldr r2, =0x5f617267 @ '_arg'
  138. cmp r3, r2
  139. strne r1, [r0,#20]
  140. bxne lr @ bail out if no magic
  141. ldr r1, [r0, #4] @ command line address
  142. ldr r2, [r0, #8] @ length of command line
  143. @ copy to heap
  144. mov r3, r10 @ initial heap base
  145. str r3, [r0, #4] @ set command line address
  146. cmp r2, #0
  147. subnes r4, r3, r1 @ dst-src
  148. bxeq lr @ dst == src || len==0 : nothing to do.
  149. cmphi r2, r4 @ len > (dst-src)
  150. bhi .copybackward
  151. .copyforward:
  152. ldrb r4, [r1], #1
  153. strb r4, [r3], #1
  154. subs r2, r2, #1
  155. bne .copyforward
  156. b .copydone
  157. .copybackward:
  158. subs r2, r2, #1
  159. ldrb r4, [r1, r2]
  160. strb r4, [r3, r2]
  161. bne .copybackward
  162. .copydone:
  163. push {lr}
  164. ldr r3, =build_argv
  165. blx r3
  166. pop {lr}
  167. bx lr
  168. @---------------------------------------------------------------------------------
  169. @ Clear memory to 0x00 if length != 0
  170. @ r0 = Start Address
  171. @ r1 = Length
  172. @---------------------------------------------------------------------------------
  173. ClearMem:
  174. @---------------------------------------------------------------------------------
  175. mov r2, #3 @ Round down to nearest word boundary
  176. add r1, r1, r2 @ Shouldn't be needed
  177. bics r1, r1, r2 @ Clear 2 LSB (and set Z)
  178. bxeq lr @ Quit if copy size is 0
  179. mov r2, #0
  180. ClrLoop:
  181. stmia r0!, {r2}
  182. subs r1, r1, #4
  183. bne ClrLoop
  184. bx lr
  185. @---------------------------------------------------------------------------------
  186. @ Copy memory if length != 0
  187. @ r1 = Source Address
  188. @ r2 = Dest Address
  189. @ r4 = Dest Address + Length
  190. @---------------------------------------------------------------------------------
  191. CopyMemCheck:
  192. @---------------------------------------------------------------------------------
  193. sub r3, r4, r2 @ Is there any data to copy?
  194. @---------------------------------------------------------------------------------
  195. @ Copy memory
  196. @ r1 = Source Address
  197. @ r2 = Dest Address
  198. @ r3 = Length
  199. @---------------------------------------------------------------------------------
  200. CopyMem:
  201. @---------------------------------------------------------------------------------
  202. mov r0, #3 @ These commands are used in cases where
  203. add r3, r3, r0 @ the length is not a multiple of 4,
  204. bics r3, r3, r0 @ even though it should be.
  205. bxeq lr @ Length is zero, so exit
  206. CIDLoop:
  207. ldmia r1!, {r0}
  208. stmia r2!, {r0}
  209. subs r3, r3, #4
  210. bne CIDLoop
  211. bx lr
  212. @---------------------------------------------------------------------------------
  213. @ Synchronize with ARM7
  214. @---------------------------------------------------------------------------------
  215. IPCSync:
  216. @---------------------------------------------------------------------------------
  217. ldr r10, [r12, #0x180]
  218. and r10, r10, #0xF
  219. cmp r10, r9
  220. bne IPCSync
  221. bx lr
  222. @---------------------------------------------------------------------------------
  223. .align
  224. .pool
  225. .end
  226. @---------------------------------------------------------------------------------