INITEXE.A 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * INITEXE.A - standard program startup code *
  5. * *
  6. * COPYRIGHT (C) 1989..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. module initexe
  11. section
  12. segment ENTERCODE(CODE,28H)
  13. segment INITCODE(CODE,28H)
  14. segment CODE(none,28H);
  15. segment SIG_TEXT(CODE,68H)
  16. segment EMU_TEXT(EMU_CODE,28H)
  17. segment PROC_TEXT(CODE,68H)
  18. segment MP_CODE(MP_CODE,68H)
  19. segment _TEXT(CODE,28H)
  20. segment _INIT(INIT_CODE,28H)
  21. segment _FAR_DATA(FAR_DATA,28H)
  22. segment FAR_BSS(FAR_BSS,28H)
  23. segment CONST(CONST,28H)
  24. segment _CONST(DATA,28H)
  25. segment _DATA(DATA,28H)
  26. segment BSS_START(BSS,28H)
  27. segment _BSS(BSS,28H)
  28. segment BSS_END(BSS,28H)
  29. segment STACK(STACK,74H)
  30. section
  31. segment ENTERCODE(CODE,28H)
  32. segment INITCODE(CODE,28H)
  33. segment _TEXT(CODE,28H)
  34. segment CODE(none,28H);
  35. segment _INIT(INIT_CODE,28H)
  36. segment _FAR_DATA(FAR_DATA,28H)
  37. segment EMU_STATE(DATA,28H)
  38. reserved:
  39. dw 0,0,0,0,0,0,0,0
  40. segment EMU_TEXT(EMU_CODE,28H)
  41. segment CONST(CONST,28H)
  42. segment _CONST(DATA,28H)
  43. segment _DATA(DATA,28H)
  44. segment BSS_START(BSS,28H)
  45. segment _BSS(BSS,28H)
  46. segment BSS_END(BSS,28H)
  47. segment STACK(STACK,74H)
  48. segment NEAR_STACK(BSS, 28H)
  49. segment NEAR_HEAP(BSS, 28H)
  50. group DGROUP(EMU_STATE,CONST,_CONST,_DATA,BSS_START,_BSS,BSS_END,NEAR_STACK,NEAR_HEAP)
  51. select _DATA
  52. SSisDS = 8
  53. HeapSize = 6
  54. StackSize = 4
  55. InitRec: dw 0, 0, 0, _INIT
  56. select BSS_START
  57. public __bss_start:
  58. public _edata: db 0
  59. select BSS_END
  60. public __bss_end:
  61. public _end:
  62. select _TEXT
  63. text_dummy : org 6
  64. select ENTERCODE
  65. extrn __startup
  66. extrn _x_main
  67. extrn _x_initx
  68. extrn __initx
  69. extrn __heap_size
  70. extrn _x_bss_end
  71. extrn _x_bss_start
  72. extrn __near_stack_start
  73. extrn __x_near_stack_start
  74. extrn __InitLink
  75. push ds (* Save PSP Segment (DOS) *)
  76. mov dx, seg __initx
  77. mov ds, dx
  78. mov cx, [__initx]
  79. mov si, [__initx][2] (* si:cx = __initx *)
  80. push [__initx][StackSize]
  81. push ax
  82. push bx
  83. mov ax, [__initx][HeapSize]
  84. dec ax
  85. mov dx, seg _x_main
  86. mov ds, dx
  87. mov [_x_initx], cx (* _x_initx = __initx *)
  88. mov [_x_initx][2], si
  89. mov [__heap_size], ax
  90. mov word [__x_near_stack_start], __near_stack_start
  91. mov ax, cs:[main_ptr]
  92. mov word [_x_main][0], ax (* _x_main = main_ptr *)
  93. mov ax, cs:[main_ptr][2]
  94. mov word [_x_main][2], ax
  95. mov bx, InitRec
  96. mov ax, _DATA
  97. call far __InitLink (* Initialize @InitChain *)
  98. pop bx
  99. pop ax
  100. mov word [_x_bss_end], __bss_end (* _x_bss_end = __bss_end *)
  101. mov word [_x_bss_start], __bss_start (* _x_bss_start = __bss_start *)
  102. mov dx, seg __initx
  103. mov ds, dx
  104. mov cl, [__initx][SSisDS]
  105. sub ch, ch
  106. pop si (* si = [__initx][StackSize] *)
  107. pop ds (* Restore PSP Segment (DOS) *)
  108. jmp far __startup
  109. (*
  110. ax = initial ax value
  111. bx = initial bx value
  112. cx = SSisDS (in cl)
  113. dx = seg __initx
  114. si = StackSize
  115. ds = initial ds value
  116. es = _DATA (set in __InitLink)
  117. *)
  118. dw EMU_STATE
  119. dw CONST
  120. dw _CONST
  121. dw _DATA
  122. dw BSS_START
  123. dw _BSS
  124. dw BSS_END (* establishs order ! *)
  125. dw NEAR_STACK
  126. dw NEAR_HEAP
  127. dw text_dummy
  128. dw reserved
  129. dw 0
  130. extrn _main
  131. main_ptr: dd _main
  132. end *
  133.