⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 halsurf.cpp

📁 SM501基于ARMV4/ARMV4I平台
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    }

//	WaitForVSync();
	os.dwDstX1 = pd->lXPos;
	os.dwDstY1 = pd->lYPos;

	//reg_FPRLeftTop = (pd->lXPos & 0xFFFF) | ((pd->lYPos & 0xFFFF) << 16);
	//reg_FPRRightBottom = ((pd->lXPos+os.dwDstW-1) & 0xFFFF) | (((pd->lYPos+os.dwDstH-1) & 0xFFFF) << 16);

	POKE_32(VIDEO_PLANE_TL, 
		FIELD_VALUE(0, VIDEO_PLANE_TL, TOP, pd->lYPos) |
		FIELD_VALUE(0, VIDEO_PLANE_TL, LEFT, pd->lXPos) |
		0);

	POKE_32(VIDEO_PLANE_BR, 
		FIELD_VALUE(0, VIDEO_PLANE_BR, BOTTOM, (pd->lYPos+os.dwDstH-1)) |
		FIELD_VALUE(0, VIDEO_PLANE_BR, RIGHT, (pd->lXPos+os.dwDstW-1)) |
		0);

    pd->ddRVal = DD_OK;

    return DDHAL_DRIVER_HANDLED;
}

DWORD SMI::CSCStretchBlt (LPDDHAL_BLTDATA pd)
{
	//DWORD iSrcBPP, iDestBPP;
    DWORD origSrcDimX, origSrcDimY, origDestDimX, origDestDimY;
    DWORD ScaleXn, ScaleXd, ScaleYn, ScaleYd;
    DWORD SrcTn, SrcTd, SrcLn, SrcLd;
    DWORD SrcRn, SrcRd, SrcBn, SrcBd;
    DWORD SrcDimX, SrcDimY, DestDimX, DestDimY;
	DWORD SrcFormat, DstFormat, HFilter, VFilter, byOrder;
	DWORD SrcYBase, SrcUBase, SrcVBase, SrcYPitch, SrcUVPitch;
	DWORD DestBase, DestPitch, DestHeight, DestWidth, DestBpp;
	DWORD SrcBpp, SrcLnAdd = 0;

	/* Following calculation are not correct for UV base & pitch for YUV420 & YUV420I format*/
	SrcYBase = DDGPESurf::GetDDGPESurf(pd->lpDDSrcSurface)->OffsetInVideoMemory();
	SrcUBase = DDGPESurf::GetDDGPESurf(pd->lpDDSrcSurface)->OffsetInVideoMemory();
	SrcVBase = DDGPESurf::GetDDGPESurf(pd->lpDDSrcSurface)->OffsetInVideoMemory();
	DestBase = DDGPESurf::GetDDGPESurf(pd->lpDDDestSurface)->OffsetInVideoMemory();
	SrcYPitch = pd->lpDDSrcSurface->lpGbl->lPitch;
	SrcUVPitch = pd->lpDDSrcSurface->lpGbl->lPitch;			

	DestPitch = pd->lpDDDestSurface->lpGbl->lPitch;
	DestHeight = pd->lpDDDestSurface->lpGbl->wHeight;
	DestWidth = pd->lpDDDestSurface->lpGbl->wWidth;
	DestBpp = DestPitch/DestWidth;

  	SrcFormat = 0; 
	byOrder = 0;

	if ((pd->rOrigSrc.right == 0) &&
		(pd->rOrigSrc.left == 0) &&
		(pd->rOrigSrc.bottom == 0) &&
		(pd->rOrigSrc.top == 0))
	{
		pd->rOrigSrc = pd->rSrc;
	}

	if ((pd->rOrigDest.right == 0) &&
		(pd->rOrigDest.left == 0) &&
		(pd->rOrigDest.bottom == 0) &&
		(pd->rOrigDest.top == 0))
	{
		pd->rOrigDest = pd->rDest;
	}

	if (pd->lpDDSrcSurface->dwFlags & DDRAWISURF_HASPIXELFORMAT)
	{
		LPDDPIXELFORMAT  lpddpf = &pd->lpDDSrcSurface->lpGbl->ddpfSurface;

		if(lpddpf->dwFlags & DDPF_FOURCC)
		{
			if(lpddpf->dwFourCC == FOURCC_YUYV422)
			{
				//DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - YUYV422 surface\r\n") ));
				SrcFormat = CSC_CONTROL_SOURCE_FORMAT_YUV422;
				byOrder = CSC_CONTROL_BYTE_ORDER_YUYV;
				SrcBpp = 16/8;	// 2by-p-p
				SrcYBase += (pd->rOrigSrc.left * SrcBpp) + (pd->rOrigSrc.top * SrcYPitch);
				SrcLnAdd = (SrcYBase & 0xF) / SrcBpp;

			}
			else if(lpddpf->dwFourCC == FOURCC_YUY2422 ) 
			{
				//DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - YUY2422 surface\r\n") ));
				SrcFormat = CSC_CONTROL_SOURCE_FORMAT_YUV422;
				byOrder = CSC_CONTROL_BYTE_ORDER_YUYV;
				SrcBpp = 16/8;	// 2by-p-p
				SrcYBase += (pd->rOrigSrc.left * SrcBpp) + (pd->rOrigSrc.top * SrcYPitch);
				SrcLnAdd = (SrcYBase & 0xF) / SrcBpp;
			}
		    else if(lpddpf->dwFourCC == FOURCC_UYVY422 ) 
	    	{
				//DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - YUY2422 surface\r\n") ));
				SrcFormat = CSC_CONTROL_SOURCE_FORMAT_YUV422;
				byOrder = CSC_CONTROL_BYTE_ORDER_UYVY;
				SrcBpp = 16/8;	// 2by-p-p
				SrcYBase += (pd->rOrigSrc.left * SrcBpp) + (pd->rOrigSrc.top * SrcYPitch);
				SrcLnAdd = (SrcYBase & 0xF) / SrcBpp;
			}
		    else 
	    	{
				DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported FOURCC %08x\r\n"), 
					lpddpf->dwFourCC  ));
				return DDERR_UNSUPPORTEDFORMAT;
			}
		}
    	else if (lpddpf->dwFlags & DDPF_RGB )
	    {
			// Assuming we can only handle lpddpf->dwRGBBitCount divisible by 8
			SrcBpp = lpddpf->dwRGBBitCount/8;
			SrcYBase += (pd->rOrigSrc.left * SrcBpp) + (pd->rOrigSrc.top * SrcYPitch);

	        if( lpddpf->dwRGBBitCount == 16 )
    	    {
        	    if( lpddpf->dwRGBAlphaBitMask == 0x0000 &&
            	    lpddpf->dwRBitMask == 0xF800 )
	            {
	                //DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - 565 surface detected\r\n") ));
					SrcFormat = CSC_CONTROL_SOURCE_FORMAT_RGB565;
	            }
        	    else 
        	    {
            	    DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported 16-bit format\r\n") ));
                	return DDERR_UNSUPPORTEDFORMAT;
				}
    	    }
	        else if( lpddpf->dwRGBBitCount == 32 )
    	    {
        	    if( lpddpf->dwRGBAlphaBitMask == 0x00000000 &&
            	    lpddpf->dwRBitMask == 0x00FF0000 )
				{		
    	            //DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - 8888 surface detected\r\n") ));
					SrcFormat = CSC_CONTROL_SOURCE_FORMAT_RGB8888;
				}
	           	else
				{
        	        DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported 32-bit format\r\n") ));
            	    return DDERR_UNSUPPORTEDFORMAT;
				}
    	    }
        	else
			{
    	        DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported bit-depth (%d)\r\n"), 
        	    	lpddpf->dwRGBBitCount));
	            return DDERR_UNSUPPORTEDFORMAT;
			}

		}
		else
		{
			DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported format\r\n")));
	       	return DDERR_UNSUPPORTEDFORMAT;
		}
 	}
	else
	{
		switch (m_nScreenBpp)
		{
			case 16:
				SrcFormat = CSC_CONTROL_SOURCE_FORMAT_RGB565;			
				break;
			case 32:
				SrcFormat = CSC_CONTROL_SOURCE_FORMAT_RGB8888;
				break;
			default:
    	        DEBUGMSG(1, (TEXT("SMI::CSCStretchBlt - Unsupported screen bit-depth (%d)\r\n"), 
        	    	m_nScreenBpp));
            	return DDERR_UNSUPPORTEDFORMAT;
		}			
	}

	switch (DestBpp)
	{
		case 2:
			DstFormat = CSC_CONTROL_DESTINATION_FORMAT_RGB565;
			break;
		case 4:
			DstFormat = CSC_CONTROL_DESTINATION_FORMAT_RGB8888;
			break;
		default:
			DEBUGMSG(1, (TEXT("ERROR! SMI::CSCStretchBlt() - CSC Dst Format Unsupported - iDestBpp = %d\r\n"),DestBpp));
            return DDERR_UNSUPPORTEDFORMAT;
			break;		

	}

	HFilter = CSC_CONTROL_HORIZONTAL_FILTER_ENABLE;
	VFilter = CSC_CONTROL_VERTICAL_FILTER_ENABLE;

    origSrcDimX = pd->rOrigSrc.right - pd->rOrigSrc.left;
    origSrcDimY = pd->rOrigSrc.bottom - pd->rOrigSrc.top;

    origDestDimX = pd->rOrigDest.right - pd->rOrigDest.left;
    origDestDimY = pd->rOrigDest.bottom - pd->rOrigDest.top;
               
    ScaleXn = (origSrcDimX-1)/(origDestDimX-1);
    ScaleXd = ((origSrcDimX-1)<<13)/(origDestDimX-1) - (ScaleXn<<13);

    ScaleYn = (origSrcDimY-1)/(origDestDimY-1);
    ScaleYd = ((origSrcDimY-1)<<13)/(origDestDimY-1) - (ScaleYn<<13);            

    SrcLn = (pd->rDest.left - pd->rOrigDest.left)*(origSrcDimX-1)/(origDestDimX-1);
    SrcLd = ((pd->rDest.left - pd->rOrigDest.left)<<13)*(origSrcDimX-1)/(origDestDimX-1) - (SrcLn<<13);

    SrcRn = (pd->rDest.right - 1 - pd->rOrigDest.left)*(origSrcDimX-1)/(origDestDimX-1);
    SrcRd = ((pd->rDest.right - 1 - pd->rOrigDest.left)<<13)*(origSrcDimX-1)/(origDestDimX-1) - (SrcRn<<13);

    SrcTn = (pd->rDest.top - pd->rOrigDest.top)*(origSrcDimY-1)/(origDestDimY-1);
    SrcTd = ((pd->rDest.top - pd->rOrigDest.top)<<13)*(origSrcDimY-1)/(origDestDimY-1) - (SrcTn<<13);

    SrcBn = (pd->rDest.bottom - 1 - pd->rOrigDest.top)*(origSrcDimY-1)/(origDestDimY-1);
    SrcBd = ((pd->rDest.bottom - 1 - pd->rOrigDest.top)<<13)*(origSrcDimY-1)/(origDestDimY-1) - (SrcBn<<13);

    SrcDimX = (SrcRd == 0) ? (SrcRn - SrcLn + 1) : (SrcRn - SrcLn + 2);
    SrcDimY = (SrcBd == 0) ? (SrcBn - SrcTn + 1) : (SrcBn - SrcTn + 2);

    DestDimX = pd->rDest.right - pd->rDest.left;
    DestDimY = pd->rDest.bottom - pd->rDest.top;
#ifdef CMDLIST

    VALIDATE_SLOT(cmd_ptr, 30);
    
    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, CSC_CONSTANTS, 
		FIELD_VALUE(0, CSC_CONSTANTS, Y, 0) |
		FIELD_VALUE(0, CSC_CONSTANTS, R, 0) |
		FIELD_VALUE(0, CSC_CONSTANTS, G, 0) |
		FIELD_VALUE(0, CSC_CONSTANTS, B, 0) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_Y_SOURCE_X, 
		FIELD_VALUE(0, CSC_Y_SOURCE_X, INTEGER, SrcLn + SrcLnAdd) |
		FIELD_VALUE(0, CSC_Y_SOURCE_X, FRACTION, SrcLd) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_Y_SOURCE_Y, 
		FIELD_VALUE(0, CSC_Y_SOURCE_Y, INTEGER, SrcTn) |
		FIELD_VALUE(0, CSC_Y_SOURCE_Y, FRACTION, SrcTd) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_SOURCE_DIMENSION, 
		FIELD_VALUE(0, CSC_SOURCE_DIMENSION, X, SrcDimX) |
		FIELD_VALUE(0, CSC_SOURCE_DIMENSION, Y, SrcDimY) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_SOURCE_PITCH, 
		FIELD_VALUE(0, CSC_SOURCE_PITCH, Y, SrcYPitch >> 4) |
		FIELD_VALUE(0, CSC_SOURCE_PITCH, UV, SrcUVPitch >> 4) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_DESTINATION, 
		FIELD_SET(0, CSC_DESTINATION, WRAP, DISABLE) |
		FIELD_VALUE(0, CSC_DESTINATION, X, pd->rDest.left) |
		FIELD_VALUE(0, CSC_DESTINATION, Y, pd->rDest.top) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_DESTINATION_DIMENSION, 
		FIELD_VALUE(0, CSC_DESTINATION_DIMENSION, X, DestDimX) |
		FIELD_VALUE(0, CSC_DESTINATION_DIMENSION, Y, DestDimY) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_DESTINATION_PITCH, 
		FIELD_VALUE(0, CSC_DESTINATION_PITCH, X, DestPitch >> 4) |
		FIELD_VALUE(0, CSC_DESTINATION_PITCH, Y, DestHeight) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_SCALE_FACTOR,
		FIELD_VALUE(0, CSC_SCALE_FACTOR, HORIZONTAL, (ScaleXn<<13 | ScaleXd)) |
		FIELD_VALUE(0, CSC_SCALE_FACTOR, VERTICAL, (ScaleYn<<13 | ScaleYd)) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_Y_SOURCE_BASE, 
		FIELD_SET(0, CSC_Y_SOURCE_BASE, EXT, LOCAL) |
		FIELD_VALUE(0, CSC_Y_SOURCE_BASE, ADDRESS, SrcYBase) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_U_SOURCE_BASE, 
		FIELD_SET(0, CSC_U_SOURCE_BASE, EXT, LOCAL) |
		FIELD_VALUE(0, CSC_U_SOURCE_BASE, ADDRESS, SrcUBase) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_V_SOURCE_BASE, 
		FIELD_SET(0, CSC_V_SOURCE_BASE, EXT, LOCAL) |
		FIELD_VALUE(0, CSC_V_SOURCE_BASE, ADDRESS, SrcVBase) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_DESTINATION_BASE, 
		FIELD_SET(0, CSC_DESTINATION_BASE, EXT, LOCAL) |
		FIELD_VALUE(0, CSC_DESTINATION_BASE, ADDRESS, DestBase) |
		0);

	INSERTCMD_LOADREG_D(cmd_ptr, CSC_CONTROL, 
		FIELD_SET(0, CSC_CONTROL, STATUS, START) |
		FIELD_VALUE(0, CSC_CONTROL, SOURCE_FORMAT, SrcFormat) |
		FIELD_VALUE(0, CSC_CONTROL, DESTINATION_FORMAT, DstFormat) |
		FIELD_VALUE(0, CSC_CONTROL, HORIZONTAL_FILTER, HFilter) |
		FIELD_VALUE(0, CSC_CONTROL, VERTICAL_FILTER, VFilter) |
		FIELD_VALUE(0, CSC_CONTROL, BYTE_ORDER, byOrder) |
		0);
	
    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("CSCStretchBlt\r\n");

