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