mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 11:43:31 +00:00
Unify VGA and VESA video mode setting code.
This commit is contained in:
parent
eaae7050fa
commit
1f5e6994af
1 changed files with 172 additions and 207 deletions
|
@ -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 @@ static void INT10_InitializeVideoMode( BIOSDATA *data )
|
|||
* 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 @@ static void INT10_HandleVESA( CONTEXT86 *context )
|
|||
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 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
|
|||
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 */
|
||||
|
|
Loading…
Reference in a new issue