Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
548 | serge | 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 |
||
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 |
||
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 |
||
174 | public p1 |
||
175 | else |
||
176 | public "&p1",p2 |
||
177 | endif |
||
178 | endm |
||
179 | |||
180 | xref macro p1,p2 |
||
181 | ifb |
||
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 |
||
214 | extrn p1 : dword |
||
215 | else |
||
216 | extrn "&p1",p2 : dword |
||
217 | endif |
||
218 | else |
||
219 | ifb |
||
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 |
||
275 | public p1 |
||
276 | else |
||
277 | public "&p1",p2 |
||
278 | endif |
||
279 | endm |
||
280 | |||
281 | xref macro p1,p2 |
||
282 | ifb |
||
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 |
||
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 |
||
344 | jmp _&alias |
||
345 | else |
||
346 | jmp `function` |
||
347 | endif |
||
348 | `alias` endp |
||
349 | endm |
||
350 | |||
351 | xred macro p1,p2,p3 |
||
352 | ifb |
||
353 | extrn p1 : p2 |
||
354 | else |
||
355 | extrn "&p1",p2 : p3 |
||
356 | endif |
||
357 | endm |
||
358 |