2 * BIOS interrupt 10h handler
11 static void conv_text_mode_attributes(char attribute, int *fg, int *bg,
13 static void write_char_attribute_at_cursor(char output, char page_num,
14 char attribute, short times);
15 static void scroll_window(int direction, char lines, char row1,
16 char col1, char row2, char col2, char attribute);
18 static int color_palette[16];
23 /**********************************************************************
26 * Handler for int 10h (video).
29 * Most INT 10 functions for text-mode, CGA, EGA, and VGA cards
30 * are present in this list. (SVGA and XGA are not) That is not
31 * to say that all these functions should be supported, but if
32 * anyone is braindamaged enough to want to emulate one of these
33 * beasts then this should get you started.
36 * Several common graphical extensions used by Microsoft hook
37 * off of here. I have *not* added them to this list (yet). They
40 * MSHERC.COM - More functionality for Hercules cards.
41 * EGA.SYS (also MOUSE.COM) - More for EGA cards.
43 * Yes, MS also added this support into their mouse driver. Don't
44 * ask me, I don't work for them.
46 * Joseph Pranevich - 9/98
48 /* Added support for Vesa. It is not complete but is a start.
49 * NOTE: Im not sure if i did all this right or if eny of it works.
50 * Currently i dont have a program that uses Vesa that actually gets far
51 * enough without crashing to do vesa stuff.
56 void WINAPI INT_Int10Handler( CONTEXT *context )
58 static int registered_colors = FALSE;
60 if (!registered_colors)
63 0000b black 1000b dark gray
64 0001b blue 1001b light blue
65 0010b green 1010b light green
66 0011b cyan 1011b light cyan
67 0100b red 1100b light red
68 0101b magenta 1101b light magenta
69 0110b brown 1110b yellow
70 0111b light gray 1111b white
73 /* These AllocColor calls have the side-effect of triggering
74 ternimal initialization as xx_Init() is no longer called on
75 startup. Which is what we want anyway. */
77 color_palette[0] = CONSOLE_AllocColor(WINE_BLACK);
78 color_palette[1] = CONSOLE_AllocColor(WINE_BLUE);
79 color_palette[2] = CONSOLE_AllocColor(WINE_GREEN);
80 color_palette[3] = CONSOLE_AllocColor(WINE_CYAN);
81 color_palette[4] = CONSOLE_AllocColor(WINE_RED);
82 color_palette[5] = CONSOLE_AllocColor(WINE_MAGENTA);
83 color_palette[6] = CONSOLE_AllocColor(WINE_BROWN);
84 color_palette[7] = CONSOLE_AllocColor(WINE_LIGHT_GRAY);
85 color_palette[8] = CONSOLE_AllocColor(WINE_DARK_GRAY);
86 color_palette[9] = CONSOLE_AllocColor(WINE_LIGHT_BLUE);
87 color_palette[10] = CONSOLE_AllocColor(WINE_LIGHT_GREEN);
88 color_palette[11] = CONSOLE_AllocColor(WINE_LIGHT_CYAN);
89 color_palette[12] = CONSOLE_AllocColor(WINE_LIGHT_RED);
90 color_palette[13] = CONSOLE_AllocColor(WINE_LIGHT_MAGENTA);
91 color_palette[14] = CONSOLE_AllocColor(WINE_YELLOW);
92 color_palette[15] = CONSOLE_AllocColor(WINE_WHITE);
94 registered_colors = TRUE;
97 if(AL_reg(context) == 0x4F) { /* VESA functions */
98 switch(AH_reg(context)) {
100 case 0x00: /* GET SuperVGA INFORMATION */
101 FIXME(int10, "Vesa Get SuperVGA Info STUB!\n");
102 AL_reg(context) = 0x4f;
103 AH_reg(context) = 0x01; /* 0x01=failed 0x00=succesful */
105 case 0x01: /* GET SuperVGA MODE INFORMATION */
106 FIXME(int10, "VESA GET SuperVGA Mode Information - Not supported\n");
107 AL_reg(context) = 0x4f;
108 AH_reg(context) = 0x01; /* 0x00 = successful 0x01 = failed */
110 case 0x02: /* SET SuperVGA VIDEO MODE */
111 switch(BX_reg(context)) {
112 /* OEM Video Modes */
113 case 0x00: /* 40x25 */
116 TRACE(int10, "Set Video Mode - Set to Text - 0x0%x\n",
118 CONSOLE_ResizeScreen(40, 25);
119 CONSOLE_ClearScreen();
120 DOSMEM_BiosData()->VideoColumns = 40;
126 TRACE(int10, "Set Video Mode - Set to Text - 0x0%x\n",
128 CONSOLE_ResizeScreen(80, 25);
129 CONSOLE_ClearScreen();
130 DOSMEM_BiosData()->VideoColumns = 80;
133 TRACE(int10, "Setting VESA 320x200 256-color mode\n");
134 VGA_SetMode(320,200,8);
138 TRACE(int10, "Setting VESA 640x400 256-color mode\n");
139 VGA_SetMode(640,400,8);
142 TRACE(int10, "Setting VESA 640x480 256-color mode\n");
143 VGA_SetMode(640,480,8);
146 TRACE(int10, "Setting VESA 800x600 16-color mode\n");
147 VGA_SetMode(800,600,4);
150 TRACE(int10, "Setting VESA 800x600 256-color mode\n");
151 VGA_SetMode(800,600,8);
154 TRACE(int10, "Setting VESA 1024x768 16-color mode\n");
155 VGA_SetMode(1024,768,4);
158 TRACE(int10, "Setting VESA 1024x768 256-color mode\n");
159 VGA_SetMode(1024,768,8);
162 TRACE(int10, "Setting VESA 1280x1024 16-color mode\n");
163 VGA_SetMode(1280,1024,4);
166 TRACE(int10, "Setting VESA 1280x1024 256-color mode\n");
167 VGA_SetMode(1280,1024,8);
169 /* 108h - 10Ch are text modes and im lazy so :p */
172 TRACE(int10, "Setting VESA 320x200 15bpp\n");
173 VGA_SetMode(320,200,15);
176 TRACE(int10, "Setting VESA 320x200 16bpp\n");
177 VGA_SetMode(320,200,16);
180 TRACE(int10, "Setting VESA 320x200 24bpp\n");
181 VGA_SetMode(320,200,24);
184 TRACE(int10, "Setting VESA 640x480 15bpp\n");
185 VGA_SetMode(640,480,15);
188 TRACE(int10, "Setting VESA 640x480 16bpp\n");
189 VGA_SetMode(640,480,16);
192 TRACE(int10, "Setting VESA 640x480 24bpp\n");
193 VGA_SetMode(640,480,24);
196 TRACE(int10, "Setting VESA 800x600 15bpp\n");
197 VGA_SetMode(800,600,15);
200 TRACE(int10, "Setting VESA 800x600 16bpp\n");
201 VGA_SetMode(800,600,16);
204 TRACE(int10, "Setting VESA 800x600 24bpp\n");
205 VGA_SetMode(800,600,24);
208 TRACE(int10, "Setting VESA 1024x768 15bpp\n");
209 VGA_SetMode(1024,768,15);
212 TRACE(int10, "Setting VESA 1024x768 16bpp\n");
213 VGA_SetMode(1024,768,16);
216 TRACE(int10, "Setting VESA 1024x768 24bpp\n");
217 VGA_SetMode(1024,768,24);
220 TRACE(int10, "Setting VESA 1280x1024 15bpp\n");
221 VGA_SetMode(1280,1024,15);
224 TRACE(int10, "Setting VESA 1280x1024 16bpp\n");
225 VGA_SetMode(1280,1024,16);
228 TRACE(int10, "Setting VESA 1280x1024 24bpp\n");
229 VGA_SetMode(1280,1024,24);
232 FIXME(int10,"VESA Set Video Mode (0x%x) - Not Supported\n", BX_reg(context));
234 DOSMEM_BiosData()->VideoMode = BX_reg(context);
235 AL_reg(context) = 0x4f;
236 AH_reg(context) = 0x00;
238 case 0x03: /* VESA SuperVGA BIOS - GET CURRENT VIDEO MODE */
239 AL_reg(context) = 0x4f;
240 AH_reg(context) = 0x00; /* should probly check if a vesa mode has ben set */
241 BX_reg(context) = DOSMEM_BiosData()->VideoMode;
243 case 0x04: /* VESA SuperVGA BIOS - SAVE/RESTORE SuperVGA VIDEO STATE */
244 ERR(int10,"VESA SAVE/RESTORE Video State - Not Implemented\n");
245 /* AL_reg(context) = 0x4f; = supported so dont set since not implemented */
246 /* maby we should do this instead ? */
247 /* AH_reg(context = 0x01; not implemented so just fail */
249 case 0x05: /* VESA SuperVGA BIOS - CPU VIDEO MEMORY CONTROL */
250 ERR(int10,"VESA CPU VIDEO MEMORY CONTROL\n");
251 /* AL_reg(context) = 0x4f; = supported so dont set since not implemented */
252 /* maby we should do this instead ? */
253 /* AH_reg(context = 0x001; not implemented so just fail */
255 case 0x06: /* VESA GET/SET LOGICAL SCAN LINE LENGTH */
256 ERR(int10,"VESA GET/SET LOGICAL SCAN LINE LENGTH - Not Implemented\n");
257 /* AL_reg(context) = 0x4f; = supported so dont set since not implemented */
258 /* maby we should do this instead ? */
259 /* AH_reg(context = 0x001; not implemented so just fail */
261 case 0x07: /* GET/SET DISPLAY START */
262 ERR(int10,"VESA GET/SET DISPLAY START - Not Implemented\n");
263 /* AL_reg(context) = 0x4f; = supported so dont set since not implemented */
264 /* maby we should do this instead ? */
265 /* AH_reg(context = 0x001; not implemented so just fail */
267 case 0x08: /* GET/SET DAC PALETTE CONTROL */
268 ERR(int10,"VESA GET/SET DAC PALETTE CONTROL- Not Implemented\n");
269 /* AL_reg(context) = 0x4f; = supported so dont set since not implemented */
270 /* maby we should do this instead ? */
271 /* AH_reg(context = 0x001; not implemented so just fail */
273 case 0xff: /* Turn VESA ON/OFF */
274 /* i dont know what to do */
277 FIXME(int10,"VESA Function (0x%x) - Not Supported\n", AH_reg(context));
283 switch(AH_reg(context)) {
285 case 0x00: /* SET VIDEO MODE */
287 /* (mode) (text rows/cols)
291 0x03 - 80x25 or 80x43 or 80x50 (assume 80x25)
295 switch (AL_reg(context)) {
296 case 0x00: /* 40x25 */
299 TRACE(int10, "Set Video Mode - Set to Text - 0x0%x\n",
301 CONSOLE_ResizeScreen(40, 25);
302 CONSOLE_ClearScreen();
303 DOSMEM_BiosData()->VideoMode = AL_reg(context);
304 DOSMEM_BiosData()->VideoColumns = 40;
310 TRACE(int10, "Set Video Mode - Set to Text - 0x0%x\n",
312 CONSOLE_ResizeScreen(80, 25);
313 CONSOLE_ClearScreen();
314 DOSMEM_BiosData()->VideoMode = AL_reg(context);
315 DOSMEM_BiosData()->VideoColumns = 80;
318 TRACE(int10, "Setting VGA 320x200 256-color mode\n");
319 VGA_SetMode(320,200,8);
320 DOSMEM_BiosData()->VideoMode = AL_reg(context);
323 FIXME(int10, "Set Video Mode (0x%x) - Not Supported\n",
328 case 0x01: /* SET CURSOR SHAPE */
329 FIXME(int10, "Set Cursor Shape - Not Supported\n");
332 case 0x02: /* SET CURSOR POSITION */
333 /* BH = Page Number */ /* Not supported */
334 /* DH = Row */ /* 0 is left */
335 /* DL = Column */ /* 0 is top */
338 FIXME(int10, "Set Cursor Position: Cannot set to page %d\n",
343 CONSOLE_MoveCursor(DH_reg(context), DL_reg(context));
344 TRACE(int10, "Set Cursor Position: %d %d\n", DH_reg(context),
349 case 0x03: /* GET CURSOR POSITION AND SIZE */
353 FIXME(int10, "Get cursor position and size - partially supported\n");
354 CX_reg(context) = 0x0a0b; /* Bogus cursor data */
355 CONSOLE_GetCursorPosition(&row, &col);
356 DH_reg(context) = row;
357 DL_reg(context) = col;
361 case 0x04: /* READ LIGHT PEN POSITION */
362 FIXME(int10, "Read Light Pen Position - Not Supported\n");
363 AH_reg(context) = 0x00; /* Not down */
366 case 0x05: /* SELECT ACTIVE DISPLAY PAGE */
367 FIXME(int10, "Select Active Display Page - Not Supported\n");
370 case 0x06: /* SCROLL UP WINDOW */
371 /* AL = Lines to scroll */
373 /* CH,CL = row, col upper-left */
374 /* DH,DL = row, col lower-right */
375 scroll_window(SCROLL_UP, AL_reg(context), CH_reg(context),
376 CL_reg(context), DH_reg(context), DL_reg(context),
378 TRACE(int10, "Scroll Up Window %d\n", AL_reg(context));
381 case 0x07: /* SCROLL DOWN WINDOW */
382 /* AL = Lines to scroll */
384 /* CH,CL = row, col upper-left */
385 /* DH,DL = row, col lower-right */
386 scroll_window(SCROLL_DOWN, AL_reg(context), CH_reg(context),
387 CL_reg(context), DH_reg(context), DL_reg(context),
389 TRACE(int10, "Scroll Down Window %d\n", AL_reg(context));
392 case 0x08: /* READ CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
394 /* Note here that color data returned is bogus, will fix later. */
397 if (BH_reg(context)) /* Write to different page */
399 FIXME(int10, "Read character and attribute at cursor position -"
400 " Can't read from non-0 page\n");
401 AL_reg(context) = ' '; /* That page is blank */
407 "Read Character and Attribute at Cursor Position\n");
408 CONSOLE_GetCharacterAtCursor(&ch, &fg, &bg, &attr);
409 AL_reg(context) = ch;
410 AH_reg(context) = 7; /* FIXME: We're assuming wh on bl */
415 case 0x09: /* WRITE CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
416 /* AL = Character to display. */
417 /* BH = Page Number */ /* We can't write to non-0 pages, yet. */
418 /* BL = Attribute / Color */
419 /* CX = Times to Write Char */
420 /* Note here that the cursor is not advanced. */
421 write_char_attribute_at_cursor(AL_reg(context), BH_reg(context),
422 BL_reg(context), CX_reg(context));
423 if (CX_reg(context) > 1)
424 TRACE(int10, "Write Character and Attribute at Cursor Position "
425 "(Rep. %d) %c\n", CX_reg(context), AL_reg(context));
427 TRACE(int10, "Write Character and Attribute at Cursor"
428 "Position: %c\n", AL_reg(context));
431 case 0x0a: /* WRITE CHARACTER ONLY AT CURSOR POSITION */
432 /* AL = Character to display. */
433 /* BH = Page Number */ /* We can't write to non-0 pages, yet. */
434 /* CX = Times to Write Char */
435 TRACE(int10, "Write Character at Cursor\n");
436 write_char_attribute_at_cursor(AL_reg(context), BH_reg(context),
441 switch BH_reg(context) {
442 case 0x00: /* SET BACKGROUND/BORDER COLOR */
443 /* In text modes, this sets only the border... */
444 /* According to the interrupt list and one of my books. */
445 /* Funny though that Beyond Zork seems to indicate that it
446 also sets up the default background attributes for clears
448 /* Bear in mind here that we do not want to change,
449 apparantly, the foreground or attribute of the background
450 with this call, so we should check first to see what the
451 foreground already is... FIXME */
452 TRACE(int10, "Set Background/Border Color: %d\n",
454 CONSOLE_SetBackgroundColor(color_palette[0],
455 color_palette[BL_reg(context)]);
457 case 0x01: /* SET PALETTE */
458 FIXME(int10, "Set Palette - Not Supported\n");
461 FIXME(int10, "INT 10 AH = 0x0b BH = 0x%x - Unknown\n",
467 case 0x0c: /* WRITE GRAPHICS PIXEL */
468 /* Not in graphics mode, can ignore w/o error */
469 FIXME(int10, "Write Graphics Pixel - Not Supported\n");
472 case 0x0d: /* READ GRAPHICS PIXEL */
473 /* Not in graphics mode, can ignore w/o error */
474 FIXME(int10, "Read Graphics Pixel - Not Supported\n");
477 case 0x0e: /* TELETYPE OUTPUT */
478 TRACE(int10, "Teletype Output\n");
479 CONSOLE_Write(AL_reg(context), 0, 0, 0);
482 case 0x0f: /* GET CURRENT VIDEO MODE */
483 TRACE(int10, "Get current video mode\n");
484 /* Note: This should not be a constant value. */
485 AL_reg(context) = DOSMEM_BiosData()->VideoMode;
486 AH_reg(context) = DOSMEM_BiosData()->VideoColumns;
487 BH_reg(context) = 0; /* Display page 0 */
491 switch AL_reg(context) {
492 case 0x00: /* SET SINGLE PALETTE REGISTER */
493 FIXME(int10, "Set Single Palette Register - Not Supported\n");
495 case 0x01: /* SET BORDER (OVERSCAN) */
496 /* Text terminals have no overscan */
497 TRACE(int10, "Set Border (Overscan) - Ignored\n");
499 case 0x02: /* SET ALL PALETTE REGISTERS */
500 FIXME(int10, "Set all palette registers - Not Supported\n");
502 case 0x03: /* TOGGLE INTENSITY/BLINKING BIT */
503 FIXME(int10, "Toggle Intensity/Blinking Bit - Not Supported\n");
505 case 0x07: /* GET INDIVIDUAL PALETTE REGISTER */
506 FIXME(int10, "Get Individual Palette Register - Not Supported\n");
508 case 0x08: /* READ OVERSCAN (BORDER COLOR) REGISTER */
510 "Read Overscan (Border Color) Register - Not Supported\n");
512 case 0x09: /* READ ALL PALETTE REGISTERS AND OVERSCAN REGISTER */
514 "Read All Palette Registers and Overscan Register "
515 " - Not Supported\n");
517 case 0x10: /* SET INDIVIDUAL DAC REGISTER */
518 FIXME(int10, "Set Individual DAC register - Not Supported\n");
520 case 0x12: /* SET BLOCK OF DAC REGISTERS */
521 FIXME(int10, "Set Block of DAC registers - Not Supported\n");
523 case 0x13: /* SELECT VIDEO DAC COLOR PAGE */
524 FIXME(int10, "Select video DAC color page - Not Supported\n");
526 case 0x15: /* READ INDIVIDUAL DAC REGISTER */
527 FIXME(int10, "Read individual DAC register - Not Supported\n");
529 case 0x17: /* READ BLOCK OF DAC REGISTERS */
530 FIXME(int10, "Read block of DAC registers - Not Supported\n");
532 case 0x18: /* SET PEL MASK */
533 FIXME(int10, "Set PEL mask - Not Supported\n");
535 case 0x19: /* READ PEL MASK */
536 FIXME(int10, "Read PEL mask - Not Supported\n");
538 case 0x1a: /* GET VIDEO DAC COLOR PAGE STATE */
539 FIXME(int10, "Get video DAC color page state - Not Supported\n");
541 case 0x1b: /* PERFORM GRAY-SCALE SUMMING */
542 FIXME(int10, "Perform Gray-scale summing - Not Supported\n");
545 FIXME(int10, "INT 10 AH = 0x10 AL = 0x%x - Unknown\n",
551 case 0x11: /* TEXT MODE CHARGEN */
552 /* Note that second subfunction is *almost* identical. */
553 /* See INTERRUPT.A for details. */
554 switch AH_reg(context) {
555 case 0x00: /* LOAD USER SPECIFIED PATTERNS */
557 FIXME(int10, "Load User Specified Patterns - Not Supported\n");
559 case 0x01: /* LOAD ROM MONOCHROME PATTERNS */
561 FIXME(int10, "Load ROM Monochrome Patterns - Not Supported\n");
563 case 0x02: /* LOAD ROM 8x8 DOUBLE-DOT PATTERNS */
566 "Load ROM 8x8 Double Dot Patterns - Not Supported\n");
568 case 0x03: /* SET BLOCK SPECIFIER */
569 FIXME(int10, "Set Block Specifier - Not Supported\n");
571 case 0x04: /* LOAD ROM 8x16 CHARACTER SET */
573 FIXME(int10, "Load ROM 8x16 Character Set - Not Supported\n");
575 case 0x20: /* SET USER 8x16 GRAPHICS CHARS */
576 FIXME(int10, "Set User 8x16 Graphics Chars - Not Supported\n");
578 case 0x21: /* SET USER GRAPICS CHARACTERS */
579 FIXME(int10, "Set User Graphics Characters - Not Supported\n");
581 case 0x22: /* SET ROM 8x14 GRAPHICS CHARS */
582 FIXME(int10, "Set ROM 8x14 Graphics Chars - Not Supported\n");
584 case 0x23: /* SET ROM 8x8 DBL DOT CHARS */
586 "Set ROM 8x8 Dbl Dot Chars (Graphics) - Not Supported\n");
588 case 0x24: /* LOAD 8x16 GRAPHIC CHARS */
589 FIXME(int10, "Load 8x16 Graphic Chars - Not Supported\n");
591 case 0x30: /* GET FONT INFORMATION */
592 FIXME(int10, "Get Font Information - Not Supported\n");
595 FIXME(int10, "INT 10 AH = 0x11 AL = 0x%x - Unknown\n",
601 case 0x12: /* ALTERNATE FUNCTION SELECT */
602 switch BL_reg(context) {
603 case 0x10: /* GET EGA INFO */
604 TRACE(int10, "EGA info requested\n");
605 BH_reg(context) = 0x00; /* Color screen */
607 DOSMEM_BiosData()->ModeOptions >> 5; /* EGA memory size */
609 DOSMEM_BiosData()->FeatureBitsSwitches;
611 case 0x20: /* ALTERNATE PRTSC */
612 FIXME(int10, "Install Alternate Print Screen - Not Supported\n");
614 case 0x30: /* SELECT VERTICAL RESOULTION */
615 FIXME(int10, "Select vertical resolution - not supported\n");
617 case 0x31: /* ENABLE/DISABLE DEFAULT PALETTE LOADING */
618 FIXME(int10, "Default palette loading - not supported\n");
619 DOSMEM_BiosData()->VGASettings =
620 (DOSMEM_BiosData()->VGASettings & 0xf7) |
621 ((AL_reg(context) == 1) << 3);
623 case 0x32: /* ENABLE/DISABLE VIDEO ADDRERSSING */
624 FIXME(int10, "Video Addressing - Not Supported\n");
626 case 0x33: /* ENABLE/DISABLE GRAY SCALE SUMMING */
627 FIXME(int10, "Gray Scale Summing - Not Supported\n");
629 case 0x34: /* ENABLE/DISABLE CURSOR EMULATION */
630 TRACE(int10, "Set cursor emulation to %d\n", AL_reg(context));
631 DOSMEM_BiosData()->ModeOptions =
632 (DOSMEM_BiosData()->ModeOptions & 0xfe)|(AL_reg(context) == 1);
634 case 0x36: /* VIDEO ADDRESS CONTROL */
635 FIXME(int10, "Video Address Control - Not Supported\n");
638 FIXME(int10, "INT 10 AH = 0x11 AL = 0x%x - Unknown\n",
644 case 0x13: /* WRITE STRING */
645 /* This one does not imply that string be at cursor. */
646 FIXME(int10, "Write String - Not Supported\n");
650 switch AL_reg(context) {
651 case 0x00: /* GET DISPLAY COMBINATION CODE */
652 TRACE(int10, "Get Display Combination Code\n");
653 AL_reg(context) = 0x1a;
654 BH_reg(context) = 0x08; /* VGA w/ color analog display */
655 BL_reg(context) = 0x00; /* No secondary hardware */
657 case 0x01: /* SET DISPLAY COMBINATION CODE */
658 FIXME(int10, "Set Display Combination Code - Not Supported\n");
661 FIXME(int10, "INT 10 AH = 0x1a AL = 0x%x - Unknown\n",
667 case 0x1b: /* FUNCTIONALITY/STATE INFORMATION */
668 FIXME(int10, "Get functionality/state information - partially implemented\n");
669 if (BX_reg(context) == 0x0)
671 AL_reg(context) = 0x1b;
672 if (ISV86(context)) /* real */
673 ES_reg(context) = 0xf000;
675 ES_reg(context) = DOSMEM_BiosSysSeg;
676 BX_reg(context) = 0xe000;
680 case 0x1c: /* SAVE/RESTORE VIDEO STATE */
681 FIXME(int10, "Save/Restore Video State - Not Supported\n");
684 case 0x4f: /* Get SuperVGA INFORMATION */
687 CTX_SEG_OFF_TO_LIN(context, ES_reg(context), DI_reg(context));
688 BOOL16 vesa20 = (*(DWORD *)p == "VBE2");
690 TRACE(int10, "Get SuperVGA information\n");
693 *(WORD *)(p+0x04) = 0x0200; /* VESA 2.0 */
694 *(DWORD *)(p+0x06) = NULL; /* pointer to OEM name */
695 *(DWORD *)(p+0x0a) = 0xfffffffd; /* capabilities flags :-) */
699 FIXME(int10, "Unknown - 0x%x\n", AH_reg(context));
700 INT_BARF( context, 0x10 );
705 static void write_char_attribute_at_cursor(char output, char page_num,
706 char attribute, short times)
708 /* Contrary to the interrupt list, this routine should not advance
709 the cursor. To keep this logic simple, we won't use the
710 CONSOLE_Put() routine.
713 int wattribute, fg_color, bg_color;
716 if (page_num) /* Only support one text page right now */
718 FIXME(int10, "Cannot write to alternate page %d", page_num);
722 conv_text_mode_attributes(attribute, &fg_color, &bg_color,
725 TRACE(int10, "Fore: %d Back: %d\n", fg_color, bg_color);
727 CONSOLE_GetCursorPosition(&x, &y);
731 CONSOLE_Write(output, fg_color, bg_color, attribute);
735 CONSOLE_MoveCursor(x, y);
738 static void conv_text_mode_attributes(char attribute, int *fg, int *bg,
741 /* This is a local function to convert the text-mode attributes
742 to Wine's color and attribute scheme */
744 /* Foreground Color is stored in bits 3 through 0 */
745 /* Background Color is stored in bits 6 through 4 */
746 /* If this has bit 7 set, then we need to blink */
748 *fg = color_palette[attribute & 15];
749 *bg = color_palette[(attribute & 112) / 16];
750 *wattribute = attribute & 128;
754 static void scroll_window(int direction, char lines, char row1,
755 char col1, char row2, char col2, char attribute)
757 int wattribute, bg_color, fg_color;
759 conv_text_mode_attributes(attribute, &fg_color, &bg_color,
762 if (!lines) /* Actually, clear the window */
764 CONSOLE_ClearWindow(row1, col1, row2, col2, bg_color, wattribute);
766 else if (direction == SCROLL_UP)
768 CONSOLE_ScrollUpWindow(row1, col1, row2, col2, lines, bg_color,
773 CONSOLE_ScrollDownWindow(row1, col1, row2, col2, lines, bg_color,