2 * BIOS interrupt 10h handler
8 #include "debugtools.h"
11 DEFAULT_DEBUG_CHANNEL(int10
);
13 static void conv_text_mode_attributes(char attribute
, int *fg
, int *bg
,
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 /* FIXME: is row or column first? */
24 static void BIOS_GetCursorPos(BIOSDATA
*data
,unsigned page
,unsigned*X
,unsigned*Y
)
26 *X
= data
->VideoCursorPos
[page
*2];
27 *Y
= data
->VideoCursorPos
[page
*2+1];
30 static void BIOS_SetCursorPos(BIOSDATA
*data
,unsigned page
,unsigned X
,unsigned Y
)
32 data
->VideoCursorPos
[page
*2] = X
;
33 data
->VideoCursorPos
[page
*2+1] = Y
;
36 /**********************************************************************
39 * Handler for int 10h (video).
42 * Most INT 10 functions for text-mode, CGA, EGA, and VGA cards
43 * are present in this list. (SVGA and XGA are not) That is not
44 * to say that all these functions should be supported, but if
45 * anyone is brain-damaged enough to want to emulate one of these
46 * beasts then this should get you started.
49 * Several common graphical extensions used by Microsoft hook
50 * off of here. I have *not* added them to this list (yet). They
53 * MSHERC.COM - More functionality for Hercules cards.
54 * EGA.SYS (also MOUSE.COM) - More for EGA cards.
56 * Yes, MS also added this support into their mouse driver. Don't
57 * ask me, I don't work for them.
59 * Joseph Pranevich - 9/98
62 * Added support for Vesa. It is not complete but is a start.
63 * NOTE: Im not sure if i did all this right or if eny of it works.
64 * Currently i dont have a program that uses Vesa that actually gets far
65 * enough without crashing to do vesa stuff.
67 * Added additional vga graphic support - 3/99
70 void WINAPI
INT_Int10Handler( CONTEXT86
*context
)
72 static int registered_colors
= FALSE
;
73 BIOSDATA
*data
= DOSMEM_BiosData();
75 if (!registered_colors
)
78 0000b black 1000b dark gray
79 0001b blue 1001b light blue
80 0010b green 1010b light green
81 0011b cyan 1011b light cyan
82 0100b red 1100b light red
83 0101b magenta 1101b light magenta
84 0110b brown 1110b yellow
85 0111b light gray 1111b white
88 /* These AllocColor calls have the side-effect of triggering
89 terminal initialization as xx_Init() is no longer called on
90 startup. Which is what we want anyway. */
92 color_palette
[0] = CONSOLE_AllocColor(WINE_BLACK
);
93 color_palette
[1] = CONSOLE_AllocColor(WINE_BLUE
);
94 color_palette
[2] = CONSOLE_AllocColor(WINE_GREEN
);
95 color_palette
[3] = CONSOLE_AllocColor(WINE_CYAN
);
96 color_palette
[4] = CONSOLE_AllocColor(WINE_RED
);
97 color_palette
[5] = CONSOLE_AllocColor(WINE_MAGENTA
);
98 color_palette
[6] = CONSOLE_AllocColor(WINE_BROWN
);
99 color_palette
[7] = CONSOLE_AllocColor(WINE_LIGHT_GRAY
);
100 color_palette
[8] = CONSOLE_AllocColor(WINE_DARK_GRAY
);
101 color_palette
[9] = CONSOLE_AllocColor(WINE_LIGHT_BLUE
);
102 color_palette
[10] = CONSOLE_AllocColor(WINE_LIGHT_GREEN
);
103 color_palette
[11] = CONSOLE_AllocColor(WINE_LIGHT_CYAN
);
104 color_palette
[12] = CONSOLE_AllocColor(WINE_LIGHT_RED
);
105 color_palette
[13] = CONSOLE_AllocColor(WINE_LIGHT_MAGENTA
);
106 color_palette
[14] = CONSOLE_AllocColor(WINE_YELLOW
);
107 color_palette
[15] = CONSOLE_AllocColor(WINE_WHITE
);
109 registered_colors
= TRUE
;
112 if(AL_reg(context
) == 0x4F) { /* VESA functions */
113 switch(AH_reg(context
)) {
115 case 0x00: /* GET SuperVGA INFORMATION */
116 FIXME("Vesa Get SuperVGA Info STUB!\n");
117 AL_reg(context
) = 0x4f;
118 AH_reg(context
) = 0x01; /* 0x01=failed 0x00=succesful */
120 case 0x01: /* GET SuperVGA MODE INFORMATION */
121 FIXME("VESA GET SuperVGA Mode Information - Not supported\n");
122 AL_reg(context
) = 0x4f;
123 AH_reg(context
) = 0x01; /* 0x00 = successful 0x01 = failed */
125 case 0x02: /* SET SuperVGA VIDEO MODE */
126 switch(BX_reg(context
)) {
127 /* OEM Video Modes */
128 case 0x00: /* 40x25 */
130 TRACE("Set VESA Text Mode - 0x0%x\n",
132 VGA_SetAlphaMode(40, 25);
133 data
->VideoColumns
= 40;
138 TRACE("Set VESA Text Mode - 0x0%x\n",
140 VGA_SetAlphaMode(80, 25);
141 data
->VideoColumns
= 80;
144 TRACE("Setting VESA 320x200 16-color mode\n");
145 VGA_SetMode(320,200,4);
148 TRACE("Setting VESA 640x200 16-color mode\n");
149 VGA_SetMode(640,200,4);
152 TRACE("Setting VESA 640x350 16-color mode\n");
153 VGA_SetMode(640,350,4);
156 TRACE("Setting VESA 640x480 16-color mode\n");
157 VGA_SetMode(640,480,4);
160 TRACE("Setting VESA 320x200 256-color mode\n");
161 VGA_SetMode(320,200,8);
165 TRACE("Setting VESA 640x400 256-color mode\n");
166 VGA_SetMode(640,400,8);
169 TRACE("Setting VESA 640x480 256-color mode\n");
170 VGA_SetMode(640,480,8);
173 TRACE("Setting VESA 800x600 16-color mode\n");
174 VGA_SetMode(800,600,4);
177 TRACE("Setting VESA 800x600 256-color mode\n");
178 VGA_SetMode(800,600,8);
181 TRACE("Setting VESA 1024x768 16-color mode\n");
182 VGA_SetMode(1024,768,4);
185 TRACE("Setting VESA 1024x768 256-color mode\n");
186 VGA_SetMode(1024,768,8);
189 TRACE("Setting VESA 1280x1024 16-color mode\n");
190 VGA_SetMode(1280,1024,4);
193 TRACE("Setting VESA 1280x1024 256-color mode\n");
194 VGA_SetMode(1280,1024,8);
196 /* 108h - 10Ch are text modes and im lazy so :p */
199 TRACE("Setting VESA 320x200 15bpp\n");
200 VGA_SetMode(320,200,15);
203 TRACE("Setting VESA 320x200 16bpp\n");
204 VGA_SetMode(320,200,16);
207 TRACE("Setting VESA 320x200 24bpp\n");
208 VGA_SetMode(320,200,24);
211 TRACE("Setting VESA 640x480 15bpp\n");
212 VGA_SetMode(640,480,15);
215 TRACE("Setting VESA 640x480 16bpp\n");
216 VGA_SetMode(640,480,16);
219 TRACE("Setting VESA 640x480 24bpp\n");
220 VGA_SetMode(640,480,24);
223 TRACE("Setting VESA 800x600 15bpp\n");
224 VGA_SetMode(800,600,15);
227 TRACE("Setting VESA 800x600 16bpp\n");
228 VGA_SetMode(800,600,16);
231 TRACE("Setting VESA 800x600 24bpp\n");
232 VGA_SetMode(800,600,24);
235 TRACE("Setting VESA 1024x768 15bpp\n");
236 VGA_SetMode(1024,768,15);
239 TRACE("Setting VESA 1024x768 16bpp\n");
240 VGA_SetMode(1024,768,16);
243 TRACE("Setting VESA 1024x768 24bpp\n");
244 VGA_SetMode(1024,768,24);
247 TRACE("Setting VESA 1280x1024 15bpp\n");
248 VGA_SetMode(1280,1024,15);
251 TRACE("Setting VESA 1280x1024 16bpp\n");
252 VGA_SetMode(1280,1024,16);
255 TRACE("Setting VESA 1280x1024 24bpp\n");
256 VGA_SetMode(1280,1024,24);
259 FIXME("VESA Set Video Mode (0x%x) - Not Supported\n", BX_reg(context
));
261 data
->VideoMode
= BX_reg(context
);
262 AL_reg(context
) = 0x4f;
263 AH_reg(context
) = 0x00;
265 case 0x03: /* VESA SuperVGA BIOS - GET CURRENT VIDEO MODE */
266 AL_reg(context
) = 0x4f;
267 AH_reg(context
) = 0x00; /* should probly check if a vesa mode has ben set */
268 BX_reg(context
) = data
->VideoMode
;
270 case 0x04: /* VESA SuperVGA BIOS - SAVE/RESTORE SuperVGA VIDEO STATE */
271 ERR("VESA SAVE/RESTORE Video State - Not Implemented\n");
272 /* AL_reg(context) = 0x4f; = supported so not set since not implemented */
273 /* maybe we should do this instead ? */
274 /* AH_reg(context = 0x01; not implemented so just fail */
276 case 0x05: /* VESA SuperVGA BIOS - CPU VIDEO MEMORY CONTROL */
277 ERR("VESA CPU VIDEO MEMORY CONTROL\n");
278 /* AL_reg(context) = 0x4f; = supported so not set since not implemented */
279 /* maybe we should do this instead ? */
280 /* AH_reg(context = 0x001; not implemented so just fail */
282 case 0x06: /* VESA GET/SET LOGICAL SCAN LINE LENGTH */
283 ERR("VESA GET/SET LOGICAL SCAN LINE LENGTH - Not Implemented\n");
284 /* AL_reg(context) = 0x4f; = supported so not set since not implemented */
285 /* maybe we should do this instead ? */
286 /* AH_reg(context = 0x001; not implemented so just fail */
288 case 0x07: /* GET/SET DISPLAY START */
289 ERR("VESA GET/SET DISPLAY START - Not Implemented\n");
290 /* AL_reg(context) = 0x4f; = supported so not set since not implemented */
291 /* maybe we should do this instead ? */
292 /* AH_reg(context = 0x001; not implemented so just fail */
294 case 0x08: /* GET/SET DAC PALETTE CONTROL */
295 ERR("VESA GET/SET DAC PALETTE CONTROL- Not Implemented\n");
296 /* AL_reg(context) = 0x4f; = supported so not set since not implemented */
297 /* maybe we should do this instead ? */
298 /* AH_reg(context = 0x001; not implemented so just fail */
300 case 0x09: /* SET PALETTE ENTRIES */
301 FIXME("VESA Set palette entries - not implemented\n");
303 case 0xef: /* get video mode for hercules-compatibles */
304 /* There's no reason to really support this */
305 /* is there?....................(A.C.) */
306 TRACE("Just report the video not hercules compatible\n");
307 DX_reg(context
) = 0xffff;
309 case 0xff: /* Turn VESA ON/OFF */
310 /* i dont know what to do */
313 FIXME("VESA Function (0x%x) - Not Supported\n", AH_reg(context
));
319 switch(AH_reg(context
)) {
321 case 0x00: /* SET VIDEO MODE */
323 /* (mode) (text rows/cols)
327 0x03 - 80x25 or 80x43 or 80x50 (assume 80x25)
331 switch (AL_reg(context
)) {
332 case 0x00: /* 40x25 */
335 TRACE("Set Video Mode - Set to Text - 0x0%x\n",
337 VGA_SetAlphaMode(40, 25);
338 data
->VideoColumns
= 40;
344 TRACE("Set Video Mode - Set to Text - 0x0%x\n",
346 VGA_SetAlphaMode(80, 25);
347 data
->VideoColumns
= 80;
350 TRACE("Setting VGA 320x200 16-color mode\n");
351 VGA_SetMode(320,200,4);
354 TRACE("Setting VGA 640x200 16-color mode\n");
355 VGA_SetMode(640,200,4);
358 TRACE("Setting VGA 640x350 16-color mode\n");
359 VGA_SetMode(640,350,4);
362 TRACE("Setting VGA 640x480 16-color mode\n");
363 VGA_SetMode(640,480,4);
366 TRACE("Setting VGA 320x200 256-color mode\n");
367 VGA_SetMode(320,200,8);
370 FIXME("Set Video Mode (0x%x) - Not Supported\n",
373 data
->VideoMode
= AL_reg(context
);
376 case 0x01: /* SET CURSOR SHAPE */
377 FIXME("Set Cursor Shape - Not Supported\n");
380 case 0x02: /* SET CURSOR POSITION */
381 /* BH = Page Number */ /* Not supported */
382 /* DH = Row */ /* 0 is left */
383 /* DL = Column */ /* 0 is top */
384 BIOS_SetCursorPos(data
,BH_reg(context
),DL_reg(context
),DH_reg(context
));
387 FIXME("Set Cursor Position: Cannot set to page %d\n",
392 VGA_SetCursorPos(DL_reg(context
), DH_reg(context
));
393 TRACE("Set Cursor Position: %d %d\n", DH_reg(context
),
398 case 0x03: /* GET CURSOR POSITION AND SIZE */
402 TRACE("Get cursor position and size (page %d)\n", BH_reg(context
));
403 CX_reg(context
) = data
->VideoCursorType
;
404 BIOS_GetCursorPos(data
,BH_reg(context
),&col
,&row
);
405 DH_reg(context
) = row
;
406 DL_reg(context
) = col
;
407 TRACE("Cursor Position: %d %d\n", DH_reg(context
), DL_reg(context
));
411 case 0x04: /* READ LIGHT PEN POSITION */
412 FIXME("Read Light Pen Position - Not Supported\n");
413 AH_reg(context
) = 0x00; /* Not down */
416 case 0x05: /* SELECT ACTIVE DISPLAY PAGE */
417 FIXME("Select Active Display Page - Not Supported\n");
418 data
->VideoCurPage
= AL_reg(context
);
421 case 0x06: /* SCROLL UP WINDOW */
422 /* AL = Lines to scroll */
424 /* CH,CL = row, col upper-left */
425 /* DH,DL = row, col lower-right */
426 scroll_window(SCROLL_UP
, AL_reg(context
), CH_reg(context
),
427 CL_reg(context
), DH_reg(context
), DL_reg(context
),
429 TRACE("Scroll Up Window %d\n", AL_reg(context
));
432 case 0x07: /* SCROLL DOWN WINDOW */
433 /* AL = Lines to scroll */
435 /* CH,CL = row, col upper-left */
436 /* DH,DL = row, col lower-right */
437 scroll_window(SCROLL_DOWN
, AL_reg(context
), CH_reg(context
),
438 CL_reg(context
), DH_reg(context
), DL_reg(context
),
440 TRACE("Scroll Down Window %d\n", AL_reg(context
));
443 case 0x08: /* READ CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
445 /* Note here that color data returned is bogus, will fix later. */
448 if (BH_reg(context
)) /* Write to different page */
450 FIXME("Read character and attribute at cursor position -"
451 " Can't read from non-0 page\n");
452 AL_reg(context
) = ' '; /* That page is blank */
458 "Read Character and Attribute at Cursor Position\n");
459 CONSOLE_GetCharacterAtCursor(&ch
, &fg
, &bg
, &attr
);
460 AL_reg(context
) = ch
;
461 AH_reg(context
) = 7; /* FIXME: We're assuming wh on bl */
466 case 0x09: /* WRITE CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
467 case 0x0a: /* WRITE CHARACTER ONLY AT CURSOR POSITION */
468 /* AL = Character to display. */
469 /* BH = Page Number */ /* We can't write to non-0 pages, yet. */
470 /* BL = Attribute / Color */
471 /* CX = Times to Write Char */
472 /* Note here that the cursor is not advanced. */
476 BIOS_GetCursorPos(data
,BH_reg(context
),&col
,&row
);
477 VGA_WriteChars(col
, row
,
479 (AH_reg(context
) == 0x09) ? BL_reg(context
) : -1,
481 if (CX_reg(context
) > 1)
482 TRACE("Write Character%s at Cursor Position "
483 "(Rep. %d): %c\n", (AH_reg(context
) == 0x09) ? " and Attribute" : "",
484 CX_reg(context
), AL_reg(context
));
486 TRACE("Write Character%s at Cursor "
487 "Position: %c\n", (AH_reg(context
) == 0x09) ? " and Attribute" : "",
493 switch BH_reg(context
) {
494 case 0x00: /* SET BACKGROUND/BORDER COLOR */
495 /* In text modes, this sets only the border... */
496 /* According to the interrupt list and one of my books. */
497 /* Funny though that Beyond Zork seems to indicate that it
498 also sets up the default background attributes for clears
500 /* Bear in mind here that we do not want to change,
501 apparantly, the foreground or attribute of the background
502 with this call, so we should check first to see what the
503 foreground already is... FIXME */
504 TRACE("Set Background/Border Color: %d\n",
506 CONSOLE_SetBackgroundColor(color_palette
[0],
507 color_palette
[BL_reg(context
)]);
509 case 0x01: /* SET PALETTE */
510 FIXME("Set Palette - Not Supported\n");
513 FIXME("INT 10 AH = 0x0b BH = 0x%x - Unknown\n",
519 case 0x0c: /* WRITE GRAPHICS PIXEL */
520 /* Not in graphics mode, can ignore w/o error */
521 FIXME("Write Graphics Pixel - Not Supported\n");
524 case 0x0d: /* READ GRAPHICS PIXEL */
525 /* Not in graphics mode, can ignore w/o error */
526 FIXME("Read Graphics Pixel - Not Supported\n");
529 case 0x0e: /* TELETYPE OUTPUT */
530 TRACE("Teletype Output\n");
531 CONSOLE_Write(AL_reg(context
), 0, 0, 0);
534 case 0x0f: /* GET CURRENT VIDEO MODE */
535 TRACE("Get current video mode\n");
536 /* Note: This should not be a constant value. */
537 AL_reg(context
) = data
->VideoMode
;
538 AH_reg(context
) = data
->VideoColumns
;
539 BH_reg(context
) = 0; /* Display page 0 */
543 switch AL_reg(context
) {
544 case 0x00: /* SET SINGLE PALETTE REGISTER */
545 FIXME("Set Single Palette Register - Not Supported\n");
547 case 0x01: /* SET BORDER (OVERSCAN) */
548 /* Text terminals have no overscan */
549 TRACE("Set Border (Overscan) - Ignored\n");
551 case 0x02: /* SET ALL PALETTE REGISTERS */
552 FIXME("Set all palette registers - Not Supported\n");
554 case 0x03: /* TOGGLE INTENSITY/BLINKING BIT */
555 FIXME("Toggle Intensity/Blinking Bit - Not Supported\n");
557 case 0x07: /* GET INDIVIDUAL PALETTE REGISTER */
558 FIXME("Get Individual Palette Register - Not Supported\n");
560 case 0x08: /* READ OVERSCAN (BORDER COLOR) REGISTER */
562 "Read Overscan (Border Color) Register - Not Supported\n");
564 case 0x09: /* READ ALL PALETTE REGISTERS AND OVERSCAN REGISTER */
566 "Read All Palette Registers and Overscan Register "
567 " - Not Supported\n");
569 case 0x10: /* SET INDIVIDUAL DAC REGISTER */
570 FIXME("Set Individual DAC register - Not Supported\n");
572 case 0x12: /* SET BLOCK OF DAC REGISTERS */
573 FIXME("Set Block of DAC registers - Not Supported\n");
575 case 0x13: /* SELECT VIDEO DAC COLOR PAGE */
576 FIXME("Select video DAC color page - Not Supported\n");
578 case 0x15: /* READ INDIVIDUAL DAC REGISTER */
579 FIXME("Read individual DAC register - Not Supported\n");
581 case 0x17: /* READ BLOCK OF DAC REGISTERS */
582 FIXME("Read block of DAC registers - Not Supported\n");
584 case 0x18: /* SET PEL MASK */
585 FIXME("Set PEL mask - Not Supported\n");
587 case 0x19: /* READ PEL MASK */
588 FIXME("Read PEL mask - Not Supported\n");
590 case 0x1a: /* GET VIDEO DAC COLOR PAGE STATE */
591 FIXME("Get video DAC color page state - Not Supported\n");
593 case 0x1b: /* PERFORM GRAY-SCALE SUMMING */
594 FIXME("Perform Gray-scale summing - Not Supported\n");
597 FIXME("INT 10 AH = 0x10 AL = 0x%x - Unknown\n",
603 case 0x11: /* TEXT MODE CHARGEN */
604 /* Note that second subfunction is *almost* identical. */
605 /* See INTERRUPT.A for details. */
606 switch AL_reg(context
) {
607 case 0x00: /* LOAD USER SPECIFIED PATTERNS */
609 FIXME("Load User Specified Patterns - Not Supported\n");
611 case 0x01: /* LOAD ROM MONOCHROME PATTERNS */
613 FIXME("Load ROM Monochrome Patterns - Not Supported\n");
615 case 0x02: /* LOAD ROM 8x8 DOUBLE-DOT PATTERNS */
618 "Load ROM 8x8 Double Dot Patterns - Not Supported\n");
620 case 0x03: /* SET BLOCK SPECIFIER */
621 FIXME("Set Block Specifier - Not Supported\n");
623 case 0x04: /* LOAD ROM 8x16 CHARACTER SET */
625 FIXME("Load ROM 8x16 Character Set - Not Supported\n");
627 case 0x20: /* SET USER 8x16 GRAPHICS CHARS */
628 FIXME("Set User 8x16 Graphics Chars - Not Supported\n");
630 case 0x21: /* SET USER GRAPICS CHARACTERS */
631 FIXME("Set User Graphics Characters - Not Supported\n");
633 case 0x22: /* SET ROM 8x14 GRAPHICS CHARS */
634 FIXME("Set ROM 8x14 Graphics Chars - Not Supported\n");
636 case 0x23: /* SET ROM 8x8 DBL DOT CHARS */
638 "Set ROM 8x8 Dbl Dot Chars (Graphics) - Not Supported\n");
640 case 0x24: /* LOAD 8x16 GRAPHIC CHARS */
641 FIXME("Load 8x16 Graphic Chars - Not Supported\n");
643 case 0x30: /* GET FONT INFORMATION */
644 FIXME("Get Font Information - Not Supported\n");
647 FIXME("INT 10 AH = 0x11 AL = 0x%x - Unknown\n",
653 case 0x12: /* ALTERNATE FUNCTION SELECT */
654 switch BL_reg(context
) {
655 case 0x10: /* GET EGA INFO */
656 TRACE("EGA info requested\n");
657 BH_reg(context
) = 0x00; /* Color screen */
659 data
->ModeOptions
>> 5; /* EGA memory size */
661 data
->FeatureBitsSwitches
;
663 case 0x20: /* ALTERNATE PRTSC */
664 FIXME("Install Alternate Print Screen - Not Supported\n");
666 case 0x30: /* SELECT VERTICAL RESOULTION */
667 FIXME("Select vertical resolution - not supported\n");
669 case 0x31: /* ENABLE/DISABLE DEFAULT PALETTE LOADING */
670 FIXME("Default palette loading - not supported\n");
672 (data
->VGASettings
& 0xf7) |
673 ((AL_reg(context
) == 1) << 3);
675 case 0x32: /* ENABLE/DISABLE VIDEO ADDRERSSING */
676 FIXME("Video Addressing - Not Supported\n");
678 case 0x33: /* ENABLE/DISABLE GRAY SCALE SUMMING */
679 FIXME("Gray Scale Summing - Not Supported\n");
681 case 0x34: /* ENABLE/DISABLE CURSOR EMULATION */
682 TRACE("Set cursor emulation to %d\n", AL_reg(context
));
684 (data
->ModeOptions
& 0xfe)|(AL_reg(context
) == 1);
686 case 0x36: /* VIDEO ADDRESS CONTROL */
687 FIXME("Video Address Control - Not Supported\n");
690 FIXME("INT 10 AH = 0x11 AL = 0x%x - Unknown\n",
696 case 0x13: /* WRITE STRING */
697 /* This one does not imply that string be at cursor. */
698 FIXME("Write String - Not Supported\n");
702 switch AL_reg(context
) {
703 case 0x00: /* GET DISPLAY COMBINATION CODE */
704 TRACE("Get Display Combination Code\n");
705 AX_reg(context
) = 0x001a;
706 BL_reg(context
) = 0x08; /* VGA w/ color analog display */
707 BH_reg(context
) = 0x00; /* No secondary hardware */
709 case 0x01: /* SET DISPLAY COMBINATION CODE */
710 FIXME("Set Display Combination Code - Not Supported\n");
713 FIXME("INT 10 AH = 0x1a AL = 0x%x - Unknown\n",
719 case 0x1b: /* FUNCTIONALITY/STATE INFORMATION */
720 FIXME("Get functionality/state information - partially implemented\n");
721 if (BX_reg(context
) == 0x0)
723 AL_reg(context
) = 0x1b;
724 if (ISV86(context
)) /* real */
725 context
->SegEs
= 0xf000;
727 context
->SegEs
= DOSMEM_BiosSysSeg
;
728 BX_reg(context
) = 0xe000;
732 case 0x1c: /* SAVE/RESTORE VIDEO STATE */
733 FIXME("Save/Restore Video State - Not Supported\n");
736 case 0x4f: /* Get SuperVGA INFORMATION */
739 CTX_SEG_OFF_TO_LIN(context
, context
->SegEs
, context
->Edi
);
740 /* BOOL16 vesa20 = (*(DWORD *)p == *(DWORD *)"VBE2"); */
742 TRACE("Get SuperVGA information\n");
744 *(DWORD
*)p
= *(DWORD
*)"VESA";
745 *(WORD
*)(p
+0x04) = 0x0200; /* VESA 2.0 */
746 *(DWORD
*)(p
+0x06) = 0x00000000; /* pointer to OEM name */
747 *(DWORD
*)(p
+0x0a) = 0xfffffffd; /* capabilities flags :-) */
750 case 0xef: /* get video mode for hercules-compatibles */
751 /* There's no reason to really support this */
752 /* is there?....................(A.C.) */
753 TRACE("Just report the video not hercules compatible\n");
754 DX_reg(context
) = 0xffff;
757 FIXME("Unknown - 0x%x\n", AH_reg(context
));
758 INT_BARF( context
, 0x10 );
763 static void conv_text_mode_attributes(char attribute
, int *fg
, int *bg
,
766 /* This is a local function to convert the text-mode attributes
767 to Wine's color and attribute scheme */
769 /* Foreground Color is stored in bits 3 through 0 */
770 /* Background Color is stored in bits 6 through 4 */
771 /* If this has bit 7 set, then we need to blink */
773 *fg
= color_palette
[attribute
& 15];
774 *bg
= color_palette
[(attribute
& 112) / 16];
775 *wattribute
= attribute
& 128;
779 static void scroll_window(int direction
, char lines
, char row1
,
780 char col1
, char row2
, char col2
, char attribute
)
782 int wattribute
, bg_color
, fg_color
;
784 conv_text_mode_attributes(attribute
, &fg_color
, &bg_color
,
787 if (!lines
) /* Actually, clear the window */
789 CONSOLE_ClearWindow(row1
, col1
, row2
, col2
, bg_color
, wattribute
);
791 else if (direction
== SCROLL_UP
)
793 CONSOLE_ScrollUpWindow(row1
, col1
, row2
, col2
, lines
, bg_color
,
798 CONSOLE_ScrollDownWindow(row1
, col1
, row2
, col2
, lines
, bg_color
,