Add support for VESA mode information.

Reorganize controller and state information routines.
This commit is contained in:
Jukka Heinonen 2003-02-11 22:18:11 +00:00 committed by Alexandre Julliard
parent 15e0657f6b
commit d6b6dda6c1
1 changed files with 277 additions and 15 deletions

View File

@ -114,6 +114,255 @@ static const INT10_MODE *INT10_FindMode( WORD mode )
}
/**********************************************************************
* INT10_FillControllerInformation
*
* Fill 256-byte (VBE1.x) or 512-byte buffer (VBE2.0+) with
* capabilities of the video controller.
*/
static void INT10_FillControllerInformation( BYTE *buffer )
{
/*
* FIXME: Move VESA info stuff here from dosmem.
*/
memcpy(buffer, &BIOS_EXTRA_PTR->vesa_info, sizeof(VESAINFO));
}
/**********************************************************************
* INT10_FillModeInformation
*
* Fill 256-byte buffer with extended information about display mode.
*
* Returns FALSE if mode is unknown and TRUE is mode is known
* even if it is not supported.
*/
static BOOL INT10_FillModeInformation( BYTE *buffer, WORD mode )
{
const INT10_MODE *ptr = INT10_FindMode( mode );
if (!ptr)
return FALSE;
/*
* 00 - WORD: mode attributes
* Bits:
* 0 - Mode supported by present hardware configuration.
* 1 - Optional information available. Must be =1 for VBE v1.2+.
* 2 - BIOS output supported.
* Int10 functions 01, 02, 06, 07, 09, 0a and 0e are supported.
* 3 - Set if color, clear if monochrome.
* 4 - Set if graphics mode, clear if text mode.
* 5 - Mode is not VGA-compatible if set.
* VGA-compatible modes support standard VGA I/O ports.
* 6 - Bank-switched (or windowed) mode is not supported if set.
* 7 - Linear framebuffer mode supported.
* 8 - Double scanning supported.
* 9 - Interlaced operation supported.
* 10 - Triple buffering supported.
* 11 - Stereoscopic display supported.
* 12 - Dual display start address supported.
* 13-15 - Reserved.
*/
{
WORD attr = 0x000a; /* color mode, optional info */
/*
* FIXME: Attribute handling is incomplete.
*/
/* Mode supported? FIXME: correct value */
attr |= 0x0001;
/* Graphical mode? */
if (ptr->Depth)
attr |= 0x0010;
/* Not VGA-compatible? */
if (mode > 0xff)
attr |= 0x0020;
*(WORD*)(buffer + 0) = attr;
}
/*
* 02 - BYTE[2]: window attributes, window A and window B
* Bits:
* 0 - Window exists.
* 1 - Window is readable.
* 2 - Window is writable.
* 3-7 - Reserved.
*/
buffer[2] = 0x07; /* window A exists, readable and writable */
buffer[3] = 0x00; /* window B not supported */
/* 04 - WORD: window granularity in KB */
*(WORD*)(buffer + 4) = 64;
/* 06 - WORD: window size in KB */
*(WORD*)(buffer + 6) = 64;
/* 08 - WORD[2]: start segments, window A and window B */
*(WORD*)(buffer + 8) = 0xa000; /* window A segment */
*(WORD*)(buffer + 10) = 0x0000; /* window B not supported */
/* 12 - DWORD: window positioning function */
*(DWORD*)(buffer + 12) = 0; /* not supported */
/* 16 - WORD: bytes per scan line */
*(WORD*)(buffer + 16) = 0; /* FIXME */
/* 18 - WORD: width in pixels (graphics) or characters (text) */
*(WORD*)(buffer + 18) = ptr->Width;
/* 20 - WORD: height in pixels (graphics) or characters (text) */
*(WORD*)(buffer + 20) = ptr->Height;
/* 22 - BYTE: width of character cell in pixels */
buffer[22] = 0; /* FIXME */
/* 23 - BYTE: height of character cell in pixels */
buffer[23] = 0; /* FIXME */
/* 24 - BYTE: number of memory planes */
buffer[24] = 1; /* FIXME */
/* 25 - BYTE: number of bits per pixel */
buffer[25] = ptr->Depth; /* FIXME: text modes? reserved bits? */
/* 26 - BYTE: number of banks */
buffer[26] = 1; /* FIXME */
/*
* 27 - BYTE: memory model type
* Values (hex):
* 00 - Text mode
* 01 - CGA graphics
* 02 - Hercules graphics
* 03 - Planar
* 04 - Packed pixel
* 05 - Non-chain 4, 256 color
* 06 - Direct color
* 07 - YUV
* 08-0F - Reserved for VESA.
* 10-FF - OEM memory models.
*/
if (!ptr->Depth)
buffer[27] = 0; /* text mode */
else
buffer[27] = 3; /* FIXME */
/* 28 - BYTE: size of bank in KB */
buffer[28] = 0; /* FIXME */
/* 29 - BYTE: number of image pages (less one) in video RAM */
buffer[29] = 0; /* FIXME */
/* 30 - BYTE: reserved (0x00 for VBE 1.0-2.0, 0x01 for VBE 3.0) */
buffer[30] = 0x01;
/*
* 31 - BYTE: red mask size
* Size of red color component in bits.
* Used only when memory model is direct color, otherwise set to zero.
*/
buffer[31] = 0; /* FIXME */
/*
* 32 - BYTE: red field position
* Bit position of the least significant bit of red color component.
* Used only when memory model is direct color, otherwise set to zero.
*/
buffer[32] = 0; /* FIXME */
/* 33 - BYTE: green mask size */
buffer[33] = 0; /* FIXME */
/* 34 - BYTE: green field position */
buffer[34] = 0; /* FIXME */
/* 35 - BYTE: blue mask size */
buffer[35] = 0; /* FIXME */
/* 36 - BYTE: blue field position */
buffer[36] = 0;
/* 37 - BYTE: reserved mask size */
buffer[37] = 0;
/* 38 - BYTE: reserved mask position */
buffer[38] = 0;
/*
* 39 - BYTE: direct color mode info
* Bits:
* 0 - Set if color ramp is programmable.
* 1 - Set if bytes in reserved field may be used by application.
*/
buffer[39] = 0; /* not supported */
/* 40 - DWORD: physical address of linear video buffer */
*(DWORD*)(buffer + 40) = 0; /* not supported */
/* 44 - DWORD: reserved, always zero */
*(DWORD*)(buffer + 44) = 0;
/* 48 - WORD: reserved, always zero */
*(WORD*)(buffer + 48) = 0;
/* 50 - WORD: bytes per scan line in linear modes */
*(WORD*)(buffer + 50) = *(WORD*)(buffer + 16);
/* 52 - BYTE: number of images (less one) for banked video modes */
buffer[52] = 0; /* FIXME */
/* 53 - BYTE: number of images (less one) for linear video modes */
buffer[53] = buffer[52];
/* 54 - BYTE: red mask size (linear modes) */
buffer[54] = buffer[31];
/* 55 - BYTE: red field position (linear modes) */
buffer[55] = buffer[32];
/* 56 - BYTE: green mask size (linear modes) */
buffer[56] = buffer[33];
/* 57 - BYTE: green field size (linear modes) */
buffer[57] = buffer[34];
/* 58 - BYTE: blue mask size (linear modes) */
buffer[58] = buffer[35];
/* 59 - BYTE: blue field position (linear modes) */
buffer[59] = buffer[36];
/* 60 - BYTE: reserved mask size (linear modes) */
buffer[60] = buffer[37];
/* 61 - BYTE: reserved mask position (linear modes) */
buffer[61] = buffer[38];
/* 62 - DWORD: maximum pixel clock for graphics video mode, in Hz */
*(DWORD*)(buffer + 62) = 0; /* FIXME */
return TRUE;
}
/**********************************************************************
* INT10_FillStateInformation
*
* Fill 64-byte buffer with VGA state and functionality information.
*/
static void INT10_FillStateInformation( BYTE *buffer, BIOSDATA *data )
{
/*
* FIXME: Move VGA info stuff here from dosmem.
*/
memcpy( buffer, &BIOS_EXTRA_PTR->vid_state, sizeof(VIDEOSTATE) );
}
/**********************************************************************
* INT10_SetVideoMode
*
@ -246,18 +495,30 @@ static void INT10_HandleVESA( CONTEXT86 *context )
switch(AL_reg(context)) {
case 0x00: /* GET SuperVGA INFORMATION */
TRACE("VESA GET SuperVGA INFORMATION\n");
memcpy(CTX_SEG_OFF_TO_LIN(context,context->SegEs,context->Edi),
&BIOS_EXTRA_PTR->vesa_info, sizeof(VESAINFO));
SET_AL( context, 0x4f );
SET_AH( context, 0x00 ); /* 0x00 = successful 0x01 = failed */
case 0x00: /* RETURN CONTROLLER INFORMATION */
TRACE( "VESA RETURN CONTROLLER INFORMATION\n" );
{
BYTE *ptr = CTX_SEG_OFF_TO_LIN(context,
context->SegEs,
context->Edi);
INT10_FillControllerInformation( ptr );
SET_AL( context, 0x4f );
SET_AH( context, 0x00 ); /* 0x00 = successful 0x01 = failed */
}
break;
case 0x01: /* GET SuperVGA MODE INFORMATION */
FIXME("VESA GET SuperVGA Mode Information - Not supported\n");
SET_AL( context, 0x4f );
SET_AH( context, 0x01 ); /* 0x00 = successful 0x01 = failed */
case 0x01: /* RETURN MODE INFORMATION */
TRACE( "VESA RETURN MODE INFORMATION %04x\n", CX_reg(context) );
{
BYTE *ptr = CTX_SEG_OFF_TO_LIN(context,
context->SegEs,
context->Edi);
SET_AL( context, 0x4f );
if (INT10_FillModeInformation( ptr, CX_reg(context) ))
SET_AH( context, 0x00 ); /* status: success */
else
SET_AH( context, 0x01 ); /* status: failed */
}
break;
case 0x02: /* SET SuperVGA VIDEO MODE */
@ -802,12 +1063,13 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
case 0x1b: /* FUNCTIONALITY/STATE INFORMATION */
TRACE("Get functionality/state information\n");
if (BX_reg(context) == 0x0)
if (BX_reg(context) == 0x0000)
{
SET_AL( context, 0x1b );
/* Copy state information structure to ES:DI */
memcpy(CTX_SEG_OFF_TO_LIN(context,context->SegEs,context->Edi),
&BIOS_EXTRA_PTR->vid_state,sizeof(VIDEOSTATE));
BYTE *ptr = CTX_SEG_OFF_TO_LIN(context,
context->SegEs,
context->Edi);
SET_AL( context, 0x1b ); /* Function is supported */
INT10_FillStateInformation( ptr, data );
}
break;