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
49 * Added support for Vesa. It is not complete but is a start.
50 * NOTE: Im not sure if i did all this right or if eny of it works.
51 * Currently i dont have a program that uses Vesa that actually gets far
52 * enough without crashing to do vesa stuff.
54 * Added additional vga graphic support - 3/99
57 void WINAPI
INT_Int10Handler( CONTEXT
*context
)
59 static int registered_colors
= FALSE
;
61 if (!registered_colors
)
64 0000b black 1000b dark gray
65 0001b blue 1001b light blue
66 0010b green 1010b light green
67 0011b cyan 1011b light cyan
68 0100b red 1100b light red
69 0101b magenta 1101b light magenta
70 0110b brown 1110b yellow
71 0111b light gray 1111b white
74 /* These AllocColor calls have the side-effect of triggering
75 ternimal initialization as xx_Init() is no longer called on
76 startup. Which is what we want anyway. */
78 color_palette
[0] = CONSOLE_AllocColor(WINE_BLACK
);
79 color_palette
[1] = CONSOLE_AllocColor(WINE_BLUE
);
80 color_palette
[2] = CONSOLE_AllocColor(WINE_GREEN
);
81 color_palette
[3] = CONSOLE_AllocColor(WINE_CYAN
);
82 color_palette
[4] = CONSOLE_AllocColor(WINE_RED
);
83 color_palette
[5] = CONSOLE_AllocColor(WINE_MAGENTA
);
84 color_palette
[6] = CONSOLE_AllocColor(WINE_BROWN
);
85 color_palette
[7] = CONSOLE_AllocColor(WINE_LIGHT_GRAY
);
86 color_palette
[8] = CONSOLE_AllocColor(WINE_DARK_GRAY
);
87 color_palette
[9] = CONSOLE_AllocColor(WINE_LIGHT_BLUE
);
88 color_palette
[10] = CONSOLE_AllocColor(WINE_LIGHT_GREEN
);
89 color_palette
[11] = CONSOLE_AllocColor(WINE_LIGHT_CYAN
);
90 color_palette
[12] = CONSOLE_AllocColor(WINE_LIGHT_RED
);
91 color_palette
[13] = CONSOLE_AllocColor(WINE_LIGHT_MAGENTA
);
92 color_palette
[14] = CONSOLE_AllocColor(WINE_YELLOW
);
93 color_palette
[15] = CONSOLE_AllocColor(WINE_WHITE
);
95 registered_colors
= TRUE
;
98 if(AL_reg(context
) == 0x4F) { /* VESA functions */
99 switch(AH_reg(context
)) {
101 case 0x00: /* GET SuperVGA INFORMATION */
102 FIXME(int10
, "Vesa Get SuperVGA Info STUB!\n");
103 AL_reg(context
) = 0x4f;
104 AH_reg(context
) = 0x01; /* 0x01=failed 0x00=succesful */
106 case 0x01: /* GET SuperVGA MODE INFORMATION */
107 FIXME(int10
, "VESA GET SuperVGA Mode Information - Not supported\n");
108 AL_reg(context
) = 0x4f;
109 AH_reg(context
) = 0x01; /* 0x00 = successful 0x01 = failed */
111 case 0x02: /* SET SuperVGA VIDEO MODE */
112 switch(BX_reg(context
)) {
113 /* OEM Video Modes */
114 case 0x00: /* 40x25 */
117 TRACE(int10
, "Set VESA Text Mode - 0x0%x\n",
119 CONSOLE_ResizeScreen(40, 25);
120 CONSOLE_ClearScreen();
121 DOSMEM_BiosData()->VideoColumns
= 40;
127 TRACE(int10
, "Set VESA Text Mode - 0x0%x\n",
129 CONSOLE_ResizeScreen(80, 25);
130 CONSOLE_ClearScreen();
131 DOSMEM_BiosData()->VideoColumns
= 80;
134 TRACE(int10
, "Setting VESA 320x200 16-color mode\n");
135 VGA_SetMode(320,200,4);
138 TRACE(int10
, "Setting VESA 640x200 16-color mode\n");
139 VGA_SetMode(640,200,4);
142 TRACE(int10
, "Setting VESA 640x350 16-color mode\n");
143 VGA_SetMode(640,350,4);
146 TRACE(int10
, "Setting VESA 640x480 16-color mode\n");
147 VGA_SetMode(640,480,4);
150 TRACE(int10
, "Setting VESA 320x200 256-color mode\n");
151 VGA_SetMode(320,200,8);
155 TRACE(int10
, "Setting VESA 640x400 256-color mode\n");
156 VGA_SetMode(640,400,8);
159 TRACE(int10
, "Setting VESA 640x480 256-color mode\n");
160 VGA_SetMode(640,480,8);
163 TRACE(int10
, "Setting VESA 800x600 16-color mode\n");
164 VGA_SetMode(800,600,4);
167 TRACE(int10
, "Setting VESA 800x600 256-color mode\n");
168 VGA_SetMode(800,600,8);
171 TRACE(int10
, "Setting VESA 1024x768 16-color mode\n");
172 VGA_SetMode(1024,768,4);
175 TRACE(int10
, "Setting VESA 1024x768 256-color mode\n");
176 VGA_SetMode(1024,768,8);
179 TRACE(int10
, "Setting VESA 1280x1024 16-color mode\n");
180 VGA_SetMode(1280,1024,4);
183 TRACE(int10
, "Setting VESA 1280x1024 256-color mode\n");
184 VGA_SetMode(1280,1024,8);
186 /* 108h - 10Ch are text modes and im lazy so :p */
189 TRACE(int10
, "Setting VESA 320x200 15bpp\n");
190 VGA_SetMode(320,200,15);
193 TRACE(int10
, "Setting VESA 320x200 16bpp\n");
194 VGA_SetMode(320,200,16);
197 TRACE(int10
, "Setting VESA 320x200 24bpp\n");
198 VGA_SetMode(320,200,24);
201 TRACE(int10
, "Setting VESA 640x480 15bpp\n");
202 VGA_SetMode(640,480,15);
205 TRACE(int10
, "Setting VESA 640x480 16bpp\n");
206 VGA_SetMode(640,480,16);
209 TRACE(int10
, "Setting VESA 640x480 24bpp\n");
210 VGA_SetMode(640,480,24);
213 TRACE(int10
, "Setting VESA 800x600 15bpp\n");
214 VGA_SetMode(800,600,15);
217 TRACE(int10
, "Setting VESA 800x600 16bpp\n");
218 VGA_SetMode(800,600,16);
221 TRACE(int10
, "Setting VESA 800x600 24bpp\n");
222 VGA_SetMode(800,600,24);
225 TRACE(int10
, "Setting VESA 1024x768 15bpp\n");
226 VGA_SetMode(1024,768,15);
229 TRACE(int10
, "Setting VESA 1024x768 16bpp\n");
230 VGA_SetMode(1024,768,16);
233 TRACE(int10
, "Setting VESA 1024x768 24bpp\n");
234 VGA_SetMode(1024,768,24);
237 TRACE(int10
, "Setting VESA 1280x1024 15bpp\n");
238 VGA_SetMode(1280,1024,15);
241 TRACE(int10
, "Setting VESA 1280x1024 16bpp\n");
242 VGA_SetMode(1280,1024,16);
245 TRACE(int10
, "Setting VESA 1280x1024 24bpp\n");
246 VGA_SetMode(1280,1024,24);
249 FIXME(int10
,"VESA Set Video Mode (0x%x) - Not Supported\n", BX_reg(context
));
251 DOSMEM_BiosData()->VideoMode
= BX_reg(context
);
252 AL_reg(context
) = 0x4f;
253 AH_reg(context
) = 0x00;
255 case 0x03: /* VESA SuperVGA BIOS - GET CURRENT VIDEO MODE */
256 AL_reg(context
) = 0x4f;
257 AH_reg(context
) = 0x00; /* should probly check if a vesa mode has ben set */
258 BX_reg(context
) = DOSMEM_BiosData()->VideoMode
;
260 case 0x04: /* VESA SuperVGA BIOS - SAVE/RESTORE SuperVGA VIDEO STATE */
261 ERR(int10
,"VESA SAVE/RESTORE Video State - Not Implemented\n");
262 /* AL_reg(context) = 0x4f; = supported so dont set since not implemented */
263 /* maby we should do this instead ? */
264 /* AH_reg(context = 0x01; not implemented so just fail */
266 case 0x05: /* VESA SuperVGA BIOS - CPU VIDEO MEMORY CONTROL */
267 ERR(int10
,"VESA CPU VIDEO MEMORY CONTROL\n");
268 /* AL_reg(context) = 0x4f; = supported so dont set since not implemented */
269 /* maby we should do this instead ? */
270 /* AH_reg(context = 0x001; not implemented so just fail */
272 case 0x06: /* VESA GET/SET LOGICAL SCAN LINE LENGTH */
273 ERR(int10
,"VESA GET/SET LOGICAL SCAN LINE LENGTH - Not Implemented\n");
274 /* AL_reg(context) = 0x4f; = supported so dont set since not implemented */
275 /* maby we should do this instead ? */
276 /* AH_reg(context = 0x001; not implemented so just fail */
278 case 0x07: /* GET/SET DISPLAY START */
279 ERR(int10
,"VESA GET/SET DISPLAY START - Not Implemented\n");
280 /* AL_reg(context) = 0x4f; = supported so dont set since not implemented */
281 /* maby we should do this instead ? */
282 /* AH_reg(context = 0x001; not implemented so just fail */
284 case 0x08: /* GET/SET DAC PALETTE CONTROL */
285 ERR(int10
,"VESA GET/SET DAC PALETTE CONTROL- Not Implemented\n");
286 /* AL_reg(context) = 0x4f; = supported so dont set since not implemented */
287 /* maby we should do this instead ? */
288 /* AH_reg(context = 0x001; not implemented so just fail */
290 case 0xff: /* Turn VESA ON/OFF */
291 /* i dont know what to do */
294 FIXME(int10
,"VESA Function (0x%x) - Not Supported\n", AH_reg(context
));
300 switch(AH_reg(context
)) {
302 case 0x00: /* SET VIDEO MODE */
304 /* (mode) (text rows/cols)
308 0x03 - 80x25 or 80x43 or 80x50 (assume 80x25)
312 switch (AL_reg(context
)) {
313 case 0x00: /* 40x25 */
316 TRACE(int10
, "Set Video Mode - Set to Text - 0x0%x\n",
318 CONSOLE_ResizeScreen(40, 25);
319 CONSOLE_ClearScreen();
320 DOSMEM_BiosData()->VideoColumns
= 40;
326 TRACE(int10
, "Set Video Mode - Set to Text - 0x0%x\n",
328 CONSOLE_ResizeScreen(80, 25);
329 CONSOLE_ClearScreen();
330 DOSMEM_BiosData()->VideoColumns
= 80;
333 TRACE(int10
, "Setting VGA 320x200 16-color mode\n");
334 VGA_SetMode(320,200,4);
337 TRACE(int10
, "Setting VGA 640x200 16-color mode\n");
338 VGA_SetMode(640,200,4);
341 TRACE(int10
, "Setting VGA 640x350 16-color mode\n");
342 VGA_SetMode(640,350,4);
345 TRACE(int10
, "Setting VGA 640x480 16-color mode\n");
346 VGA_SetMode(640,480,4);
349 TRACE(int10
, "Setting VGA 320x200 256-color mode\n");
350 VGA_SetMode(320,200,8);
353 FIXME(int10
, "Set Video Mode (0x%x) - Not Supported\n",
356 DOSMEM_BiosData()->VideoMode
= AL_reg(context
);
359 case 0x01: /* SET CURSOR SHAPE */
360 FIXME(int10
, "Set Cursor Shape - Not Supported\n");
363 case 0x02: /* SET CURSOR POSITION */
364 /* BH = Page Number */ /* Not supported */
365 /* DH = Row */ /* 0 is left */
366 /* DL = Column */ /* 0 is top */
369 FIXME(int10
, "Set Cursor Position: Cannot set to page %d\n",
374 CONSOLE_MoveCursor(DH_reg(context
), DL_reg(context
));
375 TRACE(int10
, "Set Cursor Position: %d %d\n", DH_reg(context
),
380 case 0x03: /* GET CURSOR POSITION AND SIZE */
384 FIXME(int10
, "Get cursor position and size - partially supported\n");
385 CX_reg(context
) = 0x0a0b; /* Bogus cursor data */
386 CONSOLE_GetCursorPosition(&row
, &col
);
387 DH_reg(context
) = row
;
388 DL_reg(context
) = col
;
392 case 0x04: /* READ LIGHT PEN POSITION */
393 FIXME(int10
, "Read Light Pen Position - Not Supported\n");
394 AH_reg(context
) = 0x00; /* Not down */
397 case 0x05: /* SELECT ACTIVE DISPLAY PAGE */
398 FIXME(int10
, "Select Active Display Page - Not Supported\n");
401 case 0x06: /* SCROLL UP WINDOW */
402 /* AL = Lines to scroll */
404 /* CH,CL = row, col upper-left */
405 /* DH,DL = row, col lower-right */
406 scroll_window(SCROLL_UP
, AL_reg(context
), CH_reg(context
),
407 CL_reg(context
), DH_reg(context
), DL_reg(context
),
409 TRACE(int10
, "Scroll Up Window %d\n", AL_reg(context
));
412 case 0x07: /* SCROLL DOWN WINDOW */
413 /* AL = Lines to scroll */
415 /* CH,CL = row, col upper-left */
416 /* DH,DL = row, col lower-right */
417 scroll_window(SCROLL_DOWN
, AL_reg(context
), CH_reg(context
),
418 CL_reg(context
), DH_reg(context
), DL_reg(context
),
420 TRACE(int10
, "Scroll Down Window %d\n", AL_reg(context
));
423 case 0x08: /* READ CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
425 /* Note here that color data returned is bogus, will fix later. */
428 if (BH_reg(context
)) /* Write to different page */
430 FIXME(int10
, "Read character and attribute at cursor position -"
431 " Can't read from non-0 page\n");
432 AL_reg(context
) = ' '; /* That page is blank */
438 "Read Character and Attribute at Cursor Position\n");
439 CONSOLE_GetCharacterAtCursor(&ch
, &fg
, &bg
, &attr
);
440 AL_reg(context
) = ch
;
441 AH_reg(context
) = 7; /* FIXME: We're assuming wh on bl */
446 case 0x09: /* WRITE CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
447 /* AL = Character to display. */
448 /* BH = Page Number */ /* We can't write to non-0 pages, yet. */
449 /* BL = Attribute / Color */
450 /* CX = Times to Write Char */
451 /* Note here that the cursor is not advanced. */
452 write_char_attribute_at_cursor(AL_reg(context
), BH_reg(context
),
453 BL_reg(context
), CX_reg(context
));
454 if (CX_reg(context
) > 1)
455 TRACE(int10
, "Write Character and Attribute at Cursor Position "
456 "(Rep. %d) %c\n", CX_reg(context
), AL_reg(context
));
458 TRACE(int10
, "Write Character and Attribute at Cursor"
459 "Position: %c\n", AL_reg(context
));
462 case 0x0a: /* WRITE CHARACTER ONLY AT CURSOR POSITION */
463 /* AL = Character to display. */
464 /* BH = Page Number */ /* We can't write to non-0 pages, yet. */
465 /* CX = Times to Write Char */
466 TRACE(int10
, "Write Character at Cursor\n");
467 write_char_attribute_at_cursor(AL_reg(context
), BH_reg(context
),
472 switch BH_reg(context
) {
473 case 0x00: /* SET BACKGROUND/BORDER COLOR */
474 /* In text modes, this sets only the border... */
475 /* According to the interrupt list and one of my books. */
476 /* Funny though that Beyond Zork seems to indicate that it
477 also sets up the default background attributes for clears
479 /* Bear in mind here that we do not want to change,
480 apparantly, the foreground or attribute of the background
481 with this call, so we should check first to see what the
482 foreground already is... FIXME */
483 TRACE(int10
, "Set Background/Border Color: %d\n",
485 CONSOLE_SetBackgroundColor(color_palette
[0],
486 color_palette
[BL_reg(context
)]);
488 case 0x01: /* SET PALETTE */
489 FIXME(int10
, "Set Palette - Not Supported\n");
492 FIXME(int10
, "INT 10 AH = 0x0b BH = 0x%x - Unknown\n",
498 case 0x0c: /* WRITE GRAPHICS PIXEL */
499 /* Not in graphics mode, can ignore w/o error */
500 FIXME(int10
, "Write Graphics Pixel - Not Supported\n");
503 case 0x0d: /* READ GRAPHICS PIXEL */
504 /* Not in graphics mode, can ignore w/o error */
505 FIXME(int10
, "Read Graphics Pixel - Not Supported\n");
508 case 0x0e: /* TELETYPE OUTPUT */
509 TRACE(int10
, "Teletype Output\n");
510 CONSOLE_Write(AL_reg(context
), 0, 0, 0);
513 case 0x0f: /* GET CURRENT VIDEO MODE */
514 TRACE(int10
, "Get current video mode\n");
515 /* Note: This should not be a constant value. */
516 AL_reg(context
) = DOSMEM_BiosData()->VideoMode
;
517 AH_reg(context
) = DOSMEM_BiosData()->VideoColumns
;
518 BH_reg(context
) = 0; /* Display page 0 */
522 switch AL_reg(context
) {
523 case 0x00: /* SET SINGLE PALETTE REGISTER */
524 FIXME(int10
, "Set Single Palette Register - Not Supported\n");
526 case 0x01: /* SET BORDER (OVERSCAN) */
527 /* Text terminals have no overscan */
528 TRACE(int10
, "Set Border (Overscan) - Ignored\n");
530 case 0x02: /* SET ALL PALETTE REGISTERS */
531 FIXME(int10
, "Set all palette registers - Not Supported\n");
533 case 0x03: /* TOGGLE INTENSITY/BLINKING BIT */
534 FIXME(int10
, "Toggle Intensity/Blinking Bit - Not Supported\n");
536 case 0x07: /* GET INDIVIDUAL PALETTE REGISTER */
537 FIXME(int10
, "Get Individual Palette Register - Not Supported\n");
539 case 0x08: /* READ OVERSCAN (BORDER COLOR) REGISTER */
541 "Read Overscan (Border Color) Register - Not Supported\n");
543 case 0x09: /* READ ALL PALETTE REGISTERS AND OVERSCAN REGISTER */
545 "Read All Palette Registers and Overscan Register "
546 " - Not Supported\n");
548 case 0x10: /* SET INDIVIDUAL DAC REGISTER */
549 FIXME(int10
, "Set Individual DAC register - Not Supported\n");
551 case 0x12: /* SET BLOCK OF DAC REGISTERS */
552 FIXME(int10
, "Set Block of DAC registers - Not Supported\n");
554 case 0x13: /* SELECT VIDEO DAC COLOR PAGE */
555 FIXME(int10
, "Select video DAC color page - Not Supported\n");
557 case 0x15: /* READ INDIVIDUAL DAC REGISTER */
558 FIXME(int10
, "Read individual DAC register - Not Supported\n");
560 case 0x17: /* READ BLOCK OF DAC REGISTERS */
561 FIXME(int10
, "Read block of DAC registers - Not Supported\n");
563 case 0x18: /* SET PEL MASK */
564 FIXME(int10
, "Set PEL mask - Not Supported\n");
566 case 0x19: /* READ PEL MASK */
567 FIXME(int10
, "Read PEL mask - Not Supported\n");
569 case 0x1a: /* GET VIDEO DAC COLOR PAGE STATE */
570 FIXME(int10
, "Get video DAC color page state - Not Supported\n");
572 case 0x1b: /* PERFORM GRAY-SCALE SUMMING */
573 FIXME(int10
, "Perform Gray-scale summing - Not Supported\n");
576 FIXME(int10
, "INT 10 AH = 0x10 AL = 0x%x - Unknown\n",
582 case 0x11: /* TEXT MODE CHARGEN */
583 /* Note that second subfunction is *almost* identical. */
584 /* See INTERRUPT.A for details. */
585 switch AL_reg(context
) {
586 case 0x00: /* LOAD USER SPECIFIED PATTERNS */
588 FIXME(int10
, "Load User Specified Patterns - Not Supported\n");
590 case 0x01: /* LOAD ROM MONOCHROME PATTERNS */
592 FIXME(int10
, "Load ROM Monochrome Patterns - Not Supported\n");
594 case 0x02: /* LOAD ROM 8x8 DOUBLE-DOT PATTERNS */
597 "Load ROM 8x8 Double Dot Patterns - Not Supported\n");
599 case 0x03: /* SET BLOCK SPECIFIER */
600 FIXME(int10
, "Set Block Specifier - Not Supported\n");
602 case 0x04: /* LOAD ROM 8x16 CHARACTER SET */
604 FIXME(int10
, "Load ROM 8x16 Character Set - Not Supported\n");
606 case 0x20: /* SET USER 8x16 GRAPHICS CHARS */
607 FIXME(int10
, "Set User 8x16 Graphics Chars - Not Supported\n");
609 case 0x21: /* SET USER GRAPICS CHARACTERS */
610 FIXME(int10
, "Set User Graphics Characters - Not Supported\n");
612 case 0x22: /* SET ROM 8x14 GRAPHICS CHARS */
613 FIXME(int10
, "Set ROM 8x14 Graphics Chars - Not Supported\n");
615 case 0x23: /* SET ROM 8x8 DBL DOT CHARS */
617 "Set ROM 8x8 Dbl Dot Chars (Graphics) - Not Supported\n");
619 case 0x24: /* LOAD 8x16 GRAPHIC CHARS */
620 FIXME(int10
, "Load 8x16 Graphic Chars - Not Supported\n");
622 case 0x30: /* GET FONT INFORMATION */
623 FIXME(int10
, "Get Font Information - Not Supported\n");
626 FIXME(int10
, "INT 10 AH = 0x11 AL = 0x%x - Unknown\n",
632 case 0x12: /* ALTERNATE FUNCTION SELECT */
633 switch BL_reg(context
) {
634 case 0x10: /* GET EGA INFO */
635 TRACE(int10
, "EGA info requested\n");
636 BH_reg(context
) = 0x00; /* Color screen */
638 DOSMEM_BiosData()->ModeOptions
>> 5; /* EGA memory size */
640 DOSMEM_BiosData()->FeatureBitsSwitches
;
642 case 0x20: /* ALTERNATE PRTSC */
643 FIXME(int10
, "Install Alternate Print Screen - Not Supported\n");
645 case 0x30: /* SELECT VERTICAL RESOULTION */
646 FIXME(int10
, "Select vertical resolution - not supported\n");
648 case 0x31: /* ENABLE/DISABLE DEFAULT PALETTE LOADING */
649 FIXME(int10
, "Default palette loading - not supported\n");
650 DOSMEM_BiosData()->VGASettings
=
651 (DOSMEM_BiosData()->VGASettings
& 0xf7) |
652 ((AL_reg(context
) == 1) << 3);
654 case 0x32: /* ENABLE/DISABLE VIDEO ADDRERSSING */
655 FIXME(int10
, "Video Addressing - Not Supported\n");
657 case 0x33: /* ENABLE/DISABLE GRAY SCALE SUMMING */
658 FIXME(int10
, "Gray Scale Summing - Not Supported\n");
660 case 0x34: /* ENABLE/DISABLE CURSOR EMULATION */
661 TRACE(int10
, "Set cursor emulation to %d\n", AL_reg(context
));
662 DOSMEM_BiosData()->ModeOptions
=
663 (DOSMEM_BiosData()->ModeOptions
& 0xfe)|(AL_reg(context
) == 1);
665 case 0x36: /* VIDEO ADDRESS CONTROL */
666 FIXME(int10
, "Video Address Control - Not Supported\n");
669 FIXME(int10
, "INT 10 AH = 0x11 AL = 0x%x - Unknown\n",
675 case 0x13: /* WRITE STRING */
676 /* This one does not imply that string be at cursor. */
677 FIXME(int10
, "Write String - Not Supported\n");
681 switch AL_reg(context
) {
682 case 0x00: /* GET DISPLAY COMBINATION CODE */
683 TRACE(int10
, "Get Display Combination Code\n");
684 AL_reg(context
) = 0x1a;
685 BH_reg(context
) = 0x08; /* VGA w/ color analog display */
686 BL_reg(context
) = 0x00; /* No secondary hardware */
688 case 0x01: /* SET DISPLAY COMBINATION CODE */
689 FIXME(int10
, "Set Display Combination Code - Not Supported\n");
692 FIXME(int10
, "INT 10 AH = 0x1a AL = 0x%x - Unknown\n",
698 case 0x1b: /* FUNCTIONALITY/STATE INFORMATION */
699 FIXME(int10
, "Get functionality/state information - partially implemented\n");
700 if (BX_reg(context
) == 0x0)
702 AL_reg(context
) = 0x1b;
703 if (ISV86(context
)) /* real */
704 ES_reg(context
) = 0xf000;
706 ES_reg(context
) = DOSMEM_BiosSysSeg
;
707 BX_reg(context
) = 0xe000;
711 case 0x1c: /* SAVE/RESTORE VIDEO STATE */
712 FIXME(int10
, "Save/Restore Video State - Not Supported\n");
715 case 0x4f: /* Get SuperVGA INFORMATION */
718 CTX_SEG_OFF_TO_LIN(context
, ES_reg(context
), EDI_reg(context
));
719 /* BOOL16 vesa20 = (*(DWORD *)p == *(DWORD *)"VBE2"); */
721 TRACE(int10
, "Get SuperVGA information\n");
723 *(DWORD
*)p
= *(DWORD
*)"VESA";
724 *(WORD
*)(p
+0x04) = 0x0200; /* VESA 2.0 */
725 *(DWORD
*)(p
+0x06) = 0x00000000; /* pointer to OEM name */
726 *(DWORD
*)(p
+0x0a) = 0xfffffffd; /* capabilities flags :-) */
730 FIXME(int10
, "Unknown - 0x%x\n", AH_reg(context
));
731 INT_BARF( context
, 0x10 );
736 static void write_char_attribute_at_cursor(char output
, char page_num
,
737 char attribute
, short times
)
739 /* Contrary to the interrupt list, this routine should not advance
740 the cursor. To keep this logic simple, we won't use the
741 CONSOLE_Put() routine.
744 int wattribute
, fg_color
, bg_color
;
747 if (page_num
) /* Only support one text page right now */
749 FIXME(int10
, "Cannot write to alternate page %d", page_num
);
753 conv_text_mode_attributes(attribute
, &fg_color
, &bg_color
,
756 TRACE(int10
, "Fore: %d Back: %d\n", fg_color
, bg_color
);
758 CONSOLE_GetCursorPosition(&x
, &y
);
762 CONSOLE_Write(output
, fg_color
, bg_color
, attribute
);
766 CONSOLE_MoveCursor(x
, y
);
769 static void conv_text_mode_attributes(char attribute
, int *fg
, int *bg
,
772 /* This is a local function to convert the text-mode attributes
773 to Wine's color and attribute scheme */
775 /* Foreground Color is stored in bits 3 through 0 */
776 /* Background Color is stored in bits 6 through 4 */
777 /* If this has bit 7 set, then we need to blink */
779 *fg
= color_palette
[attribute
& 15];
780 *bg
= color_palette
[(attribute
& 112) / 16];
781 *wattribute
= attribute
& 128;
785 static void scroll_window(int direction
, char lines
, char row1
,
786 char col1
, char row2
, char col2
, char attribute
)
788 int wattribute
, bg_color
, fg_color
;
790 conv_text_mode_attributes(attribute
, &fg_color
, &bg_color
,
793 if (!lines
) /* Actually, clear the window */
795 CONSOLE_ClearWindow(row1
, col1
, row2
, col2
, bg_color
, wattribute
);
797 else if (direction
== SCROLL_UP
)
799 CONSOLE_ScrollUpWindow(row1
, col1
, row2
, col2
, lines
, bg_color
,
804 CONSOLE_ScrollDownWindow(row1
, col1
, row2
, col2
, lines
, bg_color
,