blob: fce08ddaa53db1815dc6e26fb7eddad260c4bb7e [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 {
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 }
Alexandre Julliard9ea19e51997-01-01 17:29:55 +000043 return INT_Vectors[intnum];
44}
45
46
47/**********************************************************************
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000048 * INT_SetPMHandler
49 *
50 * Set the protected mode interrupt handler for a given interrupt.
51 */
52void INT_SetPMHandler( BYTE intnum, FARPROC16 handler )
53{
Alexandre Julliard61fece01999-06-26 19:09:08 +000054 TRACE("Set protected mode interrupt vector %02x <- %04x:%04x\n",
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000055 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 */
65FARPROC16 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 */
76void INT_SetRMHandler( BYTE intnum, FARPROC16 handler )
77{
Alexandre Julliard61fece01999-06-26 19:09:08 +000078 TRACE("Set real mode interrupt vector %02x <- %04x:%04x\n",
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000079 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 */
Alexandre Julliard617955d1999-06-26 18:40:24 +000089FARPROC16 INT_CtxGetHandler( CONTEXT86 *context, BYTE intnum )
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000090{
91 if (ISV86(context))
92 return ((FARPROC16*)V86BASE(context))[intnum];
93 else
94 return INT_GetPMHandler(intnum);
95}
96
97
98/**********************************************************************
99 * INT_CtxSetHandler
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000100 *
101 * Set the interrupt handler for a given interrupt.
102 */
Alexandre Julliard617955d1999-06-26 18:40:24 +0000103void INT_CtxSetHandler( CONTEXT86 *context, BYTE intnum, FARPROC16 handler )
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000104{
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000105 if (ISV86(context)) {
Alexandre Julliard61fece01999-06-26 19:09:08 +0000106 TRACE("Set real mode interrupt vector %02x <- %04x:%04x\n",
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000107 intnum, HIWORD(handler), LOWORD(handler) );
108 ((FARPROC16*)V86BASE(context))[intnum] = handler;
109 } else
110 INT_SetPMHandler(intnum, handler);
Alexandre Julliard9ea19e51997-01-01 17:29:55 +0000111}
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000112
113
114/**********************************************************************
115 * INT_RealModeInterrupt
116 *
117 * Handle real mode interrupts
118 */
Alexandre Julliard617955d1999-06-26 18:40:24 +0000119int INT_RealModeInterrupt( BYTE intnum, CONTEXT86 *context )
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000120{
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) {
Ove Kaaven4dfd8591999-03-25 10:51:17 +0000124 case 0x09:
125 INT_Int09Handler(context);
126 break;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000127 case 0x10:
128 INT_Int10Handler(context);
129 break;
Joseph Pranevich20a2c1e1998-10-17 11:56:44 +0000130 case 0x11:
131 INT_Int11Handler(context);
132 break;
Andreas Mohra63458d1999-01-30 13:39:21 +0000133 case 0x12:
134 INT_Int12Handler(context);
135 break;
Joseph Pranevich912049d1998-10-24 10:40:36 +0000136 case 0x13:
137 INT_Int13Handler(context);
138 break;
Andreas Mohra63458d1999-01-30 13:39:21 +0000139 case 0x15:
140 INT_Int15Handler(context);
141 break;
Joseph Pranevich20a2c1e1998-10-17 11:56:44 +0000142 case 0x16:
143 INT_Int16Handler(context);
144 break;
Joseph Pranevich912049d1998-10-24 10:40:36 +0000145 case 0x17:
146 INT_Int17Handler(context);
147 break;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000148 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;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000157 case 0x25:
158 INT_Int25Handler(context);
159 break;
Ove Kaaven4dfd8591999-03-25 10:51:17 +0000160 case 0x29:
161 INT_Int29Handler(context);
162 break;
Robert 'Admiral' Coeyman0e04d8b1999-10-23 19:01:10 +0000163 case 0x2a:
164 INT_Int2aHandler(context);
165 break;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000166 case 0x2f:
167 INT_Int2fHandler(context);
168 break;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000169 case 0x31:
170 INT_Int31Handler(context);
171 break;
Ove Kaaven4dfd8591999-03-25 10:51:17 +0000172 case 0x33:
173 INT_Int33Handler(context);
Joseph Pranevich20a2c1e1998-10-17 11:56:44 +0000174 break;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000175 default:
Alexandre Julliard61fece01999-06-26 19:09:08 +0000176 FIXME("Unknown Interrupt in DOS mode: 0x%x\n", intnum);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000177 return 1;
178 }
179 return 0;
180}