2 * Interrupt vectors emulation
4 * Copyright 1995 Alexandre Julliard
9 #include "wine/winbase16.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 /**********************************************************************
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
;
46 if (((wprocs
= GetModuleHandle16( "wprocs" )) < 32) &&
47 ((wprocs
= LoadLibrary16( "wprocs" )) < 32))
49 ERR("could not load wprocs.dll\n");
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 /**********************************************************************
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 /**********************************************************************
79 * Return the real mode interrupt vector for a given interrupt.
81 FARPROC16
INT_GetRMHandler( BYTE intnum
)
83 return ((FARPROC16
*)DOSMEM_SystemBase())[intnum
];
87 /**********************************************************************
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 /**********************************************************************
103 * Return the interrupt vector for a given interrupt.
105 FARPROC16
INT_CtxGetHandler( CONTEXT86
*context
, BYTE intnum
)
108 return INT_GetRMHandler(intnum
);
110 return INT_GetPMHandler(intnum
);
114 /**********************************************************************
117 * Set the interrupt handler for a given interrupt.
119 void INT_CtxSetHandler( CONTEXT86
*context
, BYTE intnum
, FARPROC16 handler
)
122 INT_SetRMHandler(intnum
, handler
);
124 INT_SetPMHandler(intnum
, handler
);
128 /**********************************************************************
131 * Return the Wine interrupt handler for a given interrupt.
133 INTPROC
INT_GetWineHandler( BYTE intnum
)
135 return INT_WineHandler
[intnum
];
139 /**********************************************************************
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
);
162 FIXME("Unknown Interrupt in DOS mode: 0x%x\n", intnum
);
167 /**********************************************************************
168 * INT_DefaultHandler (WPROCS.356)
170 * Default interrupt handler.
172 void WINAPI
INT_DefaultHandler( CONTEXT86
*context
)