The SVGA block code was not accessible (AH and AL inverted). Fixed.

Removed duplicate VESA Get SuperVGA INFORMATION function.
Fix and finish its implementation.
Add 2 functions to managed structures in the BiosSys segment.
This commit is contained in:
Christian Costa 2002-05-28 22:44:53 +00:00 committed by Alexandre Julliard
parent 8e2cbcab7b
commit cc208a151f
3 changed files with 79 additions and 26 deletions

View File

@ -87,14 +87,17 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
{
BIOSDATA *data = DOSMEM_BiosData();
if(AL_reg(context) == 0x4F) { /* VESA functions */
switch(AH_reg(context)) {
if(AH_reg(context) == 0x4F) { /* VESA functions */
switch(AL_reg(context)) {
case 0x00: /* GET SuperVGA INFORMATION */
FIXME("Vesa Get SuperVGA Info STUB!\n");
TRACE("VESA GET SuperVGA INFORMATION\n");
memcpy(CTX_SEG_OFF_TO_LIN(context,context->SegEs,context->Edi),
DOSMEM_BiosSys()+DOSMEM_GetBiosSysStructOffset(OFF_VESAINFO),sizeof(VESAINFO));
AL_reg(context) = 0x4f;
AH_reg(context) = 0x01; /* 0x01=failed 0x00=succesful */
AH_reg(context) = 0x00; /* 0x00 = successful 0x01 = failed */
break;
case 0x01: /* GET SuperVGA MODE INFORMATION */
FIXME("VESA GET SuperVGA Mode Information - Not supported\n");
AL_reg(context) = 0x4f;
@ -739,7 +742,7 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
AL_reg(context) = 0x1b;
/* Copy state information structure to ES:DI */
memcpy(CTX_SEG_OFF_TO_LIN(context,context->SegEs,context->Edi),
DOSMEM_BiosSys()+0xe010,sizeof(VIDEOSTATE));
DOSMEM_BiosSys()+DOSMEM_GetBiosSysStructOffset(OFF_VIDEOSTATE),sizeof(VIDEOSTATE));
}
break;
@ -747,20 +750,6 @@ void WINAPI DOSVM_Int10Handler( CONTEXT86 *context )
FIXME("Save/Restore Video State - Not Supported\n");
break;
case 0x4f: /* Get SuperVGA INFORMATION */
{
BYTE *p =
CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Edi);
/* BOOL16 vesa20 = (*(DWORD *)p == *(DWORD *)"VBE2"); */
TRACE("Get SuperVGA information\n");
AH_reg(context) = 0;
*(DWORD *)p = *(DWORD *)"VESA";
*(WORD *)(p+0x04) = 0x0200; /* VESA 2.0 */
*(DWORD *)(p+0x06) = 0x00000000; /* pointer to OEM name */
*(DWORD *)(p+0x0a) = 0xfffffffd; /* capabilities flags :-) */
}
break;
case 0xef: /* get video mode for hercules-compatibles */
/* There's no reason to really support this */
/* is there?....................(A.C.) */

View File

@ -134,8 +134,24 @@ typedef struct
} VIDEOFUNCTIONALITY;
typedef struct
{
DWORD Signature;
BYTE Minor;
BYTE Major;
DWORD StaticVendorString;
DWORD CapabilitiesFlags;
DWORD StaticModeList;
} VESAINFO;
#include "poppack.h"
/* Index for bios structures stored at f000:e000 */
enum {OFF_VIDEOSTATE,OFF_VIDEOFUNCTIONALITY,OFF_VESAINFO,OFF_VESASTRING,OFF_VESAMODELIST};
extern WORD DOSMEM_AddBiosSysStruct(int,int);
extern WORD DOSMEM_GetBiosSysStructOffset(int);
extern WORD DOSMEM_0000H;
extern WORD DOSMEM_BiosDataSeg;
extern WORD DOSMEM_BiosSysSeg;

View File

@ -47,6 +47,9 @@ WORD DOSMEM_BiosSysSeg; /* BIOS ROM segment at 0xf000:0 */
DWORD DOSMEM_CollateTable;
static int StructOffset[256]; /* Offsets for all structures at f000:e000*/
static int CurrentStructOffset = 0xe000; /* Current free offset */
/* use 2 low bits of 'size' for the housekeeping */
#define DM_BLOCK_DEBUG 0xABE00000
@ -239,6 +242,23 @@ BYTE * DOSMEM_BiosSys()
return DOSMEM_dosmem+0xf0000;
}
/* Add a structure in the BiosSys area (with size and index) and
return its offset */
WORD DOSMEM_AddBiosSysStruct(int size,int index)
{
int Offset = CurrentStructOffset;
StructOffset[index]= CurrentStructOffset;
CurrentStructOffset += size;
return Offset;
}
/* Return the offset of a structure specified by the index */
WORD DOSMEM_GetBiosSysStructOffset(int index)
{
return StructOffset[index];
}
/***********************************************************************
* DOSMEM_FillBiosSegments
*
@ -250,18 +270,32 @@ static void DOSMEM_FillBiosSegments(void)
BYTE *pBiosROMTable = pBiosSys+0xe6f5;
BIOSDATA *pBiosData = DOSMEM_BiosData();
/* bogus 0xe0xx addresses !! Adapt int 0x10/0x1b if change needed */
VIDEOFUNCTIONALITY *pVidFunc = (VIDEOFUNCTIONALITY *)(pBiosSys+0xe000);
VIDEOSTATE *pVidState = (VIDEOSTATE *)(pBiosSys+0xe010);
/* 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 = (VIDEOFUNCTIONALITY *)
(pBiosSys+DOSMEM_AddBiosSysStruct(sizeof(VIDEOFUNCTIONALITY),OFF_VIDEOFUNCTIONALITY));
VIDEOSTATE *pVidState = (VIDEOSTATE *)
(pBiosSys+DOSMEM_AddBiosSysStruct(sizeof(VIDEOSTATE),OFF_VIDEOSTATE));
VESAINFO *pVesaInfo = (VESAINFO *)
(pBiosSys+DOSMEM_AddBiosSysStruct(sizeof(VESAINFO),OFF_VESAINFO));
char * VesaString = (char *)
(pBiosSys+DOSMEM_AddBiosSysStruct(strlen(ConstVesaString)+1,OFF_VESASTRING));
WORD * VesaModeList = (WORD *)
(pBiosSys+DOSMEM_AddBiosSysStruct(sizeof(ConstVesaModeList),OFF_VESAMODELIST));
/* 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;
pBiosData->Com2Addr = 0x2f8;
pBiosData->Lpt1Addr = 0x378;
@ -299,17 +333,18 @@ 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;
pVidState->StaticFuncTable = 0xf000e000; /* FIXME: always real mode ? */
/* FIXME: always real mode ? */
pVidState->StaticFuncTable = (0xf000<<16)+DOSMEM_GetBiosSysStructOffset(OFF_VIDEOFUNCTIONALITY);
pVidState->VideoMode = pBiosData->VideoMode; /* needs updates! */
pVidState->NumberColumns = pBiosData->VideoColumns; /* needs updates! */
pVidState->RegenBufLen = 0;
@ -340,6 +375,19 @@ static void DOSMEM_FillBiosSegments(void)
pVidState->SavePointerState = 0;
pVidState->DisplayStatus = 4;
/* SVGA structures */
pVesaInfo->Signature = *(DWORD*)"VESA";
pVesaInfo->Major = 2;
pVesaInfo->Minor = 0;
/* FIXME: always real mode ? */
pVesaInfo->StaticVendorString = (0xF000<<16)+DOSMEM_GetBiosSysStructOffset(OFF_VESASTRING);
pVesaInfo->CapabilitiesFlags = 0xfffffffd; /* FIXME: not really supported */
/* FIXME: always real mode ? */
pVesaInfo->StaticModeList = (0xF000<<16)+DOSMEM_GetBiosSysStructOffset(OFF_VESAMODELIST);
strcpy(VesaString,ConstVesaString);
memcpy(VesaModeList,ConstVesaModeList,sizeof(ConstVesaModeList));
/* BIOS date string */
strcpy((char *)pBiosSys+0xfff5, "13/01/99");