📄 ct69000.cpp
字号:
{
DEBUGMSG( CT69K_ZONE_INIT,
(TEXT("found ct69030 at %08x on bus %d slot %d\r\n"),
pciConfig.u.type0.BaseAddresses[0], ulBusNumber, ulSlotNumber));
} else
{
DEBUGMSG( CT69K_ZONE_INIT,
(TEXT("found ct69000 at %08x on bus %d slot %d\r\n"),
pciConfig.u.type0.BaseAddresses[0], ulBusNumber, ulSlotNumber));
}
if (ulBoard!=N_DISPLAY)
{
continue;
}
if (pciConfig.DeviceID==CT69030_DEVICEID)
{
m_ulVideoMemorySize=CT69030_VIDEOMEMORYSIZE;
m_bChip69030=TRUE;
}
//
// set memory access bit if not set!
//
if (!(pciConfig.Command & 2))
{
// oops. BIOS didn't give us permission to access memory
pciConfig.Command |= 2;
ulResult=
HalSetBusDataByOffset(
PCIConfiguration,
ulBusNumber,
ulSlotNumber,
(PBYTE)&pciConfig.Command,
(PBYTE)&pciConfig.Command-(PBYTE)&pciConfig,
sizeof(pciConfig.Command));
DEBUGMSG(CT69K_ZONE_INIT,
(TEXT("--enabled memory access for this device\r\n")));
}
// CT69000 maps only one region in PCI memory space
m_ulPhysFrameBuffer = pciConfig.u.type0.BaseAddresses[0];
m_bHasVGARegs=pciConfig.Command & 1;
if (m_bHasVGARegs)
{
DEBUGMSG(CT69K_ZONE_INIT,
(TEXT("--this ct690x0 has VGA ports\r\n")));
}
break;
}
}
}
#else
//
// read device and vendor id via I/O ports
//
WORD wVendorId=GetXRPort(0) | (GetXRPort(1) << 8);
WORD wDeviceId=GetXRPort(2) | (GetXRPort(3) << 8);
if (wVendorId==CT69000_VENDORID &&
(wDeviceId==CT69000_DEVICEID ||
wDeviceId==CT69030_DEVICEID))
{
WORD wRevision=GetXRPort(4);
m_ulPhysFrameBuffer=GetXRPort(5) | (GetXRPort(6) << 8);
m_ulPhysFrameBuffer <<= 16;
//
// C&T 69030 has 4MB memory!!!
//
if (wDeviceId==CT69030_DEVICEID)
{
m_ulVideoMemorySize=CT69030_VIDEOMEMORYSIZE;
m_bChip69030=TRUE;
DEBUGMSG( CT69K_ZONE_INIT,
(TEXT("found ct69030 rev %d at %08x"),
wRevision, m_ulPhysFrameBuffer));
} else
{
DEBUGMSG( CT69K_ZONE_INIT,
(TEXT("found ct69000 rev %d at %08x"),
wRevision, m_ulPhysFrameBuffer));
}
}
#endif
// set 4k region for cursors to end of memory
m_ulCursorMemory = m_ulVideoMemorySize-CT69000_CURSOR_SPACE;
m_ulPatternMemory = m_ulCursorMemory-CT69000_PATTERN_SPACE;
if (m_ulPhysFrameBuffer!=NULL)
{
// allocate memory region for frame buffer
m_pFrameBuffer = (PUCHAR)
VirtualAlloc(
0,
m_ulVideoMemorySize,
MEM_RESERVE,
PAGE_NOACCESS);
// allocate memory region for frame buffer
m_pCtrlRegister = (PUCHAR)
VirtualAlloc(
0,
CT69000_CTRLREGSIZE,
MEM_RESERVE,
PAGE_NOACCESS);
// assign frame buffer to physical address space
// note: when we use the PAGE_PHYSICAL flag in VirtualCopy,
// the physical address must be divided by 256
//
VirtualCopy(m_pFrameBuffer,
(LPVOID) (m_ulPhysFrameBuffer >> 8),
m_ulVideoMemorySize,
PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL);
// assign control registers to physical address space
VirtualCopy(m_pCtrlRegister,
(LPVOID) ((m_ulPhysFrameBuffer+CT69000_CTRLREGOFFSET)>>8),
CT69000_CTRLREGSIZE,
PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL);
#if DEBUG
//
// on debugging, let us know that we can access the framebuffer...
//
for (INT i=0;i<256;i+=4)
{
memset ( m_pFrameBuffer, i, m_ulVideoMemorySize);
}
memset ( m_pFrameBuffer, 0x80, m_ulVideoMemorySize);
#if BIOSSETUP
if (m_bChip69030)
{
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//69030 IOSS\r\n")));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//IOSS: 0x%02x\r\n"), READ_PORT_UCHAR((PUCHAR)0x3cd)));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//69030 MSS\r\n")));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//MSS: 0x%02x\r\n"), READ_PORT_UCHAR((PUCHAR)0x3cb)));
}
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//\r\n")));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// mode %ldx%ldx%ld\r\n"), gpeMode.width, gpeMode.height, gpeMode.Bpp ));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//\r\n")));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("VGAPortData vgamode%ldx%ldx%ld[] =\r\n"), gpeMode.width, gpeMode.height, gpeMode.Bpp ));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{\r\n")));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{0x03c4,0x0000,0x0000},// force reset\r\n")));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{0x03c4,0x0000,0x0003},// clear reset\r\n")));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{0x03d4,0x0011,0x000c},// unlock CR0..7 first\r\n")));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// SR register\r\n")));
ListRegs( VGA_SR_BASE, 0, 4);
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// GR register\r\n")));
ListRegs( VGA_GR_BASE, 0, 8);
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// AR register\r\n")));
ListRegs( VGA_AR_BASE, 0x20, 0x34);
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// CR register\r\n")));
ListRegs( VGA_CR_BASE, 0, 0x10);
ListRegs( VGA_CR_BASE, 0x12, 0x18);
ListRegs( VGA_CR_BASE, 0x30, 0x33);
ListRegs( VGA_CR_BASE, 0x38, 0x38);
ListRegs( VGA_CR_BASE, 0x3c, 0x3c);
ListRegs( VGA_CR_BASE, 0x40, 0x41);
ListRegs( VGA_CR_BASE, 0x70, 0x79);
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// XR register\r\n")));
ListRegs( VGA_XR_BASE, 0x00, 0x0e);
ListRegs( VGA_XR_BASE, 0x20, 0x20);
ListRegs( VGA_XR_BASE, 0x40, 0x4f);
ListRegs( VGA_XR_BASE, 0x60, 0x63);
ListRegs( VGA_XR_BASE, 0x67, 0x67);
ListRegs( VGA_XR_BASE, 0x70, 0x71);
ListRegs( VGA_XR_BASE, 0x80, 0x82);
ListRegs( VGA_XR_BASE, 0xcf, 0xd1);
ListRegs( VGA_XR_BASE, 0xc0, 0xc1);
ListRegs( VGA_XR_BASE, 0xc3, 0xc5);
ListRegs( VGA_XR_BASE, 0xc7, 0xc9);
ListRegs( VGA_XR_BASE, 0xcb, 0xce);
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// FR register\r\n")));
ListRegs( VGA_FR_BASE, 0x00, 0x4e);
ListRegs( VGA_FR_BASE, 0x70, 0x74);
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// MSR register\r\n")));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{0x03c2,0x00ff,0x%02x},\r\n"), READ_PORT_UCHAR((PUCHAR)VGA_MSR_REG)));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{0,0,0}\r\n")));
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("};\r\n")));
#endif //BIOSSETUP
#endif //DEBUG
}
else
{
//
// fatal error...
//
RETAILMSG(CT69K_ZONE_INIT, (TEXT("*** ct69000/030 not found! ***\r\n")));
}
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("CT69000::CT69000 done!\r\n")));
}
//-----------------------------------------------------------------------
//
//
//
//-----------------------------------------------------------------------
CT69000::~CT69000()
{
#if DXPAK
if (hDDStub)
{
FreeLibrary(hDDStub);
hDDStub = NULL;
}
#endif
VirtualFree( m_pFrameBuffer, 0, MEM_RELEASE);
m_pFrameBuffer=NULL;
VirtualFree( m_pCtrlRegister, 0, MEM_RELEASE);
m_pCtrlRegister=NULL;
}
//-----------------------------------------------------------------------
//
// CT69000::GetGraphicsCaps
//
// get driver graphic caps for gdi.
//
//-----------------------------------------------------------------------
ULONG
CT69000::GetGraphicsCaps()
{
ULONG ulGraphCaps= GPE::GetGraphicsCaps();
if (m_pMode)
{
if (m_pMode->Bpp == 16) // if in 16bpp mode, return GCAPS_GRAY16 to denote that we support anti-aliased fonts
{
ulGraphCaps |= GCAPS_GRAY16;
}
#if FIXED_PALETTE
if (m_pMode->Bpp == 8)
{
ulGraphCaps |= GCAPS_GRAY16;;
}
#endif
}
return ulGraphCaps;
}
//-----------------------------------------------------------------------
//
// CT69000::IsPaletteSettable
//
// return false for fixed palette, otherwise return default
//
//-----------------------------------------------------------------------
int
CT69000::IsPaletteSettable()
{
#if FIXED_PALETTE
if (m_pMode)
{
if (m_pMode->Bpp == 8)
{
return FALSE;
}
}
#endif
return GPE::IsPaletteSettable();
}
//-----------------------------------------------------------------------
//
// CT69000::SetMode
//
// set video mode according to the mode list.
//
//-----------------------------------------------------------------------
SCODE
CT69000::SetMode(INT modeId, HPALETTE *pPalette)
{
PULONG pulBitMask;
SCODE sc;
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("CT69000::SetMode\r\n")));
//
// fail SetMode if we failed to initialize
//
if (m_pFrameBuffer==NULL)
return E_OUTOFMEMORY;
#if !BIOSSETUP
//
// The mode is already set, just return
//
if (m_pMode)
return S_OK;
#endif
//
// if user selects mode Id out of range,
// start in defaul mode
//
if (modeId >= NumModes())
modeId = 0;
//
// note: currently we always get called with mode 0 ??
//
modeId = m_ulVideoMode;
gpemodes[modeId]->frequency = m_ulRefreshRate;
m_pMode = gpemodes[modeId];
//
// select proper bitmask (hardcoded in FBBPP)
//
pulBitMask=ulBitMask;
m_ulBitMasks[0] = pulBitMask[0];
m_ulBitMasks[1] = pulBitMask[1];
m_ulBitMasks[2] = pulBitMask[2];
m_nScreenWidth = m_pMode->width;
m_nScreenHeight = m_pMode->height;
m_nScreenBpp = m_pMode->Bpp;
m_nScreenBytesPerPixel = m_pMode->Bpp / 8;
m_nScreenStride = m_nScreenWidth * m_nScreenBytesPerPixel;
DEBUGMSG(CT69K_ZONE_INIT, (TEXT(
"mode=%d modeID=%d width=%d height=%d stride=%d\r\n"),
modeId, m_pMode->modeId, m_nScreenWidth, m_nScreenHeight,
m_nScreenStride));
//
// create video memory heap
//
// force allocations to align to 128 bits/16 byte
// otherwise there were artifacts in the TextOut1bpp function
// when writing on a misaligned surface? (chip bug?)
//
// we reserve memory for the cursor and the brush here,
// they don't need to be managed
//
m_pVMHeap = new LinHeap ( m_ulVideoMemorySize-
CT69000_CURSOR_SPACE-
CT69000_PATTERN_SPACE,
16);
if (m_pVMHeap==NULL) return E_OUTOFMEMORY;
if (FAILED(sc = AllocSurface( &m_pPrimarySurface,
m_nScreenWidth,
m_nScreenHeight,
m_pMode->format,
GPE_REQUIRE_VIDEO_MEMORY)))
return sc;
#if !BIOSSETUP
SetDisplayMode(vgamodes[modeId]);
SetRefreshRate(m_ulRefreshRate);
#else
//
//the following statement caused no VGA output on some platforms
//
//WRITE_LIN_UCHAR( VGA_MSR_REG, 3); // set regs to CGA emulation (3dx)
SetXR( 9, 1);
SetXR( 0xa, 2); // enable linear frame buffer, disable a0000 window
SetXR( 0xb, 9); // enable pci bursts, disable for text expansion
SetXR( 0x20, 2); // reset blt engine
SetXR( 0x40, 3); // high res modes, no wrap!
#endif
#if DEBUG
//
// on debugging, let us know that we can access the framebuffer...
//
for (INT i=0;i<256;i+=8)
{
memset ( m_pFrameBuffer, i, m_ulVideoMemorySize);
}
memset ( m_pFrameBuffer, 0, m_ulVideoMemorySize);
#endif
// Clear the screen
memset((PUCHAR) m_pPrimarySurface->Buffer(),
0,
m_pMode->width *
m_pMode->height *
(m_pMode->Bpp >> 3));
// Here, we use EngCreatePalette to create a palette that
// MGDI will use as a stock palette
if (pPalette)
{
if (m_pMode->format==gpe8Bpp)
{
*pPalette = EngCreatePalette(PAL_INDEXED,
PALETTE_SIZE,
(PULONG)_rgbIdentity, 0, 0, 0);
DEBUGMSG(CT69K_ZONE_INIT, (
TEXT("Created 8 Bpp palette, handle = 0x%08x\r\n"), *pPalette));
SetPalette (_rgbIdentity, 0, 256);
} else
{
// 15,16,24, and 32bpp primaries are defined by red,green, and blue bitfields...
*pPalette = EngCreatePalette
(
PAL_BITFIELDS,
0,
NULL,
m_ulBitMasks[0],
m_ulBitMasks[1],
m_ulBitMasks[2]
);
DEBUGMSG(CT69K_ZONE_INIT, (
TEXT("Created bitfield handle (%02x,%02x,%02x)= 0x%08x\r\n"),
m_ulBitMasks[0],m_ulBitMasks[1],m_ulBitMasks[2],*pPalette));
}
}
//
// reset and disable cursor 1
//
m_pCursorMemory = m_pFrameBuffer+m_ulCursorMemory;
m_pPatternMemory= m_pFrameBuffer+m_ulPatternMemory;
// reset blt engine
switch (m_pMode->format)
{
case gpe24Bpp: m_ucBitBlt=0x20; break;
case gpe16Bpp: m_ucBitBlt=0x10; break;
default:
case gpe8Bpp: m_ucBitBlt=0x0; break;
}
SetXR( 0x20, m_ucBitBlt|2);
SetXR( 0x20, m_ucBitBlt);
// setup base address for pattern data
SetBR( 5, m_ulPatternMemory);
// set up base address for cursor 1
SetXR(CT69000_CURSOR1_BASEADDRESSLOW,(UCHAR) ((m_ulCursorMemory >> 8) & 0xf0));
SetXR(CT69000_CURSOR1_BASEADDRESSHIGH, (UCHAR) (m_ulCursorMemory >> 16));
//
// turn off cursor for now....
//
DisableCursor();
#if DXPAK
//
// reset overlay for DirectX
//
ResetOverlay();
#endif
DEBUGMSG(CT69K_ZONE_INIT, (TEXT("Leaving CT69000::SetMode\r\n")));
return S_OK;
}
//-----------------------------------------------------------------------
//
// CT69000::GetModeInfo
//
// GPE calls this function to build its mode table
//
//-----------------------------------------------------------------------
SCODE
CT69000::GetModeInfo(GPEMode *pMode, int modeNo)
{
DEBUGMSG(CT69K_ZONE_FUNCTION, (TEXT(
"CT69000::GetModeInfo(modeNo=%d)\r\n"), modeNo));
if (modeNo < 0 || modeNo >= NumModes())
return E_INVALIDARG;
//
// note: remove this when loadcepc can pass more than five video modes
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -