|
|
//
// 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 <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <process.h>
#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 <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#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 <windows.h>
#endif
#ifdef SIGNALS
#include <conio.h>
#include <signal.h>
#endif
#ifdef OS2_32
#include <excpt.h>
#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;
|