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:
Jukka Heinonen 2003-02-26 05:02:54 +00:00 committed by Alexandre Julliard
parent 8e04bab647
commit f498d4b8fb
3 changed files with 291 additions and 159 deletions

View File

@ -30,6 +30,54 @@
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.
@ -90,6 +138,8 @@ static const INT10_MODE INT10_modelist[] =
{0xffff, 0, 0, 0}
};
/* Forward declarations. */
static INT10_HEAP *INT10_GetHeap(void);
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 )
{
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 */
*(DWORD*)(buffer + 62) = 0; /* FIXME */
/* 66 - BYTE[190]: reserved, set to zero */
memset( buffer + 66, 190, 0 );
return TRUE;
}
@ -358,10 +478,166 @@ static BOOL INT10_FillModeInformation( BYTE *buffer, WORD mode )
*/
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 )
{
const INT10_MODE *ptr = INT10_FindMode( mode );
INT10_HEAP *heap = INT10_GetHeap();
BOOL clearScreen = TRUE;
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.
*
* FIXME: Store VESA mode somewhere.
*/
heap->VesaCurrentMode = mode;
if (mode <= 0xff)
data->VideoMode = mode;
else
@ -553,12 +829,9 @@ static void INT10_HandleVESA( CONTEXT86 *context )
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 );
SET_AH( context, 0x00 );
SET_BX( context, INT10_GetHeap()->VesaCurrentMode );
break;
case 0x04: /* VESA SuperVGA BIOS - SAVE/RESTORE SuperVGA VIDEO STATE */
@ -1069,9 +1342,9 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
switch AL_reg(context) {
case 0x00: /* GET DISPLAY COMBINATION CODE */
TRACE("Get Display Combination Code\n");
SET_AX( context, 0x001a );
SET_BL( context, 0x08 ); /* VGA w/ color analog display */
SET_BH( context, 0x00 ); /* No secondary hardware */
SET_AL( context, 0x1a ); /* Function supported */
SET_BL( context, INT10_DCC ); /* Active display */
SET_BH( context, 0x00 ); /* No alternate display */
break;
case 0x01: /* SET DISPLAY COMBINATION CODE */
FIXME("Set Display Combination Code - Not Supported\n");

View File

@ -89,74 +89,6 @@ typedef struct
BYTE DiskDataRate; /* 8B: Last disk data rate selected */
} 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"
extern WORD DOSMEM_0000H;

View File

@ -215,28 +215,10 @@ static void DOSMEM_FillBiosSegments(void)
{
BYTE *pBiosSys = DOSMEM_dosmem + 0xf0000;
BYTE *pBiosROMTable = pBiosSys+0xe6f5;
BIOS_EXTRA *extra = (BIOS_EXTRA *)(DOSMEM_dosmem + (int)BIOS_EXTRA_PTR);
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 */
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 */
pBiosData->Com1Addr = 0x3f8;
@ -276,61 +258,6 @@ static void DOSMEM_FillBiosSegments(void)
*(pBiosROMTable+0x8) = 0x00; /* feature byte 4 */
*(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 */
strcpy((char *)pBiosSys+0xfff5, "13/01/99");
@ -597,10 +524,10 @@ UINT DOSMEM_ResizeBlock(void *ptr, UINT size, BOOL exact)
UINT blocksize;
UINT orgsize;
if( ptr < (void*)(((char*)DOSMEM_RootBlock()) + sizeof(dosmem_entry)) ||
(ptr >= (void*)DOSMEM_MemoryTop() &&
!((((char*)ptr) - DOSMEM_dosmem) & 0xf)))
return (UINT)-1;
if( (ptr < (void*)(sizeof(dosmem_entry) + (char*)DOSMEM_RootBlock())) ||
(ptr >= (void*)DOSMEM_MemoryTop()) ||
(((((char*)ptr) - DOSMEM_dosmem) & 0xf) != 0) )
return (UINT)-1;
dm = (dosmem_entry*)(((char*)ptr) - sizeof(dosmem_entry));
if( dm->size & (DM_BLOCK_FREE | DM_BLOCK_TERMINAL) )