Re-implemented using a real semaphore.
[wine] / msdos / interrupts.c
1 /*
2  * Interrupt vectors emulation
3  *
4  * Copyright 1995 Alexandre Julliard
5  */
6
7 #include <sys/types.h>
8
9 #include "windows.h"
10 #include "drive.h"
11 #include "miscemu.h"
12 #include "msdos.h"
13 #include "module.h"
14 #include "stackframe.h"
15 #include "debug.h"
16
17 static FARPROC16 INT_Vectors[256];
18
19
20 /**********************************************************************
21  *          INT_GetPMHandler
22  *
23  * Return the protected mode interrupt vector for a given interrupt.
24  */
25 FARPROC16 INT_GetPMHandler( BYTE intnum )
26 {
27     return INT_Vectors[intnum];
28 }
29
30
31 /**********************************************************************
32  *          INT_SetPMHandler
33  *
34  * Set the protected mode interrupt handler for a given interrupt.
35  */
36 void INT_SetPMHandler( BYTE intnum, FARPROC16 handler )
37 {
38     TRACE(int, "Set protected mode interrupt vector %02x <- %04x:%04x\n",
39                  intnum, HIWORD(handler), LOWORD(handler) );
40     INT_Vectors[intnum] = handler;
41 }
42
43
44 /**********************************************************************
45  *          INT_GetRMHandler
46  *
47  * Return the real mode interrupt vector for a given interrupt.
48  */
49 FARPROC16 INT_GetRMHandler( BYTE intnum )
50 {
51     return ((FARPROC16*)DOSMEM_MemoryBase(0))[intnum];
52 }
53
54
55 /**********************************************************************
56  *          INT_SetRMHandler
57  *
58  * Set the real mode interrupt handler for a given interrupt.
59  */
60 void INT_SetRMHandler( BYTE intnum, FARPROC16 handler )
61 {
62     TRACE(int, "Set real mode interrupt vector %02x <- %04x:%04x\n",
63                  intnum, HIWORD(handler), LOWORD(handler) );
64     ((FARPROC16*)DOSMEM_MemoryBase(0))[intnum] = handler;
65 }
66
67
68 /**********************************************************************
69  *          INT_CtxGetHandler
70  *
71  * Return the interrupt vector for a given interrupt.
72  */
73 FARPROC16 INT_CtxGetHandler( CONTEXT *context, BYTE intnum )
74 {
75     if (ISV86(context))
76         return ((FARPROC16*)V86BASE(context))[intnum];
77     else
78         return INT_GetPMHandler(intnum);
79 }
80
81
82 /**********************************************************************
83  *          INT_CtxSetHandler
84  *
85  * Set the interrupt handler for a given interrupt.
86  */
87 void INT_CtxSetHandler( CONTEXT *context, BYTE intnum, FARPROC16 handler )
88 {
89     if (ISV86(context)) {
90         TRACE(int, "Set real mode interrupt vector %02x <- %04x:%04x\n",
91                      intnum, HIWORD(handler), LOWORD(handler) );
92         ((FARPROC16*)V86BASE(context))[intnum] = handler;
93     } else
94         INT_SetPMHandler(intnum, handler);
95 }
96
97
98 /**********************************************************************
99  *          INT_RealModeInterrupt
100  *
101  * Handle real mode interrupts
102  */
103 int INT_RealModeInterrupt( BYTE intnum, PCONTEXT context )
104 {
105     /* we should really map to if1632/wprocs.spec, but not all
106      * interrupt handlers are adapted to support real mode yet */
107     switch (intnum) {
108         case 0x10:
109             INT_Int10Handler(context);
110             break;
111         case 0x11:
112             INT_Int11Handler(context);
113             break;
114         case 0x13:
115             INT_Int13Handler(context);
116             break;
117         case 0x16:
118             INT_Int16Handler(context);
119             break;
120         case 0x17:
121             INT_Int17Handler(context);
122             break;
123         case 0x1a:
124             INT_Int1aHandler(context);
125             break;
126         case 0x20:
127             INT_Int20Handler(context);
128             break;
129         case 0x21:
130             DOS3Call(context);
131             break;
132         case 0x25:
133             INT_Int25Handler(context);
134             break;
135         case 0x2f:
136             INT_Int2fHandler(context);
137             break;
138         case 0x31:
139             INT_Int31Handler(context);
140             break;
141         case 0x29:
142             INT_Int29Handler(context);
143             break;
144         default:
145             FIXME(int, "Unknown Interrupt in DOS mode: 0x%x\n", intnum);
146             return 1;
147     }
148     return 0;
149 }