Added ordinal for two syslevel functions.
[wine/multimedia.git] / msdos / int10.c
blob5017e011c70d5a6cad5ca35eef835bb387f48b9b
1 /*
2 * BIOS interrupt 10h handler
3 */
5 #include <stdlib.h>
6 #include "miscemu.h"
7 /* #define DEBUG_INT */
8 #include "debug.h"
10 /**********************************************************************
11 * INT_Int10Handler
13 * Handler for int 10h (video).
15 * NOTE:
16 * Most INT 10 functions for text-mode, CGA, EGA, and VGA cards
17 * are present in this list. (SVGA and XGA are not) That is not
18 * to say that all these functions should be supported, but if
19 * anyone is braindamaged enough to want to emulate one of these
20 * beasts then this should get you started.
22 * NOTE:
23 * Several common graphical extensions used by Microsoft hook
24 * off of here. I have *not* added them to this list (yet). They
25 * include:
27 * MSHERC.COM - More functionality for Hercules cards.
28 * EGA.SYS (also MOUSE.COM) - More for EGA cards.
30 * Yes, MS also added this support into their mouse driver. Don't
31 * ask me, I don't work for them.
33 * Joseph Pranevich - 9/98
36 void WINAPI INT_Int10Handler( CONTEXT *context )
38 switch(AH_reg(context))
40 case 0x00: /* SET VIDEO MODE */
41 /* If the mode is 0x02 or 0x07 then we are still in
42 80x25 text and can ignore the request */
43 if ((AL_reg(context) == 0x02) || (AL_reg(context) == 0x07))
44 break;
46 FIXME(int10, "Set Video Mode - Not Supported\n");
47 break;
49 case 0x01: /* SET CURSOR SHAPE */
50 FIXME(int10, "Set Cursor Shape - Not Supported\n");
51 break;
53 case 0x02: /* SET CURSOR POSITION */
54 FIXME(int10, "Set Cursor Position - Not Supported\n");
55 break;
57 case 0x03: /* GET CURSOR POSITION AND SIZE */
58 FIXME(int10, "Get Cursor Position and Size - Not Supported\n");
59 CX_reg(context) = 0x0000; /* Bogus cursor data */
60 DX_reg(context) = 0x0000;
61 break;
63 case 0x04: /* READ LIGHT PEN POSITION */
64 FIXME(int10, "Read Light Pen Position - Not Supported\n");
65 AH_reg(context) = 0x00; /* Not down */
66 break;
68 case 0x05: /* SELECT ACTIVE DISPLAY PAGE */
69 FIXME(int10, "Select Active Display Page - Not Supported\n");
70 break;
72 case 0x06: /* SCROLL UP WINDOW */
73 FIXME(int10, "Scroll Up Window - Not Supported\n");
74 break;
76 case 0x07: /* SCROLL DOWN WINDOW */
77 FIXME(int10, "Scroll Down Window - Not Supported\n");
78 break;
80 case 0x08: /* READ CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
81 FIXME(int10,
82 "Read Character and Attribute at Cursor Position - Not Supported\n");
83 break;
85 case 0x09: /* WRITE CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
86 case 0x0a: /* WRITE CHARACTER ONLY AT CURSOR POSITION */
87 while (CX_reg(context)) {
88 _lwrite16(1, &AL_reg(context), 1);
89 (CX_reg(context))--;
91 break;
93 case 0x0b:
94 switch BH_reg(context) {
95 case 0x00: /* SET BACKGROUND/BORDER COLOR */
96 FIXME(int10, "Set Background/Border Color - Not Supported\n");
97 break;
98 case 0x01: /* SET PALETTE */
99 FIXME(int10, "Set Palette - Not Supported\n");
100 break;
101 default:
102 FIXME(int10, "INT 10 AH = 0x0b BH = 0x%x - Unknown\n",
103 BH_reg(context));
104 break;
106 break;
108 case 0x0c: /* WRITE GRAPHICS PIXEL */
109 /* Not in graphics mode, can ignore w/o error */
110 FIXME(int10, "Write Graphics Pixel - Not Supported\n");
111 break;
113 case 0x0d: /* READ GRAPHICS PIXEL */
114 /* Not in graphics mode, can ignore w/o error */
115 FIXME(int10, "Read Graphics Pixel - Not Supported\n");
116 break;
118 case 0x0e: /* TELETYPE OUTPUT */
119 _lwrite16(1, &AL_reg(context), 1);
120 break;
122 case 0x0f: /* GET CURRENT VIDEO MODE */
123 AL_reg(context) = 0x5b; /* WHY ARE WE RETURNING THIS? */
124 break;
126 case 0x10:
127 switch AL_reg(context) {
128 case 0x00: /* SET SINGLE PALETTE REGISTER */
129 FIXME(int10, "Set Single Palette Register - Not Supported\n");
130 break;
131 case 0x01: /* SET BORDER (OVERSCAN) */
132 FIXME(int10, "Set Border (Overscan) - Not Supported\n");
133 break;
134 case 0x02: /* SET ALL PALETTE REGISTERS */
135 FIXME(int10, "Set all palette registers - Not Supported\n");
136 break;
137 case 0x03: /* TOGGLE INTENSITY/BLINKING BIT */
138 FIXME(int10, "Toggle Intensity/Blinking Bit - Not Supported\n");
139 break;
140 case 0x07: /* GET INDIVIDUAL PALETTE REGISTER */
141 FIXME(int10, "Get Individual Palette Register - Not Supported\n");
142 break;
143 case 0x08: /* READ OVERSCAN (BORDER COLOR) REGISTER */
144 FIXME(int10,
145 "Read Overscan (Border Color) Register - Not Supported\n");
146 break;
147 case 0x09: /* READ ALL PALETTE REGISTERS AND OVERSCAN REGISTER */
148 FIXME(int10,
149 "Read All Palette Registers and Overscan Register "
150 " - Not Supported\n");
151 break;
152 case 0x10: /* SET INDIVIDUAL DAC REGISTER */
153 FIXME(int10, "Set Individual DAC register - Not Supported\n");
154 break;
155 case 0x12: /* SET BLOCK OF DAC REGISTERS */
156 FIXME(int10, "Set Block of DAC registers - Not Supported\n");
157 break;
158 case 0x13: /* SELECT VIDEO DAC COLOR PAGE */
159 FIXME(int10, "Select video DAC color page - Not Supported\n");
160 break;
161 case 0x15: /* READ INDIVIDUAL DAC REGISTER */
162 FIXME(int10, "Read individual DAC register - Not Supported\n");
163 break;
164 case 0x17: /* READ BLOCK OF DAC REGISTERS */
165 FIXME(int10, "Read block of DAC registers - Not Supported\n");
166 break;
167 case 0x18: /* SET PEL MASK */
168 FIXME(int10, "Set PEL mask - Not Supported\n");
169 break;
170 case 0x19: /* READ PEL MASK */
171 FIXME(int10, "Read PEL mask - Not Supported\n");
172 break;
173 case 0x1a: /* GET VIDEO DAC COLOR PAGE STATE */
174 FIXME(int10, "Get video DAC color page state - Not Supported\n");
175 break;
176 case 0x1b: /* PERFORM GRAY-SCALE SUMMING */
177 FIXME(int10, "Perform Gray-scale summing - Not Supported\n");
178 break;
179 default:
180 FIXME(int10, "INT 10 AH = 0x10 AL = 0x%x - Unknown\n",
181 AL_reg(context));
182 break;
184 break;
186 case 0x11: /* TEXT MODE CHARGEN */
187 /* Note that second subfunction is *almost* identical. */
188 /* See INTERRUPT.A for details. */
189 switch AH_reg(context) {
190 case 0x00: /* LOAD USER SPECIFIED PATTERNS */
191 case 0x10:
192 FIXME(int10, "Load User Specified Patterns - Not Supported\n");
193 break;
194 case 0x01: /* LOAD ROM MONOCHROME PATTERNS */
195 case 0x11:
196 FIXME(int10, "Load ROM Monochrome Patterns - Not Suppoted\n");
197 break;
198 case 0x02: /* LOAD ROM 8x8 DOUBLE-DOT PATTERNS */
199 case 0x12:
200 FIXME(int10,
201 "Load ROM 8x8 Double Dot Patterns - Not Supported\n");
202 break;
203 case 0x03: /* SET BLOCK SPECIFIER */
204 FIXME(int10, "Set Block Specifier - Not Supported\n");
205 break;
206 case 0x04: /* LOAD ROM 8x16 CHARACTER SET */
207 case 0x14:
208 FIXME(int10, "Load ROM 8x16 Character Set - Not Supported\n");
209 break;
210 case 0x20: /* SET USER 8x16 GRAPHICS CHARS */
211 FIXME(int10, "Set User 8x16 Graphics Chars - Not Supported\n");
212 break;
213 case 0x21: /* SET USER GRAPICS CHARACTERS */
214 FIXME(int10, "Set User Graphics Characters - Not Supported\n");
215 break;
216 case 0x22: /* SET ROM 8x14 GRAPHICS CHARS */
217 FIXME(int10, "Set ROM 8x14 Graphics Chars - Not Supported\n");
218 break;
219 case 0x23: /* SET ROM 8x8 DBL DOT CHARS */
220 FIXME(int10,
221 "Set ROM 8x8 Dbl Dot Chars (Graphics) - Not Supported\n");
222 break;
223 case 0x24: /* LOAD 8x16 GRAPHIC CHARS */
224 FIXME(int10, "Load 8x16 Graphic Chars - Not Supported\n");
225 break;
226 case 0x30: /* GET FONT INFORMATION */
227 FIXME(int10, "Get Font Information - Not Supported\n");
228 break;
229 default:
230 FIXME(int10, "INT 10 AH = 0x11 AL = 0x%x - Unknown\n",
231 AL_reg(context));
232 break;
234 break;
236 case 0x12: /* ALTERNATE FUNCTION SELECT */
237 switch BL_reg(context) {
238 case 0x10: /* GET EGA INFO */
239 TRACE(int10, "EGA Info Requested");
240 BX_reg(context) = 0x0003;
241 CX_reg(context) = 0x0009;
242 break;
243 case 0x20: /* ALTERNATE PRTSC */
244 FIXME(int10, "Install Alternate Print Screen - Not Supported\n");
245 break;
246 case 0x30: /* SELECT VERTICAL RESOULTION */
247 FIXME(int10, "Select Vertical Resoultion - Not Supported\n");
248 break;
249 case 0x31: /* ENABLE/DISABLE PALETTE LOADING */
250 FIXME(int10, "Palette Loading - Not Supported\n");
251 break;
252 case 0x32: /* ENABLE/DISABLE VIDEO ADDRERSSING */
253 FIXME(int10, "Video Addressing - Not Supported\n");
254 break;
255 case 0x33: /* ENABLE/DISABLE GRAY SCALE SUMMING */
256 FIXME(int10, "Gray Scale Summing - Not Supported\n");
257 break;
258 case 0x34: /* ENABLE/DISABLE CURSOR EMULATION */
259 FIXME(int10, "Cursor Emulation - Not Supported\n");
260 break;
261 case 0x36: /* VIDEO ADDRESS CONTROL */
262 FIXME(int10, "Video Address Control - Not Supported\n");
263 break;
264 default:
265 FIXME(int10, "INT 10 AH = 0x11 AL = 0x%x - Unknown\n",
266 AL_reg(context));
267 break;
269 break;
271 case 0x13: /* WRITE STRING */
272 /* This one does not imply that string be at cursor. */
273 FIXME(int10, "Write String - Not Supported\n");
274 break;
276 case 0x1a:
277 switch AL_reg(context) {
278 case 0x00: /* GET DISPLAY COMBINATION CODE */
279 TRACE(int10, "Get Display Combination Code");
280 /* Why are we saying this? */
281 /* Do we need to check if we are in a windows or text app? */
282 BX_reg(context) = 0x0008; /* VGA w/ color analog display */
283 break;
284 case 0x01: /* SET DISPLAY COMBINATION CODE */
285 FIXME(int10, "Set Display Combination Code - Not Supported\n");
286 break;
287 default:
288 FIXME(int10, "INT 10 AH = 0x1a AL = 0x%x - Unknown\n",
289 AL_reg(context));
290 break;
292 break;
294 case 0x1b: /* FUNCTIONALITY/STATE INFORMATION */
295 FIXME(int10, "Get Functionality/State Information - Not Supported\n");
296 break;
298 case 0x1c: /* SAVE/RESTORE VIDEO STATE */
299 FIXME(int10, "Save/Restore Video State - Not Supported\n");
300 break;
302 default:
303 FIXME(int10, "Unknown - 0x%x\n", AH_reg(context));
304 INT_BARF( context, 0x10 );