dos int patch

Ove Kaaven ovek at arcticnet.no
Sat Oct 27 14:41:29 CDT 2001


Log:
Implemented a dynamic table of DOS interrupt handlers.

Index: include/miscemu.h
===================================================================
RCS file: /home/wine/wine/include/miscemu.h,v
retrieving revision 1.42
diff -u -r1.42 miscemu.h
--- include/miscemu.h	2001/06/26 21:06:08	1.42
+++ include/miscemu.h	2001/10/27 18:12:48
@@ -166,6 +166,7 @@
 extern int DOSDEV_IoctlWrite(DWORD dev, DWORD buf, int buflen);
 
 /* msdos/interrupts.c */
+typedef void WINAPI (*INTPROC)(CONTEXT86*);
 extern FARPROC16 INT_GetPMHandler( BYTE intnum );
 extern void INT_SetPMHandler( BYTE intnum, FARPROC16 handler );
 extern FARPROC16 INT_GetRMHandler( BYTE intnum );
@@ -173,6 +174,8 @@
 extern FARPROC16 INT_CtxGetHandler( CONTEXT86 *context, BYTE intnum );
 extern void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler );
 extern int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context );
+extern INTPROC INT_GetWineHandler( BYTE intnum );
+extern void INT_SetWineHandler( BYTE intnum, INTPROC proc );
 
 /* msdos/ioports.c */
 extern DWORD IO_inport( int port, int count );
Index: msdos/interrupts.c
===================================================================
RCS file: /home/wine/wine/msdos/interrupts.c,v
retrieving revision 1.18
diff -u -r1.18 interrupts.c
--- msdos/interrupts.c	2001/06/20 23:03:18	1.18
+++ msdos/interrupts.c	2001/10/27 18:12:48
@@ -14,6 +14,17 @@
 
 DEFAULT_DEBUG_CHANNEL(int);
 
+static INTPROC INT_WineHandler[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, INT_Int09Handler, 0, 0, 0, 0, 0, 0,
+ INT_Int10Handler, INT_Int11Handler, INT_Int12Handler, INT_Int13Handler,
+ 0, INT_Int15Handler, INT_Int16Handler, INT_Int17Handler,
+ 0, 0, INT_Int1aHandler, 0, 0, 0, 0, 0,
+ INT_Int20Handler, DOS3Call, 0, 0, 0, INT_Int25Handler, 0, 0,
+ 0, INT_Int29Handler, INT_Int2aHandler, 0, 0, 0, 0, INT_Int2fHandler,
+ 0, INT_Int31Handler, 0, INT_Int33Handler
+};
+
 static FARPROC16 INT_Vectors[256];
 
 /* Ordinal number for interrupt 0 handler in WPROCS.DLL */
@@ -115,71 +126,41 @@
 
 
 /**********************************************************************
+ *	    INT_GetWineHandler
+ *
+ * Return the Wine interrupt handler for a given interrupt.
+ */
+INTPROC INT_GetWineHandler( BYTE intnum )
+{
+    return INT_WineHandler[intnum];
+}
+
+
+/**********************************************************************
+ *	    INT_SetWineHandler
+ *
+ * Set the Wine interrupt handler for a given interrupt.
+ */
+void INT_SetWineHandler( BYTE intnum, INTPROC handler )
+{
+    TRACE("Set Wine interrupt vector %02x <- %p\n", intnum, handler );
+    INT_WineHandler[intnum] = handler;
+}
+
+
+/**********************************************************************
  *	    INT_RealModeInterrupt
  *
  * Handle real mode interrupts
  */
 int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context )
 {
-    /* we should really map to if1632/wprocs.spec, but not all
-     * interrupt handlers are adapted to support real mode yet */
-    switch (intnum) {
-        case 0x09:
-            INT_Int09Handler(context);
-            break;
-        case 0x10:
-            INT_Int10Handler(context);
-            break;
-        case 0x11:
-            INT_Int11Handler(context);
-            break;
-        case 0x12:
-            INT_Int12Handler(context);
-            break;
-	case 0x13:
-	    INT_Int13Handler(context);
-            break;
-        case 0x15:
-            INT_Int15Handler(context);
-            break;
-        case 0x16:
-            INT_Int16Handler(context);
-            break;
-        case 0x17:
-            INT_Int17Handler(context);
-            break;
-        case 0x1a:
-            INT_Int1aHandler(context);
-            break;
-        case 0x20:
-            INT_Int20Handler(context);
-            break;
-        case 0x21:
-            DOS3Call(context);
-            break;
-        case 0x25:
-            INT_Int25Handler(context);
-            break;
-        case 0x29:
-            INT_Int29Handler(context);
-            break;
-        case 0x2a:
-            INT_Int2aHandler(context);
-            break; 
-        case 0x2f:
-            INT_Int2fHandler(context);
-            break;
-        case 0x31:
-            INT_Int31Handler(context);
-            break;
-        case 0x33:
-            INT_Int33Handler(context);
-            break;
-        default:
-            FIXME("Unknown Interrupt in DOS mode: 0x%x\n", intnum);
-            return 1;
+    if (INT_WineHandler[intnum]) {
+        (*INT_WineHandler[intnum])(context);
+        return 0;
     }
-    return 0;
+    FIXME("Unknown Interrupt in DOS mode: 0x%x\n", intnum);
+    return 1;
 }
 
 





More information about the wine-patches mailing list