summaryrefslogtreecommitdiffstats
path: root/board/MAI/bios_emulator/scitech/src/pm/ntdrv/int86.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/MAI/bios_emulator/scitech/src/pm/ntdrv/int86.c')
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/ntdrv/int86.c252
1 files changed, 252 insertions, 0 deletions
diff --git a/board/MAI/bios_emulator/scitech/src/pm/ntdrv/int86.c b/board/MAI/bios_emulator/scitech/src/pm/ntdrv/int86.c
new file mode 100644
index 0000000000..f93d9c22e7
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/ntdrv/int86.c
@@ -0,0 +1,252 @@
+/****************************************************************************
+*
+* 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: 32-bit Windows NT device drivers.
+*
+* Description: Implementation for the real mode software interrupt
+* handling functions.
+*
+****************************************************************************/
+
+#include "pmapi.h"
+#include "drvlib/os/os.h"
+#include "sdd/sddhelp.h"
+#include "mtrr.h"
+#include "oshdr.h"
+
+/*----------------------------- Implementation ----------------------------*/
+
+/****************************************************************************
+REMARKS:
+We do have limited BIOS access under Windows NT device drivers.
+****************************************************************************/
+ibool PMAPI PM_haveBIOSAccess(void)
+{
+ // Return false unless we have full buffer passing!
+ return false;
+}
+
+/****************************************************************************
+PARAMETERS:
+len - Place to store the length of the buffer
+rseg - Place to store the real mode segment of the buffer
+roff - Place to store the real mode offset of the buffer
+
+REMARKS:
+This function returns the address and length of the global VESA transfer
+buffer that is used for communicating with the VESA BIOS functions from
+Win16 and Win32 programs under Windows.
+****************************************************************************/
+void * PMAPI PM_getVESABuf(
+ uint *len,
+ uint *rseg,
+ uint *roff)
+{
+ // No buffers supported under Windows NT (Windows XP has them however if
+ // we ever decide to support this!)
+ return NULL;
+}
+
+/****************************************************************************
+REMARKS:
+Issue a protected mode software interrupt.
+****************************************************************************/
+int PMAPI PM_int386(
+ int intno,
+ PMREGS *in,
+ PMREGS *out)
+{
+ PMSREGS sregs;
+ PM_segread(&sregs);
+ return PM_int386x(intno,in,out,&sregs);
+}
+
+/****************************************************************************
+REMARKS:
+Map a real mode pointer to a protected mode pointer.
+****************************************************************************/
+void * PMAPI PM_mapRealPointer(
+ uint r_seg,
+ uint r_off)
+{
+ // Not used for Windows NT drivers!
+ return NULL;
+}
+
+/****************************************************************************
+REMARKS:
+Allocate a block of real mode memory
+****************************************************************************/
+void * PMAPI PM_allocRealSeg(
+ uint size,
+ uint *r_seg,
+ uint *r_off)
+{
+ // Not supported in NT drivers
+ (void)size;
+ (void)r_seg;
+ (void)r_off;
+ return NULL;
+}
+
+/****************************************************************************
+REMARKS:
+Free a block of real mode memory.
+****************************************************************************/
+void PMAPI PM_freeRealSeg(
+ void *mem)
+{
+ // Not supported in NT drivers
+ (void)mem;
+}
+
+/****************************************************************************
+REMARKS:
+Issue a real mode interrupt (parameters in DPMI compatible structure)
+****************************************************************************/
+void PMAPI DPMI_int86(
+ int intno,
+ DPMI_regs *regs)
+{
+ // Not used in NT drivers
+}
+
+/****************************************************************************
+REMARKS:
+Call a V86 real mode function with the specified register values
+loaded before the call. The call returns with a far ret.
+****************************************************************************/
+void PMAPI PM_callRealMode(
+ uint seg,
+ uint off,
+ RMREGS *regs,
+ RMSREGS *sregs)
+{
+ // TODO!!
+#if 0
+ CLIENT_STRUCT saveRegs;
+
+ /* Bail if we do not have BIOS access (ie: the VxD was dynamically
+ * loaded, and not statically loaded.
+ */
+ if (!_PM_haveBIOS)
+ return;
+
+ TRACE("SDDHELP: Entering PM_callRealMode()\n");
+ Begin_Nest_V86_Exec();
+ LoadV86Registers(&saveRegs,regs,sregs);
+ Simulate_Far_Call(seg, off);
+ Resume_Exec();
+ ReadV86Registers(&saveRegs,regs,sregs);
+ End_Nest_Exec();
+ TRACE("SDDHELP: Exiting PM_callRealMode()\n");
+#endif
+}
+
+/****************************************************************************
+REMARKS:
+Issue a V86 real mode interrupt with the specified register values
+loaded before the interrupt.
+****************************************************************************/
+int PMAPI PM_int86(
+ int intno,
+ RMREGS *in,
+ RMREGS *out)
+{
+ // TODO!!
+#if 0
+ RMSREGS sregs = {0};
+ CLIENT_STRUCT saveRegs;
+ ushort oldDisable;
+
+ /* Disable pass-up to our VxD handler so we directly call BIOS */
+ TRACE("SDDHELP: Entering PM_int86()\n");
+ if (disableTSRFlag) {
+ oldDisable = *disableTSRFlag;
+ *disableTSRFlag = 0;
+ }
+ Begin_Nest_V86_Exec();
+ LoadV86Registers(&saveRegs,in,&sregs);
+ Exec_Int(intno);
+ ReadV86Registers(&saveRegs,out,&sregs);
+ End_Nest_Exec();
+
+ /* Re-enable pass-up to our VxD handler if previously enabled */
+ if (disableTSRFlag)
+ *disableTSRFlag = oldDisable;
+
+ TRACE("SDDHELP: Exiting PM_int86()\n");
+#else
+ *out = *in;
+#endif
+ return out->x.ax;
+}
+
+/****************************************************************************
+REMARKS:
+Issue a V86 real mode interrupt with the specified register values
+loaded before the interrupt.
+****************************************************************************/
+int PMAPI PM_int86x(
+ int intno,
+ RMREGS *in,
+ RMREGS *out,
+ RMSREGS *sregs)
+{
+ // TODO!!
+#if 0
+ CLIENT_STRUCT saveRegs;
+ ushort oldDisable;
+
+ /* Bail if we do not have BIOS access (ie: the VxD was dynamically
+ * loaded, and not statically loaded.
+ */
+ if (!_PM_haveBIOS) {
+ *out = *in;
+ return out->x.ax;
+ }
+
+ /* Disable pass-up to our VxD handler so we directly call BIOS */
+ TRACE("SDDHELP: Entering PM_int86x()\n");
+ if (disableTSRFlag) {
+ oldDisable = *disableTSRFlag;
+ *disableTSRFlag = 0;
+ }
+ Begin_Nest_V86_Exec();
+ LoadV86Registers(&saveRegs,in,sregs);
+ Exec_Int(intno);
+ ReadV86Registers(&saveRegs,out,sregs);
+ End_Nest_Exec();
+
+ /* Re-enable pass-up to our VxD handler if previously enabled */
+ if (disableTSRFlag)
+ *disableTSRFlag = oldDisable;
+
+ TRACE("SDDHELP: Exiting PM_int86x()\n");
+#else
+ *out = *in;
+#endif
+ return out->x.ax;
+}
+
OpenPOWER on IntegriCloud