Devices never need to be polled, so return DI_NOEFFECT in Poll.
[wine/testsucceed.git] / msdos / interrupts.c
blob18bb05fe46ff763a1de166cbd297a80afce45fcc
1 /*
2 * Interrupt vectors emulation
4 * Copyright 1995 Alexandre Julliard
5 */
7 #include <sys/types.h>
8 #include "windef.h"
9 #include "wine/winbase16.h"
10 #include "miscemu.h"
11 #include "msdos.h"
12 #include "module.h"
13 #include "debugtools.h"
15 DEFAULT_DEBUG_CHANNEL(int);
17 static INTPROC INT_WineHandler[256] = {
18 0, 0, 0, 0, 0, 0, 0, 0,
19 0, INT_Int09Handler, 0, 0, 0, 0, 0, 0,
20 INT_Int10Handler, INT_Int11Handler, INT_Int12Handler, INT_Int13Handler,
21 0, INT_Int15Handler, INT_Int16Handler, INT_Int17Handler,
22 0, 0, INT_Int1aHandler, 0, 0, 0, 0, 0,
23 INT_Int20Handler, DOS3Call, 0, 0, 0, INT_Int25Handler, 0, 0,
24 0, INT_Int29Handler, INT_Int2aHandler, 0, 0, 0, 0, INT_Int2fHandler,
25 0, INT_Int31Handler, 0, INT_Int33Handler
28 static FARPROC16 INT_Vectors[256];
30 /* Ordinal number for interrupt 0 handler in WPROCS.DLL */
31 #define FIRST_INTERRUPT 100
34 /**********************************************************************
35 * INT_GetPMHandler
37 * Return the protected mode interrupt vector for a given interrupt.
39 FARPROC16 INT_GetPMHandler( BYTE intnum )
41 if (!INT_Vectors[intnum])
43 static HMODULE16 wprocs;
44 if (!wprocs)
46 if (((wprocs = GetModuleHandle16( "wprocs" )) < 32) &&
47 ((wprocs = LoadLibrary16( "wprocs" )) < 32))
49 ERR("could not load wprocs.dll\n");
50 return 0;
53 if (!(INT_Vectors[intnum] = GetProcAddress16( wprocs, (LPCSTR)(FIRST_INTERRUPT + intnum))))
55 WARN("int%x not implemented, returning dummy handler\n", intnum );
56 INT_Vectors[intnum] = GetProcAddress16( wprocs, (LPCSTR)(FIRST_INTERRUPT + 256) );
59 return INT_Vectors[intnum];
63 /**********************************************************************
64 * INT_SetPMHandler
66 * Set the protected mode interrupt handler for a given interrupt.
68 void INT_SetPMHandler( BYTE intnum, FARPROC16 handler )
70 TRACE("Set protected mode interrupt vector %02x <- %04x:%04x\n",
71 intnum, HIWORD(handler), LOWORD(handler) );
72 INT_Vectors[intnum] = handler;
76 /**********************************************************************
77 * INT_GetRMHandler
79 * Return the real mode interrupt vector for a given interrupt.
81 FARPROC16 INT_GetRMHandler( BYTE intnum )
83 return ((FARPROC16*)DOSMEM_SystemBase())[intnum];
87 /**********************************************************************
88 * INT_SetRMHandler
90 * Set the real mode interrupt handler for a given interrupt.
92 void INT_SetRMHandler( BYTE intnum, FARPROC16 handler )
94 TRACE("Set real mode interrupt vector %02x <- %04x:%04x\n",
95 intnum, HIWORD(handler), LOWORD(handler) );
96 ((FARPROC16*)DOSMEM_SystemBase())[intnum] = handler;
100 /**********************************************************************
101 * INT_CtxGetHandler
103 * Return the interrupt vector for a given interrupt.
105 FARPROC16 INT_CtxGetHandler( CONTEXT86 *context, BYTE intnum )
107 if (ISV86(context))
108 return INT_GetRMHandler(intnum);
109 else
110 return INT_GetPMHandler(intnum);
114 /**********************************************************************
115 * INT_CtxSetHandler
117 * Set the interrupt handler for a given interrupt.
119 void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler )
121 if (ISV86(context))
122 INT_SetRMHandler(intnum, handler);
123 else
124 INT_SetPMHandler(intnum, handler);
128 /**********************************************************************
129 * INT_GetWineHandler
131 * Return the Wine interrupt handler for a given interrupt.
133 INTPROC INT_GetWineHandler( BYTE intnum )
135 return INT_WineHandler[intnum];
139 /**********************************************************************
140 * INT_SetWineHandler
142 * Set the Wine interrupt handler for a given interrupt.
144 void INT_SetWineHandler( BYTE intnum, INTPROC handler )
146 TRACE("Set Wine interrupt vector %02x <- %p\n", intnum, handler );
147 INT_WineHandler[intnum] = handler;
151 /**********************************************************************
152 * INT_RealModeInterrupt
154 * Handle real mode interrupts
156 int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context )
158 if (INT_WineHandler[intnum]) {
159 (*INT_WineHandler[intnum])(context);
160 return 0;
162 FIXME("Unknown Interrupt in DOS mode: 0x%x\n", intnum);
163 return 1;
167 /**********************************************************************
168 * INT_DefaultHandler (WPROCS.356)
170 * Default interrupt handler.
172 void WINAPI INT_DefaultHandler( CONTEXT86 *context )