Implemented a dynamic table of DOS interrupt handlers.
This commit is contained in:
parent
14c9429698
commit
fe5bf6e63d
|
@ -166,6 +166,7 @@ extern int DOSDEV_IoctlRead(DWORD dev, DWORD buf, int buflen);
|
||||||
extern int DOSDEV_IoctlWrite(DWORD dev, DWORD buf, int buflen);
|
extern int DOSDEV_IoctlWrite(DWORD dev, DWORD buf, int buflen);
|
||||||
|
|
||||||
/* msdos/interrupts.c */
|
/* msdos/interrupts.c */
|
||||||
|
typedef void WINAPI (*INTPROC)(CONTEXT86*);
|
||||||
extern FARPROC16 INT_GetPMHandler( BYTE intnum );
|
extern FARPROC16 INT_GetPMHandler( BYTE intnum );
|
||||||
extern void INT_SetPMHandler( BYTE intnum, FARPROC16 handler );
|
extern void INT_SetPMHandler( BYTE intnum, FARPROC16 handler );
|
||||||
extern FARPROC16 INT_GetRMHandler( BYTE intnum );
|
extern FARPROC16 INT_GetRMHandler( BYTE intnum );
|
||||||
|
@ -173,6 +174,8 @@ extern void INT_SetRMHandler( BYTE intnum, FARPROC16 handler );
|
||||||
extern FARPROC16 INT_CtxGetHandler( CONTEXT86 *context, BYTE intnum );
|
extern FARPROC16 INT_CtxGetHandler( CONTEXT86 *context, BYTE intnum );
|
||||||
extern void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler );
|
extern void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler );
|
||||||
extern int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context );
|
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 */
|
/* msdos/ioports.c */
|
||||||
extern DWORD IO_inport( int port, int count );
|
extern DWORD IO_inport( int port, int count );
|
||||||
|
|
|
@ -14,6 +14,17 @@
|
||||||
|
|
||||||
DEFAULT_DEBUG_CHANNEL(int);
|
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];
|
static FARPROC16 INT_Vectors[256];
|
||||||
|
|
||||||
/* Ordinal number for interrupt 0 handler in WPROCS.DLL */
|
/* Ordinal number for interrupt 0 handler in WPROCS.DLL */
|
||||||
|
@ -114,6 +125,29 @@ void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* 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
|
* INT_RealModeInterrupt
|
||||||
*
|
*
|
||||||
|
@ -121,65 +155,12 @@ void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler )
|
||||||
*/
|
*/
|
||||||
int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context )
|
int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context )
|
||||||
{
|
{
|
||||||
/* we should really map to if1632/wprocs.spec, but not all
|
if (INT_WineHandler[intnum]) {
|
||||||
* interrupt handlers are adapted to support real mode yet */
|
(*INT_WineHandler[intnum])(context);
|
||||||
switch (intnum) {
|
return 0;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
return 0;
|
FIXME("Unknown Interrupt in DOS mode: 0x%x\n", intnum);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue