home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c496 / 1.img / STARTUP.W32 / WSTART3R.ASM next >
Encoding:
Assembly Source File  |  1991-08-20  |  14.8 KB  |  616 lines

  1. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. ;%     Copyright (C) 1990, by WATCOM Systems Inc. All rights       %
  3. ;%     reserved. No part of this software may be reproduced       %
  4. ;%     in any form or by any means - graphic, electronic or       %
  5. ;%     mechanical, including photocopying, recording, taping       %
  6. ;%     or information storage and retrieval systems - except       %
  7. ;%     with the written permission of WATCOM Systems Inc.       %
  8. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  9. ;
  10. ; startup code for WATCOM C 386 (Windows Extender) Version 8.0
  11. ;
  12. ;    This must be assembled using the following command:
  13. ;        386asm wstart
  14. ;
  15. ; By:  Craig Eisler
  16. ;      December 1990-June 1991
  17. ;
  18. .387
  19. .386p
  20.  
  21. DGROUP group CONST,_DATA,DATA,_emu_inits,_emu_init,_emu_inite,EXEC_S,EXEC,EXEC_E,XIB,XI,XIE,_BSS,STACK
  22.  
  23. extrn __DOSseg__:byte
  24.  
  25. CallBack Macro name
  26. public name
  27. name  dd 0
  28. ENDM
  29.  
  30.     extrn    WINMAIN : near
  31.  
  32. FarProc MACRO name
  33. public name
  34. name    label FWORD
  35.           dd 0
  36.           dw 0
  37. ENDM
  38.  
  39.     assume    nothing
  40.  
  41.     extrn    _edata        : byte        ; end of DATA (start of BSS)
  42.     extrn    _end        : byte        ; end of BSS (start of STACK)
  43.  
  44.     extrn    _nfree_     : near
  45.  
  46. _TEXT    segment use32 word public 'CODE'
  47.  
  48. XIB    segment word public 'DATA'
  49. xistart label    byte
  50. XIB    ends
  51. XI    segment word public 'DATA'
  52. XI    ends
  53. XIE    segment word public 'DATA'
  54. xiend    label    byte
  55. XIE    ends
  56.  
  57. _DATA    segment use32 word public 'DATA'
  58.  
  59. TMPSTACK    equ    100h    ; location on stack to copy command line
  60. DS16        equ    0    ; location for 16-bit ds
  61. ;
  62. ; these variables must all be kept in order
  63. ;
  64. _LocalPtr   dw    0
  65. public _LocalPtr
  66. hInstance  dw  0
  67. hPrevInstance  dw  0
  68. lpCmdLine  dd  0
  69. cmdShow    dw  0
  70. __no87       dw 0         ; non-zero => "NO87" environment var present
  71.  
  72. ; magical selectors for real memory
  73. public ___A000,___B000,___B800,___C000,___D000,___E000,___F000
  74. ___A000 dw    0
  75. ___B000 dw    0
  76. ___B800 dw    0
  77. ___C000 dw    0
  78. ___D000 dw    0
  79. ___E000 dw    0
  80. ___F000 dw    0
  81.  
  82. ; proc lists
  83. FarProc AddCBEntryAddr
  84. FarProc AddDLLEntryAddr
  85. FarProc Gimme16BitCallBackAddr
  86. FarProc Release16BitCallBackAddr
  87. FarProc Invoke16BitFunctionAddr
  88. FarProc WINFUNCTION0ADDR
  89. FarProc WINFUNCTION1ADDR
  90. FarProc WINFUNCTION2ADDR
  91. FarProc WINFUNCTION3ADDR
  92. FarProc WINFUNCTION4ADDR
  93. FarProc WINFUNCTION5ADDR
  94. FarProc WINFUNCTION6ADDR
  95. FarProc WINFUNCTION7ADDR
  96. FarProc WINFUNCTION8ADDR
  97. FarProc WINFUNCTION9ADDR
  98. FarProc WINFUNCTION10ADDR
  99. FarProc WINFUNCTION11ADDR
  100. FarProc WINFUNCTION12ADDR
  101. FarProc WINFUNCTION13ADDR
  102. FarProc WINFUNCTION14ADDR
  103. FarProc WINFUNCTION15ADDR
  104. FarProc WINFUNCTION16ADDR
  105. FarProc WINFUNCTION17ADDR
  106. FarProc WINFUNCTION18ADDR
  107. FarProc WINFUNCTION19ADDR
  108. FarProc WINFUNCTION20ADDR
  109. FarProc WINFUNCTION21ADDR
  110. FarProc WINFUNCTION22ADDR
  111. FarProc WINFUNCTION23ADDR
  112. FarProc WINFUNCTION24ADDR
  113. FarProc WINFUNCTION25ADDR
  114. FarProc WINFUNCTION26ADDR
  115. FarProc WINFUNCTION27ADDR
  116. FarProc WINFUNCTION28ADDR
  117. FarProc WINFUNCTION29ADDR
  118. FarProc WINFUNCTION30ADDR
  119. FarProc WINFUNCTION31ADDR
  120. FarProc WINFUNCTION32ADDR
  121. FarProc WINFUNCTION33ADDR
  122. FarProc WINFUNCTION34ADDR
  123. FarProc WINFUNCTION35ADDR
  124. FarProc WINFUNCTION36ADDR
  125. FarProc WINFUNCTION37ADDR
  126. FarProc WINFUNCTION38ADDR
  127. FarProc WINFUNCTION39ADDR
  128. FarProc WINFUNCTION40ADDR
  129. FarProc WINFUNCTION41ADDR
  130. FarProc WINFUNCTION42ADDR
  131. FarProc WINFUNCTION43ADDR
  132. FarProc WINFUNCTION44ADDR
  133. FarProc WINFUNCTION45ADDR
  134. FarProc WINFUNCTION46ADDR
  135. FarProc WINFUNCTION47ADDR
  136. FarProc WINFUNCTION48ADDR
  137. FarProc WINFUNCTION49ADDR
  138. FarProc WINFUNCTION50ADDR
  139. FarProc WINFUNCTION51ADDR
  140. FarProc WINFUNCTION52ADDR
  141. FarProc WINFUNCTION53ADDR
  142. FarProc WINFUNCTION54ADDR
  143. FarProc WINFUNCTION55ADDR
  144. FarProc WINFUNCTION56ADDR
  145. FarProc WINFUNCTION57ADDR
  146. FarProc WINFUNCTION58ADDR
  147. FarProc WINFUNCTION59ADDR
  148. FarProc WINFUNCTION60ADDR
  149. FarProc WINFUNCTION61ADDR
  150. FarProc WINFUNCTION62ADDR
  151. FarProc WINFUNCTION63ADDR
  152. FarProc WINFUNCTION64ADDR
  153. FarProc WINFUNCTION65ADDR
  154. FarProc WINFUNCTION66ADDR
  155. FarProc WINFUNCTION67ADDR
  156. FarProc WINFUNCTION68ADDR
  157. FarProc WINFUNCTION69ADDR
  158. FarProc WINFUNCTION70ADDR
  159. FarProc WINFUNCTION71ADDR
  160. FarProc WINFUNCTION72ADDR
  161. FarProc WINFUNCTION73ADDR
  162. FarProc WINFUNCTION74ADDR
  163. FarProc WINFUNCTION75ADDR
  164. FarProc WINFUNCTION76ADDR
  165. FarProc WINFUNCTION77ADDR
  166. FarProc WINFUNCTION78ADDR
  167. FarProc WINFUNCTION79ADDR
  168. FarProc WINFUNCTION80ADDR
  169. FarProc WINFUNCTION81ADDR
  170. FarProc WINFUNCTION82ADDR
  171. FarProc WINFUNCTION83ADDR
  172. FarProc WINFUNCTION84ADDR
  173. FarProc WINFUNCTION85ADDR
  174. FarProc WINFUNCTION86ADDR
  175. FarProc WINFUNCTION87ADDR
  176. FarProc WINFUNCTION88ADDR
  177. FarProc WINFUNCTION89ADDR
  178. FarProc WINFUNCTION90ADDR
  179. FarProc WINFUNCTION91ADDR
  180. FarProc WINFUNCTION92ADDR
  181. FarProc WINFUNCTION93ADDR
  182. FarProc WINFUNCTION94ADDR
  183. FarProc WINFUNCTION95ADDR
  184. FarProc WINFUNCTION96ADDR
  185. FarProc WINFUNCTION97ADDR
  186. FarProc WINFUNCTION98ADDR
  187. FarProc WINFUNCTION99ADDR
  188. FarProc WINFUNCTION100ADDR
  189. FarProc WINFUNCTION101ADDR
  190. FarProc WINFUNCTION102ADDR
  191. FarProc WINFUNCTION103ADDR
  192. FarProc WINFUNCTION104ADDR
  193. FarProc WINFUNCTION105ADDR
  194. FarProc WINFUNCTION106ADDR
  195. FarProc WINFUNCTION107ADDR
  196. FarProc WINFUNCTION108ADDR
  197. FarProc WINFUNCTION109ADDR
  198. FarProc WINFUNCTION110ADDR
  199. FarProc WINFUNCTION111ADDR
  200. FarProc WINFUNCTION112ADDR
  201. FarProc WINFUNCTION113ADDR
  202. FarProc WINFUNCTION114ADDR
  203. FarProc WINFUNCTION115ADDR
  204. FarProc WINFUNCTION116ADDR
  205. FarProc WINFUNCTION117ADDR
  206. FarProc WINFUNCTION118ADDR
  207. FarProc WINFUNCTION119ADDR
  208. FarProc WINFUNCTION120ADDR
  209. FarProc WINFUNCTION121ADDR
  210. FarProc WINFUNCTION122ADDR
  211. FarProc WINFUNCTION123ADDR
  212. FarProc WINFUNCTION124ADDR
  213. FarProc WINFUNCTION125ADDR
  214. FarProc WINFUNCTION126ADDR
  215. FarProc WINFUNCTION127ADDR
  216. FarProc WINFUNCTION128ADDR
  217. FarProc WINFUNCTION129ADDR
  218. FarProc WINFUNCTION130ADDR
  219. FarProc WINFUNCTION131ADDR
  220. FarProc WINFUNCTION132ADDR
  221. FarProc WINFUNCTION133ADDR
  222. FarProc WINFUNCTION134ADDR
  223. FarProc WINFUNCTION135ADDR
  224. FarProc WINFUNCTION136ADDR
  225. FarProc WINFUNCTION137ADDR
  226. FarProc WINFUNCTION138ADDR
  227. FarProc WINFUNCTION139ADDR
  228. FarProc WINFUNCTION140ADDR
  229. FarProc WINFUNCTION141ADDR
  230. FarProc WINFUNCTION142ADDR
  231. FarProc WINFUNCTION143ADDR
  232. FarProc WINFUNCTION144ADDR
  233. FarProc WINFUNCTION145ADDR
  234. FarProc WINFUNCTION146ADDR
  235. FarProc WINFUNCTION147ADDR
  236. FarProc WINFUNCTION148ADDR
  237. FarProc WINFUNCTION149ADDR
  238. FarProc WINFUNCTION150ADDR
  239. FarProc WINFUNCTION151ADDR
  240. FarProc WINFUNCTION152ADDR
  241. FarProc WINFUNCTION153ADDR
  242. FarProc WINFUNCTION154ADDR
  243. FarProc WINFUNCTION155ADDR
  244. FarProc WINFUNCTION156ADDR
  245. FarProc WINFUNCTION157ADDR
  246. FarProc WINFUNCTION158ADDR
  247. FarProc WINFUNCTION159ADDR
  248. FarProc WINFUNCTION160ADDR
  249. FarProc WINFUNCTION161ADDR
  250. FarProc WINFUNCTION162ADDR
  251. FarProc WINFUNCTION163ADDR
  252. FarProc WINFUNCTION164ADDR
  253. FarProc WINFUNCTION165ADDR
  254. FarProc WINFUNCTION166ADDR
  255. FarProc WINFUNCTION167ADDR
  256. FarProc WINFUNCTION168ADDR
  257. FarProc WINFUNCTION169ADDR
  258. FarProc WINFUNCTION170ADDR
  259. FarProc WINFUNCTION171ADDR
  260. FarProc WINFUNCTION172ADDR
  261. FarProc WINFUNCTION173ADDR
  262. FarProc WINFUNCTION174ADDR
  263. FarProc WINFUNCTION175ADDR
  264. FarProc WINFUNCTION176ADDR
  265. FarProc WINFUNCTION177ADDR
  266. FarProc WINFUNCTION178ADDR
  267. FarProc WINFUNCTION179ADDR
  268. FarProc WINFUNCTION180ADDR
  269. FarProc WINFUNCTION181ADDR
  270. FarProc WINFUNCTION182ADDR
  271. CallBack CallBack0Addr
  272. CallBack CallBack1Addr
  273. CallBack CallBack2Addr
  274. CallBack CallBack3Addr
  275. CallBack CallBack4Addr
  276. CallBack CallBack5Addr
  277. CallBack CallBack6Addr
  278. CallBack CallBack7Addr
  279. CallBack CallBack8Addr
  280. CallBack CallBack9Addr
  281. CallBack CallBack10Addr
  282. CallBack CallBack11Addr
  283. CallBack CallBack12Addr
  284. CallBack CallBack13Addr
  285. CallBack CallBack14Addr
  286. CallBack CallBack15Addr
  287. CallBack CallBack16Addr
  288. CallBack CallBack17Addr
  289. CallBack CallBack18Addr
  290. CallBack CallBack19Addr
  291. CallBack CallBack20Addr
  292. CallBack CallBack21Addr
  293. CallBack CallBack22Addr
  294. CallBack CallBack23Addr
  295. CallBack CallBack24Addr
  296. CallBack CallBack25Addr
  297. CallBack CallBack26Addr
  298. CallBack CallBack27Addr
  299. CallBack CallBack28Addr
  300. CallBack CallBack29Addr
  301. CallBack CallBack30Addr
  302. CallBack CallBack31Addr
  303. CallBack CallBack32Addr
  304. CallBack CallBack33Addr
  305. CallBack CallBack34Addr
  306. CallBack CallBack35Addr
  307. CallBack CallBack36Addr
  308. CallBack CallBack37Addr
  309. CallBack CallBack38Addr
  310. CallBack CallBack39Addr
  311. CallBack CallBack40Addr
  312. CallBack CallBack41Addr
  313. CallBack CallBack42Addr
  314. CallBack CallBack43Addr
  315. CallBack CallBack44Addr
  316. CallBack CallBack45Addr
  317. CallBack CallBack46Addr
  318. CallBack CallBack47Addr
  319. CallBack CallBack48Addr
  320. CallBack CallBack49Addr
  321. CallBack CallBack50Addr
  322. CallBack CallBack51Addr
  323. CallBack CallBack52Addr
  324. CallBack CallBack53Addr
  325. CallBack CallBack54Addr
  326. CallBack CallBack55Addr
  327. CallBack CallBack56Addr
  328. CallBack CallBack57Addr
  329. CallBack CallBack58Addr
  330. CallBack CallBack59Addr
  331. CallBack CallBack60Addr
  332. CallBack CallBack61Addr
  333. CallBack CallBack62Addr
  334. CallBack CallBack63Addr
  335. CallBack CallBack64Addr
  336. CallBack CallBack65Addr
  337. CallBack CallBack66Addr
  338. CallBack CallBack67Addr
  339. CallBack CallBack68Addr
  340. CallBack CallBack69Addr
  341. CallBack CallBack70Addr
  342. CallBack CallBack71Addr
  343. CallBack CallBack72Addr
  344. CallBack CallBack73Addr
  345. CallBack CallBack74Addr
  346. CallBack CallBack75Addr
  347. CallBack CallBack76Addr
  348. CallBack CallBack77Addr
  349. CallBack CallBack78Addr
  350. CallBack CallBack79Addr
  351. CallBack CallBack80Addr
  352. CallBack CallBack81Addr
  353. CallBack CallBack82Addr
  354. CallBack CallBack83Addr
  355. CallBack CallBack84Addr
  356. CallBack CallBack85Addr
  357. CallBack CallBack86Addr
  358. CallBack CallBack87Addr
  359. CallBack CallBack88Addr
  360. CallBack CallBack89Addr
  361. CallBack CallBack90Addr
  362. CallBack CallBack91Addr
  363. CallBack CallBack92Addr
  364. CallBack CallBack93Addr
  365. CallBack CallBack94Addr
  366. CallBack CallBack95Addr
  367. CallBack CallBack96Addr
  368. CallBack CallBack97Addr
  369. CallBack CallBack98Addr
  370. CallBack CallBack99Addr
  371. CallBack CallBack100Addr
  372. CallBack CallBack101Addr
  373. CallBack CallBack102Addr
  374. CallBack CallBack103Addr
  375. CallBack CallBack104Addr
  376. CallBack CallBack105Addr
  377. CallBack CallBack106Addr
  378. CallBack CallBack107Addr
  379. CallBack CallBack108Addr
  380. CallBack CallBack109Addr
  381. CallBack CallBack110Addr
  382. CallBack CallBack111Addr
  383. CallBack CallBack112Addr
  384. CallBack CallBack113Addr
  385. CallBack CallBack114Addr
  386. CallBack CallBack115Addr
  387. CallBack CallBack116Addr
  388. CallBack CallBack117Addr
  389. CallBack CallBack118Addr
  390. CallBack CallBack119Addr
  391. CallBack CallBack120Addr
  392. CallBack CallBack121Addr
  393. CallBack CallBack122Addr
  394. CallBack CallBack123Addr
  395. CallBack CallBack124Addr
  396. CallBack CallBack125Addr
  397. CallBack CallBack126Addr
  398. CallBack CallBack127Addr
  399. CallBack CallBack128Addr
  400. CallBack CallBack129Addr
  401. CallBack CallBack130Addr
  402. CallBack CallBack131Addr
  403. CallBack CallBack132Addr
  404. CallBack CallBack133Addr
  405. CallBack CallBack134Addr
  406. CallBack CallBack135Addr
  407. CallBack CallBack136Addr
  408. CallBack CallBack137Addr
  409. CallBack CallBack138Addr
  410. CallBack CallBack139Addr
  411. CallBack CallBack140Addr
  412. CallBack CallBack141Addr
  413. CallBack CallBack142Addr
  414. CallBack CallBack143Addr
  415. CallBack UserCallBack1Addr
  416. CallBack UserCallBack2Addr
  417. CallBack UserCallBack3Addr
  418. CallBack UserCallBack4Addr
  419. CallBack UserCallBack5Addr
  420. CallBack UserCallBack6Addr
  421. CallBack UserCallBack7Addr
  422. CallBack UserCallBack8Addr
  423. CallBack UserCallBack9Addr
  424. CallBack UserCallBack10Addr
  425. CallBack UserCallBack11Addr
  426. CallBack UserCallBack12Addr
  427. CallBack UserCallBack13Addr
  428. CallBack UserCallBack14Addr
  429. CallBack UserCallBack15Addr
  430. CallBack UserCallBack16Addr
  431.  
  432. __STACKLOW dd 0         ; lowest address in stack
  433. __STACKTOP dd 0         ; lowest address in stack
  434. __curbrk   dd 0         ; top of usable memory
  435. __cbyte    dd 0         ; used by getch, getche
  436. __osmajor  db 4         ; major DOS version number
  437. __osminor  db 0         ; minor DOS version number
  438. __Extender db 0         ; 10 => 386 windows
  439.        db 0         ; spare byte
  440.  
  441. public __pid
  442. __pid       dw 0
  443. public __wincmdptr
  444. __wincmdptr LABEL FWORD
  445. cmd_offset dd 0
  446. cmd_seg    dw 0
  447.  
  448.  __FPE_handler label dword
  449. ___FPE_handler dd __null_FPE_rtn ; FPE handler
  450.  
  451.     public    __STACKLOW
  452.     public    __STACKTOP
  453.     public    __curbrk
  454.     public    __cbyte
  455.     public    __osmajor
  456.     public    __osminor
  457.     public    __Extender
  458.     public    __no87
  459.     public     __FPE_handler
  460.     public    ___FPE_handler
  461.  
  462. _DATA    ends
  463.  
  464. STACK    segment para stack 'STACK'
  465. STACK    ends
  466.  
  467. _BSS          segment word public 'BSS'
  468. _BSS          ends
  469.  
  470. CONST    segment word public 'DATA'
  471. CONST    ends
  472.  
  473. _emu_inits    segment word public 'DATA'
  474. _emu_start    label    word
  475. _emu_inits    ends
  476.  
  477. _emu_init segment word public 'DATA'
  478. __emulator    label    word
  479. _emu_init ends
  480.  
  481. _emu_inite    segment word public 'DATA'
  482. _emu_end    label    word
  483. _emu_inite    ends
  484.  
  485. EXEC_S    segment word public 'DATA'
  486. EXEC_S    ends
  487.  
  488. EXEC    segment word public 'DATA'
  489. EXEC    ends
  490.  
  491. EXEC_E    segment word public 'DATA'
  492. EXEC_E    ends
  493.  
  494.  
  495. DATA    segment word public 'DATA'
  496. DATA    ends
  497.  
  498.     assume    cs:_TEXT
  499.     assume    ds:_DATA
  500.     assume    fs:_DATA
  501.     assume    gs:_DATA
  502.     assume    ss:_DATA
  503.  
  504. __saved_DS dw 0
  505. _cstart_ proc  far
  506.     dd    offset    hInstance ; loader starts execution 8 bytes past here
  507.     dd    _end
  508.     mov    _LocalPtr,gs
  509.     mov    WORD PTR ds:DS16,gs    ; save the data segment at stack bot
  510.  
  511.     mov    __STACKTOP,esp
  512.  
  513.     ; initialize bss
  514.     lea    ecx,DGROUP:_end     ; end of _BSS segment (start of free)
  515.     lea    edi,DGROUP:_edata    ; start of _BSS segment
  516.     sub    ecx,edi         ; calc # of bytes in _BSS segment
  517.     xor    eax,eax         ; zero the _BSS segment
  518.     mov    dl,cl            ; copy the lower bits of size
  519.     shr    ecx,2            ; get number of dwords
  520.     rep    stosd            ; copy them
  521.     mov    cl,dl            ; get lower bits
  522.     and    cl,3            ; get number of bytes left (modulo 4)
  523.     rep    stosb
  524.  
  525.     ; save ds
  526.     lea    ecx,__saved_DS
  527.     mov    ds:[ecx],ds
  528.  
  529.     ; set up heap
  530.     lea    edx,DGROUP:_end     ; start of free
  531.     add    edx,3
  532.     and    edx,not 3
  533.     mov    __curbrk,edx
  534.  
  535.     ; put command string on the stack
  536.     push    es
  537.     mov    ebx,TMPSTACK
  538.     mov    esi,lpCmdLine        ; offset + selector
  539.     mov    edx,esi         ; get the
  540.     shr    edx,10h         ;   selector
  541.     cmp    dx,0            ; is it zero?
  542.     jne    okcpy            ; no, do the copy
  543.     mov    byte ptr ds:[ebx],0    ; put a trailing zero
  544.     jmp    short donecpy
  545. okcpy:    mov    es,dx
  546.     mov    ds:cmd_seg,es        ; save for later
  547.     movzx    eax,si            ;    use by getcmd
  548.     mov    ds:cmd_offset,eax
  549. again:    mov    al,byte ptr es:[si]
  550.     mov    byte ptr ds:[bx],al
  551.     cmp    al,0
  552.     je    donecpy
  553.     inc    si
  554.     inc    bx
  555.     jmp    short again
  556. donecpy:pop    es
  557.  
  558.     ; call initializer routines
  559.     call    initrtns
  560.  
  561.     ; push parms for WINMAIN
  562.     mov    ax,hInstance
  563.     mov    __pid,ax        ; save for use by getpid()
  564.     movzx    eax,ax
  565.     push    eax
  566.     mov    ax,hPrevInstance
  567.     movzx    eax,ax
  568.     push    eax
  569.     mov    eax,TMPSTACK
  570.     push    eax
  571.     mov    ax,cmdShow
  572.     movzx    eax,ax
  573.     push    eax
  574.  
  575.     call    WINMAIN
  576. public __exit_
  577. public __exit_with_msg_
  578. public _cstart_
  579. __exit_:
  580. __exit_with_msg_:
  581.     mov    esp,__STACKTOP        ; reset stack pointer
  582.     mov    ds,_LocalPtr         ; restore ds
  583.     ret
  584.  
  585. _cstart_ endp
  586.  
  587. __null_FPE_rtn proc near
  588.     ret                ; return
  589. __null_FPE_rtn endp
  590.  
  591. initrtns proc    near
  592.     push    esi            ; save esi
  593.     mov    esi,offset DGROUP:xistart; get start addr of table
  594.     mov    edi,offset DGROUP:xiend  ; get end   addr of table
  595. init1:    cmp    esi,edi         ; loop through the table
  596.     jae    init9            ; - quit if done
  597.     sub    edi,4            ; - point to start of entry
  598.     mov    eax,[edi]        ; - get address of routine
  599.     or    eax,eax         ; - check for null entry
  600.     je    init1            ; - try next one if it is null
  601.     call    eax            ; - call initializer routine
  602.     jmp    init1            ; endloop
  603. init9:    pop    esi            ; restore esi
  604.     ret                ; return
  605. initrtns endp
  606.  
  607. public __GETDS
  608. __GETDS proc near
  609.     mov    ds,cs:__saved_DS
  610.     ret
  611. __GETDS endp
  612.  
  613. _TEXT    ends
  614.  
  615.     end _cstart_
  616.