Added GetConvertStg stub.
[wine.git] / msdos / interrupts.c
blobcea83b4bb90fcdf972bac90d7ac67157c54a4657
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 FARPROC16 INT_Vectors[256];
19 /* Ordinal number for interrupt 0 handler in WPROCS.DLL */
20 #define FIRST_INTERRUPT 100
23 /**********************************************************************
24 * INT_GetPMHandler
26 * Return the protected mode interrupt vector for a given interrupt.
28 FARPROC16 INT_GetPMHandler( BYTE intnum )
30 if (!INT_Vectors[intnum])
32 static HMODULE16 wprocs;
33 if (!wprocs)
35 if (((wprocs = GetModuleHandle16( "wprocs" )) < 32) &&
36 ((wprocs = LoadLibrary16( "wprocs" )) < 32))
38 ERR("could not load wprocs.dll\n");
39 return 0;
42 if (!(INT_Vectors[intnum] = GetProcAddress16( wprocs, (LPCSTR)(FIRST_INTERRUPT + intnum))))
44 WARN("int%x not implemented, returning dummy handler\n", intnum );
45 INT_Vectors[intnum] = GetProcAddress16( wprocs, (LPCSTR)(FIRST_INTERRUPT + 256) );
48 return INT_Vectors[intnum];
52 /**********************************************************************
53 * INT_SetPMHandler
55 * Set the protected mode interrupt handler for a given interrupt.
57 void INT_SetPMHandler( BYTE intnum, FARPROC16 handler )
59 TRACE("Set protected mode interrupt vector %02x <- %04x:%04x\n",
60 intnum, HIWORD(handler), LOWORD(handler) );
61 INT_Vectors[intnum] = handler;
65 /**********************************************************************
66 * INT_GetRMHandler
68 * Return the real mode interrupt vector for a given interrupt.
70 FARPROC16 INT_GetRMHandler( BYTE intnum )
72 return ((FARPROC16*)DOSMEM_SystemBase())[intnum];
76 /**********************************************************************
77 * INT_SetRMHandler
79 * Set the real mode interrupt handler for a given interrupt.
81 void INT_SetRMHandler( BYTE intnum, FARPROC16 handler )
83 TRACE("Set real mode interrupt vector %02x <- %04x:%04x\n",
84 intnum, HIWORD(handler), LOWORD(handler) );
85 ((FARPROC16*)DOSMEM_SystemBase())[intnum] = handler;
89 /**********************************************************************
90 * INT_CtxGetHandler
92 * Return the interrupt vector for a given interrupt.
94 FARPROC16 INT_CtxGetHandler( CONTEXT86 *context, BYTE intnum )
96 if (ISV86(context))
97 return INT_GetRMHandler(intnum);
98 else
99 return INT_GetPMHandler(intnum);
103 /**********************************************************************
104 * INT_CtxSetHandler
106 * Set the interrupt handler for a given interrupt.
108 void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler )
110 if (ISV86(context))
111 INT_SetRMHandler(intnum, handler);
112 else
113 INT_SetPMHandler(intnum, handler);
117 /**********************************************************************
118 * INT_RealModeInterrupt
120 * Handle real mode interrupts
122 int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context )
124 /* we should really map to if1632/wprocs.spec, but not all
125 * interrupt handlers are adapted to support real mode yet */
126 switch (intnum) {
127 case 0x09:
128 INT_Int09Handler(context);
129 break;
130 case 0x10:
131 INT_Int10Handler(context);
132 break;
133 case 0x11:
134 INT_Int11Handler(context);
135 break;
136 case 0x12:
137 INT_Int12Handler(context);
138 break;
139 case 0x13:
140 INT_Int13Handler(context);
141 break;
142 case 0x15:
143 INT_Int15Handler(context);
144 break;
145 case 0x16:
146 INT_Int16Handler(context);
147 break;
148 case 0x17:
149 INT_Int17Handler(context);
150 break;
151 case 0x1a:
152 INT_Int1aHandler(context);
153 break;
154 case 0x20:
155 INT_Int20Handler(context);
156 break;
157 case 0x21:
158 DOS3Call(context);
159 break;
160 case 0x25:
161 INT_Int25Handler(context);
162 break;
163 case 0x29:
164 INT_Int29Handler(context);
165 break;
166 case 0x2a:
167 INT_Int2aHandler(context);
168 break;
169 case 0x2f:
170 INT_Int2fHandler(context);
171 break;
172 case 0x31:
173 INT_Int31Handler(context);
174 break;
175 case 0x33:
176 INT_Int33Handler(context);
177 break;
178 default:
179 FIXME("Unknown Interrupt in DOS mode: 0x%x\n", intnum);
180 return 1;
182 return 0;
186 /**********************************************************************
187 * INT_DefaultHandler
189 * Default interrupt handler.
191 void WINAPI INT_DefaultHandler( CONTEXT86 *context )