prt09.as 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. @---------------------------------------------------------------------------------
  2. @ DS processor selection
  3. @---------------------------------------------------------------------------------
  4. .arch armv5te
  5. .cpu arm946e-s
  6. @---------------------------------------------------------------------------------
  7. .equ _libnds_argv,0x02FFFE70
  8. @---------------------------------------------------------------------------------
  9. .section ".init"
  10. .global _start
  11. @---------------------------------------------------------------------------------
  12. .align 4
  13. .arm
  14. @---------------------------------------------------------------------------------
  15. _start:
  16. @---------------------------------------------------------------------------------
  17. mov r0, #0x04000000 @ IME = 0;
  18. str r0, [r0, #0x208]
  19. @ set sensible stacks to allow bios call
  20. mov r0, #0x13 @ Switch to SVC Mode
  21. msr cpsr, r0
  22. mov r1,#0x03000000
  23. sub r1,r1,#0x1000
  24. mov sp,r1
  25. mov r0, #0x1F @ Switch to System Mode
  26. msr cpsr, r0
  27. sub r1,r1,#0x100
  28. mov sp,r1
  29. ldr r3,=__libnds_mpu_setup
  30. blx r3
  31. mov r0, #0x12 @ Switch to IRQ Mode
  32. msr cpsr, r0
  33. ldr sp, =__sp_irq @ Set IRQ stack
  34. mov r0, #0x13 @ Switch to SVC Mode
  35. msr cpsr, r0
  36. ldr sp, =__sp_svc @ Set SVC stack
  37. mov r0, #0x1F @ Switch to System Mode
  38. msr cpsr, r0
  39. ldr sp, =__sp_usr @ Set user stack
  40. ldr r1, =__itcm_lma @ Copy instruction tightly coupled memory (itcm section) from LMA to VMA (ROM to RAM)
  41. ldr r2, =__itcm_start
  42. ldr r4, =__itcm_end
  43. bl CopyMemCheck
  44. ldr r1, =__vectors_lma @ Copy reserved vectors area (itcm section) from LMA to VMA
  45. ldr r2, =__vectors_start
  46. ldr r4, =__vectors_end
  47. bl CopyMemCheck
  48. ldr r1, =__dtcm_lma @ Copy data tightly coupled memory (dtcm section) from LMA to VMA
  49. ldr r2, =__dtcm_start
  50. ldr r4, =__dtcm_end
  51. bl CopyMemCheck
  52. bl checkARGV @ check and process argv trickery
  53. ldr r0, =__bss_start__ @ Clear BSS section
  54. ldr r1, =__bss_end__
  55. sub r1, r1, r0
  56. bl ClearMem
  57. ldr r0, =__sbss_start @ Clear SBSS section
  58. ldr r1, =__sbss_end
  59. sub r1, r1, r0
  60. bl ClearMem
  61. ldr r0, =_libnds_argv
  62. @ reset heap base
  63. ldr r2, [r0,#20] @ newheap base
  64. ldr r1,=fake_heap_start
  65. str r2,[r1]
  66. ldr r1, =fake_heap_end @ set heap end
  67. sub r8,r8,#0xc000
  68. str r8, [r1]
  69. push {r0}
  70. ldr r3, =initSystem
  71. blx r3 @ system initialisation
  72. @ ldr r3, =__libc_init_array @ global constructors
  73. @ blx r3
  74. pop {r0}
  75. ldr r1, [r0,#16] @ argv
  76. ldr r0, [r0,#12] @ argc
  77. ldr r3, =main
  78. ldr lr,=__libnds_exit
  79. bx r3 @ jump to user code
  80. @---------------------------------------------------------------------------------
  81. @ check for a commandline
  82. @---------------------------------------------------------------------------------
  83. checkARGV:
  84. @---------------------------------------------------------------------------------
  85. ldr r0, =_libnds_argv @ argv structure
  86. mov r1, #0
  87. str r1, [r0,#12] @ clear argc
  88. str r1, [r0,#16] @ clear argv
  89. ldr r3, [r0] @ argv magic number
  90. ldr r2, =0x5f617267 @ '_arg'
  91. cmp r3, r2
  92. strne r1,[r0,#20]
  93. bxne lr @ bail out if no magic
  94. ldr r1, [r0, #4] @ command line address
  95. ldr r2, [r0, #8] @ length of command line
  96. @ copy to heap
  97. ldr r3, =__end__ @ initial heap base
  98. str r3, [r0, #4] @ set command line address
  99. cmp r2, #0
  100. subnes r4, r3, r1 @ dst-src
  101. bxeq lr @ dst == src || len==0 : nothing to do.
  102. cmphi r2, r4 @ len > (dst-src)
  103. bhi .copybackward
  104. .copyforward:
  105. ldrb r4, [r1], #1
  106. strb r4, [r3], #1
  107. subs r2, r2, #1
  108. bne .copyforward
  109. b .copydone
  110. .copybackward:
  111. subs r2, r2, #1
  112. ldrb r4, [r1, r2]
  113. strb r4, [r3, r2]
  114. bne .copybackward
  115. .copydone:
  116. push {lr}
  117. ldr r3, =build_argv
  118. blx r3
  119. pop {lr}
  120. bx lr
  121. @---------------------------------------------------------------------------------
  122. @ Clear memory to 0x00 if length != 0
  123. @ r0 = Start Address
  124. @ r1 = Length
  125. @---------------------------------------------------------------------------------
  126. ClearMem:
  127. @---------------------------------------------------------------------------------
  128. mov r2, #3 @ Round down to nearest word boundary
  129. add r1, r1, r2 @ Shouldn't be needed
  130. bics r1, r1, r2 @ Clear 2 LSB (and set Z)
  131. bxeq lr @ Quit if copy size is 0
  132. mov r2, #0
  133. ClrLoop:
  134. stmia r0!, {r2}
  135. subs r1, r1, #4
  136. bne ClrLoop
  137. bx lr
  138. @---------------------------------------------------------------------------------
  139. @ Copy memory if length != 0
  140. @ r1 = Source Address
  141. @ r2 = Dest Address
  142. @ r4 = Dest Address + Length
  143. @---------------------------------------------------------------------------------
  144. CopyMemCheck:
  145. @---------------------------------------------------------------------------------
  146. sub r3, r4, r2 @ Is there any data to copy?
  147. @---------------------------------------------------------------------------------
  148. @ Copy memory
  149. @ r1 = Source Address
  150. @ r2 = Dest Address
  151. @ r3 = Length
  152. @---------------------------------------------------------------------------------
  153. CopyMem:
  154. @---------------------------------------------------------------------------------
  155. mov r0, #3 @ These commands are used in cases where
  156. add r3, r3, r0 @ the length is not a multiple of 4,
  157. bics r3, r3, r0 @ even though it should be.
  158. bxeq lr @ Length is zero, so exit
  159. CIDLoop:
  160. ldmia r1!, {r0}
  161. stmia r2!, {r0}
  162. subs r3, r3, #4
  163. bne CIDLoop
  164. bx lr
  165. @---------------------------------------------------------------------------------
  166. .align
  167. .pool
  168. .end
  169. @---------------------------------------------------------------------------------