blob: d6307583f9b3ae3a58cdc9682c34a03042b19a69 [file] [log] [blame]
Alexandre Julliard9ea19e51997-01-01 17:29:55 +00001/*
2 * Interrupt vectors emulation
3 *
4 * Copyright 1995 Alexandre Julliard
5 */
6
7#include <sys/types.h>
Jim Aston2e1cafa1999-03-14 16:35:05 +00008#include "windef.h"
Alexandre Julliard4324b472000-06-03 04:52:14 +00009#include "wine/winbase16.h"
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000010#include "miscemu.h"
11#include "msdos.h"
Alexandre Julliard4324b472000-06-03 04:52:14 +000012#include "module.h"
Alexandre Julliard61fece01999-06-26 19:09:08 +000013#include "debugtools.h"
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000014
Alexandre Julliard4324b472000-06-03 04:52:14 +000015DEFAULT_DEBUG_CHANNEL(int);
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000016
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000017static FARPROC16 INT_Vectors[256];
18
Alexandre Julliard4324b472000-06-03 04:52:14 +000019/* Ordinal number for interrupt 0 handler in WPROCS.DLL */
20#define FIRST_INTERRUPT 100
21
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000022
23/**********************************************************************
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000024 * INT_GetPMHandler
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000025 *
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000026 * Return the protected mode interrupt vector for a given interrupt.
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000027 */
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000028FARPROC16 INT_GetPMHandler( BYTE intnum )
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000029{
Alexandre Julliard4324b472000-06-03 04:52:14 +000030 if (!INT_Vectors[intnum])
31 {
32 static HMODULE16 wprocs;
33 if (!wprocs)
34 {
Alexandre Julliard7afce0e2000-12-01 21:25:31 +000035 if (((wprocs = GetModuleHandle16( "wprocs" )) < 32) &&
36 ((wprocs = LoadLibrary16( "wprocs" )) < 32))
Alexandre Julliard4324b472000-06-03 04:52:14 +000037 {
38 ERR("could not load wprocs.dll\n");
39 return 0;
40 }
41 }
Alexandre Julliard7afce0e2000-12-01 21:25:31 +000042 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 }
Alexandre Julliard4324b472000-06-03 04:52:14 +000047 }
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000048 return INT_Vectors[intnum];
49}
50
51
52/**********************************************************************
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000053 * INT_SetPMHandler
54 *
55 * Set the protected mode interrupt handler for a given interrupt.
56 */
57void INT_SetPMHandler( BYTE intnum, FARPROC16 handler )
58{
Alexandre Julliard61fece01999-06-26 19:09:08 +000059 TRACE("Set protected mode interrupt vector %02x <- %04x:%04x\n",
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000060 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 */
70FARPROC16 INT_GetRMHandler( BYTE intnum )
71{
Ove Kaavenf39a69a2000-11-13 04:12:12 +000072 return ((FARPROC16*)DOSMEM_SystemBase())[intnum];
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000073}
74
75
76/**********************************************************************
77 * INT_SetRMHandler
78 *
79 * Set the real mode interrupt handler for a given interrupt.
80 */
81void INT_SetRMHandler( BYTE intnum, FARPROC16 handler )
82{
Alexandre Julliard61fece01999-06-26 19:09:08 +000083 TRACE("Set real mode interrupt vector %02x <- %04x:%04x\n",
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000084 intnum, HIWORD(handler), LOWORD(handler) );
Ove Kaavenf39a69a2000-11-13 04:12:12 +000085 ((FARPROC16*)DOSMEM_SystemBase())[intnum] = handler;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000086}
87
88
89/**********************************************************************
90 * INT_CtxGetHandler
91 *
92 * Return the interrupt vector for a given interrupt.
93 */
Alexandre Julliard617955d1999-06-26 18:40:24 +000094FARPROC16 INT_CtxGetHandler( CONTEXT86 *context, BYTE intnum )
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000095{
96 if (ISV86(context))
Alexandre Julliard9edc7d02000-09-18 02:15:25 +000097 return INT_GetRMHandler(intnum);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000098 else
99 return INT_GetPMHandler(intnum);
100}
101
102
103/**********************************************************************
104 * INT_CtxSetHandler
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000105 *
106 * Set the interrupt handler for a given interrupt.
107 */
Alexandre Julliard617955d1999-06-26 18:40:24 +0000108void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler )
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000109{
Alexandre Julliard9edc7d02000-09-18 02:15:25 +0000110 if (ISV86(context))
111 INT_SetRMHandler(intnum, handler);
112 else
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000113 INT_SetPMHandler(intnum, handler);
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000114}
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000115
116
117/**********************************************************************
118 * INT_RealModeInterrupt
119 *
120 * Handle real mode interrupts
121 */
Alexandre Julliard617955d1999-06-26 18:40:24 +0000122int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context )
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000123{
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) {
Ove Kaaven4dfd8591999-03-25 10:51:17 +0000127 case 0x09:
128 INT_Int09Handler(context);
129 break;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000130 case 0x10:
131 INT_Int10Handler(context);
132 break;
Joseph Pranevich20a2c1e1998-10-17 11:56:44 +0000133 case 0x11:
134 INT_Int11Handler(context);
135 break;
Andreas Mohra63458d1999-01-30 13:39:21 +0000136 case 0x12:
137 INT_Int12Handler(context);
138 break;
Joseph Pranevich912049d1998-10-24 10:40:36 +0000139 case 0x13:
140 INT_Int13Handler(context);
141 break;
Andreas Mohra63458d1999-01-30 13:39:21 +0000142 case 0x15:
143 INT_Int15Handler(context);
144 break;
Joseph Pranevich20a2c1e1998-10-17 11:56:44 +0000145 case 0x16:
146 INT_Int16Handler(context);
147 break;
Joseph Pranevich912049d1998-10-24 10:40:36 +0000148 case 0x17:
149 INT_Int17Handler(context);
150 break;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000151 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;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000160 case 0x25:
161 INT_Int25Handler(context);
162 break;
Ove Kaaven4dfd8591999-03-25 10:51:17 +0000163 case 0x29:
164 INT_Int29Handler(context);
165 break;
Robert 'Admiral' Coeyman0e04d8b1999-10-23 19:01:10 +0000166 case 0x2a:
167 INT_Int2aHandler(context);
168 break;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000169 case 0x2f:
170 INT_Int2fHandler(context);
171 break;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000172 case 0x31:
173 INT_Int31Handler(context);
174 break;
Ove Kaaven4dfd8591999-03-25 10:51:17 +0000175 case 0x33:
176 INT_Int33Handler(context);
Joseph Pranevich20a2c1e1998-10-17 11:56:44 +0000177 break;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000178 default:
Alexandre Julliard61fece01999-06-26 19:09:08 +0000179 FIXME("Unknown Interrupt in DOS mode: 0x%x\n", intnum);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000180 return 1;
181 }
182 return 0;
183}
Alexandre Julliard7afce0e2000-12-01 21:25:31 +0000184
185
186/**********************************************************************
Patrik Stridvall3ca98232001-06-20 23:03:14 +0000187 * INT_DefaultHandler (WPROCS.356)
Alexandre Julliard7afce0e2000-12-01 21:25:31 +0000188 *
189 * Default interrupt handler.
190 */
191void WINAPI INT_DefaultHandler( CONTEXT86 *context )
192{
193}