Add config check and thread safe wrappers for the XRender library.
[wine] / msdos / interrupts.c
1 /*
2  * Interrupt vectors emulation
3  *
4  * Copyright 1995 Alexandre Julliard
5  */
6
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"
14
15 DEFAULT_DEBUG_CHANNEL(int);
16
17 static FARPROC16 INT_Vectors[256];
18
19 /* Ordinal number for interrupt 0 handler in WPROCS.DLL */
20 #define FIRST_INTERRUPT 100
21
22
23 /**********************************************************************
24  *          INT_GetPMHandler
25  *
26  * Return the protected mode interrupt vector for a given interrupt.
27  */
28 FARPROC16 INT_GetPMHandler( BYTE intnum )
29 {
30     if (!INT_Vectors[intnum])
31     {
32         static HMODULE16 wprocs;
33         if (!wprocs)
34         {
35             if (((wprocs = GetModuleHandle16( "wprocs" )) < 32) &&
36                 ((wprocs = LoadLibrary16( "wprocs" )) < 32))
37             {
38                 ERR("could not load wprocs.dll\n");
39                 return 0;
40             }
41         }
42         if (!(INT_Vectors[intnum] = GetProcAddress16( wprocs, (LPCSTR)(FIRST_INTERRUPT + intnum))))
43         {
44             WARN("int%x not implemented, returning dummy handler\n", intnum );
45             INT_Vectors[intnum] = GetProcAddress16( wprocs, (LPCSTR)(FIRST_INTERRUPT + 256) );
46         }
47     }
48     return INT_Vectors[intnum];
49 }
50
51
52 /**********************************************************************
53  *          INT_SetPMHandler
54  *
55  * Set the protected mode interrupt handler for a given interrupt.
56  */
57 void INT_SetPMHandler( BYTE intnum, FARPROC16 handler )
58 {
59     TRACE("Set protected mode interrupt vector %02x <- %04x:%04x\n",
60                  intnum, HIWORD(handler), LOWORD(handler) );
61     INT_Vectors[intnum] = handler;
62 }
63
64
65 /**********************************************************************
66  *          INT_GetRMHandler
67  *
68  * Return the real mode interrupt vector for a given interrupt.
69  */
70 FARPROC16 INT_GetRMHandler( BYTE intnum )
71 {
72     return ((FARPROC16*)DOSMEM_SystemBase())[intnum];
73 }
74
75
76 /**********************************************************************
77  *          INT_SetRMHandler
78  *
79  * Set the real mode interrupt handler for a given interrupt.
80  */
81 void INT_SetRMHandler( BYTE intnum, FARPROC16 handler )
82 {
83     TRACE("Set real mode interrupt vector %02x <- %04x:%04x\n",
84                  intnum, HIWORD(handler), LOWORD(handler) );
85     ((FARPROC16*)DOSMEM_SystemBase())[intnum] = handler;
86 }
87
88
89 /**********************************************************************
90  *          INT_CtxGetHandler
91  *
92  * Return the interrupt vector for a given interrupt.
93  */
94 FARPROC16 INT_CtxGetHandler( CONTEXT86 *context, BYTE intnum )
95 {
96     if (ISV86(context))
97         return INT_GetRMHandler(intnum);
98     else
99         return INT_GetPMHandler(intnum);
100 }
101
102
103 /**********************************************************************
104  *          INT_CtxSetHandler
105  *
106  * Set the interrupt handler for a given interrupt.
107  */
108 void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler )
109 {
110     if (ISV86(context))
111         INT_SetRMHandler(intnum, handler);
112     else
113         INT_SetPMHandler(intnum, handler);
114 }
115
116
117 /**********************************************************************
118  *          INT_RealModeInterrupt
119  *
120  * Handle real mode interrupts
121  */
122 int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context )
123 {
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;
181     }
182     return 0;
183 }
184
185
186 /**********************************************************************
187  *         INT_DefaultHandler (WPROCS.356)
188  *
189  * Default interrupt handler.
190  */
191 void WINAPI INT_DefaultHandler( CONTEXT86 *context )
192 {
193 }