target.h
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C头文件 代码 · 共 354 行
H
354 行
#ifndef __WATT_TARGET_H
#define __WATT_TARGET_H
/*
* Definitions of targets and macros for Waterloo tcp/ip.
*
* by G. Vanem <giva@bgnett.no> 1995
*/
#ifndef __WATTCP_H
#error TARGET.H must be included inside or after WATTCP.H
#endif
#define PHARLAP 1 /* PharLap 386|DosX extender target (1) */
#define DJGPP 2 /* GNU C/C++ and djgpp 2.0 target */
#define DOS4GW 4 /* Tenberry's DOS extender (1+2) */
#define POWERPAK 8 /* Borland's PowerPak DOS extender (3) */
#define WDOSX 16 /* WDOSX extender v0.96+ (4) */
#define PHARLAP_DLL (0x80|PHARLAP) /* PharLap DLL version target */
#define DOS4GW_DLL (0x80|DOS4GW) /* DOS4GW DLL version target (possible?)*/
#define WDOSX_DLL (0x80|WDOSX) /* WDOSX DLL version target (possible?) */
#define DJGPP_DXE (0x80|DJGPP) /* djgpp DXE target */
/*
* Notes:
*
* (1) Any 32-bit DOS compiler (Borland/Watcom/Microsoft/Symantec(?)/HighC)
* will work with this DOS extender. Some compilers support far
* pointers (48-bits), some don't. And even worse, some of those who
* do, have bugs in their segment register handling!
* Add `-DBUGGY_FARPTR=1' to your makefile's CFLAGS if you experience
* this (generate .asm listing to find out).
*
* The problem is present in:
* - Metaware's HighC v3.1 at -O3 or above (for sure).
* - BCC32 v4, Some rumours say far-ptrs in combination with FPU-ops.
*
* (2) Several DOS-extenders supports Watcom-386. DOS4GW (from Tenberry)
* is a DPMI 0.9 host with limited API. Other compatible DOS-extenders
* can also be used without modifying Watt-32. These are:
* DOS4GW Pro, DOS4G, Pmode/W, CauseWay, EDOS and WDOSX.
*
* (3) Currently unsupported.
*
* (4) The WDOSX extender is backwards compatible with DOS4GW-style
* extenders, but includes more features that puts this extender
* in a class of it's own. Specially it supports Real-mode Callbacks
* (rmcb) which other "Watcom" extenders don't (except DOS4GW Pro?).
* Although untested, it's possible to use WDOSX with GNU-C.
*/
#ifndef BUGGY_FARPTR
#define BUGGY_FARPTR 0 /* Assume no compilers have fp-bugs, duh! */
#endif
#if defined(_MSC_VER) && defined(M_I86SM) /* Microsoft doesn't have */
#define __SMALL__ /* __SMALL__, __LARGE__ */
#endif
#if defined(_MSC_VER) && defined(M_I86LM)
#define __LARGE__
#endif
#if defined(__TINY__) || defined(__MEDIUM__) || defined(__HUGE__)
#error Unsupported memory model (tiny/medium/huge)
#endif
#if defined(M_I86TM) || defined(M_I86MM) || defined(M_I86HM)
#error Unsupported memory model (tiny/medium/huge)
#endif
#if defined(_M_I86MM) || defined(_M_I86MH)
#error Unsupported memory model (medium/huge)
#endif
#if defined(__SMALL__) || defined(__COMPACT__) || defined(__LARGE__)
#undef DOSX
#define DOSX 0
#endif
#if defined(__DJGPP__) && defined(__GNUC__)
#undef DOSX
#define DOSX DJGPP /* WDOSX is possible? */
#endif
#if defined(__WATCOMC__) && defined(__386__)
#undef DOSX
#define DOSX DOS4GW /* may also be WDOSX/PHARLAP */
#define __WATCOM386__
#endif
#if defined(_MSC_VER) && defined(__386__)
#undef DOSX
#define DOSX PHARLAP
#endif
#if defined(__HIGHC__)
#undef DOSX
#define DOSX PHARLAP /* DOS4GW is possible? */
#undef BUGGY_FARPTR
#define BUGGY_FARPTR 0 /* set to 1 for HighC 3.1 at opt-lvl >=3 */
#endif /* It generates buggy code for far-ptrs */
#if defined(__BORLANDC__) && defined(__FLAT__) && defined(__DPMI32__)
#undef DOSX
#define DOSX WDOSX /* may use WDOSX,POWERPAK */
#define __BORLAND386__
#endif
#ifndef DOSX
#error DOSX target not defined
#endif
/*
* Macros and hacks depending on target (DOS-extender)
*/
#if (DOSX & PHARLAP)
#include <stdio.h>
#include <pharlap.h>
#ifdef __WATCOM386__
#undef FP_OFF
#include <i86.h>
#include <dos.h>
#endif
extern REALPTR _watt_dosTbr;
extern FARPTR _watt_dosTbp;
extern ULONG _watt_dosTbSize;
extern REALPTR _watt_r2p_addr;
#if (!BUGGY_FARPTR) && /* Trust the compiler to handle far-ptr ? */ \
(__CMPLR_FEATURES__ & __FEATURE_FARPTR__) /* compilers with far-ptrs */
#define HAS_FP /* i.e. HighC, Watcom386 */
extern FARPTR _watt_dosFp;
#define DOSMEM(s,o,t) *(t _far*)(_watt_dosFp + (DWORD)((o)|(s)<<4))
#define peekb(s,o) DOSMEM(s,o,BYTE)
#define peekw(s,o) DOSMEM(s,o,WORD)
#define peekl(s,o) DOSMEM(s,o,DWORD)
#define pokeb(s,o,x) DOSMEM(s,o,BYTE) = (BYTE)(x)
#define pokew(s,o,x) DOSMEM(s,o,WORD) = (WORD)(x)
#define pokel(s,o,x) DOSMEM(s,o,DWORD) = (DWORD)(x)
#else
#define peekb(s,o) PeekRealByte (((s) << 16) + (o))
#define peekw(s,o) PeekRealWord (((s) << 16) + (o))
#define peekl(s,o) PeekRealDWord(((s) << 16) + (o))
#define pokeb(s,o,x) PokeRealByte (((s) << 16) + (o), (x))
#define pokew(s,o,x) PokeRealWord (((s) << 16) + (o), (x))
#define pokel(s,o,x) PokeRealDWord(((s) << 16) + (o), (x))
#endif
#elif (DOSX & DJGPP)
#include <dpmi.h>
#include <go32.h>
#include <sys/farptr.h>
#define peekb(s,o) _farpeekb (_dos_ds, (o)+((s)<<4))
#define peekw(s,o) _farpeekw (_dos_ds, (o)+((s)<<4))
#define peekl(s,o) _farpeekl (_dos_ds, (o)+((s)<<4))
#define pokeb(s,o,x) _farpokeb (_dos_ds, (o)+((s)<<4), x)
#define pokew(s,o,x) _farpokew (_dos_ds, (o)+((s)<<4), x)
#define pokel(s,o,x) _farpokel (_dos_ds, (o)+((s)<<4), x)
#define write _write
#define read _read /* no '\n' -> '\r\n' translation */
#define close _close
#define BOOL int
#elif (DOSX & (DOS4GW|WDOSX)) /* DOS4GW or WDOSX extenders */
#undef DJGPP
#undef __DJGPP__ /* for use with djgpp's gcc */
#include <dos.h>
extern unsigned short _watt_dosTbSeg, _watt_dosTbSel;
extern int _watt_dosTbSize;
#define DOSMEM(s,o,t) *(volatile t *) (((s) << 4) | (o))
#define peekb(s,o) DOSMEM(s,o,BYTE)
#define peekw(s,o) DOSMEM(s,o,WORD)
#define peekl(s,o) DOSMEM(s,o,DWORD)
#define pokeb(s,o,x) DOSMEM(s,o,BYTE) = (BYTE)(x)
#define pokew(s,o,x) DOSMEM(s,o,WORD) = (WORD)(x)
#define pokel(s,o,x) DOSMEM(s,o,DWORD) = (DWORD)(x)
#undef BOOL
#define BOOL int
#elif (DOSX & POWERPAK) /* to-do !! */
#include <dos.h>
extern unsigned long _to_do1 (unsigned long);
extern void _to_do2 (unsigned long, unsigned long);
extern int int86 (int, union REGS*, union REGS*);
#define peekb(s,o) (BYTE) _to_do1 (((s)<<4)+(o))
#define peekw(s,o) (WORD) _to_do1 (((s)<<4)+(o))
#define peekl(s,o) (DWORD)_to_do1 (((s)<<4)+(o))
#define pokeb(s,o,x) _to_do2 (((s)<<4)+(o), (BYTE)x)
#define pokew(s,o,x) _to_do2 (((s)<<4)+(o), (WORD)x)
#define pokel(s,o,x) _to_do2 (((s)<<4)+(o), (DWORD)x)
#undef BOOL
#define BOOL int
#else /* All real-mode targets */
#include <dos.h>
#define BOOL int
#if defined(__WATCOMC__)
#define peekb(s,o) (*((BYTE __far*)MK_FP((s),(o))))
#define peekw(s,o) (*((WORD __far*)MK_FP((s),(o))))
#define peekl(s,o) (*((DWORD __far*)MK_FP((s),(o))))
#define pokeb(s,o,x) (*((BYTE __far*)MK_FP((s),(o))) = (BYTE)(x))
#define pokew(s,o,x) (*((WORD __far*)MK_FP((s),(o))) = (WORD)(x))
#define pokel(s,o,x) (*((DWORD __far*)MK_FP((s),(o))) = (DWORD)(x))
#else
#define peekw(s,o) (WORD)peek(s,o)
#define pokew(s,o,x) poke (s,o,x)
#define peekl(s,o) (*((DWORD far*)MK_FP((s),(o))))
#endif
#endif
/*
* Macros and hacks depending on vendor (compiler)
*/
#if defined(__TURBOC__) && (__TURBOC__ <= 0x301)
#include <mem.h>
#include <alloc.h>
#define OLD_TURBOC /* TCC <= 2.01 doesn't have <malloc.h> and <memory.h> */
#define _cdecl _Cdecl
#define _far far
#else
#include <memory.h>
#include <malloc.h>
#endif
#if defined(__HIGHC__)
#include <string.h>
#define max(a,b) _max(a,b) /* intrinsic functions */
#define min(a,b) _min(a,b)
#define movmem(s,d,n) memmove(d,s,n)
#define ENABLE() _inline(0xFB) /* sti */
#define DISABLE() _inline(0xFA) /* cli */
#endif
#if defined(_MSC_VER)
#if (DOSX) && (DOSX != PHARLAP)
#error MSC and non-Pharlap targets not supported
#endif
#if (_MSC_VER <= 600) /* A few exceptions for MSC <=6.0 */
#define NO_INLINE_ASM /* doesn't have built-in assembler */
#define ENABLE() _enable()
#define DISABLE() _disable()
#else
#pragma warning (disable:4103 4113)
#pragma warning (disable:4024 4047)
#define ENABLE() __asm sti
#define DISABLE() __asm cli
#define asm __asm
#endif
#define interrupt _interrupt far
#define getvect(a) _dos_getvect(a)
#define setvect(a,b) _dos_setvect(a,b)
#define movmem(s,d,n) memmove(d,s,n)
#define MK_FP(s,o) (void _far*) (((DWORD)(s) << 16) + (DWORD)(o))
#define peek(s,o) (*((WORD _far*)MK_FP((s),(o))))
#define poke(s,o,x) (*((WORD _far*)MK_FP((s),(o))) = (DWORD)(x))
#endif
#if defined(__TURBOC__) || defined(__BORLANDC__)
#include <string.h>
#define ENABLE() __emit__(0xFB)
#define DISABLE() __emit__(0xFA)
#pragma warn -bbf- /* "Bitfields must be signed or unsigned int" warning */
#pragma warn -sig- /* "Conversion may loose significant didgits" warning */
#pragma warn -cln- /* "Constant is long" warning */
#if defined(__BORLANDC__) /* make string/memory functions inline */
#define strlen __strlen__
#define strncpy __strncpy__
#define strrchr __strrchr__
#define strncmp __strncmp__
#define memset __memset__
#define memcpy __memcpy__
#define memcmp __memcmp__
#define memchr __memchr__
#endif
#endif
#if defined(__GNUC__)
#if (__GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7))
#error I need GCC 2.7.x or later
#endif
#include <string.h>
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define movmem(s,d,n) memmove(d,s,n)
#define ENABLE() __asm__ __volatile__ ("sti")
#define DISABLE() __asm__ __volatile__ ("cli")
#define outp(p,x) outportb(p,x)
#define inp(p) inportb(p)
#endif
#if defined(__WATCOMC__)
#include <i86.h>
#include <dos.h>
#include <string.h>
#pragma intrinsic(strcmp,memset)
#pragma warning(disable:120)
#define movmem(s,d,n) memmove(d,s,n)
#define getvect(a) _dos_getvect(a)
#define setvect(a,b) _dos_setvect(a,b)
#define ENABLE() _enable()
#define DISABLE() _disable()
#define BOOL int
#if (__WATCOMC__ < 1100)
#define OLD_WATCOMC /* < v11.0 is "old" */
#endif
#endif
/*
* Because kbhit() will pull in more conio function that we
* really need, use the simple kbhit() variant (without ungetch
* option). This also prevents multiple definition trouble when
* linking e.g. PCcurses and Watt-32 library.
*/
#if defined (__DJGPP__)
#ifdef __dj_include_conio_h_
#error "Don't include <conio.h>"
#endif
#include <pc.h> /* simple kbhit() */
#elif defined (__HIGHC__)
#ifdef __metaware_conio_h_
#error "Don't include <mw/conio.h>"
#endif
#include <conio.h> /* simple kbhit() */
#elif defined(_MSC_VER) && defined(__386__)
/* problems including <conio.h> from Visual C 4.0
*/
int __cdecl kbhit (void);
#else /* no other option */
#include <conio.h>
#endif
#endif /* __WATT_TARGET_H */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?