int10 / unify vga and vesa mode handling
Jukka Heinonen
jhei at iki.fi
Fri Jan 24 13:57:09 CST 2003
This patch replaces separate VGA and VESA mode
switch-case constructs with one function that fetches
mode information from a table. This simplifies the code
a bit and - which is more important - makes it possible
to provide VESA mode information using the same table.
Changelog:
Unify VGA and VESA video mode setting code.
Index: dlls/winedos/int10.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/int10.c,v
retrieving revision 1.24
diff -u -r1.24 int10.c
--- dlls/winedos/int10.c 23 Jan 2003 01:22:40 -0000 1.24
+++ dlls/winedos/int10.c 24 Jan 2003 19:48:00 -0000
@@ -31,6 +31,161 @@
WINE_DEFAULT_DEBUG_CHANNEL(int);
+/*
+ * Wine internal information about video modes.
+ * If depth is zero, the mode is considered to
+ * be a text mode.
+ */
+typedef struct {
+ WORD Mode;
+ WORD Width;
+ WORD Height;
+ WORD Depth;
+} INT10_MODE;
+
+
+/*
+ * List of supported video modes.
+ */
+static const INT10_MODE INT10_modelist[] =
+{
+ {0x0000, 40, 25, 0},
+ {0x0001, 40, 25, 0},
+ {0x0002, 80, 25, 0},
+ {0x0003, 80, 25, 0},
+ {0x0007, 80, 25, 0},
+ {0x000d, 320, 200, 4},
+ {0x000e, 640, 200, 4},
+ {0x0010, 640, 350, 4},
+ {0x0012, 640, 480, 4},
+ {0x0013, 320, 200, 8},
+ {0x0100, 640, 400, 8},
+ {0x0101, 640, 480, 8},
+ {0x0102, 800, 600, 4},
+ {0x0103, 800, 600, 8},
+ {0x0104, 1024, 768, 4},
+ {0x0105, 1024, 768, 8},
+ {0x0106, 1280, 1024, 4},
+ {0x0107, 1280, 1024, 8},
+ {0x0108, 80, 60, 0},
+ {0x0109, 132, 25, 0},
+ {0x010a, 132, 43, 0},
+ {0x010b, 132, 50, 0},
+ {0x010c, 132, 60, 0},
+ {0x010d, 320, 200, 15},
+ {0x010e, 320, 200, 16},
+ {0x010f, 320, 200, 24},
+ {0x0110, 640, 480, 15},
+ {0x0111, 640, 480, 16},
+ {0x0112, 640, 480, 24},
+ {0x0113, 800, 600, 15},
+ {0x0114, 800, 600, 16},
+ {0x0115, 800, 600, 24},
+ {0x0116, 1024, 768, 15},
+ {0x0117, 1024, 768, 16},
+ {0x0118, 1024, 768, 24},
+ {0x0119, 1280, 1024, 15},
+ {0x011a, 1280, 1024, 16},
+ {0x011b, 1280, 1024, 24},
+ {0xffff, 0, 0, 0}
+};
+
+
+/**********************************************************************
+ * INT10_FindMode
+ */
+static const INT10_MODE *INT10_FindMode( WORD mode )
+{
+ const INT10_MODE *ptr = INT10_modelist;
+
+ /*
+ * Filter out flags.
+ */
+ mode &= 0x17f;
+
+ while (ptr->Mode != 0xffff)
+ {
+ if (ptr->Mode == mode)
+ return ptr;
+ ptr++;
+ }
+
+ return NULL;
+}
+
+
+/**********************************************************************
+ * INT10_SetVideoMode
+ *
+ * Change current video mode to any VGA or VESA mode.
+ * Returns TRUE if mode is supported.
+ *
+ * Mode bitfields:
+ * 0-6: .. Mode number (combined with bit 8).
+ * 7: =0 Clear screen.
+ * =1 Preserve display memory on mode change (VGA modes).
+ * 8: =0 VGA mode.
+ * =1 VESA mode.
+ * 9: .. Reserved, must be zero.
+ * 10: .. Reserved, must be zero.
+ * 11: =0 Use default refresh rate.
+ * =1 Use user specified refresh rate.
+ * 12: .. Reserved, must be zero.
+ * 13: .. Reserved, must be zero.
+ * 14: =0 Use windowed frame buffer model.
+ * =1 Use linear frame buffer model.
+ * 15: =0 Clear screen.
+ * =1 Preserve display memory on mode change (VESA modes).
+ */
+static BOOL INT10_SetVideoMode( BIOSDATA *data, WORD mode )
+{
+ const INT10_MODE *ptr = INT10_FindMode( mode );
+
+ if (!ptr)
+ return FALSE;
+
+ /*
+ * Linear framebuffer is not supported.
+ */
+ if (mode & 0x4000)
+ return FALSE;
+
+ /*
+ * Note that we do not mask out flags here on purpose.
+ *
+ * FIXME: Store VESA mode somewhere.
+ */
+ if (mode <= 0xff)
+ data->VideoMode = mode;
+ else
+ data->VideoMode = 0;
+
+ if (ptr->Depth == 0)
+ {
+ /* Text mode. */
+ TRACE( "Setting %s %dx%d text mode\n",
+ mode <= 0xff ? "VGA" : "VESA",
+ ptr->Width, ptr->Height );
+ /*
+ * FIXME: We should check here if alpha mode could be set.
+ */
+ VGA_SetAlphaMode( ptr->Width, ptr->Height );
+ data->VideoColumns = ptr->Width;
+ }
+ else
+ {
+ /* Graphics mode. */
+ TRACE( "Setting %s %dx%dx%d graphics mode\n",
+ mode <= 0xff ? "VGA" : "VESA",
+ ptr->Width, ptr->Height, ptr->Depth );
+ if (VGA_SetMode( ptr->Width, ptr->Height, ptr->Depth ))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
/**********************************************************************
* INT10_GetCursorPos
*/
@@ -73,15 +228,10 @@
* FIXME: Add more mappings between initial size and
* text modes.
*/
- if (width >= 80 && height >= 25) {
- VGA_SetAlphaMode(80, 25);
- data->VideoColumns = 80;
- data->VideoMode = 0x03;
- } else {
- VGA_SetAlphaMode(40, 25);
- data->VideoColumns = 40;
- data->VideoMode = 0x01;
- }
+ if (width >= 80 && height >= 25)
+ INT10_SetVideoMode( data, 0x03 );
+ else
+ INT10_SetVideoMode( data, 0x01 );
}
@@ -111,147 +261,18 @@
break;
case 0x02: /* SET SuperVGA VIDEO MODE */
- switch(BX_reg(context)) {
- /* OEM Video Modes */
- case 0x00: /* 40x25 */
- case 0x01:
- TRACE("Set VESA Text Mode - 0x0%x\n",
- BX_reg(context));
- VGA_SetAlphaMode(40, 25);
- data->VideoColumns = 40;
- break;
- case 0x02:
- case 0x03:
- case 0x07:
- TRACE("Set VESA Text Mode - 0x0%x\n",
- BX_reg(context));
- VGA_SetAlphaMode(80, 25);
- data->VideoColumns = 80;
- break;
- case 0x0D:
- TRACE("Setting VESA 320x200 16-color mode\n");
- VGA_SetMode(320,200,4);
- break;
- case 0x0E:
- TRACE("Setting VESA 640x200 16-color mode\n");
- VGA_SetMode(640,200,4);
- break;
- case 0x10:
- TRACE("Setting VESA 640x350 16-color mode\n");
- VGA_SetMode(640,350,4);
- break;
- case 0x12:
- TRACE("Setting VESA 640x480 16-color mode\n");
- VGA_SetMode(640,480,4);
- break;
- case 0x13:
- TRACE("Setting VESA 320x200 256-color mode\n");
- VGA_SetMode(320,200,8);
- break;
- /* VBE Modes */
- case 0x100:
- TRACE("Setting VESA 640x400 256-color mode\n");
- VGA_SetMode(640,400,8);
- break;
- case 0x101:
- TRACE("Setting VESA 640x480 256-color mode\n");
- VGA_SetMode(640,480,8);
- break;
- case 0x102:
- TRACE("Setting VESA 800x600 16-color mode\n");
- VGA_SetMode(800,600,4);
- break;
- case 0x103:
- TRACE("Setting VESA 800x600 256-color mode\n");
- VGA_SetMode(800,600,8);
- break;
- case 0x104:
- TRACE("Setting VESA 1024x768 16-color mode\n");
- VGA_SetMode(1024,768,4);
- break;
- case 0x105:
- TRACE("Setting VESA 1024x768 256-color mode\n");
- VGA_SetMode(1024,768,8);
- break;
- case 0x106:
- TRACE("Setting VESA 1280x1024 16-color mode\n");
- VGA_SetMode(1280,1024,4);
- break;
- case 0x107:
- TRACE("Setting VESA 1280x1024 256-color mode\n");
- VGA_SetMode(1280,1024,8);
- break;
- /* 108h - 10Ch are text modes and im lazy so :p */
- /* VBE v1.2+ */
- case 0x10D:
- TRACE("Setting VESA 320x200 15bpp\n");
- VGA_SetMode(320,200,15);
- break;
- case 0x10E:
- TRACE("Setting VESA 320x200 16bpp\n");
- VGA_SetMode(320,200,16);
- break;
- case 0x10F:
- TRACE("Setting VESA 320x200 24bpp\n");
- VGA_SetMode(320,200,24);
- break;
- case 0x110:
- TRACE("Setting VESA 640x480 15bpp\n");
- VGA_SetMode(640,480,15);
- break;
- case 0x111:
- TRACE("Setting VESA 640x480 16bpp\n");
- VGA_SetMode(640,480,16);
- break;
- case 0x112:
- TRACE("Setting VESA 640x480 24bpp\n");
- VGA_SetMode(640,480,24);
- break;
- case 0x113:
- TRACE("Setting VESA 800x600 15bpp\n");
- VGA_SetMode(800,600,15);
- break;
- case 0x114:
- TRACE("Setting VESA 800x600 16bpp\n");
- VGA_SetMode(800,600,16);
- break;
- case 0x115:
- TRACE("Setting VESA 800x600 24bpp\n");
- VGA_SetMode(800,600,24);
- break;
- case 0x116:
- TRACE("Setting VESA 1024x768 15bpp\n");
- VGA_SetMode(1024,768,15);
- break;
- case 0x117:
- TRACE("Setting VESA 1024x768 16bpp\n");
- VGA_SetMode(1024,768,16);
- break;
- case 0x118:
- TRACE("Setting VESA 1024x768 24bpp\n");
- VGA_SetMode(1024,768,24);
- break;
- case 0x119:
- TRACE("Setting VESA 1280x1024 15bpp\n");
- VGA_SetMode(1280,1024,15);
- break;
- case 0x11A:
- TRACE("Setting VESA 1280x1024 16bpp\n");
- VGA_SetMode(1280,1024,16);
- break;
- case 0x11B:
- TRACE("Setting VESA 1280x1024 24bpp\n");
- VGA_SetMode(1280,1024,24);
- break;
- default:
- FIXME("VESA Set Video Mode (0x%x) - Not Supported\n", BX_reg(context));
- }
- data->VideoMode = BX_reg(context);
- SET_AL( context, 0x4f );
- SET_AH( context, 0x00 );
+ TRACE( "Set VESA video mode %04x\n", BX_reg(context) );
+ SET_AL( context, 0x4f ); /* function supported */
+ if (INT10_SetVideoMode( data, BX_reg(context) ))
+ SET_AH( context, 0x00 ); /* success */
+ else
+ SET_AH( context, 0x01 ); /* failed */
break;
case 0x03: /* VESA SuperVGA BIOS - GET CURRENT VIDEO MODE */
+ /*
+ * FIXME: This returns wrong value if current mode is VESA mode.
+ */
SET_AL( context, 0x4f );
SET_AH( context, 0x00 ); /* should probly check if a vesa mode has ben set */
SET_BX( context, data->VideoMode );
@@ -384,66 +405,10 @@
switch(AH_reg(context)) {
case 0x00: /* SET VIDEO MODE */
- /* Text Modes: */
- /* (mode) (text rows/cols)
- 0x00 - 40x25
- 0x01 - 40x25
- 0x02 - 80x25
- 0x03 - 80x25 or 80x43 or 80x50 (assume 80x25)
- 0x07 - 80x25
- */
-
- /* Bit 7 of AH = 0 -> Clean the video memory
- 1 -> Don't clean it
- */
- if (!(AL_reg(context)&0x80)) {
- /* FIXME: Do something which cleans the video memory */
- }
-
- /* FIXME: Should we keep the bit 7 in the Bios Data memory? */
- context->Eax &= ~0x80;
-
- switch (AL_reg(context)) {
- case 0x00: /* 40x25 */
- case 0x01:
- TRACE("Set Video Mode - Set to Text - 0x0%x\n",
- AL_reg(context));
- VGA_SetAlphaMode(40, 25);
- data->VideoColumns = 40;
- break;
- case 0x02:
- case 0x03:
- case 0x07:
- TRACE("Set Video Mode - Set to Text - 0x0%x\n",
- AL_reg(context));
- VGA_SetAlphaMode(80, 25);
- data->VideoColumns = 80;
- break;
- case 0x0D:
- TRACE("Setting VGA 320x200 16-color mode\n");
- VGA_SetMode(320,200,4);
- break;
- case 0x0E:
- TRACE("Setting VGA 640x200 16-color mode\n");
- VGA_SetMode(640,200,4);
- break;
- case 0x10:
- TRACE("Setting VGA 640x350 16-color mode\n");
- VGA_SetMode(640,350,4);
- break;
- case 0x12:
- TRACE("Setting VGA 640x480 16-color mode\n");
- VGA_SetMode(640,480,4);
- break;
- case 0x13:
- TRACE("Setting VGA 320x200 256-color mode\n");
- VGA_SetMode(320,200,8);
- break;
- default:
- FIXME("Set Video Mode (0x%x) - Not Supported\n",
- AL_reg(context));
- }
- data->VideoMode = AL_reg(context);
+ TRACE( "Set VGA video mode %02x\n", AL_reg(context) );
+ if (!INT10_SetVideoMode( data, AL_reg(context) ))
+ FIXME( "Unsupported VGA video mode requested: %d\n",
+ AL_reg(context) );
break;
case 0x01: /* SET CURSOR SHAPE */
--
Jukka Heinonen <http://www.iki.fi/jhei/>
More information about the wine-patches
mailing list