📄 init301.c
字号:
} else { SiS_SetGroup1_LVDS(BaseAddr,ROMAddr,ModeNo,ModeIdIndex, HwDeviceExtension,RefreshRateTableIndex); }}voidSiS_SetGroup1_301(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex){ USHORT push1,push2; USHORT tempax,tempbx,tempcx,temp; USHORT resinfo,modeflag; USHORT CRT1Index; if(ModeNo<=0x13) { modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo; } else { modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */ resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO; CRT1Index = SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; CRT1Index = CRT1Index &0x3F; } if(!(SiS_VBInfo&SetInSlaveMode)) return; tempax=0xFFFF; if(!(SiS_VBInfo&SetCRT2ToTV)) { tempax=SiS_GetVGAHT2(); } if(modeflag&Charx8Dot) tempcx=0x08; else tempcx=0x09; if(tempax>=SiS_VGAHT) { tempax=SiS_VGAHT; } if(modeflag&HalfDCLK) { tempax=tempax>>1; } tempax=(tempax/tempcx)-5; tempbx=tempax; temp=0xFF; /* set MAX HT */ SiS_SetReg1(SiS_Part1Port,0x03,temp); tempax=SiS_VGAHDE; /* 0x04 Horizontal Display End */ if(modeflag&HalfDCLK) tempax=tempax>>1; tempax=(tempax/tempcx)-1; tempbx=tempbx|((tempax&0x00FF)<<8); temp=tempax&0x00FF; SiS_SetReg1(SiS_Part1Port,0x04,temp); temp=(tempbx&0xFF00)>>8; if(SiS_VBInfo&SetCRT2ToTV){ temp=temp+2; if(SiS_VBInfo&SetCRT2ToHiVisionTV) { if(resinfo==7) temp=temp-2; } } SiS_SetReg1(SiS_Part1Port,0x05,temp); /* 0x05 Horizontal Display Start */ SiS_SetReg1(SiS_Part1Port,0x06,0x03); /* 0x06 Horizontal Blank end */ /* 0x07 horizontal Retrace Start */ if(SiS_VBInfo&SetCRT2ToHiVisionTV) { temp=(tempbx&0x00FF)-1; if(!(modeflag&HalfDCLK)) { temp=temp-6; if(SiS_SetFlag&TVSimuMode) { temp=temp-4; if(ModeNo>0x13) temp=temp-10; } } } else { tempcx=tempbx&0x00FF; tempbx=(tempbx&0xFF00)>>8; tempcx=(tempcx+tempbx)>>1; temp=(tempcx&0x00FF)+2; if(SiS_VBInfo&SetCRT2ToTV){ temp=temp-1; if(!(modeflag&HalfDCLK)){ if((modeflag&Charx8Dot)){ temp=temp+4; if(SiS_VGAHDE>=800){ temp=temp-6; } } } } else { if(!(modeflag&HalfDCLK)){ temp=temp-4; if(SiS_LCDResInfo!=Panel1280x960) { if(SiS_VGAHDE>=800){ temp=temp-7; if(SiS_ModeType==ModeEGA){ if(SiS_VGAVDE==1024){ temp=temp+15; if(SiS_LCDResInfo!=Panel1280x1024){ temp=temp+7; } } } if(SiS_VGAHDE>=1280){ if(SiS_LCDResInfo!=Panel1280x960) { if(SiS_LCDInfo&LCDNonExpanding) { temp=temp+28; } } } } } } } } SiS_SetReg1(SiS_Part1Port,0x07,temp); /* 0x07 Horizontal Retrace Start */ SiS_SetReg1(SiS_Part1Port,0x08,0); /* 0x08 Horizontal Retrace End */ if(SiS_VBInfo&SetCRT2ToTV) { if(SiS_SetFlag&TVSimuMode) { if((ModeNo==0x06)||(ModeNo==0x10)||(ModeNo==0x11)||(ModeNo==0x13)||(ModeNo==0x0F)){ SiS_SetReg1(SiS_Part1Port,0x07,0x5b); SiS_SetReg1(SiS_Part1Port,0x08,0x03); } if((ModeNo==0x00)||(ModeNo==0x01)) { if(SiS_VBInfo&SetNTSCTV) { SiS_SetReg1(SiS_Part1Port,0x07,0x2A); SiS_SetReg1(SiS_Part1Port,0x08,0x61); } else { SiS_SetReg1(SiS_Part1Port,0x07,0x2A); SiS_SetReg1(SiS_Part1Port,0x08,0x41); SiS_SetReg1(SiS_Part1Port,0x0C,0xF0); } } if((ModeNo==0x02)||(ModeNo==0x03)||(ModeNo==0x07)){ if(SiS_VBInfo&SetNTSCTV) { SiS_SetReg1(SiS_Part1Port,0x07,0x54); SiS_SetReg1(SiS_Part1Port,0x08,0x00); } else { SiS_SetReg1(SiS_Part1Port,0x07,0x55); SiS_SetReg1(SiS_Part1Port,0x08,0x00); SiS_SetReg1(SiS_Part1Port,0x0C,0xF0); } } if((ModeNo==0x04)||(ModeNo==0x05)||(ModeNo==0x0D)||(ModeNo==0x50)){ if(SiS_VBInfo&SetNTSCTV) { SiS_SetReg1(SiS_Part1Port,0x07,0x30); SiS_SetReg1(SiS_Part1Port,0x08,0x03); } else { SiS_SetReg1(SiS_Part1Port,0x07,0x2f); SiS_SetReg1(SiS_Part1Port,0x08,0x02); } } } } SiS_SetReg1(SiS_Part1Port,0x18,0x03); /* 0x18 SR08 */ SiS_SetRegANDOR(SiS_Part1Port,0x19,0xF0,0x00); SiS_SetReg1(SiS_Part1Port,0x09,0xFF); /* 0x09 Set Max VT */ tempbx=SiS_VGAVT; push1=tempbx; tempcx=0x121; tempbx=SiS_VGAVDE; /* 0x0E Virtical Display End */ if(tempbx==357) tempbx=350; if(tempbx==360) tempbx=350; if(tempbx==375) tempbx=350; if(tempbx==405) tempbx=400; if(tempbx==420) tempbx=400; if(tempbx==525) tempbx=480; push2=tempbx; if(SiS_VBInfo&SetCRT2ToLCD) { if(SiS_LCDResInfo==Panel1024x768) { if(!(SiS_SetFlag&LCDVESATiming)) { if(tempbx==350) tempbx=tempbx+5; if(tempbx==480) tempbx=tempbx+5; } } } tempbx--; temp=tempbx&0x00FF; tempbx--; temp=tempbx&0x00FF; SiS_SetReg1(SiS_Part1Port,0x10,temp); /* 0x10 vertical Blank Start */ tempbx=push2; tempbx--; temp=tempbx&0x00FF; SiS_SetReg1(SiS_Part1Port,0x0E,temp); if(tempbx&0x0100){ tempcx=tempcx|0x0002; } tempax=0x000B; if(modeflag&DoubleScanMode){ tempax=tempax|0x08000; } if(tempbx&0x0200){ tempcx=tempcx|0x0040; } temp=(tempax&0xFF00)>>8; SiS_SetReg1(SiS_Part1Port,0x0B,temp); if(tempbx&0x0400){ tempcx=tempcx|0x0600; } SiS_SetReg1(SiS_Part1Port,0x11,0x00); /* 0x11 Vertival Blank End */ tempax=push1; tempax=tempax-tempbx; /* 0x0C Vertical Retrace Start */ tempax=tempax>>2; push1=tempax; if(resinfo!=0x09) { tempax=tempax<<1; tempbx=tempax+tempbx; } if(SiS_VBInfo&SetCRT2ToHiVisionTV) { tempbx=tempbx-10; } else { if(SiS_SetFlag&TVSimuMode) { if(SiS_VBInfo&SetPALTV) { tempbx=tempbx+40; } } } tempax=push1; tempax=tempax>>2; tempax++; tempax=tempax+tempbx; push1=tempax; if((SiS_VBInfo&SetPALTV)) { if(tempbx<=513) { if(tempax>=513) { tempbx=513; } } } temp=(tempbx&0x00FF); SiS_SetReg1(SiS_Part1Port,0x0C,temp); tempbx--; temp=tempbx&0x00FF; SiS_SetReg1(SiS_Part1Port,0x10,temp); if(tempbx&0x0100){ tempcx=tempcx|0x0008; } if(tempbx&0x0200){ SiS_SetRegANDOR(SiS_Part1Port,0x0B,0x0FF,0x20); } tempbx++; if(tempbx&0x0100){ tempcx=tempcx|0x0004; } if(tempbx&0x0200){ tempcx=tempcx|0x0080; } if(tempbx&0x0400){ tempcx=tempcx|0x0C00; } tempbx=push1; temp=tempbx&0x00FF; temp=temp&0x0F; SiS_SetReg1(SiS_Part1Port,0x0D,temp); /* 0x0D vertical Retrace End */ if(tempbx&0x0010) { tempcx=tempcx|0x2000; } temp=tempcx&0x00FF; SiS_SetReg1(SiS_Part1Port,0x0A,temp); /* 0x0A CR07 */ temp=(tempcx&0x0FF00)>>8; SiS_SetReg1(SiS_Part1Port,0x17,temp); /* 0x17 SR0A */ tempax=modeflag; temp=(tempax&0xFF00)>>8; temp=(temp>>1)&0x09; SiS_SetReg1(SiS_Part1Port,0x16,temp); /* 0x16 SR01 */ SiS_SetReg1(SiS_Part1Port,0x0F,0); /* 0x0F CR14 */ SiS_SetReg1(SiS_Part1Port,0x12,0); /* 0x12 CR17 */ if(SiS_LCDInfo&LCDRGB18Bit) temp=0x80; else temp=0x00; SiS_SetReg1(SiS_Part1Port,0x1A,temp); /* 0x1A SR0E */ return;}/* TW: This seems to be for some of 301B/302B/301LV/302LV as well * which confuses me. In init.c, there is code for these bridges * which is executed ONLY if IF_DEF_LVDS is 0. The following * is being called only if IF_DEF_LVDS is NOT 0, and it contains * code for 301B et al as well. Is IF_DEF_LVDS now 0 or 1 on * 301B/302B/301LV/302LV? */void SiS_SetGroup1_LVDS(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo, USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT RefreshRateTableIndex){ USHORT modeflag,resinfo; USHORT push1,push2,tempax,tempbx,tempcx,temp,pushcx; ULONG tempeax=0,tempebx,tempecx,tempvcfact=0; if(ModeNo<=0x13) { modeflag = SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ resinfo = SiS_SModeIDTable[ModeIdIndex].St_ResInfo; } else { modeflag = SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */ resinfo = SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO; } tempax=SiS_LCDHDES; tempbx=SiS_HDE; tempcx=SiS_HT; tempcx=tempcx-tempbx; /* HT-HDE */ if(SiS_LCDInfo&LCDNonExpanding) { if(SiS_LCDResInfo==Panel640x480) tempbx=640; if(SiS_LCDResInfo==Panel800x600) tempbx=800; if(SiS_LCDResInfo==Panel1024x768) tempbx=1024; } push1=tempax; tempax=tempax+tempbx; /* lcdhdee */ tempbx=SiS_HT; if(tempax>=tempbx){ tempax=tempax-tempbx; } push2=tempax; /* push ax lcdhdee */ tempcx=tempcx>>2; /* temp */ tempcx=tempcx+tempax; /* lcdhrs */ if(tempcx>=tempbx){ tempcx=tempcx-tempbx; } /* v ah,cl */ tempax=tempcx; tempax=tempax>>3; /* BPLHRS */ temp=tempax&0x00FF; if(SiS_LCDResInfo==Panel640x480){ /*adjust for panel 640x480*/ temp=temp-4; } SiS_SetReg1(SiS_Part1Port,0x14,temp); /* <------------------ */ /* Part1_14h */ temp=(tempax&0x00FF)+10; temp=temp&0x01F; temp=temp|(((tempcx&0x00ff)&0x07)<<5); /*fstn*/ if(SiS_IF_DEF_FSTN){ temp=0x20; } SiS_SetReg1(SiS_Part1Port,0x15,temp); /* <------------------- */ /* Part1_15h */ tempbx=push2; /* lcdhdee */ tempcx=push1; /* lcdhdes */ temp=(tempcx&0x00FF); temp=temp&0x07; /* BPLHDESKEW */ SiS_SetReg1(SiS_Part1Port,0x1A,temp); /* <------------------- */ /* Part1_1Ah */ tempcx=tempcx>>3; /* BPLHDES */ temp=(tempcx&0x00FF); if(ModeNo==0x5b){ /*fix fstn mode=5b*/ temp--; } SiS_SetReg1(SiS_Part1Port,0x16,temp); /* <------------------- */ /* Part1_16h */ if(tempbx&0x07) tempbx=tempbx+8; tempbx=tempbx>>3; /* BPLHDEE */ temp=tempbx&0x00FF; if(ModeNo==0x5b){ /*fix fstn mode=5b*/ temp--; } SiS_SetReg1(SiS_Part1Port,0x17,temp); /* <------------------- */ /* Part1_17h */ tempcx=SiS_VGAVT; tempbx=SiS_VGAVDE; tempcx=tempcx-tempbx; /* GAVT-VGAVDE */ tempbx=SiS_LCDVDES; /* VGAVDES */ push1=tempbx; /* push bx temppush1 */ if(SiS_IF_DEF_TRUMPION==0){ if(SiS_IF_DEF_CH7005==1) { if(SiS_VBInfo&SetCRT2ToTV) { tempax=SiS_VGAVDE; } } if(SiS_VBInfo&SetCRT2ToLCD) { if(SiS_LCDResInfo==Panel640x480) tempax=480; if(SiS_LCDResInfo==Panel800x600) tempax=600; if(SiS_LCDResInfo==Panel1024x768) tempax=768; if(SiS_LCDResInfo==Panel320x480) tempax=480; } } else tempax=SiS_VGAVDE; tempbx=tempbx+tempax; tempax=SiS_VT; /* VT */ if(tempbx>=SiS_VT){ tempbx=tempbx-tempax; } push2=tempbx; /* push bx temppush2 */ tempcx=tempcx>>1; tempbx=tempbx+tempcx; tempbx++; /* BPLVRS */ if(tempbx>=tempax){ tempbx=tempbx-tempax; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -