/* * i86.h Defines the structs and unions used to handle the input and * output registers for the Intel x86 and 386 interrupt interface * routines. * * ========================================================================= * * Open Watcom Project * * Copyright (c) 2002-2010 Open Watcom Contributors. All Rights Reserved. * Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved. * * This file is automatically generated. Do not edit directly. * * ========================================================================= */ #ifndef _I86_H_INCLUDED #define _I86_H_INCLUDED #ifndef _ENABLE_AUTODEPEND #pragma read_only_file; #endif #if !defined(_M_IX86) #error i86.h is for use with Intel platforms #endif #ifndef _COMDEF_H_INCLUDED #include <_comdef.h> #endif #ifdef __cplusplus extern "C" { #endif #ifdef _M_IX86 #pragma pack( __push, 1 ) #else #pragma pack( __push, 8 ) #endif #undef __FILLER #if defined(_M_I86) || defined(__WINDOWS_386__) #define __FILLER(a) #else #define __FILLER(a) unsigned short a; #endif #if !defined(_M_I86) && !defined(__WINDOWS_386__) /* dword registers */ struct DWORDREGS { unsigned int eax; unsigned int ebx; unsigned int ecx; unsigned int edx; unsigned int esi; unsigned int edi; unsigned int cflag; }; #endif /* word registers */ struct WORDREGS { unsigned short ax; __FILLER(_1) unsigned short bx; __FILLER(_2) unsigned short cx; __FILLER(_3) unsigned short dx; __FILLER(_4) unsigned short si; __FILLER(_5) unsigned short di; __FILLER(_6) #if defined(__WINDOWS_386__) unsigned short cflag; #else unsigned int cflag; #endif }; /* byte registers */ struct BYTEREGS { unsigned char al, ah; __FILLER(_1) unsigned char bl, bh; __FILLER(_2) unsigned char cl, ch; __FILLER(_3) unsigned char dl, dh; __FILLER(_4) }; /* general purpose registers union - overlays the corresponding dword, * word, and byte registers. */ union REGS { #if defined(_M_I86) || defined(__WINDOWS_386__) struct WORDREGS x; #else struct DWORDREGS x; #endif struct WORDREGS w; struct BYTEREGS h; }; #define _REGS REGS /* segment registers */ struct SREGS { unsigned short es, cs, ss, ds; #if !defined(_M_I86) unsigned short fs, gs; #endif }; #define _SREGS SREGS /* intr structs */ struct REGPACKB { unsigned char al, ah; __FILLER(_1) unsigned char bl, bh; __FILLER(_2) unsigned char cl, ch; __FILLER(_3) unsigned char dl, dh; __FILLER(_4) }; struct REGPACKW { unsigned short ax; __FILLER(_1) unsigned short bx; __FILLER(_2) unsigned short cx; __FILLER(_3) unsigned short dx; __FILLER(_4) unsigned short bp; __FILLER(_5) unsigned short si; __FILLER(_6) unsigned short di; __FILLER(_7) unsigned short ds; unsigned short es; #if !defined(_M_I86) && !defined(__WINDOWS_386__) unsigned short fs; unsigned short gs; #endif #if defined(__WINDOWS_386__) unsigned short flags; #else unsigned int flags; #endif }; struct REGPACKX { unsigned int eax, ebx, ecx, edx, ebp, esi, edi; unsigned short ds, es, fs, gs; unsigned int flags; }; union REGPACK { struct REGPACKB h; struct REGPACKW w; #if defined(_M_I86) || defined(__WINDOWS_386__) struct REGPACKW x; #else struct REGPACKX x; #endif }; /* input parm to an 'interrupt' function is union INTPACK */ /* e.g. interrupt int10( union INTPACK r ) {} */ struct INTPACKX { unsigned gs,fs,es,ds,edi,esi,ebp,esp,ebx,edx,ecx,eax,eip,cs,flags; }; /* NOTE: The gs and fs fields will not be correct unless the compiler is invoked with at least the /3 switch. */ struct INTPACKW { unsigned short gs; __FILLER(_1) unsigned short fs; __FILLER(_2) unsigned short es; __FILLER(_3) unsigned short ds; __FILLER(_4) unsigned short di; __FILLER(_5) unsigned short si; __FILLER(_6) unsigned short bp; __FILLER(_7) unsigned short sp; __FILLER(_8) unsigned short bx; __FILLER(_9) unsigned short dx; __FILLER(_a) unsigned short cx; __FILLER(_b) unsigned short ax; __FILLER(_c) unsigned short ip; __FILLER(_d) unsigned short cs; __FILLER(_e) unsigned flags; }; struct INTPACKB { #if defined(_M_I86) unsigned /*gs*/:16,/*fs*/:16, /*es*/:16,/*ds*/:16, /*di*/:16,/*si*/:16, /*bp*/:16,/*sp*/:16; #else unsigned /*gs*/ :32,/*fs*/ :32, /*es*/ :32,/*ds*/ :32, /*edi*/:32,/*esi*/:32, /*ebp*/:32,/*esp*/:32; #endif unsigned char bl, bh; __FILLER(_1) unsigned char dl, dh; __FILLER(_2) unsigned char cl, ch; __FILLER(_3) unsigned char al, ah; __FILLER(_4) }; union INTPACK { struct INTPACKB h; struct INTPACKW w; #if defined(_M_I86) struct INTPACKW x; #else struct INTPACKX x; #endif }; /* bits defined for flags field defined in REGPACKW and INTPACKW */ enum { INTR_CF = 0x0001, /* carry */ INTR_PF = 0x0004, /* parity */ INTR_AF = 0x0010, /* auxiliary carry */ INTR_ZF = 0x0040, /* zero */ INTR_SF = 0x0080, /* sign */ INTR_TF = 0x0100, /* trace */ INTR_IF = 0x0200, /* interrupt */ INTR_DF = 0x0400, /* direction */ INTR_OF = 0x0800 /* overflow */ }; _WCIRTLINK extern void _disable( void ); _WCIRTLINK extern void _enable( void ); #ifdef __INLINE_FUNCTIONS__ #pragma intrinsic(_disable,_enable) #endif _WCRTLINK extern void delay(unsigned int __milliseconds); #if defined(_M_I86) || defined(__WINDOWS_386__) _WCRTLINK extern int int86( int, union REGS *, union REGS * ); _WCRTLINK extern int int86x( int, union REGS *, union REGS *, struct SREGS * ); #else _WCRTLINK extern int int386( int, union REGS *, union REGS * ); _WCRTLINK extern int int386x( int, union REGS *, union REGS *, struct SREGS * ); #endif _WCRTLINK extern void intr( int, union REGPACK * ); _WCRTLINK extern void nosound( void ); _WCRTLINK extern void segread( struct SREGS * ); _WCRTLINK extern void sound( unsigned __frequency ); /* macros to break 'far' pointers into segment and offset components */ #define FP_OFF(__p) ((unsigned)(__p)) #define _FP_OFF(__p) ((unsigned)(__p)) #if defined(_M_I86) #define FP_SEG(__p) ((unsigned)((unsigned long)(void __far*)(__p) >> 16)) #else unsigned short FP_SEG( const volatile void __far * ); #pragma aux FP_SEG = __parm __caller [eax dx] __value [dx]; #endif #define _FP_SEG FP_SEG /* make a far pointer from segment and offset */ #define MK_FP(__s,__o) (((unsigned short)(__s)):>((void __near *)(__o))) #pragma pack( __pop ) #ifdef __cplusplus } /* extern "C" */ #endif #endif