#else //------- CMDLIST --------	

	WaitForNotBusy();

  	POKE_32(CSC_CONSTANTS, 
		FIELD_VALUE(0, CSC_CONSTANTS, Y, 0) |
		FIELD_VALUE(0, CSC_CONSTANTS, R, 0) |
		FIELD_VALUE(0, CSC_CONSTANTS, G, 0) |
		FIELD_VALUE(0, CSC_CONSTANTS, B, 0) |
		0);

	POKE_32(CSC_Y_SOURCE_X, 
		FIELD_VALUE(0, CSC_Y_SOURCE_X, INTEGER, SrcLn + SrcLnAdd) |
		FIELD_VALUE(0, CSC_Y_SOURCE_X, FRACTION, SrcLd) |
		0);

	POKE_32(CSC_Y_SOURCE_Y, 
		FIELD_VALUE(0, CSC_Y_SOURCE_Y, INTEGER, SrcTn) |
		FIELD_VALUE(0, CSC_Y_SOURCE_Y, FRACTION, SrcTd) |
		0);

	POKE_32(CSC_SOURCE_DIMENSION, 
		FIELD_VALUE(0, CSC_SOURCE_DIMENSION, X, SrcDimX) |
		FIELD_VALUE(0, CSC_SOURCE_DIMENSION, Y, SrcDimY) |
		0);

	POKE_32(CSC_SOURCE_PITCH, 
		FIELD_VALUE(0, CSC_SOURCE_PITCH, Y, SrcYPitch >> 4) |
		FIELD_VALUE(0, CSC_SOURCE_PITCH, UV, SrcUVPitch >> 4) |
		0);

	POKE_32(CSC_DESTINATION, 
		FIELD_SET(0, CSC_DESTINATION, WRAP, DISABLE) |
		FIELD_VALUE(0, CSC_DESTINATION, X, pd->rDest.left) |
		FIELD_VALUE(0, CSC_DESTINATION, Y, pd->rDest.top) |
		0);

	POKE_32(CSC_DESTINATION_DIMENSION, 
		FIELD_VALUE(0, CSC_DESTINATION_DIMENSION, X, DestDimX) |
		FIELD_VALUE(0, CSC_DESTINATION_DIMENSION, Y, DestDimY) |
		0);

	POKE_32(CSC_DESTINATION_PITCH, 
		FIELD_VALUE(0, CSC_DESTINATION_PITCH, X, DestPitch >> 4) |
		FIELD_VALUE(0, CSC_DESTINATION_PITCH, Y, DestHeight) |
		0);

	POKE_32(CSC_SCALE_FACTOR,
		FIELD_VALUE(0, CSC_SCALE_FACTOR, HORIZONTAL, (ScaleXn<<13 | ScaleXd)) |
		FIELD_VALUE(0, CSC_SCALE_FACTOR, VERTICAL, (ScaleYn<<13 | ScaleYd)) |
		0);

	POKE_32(CSC_Y_SOURCE_BASE, 
		FIELD_VALUE(0, CSC_Y_SOURCE_BASE, EXT, m_SMISettings.m_bUMA) |
		FIELD_VALUE(0, CSC_Y_SOURCE_BASE, ADDRESS, VgxSurfAddr(SrcYBase)) |
		0);

	POKE_32(CSC_U_SOURCE_BASE, 
		FIELD_VALUE(0, CSC_U_SOURCE_BASE, EXT, m_SMISettings.m_bUMA) |
		FIELD_VALUE(0, CSC_U_SOURCE_BASE, ADDRESS, VgxSurfAddr(SrcUBase)) |
		0);

	POKE_32(CSC_V_SOURCE_BASE, 
		FIELD_VALUE(0, CSC_V_SOURCE_BASE, EXT, m_SMISettings.m_bUMA) |
		FIELD_VALUE(0, CSC_V_SOURCE_BASE, ADDRESS, VgxSurfAddr(SrcVBase)) |
		0);

	POKE_32(CSC_DESTINATION_BASE, 
		FIELD_VALUE(0, CSC_DESTINATION_BASE, EXT, m_SMISettings.m_bUMA) |
		FIELD_VALUE(0, CSC_DESTINATION_BASE, ADDRESS, VgxSurfAddr(DestBase)) |
		0);

	POKE_32(CSC_CONTROL, 
		FIELD_SET(0, CSC_CONTROL, STATUS, START) |
		FIELD_VALUE(0, CSC_CONTROL, SOURCE_FORMAT, SrcFormat) |
		FIELD_VALUE(0, CSC_CONTROL, DESTINATION_FORMAT, DstFormat) |
		FIELD_VALUE(0, CSC_CONTROL, HORIZONTAL_FILTER, HFilter) |
		FIELD_VALUE(0, CSC_CONTROL, VERTICAL_FILTER, VFilter) |
		FIELD_VALUE(0, CSC_CONTROL, BYTE_ORDER, byOrder) |
		0);
