home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c500 / 1.ddi / STARTUP.W32 / WSTART3S.ASM < prev   
Encoding:
Assembly Source File  |  1992-05-28  |  12.5 KB  |  617 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. ;%     Copyright (C) 1990, by WATCOM Systems Inc. All rights       %
  138. ;%     reserved. No part of this software may be reproduced       %
  139. ;%     in any form or by any means - graphic, electronic or       %
  140. ;%     mechanical, including photocopying, recording, taping       %
  141. ;%     or information storage and retrieval systems - except       %
  142. ;%     with the written permission of WATCOM Systems Inc.       %
  143. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  144. ;
  145. ; startup code for WATCOM C 386 (Windows Extender) Version 9.0
  146. ;
  147. ;    This must be assembled using the following command:
  148. ;        386asm wstart
  149. ;
  150. .387
  151. .386p
  152.  
  153. DGROUP group CONST,_DATA,DATA,XIB,XI,XIE,YIB,YI,YIE,_BSS,STACK
  154.  
  155. extrn __DOSseg__:byte
  156.  
  157.     extrn    WINMAIN : near
  158.  
  159. FarProc MACRO name
  160. public name
  161. name    label FWORD
  162.           dd 0
  163.           dw 0
  164. ENDM
  165.  
  166.     assume    nothing
  167.  
  168.     extrn    _edata        : byte        ; end of DATA (start of BSS)
  169.     extrn    _end        : byte        ; end of BSS (start of STACK)
  170.  
  171.     extrn    __InitRtns    : near
  172.     extrn    __FiniRtns    : near
  173.  
  174. _TEXT    segment use32 word public 'CODE'
  175.  
  176. XIB    segment word public 'DATA'
  177. XIB    ends
  178. XI    segment word public 'DATA'
  179. XI    ends
  180. XIE    segment word public 'DATA'
  181. XIE    ends
  182.  
  183. YIB    segment word public 'DATA'
  184. YIB    ends
  185. YI    segment word public 'DATA'
  186. YI    ends
  187. YIE    segment word public 'DATA'
  188. YIE    ends
  189.  
  190. _DATA    segment use32 word public 'DATA'
  191.  
  192. TMPSTACK    equ    100h    ; location on stack to copy command line
  193. DS16        equ    32    ; location for 16-bit ds
  194. ;
  195. ; these variables must all be kept in order
  196. ;
  197. _LocalPtr   dw    0
  198. public _LocalPtr
  199. hInstance  dw  0
  200. hPrevInstance  dw  0
  201. lpCmdLine  dd  0
  202. cmdShow    dw  0
  203. __no87       dw 0         ; non-zero => "NO87" environment var present
  204.  
  205. ; magical selectors for real memory
  206. public ___A000,___B000,___B800,___C000,___D000,___E000,___F000
  207. ___A000 dw    0
  208. ___B000 dw    0
  209. ___B800 dw    0
  210. ___C000 dw    0
  211. ___D000 dw    0
  212. ___E000 dw    0
  213. ___F000 dw    0
  214.  
  215. ; data ptrs
  216. FarProc  _DataSelectorBaseAddr 
  217. FarProc  _DataSelectorSizeAddr 
  218.  
  219. ; proc lists
  220. FarProc AddDLLEntryAddr
  221. FarProc Invoke16BitFunctionAddr
  222. FarProc WINFUNCTION0ADDR
  223. FarProc WINFUNCTION1ADDR
  224. FarProc WINFUNCTION2ADDR
  225. FarProc WINFUNCTION3ADDR
  226. FarProc WINFUNCTION4ADDR
  227. FarProc WINFUNCTION5ADDR
  228. FarProc WINFUNCTION6ADDR
  229. FarProc WINFUNCTION7ADDR
  230. FarProc WINFUNCTION8ADDR
  231. FarProc WINFUNCTION9ADDR
  232. FarProc WINFUNCTION10ADDR
  233. FarProc WINFUNCTION11ADDR
  234. FarProc WINFUNCTION12ADDR
  235. FarProc WINFUNCTION13ADDR
  236. FarProc WINFUNCTION14ADDR
  237. FarProc WINFUNCTION15ADDR
  238. FarProc WINFUNCTION16ADDR
  239. FarProc WINFUNCTION17ADDR
  240. FarProc WINFUNCTION18ADDR
  241. FarProc WINFUNCTION19ADDR
  242. FarProc WINFUNCTION20ADDR
  243. FarProc WINFUNCTION21ADDR
  244. FarProc WINFUNCTION22ADDR
  245. FarProc WINFUNCTION23ADDR
  246. FarProc WINFUNCTION24ADDR
  247. FarProc WINFUNCTION25ADDR
  248. FarProc WINFUNCTION26ADDR
  249. FarProc WINFUNCTION27ADDR
  250. FarProc WINFUNCTION28ADDR
  251. FarProc WINFUNCTION29ADDR
  252. FarProc WINFUNCTION30ADDR
  253. FarProc WINFUNCTION31ADDR
  254. FarProc WINFUNCTION32ADDR
  255. FarProc WINFUNCTION33ADDR
  256. FarProc WINFUNCTION34ADDR
  257. FarProc WINFUNCTION35ADDR
  258. FarProc WINFUNCTION36ADDR
  259. FarProc WINFUNCTION37ADDR
  260. FarProc WINFUNCTION38ADDR
  261. FarProc WINFUNCTION39ADDR
  262. FarProc WINFUNCTION40ADDR
  263. FarProc WINFUNCTION41ADDR
  264. FarProc WINFUNCTION42ADDR
  265. FarProc WINFUNCTION43ADDR
  266. FarProc WINFUNCTION44ADDR
  267. FarProc WINFUNCTION45ADDR
  268. FarProc WINFUNCTION46ADDR
  269. FarProc WINFUNCTION47ADDR
  270. FarProc WINFUNCTION48ADDR
  271. FarProc WINFUNCTION49ADDR
  272. FarProc WINFUNCTION50ADDR
  273. FarProc WINFUNCTION51ADDR
  274. FarProc WINFUNCTION52ADDR
  275. FarProc WINFUNCTION53ADDR
  276. FarProc WINFUNCTION54ADDR
  277. FarProc WINFUNCTION55ADDR
  278. FarProc WINFUNCTION56ADDR
  279. FarProc WINFUNCTION57ADDR
  280. FarProc WINFUNCTION58ADDR
  281. FarProc WINFUNCTION59ADDR
  282. FarProc WINFUNCTION60ADDR
  283. FarProc WINFUNCTION61ADDR
  284. FarProc WINFUNCTION62ADDR
  285. FarProc WINFUNCTION63ADDR
  286. FarProc WINFUNCTION64ADDR
  287. FarProc WINFUNCTION65ADDR
  288. FarProc WINFUNCTION66ADDR
  289. FarProc WINFUNCTION67ADDR
  290. FarProc WINFUNCTION68ADDR
  291. FarProc WINFUNCTION69ADDR
  292. FarProc WINFUNCTION70ADDR
  293. FarProc WINFUNCTION71ADDR
  294. FarProc WINFUNCTION72ADDR
  295. FarProc WINFUNCTION73ADDR
  296. FarProc WINFUNCTION74ADDR
  297. FarProc WINFUNCTION75ADDR
  298. FarProc WINFUNCTION76ADDR
  299. FarProc WINFUNCTION77ADDR
  300. FarProc WINFUNCTION78ADDR
  301. FarProc WINFUNCTION79ADDR
  302. FarProc WINFUNCTION80ADDR
  303. FarProc WINFUNCTION81ADDR
  304. FarProc WINFUNCTION82ADDR
  305. FarProc WINFUNCTION83ADDR
  306. FarProc WINFUNCTION84ADDR
  307. FarProc WINFUNCTION85ADDR
  308. FarProc WINFUNCTION86ADDR
  309. FarProc WINFUNCTION87ADDR
  310. FarProc WINFUNCTION88ADDR
  311. FarProc WINFUNCTION89ADDR
  312. FarProc WINFUNCTION90ADDR
  313. FarProc WINFUNCTION91ADDR
  314. FarProc WINFUNCTION92ADDR
  315. FarProc WINFUNCTION93ADDR
  316. FarProc WINFUNCTION94ADDR
  317. FarProc WINFUNCTION95ADDR
  318. FarProc WINFUNCTION96ADDR
  319. FarProc WINFUNCTION97ADDR
  320. FarProc WINFUNCTION98ADDR
  321. FarProc WINFUNCTION99ADDR
  322. FarProc WINFUNCTION100ADDR
  323. FarProc WINFUNCTION101ADDR
  324. FarProc WINFUNCTION102ADDR
  325. FarProc WINFUNCTION103ADDR
  326. FarProc WINFUNCTION104ADDR
  327. FarProc WINFUNCTION105ADDR
  328. FarProc WINFUNCTION106ADDR
  329. FarProc WINFUNCTION107ADDR
  330. FarProc WINFUNCTION108ADDR
  331. FarProc WINFUNCTION109ADDR
  332. FarProc WINFUNCTION110ADDR
  333. FarProc WINFUNCTION111ADDR
  334. FarProc WINFUNCTION112ADDR
  335. FarProc WINFUNCTION113ADDR
  336. FarProc WINFUNCTION114ADDR
  337. FarProc WINFUNCTION115ADDR
  338. FarProc WINFUNCTION116ADDR
  339. FarProc WINFUNCTION117ADDR
  340. FarProc WINFUNCTION118ADDR
  341. FarProc WINFUNCTION119ADDR
  342. FarProc WINFUNCTION120ADDR
  343. FarProc WINFUNCTION121ADDR
  344. FarProc WINFUNCTION122ADDR
  345. FarProc WINFUNCTION123ADDR
  346. FarProc WINFUNCTION124ADDR
  347. FarProc WINFUNCTION125ADDR
  348. FarProc WINFUNCTION126ADDR
  349. FarProc WINFUNCTION127ADDR
  350. FarProc WINFUNCTION128ADDR
  351. FarProc WINFUNCTION129ADDR
  352. FarProc WINFUNCTION130ADDR
  353. FarProc WINFUNCTION131ADDR
  354. FarProc WINFUNCTION132ADDR
  355. FarProc WINFUNCTION133ADDR
  356. FarProc WINFUNCTION134ADDR
  357. FarProc WINFUNCTION135ADDR
  358. FarProc WINFUNCTION136ADDR
  359. FarProc WINFUNCTION137ADDR
  360. FarProc WINFUNCTION138ADDR
  361. FarProc WINFUNCTION139ADDR
  362. FarProc WINFUNCTION140ADDR
  363. FarProc WINFUNCTION141ADDR
  364. FarProc WINFUNCTION142ADDR
  365. FarProc WINFUNCTION143ADDR
  366. FarProc WINFUNCTION144ADDR
  367. FarProc WINFUNCTION145ADDR
  368. FarProc WINFUNCTION146ADDR
  369. FarProc WINFUNCTION147ADDR
  370. FarProc WINFUNCTION148ADDR
  371. FarProc WINFUNCTION149ADDR
  372. FarProc WINFUNCTION150ADDR
  373. FarProc WINFUNCTION151ADDR
  374. FarProc WINFUNCTION152ADDR
  375. FarProc WINFUNCTION153ADDR
  376. FarProc WINFUNCTION154ADDR
  377. FarProc WINFUNCTION155ADDR
  378. FarProc WINFUNCTION156ADDR
  379. FarProc WINFUNCTION157ADDR
  380. FarProc WINFUNCTION158ADDR
  381. FarProc WINFUNCTION159ADDR
  382. FarProc WINFUNCTION160ADDR
  383. FarProc WINFUNCTION161ADDR
  384. FarProc WINFUNCTION162ADDR
  385. FarProc WINFUNCTION163ADDR
  386. FarProc WINFUNCTION164ADDR
  387. FarProc WINFUNCTION165ADDR
  388. FarProc WINFUNCTION166ADDR
  389. FarProc WINFUNCTION167ADDR
  390. FarProc WINFUNCTION168ADDR
  391. FarProc WINFUNCTION169ADDR
  392. FarProc WINFUNCTION170ADDR
  393. FarProc WINFUNCTION171ADDR
  394. FarProc WINFUNCTION172ADDR
  395. FarProc WINFUNCTION173ADDR
  396. FarProc WINFUNCTION174ADDR
  397. FarProc WINFUNCTION175ADDR
  398. FarProc WINFUNCTION176ADDR
  399. FarProc WINFUNCTION177ADDR
  400. FarProc WINFUNCTION178ADDR
  401. FarProc WINFUNCTION179ADDR
  402. FarProc WINFUNCTION180ADDR
  403. FarProc WINFUNCTION181ADDR
  404. FarProc WINFUNCTION182ADDR
  405. FarProc WINFUNCTION183ADDR
  406. FarProc WINFUNCTION184ADDR
  407. FarProc WINFUNCTION185ADDR
  408. FarProc WINFUNCTION186ADDR
  409. FarProc WINFUNCTION187ADDR
  410. FarProc WINFUNCTION188ADDR
  411. FarProc WINFUNCTION189ADDR
  412. FarProc WINFUNCTION190ADDR
  413. FarProc WINFUNCTION191ADDR
  414. FarProc WINFUNCTION192ADDR
  415. FarProc WINFUNCTION193ADDR
  416. FarProc WINFUNCTION194ADDR
  417. FarProc WINFUNCTION195ADDR
  418. FarProc WINFUNCTION196ADDR
  419. FarProc WINFUNCTION197ADDR
  420. FarProc WINFUNCTION198ADDR
  421. FarProc WINFUNCTION199ADDR
  422. FarProc WINFUNCTION200ADDR
  423. FarProc WINFUNCTION201ADDR
  424. FarProc WINFUNCTION202ADDR
  425. FarProc WINFUNCTION203ADDR
  426. FarProc WINFUNCTION204ADDR
  427. FarProc WINFUNCTION205ADDR
  428. FarProc WINFUNCTION206ADDR
  429. FarProc WINFUNCTION207ADDR
  430. FarProc WINFUNCTION208ADDR
  431. FarProc WINFUNCTION209ADDR
  432. FarProc WINFUNCTION210ADDR
  433. FarProc WINFUNCTION211ADDR
  434. FarProc WINFUNCTION212ADDR
  435. FarProc WINFUNCTION213ADDR
  436. FarProc WINFUNCTION214ADDR
  437. FarProc WINFUNCTION215ADDR
  438. FarProc WINFUNCTION216ADDR
  439. FarProc WINFUNCTION217ADDR
  440. FarProc WINFUNCTION218ADDR
  441. FarProc WINFUNCTION219ADDR
  442. FarProc WINFUNCTION220ADDR
  443. FarProc WINFUNCTION221ADDR
  444. FarProc WINFUNCTION222ADDR
  445. FarProc WINFUNCTION223ADDR
  446. FarProc WINFUNCTION224ADDR
  447. FarProc WINFUNCTION225ADDR
  448. FarProc WINFUNCTION226ADDR
  449. FarProc WINFUNCTION227ADDR
  450. FarProc WINFUNCTION228ADDR
  451. FarProc WINFUNCTION229ADDR
  452. FarProc WINFUNCTION230ADDR
  453. FarProc WINFUNCTION231ADDR
  454. FarProc WINFUNCTION232ADDR
  455. FarProc WINFUNCTION233ADDR
  456. FarProc WINFUNCTION234ADDR
  457. FarProc WINFUNCTION235ADDR
  458. FarProc WINFUNCTION236ADDR
  459. FarProc WINFUNCTION237ADDR
  460. FarProc WINFUNCTION238ADDR
  461. FarProc WINFUNCTION239ADDR
  462.  
  463.  _LpCmdLine dd 0        ; pointer to raw command line
  464.  _LpPgmName dd 0        ; pointer to program name (for argv[0])
  465.  _STACKLOW dd 0         ; lowest address in stack
  466.  _STACKTOP dd 0         ; lowest address in stack
  467.  _curbrk   dd 0         ; top of usable memory
  468.  _cbyte    dd 0         ; used by getch, getche
  469.  _osmajor  db 4         ; major DOS version number
  470.  _osminor  db 0         ; minor DOS version number
  471.  _Extender db 0         ; 10 => 386 windows
  472. __init_387_emulator db 0    ; to prevent emulator from coming in with
  473.                 ;    -fpi
  474.  
  475. public  _pid
  476.  _pid       dw 0
  477. public  _wincmdptr
  478.  _wincmdptr LABEL FWORD
  479. cmd_offset dd 0
  480. cmd_seg    dw 0
  481.  
  482.  __FPE_handler label dword
  483. ___FPE_handler dd __null_FPE_rtn ; FPE handler
  484.  
  485.     public     _LpCmdLine
  486.     public     _LpPgmName
  487.     public     _STACKLOW
  488.     public     _STACKTOP
  489.     public     _curbrk
  490.     public     _cbyte
  491.     public     _osmajor
  492.     public     _osminor
  493.     public     _Extender
  494.     public    __no87
  495.     public     __FPE_handler
  496.     public    ___FPE_handler
  497.     public    __init_387_emulator
  498.  
  499. _DATA    ends
  500.  
  501. STACK    segment para stack 'STACK'
  502. STACK    ends
  503.  
  504. _BSS          segment word public 'BSS'
  505. _BSS          ends
  506.  
  507. CONST    segment word public 'DATA'
  508. CONST    ends
  509.  
  510. DATA    segment word public 'DATA'
  511. DATA    ends
  512.  
  513.     assume    cs:_TEXT
  514.     assume    ds:_DATA
  515.     assume    fs:_DATA
  516.     assume    gs:_DATA
  517.     assume    ss:_DATA
  518.  
  519. __saved_DS dw 0
  520. _cstart_ proc  far
  521.     dd    offset    hInstance ; loader starts execution 8 bytes past here
  522.     dd    _end
  523.     mov    _LocalPtr,gs
  524.     mov    WORD PTR ds:DS16,gs    ; save the data segment at stack bot
  525.  
  526.     mov     _STACKTOP,esp
  527.     mov     _STACKLOW,100h        ; 
  528.  
  529.     ; initialize bss
  530.     lea    ecx,DGROUP:_end     ; end of _BSS segment (start of free)
  531.     lea    edi,DGROUP:_edata    ; start of _BSS segment
  532.     sub    ecx,edi         ; calc # of bytes in _BSS segment
  533.     xor    eax,eax         ; zero the _BSS segment
  534.     mov    dl,cl            ; copy the lower bits of size
  535.     shr    ecx,2            ; get number of dwords
  536.     rep    stosd            ; copy them
  537.     mov    cl,dl            ; get lower bits
  538.     and    cl,3            ; get number of bytes left (modulo 4)
  539.     rep    stosb
  540.  
  541.     ; save ds
  542.     lea    ecx,__saved_DS
  543.     mov    ds:[ecx],ds
  544.  
  545.     ; set up heap
  546.     lea    edx,DGROUP:_end     ; start of free
  547.     add    edx,3
  548.     and    edx,not 3
  549.     mov     _curbrk,edx
  550.  
  551.     ; put command string on the stack
  552.     push    es
  553.     mov    ebx,TMPSTACK
  554.     mov     _LpCmdLine,ebx        ; for use by initargv
  555.     mov    esi,lpCmdLine        ; offset + selector
  556.     mov    edx,esi         ; get the
  557.     shr    edx,10h         ;   selector
  558.     cmp    edx,0            ; is it zero?
  559.     jne    okcpy            ; no, do the copy
  560.     mov    byte ptr ds:[ebx],0    ; put a trailing zero
  561.     jmp    short donecpy
  562. okcpy:    mov    es,dx
  563.     mov    ds:cmd_seg,es        ; save for later
  564.     movzx    esi,si            ;    use by getcmd
  565.     mov    ds:cmd_offset,esi
  566. again:    mov    al,byte ptr es:[esi]
  567.     mov    byte ptr ds:[ebx],al
  568.     cmp    al,0
  569.     je    donecpy
  570.     inc    esi
  571.     inc    ebx
  572.     jmp    short again
  573. donecpy:pop    es
  574.  
  575.     call    __InitRtns        ; call initializer routines
  576.  
  577.     ; push parms for WINMAIN
  578.     mov    ax,hInstance
  579.     mov     _pid,ax        ; save for use by getpid()
  580.     movzx    eax,ax
  581.     push    eax
  582.     mov    ax,hPrevInstance
  583.     movzx    eax,ax
  584.     push    eax
  585.     mov    eax,TMPSTACK
  586.     push    eax
  587.     mov    ax,cmdShow
  588.     movzx    eax,ax
  589.     push    eax
  590.  
  591.     call    WINMAIN
  592. public  __exit
  593. public _cstart_
  594.  __exit:
  595.     push    eax            ; save return value
  596.     call    __FiniRtns        ; call finalizer routines
  597.     pop    eax            ; restore return value
  598.     mov    esp, _STACKTOP        ; reset stack pointer
  599.     mov    ds,_LocalPtr        ; restore ds
  600.     ret
  601.  
  602. _cstart_ endp
  603.  
  604. __null_FPE_rtn proc near
  605.     ret                ; return
  606. __null_FPE_rtn endp
  607.  
  608. public __GETDS
  609. __GETDS proc near
  610.     mov    ds,cs:__saved_DS
  611.     ret
  612. __GETDS endp
  613.  
  614. _TEXT    ends
  615.  
  616.     end _cstart_
  617.