windows-nt/Source/XPSP1/NT/base/mvdm/v86/scaffold/i386/x86.h
2020-09-26 16:20:57 +08:00

419 lines
10 KiB
C

//
// 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;