cprt07.as 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. .section ".crt0","ax"
  8. .global _start
  9. @---------------------------------------------------------------------------------
  10. .align 4
  11. .arm
  12. @---------------------------------------------------------------------------------
  13. _start:
  14. @---------------------------------------------------------------------------------
  15. mov r0, #0x04000000 @ IME = 0;
  16. mov r1, #0
  17. str r1, [r0, #0x208]
  18. mov r0, #0x12 @ Switch to IRQ Mode
  19. msr cpsr, r0
  20. ldr sp, =__sp_irq @ Set IRQ stack
  21. mov r0, #0x13 @ Switch to SVC Mode
  22. msr cpsr, r0
  23. ldr sp, =__sp_svc @ Set SVC stack
  24. mov r0, #0x1F @ Switch to System Mode
  25. msr cpsr, r0
  26. ldr sp, =__sp_usr @ Set user stack
  27. #ifndef VRAM
  28. adr r1, __sync_start @ Perform ARM7<->ARM9 sync code
  29. ldr r2, =__arm7_start__
  30. mov r3, #(__sync_end-__sync_start)
  31. mov r8, r2
  32. bl CopyMem
  33. mov r3, r8
  34. bl _blx_r3_stub
  35. @---------------------------------------------------------------------------------
  36. @ Copy arm7 binary from LMA to VMA (EWRAM to IWRAM)
  37. @---------------------------------------------------------------------------------
  38. adr r0, arm7lma @ Calculate ARM7 LMA
  39. ldr r1, [r0]
  40. add r1, r1, r0
  41. ldr r2, =__arm7_start__
  42. ldr r4, =__arm7_end__
  43. bl CopyMemCheck
  44. #else
  45. bl __sync_start
  46. #endif
  47. ldr r0, =__bss_start__ @ Clear BSS section to 0x00
  48. ldr r1, =__bss_end__
  49. sub r1, r1, r0
  50. bl ClearMem
  51. cmp r10, #1
  52. bne NotTWL
  53. ldr r1, =__dsimode @ set DSi mode flag
  54. strb r10, [r1]
  55. #ifndef VRAM
  56. ldr r1, =0x02ffe1d8 @ Get ARM7i LMA from header
  57. ldr r1, [r1]
  58. ldr r2, =__arm7i_start__
  59. ldr r4, =__arm7i_end__
  60. bl CopyMemCheck
  61. ldr r0, =__twl_bss_start__ @ Clear TWL BSS section to 0x00
  62. ldr r1, =__twl_bss_end__
  63. sub r1, r1, r0
  64. bl ClearMem
  65. #endif
  66. NotTWL:
  67. ldr r3, =__libc_init_array @ global constructors
  68. bl _blx_r3_stub
  69. mov r0, #0 @ int argc
  70. mov r1, #0 @ char *argv[]
  71. ldr r3, =main
  72. ldr lr,=__libnds_exit
  73. mov r12, #0x4000000 @ tell arm9 we are ready
  74. mov r9, #0
  75. str r9, [r12, #0x180]
  76. _blx_r3_stub:
  77. bx r3
  78. #ifndef VRAM
  79. arm7lma:
  80. .word __arm7_lma__ - .
  81. #endif
  82. .pool
  83. @---------------------------------------------------------------------------------
  84. @ ARM7<->ARM9 synchronization code
  85. @---------------------------------------------------------------------------------
  86. __sync_start:
  87. push {lr}
  88. mov r12, #0x4000000
  89. mov r9, #0x0
  90. bl IPCSync
  91. mov r9, #(0x9<<8)
  92. str r9, [r12, #0x180]
  93. mov r9, #0xA
  94. bl IPCSync
  95. mov r9, #(0xB<<8)
  96. str r9, [r12, #0x180]
  97. mov r9, #0xC
  98. bl IPCSync
  99. mov r9, #(0xD<<8)
  100. str r9, [r12, #0x180]
  101. IPCRecvFlag:
  102. ldr r10, [r12, #0x180]
  103. and r10, r10, #0xF
  104. cmp r10, #0xC
  105. beq IPCRecvFlag
  106. pop {pc}
  107. IPCSync:
  108. ldr r10, [r12, #0x180]
  109. and r10, r10, #0xF
  110. cmp r10, r9
  111. bne IPCSync
  112. bx lr
  113. __sync_end:
  114. @---------------------------------------------------------------------------------
  115. @ Clear memory to 0x00 if length != 0
  116. @ r0 = Start Address
  117. @ r1 = Length
  118. @---------------------------------------------------------------------------------
  119. ClearMem:
  120. @---------------------------------------------------------------------------------
  121. mov r2, #3 @ Round down to nearest word boundary
  122. add r1, r1, r2 @ Shouldn't be needed
  123. bics r1, r1, r2 @ Clear 2 LSB (and set Z)
  124. bxeq lr @ Quit if copy size is 0
  125. mov r2, #0
  126. ClrLoop:
  127. stmia r0!, {r2}
  128. subs r1, r1, #4
  129. bne ClrLoop
  130. bx lr
  131. @---------------------------------------------------------------------------------
  132. @ Copy memory if length != 0
  133. @ r1 = Source Address
  134. @ r2 = Dest Address
  135. @ r4 = Dest Address + Length
  136. @---------------------------------------------------------------------------------
  137. CopyMemCheck:
  138. @---------------------------------------------------------------------------------
  139. cmp r1, r2
  140. bxeq lr
  141. sub r3, r4, r2 @ Is there any data to copy?
  142. @---------------------------------------------------------------------------------
  143. @ Copy memory
  144. @ r1 = Source Address
  145. @ r2 = Dest Address
  146. @ r3 = Length
  147. @---------------------------------------------------------------------------------
  148. CopyMem:
  149. @---------------------------------------------------------------------------------
  150. mov r0, #3 @ These commands are used in cases where
  151. add r3, r3, r0 @ the length is not a multiple of 4,
  152. bics r3, r3, r0 @ even though it should be.
  153. bxeq lr @ Length is zero, so exit
  154. CIDLoop:
  155. ldmia r1!, {r0}
  156. stmia r2!, {r0}
  157. subs r3, r3, #4
  158. bne CIDLoop
  159. bx lr
  160. @---------------------------------------------------------------------------------
  161. .align
  162. .pool
  163. .end
  164. @---------------------------------------------------------------------------------