prt07.as 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. mov r0, #0 @ int argc
  27. mov r1, #0 @ char *argv[]
  28. ldr r3, =main
  29. ldr lr,=__libnds_exit
  30. bx r3
  31. @---------------------------------------------------------------------------------
  32. @ Clear memory to 0x00 if length != 0
  33. @ r0 = Start Address
  34. @ r1 = Length
  35. @---------------------------------------------------------------------------------
  36. ClearMem:
  37. @---------------------------------------------------------------------------------
  38. mov r2, #3 @ Round down to nearest word boundary
  39. add r1, r1, r2 @ Shouldn't be needed
  40. bics r1, r1, r2 @ Clear 2 LSB (and set Z)
  41. bxeq lr @ Quit if copy size is 0
  42. mov r2, #0
  43. ClrLoop:
  44. stmia r0!, {r2}
  45. subs r1, r1, #4
  46. bne ClrLoop
  47. bx lr
  48. @---------------------------------------------------------------------------------
  49. @ Copy memory if length != 0
  50. @ r1 = Source Address
  51. @ r2 = Dest Address
  52. @ r4 = Dest Address + Length
  53. @---------------------------------------------------------------------------------
  54. CopyMemCheck:
  55. @---------------------------------------------------------------------------------
  56. sub r3, r4, r2 @ Is there any data to copy?
  57. @---------------------------------------------------------------------------------
  58. @ Copy memory
  59. @ r1 = Source Address
  60. @ r2 = Dest Address
  61. @ r3 = Length
  62. @---------------------------------------------------------------------------------
  63. CopyMem:
  64. @---------------------------------------------------------------------------------
  65. mov r0, #3 @ These commands are used in cases where
  66. add r3, r3, r0 @ the length is not a multiple of 4,
  67. bics r3, r3, r0 @ even though it should be.
  68. bxeq lr @ Length is zero, so exit
  69. CIDLoop:
  70. ldmia r1!, {r0}
  71. stmia r2!, {r0}
  72. subs r3, r3, #4
  73. bne CIDLoop
  74. bx lr
  75. @---------------------------------------------------------------------------------
  76. .align
  77. .pool
  78. .end
  79. @---------------------------------------------------------------------------------