// // This is temporary code, and should be removed when Insignia supplies rom // support // /* x86 v1.0 * * X86.H * Constants, macros, and common types * for the x86 emulator and related components * * History * Created 19-Oct-90 by Jeff Parsons * 17-Apr-91 by Dave Hastings trimmed for use in softpc (temprorary) * * COPYRIGHT NOTICE * This source file may not be distributed, modified or incorporated into * another product without prior approval from the author, Jeff Parsons. * This file may be copied to designated servers and machines authorized to * access those servers, but that does not imply any form of approval. */ #ifdef DOS #define SIGNALS #endif #ifdef OS2_16 #define OS2 #define SIGNALS #endif #ifdef OS2_32 #define OS2 #define FLAT_32 #endif #include #include #include #include #include #include #ifdef WIN_16 #define WIN #define API16 #endif #ifdef WIN_32 #ifndef WIN #define WIN #endif #define FLAT_32 #define TRUE_IF_WIN32 1 #define FIXHWND(h) ((HWND)((INT)(h) & 0x00ffffff)) #include #include #include #else #define TRUE_IF_WIN32 0 #define FIXHWND(h) (h) #endif #ifdef FLAT_32 #ifndef i386 #define ALIGN_32 #else #define NOALIGN_32 #endif #endif #ifdef WIN #define _WINDOWS #include #endif #ifdef SIGNALS #include #include #endif #ifdef OS2_32 #include #define XCPT_SIGNAL 0xC0010003 #endif #define SIGHIT(flChk) ((iSigCheck++ & 0x7FF)?(flSignals & (flChk)):(kbhit(),(flSignals & (flChk)))) #ifndef CONST #define CONST const #endif #ifndef CDECL #define CDECL _cdecl #endif #ifndef PASCAL #define PASCAL #endif #ifdef FLAT_32 #ifndef WIN #define FAR #endif #define HUGE #define HALLOC(n,s) malloc((n)*(s)) #define HLOCK(h) h #define HUNLOCK(h) 0 #define HFREE(h) free(h) #else #ifndef WIN #define FAR _far #define HUGE _huge #define HALLOC(n,s) halloc(n,s) #define HLOCK(h) h #define HUNLOCK(h) 0 #define HFREE(h) hfree(h) #else #define HUGE _huge #define HALLOC(n,s) GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,(n)*(s)) #define HLOCK(h) (HPVOID)GlobalLock(h) #define HUNLOCK(h) GlobalUnlock(h) #define HFREE(h) GlobalFree(h) #endif #endif #define BYTEOF(i,n) (((PBYTE)&(i))[n]) #define LOB(i) BYTEOF(i,0) #define HIB(i) BYTEOF(i,1) #define WORDOF(i,n) (((PWORD)&(i))[n]) #define LOW(l) WORDOF(l,0) #define HIW(l) WORDOF(l,1) #define INTOF(i,n) (((PINT)&(i))[n]) #define UINTOF(i,n) (((PUINT)&(i))[n]) #ifndef WIN #define LOWORD(l) ((WORD)(l)) #define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF)) #define LOBYTE(w) ((BYTE)(w)) #define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF)) #endif #ifndef MAKEWORD #define MAKEWORD(l,h) ((WORD)((BYTE)(l)|((BYTE)(h)<<8))) #endif #define MAKEDWORD(l0,h0,l1,h1) ((DWORD)MAKEWORD(l0,h0)|((DWORD)MAKEWORD(l1,h1)<<16)) #define GETBYTE(p) *((PBYTE)p)++ #define GETBYTEPTR(p) ((PBYTE)p)++ #define GETWORDPTR(pb) ((PWORD)pb)++ #define GETDWORDPTR(pb) ((PDWORD)pb)++ #ifndef ALIGN_32 #define GETWORD(pb) (*((PWORD)pb)++) #define GETDWORD(pb) (*((PDWORD)pb)++) #define FETCHWORD(s) ((WORD)(s)) #define FETCHDWORD(s) ((DWORD)(s)) #define STOREWORD(d,s) (WORD)d=(WORD)s #define STOREDWORD(d,s) (DWORD)d=(DWORD)s #else #define GETWORD(pb) (pb+=2,MAKEWORD(*(pb-2),*(pb-1))) #define GETDWORD(pb) (pb+=4,MAKEDWORD(*(pb-4),*(pb-3),*(pb-2),*(pb-1))) #define FETCHWORD(s) MAKEWORD(LOB(s),HIB(s)) #define FETCHDWORD(s) MAKEDWORD(BYTEOF(s,0),BYTEOF(s,1),BYTEOF(s,2),BYTEOF(s,3)) #define STOREWORD(d,s) {BYTEOF(d,0)=LOBYTE(s);BYTEOF(d,1)=HIBYTE(s);} #define STOREDWORD(d,s) {BYTEOF(d,0)=LOBYTE(LOWORD(s));BYTEOF(d,1)=HIBYTE(LOWORD(s));BYTEOF(d,2)=LOBYTE(HIWORD(s));BYTEOF(d,3)=HIBYTE(HIWORD(s));} #endif #define SWAP(x,y) {INT t; t=y; y=x; x=t;} #define SWAPS(x,y) {SHORT t; t=y; y=x; x=t;} #define SWAPL(x,y) {LONG t; t=y; y=x; x=t;} #define SWAPBYTE(x,y) {BYTE t; t=y; y=x; x=t;} #define SWAPWORD(x,y) {WORD t; t=FETCHWORD(y); STOREWORD(y,FETCHWORD(x)); STOREWORD(x,t);} #define SWAPDWORD(x,y) {DWORD t; t=FETCHDWORD(y); STOREDWORD(y,FETCHDWORD(x)); STOREDWORD(x,t);} #define NUMEL(a) ((sizeof a)/(sizeof a[0])) #define SXBYTE(i) ((LONG)(SBYTE)(i)) #define SXWORD(i) ((LONG)(SHORT)(i)) #define SXSHORT(i) ((LONG)(SHORT)(i)) #define ZXBYTE(i) ((ULONG)(BYTE)(i)) #define ZXWORD(i) ((ULONG)(USHORT)(i)) #define ZXSHORT(i) ((ULONG)(USHORT)(i)) #define _Z2(m) ((m)&1?0:(m)&2?1:2) #define _Z4(m) ((m)&3?_Z2(m):_Z2((m)>>2)+2) #define _Z8(m) ((m)&15?_Z4(m):_Z4((m)>>4)+4) #define _Z16(m) ((m)&255?_Z8(m):_Z8((m)>>8)+8) #define _Z32(m) ((m)&65535?_Z16(m):_Z16((m)>>16)+16) #define SHIFTLEFT(i,m) (((i)<<_Z32(m))&(m)) #define SHIFTRIGHT(i,m) (((i)&(m))>>_Z32(m)) #define OFFSETOF(t,f) ((INT)&(((t *)0)->f)) /* Universal constants */ #define K 1024L #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #ifndef NULL #define NULL 0 #endif #define UNDEFINED -1 #define CTRL_A 1 // used by gets to repeat last line #define CTRL_C 3 // break in debug window #define CTRL_Q 17 // flow control #define CTRL_S 19 // flow control #define BELL 7 // #define BS 8 // backspace #define TAB 9 // #define LF 10 // linefeed #define CR 13 // return #define ESCAPE 27 // /* Program options */ #define OPT_FONT 0x0004 // use small OEM font if available (/s) #define OPT_DOUBLE 0x0020 // use 50-line debug window w/small font (/50) #define OPT_CAPS 0x0002 // map ctrl keys to caps-lock (/c) #define OPT_TERMINAL 0x0010 // redirect all window output to terminal (/t) #define OPT_FLUSH 0x0100 // flush prefetch after every jump (/f) #define OPT_NOXLATE 0x0200 // disable built-in translations (/n) #define OPT_DEBUG 0x0008 // shadow all log output on debug terminal (/d) #define OPT_GO 0x0001 // do an initial "go" (/g) /* Signal flags */ #define SIGNAL_BREAK 0x0001 // set whenever break has occurred #define SIGNAL_UNWIND 0x0002 // set whenever unwind has occurred #define SIGNAL_REBOOT 0x0004 // set whenever reboot has occurred #define SIGNAL_RUN 0x0008 // set whenever emulator is "running" #define SIGNAL_TRACE 0x0010 // set whenever debugger tracing #define SIGNAL_BRKPT 0x0020 // set whenever debugger breakpoints enabled #define SIGNAL_SSTEP 0x0040 // set whenever emulator single-step on #undef SIG_IGN // fix broken definition in (old) signal.h #define SIG_IGN (VOID (CDECL *)())1 /* Exec flags (for HostInput/GuestInput) */ #define EXEC_INPUT 0x0000 // wait for input #define EXEC_GO 0x0001 // execute immediately #define EXEC_FREEZE 0x0002 // execution frozen (guest only) /* Standard types */ #ifndef WIN typedef void VOID; typedef unsigned char BYTE; typedef unsigned short WORD; // confusing - use where 16-bit req. only typedef unsigned long DWORD; // confusing - use where 32-bit req. only typedef long LONG; // use where 32-bit req. only typedef int BOOL; #endif typedef char CHAR; typedef signed char SBYTE; typedef short SHORT; // use where 16-bit req. only typedef unsigned short USHORT; // use where 16-bit req. only typedef int INT; // ints preferred typedef unsigned int UINT; // ints preferred typedef unsigned long ULONG; // use where 32-bit req. only #ifndef WIN typedef BYTE *PBYTE; // native pointers typedef WORD *PWORD; typedef DWORD *PDWORD; typedef INT *PINT; typedef LONG *PLONG; typedef CHAR *PSTR; #endif typedef PBYTE *PPBYTE; typedef PWORD *PPWORD; typedef PDWORD *PPDWORD; typedef CHAR SZ[]; typedef VOID *PVOID; typedef CHAR *PCHAR; typedef SHORT *PSHORT; typedef USHORT *PUSHORT; typedef PUSHORT *PPUSHORT; typedef UINT *PUINT; typedef ULONG *PULONG; typedef PULONG *PPULONG; typedef BOOL *PBOOL; typedef CHAR *PSZ; typedef PSZ *PPSZ; typedef VOID FAR *FPVOID; // "far" (or "long" in Windows) pointers typedef CHAR FAR *FPCHAR; typedef BYTE FAR *FPBYTE; typedef SHORT FAR *FPSHORT; typedef USHORT FAR *FPUSHORT; typedef LONG FAR *FPLONG; typedef ULONG FAR *FPULONG; typedef CHAR FAR *FPSTR; typedef CHAR FAR *FPSZ; typedef VOID HUGE *HPVOID; // "huge" pointers typedef CHAR HUGE *HPCHAR; typedef BYTE HUGE *HPBYTE; typedef SHORT HUGE *HPSHORT; typedef USHORT HUGE *HPUSHORT; typedef LONG HUGE *HPLONG; typedef ULONG HUGE *HPULONG; typedef CHAR HUGE *HPSTR; typedef CHAR HUGE *HPSZ; #ifndef WIN typedef HPVOID HANDLE; #endif #ifdef WIN typedef INT (FAR PASCAL *INTPROC)(HWND, UINT, UINT, LONG); #endif #ifdef WIN_16 typedef LONG (FAR PASCAL *WNDPROC)(HWND, WORD, UINT, LONG); #endif /* Global data */ extern FILE *hfLog; extern INT flOptions; // command-line options (see OPT_*) extern INT flSignals; // signal flags (see SIGNAL_*) extern INT iSigCheck; // counter indicating when to make next check extern INT iSigLevel; // counter indicating whether to take default action extern INT iLogLevel; // logging level; 0 implies none extern BOOL fReinit; // set once first initialization has completed /* String macros */ #define STRSKIP(psz,sz) psz += strspn(psz, sz) #define STRSKIPTO(psz,sz) psz += strcspn(psz, sz) #define STRSKIPNEXT(psz,sz) psz += strspn(psz+=strcspn(psz, sz), sz) #define ATOI(psz) (INT)szTOul(psz, 10, -1) /* Logging macros */ #define IFLOG(l) if (l==iLogLevel && (iLogLevel&1) || l<=iLogLevel && !(iLogLevel&1)) #define OPENLOG() (hfLog?hfLog:(hfLog=fopen("log", "w"))) #define APPENDLOG() (hfLog?hfLog:(hfLog=fopen("log", "a"))) #define CLOSELOG() if (hfLog) {fclose(hfLog); hfLog=NULL;} #ifdef NOLOG #define LOG(l,args) #else #define LOG(l,args) IFLOG(l) logprintf args; else #endif /* Debugging macros */ #define MODNAME(module) static char szModule[] = __FILE__ #define X86ERROR() terminate(ERR_ASSERT, szModule, __LINE__) #ifdef DEBUG #define STATIC #define INT3() _asm int 3 #define IFDEBUG(f) if (f) #define ELSEDEBUG else #define LOGDEBUG(l,args) LOG(l,args) #define X86ASSERT(exp) if (!(exp)) X86ERROR() #else #define STATIC static #define INT3() #define IFDEBUG(f) #define ELSEDEBUG #define LOGDEBUG(l,args) #define X86ASSERT(exp) #endif // DEBUG /* Other common local include files */ #ifdef X86 #include "xerr.h" #include "xlib.h" #endif /* Windows goop */ #define SZ_APP "x86" #define SZ_TITLE "x86 emulator v0.17" #define SZ_AUTHOR "by Jeff Parsons, (C) 1991" #define SZ_PCTITLE "x86 pc" #define IDM_DBBRK 100 #define IDM_ABOUT 101 /* Standard color definitions */ #define CLR_BLACK 0x00000000 #define CLR_RED 0x007F0000 #define CLR_GREEN 0x00007F00 #define CLR_BROWN 0x007F7F00 #define CLR_BLUE 0x0000007F #define CLR_MAGENTA 0x007F007F #define CLR_CYAN 0x00007F7F #define CLR_LT_GRAY 0x00BFBFBF #define CLR_DK_GRAY 0x007F7F7F #define CLR_BR_RED 0x00FF0000 #define CLR_BR_GREEN 0x0000FF00 #define CLR_YELLOW 0x00FFFF00 #define CLR_BR_BLUE 0x000000FF #define CLR_BR_MAGENTA 0x00FF00FF #define CLR_BR_CYAN 0x0000FFFF #define CLR_WHITE 0x00FFFFFF extern HANDLE hHostInstance;