In lookin at the gpe_flat.cpp that appears to drive the display for the platform, there is a place where the screen's physical dimensions are set. This section looks for a set of arguments from somewhere in the boot sequence. If the arguments are not present it goes for a default setup. This looks like the following:
GPEFlat::GPEFlat (void)
{
DWORD oldMode;
PBOOT_ARGS args;
ULONG fbSize;
ULONG fbOffset;
ULONG offsetX, offsetY;
DEBUGMSG(GPE_ZONE_INIT,(TEXT("GPEFlat::GPEFlat®
")));
oldMode = SetKMode(TRUE);
args = (PBOOT_ARGS)(*(PBYTE *)BOOT_ARG_PTR_LOCATION);
if (args != 0)
{
args = (PBOOT_ARGS)((DWORD)args | 0x80000000);
// copy needed params from boot args
m_VesaMode = (DWORD)args->vesaMode;
m_nScreenWidth = (DWORD)args->cxDisplayScreen;
m_nScreenHeight = (DWORD)args->cyDisplayScreen;
m_colorDepth = (DWORD)args->bppScreen;
m_pvFlatFrameBuffer = args->pvFlatFrameBuffer;
m_cbScanLineLength = (DWORD)args->cbScanLineLength;
m_cxPhysicalScreen = (DWORD)args->cxPhysicalScreen;
m_cyPhysicalScreen = (DWORD)args->cyPhysicalScreen;
m_RedMaskSize = (DWORD)args->RedMaskSize;
m_RedMaskPosition = (DWORD)args->RedMaskPosition;
m_GreenMaskSize = (DWORD)args->GreenMaskSize;
m_GreenMaskPosition = (DWORD)args->GreenMaskPosition;
m_BlueMaskSize = (DWORD)args->BlueMaskSize;
m_BlueMaskPosition = (DWORD)args->BlueMaskPosition;
}
else
{
DEBUGMSG(GPE_ZONE_ERROR,(TEXT("No Boot Args passed to driver®
")));
m_VesaMode = 0;
m_nScreenWidth = 320;
m_nScreenHeight = 200;
m_colorDepth = 8;
m_cxPhysicalScreen = 320;
m_cyPhysicalScreen = 200;
m_pvFlatFrameBuffer = 0x800A0000;
m_cbScanLineLength = 320;
}
SetKMode(oldMode);
// set rest of ModeInfo values
m_ModeInfo.modeId = 0;
m_ModeInfo.width = m_nScreenWidth;
m_ModeInfo.height = m_nScreenHeight;
m_ModeInfo.Bpp = m_colorDepth;
m_ModeInfo.frequency = 60; // ?
switch (m_colorDepth)
{
case 8:
m_ModeInfo.format = gpe8Bpp;
break;
case 16:
m_ModeInfo.format = gpe16Bpp;
break;
case 24:
m_ModeInfo.format = gpe24Bpp;
break;
case 32:
m_ModeInfo.format = gpe32Bpp;
break;
default:
DEBUGMSG(GPE_ZONE_ERROR,(TEXT("Invalid BPP value passed to driver - %d®
"), m_ModeInfo.Bpp));
m_ModeInfo.format = gpeUndefined;
break;
}
m_pMode = &m_ModeInfo;
// compute frame buffer displayable area offset
offsetX = (m_cxPhysicalScreen - m_nScreenWidth) / 2;
offsetY = (m_cyPhysicalScreen - m_nScreenHeight) / 2;
fbOffset = (offsetY * m_cbScanLineLength) + offsetX;
// compute physical frame buffer size
fbSize = (((m_cyPhysicalScreen * m_cbScanLineLength) >> 20) + 1) << 20; // set size to next highest 1MB boundary
m_VirtualFrameBuffer = (DWORD)VirtualAlloc(0, fbSize, MEM_RESERVE, PAGE_NOACCESS);
if (m_VesaMode != 0)
{
VirtualCopy((void*)m_VirtualFrameBuffer, (void *)(m_pvFlatFrameBuffer >> 8), fbSize, PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL);
}
else
{
VirtualCopy((void*)m_VirtualFrameBuffer, (void *)m_pvFlatFrameBuffer, fbSize, PAGE_READWRITE | PAGE_NOCACHE);
}
m_pPrimarySurface = new GPESurf(m_nScreenWidth, m_nScreenHeight, (void*)(m_VirtualFrameBuffer + fbOffset), m_cbScanLineLength, m_ModeInfo.format);
memset ((void*)m_VirtualFrameBuffer, 0x0, fbSize);
m_CursorVisible = FALSE;
m_CursorDisabled = TRUE;
m_CursorForcedOff = FALSE;
memset (&m_CursorRect, 0x0, sizeof(m_CursorRect));
m_CursorBackingStore = NULL;
m_CursorXorShape = NULL;
m_CursorAndShape = NULL;
}
As a test, the following code section could be substituted:
if (args != 0)
{
args = (PBOOT_ARGS)((DWORD)args | 0x80000000);
// copy needed params from boot args
m_VesaMode = (DWORD)args->vesaMode;
//m_nScreenWidth = (DWORD)args->cxDisplayScreen;
m_nScreenWidth = 800;
//m_nScreenHeight = (DWORD)args->cyDisplayScreen;
m_nScreenHeight = 600;
//m_colorDepth = (DWORD)args->bppScreen;
m_colorDepth = 16;
m_pvFlatFrameBuffer = args->pvFlatFrameBuffer;
//m_cbScanLineLength = (DWORD)args->cbScanLineLength;
m_cbScanLineLength = 800;
//m_cxPhysicalScreen = (DWORD)args->cxPhysicalScreen;
m_cxPhysicalScreen = 800;
//m_cyPhysicalScreen = (DWORD)args->cyPhysicalScreen;
m_cyPhysicalScreen = 600;
m_RedMaskSize = (DWORD)args->RedMaskSize;
m_RedMaskPosition = (DWORD)args->RedMaskPosition;
m_GreenMaskSize = (DWORD)args->GreenMaskSize;
m_GreenMaskPosition = (DWORD)args->GreenMaskPosition;
m_BlueMaskSize = (DWORD)args->BlueMaskSize;
m_BlueMaskPosition = (DWORD)args->BlueMaskPosition;
}
else
{
DEBUGMSG(GPE_ZONE_ERROR,(TEXT("No Boot Args passed to driver®
")));
m_VesaMode = 0;
m_nScreenWidth = 800;
m_nScreenHeight = 600;
m_colorDepth = 16;
m_cxPhysicalScreen = 800;
m_cyPhysicalScreen = 600;
m_pvFlatFrameBuffer = 0x800A0000;
m_cbScanLineLength = 800;
}
This would bypass any arguments provided at bootup and effectively force an 800x600 16 bpp display. The VESA mode and the frame buffer might have to be adjusted as well but that would take some expirimentation. I do not have my units yet (shipping from TigerDirect, should arrive next week) or I would run the test. If you still have a testing environment and the interest, could you try the setup above and see if it works?