#endif //CMDLIST	
	return S_OK;
}

// Set video vertical mode
void SMI::Video_SetVerticalMode(int mode)
{
    if (mode == INTERPOLATE)
    {
        POKE_32(VIDEO_DISPLAY_CTRL,
            FIELD_SET(PEEK_32(VIDEO_DISPLAY_CTRL), VIDEO_DISPLAY_CTRL, VERTICAL_MODE, INTERPOLATE));
    }
    else if (mode == REPLICATE)
    {
        POKE_32(VIDEO_DISPLAY_CTRL,
            FIELD_SET(PEEK_32(VIDEO_DISPLAY_CTRL), VIDEO_DISPLAY_CTRL, VERTICAL_MODE, REPLICATE));
    }
}

// Set video horizontal mode
void SMI::Video_SetHorizontalMode(int mode)
{
    if (mode == INTERPOLATE)
    {
        POKE_32(VIDEO_DISPLAY_CTRL,
            FIELD_SET(PEEK_32(VIDEO_DISPLAY_CTRL), VIDEO_DISPLAY_CTRL, HORIZONTAL_MODE, INTERPOLATE));
    }
    else if (mode == REPLICATE)
    {
        POKE_32(VIDEO_DISPLAY_CTRL,
            FIELD_SET(PEEK_32(VIDEO_DISPLAY_CTRL), VIDEO_DISPLAY_CTRL, HORIZONTAL_MODE, REPLICATE));
    }
}

#endif	// DD_ENABLE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -