home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c495 / watcm951.arj / STARTUP.W32 / WSTART3R.ASM next >
Encoding:
Assembly Source File  |  1993-02-16  |  13.5 KB  |  547 lines

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