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

📄 ave2koverlay.c

📁 driver wdk
💻 C
📖 第 1 页 / 共 3 页
字号:
	/*{//wait for blank
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP|0x0800;
	pDE->RPS[1].RPSBuffer[rpsIndex]=pDE->RPS[1].PhysicalAddress+(rpsIndex+4)*sizeof(ULONG);
	rpsIndex++;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x0800;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP;
	pDE->RPS[1].RPSBuffer[rpsIndex]=pDE->RPS[1].PhysicalAddress+(rpsIndex+2)*sizeof(ULONG);
	rpsIndex++;
	//EVEN:
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x1000;
	//COMM:
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x0800;
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x1000;
	}*/
		if(pDE->OverlayWindow.OpenClose){
			pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x0800;
			pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x1000;
		}
		else{
			pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x2000;
			pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x4000;
		}
	}
	{//stop DMA1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(MC1/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++] =	(TR_E_1<<16);
	}
	for(i=0; i<Pause; i++){
	/*{//wait for blank
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP|0x0800;
	pDE->RPS[1].RPSBuffer[rpsIndex]=pDE->RPS[1].PhysicalAddress+(rpsIndex+4)*sizeof(ULONG);
	rpsIndex++;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x0800;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP;
	pDE->RPS[1].RPSBuffer[rpsIndex]=pDE->RPS[1].PhysicalAddress+(rpsIndex+2)*sizeof(ULONG);
	rpsIndex++;
	//EVEN:
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x1000;
	//COMM:
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x0800;
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x1000;
	}*/
		if(pDE->OverlayWindow.OpenClose){
			pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x0800;
			pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x1000;
		}
		else{
			pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x2000;
			pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x4000;
		}
	}
	{//jump to start
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=pDE->RPS[1].PhysicalAddress;
	}
	ASSERT(RPSBUFFERSIZE >= rpsIndex);
	Ave2kWriteRegister(pDE, MC1, 0x20002000); //Enable EPS1
	{
		ULONG t;
		t=Ave2kReadRegister(pDE, RPS_ADDR1);
		t=Ave2kReadRegister(pDE, RPS_ADDR1);
		t=Ave2kReadRegister(pDE, RPS_ADDR1);
		t=Ave2kReadRegister(pDE, RPS_ADDR1);
		t=Ave2kReadRegister(pDE, RPS_ADDR1);
	}
}

