📄 blt.cpp
字号:
FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_WIDTH),
FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_DESTINATION_BASE),
((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_PITCH),
FIELD_INIT_VAL(DE_PITCH, DESTINATION, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DESTINATION),
FIELD_INIT_VAL(DE_DESTINATION, X, dstX) |
FIELD_INIT_VAL(DE_DESTINATION, Y, dstY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DIMENSION),
FIELD_INIT_VAL(DE_DIMENSION, X, dimX) |
FIELD_INIT_VAL(DE_DIMENSION, Y_ET, dimY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_MONO_PATTERN_LOW),
FIELD_INIT_VAL(DE_MONO_PATTERN_LOW, PATTERN, 0xFFFFFFFF)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_MONO_PATTERN_HIGH),
FIELD_INIT_VAL(DE_MONO_PATTERN_HIGH, PATTERN, 0xFFFFFFFF)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_FOREGROUND),
FIELD_INIT_VAL(DE_FOREGROUND, COLOR, color)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_CONTROL),
FIELD_INIT(DE_CONTROL, STATUS, START) |
FIELD_INIT(DE_CONTROL, UPDATE_DESTINATION_X, DISABLE) |
FIELD_INIT(DE_CONTROL, QUICK_START, DISABLE) |
FIELD_INIT(DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
FIELD_INIT(DE_CONTROL, COMMAND, BITBLT) |
FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP3) |
FIELD_INIT(DE_CONTROL, TRANSPARANCY, DISABLE) |
FIELD_INIT_VAL(DE_CONTROL, ROP, (pBltParms->rop4 & 0xFF))
);
INSERTCMD_FINISH(cmd_ptr, 0);
STOP_CI();
WAIT_CI_STOP();
INSERTCMD_NOP(last_finish_ptr);
last_finish_ptr = cmd_ptr - CMD_STRIDE_DWORD;
FLUSH_CMD();
START_CI("CMDList FillRect\r\n");
#else
WaitForNotBusy();
reg_DestXY = (dstX << 16) | dstY;
reg_DimXY = (dimX << 16) | dimY;
reg_FgColor = color;
reg_PatternLow = 0xFFFFFFFF;
reg_PatternHigh = 0xFFFFFFFF;
reg_RowPitch = (dstWidth << 16) | dstWidth;
reg_WindowWidth = (dstWidth << 16) | dstWidth;
POKE_32(DE_WINDOW_DESTINATION_BASE,
FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, EXT, m_SMISettings.m_bUMA) |
FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,
VgxSurfAddr(((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory())) |
0);
reg_ROPCommand = (pBltParms->rop4 & 0xFF)
| CMD_BITBLT
| MONO_PATTERN
| START_DRAWING_ENGINE;
#endif //CMDLIST
/*
switch(m_nScreenBpp/8)
{
case 1: bpp = 0x00030003; break;
case 2: bpp = 0x00130003; break;
case 3: bpp = 0x00340003; break;
case 4: bpp = 0x00230003; break;
}
WaitForFIFO(10);
WaitForNotBusy();
POKE_32(DPR+0x04, (dstX << 16) | dstY);
POKE_32(DPR+0x08, (dimX << 16) | dimY);
POKE_32(DPR+0x10, (dstWidth << 16) | dstWidth);
POKE_32(DPR+0x14, color);
POKE_32(DPR+0x1C, bpp);
POKE_32(DPR+0x34, 0xFFFFFFFF);
POKE_32(DPR+0x38, 0xFFFFFFFF);
POKE_32(DPR+0x3C, (dstWidth << 16) | dstWidth);
POKE_32(DPR+0x44, ((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory());
POKE_32(DPR+0x0c, (cmd << 16)| 0x800c);
*/
return(S_OK);
}
SCODE SMI::PatFill(GPEBltParms *pBltParms)
{
if (!(pBltParms->xPositive && pBltParms->yPositive))
return WrapBlt(pBltParms);
int patX = (pBltParms->pptlBrush)?((pBltParms->pptlBrush->x+0) & 7):0;
int patY = (pBltParms->pptlBrush)?((pBltParms->pptlBrush->y+0) & 7):0;
PUCHAR pvPattern = (PUCHAR)(pBltParms->pBrush->Buffer());
UCHAR ajPattern[8 * 8 * 4];
ULONG m_ulSrc;
if ((patX || patY) ||
(pBltParms->pBrush->Stride() != (int)m_nScreenBpp))
{
RotateBrush(pBltParms->pBrush, ajPattern, patX, patY);
pvPattern = ajPattern;
}
#ifdef CMDLIST
VALIDATE_SLOT(cmd_ptr, (6+m_nScreenBpp*2+16));
INSERTCMD_STATUS(cmd_ptr,
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_ENGINE) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_SETUP) |
FIELD_GET_MASK(CMD_INTPR_STATUS, CSC_STATUS) |
FIELD_GET_MASK(CMD_INTPR_STATUS, COMMAND_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_MEMORY_FIFO) ,
FIELD_INIT(CMD_INTPR_STATUS, 2D_ENGINE, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_SETUP, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_CONTROL),
FIELD_INIT(DE_CONTROL, PATTERN, COLOR)
);
INSERTCMD_LOADREG_E(cmd_ptr, REG(DE_DATAPORT), ( m_nScreenBpp * 2) );
#else //CMDLIST
WaitForNotBusy();
// Dummy Code to make the function work correctly.
// Don't comment the following code reg_ROPCommand = COLOR_PATTERN;
// John Huang 03/14/2002
reg_ROPCommand = COLOR_PATTERN;
// memcpy(m_pMMIO + 0x0000, pvPattern, m_nScreenBpp * 8);
#endif // CMDLIST
for (UINT i = 0; i < m_nScreenBpp * 2; i++)
{
m_ulSrc = *(PULONG)pvPattern;
#ifdef CMDLIST
INSERTCMD_LOADDATA(cmd_ptr, m_ulSrc );
#else //CMDLIST
*((PULONG) (m_pMMIO)+i) = m_ulSrc;
#endif //CMDLIST
pvPattern += 4;
}
int dstX = pBltParms->prclDst->left;
int dstY = pBltParms->prclDst->top;
int dimX = pBltParms->prclDst->right - dstX;
int dimY = pBltParms->prclDst->bottom - dstY;
int dstWidth = ((SMISurf*) (pBltParms->pDst))->AlignedWidth();
#ifdef CMDLIST
INSERTCMD_STATUS(cmd_ptr,
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_ENGINE) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_SETUP) |
FIELD_GET_MASK(CMD_INTPR_STATUS, CSC_STATUS) |
FIELD_GET_MASK(CMD_INTPR_STATUS, COMMAND_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_MEMORY_FIFO) ,
FIELD_INIT(CMD_INTPR_STATUS, 2D_ENGINE, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_SETUP, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_WIDTH),
FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_DESTINATION_BASE),
((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_PITCH),
FIELD_INIT_VAL(DE_PITCH, DESTINATION, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DESTINATION),
FIELD_INIT_VAL(DE_DESTINATION, X, dstX) |
FIELD_INIT_VAL(DE_DESTINATION, Y, dstY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DIMENSION),
FIELD_INIT_VAL(DE_DIMENSION, X, dimX) |
FIELD_INIT_VAL(DE_DIMENSION, Y_ET, dimY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_CONTROL),
FIELD_INIT(DE_CONTROL, STATUS, START) |
FIELD_INIT(DE_CONTROL, UPDATE_DESTINATION_X, DISABLE) |
FIELD_INIT(DE_CONTROL, PATTERN, COLOR) |
FIELD_INIT(DE_CONTROL, QUICK_START, DISABLE) |
FIELD_INIT(DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
FIELD_INIT(DE_CONTROL, COMMAND, BITBLT) |
FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP3) |
FIELD_INIT(DE_CONTROL, TRANSPARANCY, DISABLE) |
FIELD_INIT_VAL(DE_CONTROL, ROP, (pBltParms->rop4 & 0xFF))
);
INSERTCMD_FINISH(cmd_ptr, 0);
STOP_CI();
WAIT_CI_STOP();
INSERTCMD_NOP(last_finish_ptr);
last_finish_ptr = cmd_ptr - CMD_STRIDE_DWORD;
FLUSH_CMD();
START_CI("CMDList PatFill\r\n");
#else // CMDLIST
WaitForNotBusy();
reg_DestXY = (dstX << 16) | dstY;
reg_DimXY = (dimX << 16) | dimY;
reg_RowPitch = (dstWidth << 16) | dstWidth;
reg_WindowWidth = (dstWidth << 16) | dstWidth;
POKE_32(DE_WINDOW_DESTINATION_BASE,
FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, EXT, m_SMISettings.m_bUMA) |
FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,
VgxSurfAddr(((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory())) |
0);
reg_ROPCommand = (pBltParms->rop4 & 0xFF)
| CMD_BITBLT
| COLOR_PATTERN
| START_DRAWING_ENGINE;
#endif // CMDLIST
return(S_OK);
}
void SMI::RotateBrush(GPESurf *pBrush, UCHAR *pjPattern, int patX, int patY)
{
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("RotateBrush\r\n")));
PUCHAR pjPatByte = (UCHAR *) pBrush->Buffer();
WaitForNotBusy();
switch (pBrush->Format())
{
case gpe8Bpp:
{
for (int y = 0; y < 8; y++)
{
PUCHAR pjBuffer = pjPattern + ((patY + y) & 7) * 8;
for (int x = 0; x < 8; x++)
{
pjBuffer[(patX + x) & 7] = pjPatByte[x];
}
pjPatByte += pBrush->Stride();
}
break;
}
case gpe16Bpp:
{
for (int y = 0; y < 8; y++)
{
PUSHORT pjBuffer = (PUSHORT) pjPattern + ((patY + y) & 7) * 8;
for (int x = 0; x < 8; x++)
{
pjBuffer[(patX + x) & 7] = ((PUSHORT) pjPatByte)[x];
}
pjPatByte += pBrush->Stride();
}
break;
}
case gpe32Bpp:
{
for (int y = 0; y < 8; y++)
{
PULONG pjBuffer = (PULONG) pjPattern + ((patY + y) & 7) * 8;
for (int x = 0; x < 8; x++)
{
pjBuffer[(patX + x) & 7] = ((PULONG) pjPatByte)[x];
}
pjPatByte += pBrush->Stride();
}
break;
}
}
}
SCODE SMI::MaskedImage(GPEBltParms *pBltParms)
{
ULONG m_ulSrc;
int dstX = pBltParms->prclDst->left;
int dstY = pBltParms->prclDst->top;
int dimX = pBltParms->prclDst->right - dstX;
int dimXSave = dimX;
int dimY = pBltParms->prclDst->bottom - dstY;
int i=0,j=0;
int dstWidth = ((SMISurf*) (pBltParms->pDst))->AlignedWidth();
COLOR color = pBltParms->solidColor;
if (pBltParms->pLookup)
color = (pBltParms->pLookup)[color];
if (pBltParms->pConvert)
color = (pBltParms->pColorConverter->*(pBltParms->pConvert))(color);
PUCHAR patBuffer = (PUCHAR) ((SMISurf *) (pBltParms->pMask))->Buffer();
int patStride = ((SMISurf *) (pBltParms->pMask))->Stride();
int patWidth = abs(patStride) * 8;
int patLeft = pBltParms->prclMask->left;
int patTop = pBltParms->prclMask->top;
int patBottom = pBltParms->prclMask->bottom;
int offLeft = (patLeft & 0x07);
patBuffer += patTop * patStride + patLeft / 8;
int BytesPerScan = (dimXSave + offLeft + 7) / 8;
int Bytes4PerScan = (BytesPerScan + 3) & ~3;
int BytesRemain = BytesPerScan & 3;
int nLong = BytesPerScan & ~3;
#ifdef CMDLIST
VALIDATE_SLOT(cmd_ptr, 24+(Bytes4PerScan/4+1)*dimY*2);
INSERTCMD_STATUS(cmd_ptr,
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_ENGINE) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_SETUP) |
FIELD_GET_MASK(CMD_INTPR_STATUS, CSC_STATUS) |
FIELD_GET_MASK(CMD_INTPR_STATUS, COMMAND_FIFO) |
FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_MEMORY_FIFO) ,
FIELD_INIT(CMD_INTPR_STATUS, 2D_ENGINE, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_SETUP, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_SOURCE),
FIELD_INIT_VAL(DE_SOURCE, X_K1, offLeft) |
FIELD_INIT_VAL(DE_SOURCE, Y_K2, patTop)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_WIDTH),
FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth) |
FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_WINDOW_DESTINATION_BASE),
((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_PITCH),
FIELD_INIT_VAL(DE_PITCH, DESTINATION, dstWidth) |
FIELD_INIT_VAL(DE_PITCH, SOURCE, dstWidth)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DESTINATION),
FIELD_INIT_VAL(DE_DESTINATION, X, dstX) |
FIELD_INIT_VAL(DE_DESTINATION, Y, dstY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_DIMENSION),
FIELD_INIT_VAL(DE_DIMENSION, X, dimX) |
FIELD_INIT_VAL(DE_DIMENSION, Y_ET, dimY)
);
INSERTCMD_LOADREG_D(cmd_ptr,
REG(DE_FOREGROUND),
FIELD_INIT_VAL(DE_FOREGROUND, COLOR, color)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -