📄 ct69000.h
字号:
INT m_nScreenBpp; // Bits/pixel
INT m_nScreenBytesPerPixel; // multiplier
LinHeap *m_pVMHeap; // video memory allocator
// cursor memory region (4kb)
ULONG m_ulCursorMemory; // offset in ULONG
volatile PUCHAR m_pCursorMemory; // pointer to memory
INT m_iHotX, m_iHotY;
INT m_iCursorRegion; // index of active cursor region
//
ULONG m_ulPatternMemory; // offset in ULONG
volatile PUCHAR m_pPatternMemory; // pointer to memory
UCHAR m_ucBitBlt; // keep default of blt config register
BOOL m_bCursorIs64x64; // remember if we have 64x64 cursor
ULONG m_ulOvlXOffset;
ULONG m_ulOvlYOffset;
RECTL m_rOvlDstWindow;
RECTL m_rOvlSrcWindow;
ULONG m_ulOvlBaseOffset;
BOOL m_bOverlayOn;
ULONG m_ulVideoMode;
ULONG m_ulRefreshRate;
BOOL m_bHasVGARegs;
BOOL m_bChip69030;
VOID ListRegs( PUCHAR pIndexReg, BYTE bStart, BYTE bStop);
//
// set/get BR register
//
#if DEBUG
VOID SetBR( ULONG ulIndex, ULONG ulData)
{
((volatile PULONG)m_pCtrlRegister)[CT69000_BR+ulIndex]=ulData;
}
#endif
ULONG GetBR( ULONG ulIndex)
{
return ((volatile PULONG)m_pCtrlRegister)[CT69000_BR+ulIndex];
}
//
// set/get MR register
//
VOID SetMR( UCHAR ucIndex, UCHAR ucData)
{ m_pCtrlRegister[CT69000_MRINDEX]=ucIndex;
m_pCtrlRegister[CT69000_MRDATA]=ucData;
}
UCHAR GetMR( UCHAR ucIndex)
{
m_pCtrlRegister[CT69000_MRINDEX]=ucIndex;
return m_pCtrlRegister[CT69000_MRDATA];
}
VOID WRITE_LIN_UCHAR( WORD wAddress, BYTE bData);
BYTE READ_LIN_UCHAR( WORD wAddress);
//
// set/get CR register
//
VOID SetCR( UCHAR ucIndex, UCHAR ucData)
{
m_pCtrlRegister[CT69000_CRINDEX]=ucIndex;
m_pCtrlRegister[CT69000_CRDATA]=ucData;
}
UCHAR GetCR( UCHAR ucIndex)
{
m_pCtrlRegister[CT69000_CRINDEX]=ucIndex;
return m_pCtrlRegister[CT69000_CRDATA];
} //
// set/get XR register
//
VOID SetXR( UCHAR ucIndex, UCHAR ucData)
{
m_pCtrlRegister[CT69000_XRINDEX]=ucIndex;
m_pCtrlRegister[CT69000_XRDATA]=ucData;
}
UCHAR GetXR( UCHAR ucIndex)
{
m_pCtrlRegister[CT69000_XRINDEX]=ucIndex;
return m_pCtrlRegister[CT69000_XRDATA];
}
VOID SetXRPort( UCHAR ucIndex, UCHAR ucData);
UCHAR GetXRPort( UCHAR ucIndex);
VOID SetXRBit( UCHAR ucIndex, UCHAR ucData)
{ SetXR( ucIndex, GetXR(ucIndex) | ucData);
}
VOID ClearXRBit( UCHAR ucIndex, UCHAR ucData)
{ SetXR( ucIndex, GetXR(ucIndex) & ~ucData);
}
//
// some cursor helper functions
//
VOID SetCursorColor( ULONG ulFore, ULONG ulBack);
VOID DisableCursor();
VOID EnableCursor32x32();
VOID EnableCursor64x64();
#if !BIOSSETUP
VOID SetDisplayMode( VGAPortData *pData);
VOID SetRefreshRate( DWORD dwRefreshRate);
INT GetClockSpeed ( DWORD dwBase);
VOID SetVCO ( DWORD dwBase, INT M, INT N, INT VLD, INT PD);
INT VCOSpeed( INT M, INT N, INT VLD)
{ return (CT69000_REF_CLOCK * M * VLD) / N; }
INT ClockSpeed( INT M, INT N, INT VLD, INT PD)
{ return VCOSpeed(M,N,VLD)/PD; }
#endif // !BIOSSETUP
UCHAR GetVGAStatus()
{ return READ_LIN_UCHAR(VGA_STATUS_REG1); }
SCODE SetPalette( const PALETTEENTRY *src,
USHORT firstEntry,
USHORT numEntries);
BOOL BltEngineBusy()
{
return GetBR( 4) & 0x80000000;
}
VOID ResetBltEngine()
{
SetXR( 0x20, m_ucBitBlt|2);
SetXR( 0x20, m_ucBitBlt);
}
#if CURSORDEBUG
BOOL m_bBltEmulation;
#endif
#if DXPAK
VOID ResetOverlay();
HINSTANCE hDDStub;
#endif
public:
ULONG m_ulBitMasks[3];
CT69000();
~CT69000();
virtual SCODE SetMode(int modeNo, HPALETTE *pPalette);
virtual SCODE GetModeInfo(GPEMode *pMode, int modeNo);
virtual INT NumModes(void);
virtual ULONG GetGraphicsCaps();
virtual int IsPaletteSettable();
virtual VOID GetPhysicalVideoMemory( PULONG pPhysicalMemoryBase,
PULONG pVideoMemorySize);
virtual SCODE AllocSurface( GPESurf **ppSurf,
INT width,
INT height,
EGPEFormat format,
INT surfaceFlags);
virtual SCODE Line(GPELineParms *pLineParms, EGPEPhase phase);
virtual SCODE BltPrepare(GPEBltParms *pBltParms);
virtual SCODE BltComplete(GPEBltParms *pBltParms);
virtual SCODE SetPointerShape( GPESurf *pMask,
GPESurf *pColorSurf,
INT xHot,
INT yHot,
INT cx,
INT cy);
virtual SCODE MovePointer( INT x, INT y);
virtual int IsBusy();
void WaitForNotBusy();
virtual ULONG DrvEscape(
SURFOBJ *pso,
ULONG iEsc,
ULONG cjIn,
PVOID pvIn,
ULONG cjOut,
PVOID pvOut);
// hw acceleration functions
SCODE DummyBlt (GPEBltParms *pBltParms);
SCODE AcceleratedSrcCopyBlt (GPEBltParms *pBltParms);
SCODE AcceleratedTransparentSrcCopyBlt (GPEBltParms *pBltParms);
SCODE AcceleratedPatSrcDstBlt(GPEBltParms *pBltParms);
SCODE AcceleratedFill (GPEBltParms *pBltParms);
SCODE AcceleratedPatternFill (GPEBltParms *pBltParms);
SCODE AcceleratedTextOut1bpp (GPEBltParms *pBltParms);
SCODE AcceleratedLine (GPELineParms *pLineParms);
// some rewritten sw acceleration routines
SCODE EmulatedLine8Bit (GPELineParms *pLineParms);
SCODE EmulatedLine16Bit(GPELineParms *pLineParms);
ULONG DownloadBrush (GPESurf *pBrush);
#ifdef DEBUG
VOID DbgBltParms( INT iDebugLevel, GPEBltParms *pBltParms);
#endif
INT ScanLine();
INT InVBlank();
BOOL FlipInProgress();
VOID FlipTo( DWORD dwNewBase);
EGPEFormat GetFormat() { return m_pMode->format; }
//
// macro for ddraw fills/blts
//
VOID SetBRFill( ULONG ulDstPitch,
ULONG ulFillColor,
ULONG ulCmd,
ULONG ulDst,
ULONG ulWidth,
ULONG ulHeight);
VOID SetBRBlt ( ULONG ulSrcPitch,
ULONG ulDstPitch,
ULONG ulCmd,
ULONG ulSrc,
ULONG ulDst,
ULONG ulWidth,
ULONG ulHeight);
VOID SetKey( DWORD dwKey);
//
// functions to control ddraw overlay
//
VOID OverlayOn();
VOID OverlayOff();
VOID ColorKeyOn ();
VOID ColorKeyOff();
VOID SetOvlPTR1( ULONG ulBase);
VOID SetOvlPTR2( ULONG ulBase);
VOID OvlFlipTo ( ULONG ulBase);
BOOL OvlFlipBusy();
ULONG SetOverlayWindow(
ULONG ulSrcStride,
LPRECTL lpSrcWindow,
LPRECTL lpDstWindow
);
VOID SetOvlFormat( DWORD dwOvlFormat);
VOID SetOverlayPosition( ULONG ulX, ULONG ulY);
VOID SetColorKey( DWORD dwKey);
ULONG RefreshRate() { return m_ulRefreshRate; }
ULONG VideoMemorySize() { return m_ulVideoMemorySize; }
ULONG VideoMemoryFree() { return m_pVMHeap->TotalFree(); }
ULONG VideoPhysAddress(){ return m_ulPhysFrameBuffer; }
ULONG BytesPerPixel(ULONG ulPixel)
{
return BYTESPERPIXEL(ulPixel);
}
};
class SGPESurf:public GPESurf
{
public:
SGPESurf(
int width,
int height,
EGPEFormat format);
~SGPESurf();
};
class CT69000Surf : public GPESurf
{
private:
LinHeap *m_pVMHeap;
INT m_Flags;
CT69000Surf *m_pNext;
CT69000Surf *m_pPrev;
static CT69000Surf *m_pRoot;
public:
CT69000Surf( INT width,
INT height,
ULONG offset,
PVOID pBits,
INT stride,
EGPEFormat format,
LinHeap *pVMHeap,
INT flags);
virtual ~CT69000Surf(void);
BOOL Demote();
BOOL DemoteSurf(BOOL bAll);
};
//
// inline for DDraw color key setting
//
inline VOID CT69000::SetKey( DWORD dwKey)
{
SetBR( 1, dwKey);
}
//
// inline for DDraw fill
//
inline VOID CT69000::SetBRFill(
ULONG ulDstPitch,
ULONG ulFillColor,
ULONG ulCmd,
ULONG ulDst,
ULONG ulWidth,
ULONG ulHeight)
{
SetBR( 0, ulDstPitch << 16);
SetBR( 1, ulFillColor);
SetBR( 4, ulCmd);
SetBR( 7, ulDst);
SetBR( 8,(ulHeight<<16) | ulWidth);
}
//
// inline for ddraw blt
//
inline VOID CT69000::SetBRBlt (
ULONG ulSrcPitch,
ULONG ulDstPitch,
ULONG ulCmd,
ULONG ulSrc,
ULONG ulDst,
ULONG ulWidth,
ULONG ulHeight)
{
SetBR( 0,(ulDstPitch << 16) | ulSrcPitch);
SetBR( 4, ulCmd);
SetBR( 6, ulSrc);
SetBR( 7, ulDst);
SetBR( 8,(ulHeight<<16) | ulWidth);
}
#endif __CT69000_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -