prt09.as 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. @---------------------------------------------------------------------------------
  2. .section ".init"
  3. .global _start
  4. @---------------------------------------------------------------------------------
  5. .align 4
  6. .arm
  7. @---------------------------------------------------------------------------------
  8. _start:
  9. @---------------------------------------------------------------------------------
  10. mov r0, #0x04000000 @ IME = 0;
  11. str r0, [r0, #0x208]
  12. @---------------------------------------------------------------------------------
  13. @ turn the power on for M3
  14. @---------------------------------------------------------------------------------
  15. ldr r1, =0x8203
  16. add r0,r0,#0x304
  17. strh r1, [r0]
  18. ldr r1, =0x00002078 @ disable TCM and protection unit
  19. mcr p15, 0, r1, c1, c0
  20. @---------------------------------------------------------------------------------
  21. @ Protection Unit Setup added by Sasq
  22. @---------------------------------------------------------------------------------
  23. @ Disable cache
  24. mov r0, #0
  25. mcr p15, 0, r0, c7, c5, 0 @ Instruction cache
  26. mcr p15, 0, r0, c7, c6, 0 @ Data cache
  27. @ Wait for write buffer to empty
  28. mcr p15, 0, r0, c7, c10, 4
  29. ldr r0, =__dtcm_start
  30. orr r0,r0,#0x0a
  31. mcr p15, 0, r0, c9, c1,0 @ DTCM base = __dtcm_start, size = 16 KB
  32. mov r0,#0x20
  33. mcr p15, 0, r0, c9, c1,1 @ ITCM base = 0 , size = 32 MB
  34. @---------------------------------------------------------------------------------
  35. @ Setup memory regions similar to Release Version
  36. @---------------------------------------------------------------------------------
  37. @-------------------------------------------------------------------------
  38. @ Region 0 - IO registers
  39. @-------------------------------------------------------------------------
  40. ldr r0,=( (0b11001 << 1) | 0x04000000 | 1)
  41. mcr p15, 0, r0, c6, c0, 0
  42. @-------------------------------------------------------------------------
  43. @ Region 1 - Main Memory
  44. @-------------------------------------------------------------------------
  45. ldr r0,=( (0b10101 << 1) | 0x02000000 | 1)
  46. mcr p15, 0, r0, c6, c1, 0
  47. @-------------------------------------------------------------------------
  48. @ Region 2 - iwram
  49. @-------------------------------------------------------------------------
  50. ldr r0,=( (0b01110 << 1) | 0x037F8000 | 1)
  51. mcr p15, 0, r0, c6, c2, 0
  52. @-------------------------------------------------------------------------
  53. @ Region 3 - DS Accessory (GBA Cart)
  54. @-------------------------------------------------------------------------
  55. ldr r0,=( (0b11010 << 1) | 0x08000000 | 1)
  56. mcr p15, 0, r0, c6, c3, 0
  57. @-------------------------------------------------------------------------
  58. @ Region 4 - DTCM
  59. @-------------------------------------------------------------------------
  60. ldr r0,=__dtcm_start
  61. orr r0,r0,#((0b01101 << 1) | 1)
  62. mcr p15, 0, r0, c6, c4, 0
  63. @-------------------------------------------------------------------------
  64. @ Region 5 - ITCM
  65. @-------------------------------------------------------------------------
  66. ldr r0,=__itcm_start
  67. orr r0,r0,#((0b01110 << 1) | 1)
  68. mcr p15, 0, r0, c6, c5, 0
  69. @-------------------------------------------------------------------------
  70. @ Region 6 - System ROM
  71. @-------------------------------------------------------------------------
  72. ldr r0,=( (0b01110 << 1) | 0xFFFF0000 | 1)
  73. mcr p15, 0, r0, c6, c6, 0
  74. @-------------------------------------------------------------------------
  75. @ Region 7 - non cacheable main ram
  76. @-------------------------------------------------------------------------
  77. ldr r0,=( (0b10101 << 1) | 0x02400000 | 1)
  78. mcr p15, 0, r0, c6, c7, 0
  79. @-------------------------------------------------------------------------
  80. @ Write buffer enable
  81. @-------------------------------------------------------------------------
  82. ldr r0,=0b00000110
  83. mcr p15, 0, r0, c3, c0, 0
  84. @-------------------------------------------------------------------------
  85. @ DCache & ICache enable
  86. @-------------------------------------------------------------------------
  87. ldr r0,=0b01000110
  88. ldr r0,=0x42
  89. mcr p15, 0, r0, c2, c0, 0
  90. mcr p15, 0, r0, c2, c0, 1
  91. @-------------------------------------------------------------------------
  92. @ IAccess
  93. @-------------------------------------------------------------------------
  94. ldr r0,=0x36636333
  95. mcr p15, 0, r0, c5, c0, 3
  96. @-------------------------------------------------------------------------
  97. @ DAccess
  98. @-------------------------------------------------------------------------
  99. ldr r0,=0x36333333
  100. mcr p15, 0, r0, c5, c0, 2
  101. @-------------------------------------------------------------------------
  102. @ Enable ICache, DCache, ITCM & DTCM
  103. @-------------------------------------------------------------------------
  104. mrc p15, 0, r0, c1, c0, 0
  105. ldr r1,= (1<<18) | (1<<16) | (1<<12) | (1<<2) | (1<<0)
  106. orr r0,r0,r1
  107. mcr p15, 0, r0, c1, c0, 0
  108. mov r0, #0x12 @ Switch to IRQ Mode
  109. msr cpsr, r0
  110. ldr sp, =__sp_irq @ Set IRQ stack
  111. mov r0, #0x13 @ Switch to SVC Mode
  112. msr cpsr, r0
  113. ldr sp, =__sp_svc @ Set SVC stack
  114. mov r0, #0x1F @ Switch to System Mode
  115. msr cpsr, r0
  116. ldr sp, =__sp_usr @ Set user stack
  117. ldr r1, =__itcm_lma @ Copy instruction tightly coupled memory (itcm section) from LMA to VMA (ROM to RAM)
  118. ldr r2, =__itcm_start
  119. ldr r4, =__itcm_end
  120. bl CopyMemCheck
  121. ldr r1, =__dtcm_lma @ Copy data tightly coupled memory (dtcm section) from LMA to VMA (ROM to RAM)
  122. ldr r2, =__dtcm_start
  123. ldr r4, =__dtcm_end
  124. bl CopyMemCheck
  125. ldr r0, =__bss_start @ Clear BSS section
  126. ldr r1, =__bss_end
  127. sub r1, r1, r0
  128. bl ClearMem
  129. ldr r0, =__sbss_start @ Clear SBSS section
  130. ldr r1, =__sbss_end
  131. sub r1, r1, r0
  132. bl ClearMem
  133. ldr r1, =fake_heap_end @ set heap end
  134. ldr r0, =__eheap_end
  135. str r0, [r1]
  136. mov r0, #0 @ int argc
  137. mov r1, #0 @ char *argv[]
  138. ldr r3, =main
  139. bx r3
  140. nop
  141. @ If the user ever returns, go to an infinte loop
  142. ldr r0, =ILoop
  143. ldr r0, [r0]
  144. ldr r1, =0x027FFE78
  145. str r0, [r1]
  146. bx r1
  147. ILoop:
  148. b ILoop
  149. @---------------------------------------------------------------------------------
  150. @---------------------------------------------------------------------------------
  151. @ Clear memory to 0x00 if length != 0
  152. @ r0 = Start Address
  153. @ r1 = Length
  154. @---------------------------------------------------------------------------------
  155. ClearMem:
  156. @---------------------------------------------------------------------------------
  157. mov r2, #3 @ Round down to nearest word boundary
  158. add r1, r1, r2 @ Shouldn't be needed
  159. bics r1, r1, r2 @ Clear 2 LSB (and set Z)
  160. bxeq lr @ Quit if copy size is 0
  161. mov r2, #0
  162. ClrLoop:
  163. stmia r0!, {r2}
  164. subs r1, r1, #4
  165. bne ClrLoop
  166. bx lr
  167. @---------------------------------------------------------------------------------
  168. @ Copy memory if length != 0
  169. @ r1 = Source Address
  170. @ r2 = Dest Address
  171. @ r4 = Dest Address + Length
  172. @---------------------------------------------------------------------------------
  173. CopyMemCheck:
  174. @---------------------------------------------------------------------------------
  175. sub r3, r4, r2 @ Is there any data to copy?
  176. @---------------------------------------------------------------------------------
  177. @ Copy memory
  178. @ r1 = Source Address
  179. @ r2 = Dest Address
  180. @ r3 = Length
  181. @---------------------------------------------------------------------------------
  182. CopyMem:
  183. @---------------------------------------------------------------------------------
  184. mov r0, #3 @ These commands are used in cases where
  185. add r3, r3, r0 @ the length is not a multiple of 4,
  186. bics r3, r3, r0 @ even though it should be.
  187. bxeq lr @ Length is zero, so exit
  188. CIDLoop:
  189. ldmia r1!, {r0}
  190. stmia r2!, {r0}
  191. subs r3, r3, #4
  192. bne CIDLoop
  193. bx lr
  194. @---------------------------------------------------------------------------------
  195. .align
  196. .pool
  197. .end
  198. @---------------------------------------------------------------------------------