cstartup.s85 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  1. ;-----------------------------------------------------------------------------
  2. ; This file contains the startup code used by the V850 C/C++ compiler.
  3. ;
  4. ; Copyright (c) 1998-2009 IAR Systems AB.
  5. ;
  6. ; $Revision: 5028 $
  7. ;
  8. ;-----------------------------------------------------------------------------
  9. ;
  10. ; Naming covention of labels in this file:
  11. ;
  12. ; ?xxx - External labels only accessed from assembler.
  13. ; __xxx - External labels accessed from or defined in C.
  14. ; xxx - Labels local to one module (note: this file contains
  15. ; several modules).
  16. ; main - The starting point of the user program.
  17. ;
  18. #include "lxx.h"
  19. #include "cfi.h"
  20. CASEON
  21. #define A0 R1
  22. #define A1 R5
  23. #define A2 R6
  24. ;---------------------------------------------------------------;
  25. ; Call Frame Informatio ;
  26. ;---------------------------------------------------------------;
  27. CFNAMES
  28. CFCOMMON
  29. ;---------------------------------------------------------------;
  30. ; Reset Vector ;
  31. ;---------------------------------------------------------------;
  32. MODULE ?RESET
  33. PUBLIC ?creset
  34. EXTERN __program_start
  35. COMMON INTVEC:CODE:ROOT(2)
  36. ?creset:
  37. MOV __program_start, R1
  38. JMP [R1]
  39. ENDMOD
  40. ;---------------------------------------------------------------;
  41. ; Module start. ;
  42. ;---------------------------------------------------------------;
  43. MODULE __program_start
  44. PUBLIC __program_start
  45. PUBLIC ?cstartup
  46. EXTERN ?creset
  47. REQUIRE ?creset
  48. ;---------------------------------------------------------------;
  49. ; Forward declarations of segments used in this module. ;
  50. ;---------------------------------------------------------------;
  51. RSEG CODE:CODE:NOROOT(2)
  52. RSEG CSTACK:DATA(2)
  53. ;---------------------------------------------------------------;
  54. ; The startup code. ;
  55. ;---------------------------------------------------------------;
  56. RSEG CSTART:CODE:NOROOT(1)
  57. ;;
  58. ;; The startup sequence contained in the final linked
  59. ;; application will consist of a mosaic containing
  60. ;; modules and segment parts defined in this file.
  61. ;;
  62. ;; The only part which is required is the call to
  63. ;; the function "main".
  64. ;;
  65. EXTERN ?cstart_call_main
  66. REQUIRE ?cstart_call_main
  67. EXTERN __cstart_low_level_init
  68. REQUIRE __cstart_low_level_init
  69. PUBLIC ?BTT_cstart_begin
  70. ?BTT_cstart_begin:
  71. ?cstartup:
  72. __program_start:
  73. ;---------------------------------------------------------------;
  74. ; Set up the stack and the global pointer. ;
  75. ;---------------------------------------------------------------;
  76. #if __CORE__ == __CORE_V850__
  77. ;; If an interrupt is issued beteween the MOVEA and
  78. ;; MOVHI instructions the SP will point into
  79. ;; nowhere. To fix this problem we build the new SP
  80. ;; value in R1 and moves it with an atomic operation
  81. ;; to SP.
  82. MOVE_M SFE CSTACK, R1
  83. MOV R1, SP
  84. #else
  85. MOVE_M SFE CSTACK, SP
  86. #endif
  87. EXTERN ?BREL_BASE
  88. MOVE_M ?BREL_BASE + 0x8000, GP
  89. EXTERN ?BREL_CBASE
  90. MOVE_M ?BREL_CBASE + 0x8000, R25
  91. ;---------------------------------------------------------------;
  92. ; Setup constant registers. ;
  93. ;---------------------------------------------------------------;
  94. RSEG CSTART:CODE:NOROOT(1)
  95. PUBLIC ?INIT_REG
  96. ?INIT_REG: MOV 255, R18
  97. ORI 65535, zero, R19
  98. ENDMOD
  99. ;---------------------------------------------------------------;
  100. ; Initialize the saddr base pointers. ;
  101. ;---------------------------------------------------------------;
  102. MODULE ?INIT_SADDR_BASE
  103. RTMODEL "__reg_ep", "saddr"
  104. RSEG CSTART:CODE:NOROOT(1)
  105. PUBLIC ?INIT_SADDR_BASE
  106. ?INIT_SADDR_BASE:
  107. EXTERN ?SADDR_BASE
  108. MOVE_M ?SADDR_BASE, EP
  109. ENDMOD
  110. ;---------------------------------------------------------------;
  111. ; If hardware must be initialized from C or if watch dog timer ;
  112. ; must be handled or if the segment init should not be ;
  113. ; performed it can now be done in `__low_level_init'. ;
  114. ;---------------------------------------------------------------;
  115. ; Call the user function __low_level_init, if defined. ;
  116. ; It is the responsibility of __low_level_init to require ;
  117. ; __cstart_low_level_init in order to be called by cstartup. ;
  118. ;---------------------------------------------------------------;
  119. MODULE ?CSTART_LOW_LEVEL_INIT
  120. RSEG CSTART:CODE:NOROOT(1)
  121. PUBLIC __cstart_low_level_init
  122. EXTERN __low_level_init
  123. REQUIRE __low_level_init
  124. EXTERN ?no_seg_init
  125. __cstart_low_level_init:
  126. CALL_FUNC __low_level_init, LP, R1
  127. ANDI 0xFF, R1, R1
  128. BZ ?no_seg_init
  129. ENDMOD
  130. ;---------------------------------------------------------------;
  131. ; Segment initialization code. Copy initialized ROMmed code to ;
  132. ; RAM and ?seg_clear uninitialized variables. ;
  133. ;---------------------------------------------------------------;
  134. MODULE ?INIT_MEMORY
  135. ;---------------------------------------------------------------;
  136. ; Zero out NEAR_Z ;
  137. ;---------------------------------------------------------------;
  138. PUBLIC ?INIT_NEAR_Z
  139. RSEG NEAR_Z(2)
  140. RSEG CSTART:CODE:NOROOT(1)
  141. EXTERN ?seg_clear
  142. ?INIT_NEAR_Z:
  143. MOVE_M SFB NEAR_Z, A0
  144. MOVE_M SFE NEAR_Z, A1
  145. JARL ?seg_clear, LP
  146. ;---------------------------------------------------------------;
  147. ; Zero out BREL_Z ;
  148. ;---------------------------------------------------------------;
  149. PUBLIC ?INIT_BREL_Z
  150. RSEG BREL_Z(2)
  151. RSEG CSTART:CODE:NOROOT(1)
  152. EXTERN ?seg_clear
  153. ?INIT_BREL_Z:
  154. MOVE_M SFB BREL_Z, A0
  155. MOVE_M SFE BREL_Z, A1
  156. JARL ?seg_clear, LP
  157. ;---------------------------------------------------------------;
  158. ; Zero out SADDR7_Z ;
  159. ;---------------------------------------------------------------;
  160. PUBLIC ?INIT_SADDR7_Z
  161. RSEG SADDR7_Z(2)
  162. RSEG CSTART:CODE:NOROOT(1)
  163. EXTERN ?seg_clear
  164. ?INIT_SADDR7_Z:
  165. MOVE_M SFB SADDR7_Z, A0
  166. MOVE_M SFE SADDR7_Z, A1
  167. JARL ?seg_clear, LP
  168. ;---------------------------------------------------------------;
  169. ; Zero out SADDR8_Z ;
  170. ;---------------------------------------------------------------;
  171. PUBLIC ?INIT_SADDR8_Z
  172. RSEG SADDR8_Z(2)
  173. RSEG CSTART:CODE:NOROOT(1)
  174. EXTERN ?seg_clear
  175. ?INIT_SADDR8_Z:
  176. MOVE_M SFB SADDR8_Z, A0
  177. MOVE_M SFE SADDR8_Z, A1
  178. JARL ?seg_clear, LP
  179. ;---------------------------------------------------------------;
  180. ; Zero out BREL23_Z ;
  181. ;---------------------------------------------------------------;
  182. #if __CORE__ >= __CORE_V850E2M__
  183. PUBLIC ?INIT_BREL23_Z
  184. RSEG BREL23_Z(2)
  185. RSEG CSTART:CODE:NOROOT(1)
  186. EXTERN ?seg_clear
  187. ?INIT_BREL23_Z:
  188. MOVE_M SFB BREL23_Z, A0
  189. MOVE_M SFE BREL23_Z, A1
  190. JARL ?seg_clear, LP
  191. #endif
  192. ;---------------------------------------------------------------;
  193. ; Zero out HUGE_Z ;
  194. ;---------------------------------------------------------------;
  195. PUBLIC ?INIT_HUGE_Z
  196. RSEG HUGE_Z(2)
  197. RSEG CSTART:CODE:NOROOT(1)
  198. EXTERN ?seg_clear
  199. ?INIT_HUGE_Z:
  200. MOVE_M SFB HUGE_Z, A0
  201. MOVE_M SFE HUGE_Z, A1
  202. JARL ?seg_clear, LP
  203. ;---------------------------------------------------------------;
  204. ; Copy NEAR_ID into NEAR_I ;
  205. ;---------------------------------------------------------------;
  206. PUBLIC ?INIT_NEAR_I
  207. RSEG NEAR_I(2)
  208. RSEG NEAR_ID(2)
  209. RSEG CSTART:CODE:NOROOT(1)
  210. EXTERN ?seg_copy
  211. ?INIT_NEAR_I:
  212. MOVE_M SFB NEAR_ID, A0
  213. MOVE_M SFE NEAR_ID, A1
  214. MOVE_M SFB NEAR_I, A2
  215. JARL ?seg_copy, LP
  216. ;---------------------------------------------------------------;
  217. ; Copy BREL_ID into BREL_I ;
  218. ;---------------------------------------------------------------;
  219. PUBLIC ?INIT_BREL_I
  220. RSEG BREL_I(2)
  221. RSEG BREL_ID(2)
  222. RSEG CSTART:CODE:NOROOT(1)
  223. EXTERN ?seg_copy
  224. ?INIT_BREL_I:
  225. MOVE_M SFB BREL_ID, A0
  226. MOVE_M SFE BREL_ID, A1
  227. MOVE_M SFB BREL_I, A2
  228. JARL ?seg_copy, LP
  229. ;---------------------------------------------------------------;
  230. ; Copy SADDR7_ID into SADDR7_I ;
  231. ;---------------------------------------------------------------;
  232. PUBLIC ?INIT_SADDR7_I
  233. RSEG SADDR7_I(2)
  234. RSEG SADDR7_ID(2)
  235. RSEG CSTART:CODE:NOROOT(1)
  236. EXTERN ?seg_copy
  237. ?INIT_SADDR7_I:
  238. MOVE_M SFB SADDR7_ID, A0
  239. MOVE_M SFE SADDR7_ID, A1
  240. MOVE_M SFB SADDR7_I, A2
  241. JARL ?seg_copy, LP
  242. ;---------------------------------------------------------------;
  243. ; Copy SADDR8_ID into SADDR8_I ;
  244. ;---------------------------------------------------------------;
  245. PUBLIC ?INIT_SADDR8_I
  246. RSEG SADDR8_I(2)
  247. RSEG SADDR8_ID(2)
  248. RSEG CSTART:CODE:NOROOT(1)
  249. EXTERN ?seg_copy
  250. ?INIT_SADDR8_I:
  251. MOVE_M SFB SADDR8_ID, A0
  252. MOVE_M SFE SADDR8_ID, A1
  253. MOVE_M SFB SADDR8_I, A2
  254. JARL ?seg_copy, LP
  255. ;---------------------------------------------------------------;
  256. ; Copy BREL23_ID into BREL23_I ;
  257. ;---------------------------------------------------------------;
  258. #if __CORE__ >= __CORE_V850E2M__
  259. PUBLIC ?INIT_BREL23_I
  260. RSEG BREL23_I(1)
  261. RSEG BREL23_ID(1)
  262. RSEG CSTART:CODE:NOROOT(1)
  263. EXTERN ?seg_copy
  264. ?INIT_BREL23_I:
  265. MOVE_M SFB BREL23_ID, A0
  266. MOVE_M SFE BREL23_ID, A1
  267. MOVE_M SFB BREL23_I, A2
  268. JARL ?seg_copy, LP
  269. #endif
  270. ;---------------------------------------------------------------;
  271. ; Copy HUGE_ID into HUGE_I ;
  272. ;---------------------------------------------------------------;
  273. PUBLIC ?INIT_HUGE_I
  274. RSEG HUGE_I(1)
  275. RSEG HUGE_ID(1)
  276. RSEG CSTART:CODE:NOROOT(1)
  277. EXTERN ?seg_copy
  278. ?INIT_HUGE_I:
  279. MOVE_M SFB HUGE_ID, A0
  280. MOVE_M SFE HUGE_ID, A1
  281. MOVE_M SFB HUGE_I, A2
  282. JARL ?seg_copy, LP
  283. ;---------------------------------------------------------------;
  284. ; Destination label when skipping data initialization. ;
  285. ;---------------------------------------------------------------;
  286. PUBLIC ?no_seg_init
  287. RSEG CSTART:CODE:NOROOT(1)
  288. ?no_seg_init:
  289. ENDMOD
  290. ;---------------------------------------------------------------;
  291. ; Calculate code distance (PIC only). ;
  292. ;---------------------------------------------------------------;
  293. MODULE ?INIT_PIC
  294. PUBLIC ?INIT_PIC
  295. RSEG CSTART:CODE:NOROOT(1)
  296. RTMODEL "__code_model", "pic"
  297. EXTERN ?CODE_DISTANCE
  298. EXTERN_LS_M
  299. ?INIT_PIC:
  300. JARL ref_point, A1
  301. ref_point: MOVE_M ref_point, A2
  302. SUB A2, A1
  303. ;; Expands to correct store instruction/sequence.
  304. STORE_M A1, ?CODE_DISTANCE, A2
  305. ;; Note: A1 (the value of ?CODE_DISTANCE) is used below!
  306. ENDMOD
  307. #if __CORE__ >= __CORE_V850E2M__
  308. ;---------------------------------------------------------------;
  309. ; Initialize the BSEL system register bank selector. ;
  310. ;---------------------------------------------------------------;
  311. MODULE ?INIT_BSEL
  312. RSEG CSTART:CODE:NOROOT(1)
  313. PUBLIC ?INIT_BSEL
  314. ?INIT_BSEL:
  315. LDSR R0, 31 ; BSEL
  316. ENDMOD
  317. #endif
  318. #if __CORE__ >= __CORE_V850E__
  319. ;---------------------------------------------------------------;
  320. ; Initialize the CALLT base pointers. ;
  321. ;---------------------------------------------------------------;
  322. MODULE ?INIT_CALLT
  323. PUBLIC ?INIT_CALLT
  324. EXTERN ?CALLT_BASE
  325. COMMON CLTVEC(2)
  326. RSEG CSTART:CODE:NOROOT(1)
  327. RTMODEL "__cpu", "v850e"
  328. REQUIRE ?CALLT_BASE
  329. ;; The Call table base pointer
  330. ?INIT_CALLT:
  331. MOVE_M SFB CLTVEC, A2
  332. #ifdef CODE_MODEL_PIC
  333. EXTERN ?CODE_DISTANCE
  334. REQUIRE ?CODE_DISTANCE
  335. ;; Add the value of ?CODE_DISTANCE calculated above
  336. ADD A1, A2
  337. #endif
  338. #if __CORE__ >= __CORE_V850E2M__
  339. EXTERN ?INIT_BSEL
  340. REQUIRE ?INIT_BSEL
  341. #endif
  342. LDSR A2, 20 ; CTBP
  343. ENDMOD
  344. #endif
  345. #if __CORE__ >= __CORE_V850E2M__
  346. ;---------------------------------------------------------------;
  347. ; Initialize the SYSCALL base pointers. ;
  348. ;---------------------------------------------------------------;
  349. MODULE ?INIT_SYSCALL
  350. PUBLIC ?INIT_SYSCALL
  351. EXTERN ?INIT_BSEL
  352. EXTERN ?SYSCALL_BASE
  353. COMMON SYSCALLVEC(2)
  354. RSEG CSTART:CODE:NOROOT(1)
  355. REQUIRE ?INIT_BSEL
  356. REQUIRE ?SYSCALL_BASE
  357. ;; The syscall table base pointer
  358. ?INIT_SYSCALL:
  359. MOVE_M SFB SYSCALLVEC, A2
  360. #ifdef CODE_MODEL_PIC
  361. EXTERN ?CODE_DISTANCE
  362. REQUIRE ?CODE_DISTANCE
  363. ;; Add the value of ?CODE_DISTANCE calculated above
  364. ADD A1, A2
  365. #endif
  366. LDSR A2, 12 ; SCBP
  367. MOVE_M ((SFE SYSCALLVEC - SFB SYSCALLVEC)/4) - 1, A2
  368. LDSR A2, 11 ; SCCFG
  369. ENDMOD
  370. #endif
  371. ;---------------------------------------------------------------;
  372. ; This segment part is required by the compiler when it is ;
  373. ; necessary to call constructors of global objects. ;
  374. ;---------------------------------------------------------------;
  375. MODULE ?CALL_MAIN
  376. RSEG DIFUNCT(2)
  377. RSEG CSTART:CODE:NOROOT(1)
  378. PUBLIC ?cstart_call_ctors
  379. EXTERN __call_ctors
  380. ?cstart_call_ctors:
  381. MOVE_M SFB DIFUNCT, R1
  382. MOVE_M SFE DIFUNCT, R5
  383. CALL_FUNC __call_ctors, LP, R6
  384. ;---------------------------------------------------------------;
  385. ; Call C main() with no parameters. ;
  386. ;---------------------------------------------------------------;
  387. RSEG CSTART:CODE:NOROOT(1)
  388. PUBLIC ?cstart_call_main
  389. EXTERN main
  390. EXTERN exit
  391. EXTERN __exit
  392. ?cstart_call_main:
  393. CALL_FUNC main, LP, R6
  394. ;---------------------------------------------------------------;
  395. ; If we come here we have returned from main with a 'return' ;
  396. ; statement, not with a call to exit() or abort(). ;
  397. ; In this case we must call exit() here for a nice ending. ;
  398. ; Note: The return value of main() is the argument to exit(). ;
  399. ;---------------------------------------------------------------;
  400. CALL_FUNC exit, LP, R6
  401. ;---------------------------------------------------------------;
  402. ; We should never come here, but just in case. ;
  403. ;---------------------------------------------------------------;
  404. MOV __exit, LP
  405. JMP [LP]
  406. PUBLIC ?BTT_cstart_end
  407. ?BTT_cstart_end:
  408. ;---------------------------------------------------------------;
  409. ; Copy a chunk of memory. ;
  410. ; A0 = Start of from block ;
  411. ; A1 = End of from block (+1) ;
  412. ; A2 = Start of to block ;
  413. ;---------------------------------------------------------------;
  414. PUBLIC ?seg_copy
  415. PUBLIC ?seg_clear
  416. RSEG CSTART:CODE:NOROOT(1)
  417. REQUIRE done
  418. cp_cont: LD.B 0[A0], R7
  419. ADD 1, A0
  420. ST.B R7, 0[A2]
  421. ADD 1, A2
  422. ;; Note: The entry point is here.
  423. ?seg_copy: CMP A0, A1
  424. BNE cp_cont
  425. RSEG CSTART:CODE:NOROOT(1)
  426. done: JMP [LP]
  427. ;---------------------------------------------------------------;
  428. ; Clear a chunk of memory. ;
  429. ; A0 = Start of block ;
  430. ; A1 = End of block (+1) ;
  431. ;---------------------------------------------------------------;
  432. RSEG CSTART:CODE:NOROOT(1)
  433. REQUIRE done
  434. ?seg_clear: CMP A0, A1
  435. BE done
  436. cl_cont: ST.B zero, 0[A0]
  437. ADD 1, A0
  438. BR ?seg_clear
  439. ENDMOD
  440. ;---------------------------------------------------------------;
  441. ; _exit code ;
  442. ; ;
  443. ; Call destructors (if required), then fall through to __exit. ;
  444. ;---------------------------------------------------------------;
  445. MODULE ?_exit
  446. PUBLIC _exit
  447. PUBLIC ?BTT_exit_begin
  448. EXTERN ?exit_restore2
  449. RSEG RCODE:CODE:NOROOT(1)
  450. ?BTT_exit_begin:
  451. _exit:
  452. REQUIRE ?exit_restore2
  453. ;; If any of the two pieces of code "__cstart_call_dtors"
  454. ;; or "__cstart_closeall" is called we need to save the
  455. ;; argument to "_exit". However, since we never will
  456. ;; from this function we can use a permanent register
  457. ;; rather than storing the value on the stack.
  458. RSEG RCODE:CODE:NOROOT(1)
  459. EXTERN ?exit_restore
  460. PUBLIC ?exit_save
  461. ?exit_save:
  462. REQUIRE ?exit_restore
  463. MOV R1, R29
  464. RSEG RCODE:CODE:NOROOT(1)
  465. PUBLIC __cstart_call_dtors
  466. EXTERN __call_dtors
  467. REQUIRE ?exit_save
  468. ;; This label is required by "__record_needed_destruction".
  469. __cstart_call_dtors:
  470. CALL_FUNC __call_dtors, LP, R1
  471. ENDMOD
  472. ;; A new module is needed so that a non-terminal-IO program
  473. ;; doesn't include this, which requires __putchar.
  474. MODULE ?__cstart_closeall
  475. RSEG RCODE:CODE:NOROOT(1)
  476. ;; When stdio is used, the following piece of code is
  477. ;; required by the _Closreg macro.
  478. PUBLIC __cstart_closeall
  479. EXTERN ?exit_save
  480. REQUIRE ?exit_save
  481. ;; This label is required by _Closreg
  482. __cstart_closeall:
  483. EXTERN _Close_all
  484. CALL_FUNC _Close_all, LP, R1
  485. ENDMOD
  486. ;; Restore the argument previously stored by the "save" section
  487. ;; above.
  488. MODULE ?_exit_end
  489. RSEG RCODE:CODE:NOROOT(1)
  490. PUBLIC ?exit_restore
  491. EXTERN ?exit_restore2
  492. ?exit_restore:
  493. REQUIRE ?exit_restore2
  494. MOV R29, R1
  495. ENDMOD
  496. MODULE ?_exit_end2
  497. PUBLIC ?BTT_exit_end
  498. RSEG RCODE:CODE:NOROOT(1)
  499. PUBLIC ?exit_restore2
  500. EXTERN __exit
  501. ?exit_restore2:
  502. MOV __exit, LP
  503. JMP [LP]
  504. ?BTT_exit_end:
  505. ENDMOD
  506. ;---------------------------------------------------------------;
  507. ; Define the base of the base relative (brel) data for RAM. ;
  508. ; ;
  509. ; This empty segment should be places in front of the brel ;
  510. ; RAM data segments. ;
  511. ;---------------------------------------------------------------;
  512. MODULE ?BREL_BASE
  513. PUBLIC ?BREL_BASE
  514. RSEG BREL_BASE:DATA:NOROOT(2)
  515. ?BREL_BASE:
  516. ENDMOD
  517. ;---------------------------------------------------------------;
  518. ; Define the base of the base relative (brel) data for ROM. ;
  519. ; ;
  520. ; This empty segment should be places in front of the brel ;
  521. ; ROM data segment. ;
  522. ;---------------------------------------------------------------;
  523. MODULE ?BREL_CBASE
  524. PUBLIC ?BREL_CBASE
  525. RSEG BREL_CBASE:CONST:NOROOT(2)
  526. ?BREL_CBASE:
  527. ENDMOD
  528. ;---------------------------------------------------------------;
  529. ; Define the base of the short addressing (saddr) data. ;
  530. ; ;
  531. ; This empty segment should be places in front of the saddr ;
  532. ; data segments. ;
  533. ;---------------------------------------------------------------;
  534. MODULE ?SADDR_BASE
  535. RTMODEL "__reg_ep", "saddr"
  536. PUBLIC ?SADDR_BASE
  537. RSEG SADDR_BASE:CONST:NOROOT(2)
  538. EXTERN ?INIT_SADDR_BASE
  539. REQUIRE ?INIT_SADDR_BASE
  540. ?SADDR_BASE:
  541. ENDMOD
  542. ;---------------------------------------------------------------;
  543. ; The base of the CALLT vector. ;
  544. ;---------------------------------------------------------------;
  545. MODULE ?CALLT_BASE
  546. PUBLIC ?CALLT_BASE
  547. COMMON CLTVEC:CONST:NOROOT(2)
  548. DATA
  549. ?CALLT_BASE:
  550. ENDMOD
  551. #if __CORE__ >= __CORE_V850E2M__
  552. ;---------------------------------------------------------------;
  553. ; The base of the SYSCALL vector. ;
  554. ;---------------------------------------------------------------;
  555. MODULE ?SYSCALL_BASE
  556. PUBLIC ?SYSCALL_BASE
  557. COMMON SYSCALLVEC:CONST:NOROOT(2)
  558. DATA
  559. ?SYSCALL_BASE:
  560. ENDMOD
  561. #endif
  562. ;---------------------------------------------------------------;
  563. ; The distance the code has been moved when using position ;
  564. ; independent code. ;
  565. ;---------------------------------------------------------------;
  566. MODULE ?CODE_DISTANCE
  567. RTMODEL "__code_model", "pic"
  568. PUBLIC ?CODE_DISTANCE
  569. RSEG LIBRARY_N:DATA:NOROOT(2)
  570. EXTERN ?INIT_PIC
  571. REQUIRE ?INIT_PIC
  572. ?CODE_DISTANCE:
  573. DS 4
  574. ENDMOD
  575. ;---------------------------------------------------------------;
  576. ; A dummy "low level init" that will be used if the user ;
  577. ; hasn't defined this function. ;
  578. ;---------------------------------------------------------------;
  579. MODULE ?__low_level_init_stub
  580. PUBLIC __low_level_init
  581. RSEG RCODE:CODE:NOROOT
  582. __low_level_init:
  583. MOV 1, R1
  584. JMP [LP]
  585. ENDMOD
  586. END