Move controller info and state/functionality info initialization to
winedos. Convert many incorrectly static fields into dynamic fields. Fix vesa mode reporting and realloc memory block consistency checks.
This commit is contained in:
parent
8e04bab647
commit
f498d4b8fb
@ -30,6 +30,54 @@
|
|||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(int);
|
WINE_DEFAULT_DEBUG_CHANNEL(int);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display combination code for active display.
|
||||||
|
*
|
||||||
|
* Values (hex):
|
||||||
|
* 00 - no display
|
||||||
|
* 01 - monochrome adapter w/ monochrome display
|
||||||
|
* 02 - CGA w/ color display
|
||||||
|
* 03 - reserved
|
||||||
|
* 04 - EGA w/ color display
|
||||||
|
* 05 - EGA w/ monochrome display
|
||||||
|
* 06 - PGA w/ color display
|
||||||
|
* 07 - VGA w/ monochrome analog display
|
||||||
|
* 08 - VGA w/ color analog display
|
||||||
|
* 09 - reserved
|
||||||
|
* 0A - MCGA w/ digital color display
|
||||||
|
* 0B - MCGA w/ monochrome analog display
|
||||||
|
* 0C - MCGA w/ color analog display
|
||||||
|
* FF - unknown display type
|
||||||
|
*/
|
||||||
|
#define INT10_DCC 0x08
|
||||||
|
|
||||||
|
#include "pshpack1.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure for DOS data that can be accessed directly from applications.
|
||||||
|
* This structure must be correctly packed.
|
||||||
|
*/
|
||||||
|
typedef struct _INT10_HEAP {
|
||||||
|
BYTE StaticModeSupport[7]; /* modes supported 1..7 */
|
||||||
|
BYTE StaticScanlineSupport; /* scan lines supported */
|
||||||
|
BYTE StaticNumberCharBlocks; /* total number of char blocks */
|
||||||
|
BYTE StaticActiveCharBlocks; /* max number of active char blocks */
|
||||||
|
WORD StaticMiscFlags; /* misc function support flags */
|
||||||
|
WORD StaticReserved1; /* reserved */
|
||||||
|
BYTE StaticSavePointerFlags; /* save pointer function flags */
|
||||||
|
BYTE StaticReserved2; /* reserved */
|
||||||
|
|
||||||
|
WORD VesaCurrentMode;
|
||||||
|
WORD VesaModeList[64];
|
||||||
|
char VesaOEMName[32];
|
||||||
|
char VesaProductName[32];
|
||||||
|
char VesaProductRev[32];
|
||||||
|
char VesaVendorName[32];
|
||||||
|
|
||||||
|
WORD WineHeapSegment;
|
||||||
|
} INT10_HEAP;
|
||||||
|
|
||||||
|
#include "poppack.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wine internal information about video modes.
|
* Wine internal information about video modes.
|
||||||
@ -90,6 +138,8 @@ static const INT10_MODE INT10_modelist[] =
|
|||||||
{0xffff, 0, 0, 0}
|
{0xffff, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Forward declarations. */
|
||||||
|
static INT10_HEAP *INT10_GetHeap(void);
|
||||||
static void INT10_SetCursorPos(BIOSDATA*, unsigned, unsigned, unsigned);
|
static void INT10_SetCursorPos(BIOSDATA*, unsigned, unsigned, unsigned);
|
||||||
|
|
||||||
|
|
||||||
@ -124,10 +174,77 @@ static const INT10_MODE *INT10_FindMode( WORD mode )
|
|||||||
*/
|
*/
|
||||||
static void INT10_FillControllerInformation( BYTE *buffer )
|
static void INT10_FillControllerInformation( BYTE *buffer )
|
||||||
{
|
{
|
||||||
|
INT10_HEAP *heap = INT10_GetHeap();
|
||||||
|
|
||||||
|
/* 00 - BYTE[4]: signature */
|
||||||
|
memmove( buffer, "VESA", 4 );
|
||||||
|
|
||||||
|
/* 04 - WORD: version number */
|
||||||
|
*(WORD*)(buffer + 4) = 0x0300; /* version 3.0 */
|
||||||
|
|
||||||
|
/* 06 - DWORD: pointer to OEM name */
|
||||||
|
*(SEGPTR*)(buffer + 6) = MAKESEGPTR( heap->WineHeapSegment,
|
||||||
|
offsetof(INT10_HEAP,
|
||||||
|
VesaOEMName) );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: Move VESA info stuff here from dosmem.
|
* 10 - DWORD: capabilities flags
|
||||||
|
* Bits:
|
||||||
|
* 0 - DAC can be switched into 8-bit mode
|
||||||
|
* 1 - non-VGA controller
|
||||||
|
* 2 - programmed DAC with blank bit
|
||||||
|
* 3 - controller supports hardware stereoscopic signalling
|
||||||
|
* 4 - =0 stereo signalling via external VESA stereo connector
|
||||||
|
* =1 stereo signalling via VESA EVC connector
|
||||||
|
* 5 - controller supports hardware mouse cursor
|
||||||
|
* 6 - controller supports hardware clipping
|
||||||
|
* 7 - controller supports transparent BitBLT
|
||||||
|
* 8-31 - reserved (0)
|
||||||
|
*/
|
||||||
|
*(DWORD*)(buffer + 10) = 0; /* FIXME */
|
||||||
|
|
||||||
|
/* 14 - DWORD: pointer to list of supported VESA and OEM video modes */
|
||||||
|
*(SEGPTR*)(buffer + 14) = MAKESEGPTR( heap->WineHeapSegment,
|
||||||
|
offsetof(INT10_HEAP,
|
||||||
|
VesaModeList) );
|
||||||
|
|
||||||
|
/* 18 - WORD: total amount of video memory in 64K blocks */
|
||||||
|
*(WORD*)(buffer + 18) = 16; /* FIXME */
|
||||||
|
|
||||||
|
/* 20 - WORD: OEM software version (BCD, high byte = major) */
|
||||||
|
*(WORD*)(buffer + 20) = 0x0100; /* version 1.0 */
|
||||||
|
|
||||||
|
/* 22 - DWORD: pointer to vendor name */
|
||||||
|
*(SEGPTR*)(buffer + 22) = MAKESEGPTR( heap->WineHeapSegment,
|
||||||
|
offsetof(INT10_HEAP,
|
||||||
|
VesaVendorName) );
|
||||||
|
|
||||||
|
/* 26 - DWORD: pointer to product name */
|
||||||
|
*(SEGPTR*)(buffer + 26) = MAKESEGPTR( heap->WineHeapSegment,
|
||||||
|
offsetof(INT10_HEAP,
|
||||||
|
VesaProductName) );
|
||||||
|
|
||||||
|
/* 30 - DWORD: pointer to product revision string */
|
||||||
|
*(SEGPTR*)(buffer + 30) = MAKESEGPTR( heap->WineHeapSegment,
|
||||||
|
offsetof(INT10_HEAP,
|
||||||
|
VesaProductRev) );
|
||||||
|
|
||||||
|
/* 34 - WORD: VBE/AF version (if capabilities bit 3 set) */
|
||||||
|
*(WORD*)(buffer + 34) = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 36 - DWORD: pointer to list of accelerated modes
|
||||||
|
* (if capabilities bit 3 set)
|
||||||
|
*/
|
||||||
|
*(SEGPTR*)(buffer + 36) = 0;
|
||||||
|
|
||||||
|
/* 40 - BYTE[216]: reserved for VBE implementation, set to zero */
|
||||||
|
memset( buffer + 40, 216, 0 );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 256 - BYTE[256]: reserved for VBE3.0 implementation,
|
||||||
|
* ignored in order to support older programs
|
||||||
*/
|
*/
|
||||||
memcpy(buffer, &BIOS_EXTRA_PTR->vesa_info, sizeof(VESAINFO));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -347,6 +464,9 @@ static BOOL INT10_FillModeInformation( BYTE *buffer, WORD mode )
|
|||||||
/* 62 - DWORD: maximum pixel clock for graphics video mode, in Hz */
|
/* 62 - DWORD: maximum pixel clock for graphics video mode, in Hz */
|
||||||
*(DWORD*)(buffer + 62) = 0; /* FIXME */
|
*(DWORD*)(buffer + 62) = 0; /* FIXME */
|
||||||
|
|
||||||
|
/* 66 - BYTE[190]: reserved, set to zero */
|
||||||
|
memset( buffer + 66, 190, 0 );
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,10 +478,166 @@ static BOOL INT10_FillModeInformation( BYTE *buffer, WORD mode )
|
|||||||
*/
|
*/
|
||||||
static void INT10_FillStateInformation( BYTE *buffer, BIOSDATA *data )
|
static void INT10_FillStateInformation( BYTE *buffer, BIOSDATA *data )
|
||||||
{
|
{
|
||||||
|
INT10_HEAP *heap = INT10_GetHeap();
|
||||||
|
|
||||||
|
/* 00 - DWORD: address of static functionality table */
|
||||||
|
*(SEGPTR*)(buffer + 0) = MAKESEGPTR( heap->WineHeapSegment,
|
||||||
|
offsetof(INT10_HEAP,
|
||||||
|
StaticModeSupport) );
|
||||||
|
|
||||||
|
/* 04 - BYTE[30]: copy of BIOS data starting from 0x49 (VideoMode) */
|
||||||
|
memmove( buffer + 4, &data->VideoMode, 30 );
|
||||||
|
|
||||||
|
/* 34 - BYTE: number of rows - 1 */
|
||||||
|
buffer[34] = data->RowsOnScreenMinus1;
|
||||||
|
|
||||||
|
/* 35 - WORD: bytes/character */
|
||||||
|
*(WORD*)(buffer + 35) = data->BytesPerChar;
|
||||||
|
|
||||||
|
/* 37 - BYTE: display combination code of active display */
|
||||||
|
buffer[37] = INT10_DCC;
|
||||||
|
|
||||||
|
/* 38 - BYTE: DCC of alternate display */
|
||||||
|
buffer[38] = 0; /* no secondary display */
|
||||||
|
|
||||||
|
/* 39 - WORD: number of colors supported in current mode (0000h = mono) */
|
||||||
|
*(WORD*)(buffer + 39) = 16; /* FIXME */
|
||||||
|
|
||||||
|
/* 41 - BYTE: number of pages supported in current mode */
|
||||||
|
buffer[41] = 1; /* FIXME */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: Move VGA info stuff here from dosmem.
|
* 42 - BYTE: number of scan lines active
|
||||||
|
* Values (hex):
|
||||||
|
* 00 = 200
|
||||||
|
* 01 = 350
|
||||||
|
* 02 = 400
|
||||||
|
* 03 = 480
|
||||||
*/
|
*/
|
||||||
memcpy( buffer, &BIOS_EXTRA_PTR->vid_state, sizeof(VIDEOSTATE) );
|
buffer[42] = 3; /* FIXME */
|
||||||
|
|
||||||
|
/* 43 - BYTE: primary character block */
|
||||||
|
buffer[43] = 0; /* FIXME */
|
||||||
|
|
||||||
|
/* 44 - BYTE: secondary character block */
|
||||||
|
buffer[44] = 0; /* FIXME */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 45 - BYTE: miscellaneous flags
|
||||||
|
* Bits:
|
||||||
|
* 0 - all modes on all displays on
|
||||||
|
* 1 - gray summing on
|
||||||
|
* 2 - monochrome display attached
|
||||||
|
* 3 - default palette loading disabled
|
||||||
|
* 4 - cursor emulation enabled
|
||||||
|
* 5 - 0 = intensity; 1 = blinking
|
||||||
|
* 6 - flat-panel display is active
|
||||||
|
* 7 - unused (0)
|
||||||
|
*/
|
||||||
|
/* FIXME: Correct value? */
|
||||||
|
buffer[45] =
|
||||||
|
(data->VGASettings & 0x0f) |
|
||||||
|
((data->ModeOptions & 1) << 4); /* cursor emulation */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 46 - BYTE: non-VGA mode support
|
||||||
|
* Bits:
|
||||||
|
* 0 - BIOS supports information return for adapter interface
|
||||||
|
* 1 - adapter interface driver required
|
||||||
|
* 2 - 16-bit VGA graphics present
|
||||||
|
* 3 - =1 MFI attributes enabled
|
||||||
|
* =0 VGA attributes enabled
|
||||||
|
* 4 - 132-column mode supported
|
||||||
|
* 5-7 - reserved
|
||||||
|
*/
|
||||||
|
buffer[46] = 0; /* FIXME: correct value? */
|
||||||
|
|
||||||
|
/* 47 - BYTE[2]: reserved, set to zero */
|
||||||
|
memset( buffer + 47, 2, 0 );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 49 - BYTE: video memory available
|
||||||
|
* Values (hex):
|
||||||
|
* 00 - 64K
|
||||||
|
* 01 - 128K
|
||||||
|
* 02 - 192K
|
||||||
|
* 03 - 256K
|
||||||
|
*/
|
||||||
|
buffer[49] = (data->ModeOptions & 0x60) >> 5; /* FIXME */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 50 - BYTE: save pointer state flags
|
||||||
|
* Bits:
|
||||||
|
* 0 - 512 character set active
|
||||||
|
* 1 - dynamic save area present
|
||||||
|
* 2 - alpha font override active
|
||||||
|
* 3 - graphics font override active
|
||||||
|
* 4 - palette override active
|
||||||
|
* 5 - DCC override active
|
||||||
|
* 6-7 - unused (0)
|
||||||
|
*/
|
||||||
|
buffer[50] = heap->StaticSavePointerFlags;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 51 - BYTE: display information and status
|
||||||
|
* Bits:
|
||||||
|
* 0 - flat-panel display attached
|
||||||
|
* 1 - flat-panel display active
|
||||||
|
* 2 - color display
|
||||||
|
* 3-6 - reserved
|
||||||
|
* 7 - 640x480 flat-panel can be used simultaneously with CRT
|
||||||
|
*/
|
||||||
|
buffer[51] = 4; /* FIXME: correct value? */
|
||||||
|
|
||||||
|
/* 52 - BYTE[12]: reserved, set to zero */
|
||||||
|
memset( buffer + 52, 12, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* INT10_GetHeap
|
||||||
|
*/
|
||||||
|
INT10_HEAP *INT10_GetHeap( void )
|
||||||
|
{
|
||||||
|
static INT10_HEAP *heap_pointer = 0;
|
||||||
|
|
||||||
|
if (!heap_pointer)
|
||||||
|
{
|
||||||
|
WORD segment;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
heap_pointer = DOSVM_AllocDataUMB( sizeof(INT10_HEAP),
|
||||||
|
0,
|
||||||
|
&segment );
|
||||||
|
|
||||||
|
for (i = 0; i < 7; i++)
|
||||||
|
heap_pointer->StaticModeSupport[i] = 0xff; /* FIXME */
|
||||||
|
|
||||||
|
heap_pointer->StaticScanlineSupport = 7; /* FIXME */
|
||||||
|
heap_pointer->StaticNumberCharBlocks = 0; /* FIXME */
|
||||||
|
heap_pointer->StaticActiveCharBlocks = 0; /* FIXME */
|
||||||
|
heap_pointer->StaticMiscFlags = 0x8ff; /* FIXME */
|
||||||
|
heap_pointer->StaticReserved1 = 0;
|
||||||
|
heap_pointer->StaticSavePointerFlags = 0x3f; /* FIXME */
|
||||||
|
heap_pointer->StaticReserved2 = 0;
|
||||||
|
|
||||||
|
for (i=0; TRUE; i++)
|
||||||
|
{
|
||||||
|
heap_pointer->VesaModeList[i] = INT10_modelist[i].Mode;
|
||||||
|
if (INT10_modelist[i].Mode == 0xffff)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy( heap_pointer->VesaOEMName, "WINE SVGA BOARD" );
|
||||||
|
strcpy( heap_pointer->VesaVendorName, "WINE" );
|
||||||
|
strcpy( heap_pointer->VesaProductName, "WINE SVGA" );
|
||||||
|
strcpy( heap_pointer->VesaProductRev, "2003" );
|
||||||
|
|
||||||
|
heap_pointer->VesaCurrentMode = 0; /* Initialized later. */
|
||||||
|
heap_pointer->WineHeapSegment = segment;
|
||||||
|
}
|
||||||
|
|
||||||
|
return heap_pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -391,6 +667,7 @@ static void INT10_FillStateInformation( BYTE *buffer, BIOSDATA *data )
|
|||||||
static BOOL INT10_SetVideoMode( BIOSDATA *data, WORD mode )
|
static BOOL INT10_SetVideoMode( BIOSDATA *data, WORD mode )
|
||||||
{
|
{
|
||||||
const INT10_MODE *ptr = INT10_FindMode( mode );
|
const INT10_MODE *ptr = INT10_FindMode( mode );
|
||||||
|
INT10_HEAP *heap = INT10_GetHeap();
|
||||||
BOOL clearScreen = TRUE;
|
BOOL clearScreen = TRUE;
|
||||||
|
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
@ -410,9 +687,8 @@ static BOOL INT10_SetVideoMode( BIOSDATA *data, WORD mode )
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Note that we do not mask out flags here on purpose.
|
* Note that we do not mask out flags here on purpose.
|
||||||
*
|
|
||||||
* FIXME: Store VESA mode somewhere.
|
|
||||||
*/
|
*/
|
||||||
|
heap->VesaCurrentMode = mode;
|
||||||
if (mode <= 0xff)
|
if (mode <= 0xff)
|
||||||
data->VideoMode = mode;
|
data->VideoMode = mode;
|
||||||
else
|
else
|
||||||
@ -553,12 +829,9 @@ static void INT10_HandleVESA( CONTEXT86 *context )
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x03: /* VESA SuperVGA BIOS - GET CURRENT VIDEO MODE */
|
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_AL( context, 0x4f );
|
||||||
SET_AH( context, 0x00 ); /* should probly check if a vesa mode has ben set */
|
SET_AH( context, 0x00 );
|
||||||
SET_BX( context, data->VideoMode );
|
SET_BX( context, INT10_GetHeap()->VesaCurrentMode );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x04: /* VESA SuperVGA BIOS - SAVE/RESTORE SuperVGA VIDEO STATE */
|
case 0x04: /* VESA SuperVGA BIOS - SAVE/RESTORE SuperVGA VIDEO STATE */
|
||||||
@ -1069,9 +1342,9 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
|
|||||||
switch AL_reg(context) {
|
switch AL_reg(context) {
|
||||||
case 0x00: /* GET DISPLAY COMBINATION CODE */
|
case 0x00: /* GET DISPLAY COMBINATION CODE */
|
||||||
TRACE("Get Display Combination Code\n");
|
TRACE("Get Display Combination Code\n");
|
||||||
SET_AX( context, 0x001a );
|
SET_AL( context, 0x1a ); /* Function supported */
|
||||||
SET_BL( context, 0x08 ); /* VGA w/ color analog display */
|
SET_BL( context, INT10_DCC ); /* Active display */
|
||||||
SET_BH( context, 0x00 ); /* No secondary hardware */
|
SET_BH( context, 0x00 ); /* No alternate display */
|
||||||
break;
|
break;
|
||||||
case 0x01: /* SET DISPLAY COMBINATION CODE */
|
case 0x01: /* SET DISPLAY COMBINATION CODE */
|
||||||
FIXME("Set Display Combination Code - Not Supported\n");
|
FIXME("Set Display Combination Code - Not Supported\n");
|
||||||
|
@ -89,74 +89,6 @@ typedef struct
|
|||||||
BYTE DiskDataRate; /* 8B: Last disk data rate selected */
|
BYTE DiskDataRate; /* 8B: Last disk data rate selected */
|
||||||
} BIOSDATA;
|
} BIOSDATA;
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
DWORD StaticFuncTable; /* 00: static functionality table */
|
|
||||||
BYTE VideoMode; /* 04: video mode in effect */
|
|
||||||
WORD NumberColumns; /* 05: number of columns */
|
|
||||||
WORD RegenBufLen; /* 07: length of regen buffer in bytes */
|
|
||||||
WORD RegenBufAddr; /* 09: starting address of regen buffer */
|
|
||||||
WORD CursorPos[8]; /* 0B: cursor position for page 0..7 */
|
|
||||||
WORD CursorType; /* 1B: cursor "type" (start/stop scan lines) */
|
|
||||||
BYTE ActivePage; /* 1D: active display page */
|
|
||||||
WORD CRTCPort; /* 1E: CRTC port address */
|
|
||||||
BYTE Port3x8; /* 20: current setting of PORT 03x8h */
|
|
||||||
BYTE Port3x9; /* 21: current setting of PORT 03x9h */
|
|
||||||
BYTE NumberRows; /* 22: number of rows - 1 */
|
|
||||||
WORD BytesPerChar; /* 23: bytes/character */
|
|
||||||
BYTE DCCActive; /* 25: display combination code of active display */
|
|
||||||
BYTE DCCAlternate; /* 26: DCC of alternate display */
|
|
||||||
WORD NumberColors; /* 27: number of colors supported in current mode (0000h = mono) */
|
|
||||||
BYTE NumberPages; /* 29: number of pages supported in current mode */
|
|
||||||
BYTE NumberScanlines; /* 2A: number of scan lines active */
|
|
||||||
BYTE CharBlockPrimary; /* 2B: primary character block */
|
|
||||||
BYTE CharBlockSecondary; /* 2C: secondary character block */
|
|
||||||
BYTE MiscFlags; /* 2D: miscellaneous flags */
|
|
||||||
BYTE NonVGASupport; /* 2E: non-VGA mode support */
|
|
||||||
BYTE _reserved1[2]; /* 2F: */
|
|
||||||
BYTE VideoMem; /* 31: video memory available */
|
|
||||||
BYTE SavePointerState; /* 32: save pointer state flags */
|
|
||||||
BYTE DisplayStatus; /* 33: display information and status */
|
|
||||||
BYTE _reserved2[12]; /* 34: */
|
|
||||||
|
|
||||||
} VIDEOSTATE;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
BYTE ModeSupport[7]; /* 00: modes supported 1..7 */
|
|
||||||
BYTE ScanlineSupport; /* 07: scan lines supported */
|
|
||||||
BYTE NumberCharBlocks; /* 08: total number of character blocks */
|
|
||||||
BYTE ActiveCharBlocks; /* 09: max. number of active character blocks */
|
|
||||||
WORD MiscFlags; /* 0A: miscellaneous function support flags */
|
|
||||||
WORD _reserved1; /* 0C: */
|
|
||||||
BYTE SavePointerFlags; /* 0E: save pointer function flags */
|
|
||||||
BYTE _reserved2; /* OF: */
|
|
||||||
|
|
||||||
} VIDEOFUNCTIONALITY;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
DWORD Signature;
|
|
||||||
BYTE Minor;
|
|
||||||
BYTE Major;
|
|
||||||
DWORD StaticVendorString;
|
|
||||||
DWORD CapabilitiesFlags;
|
|
||||||
DWORD StaticModeList;
|
|
||||||
} VESAINFO;
|
|
||||||
|
|
||||||
/* layout of BIOS extra data starting at f000:e000 */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
VIDEOFUNCTIONALITY vid_func;
|
|
||||||
VIDEOSTATE vid_state;
|
|
||||||
VESAINFO vesa_info;
|
|
||||||
char vesa_string[32];
|
|
||||||
WORD vesa_modes[40];
|
|
||||||
} BIOS_EXTRA;
|
|
||||||
|
|
||||||
#define BIOS_EXTRA_PTR ((BIOS_EXTRA *)0xfe000)
|
|
||||||
#define BIOS_EXTRA_SEGPTR MAKESEGPTR(0xf000,0xe000)
|
|
||||||
|
|
||||||
#include "poppack.h"
|
#include "poppack.h"
|
||||||
|
|
||||||
extern WORD DOSMEM_0000H;
|
extern WORD DOSMEM_0000H;
|
||||||
|
@ -215,28 +215,10 @@ static void DOSMEM_FillBiosSegments(void)
|
|||||||
{
|
{
|
||||||
BYTE *pBiosSys = DOSMEM_dosmem + 0xf0000;
|
BYTE *pBiosSys = DOSMEM_dosmem + 0xf0000;
|
||||||
BYTE *pBiosROMTable = pBiosSys+0xe6f5;
|
BYTE *pBiosROMTable = pBiosSys+0xe6f5;
|
||||||
BIOS_EXTRA *extra = (BIOS_EXTRA *)(DOSMEM_dosmem + (int)BIOS_EXTRA_PTR);
|
|
||||||
BIOSDATA *pBiosData = DOSMEM_BiosData();
|
BIOSDATA *pBiosData = DOSMEM_BiosData();
|
||||||
|
|
||||||
/* Supported VESA mode, see int10.c */
|
|
||||||
WORD ConstVesaModeList[]={0x00,0x01,0x02,0x03,0x07,0x0D,0x0E,0x10,0x12,0x13,
|
|
||||||
0x100,0x101,0x102,0x103,0x104,0x105,0x106,0x107,0x10D,0x10E,
|
|
||||||
0x10F,0x110,0x111,0x112,0x113,0x114,0x115,0x116,0x117,0x118,
|
|
||||||
0x119,0x11A,0x11B,0xFFFF};
|
|
||||||
char * ConstVesaString = "WINE SVGA BOARD";
|
|
||||||
int i;
|
|
||||||
|
|
||||||
VIDEOFUNCTIONALITY *pVidFunc = &extra->vid_func;
|
|
||||||
VIDEOSTATE *pVidState = &extra->vid_state;
|
|
||||||
VESAINFO *pVesaInfo = &extra->vesa_info;
|
|
||||||
char * VesaString = extra->vesa_string;
|
|
||||||
WORD * VesaModeList = extra->vesa_modes;
|
|
||||||
|
|
||||||
/* Clear all unused values */
|
/* Clear all unused values */
|
||||||
memset( pBiosData, 0, sizeof(*pBiosData) );
|
memset( pBiosData, 0, sizeof(*pBiosData) );
|
||||||
memset( pVidFunc, 0, sizeof(*pVidFunc ) );
|
|
||||||
memset( pVidState, 0, sizeof(*pVidState) );
|
|
||||||
memset( pVesaInfo, 0, sizeof(*pVesaInfo) );
|
|
||||||
|
|
||||||
/* FIXME: should check the number of configured drives and ports */
|
/* FIXME: should check the number of configured drives and ports */
|
||||||
pBiosData->Com1Addr = 0x3f8;
|
pBiosData->Com1Addr = 0x3f8;
|
||||||
@ -276,61 +258,6 @@ static void DOSMEM_FillBiosSegments(void)
|
|||||||
*(pBiosROMTable+0x8) = 0x00; /* feature byte 4 */
|
*(pBiosROMTable+0x8) = 0x00; /* feature byte 4 */
|
||||||
*(pBiosROMTable+0x9) = 0x00; /* feature byte 5 */
|
*(pBiosROMTable+0x9) = 0x00; /* feature byte 5 */
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < 7; i++)
|
|
||||||
pVidFunc->ModeSupport[i] = 0xff;
|
|
||||||
|
|
||||||
pVidFunc->ScanlineSupport = 7;
|
|
||||||
pVidFunc->NumberCharBlocks = 0;
|
|
||||||
pVidFunc->ActiveCharBlocks = 0;
|
|
||||||
pVidFunc->MiscFlags = 0x8ff;
|
|
||||||
pVidFunc->SavePointerFlags = 0x3f;
|
|
||||||
|
|
||||||
/* FIXME: always real mode ? */
|
|
||||||
pVidState->StaticFuncTable = BIOS_EXTRA_SEGPTR + offsetof(BIOS_EXTRA,vid_func);
|
|
||||||
pVidState->VideoMode = pBiosData->VideoMode; /* needs updates! */
|
|
||||||
pVidState->NumberColumns = pBiosData->VideoColumns; /* needs updates! */
|
|
||||||
pVidState->RegenBufLen = 0;
|
|
||||||
pVidState->RegenBufAddr = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
pVidState->CursorPos[i] = 0;
|
|
||||||
|
|
||||||
pVidState->CursorType = 0x0a0b; /* start/end line */
|
|
||||||
pVidState->ActivePage = 0;
|
|
||||||
pVidState->CRTCPort = 0x3da;
|
|
||||||
pVidState->Port3x8 = 0;
|
|
||||||
pVidState->Port3x9 = 0;
|
|
||||||
pVidState->NumberRows = 23; /* number of rows - 1 */
|
|
||||||
pVidState->BytesPerChar = 0x10;
|
|
||||||
pVidState->DCCActive = pBiosData->DisplayCombination;
|
|
||||||
pVidState->DCCAlternate = 0;
|
|
||||||
pVidState->NumberColors = 16;
|
|
||||||
pVidState->NumberPages = 1;
|
|
||||||
pVidState->NumberScanlines = 3; /* (0,1,2,3) = (200,350,400,480) */
|
|
||||||
pVidState->CharBlockPrimary = 0;
|
|
||||||
pVidState->CharBlockSecondary = 0;
|
|
||||||
pVidState->MiscFlags =
|
|
||||||
(pBiosData->VGASettings & 0x0f)
|
|
||||||
| ((pBiosData->ModeOptions & 1) << 4); /* cursor emulation */
|
|
||||||
pVidState->NonVGASupport = 0;
|
|
||||||
pVidState->VideoMem = (pBiosData->ModeOptions & 0x60 >> 5);
|
|
||||||
pVidState->SavePointerState = 0;
|
|
||||||
pVidState->DisplayStatus = 4;
|
|
||||||
|
|
||||||
/* SVGA structures */
|
|
||||||
pVesaInfo->Signature = *(DWORD*)"VESA";
|
|
||||||
pVesaInfo->Major = 2;
|
|
||||||
pVesaInfo->Minor = 0;
|
|
||||||
/* FIXME: always real mode ? */
|
|
||||||
pVesaInfo->StaticVendorString = BIOS_EXTRA_SEGPTR + offsetof(BIOS_EXTRA,vesa_string);
|
|
||||||
pVesaInfo->CapabilitiesFlags = 0xfffffffd; /* FIXME: not really supported */
|
|
||||||
/* FIXME: always real mode ? */
|
|
||||||
pVesaInfo->StaticModeList = BIOS_EXTRA_SEGPTR + offsetof(BIOS_EXTRA,vesa_modes);
|
|
||||||
|
|
||||||
strcpy(VesaString,ConstVesaString);
|
|
||||||
memcpy(VesaModeList,ConstVesaModeList,sizeof(ConstVesaModeList));
|
|
||||||
|
|
||||||
/* BIOS date string */
|
/* BIOS date string */
|
||||||
strcpy((char *)pBiosSys+0xfff5, "13/01/99");
|
strcpy((char *)pBiosSys+0xfff5, "13/01/99");
|
||||||
|
|
||||||
@ -597,9 +524,9 @@ UINT DOSMEM_ResizeBlock(void *ptr, UINT size, BOOL exact)
|
|||||||
UINT blocksize;
|
UINT blocksize;
|
||||||
UINT orgsize;
|
UINT orgsize;
|
||||||
|
|
||||||
if( ptr < (void*)(((char*)DOSMEM_RootBlock()) + sizeof(dosmem_entry)) ||
|
if( (ptr < (void*)(sizeof(dosmem_entry) + (char*)DOSMEM_RootBlock())) ||
|
||||||
(ptr >= (void*)DOSMEM_MemoryTop() &&
|
(ptr >= (void*)DOSMEM_MemoryTop()) ||
|
||||||
!((((char*)ptr) - DOSMEM_dosmem) & 0xf)))
|
(((((char*)ptr) - DOSMEM_dosmem) & 0xf) != 0) )
|
||||||
return (UINT)-1;
|
return (UINT)-1;
|
||||||
|
|
||||||
dm = (dosmem_entry*)(((char*)ptr) - sizeof(dosmem_entry));
|
dm = (dosmem_entry*)(((char*)ptr) - sizeof(dosmem_entry));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user