📄 smilynx.c
字号:
register SmiVideoWin *pVWin = (SmiVideoWin *)&smiVW;
int depth = pSmiDriver->generic.ugi.pMode->colorDepth;
int Bpp = depth >> 3; /* 1 byte per pix for 8 bit color, 2 for 16 */
pVP->width = pSmiDriver->generic.ugi.pMode->width*Bpp;
pVP->control |= Bpp << 16;
pVWin->bottom = pSmiDriver->generic.ugi.pMode->height- 1;
pVWin->right = pSmiDriver->generic.ugi.pMode->width - 1;
pVWin->width = pVP->width;
/* color key */
WRITE_VPR (pSmiDriver,0x0004, pVP->colorKey);
/* color key mask */
WRITE_VPR (pSmiDriver,0x0008, pVP->colorKeyMask);
/* data src start adrs */
WRITE_VPR (pSmiDriver ,0x000c, pVP->start / 8);
/* data width and offset */
WRITE_VPR (pSmiDriver, 0x0010,
((pVP->offset / 8 * Bpp) << 16) |
(pSmiDriver->generic.ugi.pMode->width / 8 * Bpp));
/* video window 1 */
WRITE_VPR (pSmiDriver, 0x0014,
((pVWin->top << 16) | pVWin->left));
WRITE_VPR (pSmiDriver, 0x0018,
((pVWin->bottom << 16) | pVWin->right));
WRITE_VPR (pSmiDriver, 0x001c, pVWin->srcStart / 8);
WRITE_VPR (pSmiDriver, 0x0020,
(((pVWin->offset / 8) << 16) | (pVWin->width / 8)));
WRITE_VPR (pSmiDriver, 0x0024,
(((pVWin->hStretch) << 8) | pVWin->vStretch));
/* video window 2 */
WRITE_VPR (pSmiDriver, 0x0028,
((pVWin->top << 16) | pVWin->left));
WRITE_VPR (pSmiDriver, 0x002c,
((pVWin->bottom << 16) | pVWin->right));
WRITE_VPR (pSmiDriver, 0x0030,
pVWin->srcStart / 8);
WRITE_VPR (pSmiDriver, 0x0034,
(((pVWin->offset / 8) << 16) | (pVWin->width / 8)));
WRITE_VPR (pSmiDriver, 0x0038,
(((pVWin->hStretch) << 8) | pVWin->vStretch));
/* fifo prio control */
WRITE_VPR (pSmiDriver, 0x0054, pVP->fifoPrio);
/* fifo empty request levell */
WRITE_VPR (pSmiDriver, 0x0058, pVP->fifoERL);
/* conversion constant */
WRITE_VPR (pSmiDriver, 0x005c, pVP->YUVtoRGB);
/* vpr control word */
WRITE_VPR (pSmiDriver, 0x0000, pVP->control);
}
/******************************************************************************
*
* Init drawing engine registers
*/
void smiInitDrawEngine (SMI_DRIVER * pSmiDriver)
{
unsigned int val;
int depth = pSmiDriver->generic.ugi.pMode->colorDepth;
int Bpp = depth >> 3; /* 1 byte per pix for 8 bit color, 2 for 16 */
/* don't start now */
WRITE_DPR (pSmiDriver, 0x000c, 0x000f0000);
/* set rop2 to copypen */
val = 0xffff3ff0 & READ_DPR (pSmiDriver, 0x000c);
WRITE_DPR (pSmiDriver, + 0x000c, (val | 0x8000 | 0x0c));
/* set clip rect */
WRITE_DPR (pSmiDriver, 0x002c, 0);
WRITE_DPR (pSmiDriver, 0x0030,
((pSmiDriver->generic.ugi.pMode->height<<16) | pSmiDriver->generic.ugi.pMode->width * Bpp ));
/* src row pitch */
val = 0xffff0000 & ( READ_DPR (pSmiDriver, 0x0010));
WRITE_DPR (pSmiDriver, 0x0010,
(val | pSmiDriver->generic.ugi.pMode->width * Bpp));
/* dst row pitch */
val = 0x0000ffff & ( READ_DPR (pSmiDriver, 0x0010));
WRITE_DPR (pSmiDriver, 0x0010,
(((pSmiDriver->generic.ugi.pMode->width * Bpp)<<16) | val));
/* window width src/dst */
WRITE_DPR (pSmiDriver, 0x003c,
(((pSmiDriver->generic.ugi.pMode->width * Bpp & 0x0fff)<<16) |
(pSmiDriver->generic.ugi.pMode->width * Bpp & 0x0fff)));
WRITE_DPR (pSmiDriver, 0x001e, 0x0000);
/* src base adrs */
WRITE_DPR (pSmiDriver, 0x0040,
(((0xdc000000/8) & 0x000fffff)));
/* dst base adrs */
WRITE_DPR (pSmiDriver, 0x0044,
(((0xdc000000/8) & 0x000fffff)));
/* foreground color */
WRITE_DPR (pSmiDriver, 0x0014, 0x1f);/*blue*/
/* background color */
WRITE_DPR (pSmiDriver, 0x0018, 0x7e0);/*green*/
/* xcolor */
WRITE_DPR (pSmiDriver, 0x0020, 0x00ffffff);
/* xcolor mask */
WRITE_DPR (pSmiDriver, 0x0024, 0x00ffffff);
/* bit mask */
WRITE_DPR (pSmiDriver, 0x0028, 0x00ffffff);
/* load mono pattern */
WRITE_DPR (pSmiDriver, 0x0034, 0);
WRITE_DPR (pSmiDriver, 0x0038, 0);
}
/*******************************************************************************
*
* Init capture port registers
*/
void smiInitCapturePortReg (SMI_DRIVER * pSmiDriver)
{
SmiCapturePort smiCP = { 0x01400600, 0x30, 0x40, 480, 640, 0, 0, 2560, 6 };
register SmiCapturePort *pCP = (SmiCapturePort *)&smiCP;
WRITE_CPR (pSmiDriver, 0x0004, ((pCP->topClip<<16) | pCP->leftClip));
WRITE_CPR (pSmiDriver, 0x0008, ((pCP->srcHeight<<16) | pCP->srcWidth));
WRITE_CPR (pSmiDriver, 0x000c, pCP->srcBufStart1/8);
WRITE_CPR (pSmiDriver, 0x0010, pCP->srcBufStart2/8);
WRITE_CPR (pSmiDriver, 0x0014, pCP->srcOffset/8);
WRITE_CPR (pSmiDriver, 0x0018, pCP->fifoControl);
WRITE_CPR (pSmiDriver, 0x0000, pCP->control);
}
void smiLynxSetVgaRegisters(SMI_DRIVER * pSmiDriver)
{
smiMcrRegSet(pSmiDriver);
VgaHwInit(pSmiDriver);
smiSetMode(pSmiDriver);
shadowRegs(pSmiDriver);
/*smiInitVideoProc(pSmiDriver);
smiInitCapturePortReg(pSmiDriver);
smiInitDrawEngine(pSmiDriver);
memregInit();*/
VgaLinuxInit(pSmiDriver);
}
void smiLynxEnable(SMI_DRIVER * pSmiDriver)
{
char tmp;
TRACK;
/* ---- muck about with VGA registers ---- */
/* work on the sequencer */
/* put sequencer in reset */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x0);
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, 0x0);
/* disable video output by setting Screen Out bit */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x1);
tmp = sysInByte(0xfe000000+VGA_SEQUENCER_DATA);
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp | 0x20);
/* enable linear addressing mode, single aperture, and graphics mode */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x18);
tmp = sysInByte(0xfe000000+VGA_SEQUENCER_DATA);
pSmiDriver->smiregs.SR18 = tmp;
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp | 0x51);
/* disable aperture banking/enable memory mapped behavior */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x17);
tmp = sysInByte(VGA_SEQUENCER_DATA);
pSmiDriver->smiregs.SR17 = tmp;
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp | 0x02);
/* no longer need to use io space */
pSmiDriver->ioBase = pSmiDriver->generic.fbAddress + 0x700000;
/* enable 2D engine and video processor */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x21);
tmp = sysInByte(VGA_SEQUENCER_DATA);
pSmiDriver->smiregs.SR21 = tmp;
tmp &= ~0x3;
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp);
/* work on the CRT controller */
/* enable write access to CRTC registers 0-7 */
sysOutByte(0xfe000000+VGA_CRTC_REG, 0x11);
tmp = sysInByte(0xfe000000+VGA_CRTC_DATA);
sysOutByte(0xfe000000+VGA_CRTC_DATA, tmp & ~0x80);
/* enable video output by clearing Screen Out bit */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x1);
tmp = sysInByte(0xfe000000+VGA_SEQUENCER_DATA);
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp & ~0x20 );
/* start sequencer again */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x0);
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, 0x3);
}
void smiLynxDisable(SMI_DRIVER * pSmiDriver)
{
char tmp;
TRACK;
/* restore original settings */
/* put sequencer in reset */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x0);
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, 0x0);
/* disable video output by setting Screen Out bit */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x1);
tmp = sysInByte(0xfe000000+VGA_SEQUENCER_DATA);
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp | 0x20);
/* disable 2D engine and video processor */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x21);
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, pSmiDriver->smiregs.SR21);
/* no longer used mmio */
pSmiDriver->ioBase = UGL_NULL;
/* disable write access to CRTC registers 0-7 */
sysOutByte(0xfe000000+VGA_CRTC_REG, 0x11);
tmp = sysInByte(0xfe000000+VGA_CRTC_DATA);
sysOutByte(0xfe000000+VGA_CRTC_DATA, tmp | 0x80);
/* disable linear addressing mode */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x18);
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, pSmiDriver->smiregs.SR18);
/* enable video output by clearing Screen Out bit */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x1);
tmp = sysInByte(0xfe000000+VGA_SEQUENCER_DATA);
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, tmp & ~0x20 );
/* start sequencer again */
sysOutByte(0xfe000000+VGA_SEQUENCER_REG, 0x0);
sysOutByte(0xfe000000+VGA_SEQUENCER_DATA, 0x3);
}
UGL_STATUS smiLynxModeSet (UGL_DEVICE_ID devId, UGL_MODE * pMode)
{
UGL_BOOL allocate; /* revisit */
SMI_DRIVER * pDriver = (SMI_DRIVER *)devId;
UGL_GENERIC_DRIVER * pGenDriver = (UGL_GENERIC_DRIVER *) pDriver;
UGL_UGI_DRIVER * pUgiDriver = (UGL_UGI_DRIVER *) pDriver;
TRACK;
if(pDriver->generic.ugi.pMode == UGL_NULL)
{
allocate = UGL_TRUE;
}
else
{
allocate = UGL_FALSE;
}
pDriver->modeIndex = uglGenericModeFind(smiModes, pMode, NELEMENTS(smiModes));
if(pDriver->modeIndex > -1)
{
pDriver->generic.ugi.pMode = &smiModes[pDriver->modeIndex];
}
else
return(UGL_STATUS_ERROR);
/* create software clut */
if(8 == pMode->colorDepth)
uglGenericClutCreate(&pDriver->generic, 256);
/* Create pageZero (mandatory) */
if(allocate == UGL_TRUE)
{
UGL_GEN_DDB * pDdb;
UGL_PAGE * pPageZero;
pDdb = (UGL_GEN_DDB *)UGL_CALLOC(1, sizeof(UGL_GEN_DDB));
pDdb->header.type = UGL_DDB_TYPE;
pDdb->header.height = pDriver->generic.ugi.pMode->height;
pDdb->header.width = pDriver->generic.ugi.pMode->width;
pDdb->stride = pDriver->generic.ugi.pMode->width;
pDdb->colorDepth = pDriver->generic.ugi.pMode->colorDepth;
pDdb->image = pDriver->generic.fbAddress;
pPageZero = (UGL_PAGE *)UGL_CALLOC(1, sizeof(UGL_PAGE));
pPageZero->pDdb = (UGL_DDB*) pDdb;
pDriver->generic.ugi.pPageZero = pPageZero;
pDriver->generic.pDrawPage = pPageZero;
pDriver->generic.pVisiblePage = pPageZero;
/* don't use a memory pool, yet */
pDriver->generic.videoMemPoolId = NULL;
}
/* assign depth specific functions */
if (pDriver->generic.ugi.pMode->colorDepth == 8)
{
colorBit = 8;
pUgiDriver->bitmapBlt = uglGeneric8BitBitmapBlt;
pUgiDriver->bitmapCreate = uglGeneric8BitBitmapCreate;
pUgiDriver->bitmapDestroy = uglGeneric8BitBitmapDestroy;
pUgiDriver->bitmapRead = uglGeneric8BitBitmapRead;
pUgiDriver->bitmapWrite = uglGeneric8BitBitmapWrite;
pUgiDriver->bitmapStretchBlt = uglGeneric8BitBitmapStretchBlt;
pUgiDriver->monoBitmapBlt = uglGeneric8BitMonoBitmapBlt;
pUgiDriver->monoBitmapCreate = uglGeneric8BitMonoBitmapCreate;
pUgiDriver->monoBitmapDestroy = uglGeneric8BitMonoBitmapDestroy;
pUgiDriver->monoBitmapRead = uglGeneric8BitMonoBitmapRead;
pUgiDriver->monoBitmapWrite = uglGeneric8BitMonoBitmapWrite;
pUgiDriver->monoBitmapStretchBlt = uglGeneric8BitMonoBitmapStretchBlt;
pUgiDriver->transBitmapBlt = uglGeneric8BitTransBitmapBlt;
pUgiDriver->transBitmapStretchBlt = uglGeneric8BitTransBitmapStretchBlt;
pUgiDriver->colorConvert = uglGeneric8BitColorConvert;
pUgiDriver->pixelGet = uglGeneric8BitPixelGet;
pUgiDriver->pixelSet = uglGeneric8BitPixelSet;
pUgiDriver->colorAlloc = uglGenericColorAllocIndexed;
pUgiDriver->colorFree = uglGenericColorFreeIndexed;
pGenDriver->bresenhamLine = uglGeneric8BitBresenhamLine;
pGenDriver->fbPixelGet = uglGeneric8BitFbPixelGet;
pGenDriver->fbPixelSet = uglGeneric8BitFbPixelSet;
pGenDriver->fill = uglGeneric8BitFill;
pGenDriver->hLine = uglGeneric8BitHLine;
pGenDriver->rectFill = uglGeneric8BitRectFill;
pGenDriver->vLine = uglGeneric8BitVLine;
}
else /* depth == 16 */
{
colorBit = 16;
pUgiDriver->bitmapBlt = uglGeneric16BitBitmapBlt;
pUgiDriver->bitmapCreate = uglGeneric16BitBitmapCreate;
pUgiDriver->bitmapDestroy = uglGeneric16BitBitmapDestroy;
pUgiDriver->bitmapRead = uglGeneric16BitBitmapRead;
pUgiDriver->bitmapWrite = uglGeneric16BitBitmapWrite;
pUgiDriver->bitmapStretchBlt = uglGeneric16BitBitmapStretchBlt;
pUgiDriver->monoBitmapBlt = uglGeneric16BitMonoBitmapBlt;
pUgiDriver->monoBitmapCreate = uglGeneric16BitMonoBitmapCreate;
pUgiDriver->monoBitmapDestroy = uglGeneric16BitMonoBitmapDestroy;
pUgiDriver->monoBitmapRead = uglGeneric16BitMonoBitmapRead;
pUgiDriver->monoBitmapWrite = uglGeneric16BitMonoBitmapWrite;
pUgiDriver->monoBitmapStretchBlt = uglGeneric16BitMonoBitmapStretchBlt;
pUgiDriver->transBitmapBlt = uglGeneric16BitTransBitmapBlt;
pUgiDriver->transBitmapStretchBlt = uglGeneric16BitTransBitmapStretchBlt;
pUgiDriver->colorConvert = uglGeneric16BitColorConvert;
pUgiDriver->pixelGet = uglGeneric16BitPixelGet;
pUgiDriver->pixelSet = uglGeneric16BitPixelSet;
pUgiDriver->colorAlloc = uglGenericColorAllocDirect;
pUgiDriver->colorFree = UGL_NULL;
pGenDriver->bresenhamLine = uglGeneric16BitBresenhamLine;
pGenDriver->fbPixelGet = uglGeneric16BitFbPixelGet;
pGenDriver->fbPixelSet = uglGeneric16BitFbPixelSet;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -