home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c495 / watcm951.arj / STARTUP.W32 / WSTART3S.ASM < prev   
Encoding:
Assembly Source File  |  1993-02-16  |  14.3 KB  |  699 lines

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