Order of send message processing was not respected and the message
[wine/dcerpc.git] / msdos / interrupts.c
blob740e0095baf15e067d48570c139e6e5dc9904916
1 /*
2 * Interrupt vectors emulation
4 * Copyright 1995 Alexandre Julliard
5 */
7 #include <sys/types.h>
8 #include "wintypes.h"
9 #include "miscemu.h"
10 #include "msdos.h"
11 #include "debug.h"
13 static FARPROC16 INT_Vectors[256];
16 /**********************************************************************
17 * INT_GetPMHandler
19 * Return the protected mode interrupt vector for a given interrupt.
21 FARPROC16 INT_GetPMHandler( BYTE intnum )
23 return INT_Vectors[intnum];
27 /**********************************************************************
28 * INT_SetPMHandler
30 * Set the protected mode interrupt handler for a given interrupt.
32 void INT_SetPMHandler( BYTE intnum, FARPROC16 handler )
34 TRACE(int, "Set protected mode interrupt vector %02x <- %04x:%04x\n",
35 intnum, HIWORD(handler), LOWORD(handler) );
36 INT_Vectors[intnum] = handler;
40 /**********************************************************************
41 * INT_GetRMHandler
43 * Return the real mode interrupt vector for a given interrupt.
45 FARPROC16 INT_GetRMHandler( BYTE intnum )
47 return ((FARPROC16*)DOSMEM_MemoryBase(0))[intnum];
51 /**********************************************************************
52 * INT_SetRMHandler
54 * Set the real mode interrupt handler for a given interrupt.
56 void INT_SetRMHandler( BYTE intnum, FARPROC16 handler )
58 TRACE(int, "Set real mode interrupt vector %02x <- %04x:%04x\n",
59 intnum, HIWORD(handler), LOWORD(handler) );
60 ((FARPROC16*)DOSMEM_MemoryBase(0))[intnum] = handler;
64 /**********************************************************************
65 * INT_CtxGetHandler
67 * Return the interrupt vector for a given interrupt.
69 FARPROC16 INT_CtxGetHandler( CONTEXT *context, BYTE intnum )
71 if (ISV86(context))
72 return ((FARPROC16*)V86BASE(context))[intnum];
73 else
74 return INT_GetPMHandler(intnum);
78 /**********************************************************************
79 * INT_CtxSetHandler
81 * Set the interrupt handler for a given interrupt.
83 void INT_CtxSetHandler( CONTEXT *context, BYTE intnum, FARPROC16 handler )
85 if (ISV86(context)) {
86 TRACE(int, "Set real mode interrupt vector %02x <- %04x:%04x\n",
87 intnum, HIWORD(handler), LOWORD(handler) );
88 ((FARPROC16*)V86BASE(context))[intnum] = handler;
89 } else
90 INT_SetPMHandler(intnum, handler);
94 /**********************************************************************
95 * INT_RealModeInterrupt
97 * Handle real mode interrupts
99 int INT_RealModeInterrupt( BYTE intnum, PCONTEXT context )
101 /* we should really map to if1632/wprocs.spec, but not all
102 * interrupt handlers are adapted to support real mode yet */
103 switch (intnum) {
104 case 0x10:
105 INT_Int10Handler(context);
106 break;
107 case 0x11:
108 INT_Int11Handler(context);
109 break;
110 case 0x12:
111 INT_Int12Handler(context);
112 break;
113 case 0x13:
114 INT_Int13Handler(context);
115 break;
116 case 0x15:
117 INT_Int15Handler(context);
118 break;
119 case 0x16:
120 INT_Int16Handler(context);
121 break;
122 case 0x17:
123 INT_Int17Handler(context);
124 break;
125 case 0x1a:
126 INT_Int1aHandler(context);
127 break;
128 case 0x20:
129 INT_Int20Handler(context);
130 break;
131 case 0x21:
132 DOS3Call(context);
133 break;
134 case 0x25:
135 INT_Int25Handler(context);
136 break;
137 case 0x2f:
138 INT_Int2fHandler(context);
139 break;
140 case 0x31:
141 INT_Int31Handler(context);
142 break;
143 case 0x29:
144 INT_Int29Handler(context);
145 break;
146 default:
147 FIXME(int, "Unknown Interrupt in DOS mode: 0x%x\n", intnum);
148 return 1;
150 return 0;