cstartup.s34 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. ;-----------------------------------------------------------------------
  2. ;
  3. ; This file contains the M16C C startup routine and must usually
  4. ; be tailored to suit customer's hardware.
  5. ;
  6. ; Copyright 2002 IAR Systems. All rights reserved.
  7. ;
  8. ; $Revision: 1.16 $
  9. ;
  10. ;-----------------------------------------------------------------------
  11. MODULE ?cstart
  12. PUBLIC __program_start
  13. PUBLIC __data16_init
  14. PUBLIC __data16_zero
  15. PUBLIC ?cstart_call_ctors
  16. EXTERN main
  17. EXTERN exit
  18. EXTERN __call_ctors
  19. EXTERN __low_level_init
  20. EXTERN ?GENERIC_MOVE_LONG_L08
  21. EXTERN RelocatableVectTbl
  22. ;------------------------------------------------------
  23. ; Useful macros
  24. ;------------------------------------------------------
  25. ; Load 24-bit constant value to (high,low)
  26. LD24 MACRO value,high,low
  27. MOV.B #BYTE3(value),high
  28. MOV.W #LWRD(value),low
  29. ENDM
  30. ; Load 32-bit constant value to (high,low)
  31. LD32 MACRO value,high,low
  32. MOV.W #HWRD(value),high
  33. MOV.W #LWRD(value),low
  34. ENDM
  35. ; Load a stack-pointer with last even address of segment
  36. LDSTACK MACRO segment,reg
  37. LDC #sfe(segment), reg
  38. ENDM
  39. ;------------------------------------------------------
  40. ; __program_start - Reset vector should point to here.
  41. ;
  42. ; Calls __low_level_init to perform initialization
  43. ; before initializing segments and calling main.
  44. ; If the function returns 0 no segment initialization
  45. ; should take place.
  46. ;
  47. ; Link with your own version of __low_level_init to
  48. ; override the default action: do nothing but return 1.
  49. ;------------------------------------------------------
  50. RSEG CSTACK
  51. RSEG ISTACK
  52. RSEG CSTART:CODE:NOROOT
  53. REQUIRE call_main
  54. __program_start:
  55. LDC #sfe(ISTACK), ISP ; Set up interrupt stack
  56. FCLR U ; Select interrupt stack
  57. LDC #sfe(CSTACK), SP ; Set up C stack
  58. LDINTB #RelocatableVectTbl ; Set up INTB register
  59. JSR.A __low_level_init ; Call __low_level_init
  60. ;-----------------------------------------------------------
  61. ; Run-time test whether we should do segment initialization
  62. ;-----------------------------------------------------------
  63. TST.B R0L, R0L
  64. JNE do_segment_init
  65. JMP skip_segment_init
  66. do_segment_init:
  67. ;------------------------------------------------------
  68. ; Perform segment initialization of DATA16 memory.
  69. ;------------------------------------------------------
  70. RSEG DATA16_Z
  71. RSEG CSTART:CODE:NOROOT
  72. __data16_zero:
  73. MOV.W #sizeof(DATA16_Z), R3
  74. MOV.W #sfb(DATA16_Z), A1
  75. MOV.B #0, R0L
  76. SSTR.B
  77. RSEG DATA16_I
  78. RSEG DATA16_ID
  79. RSEG CSTART:CODE:NOROOT
  80. __data16_init:
  81. MOV.W #sizeof(DATA16_ID), R3
  82. MOV.W #sfb(DATA16_I), A1
  83. LD24 sfb(DATA16_ID), R1H, A0
  84. SMOVF.B
  85. RSEG CSTART:CODE:NOROOT
  86. skip_segment_init:
  87. ; Fall through to next required CSTART segment part
  88. ;------------------------------------------------------
  89. ; Call constructors
  90. ;------------------------------------------------------
  91. RSEG DIFUNCT
  92. RSEG CSTART:CODE:NOROOT
  93. PUBLIC ?cstart_call_ctors
  94. EXTERN __call_ctors
  95. ?cstart_call_ctors:
  96. PUSH.W #HWRD(sfe(DIFUNCT))
  97. PUSH.W #LWRD(sfe(DIFUNCT))
  98. LD32 sfb(DIFUNCT),R2,R0
  99. JSR.A __call_ctors
  100. ; Fall through to next required CSTART segment part
  101. ;------------------------------------------------------
  102. ; Call main and exit
  103. ;------------------------------------------------------
  104. ; This segment part is marked as ROOT, since it must
  105. ; be preserved by the linker.
  106. ;
  107. RSEG CSTART:CODE:NOROOT
  108. call_main:
  109. MOV.W #0, R0 ; Call main with argc = 0
  110. JSR.A main
  111. JMP.A exit ; Argument to exit is return value of main
  112. ;------------------------------------------------------
  113. ; Fixed interrupt table.
  114. ;
  115. ; We install all fixed interrupts in a segment called
  116. ; INTVEC1. All fixed interrupts have a hard coded name.
  117. ; Write an interrupt handler in C using this name, with
  118. ; no vector specification, and it will replace the
  119. ; default handler.
  120. ;------------------------------------------------------
  121. EXTERN __undefined_instruction_handler
  122. EXTERN __overflow_handler
  123. EXTERN __break_instruction_handler
  124. EXTERN __address_match_handler
  125. EXTERN __single_step_handler
  126. EXTERN __watchdog_timer_handler
  127. EXTERN __DBC_handler
  128. EXTERN __NMI_handler
  129. ; Labels for the ID Code Check Function.
  130. ; (To be initialized in the linker file)
  131. EXTERN _ID_CODE_1
  132. EXTERN _ID_CODE_2
  133. EXTERN _ID_CODE_3
  134. EXTERN _ID_CODE_4
  135. EXTERN _ID_CODE_5
  136. EXTERN _ID_CODE_6
  137. EXTERN _ID_CODE_7
  138. EXTERN _OFS_VALUE
  139. PUBLIC ??intvec_start
  140. COMMON INTVEC1:NOROOT
  141. ??intvec_start:
  142. DC24 __undefined_instruction_handler
  143. DC8 _ID_CODE_1
  144. DC24 __overflow_handler
  145. DC8 _ID_CODE_2
  146. DC24 __break_instruction_handler
  147. DC8 0
  148. DC24 __address_match_handler
  149. DC8 _ID_CODE_3
  150. DC24 __single_step_handler
  151. DC8 _ID_CODE_4
  152. DC24 __watchdog_timer_handler
  153. DC8 _ID_CODE_5
  154. DC24 __DBC_handler
  155. DC8 _ID_CODE_6
  156. DC24 __NMI_handler
  157. DC8 _ID_CODE_7
  158. DC24 __program_start ; Reset vector
  159. DC8 _OFS_VALUE
  160. ENDMOD
  161. ;------------------------------------------------------
  162. ; Default handlers for fixed interrupts
  163. ;------------------------------------------------------
  164. MODULE __undefined_instruction
  165. EXTERN ??reit
  166. REQUIRE ??reit
  167. PUBLIC __undefined_instruction_handler
  168. RSEG CSTART:CODE:NOROOT(1)
  169. __undefined_instruction_handler:
  170. ; Fall through to ??reit
  171. ENDMOD
  172. MODULE __overflow
  173. EXTERN ??reit
  174. REQUIRE ??reit
  175. PUBLIC __overflow_handler
  176. RSEG CSTART:CODE:NOROOT(1)
  177. __overflow_handler:
  178. ; Fall through to ??reit
  179. ENDMOD
  180. MODULE __break_instruction
  181. EXTERN ??reit
  182. REQUIRE ??reit
  183. PUBLIC __break_instruction_handler
  184. RSEG CSTART:CODE:NOROOT(1)
  185. __break_instruction_handler:
  186. ; Fall through to ??reit
  187. ENDMOD
  188. MODULE __address_match
  189. EXTERN ??reit
  190. REQUIRE ??reit
  191. PUBLIC __address_match_handler
  192. RSEG CSTART:CODE:NOROOT(1)
  193. __address_match_handler:
  194. ; Fall through to ??reit
  195. ENDMOD
  196. MODULE __single_step
  197. EXTERN ??reit
  198. REQUIRE ??reit
  199. PUBLIC __single_step_handler
  200. RSEG CSTART:CODE:NOROOT(1)
  201. __single_step_handler:
  202. ; Fall through to ??reit
  203. ENDMOD
  204. MODULE __watchdog_timer
  205. EXTERN ??reit
  206. REQUIRE ??reit
  207. PUBLIC __watchdog_timer_handler
  208. RSEG CSTART:CODE:NOROOT(1)
  209. __watchdog_timer_handler:
  210. ; Fall through to ??reit
  211. ENDMOD
  212. MODULE __DBC
  213. EXTERN ??reit
  214. REQUIRE ??reit
  215. PUBLIC __DBC_handler
  216. RSEG CSTART:CODE:NOROOT(1)
  217. __DBC_handler:
  218. ; Fall through to ??reit
  219. ENDMOD
  220. MODULE __NMI
  221. EXTERN ??reit
  222. REQUIRE ??reit
  223. PUBLIC __NMI_handler
  224. RSEG CSTART:CODE:NOROOT(1)
  225. __NMI_handler:
  226. ; Fall through to ??reit
  227. ENDMOD
  228. ;------------------------------------------------------
  229. ; Return from interrupt
  230. ;------------------------------------------------------
  231. MODULE __reit
  232. PUBLIC ??reit
  233. RSEG CSTART:CODE:NOROOT(1)
  234. EXTERN ??intvec_start
  235. REQUIRE ??intvec_start
  236. ??reit:
  237. REIT
  238. ENDMOD
  239. ;------------------------------------------------------
  240. ; FUNCTION: __low_level_init
  241. ;
  242. ; You can replace this routine by linking with your
  243. ; own version.
  244. ;
  245. ; The default action is to do nothing and return 1.
  246. ;------------------------------------------------------
  247. MODULE __low_level_init
  248. PUBLIC __low_level_init
  249. RSEG CSTART:CODE:NOROOT
  250. __low_level_init:
  251. MOV.B #1,R0L
  252. RTS
  253. ENDMOD
  254. ;------------------------------------------------------
  255. ; __overflow - This variable is used by the intrinsic
  256. ; functions __RMPA_W_overflow and
  257. ; __RMPA_B_overflow.
  258. ;------------------------------------------------------
  259. MODULE __overflow
  260. PUBLIC __overflow
  261. EXTERN __data13_zero
  262. RSEG DATA13_Z:NEAR:NOROOT
  263. __overflow:
  264. DC8 0
  265. REQUIRE __data13_zero
  266. END