cprt07.as 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. @---------------------------------------------------------------------------------
  2. .section ".init"
  3. .global _start
  4. @---------------------------------------------------------------------------------
  5. .align 4
  6. .arm
  7. @---------------------------------------------------------------------------------
  8. _start:
  9. @---------------------------------------------------------------------------------
  10. mov r0, #0x04000000 @ IME = 0;
  11. mov r1, #0
  12. str r1, [r0, #0x208]
  13. mov r0, #0x12 @ Switch to IRQ Mode
  14. msr cpsr, r0
  15. ldr sp, =__sp_irq @ Set IRQ stack
  16. mov r0, #0x13 @ Switch to SVC Mode
  17. msr cpsr, r0
  18. ldr sp, =__sp_svc @ Set SVC stack
  19. mov r0, #0x1F @ Switch to System Mode
  20. msr cpsr, r0
  21. ldr sp, =__sp_usr @ Set user stack
  22. ldr r0, =__bss_start @ Clear BSS section to 0x00
  23. ldr r1, =__bss_end
  24. sub r1, r1, r0
  25. bl ClearMem
  26. ldr r3, =__libc_init_array @ global constructors
  27. bl _blx_r3_stub
  28. mov r0, #0 @ int argc
  29. mov r1, #0 @ char *argv[]
  30. ldr r3, =main
  31. ldr lr,=__libnds_exit
  32. bx r3
  33. @---------------------------------------------------------------------------------
  34. _blx_r3_stub:
  35. @---------------------------------------------------------------------------------
  36. bx r3
  37. @---------------------------------------------------------------------------------
  38. @ Clear memory to 0x00 if length != 0
  39. @ r0 = Start Address
  40. @ r1 = Length
  41. @---------------------------------------------------------------------------------
  42. ClearMem:
  43. @---------------------------------------------------------------------------------
  44. mov r2, #3 @ Round down to nearest word boundary
  45. add r1, r1, r2 @ Shouldn't be needed
  46. bics r1, r1, r2 @ Clear 2 LSB (and set Z)
  47. bxeq lr @ Quit if copy size is 0
  48. mov r2, #0
  49. ClrLoop:
  50. stmia r0!, {r2}
  51. subs r1, r1, #4
  52. bne ClrLoop
  53. bx lr
  54. @---------------------------------------------------------------------------------
  55. @ Copy memory if length != 0
  56. @ r1 = Source Address
  57. @ r2 = Dest Address
  58. @ r4 = Dest Address + Length
  59. @---------------------------------------------------------------------------------
  60. CopyMemCheck:
  61. @---------------------------------------------------------------------------------
  62. sub r3, r4, r2 @ Is there any data to copy?
  63. @---------------------------------------------------------------------------------
  64. @ Copy memory
  65. @ r1 = Source Address
  66. @ r2 = Dest Address
  67. @ r3 = Length
  68. @---------------------------------------------------------------------------------
  69. CopyMem:
  70. @---------------------------------------------------------------------------------
  71. mov r0, #3 @ These commands are used in cases where
  72. add r3, r3, r0 @ the length is not a multiple of 4,
  73. bics r3, r3, r0 @ even though it should be.
  74. bxeq lr @ Length is zero, so exit
  75. CIDLoop:
  76. ldmia r1!, {r0}
  77. stmia r2!, {r0}
  78. subs r3, r3, #4
  79. bne CIDLoop
  80. bx lr
  81. @---------------------------------------------------------------------------------
  82. .align
  83. .pool
  84. .end
  85. @---------------------------------------------------------------------------------