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