home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c500 / 1.ddi / STARTUP.W32 / WSTART3R.ASM next >
Encoding:
Assembly Source File  |  1992-05-28  |  11.8 KB  |  482 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 9.0
  11. ;
  12. ;    This must be assembled using the following command:
  13. ;        386asm wstart
  14. ;
  15. .387
  16. .386p
  17.  
  18. DGROUP group CONST,_DATA,DATA,XIB,XI,XIE,YIB,YI,YIE,_BSS,STACK
  19.  
  20. extrn __DOSseg__:byte
  21.  
  22.     extrn    WINMAIN : near
  23.  
  24. FarProc MACRO name
  25. public name
  26. name    label FWORD
  27.           dd 0
  28.           dw 0
  29. ENDM
  30.  
  31.     assume    nothing
  32.  
  33.     extrn    _edata        : byte        ; end of DATA (start of BSS)
  34.     extrn    _end        : byte        ; end of BSS (start of STACK)
  35.  
  36.     extrn    __InitRtns    : near
  37.     extrn    __FiniRtns    : near
  38.  
  39. _TEXT    segment use32 word public 'CODE'
  40.  
  41. XIB    segment word public 'DATA'
  42. XIB    ends
  43. XI    segment word public 'DATA'
  44. XI    ends
  45. XIE    segment word public 'DATA'
  46. XIE    ends
  47.  
  48. YIB    segment word public 'DATA'
  49. YIB    ends
  50. YI    segment word public 'DATA'
  51. YI    ends
  52. YIE    segment word public 'DATA'
  53. YIE    ends
  54.  
  55. _DATA    segment use32 word public 'DATA'
  56.  
  57. TMPSTACK    equ    100h    ; location on stack to copy command line
  58. DS16        equ    32    ; location for 16-bit ds
  59. ;
  60. ; these variables must all be kept in order
  61. ;
  62. _LocalPtr   dw    0
  63. public _LocalPtr
  64. hInstance  dw  0
  65. hPrevInstance  dw  0
  66. lpCmdLine  dd  0
  67. cmdShow    dw  0
  68. __no87       dw 0         ; non-zero => "NO87" environment var present
  69.  
  70. ; magical selectors for real memory
  71. public ___A000,___B000,___B800,___C000,___D000,___E000,___F000
  72. ___A000 dw    0
  73. ___B000 dw    0
  74. ___B800 dw    0
  75. ___C000 dw    0
  76. ___D000 dw    0
  77. ___E000 dw    0
  78. ___F000 dw    0
  79.  
  80. ; data ptrs
  81. FarProc __DataSelectorBaseAddr 
  82. FarProc __DataSelectorSizeAddr 
  83.  
  84. ; proc lists
  85. FarProc AddDLLEntryAddr
  86. FarProc Invoke16BitFunctionAddr
  87. FarProc WINFUNCTION0ADDR
  88. FarProc WINFUNCTION1ADDR
  89. FarProc WINFUNCTION2ADDR
  90. FarProc WINFUNCTION3ADDR
  91. FarProc WINFUNCTION4ADDR
  92. FarProc WINFUNCTION5ADDR
  93. FarProc WINFUNCTION6ADDR
  94. FarProc WINFUNCTION7ADDR
  95. FarProc WINFUNCTION8ADDR
  96. FarProc WINFUNCTION9ADDR
  97. FarProc WINFUNCTION10ADDR
  98. FarProc WINFUNCTION11ADDR
  99. FarProc WINFUNCTION12ADDR
  100. FarProc WINFUNCTION13ADDR
  101. FarProc WINFUNCTION14ADDR
  102. FarProc WINFUNCTION15ADDR
  103. FarProc WINFUNCTION16ADDR
  104. FarProc WINFUNCTION17ADDR
  105. FarProc WINFUNCTION18ADDR
  106. FarProc WINFUNCTION19ADDR
  107. FarProc WINFUNCTION20ADDR
  108. FarProc WINFUNCTION21ADDR
  109. FarProc WINFUNCTION22ADDR
  110. FarProc WINFUNCTION23ADDR
  111. FarProc WINFUNCTION24ADDR
  112. FarProc WINFUNCTION25ADDR
  113. FarProc WINFUNCTION26ADDR
  114. FarProc WINFUNCTION27ADDR
  115. FarProc WINFUNCTION28ADDR
  116. FarProc WINFUNCTION29ADDR
  117. FarProc WINFUNCTION30ADDR
  118. FarProc WINFUNCTION31ADDR
  119. FarProc WINFUNCTION32ADDR
  120. FarProc WINFUNCTION33ADDR
  121. FarProc WINFUNCTION34ADDR
  122. FarProc WINFUNCTION35ADDR
  123. FarProc WINFUNCTION36ADDR
  124. FarProc WINFUNCTION37ADDR
  125. FarProc WINFUNCTION38ADDR
  126. FarProc WINFUNCTION39ADDR
  127. FarProc WINFUNCTION40ADDR
  128. FarProc WINFUNCTION41ADDR
  129. FarProc WINFUNCTION42ADDR
  130. FarProc WINFUNCTION43ADDR
  131. FarProc WINFUNCTION44ADDR
  132. FarProc WINFUNCTION45ADDR
  133. FarProc WINFUNCTION46ADDR
  134. FarProc WINFUNCTION47ADDR
  135. FarProc WINFUNCTION48ADDR
  136. FarProc WINFUNCTION49ADDR
  137. FarProc WINFUNCTION50ADDR
  138. FarProc WINFUNCTION51ADDR
  139. FarProc WINFUNCTION52ADDR
  140. FarProc WINFUNCTION53ADDR
  141. FarProc WINFUNCTION54ADDR
  142. FarProc WINFUNCTION55ADDR
  143. FarProc WINFUNCTION56ADDR
  144. FarProc WINFUNCTION57ADDR
  145. FarProc WINFUNCTION58ADDR
  146. FarProc WINFUNCTION59ADDR
  147. FarProc WINFUNCTION60ADDR
  148. FarProc WINFUNCTION61ADDR
  149. FarProc WINFUNCTION62ADDR
  150. FarProc WINFUNCTION63ADDR
  151. FarProc WINFUNCTION64ADDR
  152. FarProc WINFUNCTION65ADDR
  153. FarProc WINFUNCTION66ADDR
  154. FarProc WINFUNCTION67ADDR
  155. FarProc WINFUNCTION68ADDR
  156. FarProc WINFUNCTION69ADDR
  157. FarProc WINFUNCTION70ADDR
  158. FarProc WINFUNCTION71ADDR
  159. FarProc WINFUNCTION72ADDR
  160. FarProc WINFUNCTION73ADDR
  161. FarProc WINFUNCTION74ADDR
  162. FarProc WINFUNCTION75ADDR
  163. FarProc WINFUNCTION76ADDR
  164. FarProc WINFUNCTION77ADDR
  165. FarProc WINFUNCTION78ADDR
  166. FarProc WINFUNCTION79ADDR
  167. FarProc WINFUNCTION80ADDR
  168. FarProc WINFUNCTION81ADDR
  169. FarProc WINFUNCTION82ADDR
  170. FarProc WINFUNCTION83ADDR
  171. FarProc WINFUNCTION84ADDR
  172. FarProc WINFUNCTION85ADDR
  173. FarProc WINFUNCTION86ADDR
  174. FarProc WINFUNCTION87ADDR
  175. FarProc WINFUNCTION88ADDR
  176. FarProc WINFUNCTION89ADDR
  177. FarProc WINFUNCTION90ADDR
  178. FarProc WINFUNCTION91ADDR
  179. FarProc WINFUNCTION92ADDR
  180. FarProc WINFUNCTION93ADDR
  181. FarProc WINFUNCTION94ADDR
  182. FarProc WINFUNCTION95ADDR
  183. FarProc WINFUNCTION96ADDR
  184. FarProc WINFUNCTION97ADDR
  185. FarProc WINFUNCTION98ADDR
  186. FarProc WINFUNCTION99ADDR
  187. FarProc WINFUNCTION100ADDR
  188. FarProc WINFUNCTION101ADDR
  189. FarProc WINFUNCTION102ADDR
  190. FarProc WINFUNCTION103ADDR
  191. FarProc WINFUNCTION104ADDR
  192. FarProc WINFUNCTION105ADDR
  193. FarProc WINFUNCTION106ADDR
  194. FarProc WINFUNCTION107ADDR
  195. FarProc WINFUNCTION108ADDR
  196. FarProc WINFUNCTION109ADDR
  197. FarProc WINFUNCTION110ADDR
  198. FarProc WINFUNCTION111ADDR
  199. FarProc WINFUNCTION112ADDR
  200. FarProc WINFUNCTION113ADDR
  201. FarProc WINFUNCTION114ADDR
  202. FarProc WINFUNCTION115ADDR
  203. FarProc WINFUNCTION116ADDR
  204. FarProc WINFUNCTION117ADDR
  205. FarProc WINFUNCTION118ADDR
  206. FarProc WINFUNCTION119ADDR
  207. FarProc WINFUNCTION120ADDR
  208. FarProc WINFUNCTION121ADDR
  209. FarProc WINFUNCTION122ADDR
  210. FarProc WINFUNCTION123ADDR
  211. FarProc WINFUNCTION124ADDR
  212. FarProc WINFUNCTION125ADDR
  213. FarProc WINFUNCTION126ADDR
  214. FarProc WINFUNCTION127ADDR
  215. FarProc WINFUNCTION128ADDR
  216. FarProc WINFUNCTION129ADDR
  217. FarProc WINFUNCTION130ADDR
  218. FarProc WINFUNCTION131ADDR
  219. FarProc WINFUNCTION132ADDR
  220. FarProc WINFUNCTION133ADDR
  221. FarProc WINFUNCTION134ADDR
  222. FarProc WINFUNCTION135ADDR
  223. FarProc WINFUNCTION136ADDR
  224. FarProc WINFUNCTION137ADDR
  225. FarProc WINFUNCTION138ADDR
  226. FarProc WINFUNCTION139ADDR
  227. FarProc WINFUNCTION140ADDR
  228. FarProc WINFUNCTION141ADDR
  229. FarProc WINFUNCTION142ADDR
  230. FarProc WINFUNCTION143ADDR
  231. FarProc WINFUNCTION144ADDR
  232. FarProc WINFUNCTION145ADDR
  233. FarProc WINFUNCTION146ADDR
  234. FarProc WINFUNCTION147ADDR
  235. FarProc WINFUNCTION148ADDR
  236. FarProc WINFUNCTION149ADDR
  237. FarProc WINFUNCTION150ADDR
  238. FarProc WINFUNCTION151ADDR
  239. FarProc WINFUNCTION152ADDR
  240. FarProc WINFUNCTION153ADDR
  241. FarProc WINFUNCTION154ADDR
  242. FarProc WINFUNCTION155ADDR
  243. FarProc WINFUNCTION156ADDR
  244. FarProc WINFUNCTION157ADDR
  245. FarProc WINFUNCTION158ADDR
  246. FarProc WINFUNCTION159ADDR
  247. FarProc WINFUNCTION160ADDR
  248. FarProc WINFUNCTION161ADDR
  249. FarProc WINFUNCTION162ADDR
  250. FarProc WINFUNCTION163ADDR
  251. FarProc WINFUNCTION164ADDR
  252. FarProc WINFUNCTION165ADDR
  253. FarProc WINFUNCTION166ADDR
  254. FarProc WINFUNCTION167ADDR
  255. FarProc WINFUNCTION168ADDR
  256. FarProc WINFUNCTION169ADDR
  257. FarProc WINFUNCTION170ADDR
  258. FarProc WINFUNCTION171ADDR
  259. FarProc WINFUNCTION172ADDR
  260. FarProc WINFUNCTION173ADDR
  261. FarProc WINFUNCTION174ADDR
  262. FarProc WINFUNCTION175ADDR
  263. FarProc WINFUNCTION176ADDR
  264. FarProc WINFUNCTION177ADDR
  265. FarProc WINFUNCTION178ADDR
  266. FarProc WINFUNCTION179ADDR
  267. FarProc WINFUNCTION180ADDR
  268. FarProc WINFUNCTION181ADDR
  269. FarProc WINFUNCTION182ADDR
  270. FarProc WINFUNCTION183ADDR
  271. FarProc WINFUNCTION184ADDR
  272. FarProc WINFUNCTION185ADDR
  273. FarProc WINFUNCTION186ADDR
  274. FarProc WINFUNCTION187ADDR
  275. FarProc WINFUNCTION188ADDR
  276. FarProc WINFUNCTION189ADDR
  277. FarProc WINFUNCTION190ADDR
  278. FarProc WINFUNCTION191ADDR
  279. FarProc WINFUNCTION192ADDR
  280. FarProc WINFUNCTION193ADDR
  281. FarProc WINFUNCTION194ADDR
  282. FarProc WINFUNCTION195ADDR
  283. FarProc WINFUNCTION196ADDR
  284. FarProc WINFUNCTION197ADDR
  285. FarProc WINFUNCTION198ADDR
  286. FarProc WINFUNCTION199ADDR
  287. FarProc WINFUNCTION200ADDR
  288. FarProc WINFUNCTION201ADDR
  289. FarProc WINFUNCTION202ADDR
  290. FarProc WINFUNCTION203ADDR
  291. FarProc WINFUNCTION204ADDR
  292. FarProc WINFUNCTION205ADDR
  293. FarProc WINFUNCTION206ADDR
  294. FarProc WINFUNCTION207ADDR
  295. FarProc WINFUNCTION208ADDR
  296. FarProc WINFUNCTION209ADDR
  297. FarProc WINFUNCTION210ADDR
  298. FarProc WINFUNCTION211ADDR
  299. FarProc WINFUNCTION212ADDR
  300. FarProc WINFUNCTION213ADDR
  301. FarProc WINFUNCTION214ADDR
  302. FarProc WINFUNCTION215ADDR
  303. FarProc WINFUNCTION216ADDR
  304. FarProc WINFUNCTION217ADDR
  305. FarProc WINFUNCTION218ADDR
  306. FarProc WINFUNCTION219ADDR
  307. FarProc WINFUNCTION220ADDR
  308. FarProc WINFUNCTION221ADDR
  309. FarProc WINFUNCTION222ADDR
  310. FarProc WINFUNCTION223ADDR
  311. FarProc WINFUNCTION224ADDR
  312. FarProc WINFUNCTION225ADDR
  313. FarProc WINFUNCTION226ADDR
  314. FarProc WINFUNCTION227ADDR
  315. FarProc WINFUNCTION228ADDR
  316. FarProc WINFUNCTION229ADDR
  317. FarProc WINFUNCTION230ADDR
  318. FarProc WINFUNCTION231ADDR
  319. FarProc WINFUNCTION232ADDR
  320. FarProc WINFUNCTION233ADDR
  321. FarProc WINFUNCTION234ADDR
  322. FarProc WINFUNCTION235ADDR
  323. FarProc WINFUNCTION236ADDR
  324. FarProc WINFUNCTION237ADDR
  325. FarProc WINFUNCTION238ADDR
  326. FarProc WINFUNCTION239ADDR
  327.  
  328. __LpCmdLine dd 0        ; pointer to raw command line
  329. __LpPgmName dd 0        ; pointer to program name (for argv[0])
  330. __STACKLOW dd 0         ; lowest address in stack
  331. __STACKTOP dd 0         ; lowest address in stack
  332. __curbrk   dd 0         ; top of usable memory
  333. __cbyte    dd 0         ; used by getch, getche
  334. __osmajor  db 4         ; major DOS version number
  335. __osminor  db 0         ; minor DOS version number
  336. __Extender db 0         ; 10 => 386 windows
  337. __init_387_emulator db 0    ; to prevent emulator from coming in with
  338.                 ;    -fpi
  339.  
  340. public __pid
  341. __pid       dw 0
  342. public __wincmdptr
  343. __wincmdptr LABEL FWORD
  344. cmd_offset dd 0
  345. cmd_seg    dw 0
  346.  
  347.  __FPE_handler label dword
  348. ___FPE_handler dd __null_FPE_rtn ; FPE handler
  349.  
  350.     public    __LpCmdLine
  351.     public    __LpPgmName
  352.     public    __STACKLOW
  353.     public    __STACKTOP
  354.     public    __curbrk
  355.     public    __cbyte
  356.     public    __osmajor
  357.     public    __osminor
  358.     public    __Extender
  359.     public    __no87
  360.     public     __FPE_handler
  361.     public    ___FPE_handler
  362.     public    __init_387_emulator
  363.  
  364. _DATA    ends
  365.  
  366. STACK    segment para stack 'STACK'
  367. STACK    ends
  368.  
  369. _BSS          segment word public 'BSS'
  370. _BSS          ends
  371.  
  372. CONST    segment word public 'DATA'
  373. CONST    ends
  374.  
  375. DATA    segment word public 'DATA'
  376. DATA    ends
  377.  
  378.     assume    cs:_TEXT
  379.     assume    ds:_DATA
  380.     assume    fs:_DATA
  381.     assume    gs:_DATA
  382.     assume    ss:_DATA
  383.  
  384. __saved_DS dw 0
  385. _cstart_ proc  far
  386.     dd    offset    hInstance ; loader starts execution 8 bytes past here
  387.     dd    _end
  388.     mov    _LocalPtr,gs
  389.     mov    WORD PTR ds:DS16,gs    ; save the data segment at stack bot
  390.  
  391.     mov    __STACKTOP,esp
  392.     mov    __STACKLOW,100h        ; 
  393.  
  394.     ; initialize bss
  395.     lea    ecx,DGROUP:_end     ; end of _BSS segment (start of free)
  396.     lea    edi,DGROUP:_edata    ; start of _BSS segment
  397.     sub    ecx,edi         ; calc # of bytes in _BSS segment
  398.     xor    eax,eax         ; zero the _BSS segment
  399.     mov    dl,cl            ; copy the lower bits of size
  400.     shr    ecx,2            ; get number of dwords
  401.     rep    stosd            ; copy them
  402.     mov    cl,dl            ; get lower bits
  403.     and    cl,3            ; get number of bytes left (modulo 4)
  404.     rep    stosb
  405.  
  406.     ; save ds
  407.     lea    ecx,__saved_DS
  408.     mov    ds:[ecx],ds
  409.  
  410.     ; set up heap
  411.     lea    edx,DGROUP:_end     ; start of free
  412.     add    edx,3
  413.     and    edx,not 3
  414.     mov    __curbrk,edx
  415.  
  416.     ; put command string on the stack
  417.     push    es
  418.     mov    ebx,TMPSTACK
  419.     mov    __LpCmdLine,ebx        ; for use by initargv
  420.     mov    esi,lpCmdLine        ; offset + selector
  421.     mov    edx,esi         ; get the
  422.     shr    edx,10h         ;   selector
  423.     cmp    edx,0            ; is it zero?
  424.     jne    okcpy            ; no, do the copy
  425.     mov    byte ptr ds:[ebx],0    ; put a trailing zero
  426.     jmp    short donecpy
  427. okcpy:    mov    es,dx
  428.     mov    ds:cmd_seg,es        ; save for later
  429.     movzx    esi,si            ;    use by getcmd
  430.     mov    ds:cmd_offset,esi
  431. again:    mov    al,byte ptr es:[esi]
  432.     mov    byte ptr ds:[ebx],al
  433.     cmp    al,0
  434.     je    donecpy
  435.     inc    esi
  436.     inc    ebx
  437.     jmp    short again
  438. donecpy:pop    es
  439.  
  440.     call    __InitRtns        ; call initializer routines
  441.  
  442.     ; push parms for WINMAIN
  443.     mov    ax,hInstance
  444.     mov    __pid,ax        ; save for use by getpid()
  445.     movzx    eax,ax
  446.     push    eax
  447.     mov    ax,hPrevInstance
  448.     movzx    eax,ax
  449.     push    eax
  450.     mov    eax,TMPSTACK
  451.     push    eax
  452.     mov    ax,cmdShow
  453.     movzx    eax,ax
  454.     push    eax
  455.  
  456.     call    WINMAIN
  457. public __exit_
  458. public _cstart_
  459. __exit_:
  460.     push    eax            ; save return value
  461.     call    __FiniRtns        ; call finalizer routines
  462.     pop    eax            ; restore return value
  463.     mov    esp,__STACKTOP        ; reset stack pointer
  464.     mov    ds,_LocalPtr        ; restore ds
  465.     ret
  466.  
  467. _cstart_ endp
  468.  
  469. __null_FPE_rtn proc near
  470.     ret                ; return
  471. __null_FPE_rtn endp
  472.  
  473. public __GETDS
  474. __GETDS proc near
  475.     mov    ds,cs:__saved_DS
  476.     ret
  477. __GETDS endp
  478.  
  479. _TEXT    ends
  480.  
  481.     end _cstart_
  482.