f6fbed07ac
git-svn-id: svn://kolibrios.org@548 a494cfbc-eb01-0410-851d-a64ba20cac60
359 lines
9.2 KiB
PHP
359 lines
9.2 KiB
PHP
;*****************************************************************************
|
|
;*
|
|
;* Open Watcom Project
|
|
;*
|
|
;* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
|
;*
|
|
;* ========================================================================
|
|
;*
|
|
;* This file contains Original Code and/or Modifications of Original
|
|
;* Code as defined in and that are subject to the Sybase Open Watcom
|
|
;* Public License version 1.0 (the 'License'). You may not use this file
|
|
;* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
|
;* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
|
;* provided with the Original Code and Modifications, and is also
|
|
;* available at www.sybase.com/developer/opensource.
|
|
;*
|
|
;* The Original Code and all software distributed under the License are
|
|
;* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
|
;* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
|
;* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
|
;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
|
;* NON-INFRINGEMENT. Please see the License for the specific language
|
|
;* governing rights and limitations under the License.
|
|
;*
|
|
;* ========================================================================
|
|
;*
|
|
;* Description: Memory model setup for interfacing with C code.
|
|
;*
|
|
;*****************************************************************************
|
|
|
|
|
|
_SMALL_CODE = 00h
|
|
_BIG_CODE = 01h
|
|
_SMALL_DATA = 00h
|
|
_BIG_DATA = 02h
|
|
_HUGE_DATA = 04h
|
|
_LONG_INTS = 08h
|
|
|
|
_USE_32_SEGS = 10h
|
|
_386 = 10h ; from old clib
|
|
|
|
_DS_PEGGED = 20h ; from old clib (used for Windows)
|
|
_TINY = 40h ; from old clib (formerly 10h)
|
|
|
|
_FLAT = ( _SMALL_CODE or _SMALL_DATA or _USE_32_SEGS )
|
|
_SMALL = ( _SMALL_CODE or _SMALL_DATA )
|
|
_COMPACT = ( _SMALL_CODE or _BIG_DATA )
|
|
_MEDIUM = ( _BIG_CODE or _SMALL_DATA )
|
|
_LARGE = ( _BIG_CODE or _BIG_DATA )
|
|
_HUGE = ( _BIG_CODE or _HUGE_DATA )
|
|
|
|
_EMULATION = 00h
|
|
_8087 = 01h
|
|
|
|
ifdef __WASM__
|
|
ifdef __FLAT__
|
|
_MODEL = _FLAT
|
|
endif
|
|
ifdef __SMALL__
|
|
_MODEL = _SMALL
|
|
endif
|
|
ifdef __COMPACT__
|
|
_MODEL = _COMPACT
|
|
endif
|
|
ifdef __MEDIUM__
|
|
_MODEL = _MEDIUM
|
|
endif
|
|
ifdef __LARGE__
|
|
_MODEL = _LARGE
|
|
endif
|
|
ifdef __HUGE__
|
|
_MODEL = _HUGE
|
|
endif
|
|
ifdef __386__
|
|
_MODEL = ( _MODEL or _USE_32_SEGS )
|
|
endif
|
|
ifdef __WINDOWS__
|
|
if _MODEL and (_BIG_DATA or _HUGE_DATA)
|
|
_MODEL = ( _MODEL or _DS_PEGGED )
|
|
endif
|
|
endif
|
|
ifdef __FPC__
|
|
_MATH = _EMULATION
|
|
endif
|
|
ifdef __FPI__
|
|
_MATH = _8087
|
|
endif
|
|
ifdef __FPI87__
|
|
_MATH = _8087
|
|
endif
|
|
else
|
|
include .\model.inc ; defines _MODEL, _MATH symbols
|
|
endif
|
|
|
|
if _MODEL and _BIG_CODE
|
|
|
|
modstart macro modname,alignment
|
|
ifdef NDEBUG
|
|
name modname
|
|
endif
|
|
ifb <alignment>
|
|
_TEXT segment word public 'CODE'
|
|
else
|
|
_TEXT segment alignment public 'CODE'
|
|
endif
|
|
assume cs:_TEXT
|
|
endm
|
|
|
|
calli macro regname
|
|
call dword ptr [regname]
|
|
endm
|
|
|
|
codeptr macro p1,p2
|
|
ifb <p2>
|
|
extrn p1 : dword
|
|
else
|
|
extrn "&p1",p2 : dword
|
|
endif
|
|
endm
|
|
|
|
docall macro dest
|
|
call far ptr dest
|
|
endm
|
|
|
|
dojmp macro dest
|
|
jmp far ptr dest
|
|
endm
|
|
|
|
defp macro dsym,exp
|
|
dsym proc far exp
|
|
endm
|
|
|
|
defpe macro dsym
|
|
ifdef _EXPORT
|
|
dsym proc far export
|
|
else
|
|
dsym proc far
|
|
endif
|
|
endm
|
|
|
|
defn macro dsym
|
|
dsym proc near
|
|
endm
|
|
|
|
endproc macro dsym
|
|
dsym endp
|
|
endm
|
|
|
|
epilog macro
|
|
if _MODEL and _USE_32_SEGS
|
|
pop EBP
|
|
dec EBP
|
|
mov ESP,EBP
|
|
else
|
|
pop BP
|
|
dec BP
|
|
endif
|
|
endm
|
|
|
|
prolog macro
|
|
if _MODEL and _USE_32_SEGS
|
|
inc EBP
|
|
push EBP
|
|
mov EBP,ESP
|
|
else
|
|
inc BP
|
|
push BP
|
|
mov BP,SP
|
|
endif
|
|
endm
|
|
|
|
xdefp macro p1,p2
|
|
ifb <p2>
|
|
public p1
|
|
else
|
|
public "&p1",p2
|
|
endif
|
|
endm
|
|
|
|
xref macro p1,p2
|
|
ifb <p2>
|
|
extrn `p1` : far
|
|
else
|
|
extrn "&p1",`p2` : far
|
|
endif
|
|
endm
|
|
|
|
lcall macro dest
|
|
push cs
|
|
call near ptr dest
|
|
endm
|
|
|
|
else
|
|
|
|
modstart macro modname,alignment
|
|
ifdef NDEBUG
|
|
name modname
|
|
endif
|
|
if _MODEL and _USE_32_SEGS
|
|
_TEXT segment use32 alignment public 'CODE'
|
|
else
|
|
_TEXT segment alignment public 'CODE'
|
|
endif
|
|
assume cs:_TEXT
|
|
endm
|
|
|
|
calli macro regname
|
|
call regname
|
|
endm
|
|
|
|
codeptr macro p1,p2
|
|
if _MODEL and _USE_32_SEGS
|
|
ifb <p2>
|
|
extrn p1 : dword
|
|
else
|
|
extrn "&p1",p2 : dword
|
|
endif
|
|
else
|
|
ifb <p2>
|
|
extrn p1 : word
|
|
else
|
|
extrn "&p1",p2 : word
|
|
endif
|
|
endif
|
|
endm
|
|
|
|
defn macro dsym
|
|
dsym proc near
|
|
endm
|
|
|
|
defp macro dsym,exp
|
|
dsym proc near exp
|
|
endm
|
|
|
|
defpe macro dsym
|
|
ifdef _EXPORT
|
|
dsym proc near export
|
|
else
|
|
dsym proc near
|
|
endif
|
|
endm
|
|
|
|
docall macro dest
|
|
call dest
|
|
endm
|
|
|
|
dojmp macro dest
|
|
jmp dest
|
|
endm
|
|
|
|
endproc macro dsym
|
|
dsym endp
|
|
endm
|
|
|
|
epilog macro
|
|
if _MODEL and _USE_32_SEGS
|
|
pop EBP
|
|
else
|
|
pop BP
|
|
endif
|
|
endm
|
|
|
|
prolog macro
|
|
if _MODEL and _USE_32_SEGS
|
|
push EBP
|
|
mov EBP,ESP
|
|
else
|
|
push BP
|
|
mov BP,SP
|
|
endif
|
|
endm
|
|
|
|
xdefp macro p1,p2
|
|
ifb <p2>
|
|
public p1
|
|
else
|
|
public "&p1",p2
|
|
endif
|
|
endm
|
|
|
|
xref macro p1,p2
|
|
ifb <p2>
|
|
extrn `p1` : near
|
|
else
|
|
extrn "&p1",`p2` : near
|
|
endif
|
|
endm
|
|
|
|
lcall macro dest
|
|
call dest
|
|
endm
|
|
|
|
endif
|
|
|
|
endmod macro
|
|
_TEXT ends
|
|
endm
|
|
|
|
dataseg macro
|
|
DGROUP group _DATA
|
|
assume ds:DGROUP,ss:DGROUP
|
|
if _MODEL and _USE_32_SEGS
|
|
_DATA segment use32 dword public 'DATA'
|
|
else
|
|
_DATA segment word public 'DATA'
|
|
endif
|
|
endm
|
|
datasegment macro
|
|
dataseg ; should be phased out
|
|
endm
|
|
|
|
enddata macro
|
|
_DATA ends
|
|
endm
|
|
|
|
bss_segment macro
|
|
if _MODEL and _USE_32_SEGS
|
|
_BSS segment use32 dword public 'BSS'
|
|
else
|
|
_BSS segment word public 'BSS'
|
|
endif
|
|
DGROUP group _BSS
|
|
assume ds:DGROUP
|
|
endm
|
|
|
|
endbss macro
|
|
_BSS ends
|
|
endm
|
|
|
|
alias_function macro alias, function
|
|
ifb <function>
|
|
xref "C",_&alias
|
|
else
|
|
xref "C",function
|
|
endif
|
|
.code
|
|
public "C",`alias`
|
|
ifdef _EXPORT
|
|
`alias` proc export
|
|
else
|
|
`alias` proc
|
|
endif
|
|
ifb <function>
|
|
jmp _&alias
|
|
else
|
|
jmp `function`
|
|
endif
|
|
`alias` endp
|
|
endm
|
|
|
|
xred macro p1,p2,p3
|
|
ifb <p3>
|
|
extrn p1 : p2
|
|
else
|
|
extrn "&p1",p2 : p3
|
|
endif
|
|
endm
|
|
|