INITESYS.A 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * INITESYS.A - embedded system startup *
  5. * *
  6. * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. (* Skeleton startup for embedded systems :-
  11. Project should include initesys and corertl. Functions may also be imported
  12. from language standard libraries.
  13. *)
  14. include "corelib.inc"
  15. module initesys
  16. (* This is an example startup file for a minimal run-time system for modula2,
  17. Pascal or C *)
  18. section
  19. segment ENTERCODE(BOOTCODE,28H)
  20. segment INITCODE(CODE,28H)
  21. segment MP_CODE(MP_CODE,68H)
  22. segment _TEXT(CODE,28H)
  23. segment _INITN(INITN,28H)
  24. segment _INIT(INIT,28H)
  25. segment _FAR_DATA(FAR_DATA,28H)
  26. segment FAR_BSS(FAR_BSS,28H)
  27. segment _CONST(DATA,28H)
  28. segment _DATA(DATA,28H)
  29. segment BSS_START(BSS,28H)
  30. segment _BSS(BSS,28H)
  31. segment BSS_END(BSS,28H)
  32. segment STACK(STACK,74H)
  33. select _TEXT
  34. public _exit : (* This procedure must be defined in case the main procedure *)
  35. (* returns *)
  36. code = frame
  37. (*%F RegParam *)
  38. push bp
  39. mov bp, sp
  40. mov al, [bp][code]
  41. (*%E *)
  42. mov ah, 4CH
  43. int 21H
  44. db 'TopSpeed RTL (C) JPI 1989'
  45. section
  46. segment _TEXT(CODE,28H)
  47. public Standard$HALT:
  48. mov ax,4C00H
  49. int 21H
  50. section
  51. segment ENTERCODE(BOOTCODE,28H)
  52. segment INITCODE(CODE,28H)
  53. segment _TEXT(CODE,28H)
  54. segment _INITN(INITN,28H)
  55. segment _INIT(INIT,28H)
  56. segment _FAR_DATA(FAR_DATA,28H)
  57. segment EMU_STATE(DATA,28H)
  58. reserved:
  59. dw 0,0,0,0,0,0,0,0
  60. segment _CONST(DATA,28H)
  61. segment _DATA(DATA,28H)
  62. segment BSS_START(BSS,28H)
  63. segment _BSS(BSS,28H)
  64. segment BSS_END(BSS,28H)
  65. segment STACK(STACK,74H)
  66. (*%F NearPtr *)
  67. group DGROUP(EMU_STATE,_CONST,_DATA,BSS_START,_BSS,BSS_END)
  68. (*%E *)
  69. (*%T NearPtr *)
  70. group DGROUP(EMU_STATE,_CONST,_DATA,BSS_START,_BSS,BSS_END,STACK)
  71. (*%E *)
  72. select _DATA
  73. SSisDS = 8
  74. HeapSize = 6
  75. StackSize = 4
  76. select BSS_START
  77. public __bss_start:
  78. public _edata:
  79. select BSS_END
  80. public __bss_end:
  81. public _end:
  82. select ENTERCODE
  83. (* The Program Entry Point *)
  84. extrn __entry_point
  85. jmp far __entry_point
  86. select _TEXT
  87. extrn _main
  88. extrn _exit
  89. extrn __FloatInit
  90. extrn __initm
  91. extrn _x_main
  92. extrn __stk_base
  93. extrn __farstack
  94. public __entry_point :
  95. mov ax, STACK (* This stack initialization is only *)
  96. mov ss, ax (* a default. You should set up ss:sp *)
  97. mov sp, 1000H
  98. (* Interrupt controllers and or other *)
  99. (* system hardware should be initialized *)
  100. (* here if used for embedded systems *)
  101. (* The following must be done to *)
  102. (* initialise the modula2 init code and *)
  103. (* some system variables *)
  104. mov ax, seg _x_main
  105. mov ds, ax
  106. mov word [_x_main][0], _main
  107. mov word [_x_main][2], seg _main
  108. (*%F NearPtr *)
  109. mov word [__stk_base], 256 (* sets lower limit for stack pointer *)
  110. mov word [__farstack], 1 (* indicates stack has own segment *)
  111. (*%E *)
  112. (*%T NearPtr *)
  113. mov word [__stk_base], __bss_end+256
  114. mov word [__farstack], 0
  115. (*%E *)
  116. (*call far __FloatInit *) (* call Floating point initialisation here *)
  117. (* For Modula2, Pascal .... *)
  118. jmp far __initm (* This will execute initialisation code *)
  119. (* call main module *)
  120. (* For C ....
  121. (*%F sameCS *)
  122. call far _main
  123. (*%E *)
  124. (*%T sameCS *)
  125. call _main
  126. (*%E *)
  127. (*%F RegParam *)
  128. push ax
  129. (*%E *)
  130. (*%F sameCS *)
  131. call far _exit
  132. (*%E *)
  133. (*%T sameCS *)
  134. call _exit
  135. (*%E *)
  136. *)
  137. dw EMU_STATE
  138. dw _CONST
  139. dw _DATA
  140. dw BSS_START
  141. dw _BSS
  142. dw BSS_END (* establishs order ! *)
  143. (*%T NearPtr *)
  144. dw STACK
  145. (*%E *)
  146. dw reserved
  147. dw 0
  148. end *
  149.