home *** CD-ROM | disk | FTP | other *** search
- ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- ;% Copyright (C) 1990, by WATCOM Systems Inc. All rights %
- ;% reserved. No part of this software may be reproduced %
- ;% in any form or by any means - graphic, electronic or %
- ;% mechanical, including photocopying, recording, taping %
- ;% or information storage and retrieval systems - except %
- ;% with the written permission of WATCOM Systems Inc. %
- ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- ;
- ; startup code for WATCOM C 386 (Windows Extender) Version 8.0
- ;
- ; This must be assembled using the following command:
- ; 386asm wstart
- ;
- ; By: Craig Eisler
- ; December 1990-June 1991
- ;
- .387
- .386p
-
- DGROUP group CONST,_DATA,DATA,_emu_inits,_emu_init,_emu_inite,EXEC_S,EXEC,EXEC_E,XIB,XI,XIE,_BSS,STACK
-
- extrn __DOSseg__:byte
-
- CallBack Macro name
- public name
- name dd 0
- ENDM
-
- extrn WINMAIN : near
-
- FarProc MACRO name
- public name
- name label FWORD
- dd 0
- dw 0
- ENDM
-
- assume nothing
-
- extrn _edata : byte ; end of DATA (start of BSS)
- extrn _end : byte ; end of BSS (start of STACK)
-
- extrn _nfree_ : near
-
- _TEXT segment use32 word public 'CODE'
-
- XIB segment word public 'DATA'
- xistart label byte
- XIB ends
- XI segment word public 'DATA'
- XI ends
- XIE segment word public 'DATA'
- xiend label byte
- XIE ends
-
- _DATA segment use32 word public 'DATA'
-
- TMPSTACK equ 100h ; location on stack to copy command line
- DS16 equ 0 ; location for 16-bit ds
- ;
- ; these variables must all be kept in order
- ;
- _LocalPtr dw 0
- public _LocalPtr
- hInstance dw 0
- hPrevInstance dw 0
- lpCmdLine dd 0
- cmdShow dw 0
- __no87 dw 0 ; non-zero => "NO87" environment var present
-
- ; magical selectors for real memory
- public ___A000,___B000,___B800,___C000,___D000,___E000,___F000
- ___A000 dw 0
- ___B000 dw 0
- ___B800 dw 0
- ___C000 dw 0
- ___D000 dw 0
- ___E000 dw 0
- ___F000 dw 0
-
- ; proc lists
- FarProc AddCBEntryAddr
- FarProc AddDLLEntryAddr
- FarProc Gimme16BitCallBackAddr
- FarProc Release16BitCallBackAddr
- FarProc Invoke16BitFunctionAddr
- FarProc WINFUNCTION0ADDR
- FarProc WINFUNCTION1ADDR
- FarProc WINFUNCTION2ADDR
- FarProc WINFUNCTION3ADDR
- FarProc WINFUNCTION4ADDR
- FarProc WINFUNCTION5ADDR
- FarProc WINFUNCTION6ADDR
- FarProc WINFUNCTION7ADDR
- FarProc WINFUNCTION8ADDR
- FarProc WINFUNCTION9ADDR
- FarProc WINFUNCTION10ADDR
- FarProc WINFUNCTION11ADDR
- FarProc WINFUNCTION12ADDR
- FarProc WINFUNCTION13ADDR
- FarProc WINFUNCTION14ADDR
- FarProc WINFUNCTION15ADDR
- FarProc WINFUNCTION16ADDR
- FarProc WINFUNCTION17ADDR
- FarProc WINFUNCTION18ADDR
- FarProc WINFUNCTION19ADDR
- FarProc WINFUNCTION20ADDR
- FarProc WINFUNCTION21ADDR
- FarProc WINFUNCTION22ADDR
- FarProc WINFUNCTION23ADDR
- FarProc WINFUNCTION24ADDR
- FarProc WINFUNCTION25ADDR
- FarProc WINFUNCTION26ADDR
- FarProc WINFUNCTION27ADDR
- FarProc WINFUNCTION28ADDR
- FarProc WINFUNCTION29ADDR
- FarProc WINFUNCTION30ADDR
- FarProc WINFUNCTION31ADDR
- FarProc WINFUNCTION32ADDR
- FarProc WINFUNCTION33ADDR
- FarProc WINFUNCTION34ADDR
- FarProc WINFUNCTION35ADDR
- FarProc WINFUNCTION36ADDR
- FarProc WINFUNCTION37ADDR
- FarProc WINFUNCTION38ADDR
- FarProc WINFUNCTION39ADDR
- FarProc WINFUNCTION40ADDR
- FarProc WINFUNCTION41ADDR
- FarProc WINFUNCTION42ADDR
- FarProc WINFUNCTION43ADDR
- FarProc WINFUNCTION44ADDR
- FarProc WINFUNCTION45ADDR
- FarProc WINFUNCTION46ADDR
- FarProc WINFUNCTION47ADDR
- FarProc WINFUNCTION48ADDR
- FarProc WINFUNCTION49ADDR
- FarProc WINFUNCTION50ADDR
- FarProc WINFUNCTION51ADDR
- FarProc WINFUNCTION52ADDR
- FarProc WINFUNCTION53ADDR
- FarProc WINFUNCTION54ADDR
- FarProc WINFUNCTION55ADDR
- FarProc WINFUNCTION56ADDR
- FarProc WINFUNCTION57ADDR
- FarProc WINFUNCTION58ADDR
- FarProc WINFUNCTION59ADDR
- FarProc WINFUNCTION60ADDR
- FarProc WINFUNCTION61ADDR
- FarProc WINFUNCTION62ADDR
- FarProc WINFUNCTION63ADDR
- FarProc WINFUNCTION64ADDR
- FarProc WINFUNCTION65ADDR
- FarProc WINFUNCTION66ADDR
- FarProc WINFUNCTION67ADDR
- FarProc WINFUNCTION68ADDR
- FarProc WINFUNCTION69ADDR
- FarProc WINFUNCTION70ADDR
- FarProc WINFUNCTION71ADDR
- FarProc WINFUNCTION72ADDR
- FarProc WINFUNCTION73ADDR
- FarProc WINFUNCTION74ADDR
- FarProc WINFUNCTION75ADDR
- FarProc WINFUNCTION76ADDR
- FarProc WINFUNCTION77ADDR
- FarProc WINFUNCTION78ADDR
- FarProc WINFUNCTION79ADDR
- FarProc WINFUNCTION80ADDR
- FarProc WINFUNCTION81ADDR
- FarProc WINFUNCTION82ADDR
- FarProc WINFUNCTION83ADDR
- FarProc WINFUNCTION84ADDR
- FarProc WINFUNCTION85ADDR
- FarProc WINFUNCTION86ADDR
- FarProc WINFUNCTION87ADDR
- FarProc WINFUNCTION88ADDR
- FarProc WINFUNCTION89ADDR
- FarProc WINFUNCTION90ADDR
- FarProc WINFUNCTION91ADDR
- FarProc WINFUNCTION92ADDR
- FarProc WINFUNCTION93ADDR
- FarProc WINFUNCTION94ADDR
- FarProc WINFUNCTION95ADDR
- FarProc WINFUNCTION96ADDR
- FarProc WINFUNCTION97ADDR
- FarProc WINFUNCTION98ADDR
- FarProc WINFUNCTION99ADDR
- FarProc WINFUNCTION100ADDR
- FarProc WINFUNCTION101ADDR
- FarProc WINFUNCTION102ADDR
- FarProc WINFUNCTION103ADDR
- FarProc WINFUNCTION104ADDR
- FarProc WINFUNCTION105ADDR
- FarProc WINFUNCTION106ADDR
- FarProc WINFUNCTION107ADDR
- FarProc WINFUNCTION108ADDR
- FarProc WINFUNCTION109ADDR
- FarProc WINFUNCTION110ADDR
- FarProc WINFUNCTION111ADDR
- FarProc WINFUNCTION112ADDR
- FarProc WINFUNCTION113ADDR
- FarProc WINFUNCTION114ADDR
- FarProc WINFUNCTION115ADDR
- FarProc WINFUNCTION116ADDR
- FarProc WINFUNCTION117ADDR
- FarProc WINFUNCTION118ADDR
- FarProc WINFUNCTION119ADDR
- FarProc WINFUNCTION120ADDR
- FarProc WINFUNCTION121ADDR
- FarProc WINFUNCTION122ADDR
- FarProc WINFUNCTION123ADDR
- FarProc WINFUNCTION124ADDR
- FarProc WINFUNCTION125ADDR
- FarProc WINFUNCTION126ADDR
- FarProc WINFUNCTION127ADDR
- FarProc WINFUNCTION128ADDR
- FarProc WINFUNCTION129ADDR
- FarProc WINFUNCTION130ADDR
- FarProc WINFUNCTION131ADDR
- FarProc WINFUNCTION132ADDR
- FarProc WINFUNCTION133ADDR
- FarProc WINFUNCTION134ADDR
- FarProc WINFUNCTION135ADDR
- FarProc WINFUNCTION136ADDR
- FarProc WINFUNCTION137ADDR
- FarProc WINFUNCTION138ADDR
- FarProc WINFUNCTION139ADDR
- FarProc WINFUNCTION140ADDR
- FarProc WINFUNCTION141ADDR
- FarProc WINFUNCTION142ADDR
- FarProc WINFUNCTION143ADDR
- FarProc WINFUNCTION144ADDR
- FarProc WINFUNCTION145ADDR
- FarProc WINFUNCTION146ADDR
- FarProc WINFUNCTION147ADDR
- FarProc WINFUNCTION148ADDR
- FarProc WINFUNCTION149ADDR
- FarProc WINFUNCTION150ADDR
- FarProc WINFUNCTION151ADDR
- FarProc WINFUNCTION152ADDR
- FarProc WINFUNCTION153ADDR
- FarProc WINFUNCTION154ADDR
- FarProc WINFUNCTION155ADDR
- FarProc WINFUNCTION156ADDR
- FarProc WINFUNCTION157ADDR
- FarProc WINFUNCTION158ADDR
- FarProc WINFUNCTION159ADDR
- FarProc WINFUNCTION160ADDR
- FarProc WINFUNCTION161ADDR
- FarProc WINFUNCTION162ADDR
- FarProc WINFUNCTION163ADDR
- FarProc WINFUNCTION164ADDR
- FarProc WINFUNCTION165ADDR
- FarProc WINFUNCTION166ADDR
- FarProc WINFUNCTION167ADDR
- FarProc WINFUNCTION168ADDR
- FarProc WINFUNCTION169ADDR
- FarProc WINFUNCTION170ADDR
- FarProc WINFUNCTION171ADDR
- FarProc WINFUNCTION172ADDR
- FarProc WINFUNCTION173ADDR
- FarProc WINFUNCTION174ADDR
- FarProc WINFUNCTION175ADDR
- FarProc WINFUNCTION176ADDR
- FarProc WINFUNCTION177ADDR
- FarProc WINFUNCTION178ADDR
- FarProc WINFUNCTION179ADDR
- FarProc WINFUNCTION180ADDR
- FarProc WINFUNCTION181ADDR
- FarProc WINFUNCTION182ADDR
- CallBack CallBack0Addr
- CallBack CallBack1Addr
- CallBack CallBack2Addr
- CallBack CallBack3Addr
- CallBack CallBack4Addr
- CallBack CallBack5Addr
- CallBack CallBack6Addr
- CallBack CallBack7Addr
- CallBack CallBack8Addr
- CallBack CallBack9Addr
- CallBack CallBack10Addr
- CallBack CallBack11Addr
- CallBack CallBack12Addr
- CallBack CallBack13Addr
- CallBack CallBack14Addr
- CallBack CallBack15Addr
- CallBack CallBack16Addr
- CallBack CallBack17Addr
- CallBack CallBack18Addr
- CallBack CallBack19Addr
- CallBack CallBack20Addr
- CallBack CallBack21Addr
- CallBack CallBack22Addr
- CallBack CallBack23Addr
- CallBack CallBack24Addr
- CallBack CallBack25Addr
- CallBack CallBack26Addr
- CallBack CallBack27Addr
- CallBack CallBack28Addr
- CallBack CallBack29Addr
- CallBack CallBack30Addr
- CallBack CallBack31Addr
- CallBack CallBack32Addr
- CallBack CallBack33Addr
- CallBack CallBack34Addr
- CallBack CallBack35Addr
- CallBack CallBack36Addr
- CallBack CallBack37Addr
- CallBack CallBack38Addr
- CallBack CallBack39Addr
- CallBack CallBack40Addr
- CallBack CallBack41Addr
- CallBack CallBack42Addr
- CallBack CallBack43Addr
- CallBack CallBack44Addr
- CallBack CallBack45Addr
- CallBack CallBack46Addr
- CallBack CallBack47Addr
- CallBack CallBack48Addr
- CallBack CallBack49Addr
- CallBack CallBack50Addr
- CallBack CallBack51Addr
- CallBack CallBack52Addr
- CallBack CallBack53Addr
- CallBack CallBack54Addr
- CallBack CallBack55Addr
- CallBack CallBack56Addr
- CallBack CallBack57Addr
- CallBack CallBack58Addr
- CallBack CallBack59Addr
- CallBack CallBack60Addr
- CallBack CallBack61Addr
- CallBack CallBack62Addr
- CallBack CallBack63Addr
- CallBack CallBack64Addr
- CallBack CallBack65Addr
- CallBack CallBack66Addr
- CallBack CallBack67Addr
- CallBack CallBack68Addr
- CallBack CallBack69Addr
- CallBack CallBack70Addr
- CallBack CallBack71Addr
- CallBack CallBack72Addr
- CallBack CallBack73Addr
- CallBack CallBack74Addr
- CallBack CallBack75Addr
- CallBack CallBack76Addr
- CallBack CallBack77Addr
- CallBack CallBack78Addr
- CallBack CallBack79Addr
- CallBack CallBack80Addr
- CallBack CallBack81Addr
- CallBack CallBack82Addr
- CallBack CallBack83Addr
- CallBack CallBack84Addr
- CallBack CallBack85Addr
- CallBack CallBack86Addr
- CallBack CallBack87Addr
- CallBack CallBack88Addr
- CallBack CallBack89Addr
- CallBack CallBack90Addr
- CallBack CallBack91Addr
- CallBack CallBack92Addr
- CallBack CallBack93Addr
- CallBack CallBack94Addr
- CallBack CallBack95Addr
- CallBack CallBack96Addr
- CallBack CallBack97Addr
- CallBack CallBack98Addr
- CallBack CallBack99Addr
- CallBack CallBack100Addr
- CallBack CallBack101Addr
- CallBack CallBack102Addr
- CallBack CallBack103Addr
- CallBack CallBack104Addr
- CallBack CallBack105Addr
- CallBack CallBack106Addr
- CallBack CallBack107Addr
- CallBack CallBack108Addr
- CallBack CallBack109Addr
- CallBack CallBack110Addr
- CallBack CallBack111Addr
- CallBack CallBack112Addr
- CallBack CallBack113Addr
- CallBack CallBack114Addr
- CallBack CallBack115Addr
- CallBack CallBack116Addr
- CallBack CallBack117Addr
- CallBack CallBack118Addr
- CallBack CallBack119Addr
- CallBack CallBack120Addr
- CallBack CallBack121Addr
- CallBack CallBack122Addr
- CallBack CallBack123Addr
- CallBack CallBack124Addr
- CallBack CallBack125Addr
- CallBack CallBack126Addr
- CallBack CallBack127Addr
- CallBack CallBack128Addr
- CallBack CallBack129Addr
- CallBack CallBack130Addr
- CallBack CallBack131Addr
- CallBack CallBack132Addr
- CallBack CallBack133Addr
- CallBack CallBack134Addr
- CallBack CallBack135Addr
- CallBack CallBack136Addr
- CallBack CallBack137Addr
- CallBack CallBack138Addr
- CallBack CallBack139Addr
- CallBack CallBack140Addr
- CallBack CallBack141Addr
- CallBack CallBack142Addr
- CallBack CallBack143Addr
- CallBack UserCallBack1Addr
- CallBack UserCallBack2Addr
- CallBack UserCallBack3Addr
- CallBack UserCallBack4Addr
- CallBack UserCallBack5Addr
- CallBack UserCallBack6Addr
- CallBack UserCallBack7Addr
- CallBack UserCallBack8Addr
- CallBack UserCallBack9Addr
- CallBack UserCallBack10Addr
- CallBack UserCallBack11Addr
- CallBack UserCallBack12Addr
- CallBack UserCallBack13Addr
- CallBack UserCallBack14Addr
- CallBack UserCallBack15Addr
- CallBack UserCallBack16Addr
-
- __STACKLOW dd 0 ; lowest address in stack
- __STACKTOP dd 0 ; lowest address in stack
- __curbrk dd 0 ; top of usable memory
- __cbyte dd 0 ; used by getch, getche
- __osmajor db 4 ; major DOS version number
- __osminor db 0 ; minor DOS version number
- __Extender db 0 ; 10 => 386 windows
- db 0 ; spare byte
-
- public __pid
- __pid dw 0
- public __wincmdptr
- __wincmdptr LABEL FWORD
- cmd_offset dd 0
- cmd_seg dw 0
-
- __FPE_handler label dword
- ___FPE_handler dd __null_FPE_rtn ; FPE handler
-
- public __STACKLOW
- public __STACKTOP
- public __curbrk
- public __cbyte
- public __osmajor
- public __osminor
- public __Extender
- public __no87
- public __FPE_handler
- public ___FPE_handler
-
- _DATA ends
-
- STACK segment para stack 'STACK'
- STACK ends
-
- _BSS segment word public 'BSS'
- _BSS ends
-
- CONST segment word public 'DATA'
- CONST ends
-
- _emu_inits segment word public 'DATA'
- _emu_start label word
- _emu_inits ends
-
- _emu_init segment word public 'DATA'
- __emulator label word
- _emu_init ends
-
- _emu_inite segment word public 'DATA'
- _emu_end label word
- _emu_inite ends
-
- EXEC_S segment word public 'DATA'
- EXEC_S ends
-
- EXEC segment word public 'DATA'
- EXEC ends
-
- EXEC_E segment word public 'DATA'
- EXEC_E ends
-
-
- DATA segment word public 'DATA'
- DATA ends
-
- assume cs:_TEXT
- assume ds:_DATA
- assume fs:_DATA
- assume gs:_DATA
- assume ss:_DATA
-
- __saved_DS dw 0
- _cstart_ proc far
- dd offset hInstance ; loader starts execution 8 bytes past here
- dd _end
- mov _LocalPtr,gs
- mov WORD PTR ds:DS16,gs ; save the data segment at stack bot
-
- mov __STACKTOP,esp
-
- ; initialize bss
- lea ecx,DGROUP:_end ; end of _BSS segment (start of free)
- lea edi,DGROUP:_edata ; start of _BSS segment
- sub ecx,edi ; calc # of bytes in _BSS segment
- xor eax,eax ; zero the _BSS segment
- mov dl,cl ; copy the lower bits of size
- shr ecx,2 ; get number of dwords
- rep stosd ; copy them
- mov cl,dl ; get lower bits
- and cl,3 ; get number of bytes left (modulo 4)
- rep stosb
-
- ; save ds
- lea ecx,__saved_DS
- mov ds:[ecx],ds
-
- ; set up heap
- lea edx,DGROUP:_end ; start of free
- add edx,3
- and edx,not 3
- mov __curbrk,edx
-
- ; put command string on the stack
- push es
- mov ebx,TMPSTACK
- mov esi,lpCmdLine ; offset + selector
- mov edx,esi ; get the
- shr edx,10h ; selector
- cmp dx,0 ; is it zero?
- jne okcpy ; no, do the copy
- mov byte ptr ds:[ebx],0 ; put a trailing zero
- jmp short donecpy
- okcpy: mov es,dx
- mov ds:cmd_seg,es ; save for later
- movzx eax,si ; use by getcmd
- mov ds:cmd_offset,eax
- again: mov al,byte ptr es:[si]
- mov byte ptr ds:[bx],al
- cmp al,0
- je donecpy
- inc si
- inc bx
- jmp short again
- donecpy:pop es
-
- ; call initializer routines
- call initrtns
-
- ; push parms for WINMAIN
- mov ax,hInstance
- mov __pid,ax ; save for use by getpid()
- movzx eax,ax
- push eax
- mov ax,hPrevInstance
- movzx eax,ax
- push eax
- mov eax,TMPSTACK
- push eax
- mov ax,cmdShow
- movzx eax,ax
- push eax
-
- call WINMAIN
- public __exit_
- public __exit_with_msg_
- public _cstart_
- __exit_:
- __exit_with_msg_:
- mov esp,__STACKTOP ; reset stack pointer
- mov ds,_LocalPtr ; restore ds
- ret
-
- _cstart_ endp
-
- __null_FPE_rtn proc near
- ret ; return
- __null_FPE_rtn endp
-
- initrtns proc near
- push esi ; save esi
- mov esi,offset DGROUP:xistart; get start addr of table
- mov edi,offset DGROUP:xiend ; get end addr of table
- init1: cmp esi,edi ; loop through the table
- jae init9 ; - quit if done
- sub edi,4 ; - point to start of entry
- mov eax,[edi] ; - get address of routine
- or eax,eax ; - check for null entry
- je init1 ; - try next one if it is null
- call eax ; - call initializer routine
- jmp init1 ; endloop
- init9: pop esi ; restore esi
- ret ; return
- initrtns endp
-
- public __GETDS
- __GETDS proc near
- mov ds,cs:__saved_DS
- ret
- __GETDS endp
-
- _TEXT ends
-
- end _cstart_
-