void SetDual(PDEVICE_EXTENSION pDE)
{
	int rpsIndex,i,rpsJumpStart;
	ULONG dFrame, dFrame2, nol, nol2;
	ULONG VScale, VGain, HPreScale, HScale;
	ULONG VScale2, VGain2, HPreScale2, HScale2;
	ULONG pitch = pDE->DisplayParameter.Pitch;
	ULONG nOff;
	ULONG nX=pDE->OverlayWindow.Left;
	ULONG nY=pDE->OverlayWindow.Top;
	ULONG nPciClocks=12*720*33/27;
	ULONG bDiffWindow=1;
	ULONG ClipDmaPhyAddr;
	nOff=((pDE->OverlayWindow.Right-nX))*pDE->DisplayParameter.Depth;
	dFrame=pDE->DisplayParameter.PhysicalAddress + 
	     nY*pitch + nX*pDE->DisplayParameter.Depth;
	nX=pDE->OverlayWindow.Left2;
	nY=pDE->OverlayWindow.Top2;
	dFrame2=pDE->DisplayParameter.PhysicalAddress + 
	     nY*pitch + nX*pDE->DisplayParameter.Depth;
	nol = pDE->OverlayWindow.Bottom - pDE->OverlayWindow.Top;
	nol2= pDE->OverlayWindow.Bottom2 - pDE->OverlayWindow.Top2;
	if(nol>200)
		pDE->OverlayWindow.Bottom +=4;
	else
		pDE->OverlayWindow.Bottom +=1;
	if(nol2>200)
		pDE->OverlayWindow.Bottom2 +=4;
	else
		pDE->OverlayWindow.Bottom2 +=1;
	if(nol==nol2)
		bDiffWindow=0;
	//nol = pDE->OverlayWindow.Bottom - pDE->OverlayWindow.Top - 2;
	//nol2 = pDE->OverlayWindow.Bottom2 - pDE->OverlayWindow.Top2 - 2;
	GetHScaleParas(pDE->NIP, pDE->OverlayWindow.Right - pDE->OverlayWindow.Left, HXO, &HPreScale, &HScale);
	GetVScaleParas(pDE->NIL, pDE->OverlayWindow.Bottom - pDE->OverlayWindow.Top, HYO, &VScale, &VGain);
	GetHScaleParas(pDE->NIP, pDE->OverlayWindow.Right2 - pDE->OverlayWindow.Left2, HXO, &HPreScale2, &HScale2);
	GetVScaleParas(pDE->NIL2, pDE->OverlayWindow.Bottom2 - pDE->OverlayWindow.Top2, HYO, &VScale2, &VGain2);

	Ave2kWriteRegister(pDE, MC1, 0x20000000); //Disable EPS1
	Ave2kWriteRegister(pDE, PITCH1, pitch);
	if(pDE->DisplayParameter.BitCount==0x8000000f)
		Ave2kWriteRegister(pDE, BASE_PAGE1, 0x00000009);
	else
		Ave2kWriteRegister(pDE, BASE_PAGE1, 0x00000008);
	Ave2kWriteRegister(pDE, NUM_LINE_BYTE1, (pDE->NIL << 16) + pDE->NIP);
	Ave2kWriteRegister(pDE, HPS_V_SCALE, VScale);
	Ave2kWriteRegister(pDE, HPS_V_GAIN, VGain);
	Ave2kWriteRegister(pDE, HPS_H_PRESCALE, HPreScale);
	Ave2kWriteRegister(pDE, HPS_H_SCALE, HScale);
	Ave2kWriteRegister(pDE, HPS_CTRL, HYO << 12);
	UploadVideo(pDE);
	if(pDE->VideoType[0] == VIDEOTYPE_NTSC)
		Ave2kWriteRegister(pDE, 0xd0, 262);//set SLCT1=312
	else
		Ave2kWriteRegister(pDE, 0xd0, 312);//set SLCT1=312

	pDE->RPS[1].PhysicalAddress=MmGetPhysicalAddress(&pDE->RPS[1].RPSBuffer[0]).u.LowPart;
	Ave2kWriteRegister(pDE, RPS_ADDR1, pDE->RPS[1].PhysicalAddress);
	//Fill the RPS sequence
	rpsIndex=0;
	{//wait for blank
		pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_CLR_EVENT|RE_HPS_EAW;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|RE_HPS_EAW;
	}
	//wait for HS
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x8000;
	rpsJumpStart=rpsIndex;
	for(i=0; i<1; i++){
	{//set to channel 1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(HPS_CTRL/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=(HYO << 12);
	}
	if(bDiffWindow){
		pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(4<<8)|(HPS_V_SCALE/4);
		pDE->RPS[1].RPSBuffer[rpsIndex++]=VScale;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=VGain;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=HPreScale;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=HScale;
	}
	{//set to left area
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(3<<8)|(BASE_ODD1/4);
    pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame;
    pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame + pitch * nol;
#if 1
	ClipDmaPhyAddr=MmGetPhysicalAddress(&pDE->Clips[0].ClipDmaBuffer[0]).u.LowPart;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(3<<8)|(BASE_ODD2/4);
    pDE->RPS[1].RPSBuffer[rpsIndex++]=ClipDmaPhyAddr;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=ClipDmaPhyAddr;
    pDE->RPS[1].RPSBuffer[rpsIndex++]=ClipDmaPhyAddr + 64*sizeof(ULONG);
#endif
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_UPLOAD|0x2c;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_UPLOAD|0x40;
	}
	{//wait for blank
		pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_CLR_EVENT|RE_HPS_EAW;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|RE_HPS_EAW;
	}
	{//start DMA1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(MC1/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++] =	(TR_E_1<<16)|TR_E_1;
	}
	//wait for HS
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x8000;
	{//set to channel 2
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(HPS_CTRL/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=(1<<30)|(1<<28)|(HYO << 12);
	}
	if(bDiffWindow){
		pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(4<<8)|(HPS_V_SCALE/4);
		pDE->RPS[1].RPSBuffer[rpsIndex++]=VScale2;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=VGain2;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=HPreScale2;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=HScale2;
	}
	{//set to right area
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(3<<8)|(BASE_ODD1/4);
    pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame2;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame2;
    pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame2 + pitch * nol2;
#if 1
	ClipDmaPhyAddr=MmGetPhysicalAddress(&pDE->Clips[1].ClipDmaBuffer[0]).u.LowPart;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(3<<8)|(BASE_ODD2/4);
    pDE->RPS[1].RPSBuffer[rpsIndex++]=ClipDmaPhyAddr;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=ClipDmaPhyAddr;
    pDE->RPS[1].RPSBuffer[rpsIndex++]=ClipDmaPhyAddr + 64*sizeof(ULONG);
#endif
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_UPLOAD|0x2c;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_UPLOAD|0x40;
	}
	{//wait for blank 2
		pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_CLR_EVENT|RE_HPS_EAW;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|RE_HPS_EAW;
	}
	{//start DMA1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(MC1/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++] =	(TR_E_1<<16)|TR_E_1;
	}
	//wait for HS
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x8000;
	}	
	{//jump to start
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=pDE->RPS[1].PhysicalAddress+rpsJumpStart*sizeof(ULONG);
	}
	ASSERT(RPSBUFFERSIZE >= rpsIndex);
	Ave2kWriteRegister(pDE, MC1, 0x20002000); //Enable EPS1
	if(nol>200)
		pDE->OverlayWindow.Bottom -=4;
	else
		pDE->OverlayWindow.Bottom -=1;
	if(nol2>200)
		pDE->OverlayWindow.Bottom2 -=4;
	else
		pDE->OverlayWindow.Bottom2 -=1;
}
#if 0
void SetFullDual(PDEVICE_EXTENSION pDE)
{
	int rpsIndex;
	ULONG dFrame, dFrame2, nol, nol2;
	ULONG VScale, VGain, HPreScale, HScale;
	ULONG VScale2, VGain2, HPreScale2, HScale2;
	ULONG pitch = pDE->DisplayParameter.Pitch;
	ULONG nX=pDE->OverlayWindow.Left;
	ULONG nY=pDE->OverlayWindow.Top;
	ULONG nPciClocks;
	ULONG bDiffWindow=1;
	dFrame=pDE->DisplayParameter.PhysicalAddress + 
	     nY*pitch + nX*pDE->DisplayParameter.Depth;
	nX=pDE->OverlayWindow.Left2;
	nY=pDE->OverlayWindow.Top2;
	dFrame2=pDE->DisplayParameter.PhysicalAddress + 
	     nY*pitch + nX*pDE->DisplayParameter.Depth;
	nol = pDE->OverlayWindow.Bottom - pDE->OverlayWindow.Top;
	nol2= pDE->OverlayWindow.Bottom2 - pDE->OverlayWindow.Top2;
	if(nol==nol2)
		bDiffWindow=0;
	//else
	//	KdPrint(("Diff Window\n"));
	GetHScaleParas(pDE->NIP, pDE->OverlayWindow.Right - pDE->OverlayWindow.Left, HXO, &HPreScale, &HScale);
	GetVScaleParas(pDE->NIL, pDE->OverlayWindow.Bottom - pDE->OverlayWindow.Top, HYO, &VScale, &VGain);
	GetHScaleParas(pDE->NIP, pDE->OverlayWindow.Right2 - pDE->OverlayWindow.Left2, HXO, &HPreScale2, &HScale2);
	GetVScaleParas(pDE->NIL2, pDE->OverlayWindow.Bottom2 - pDE->OverlayWindow.Top2, HYO, &VScale2, &VGain2);
	Ave2kWriteRegister(pDE, MC1, 0x20000000); //Disable EPS1
	Ave2kWriteRegister(pDE, PITCH1, pitch);
	Ave2kWriteRegister(pDE, BASE_PAGE1, 0x00000008);
	Ave2kWriteRegister(pDE, NUM_LINE_BYTE1, (pDE->NIL << 16) + pDE->NIP);
	Ave2kWriteRegister(pDE, HPS_V_SCALE, VScale);
	Ave2kWriteRegister(pDE, HPS_V_GAIN, VGain);
	Ave2kWriteRegister(pDE, HPS_H_PRESCALE, HPreScale);
	Ave2kWriteRegister(pDE, HPS_H_SCALE, HScale);
	UploadVideo(pDE);
	Ave2kWriteRegister(pDE, 0xd0, 312);//set SLCT1=312

	pDE->RPS[1].PhysicalAddress=MmGetPhysicalAddress(&pDE->RPS[1].RPSBuffer[0]).u.LowPart;
	Ave2kWriteRegister(pDE, RPS_ADDR1, pDE->RPS[1].PhysicalAddress);
	//Fill the RPS sequence
	rpsIndex=0;
	nPciClocks=12*720*33/27;
	{//set to channel 1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(HPS_CTRL/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=(HYO << 12);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_UPLOAD|0x20;
	}
	{//set to left area
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(3<<8)|(BASE_ODD1/4);
    pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame;
    pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame + pitch * (nol-3);
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=pitch;
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=0x00000008;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(NUM_LINE_BYTE1/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=(pDE->NIL << 16) + pDE->NIP;
	//if(bDiffWindow){
		pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(4<<8)|(HPS_V_SCALE/4);
		pDE->RPS[1].RPSBuffer[rpsIndex++]=VScale;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=VGain;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=HPreScale;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=HScale;
	//}
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_UPLOAD|0x64;
	}
	{
	//set time out
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(RPS_TOV1/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=(1<<30)|nPciClocks;//3 lines
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(RPS_TOV1/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=0;//(2<<30)|(1<<29)|(1<<24);//wait for portA Vsync
	}
	{//start DMA1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(MC1/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++] =	(TR_E_1<<16)|TR_E_1;
	}
	//if (E1) goto EVEN_1_1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP|0x0800;
	pDE->RPS[1].RPSBuffer[rpsIndex]=pDE->RPS[1].PhysicalAddress+(rpsIndex+4)*sizeof(ULONG);
	rpsIndex++;
	//wait for E1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x800;

	//goto COMMON
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP;
	pDE->RPS[1].RPSBuffer[rpsIndex]=pDE->RPS[1].PhysicalAddress+(rpsIndex+2)*sizeof(ULONG);
	rpsIndex++;

	//EVEN_1_1:
	//wait for O1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x1000;

	//COMMON:
	//wait for HS
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x8000;
	
	{//set to channel 2
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(HPS_CTRL/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=(1<<30)|(1<<28)|(HYO << 12);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_UPLOAD|0x20;
	}
	{//set to right area
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(3<<8)|(BASE_ODD1/4);
    pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame2;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame2;
    pDE->RPS[1].RPSBuffer[rpsIndex++]=dFrame2 + pitch * (nol2-3);
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=pitch;
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=0x00000008;
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(NUM_LINE_BYTE1/4);
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=(pDE->NIL2 << 16) + pDE->NIP;
	//KdPrint(("Read reg=%x\n", Ave2kReadRegister(pDE, NUM_LINE_BYTE1)));
	if(bDiffWindow){
		pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(4<<8)|(HPS_V_SCALE/4);
		pDE->RPS[1].RPSBuffer[rpsIndex++]=VScale2;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=VGain2;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=HPreScale2;
		pDE->RPS[1].RPSBuffer[rpsIndex++]=HScale2;
	}
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_UPLOAD|0x64;
	}
	{
	//set time out
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(RPS_TOV1/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=(1<<30)|nPciClocks;//3 lines
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(RPS_TOV1/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++]=0;//(2<<30)|(0<<29)|(1<<24);//wait for portB Vsync
	}
	{//start DMA1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(MC1/4);
	pDE->RPS[1].RPSBuffer[rpsIndex++] =	(TR_E_1<<16)|TR_E_1;
	}
	//if (E2) goto EVEN_2_1
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP|0x2000;
	pDE->RPS[1].RPSBuffer[rpsIndex]=pDE->RPS[1].PhysicalAddress+(rpsIndex+4)*sizeof(ULONG);
	rpsIndex++;
	//wait for E2
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x2000;
	
	//goto COMMON
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP;
	pDE->RPS[1].RPSBuffer[rpsIndex]=pDE->RPS[1].PhysicalAddress+(rpsIndex+2)*sizeof(ULONG);
	rpsIndex++;

	//EVEN_2_1:
	//wait for O2
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x4000;
	//COMMON:
	//wait for HS
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_PAUSE|0x8000;
	{//jump to start
	pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_JUMP;
	pDE->RPS[1].RPSBuffer[rpsIndex++]=pDE->RPS[1].PhysicalAddress;
	}
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_STOP;
	{//close video
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=CMD_WR_REG|(1<<8)|(MC1/4);
	//pDE->RPS[1].RPSBuffer[rpsIndex++]=0x00400000;
	}
	ASSERT(RPSBUFFERSIZE >= rpsIndex);
	Ave2kWriteRegister(pDE, MC1, 0x20002000); //Enable EPS1
}
#endif

static ULONG Dcgx(ULONG x)
{
	ULONG dcgx = HpsH[x] & 0xffff;
	
	if (x>31) 		dcgx=dcgx/8;
	else if (x>15) 	dcgx=dcgx/4;
	else if (x>7) 	dcgx=dcgx/2;

	if (dcgx==16)		dcgx=7;
	else if (dcgx==8) 	dcgx=3;
	else 				dcgx=dcgx/2;

	return dcgx;
}	

static void UploadVideo(PDEVICE_EXTENSION pDE)
{
	// upload all video regs
	Ave2kWriteRegister(pDE, MC2, 0x002c002c);//0x06f406f4);
	Ave2kWriteRegister(pDE, MC2, 0x06400640);//0x06f406f4);
}

static void Setup_HScale(PDEVICE_EXTENSION pDE, int nip, int nop, ULONG hxo)
{
	ULONG HPreScale, HScale;
	GetHScaleParas(nip, nop, hxo, &HPreScale, &HScale);
	Ave2kWriteRegister(pDE, HPS_H_PRESCALE, HPreScale);
	Ave2kWriteRegister(pDE, HPS_H_SCALE, HScale);
}	
static void GetHScaleParas(int nip, int nop, ULONG hxo, ULONG *HPreScale, ULONG *HScale)
{
	ULONG xpsc=64;
	ULONG xsci=4095; 

⌨️ 快捷键说明

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