📄 ave2koverlay.c
字号:
/*{//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 + -