|
|
1.1 root 1: /*
2: * _DEFS386.H 5.20A June 8, 1995
3: *
4: * The Greenleaf Comm Library
5: *
6: * Copyright (C) 1985-1995 Greenleaf Software Inc. All Rights Reserved.
7: *
8: * NOTES
9: *
10: * This header file contains prototypes and miscellaneous definitions
11: * for use with all 32 bit DOS Extenders. The functions and macros
12: * in this file are intended to provide a transparent and uniform
13: * set of functions that can be used with any 386 DOS Extender.
14: *
15: * Things we need to define in order to support a 386 DOS Extender.
16: * These can be macros, typedefs, functions, or whatever. It
17: * all depends on what DOS Extender and compiler you are using.
18: *
19: * Functions defined in all caps might be defined as Macros.
20: *
21: * Defined by the compiler Defined by the DOS Extender
22: *
23: * GF_FARPTR32 _GetDosSelector
24: * GF_SEL32 _AllocateDosMemory
25: * GF_OFF32 _LockMemory
26: * GF_POKEC32 _SetVector
27: * GF_POKEVID32 _GetRealAddress
28: * GF_PEEKC32 _GetOldProtHandler
29: * GF_FARPTR16 _GetOldRealHandler
30: * GF_SEL16 _SetHandlers
31: * GF_OFF16 _LockRegion
32: * _GetCs()
33: * _GetDs()
34: * _FarMemSet()
35: * _CopyFromFarMem()
36: * _CopyToFarMem()
37: *
38: * Always defined: GF_X32
39: *
40: * CONTENTS
41: *
42: * MODIFICATIONS
43: *
44: * December 1, 1994 5.10A : Initial release.
45: */
46:
47: #if !defined( _DOS32BIT_H )
48: #define _DOS32BIT_H
49:
50: #include "compiler.h"
51: #include <dos.h>
52:
53:
54: /*
55: * Identify the DOS Extender.
56: */
57:
58: #if defined( DOSX386 )
59: # if defined( GF_WATCOM_C )
60: # undef _M_IX86
61: # endif
62: # define GF_X32
63: #elif defined( DOS4G )
64: # define GF_DPMI32
65: # define GF_X32
66: #elif defined( GF_BORLAND_CPP ) && defined( __DPMI32__ )
67: # define GF_DPMI32
68: # define GF_X32
69: #elif defined( DOS4G )
70: # define GF_DPMI32
71: # define GF_X32
72: #endif
73:
74: #if defined( GF_X32 )
75:
76:
77: /*
78: * Fortunately, the definitions for real pointers are the same for
79: * every compiler.
80: */
81:
82: /*
83: * Under 32 bit DOS extenders, we will have to manipulate 16:16
84: * real pointers from time to time. This structure definition and
85: * associated macros make that a little easier to do.
86: */
87:
88: #pragma pack( 1 )
89: typedef struct _tag_realptr {
90: unsigned short int offset;
91: unsigned short int segment;
92: } GF_FARPTR16;
93: #pragma pack()
94:
95: #define GF_SEG16( x ) (x).segment /* Tag: Misc private */
96: #define GF_OFF16( x ) (x).offset /* Tag: Misc private */
97:
98: /*
99: * Watcom definitions
100: */
101: #if defined( GF_WATCOM_C_386 )
102:
103: #include <i86.h>
104:
105: /*
106: * Watcom is the one compiler we use right now that actually supports
107: * far pointers. This means that we can use efficient code in some
108: * places by simply dereferencing a far pointer instead of performing
109: * a far copy. However, I still create a structure so that I have
110: * easy access to the selector and offset parts of the pointer.
111: */
112: #pragma pack( 1 )
113: typedef union { char _far * p;
114: struct _tag_farptr {
115: unsigned int offset;
116: unsigned short selector;
117: } s;
118: } GF_FARPTR32;
119: #pragma pack()
120:
121: #define GF_SEL32( x ) (x).s.selector /* Tag: Extender private */
122: #define GF_OFF32( x ) (x).s.offset /* Tag: Extender private */
123: #define GF_POKEC32( x, c ) (*((x).p) = (c)) /* Tag: Extender private */
124: #define GF_POKEVID32( x, c, att ) *(short int _far *) ((x).p) = ( (c) + ( (att) << 8 ) ) /* Tag: Extender private */
125: #define GF_PEEKC32( c, x ) (c = *((x).p)) /* Tag: Extender private */
126:
127: #endif
128:
129: /*
130: * Symantec definitions
131: */
132: #if defined( GF_SYMANTEC_CPP )
133:
134: /*
135: * Symantec actually supports far pointers. This means that we can use
136: * efficient code in some places by simply dereferencing a far pointer
137: * instead of performing a far copy. However, I still create a structure
138: * so that I have easy access to the selector and offset parts of the
139: * pointer.
140: */
141:
142: #pragma pack( 1 )
143: typedef union { char _far * p;
144: struct _tag_farptr {
145: unsigned int offset;
146: unsigned short selector;
147: } s;
148: } GF_FARPTR32;
149: #pragma pack()
150:
151: #define GF_SEL32( x ) (x).s.selector /* Tag: Extender private */
152: #define GF_OFF32( x ) (x).s.offset /* Tag: Extender private */
153: #define GF_POKEC32( x, c ) (*((x).p) = (c)) /* Tag: Extender private */
154: #define GF_POKEVID32( x, c, att ) *(short int _far *) ((x).p) = ( (c) + ( (att) << 8 ) ) /* Tag: Extender private */
155: #define GF_PEEKC32( c, x ) (c = *((x).p)) /* Tag: Extender private */
156:
157: #endif
158:
159: /*
160: * Visual C++ definitions
161: */
162:
163: #if defined( GF_VISUAL_CPP )
164:
165: #pragma pack( 1 )
166: typedef struct _tag_farptr {
167: unsigned int offset;
168: unsigned short selector;
169: } GF_FARPTR32;
170: #pragma pack()
171:
172: #define GF_SEL32( x ) (x).selector /* Tag: Extender private */
173: #define GF_OFF32( x ) (x).offset /* Tag: Extender private */
174: #define GF_POKEC32( x, c ) _gf_pokec32( (x), (c) ) /* Tag: Extender private */
175: #define GF_POKEVID32( x, c, att ) _gf_pokevid32( (x), (c), (att) ) /* Tag: Extender private */
176: #define GF_PEEKC32( c, x ) c = _gf_peekc32( (x) ) /* Tag: Extender private */
177:
178: void GF_CONV _gf_pokec32( GF_FARPTR32 x, unsigned char c );
179: void GF_CONV _gf_pokevid32( GF_FARPTR32 x, unsigned char c, unsigned char att );
180: unsigned char GF_CONV _gf_peekc32( GF_FARPTR32 x );
181:
182: #endif /* #if defined( GF_VISUAL_CPP ) */
183:
184: /*
185: * Borland definitions.
186: */
187:
188: #if defined( GF_BORLAND_CPP )
189:
190: #pragma pack( 1 )
191: typedef struct _tag_farptr {
192: unsigned int offset;
193: unsigned short selector;
194: } GF_FARPTR32;
195: #pragma pack()
196:
197: #define GF_SEL32( x ) (x).selector /* Tag: Extender private */
198: #define GF_OFF32( x ) (x).offset /* Tag: Extender private */
199: #define GF_POKEC32( x, c ) _gf_pokec32( (x), (c) ) /* Tag: Extender private */
200: #define GF_POKEVID32( x, c, att ) _gf_pokevid32( (x), (c), (att) ) /* Tag: Extender private */
201: #define GF_PEEKC32( c, x ) c = _gf_peekc32( (x) ) /* Tag: Extender private */
202:
203: void GF_CONV _gf_pokec32( GF_FARPTR32 x, unsigned char c );
204: void GF_CONV _gf_pokevid32( GF_FARPTR32 x, unsigned char c, unsigned char att );
205: unsigned char GF_CONV _gf_peekc32( GF_FARPTR32 x );
206:
207: #endif
208:
209: /*
210: * The following functions are prototyped for every DOS Extender and
211: * compiler. The prototypes are identical regardeless of the tool,
212: * so you won't see any ifdefs here.
213: */
214:
215: #ifdef __cplusplus
216: extern "C" {
217: #endif
218:
219: unsigned short int GF_CONV _GetDosSelector( void );
220: GF_FARPTR32 GF_CONV _AllocateDosMemory( int size );
221: int GF_CONV _FreeDosMemory( GF_FARPTR32 p );
222: void GF_CONV _FarMemSet( GF_FARPTR32 add, unsigned char val, int length );
223: void GF_CONV _CopyToFarMem( GF_FARPTR32 destination, void *source, int length );
224: void GF_CONV _CopyFromFarMem( void *destination, GF_FARPTR32 source, int length );
225: GF_FARPTR16 GF_CONV _GetRealAddress( GF_FARPTR32 protected_address );
226: GF_FARPTR32 GF_CONV _GetOldProtHandler( int interrupt_number );
227: GF_FARPTR16 GF_CONV _GetOldRealHandler( int interrupt_number );
228: int GF_CONV _SetHandlers( int interrupt_number, GF_FARPTR32 port_handler, GF_FARPTR16 real_handler );
229: int GF_CONV _LockRegion( GF_FARPTR32 base, int size );
230: unsigned short int GF_CONV _GetCs( void );
231: unsigned short int GF_CONV _GetDs( void );
232:
233: #ifdef __cplusplus
234: }
235: #endif
236:
237: /*
238: * If you don't have REGS or int386 defined, we can make do with the
239: * Phar Lap TNT versions. However, there are some naming problems,
240: * so we have to create a new structure. This means that this code
241: * can be broken by a new release of TNT.
242: */
243: #if defined( DOSX386 )
244:
245:
246: #if defined( GF_BORLAND_CPP ) || defined( GF_VISUAL_CPP ) || defined( GF_SYMANTEC_CPP )
247:
248: #include <pldos32.h>
249:
250: #pragma pack( 1 )
251: #undef REGS
252: union REGS {
253: struct _DWORDREGS x;
254: struct _WORDREGS w;
255: struct _BYTEREGS h;
256: };
257: #pragma pack()
258:
259: #define SREGS _SREGS
260: #define int386( i, r1, r2 ) /* Tag: Extender private */ \
261: _int86( (i), \
262: (union _REGS *)( r1 ), \
263: (union _REGS *)( r2 ) )
264:
265: #define int386x( i, r1, r2, s ) /* Tag: Extender private */ \
266: _int86x( (i), \
267: (union _REGS *)( r1 ), \
268: (union _REGS *)( r2 ), \
269: (s) )
270: #endif /* #if defined( GF_BORLAND_CPP ) || defined( GF_VISUAL_CPP ) */
271: #endif /* #if defined( DOSX386 ) */
272:
273: #endif /* #if defined( GF_X32 ) */
274:
275: #endif /* #if !defined( _DOS32BIT_H ) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.