Advertisement
tari

Untitled

May 2nd, 2011
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.78 KB | None | 0 0
  1. ! C runtime initialization for Prizm addins
  2. ! By Tari, based on Kristaba's reverse-engineered crt0.
  3.  
  4. .extern _main
  5. .global initialize
  6.  
  7. .section ".pretext"
  8. .align 2
  9. initialize:
  10. ! Preserve things on the stack
  11. mov.l r14, @-r15 ! Frame pointer
  12. sts.l pr, @-r15 ! Return address
  13. mov.l r4, @-r15 ! Parameter 1
  14.  
  15. ! Copy .data section into RAM
  16. mov.l v_bdata, r0 ! From
  17. mov.l v_ram_bdata, r2 ! To
  18. mov.l v_edata, r3 ! Limit
  19. dataLoop:
  20. cmp/hs r3, r0
  21. bt dataDone ! Stop when r0 >= r3
  22. mov.l @r0+, r1
  23. mov.l r1, @r2
  24. bra dataLoop
  25. add #4, r2 ! Delay slot
  26. dataDone:
  27.  
  28. ! Zero out .bss
  29. mov.l v_ram_ebss, r2 ! To
  30. mov.l v_ram_bss, r3 ! Limit
  31. mov #0, r1 ! Constant
  32. bssLoop:
  33. cmp/hs r3, r2
  34. bf bssDone ! Stop when r2 < r3
  35. bra bssLoop
  36. mov.l r1, @r2- ! Delay slot
  37. bssDone:
  38.  
  39. ! RAM is now initialized
  40.  
  41. mov r5, r14 ! Save parameter 2
  42. mov #1, r6
  43. mov #0, r4
  44. bsr _GlibAddinAplExecutionCheck
  45. mov r6, r5
  46.  
  47. ! main(r4, r5) with same state as input (returns to our caller)
  48.  
  49. mov.l main, r7
  50. extu.w r14, r5
  51. mov.l @r15+, r5
  52. lds.l @r15+, pr
  53. jmp @r7
  54. mov.l @r15+, r14 ! Delay slot
  55.  
  56. _GlibAddinAplExecutionCheck:
  57. mov.l v_syscall, r2
  58. jmp @r2 ! _GlibAddinAplExecutionCheck
  59. mov #0x29, r0 ! Delay slot
  60.  
  61. ! Constants
  62. .align 4
  63. main:
  64. .long _main
  65. v_syscall:
  66. .long 0x80020070
  67.  
  68. v_bdata:
  69. .long _bdata
  70. v_edata:
  71. .long _edata
  72. v_ram_bdata:
  73. .long 0x8100000
  74.  
  75. v_ram_bbss:
  76. .long _bbss
  77. v_ram_ebss:
  78. .long _ebss
  79.  
  80. ===
  81.  
  82. OUTPUT_FORMAT(binary)
  83. OUTPUT_ARCH(sh3)
  84.  
  85. /* Entry point. Not really important here, since doing binary output */
  86. ENTRY(initialize)
  87.  
  88. MEMORY
  89. {
  90. /* Loads code at 300000, skips g3a header */
  91. rom (rx) : o = 0x00300000, l = 512k
  92. ram (rwx) : o = 0x08100004, l = 64k /* pretty safe guess */
  93. }
  94.  
  95. SECTIONS
  96. {
  97. /* Code, in ROM */
  98. .text : {
  99. *(.pretext) /* init stuff */
  100. *(.text)
  101. *(.text.*)
  102. } > rom
  103.  
  104. /* Read-only data, in ROM */
  105. .rodata : {
  106. *(.rodata)
  107. *(.rodata.*)
  108. } > rom
  109.  
  110. /* RW initialized data, VMA in RAM but LMA in ROM */
  111. .data : {
  112. _bdata = . ;
  113. *(.data)
  114. *(.data.*);
  115. _edata = . ;
  116. } >rom AT>ram
  117.  
  118. /* Uninitialized data (fill with 0), in RAM */
  119. .bss : {
  120. _bbss = . ;
  121. *(.bss) *(COMMON);
  122. _ebss = . ;
  123. } >ram
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement