Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;*****************************************************************************
  2. ;*
  3. ;*                            Open Watcom Project
  4. ;*
  5. ;*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
  6. ;*
  7. ;*  ========================================================================
  8. ;*
  9. ;*    This file contains Original Code and/or Modifications of Original
  10. ;*    Code as defined in and that are subject to the Sybase Open Watcom
  11. ;*    Public License version 1.0 (the 'License'). You may not use this file
  12. ;*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
  13. ;*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
  14. ;*    provided with the Original Code and Modifications, and is also
  15. ;*    available at www.sybase.com/developer/opensource.
  16. ;*
  17. ;*    The Original Code and all software distributed under the License are
  18. ;*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  19. ;*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
  20. ;*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
  21. ;*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
  22. ;*    NON-INFRINGEMENT. Please see the License for the specific language
  23. ;*    governing rights and limitations under the License.
  24. ;*
  25. ;*  ========================================================================
  26. ;*
  27. ;* Description:  Memory model setup for interfacing with C code.
  28. ;*
  29. ;*****************************************************************************
  30.  
  31.  
  32. _SMALL_CODE     =       00h
  33. _BIG_CODE       =       01h
  34. _SMALL_DATA     =       00h
  35. _BIG_DATA       =       02h
  36. _HUGE_DATA      =       04h
  37. _LONG_INTS      =       08h
  38.  
  39. _USE_32_SEGS    =       10h
  40. _386            =       10h     ; from old clib
  41.  
  42. _DS_PEGGED      =       20h     ; from old clib (used for Windows)
  43. _TINY           =       40h     ; from old clib (formerly 10h)
  44.  
  45. _FLAT           =       ( _SMALL_CODE or _SMALL_DATA or _USE_32_SEGS )
  46. _SMALL          =       ( _SMALL_CODE or _SMALL_DATA )
  47. _COMPACT        =       ( _SMALL_CODE or _BIG_DATA )
  48. _MEDIUM         =       ( _BIG_CODE   or _SMALL_DATA )
  49. _LARGE          =       ( _BIG_CODE   or _BIG_DATA )
  50. _HUGE           =       ( _BIG_CODE   or _HUGE_DATA )
  51.  
  52. _EMULATION      =       00h
  53. _8087           =       01h
  54.  
  55. ifdef __WASM__
  56.     ifdef __FLAT__
  57.         _MODEL = _FLAT
  58.     endif
  59.     ifdef __SMALL__
  60.         _MODEL = _SMALL
  61.     endif
  62.     ifdef __COMPACT__
  63.         _MODEL = _COMPACT
  64.     endif
  65.     ifdef __MEDIUM__
  66.         _MODEL = _MEDIUM
  67.     endif
  68.     ifdef __LARGE__
  69.         _MODEL = _LARGE
  70.     endif
  71.     ifdef __HUGE__
  72.         _MODEL = _HUGE
  73.     endif
  74.     ifdef __386__
  75.         _MODEL = ( _MODEL or _USE_32_SEGS )
  76.     endif
  77.     ifdef __WINDOWS__
  78.         if _MODEL and (_BIG_DATA or _HUGE_DATA)
  79.             _MODEL = ( _MODEL or _DS_PEGGED )
  80.         endif
  81.     endif
  82.     ifdef __FPC__
  83.         _MATH = _EMULATION
  84.     endif
  85.     ifdef __FPI__
  86.         _MATH = _8087
  87.     endif
  88.     ifdef __FPI87__
  89.         _MATH = _8087
  90.     endif
  91. else
  92. include         .\model.inc     ; defines _MODEL, _MATH symbols
  93. endif
  94.  
  95. if _MODEL and _BIG_CODE
  96.  
  97. modstart        macro   modname,alignment
  98. ifdef NDEBUG
  99.                 name    modname
  100. endif
  101.                 ifb <alignment>
  102. _TEXT           segment word public 'CODE'
  103.                 else
  104. _TEXT           segment alignment public 'CODE'
  105.                 endif
  106.                 assume  cs:_TEXT
  107.                 endm
  108.  
  109. calli           macro   regname
  110.                 call    dword ptr [regname]
  111.                 endm
  112.  
  113. codeptr         macro   p1,p2
  114.                 ifb <p2>
  115.                 extrn p1 : dword
  116.                 else
  117.                 extrn "&p1",p2 : dword
  118.                 endif
  119.                 endm
  120.  
  121. docall          macro   dest
  122.                 call    far ptr dest
  123.                 endm
  124.  
  125. dojmp           macro   dest
  126.                 jmp     far ptr dest
  127.                 endm
  128.  
  129. defp            macro   dsym,exp
  130.          dsym   proc    far exp
  131.                 endm
  132.  
  133. defpe           macro   dsym
  134.                 ifdef _EXPORT
  135.          dsym   proc    far export
  136.                 else
  137.          dsym   proc    far
  138.                 endif
  139.                 endm
  140.  
  141. defn            macro   dsym
  142.          dsym   proc    near
  143.                 endm
  144.  
  145. endproc         macro   dsym
  146.          dsym   endp
  147.                 endm
  148.  
  149. epilog          macro
  150.                 if _MODEL and _USE_32_SEGS
  151.                     pop     EBP
  152.                     dec     EBP
  153.                     mov     ESP,EBP
  154.                 else
  155.                     pop     BP
  156.                     dec     BP
  157.                 endif
  158.                 endm
  159.  
  160. prolog          macro
  161.                 if _MODEL and _USE_32_SEGS
  162.                     inc     EBP
  163.                     push    EBP
  164.                     mov     EBP,ESP
  165.                 else
  166.                     inc     BP
  167.                     push    BP
  168.                     mov     BP,SP
  169.                 endif
  170.                 endm
  171.  
  172. xdefp           macro   p1,p2
  173.                 ifb <p2>
  174.                 public p1
  175.                 else
  176.                 public "&p1",p2
  177.                 endif
  178.                 endm
  179.  
  180. xref            macro   p1,p2
  181.                 ifb <p2>
  182.                 extrn `p1` : far
  183.                 else
  184.                 extrn "&p1",`p2` : far
  185.                 endif
  186.                 endm
  187.  
  188. lcall           macro   dest
  189.                 push    cs
  190.                 call    near ptr dest
  191.                 endm
  192.  
  193. else
  194.  
  195. modstart        macro   modname,alignment
  196. ifdef NDEBUG
  197.                 name    modname
  198. endif
  199.                 if _MODEL and _USE_32_SEGS
  200. _TEXT               segment use32 alignment public 'CODE'
  201.                 else
  202. _TEXT               segment alignment public 'CODE'
  203.                 endif
  204.                 assume  cs:_TEXT
  205.                 endm
  206.  
  207. calli           macro   regname
  208.                 call    regname
  209.                 endm
  210.  
  211. codeptr         macro   p1,p2
  212.                 if _MODEL and _USE_32_SEGS
  213.                     ifb <p2>
  214.                     extrn p1 : dword
  215.                     else
  216.                     extrn "&p1",p2 : dword
  217.                     endif
  218.                 else
  219.                     ifb <p2>
  220.                     extrn p1 : word
  221.                     else
  222.                     extrn "&p1",p2 : word
  223.                     endif
  224.                 endif
  225.                 endm
  226.  
  227. defn            macro   dsym
  228.          dsym   proc    near
  229.                 endm
  230.  
  231. defp            macro   dsym,exp
  232.          dsym   proc    near exp
  233.                 endm
  234.  
  235. defpe           macro   dsym
  236.                 ifdef _EXPORT
  237.          dsym       proc    near export
  238.                 else
  239.          dsym       proc    near
  240.                 endif
  241.                 endm
  242.  
  243. docall          macro   dest
  244.                 call    dest
  245.                 endm
  246.  
  247. dojmp           macro   dest
  248.                 jmp     dest
  249.                 endm
  250.  
  251. endproc         macro   dsym
  252.          dsym   endp
  253.                 endm
  254.  
  255. epilog          macro
  256.                 if _MODEL and _USE_32_SEGS
  257.                     pop     EBP
  258.                 else
  259.                     pop     BP
  260.                 endif
  261.                 endm
  262.  
  263. prolog          macro
  264.                 if _MODEL and _USE_32_SEGS
  265.                     push    EBP
  266.                     mov     EBP,ESP
  267.                 else
  268.                     push    BP
  269.                     mov     BP,SP
  270.                 endif
  271.                 endm
  272.  
  273. xdefp           macro   p1,p2
  274.                 ifb <p2>
  275.                 public p1
  276.                 else
  277.                 public "&p1",p2
  278.                 endif
  279.                 endm
  280.  
  281. xref            macro   p1,p2
  282.                 ifb <p2>
  283.                 extrn `p1` : near
  284.                 else
  285.                 extrn "&p1",`p2` : near
  286.                 endif
  287.                 endm
  288.  
  289. lcall           macro   dest
  290.                 call    dest
  291.                 endm
  292.  
  293. endif
  294.  
  295. endmod          macro
  296. _TEXT           ends
  297.                 endm
  298.  
  299. dataseg         macro
  300. DGROUP          group _DATA
  301. assume          ds:DGROUP,ss:DGROUP
  302.                 if _MODEL and _USE_32_SEGS
  303. _DATA               segment use32 dword public 'DATA'
  304.                 else
  305. _DATA               segment word public 'DATA'
  306.                 endif
  307.                 endm
  308. datasegment     macro
  309.                 dataseg ; should be phased out
  310.                 endm
  311.  
  312. enddata         macro
  313. _DATA   ends
  314.                 endm
  315.  
  316. bss_segment     macro
  317.                 if _MODEL and _USE_32_SEGS
  318. _BSS                segment use32 dword public 'BSS'
  319.                 else
  320. _BSS                segment word public 'BSS'
  321.                 endif
  322. DGROUP          group _BSS
  323.                 assume  ds:DGROUP
  324.                 endm
  325.  
  326. endbss          macro
  327. _BSS            ends
  328.                 endm
  329.  
  330. alias_function  macro   alias, function
  331.                 ifb <function>
  332.                     xref    "C",_&alias
  333.                 else
  334.                     xref    "C",function
  335.                 endif
  336.                 .code
  337.                 public      "C",`alias`
  338.                 ifdef _EXPORT
  339.          `alias`    proc    export
  340.                 else
  341.          `alias`    proc
  342.                 endif
  343.                 ifb <function>
  344.                     jmp     _&alias
  345.                 else
  346.                     jmp     `function`
  347.                 endif
  348.          `alias`    endp
  349.                 endm
  350.  
  351. xred            macro   p1,p2,p3
  352.                 ifb <p3>
  353.                 extrn p1 : p2
  354.                 else
  355.                 extrn "&p1",p2 : p3
  356.                 endif
  357.                 endm
  358.  
  359.