cprt07.as 3.0 KB

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