summaryrefslogtreecommitdiffstats
path: root/board/MAI/bios_emulator/scitech/include
diff options
context:
space:
mode:
Diffstat (limited to 'board/MAI/bios_emulator/scitech/include')
-rw-r--r--board/MAI/bios_emulator/scitech/include/biosemu.h155
-rw-r--r--board/MAI/bios_emulator/scitech/include/event.h696
-rw-r--r--board/MAI/bios_emulator/scitech/include/mtrr.h72
-rw-r--r--board/MAI/bios_emulator/scitech/include/pcilib.h414
-rw-r--r--board/MAI/bios_emulator/scitech/include/pm_help.h167
-rw-r--r--board/MAI/bios_emulator/scitech/include/pm_wctl.h76
-rw-r--r--board/MAI/bios_emulator/scitech/include/pmapi.h1149
-rw-r--r--board/MAI/bios_emulator/scitech/include/pmimp.h194
-rw-r--r--board/MAI/bios_emulator/scitech/include/pmint.h211
-rw-r--r--board/MAI/bios_emulator/scitech/include/scitech.h712
-rw-r--r--board/MAI/bios_emulator/scitech/include/scitech.mac1321
-rw-r--r--board/MAI/bios_emulator/scitech/include/x86emu.h194
-rw-r--r--board/MAI/bios_emulator/scitech/include/x86emu/fpu_regs.h115
-rw-r--r--board/MAI/bios_emulator/scitech/include/x86emu/regs.h331
-rw-r--r--board/MAI/bios_emulator/scitech/include/x86emu/types.h70
15 files changed, 5877 insertions, 0 deletions
diff --git a/board/MAI/bios_emulator/scitech/include/biosemu.h b/board/MAI/bios_emulator/scitech/include/biosemu.h
new file mode 100644
index 0000000000..e38ff3157f
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/biosemu.h
@@ -0,0 +1,155 @@
+/****************************************************************************
+*
+* BIOS emulator and interface
+* to Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for the real mode x86 BIOS emulator, which is
+* used to warmboot any number of VGA compatible PCI/AGP
+* controllers under any OS, on any processor family that
+* supports PCI. We also allow the user application to call
+* real mode BIOS functions and Int 10h functions (including
+* the VESA BIOS).
+*
+****************************************************************************/
+
+#ifndef __BIOSEMU_H
+#define __BIOSEMU_H
+
+#include "x86emu.h"
+#include "pmapi.h"
+#include "pcilib.h"
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+#pragma pack(1)
+
+/****************************************************************************
+REMARKS:
+Data structure used to describe the details specific to a particular VGA
+controller. This information is used to allow the VGA controller to be
+swapped on the fly within the BIOS emulator.
+
+HEADER:
+biosemu.h
+
+MEMBERS:
+pciInfo - PCI device information block for the controller
+BIOSImage - Pointer to a read/write copy of the BIOS image
+BIOSImageLen - Length of the BIOS image
+LowMem - Copy of key low memory areas
+****************************************************************************/
+typedef struct {
+ PCIDeviceInfo *pciInfo;
+ void *BIOSImage;
+ ulong BIOSImageLen;
+ uchar LowMem[1536];
+ } BE_VGAInfo;
+
+/****************************************************************************
+REMARKS:
+Data structure used to describe the details for the BIOS emulator system
+environment as used by the X86 emulator library.
+
+HEADER:
+biosemu.h
+
+MEMBERS:
+vgaInfo - VGA BIOS information structure
+biosmem_base - Base of the BIOS image
+biosmem_limit - Limit of the BIOS image
+busmem_base - Base of the VGA bus memory
+****************************************************************************/
+typedef struct {
+ BE_VGAInfo vgaInfo;
+ ulong biosmem_base;
+ ulong biosmem_limit;
+ ulong busmem_base;
+ } BE_sysEnv;
+
+/****************************************************************************
+REMARKS:
+Structure defining all the BIOS Emulator API functions as exported from
+the Binary Portable DLL.
+{secret}
+****************************************************************************/
+typedef struct {
+ ulong dwSize;
+ ibool (PMAPIP BE_init)(u32 debugFlags,int memSize,BE_VGAInfo *info);
+ void (PMAPIP BE_setVGA)(BE_VGAInfo *info);
+ void (PMAPIP BE_getVGA)(BE_VGAInfo *info);
+ void * (PMAPIP BE_mapRealPointer)(uint r_seg,uint r_off);
+ void * (PMAPIP BE_getVESABuf)(uint *len,uint *rseg,uint *roff);
+ void (PMAPIP BE_callRealMode)(uint seg,uint off,RMREGS *regs,RMSREGS *sregs);
+ int (PMAPIP BE_int86)(int intno,RMREGS *in,RMREGS *out);
+ int (PMAPIP BE_int86x)(int intno,RMREGS *in,RMREGS *out,RMSREGS *sregs);
+ void * reserved1;
+ void (PMAPIP BE_exit)(void);
+ } BE_exports;
+
+/****************************************************************************
+REMARKS:
+Function pointer type for the Binary Portable DLL initialisation entry point.
+{secret}
+****************************************************************************/
+typedef BE_exports * (PMAPIP BE_initLibrary_t)(PM_imports *PMImp);
+
+#pragma pack()
+
+/*---------------------------- Global variables ---------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+/* {secret} Global BIOS emulator system environment */
+extern BE_sysEnv _BE_env;
+
+/*-------------------------- Function Prototypes --------------------------*/
+
+/* BIOS emulator library entry points */
+
+ibool PMAPI BE_init(u32 debugFlags,int memSize,BE_VGAInfo *info);
+void PMAPI BE_setVGA(BE_VGAInfo *info);
+void PMAPI BE_getVGA(BE_VGAInfo *info);
+void PMAPI BE_setDebugFlags(u32 debugFlags);
+void * PMAPI BE_mapRealPointer(uint r_seg,uint r_off);
+void * PMAPI BE_getVESABuf(uint *len,uint *rseg,uint *roff);
+void PMAPI BE_callRealMode(uint seg,uint off,RMREGS *regs,RMSREGS *sregs);
+int PMAPI BE_int86(int intno,RMREGS *in,RMREGS *out);
+int PMAPI BE_int86x(int intno,RMREGS *in,RMREGS *out,RMSREGS *sregs);
+void PMAPI BE_exit(void);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __BIOSEMU_H */
+
diff --git a/board/MAI/bios_emulator/scitech/include/event.h b/board/MAI/bios_emulator/scitech/include/event.h
new file mode 100644
index 0000000000..0de45172d6
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/event.h
@@ -0,0 +1,696 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+*
+* Description: Header file for the SciTech cross platform event library
+*
+****************************************************************************/
+
+#ifndef __EVENT_H
+#define __EVENT_H
+
+#include "scitech.h"
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+#pragma pack(1)
+
+/* 'C' calling conventions always */
+
+#define EVTAPI _ASMAPI
+#define EVTAPIP _ASMAPIP
+
+/* Event message masks for keyDown events */
+
+#define EVT_ASCIIMASK 0x00FF /* ASCII code of key pressed */
+#define EVT_SCANMASK 0xFF00 /* Scan code of key pressed */
+#define EVT_COUNTMASK 0x7FFF0000L /* Count for KEYREPEAT's */
+
+/* Macros to extract values from the message fields */
+
+#define EVT_asciiCode(m) ( (uchar) (m & EVT_ASCIIMASK) )
+#define EVT_scanCode(m) ( (uchar) ( (m & EVT_SCANMASK) >> 8 ) )
+#define EVT_repeatCount(m) ( (short) ( (m & EVT_COUNTMASK) >> 16 ) )
+
+/****************************************************************************
+REMARKS:
+Defines the set of ASCII codes reported by the event library functions
+in the message field. Use the EVT_asciiCode macro to extract the code
+from the event structure.
+
+HEADER:
+event.h
+****************************************************************************/
+typedef enum {
+ ASCII_ctrlA = 0x01,
+ ASCII_ctrlB = 0x02,
+ ASCII_ctrlC = 0x03,
+ ASCII_ctrlD = 0x04,
+ ASCII_ctrlE = 0x05,
+ ASCII_ctrlF = 0x06,
+ ASCII_ctrlG = 0x07,
+ ASCII_backspace = 0x08,
+ ASCII_ctrlH = 0x08,
+ ASCII_tab = 0x09,
+ ASCII_ctrlI = 0x09,
+ ASCII_ctrlJ = 0x0A,
+ ASCII_ctrlK = 0x0B,
+ ASCII_ctrlL = 0x0C,
+ ASCII_enter = 0x0D,
+ ASCII_ctrlM = 0x0D,
+ ASCII_ctrlN = 0x0E,
+ ASCII_ctrlO = 0x0F,
+ ASCII_ctrlP = 0x10,
+ ASCII_ctrlQ = 0x11,
+ ASCII_ctrlR = 0x12,
+ ASCII_ctrlS = 0x13,
+ ASCII_ctrlT = 0x14,
+ ASCII_ctrlU = 0x15,
+ ASCII_ctrlV = 0x16,
+ ASCII_ctrlW = 0x17,
+ ASCII_ctrlX = 0x18,
+ ASCII_ctrlY = 0x19,
+ ASCII_ctrlZ = 0x1A,
+ ASCII_esc = 0x1B,
+ ASCII_space = 0x20,
+ ASCII_exclamation = 0x21, /* ! */
+ ASCII_quote = 0x22, /* " */
+ ASCII_pound = 0x23, /* # */
+ ASCII_dollar = 0x24, /* $ */
+ ASCII_percent = 0x25, /* % */
+ ASCII_ampersand = 0x26, /* & */
+ ASCII_apostrophe = 0x27, /* ' */
+ ASCII_leftBrace = 0x28, /* ( */
+ ASCII_rightBrace = 0x29, /* ) */
+ ASCII_times = 0x2A, /* * */
+ ASCII_plus = 0x2B, /* + */
+ ASCII_comma = 0x2C, /* , */
+ ASCII_minus = 0x2D, /* - */
+ ASCII_period = 0x2E, /* . */
+ ASCII_divide = 0x2F, /* / */
+ ASCII_0 = 0x30,
+ ASCII_1 = 0x31,
+ ASCII_2 = 0x32,
+ ASCII_3 = 0x33,
+ ASCII_4 = 0x34,
+ ASCII_5 = 0x35,
+ ASCII_6 = 0x36,
+ ASCII_7 = 0x37,
+ ASCII_8 = 0x38,
+ ASCII_9 = 0x39,
+ ASCII_colon = 0x3A, /* : */
+ ASCII_semicolon = 0x3B, /* ; */
+ ASCII_lessThan = 0x3C, /* < */
+ ASCII_equals = 0x3D, /* = */
+ ASCII_greaterThan = 0x3E, /* > */
+ ASCII_question = 0x3F, /* ? */
+ ASCII_at = 0x40, /* @ */
+ ASCII_A = 0x41,
+ ASCII_B = 0x42,
+ ASCII_C = 0x43,
+ ASCII_D = 0x44,
+ ASCII_E = 0x45,
+ ASCII_F = 0x46,
+ ASCII_G = 0x47,
+ ASCII_H = 0x48,
+ ASCII_I = 0x49,
+ ASCII_J = 0x4A,
+ ASCII_K = 0x4B,
+ ASCII_L = 0x4C,
+ ASCII_M = 0x4D,
+ ASCII_N = 0x4E,
+ ASCII_O = 0x4F,
+ ASCII_P = 0x50,
+ ASCII_Q = 0x51,
+ ASCII_R = 0x52,
+ ASCII_S = 0x53,
+ ASCII_T = 0x54,
+ ASCII_U = 0x55,
+ ASCII_V = 0x56,
+ ASCII_W = 0x57,
+ ASCII_X = 0x58,
+ ASCII_Y = 0x59,
+ ASCII_Z = 0x5A,
+ ASCII_leftSquareBrace = 0x5B, /* [ */
+ ASCII_backSlash = 0x5C, /* \ */
+ ASCII_rightSquareBrace = 0x5D, /* ] */
+ ASCII_caret = 0x5E, /* ^ */
+ ASCII_underscore = 0x5F, /* _ */
+ ASCII_leftApostrophe = 0x60, /* ` */
+ ASCII_a = 0x61,
+ ASCII_b = 0x62,
+ ASCII_c = 0x63,
+ ASCII_d = 0x64,
+ ASCII_e = 0x65,
+ ASCII_f = 0x66,
+ ASCII_g = 0x67,
+ ASCII_h = 0x68,
+ ASCII_i = 0x69,
+ ASCII_j = 0x6A,
+ ASCII_k = 0x6B,
+ ASCII_l = 0x6C,
+ ASCII_m = 0x6D,
+ ASCII_n = 0x6E,
+ ASCII_o = 0x6F,
+ ASCII_p = 0x70,
+ ASCII_q = 0x71,
+ ASCII_r = 0x72,
+ ASCII_s = 0x73,
+ ASCII_t = 0x74,
+ ASCII_u = 0x75,
+ ASCII_v = 0x76,
+ ASCII_w = 0x77,
+ ASCII_x = 0x78,
+ ASCII_y = 0x79,
+ ASCII_z = 0x7A,
+ ASCII_leftCurlyBrace = 0x7B, /* { */
+ ASCII_verticalBar = 0x7C, /* | */
+ ASCII_rightCurlyBrace = 0x7D, /* } */
+ ASCII_tilde = 0x7E /* ~ */
+ } EVT_asciiCodesType;
+
+/****************************************************************************
+REMARKS:
+Defines the set of scan codes reported by the event library functions
+in the message field. Use the EVT_scanCode macro to extract the code
+from the event structure. Note that the scan codes reported will be the
+same across all keyboards (assuming the placement of keys on a 101 key US
+keyboard), but the translated ASCII values may be different depending on
+the country code pages in use.
+
+NOTE: Scan codes in the event library are not really hardware scan codes,
+ but rather virtual scan codes as generated by a low level keyboard
+ interface driver. All virtual codes begin with scan code 0x60 and
+ range up from there.
+
+HEADER:
+event.h
+****************************************************************************/
+typedef enum {
+ KB_padEnter = 0x60, /* Keypad keys */
+ KB_padMinus = 0x4A,
+ KB_padPlus = 0x4E,
+ KB_padTimes = 0x37,
+ KB_padDivide = 0x61,
+ KB_padLeft = 0x62,
+ KB_padRight = 0x63,
+ KB_padUp = 0x64,
+ KB_padDown = 0x65,
+ KB_padInsert = 0x66,
+ KB_padDelete = 0x67,
+ KB_padHome = 0x68,
+ KB_padEnd = 0x69,
+ KB_padPageUp = 0x6A,
+ KB_padPageDown = 0x6B,
+ KB_padCenter = 0x4C,
+ KB_F1 = 0x3B, /* Function keys */
+ KB_F2 = 0x3C,
+ KB_F3 = 0x3D,
+ KB_F4 = 0x3E,
+ KB_F5 = 0x3F,
+ KB_F6 = 0x40,
+ KB_F7 = 0x41,
+ KB_F8 = 0x42,
+ KB_F9 = 0x43,
+ KB_F10 = 0x44,
+ KB_F11 = 0x57,
+ KB_F12 = 0x58,
+ KB_left = 0x4B, /* Cursor control keys */
+ KB_right = 0x4D,
+ KB_up = 0x48,
+ KB_down = 0x50,
+ KB_insert = 0x52,
+ KB_delete = 0x53,
+ KB_home = 0x47,
+ KB_end = 0x4F,
+ KB_pageUp = 0x49,
+ KB_pageDown = 0x51,
+ KB_capsLock = 0x3A,
+ KB_numLock = 0x45,
+ KB_scrollLock = 0x46,
+ KB_leftShift = 0x2A,
+ KB_rightShift = 0x36,
+ KB_leftCtrl = 0x1D,
+ KB_rightCtrl = 0x6C,
+ KB_leftAlt = 0x38,
+ KB_rightAlt = 0x6D,
+ KB_leftWindows = 0x5B,
+ KB_rightWindows = 0x5C,
+ KB_menu = 0x5D,
+ KB_sysReq = 0x54,
+ KB_esc = 0x01, /* Normal keyboard keys */
+ KB_1 = 0x02,
+ KB_2 = 0x03,
+ KB_3 = 0x04,
+ KB_4 = 0x05,
+ KB_5 = 0x06,
+ KB_6 = 0x07,
+ KB_7 = 0x08,
+ KB_8 = 0x09,
+ KB_9 = 0x0A,
+ KB_0 = 0x0B,
+ KB_minus = 0x0C,
+ KB_equals = 0x0D,
+ KB_backSlash = 0x2B,
+ KB_backspace = 0x0E,
+ KB_tab = 0x0F,
+ KB_Q = 0x10,
+ KB_W = 0x11,
+ KB_E = 0x12,
+ KB_R = 0x13,
+ KB_T = 0x14,
+ KB_Y = 0x15,
+ KB_U = 0x16,
+ KB_I = 0x17,
+ KB_O = 0x18,
+ KB_P = 0x19,
+ KB_leftSquareBrace = 0x1A,
+ KB_rightSquareBrace = 0x1B,
+ KB_enter = 0x1C,
+ KB_A = 0x1E,
+ KB_S = 0x1F,
+ KB_D = 0x20,
+ KB_F = 0x21,
+ KB_G = 0x22,
+ KB_H = 0x23,
+ KB_J = 0x24,
+ KB_K = 0x25,
+ KB_L = 0x26,
+ KB_semicolon = 0x27,
+ KB_apostrophe = 0x28,
+ KB_Z = 0x2C,
+ KB_X = 0x2D,
+ KB_C = 0x2E,
+ KB_V = 0x2F,
+ KB_B = 0x30,
+ KB_N = 0x31,
+ KB_M = 0x32,
+ KB_comma = 0x33,
+ KB_period = 0x34,
+ KB_divide = 0x35,
+ KB_space = 0x39,
+ KB_tilde = 0x29
+ } EVT_scanCodesType;
+
+/****************************************************************************
+REMARKS:
+Defines the mask for the joystick axes that are present
+
+HEADER:
+event.h
+
+MEMBERS:
+EVT_JOY_AXIS_X1 - Joystick 1, X axis is present
+EVT_JOY_AXIS_Y1 - Joystick 1, Y axis is present
+EVT_JOY_AXIS_X2 - Joystick 2, X axis is present
+EVT_JOY_AXIS_Y2 - Joystick 2, Y axis is present
+EVT_JOY_AXIS_ALL - Mask for all axes
+****************************************************************************/
+typedef enum {
+ EVT_JOY_AXIS_X1 = 0x00000001,
+ EVT_JOY_AXIS_Y1 = 0x00000002,
+ EVT_JOY_AXIS_X2 = 0x00000004,
+ EVT_JOY_AXIS_Y2 = 0x00000008,
+ EVT_JOY_AXIS_ALL = 0x0000000F
+ } EVT_eventJoyAxisType;
+
+/****************************************************************************
+REMARKS:
+Defines the event message masks for joystick events
+
+HEADER:
+event.h
+
+MEMBERS:
+EVT_JOY1_BUTTONA - Joystick 1, button A is down
+EVT_JOY1_BUTTONB - Joystick 1, button B is down
+EVT_JOY2_BUTTONA - Joystick 2, button A is down
+EVT_JOY2_BUTTONB - Joystick 2, button B is down
+****************************************************************************/
+typedef enum {
+ EVT_JOY1_BUTTONA = 0x00000001,
+ EVT_JOY1_BUTTONB = 0x00000002,
+ EVT_JOY2_BUTTONA = 0x00000004,
+ EVT_JOY2_BUTTONB = 0x00000008
+ } EVT_eventJoyMaskType;
+
+/****************************************************************************
+REMARKS:
+Defines the event message masks for mouse events
+
+HEADER:
+event.h
+
+MEMBERS:
+EVT_LEFTBMASK - Left button is held down
+EVT_RIGHTBMASK - Right button is held down
+EVT_MIDDLEBMASK - Middle button is held down
+EVT_BOTHBMASK - Both left and right held down together
+EVT_ALLBMASK - All buttons pressed
+EVT_DBLCLICK - Set if mouse down event was a double click
+****************************************************************************/
+typedef enum {
+ EVT_LEFTBMASK = 0x00000001,
+ EVT_RIGHTBMASK = 0x00000002,
+ EVT_MIDDLEBMASK = 0x00000004,
+ EVT_BOTHBMASK = 0x00000007,
+ EVT_ALLBMASK = 0x00000007,
+ EVT_DBLCLICK = 0x00010000
+ } EVT_eventMouseMaskType;
+
+/****************************************************************************
+REMARKS:
+Defines the event modifier masks. These are the masks used to extract
+the modifier information from the modifiers field of the event_t structure.
+Note that the values in the modifiers field represent the values of these
+modifier keys at the time the event occurred, not the time you decided
+to process the event.
+
+HEADER:
+event.h
+
+MEMBERS:
+EVT_LEFTBUT - Set if left mouse button was down
+EVT_RIGHTBUT - Set if right mouse button was down
+EVT_MIDDLEBUT - Set if the middle button was down
+EVT_RIGHTSHIFT - Set if right shift was down
+EVT_LEFTSHIFT - Set if left shift was down
+EVT_RIGHTCTRL - Set if right ctrl key was down
+EVT_RIGHTALT - Set if right alt key was down
+EVT_LEFTCTRL - Set if left ctrl key was down
+EVT_LEFTALT - Set if left alt key was down
+EVT_SHIFTKEY - Mask for any shift key down
+EVT_CTRLSTATE - Set if ctrl key was down
+EVT_ALTSTATE - Set if alt key was down
+EVT_CAPSLOCK - Caps lock is active
+EVT_NUMLOCK - Num lock is active
+EVT_SCROLLLOCK - Scroll lock is active
+****************************************************************************/
+typedef enum {
+ EVT_LEFTBUT = 0x00000001,
+ EVT_RIGHTBUT = 0x00000002,
+ EVT_MIDDLEBUT = 0x00000004,
+ EVT_RIGHTSHIFT = 0x00000008,
+ EVT_LEFTSHIFT = 0x00000010,
+ EVT_RIGHTCTRL = 0x00000020,
+ EVT_RIGHTALT = 0x00000040,
+ EVT_LEFTCTRL = 0x00000080,
+ EVT_LEFTALT = 0x00000100,
+ EVT_SHIFTKEY = 0x00000018,
+ EVT_CTRLSTATE = 0x000000A0,
+ EVT_ALTSTATE = 0x00000140,
+ EVT_SCROLLLOCK = 0x00000200,
+ EVT_NUMLOCK = 0x00000400,
+ EVT_CAPSLOCK = 0x00000800
+ } EVT_eventModMaskType;
+
+/****************************************************************************
+REMARKS:
+Defines the event codes returned in the event_t structures what field. Note
+that these are defined as a set of mutually exlusive bit fields, so you
+can test for multiple event types using the combined event masks defined
+in the EVT_eventMaskType enumeration.
+
+HEADER:
+event.h
+
+MEMBERS:
+EVT_NULLEVT - A null event
+EVT_KEYDOWN - Key down event
+EVT_KEYREPEAT - Key repeat event
+EVT_KEYUP - Key up event
+EVT_MOUSEDOWN - Mouse down event
+EVT_MOUSEAUTO - Mouse down autorepeat event
+EVT_MOUSEUP - Mouse up event
+EVT_MOUSEMOVE - Mouse movement event
+EVT_JOYCLICK - Joystick button state change event
+EVT_JOYMOVE - Joystick movement event
+EVT_USEREVT - First user event
+****************************************************************************/
+typedef enum {
+ EVT_NULLEVT = 0x00000000,
+ EVT_KEYDOWN = 0x00000001,
+ EVT_KEYREPEAT = 0x00000002,
+ EVT_KEYUP = 0x00000004,
+ EVT_MOUSEDOWN = 0x00000008,
+ EVT_MOUSEAUTO = 0x00000010,
+ EVT_MOUSEUP = 0x00000020,
+ EVT_MOUSEMOVE = 0x00000040,
+ EVT_JOYCLICK = 0x00000080,
+ EVT_JOYMOVE = 0x00000100,
+ EVT_USEREVT = 0x00000200
+ } EVT_eventType;
+
+/****************************************************************************
+REMARKS:
+Defines the event code masks you can use to test for multiple types of
+events, since the event codes are mutually exlusive bit fields.
+
+HEADER:
+event.h
+
+MEMBERS:
+EVT_KEYEVT - Mask for any key event
+EVT_MOUSEEVT - Mask for any mouse event
+EVT_MOUSECLICK - Mask for any mouse click event
+EVT_JOYEVT - Mask for any joystick event
+EVT_EVERYEVT - Mask for any event
+****************************************************************************/
+typedef enum {
+ EVT_KEYEVT = (EVT_KEYDOWN | EVT_KEYREPEAT | EVT_KEYUP),
+ EVT_MOUSEEVT = (EVT_MOUSEDOWN | EVT_MOUSEAUTO | EVT_MOUSEUP | EVT_MOUSEMOVE),
+ EVT_MOUSECLICK = (EVT_MOUSEDOWN | EVT_MOUSEUP),
+ EVT_JOYEVT = (EVT_JOYCLICK | EVT_JOYMOVE),
+ EVT_EVERYEVT = 0x7FFFFFFF
+ } EVT_eventMaskType;
+
+/****************************************************************************
+REMARKS:
+Structure describing the information contained in an event extracted from
+the event queue.
+
+HEADER:
+event.h
+
+MEMBERS:
+which - Window identifier for message for use by high level window manager
+ code (i.e. MegaVision GUI or Windows API).
+what - Type of event that occurred. Will be one of the values defined by
+ the EVT_eventType enumeration.
+when - Time that the event occurred in milliseconds since startup
+where_x - X coordinate of the mouse cursor location at the time of the event
+ (in screen coordinates). For joystick events this represents
+ the position of the first joystick X axis.
+where_y - Y coordinate of the mouse cursor location at the time of the event
+ (in screen coordinates). For joystick events this represents
+ the position of the first joystick Y axis.
+relative_x - Relative movement of the mouse cursor in the X direction (in
+ units of mickeys, or 1/200th of an inch). For joystick events
+ this represents the position of the second joystick X axis.
+relative_y - Relative movement of the mouse cursor in the Y direction (in
+ units of mickeys, or 1/200th of an inch). For joystick events
+ this represents the position of the second joystick Y axis.
+message - Event specific message for the event. For use events this can be
+ any user specific information. For keyboard events this contains
+ the ASCII code in bits 0-7, the keyboard scan code in bits 8-15 and
+ the character repeat count in bits 16-30. You can use the
+ EVT_asciiCode, EVT_scanCode and EVT_repeatCount macros to extract
+ this information from the message field. For mouse events this
+ contains information about which button was pressed, and will be a
+ combination of the flags defined by the EVT_eventMouseMaskType
+ enumeration. For joystick events, this conatins information
+ about which buttons were pressed, and will be a combination of
+ the flags defined by the EVT_eventJoyMaskType enumeration.
+modifiers - Contains additional information about the state of the keyboard
+ shift modifiers (Ctrl, Alt and Shift keys) when the event
+ occurred. For mouse events it will also contain the state of
+ the mouse buttons. Will be a combination of the values defined
+ by the EVT_eventModMaskType enumeration.
+next - Internal use; do not use.
+prev - Internal use; do not use.
+****************************************************************************/
+typedef struct {
+ ulong which;
+ ulong what;
+ ulong when;
+ int where_x;
+ int where_y;
+ int relative_x;
+ int relative_y;
+ ulong message;
+ ulong modifiers;
+ int next;
+ int prev;
+ } event_t;
+
+/****************************************************************************
+REMARKS:
+Structure describing an entry in the code page table. A table of translation
+codes for scan codes to ASCII codes is provided in this table to be used
+by the keyboard event libraries. On some OS'es the keyboard translation is
+handled by the OS, but for DOS and embedded systems you must register a
+different code page translation table if you want to support keyboards
+other than the US English keyboard (the default).
+
+NOTE: Entries in code page tables *must* be in ascending order for the
+ scan codes as we do a binary search on the tables for the ASCII
+ code equivalents.
+
+HEADER:
+event.h
+
+MEMBERS:
+scanCode - Scan code to translate (really the virtual scan code).
+asciiCode - ASCII code for this scan code.
+****************************************************************************/
+typedef struct {
+ uchar scanCode;
+ uchar asciiCode;
+ } codepage_entry_t;
+
+/****************************************************************************
+REMARKS:
+Structure describing a complete code page translation table. The table
+contains translation tables for normal keys, shifted keys and ctrl keys.
+The Ctrl key always has precedence over the shift table, and the shift
+table is used when the shift key is down or the CAPSLOCK key is down.
+
+HEADER:
+event.h
+
+MEMBERS:
+name - Name of the code page table (ie: "US English")
+normal - Code page for translating normal keys
+normalLen - Length of normal translation table
+caps - Code page for translating keys when CAPSLOCK is down
+capsLen - Length of CAPSLOCK translation table
+shift - Code page for shifted keys (ie: shift key is held down)
+shiftLen - Length of shifted translation table
+shiftCaps - Code page for shifted keys when CAPSLOCK is down
+shiftCapsLen - Length of shifted CAPSLOCK translation table
+ctrl - Code page for ctrl'ed keys (ie: ctrl key is held down)
+ctrlLen - Length of ctrl'ed translation table
+numPad - Code page for NUMLOCK'ed keypad keys
+numPadLen - Length of NUMLOCK'ed translation table
+****************************************************************************/
+typedef struct {
+ char name[20];
+ codepage_entry_t *normal;
+ int normalLen;
+ codepage_entry_t *caps;
+ int capsLen;
+ codepage_entry_t *shift;
+ int shiftLen;
+ codepage_entry_t *shiftCaps;
+ int shiftCapsLen;
+ codepage_entry_t *ctrl;
+ int ctrlLen;
+ codepage_entry_t *numPad;
+ int numPadLen;
+ } codepage_t;
+
+/* {secret} */
+typedef ibool (EVTAPIP _EVT_userEventFilter)(event_t *evt);
+/* {secret} */
+typedef void (EVTAPIP _EVT_mouseMoveHandler)(int x,int y);
+/* {secret} */
+typedef void (EVTAPIP _EVT_heartBeatCallback)(void *params);
+
+/* Macro to find the size of a static array */
+
+#define EVT_ARR_SIZE(a) (sizeof(a)/sizeof((a)[0]))
+
+#pragma pack()
+
+/*--------------------------- Global variables ----------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+/* Standard code page tables */
+
+extern codepage_t _CP_US_English;
+
+/*------------------------- Function Prototypes ---------------------------*/
+
+/* Public API functions for user applications */
+
+ibool EVTAPI EVT_getNext(event_t *evt,ulong mask);
+ibool EVTAPI EVT_peekNext(event_t *evt,ulong mask);
+ibool EVTAPI EVT_post(ulong which,ulong what,ulong message,ulong modifiers);
+void EVTAPI EVT_flush(ulong mask);
+void EVTAPI EVT_halt(event_t *evt,ulong mask);
+ibool EVTAPI EVT_isKeyDown(uchar scanCode);
+void EVTAPI EVT_setMousePos(int x,int y);
+void EVTAPI EVT_getMousePos(int *x,int *y);
+
+/* Function to enable/disable updating of keyboard LED status indicators */
+
+void EVTAPI EVT_allowLEDS(ibool enable);
+
+/* Function to install a custom keyboard code page. Default is US English */
+
+codepage_t *EVTAPI EVT_getCodePage(void);
+void EVTAPI EVT_setCodePage(codepage_t *page);
+
+/* Functions for fine grained joystick calibration */
+
+void EVTAPI EVT_pollJoystick(void);
+int EVTAPI EVT_joyIsPresent(void);
+void EVTAPI EVT_joySetUpperLeft(void);
+void EVTAPI EVT_joySetLowerRight(void);
+void EVTAPI EVT_joySetCenter(void);
+
+/* Install user supplied event filter callback */
+
+void EVTAPI EVT_setUserEventFilter(_EVT_userEventFilter filter);
+
+/* Install user supplied event heartbeat callback function */
+
+void EVTAPI EVT_setHeartBeatCallback(_EVT_heartBeatCallback callback,void *params);
+void EVTAPI EVT_getHeartBeatCallback(_EVT_heartBeatCallback *callback,void **params);
+
+/* Internal functions to initialise and kill the event manager. MGL
+ * applications should never call these functions directly as the MGL
+ * libraries do it for you.
+ */
+
+/* {secret} */
+void EVTAPI EVT_init(_EVT_mouseMoveHandler mouseMove);
+/* {secret} */
+void EVTAPI EVT_setMouseRange(int xRes,int yRes);
+/* {secret} */
+void EVTAPI EVT_suspend(void);
+/* {secret} */
+void EVTAPI EVT_resume(void);
+/* {secret} */
+void EVTAPI EVT_exit(void);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif /* __cplusplus */
+
+#endif /* __EVENT_H */
diff --git a/board/MAI/bios_emulator/scitech/include/mtrr.h b/board/MAI/bios_emulator/scitech/include/mtrr.h
new file mode 100644
index 0000000000..b29812c928
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/mtrr.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+*
+* Description: Include file defining the external ring 0 helper functions
+* needed by the MTRR module. These functions may be included
+* directly for native ring 0 device drivers, or they may
+* be calls down to a ring 0 helper device driver where
+* appropriate (or the entire MTRR module may be located in
+* the device driver if the device driver is 32-bit).
+*
+****************************************************************************/
+
+#ifndef __MTRR_H
+#define __MTRR_H
+
+#include "scitech.h"
+
+/*--------------------------- Function Prototypes -------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+/* Internal functions (requires ring 0 access or helper functions!) */
+
+void MTRR_init(void);
+int MTRR_enableWriteCombine(ulong base,ulong size,uint type);
+
+/* External assembler helper functions */
+
+ibool _ASMAPI _MTRR_isRing0(void);
+ulong _ASMAPI _MTRR_disableInt(void);
+void _ASMAPI _MTRR_restoreInt(ulong flags);
+ulong _ASMAPI _MTRR_saveCR4(void);
+void _ASMAPI _MTRR_restoreCR4(ulong cr4Val);
+uchar _ASMAPI _MTRR_getCx86(uchar reg);
+void _ASMAPI _MTRR_setCx86(uchar reg,uchar data);
+#ifdef __16BIT__
+void _ASMAPI _MTRR_readMSR(ulong reg, ulong far *eax, ulong far *edx);
+#else
+void _ASMAPI _MTRR_readMSR(ulong reg, ulong *eax, ulong *edx);
+#endif
+void _ASMAPI _MTRR_writeMSR(ulong reg, ulong eax, ulong edx);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __MTRR_H */
diff --git a/board/MAI/bios_emulator/scitech/include/pcilib.h b/board/MAI/bios_emulator/scitech/include/pcilib.h
new file mode 100644
index 0000000000..e2d58b0848
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/pcilib.h
@@ -0,0 +1,414 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+*
+* Description: Header file for interface routines to the PCI bus.
+*
+****************************************************************************/
+
+#ifndef __PCILIB_H
+#define __PCILIB_H
+
+#include "scitech.h"
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+#pragma pack(1)
+
+/* Defines for PCIDeviceInfo.HeaderType */
+
+typedef enum {
+ PCI_deviceType = 0x00,
+ PCI_bridgeType = 0x01,
+ PCI_cardBusBridgeType = 0x02,
+ PCI_multiFunctionType = 0x80
+ } PCIHeaderTypeFlags;
+
+/* Defines for PCIDeviceInfo.Command */
+
+typedef enum {
+ PCI_enableIOSpace = 0x0001,
+ PCI_enableMemorySpace = 0x0002,
+ PCI_enableBusMaster = 0x0004,
+ PCI_enableSpecialCylces = 0x0008,
+ PCI_enableWriteAndInvalidate = 0x0010,
+ PCI_enableVGACompatiblePalette = 0x0020,
+ PCI_enableParity = 0x0040,
+ PCI_enableWaitCycle = 0x0080,
+ PCI_enableSerr = 0x0100,
+ PCI_enableFastBackToBack = 0x0200
+ } PCICommandFlags;
+
+/* Defines for PCIDeviceInfo.Status */
+
+typedef enum {
+ PCI_statusCapabilitiesList = 0x0010,
+ PCI_status66MhzCapable = 0x0020,
+ PCI_statusUDFSupported = 0x0040,
+ PCI_statusFastBackToBack = 0x0080,
+ PCI_statusDataParityDetected = 0x0100,
+ PCI_statusDevSel = 0x0600,
+ PCI_statusSignaledTargetAbort = 0x0800,
+ PCI_statusRecievedTargetAbort = 0x1000,
+ PCI_statusRecievedMasterAbort = 0x2000,
+ PCI_statusSignaledSystemError = 0x4000,
+ PCI_statusDetectedParityError = 0x8000
+ } PCIStatusFlags;
+
+/* PCI capability IDs */
+
+typedef enum {
+ PCI_capsPowerManagement = 0x01,
+ PCI_capsAGP = 0x02,
+ PCI_capsMSI = 0x05
+ } PCICapsType;
+
+/* PCI AGP rate definitions */
+
+typedef enum {
+ PCI_AGPRate1X = 0x1,
+ PCI_AGPRate2X = 0x2,
+ PCI_AGPRate4X = 0x4
+ } PCIAGPRateType;
+
+/* NOTE: We define all bitfield's as uint's, specifically so that the IBM
+ * Visual Age C++ compiler does not complain. We need them to be
+ * 32-bits wide, and this is the width of an unsigned integer, but
+ * we can't use a ulong to make this explicit or we get errors.
+ */
+
+/* Structure defining a PCI slot identifier */
+
+typedef union {
+ struct {
+ uint Zero:2;
+ uint Register:6;
+ uint Function:3;
+ uint Device:5;
+ uint Bus:8;
+ uint Reserved:7;
+ uint Enable:1;
+ } p;
+ ulong i;
+ } PCIslot;
+
+/* Structure defining the regular (type 0) PCI configuration register
+ * layout. We use this in a union below so we can describe all types of
+ * PCI configuration spaces with a single structure.
+ */
+
+typedef struct {
+ ulong BaseAddress10;
+ ulong BaseAddress14;
+ ulong BaseAddress18;
+ ulong BaseAddress1C;
+ ulong BaseAddress20;
+ ulong BaseAddress24;
+ ulong CardbusCISPointer;
+ ushort SubSystemVendorID;
+ ushort SubSystemID;
+ ulong ROMBaseAddress;
+ uchar CapabilitiesPointer;
+ uchar reserved1;
+ uchar reserved2;
+ uchar reserved3;
+ ulong reserved4;
+ uchar InterruptLine;
+ uchar InterruptPin;
+ uchar MinimumGrant;
+ uchar MaximumLatency;
+
+ /* These are not in the actual config space, but we enumerate them */
+ ulong BaseAddress10Len;
+ ulong BaseAddress14Len;
+ ulong BaseAddress18Len;
+ ulong BaseAddress1CLen;
+ ulong BaseAddress20Len;
+ ulong BaseAddress24Len;
+ ulong ROMBaseAddressLen;
+ } PCIType0Info;
+
+/* Structure defining PCI to PCI bridge (type 1) PCI configuration register
+ * layout. We use this in a union below so we can describe all types of
+ * PCI configuration spaces with a single structure.
+ */
+
+typedef struct {
+ ulong BaseAddress10;
+ ulong BaseAddress14;
+ uchar PrimaryBusNumber;
+ uchar SecondayBusNumber;
+ uchar SubordinateBusNumber;
+ uchar SecondaryLatencyTimer;
+ uchar IOBase;
+ uchar IOLimit;
+ ushort SecondaryStatus;
+ ushort MemoryBase;
+ ushort MemoryLimit;
+ ushort PrefetchableMemoryBase;
+ ushort PrefetchableMemoryLimit;
+ ulong PrefetchableBaseHi;
+ ulong PrefetchableLimitHi;
+ ushort IOBaseHi;
+ ushort IOLimitHi;
+ uchar CapabilitiesPointer;
+ uchar reserved1;
+ uchar reserved2;
+ uchar reserved3;
+ ulong ROMBaseAddress;
+ uchar InterruptLine;
+ uchar InterruptPin;
+ ushort BridgeControl;
+ } PCIType1Info;
+
+/* PCI to CardBus bridge (type 2) configuration information */
+typedef struct {
+ ulong SocketRegistersBaseAddress;
+ uchar CapabilitiesPointer;
+ uchar reserved1;
+ ushort SecondaryStatus;
+ uchar PrimaryBus;
+ uchar SecondaryBus;
+ uchar SubordinateBus;
+ uchar SecondaryLatency;
+ struct {
+ ulong Base;
+ ulong Limit;
+ } Range[4];
+ uchar InterruptLine;
+ uchar InterruptPin;
+ ushort BridgeControl;
+ } PCIType2Info;
+
+/* Structure defining the PCI configuration space information for a
+ * single PCI device on the PCI bus. We enumerate all this information
+ * for all PCI devices on the bus.
+ */
+
+typedef struct {
+ ulong dwSize;
+ PCIslot slot;
+ ulong mech1;
+ ushort VendorID;
+ ushort DeviceID;
+ ushort Command;
+ ushort Status;
+ uchar RevID;
+ uchar Interface;
+ uchar SubClass;
+ uchar BaseClass;
+ uchar CacheLineSize;
+ uchar LatencyTimer;
+ uchar HeaderType;
+ uchar BIST;
+ union {
+ PCIType0Info type0;
+ PCIType1Info type1;
+ PCIType2Info type2;
+ } u;
+ } PCIDeviceInfo;
+
+/* PCI Capability header structure. All PCI capabilities have the
+ * following header.
+ *
+ * capsID is used to identify the type of the structure as define above.
+ *
+ * next is the offset in PCI configuration space (0x40-0xFC) of the
+ * next capability structure in the list, or 0x00 if there are no more
+ * entries.
+ */
+
+typedef struct {
+ uchar capsID;
+ uchar next;
+ } PCICapsHeader;
+
+/* Structure defining the PCI AGP status register contents */
+
+typedef struct {
+ uint rate:3;
+ uint rsvd1:1;
+ uint fastWrite:1;
+ uint fourGB:1;
+ uint rsvd2:3;
+ uint sideBandAddressing:1;
+ uint rsvd3:14;
+ uint requestQueueDepthMaximum:8;
+ } PCIAGPStatus;
+
+/* Structure defining the PCI AGP command register contents */
+
+typedef struct {
+ uint rate:3;
+ uint rsvd1:1;
+ uint fastWriteEnable:1;
+ uint fourGBEnable:1;
+ uint rsvd2:2;
+ uint AGPEnable:1;
+ uint SBAEnable:1;
+ uint rsvd3:14;
+ uint requestQueueDepth:8;
+ } PCIAGPCommand;
+
+/* AGP Capability structure */
+
+typedef struct {
+ PCICapsHeader h;
+ ushort majMin;
+ PCIAGPStatus AGPStatus;
+ PCIAGPCommand AGPCommand;
+ } PCIAGPCapability;
+
+/* Structure for obtaining the PCI IRQ routing information */
+
+typedef struct {
+ uchar bus;
+ uchar device;
+ uchar linkA;
+ ushort mapA;
+ uchar linkB;
+ ushort mapB;
+ uchar linkC;
+ ushort mapC;
+ uchar linkD;
+ ushort mapD;
+ uchar slot;
+ uchar reserved;
+ } PCIRouteInfo;
+
+typedef struct {
+ ushort BufferSize;
+ PCIRouteInfo *DataBuffer;
+ } PCIRoutingOptionsBuffer;
+
+#define NUM_PCI_REG (sizeof(PCIDeviceInfo) / 4) - 10
+#define PCI_BRIDGE_CLASS 0x06
+#define PCI_HOST_BRIDGE_SUBCLASS 0x00
+#define PCI_EARLY_VGA_CLASS 0x00
+#define PCI_EARLY_VGA_SUBCLASS 0x01
+#define PCI_DISPLAY_CLASS 0x03
+#define PCI_DISPLAY_VGA_SUBCLASS 0x00
+#define PCI_DISPLAY_XGA_SUBCLASS 0x01
+#define PCI_DISPLAY_OTHER_SUBCLASS 0x80
+#define PCI_MM_CLASS 0x04
+#define PCI_AUDIO_SUBCLASS 0x01
+
+/* Macros to detect specific classes of devices */
+
+#define PCI_IS_3DLABS_NONVGA_CLASS(pci) \
+ (((pci)->BaseClass == PCI_DISPLAY_CLASS && (pci)->SubClass == PCI_DISPLAY_OTHER_SUBCLASS) \
+ && ((pci)->VendorID == 0x3D3D || (pci)->VendorID == 0x104C))
+
+#define PCI_IS_DISPLAY_CLASS(pci) \
+ (((pci)->BaseClass == PCI_DISPLAY_CLASS && (pci)->SubClass == PCI_DISPLAY_VGA_SUBCLASS) \
+ || ((pci)->BaseClass == PCI_DISPLAY_CLASS && (pci)->SubClass == PCI_DISPLAY_XGA_SUBCLASS) \
+ || ((pci)->BaseClass == PCI_EARLY_VGA_CLASS && (pci)->SubClass == PCI_EARLY_VGA_SUBCLASS) \
+ || PCI_IS_3DLABS_NONVGA_CLASS(pci))
+
+/* Function codes to pass to PCI_accessReg */
+
+#define PCI_READ_BYTE 0
+#define PCI_READ_WORD 1
+#define PCI_READ_DWORD 2
+#define PCI_WRITE_BYTE 3
+#define PCI_WRITE_WORD 4
+#define PCI_WRITE_DWORD 5
+
+/* Macros to read/write PCI registers. These assume a global PCI array
+ * of device information.
+ */
+
+#define PCI_readPCIRegB(index,device) \
+ PCI_accessReg(index,0,0,&PCI[DeviceIndex[device]])
+
+#define PCI_readPCIRegW(index,device) \
+ PCI_accessReg(index,0,1,&PCI[DeviceIndex[device]])
+
+#define PCI_readPCIRegL(index,device) \
+ PCI_accessReg(index,0,2,&PCI[DeviceIndex[device]])
+
+#define PCI_writePCIRegB(index,value,device) \
+ PCI_accessReg(index,value,3,&PCI[DeviceIndex[device]])
+
+#define PCI_writePCIRegW(index,value,device) \
+ PCI_accessReg(index,value,4,&PCI[DeviceIndex[device]])
+
+#define PCI_writePCIRegL(index,value,device) \
+ PCI_accessReg(index,value,5,&PCI[DeviceIndex[device]])
+
+#pragma pack()
+
+/*-------------------------- Function Prototypes --------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+/* Function to determine the number of PCI devices in the system */
+
+int _ASMAPI PCI_getNumDevices(void);
+
+/* Function to enumerate all device on the PCI bus */
+
+int _ASMAPI PCI_enumerate(PCIDeviceInfo info[]);
+
+/* Function to access PCI configuration registers */
+
+ulong _ASMAPI PCI_accessReg(int index,ulong value,int func,PCIDeviceInfo *info);
+
+/* Function to get PCI IRQ routing options for a card */
+
+int _ASMAPI PCI_getIRQRoutingOptions(int numDevices,PCIRouteInfo *buffer);
+
+/* Function to re-route the PCI IRQ setting for a device */
+
+ibool _ASMAPI PCI_setHardwareIRQ(PCIDeviceInfo *info,uint intPin,uint IRQ);
+
+/* Function to generate a special cyle on the specified PCI bus */
+
+void _ASMAPI PCI_generateSpecialCyle(uint bus,ulong specialCycleData);
+
+/* Function to determine the size of a PCI base address register */
+
+ulong _ASMAPI PCI_findBARSize(int bar,PCIDeviceInfo *pci);
+
+/* Function to read a block of PCI configuration space registers */
+
+void _ASMAPI PCI_readRegBlock(PCIDeviceInfo *info,int index,void *dst,int count);
+
+/* Function to write a block of PCI configuration space registers */
+
+void _ASMAPI PCI_writeRegBlock(PCIDeviceInfo *info,int index,void *src,int count);
+
+/* Function to return the 32-bit PCI BIOS entry point */
+
+ulong _ASMAPI PCIBIOS_getEntry(void);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __PCILIB_H */
+
diff --git a/board/MAI/bios_emulator/scitech/include/pm_help.h b/board/MAI/bios_emulator/scitech/include/pm_help.h
new file mode 100644
index 0000000000..60a7c25457
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/pm_help.h
@@ -0,0 +1,167 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Win32, OS/2
+*
+* Description: Include file for the SciTech Portability Manager 32-bit
+* helper VxD for Windows 9x for and the 16-bit ring 0
+* helper device driver for OS/2.
+*
+* This file documents all the public services used by the
+* SciTech Portability Manager library and SciTech Nucleus
+* loader library.
+*
+****************************************************************************/
+
+#ifndef __PMHELP_H
+#define __PMHELP_H
+
+/* Include version information */
+
+#include "sdd/sddver.h"
+#define PMHELP_Major SDD_RELEASE_MAJOR
+#define PMHELP_Minor SDD_RELEASE_MINOR
+#define PMHELP_VERSION ((PMHELP_Major << 8) | PMHELP_Minor)
+
+#ifdef __OS2__
+
+/****************************************************************************
+* Public OS/2 Support functions
+****************************************************************************/
+
+#include "scitech.h"
+#include "nucleus/graphics.h"
+
+/* Name of device driver */
+
+#define PMHELP_NAME (PSZ)"sddhelp$"
+
+/* Main IOCTL function to talk to device driver */
+
+#define PMHELP_IOCTL 0x0080
+
+/* Macro definition for defining IOCTL function control codes for the SDDHELP
+ * device driver for OS/2. Similar to that used for the DOS/Win32 version.
+ */
+
+#define PMHELP_CTL_CODE(name,value) \
+ PMHELP_##name = value
+
+typedef enum {
+ /* Version function used by all drivers */
+ PMHELP_CTL_CODE(GETVER ,0x0001),
+ PMHELP_CTL_CODE(MAPPHYS ,0x0002),
+ PMHELP_CTL_CODE(ALLOCLOCKED ,0x0003),
+ PMHELP_CTL_CODE(FREELOCKED ,0x0004),
+ PMHELP_CTL_CODE(GETGDT32 ,0x0005),
+ PMHELP_CTL_CODE(MALLOCSHARED ,0x0007),
+ PMHELP_CTL_CODE(FREESHARED ,0x0008),
+ PMHELP_CTL_CODE(MAPTOPROCESS ,0x0009),
+ PMHELP_CTL_CODE(FREEPHYS ,0x000A),
+ PMHELP_CTL_CODE(FLUSHTLB ,0x000B),
+ PMHELP_CTL_CODE(SAVECR4 ,0x000C),
+ PMHELP_CTL_CODE(RESTORECR4 ,0x000D),
+ PMHELP_CTL_CODE(READMSR ,0x000E),
+ PMHELP_CTL_CODE(WRITEMSR ,0x000F),
+ PMHELP_CTL_CODE(GETPHYSICALADDR ,0x0010),
+ PMHELP_CTL_CODE(GETPHYSICALADDRRANGE ,0x0011),
+ PMHELP_CTL_CODE(LOCKPAGES ,0x0012),
+ PMHELP_CTL_CODE(UNLOCKPAGES ,0x0013),
+ PMHELP_CTL_CODE(GETSHAREDEXP ,0x0042),
+ PMHELP_CTL_CODE(SETSHAREDEXP ,0x0043),
+ PMHELP_CTL_CODE(GETSTACKSWITCHRTN ,0x0044),
+ PMHELP_CTL_CODE(GETBUILDNO ,0x0050),
+ } PMHELP_ctlCodes;
+
+#else
+
+/****************************************************************************
+* Public DOS/Windows Support functions
+****************************************************************************/
+
+#ifdef DEVICE_MAIN
+#include <vtoolsc.h>
+#define PMHELP_Init_Order (VDD_INIT_ORDER-1)
+#define RETURN_LONGS(n) *p->dioc_bytesret = (n) * sizeof(ulong)
+#endif /* DEVICE_MAIN */
+#include "scitech.h"
+#include "nucleus/graphics.h"
+
+/* We connect to the SDDHELP.VXD module if it is staticly loaded (as part
+ * of SciTech Display Doctor), otherwise we dynamically load the PMHELP.VXD
+ * public helper VxD.
+ */
+
+#define PMHELP_DeviceID 0x0000
+#define SDDHELP_DeviceID 0x3DF8
+#define VXDLDR_DeviceID 0x0027
+#define SDDHELP_MODULE "SDDHELP"
+#define SDDHELP_NAME "SDDHELP.VXD"
+#define PMHELP_MODULE "PMHELP"
+#define PMHELP_NAME "PMHELP.VXD"
+#define PMHELP_DDBNAME "pmhelp "
+#define SDDHELP_MODULE_PATH "\\\\.\\" SDDHELP_MODULE
+#define PMHELP_MODULE_PATH "\\\\.\\" PMHELP_MODULE
+#define PMHELP_VXD_PATH "\\\\.\\" PMHELP_NAME
+
+/* Macro definition for defining IOCTL function control codes for the PMHELP
+ * device drivers for Windows 9x and NT. This macro is basically derived from
+ * the CTL_CODE macro in the Windows 2000 DDK, but we hard code it here to
+ * avoid having to #include any of the Windows 2000 DDK header files. We also
+ * define both a 16-bit and 32-bit version of the control code within the same
+ * macro to simplify future additions.
+ *
+ * Essentially the Win32 macro would normally expand to the following:
+ *
+ * CTL_CODE(FILE_DEVICE_VIDEO,0x800+value,METHOD_BUFFERED,FILE_ANY_ACCESS)
+ */
+
+#define PMHELP_CTL_CODE(name,value) \
+ PMHELP_##name = value, \
+ PMHELP_##name##32 = ((0x23 << 16) | (0 << 14) | ((0x800+value) << 2) | (0))
+
+typedef enum {
+ /* Include all the control codes. We keep them in a separate header
+ * file so we can include them in multiple places to make this
+ * more versatile.
+ */
+ #include "pm_wctl.h"
+ } PMHELP_ctlCodes;
+
+/* For real mode VxD calls, we put the function number into the high
+ * order word of EAX, and a value of 0x4FFF in AX. This allows our
+ * VxD handler which is set up to handle Int 10's to recognise a native
+ * PMHELP API call from a real mode DOS program.
+ */
+
+#ifdef REALMODE
+#define API_NUM(num) (((ulong)(num) << 16) | 0x4FFF)
+#else
+#define API_NUM(num) (num)
+#endif
+
+#endif /* !__OS2__ */
+
+#endif /* __PMHELP_H */
+
diff --git a/board/MAI/bios_emulator/scitech/include/pm_wctl.h b/board/MAI/bios_emulator/scitech/include/pm_wctl.h
new file mode 100644
index 0000000000..088c19e531
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/pm_wctl.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Win32, OS/2
+*
+* Description: Header file to define all the control codes for the DOS
+* and Win32 device driver API's for calling from ring 3
+* into the ring 0 device drivers.
+*
+****************************************************************************/
+
+/* Version function used by all drivers */
+PMHELP_CTL_CODE(GETVER ,0x0000),
+
+/* Functions used by obsolete 16-bit DOS TSR */
+PMHELP_CTL_CODE(RDREGB ,0x0003),
+PMHELP_CTL_CODE(WRREGB ,0x0004),
+PMHELP_CTL_CODE(RDREGW ,0x0005),
+PMHELP_CTL_CODE(WRREGW ,0x0006),
+PMHELP_CTL_CODE(RDREGL ,0x0008),
+PMHELP_CTL_CODE(WRREGL ,0x0009),
+
+/* Functions used by obsolete WinDirect */
+PMHELP_CTL_CODE(MAPPHYS ,0x000F),
+PMHELP_CTL_CODE(GETVESABUF ,0x0013),
+
+/* Functions used by PM library */
+PMHELP_CTL_CODE(DPMIINT86 ,0x0014),
+PMHELP_CTL_CODE(INT86 ,0x0015),
+PMHELP_CTL_CODE(INT86X ,0x0016),
+PMHELP_CTL_CODE(CALLREALMODE ,0x0017),
+PMHELP_CTL_CODE(ALLOCLOCKED ,0x0018),
+PMHELP_CTL_CODE(FREELOCKED ,0x0019),
+PMHELP_CTL_CODE(ENABLELFBCOMB ,0x001A),
+PMHELP_CTL_CODE(GETPHYSICALADDR ,0x001B),
+PMHELP_CTL_CODE(MALLOCSHARED ,0x001D),
+PMHELP_CTL_CODE(FREESHARED ,0x001F),
+PMHELP_CTL_CODE(LOCKDATAPAGES ,0x0020),
+PMHELP_CTL_CODE(UNLOCKDATAPAGES ,0x0021),
+PMHELP_CTL_CODE(LOCKCODEPAGES ,0x0022),
+PMHELP_CTL_CODE(UNLOCKCODEPAGES ,0x0023),
+PMHELP_CTL_CODE(GETCALLGATE ,0x0024),
+PMHELP_CTL_CODE(SETCNTPATH ,0x0025),
+PMHELP_CTL_CODE(GETPDB ,0x0026),
+PMHELP_CTL_CODE(FLUSHTLB ,0x0027),
+PMHELP_CTL_CODE(GETPHYSICALADDRRANGE ,0x0028),
+PMHELP_CTL_CODE(ALLOCPAGE ,0x0029),
+PMHELP_CTL_CODE(FREEPAGE ,0x002A),
+PMHELP_CTL_CODE(ENABLERING3IOPL ,0x002B),
+PMHELP_CTL_CODE(DISABLERING3IOPL ,0x002C),
+PMHELP_CTL_CODE(GASETLOCALPATH ,0x002D),
+PMHELP_CTL_CODE(GAGETEXPORTS ,0x002E),
+PMHELP_CTL_CODE(GATHUNK ,0x002F),
+PMHELP_CTL_CODE(SETNUCLEUSPATH ,0x0030),
+
diff --git a/board/MAI/bios_emulator/scitech/include/pmapi.h b/board/MAI/bios_emulator/scitech/include/pmapi.h
new file mode 100644
index 0000000000..3affe67d63
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/pmapi.h
@@ -0,0 +1,1149 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+*
+* Description: Header file for the OS Portability Manager Library, which
+* contains functions to implement OS specific services in a
+* generic, cross platform API. Porting the OS Portability
+* Manager library is the first step to porting any SciTech
+* products to a new platform.
+*
+****************************************************************************/
+
+#ifndef __PMAPI_H
+#define __PMAPI_H
+
+#include "scitech.h"
+#include "pcilib.h"
+#include "ztimerc.h"
+#if !defined(__WIN32_VXD__) && !defined(__OS2_VDD__) && !defined(__NT_DRIVER__)
+#include <stdio.h>
+#include <stdlib.h>
+#endif
+
+/*--------------------------- Macros and Typedefs -------------------------*/
+
+/* You will need to define one of the following before you compile this
+ * library for it to work correctly with the DOS extender that you are
+ * using when compiling for extended DOS:
+ *
+ * TNT - Phar Lap TNT DOS Extender
+ * DOS4GW - Rational DOS/4GW, DOS/4GW Pro, Causeway and PMODE/W
+ * DJGPP - DJGPP port of GNU C++
+ *
+ * If none is specified, we will automatically determine which operating
+ * system is being targetted and the following will be defined (provided by
+ * scitech.h header file):
+ *
+ * __MSDOS16__ - Default for 16 bit MSDOS mode
+ * __MSDOS32__ - Default for 32 bit MSDOS
+ * __WINDOWS16__ - Default for 16 bit Windows
+ * __WINDOWS32__ - Default for 32 bit Windows
+ *
+ * One of the following will be defined automatically for you to select
+ * which memory model is in effect:
+ *
+ * REALMODE - 16 bit real mode (large memory model)
+ * PM286 - 16 protected mode (large memory model)
+ * PM386 - 32 protected mode (flat memory model)
+ */
+
+#if defined(__UNIX__) && !defined(_MAX_PATH)
+#define _MAX_PATH 256
+#endif
+
+#if defined(TNT) || defined(DOSX) || defined(X32VM) || defined(DPMI32) \
+ || defined(DOS4GW) || defined(DJGPP) || defined(__WINDOWS32__) \
+ || defined(__MSDOS32__) || defined(__UNIX__) || defined(__WIN32_VXD__) \
+ || defined(__32BIT__) || defined(__SMX32__) || defined(__RTTARGET__)
+#define PM386
+#elif defined(DPMI16) || defined(__WINDOWS16__)
+#define PM286
+#else
+#define REALMODE
+#endif
+
+#pragma pack(1)
+
+/* Provide the typedefs for the PM_int386 functions, which issue native
+ * interrupts in real or protected mode and can pass extended registers
+ * around.
+ */
+
+struct _PMDWORDREGS {
+ ulong eax,ebx,ecx,edx,esi,edi,cflag;
+ };
+
+struct _PMWORDREGS {
+ ushort ax,ax_hi;
+ ushort bx,bx_hi;
+ ushort cx,cx_hi;
+ ushort dx,dx_hi;
+ ushort si,si_hi;
+ ushort di,di_hi;
+ ushort cflag,cflag_hi;
+ };
+
+struct _PMBYTEREGS {
+ uchar al, ah; ushort ax_hi;
+ uchar bl, bh; ushort bx_hi;
+ uchar cl, ch; ushort cx_hi;
+ uchar dl, dh; ushort dx_hi;
+ };
+
+typedef union {
+ struct _PMDWORDREGS e;
+ struct _PMWORDREGS x;
+ struct _PMBYTEREGS h;
+ } PMREGS;
+
+typedef struct {
+ ushort es;
+ ushort cs;
+ ushort ss;
+ ushort ds;
+ ushort fs;
+ ushort gs;
+ } PMSREGS;
+
+/* Provide definitions for the real mode register structures passed to
+ * the PM_int86() and PM_int86x() routines. Note that we provide our own
+ * functions to do this for 16-bit code that calls the PM_int386 functions.
+ */
+
+typedef PMREGS RMREGS;
+typedef PMSREGS RMSREGS;
+
+typedef struct {
+ long edi;
+ long esi;
+ long ebp;
+ long reserved;
+ long ebx;
+ long edx;
+ long ecx;
+ long eax;
+ short flags;
+ short es,ds,fs,gs,ip,cs,sp,ss;
+ } DPMI_regs;
+
+#ifdef __MSDOS__
+/* Register structure passed to PM_VxDCall function */
+typedef struct {
+ ulong eax;
+ ulong ebx;
+ ulong ecx;
+ ulong edx;
+ ulong esi;
+ ulong edi;
+ ushort ds,es;
+ } VXD_regs;
+#endif
+
+#define PM_MAX_DRIVE 3
+#define PM_MAX_PATH 256
+#define PM_FILE_INVALID (void*)0xFFFFFFFF
+
+/* Structure for generic directory traversal and management. Also the same
+ * values are passed to PM_setFileAttr to change the file attributes.
+ */
+
+typedef struct {
+ ulong dwSize;
+ ulong attrib;
+ ulong sizeLo;
+ ulong sizeHi;
+ char name[PM_MAX_PATH];
+ } PM_findData;
+
+/* Macro to compute the byte offset of a field in a structure of type type */
+
+#define PM_FIELD_OFFSET(type,field) ((long)&(((type*)0)->field))
+
+/* Marcto to compute the address of the base of the structure given its type,
+ * and an address of a field within the structure.
+ */
+
+#define PM_CONTAINING_RECORD(address, type, field) \
+ ((type*)( \
+ (char*)(address) - \
+ (char*)(&((type*)0)->field)))
+
+/* Flags stored in the PM_findData structure, and also values passed to
+ * PM_setFileAttr to change the file attributes.
+ */
+
+#define PM_FILE_NORMAL 0x00000000
+#define PM_FILE_READONLY 0x00000001
+#define PM_FILE_DIRECTORY 0x00000002
+#define PM_FILE_ARCHIVE 0x00000004
+#define PM_FILE_HIDDEN 0x00000008
+#define PM_FILE_SYSTEM 0x00000010
+
+/* Flags returned by the PM_splitpath function */
+
+#define PM_HAS_WILDCARDS 0x01
+#define PM_HAS_EXTENSION 0x02
+#define PM_HAS_FILENAME 0x04
+#define PM_HAS_DIRECTORY 0x08
+#define PM_HAS_DRIVE 0x10
+
+/* Structure passed to the PM_setFileTime functions */
+typedef struct {
+ short sec; /* Seconds */
+ short min; /* Minutes */
+ short hour; /* Hour (0--23) */
+ short day; /* Day of month (1--31) */
+ short mon; /* Month (0--11) */
+ short year; /* Year (calendar year minus 1900) */
+ } PM_time;
+
+/* Define a macro for creating physical base addresses from segment:offset */
+
+#define MK_PHYS(s,o) (((ulong)(s) << 4) + (ulong)(o))
+
+/* Define the different types of modes supported. This is a global variable
+ * that can be used to determine the type at runtime which will contain
+ * one of these values.
+ */
+
+typedef enum {
+ PM_realMode,
+ PM_286,
+ PM_386
+ } PM_mode_enum;
+
+/* Define types passed to PM_enableWriteCombine */
+
+#define PM_MTRR_UNCACHABLE 0
+#define PM_MTRR_WRCOMB 1
+#define PM_MTRR_WRTHROUGH 4
+#define PM_MTRR_WRPROT 5
+#define PM_MTRR_WRBACK 6
+#define PM_MTRR_MAX 6
+
+/* Error codes returned by PM_enableWriteCombine */
+
+#define PM_MTRR_ERR_OK 0
+#define PM_MTRR_NOT_SUPPORTED -1
+#define PM_MTRR_ERR_PARAMS -2
+#define PM_MTRR_ERR_NOT_4KB_ALIGNED -3
+#define PM_MTRR_ERR_BELOW_1MB -4
+#define PM_MTRR_ERR_NOT_ALIGNED -5
+#define PM_MTRR_ERR_OVERLAP -6
+#define PM_MTRR_ERR_TYPE_MISMATCH -7
+#define PM_MTRR_ERR_NONE_FREE -8
+#define PM_MTRR_ERR_NOWRCOMB -9
+#define PM_MTRR_ERR_NO_OS_SUPPORT -10
+
+/* Values passed to the PM_DMACProgram function */
+
+#define PM_DMA_READ_ONESHOT 0x44 /* One-shot DMA read */
+#define PM_DMA_WRITE_ONESHOT 0x48 /* One-shot DMA write */
+#define PM_DMA_READ_AUTOINIT 0x54 /* Auto-init DMA read */
+#define PM_DMA_WRITE_AUTOINIT 0x58 /* Auto-init DMA write */
+
+/* Flags passed to suspend application callback */
+
+#define PM_DEACTIVATE 1
+#define PM_REACTIVATE 2
+
+/* Return codes that the application can return from the suspend application
+ * callback registered with the PM library. See the MGL documentation for
+ * more details.
+ */
+#define PM_SUSPEND_APP 0
+#define PM_NO_SUSPEND_APP 1
+
+/****************************************************************************
+REMARKS:
+This enumeration defines the type values passed to the PM_agpReservePhysical
+function, to define how the physical memory mapping should be handled.
+
+The PM_agpUncached type indicates that the memory should be allocated as
+uncached memory.
+
+The PM_agpWriteCombine type indicates that write combining should be enabled
+for physical memory mapping. This is used for framebuffer write combing and
+speeds up direct framebuffer writes to the memory.
+
+The PM_agpIntelDCACHE type indicates that memory should come from the Intel
+i81x Display Cache (or DCACHE) memory pool. This flag is specific to the
+Intel i810 and i815 controllers, and should not be passed for any other
+controller type.
+
+HEADER:
+pmapi.h
+
+MEMBERS:
+PM_agpUncached - Indicates that the memory should be uncached
+PM_agpWriteCombine - Indicates that the memory should be write combined
+PM_agpIntelDCACHE - Indicates that the memory should come from DCACHE pool
+****************************************************************************/
+typedef enum {
+ PM_agpUncached,
+ PM_agpWriteCombine,
+ PM_agpIntelDCACHE
+ } PM_agpMemoryType;
+
+/* Defines the size of an system memory page */
+
+#define PM_PAGE_SIZE 4096
+
+/* Type definition for a physical memory address */
+
+typedef unsigned long PM_physAddr;
+
+/* Define a bad physical address returned by map physical functions */
+
+#define PM_BAD_PHYS_ADDRESS 0xFFFFFFFF
+
+/* Type definition for the 12-byte lock handle for locking linear memory */
+
+typedef struct {
+ ulong h[3];
+ } PM_lockHandle;
+
+/* 'C' calling conventions always */
+
+#define PMAPI _ASMAPI
+#define PMAPIP _ASMAPIP
+
+/* Internal typedef to override DPMI_int86 handler */
+
+typedef ibool (PMAPIP DPMI_handler_t)(DPMI_regs *regs);
+void PMAPI DPMI_setInt10Handler(DPMI_handler_t handler);
+
+/* Type definitions for a window handle for console modes */
+
+#if defined(__DRIVER__) || defined(__WIN32_VXD__) || defined(__NT_DRIVER__)
+typedef void *PM_HWND; /* Pointer for portable drivers */
+typedef void *PM_MODULE; /* Module handle for portable drivers */
+#elif defined(__WINDOWS__)
+#ifdef DECLARE_HANDLE
+typedef HWND PM_HWND; /* Real window handle */
+typedef HINSTANCE PM_MODULE; /* Win32 DLL handle */
+#else
+typedef void *PM_HWND; /* Place holder if windows.h not included */
+typedef void *PM_MODULE; /* Place holder if windows.h not included */
+#endif
+#elif defined(__USE_X11__)
+typedef struct {
+ Window *window;
+ Display *display;
+ } PM_HWND; /* X11 window handle */
+#elif defined(__OS2__)
+typedef void *PM_HWND;
+typedef void *PM_MODULE;
+#elif defined(__LINUX__)
+typedef int PM_HWND; /* Console id for fullscreen Linux */
+typedef void *PM_MODULE;
+#elif defined(__QNX__)
+typedef int PM_HWND; /* Console id for fullscreen QNX */
+typedef void *PM_MODULE;
+#elif defined(__RTTARGET__)
+typedef int PM_HWND; /* Placeholder for RTTarget-32 */
+typedef void *PM_MODULE;
+#elif defined(__REALDOS__)
+typedef int PM_HWND; /* Placeholder for fullscreen DOS */
+typedef void *PM_MODULE; /* Placeholder for fullscreen DOS */
+#elif defined(__SMX32__)
+typedef int PM_HWND; /* Placeholder for fullscreen SMX */
+typedef void *PM_MODULE;
+#elif defined(__SNAP__)
+typedef void *PM_HWND;
+typedef void *PM_MODULE;
+#else
+#error PM library not ported to this platform yet!
+#endif
+
+/* Type definition for code pointers */
+
+typedef void (*__codePtr)();
+
+/* Type definition for a C based interrupt handler */
+
+typedef void (PMAPIP PM_intHandler)(void);
+typedef ibool (PMAPIP PM_irqHandler)(void);
+
+/* Hardware IRQ handle used to save and restore the hardware IRQ */
+
+typedef void *PM_IRQHandle;
+
+/* Type definition for the fatal cleanup handler */
+
+typedef void (PMAPIP PM_fatalCleanupHandler)(void);
+
+/* Type defifinition for save state callback function */
+
+typedef int (PMAPIP PM_saveState_cb)(int flags);
+
+/* Type definintion for enum write combined callback function */
+
+typedef void (PMAPIP PM_enumWriteCombine_t)(ulong base,ulong length,uint type);
+
+/* Structure defining all the PM API functions as exported to
+ * the binary portable DLL's.
+ */
+
+typedef struct {
+ ulong dwSize;
+ int (PMAPIP PM_getModeType)(void);
+ void * (PMAPIP PM_getBIOSPointer)(void);
+ void * (PMAPIP PM_getA0000Pointer)(void);
+ void * (PMAPIP PM_mapPhysicalAddr)(ulong base,ulong limit,ibool isCached);
+ void * (PMAPIP PM_mallocShared)(long size);
+ void * reserved1;
+ void (PMAPIP PM_freeShared)(void *ptr);
+ void * (PMAPIP PM_mapToProcess)(void *linear,ulong limit);
+ void * (PMAPIP PM_mapRealPointer)(uint r_seg,uint r_off);
+ void * (PMAPIP PM_allocRealSeg)(uint size,uint *r_seg,uint *r_off);
+ void (PMAPIP PM_freeRealSeg)(void *mem);
+ void * (PMAPIP PM_allocLockedMem)(uint size,ulong *physAddr,ibool contiguous,ibool below16Meg);
+ void (PMAPIP PM_freeLockedMem)(void *p,uint size,ibool contiguous);
+ void (PMAPIP PM_callRealMode)(uint seg,uint off, RMREGS *regs,RMSREGS *sregs);
+ int (PMAPIP PM_int86)(int intno, RMREGS *in, RMREGS *out);
+ int (PMAPIP PM_int86x)(int intno, RMREGS *in, RMREGS *out,RMSREGS *sregs);
+ void (PMAPIP DPMI_int86)(int intno, DPMI_regs *regs);
+ void (PMAPIP PM_availableMemory)(ulong *physical,ulong *total);
+ void * (PMAPIP PM_getVESABuf)(uint *len,uint *rseg,uint *roff);
+ long (PMAPIP PM_getOSType)(void);
+ void (PMAPIP PM_fatalError)(const char *msg);
+ void (PMAPIP PM_setBankA)(int bank);
+ void (PMAPIP PM_setBankAB)(int bank);
+ void (PMAPIP PM_setCRTStart)(int x,int y,int waitVRT);
+ char * (PMAPIP PM_getCurrentPath)(char *path,int maxLen);
+ const char * (PMAPIP PM_getVBEAFPath)(void);
+ const char * (PMAPIP PM_getNucleusPath)(void);
+ const char * (PMAPIP PM_getNucleusConfigPath)(void);
+ const char * (PMAPIP PM_getUniqueID)(void);
+ const char * (PMAPIP PM_getMachineName)(void);
+ ibool (PMAPIP VF_available)(void);
+ void * (PMAPIP VF_init)(ulong baseAddr,int bankSize,int codeLen,void *bankFunc);
+ void (PMAPIP VF_exit)(void);
+ PM_HWND (PMAPIP PM_openConsole)(PM_HWND hwndUser,int device,int xRes,int yRes,int bpp,ibool fullScreen);
+ int (PMAPIP PM_getConsoleStateSize)(void);
+ void (PMAPIP PM_saveConsoleState)(void *stateBuf,PM_HWND hwndConsole);
+ void (PMAPIP PM_restoreConsoleState)(const void *stateBuf,PM_HWND hwndConsole);
+ void (PMAPIP PM_closeConsole)(PM_HWND hwndConsole);
+ void (PMAPIP PM_setOSCursorLocation)(int x,int y);
+ void (PMAPIP PM_setOSScreenWidth)(int width,int height);
+ int (PMAPIP PM_enableWriteCombine)(ulong base,ulong length,uint type);
+ void (PMAPIP PM_backslash)(char *filename);
+ int (PMAPIP PM_lockDataPages)(void *p,uint len,PM_lockHandle *lockHandle);
+ int (PMAPIP PM_unlockDataPages)(void *p,uint len,PM_lockHandle *lockHandle);
+ int (PMAPIP PM_lockCodePages)(__codePtr p,uint len,PM_lockHandle *lockHandle);
+ int (PMAPIP PM_unlockCodePages)(__codePtr p,uint len,PM_lockHandle *lockHandle);
+ ibool (PMAPIP PM_setRealTimeClockHandler)(PM_intHandler ih,int frequency);
+ void (PMAPIP PM_setRealTimeClockFrequency)(int frequency);
+ void (PMAPIP PM_restoreRealTimeClockHandler)(void);
+ ibool (PMAPIP PM_doBIOSPOST)(ushort axVal,ulong BIOSPhysAddr,void *BIOSPtr,ulong BIOSLen);
+ char (PMAPIP PM_getBootDrive)(void);
+ void (PMAPIP PM_freePhysicalAddr)(void *ptr,ulong limit);
+ uchar (PMAPIP PM_inpb)(int port);
+ ushort (PMAPIP PM_inpw)(int port);
+ ulong (PMAPIP PM_inpd)(int port);
+ void (PMAPIP PM_outpb)(int port,uchar val);
+ void (PMAPIP PM_outpw)(int port,ushort val);
+ void (PMAPIP PM_outpd)(int port,ulong val);
+ void * reserved2;
+ void (PMAPIP PM_setSuspendAppCallback)(PM_saveState_cb saveState);
+ ibool (PMAPIP PM_haveBIOSAccess)(void);
+ int (PMAPIP PM_kbhit)(void);
+ int (PMAPIP PM_getch)(void);
+ ibool (PMAPIP PM_findBPD)(const char *dllname,char *bpdpath);
+ ulong (PMAPIP PM_getPhysicalAddr)(void *p);
+ void (PMAPIP PM_sleep)(ulong milliseconds);
+ int (PMAPIP PM_getCOMPort)(int port);
+ int (PMAPIP PM_getLPTPort)(int port);
+ PM_MODULE (PMAPIP PM_loadLibrary)(const char *szDLLName);
+ void * (PMAPIP PM_getProcAddress)(PM_MODULE hModule,const char *szProcName);
+ void (PMAPIP PM_freeLibrary)(PM_MODULE hModule);
+ int (PMAPIP PCI_enumerate)(PCIDeviceInfo info[]);
+ ulong (PMAPIP PCI_accessReg)(int index,ulong value,int func,PCIDeviceInfo *info);
+ ibool (PMAPIP PCI_setHardwareIRQ)(PCIDeviceInfo *info,uint intPin,uint IRQ);
+ void (PMAPIP PCI_generateSpecialCyle)(uint bus,ulong specialCycleData);
+ void * reserved3;
+ ulong (PMAPIP PCIBIOS_getEntry)(void);
+ uint (PMAPIP CPU_getProcessorType)(void);
+ ibool (PMAPIP CPU_haveMMX)(void);
+ ibool (PMAPIP CPU_have3DNow)(void);
+ ibool (PMAPIP CPU_haveSSE)(void);
+ ibool (PMAPIP CPU_haveRDTSC)(void);
+ ulong (PMAPIP CPU_getProcessorSpeed)(ibool accurate);
+ void (PMAPIP ZTimerInit)(void);
+ void (PMAPIP LZTimerOn)(void);
+ ulong (PMAPIP LZTimerLap)(void);
+ void (PMAPIP LZTimerOff)(void);
+ ulong (PMAPIP LZTimerCount)(void);
+ void (PMAPIP LZTimerOnExt)(LZTimerObject *tm);
+ ulong (PMAPIP LZTimerLapExt)(LZTimerObject *tm);
+ void (PMAPIP LZTimerOffExt)(LZTimerObject *tm);
+ ulong (PMAPIP LZTimerCountExt)(LZTimerObject *tm);
+ void (PMAPIP ULZTimerOn)(void);
+ ulong (PMAPIP ULZTimerLap)(void);
+ void (PMAPIP ULZTimerOff)(void);
+ ulong (PMAPIP ULZTimerCount)(void);
+ ulong (PMAPIP ULZReadTime)(void);
+ ulong (PMAPIP ULZElapsedTime)(ulong start,ulong finish);
+ void (PMAPIP ULZTimerResolution)(ulong *resolution);
+ void * (PMAPIP PM_findFirstFile)(const char *filename,PM_findData *findData);
+ ibool (PMAPIP PM_findNextFile)(void *handle,PM_findData *findData);
+ void (PMAPIP PM_findClose)(void *handle);
+ void (PMAPIP PM_makepath)(char *p,const char *drive,const char *dir,const char *name,const char *ext);
+ int (PMAPIP PM_splitpath)(const char *fn,char *drive,char *dir,char *name,char *ext);
+ ibool (PMAPIP PM_driveValid)(char drive);
+ void (PMAPIP PM_getdcwd)(int drive,char *dir,int len);
+ void (PMAPIP PM_setFileAttr)(const char *filename,uint attrib);
+ ibool (PMAPIP PM_mkdir)(const char *filename);
+ ibool (PMAPIP PM_rmdir)(const char *filename);
+ uint (PMAPIP PM_getFileAttr)(const char *filename);
+ ibool (PMAPIP PM_getFileTime)(const char *filename,ibool gmtTime,PM_time *time);
+ ibool (PMAPIP PM_setFileTime)(const char *filename,ibool gmtTime,PM_time *time);
+ char * (PMAPIP CPU_getProcessorName)(void);
+ int (PMAPIP PM_getVGAStateSize)(void);
+ void (PMAPIP PM_saveVGAState)(void *stateBuf);
+ void (PMAPIP PM_restoreVGAState)(const void *stateBuf);
+ void (PMAPIP PM_vgaBlankDisplay)(void);
+ void (PMAPIP PM_vgaUnblankDisplay)(void);
+ void (PMAPIP PM_blockUntilTimeout)(ulong milliseconds);
+ void (PMAPIP _PM_add64)(u32 a_low,s32 a_high,u32 b_low,s32 b_high,__i64 *result);
+ void (PMAPIP _PM_sub64)(u32 a_low,s32 a_high,u32 b_low,s32 b_high,__i64 *result);
+ void (PMAPIP _PM_mul64)(u32 a_low,s32 a_high,u32 b_low,s32 b_high,__i64 *result);
+ void (PMAPIP _PM_div64)(u32 a_low,s32 a_high,u32 b_low,s32 b_high,__i64 *result);
+ void (PMAPIP _PM_shr64)(u32 a_low,s32 a_high,s32 shift,__i64 *result);
+ void (PMAPIP _PM_sar64)(u32 a_low,s32 a_high,s32 shift,__i64 *result);
+ void (PMAPIP _PM_shl64)(u32 a_low,s32 a_high,s32 shift,__i64 *result);
+ void (PMAPIP _PM_neg64)(u32 a_low,s32 a_high,__i64 *result);
+ ulong (PMAPIP PCI_findBARSize)(int bar,PCIDeviceInfo *pci);
+ void (PMAPIP PCI_readRegBlock)(PCIDeviceInfo *info,int index,void *dst,int count);
+ void (PMAPIP PCI_writeRegBlock)(PCIDeviceInfo *info,int index,void *src,int count);
+ void (PMAPIP PM_flushTLB)(void);
+ void (PMAPIP PM_useLocalMalloc)(void * (*malloc)(size_t size),void * (*calloc)(size_t nelem,size_t size),void * (*realloc)(void *ptr,size_t size),void (*free)(void *p));
+ void * (PMAPIP PM_malloc)(size_t size);
+ void * (PMAPIP PM_calloc)(size_t nelem,size_t size);
+ void * (PMAPIP PM_realloc)(void *ptr,size_t size);
+ void (PMAPIP PM_free)(void *p);
+ ibool (PMAPIP PM_getPhysicalAddrRange)(void *p,ulong length,ulong *physAddress);
+ void * (PMAPIP PM_allocPage)(ibool locked);
+ void (PMAPIP PM_freePage)(void *p);
+ ulong (PMAPIP PM_agpInit)(void);
+ void (PMAPIP PM_agpExit)(void);
+ ibool (PMAPIP PM_agpReservePhysical)(ulong numPages,int type,void **physContext,PM_physAddr *physAddr);
+ ibool (PMAPIP PM_agpReleasePhysical)(void *physContext);
+ ibool (PMAPIP PM_agpCommitPhysical)(void *physContext,ulong numPages,ulong startOffset,PM_physAddr *physAddr);
+ ibool (PMAPIP PM_agpFreePhysical)(void *physContext,ulong numPages,ulong startOffset);
+ int (PMAPIP PCI_getNumDevices)(void);
+ void (PMAPIP PM_setLocalBPDPath)(const char *path);
+ void * (PMAPIP PM_loadDirectDraw)(int device);
+ void (PMAPIP PM_unloadDirectDraw)(int device);
+ PM_HWND (PMAPIP PM_getDirectDrawWindow)(void);
+ void (PMAPIP PM_doSuspendApp)(void);
+ } PM_imports;
+
+#pragma pack()
+
+/*---------------------------- Global variables ---------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+#ifdef __WIN32_VXD__
+#define VESA_BUF_SIZE 1024
+extern uchar *_PM_rmBufAddr;
+#endif
+
+/* {secret} Pointer to global exports structure.
+ * Should not be used by application programs.
+ */
+extern PM_imports _VARAPI _PM_imports;
+
+/* {secret} */
+extern void * (*__PM_malloc)(size_t size);
+/* {secret} */
+extern void * (*__PM_calloc)(size_t nelem,size_t size);
+/* {secret} */
+extern void * (*__PM_realloc)(void *ptr,size_t size);
+/* {secret} */
+extern void (*__PM_free)(void *p);
+
+/*--------------------------- Function Prototypes -------------------------*/
+
+/* Routine to initialise the host side PM library. Note used from DLL's */
+
+void PMAPI PM_init(void);
+
+/* Routine to return either PM_realMode, PM_286 or PM_386 */
+
+int PMAPI PM_getModeType(void);
+
+/* Routine to return a selector to the BIOS data area at segment 0x40 */
+
+void * PMAPI PM_getBIOSPointer(void);
+
+/* Routine to return a linear pointer to the VGA frame buffer memory */
+
+void * PMAPI PM_getA0000Pointer(void);
+
+/* Routines to map/free physical memory into the current DS segment. In
+ * some environments (32-bit DOS is one), after the mapping has been
+ * allocated, it cannot be freed. Hence you should only allocate the
+ * mapping once and cache the value for use by other parts of your
+ * application. If the mapping cannot be createed, this function will
+ * return a NULL pointer.
+ *
+ * This routine will also work for memory addresses below 1Mb, but the
+ * mapped address cannot cross the 1Mb boundary.
+ */
+
+void * PMAPI PM_mapPhysicalAddr(ulong base,ulong limit,ibool isCached);
+void PMAPI PM_freePhysicalAddr(void *ptr,ulong limit);
+
+/* Routine to determine the physical address of a linear address. It is
+ * up to the caller to ensure the entire address range for a linear
+ * block of memory is page aligned if that is required.
+ */
+
+ulong PMAPI PM_getPhysicalAddr(void *p);
+ibool PMAPI PM_getPhysicalAddrRange(void *p,ulong length,ulong *physAddress);
+
+/* Routines for memory allocation. By default these functions use the regular
+ * C runtime library malloc/free functions, but you can use the
+ * PM_useLocalMalloc function to override the default memory allocator with
+ * your own memory allocator. This will ensure that all memory allocation
+ * used by SciTech products will use your overridden memory allocator
+ * functions.
+ *
+ * Note that BPD files automatically map the C runtime library
+ * malloc/calloc/realloc/free calls from inside the BPD to the PM library
+ * versions by default.
+ */
+
+void PMAPI PM_useLocalMalloc(void * (*malloc)(size_t size),void * (*calloc)(size_t nelem,size_t size),void * (*realloc)(void *ptr,size_t size),void (*free)(void *p));
+void * PMAPI PM_malloc(size_t size);
+void * PMAPI PM_calloc(size_t nelem,size_t size);
+void * PMAPI PM_realloc(void *ptr,size_t size);
+void PMAPI PM_free(void *p);
+
+/* Routine to allocate a memory block in the global shared region that
+ * is common to all tasks and accessible from ring 0 code.
+ */
+
+void * PMAPI PM_mallocShared(long size);
+
+/* Routine to free the allocated shared memory block */
+
+void PMAPI PM_freeShared(void *ptr);
+
+/* Attach a previously allocated linear mapping to a new process */
+
+void * PMAPI PM_mapToProcess(void *linear,ulong limit);
+
+/* Macros to extract byte, word and long values from a char pointer */
+
+#define PM_getByte(p) *((volatile uchar*)(p))
+#define PM_getWord(p) *((volatile ushort*)(p))
+#define PM_getLong(p) *((volatile ulong*)(p))
+#define PM_setByte(p,v) PM_getByte(p) = (v)
+#define PM_setWord(p,v) PM_getWord(p) = (v)
+#define PM_setLong(p,v) PM_getLong(p) = (v)
+
+/* Routine for accessing a low 1Mb memory block. You dont need to free this
+ * pointer, but in 16 bit protected mode the selector allocated will be
+ * re-used the next time this routine is called.
+ */
+
+void * PMAPI PM_mapRealPointer(uint r_seg,uint r_off);
+
+/* Routine to allocate a block of conventional memory below the 1Mb
+ * limit so that it can be accessed from real mode. Ensure that you free
+ * the segment when you are done with it.
+ *
+ * This routine returns a selector and offset to the segment that has been
+ * allocated, and also returns the real mode segment and offset which can
+ * be passed to real mode routines. Will return 0 if memory could not be
+ * allocated.
+ *
+ * Please note that with some DOS extenders, memory allocated with the
+ * following function cannot be freed, hence it will be allocated for the
+ * life of your program. Thus if you need to call a bunch of different
+ * real-mode routines in your program, allocate a single large buffer at
+ * program startup that can be re-used throughout the program execution.
+ */
+
+void * PMAPI PM_allocRealSeg(uint size,uint *r_seg,uint *r_off);
+void PMAPI PM_freeRealSeg(void *mem);
+
+/* Routine to allocate a block of locked memory, and return both the
+ * linear and physical addresses of the memory. You should always
+ * allocate locked memory blocks in page sized chunks (ie: 4K on IA32).
+ * If the memory is not contiguous, you will need to use the
+ * PM_getPhysicalAddr function to get the physical address of linear
+ * pages within the memory block (the returned physical address will be
+ * for the first address in the memory block only).
+ */
+
+void * PMAPI PM_allocLockedMem(uint size,ulong *physAddr,ibool contiguous,ibool below16Meg);
+void PMAPI PM_freeLockedMem(void *p,uint size,ibool contiguous);
+
+/* Routine to allocate and free paged sized blocks of shared memory.
+ * Addressable from all processes, but not from a ring 0 context
+ * under OS/2. Note that under OS/2 PM_mapSharedPages must be called
+ * to map the memory blocks into the shared memory address space
+ * of each connecting process.
+ */
+
+void * PMAPI PM_allocPage(ibool locked);
+void PMAPI PM_freePage(void *p);
+#ifdef __OS2__
+void PMAPI PM_mapSharedPages(void);
+#endif
+
+/* Routine to return true if we have access to the BIOS on the host OS */
+
+ibool PMAPI PM_haveBIOSAccess(void);
+
+/* Routine to call a real mode assembly language procedure. Register
+ * values are passed in and out in the 'regs' and 'sregs' structures. We
+ * do not provide any method of copying data from the protected mode stack
+ * to the real mode stack, so if you need to pass data to real mode, you will
+ * need to write a real mode assembly language hook to recieve the values
+ * in registers, and to pass the data through a real mode block allocated
+ * with the PM_allocRealSeg() routine.
+ */
+
+void PMAPI PM_callRealMode(uint seg,uint off, RMREGS *regs,RMSREGS *sregs);
+
+/* Routines to generate real mode interrupts using the same interface that
+ * is used by int86() and int86x() in realmode. This routine is need to
+ * call certain BIOS and DOS functions that are not supported by some
+ * DOS extenders. No translation is done on any of the register values,
+ * so they must be correctly set up and translated by the calling program.
+ *
+ * Normally the DOS extenders will allow you to use the normal int86()
+ * function directly and will pass on unhandled calls to real mode to be
+ * handled by the real mode handler. However calls to int86x() with real
+ * mode segment values to be loaded will cause a GPF if used with the
+ * standard int86x(), so you should use these routines if you know you
+ * want to call a real mode handler.
+ */
+
+int PMAPI PM_int86(int intno, RMREGS *in, RMREGS *out);
+int PMAPI PM_int86x(int intno, RMREGS *in, RMREGS *out,RMSREGS *sregs);
+
+/* Routine to generate a real mode interrupt. This is identical to the
+ * above function, but takes a DPMI_regs structure for the registers
+ * which has a lot more information. It is only available from 32-bit
+ * protected mode.
+ */
+
+void PMAPI DPMI_int86(int intno, DPMI_regs *regs);
+
+/* Function to return the amount of available physical and total memory.
+ * The results of this function are *only* valid before you have made any
+ * calls to malloc() and free(). If you need to keep track of exactly how
+ * much memory is currently allocated, you need to call this function to
+ * get the total amount of memory available and then keep track of
+ * the available memory every time you call malloc() and free().
+ */
+
+void PMAPI PM_availableMemory(ulong *physical,ulong *total);
+
+/* Return the address of a global VESA real mode transfer buffer for use
+ * by applications.
+ */
+
+void * PMAPI PM_getVESABuf(uint *len,uint *rseg,uint *roff);
+
+/* Handle fatal error conditions */
+
+void PMAPI PM_fatalError(const char *msg);
+
+/* Function to set a cleanup error handler called when PM_fatalError
+ * is called. This allows us to the console back into a normal state
+ * if we get a failure from deep inside a BPD file. This function is
+ * not exported to BPD files, and is only used by code compiled for the
+ * OS.
+ */
+
+void PMAPI PM_setFatalErrorCleanup(PM_fatalCleanupHandler cleanup);
+
+/* Return the OS type flag as defined in <drvlib/os/os.h> */
+
+long PMAPI PM_getOSType(void);
+
+/* Functions to set a VBE bank via an Int 10h */
+
+void PMAPI PM_setBankA(int bank);
+void PMAPI PM_setBankAB(int bank);
+void PMAPI PM_setCRTStart(int x,int y,int waitVRT);
+
+/* Return the current working directory */
+
+char * PMAPI PM_getCurrentPath(char *path,int maxLen);
+
+/* Return paths to the VBE/AF and Nucleus directories */
+
+const char * PMAPI PM_getVBEAFPath(void);
+const char * PMAPI PM_getNucleusPath(void);
+const char * PMAPI PM_getNucleusConfigPath(void);
+
+/* Find the path to a binary portable DLL */
+
+void PMAPI PM_setLocalBPDPath(const char *path);
+ibool PMAPI PM_findBPD(const char *dllname,char *bpdpath);
+
+/* Returns the drive letter of the boot drive for DOS, OS/2 and Windows */
+
+char PMAPI PM_getBootDrive(void);
+
+/* Return a network unique machine identifier as a string */
+
+const char * PMAPI PM_getUniqueID(void);
+
+/* Return the network machine name as a string */
+
+const char * PMAPI PM_getMachineName(void);
+
+/* Functions to install and remove the virtual linear framebuffer
+ * emulation code. For unsupported DOS extenders and when running under
+ * a DPMI host like Windows or OS/2, this function will return a NULL.
+ */
+
+ibool PMAPI VF_available(void);
+void * PMAPI VF_init(ulong baseAddr,int bankSize,int codeLen,void *bankFunc);
+void PMAPI VF_exit(void);
+
+/* Functions to wait for a keypress and read a key for command line
+ * environments such as DOS, Win32 console and Unix.
+ */
+
+int PMAPI PM_kbhit(void);
+int PMAPI PM_getch(void);
+
+/* Functions to create either a fullscreen or windowed console on the
+ * desktop, and to allow the resolution of fullscreen consoles to be
+ * changed on the fly without closing the console. For non-windowed
+ * environments (such as a Linux or OS/2 fullscreen console), these
+ * functions enable console graphics mode and restore console text mode.
+ *
+ * The suspend application callback is used to allow the application to
+ * save the state of the fullscreen console mode to allow temporary
+ * switching to another console or back to the regular GUI desktop. It
+ * is also called to restore the fullscreen graphics state after the
+ * fullscreen console regains the focus.
+ *
+ * The device parameter allows for the console to be opened on a different
+ * display controllers (0 is always the primary controller).
+ */
+
+PM_HWND PMAPI PM_openConsole(PM_HWND hwndUser,int device,int xRes,int yRes,int bpp,ibool fullScreen);
+int PMAPI PM_getConsoleStateSize(void);
+void PMAPI PM_saveConsoleState(void *stateBuf,PM_HWND hwndConsole);
+void PMAPI PM_setSuspendAppCallback(PM_saveState_cb saveState);
+void PMAPI PM_restoreConsoleState(const void *stateBuf,PM_HWND hwndConsole);
+void PMAPI PM_closeConsole(PM_HWND hwndConsole);
+
+/* Functions to modify OS console information */
+
+void PMAPI PM_setOSCursorLocation(int x,int y);
+void PMAPI PM_setOSScreenWidth(int width,int height);
+
+/* Function to emable Intel PPro/PII write combining */
+
+int PMAPI PM_enableWriteCombine(ulong base,ulong length,uint type);
+int PMAPI PM_enumWriteCombine(PM_enumWriteCombine_t callback);
+
+/* Function to add a path separator to the end of a filename (if not present) */
+
+void PMAPI PM_backslash(char *filename);
+
+/* Routines to lock and unlock regions of memory under a virtual memory
+ * environment. These routines _must_ be used to lock all hardware
+ * and mouse interrupt handlers installed, _AND_ any global data that
+ * these handler manipulate, so that they will always be present in memory
+ * to handle the incoming interrupts.
+ *
+ * Note that it is important to call the correct routine depending on
+ * whether the area being locked is code or data, so that under 32 bit
+ * PM we will get the selector value correct.
+ */
+
+int PMAPI PM_lockDataPages(void *p,uint len,PM_lockHandle *lockHandle);
+int PMAPI PM_unlockDataPages(void *p,uint len,PM_lockHandle *lockHandle);
+int PMAPI PM_lockCodePages(__codePtr p,uint len,PM_lockHandle *lockHandle);
+int PMAPI PM_unlockCodePages(__codePtr p,uint len,PM_lockHandle *lockHandle);
+
+/* Routines to install and remove Real Time Clock interrupt handlers. The
+ * frequency of the real time clock can be changed by calling
+ * PM_setRealTimeClockFrequeny, and the value can be any power of 2 value
+ * from 2Hz to 8192Hz.
+ *
+ * Note that you _must_ lock the memory containing the interrupt
+ * handlers with the PM_lockPages() function otherwise you may encounter
+ * problems in virtual memory environments.
+ *
+ * NOTE: User space versions of the PM library should fail these functions.
+ */
+
+ibool PMAPI PM_setRealTimeClockHandler(PM_intHandler ih,int frequency);
+void PMAPI PM_setRealTimeClockFrequency(int frequency);
+void PMAPI PM_restoreRealTimeClockHandler(void);
+
+/* Routines to install and remove hardware interrupt handlers.
+ *
+ * Note that you _must_ lock the memory containing the interrupt
+ * handlers with the PM_lockPages() function otherwise you may encounter
+ * problems in virtual memory environments.
+ *
+ * NOTE: User space versions of the PM library should fail these functions.
+ */
+
+PM_IRQHandle PMAPI PM_setIRQHandler(int IRQ,PM_irqHandler ih);
+void PMAPI PM_restoreIRQHandler(PM_IRQHandle irqHandle);
+
+/* Functions to program DMA using the legacy ISA DMA controller */
+
+void PMAPI PM_DMACEnable(int channel);
+void PMAPI PM_DMACDisable(int channel);
+void PMAPI PM_DMACProgram(int channel,int mode,ulong bufferPhys,int count);
+ulong PMAPI PM_DMACPosition(int channel);
+
+/* Function to post secondary graphics controllers using the BIOS */
+
+ibool PMAPI PM_doBIOSPOST(ushort axVal,ulong BIOSPhysAddr,void *mappedBIOS,ulong BIOSLen);
+
+/* Function to init the AGP functions and return the AGP aperture size in MB */
+
+ulong PMAPI PM_agpInit(void);
+void PMAPI PM_agpExit(void);
+
+/* Functions to reserve and release physical AGP memory ranges */
+
+ibool PMAPI PM_agpReservePhysical(ulong numPages,int type,void **physContext,PM_physAddr *physAddr);
+ibool PMAPI PM_agpReleasePhysical(void *physContext);
+
+/* Functions to commit and free physical AGP memory ranges */
+
+ibool PMAPI PM_agpCommitPhysical(void *physContext,ulong numPages,ulong startOffset,PM_physAddr *physAddr);
+ibool PMAPI PM_agpFreePhysical(void *physContext,ulong numPages,ulong startOffset);
+
+/* Functions to do I/O port manipulation directly from C code. These
+ * functions are portable and will work on any processor architecture
+ * to access I/O space registers on PCI devices.
+ */
+
+uchar PMAPI PM_inpb(int port);
+ushort PMAPI PM_inpw(int port);
+ulong PMAPI PM_inpd(int port);
+void PMAPI PM_outpb(int port,uchar val);
+void PMAPI PM_outpw(int port,ushort val);
+void PMAPI PM_outpd(int port,ulong val);
+
+/* Functions to determine the I/O port locations for COM and LPT ports.
+ * The functions are zero based, so for COM1 or LPT1 pass in a value of 0,
+ * for COM2 or LPT2 pass in a value of 1 etc.
+ */
+
+int PMAPI PM_getCOMPort(int port);
+int PMAPI PM_getLPTPort(int port);
+
+/* Internal functions that need prototypes */
+
+void PMAPI _PM_getRMvect(int intno, long *realisr);
+void PMAPI _PM_setRMvect(int intno, long realisr);
+void PMAPI _PM_freeMemoryMappings(void);
+
+/* Function to override the default debug log file location */
+
+void PMAPI PM_setDebugLog(const char *logFilePath);
+
+/* Function to put the process to sleep for the specified milliseconds */
+
+void PMAPI PM_sleep(ulong milliseconds);
+
+/* Function to block until 'milliseconds' have passed since last call */
+
+void PMAPI PM_blockUntilTimeout(ulong milliseconds);
+
+/* Functions for directory traversal and management */
+
+void * PMAPI PM_findFirstFile(const char *filename,PM_findData *findData);
+ibool PMAPI PM_findNextFile(void *handle,PM_findData *findData);
+void PMAPI PM_findClose(void *handle);
+void PMAPI PM_makepath(char *p,const char *drive,const char *dir,const char *name,const char *ext);
+int PMAPI PM_splitpath(const char *fn,char *drive,char *dir,char *name,char *ext);
+ibool PMAPI PM_driveValid(char drive);
+void PMAPI PM_getdcwd(int drive,char *dir,int len);
+uint PMAPI PM_getFileAttr(const char *filename);
+void PMAPI PM_setFileAttr(const char *filename,uint attrib);
+ibool PMAPI PM_getFileTime(const char *filename,ibool gmTime,PM_time *time);
+ibool PMAPI PM_setFileTime(const char *filename,ibool gmTime,PM_time *time);
+ibool PMAPI PM_mkdir(const char *filename);
+ibool PMAPI PM_rmdir(const char *filename);
+
+/* Functions to handle loading OS specific shared libraries */
+
+PM_MODULE PMAPI PM_loadLibrary(const char *szDLLName);
+void * PMAPI PM_getProcAddress(PM_MODULE hModule,const char *szProcName);
+void PMAPI PM_freeLibrary(PM_MODULE hModule);
+
+/* Functions and macros for 64-bit arithmetic */
+
+void PMAPI _PM_add64(u32 a_low,s32 a_high,u32 b_low,s32 b_high,__i64 *result);
+void PMAPI _PM_sub64(u32 a_low,s32 a_high,u32 b_low,s32 b_high,__i64 *result);
+void PMAPI _PM_mul64(u32 a_low,s32 a_high,u32 b_low,s32 b_high,__i64 *result);
+void PMAPI _PM_div64(u32 a_low,s32 a_high,u32 b_low,s32 b_high,__i64 *result);
+void PMAPI _PM_shr64(u32 a_low,s32 a_high,s32 shift,__i64 *result);
+void PMAPI _PM_sar64(u32 a_low,s32 a_high,s32 shift,__i64 *result);
+void PMAPI _PM_shl64(u32 a_low,s32 a_high,s32 shift,__i64 *result);
+void PMAPI _PM_neg64(u32 a_low,s32 a_high,__i64 *result);
+#ifdef __NATIVE_INT64__
+#define PM_add64(r,a,b) (r) = (a) + (b)
+#define PM_add64_32(r,a,b) (r) = (a) + (b)
+#define PM_sub64(r,a,b) (r) = (a) - (b)
+#define PM_sub64_32(r,a,b) (r) = (a) - (b)
+#define PM_mul64(r,a,b) (r) = (a) * (b)
+#define PM_mul64_32(r,a,b) (r) = (a) * (b)
+#define PM_div64(r,a,b) (r) = (a) / (b)
+#define PM_div64_32(r,a,b) (r) = (a) / (b)
+#define PM_shr64(r,a,s) (r) = (a) >> (s)
+#define PM_sar64(r,a,s) (r) = ((s64)(a)) >> (s)
+#define PM_shl64(r,a,s) (r) = (u64)(a) << (s)
+#define PM_neg64(r,a,s) (r) = -(a)
+#define PM_not64(r,a,s) (r) = ~(a)
+#define PM_eq64(a,b) (a) == (b)
+#define PM_gt64(a,b) (a) > (b)
+#define PM_lt64(a,b) (a) < (b)
+#define PM_geq64(a,b) (a) >= (b)
+#define PM_leq64(a,b) (a) <= (b)
+#define PM_64to32(a) (u32)(a)
+#define PM_64tos32(a) (s32)(a)
+#define PM_set64(a,b,c) (a) = ((u64)(b) << 32) + (c)
+#define PM_set64_32(a,b) (a) = (b)
+#else
+#define PM_add64(r,a,b) _PM_add64((a).low,(a).high,(b).low,(b).high,&(r))
+#define PM_add64_32(r,a,b) _PM_add64((a).low,(a).high,b,0,&(r))
+#define PM_sub64(r,a,b) _PM_sub64((a).low,(a).high,(b).low,(b).high,&(r))
+#define PM_sub64_32(r,a,b) _PM_sub64((a).low,(a).high,b,0,&(r))
+#define PM_mul64(r,a,b) _PM_mul64((a).low,(a).high,(b).low,(b).high,&(r))
+#define PM_mul64_32(r,a,b) _PM_mul64((a).low,(a).high,b,0,&(r))
+#define PM_div64(r,a,b) _PM_div64((a).low,(a).high,(b).low,(b).high,&(r))
+#define PM_div64_32(r,a,b) _PM_div64((a).low,(a).high,b,0,&(r))
+#define PM_shr64(r,a,s) _PM_shr64((a).low,(a).high,s,&(r))
+#define PM_sar64(r,a,s) _PM_sar64((a).low,(a).high,s,&(r))
+#define PM_shl64(r,a,s) _PM_shl64((a).low,(a).high,s,&(r))
+#define PM_neg64(r,a,s) _PM_neg64((a).low,(a).high,&(r))
+#define PM_not64(r,a,s) (r).low = ~(a).low, (r).high = ~(a).high
+#define PM_eq64(a,b) ((a).low == (b).low && (a).high == (b).high)
+#define PM_gt64(a,b) (((a).high > (b).high) || ((a).high == (b).high && (a).low > (b).low))
+#define PM_lt64(a,b) (((a).high < (b).high) || ((a).high == (b).high && (a).low < (b).low))
+#define PM_geq64(a,b) (PM_eq64(a,b) || PM_gt64(a,b))
+#define PM_leq64(a,b) (PM_eq64(a,b) || PM_lt64(a,b))
+#define PM_64to32(a) (u32)(a.low)
+#define PM_64tos32(a) ((a).high < 0) ? -(a).low : (a).low)
+#define PM_set64(a,b,c) (a).high = (b), (a).low = (c)
+#define PM_set64_32(a,b) (a).high = 0, (a).low = (b)
+#endif
+
+/* Function to enable IOPL access if required */
+
+int PMAPI PM_setIOPL(int iopl);
+
+/* Function to flush the TLB and CPU caches */
+
+void PMAPI PM_flushTLB(void);
+
+/* DOS specific fucntions */
+
+#ifdef __MSDOS__
+uint PMAPI PMHELP_getVersion(void);
+void PMAPI PM_VxDCall(VXD_regs *regs);
+#endif
+
+/* Functions to save and restore the VGA hardware state */
+
+int PMAPI PM_getVGAStateSize(void);
+void PMAPI PM_saveVGAState(void *stateBuf);
+void PMAPI PM_restoreVGAState(const void *stateBuf);
+void PMAPI PM_vgaBlankDisplay(void);
+void PMAPI PM_vgaUnblankDisplay(void);
+
+/* Functions to load and unload DirectDraw libraries. Only used on
+ * Windows platforms.
+ */
+
+void * PMAPI PM_loadDirectDraw(int device);
+void PMAPI PM_unloadDirectDraw(int device);
+PM_HWND PMAPI PM_getDirectDrawWindow(void);
+void PMAPI PM_doSuspendApp(void);
+
+/* Functions to install, start, stop and remove NT services. Valid only
+ * for Win32 apps running on Windows NT.
+ */
+
+#ifdef __WINDOWS32__
+ulong PMAPI PM_installService(const char *szDriverName,const char *szServiceName,const char *szLoadGroup,ulong dwServiceType);
+ulong PMAPI PM_startService(const char *szServiceName);
+ulong PMAPI PM_stopService(const char *szServiceName);
+ulong PMAPI PM_removeService(const char *szServiceName);
+#endif
+
+/* Routines to generate native interrupts (ie: protected mode interrupts
+ * for protected mode apps) using an interface the same as that use by
+ * int86() and int86x() in realmode. These routines are required because
+ * many 32 bit compilers use different register structures and different
+ * functions causing major portability headaches. Thus we provide our
+ * own and solve it all in one fell swoop, and we also get a routine to
+ * put stuff into 32 bit registers from real mode ;-)
+ */
+
+void PMAPI PM_segread(PMSREGS *sregs);
+int PMAPI PM_int386(int intno, PMREGS *in, PMREGS *out);
+int PMAPI PM_int386x(int intno, PMREGS *in, PMREGS *out,PMSREGS *sregs);
+
+/* Call the X86 emulator or the real BIOS in our test harness */
+
+#if defined(TEST_HARNESS) && !defined(PMLIB)
+#define PM_mapRealPointer(r_seg,r_off) _PM_imports.PM_mapRealPointer(r_seg,r_off)
+#define PM_getVESABuf(len,rseg,roff) _PM_imports.PM_getVESABuf(len,rseg,roff)
+#define PM_callRealMode(seg,off,regs,sregs) _PM_imports.PM_callRealMode(seg,off,regs,sregs)
+#define PM_int86(intno,in,out) _PM_imports.PM_int86(intno,in,out)
+#define PM_int86x(intno,in,out,sregs) _PM_imports.PM_int86x(intno,in,out,sregs)
+#endif
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+/* Include OS extensions for interrupt handling */
+
+#if defined(__REALDOS__) || defined(__SMX32__)
+#include "pmint.h"
+#endif
+
+#endif /* __PMAPI_H */
+
diff --git a/board/MAI/bios_emulator/scitech/include/pmimp.h b/board/MAI/bios_emulator/scitech/include/pmimp.h
new file mode 100644
index 0000000000..d6c5cdb740
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/pmimp.h
@@ -0,0 +1,194 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+*
+* Description: Header file declaring all the PM imports structure for the
+* current version of the PM library. Included in all code
+* that needs to pass the PM imports to BPD files.
+*
+****************************************************************************/
+
+PM_imports _VARAPI _PM_imports = {
+ sizeof(PM_imports),
+ PM_getModeType,
+ PM_getBIOSPointer,
+ PM_getA0000Pointer,
+ PM_mapPhysicalAddr,
+ PM_mallocShared,
+ NULL,
+ PM_freeShared,
+ PM_mapToProcess,
+ PM_mapRealPointer,
+ PM_allocRealSeg,
+ PM_freeRealSeg,
+ PM_allocLockedMem,
+ PM_freeLockedMem,
+ PM_callRealMode,
+ PM_int86,
+ PM_int86x,
+ DPMI_int86,
+ PM_availableMemory,
+ PM_getVESABuf,
+ PM_getOSType,
+ PM_fatalError,
+ PM_setBankA,
+ PM_setBankAB,
+ PM_setCRTStart,
+ PM_getCurrentPath,
+ PM_getVBEAFPath,
+ PM_getNucleusPath,
+ PM_getNucleusConfigPath,
+ PM_getUniqueID,
+ PM_getMachineName,
+ VF_available,
+ VF_init,
+ VF_exit,
+ PM_openConsole,
+ PM_getConsoleStateSize,
+ PM_saveConsoleState,
+ PM_restoreConsoleState,
+ PM_closeConsole,
+ PM_setOSCursorLocation,
+ PM_setOSScreenWidth,
+ PM_enableWriteCombine,
+ PM_backslash,
+ PM_lockDataPages,
+ PM_unlockDataPages,
+ PM_lockCodePages,
+ PM_unlockCodePages,
+ PM_setRealTimeClockHandler,
+ PM_setRealTimeClockFrequency,
+ PM_restoreRealTimeClockHandler,
+ PM_doBIOSPOST,
+ PM_getBootDrive,
+ PM_freePhysicalAddr,
+ PM_inpb,
+ PM_inpw,
+ PM_inpd,
+ PM_outpb,
+ PM_outpw,
+ PM_outpd,
+ NULL,
+ PM_setSuspendAppCallback,
+ PM_haveBIOSAccess,
+ PM_kbhit,
+ PM_getch,
+ PM_findBPD,
+ PM_getPhysicalAddr,
+ PM_sleep,
+ PM_getCOMPort,
+ PM_getLPTPort,
+ PM_loadLibrary,
+ PM_getProcAddress,
+ PM_freeLibrary,
+ PCI_enumerate,
+ PCI_accessReg,
+ PCI_setHardwareIRQ,
+ PCI_generateSpecialCyle,
+ NULL,
+ PCIBIOS_getEntry,
+ CPU_getProcessorType,
+ CPU_haveMMX,
+ CPU_have3DNow,
+ CPU_haveSSE,
+ CPU_haveRDTSC,
+ CPU_getProcessorSpeed,
+ ZTimerInit,
+ LZTimerOn,
+ LZTimerLap,
+ LZTimerOff,
+ LZTimerCount,
+ LZTimerOnExt,
+ LZTimerLapExt,
+ LZTimerOffExt,
+ LZTimerCountExt,
+ ULZTimerOn,
+ ULZTimerLap,
+ ULZTimerOff,
+ ULZTimerCount,
+ ULZReadTime,
+ ULZElapsedTime,
+ ULZTimerResolution,
+ PM_findFirstFile,
+ PM_findNextFile,
+ PM_findClose,
+ PM_makepath,
+ PM_splitpath,
+ PM_driveValid,
+ PM_getdcwd,
+ PM_setFileAttr,
+ PM_mkdir,
+ PM_rmdir,
+ PM_getFileAttr,
+ PM_getFileTime,
+ PM_setFileTime,
+ CPU_getProcessorName,
+ PM_getVGAStateSize,
+ PM_saveVGAState,
+ PM_restoreVGAState,
+ PM_vgaBlankDisplay,
+ PM_vgaUnblankDisplay,
+ PM_blockUntilTimeout,
+ _PM_add64,
+ _PM_sub64,
+ _PM_mul64,
+ _PM_div64,
+ _PM_shr64,
+ _PM_sar64,
+ _PM_shl64,
+ _PM_neg64,
+ PCI_findBARSize,
+ PCI_readRegBlock,
+ PCI_writeRegBlock,
+ PM_flushTLB,
+ PM_useLocalMalloc,
+ PM_malloc,
+ PM_calloc,
+ PM_realloc,
+ PM_free,
+ PM_getPhysicalAddrRange,
+ PM_allocPage,
+ PM_freePage,
+ PM_agpInit,
+ PM_agpExit,
+ PM_agpReservePhysical,
+ PM_agpReleasePhysical,
+ PM_agpCommitPhysical,
+ PM_agpFreePhysical,
+ PCI_getNumDevices,
+ PM_setLocalBPDPath,
+#ifdef __WINDOWS32__
+ PM_loadDirectDraw,
+ PM_unloadDirectDraw,
+ PM_getDirectDrawWindow,
+ PM_doSuspendApp,
+#else
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ };
+
diff --git a/board/MAI/bios_emulator/scitech/include/pmint.h b/board/MAI/bios_emulator/scitech/include/pmint.h
new file mode 100644
index 0000000000..7d76dad50c
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/pmint.h
@@ -0,0 +1,211 @@
+/****************************************************************************
+*
+* SciTech OS Portability Manager Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Real mode and 16/32 bit Protected Mode
+*
+* Description: Header file for the interrupt handling extensions to the OS
+* Portability Manager Library. These extensions includes
+* simplified interrupt handling, allowing all common interrupt
+* handlers to be hooked and handled directly with normal C
+* functions, both in 16 bit and 32 bit modes. Note however that
+* simplified handling does not mean slow performance! All low
+* level interrupt handling is done efficiently in assembler
+* for speed (well actually necessary to insulate the
+* application from the lack of far pointers in 32 bit PM). The
+* interrupt handlers currently supported are:
+*
+* Mouse (0x33 callback)
+* Timer Tick (0x8)
+* Keyboard (0x9 and 0x15)
+* Control C/Break (0x23/0x1B)
+* Critical Error (0x24)
+*
+****************************************************************************/
+
+#ifndef __PMINT_H
+#define __PMINT_H
+
+/*--------------------------- Macros and Typedefs -------------------------*/
+
+#ifdef __SMX32__
+/* PC interrupts (Ensure consistent with pme.inc) */
+#define PM_IRQ0 0x40
+#define PM_IRQ1 (PM_IRQ0+1)
+#define PM_IRQ6 (PM_IRQ0+6)
+#define PM_IRQ14 (PM_IRQ0+14)
+#endif
+
+/* Define the different types of interrupt handlers that we support */
+
+typedef uint (PMAPIP PM_criticalHandler)(uint axValue,uint diValue);
+typedef void (PMAPIP PM_breakHandler)(uint breakHit);
+typedef short (PMAPIP PM_key15Handler)(short scanCode);
+typedef void (PMAPIP PM_mouseHandler)(uint event, uint butstate,int x,int y,int mickeyX,int mickeyY);
+
+/* Create a type for representing far pointers in both 16 and 32 bit
+ * protected mode.
+ */
+
+#ifdef PM386
+typedef struct {
+ long off;
+ short sel;
+ } PMFARPTR;
+#define PMNULL {0,0}
+#else
+typedef void *PMFARPTR;
+#define PMNULL NULL
+#endif
+
+/*--------------------------- Function Prototypes -------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+/* Routine to load save default data segment selector value into a code
+ * segment variable, and another to load the value into the DS register.
+ */
+
+void PMAPI PM_loadDS(void);
+void PMAPI PM_saveDS(void);
+
+/* Routine to install a mouse interrupt handling routine. The
+ * mouse handler routine is a normal C function, and the PM library
+ * will take care of passing the correct parameters to the function,
+ * and switching to a local stack.
+ *
+ * Note that you _must_ lock the memory containing the mouse interrupt
+ * handler with the PM_lockPages() function otherwise you may encounter
+ * problems in virtual memory environments.
+ */
+
+int PMAPI PM_setMouseHandler(int mask,PM_mouseHandler mh);
+void PMAPI PM_restoreMouseHandler(void);
+
+/* Routine to reset the mouse driver, and re-install the current
+ * mouse interrupt handler if one was currently installed (since the
+ * mouse reset will automatically remove this handler.
+ */
+
+void PMAPI PM_resetMouseDriver(int hardReset);
+
+/* Routine to reset the mouse driver, and re-install the current
+ * mouse interrupt handler if one was currently installed (since the
+ * mouse reset will automatically remove this handler.
+ */
+
+void PMAPI PM_resetMouseDriver(int hardReset);
+
+/* Routines to install and remove timer interrupt handlers.
+ *
+ * Note that you _must_ lock the memory containing the interrupt
+ * handlers with the PM_lockPages() function otherwise you may encounter
+ * problems in virtual memory environments.
+ */
+
+void PMAPI PM_setTimerHandler(PM_intHandler ih);
+void PMAPI PM_chainPrevTimer(void);
+void PMAPI PM_restoreTimerHandler(void);
+
+/* Routines to install and keyboard interrupt handlers.
+ *
+ * Note that you _must_ lock the memory containing the interrupt
+ * handlers with the PM_lockPages() function otherwise you may encounter
+ * problems in virtual memory environments.
+ */
+
+void PMAPI PM_setKeyHandler(PM_intHandler ih);
+void PMAPI PM_chainPrevKey(void);
+void PMAPI PM_restoreKeyHandler(void);
+
+/* Routines to hook and unhook the alternate Int 15h keyboard intercept
+ * callout routine. Your event handler will need to return the following:
+ *
+ * scanCode - Let the BIOS process scan code (chains to previous handler)
+ * 0 - You have processed the scan code so flush from BIOS
+ *
+ * Note that this is not available under all DOS extenders, but does
+ * work under real mode, DOS4GW and X32-VM. It does not work under the
+ * PowerPack 32 bit DOS extenders. If you figure out how to do it let us know!
+ */
+
+void PMAPI PM_setKey15Handler(PM_key15Handler ih);
+void PMAPI PM_restoreKey15Handler(void);
+
+/* Routines to install and remove the control c/break interrupt handlers.
+ * Interrupt handling is performed by the PM/Pro library, and you can call
+ * the supplied routines to test the status of the Ctrl-C and Ctrl-Break
+ * flags. If you pass the value TRUE for 'clearFlag' to these routines,
+ * the internal flags will be reset in order to catch another Ctrl-C or
+ * Ctrl-Break interrupt.
+ */
+
+void PMAPI PM_installBreakHandler(void);
+int PMAPI PM_ctrlCHit(int clearFlag);
+int PMAPI PM_ctrlBreakHit(int clearFlag);
+void PMAPI PM_restoreBreakHandler(void);
+
+/* Routine to install an alternate break handler that will call your
+ * code directly. This is not available under all DOS extenders, but does
+ * work under real mode, DOS4GW and X32-VM. It does not work under the
+ * PowerPack 32 bit DOS extenders. If you figure out how to do it let us know!
+ *
+ * Note that you should either install one or the other, but not both!
+ */
+
+void PMAPI PM_installAltBreakHandler(PM_breakHandler bh);
+
+/* Routines to install and remove the critical error handler. The interrupt
+ * is handled by the PM/Pro library, and the operation will always be failed.
+ * You can check the status of the critical error handler with the
+ * appropriate function. If you pass the value TRUE for 'clearFlag', the
+ * internal flag will be reset ready to catch another critical error.
+ */
+
+void PMAPI PM_installCriticalHandler(void);
+int PMAPI PM_criticalError(int *axValue, int *diValue, int clearFlag);
+void PMAPI PM_restoreCriticalHandler(void);
+
+/* Routine to install an alternate critical handler that will call your
+ * code directly. This is not available under all DOS extenders, but does
+ * work under real mode, DOS4GW and X32-VM. It does not work under the
+ * PowerPack 32 bit DOS extenders. If you figure out how to do it let us know!
+ *
+ * Note that you should either install one or the other, but not both!
+ */
+
+void PMAPI PM_installAltCriticalHandler(PM_criticalHandler);
+
+/* Functions to manage protected mode only interrupt handlers */
+
+void PMAPI PM_getPMvect(int intno, PMFARPTR *isr);
+void PMAPI PM_setPMvect(int intno, PM_intHandler ih);
+void PMAPI PM_restorePMvect(int intno, PMFARPTR isr);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __PMINT_H */
diff --git a/board/MAI/bios_emulator/scitech/include/scitech.h b/board/MAI/bios_emulator/scitech/include/scitech.h
new file mode 100644
index 0000000000..1dbfface0d
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/scitech.h
@@ -0,0 +1,712 @@
+/****************************************************************************
+*
+* SciTech Multi-platform Graphics Library
+*
+* ========================================================================
+*
+* The contents of this file are subject to the SciTech MGL Public
+* License Version 1.0 (the "License"); you may not use this file
+* except in compliance with the License. You may obtain a copy of
+* the License at http://www.scitechsoft.com/mgl-license.txt
+*
+* Software distributed under the License is distributed on an
+* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* rights and limitations under the License.
+*
+* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+*
+* The Initial Developer of the Original Code is SciTech Software, Inc.
+* All Rights Reserved.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: any
+*
+* Description: General header file for operating system portable code.
+*
+****************************************************************************/
+
+#ifndef __SCITECH_H
+#define __SCITECH_H
+
+/* We have the following defines to identify the compilation environment:
+ *
+ * __16BIT__ Compiling for 16 bit code (any environment)
+ * __32BIT__ Compiling for 32 bit code (any environment)
+ * __MSDOS__ Compiling for MS-DOS (includes __WINDOWS16__, __WIN386__)
+ * __REALDOS__ Compiling for MS-DOS (excludes __WINDOWS16__)
+ * __MSDOS16__ Compiling for 16 bit MS-DOS
+ * __MSDOS32__ Compiling for 32 bit MS-DOS
+ * __WINDOWS__ Compiling for Windows
+ * __WINDOWS16__ Compiling for 16 bit Windows (__MSDOS__ also defined)
+ * __WINDOWS32__ Compiling for 32 bit Windows
+ * __WIN32_VXD__ Compiling for a 32-bit C based VxD
+ * __NT_DRIVER__ Compiling for a 32-bit C based NT device driver
+ * __OS2__ Compiling for OS/2
+ * __OS2_16__ Compiling for 16 bit OS/2
+ * __OS2_32__ Compiling for 32 bit OS/2
+ * __UNIX__ Compiling for Unix
+ * __QNX__ Compiling for the QNX realtime OS (Unix compatible)
+ * __LINUX__ Compiling for the Linux OS (Unix compatible)
+ * __FREEBSD__ Compiling for the FreeBSD OS (Unix compatible)
+ * __BEOS__ Compiling for the BeOS (Unix compatible)
+ * __SMX32__ Compiling for the SMX 32-bit Real Time OS
+ * __ENEA_OSE__ Compiling for the OSE embedded OS
+ * __RTTARGET__ Compiling for the RTTarget 32-bit embedded OS
+ * __MACOS__ Compiling for the MacOS platform (PowerPC)
+ * __DRIVER__ Compiling for a 32-bit binary compatible driver
+ * __CONSOLE__ Compiling for a fullscreen OS console mode
+ * __SNAP__ Compiling as a Snap executeable or dynamic library
+ *
+ * __INTEL__ Compiling for Intel CPU's
+ * __ALPHA__ Compiling for DEC Alpha CPU's
+ * __MIPS__ Compiling for MIPS CPU's
+ * __PPC__ Compiling for PowerPC CPU's
+ * __MC68K__ Compiling for Motorola 680x0
+ *
+ * __BIG_ENDIAN__ Compiling for a big endian processor
+ *
+ */
+
+#ifdef __SC__
+#if __INTSIZE == 4
+#define __SC386__
+#endif
+#endif
+
+/* Determine some things that are compiler specific */
+
+#ifdef __GNUC__
+#ifdef __cplusplus
+// G++ currently fucks this up!
+#define __cdecl
+#define __stdcall
+#else
+#undef __cdecl
+#undef __stdcall
+#define __cdecl __attribute__ ((cdecl))
+#define __stdcall __attribute__ ((stdcall))
+#endif
+#define __FLAT__ /* GCC is always 32 bit flat model */
+#define __HAS_BOOL__ /* Latest GNU C++ has ibool type */
+#define __HAS_LONG_LONG__ /* GNU C supports long long type */
+#include <stdio.h> /* Bring in for definition of NULL */
+#endif
+
+#ifdef __BORLANDC__
+#if (__BORLANDC__ >= 0x500) || defined(CLASSLIB_DEFS_H)
+#define __HAS_BOOL__ /* Borland C++ 5.0 defines ibool type */
+#endif
+#if (__BORLANDC__ >= 0x502) && !defined(VTOOLSD) && !defined(__SMX32__)
+#define __HAS_INT64__ /* Borland C++ 5.02 supports __int64 type */
+#endif
+#endif
+
+#if defined(_MSC_VER) && !defined(__SC__) && !defined(VTOOLSD) && !defined(__SMX32__)
+#define __HAS_INT64__ /* Visual C++ supports __int64 type */
+#endif
+
+#if defined(__WATCOMC__) && (__WATCOMC__ >= 1100) && !defined(VTOOLSD) && !defined(__SMX32__)
+#define __HAS_INT64__ /* Watcom C++ 11.0 supports __int64 type */
+#endif
+
+/*---------------------------------------------------------------------------
+ * Determine the compile time environment. This must be done for each
+ * supported platform so that we can determine at compile time the target
+ * environment, hopefully without requiring #define's from the user.
+ *-------------------------------------------------------------------------*/
+
+/* 32-bit binary compatible driver. Compiled as Win32, but as OS neutral */
+#ifdef __DRIVER__
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#undef __WINDOWS__
+#undef _WIN32
+#undef __WIN32__
+#undef __NT__
+
+/* 32-bit Snap exe or dll. Compiled as Win32, but as OS neutral */
+#elif defined(__SNAP__)
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#undef __WINDOWS__
+#undef _WIN32
+#undef __WIN32__
+#undef __NT__
+
+/* 32-bit Windows VxD compile environment */
+#elif defined(__vtoolsd_h_) || defined(VTOOLSD)
+#include <vtoolsc.h>
+#define __WIN32_VXD__
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#define _MAX_PATH 256
+#undef __WINDOWS32__
+
+/* 32-bit Windows NT driver compile environment: TODO!! */
+#elif defined(__NT_DRIVER__)
+#include "ntdriver.h"
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#define _MAX_PATH 256
+#undef __WINDOWS32__
+
+/* 32-bit SMX compile environment */
+#elif defined(__SMX32__)
+#ifndef __MSDOS__
+#define __MSDOS__
+#endif
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#ifndef __CONSOLE__
+#define __CONSOLE__
+#endif
+
+/* 32-bit Enea OSE environment */
+#elif defined(__ENEA_OSE__)
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#ifndef __CONSOLE__
+#define __CONSOLE__
+#endif
+
+/* 32-bit RTTarget-32 environment */
+#elif defined(__RTTARGET__)
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#ifndef __CONSOLE__
+#define __CONSOLE__
+#endif
+
+/* 32-bit extended DOS compile environment */
+#elif defined(__MSDOS__) || defined(__MSDOS32__) || defined(__DOS__) || defined(__DPMI32__) || (defined(M_I86) && (!defined(__SC386__) && !defined(M_I386))) || defined(TNT)
+#ifndef __MSDOS__
+#define __MSDOS__
+#endif
+#if defined(__MSDOS32__) || defined(__386__) || defined(__FLAT__) || defined(__NT__) || defined(__SC386__)
+#ifndef __MSDOS32__
+#define __MSDOS32__
+#endif
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#ifndef __REALDOS__
+#define __REALDOS__
+#endif
+#ifndef __CONSOLE__
+#define __CONSOLE__
+#endif
+
+/* 16-bit Windows compile environment */
+#elif (defined(_Windows) || defined(_WINDOWS)) && !defined(__DPMI16__)
+#ifndef __16BIT__
+#define __16BIT__
+#endif
+#ifndef __WINDOWS16__
+#define __WINDOWS16__
+#endif
+#ifndef __WINDOWS__
+#define __WINDOWS__
+#endif
+#ifndef __MSDOS__
+#define __MSDOS__
+#endif
+
+/* 16-bit DOS compile environment */
+#else
+#ifndef __16BIT__
+#define __16BIT__
+#endif
+#ifndef __MSDOS16__
+#define __MSDOS16__
+#endif
+#ifndef __REALDOS__
+#define __REALDOS__
+#endif
+#ifndef __CONSOLE__
+#define __CONSOLE__
+#endif
+#endif
+
+/* 32-bit Windows compile environment */
+#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#ifndef __WINDOWS32__
+#define __WINDOWS32__
+#endif
+#ifndef _WIN32
+#define _WIN32 /* Microsoft Win32 SDK headers use _WIN32 */
+#endif
+#ifndef WIN32
+#define WIN32 /* OpenGL headers use WIN32 */
+#endif
+#ifndef __WINDOWS__
+#define __WINDOWS__
+#endif
+
+/* 32-bit OS/2 VDD compile environment */
+/* We're assuming (for now) that CL386 must be used */
+#elif defined(MSDOS) && defined(M_I386)
+/* fixes necessary to compile with CL386 */
+#define __cdecl _cdecl
+typedef unsigned int size_t;
+
+#include <mvdm.h>
+
+/* This should probably be somewhere else... */
+/* Inline eligible functions (we have no CRT libs for CL386) */
+#pragma intrinsic (strcpy, strcmp, strlen, strcat)
+#pragma intrinsic (memcmp, memcpy, memset)
+
+#define __OS2_VDD__
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#define CCHMAXPATH 256
+#define _MAX_PATH 256
+#ifndef __OS2__
+#define __OS2__
+#endif
+#ifndef __OS2_32__
+#define __OS2_32__
+#endif
+
+/* 16-bit OS/2 compile environment */
+#elif defined(__OS2_16__)
+#ifndef __OS2__
+#define __OS2__
+#endif
+#ifndef __16BIT__
+#define __16BIT__
+#endif
+#ifndef __OS2_PM__
+#ifndef __CONSOLE__
+#define __CONSOLE__
+#endif
+#endif
+
+/* 32-bit OS/2 compile environment */
+#elif defined(__OS2__) || defined(__OS2_32__)
+#ifndef __OS2__
+#define __OS2__
+#endif
+#ifndef __OS2_32__
+#define __OS2_32__
+#endif
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#ifndef __OS2_PM__
+#ifndef __CONSOLE__
+#define __CONSOLE__
+#endif
+#endif
+
+/* 32-bit QNX compile environment */
+#elif defined(__QNX__)
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#ifndef __UNIX__
+#define __UNIX__
+#endif
+#ifdef __GNUC__
+#define stricmp strcasecmp
+#endif
+#if !defined(__PHOTON__) && !defined(__X11__)
+#ifndef __CONSOLE__
+#define __CONSOLE__
+#endif
+#endif
+
+/* 32-bit Linux compile environment */
+#elif defined(__LINUX__) || defined(linux)
+#ifndef __LINUX__
+#define __LINUX__
+#endif
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#ifndef __UNIX__
+#define __UNIX__
+#endif
+#ifdef __GNUC__
+#define stricmp strcasecmp
+#endif
+#ifndef __X11__
+#ifndef __CONSOLE__
+#define __CONSOLE__
+#endif
+#endif
+
+/* 32-bit FreeBSD compile environment */
+#elif defined(__FREEBSD__)
+#ifndef __FREEBSD__
+#define __FREEBSD__
+#endif
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#ifndef __UNIX__
+#define __UNIX__
+#endif
+#ifdef __GNUC__
+#define stricmp strcasecmp
+#endif
+#ifndef __X11__
+#ifndef __CONSOLE__
+#define __CONSOLE__
+#endif
+#endif
+
+/* 32-bit BeOS compile environment */
+#elif defined(__BEOS__)
+#ifndef __32BIT__
+#define __32BIT__
+#endif
+#ifndef __UNIX__
+#define __UNIX__
+#endif
+#ifdef __GNUC__
+#define stricmp strcasecmp
+#endif
+
+/* Unsupported OS! */
+#else
+#error This platform is not currently supported!
+#endif
+
+/* Determine the CPU type that we are compiling for */
+
+#if defined(__M_ALPHA) || defined(__ALPHA_) || defined(__ALPHA) || defined(__alpha)
+#ifndef __ALPHA__
+#define __ALPHA__
+#endif
+#elif defined(__M_PPC) || defined(__POWERC)
+#ifndef __PPC__
+#define __PPC__
+#endif
+#elif defined(__M_MRX000)
+#ifndef __MIPS__
+#define __MIPS__
+#endif
+#else
+#ifndef __INTEL__
+#define __INTEL__ /* Assume Intel if nothing found */
+#endif
+#endif
+
+/* We have the following defines to define the calling conventions for
+ * publicly accesible functions:
+ *
+ * _PUBAPI - Compiler default calling conventions for all public 'C' functions
+ * _ASMAPI - Calling conventions for all public assembler functions
+ * _VARAPI - Modifiers for variables; Watcom C++ mangles C++ globals
+ * _STDCALL - Win32 __stdcall where possible, __cdecl if not supported
+ */
+
+#if defined(_MSC_VER) && defined(_WIN32) && !defined(__SC__)
+#define __PASCAL __stdcall
+#else
+#define __PASCAL __pascal
+#endif
+
+#if defined(NO_STDCALL)
+#define _STDCALL __cdecl
+#else
+#define _STDCALL __stdcall
+#endif
+
+#ifdef __WATCOMC__
+#if (__WATCOMC__ >= 1050)
+#define _VARAPI __cdecl
+#else
+#define _VARAPI
+#endif
+#else
+#define _VARAPI
+#endif
+
+#if defined(__IBMC__) || defined(__IBMCPP__)
+#define PTR_DECL_IN_FRONT
+#endif
+
+/* Define the calling conventions for all public functions. For simplicity
+ * we define all public functions as __cdecl calling conventions, so that
+ * they are the same across all compilers and runtime DLL's.
+ */
+
+#define _PUBAPI __cdecl
+#define _ASMAPI __cdecl
+
+/* Determine the syntax for declaring a function pointer with a
+ * calling conventions override. Most compilers require the calling
+ * convention to be declared in front of the '*', but others require
+ * it to be declared after the '*'. We handle both in here depending
+ * on what the compiler requires.
+ */
+
+#ifdef PTR_DECL_IN_FRONT
+#define _PUBAPIP * _PUBAPI
+#define _ASMAPIP * _ASMAPI
+#else
+#define _PUBAPIP _PUBAPI *
+#define _ASMAPIP _ASMAPI *
+#endif
+
+/* Useful macros */
+
+#define PRIVATE static
+#define PUBLIC
+
+/* This HAS to be 0L for 16-bit real mode code to work!!! */
+
+#ifndef NULL
+# define _NULL 0L
+# define NULL _NULL
+#endif
+
+#ifndef MAX
+# define MAX(a,b) ( ((a) > (b)) ? (a) : (b))
+#endif
+#ifndef MIN
+# define MIN(a,b) ( ((a) < (b)) ? (a) : (b))
+#endif
+#ifndef ABS
+# define ABS(a) ((a) >= 0 ? (a) : -(a))
+#endif
+#ifndef SIGN
+# define SIGN(a) ((a) > 0 ? 1 : -1)
+#endif
+
+/* General typedefs */
+
+#ifndef __GENDEFS
+#define __GENDEFS
+#if defined(__BEOS__)
+#include <SupportDefs.h>
+#else
+#ifdef __LINUX__
+#include <sys/types.h>
+#ifdef __STRICT_ANSI__
+typedef unsigned short ushort;
+typedef unsigned long ulong;
+typedef unsigned int uint;
+#endif
+#ifdef __KERNEL__
+#define __GENDEFS_2
+#endif
+#else
+#if !(defined(__QNXNTO__) && defined(GENERAL_STRUCT))
+typedef unsigned short ushort;
+typedef unsigned long ulong;
+#endif
+typedef unsigned int uint;
+#endif
+typedef unsigned char uchar;
+#endif
+typedef int ibool; /* Integer boolean type */
+#ifdef USE_BOOL /* Only for older code */
+#ifndef __cplusplus
+#define bool ibool /* Standard C */
+#else
+#ifndef __HAS_BOOL__
+#define bool ibool /* Older C++ compilers */
+#endif
+#endif /* __cplusplus */
+#endif /* USE_BOOL */
+#endif /* __GENDEFS */
+
+/* More general typedefs compatible with Linux kernel code */
+
+#ifndef __GENDEFS_2
+#define __GENDEFS_2
+typedef char s8;
+typedef unsigned char u8;
+typedef short s16;
+typedef unsigned short u16;
+#ifdef __16BIT__
+typedef long s32;
+typedef unsigned long u32;
+#else
+typedef int s32;
+typedef unsigned int u32;
+#endif
+typedef struct {
+ u32 low;
+ s32 high;
+ } __i64;
+#ifdef __HAS_LONG_LONG__
+#define __NATIVE_INT64__
+typedef long long s64;
+typedef unsigned long long u64;
+#elif defined(__HAS_INT64__) && !defined(__16BIT__)
+#define __NATIVE_INT64__
+typedef __int64 s64;
+typedef unsigned __int64 u64;
+#else
+typedef __i64 s64;
+typedef __i64 u64;
+#endif
+#endif
+
+/* Boolean truth values */
+
+#undef false
+#undef true
+#undef NO
+#undef YES
+#undef FALSE
+#undef TRUE
+#define false 0
+#define true 1
+#define NO 0
+#define YES 1
+#define FALSE 0
+#define TRUE 1
+
+/* Inline debugger interrupts for Watcom C++ and Borland C++ */
+
+#ifdef __WATCOMC__
+void DebugInt(void);
+#pragma aux DebugInt = \
+ "int 3";
+void DebugVxD(void);
+#pragma aux DebugVxD = \
+ "int 1";
+#elif defined(__BORLANDC__)
+#define DebugInt() __emit__(0xCC)
+#define DebugVxD() {__emit__(0xCD); __emit__(0x01);}
+#elif defined(_MSC_VER)
+#define DebugInt() _asm int 0x3
+#define DebugVxD() _asm int 0x1
+#elif defined(__GNUC__)
+#define DebugInt() asm volatile ("int $0x3")
+#define DebugVxD() asm volatile ("int $0x1")
+#else
+void _ASMAPI DebugInt(void);
+void _ASMAPI DebugVxD(void);
+#endif
+
+/* Macros to break once and never break again */
+
+#define DebugIntOnce() \
+{ \
+ static ibool firstTime = true; \
+ if (firstTime) { \
+ firstTime = false; \
+ DebugInt(); \
+ } \
+}
+
+#define DebugVxDOnce() \
+{ \
+ static ibool firstTime = true; \
+ if (firstTime) { \
+ firstTime = false; \
+ DebugVxD(); \
+ } \
+}
+
+/* Macros for linux string compatibility functions */
+
+#ifdef __LINUX__
+#define stricmp strcasecmp
+#define strnicmp strncasecmp
+#endif
+
+/* Macros for NT driver string compatibility functions */
+
+#ifdef __NT_DRIVER__
+#define stricmp _stricmp
+#define strnicmp _strnicmp
+#endif
+
+/* Get rid of some helaciously annoying Visual C++ warnings! */
+
+#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__SC__)
+#pragma warning(disable:4761) // integral size mismatch in argument; conversion supplied
+#pragma warning(disable:4244) // conversion from 'unsigned short ' to 'unsigned char ', possible loss of data
+#pragma warning(disable:4018) // '<' : signed/unsigned mismatch
+#pragma warning(disable:4305) // 'initializing' : truncation from 'const double' to 'float'
+#endif
+
+/*---------------------------------------------------------------------------
+ * Set of debugging macros used by the libraries. If the debug flag is
+ * set, they are turned on depending on the setting of the flag. User code
+ * can override the default functions called when a check fails, and the
+ * MGL does this so it can restore the system from graphics mode to display
+ * an error message. These functions also log information to the
+ * scitech.log file in the root directory of the hard drive when problems
+ * show up.
+ *
+ * If you set the value of CHECKED to be 2, it will also enable code to
+ * insert hard coded debugger interrupt into the source code at the line of
+ * code where the check fail. This is useful if you run the code under a
+ * debugger as it will break inside the debugger before exiting with a
+ * failure condition.
+ *
+ * Also for code compiled to run under Windows, we also call the
+ * OutputDebugString function to send the message to the system debugger
+ * such as Soft-ICE or WDEB386. Hence if you get any non-fatal warnings you
+ * will see those on the debugger terminal as well as in the log file.
+ *-------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+extern void (*_CHK_fail)(int fatal,const char *msg,const char *cond,const char *file,int line);
+void _CHK_defaultFail(int fatal,const char *msg,const char *cond,const char *file,int line);
+
+#ifdef CHECKED
+# define CHK(x) x
+#if CHECKED > 1
+# define CHECK(p) \
+ ((p) ? (void)0 : DebugInt(), \
+ _CHK_fail(1,"Check failed: '%s', file %s, line %d\n", \
+ #p, __FILE__, __LINE__))
+# define WARN(p) \
+ ((p) ? (void)0 : DebugInt(), \
+ _CHK_fail(0,"Warning: '%s', file %s, line %d\n", \
+ #p, __FILE__, __LINE__))
+#else
+# define CHECK(p) \
+ ((p) ? (void)0 : \
+ _CHK_fail(1,"Check failed: '%s', file %s, line %d\n", \
+ #p, __FILE__, __LINE__))
+# define WARN(p) \
+ ((p) ? (void)0 : \
+ _CHK_fail(0,"Warning: '%s', file %s, line %d\n", \
+ #p, __FILE__, __LINE__))
+#endif
+# define LOGFATAL(msg) \
+ _CHK_fail(1,"Fatal error: '%s', file %s, line %d\n", \
+ msg, __FILE__, __LINE__)
+# define LOGWARN(msg) \
+ _CHK_fail(0,"Warning: '%s', file %s, line %d\n", \
+ msg, __FILE__, __LINE__)
+#else
+# define CHK(x)
+# define CHECK(p) ((void)0)
+# define WARN(p) ((void)0)
+# define LOGFATAL(msg) ((void)0)
+# define LOGWARN(msg) ((void)0)
+#endif
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __SCITECH_H */
diff --git a/board/MAI/bios_emulator/scitech/include/scitech.mac b/board/MAI/bios_emulator/scitech/include/scitech.mac
new file mode 100644
index 0000000000..27a2fc06e8
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/scitech.mac
@@ -0,0 +1,1321 @@
+;****************************************************************************
+;*
+;* ========================================================================
+;*
+;* The contents of this file are subject to the SciTech MGL Public
+;* License Version 1.0 (the "License"); you may not use this file
+;* except in compliance with the License. You may obtain a copy of
+;* the License at http://www.scitechsoft.com/mgl-license.txt
+;*
+;* Software distributed under the License is distributed on an
+;* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+;* implied. See the License for the specific language governing
+;* rights and limitations under the License.
+;*
+;* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+;*
+;* The Initial Developer of the Original Code is SciTech Software, Inc.
+;* All Rights Reserved.
+;*
+;* ========================================================================
+;*
+;* Language: NetWide Assembler (NASM) or Turbo Assembler (TASM)
+;* Environment: Any Intel Environment
+;*
+;* Description: Macros to provide memory model independant assembly language
+;* module for C programming. Supports the large and flat memory
+;* models.
+;*
+;* The defines that you should use when assembling modules that
+;* use this macro package are:
+;*
+;* __LARGE__ Assemble for 16-bit large model
+;* __FLAT__ Assemble for 32-bit FLAT memory model
+;* __NOU__ No underscore for all external C labels
+;* __NOU_VAR__ No underscore for global variables only
+;*
+;* The default settings are for 16-bit large memory model with
+;* leading underscores for symbol names.
+;*
+;* The main intent of the macro file is to enable programmers
+;* to write _one_ set of source that can be assembled to run
+;* in either 16 bit real and protected modes or 32 bit
+;* protected mode without the need to riddle the code with
+;* 'if flatmodel' style conditional assembly (it is still there
+;* but nicely hidden by a macro layer that enhances the
+;* readability and understandability of the resulting code).
+;*
+;****************************************************************************
+
+; Include the appropriate version in here depending on the assembler. NASM
+; appears to always try and parse code, even if it is in a non-compiling
+; block of a ifdef expression, and hence crashes if we include the TASM
+; macro package in the same header file. Hence we split the macros up into
+; two separate header files.
+
+ifdef __NASM_MAJOR__
+
+;============================================================================
+; Macro package when compiling with NASM.
+;============================================================================
+
+; Turn off underscores for globals if disabled for all externals
+
+%ifdef __NOU__
+%define __NOU_VAR__
+%endif
+
+; Define the __WINDOWS__ symbol if we are compiling for any Windows
+; environment
+
+%ifdef __WINDOWS16__
+%define __WINDOWS__ 1
+%endif
+%ifdef __WINDOWS32__
+%define __WINDOWS__ 1
+%define __WINDOWS32_386__ 1
+%endif
+
+; Macros for accessing 'generic' registers
+
+%ifdef __FLAT__
+%idefine _ax eax
+%idefine _bx ebx
+%idefine _cx ecx
+%idefine _dx edx
+%idefine _si esi
+%idefine _di edi
+%idefine _bp ebp
+%idefine _sp esp
+%idefine _es
+%idefine UCHAR BYTE ; Size of a character
+%idefine USHORT WORD ; Size of a short
+%idefine UINT DWORD ; Size of an integer
+%idefine ULONG DWORD ; Size of a long
+%idefine BOOL DWORD ; Size of a boolean
+%idefine DPTR DWORD ; Size of a data pointer
+%idefine FDPTR FWORD ; Size of a far data pointer
+%idefine NDPTR DWORD ; Size of a near data pointer
+%idefine CPTR DWORD ; Size of a code pointer
+%idefine FCPTR FWORD ; Size of a far code pointer
+%idefine NCPTR DWORD ; Size of a near code pointer
+%idefine FPTR NEAR ; Distance for function pointers
+%idefine DUINT dd ; Declare a integer variable
+%idefine intsize 4
+%idefine flatmodel 1
+%else
+%idefine _ax ax
+%idefine _bx bx
+%idefine _cx cx
+%idefine _dx dx
+%idefine _si si
+%idefine _di di
+%idefine _bp bp
+%idefine _sp sp
+%idefine _es es:
+%idefine UCHAR BYTE ; Size of a character
+%idefine USHORT WORD ; Size of a short
+%idefine UINT WORD ; Size of an integer
+%idefine ULONG DWORD ; Size of a long
+%idefine BOOL WORD ; Size of a boolean
+%idefine DPTR DWORD ; Size of a data pointer
+%idefine FDPTR DWORD ; Size of a far data pointer
+%idefine NDPTR WORD ; Size of a near data pointer
+%idefine CPTR DWORD ; Size of a code pointer
+%idefine FCPTR DWORD ; Size of a far code pointer
+%idefine NCPTR WORD ; Size of a near code pointer
+%idefine FPTR FAR ; Distance for function pointers
+%idefine DUINT dw ; Declare a integer variable
+%idefine intsize 2
+%endif
+%idefine invert ~
+%idefine offset
+%idefine use_nasm
+
+; Convert all jumps to near jumps, since NASM does not so this automatically
+
+%idefine jo jo near
+%idefine jno jno near
+%idefine jz jz near
+%idefine jnz jnz near
+%idefine je je near
+%idefine jne jne near
+%idefine jb jb near
+%idefine jbe jbe near
+%idefine ja ja near
+%idefine jae jae near
+%idefine jl jl near
+%idefine jle jle near
+%idefine jg jg near
+%idefine jge jge near
+%idefine jc jc near
+%idefine jnc jnc near
+%idefine js js near
+%idefine jns jns near
+
+%ifdef DOUBLE
+%idefine REAL QWORD
+%idefine DREAL dq
+%else
+%idefine REAL DWORD
+%idefine DREAL dd
+%endif
+
+; Boolean truth values (same as those in debug.h)
+
+%idefine False 0
+%idefine True 1
+%idefine No 0
+%idefine Yes 1
+%idefine Yes 1
+
+; Macro to be invoked at the start of all modules to set up segments for
+; later use. Does nothing for NASM.
+
+%imacro header 1
+%endmacro
+
+; Macro to begin a data segment
+
+%imacro begdataseg 1
+%ifdef __GNUC__
+segment .data public class=DATA use32 flat
+%else
+%ifdef flatmodel
+segment _DATA public align=4 class=DATA use32 flat
+%else
+segment _DATA public align=4 class=DATA use16
+%endif
+%endif
+%endmacro
+
+; Macro to end a data segment
+
+%imacro enddataseg 1
+%endmacro
+
+; Macro to begin a code segment
+
+%imacro begcodeseg 1
+%ifdef __PIC__
+%ifdef __LINUX__
+ extern _GLOBAL_OFFSET_TABLE_
+%else
+ extern __GLOBAL_OFFSET_TABLE_
+%endif
+%endif
+%ifdef __GNUC__
+segment .text public class=CODE use32 flat
+%else
+%ifdef flatmodel
+segment _TEXT public align=16 class=CODE use32 flat
+%else
+segment %1_TEXT public align=16 class=CODE use16
+%endif
+%endif
+%endmacro
+
+; Macro to begin a near code segment
+
+%imacro begcodeseg_near 0
+%ifdef __GNUC__
+segment .text public class=CODE use32 flat
+%else
+%ifdef flatmodel
+segment _TEXT public align=16 class=CODE use32 flat
+%else
+segment _TEXT public align=16 class=CODE use16
+%endif
+%endif
+%endmacro
+
+; Macro to end a code segment
+
+%imacro endcodeseg 1
+%endmacro
+
+; Macro to end a near code segment
+
+%imacro endcodeseg_near 0
+%endmacro
+
+; Macro for an extern C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+%imacro cextern 2
+%ifdef __NOU_VAR__
+extern %1
+%else
+extern _%1
+%define %1 _%1
+%endif
+%endmacro
+
+%imacro cexternfunc 2
+%ifdef __NOU__
+extern %1
+%else
+extern _%1
+%define %1 _%1
+%endif
+%endmacro
+
+; Macro for a public C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+%imacro cpublic 1
+%ifdef __NOU_VAR__
+global %1
+%1:
+%else
+global _%1
+_%1:
+%define %1 _%1
+%endif
+%endmacro
+
+; Macro for an global C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+%imacro cglobal 1
+%ifdef __NOU_VAR__
+global %1
+%else
+global _%1
+%define %1 _%1
+%endif
+%endmacro
+
+; Macro for an global C function symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+%imacro cglobalfunc 1
+%ifdef __PIC__
+global %1:function
+%else
+%ifdef __NOU__
+global %1
+%else
+global _%1
+%define %1 _%1
+%endif
+%endif
+%endmacro
+
+; Macro to start a C callable function. This will be a far function for
+; 16-bit code, and a near function for 32-bit code.
+
+%imacro cprocstatic 1
+%push cproc
+%1:
+%ifdef flatmodel
+%stacksize flat
+%define ret retn
+%else
+%stacksize large
+%define ret retf
+%endif
+%assign %$localsize 0
+%endmacro
+
+%imacro cprocstart 1
+%push cproc
+ cglobalfunc %1
+%1:
+%ifdef flatmodel
+%stacksize flat
+%define ret retn
+%else
+%stacksize large
+%define ret retf
+%endif
+%assign %$localsize 0
+%endmacro
+
+; This macro sets up a procedure to be exported from a 16 bit DLL. Since the
+; calling conventions are always _far _pascal for 16 bit DLL's, we actually
+; rename this routine with an extra underscore with 'C' calling conventions
+; and a small DLL stub will be provided by the high level code to call the
+; assembler routine.
+
+%imacro cprocstartdll16 1
+%ifdef __WINDOWS16__
+cprocstart _%1
+%else
+cprocstart %1
+%endif
+%endmacro
+
+; Macro to start a C callable near function.
+
+%imacro cprocnear 1
+%push cproc
+ cglobalfunc %1
+%1:
+%define ret retn
+%ifdef flatmodel
+%stacksize flat
+%else
+%stacksize small
+%endif
+%assign %$localsize 0
+%endmacro
+
+; Macro to start a C callable far function.
+
+%imacro cprocfar 1
+%push cproc
+ cglobalfunc %1
+%1:
+%define ret retf
+%ifdef flatmodel
+%stacksize flat
+%else
+%stacksize large
+%endif
+%assign %$localsize 0
+%endmacro
+
+; Macro to end a C function
+
+%imacro cprocend 0
+%pop
+%endmacro
+
+; Macros for entering and exiting C callable functions. Note that we must
+; always save and restore the SI and DI registers for C functions, and for
+; 32 bit C functions we also need to save and restore EBX and clear the
+; direction flag.
+
+%imacro enter_c 0
+ push _bp
+ mov _bp,_sp
+%ifnidn %$localsize,0
+ sub _sp,%$localsize
+%endif
+%ifdef flatmodel
+ push ebx
+%endif
+ push _si
+ push _di
+%endmacro
+
+%imacro leave_c 0
+ pop _di
+ pop _si
+%ifdef flatmodel
+ pop ebx
+ cld
+%endif
+%ifnidn %$localsize,0
+ mov _sp,_bp
+%endif
+ pop _bp
+%endmacro
+
+%imacro use_ebx 0
+%ifdef flatmodel
+ push ebx
+%endif
+%endmacro
+
+%imacro unuse_ebx 0
+%ifdef flatmodel
+ pop ebx
+%endif
+%endmacro
+
+; Macros for saving and restoring the value of DS,ES,FS,GS when it is to
+; be used in assembly routines. This evaluates to nothing in the flat memory
+; model, but is saves and restores DS in the large memory model.
+
+%imacro use_ds 0
+%ifndef flatmodel
+ push ds
+%endif
+%endmacro
+
+%imacro unuse_ds 0
+%ifndef flatmodel
+ pop ds
+%endif
+%endmacro
+
+%imacro use_es 0
+%ifndef flatmodel
+ push es
+%endif
+%endmacro
+
+%imacro unuse_es 0
+%ifndef flatmodel
+ pop es
+%endif
+%endmacro
+
+; Macros for loading the address of a data pointer into a segment and
+; index register pair. The %imacro explicitly loads DS or ES in the 16 bit
+; memory model, or it simply loads the offset into the register in the flat
+; memory model since DS and ES always point to all addressable memory. You
+; must use the correct _REG (ie: _BX) %imacros for documentation purposes.
+
+%imacro _lds 2
+%ifdef flatmodel
+ mov %1,%2
+%else
+ lds %1,%2
+%endif
+%endmacro
+
+%imacro _les 2
+%ifdef flatmodel
+ mov %1,%2
+%else
+ les %1,%2
+%endif
+%endmacro
+
+; Macros for adding and subtracting a value from registers. Two value are
+; provided, one for 16 bit modes and another for 32 bit modes (the extended
+; register is used in 32 bit modes).
+
+%imacro _add 3
+%ifdef flatmodel
+ add e%1, %3
+%else
+ add %1, %2
+%endif
+%endmacro
+
+%imacro _sub 3
+%ifdef flatmodel
+ sub e%1, %3
+%else
+ sub %1, %2
+%endif
+%endmacro
+
+; Macro to clear the high order word for the 32 bit extended registers.
+; This is used to convert an unsigned 16 bit value to an unsigned 32 bit
+; value, and will evaluate to nothing in 16 bit modes.
+
+%imacro clrhi 1
+%ifdef flatmodel
+ movzx e%1,%1
+%endif
+%endmacro
+
+%imacro sgnhi 1
+%ifdef flatmodel
+ movsx e%1,%1
+%endif
+%endmacro
+
+; Macro to load an extended register with an integer value in either mode
+
+%imacro loadint 2
+%ifdef flatmodel
+ mov e%1,%2
+%else
+ xor e%1,e%1
+ mov %1,%2
+%endif
+%endmacro
+
+; Macros to load and store integer values with string instructions
+
+%imacro LODSINT 0
+%ifdef flatmodel
+ lodsd
+%else
+ lodsw
+%endif
+%endmacro
+
+%imacro STOSINT 0
+%ifdef flatmodel
+ stosd
+%else
+ stosw
+%endif
+%endmacro
+
+; Macros to provide resb, resw, resd compatibility with NASM
+
+%imacro dclb 1
+times %1 db 0
+%endmacro
+
+%imacro dclw 1
+times %1 dw 0
+%endmacro
+
+%imacro dcld 1
+times %1 dd 0
+%endmacro
+
+; Macro to get the addres of the GOT for Linux/FreeBSD shared
+; libraries into the EBX register.
+
+%imacro get_GOT 1
+ call %%getgot
+%%getgot: pop %1
+ add %1,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc
+%endmacro
+
+; Macro to get the address of a *local* variable that is global to
+; a single module in a manner that will work correctly when compiled
+; into a Linux shared library. Note that this will *not* work for
+; variables that are defined as global to all modules. For that
+; use the LEA_G macro
+
+%macro LEA_L 2
+%ifdef __PIC__
+ get_GOT %1
+ lea %1,[%1+%2 wrt ..gotoff]
+%else
+ lea %1,[%2]
+%endif
+%endmacro
+
+; Same macro as above but for global variables public to *all*
+; modules.
+
+%macro LEA_G 2
+%ifdef __PIC__
+ get_GOT %1
+ mov %1,[%1+%2 wrt ..got]
+%else
+ lea %1,[%2]
+%endif
+%endmacro
+
+; macros to declare assembler function stubs for function structures
+
+%imacro BEGIN_STUBS_DEF 2
+begdataseg _STUBS
+%ifdef __NOU_VAR__
+extern %1
+%define STUBS_START %1
+%else
+extern _%1
+%define STUBS_START _%1
+%endif
+enddataseg _STUBS
+begcodeseg _STUBS
+%assign off %2
+%endmacro
+
+%imacro DECLARE_STUB 1
+%ifdef __PIC__
+ global %1:function
+%1:
+ get_GOT eax
+ mov eax,[eax+STUBS_START wrt ..got]
+ jmp [eax+off]
+%else
+%ifdef __NOU__
+ global %1
+%1:
+%else
+ global _%1
+_%1:
+%endif
+ jmp [DWORD STUBS_START+off]
+%endif
+%assign off off+4
+%endmacro
+
+%imacro SKIP_STUB 1
+%assign off off+4
+%endmacro
+
+%imacro DECLARE_STDCALL 2
+%ifdef STDCALL_MANGLE
+ global _%1@%2
+_%1@%2:
+%else
+%ifdef STDCALL_USCORE
+ global _%1
+_%1:
+%else
+ global %1
+%1:
+%endif
+%endif
+ jmp [DWORD STUBS_START+off]
+%assign off off+4
+%endmacro
+
+%imacro END_STUBS_DEF 0
+endcodeseg _STUBS
+%endmacro
+
+; macros to declare assembler import stubs for binary loadable drivers
+
+%imacro BEGIN_IMPORTS_DEF 1
+BEGIN_STUBS_DEF %1,4
+%endmacro
+
+%imacro DECLARE_IMP 2
+DECLARE_STUB %1
+%endmacro
+
+%imacro SKIP_IMP 2
+SKIP_STUB %1
+%endmacro
+
+%imacro SKIP_IMP2 1
+DECLARE_STUB %1
+%endmacro
+
+%imacro SKIP_IMP3 1
+SKIP_STUB %1
+%endmacro
+
+%imacro END_IMPORTS_DEF 0
+END_STUBS_DEF
+%endmacro
+
+else ; __NASM_MAJOR__
+
+;============================================================================
+; Macro package when compiling with TASM.
+;============================================================================
+
+; Turn off underscores for globals if disabled for all externals
+
+ifdef __NOU__
+__NOU_VAR__ = 1
+endif
+
+; Define the __WINDOWS__ symbol if we are compiling for any Windows
+; environment
+
+ifdef __WINDOWS16__
+__WINDOWS__ = 1
+endif
+ifdef __WINDOWS32__
+__WINDOWS__ = 1
+__WINDOWS32_386__ = 1
+endif
+ifdef __WIN386__
+__WINDOWS__ = 1
+__WINDOWS32_386__ = 1
+endif
+ifdef __VXD__
+__WINDOWS__ = 1
+__WINDOWS32_386__ = 1
+ MASM
+ .386
+ NO_SEGMENTS = 1
+ include vmm.inc ; IGNORE DEPEND
+ include vsegment.inc ; IGNORE DEPEND
+ IDEAL
+endif
+
+; Macros for accessing 'generic' registers
+
+ifdef __FLAT__
+ _ax EQU eax ; EAX is used for accumulator
+ _bx EQU ebx ; EBX is used for accumulator
+ _cx EQU ecx ; ECX is used for looping
+ _dx EQU edx ; EDX is used for data register
+ _si EQU esi ; ESI is the source index register
+ _di EQU edi ; EDI is the destination index register
+ _bp EQU ebp ; EBP is used for base pointer register
+ _sp EQU esp ; ESP is used for stack pointer register
+ _es EQU ; ES and DS are the same in 32 bit PM
+ typedef UCHAR BYTE ; Size of a character
+ typedef USHORT WORD ; Size of a short
+ typedef UINT DWORD ; Size of an integer
+ typedef ULONG DWORD ; Size of a long
+ typedef BOOL DWORD ; Size of a boolean
+ typedef DPTR DWORD ; Size of a data pointer
+ typedef FDPTR FWORD ; Size of a far data pointer
+ typedef NDPTR DWORD ; Size of a near data pointer
+ typedef CPTR DWORD ; Size of a code pointer
+ typedef FCPTR FWORD ; Size of a far code pointer
+ typedef NCPTR DWORD ; Size of a near code pointer
+ typedef DUINT DWORD ; Declare a integer variable
+ FPTR EQU NEAR ; Distance for function pointers
+ intsize = 4 ; Size of an integer
+ flatmodel = 1 ; This is a flat memory model
+ P386 ; Turn on 386 code generation
+ MODEL FLAT ; Set up for 32 bit simplified FLAT model
+else
+ _ax EQU ax ; AX is used for accumulator
+ _bx EQU bx ; BX is used for accumulator
+ _cx EQU cx ; CX is used for looping
+ _dx EQU dx ; DX is used for data register
+ _si EQU si ; SI is the source index register
+ _di EQU di ; DI is the destination index register
+ _bp EQU bp ; BP is used for base pointer register
+ _sp EQU sp ; SP is used for stack pointer register
+ _es EQU es: ; ES is used for segment override
+ typedef UCHAR BYTE ; Size of a character
+ typedef USHORT WORD ; Size of a short
+ typedef UINT WORD ; Size of an integer
+ typedef ULONG DWORD ; Size of a long
+ typedef BOOL WORD ; Size of a boolean
+ typedef DPTR DWORD ; Size of a data pointer
+ typedef FDPTR DWORD ; Size of a far data pointer
+ typedef NDPTR WORD ; Size of a near data pointer
+ typedef CPTR DWORD ; Size of a code pointer
+ typedef FCPTR DWORD ; Size of a far code pointer
+ typedef NCPTR WORD ; Size of a near code pointer
+ typedef DUINT WORD ; Declare a integer variable
+ FPTR EQU FAR ; Distance for function pointers
+ intsize = 2 ; Size of an integer
+ P386 ; Turn on 386 code generation
+endif
+ invert EQU not
+
+; Provide a typedef for real floating point numbers
+
+ifdef DOUBLE
+typedef REAL QWORD
+typedef DREAL QWORD
+else
+typedef REAL DWORD
+typedef DREAL DWORD
+endif
+
+; Macros to access the floating point stack registers to convert them
+; from NASM style to TASM style
+
+st0 EQU st(0)
+st1 EQU st(1)
+st2 EQU st(2)
+st3 EQU st(3)
+st4 EQU st(4)
+st5 EQU st(5)
+st6 EQU st(6)
+st7 EQU st(7)
+st8 EQU st(8)
+
+; Boolean truth values (same as those in debug.h)
+
+ifndef __VXD__
+False = 0
+True = 1
+No = 0
+Yes = 1
+Yes = 1
+endif
+
+; Macros for the _DATA data segment. This segment contains initialised data.
+
+MACRO begdataseg name
+ifdef __VXD__
+ MASM
+VXD_LOCKED_DATA_SEG
+ IDEAL
+else
+ifdef flatmodel
+ DATASEG
+else
+SEGMENT _DATA DWORD PUBLIC USE16 'DATA'
+endif
+endif
+ENDM
+
+MACRO enddataseg name
+ifdef __VXD__
+ MASM
+VXD_LOCKED_DATA_ENDS
+ IDEAL
+else
+ifndef flatmodel
+ENDS _DATA
+endif
+endif
+ENDM
+
+; Macro for the main code segment.
+
+MACRO begcodeseg name
+ifdef __VXD__
+ MASM
+VXD_LOCKED_CODE_SEG
+ IDEAL
+else
+ifdef flatmodel
+ CODESEG
+ ASSUME CS:FLAT,DS:FLAT,SS:FLAT
+else
+SEGMENT &name&_TEXT PARA PUBLIC USE16 'CODE'
+ ASSUME CS:&name&_TEXT,DS:_DATA
+endif
+endif
+ENDM
+
+; Macro for a near code segment
+
+MACRO begcodeseg_near
+ifdef flatmodel
+ CODESEG
+ ASSUME CS:FLAT,DS:FLAT,SS:FLAT
+else
+SEGMENT _TEXT PARA PUBLIC USE16 'CODE'
+ ASSUME CS:_TEXT,DS:_DATA
+endif
+ENDM
+
+MACRO endcodeseg name
+ifdef __VXD__
+ MASM
+VXD_LOCKED_CODE_ENDS
+ IDEAL
+else
+ifndef flatmodel
+ENDS &name&_TEXT
+endif
+endif
+ENDM
+
+MACRO endcodeseg_near
+ifndef flatmodel
+ENDS _TEXT
+endif
+ENDM
+
+; Macro to be invoked at the start of all modules to set up segments for
+; later use.
+
+MACRO header name
+begdataseg name
+enddataseg name
+ENDM
+
+; Macro for an extern C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+MACRO cextern name,size
+ifdef __NOU_VAR__
+ EXTRN name:size
+else
+ EXTRN _&name&:size
+name EQU _&name&
+endif
+ENDM
+
+MACRO cexternfunc name,size
+ifdef __NOU__
+ EXTRN name:size
+else
+ EXTRN _&name&:size
+name EQU _&name&
+endif
+ENDM
+
+MACRO stdexternfunc name,num_args,size
+ifdef STDCALL_MANGLE
+ EXTRN _&name&@&num_args&:size
+name EQU _&name&@&num_args
+else
+ EXTRN name:size
+endif
+ENDM
+
+; Macro for a public C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+MACRO cpublic name
+ifdef __NOU_VAR__
+name:
+ PUBLIC name
+else
+_&name&:
+ PUBLIC _&name&
+name EQU _&name&
+endif
+ENDM
+
+; Macro for an global C symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+MACRO cglobal name
+ifdef __NOU_VAR__
+ PUBLIC name
+else
+ PUBLIC _&name&
+name EQU _&name&
+endif
+ENDM
+
+; Macro for an global C function symbol. If the C compiler requires leading
+; underscores, then the underscores are added to the symbol names, otherwise
+; they are left off. The symbol name is referenced in the assembler code
+; using the non-underscored symbol name.
+
+MACRO cglobalfunc name
+ifdef __NOU__
+ PUBLIC name
+else
+ PUBLIC _&name&
+name EQU _&name&
+endif
+ENDM
+
+; Macro to start a C callable function. This will be a far function for
+; 16-bit code, and a near function for 32-bit code.
+
+MACRO cprocstatic name ; Set up model independant private proc
+ifdef flatmodel
+PROC name NEAR
+else
+PROC name FAR
+endif
+LocalSize = 0
+ENDM
+
+MACRO cprocstart name ; Set up model independant proc
+ifdef flatmodel
+ifdef __NOU__
+PROC name NEAR
+else
+PROC _&name& NEAR
+endif
+else
+ifdef __NOU__
+PROC name FAR
+else
+PROC _&name& FAR
+endif
+endif
+LocalSize = 0
+ cglobalfunc name
+ENDM
+
+MACRO cprocnear name ; Set up near proc
+ifdef __NOU__
+PROC name NEAR
+else
+PROC _&name& NEAR
+endif
+LocalSize = 0
+ cglobalfunc name
+ENDM
+
+MACRO cprocfar name ; Set up far proc
+ifdef __NOU__
+PROC name FAR
+else
+PROC _&name& FAR
+endif
+LocalSize = 0
+ cglobalfunc name
+ENDM
+
+MACRO cprocend ; End procedure macro
+ENDP
+ENDM
+
+; This macro sets up a procedure to be exported from a 16 bit DLL. Since the
+; calling conventions are always _far _pascal for 16 bit DLL's, we actually
+; rename this routine with an extra underscore with 'C' calling conventions
+; and a small DLL stub will be provided by the high level code to call the
+; assembler routine.
+
+MACRO cprocstartdll16 name
+ifdef __WINDOWS16__
+cprocstart _&name&
+else
+cprocstart name
+endif
+ENDM
+
+; Macros for entering and exiting C callable functions. Note that we must
+; always save and restore the SI and DI registers for C functions, and for
+; 32 bit C functions we also need to save and restore EBX and clear the
+; direction flag.
+
+MACRO save_c_regs
+ifdef flatmodel
+ push ebx
+endif
+ push _si
+ push _di
+ENDM
+
+MACRO enter_c
+ push _bp
+ mov _bp,_sp
+ IFDIFI <LocalSize>,<0>
+ sub _sp,LocalSize
+ ENDIF
+ save_c_regs
+ENDM
+
+MACRO restore_c_regs
+ pop _di
+ pop _si
+ifdef flatmodel
+ pop ebx
+endif
+ENDM
+
+MACRO leave_c
+ restore_c_regs
+ cld
+ IFDIFI <LocalSize>,<0>
+ mov _sp,_bp
+ ENDIF
+ pop _bp
+ENDM
+
+MACRO use_ebx
+ifdef flatmodel
+ push ebx
+endif
+ENDM
+
+MACRO unuse_ebx
+ifdef flatmodel
+ pop ebx
+endif
+ENDM
+
+; Macros for saving and restoring the value of DS,ES,FS,GS when it is to
+; be used in assembly routines. This evaluates to nothing in the flat memory
+; model, but is saves and restores DS in the large memory model.
+
+MACRO use_ds
+ifndef flatmodel
+ push ds
+endif
+ENDM
+
+MACRO unuse_ds
+ifndef flatmodel
+ pop ds
+endif
+ENDM
+
+MACRO use_es
+ifndef flatmodel
+ push es
+endif
+ENDM
+
+MACRO unuse_es
+ifndef flatmodel
+ pop es
+endif
+ENDM
+
+; Macros for loading the address of a data pointer into a segment and
+; index register pair. The macro explicitly loads DS or ES in the 16 bit
+; memory model, or it simply loads the offset into the register in the flat
+; memory model since DS and ES always point to all addressable memory. You
+; must use the correct _REG (ie: _BX) macros for documentation purposes.
+
+MACRO _lds reg, addr
+ifdef flatmodel
+ mov reg,addr
+else
+ lds reg,addr
+endif
+ENDM
+
+MACRO _les reg, addr
+ifdef flatmodel
+ mov reg,addr
+else
+ les reg,addr
+endif
+ENDM
+
+; Macros for adding and subtracting a value from registers. Two value are
+; provided, one for 16 bit modes and another for 32 bit modes (the extended
+; register is used in 32 bit modes).
+
+MACRO _add reg, val16, val32
+ifdef flatmodel
+ add e&reg&, val32
+else
+ add reg, val16
+endif
+ENDM
+
+MACRO _sub reg, val16, val32
+ifdef flatmodel
+ sub e&reg&, val32
+else
+ sub reg, val16
+endif
+ENDM
+
+; Macro to clear the high order word for the 32 bit extended registers.
+; This is used to convert an unsigned 16 bit value to an unsigned 32 bit
+; value, and will evaluate to nothing in 16 bit modes.
+
+MACRO clrhi reg
+ifdef flatmodel
+ movzx e&reg&,reg
+endif
+ENDM
+
+MACRO sgnhi reg
+ifdef flatmodel
+ movsx e&reg&,reg
+endif
+ENDM
+
+; Macro to load an extended register with an integer value in either mode
+
+MACRO loadint reg,val
+ifdef flatmodel
+ mov e&reg&,val
+else
+ xor e&reg&,e&reg&
+ mov reg,val
+endif
+ENDM
+
+; Macros to load and store integer values with string instructions
+
+MACRO LODSINT
+ifdef flatmodel
+ lodsd
+else
+ lodsw
+endif
+ENDM
+
+MACRO STOSINT
+ifdef flatmodel
+ stosd
+else
+ stosw
+endif
+ENDM
+
+; Macros to provide resb, resw, resd compatibility with NASM
+
+MACRO dclb count
+db count dup (0)
+ENDM
+
+MACRO dclw count
+dw count dup (0)
+ENDM
+
+MACRO dcld count
+dd count dup (0)
+ENDM
+
+; Macros to provide resb, resw, resd compatibility with NASM
+
+MACRO resb count
+db count dup (?)
+ENDM
+
+MACRO resw count
+dw count dup (?)
+ENDM
+
+MACRO resd count
+dd count dup (?)
+ENDM
+
+; Macros to declare assembler stubs for function structures
+
+MACRO BEGIN_STUBS_DEF name, firstOffset
+begdataseg _STUBS
+ifdef __NOU_VAR__
+ EXTRN name:DWORD
+STUBS_START = name
+else
+ EXTRN _&name&:DWORD
+name EQU _&name&
+STUBS_START = _&name
+endif
+enddataseg _STUBS
+begcodeseg _STUBS
+off = firstOffset
+ENDM
+
+MACRO DECLARE_STUB name
+ifdef __NOU__
+name:
+ PUBLIC name
+else
+_&name:
+ PUBLIC _&name
+endif
+ jmp [DWORD STUBS_START+off]
+off = off + 4
+ENDM
+
+MACRO SKIP_STUB name
+off = off + 4
+ENDM
+
+MACRO DECLARE_STDCALL name,num_args
+ifdef STDCALL_MANGLE
+_&name&@&num_args&:
+ PUBLIC _&name&@&num_args&
+else
+name:
+ PUBLIC name
+endif
+ jmp [DWORD STUBS_START+off]
+off = off + 4
+ENDM
+
+MACRO END_STUBS_DEF
+endcodeseg _STUBS
+ENDM
+
+MACRO BEGIN_IMPORTS_DEF name
+BEGIN_STUBS_DEF name,4
+ENDM
+
+ifndef LOCAL_DECLARE_IMP
+MACRO DECLARE_IMP name, numArgs
+DECLARE_STUB name
+ENDM
+
+MACRO SKIP_IMP name
+SKIP_STUB name
+ENDM
+
+MACRO SKIP_IMP2 name, numArgs
+DECLARE_STUB name
+ENDM
+
+MACRO SKIP_IMP3 name
+SKIP_STUB name
+ENDM
+endif
+
+MACRO END_IMPORTS_DEF
+END_STUBS_DEF
+ENDM
+
+MACRO LEA_L reg,name
+ lea reg,[name]
+ENDM
+
+MACRO LEA_G reg,name
+ lea reg,[name]
+ENDM
+
+endif
+
diff --git a/board/MAI/bios_emulator/scitech/include/x86emu.h b/board/MAI/bios_emulator/scitech/include/x86emu.h
new file mode 100644
index 0000000000..1d87d4e57f
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/x86emu.h
@@ -0,0 +1,194 @@
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for public specific functions.
+* Any application linking against us should only
+* include this header
+*
+****************************************************************************/
+
+#ifndef __X86EMU_X86EMU_H
+#define __X86EMU_X86EMU_H
+
+#ifdef SCITECH
+#include "scitech.h"
+#define X86API _ASMAPI
+#define X86APIP _ASMAPIP
+typedef int X86EMU_pioAddr;
+#else
+#include "x86emu/types.h"
+#define X86API
+#define X86APIP *
+#endif
+#include "x86emu/regs.h"
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+#pragma pack(1)
+
+/****************************************************************************
+REMARKS:
+Data structure containing ponters to programmed I/O functions used by the
+emulator. This is used so that the user program can hook all programmed
+I/O for the emulator to handled as necessary by the user program. By
+default the emulator contains simple functions that do not do access the
+hardware in any way. To allow the emualtor access the hardware, you will
+need to override the programmed I/O functions using the X86EMU_setupPioFuncs
+function.
+
+HEADER:
+x86emu.h
+
+MEMBERS:
+inb - Function to read a byte from an I/O port
+inw - Function to read a word from an I/O port
+inl - Function to read a dword from an I/O port
+outb - Function to write a byte to an I/O port
+outw - Function to write a word to an I/O port
+outl - Function to write a dword to an I/O port
+****************************************************************************/
+typedef struct {
+ u8 (X86APIP inb)(X86EMU_pioAddr addr);
+ u16 (X86APIP inw)(X86EMU_pioAddr addr);
+ u32 (X86APIP inl)(X86EMU_pioAddr addr);
+ void (X86APIP outb)(X86EMU_pioAddr addr, u8 val);
+ void (X86APIP outw)(X86EMU_pioAddr addr, u16 val);
+ void (X86APIP outl)(X86EMU_pioAddr addr, u32 val);
+ } X86EMU_pioFuncs;
+
+/****************************************************************************
+REMARKS:
+Data structure containing ponters to memory access functions used by the
+emulator. This is used so that the user program can hook all memory
+access functions as necessary for the emulator. By default the emulator
+contains simple functions that only access the internal memory of the
+emulator. If you need specialised functions to handle access to different
+types of memory (ie: hardware framebuffer accesses and BIOS memory access
+etc), you will need to override this using the X86EMU_setupMemFuncs
+function.
+
+HEADER:
+x86emu.h
+
+MEMBERS:
+rdb - Function to read a byte from an address
+rdw - Function to read a word from an address
+rdl - Function to read a dword from an address
+wrb - Function to write a byte to an address
+wrw - Function to write a word to an address
+wrl - Function to write a dword to an address
+****************************************************************************/
+typedef struct {
+ u8 (X86APIP rdb)(u32 addr);
+ u16 (X86APIP rdw)(u32 addr);
+ u32 (X86APIP rdl)(u32 addr);
+ void (X86APIP wrb)(u32 addr, u8 val);
+ void (X86APIP wrw)(u32 addr, u16 val);
+ void (X86APIP wrl)(u32 addr, u32 val);
+ } X86EMU_memFuncs;
+
+/****************************************************************************
+ Here are the default memory read and write
+ function in case they are needed as fallbacks.
+***************************************************************************/
+extern u8 X86API rdb(u32 addr);
+extern u16 X86API rdw(u32 addr);
+extern u32 X86API rdl(u32 addr);
+extern void X86API wrb(u32 addr, u8 val);
+extern void X86API wrw(u32 addr, u16 val);
+extern void X86API wrl(u32 addr, u32 val);
+
+#pragma pack()
+
+/*--------------------- type definitions -----------------------------------*/
+
+typedef void (X86APIP X86EMU_intrFuncs)(int num);
+extern X86EMU_intrFuncs _X86EMU_intrTab[256];
+
+/*-------------------------- Function Prototypes --------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+void X86EMU_setupMemFuncs(X86EMU_memFuncs *funcs);
+void X86EMU_setupPioFuncs(X86EMU_pioFuncs *funcs);
+void X86EMU_setupIntrFuncs(X86EMU_intrFuncs funcs[]);
+void X86EMU_prepareForInt(int num);
+
+/* decode.c */
+
+void X86EMU_exec(void);
+void X86EMU_halt_sys(void);
+
+#ifdef DEBUG
+#define HALT_SYS() \
+ printk("halt_sys: file %s, line %d\n", __FILE__, __LINE__), \
+ X86EMU_halt_sys()
+#else
+#define HALT_SYS() X86EMU_halt_sys()
+#endif
+
+/* Debug options */
+
+#define DEBUG_DECODE_F 0x0001 /* print decoded instruction */
+#define DEBUG_TRACE_F 0x0002 /* dump regs before/after execution */
+#define DEBUG_STEP_F 0x0004
+#define DEBUG_DISASSEMBLE_F 0x0008
+#define DEBUG_BREAK_F 0x0010
+#define DEBUG_SVC_F 0x0020
+#define DEBUG_SAVE_CS_IP 0x0040
+#define DEBUG_FS_F 0x0080
+#define DEBUG_PROC_F 0x0100
+#define DEBUG_SYSINT_F 0x0200 /* bios system interrupts. */
+#define DEBUG_TRACECALL_F 0x0400
+#define DEBUG_INSTRUMENT_F 0x0800
+#define DEBUG_MEM_TRACE_F 0x1000
+#define DEBUG_IO_TRACE_F 0x2000
+#define DEBUG_TRACECALL_REGS_F 0x4000
+#define DEBUG_DECODE_NOPRINT_F 0x8000
+#define DEBUG_EXIT 0x10000
+#define DEBUG_SYS_F (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F)
+
+void X86EMU_trace_regs(void);
+void X86EMU_trace_xregs(void);
+void X86EMU_dump_memory(u16 seg, u16 off, u32 amt);
+int X86EMU_trace_on(void);
+int X86EMU_trace_off(void);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __X86EMU_X86EMU_H */
diff --git a/board/MAI/bios_emulator/scitech/include/x86emu/fpu_regs.h b/board/MAI/bios_emulator/scitech/include/x86emu/fpu_regs.h
new file mode 100644
index 0000000000..777b03cd71
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/x86emu/fpu_regs.h
@@ -0,0 +1,115 @@
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for FPU register definitions.
+*
+****************************************************************************/
+
+#ifndef __X86EMU_FPU_REGS_H
+#define __X86EMU_FPU_REGS_H
+
+#ifdef X86_FPU_SUPPORT
+
+#pragma pack(1)
+
+/* Basic 8087 register can hold any of the following values: */
+
+union x86_fpu_reg_u {
+ s8 tenbytes[10];
+ double dval;
+ float fval;
+ s16 sval;
+ s32 lval;
+ };
+
+struct x86_fpu_reg {
+ union x86_fpu_reg_u reg;
+ char tag;
+ };
+
+/*
+ * Since we are not going to worry about the problems of aliasing
+ * registers, every time a register is modified, its result type is
+ * set in the tag fields for that register. If some operation
+ * attempts to access the type in a way inconsistent with its current
+ * storage format, then we flag the operation. If common, we'll
+ * attempt the conversion.
+ */
+
+#define X86_FPU_VALID 0x80
+#define X86_FPU_REGTYP(r) ((r) & 0x7F)
+
+#define X86_FPU_WORD 0x0
+#define X86_FPU_SHORT 0x1
+#define X86_FPU_LONG 0x2
+#define X86_FPU_FLOAT 0x3
+#define X86_FPU_DOUBLE 0x4
+#define X86_FPU_LDBL 0x5
+#define X86_FPU_BSD 0x6
+
+#define X86_FPU_STKTOP 0
+
+struct x86_fpu_registers {
+ struct x86_fpu_reg x86_fpu_stack[8];
+ int x86_fpu_flags;
+ int x86_fpu_config; /* rounding modes, etc. */
+ short x86_fpu_tos, x86_fpu_bos;
+ };
+
+#pragma pack()
+
+/*
+ * There are two versions of the following macro.
+ *
+ * One version is for opcode D9, for which there are more than 32
+ * instructions encoded in the second byte of the opcode.
+ *
+ * The other version, deals with all the other 7 i87 opcodes, for
+ * which there are only 32 strings needed to describe the
+ * instructions.
+ */
+
+#endif /* X86_FPU_SUPPORT */
+
+#ifdef DEBUG
+# define DECODE_PRINTINSTR32(t,mod,rh,rl) \
+ DECODE_PRINTF(t[(mod<<3)+(rh)]);
+# define DECODE_PRINTINSTR256(t,mod,rh,rl) \
+ DECODE_PRINTF(t[(mod<<6)+(rh<<3)+(rl)]);
+#else
+# define DECODE_PRINTINSTR32(t,mod,rh,rl)
+# define DECODE_PRINTINSTR256(t,mod,rh,rl)
+#endif
+
+#endif /* __X86EMU_FPU_REGS_H */
diff --git a/board/MAI/bios_emulator/scitech/include/x86emu/regs.h b/board/MAI/bios_emulator/scitech/include/x86emu/regs.h
new file mode 100644
index 0000000000..c6ce88462a
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/x86emu/regs.h
@@ -0,0 +1,331 @@
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for x86 register definitions.
+*
+****************************************************************************/
+
+#ifndef __X86EMU_REGS_H
+#define __X86EMU_REGS_H
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+#pragma pack(1)
+
+/*
+ * General EAX, EBX, ECX, EDX type registers. Note that for
+ * portability, and speed, the issue of byte swapping is not addressed
+ * in the registers. All registers are stored in the default format
+ * available on the host machine. The only critical issue is that the
+ * registers should line up EXACTLY in the same manner as they do in
+ * the 386. That is:
+ *
+ * EAX & 0xff === AL
+ * EAX & 0xffff == AX
+ *
+ * etc. The result is that alot of the calculations can then be
+ * done using the native instruction set fully.
+ */
+
+#ifdef __BIG_ENDIAN__
+
+typedef struct {
+ u32 e_reg;
+ } I32_reg_t;
+
+typedef struct {
+ u16 filler0, x_reg;
+ } I16_reg_t;
+
+typedef struct {
+ u8 filler0, filler1, h_reg, l_reg;
+ } I8_reg_t;
+
+#else /* !__BIG_ENDIAN__ */
+
+typedef struct {
+ u32 e_reg;
+ } I32_reg_t;
+
+typedef struct {
+ u16 x_reg;
+ } I16_reg_t;
+
+typedef struct {
+ u8 l_reg, h_reg;
+ } I8_reg_t;
+
+#endif /* BIG_ENDIAN */
+
+typedef union {
+ I32_reg_t I32_reg;
+ I16_reg_t I16_reg;
+ I8_reg_t I8_reg;
+ } i386_general_register;
+
+struct i386_general_regs {
+ i386_general_register A, B, C, D;
+ };
+
+typedef struct i386_general_regs Gen_reg_t;
+
+struct i386_special_regs {
+ i386_general_register SP, BP, SI, DI, IP;
+ u32 FLAGS;
+ };
+
+/*
+ * Segment registers here represent the 16 bit quantities
+ * CS, DS, ES, SS.
+ */
+
+struct i386_segment_regs {
+ u16 CS, DS, SS, ES, FS, GS;
+ };
+
+/* 8 bit registers */
+#define R_AH gen.A.I8_reg.h_reg
+#define R_AL gen.A.I8_reg.l_reg
+#define R_BH gen.B.I8_reg.h_reg
+#define R_BL gen.B.I8_reg.l_reg
+#define R_CH gen.C.I8_reg.h_reg
+#define R_CL gen.C.I8_reg.l_reg
+#define R_DH gen.D.I8_reg.h_reg
+#define R_DL gen.D.I8_reg.l_reg
+
+/* 16 bit registers */
+#define R_AX gen.A.I16_reg.x_reg
+#define R_BX gen.B.I16_reg.x_reg
+#define R_CX gen.C.I16_reg.x_reg
+#define R_DX gen.D.I16_reg.x_reg
+
+/* 32 bit extended registers */
+#define R_EAX gen.A.I32_reg.e_reg
+#define R_EBX gen.B.I32_reg.e_reg
+#define R_ECX gen.C.I32_reg.e_reg
+#define R_EDX gen.D.I32_reg.e_reg
+
+/* special registers */
+#define R_SP spc.SP.I16_reg.x_reg
+#define R_BP spc.BP.I16_reg.x_reg
+#define R_SI spc.SI.I16_reg.x_reg
+#define R_DI spc.DI.I16_reg.x_reg
+#define R_IP spc.IP.I16_reg.x_reg
+#define R_FLG spc.FLAGS
+
+/* special registers */
+#define R_SP spc.SP.I16_reg.x_reg
+#define R_BP spc.BP.I16_reg.x_reg
+#define R_SI spc.SI.I16_reg.x_reg
+#define R_DI spc.DI.I16_reg.x_reg
+#define R_IP spc.IP.I16_reg.x_reg
+#define R_FLG spc.FLAGS
+
+/* special registers */
+#define R_ESP spc.SP.I32_reg.e_reg
+#define R_EBP spc.BP.I32_reg.e_reg
+#define R_ESI spc.SI.I32_reg.e_reg
+#define R_EDI spc.DI.I32_reg.e_reg
+#define R_EIP spc.IP.I32_reg.e_reg
+#define R_EFLG spc.FLAGS
+
+/* segment registers */
+#define R_CS seg.CS
+#define R_DS seg.DS
+#define R_SS seg.SS
+#define R_ES seg.ES
+#define R_FS seg.FS
+#define R_GS seg.GS
+
+/* flag conditions */
+#define FB_CF 0x0001 /* CARRY flag */
+#define FB_PF 0x0004 /* PARITY flag */
+#define FB_AF 0x0010 /* AUX flag */
+#define FB_ZF 0x0040 /* ZERO flag */
+#define FB_SF 0x0080 /* SIGN flag */
+#define FB_TF 0x0100 /* TRAP flag */
+#define FB_IF 0x0200 /* INTERRUPT ENABLE flag */
+#define FB_DF 0x0400 /* DIR flag */
+#define FB_OF 0x0800 /* OVERFLOW flag */
+
+/* 80286 and above always have bit#1 set */
+#define F_ALWAYS_ON (0x0002) /* flag bits always on */
+
+/*
+ * Define a mask for only those flag bits we will ever pass back
+ * (via PUSHF)
+ */
+#define F_MSK (FB_CF|FB_PF|FB_AF|FB_ZF|FB_SF|FB_TF|FB_IF|FB_DF|FB_OF)
+
+/* following bits masked in to a 16bit quantity */
+
+#define F_CF 0x0001 /* CARRY flag */
+#define F_PF 0x0004 /* PARITY flag */
+#define F_AF 0x0010 /* AUX flag */
+#define F_ZF 0x0040 /* ZERO flag */
+#define F_SF 0x0080 /* SIGN flag */
+#define F_TF 0x0100 /* TRAP flag */
+#define F_IF 0x0200 /* INTERRUPT ENABLE flag */
+#define F_DF 0x0400 /* DIR flag */
+#define F_OF 0x0800 /* OVERFLOW flag */
+
+#define TOGGLE_FLAG(flag) (M.x86.R_FLG ^= (flag))
+#define SET_FLAG(flag) (M.x86.R_FLG |= (flag))
+#define CLEAR_FLAG(flag) (M.x86.R_FLG &= ~(flag))
+#define ACCESS_FLAG(flag) (M.x86.R_FLG & (flag))
+#define CLEARALL_FLAG(m) (M.x86.R_FLG = 0)
+
+#define CONDITIONAL_SET_FLAG(COND,FLAG) \
+ if (COND) SET_FLAG(FLAG); else CLEAR_FLAG(FLAG)
+
+#define F_PF_CALC 0x010000 /* PARITY flag has been calced */
+#define F_ZF_CALC 0x020000 /* ZERO flag has been calced */
+#define F_SF_CALC 0x040000 /* SIGN flag has been calced */
+
+#define F_ALL_CALC 0xff0000 /* All have been calced */
+
+/*
+ * Emulator machine state.
+ * Segment usage control.
+ */
+#define SYSMODE_SEG_DS_SS 0x00000001
+#define SYSMODE_SEGOVR_CS 0x00000002
+#define SYSMODE_SEGOVR_DS 0x00000004
+#define SYSMODE_SEGOVR_ES 0x00000008
+#define SYSMODE_SEGOVR_FS 0x00000010
+#define SYSMODE_SEGOVR_GS 0x00000020
+#define SYSMODE_SEGOVR_SS 0x00000040
+#define SYSMODE_PREFIX_REPE 0x00000080
+#define SYSMODE_PREFIX_REPNE 0x00000100
+#define SYSMODE_PREFIX_DATA 0x00000200
+#define SYSMODE_PREFIX_ADDR 0x00000400
+#define SYSMODE_INTR_PENDING 0x10000000
+#define SYSMODE_EXTRN_INTR 0x20000000
+#define SYSMODE_HALTED 0x40000000
+
+#define SYSMODE_SEGMASK (SYSMODE_SEG_DS_SS | \
+ SYSMODE_SEGOVR_CS | \
+ SYSMODE_SEGOVR_DS | \
+ SYSMODE_SEGOVR_ES | \
+ SYSMODE_SEGOVR_FS | \
+ SYSMODE_SEGOVR_GS | \
+ SYSMODE_SEGOVR_SS)
+#define SYSMODE_CLRMASK (SYSMODE_SEG_DS_SS | \
+ SYSMODE_SEGOVR_CS | \
+ SYSMODE_SEGOVR_DS | \
+ SYSMODE_SEGOVR_ES | \
+ SYSMODE_SEGOVR_FS | \
+ SYSMODE_SEGOVR_GS | \
+ SYSMODE_SEGOVR_SS | \
+ SYSMODE_PREFIX_DATA | \
+ SYSMODE_PREFIX_ADDR)
+
+#define INTR_SYNCH 0x1
+#define INTR_ASYNCH 0x2
+#define INTR_HALTED 0x4
+
+typedef struct {
+ struct i386_general_regs gen;
+ struct i386_special_regs spc;
+ struct i386_segment_regs seg;
+ /*
+ * MODE contains information on:
+ * REPE prefix 2 bits repe,repne
+ * SEGMENT overrides 5 bits normal,DS,SS,CS,ES
+ * Delayed flag set 3 bits (zero, signed, parity)
+ * reserved 6 bits
+ * interrupt # 8 bits instruction raised interrupt
+ * BIOS video segregs 4 bits
+ * Interrupt Pending 1 bits
+ * Extern interrupt 1 bits
+ * Halted 1 bits
+ */
+ long mode;
+ u8 intno;
+ volatile int intr; /* mask of pending interrupts */
+ int debug;
+#ifdef DEBUG
+ int check;
+ u16 saved_ip;
+ u16 saved_cs;
+ int enc_pos;
+ int enc_str_pos;
+ char decode_buf[32]; /* encoded byte stream */
+ char decoded_buf[256]; /* disassembled strings */
+#endif
+ } X86EMU_regs;
+
+/****************************************************************************
+REMARKS:
+Structure maintaining the emulator machine state.
+
+MEMBERS:
+x86 - X86 registers
+mem_base - Base real mode memory for the emulator
+mem_size - Size of the real mode memory block for the emulator
+****************************************************************************/
+typedef struct {
+ X86EMU_regs x86;
+ unsigned long mem_base;
+ unsigned long mem_size;
+ void* private;
+ } X86EMU_sysEnv;
+
+#pragma pack()
+
+/*----------------------------- Global Variables --------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+/* Global emulator machine state.
+ *
+ * We keep it global to avoid pointer dereferences in the code for speed.
+ */
+
+extern X86EMU_sysEnv _X86EMU_env;
+#define M _X86EMU_env
+
+/*-------------------------- Function Prototypes --------------------------*/
+
+/* Function to log information at runtime */
+
+//void printk(const char *fmt, ...);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __X86EMU_REGS_H */
diff --git a/board/MAI/bios_emulator/scitech/include/x86emu/types.h b/board/MAI/bios_emulator/scitech/include/x86emu/types.h
new file mode 100644
index 0000000000..0a17c547ee
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/include/x86emu/types.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for x86 emulator type definitions.
+*
+****************************************************************************/
+
+#ifndef __X86EMU_TYPES_H
+#define __X86EMU_TYPES_H
+
+#include <sys/types.h>
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+/* Currently only for Linux/32bit */
+#if defined(__GNUC__) && !defined(NO_LONG_LONG)
+#define __HAS_LONG_LONG__
+#endif
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+#ifdef __HAS_LONG_LONG__
+typedef unsigned long long u64;
+#endif
+
+typedef char s8;
+typedef short s16;
+typedef long s32;
+#ifdef __HAS_LONG_LONG__
+typedef long long s64;
+#endif
+
+/*typedef unsigned int uint;*/
+typedef int sint;
+
+typedef u16 X86EMU_pioAddr;
+
+#endif /* __X86EMU_TYPES_H */
OpenPOWER on IntegriCloud