Use GetSystemDefaultLangID() instead of WINE_LanguageId.
[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             {
37                 ERR("could not load wprocs.dll\n");
38                 return 0;
39             }
40         }
41         INT_Vectors[intnum] = NE_GetEntryPoint( wprocs, FIRST_INTERRUPT + intnum );
42     }
43     return INT_Vectors[intnum];
44 }
45
46
47 /**********************************************************************
48  *          INT_SetPMHandler
49  *
50  * Set the protected mode interrupt handler for a given interrupt.
51  */
52 void INT_SetPMHandler( BYTE intnum, FARPROC16 handler )
53 {
54     TRACE("Set protected mode interrupt vector %02x <- %04x:%04x\n",
55                  intnum, HIWORD(handler), LOWORD(handler) );
56     INT_Vectors[intnum] = handler;
57 }
58
59
60 /**********************************************************************
61  *          INT_GetRMHandler
62  *
63  * Return the real mode interrupt vector for a given interrupt.
64  */
65 FARPROC16 INT_GetRMHandler( BYTE intnum )
66 {
67     return ((FARPROC16*)DOSMEM_MemoryBase(0))[intnum];
68 }
69
70
71 /**********************************************************************
72  *          INT_SetRMHandler
73  *
74  * Set the real mode interrupt handler for a given interrupt.
75  */
76 void INT_SetRMHandler( BYTE intnum, FARPROC16 handler )
77 {
78     TRACE("Set real mode interrupt vector %02x <- %04x:%04x\n",
79                  intnum, HIWORD(handler), LOWORD(handler) );
80     ((FARPROC16*)DOSMEM_MemoryBase(0))[intnum] = handler;
81 }
82
83
84 /**********************************************************************
85  *          INT_CtxGetHandler
86  *
87  * Return the interrupt vector for a given interrupt.
88  */
89 FARPROC16 INT_CtxGetHandler( CONTEXT86 *context, BYTE intnum )
90 {
91     if (ISV86(context))
92         return ((FARPROC16*)V86BASE(context))[intnum];
93     else
94         return INT_GetPMHandler(intnum);
95 }
96
97
98 /**********************************************************************
99  *          INT_CtxSetHandler
100  *
101  * Set the interrupt handler for a given interrupt.
102  */
103 void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler )
104 {
105     if (ISV86(context)) {
106         TRACE("Set real mode interrupt vector %02x <- %04x:%04x\n",
107                      intnum, HIWORD(handler), LOWORD(handler) );
108         ((FARPROC16*)V86BASE(context))[intnum] = handler;
109     } else
110         INT_SetPMHandler(intnum, handler);
111 }
112
113
114 /**********************************************************************
115  *          INT_RealModeInterrupt
116  *
117  * Handle real mode interrupts
118  */
119 int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context )
120 {
121     /* we should really map to if1632/wprocs.spec, but not all
122      * interrupt handlers are adapted to support real mode yet */
123     switch (intnum) {
124         case 0x09:
125             INT_Int09Handler(context);
126             break;
127         case 0x10:
128             INT_Int10Handler(context);
129             break;
130         case 0x11:
131             INT_Int11Handler(context);
132             break;
133         case 0x12:
134             INT_Int12Handler(context);
135             break;
136         case 0x13:
137             INT_Int13Handler(context);
138             break;
139         case 0x15:
140             INT_Int15Handler(context);
141             break;
142         case 0x16:
143             INT_Int16Handler(context);
144             break;
145         case 0x17:
146             INT_Int17Handler(context);
147             break;
148         case 0x1a:
149             INT_Int1aHandler(context);
150             break;
151         case 0x20:
152             INT_Int20Handler(context);
153             break;
154         case 0x21:
155             DOS3Call(context);
156             break;
157         case 0x25:
158             INT_Int25Handler(context);
159             break;
160         case 0x29:
161             INT_Int29Handler(context);
162             break;
163         case 0x2a:
164             INT_Int2aHandler(context);
165             break; 
166         case 0x2f:
167             INT_Int2fHandler(context);
168             break;
169         case 0x31:
170             INT_Int31Handler(context);
171             break;
172         case 0x33:
173             INT_Int33Handler(context);
174             break;
175         default:
176             FIXME("Unknown Interrupt in DOS mode: 0x%x\n", intnum);
177             return 1;
178     }
179     return 0;
180 }