patch-2.4.15 linux/drivers/video/sis/sis_301.c
Next file: linux/drivers/video/sis/sis_301.h
Previous file: linux/drivers/video/sis/sis_300.h
Back to the patch index
Back to the overall index
- Lines: 2869
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.4.14/linux/drivers/video/sis/sis_301.c
- Orig date:
Sun Nov 12 20:40:42 2000
diff -u --recursive --new-file v2.4.14/linux/drivers/video/sis/sis_301.c linux/drivers/video/sis/sis_301.c
@@ -1,2868 +0,0 @@
-/* Recently Update by v1.09.50 */
-
-#include <linux/config.h>
-#include "sis_301.h"
-
-#ifndef CONFIG_FB_SIS_LINUXBIOS
-
-BOOLEAN SetCRT2Group(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo,
- PHW_DEVICE_EXTENSION HwDeviceExtension)
-{
- USHORT temp;
-
- SetFlag=SetFlag|ProgrammingCRT2;
- SearchModeID(ROMAddr,ModeNo);
-
- temp=GetRatePtrCRT2(ROMAddr,ModeNo);
- if(((temp&0x02)==0) && ((VBInfo&CRT2DisplayFlag)==0))
- return(FALSE);
- SaveCRT2Info(ModeNo);
- DisableBridge(BaseAddr);
- UnLockCRT2(BaseAddr);
- SetDefCRT2ExtRegs(BaseAddr);
- SetCRT2ModeRegs(BaseAddr,ModeNo);
- if(VBInfo&CRT2DisplayFlag){
- LockCRT2(BaseAddr);
- return 0;
- }
- GetCRT2Data(ROMAddr,ModeNo);
- if(IF_DEF_LVDS==1){ //LVDS
- GetLVDSDesData(ROMAddr,ModeNo);
- }
- SetGroup1(BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
- if(IF_DEF_LVDS==0){
- SetGroup2(BaseAddr,ROMAddr);
- SetGroup3(BaseAddr);
- SetGroup4(BaseAddr,ROMAddr,ModeNo);
- SetGroup5(BaseAddr,ROMAddr);
- }else{ //LVDS
- if(IF_DEF_TRUMPION==0){
- ModCRT1CRTC(ROMAddr,ModeNo);
- }
- SetCRT2ECLK(ROMAddr,ModeNo);
- }
-
- EnableCRT2();
- EnableBridge(BaseAddr);
- SetLockRegs();
- LockCRT2(BaseAddr);
-
- return 1;
-}
-
-VOID overwriteregs(ULONG ROMAddr,USHORT BaseAddr)
-{
- int i;
- USHORT Part1Port; //reg data is for 1024x768 16bit 85hz
- int p1reg[0x29]={0x84,0x76,0x4B,0x21,0x00,0x00,0x00,0x00,0x1F,0x51,
- 0x0C,0x10,0x44,0x90,0x1E,0xFF,0x00,0x34,0x13,0x10,
- 0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x97,0x16,
- 0xA3};
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
- for(i=0;i<29;i++){
- SetReg1(Part1Port,(USHORT)i,(USHORT)p1reg[i]);
- }
-}
-
-VOID SetDefCRT2ExtRegs(USHORT BaseAddr)
-{
- USHORT Part1Port,Part2Port,Part4Port;
- USHORT temp;
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
- Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10;
- Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14;
- SetReg1(Part1Port,0x02,0x40);
- SetReg1(Part4Port,0x10,0x80);
- temp=(UCHAR)GetReg1(P3c4,0x16);
- temp=temp&0xC3;
- SetReg1(P3d4,0x35,temp);
-}
-
-USHORT GetRatePtrCRT2(ULONG ROMAddr, USHORT ModeNo)
-{ //return bit0=>0:standard mode 1:extended mode
- SHORT index; // bit1=>0:crt2 no support this mode
- USHORT temp; // 1:crt2 support this mode
- USHORT ulRefIndexLength;
- USHORT temp1;
- SHORT LCDRefreshIndex[4]={0x0,0x0,0x03,0x01};
- // LCDPanel:no lcd,800x600,1024x768,1280x1024
- if(ModeNo<0x14) return(0); // Mode No <= 13h then return
-
- index=GetReg1(P3d4,0x33); // Get 3d4 CRTC33
- index=index>>SelectCRT2Rate; //For CRT2,cl=SelectCRT2Rate=4, shr ah,cl
- index=index&0x0F; // Frame rate index
- if(index!=0) index--;
-
- if(IF_DEF_TRUMPION==1){
- if(VBInfo&SetSimuScanMode){
- index=0;
- }
- }
- if(SetFlag&ProgrammingCRT2){
- if(VBInfo&SetCRT2ToLCD){
- if(IF_DEF_LVDS==0){
- temp=LCDResInfo;
- temp1=LCDRefreshIndex[temp];
- if(index>temp1){
- index=temp1;
- }
- }else{
- index=0;
- }
- }
- }
-
- REFIndex=*((USHORT *)(ROMAddr+ModeIDOffset+0x04)); // si+Ext_point
-
- ulRefIndexLength =Ext2StructSize;
- do {
- temp=*((USHORT *)(ROMAddr+REFIndex)); // di => REFIndex
- if(temp==0xFFFF) break;
- temp=temp&ModeInfoFlag;
- if(temp<ModeType) break;
-
- REFIndex=REFIndex+ulRefIndexLength; // rate size
- index--;
- if(index<0){
- if(!(VBInfo&SetCRT2ToRAMDAC)){
- if(VBInfo&SetInSlaveMode){
- temp1=*((USHORT *)(ROMAddr+REFIndex+0-Ext2StructSize));
- if(temp1&InterlaceMode){
- index=0;
- }
- }
- }
- }
- } while(index>=0);
-
- REFIndex=REFIndex-ulRefIndexLength; // rate size
-
- if((SetFlag&ProgrammingCRT2)){
- temp1=AjustCRT2Rate(ROMAddr);
- }else{
- temp1=0;
- }
-
- return(0x01|(temp1<<1));
-}
-
-BOOLEAN AjustCRT2Rate(ULONG ROMAddr)
-{
- USHORT tempbx=0,tempax,temp;
- USHORT tempextinfoflag;
- tempax=0;
-
- if(IF_DEF_LVDS==0){
- if(VBInfo&SetCRT2ToRAMDAC){
- tempax=tempax|SupportRAMDAC2;
- }
- if(VBInfo&SetCRT2ToLCD){
- tempax=tempax|SupportLCD;
- if(LCDResInfo!=Panel1280x1024){
- temp=*((UCHAR *)(ROMAddr+ModeIDOffset+0x09)); //si+Ext_ResInfo
- if(temp>=9){
- tempax=0;
- }
- }
- }
- if(VBInfo&(SetCRT2ToAVIDEO|SetCRT2ToSVIDEO|SetCRT2ToSCART)){
- tempax=tempax|SupportTV;
- if(!(VBInfo&SetPALTV)){
- tempextinfoflag=*((USHORT *)(ROMAddr+REFIndex+0x0)); //di+Ext_InfoFlag
- if(tempextinfoflag&NoSupportSimuTV){
- if(VBInfo&SetInSlaveMode){
- if(!(VBInfo&SetNotSimuTVMode)){
- return 0;
- }
- }
- }
- }
- }
- tempbx=*((USHORT *)(ROMAddr+ModeIDOffset+0x04)); // si+Ext_point
- }else{ //for LVDS
- if(VBInfo&SetCRT2ToLCD){
- tempax=tempax|SupportLCD;
- temp=*((UCHAR *)(ROMAddr+ModeIDOffset+0x09)); //si+Ext_ResInfo
- if(temp>0x08){ //1024x768
- return 0;
- }
- if(LCDResInfo<Panel1024x768){
- if(temp>0x07){ //800x600
- return 0;
- }
- if(temp==0x04){ //512x384
- return 0;
- }
- }
- }
- }
-
- for(;REFIndex>tempbx;REFIndex-=Ext2StructSize){
- tempextinfoflag=*((USHORT *)(ROMAddr+REFIndex+0x0)); //di+Ext_InfoFlag
- if(tempextinfoflag&tempax){
- return 1;
- }
- }
- for(REFIndex=tempbx;;REFIndex+=Ext2StructSize){
- tempextinfoflag=*((USHORT *)(ROMAddr+REFIndex+0x0)); //di+Ext_InfoFlag
- if(tempextinfoflag==0x0FFFF){
- return 0;
- }
- if(tempextinfoflag&tempax){
- return 1;
- }
- }
- return(FALSE);
-}
-
-VOID SaveCRT2Info(USHORT ModeNo){
- USHORT temp1,temp2,temp3;
- temp1=(VBInfo&SetInSlaveMode)>>8;
- temp2=~(SetInSlaveMode>>8);
- temp3=(UCHAR)GetReg1(P3d4,0x31);
- temp3=((temp3&temp2)|temp1);
- SetReg1(P3d4,0x31,(USHORT)temp3);
- temp3=(UCHAR)GetReg1(P3d4,0x35);
- temp3=temp3&0xF3;
- SetReg1(P3d4,0x35,(USHORT)temp3);
-}
-
-VOID DisableLockRegs(){
- UCHAR temp3;
- temp3=(UCHAR)GetReg1(P3c4,0x32);
- temp3=temp3&0xDF;
- SetReg1(P3c4,0x32,(USHORT)temp3);
-}
-
-VOID DisableCRT2(){
- UCHAR temp3;
- temp3=(UCHAR)GetReg1(P3c4,0x1E);
- temp3=temp3&0xDF;
- SetReg1(P3c4,0x1E,(USHORT)temp3);
-}
-
-void DisableBridge(USHORT BaseAddr)
-{
- USHORT Part2Port,Part1Port;
- Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10;
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
-
- if(IF_DEF_LVDS==0){
- SetRegANDOR(Part2Port,0x00,0xDF,0x00); //Set Part2 Index0 D[5]=0
- DisableLockRegs(); // SR 32
- DisableCRT2(); // SR 1E
- }else{
- DisableLockRegs();
- DisableCRT2();
- if(IF_DEF_TRUMPION==0){
- UnLockCRT2(BaseAddr);
- SetRegANDOR(Part1Port,0x02,0xFF,0x40); //set Part1Port ,index 2, D6=1,
- }
- }
-}
-
-VOID GetCRT2Data(ULONG ROMAddr,USHORT ModeNo)
-{
- if(IF_DEF_LVDS==0){ //301
- GetCRT2Data301(ROMAddr,ModeNo);
- return;
- }else{ //LVDS
- GetCRT2DataLVDS(ROMAddr,ModeNo);
- return;
- }
-}
-
-VOID GetCRT2DataLVDS(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT tempax,tempbx,OldREFIndex;
-
- OldREFIndex=(USHORT)REFIndex; //push di
- GetResInfo(ROMAddr,ModeNo);
- GetCRT2Ptr(ROMAddr,ModeNo);
-
- tempax=*((USHORT *)(ROMAddr+REFIndex));
- tempax=tempax&0x0FFF;
- VGAHT=tempax;
-
- tempax=*((USHORT *)(ROMAddr+REFIndex+1));
- tempax=tempax>>4;
- tempax=tempax&0x07FF;
- VGAVT=tempax;
-
- tempax=*((USHORT *)(ROMAddr+REFIndex+3));
- tempax=tempax&0x0FFF;
- tempbx=*((USHORT *)(ROMAddr+REFIndex+4));
- tempbx=tempbx>>4;
- tempbx=tempbx&0x07FF;
-
- HT=tempax;
- VT=tempbx;
-
- if(IF_DEF_TRUMPION==0){
- if(VBInfo&SetCRT2ToLCD){
- if(!(LCDInfo&LCDNonExpanding)){
- if(LCDResInfo==Panel800x600){
- tempax=800;
- tempbx=600;
- }else if(LCDResInfo==Panel1024x768){
- tempax=1024;
- tempbx=768;
- }else{
- tempax=1280;
- tempbx=1024;
- }
- HDE=tempax;
- VDE=tempbx;
- }
- }
- }
- REFIndex=OldREFIndex; //pop di
- return;
-}
-
-VOID GetCRT2Data301(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT tempax,tempbx,modeflag1,OldREFIndex;
- USHORT tempal,tempah,tempbl;
-
- OldREFIndex=(USHORT)REFIndex; //push di
- RVBHRS=50;NewFlickerMode=0;RY1COE=0;
- RY2COE=0;RY3COE=0;RY4COE=0;
-
- GetResInfo(ROMAddr,ModeNo);
- if(VBInfo&SetCRT2ToRAMDAC){
- GetRAMDAC2DATA(ROMAddr,ModeNo);
- REFIndex=OldREFIndex; //pop di
- return;
- }
- GetCRT2Ptr(ROMAddr,ModeNo);
-
- tempal=*((UCHAR *)(ROMAddr+REFIndex));
- tempah=*((UCHAR *)(ROMAddr+REFIndex+4));
- tempax=tempal|(((tempah<<8)>>7)&0xFF00);
- RVBHCMAX=tempax;
-
- tempal=*((UCHAR *)(ROMAddr+REFIndex+1));
- RVBHCFACT=tempal;
-
- tempax=*((USHORT *)(ROMAddr+REFIndex+2));
- VGAHT=(tempax&0x0FFF);
-
- tempax=*((USHORT *)(ROMAddr+REFIndex+3));
- VGAVT=((tempax>>4)&0x07FF);
-
- tempax=*((USHORT *)(ROMAddr+REFIndex+5));
- tempax=(tempax&0x0FFF);
- tempbx=*((USHORT *)(ROMAddr+REFIndex+6));
- tempbx=((tempbx>>4)&0x07FF);
- tempbl=tempbx&0x00FF;
-
- if(VBInfo&SetCRT2ToTV){
- tempax=*((USHORT *)(ROMAddr+REFIndex+5));
- tempax=(tempax&0x0FFF);
- HDE=tempax;
- tempax=*((USHORT *)(ROMAddr+REFIndex+6));
- tempax=((tempax>>4)&0x07FF);
- VDE=tempax;
- //skipp something about hivisiontv
- tempax=*((USHORT *)(ROMAddr+REFIndex+8));
- tempbl=(tempax>>8);
- tempax=tempax&0x0FFF;
- modeflag1=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- if(modeflag1&HalfDCLK){
- tempax=*((USHORT *)(ROMAddr+REFIndex+10));
- }
- RVBHRS=tempax;
- NewFlickerMode=(tempbl&0x080);
-
- tempax=*((USHORT *)(ROMAddr+REFIndex+12));
- RY1COE=(tempax&0x00FF);
- RY2COE=((tempax&0xFF00)>>8);
- tempax=*((USHORT *)(ROMAddr+REFIndex+14));
- RY3COE=(tempax&0x00FF);
- RY4COE=((tempax&0xFF00)>>8);
- if(!(VBInfo&SetPALTV)){
- tempax=NTSCHT;
- tempbx=NTSCVT;
- }else{
- tempax=PALHT;
- tempbx=PALVT;
- }
- }
- HT=tempax;
- VT=tempbx;
- if(!(VBInfo&SetCRT2ToLCD)){
- REFIndex=OldREFIndex; //pop di
- return;
- }
-
- tempax=1024;
- if(VGAVDE==350){ //cx->VGAVDE
- tempbx=560;
- }else if(VGAVDE==400){
- tempbx=640;
- }else{
- tempbx=768;
- }
-
- if(LCDResInfo==Panel1280x1024){
- tempax=1280;
- if(VGAVDE==360){
- tempbx=768;
- }else if(VGAVDE==375){
- tempbx=800;
- }else if(VGAVDE==405){
- tempbx=864;
- }else{
- tempbx=1024;
- }
- }
-
- HDE=tempax;
- VDE=tempbx;
- REFIndex=OldREFIndex; //pop di
- return;
-}
-
-VOID GetResInfo(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT temp,xres,yres,modeflag1;
- if(ModeNo<=0x13){
- temp=(USHORT)*((UCHAR *)(ROMAddr+ModeIDOffset+0x05)); // si+St_ResInfo
- xres=StResInfo[temp][0];
- yres=StResInfo[temp][1];
- }else{
- temp=(USHORT)*((UCHAR *)(ROMAddr+ModeIDOffset+0x09)); // si+Ext_ResInfo
- xres=ModeResInfo[temp][0]; //xres->ax
- yres=ModeResInfo[temp][1]; //yres->bx
- modeflag1=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- if(modeflag1&HalfDCLK){ xres=xres*2;}
- if(modeflag1&DoubleScanMode){yres=yres*2;}
- }
- if(!(LCDResInfo==Panel1024x768)){
- if(yres==400) yres=405;
- if(yres==350) yres=360;
- if(SetFlag&LCDVESATiming){
- if(yres==360) yres=375;
- }
- }
- VGAHDE=xres;
- HDE=xres;
- VGAVDE=yres;
- VDE=yres;
-}
-
-VOID GetLVDSDesData(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT old_REFIndex,tempax;
-
- old_REFIndex=(USHORT)REFIndex; //push di
- REFIndex=GetLVDSDesPtr(ROMAddr,ModeNo);
-
- tempax=*((USHORT *)(ROMAddr+REFIndex));
- tempax=tempax&0x0FFF;
- LCDHDES=tempax;
-
- if(LCDInfo&LCDNonExpanding){ //hw walk-a-round
- if(LCDResInfo>=Panel1024x768){
- if(ModeNo<=0x13){
- LCDHDES=320;
- }
- }
- }
-
- tempax=*((USHORT *)(ROMAddr+REFIndex+1));
- tempax=tempax>>4;
- tempax=tempax&0x07FF;
- LCDVDES=tempax;
-
- REFIndex=old_REFIndex; //pop di
- return;
-}
-
-
-VOID GetRAMDAC2DATA(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT tempax,tempbx,tempbh,modeflag1,t1=0,t2;
- RVBHCMAX=1;RVBHCFACT=1;
- if(ModeNo<=0x13){
- tempax=*((UCHAR *)(ROMAddr+REFIndex+10));
- tempbx=*((USHORT *)(ROMAddr+REFIndex+16));
- }else{
- t1=*((UCHAR *)(ROMAddr+REFIndex+0x2)); //Ext_CRT1CRTC=2
- t1=t1&0x03F; //[06/29/2000] fix bug for vbios >=v1.07.00
- t1=t1*CRT1Len;
- REFIndex=*((USHORT *)(ROMAddr+0x204)); // Get CRT1Table
- REFIndex=REFIndex+t1;
- t1=*((UCHAR *)(ROMAddr+REFIndex+0));
- t2=*((UCHAR *)(ROMAddr+REFIndex+14));
- tempax=(t1&0xFF)|((t2&0x03)<<8);
- tempbx=*((USHORT *)(ROMAddr+REFIndex+6));
- t1=*((UCHAR *)(ROMAddr+REFIndex+13));
- t1=(t1&0x01)<<2;
- }
-
- tempbh=tempbx>>8;
- tempbh=((tempbh&0x20)>>4)|(tempbh&0x01);
- tempbh=tempbh|t1;
- tempbx=(tempbx&0xFF)|(tempbh<<8);
- tempax=tempax+5;
- modeflag1=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- if(modeflag1&Charx8Dot){
- tempax=tempax*8;
- }else{
- tempax=tempax*9;
- }
-
- VGAHT=tempax;
- HT=tempax;
- tempbx++;
- VGAVT=tempbx;
- VT=tempbx;
-
-}
-
-VOID GetCRT2Ptr(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT tempcl,tempbx,tempal,tempax,CRT2PtrData;
-
- if(IF_DEF_LVDS==0){
- if(VBInfo&SetCRT2ToLCD){ //LCD
- tempbx=0; //default tempbx=0 -> ExtLCD1Data
- tempcl=LCDDataLen;
- if(LCDResInfo==Panel1024x768){
- tempbx=0;
- }else if(LCDResInfo==Panel1280x1024){
- tempbx=1;
- }
- if(!(SetFlag&LCDVESATiming)) tempbx+=5;
- }else if(VBInfo&SetPALTV){
- tempcl=TVDataLen;
- tempbx=3;
- }else{
- tempbx=4;
- tempcl=TVDataLen;
- }
- if(SetFlag&TVSimuMode){
- tempbx=tempbx+4;
- }
- if(ModeNo<=0x13){
- tempal=*((UCHAR *)(ROMAddr+ModeIDOffset+0x04)); // si+St_CRT2CRTC
- }else{
- tempal=*((UCHAR *)(ROMAddr+REFIndex+4)); //di+Ext_CRT2CRTC
- }
- tempal=tempal&0x1F;
-
- tempax=tempal*tempcl;
- REFIndex=*((USHORT *)(ROMAddr+tempbx*2+0x20E));
- REFIndex+=tempax;
- }else{ //for LVDS
-
- tempcl=LVDSDataLen;
- tempbx=LCDResInfo-Panel800x600;
- if(LCDInfo&LCDNonExpanding){
- tempbx=tempbx+3;
- }
- if(ModeNo<=0x13){
- tempal=*((UCHAR *)(ROMAddr+ModeIDOffset+0x04)); // si+St_CRT2CRTC
- }else{
- tempal=*((UCHAR *)(ROMAddr+REFIndex+0x04)); // di+Ext_CRT2CRTC
- }
- tempal=tempal&0x1F;
- tempax=tempal*tempcl;
- CRT2PtrData=*((USHORT *)(ROMAddr+ADR_CRT2PtrData)); //ADR_CRT2PtrData is defined in init.def
- REFIndex=*((USHORT *)(ROMAddr+CRT2PtrData+tempbx*2));
- REFIndex+=tempax;
- }
-}
-
-VOID UnLockCRT2(USHORT BaseAddr)
-{
- UCHAR temp3;
- USHORT Part1Port;
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
- temp3=(UCHAR)GetReg1(Part1Port,0x24);
- temp3=temp3|0x01;
- SetReg1(Part1Port,0x24,(USHORT)temp3);
-}
-
-VOID SetCRT2ModeRegs(USHORT BaseAddr,USHORT ModeNo)
-{
- USHORT i,j;
- USHORT tempah=0,temp3;
- SHORT tempcl;
- USHORT Part4Port;
- USHORT Part1Port;
- Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14;
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
- for(i=0,j=4;i<3;i++,j++){
- SetReg1(Part1Port,j,0);
- }
-
- tempcl=(USHORT)ModeType;
- if(ModeNo>0x13){
- tempcl=tempcl-ModeVGA;
- if(tempcl>=0){
- tempah=((0x010>>tempcl)|0x080);
- }
- }else{
- tempah=0x080;
- }
-
- if(VBInfo&SetInSlaveMode){
- tempah=(tempah^0x0A0);
- }
- if(VBInfo&CRT2DisplayFlag){
- tempah=0;
- }
- SetReg1(Part1Port,0,tempah);
-
- if(IF_DEF_LVDS==0){ //301
- tempah=0x01;
- if(!(VBInfo&SetInSlaveMode)){
- tempah=(tempah|0x02);
- }
- if(!(VBInfo&SetCRT2ToRAMDAC)){
- tempah=(tempah^0x05);
- if(!(VBInfo&SetCRT2ToLCD)){
- tempah=(tempah^0x01);
- }
- }
- tempah=(tempah<<5)&0xFF;
- if(VBInfo&CRT2DisplayFlag){
- tempah=0;
- }
- SetReg1(Part1Port,0x01,tempah);
-
- tempah=tempah>>5;
- if((ModeType==ModeVGA)&&(!(VBInfo&SetInSlaveMode))){
- tempah=tempah|0x010;
- }
- if(LCDResInfo!=Panel1024x768){
- tempah=tempah|0x080;
- }
- if(VBInfo&SetCRT2ToTV){
- if(VBInfo&SetInSlaveMode){
- tempah=tempah|0x020;
- }
- }
-
- temp3=(UCHAR)GetReg1(Part4Port,0x0D);
- temp3=temp3&(~0x0BF);
- temp3=temp3|tempah;
- SetReg1(Part4Port,0x0D,(USHORT)temp3);
- }else{ //LVDS
- tempah=0;
- if(!(VBInfo&SetInSlaveMode)){
- tempah=tempah|0x02;
- }
- tempah=(tempah<<5)&0x0FF;
- if(VBInfo&CRT2DisplayFlag){
- tempah=0;
- }
- SetReg1(Part1Port,0x01,tempah);
- }
-}
-
-VOID SetGroup1(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo,
- PHW_DEVICE_EXTENSION HwDeviceExtension)
-{
- if(IF_DEF_LVDS==0){ //301
- SetGroup1_301(BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
- }else{ //LVDS
- SetGroup1_LVDS(BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
- }
-}
-VOID SetGroup1_LVDS(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo,
- PHW_DEVICE_EXTENSION HwDeviceExtension)
-{
- USHORT temp1,temp2,tempcl,tempch,tempbh,tempal,tempah,tempax,tempbx;
- USHORT tempcx,OldREFIndex,lcdhdee;
- USHORT Part1Port;
- USHORT temppush1,temppush2;
- unsigned long int tempeax,tempebx,tempecx,templong;
-
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
- OldREFIndex=(USHORT)REFIndex; //push di
-
- SetCRT2Offset(Part1Port,ROMAddr);
- SetCRT2FIFO(Part1Port,ROMAddr,ModeNo,HwDeviceExtension);
- SetCRT2Sync(BaseAddr,ROMAddr,ModeNo);
-
- temp1=(VGAHT-1)&0x0FF; //BTVGA2HT 0x08,0x09
- SetReg1(Part1Port,0x08,temp1);
- temp1=(((VGAHT-1)&0xFF00)>>8)<<4;
- SetRegANDOR(Part1Port,0x09,~0x0F0,temp1);
-
-
- temp1=(VGAHDE+12)&0x0FF; //BTVGA2HDEE 0x0A,0x0C
- SetReg1(Part1Port,0x0A,temp1);
-
- temp1=VGAHDE+12; //bx BTVGA@HRS 0x0B,0x0C
- temp2=(VGAHT-VGAHDE)>>2; //cx
- temp1=temp1+temp2;
- temp2=(temp2<<1)+temp1;
- tempcl=temp2&0x0FF;
- //
- SetReg1(Part1Port,0x0B,(USHORT)(temp1&0x0FF));
- tempah=(temp1&0xFF00)>>8;
- tempbh=((((VGAHDE+12)&0xFF00)>>8)<<4)&0x0FF;
- tempah=tempah|tempbh;
- SetReg1(Part1Port,0x0C,tempah);
- SetReg1(Part1Port,0x0D,tempcl); //BTVGA2HRE 0x0D
- tempcx=(VGAVT-1);
- tempah=tempcx&0x0FF;
- SetReg1(Part1Port,0x0E,tempah); //BTVGA2TV 0x0E,0x12
- tempbx=VGAVDE-1;
- tempah=tempbx&0x0FF;
- SetReg1(Part1Port,0x0F,tempah); //BTVGA2VDEE 0x0F,0x12
- tempah=((tempbx&0xFF00)<<3)>>8;
- tempah=tempah|((tempcx&0xFF00)>>8);
- SetReg1(Part1Port,0x12,tempah);
-
- tempbx=(VGAVT+VGAVDE)>>1; //BTVGA2VRS 0x10,0x11
- tempcx=((VGAVT-VGAVDE)>>4)+tempbx+1; //BTVGA2VRE 0x11
- //
- tempah=tempbx&0x0FF;
- SetReg1(Part1Port,0x10,tempah);
- tempbh=(tempbx&0xFF00)>>8;
- tempah=((tempbh<<4)&0x0FF)|(tempcx&0x0F);
- SetReg1(Part1Port,0x11,tempah);
-
- SetRegANDOR(Part1Port,0x13,~0x03C,tempah);
-
- tempax=LCDHDES;
- tempbx=HDE;
- tempcx=HT;
- tempcx=tempcx-tempbx; //HT-HDE
- tempax=tempax+tempbx; //lcdhdee
- tempbx=HT;
- if(tempax>=tempbx){
- tempax=tempax-tempbx;
- }
-
- lcdhdee=tempax;
- tempcx=tempcx>>2; //temp
- tempcx=tempcx+tempax; //lcdhrs
- if(tempcx>=tempbx){
- tempcx=tempcx-tempbx;
- }
-
- tempax=tempcx;
- tempax=tempax>>3; //BPLHRS
- tempah=tempax&0x0FF;
- SetReg1(Part1Port,0x14,tempah); //Part1_14h
- tempah=tempah+2;
- tempah=tempah+0x01F;
- tempcl=tempcx&0x0FF;
- tempcl=tempcl&0x07;
- tempcl=(tempcl<<5)&0xFF; //BPHLHSKEW
- tempah=tempah|tempcl;
- SetReg1(Part1Port,0x15,tempah); //Part1_15h
- tempbx=lcdhdee; //lcdhdee
- tempcx=LCDHDES; //lcdhdes
- tempah=(tempcx&0xFF);
- tempah=tempah&0x07; //BPLHDESKEW
- SetReg1(Part1Port,0x1A,tempah); //Part1_1Ah
- tempcx=tempcx>>3; //BPLHDES
- tempah=(tempcx&0xFF);
- SetReg1(Part1Port,0x16,tempah); //Part1_16h
- tempbx=tempbx>>3; //BPLHDEE
- tempah=tempbx&0xFF;
- SetReg1(Part1Port,0x17,tempah); //Part1_17h
-
- tempcx=VGAVT;
- tempbx=VGAVDE;
- tempcx=tempcx-tempbx; //VGAVT-VGAVDE
- tempbx=LCDVDES; //VGAVDES
- temppush1=tempbx; //push bx temppush1
- if(IF_DEF_TRUMPION==0){
- if(LCDResInfo==Panel800x600){
- tempax=600;
- }else{
- tempax=768;
- }
- }else{
- tempax=VGAVDE;
- }
- tempbx=tempbx+tempax;
- tempax=VT; //VT
- if(tempbx>=VT){
- tempbx=tempbx-tempax;
- }
- temppush2=tempbx; //push bx temppush2
- tempcx=tempcx>>1;
- tempbx=tempbx+tempcx;
- tempbx++; //BPLVRS
- if(tempbx>=tempax){
- tempbx=tempbx-tempax;
- }
- tempah=tempbx&0xFF;
- SetReg1(Part1Port,0x18,tempah); //Part1_18h
- tempcx=tempcx>>3;
- tempcx=tempcx+tempbx;
- tempcx++; //BPLVRE
- tempah=tempcx&0xFF;
- tempah=tempah&0x0F;
- tempah=tempah|0x030;
- SetRegANDOR(Part1Port,0x19,~0x03F,tempah); //Part1_19h
- tempbh=(tempbx&0xFF00)>>8;
- tempbh=tempbh&0x07;
- tempah=tempbh;
- tempah=(tempah<<3)&0xFF; //BPLDESKEW =0
- tempbx=VGAVDE;
- if(tempbx!=VDE){
- tempah=tempah|0x40;
- }
- SetRegANDOR(Part1Port,0x1A,0x07,tempah); //Part1_1Ah
- tempecx=VGAVT;
- tempebx=VDE;
- tempeax=VGAVDE;
- tempecx=tempecx-tempeax; //VGAVT-VGAVDE
- tempeax=tempeax*64;
- templong=tempeax/tempebx;
- if(templong*tempebx<tempeax){
- templong++;
- }
- tempebx=templong; //BPLVCFACT
- if(SetFlag&EnableLVDSDDA){
- tempebx=tempebx&0x03F;
- }
- tempah=(USHORT)(tempebx&0x0FF);
- SetReg1(Part1Port,0x1E,tempah); //Part1_1Eh
- tempbx=temppush2; //pop bx temppush2 BPLVDEE
- tempcx=temppush1; //pop cx temppush1 NPLVDES
- tempbh=(tempbx&0xFF00)>>8;
- tempah=tempah&0x07;
- tempah=tempbh;
- tempah=tempah<<3;
- tempch=(tempcx&0xFF00)>>8;
- tempch=tempah&0x07;
- tempah=tempah|tempch;
- SetReg1(Part1Port,0x1D,tempah); //Part1_1Dh
- tempah=tempbx&0xFF;
- SetReg1(Part1Port,0x1C,tempah); //Part1_1Ch
- tempah=tempcx&0xFF;
- SetReg1(Part1Port,0x1B,tempah); //Part1_1Bh
-
- tempecx=VGAHDE;
- tempebx=HDE;
- tempeax=tempecx;
- tempeax=tempeax<<6;
- tempeax=tempeax<<10;
- tempeax=tempeax/tempebx;
- if(tempebx==tempecx){
- tempeax=65535;
- }
- tempecx=tempeax;
- tempeax=VGAHT;
- tempeax=tempeax<<6;
- tempeax=tempeax<<10;
- tempeax=tempeax/tempecx;
- tempecx=tempecx<<16;
- tempeax=tempeax-1;
- tempax=(USHORT)(tempeax&0x00FFFF);
- tempcx=tempax;
- tempah=tempcx&0x0FF;
- SetReg1(Part1Port,0x1F,tempah); //Part1_1Fh
- tempbx=VDE;
- tempbx--; //BENPLACCEND
- if(SetFlag&EnableLVDSDDA){
- tempbx=1;
- }
- tempah=(tempbx&0xFF00)>>8;
- tempah=(tempah<<3)&0xFF;
- tempch=(tempcx&0xFF00)>>8;
- tempch=tempch&0x07;
- tempah=tempah|tempch;
- SetReg1(Part1Port,0x20,tempah); //Part1_20h
- tempah=tempbx&0xFF;
- SetReg1(Part1Port,0x21,tempah); //Part1_21h
- tempecx=tempecx>>16; //BPLHCFACT
- temp1=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- if(temp1&HalfDCLK){
- tempecx=tempecx>>1;
- }
- tempcx=(USHORT)(tempecx&0x0FFFF);
- tempah=(tempcx&0xFF00)>>8;
- SetReg1(Part1Port,0x22,tempah); //Part1_22h
- tempah=tempcx&0x0FF;
- SetReg1(Part1Port,0x23,tempah); //Part1_23h
- if(IF_DEF_TRUMPION==1){
- tempal=(USHORT)*((UCHAR *)(ROMAddr+ModeIDOffset+0x05)); // si+St_ResInfo
- if(ModeNo>0x13){
- SetFlag=SetFlag|ProgrammingCRT2;
- GetRatePtrCRT2(ROMAddr,ModeNo);
- tempal=*((UCHAR *)(ROMAddr+REFIndex+0x04)); // di+Ext_CRT2CRTC
- tempal=tempal&0x1F;
- }
- tempah=0x80;
- tempal=tempal*tempah;
- REFIndex= offset_Zurac; //offset Zurac need added in rompost.asm
- REFIndex=REFIndex+tempal;
- SetTPData(); //this function not implemented yet
- SetTPData();
- SetTPData();
- SetTPData();
- SetTPData();
- SetTPData();
- SetTPData();
- SetTPData();
- SetTPData();
- }
-
- REFIndex=OldREFIndex; //pop di
- return;
-}
-
-VOID SetTPData(VOID)
-{
- return;
-}
-
-VOID SetGroup1_301(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo,
- PHW_DEVICE_EXTENSION HwDeviceExtension)
-{
- USHORT temp1,temp2,tempcl,tempch,tempbl,tempbh,tempal,tempah,tempax,tempbx;
- USHORT tempcx,OldREFIndex;
- USHORT Part1Port;
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
- OldREFIndex=(USHORT)REFIndex; //push di
-
- SetCRT2Offset(Part1Port,ROMAddr);
- SetCRT2FIFO(Part1Port,ROMAddr,ModeNo,HwDeviceExtension);
- SetCRT2Sync(BaseAddr,ROMAddr,ModeNo);
-
- GetCRT1Ptr(ROMAddr);
-
- temp1=(VGAHT-1)&0x0FF; //BTVGA2HT 0x08,0x09
- SetReg1(Part1Port,0x08,temp1);
- temp1=(((VGAHT-1)&0xFF00)>>8)<<4;
- SetRegANDOR(Part1Port,0x09,~0x0F0,temp1);
-
- temp1=(VGAHDE+12)&0x0FF; //BTVGA2HDEE 0x0A,0x0C
- SetReg1(Part1Port,0x0A,temp1);
-
- temp1=VGAHDE+12; //bx BTVGA@HRS 0x0B,0x0C
- temp2=(VGAHT-VGAHDE)>>2; //cx
- temp1=temp1+temp2;
- temp2=(temp2<<1)+temp1;
- tempcl=temp2&0x0FF;
- if(VBInfo&SetCRT2ToRAMDAC){
- tempbl=*((UCHAR *)(ROMAddr+REFIndex+4)); //di+4
- tempbh=*((UCHAR *)(ROMAddr+REFIndex+14)); //di+14
- temp1=((tempbh>>6)<<8)|tempbl; //temp1->bx
- temp1=(temp1-1)<<3;
- tempcl=*((UCHAR *)(ROMAddr+REFIndex+5)); //di+5
- tempch=*((UCHAR *)(ROMAddr+REFIndex+15)); //di+15
- tempcl=tempcl&0x01F;
- tempch=(tempch&0x04)<<(6-2);
- tempcl=((tempcl|tempch)-1)<<3;
- }
- SetReg1(Part1Port,0x0B,(USHORT)(temp1&0x0FF));
- tempah=(temp1&0xFF00)>>8;
- tempbh=((((VGAHDE+12)&0xFF00)>>8)<<4)&0x0FF;
- tempah=tempah|tempbh;
- SetReg1(Part1Port,0x0C,tempah);
- SetReg1(Part1Port,0x0D,tempcl); //BTVGA2HRE 0x0D
- tempcx=(VGAVT-1);
- tempah=tempcx&0x0FF;
- SetReg1(Part1Port,0x0E,tempah); //BTVGA2TV 0x0E,0x12
- tempbx=VGAVDE-1;
- tempah=tempbx&0x0FF;
- SetReg1(Part1Port,0x0F,tempah); //BTVGA2VDEE 0x0F,0x12
- tempah=((tempbx&0xFF00)<<3)>>8;
- tempah=tempah|((tempcx&0xFF00)>>8);
- SetReg1(Part1Port,0x12,tempah);
-
- tempbx=(VGAVT+VGAVDE)>>1; //BTVGA2VRS 0x10,0x11
- tempcx=((VGAVT-VGAVDE)>>4)+tempbx+1; //BTVGA2VRE 0x11
- if(VBInfo&SetCRT2ToRAMDAC){
- tempbx=*((UCHAR *)(ROMAddr+REFIndex+8)); //di+8
- temp1=*((UCHAR *)(ROMAddr+REFIndex+7)); //di+7
- if(temp1&0x04){
- tempbx=tempbx|0x0100;
- }
- if(temp1&0x080){
- tempbx=tempbx|0x0200;
- }
- temp1=*((UCHAR *)(ROMAddr+REFIndex+13)); //di+13
- if(temp1&0x08){
- tempbx=tempbx|0x0400;
- }
- tempcl= *((UCHAR *)(ROMAddr+REFIndex+9)); //di+9
- tempcx=(tempcx&0xFF00)|(tempcl&0x00FF);
- }
- tempah=tempbx&0x0FF;
- SetReg1(Part1Port,0x10,tempah);
- tempbh=(tempbx&0xFF00)>>8;
- tempah=((tempbh<<4)&0x0FF)|(tempcx&0x0F);
- SetReg1(Part1Port,0x11,tempah);
-
- if(HwDeviceExtension->jChipID == SIS_Glamour)
- {
- tempah=0x10;
- if((LCDResInfo!=Panel1024x768)&&(LCDResInfo==Panel1280x1024)){
- tempah=0x20;
- }
- }else{
- tempah=0x20;
- }
- if(VBInfo&SetCRT2ToTV){
- tempah=0x08;
- }
-
- SetRegANDOR(Part1Port,0x13,~0x03C,tempah);
-
- if(!(VBInfo&SetInSlaveMode)){
- REFIndex=OldREFIndex;
- return;
- }
- if(VBInfo&SetCRT2ToTV){
- tempax=0xFFFF;
- }else{
- tempax=GetVGAHT2();
- }
- tempcl=0x08; //Reg 0x03 Horozontal Total
- temp1=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- if(!(temp1&Charx8Dot)){ //temp1->St_ModeFlag
- tempcl=0x09;
- }
- if(tempax>=VGAHT){
- tempax=VGAHT;
- }
- if(temp1&HalfDCLK){
- tempax=tempax>>1;
- }
- tempax=(tempax/tempcl)-5;
- tempbl=tempax;
- tempah=0xFF; //set MAX HT
- SetReg1(Part1Port,0x03,tempah);
-
- tempax=VGAHDE; //0x04 Horizontal Display End
- if(temp1&HalfDCLK){
- tempax=tempax>>1;
- }
- tempax=(tempax/tempcl)-1;
- tempbh=tempax;
- SetReg1(Part1Port,0x04,tempax);
-
- tempah=tempbh;
- if(VBInfo&SetCRT2ToTV){
- tempah=tempah+2;
- }
- SetReg1(Part1Port,0x05,tempah); //0x05 Horizontal Display Start
- SetReg1(Part1Port,0x06,0x03); //0x06 Horizontal Blank end
- //0x07 horizontal Retrace Start
- tempcx=(tempbl+tempbh)>>1;
- tempah=(tempcx&0xFF)+2;
-
- if(VBInfo&SetCRT2ToTV){
- tempah=tempah-1;
- if(!(temp1&HalfDCLK)){
- if((temp1&Charx8Dot)){
- tempah=tempah+4;
- if(VGAHDE>=800){
- tempah=tempah-6;
- }
- }
- }
- }else{
- if(!(temp1&HalfDCLK)){
- tempah=tempah-4;
- if(VGAHDE>=800){
- tempah=tempah-7;
- if(ModeType==ModeEGA){
- if(VGAVDE==1024){
- tempah=tempah+15;
- if(LCDResInfo!=Panel1280x1024){
- tempah=tempah+7;
- }
- }
- }
- if(VGAHDE>=1280){
- tempah=tempah+28;
- }
- }
- }
- }
-
- SetReg1(Part1Port,0x07,tempah);//0x07 Horizontal Retrace Start
-
- SetReg1(Part1Port,0x08,0); //0x08 Horizontal Retrace End
- SetReg1(Part1Port,0x18,0x03); //0x18 SR08
- SetReg1(Part1Port,0x19,0); //0x19 SR0C
- SetReg1(Part1Port,0x09,0xFF); //0x09 Set Max VT
-
- tempcx=0x121;
- tempcl=0x21;
- tempch=0x01;
- tempbx=VGAVDE; //0x0E Virtical Display End
- if(tempbx==360) tempbx=350;
- if(tempbx==375) tempbx=350;
- if(tempbx==405) tempbx=400;
- tempbx--;
- tempah=tempbx&0x0FF;
- SetReg1(Part1Port,0x0E,tempah);
- SetReg1(Part1Port,0x10,tempah);//0x10 vertical Blank Start
- tempbh=(tempbx&0xFF00)>>8;
- if(tempbh&0x01){
- tempcl=tempcl|0x0A;
- }
- tempah=0;tempal=0x0B;
- if(temp1&DoubleScanMode){
- tempah=tempah|0x080;
- }
- if(tempbh&0x02){
- tempcl=tempcl|0x040;
- tempah=tempah|0x020;
- }
- SetReg1(Part1Port,0x0B,tempah);
- if(tempbh&0x04){
- tempch=tempch|0x06;
- }
-
- SetReg1(Part1Port,0x11,0); //0x11 Vertival Blank End
-
- tempax=VGAVT-tempbx; //0x0C Vertical Retrace Start
- tempax=tempax>>2;
- temp2=tempax; //push ax
- tempax=tempax<<1;
- tempbx=tempax+tempbx;
- if((SetFlag&TVSimuMode)&&(VBInfo&SetPALTV)&&(VGAHDE==800)){
- tempbx=tempbx+40;
- }
- tempah=(tempbx&0x0FF);
- SetReg1(Part1Port,0x0C,tempah);
- tempbh=(tempbx&0xFF00)>>8;
- if(tempbh&0x01){
- tempcl=tempcl|0x04;
- }
- if(tempbh&0x02){
- tempcl=tempcl|0x080;
- }
- if(tempbh&0x04){
- tempch=tempch|0x08;
- }
-
- tempax=temp2; //pop ax
- tempax=(tempax>>2)+1;
- tempbx=tempbx+tempax;
- tempah=(tempbx&0x0FF)&0x0F;
- SetReg1(Part1Port,0x0D,tempah); //0x0D vertical Retrace End
- tempbl=tempbx&0x0FF;
- if(tempbl&0x10){
- tempch=tempch|0x020;
- }
-
- tempah=tempcl;
- SetReg1(Part1Port,0x0A,tempah); //0x0A CR07
- tempah=tempch;
- SetReg1(Part1Port,0x17,tempah); //0x17 SR0A
- tempax=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- tempah=(tempax&0xFF00)>>8;
- tempah=(tempah>>1)&0x09;
- SetReg1(Part1Port,0x16,tempah); //0x16 SR01
- SetReg1(Part1Port,0x0F,0); //0x0F CR14
- SetReg1(Part1Port,0x12,0); //0x12 CR17
- SetReg1(Part1Port,0x1A,0); //0x1A SR0E
-
- REFIndex=OldREFIndex; //pop di
-}
-
-VOID SetCRT2Offset(USHORT Part1Port,ULONG ROMAddr)
-{
- USHORT offset;
- if(VBInfo&SetInSlaveMode){
- return;
- }
- offset=GetOffset(ROMAddr);
- SetReg1(Part1Port,0x07,(USHORT)(offset&0xFF));
- SetReg1(Part1Port,0x09,(USHORT)((offset&0xFF00)>>8));
- SetReg1(Part1Port,0x03,(USHORT)(((offset>>3)&0xFF)+1));
-}
-
-USHORT GetOffset(ULONG ROMAddr)
-{
- USHORT tempal,temp1,colordepth;
- tempal=*((UCHAR *)(ROMAddr+ModeIDOffset+0x03)); // si+Ext_ModeInfo
- tempal=(tempal>>4)&0xFF;
- ScreenOffset=*((USHORT *)(ROMAddr+0x206)); // Get ScreeOffset table
- tempal=*((UCHAR *)(ROMAddr+ScreenOffset+tempal)); // get ScreenOffset
- tempal=tempal&0xFF;
- temp1=*((UCHAR *)(ROMAddr+REFIndex)); //di+Ext_InfoFlag
- if(temp1&InterlaceMode){
- tempal=tempal<<1;
- }
- colordepth=GetColorDepth(ROMAddr);
- return(tempal*colordepth);
-}
-
-USHORT GetColorDepth(ULONG ROMAddr)
-{
- USHORT ColorDepth[6]={1,2,4,4,6,8};
- USHORT temp;
- int temp1;
- temp=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- temp1=(temp&ModeInfoFlag)-ModeEGA;
- if(temp1<0) temp1=0;
- return(ColorDepth[temp1]);
-}
-
-VOID SetCRT2FIFO(USHORT Part1Port,ULONG ROMAddr,USHORT ModeNo,
- PHW_DEVICE_EXTENSION HwDeviceExtension)
-{
- USHORT temp,temp1,temp2,temp3,flag;
- USHORT vclk2ptr,latencyindex;
- USHORT oldREFIndex,CRT1ModeNo,oldModeIDOffset;
- long int longtemp;
-
- USHORT LatencyFactor[48]={ 88, 80, 78, 72, 70, 00, // 64 bit BQ=2
- 00, 79, 77, 71, 69, 49, // 64 bit BQ=1
- 88, 80, 78, 72, 70, 00, // 128 bit BQ=2
- 00, 72, 70, 64, 62, 44, // 128 bit BQ=1
- 73, 65, 63, 57, 55, 00, // 64 bit BQ=2
- 00, 64, 62, 56, 54, 34, // 64 bit BQ=1
- 78, 70, 68, 62, 60, 00, // 128 bit BQ=2
- 00, 62, 60, 54, 52, 34}; // 128 bit BQ=1
-
- oldREFIndex=(USHORT)REFIndex; //push REFIndex(CRT2 now)
- oldModeIDOffset=(USHORT)ModeIDOffset; //push ModeIDOffset
-
- CRT1ModeNo=(UCHAR)GetReg1(P3d4,0x34); //get CRT1 ModeNo
- SearchModeID(ROMAddr,CRT1ModeNo); //Get ModeID Table
-
- GetRatePtr(ROMAddr,CRT1ModeNo); //Set REFIndex-> for crt1 refreshrate
- temp1=GetVCLK(ROMAddr,CRT1ModeNo,HwDeviceExtension);
- temp2=GetColorTh(ROMAddr);
- temp3=GetMCLK(ROMAddr);
- temp=((USHORT)(temp1*temp2)/temp3); //temp->bx
- temp1=(UCHAR)GetReg1(P3c4,0x14); //SR_14
- temp1=temp1>>6;
- temp1=temp1<<1;
- if(temp1==0) temp1=1;
- temp1=temp1<<2; //temp1->ax
-
- longtemp=temp1-temp;
-
- temp2=(USHORT)((28*16)/(int)longtemp); //temp2->cx
- if(!((temp2*(int)longtemp)==(28*16))) temp2++;
-
- if( HwDeviceExtension->jChipID == SIS_Glamour ){
- temp1=CalcDelay();
- }else{ //for Trojan and Spartan
- flag=(UCHAR)GetReg1(P3c4,0x14); //SR_14
- if(flag&0x80){
- latencyindex=12; //128 bit
- }else{
- latencyindex=0; //64 bit
- }
- flag=GetQueueConfig();
- if(!(flag&0x01)){
- latencyindex+=24; //GUI timing =0
- }
- if(flag&0x10){
- latencyindex+=6; //BQ =2
- }
- latencyindex=latencyindex + (flag>>5);
- temp1= LatencyFactor[latencyindex];
- temp1=temp1+15;
- flag=(UCHAR)GetReg1(P3c4,0x14); //SR_14
- if(!(flag&0x80)){
- temp1=temp1+5; //64 bit
- }
- }
-
- temp2=temp2+temp1;
- REFIndex=oldREFIndex; //pop REFIndex(CRT2)
- ModeIDOffset=oldModeIDOffset; //pop ModeIDOffset
-
- vclk2ptr=GetVCLK2Ptr(ROMAddr,ModeNo);
- temp1=*((USHORT *)(ROMAddr+vclk2ptr+(VCLKLen-2)));
- temp3=GetColorTh(ROMAddr);
- longtemp=temp1*temp2*temp3;
- temp3=GetMCLK(ROMAddr);
- temp3=temp3<<4;
- temp2=(int)(longtemp/temp3);
- if((long int)temp2*(long int)temp3<(long int)longtemp) temp2++; //temp2->cx
-
- temp1=(UCHAR)GetReg1(Part1Port,0x01); //part1port index 01
-
-
- if( (HwDeviceExtension->jChipID == SIS_Trojan ) &&
- ((HwDeviceExtension->revision_id & 0xf0) == 0x30) ) /* 630s */
- {
- temp1=(temp1&(~0x1F))|0x19;
- }else
- {
- temp1=(temp1&(~0x1F))|0x16;
- }
- SetReg1(Part1Port,0x01,temp1);
-
- if(temp2<=6) temp2=6;
- if(temp2>0x14) temp2=0x14;
- temp1=(UCHAR)GetReg1(Part1Port,0x02); //part1port index 02
- temp1=(temp1&(~0x1F))|temp2;
- SetReg1(Part1Port,0x02,temp1);
-}
-
-USHORT GetVCLK(ULONG ROMAddr,USHORT ModeNo,
- PHW_DEVICE_EXTENSION HwDeviceExtension)
-{
- USHORT tempptr;
- USHORT temp1;
- tempptr=GetVCLKPtr(ROMAddr,ModeNo);
- temp1=*((USHORT *)(ROMAddr+tempptr+(VCLKLen-2)));
-
- return temp1;
-}
-
-USHORT GetQueueConfig(void)
-{
- USHORT tempal,tempbl;
- ULONG tempeax;
-
- SetReg4(0xcf8,0x80000050);
- tempeax=GetReg3(0xcfc);
- tempeax=(tempeax>>24)&0x0f;
- tempbl=(USHORT)tempeax;
- tempbl=tempbl<<4;
-
- SetReg4(0xcf8,0x800000A0);
- tempeax=GetReg3(0xcfc);
- tempeax=(tempeax>>24)&0x0f;
- tempal=(USHORT)tempeax;
- tempbl=tempbl|tempal;
-
- return(tempbl);
-}
-
-USHORT GetVCLKPtr(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT tempal;
- tempal=(UCHAR)GetReg2((USHORT)(P3ca+0x02)); // Port 3cch
- tempal=((tempal>>2)&0x03);
- if(ModeNo>0x13){
- tempal=*((UCHAR *)(ROMAddr+REFIndex+0x03)); //di+Ext_CRTVCLK
- tempal=tempal&0x03F;
- }
- VCLKLen=GetVCLKLen(ROMAddr);
- tempal=tempal*VCLKLen;
- tempal=tempal+(*((USHORT *)(ROMAddr+0x208))); // VCLKData
- return ((USHORT)tempal);
-}
-
-USHORT GetColorTh(ULONG ROMAddr)
-{
- USHORT temp;
- temp=GetColorDepth(ROMAddr);
- temp=temp>>1;
- if(temp==0) temp++;
- return temp;
-}
-
-USHORT GetMCLK(ULONG ROMAddr)
-{
- USHORT tempmclkptr;
- USHORT tempmclk;
- tempmclkptr=GetMCLKPtr(ROMAddr);
- tempmclk=*((USHORT *)(ROMAddr+tempmclkptr+0x03)); //di+3
- return tempmclk;
-}
-
-USHORT GetMCLKPtr(ULONG ROMAddr)
-{
- USHORT tempdi;
- USHORT tempdramtype,tempax;
-
- tempdi=*((USHORT *)(ROMAddr+0x20C)); // MCLKData
- tempdramtype=GetDRAMType(ROMAddr);
- tempax=5*tempdramtype;
- tempdi=tempdi+tempax;
- return (tempdi);
-}
-
-USHORT GetDRAMType(ULONG ROMAddr)
-{
- USHORT tsoftsetting,temp3;
-
- tsoftsetting=*((UCHAR *)(ROMAddr+0x52));
- if(!(tsoftsetting&SoftDramType)){
- temp3=(UCHAR)GetReg1(P3c4,0x3A);
- tsoftsetting=temp3;
- }
- tsoftsetting=tsoftsetting&0x07;
- return(tsoftsetting);
-}
-
-static USHORT CalcDelay()
-{
- USHORT tempal,tempah,temp1,tempbx;
- USHORT ThTiming[8]={1,2,2,3,0,1,1,2};
- USHORT ThLowB[24]={81,4,72,6,88,8,120,12,
- 55,4,54,6,66,8,90,12,
- 42,4,45,6,55,8,75,12};
-
- tempah=(UCHAR)GetReg1(P3c4,0x18); //SR_18
- tempah=tempah&0x62;
- tempah=tempah>>1;
- tempal=tempah;
- tempah=tempah>>3;
- tempal=tempal|tempah;
- tempal=tempal&0x07;
-
- temp1=ThTiming[tempal]; //temp1->cl
-
- tempbx=(UCHAR)GetReg1(P3c4,0x16); //SR_16
- tempbx=tempbx>>6;
- tempah=(UCHAR)GetReg1(P3c4,0x14); //SR_14
- tempah=((tempah>>4)&0x0C);
- tempbx=((tempbx|tempah)<<1);
-
- tempal=ThLowB[tempbx+1]*temp1;
- tempbx=ThLowB[tempbx];
- tempbx=tempal+tempbx;
-
- return(tempbx);
-}
-
-USHORT GetVCLK2Ptr(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT tempal;
- USHORT LCDXlat1VCLK[4]={VCLK65,VCLK65,VCLK65,VCLK65};
- USHORT LCDXlat2VCLK[4]={VCLK108_2,VCLK108_2,VCLK108_2,VCLK108_2};
-
- if(ModeNo<=0x13){
- tempal=*((UCHAR *)(ROMAddr+ModeIDOffset+0x04)); // si+St_CRT2CRTC
- }else{
- tempal=*((UCHAR *)(ROMAddr+REFIndex+0x04)); // di+Ext_CRT2CRTC
- }
- tempal=tempal>>6;
- if(LCDResInfo!=Panel1024x768){
- tempal=LCDXlat2VCLK[tempal];
- }else{
- tempal=LCDXlat1VCLK[tempal];
- }
-
- if(VBInfo&SetCRT2ToLCD){
- tempal=tempal;
- }else if(VBInfo&SetCRT2ToTV){
- if(SetFlag&RPLLDIV2XO){
- tempal=TVVCLKDIV2;
- }else{
- tempal=TVVCLK;
- }
- }else{
- tempal=(UCHAR)GetReg2((USHORT)(P3ca+0x02)); // Port 3cch
- tempal=((tempal>>2)&0x03);
- if(ModeNo>0x13){
- tempal=*((UCHAR *)(ROMAddr+REFIndex+0x03)); //di+Ext_CRTVCLK
- tempal=tempal&0x03F;
- }
- }
- VCLKLen=GetVCLKLen(ROMAddr);
- tempal=tempal*VCLKLen;
- tempal=tempal+(*((USHORT *)(ROMAddr+0x208))); // VCLKData
- return ((USHORT)tempal);
-}
-
-USHORT GetVCLKLen(ULONG ROMAddr)
-{
- USHORT VCLKDataStart,vclklabel,temp;
- VCLKDataStart=*((USHORT *)(ROMAddr+0x208));
- for(temp=0;;temp++){
- vclklabel=*((USHORT *)(ROMAddr+VCLKDataStart+temp));
- if(vclklabel==VCLKStartFreq){
- temp=temp+2;
- return(temp);
- }
- }
- return(0);
-}
-
-
-VOID SetCRT2Sync(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT temp1,tempah=0;
- USHORT temp;
- USHORT Part1Port;
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
- if(IF_DEF_LVDS==1){ //LVDS
- if(VBInfo&SetCRT2ToLCD){
- tempah=LCDInfo;
- if(!(tempah&LCDSync)){
- temp=*((USHORT *)(ROMAddr+REFIndex)); //di+Ext_InfoFlag
- tempah=(temp>>8)&0x0C0;
- }else{
- tempah=tempah&0x0C0;
- }
- }
- }else{
- temp=*((USHORT *)(ROMAddr+REFIndex)); //di+Ext_InfoFlag
- tempah=(temp>>8)&0x0C0;
- }
- temp1=(UCHAR)GetReg1(Part1Port,0x19); //part1port index 02
- temp1=(temp1&(~0x0C0))|tempah;
- SetReg1(Part1Port,0x19,temp1);
-}
-
-VOID GetCRT1Ptr(ULONG ROMAddr)
-{
- USHORT temprefcrt1;
- USHORT temp;
- temp=*((UCHAR *)(ROMAddr+REFIndex+0x02)); //di+Ext_CRT1CRTC
- temp=temp&0x03F;
- temp=temp*CRT1Len;
- temprefcrt1=*((USHORT *)(ROMAddr+0x204)); // Get CRT1Table
- REFIndex=temprefcrt1+temp; // di->CRT1Table+Ext_CRT1CRTC*CRT1Len
-}
-
-USHORT GetVGAHT2()
-{
- long int temp1,temp2;
-
- temp1=(VGAVT-VGAVDE)*RVBHCMAX;
- temp1=temp1&0x0FFFF;
- temp2=(VT-VDE)*RVBHCFACT;
- temp2=temp2&0x0FFFF;
- temp2=temp2*HT;
- temp2=temp2/temp1;
- return((USHORT)temp2);
-}
-
-VOID SetGroup2(USHORT BaseAddr,ULONG ROMAddr)
-{
- USHORT tempah,tempbl,tempbh,tempcl,i,j,tempcx,pushcx,tempbx,tempax;
- USHORT tempmodeflag,tempflowflag;
- UCHAR *temp1;
- USHORT *temp2;
- USHORT pushbx;
- USHORT Part2Port;
- long int longtemp;
-
- Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10;
-
- tempcx=VBInfo;
- tempah=VBInfo&0x0FF;
- tempbl=VBInfo&0x0FF;
- tempbh=VBInfo&0x0FF;
- tempbx=(tempbl&0xFF)|(tempbh<<8);
- tempbl=tempbl&0x10;
- tempbh=(tempbh&0x04)<<1;
- tempah=(tempah&0x08)>>1;
- tempah=tempah|tempbh;
- tempbl=tempbl>>3;
- tempah=tempah|tempbl;
- tempah=tempah^0x0C;
-
- if(VBInfo&SetPALTV){
- temp1=(UCHAR *)(ROMAddr+0x0F1); //PALPhase
- temp2=PALTiming;
- }else{
- tempah=tempah|0x10;
- temp1=(UCHAR *)(ROMAddr+0x0ED); //NTSCPhase
- temp2=NTSCTiming;
- }
-
- SetReg1(Part2Port,0x0,tempah);
- for(i=0x31;i<=0x34;i++,temp1++){
- SetReg1(Part2Port,i,*(UCHAR *)temp1);
- }
- for(i=0x01,j=0;i<=0x2D;i++,j++){
- SetReg1(Part2Port,i,temp2[j]);
- }
- for(i=0x39;i<=0x45;i++,j++){
- SetReg1(Part2Port,i,temp2[j]); //di->temp2[j]
- }
-
- tempah=GetReg1(Part2Port,0x0A);
- tempah=tempah|NewFlickerMode;
- SetReg1(Part2Port,0x0A,tempah);
-
- SetReg1(Part2Port,0x35,RY1COE);
- SetReg1(Part2Port,0x36,RY2COE);
- SetReg1(Part2Port,0x37,RY3COE);
- SetReg1(Part2Port,0x38,RY4COE);
-
- tempcx=HT-1;
- tempah=tempcx&0xFF;
- SetReg1(Part2Port,0x1B,tempah);
- tempah=(tempcx&0xFF00)>>8;
- SetRegANDOR(Part2Port,0x1D,~0x0F,(UCHAR)tempah);
-
- tempcx=HT>>1;
- pushcx=tempcx;
-
- tempcx=tempcx+7;
- tempah=(tempcx&0xFF);
- tempah=(tempah<<4)&0xFF;
- SetRegANDOR(Part2Port,0x22,~0x0F0,tempah);
-
-
- tempbx=temp2[j];
- tempbx=tempbx+tempcx;
- tempah=tempbx&0xFF;
- SetReg1(Part2Port,0x24,tempah);
- tempah=(tempbx&0xFF00)>>8;
- tempah=(tempah<<4)&0xFF;
- SetRegANDOR(Part2Port,0x25,~0x0F0,tempah);
-
- tempbx=tempbx+8;
-
- tempah=((tempbx&0xFF)<<4)&0xFF;
- SetRegANDOR(Part2Port,0x29,~0x0F0,tempah);
-
- tempcx=tempcx+temp2[++j];
- tempah=tempcx&0xFF;
- SetReg1(Part2Port,0x27,tempah);
- tempah=(((tempcx&0xFF00)>>8)<<4)&0xFF;
- SetRegANDOR(Part2Port,0x28,~0x0F0,tempah);
-
- tempcx=tempcx+8;
-
- tempah=tempcx&0xFF;
- tempah=(tempah<<4)&0xFF;
- SetRegANDOR(Part2Port,0x2A,~0x0F0,tempah);
-
- tempcx=pushcx; //pop cx
- tempcx=tempcx-temp2[++j];
- tempah=tempcx&0xFF;
- tempah=(tempah<<4)&0xFF;
- SetRegANDOR(Part2Port,0x2D,~0x0F0,tempah);
-
- tempcx=tempcx-11;
- if(!(VBInfo&SetCRT2ToTV)){
- tempax=GetVGAHT2();
- tempcx=tempax-1;
- }
- tempah=tempcx&0xFF;
- SetReg1(Part2Port,0x2E,tempah);
-
- tempbx=VDE;
- if(VGAVDE==360){
- tempbx=746;
- }
- if(VGAVDE==375){
- tempbx=746;
- }
- if(VGAVDE==405){
- tempbx=853;
- }
- if((VBInfo&SetCRT2ToTV)){
- tempbx=tempbx>>1;
- }
-
- tempbx=tempbx-2;
- tempah=tempbx&0xFF;
- SetReg1(Part2Port,0x2F,tempah);
-
- tempah=(tempcx&0xFF00)>>8;
- tempbh=(tempbx&0xFF00)>>8;
- tempbh=(tempbh<<6)&0xFF;
- tempah=tempah|tempbh;
- //assuming <<ifndef>> hivisiontv
- tempah=tempah|0x10;
- if(!(VBInfo&SetCRT2ToSVIDEO)){
- tempah=tempah|0x20;
- }
-
- SetReg1(Part2Port,0x30,tempah);
-
- tempbh=0;
- tempbx=tempbx&0xFF;
-
- tempmodeflag=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- tempflowflag=0;
- if(!(tempmodeflag&HalfDCLK)){
- tempcx=VGAHDE;
- if(tempcx>=HDE){
- tempbh=tempbh|0x20;
- tempbx=(tempbh<<8)|(tempbx&0xFF);
- tempah=0;
- }
- }
- tempcx=0x0101;
- if(!(tempbh&0x20)){
- if(tempmodeflag&HalfDCLK){
- tempcl=((tempcx&0xFF)<<1)&0xFF;
- tempcx=(tempcx&0xFF00)|tempcl;
- }
- pushbx=tempbx;
- tempax=VGAHDE;
- tempbx=(tempcx&0xFF00)>>8;
- longtemp=tempax*tempbx;
- tempcx=tempcx&0xFF;
- longtemp=longtemp/tempcx;
- longtemp=longtemp*8*1024;
- tempax=(USHORT)((longtemp)/HDE);
- if(tempax*HDE<longtemp){
- tempax=tempax+1;
- }else{
- tempax=tempax;
- }
- tempbx=pushbx;
- tempah=((tempax&0xFF00)>>8)&0x01F;
- tempbh=tempbh|tempah;
- tempah=tempax&0xFF;
- }
-
- SetReg1(Part2Port,0x44,tempah);
- tempah=tempbh;
- SetRegANDOR(Part2Port,0x45,~0x03F,tempah);
-
- if(VBInfo&SetCRT2ToTV){
- return;
- }
-
- tempah=0x01;
- if(LCDResInfo==Panel1280x1024){
- if(ModeType==ModeEGA){
- if(VGAHDE>=1024){
- tempah=0x02;
- }
- }
- }
- SetReg1(Part2Port,0x0B,tempah);
-
- tempbx=HDE-1; //RHACTE=HDE-1
- tempah=tempbx&0xFF;
- SetReg1(Part2Port,0x2C,tempah);
- tempah=(tempbx&0xFF00)>>8;
- tempah=(tempah<<4)&0xFF;
- SetRegANDOR(Part2Port,0x2B,~0x0F0,tempah);
-
- tempbx=VDE-1; //RTVACTEO=(VDE-1)&0xFF
- tempah=tempbx&0xFF;
- SetReg1(Part2Port,0x03,tempah);
- tempah=((tempbx&0xFF00)>>8)&0x07;
- SetRegANDOR(Part2Port,0x0C,~0x07,tempah);
-
- tempcx=VT-1;
- tempah=tempcx&0xFF; //RVTVT=VT-1
- SetReg1(Part2Port,0x19,tempah);
- tempah=(tempcx&0xFF00)>>8;
- tempah=(tempah<<5)&0xFF;
- if(LCDInfo&LCDRGB18Bit){
- tempah=tempah|0x10;
- }
- SetReg1(Part2Port,0x1A,tempah);
-
- tempcx++;
- if(LCDResInfo==Panel1024x768){
- tempbx=768;
- }else{
- tempbx=1024;
- }
-
- if(tempbx==VDE){
- tempax=1;
- }else{
- tempax=tempbx;
- tempax=(tempax-VDE)>>1;
- }
- tempcx=tempcx-tempax; //lcdvdes
- tempbx=tempbx-tempax; //lcdvdee
-
- tempah=tempcx&0xFF; //RVEQ1EQ=lcdvdes
- SetReg1(Part2Port,0x05,tempah);
- tempah=tempbx&0xFF; //RVEQ2EQ=lcdvdee
- SetReg1(Part2Port,0x06,tempah);
-
- tempah=(tempbx&0xFF00)>>8;
- tempah=(tempah<<3)&0xFF;
- tempah=tempah|((tempcx&0xFF00)>>8);
- //RTVACTSE=(lcdvdes&0x700>>8)+(lcdvdee&0x700>>5);
- SetReg1(Part2Port,0x02,tempah);
-
-
- tempcx=(VT-VDE)>>4; //(VT-VDE)>>4
- tempbx=(VT+VDE)>>1;
- tempah=tempbx&0xFF; //RTVACTEE=lcdvrs
- SetReg1(Part2Port,0x04,tempah);
-
- tempah=(tempbx&0xFF00)>>8;
- tempah=(tempah<<4)&0xFF;
- tempbx=tempbx+tempcx+1;
- tempbl=(tempbx&0x0F);
- tempah=tempah|tempbl; //RTVACTSO=lcdvrs&0x700>>4+lcdvre
- SetReg1(Part2Port,0x01,tempah);
-
- tempah=GetReg1(Part2Port,0x09);
- tempah=tempah&0xF0;
- SetReg1(Part2Port,0x09,tempah);
-
- tempah=GetReg1(Part2Port,0x0A);
- tempah=tempah&0xF0;
- SetReg1(Part2Port,0x0A,tempah);
-
- tempcx=(HT-HDE)>>2; //(HT-HDE)>>2
- tempbx=(HDE+7); //lcdhdee
- tempah=tempbx&0xFF; //RHEQPLE=lcdhdee
- SetReg1(Part2Port,0x23,tempah);
- tempah=(tempbx&0xFF00)>>8;
- SetRegANDOR(Part2Port,0x25,~0x0F,tempah);
-
- SetReg1(Part2Port,0x1F,0x07); //RHBLKE=lcdhdes
- tempah=GetReg1(Part2Port,0x20);
- tempah=tempah&0x0F;
- SetReg1(Part2Port,0x20,tempah);
-
- tempbx=tempbx+tempcx;
- tempah=tempbx&0xFF; //RHBURSTS=lcdhrs
- SetReg1(Part2Port,0x1C,tempah);
- tempah=(tempbx&0xFF00)>>8;
- tempah=(tempah<<4)&0xFF;
- SetRegANDOR(Part2Port,0x1D,~0x0F0,tempah);
-
- tempbx=tempbx+tempcx;
- tempah=tempbx&0xFF; //RHSYEXP2S=lcdhre
- SetReg1(Part2Port,0x21,tempah);
-
- tempah=GetReg1(Part2Port,0x17);
- tempah=tempah&0xFB;
- SetReg1(Part2Port,0x17,tempah);
-
- tempah=GetReg1(Part2Port,0x18);
- tempah=tempah&0xDF;
- SetReg1(Part2Port,0x18,tempah);
- return;
-}
-
-VOID SetGroup3(USHORT BaseAddr)
-{
- USHORT i;
- USHORT *tempdi;
- USHORT Part3Port;
- Part3Port=BaseAddr+IND_SIS_CRT2_PORT_12;
- if(VBInfo&SetPALTV){
- tempdi=PALGroup3Data;
- }else{
- tempdi=NTSCGroup3Data;
- }
-
- for(i=0;i<=0x3E;i++){
- SetReg1(Part3Port,i,tempdi[i]);
- }
- return;
-}
-
-VOID SetGroup4(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT Part4Port;
- USHORT tempax,tempah,tempcx,tempbx,tempbh,tempch,tempmodeflag;
- long int tempebx,tempeax,templong;
- Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14;
-
- tempax=0x0c;
- if(VBInfo&SetCRT2ToTV){
- if(VBInfo&SetInSlaveMode){
- if(!(SetFlag&TVSimuMode)){
- SetFlag=SetFlag|RPLLDIV2XO;
- tempax=tempax|0x04000;
- }
- }else{
- SetFlag=SetFlag|RPLLDIV2XO;
- tempax=tempax|0x04000;
- }
- }
-
- if(LCDResInfo!=Panel1024x768){
- tempax=tempax|0x08000;
- }
- tempah=(tempax&0xFF00)>>8;
- SetReg1(Part4Port,0x0C,tempah);
-
- tempah=RVBHCFACT;
- SetReg1(Part4Port,0x13,tempah);
-
- tempbx=RVBHCMAX;
- tempah=tempbx&0xFF;
- SetReg1(Part4Port,0x14,tempah);
- tempbh=(((tempbx&0xFF00)>>8)<<7)&0xFF;
-
- tempcx=VGAHT-1;
- tempah=tempcx&0xFF;
- SetReg1(Part4Port,0x16,tempah);
- tempch=(((tempcx&0xFF00)>>8)<<3)&0xFF;
- tempbh=tempbh|tempch;
-
- tempcx=VGAVT-1;
- if(!(VBInfo&SetCRT2ToTV)){
- tempcx=tempcx-5;
- }
- tempah=tempcx&0xFF;
- SetReg1(Part4Port,0x17,tempah);
- tempbh=tempbh|((tempcx&0xFF00)>>8);
- tempah=tempbh;
- SetReg1(Part4Port,0x15,tempah);
-
- tempcx=VBInfo;
- tempbx=VGAHDE;
- tempmodeflag=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- if(tempmodeflag&HalfDCLK){
- tempbx=tempbx>>1;
- }
-
- if(VBInfo&SetCRT2ToLCD){
- tempah=0;
- if(tempbx>800){
- tempah=0x60;
- }
- }else{
- tempah=0x080;
- }
- if(LCDResInfo!=Panel1280x1024){
- tempah=tempah|0x0A;
- }
-
- SetRegANDOR(Part4Port,0x0E,~0xEF,tempah);
-
- tempebx=VDE;
-
- tempcx=RVBHRS;
- tempah=tempcx&0xFF;
- SetReg1(Part4Port,0x18,tempah);
-
- tempeax=VGAVDE;
- tempcx=tempcx|0x04000;
- tempeax=tempeax-tempebx;
- if(tempeax<0){
- tempcx=tempcx^(0x04000);
- tempeax=VGAVDE;
- }
-
- templong=(tempeax*256*1024)/tempebx;
- if(tempeax*256*1024-templong*tempebx>0){
- tempebx=templong+1;
- }else{
- tempebx=templong;
- }
-
-
- tempah=(USHORT)(tempebx&0xFF);
- SetReg1(Part4Port,0x1B,tempah);
- tempah=(USHORT)((tempebx&0xFF00)>>8);
- SetReg1(Part4Port,0x1A,tempah);
- tempebx=tempebx>>16;
- tempah=(USHORT)(tempebx&0xFF);
- tempah=(tempah<<4)&0xFF;
- tempah=tempah|((tempcx&0xFF00)>>8);
- SetReg1(Part4Port,0x19,tempah);
-
- SetCRT2VCLK(BaseAddr,ROMAddr,ModeNo);
-}
-
-VOID SetCRT2VCLK(USHORT BaseAddr,ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT vclk2ptr;
- USHORT tempah,temp1;
- USHORT Part4Port;
- Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14;
- vclk2ptr=GetVCLK2Ptr(ROMAddr,ModeNo);
- SetReg1(Part4Port,0x0A,0x01);
- tempah=*((UCHAR *)(ROMAddr+vclk2ptr+0x01)); //di+1
- SetReg1(Part4Port,0x0B,tempah);
- tempah=*((UCHAR *)(ROMAddr+vclk2ptr+0x00)); //di
- SetReg1(Part4Port,0x0A,tempah);
- SetReg1(Part4Port,0x12,0x00);
- tempah=0x08;
- if(VBInfo&SetCRT2ToRAMDAC){
- tempah=tempah|0x020;
- }
- temp1=GetReg1(Part4Port,0x12);
- tempah=tempah|temp1;
- SetReg1(Part4Port,0x12,tempah);
-}
-
-VOID SetGroup5(USHORT BaseAddr,ULONG ROMAddr)
-{
- USHORT Part5Port;
- USHORT Pindex,Pdata;
- Part5Port=BaseAddr+IND_SIS_CRT2_PORT_14+2;
- Pindex=Part5Port;
- Pdata=Part5Port+1;
- if(ModeType==ModeVGA){
- if(!(VBInfo&(SetInSlaveMode|LoadDACFlag|CRT2DisplayFlag))){
- EnableCRT2();
- LoadDAC2(ROMAddr,Part5Port);
- }
- }
- return;
-}
-
-VOID EnableCRT2()
-{
- USHORT temp1;
- temp1=GetReg1(P3c4,0x1E);
- temp1=temp1|0x20;
- SetReg1(P3c4,0x1E,temp1); //SR 1E
-}
-
-VOID LoadDAC2(ULONG ROMAddr,USHORT Part5Port)
-{
- USHORT data,data2;
- USHORT time,i,j,k;
- USHORT m,n,o;
- USHORT si,di,bx,dl;
- USHORT al,ah,dh;
- USHORT *table=VGA_DAC;
- USHORT Pindex,Pdata;
- Pindex=Part5Port;
- Pdata=Part5Port+1;
- data=*((USHORT *)(ROMAddr+ModeIDOffset+0x01));
- data=data&DACInfoFlag;
- time=64;
- if(data==0x00) table=MDA_DAC;
- if(data==0x08) table=CGA_DAC;
- if(data==0x10) table=EGA_DAC;
- if(data==0x18) {
- time=256;
- table=VGA_DAC;
- }
- if(time==256) j=16;
- else j=time;
-
- //SetReg3(P3c6,0xFF);
- SetReg3(Pindex,0x00);
-
- for(i=0;i<j;i++) {
- data=table[i];
- for(k=0;k<3;k++) {
- data2=0;
- if(data&0x01) data2=0x2A;
- if(data&0x02) data2=data2+0x15;
- SetReg3(Pdata,data2);
- data=data>>2;
- }
- }
-
- if(time==256) {
- for(i=16;i<32;i++) {
- data=table[i];
- for(k=0;k<3;k++) SetReg3(Pdata,data);
- }
- si=32;
- for(m=0;m<9;m++) {
- di=si;
- bx=si+0x04;
- dl=0;
- for(n=0;n<3;n++) {
- for(o=0;o<5;o++) {
- dh=table[si];
- ah=table[di];
- al=table[bx];
- si++;
- WriteDAC2(Pdata,dl,ah,al,dh);
- } // for 5
- si=si-2;
- for(o=0;o<3;o++) {
- dh=table[bx];
- ah=table[di];
- al=table[si];
- si--;
- WriteDAC2(Pdata,dl,ah,al,dh);
- } // for 3
- dl++;
- } // for 3
- si=si+5;
- } // for 9
- }
-}
-
-VOID WriteDAC2(USHORT Pdata,USHORT dl, USHORT ah, USHORT al, USHORT dh)
-{
- USHORT temp;
- USHORT bh,bl;
-
- bh=ah;
- bl=al;
- if(dl!=0) {
- temp=bh;
- bh=dh;
- dh=temp;
- if(dl==1) {
- temp=bl;
- bl=dh;
- dh=temp;
- }
- else {
- temp=bl;
- bl=bh;
- bh=temp;
- }
- }
- SetReg3(Pdata,(USHORT)dh);
- SetReg3(Pdata,(USHORT)bh);
- SetReg3(Pdata,(USHORT)bl);
-}
-
-VOID LockCRT2(USHORT BaseAddr)
-{
- USHORT Part1Port;
- USHORT Part4Port;
- USHORT temp1;
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
- Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14;
- temp1=GetReg1(Part1Port,0x24);
- temp1=temp1&0xFE;
- SetReg1(Part1Port,0x24,temp1);
-}
-
-VOID SetLockRegs()
-{
- USHORT temp1;
-
- if((VBInfo&SetInSlaveMode)&&(!(VBInfo&SetCRT2ToRAMDAC))){
- VBLongWait();
- temp1=GetReg1(P3c4,0x32);
- temp1=temp1|0x20;
- SetReg1(P3c4,0x32,temp1);
- VBLongWait();
- }
-}
-
-VOID EnableBridge(USHORT BaseAddr)
-{
- USHORT part2_02,part2_05;
- USHORT Part2Port,Part1Port;
- Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10;
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
-
- if(IF_DEF_LVDS==0){
- part2_02=(UCHAR)GetReg1(Part2Port,0x02);
- part2_05=(UCHAR)GetReg1(Part2Port,0x05);
- SetReg1(Part2Port,0x02,0x38);
- SetReg1(Part2Port,0x05,0xFF);
- LongWait();
- SetRegANDOR(Part2Port,0x00,~0x0E0,0x020);
- WaitVBRetrace(BaseAddr);
- SetReg1(Part2Port,0x02,part2_02);
- SetReg1(Part2Port,0x05,part2_05);
- }else{
- EnableCRT2();
- UnLockCRT2(BaseAddr);
- SetRegANDOR(Part1Port,0x02,~0x040,0x0);
- }
-}
-
-USHORT GetLockInfo(USHORT pattern)
-{
- USHORT temp1;
- temp1=GetReg1(P3d4,0x36);
- return(temp1&pattern);
-}
-
-VOID GetVBInfo(USHORT BaseAddr,ULONG ROMAddr)
-{
- USHORT flag1,tempbx,tempbl,tempbh,tempah;
-
- SetFlag=0;
- tempbx=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- tempbl=tempbx&ModeInfoFlag;
- ModeType=tempbl;
- tempbx=0;
- flag1=GetReg1(P3c4,0x38); //call BridgeisOn
- if(!(flag1&0x20)){
- VBInfo=CRT2DisplayFlag;
- return;
- }
- tempbl=GetReg1(P3d4,0x30);
- tempbh=GetReg1(P3d4,0x31);
- if(!(tempbl&0x07C)){
- VBInfo=CRT2DisplayFlag;
- return;
- }
- if(IF_DEF_LVDS==1){ //for LVDS
- if(!(tempbl&SetCRT2ToLCD)){
- VBInfo=CRT2DisplayFlag;
- return;
- }
- }
- if(IF_DEF_LVDS==0){ //for 301
- if(tempbl&SetCRT2ToRAMDAC){
- tempbl=tempbl&(SetCRT2ToRAMDAC|SwitchToCRT2|SetSimuScanMode);
- }else if(tempbl&SetCRT2ToLCD){
- tempbl=tempbl&(SetCRT2ToLCD|SwitchToCRT2|SetSimuScanMode);
- }else if(tempbl&SetCRT2ToSCART){
- tempbl=tempbl&(SetCRT2ToSCART|SwitchToCRT2|SetSimuScanMode);
- }else if(tempbl&SetCRT2ToHiVisionTV){
- tempbl=tempbl&(SetCRT2ToHiVisionTV|SwitchToCRT2|SetSimuScanMode);
- }
- }else{ //for LVDS
- if(tempbl&SetCRT2ToLCD){
- tempbl=tempbl&(SetCRT2ToLCD|SwitchToCRT2|SetSimuScanMode);
- }
- }
- tempah=GetReg1(P3d4,0x31);
- if(tempah&(CRT2DisplayFlag>>8)){
- if(!(tempbl&(SwitchToCRT2|SetSimuScanMode))){
- tempbx=SetSimuScanMode|CRT2DisplayFlag;
- tempbh=((tempbx&0xFF00)>>8);
- tempbl=tempbx&0xFF;
- }
- }
- if(!(tempbh&(DriverMode>>8))){
- tempbl=tempbl|SetSimuScanMode;
- }
- VBInfo=tempbl|(tempbh<<8);
- if(!(VBInfo&SetSimuScanMode)){
- if(!(VBInfo&SwitchToCRT2)){
- if(BridgeIsEnable(BaseAddr)){
- if(BridgeInSlave()){
- VBInfo=VBInfo|SetSimuScanMode;
- }
- }
- }
- }
- if(!((VBInfo&(SetSimuScanMode|SwitchToCRT2)))){
- return;
- }
- if(!(VBInfo&DriverMode)){
- VBInfo=VBInfo|SetInSlaveMode;
- if((VBInfo&SetCRT2ToTV)&&(!(VBInfo&SetNotSimuTVMode))){
- SetFlag=SetFlag|TVSimuMode;
- }
- return;
- }
- flag1=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- if(!(flag1&(CRT2Mode|CRT2DisplayFlag))){
- VBInfo=VBInfo|SetInSlaveMode;
- if((VBInfo&SetCRT2ToTV)&&(!(VBInfo&SetNotSimuTVMode))){
- SetFlag=SetFlag|TVSimuMode;
- }
- }
-}
-
-BOOLEAN BridgeIsEnable(USHORT BaseAddr)
-{
- USHORT flag1;
- USHORT Part1Port;
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
-
- if(IF_DEF_LVDS==1){
- return 1;
- }
- flag1=GetReg1(P3c4,0x38); //call BridgeisOn
- if(!(flag1&0x20)){ return 0;}
- flag1=GetReg1(Part1Port,0x0);
- if(flag1&0x0a0){
- return 1;
- }else{
- return 0;
- }
-}
-
-BOOLEAN BridgeInSlave()
-{
- USHORT flag1;
- flag1=GetReg1(P3d4,0x31);
- if(flag1&(SetInSlaveMode>>8)){
- return 1;
- }else{
- return 0;
- }
-}
-
-BOOLEAN GetLCDResInfo(ULONG ROMAddr,USHORT P3d4)
-{
- USHORT tempah,tempbh,tempflag;
-
- tempah=(UCHAR)GetReg1(P3d4,0x36);
- tempbh=tempah;
- tempah=tempah&0x0F;
- if(tempah>Panel1280x1024) tempah=Panel1024x768;
- LCDResInfo=tempah;
- tempbh=tempbh>>4;
- LCDTypeInfo=tempbh;
-
- tempah=(UCHAR)GetReg1(P3d4,0x37);
- LCDInfo=tempah;
- if(IF_DEF_TRUMPION){
- LCDInfo=LCDInfo&(~LCDNonExpanding);
- }
- if(IF_DEF_LVDS==1){
- tempflag=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- if(tempflag&HalfDCLK){
- if(IF_DEF_TRUMPION==0){
- if(!(LCDInfo&LCDNonExpanding)){
- if(LCDResInfo==Panel1024x768){
- tempflag=*((UCHAR *)(ROMAddr+ModeIDOffset+0x09)); //si+Ext_ResInfo
- if(tempflag==4){ //512x384
- SetFlag=SetFlag|EnableLVDSDDA;
- }
- }else{
- if(LCDResInfo==Panel800x600){
- tempflag=*((UCHAR *)(ROMAddr+ModeIDOffset+0x09)); //si+Ext_ResInfo
- if(tempflag==3){ //400x300
- SetFlag=SetFlag|EnableLVDSDDA;
- }
- }
- }
- }else{
- SetFlag=SetFlag|EnableLVDSDDA;
- }
- }else{
- SetFlag=SetFlag|EnableLVDSDDA;
- }
- }
- }
-
- if(!(VBInfo&SetCRT2ToLCD)){
- return 1;
- }
- if(!(VBInfo&(SetSimuScanMode|SwitchToCRT2))){
- return 1;
- }
- if(VBInfo&SetInSlaveMode){
- if(VBInfo&SetNotSimuTVMode){
- SetFlag=SetFlag|LCDVESATiming;
- }
- }else{
- SetFlag=SetFlag|LCDVESATiming;
- }
- return 1;
-}
-
-VOID PresetScratchregister(USHORT P3d4,PHW_DEVICE_EXTENSION HwDeviceExtension)
-{
- SetReg1(P3d4,0x37,0x00);
-}
-
-BOOLEAN GetLCDDDCInfo(PHW_DEVICE_EXTENSION HwDeviceExtension)
-{
- USHORT tempah;
- tempah=(HwDeviceExtension->usLCDType);// set in sisv.c
- //0:no lcd 1:1024x768 2:1280x1024
- if(tempah>0) tempah++; // usLCDType:
- // 0:no lcd 1:800x600 2:1024x768 3:1280x1024
- SetReg1(P3d4,0x36,tempah);//cr 36 0:no LCD 1:800x600 2:1024x768 3:1280x1024
- if(tempah>0) return 1;
- else return 0;
-}
-
-VOID SetTVSystem(PHW_DEVICE_EXTENSION HwDeviceExtension,ULONG ROMAddr)
-{
- USHORT tempah,temp;
-
- if(IF_DEF_LVDS==0){ //301
- if(PRIMARY_VGA==1){ //primary vga
- if(HwDeviceExtension->jChipID >= SIS_Trojan){
- tempah=GetReg1(P3c4,0x17);
- if(tempah&ModeSwitchStatus){
- tempah=GetReg1(P3c4,0x16);
- tempah=tempah&ActivePAL;
- tempah=tempah>>ActivePALShift;
- }else{
- temp=*((UCHAR *)(ROMAddr+SoftSettingAddr));
- if(temp&SoftTVType){
- tempah=*((UCHAR *)(ROMAddr+ModeSettingAddr));
- }else{
- tempah=GetReg1(P3c4,0x38); //SR 38
- }
- }
- }else{
- temp=*((UCHAR *)(ROMAddr+SoftSettingAddr));
- if(temp&SoftTVType){
- tempah=*((UCHAR *)(ROMAddr+ModeSettingAddr));
- }else{
- tempah=GetReg1(P3c4,0x38); //SR 38
- }
- }
- tempah=tempah&0x01; //get SR 38 D0 TV Type Selection
- //0:NTSC 1:PAL
- SetRegANDOR(P3d4,0x31,~0x01,tempah);//set CR 31 D0= SR 38 D0
- }
- else{ //Secondary
- tempah=GetReg1(P3c4,0x38); //SR 38
- tempah=tempah&0x01; //get SR 38 D0 TV Type Selection
- //0:NTSC 1:PAL
- SetRegANDOR(P3d4,0x31,~0x01,tempah);//set CR 31 D0= SR 38 D0
- }
- return;
- }else{ //LVDS
- tempah=GetReg1(P3c4,0x16); //SR 16
- tempah=tempah&ActiveNonExpanding;
- tempah=tempah>>ActiveNonExpandingShift;
- tempah=tempah&0x01;
- tempah=tempah<<LCDNonExpandingShift;
- SetRegANDOR(P3d4,0x37,~LCDNonExpanding,tempah);
- return;
- }
-}
-
-BOOLEAN GetSenseStatus(PHW_DEVICE_EXTENSION HwDeviceExtension,USHORT BaseAddr,ULONG ROMAddr)
-{
- USHORT flag1,tempbx,tempal,tempah,tempcx,i;
- USHORT Part2Port,Part4Port;
- USHORT RGBSenseData,YCSenseData,VideoSenseData;
- USHORT P2reg0,SenseModeNo,OutputSelect;
- Part2Port=BaseAddr+IND_SIS_CRT2_PORT_10;
- Part4Port=BaseAddr+IND_SIS_CRT2_PORT_14;
- RGBSenseData=*((USHORT *)(ROMAddr+0xF8)); //0:F8 in rompost.asm
- YCSenseData=*((USHORT *)(ROMAddr+0xFA)); //0:FA in rompost.asm
- VideoSenseData=*((USHORT *)(ROMAddr+0xFC)); //0:FC in rompost.asm
-
- if(IF_DEF_LVDS==1){
- GetPanelID();
- tempah=LCDSense;
- SetRegANDOR(P3d4,0x32,~0x5F,tempah); //Set CR 32
- return 0;
- }
-
- flag1=GetReg1(P3c4,0x38); //call BridgeisOn
- if(!(flag1&0x20)){ return 0;}
- P2reg0=GetReg1(Part2Port,0x00); //save Part2 Reg index 0
-
- if(!(BridgeIsEnable(BaseAddr))){
- SenseModeNo=0x2E;
- ModeType=ModeVGA;
- VBInfo=SetCRT2ToRAMDAC;
- SetFlag=0;
- SetCRT2Group(BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension);
- //here perform I/O delay ,read SR 05
- for(i=0;i<0x7FFF;i++){
- flag1=GetReg1(P3c4,0x05);
- }
- }
-
- SetReg1(Part2Port,0x00,0x1C); //Set part2 index 0= 0x1C
- tempah=0;
-
- OutputSelect=*((UCHAR *)(ROMAddr+0xFE)); //OutputSelect 0:FE in Rompost.asm
- if(OutputSelect&SetSCARTOutput){
- tempal=SCARTSense;
- }else{
- tempal=Monitor2Sense;
- }
- tempbx=RGBSenseData;
- tempcx=0x0E08;
- if(Sense(Part4Port,tempbx,tempcx)){
- if(Sense(Part4Port,tempbx,tempcx)){
- tempah=tempah|tempal;
- }
- }
- tempbx=YCSenseData;
- tempcx=0x0604;
- if(Sense(Part4Port,tempbx,tempcx)){
- if(Sense(Part4Port,tempbx,tempcx)){
- tempah=tempah|SVIDEOSense;
- //Skipped lines about HiTVSense, assuming not HiTV
- }
- }
-
- //Assuming not HiTV ,below is of ifndef HiVisionTV
- if(OutputSelect&BoardTVType){
- tempbx=VideoSenseData;
- tempcx=0x0804;
- if(Sense(Part4Port,tempbx,tempcx)){
- if(Sense(Part4Port,tempbx,tempcx)){
- tempah=tempah|AVIDEOSense;
- }
- }
- }else{
- if(!(tempah&SVIDEOSense)){
- tempbx=VideoSenseData;
- tempcx=0x0804;
- if(Sense(Part4Port,tempbx,tempcx)){
- if(Sense(Part4Port,tempbx,tempcx)){
- tempah=tempah|AVIDEOSense;
- }
- }
- }
- }
- //end of ifndef HivisionTv
- if(SenseLCD(HwDeviceExtension,Part4Port,ROMAddr)){
- if(SenseLCD(HwDeviceExtension,Part4Port,ROMAddr)){
- tempah=tempah|LCDSense;
- }
- }
-
- tempbx=0;
- tempcx=0;
- Sense(Part4Port,tempbx,tempcx);
-
- SetRegANDOR(P3d4,0x32,~0x5F,tempah); //Set CR 32
- SetReg1(Part2Port,0x00,P2reg0); //recover Part2 reg index 0
-
- //here skipped lines about DisableCRT2Display
- return 0;
-}
-
-BOOLEAN Sense(USHORT Part4Port,USHORT inputbx,USHORT inputcx)
-{
- USHORT tempah,tempcl,tempch;
-
- tempah=inputbx&0xFF;
- SetReg1(Part4Port,0x11,tempah);//Part4 index 11
- tempah=(inputbx&0xFF00)>>8;
- tempcl=inputcx&0xFF;
- tempah=tempah|tempcl;
- SetRegANDOR(Part4Port,0x10,~0x1F,tempah);//Part4 index 10
-
- tempch=(inputcx&0xFF00)>>8;
- tempch=tempch&0x7F;
- //here skipped lines about call Delay
- tempah=GetReg1(Part4Port,0x03); //Part4 index 03
- tempah=tempah^(0x0E);
- tempah=tempah&tempch;
- if(tempah>0) return 1;
- else return 0;
-}
-
-BOOLEAN SenseLCD(PHW_DEVICE_EXTENSION HwDeviceExtension,USHORT Part4Port,ULONG ROMAddr)
-{
- USHORT SoftSetting;
- USHORT tempah;
- SoftSetting=*((UCHAR *)(ROMAddr+0x52));//0:52 in rompost.asm
- if(GetLCDDDCInfo(HwDeviceExtension)){
- return 1;
- }
- if(SoftSetting&HotPlugFunction){
- tempah=GetReg1(Part4Port,0x0F);
- tempah=tempah&0x3F;
- SetReg1(Part4Port,0x0F,tempah); //Part4 index 0F
- if(Sense(Part4Port,0x0,0x9010)){
- return 1;
- }else{
- return 0;
- }
- }else{
- return 0;
- }
-}
-#endif
-
-VOID SetRegANDOR(USHORT Port,USHORT Index,USHORT DataAND,USHORT DataOR)
-{
- USHORT temp1;
- temp1=GetReg1(Port,Index); //part1port index 02
- temp1=(temp1&(DataAND))|DataOR;
- SetReg1(Port,Index,temp1);
-}
-
-BOOLEAN DetectMonitor(PHW_DEVICE_EXTENSION HwDeviceExtension)
-{
- USHORT flag1 ;
- USHORT DAC_TEST_PARMS[3]={0x0F,0x0F,0x0F};
- USHORT DAC_CLR_PARMS[3]={0x00,0x00,0x00};
-
- flag1=GetReg1(P3c4,0x38); //call BridgeisOn
- if((flag1&0x20)){
- SetReg1(P3d4,0x30,0x41);
- }
-
- SiSSetMode(HwDeviceExtension,0x2E); //set mode to 0x2E instead of 0x3
-
- ClearDAC(P3c8);
- ClearALLBuffer(HwDeviceExtension);
-
- LongWait(); //wait vertical retrace
- LongWait();
-
- flag1=TestMonitorType(DAC_TEST_PARMS[0],DAC_TEST_PARMS[1],
- DAC_TEST_PARMS[2]);
- if(flag1==0){
- flag1=TestMonitorType(DAC_TEST_PARMS[0],DAC_TEST_PARMS[1],
- DAC_TEST_PARMS[2]);
- }
- if(flag1==1){
- SetRegANDOR(P3d4,0x32,~Monitor1Sense,Monitor1Sense);
- }else{
- SetRegANDOR(P3d4,0x32,~Monitor1Sense,0x0);
- }
- TestMonitorType(DAC_CLR_PARMS[0],DAC_CLR_PARMS[1],DAC_CLR_PARMS[2]);
-
- SetReg1(P3d4,0x34,0x4A); //Preset default CRT1 ModeNo =0x4A
- //which is used in SetCRT2FIFO()
- return 1;
-}
-
-BOOLEAN TestMonitorType(USHORT d1,USHORT d2,USHORT d3)
-{
- USHORT temp;
- SetReg3(P3c6,0xFF);
- SetReg3(P3c8,0x00);
- SetReg3(P3c9,d1);
- SetReg3(P3c9,d2);
- SetReg3(P3c9,d3);
- WaitDisplay(); //wait horizontal retrace
- temp=GetReg2(P3c2);
- if(temp&0x10) return 1;
- else return 0;
-}
-
-VOID WaitDisplay(void)
-{
- USHORT temp;
-
- for(temp=0;temp==0;){
- temp=GetReg2(P3da);
- temp=temp&0x01;
- }
- for(;temp==1;){
- temp=GetReg2(P3da);
- temp=temp&0x01;
- }
-}
-
-VOID LongWait(void)
-{
- USHORT temp;
-
- for(temp=1;temp>0;){
- temp=GetReg2(P3da);
- temp=temp&0x08;
- }
- for(;temp==0;){
- temp=GetReg2(P3da);
- temp=temp&0x08;
- }
-}
-
-#ifndef CONFIG_FB_SIS_LINUXBIOS
-
-VOID VBLongWait(VOID)
-{
- USHORT regsr1f,tempah,temp;
-
- regsr1f=GetReg1(P3c4,0x1F);
- tempah=regsr1f&(~0xC0);
- SetReg1(P3c4,0x1F,tempah);
-
- for(temp=1;temp>0;){
- temp=GetReg2(P3da);
- temp=temp&0x08;
- }
- for(;temp==0;){
- temp=GetReg2(P3da);
- temp=temp&0x08;
- }
-
- SetReg1(P3c4,0x1F,regsr1f);
- return;
-}
-
-BOOLEAN WaitVBRetrace(USHORT BaseAddr)
-{
- USHORT temp;
- USHORT Part1Port;
- Part1Port=BaseAddr+IND_SIS_CRT2_PORT_04;
- temp=GetReg1(Part1Port,0x00);
- if(!(temp&0x80)){
- return 0;
- }
-
- for(temp=0;temp==0;){
- temp=GetReg1(Part1Port,0x25);
- temp=temp&0x01;
- }
- for(;temp>0;){
- temp=GetReg1(Part1Port,0x25);
- temp=temp&0x01;
- }
- return 1;
-}
-
-BOOLEAN GetPanelID(VOID)
-{
- USHORT PanelTypeTable[16]={ SyncPP|Panel800x600|PanelType00,
- SyncPP|Panel1024x768|PanelType01,
- SyncPP|Panel1024x768|PanelType02,
- SyncPP|Panel1024x768|PanelType03,
- SyncPP|Panel1024x768|PanelType04,
- SyncPP|Panel1024x768|PanelType05,
- SyncPP|Panel1024x768|PanelType06,
- SyncPP|Panel1024x768|PanelType07,
- SyncPP|Panel1024x768|PanelType08,
- SyncPP|Panel1024x768|PanelType09,
- SyncPP|Panel800x600|PanelType0A,
- SyncPP|Panel1024x768|PanelType0B,
- SyncPP|Panel1024x768|PanelType0C,
- SyncPP|Panel1024x768|PanelType0D,
- SyncPP|Panel1024x768|PanelType0E,
- SyncPP|Panel1024x768|PanelType0F};
- // Bit 15 BPLVSPLTY
- // Bit 14 BPLHSPLTY
- // Bit 6-3 Panel Type
- // Bit 2-0 Display Resolution(001:800x600 010:1024x768 011:1280x1024)
- USHORT tempah,tempbx;
- USHORT return_flag;
-
- tempah=GetReg1(P3c4,0x18);
- tempbx=tempah&0x0F;
- if(tempah&0x10){
- return_flag=1;
- }else{
- return_flag=0;
- }
-
- if(return_flag==0){
- if(IF_DEF_LVDS==1){
- tempbx=0;
- tempah=GetReg1(P3c4,0x38);
- if(tempah&0x40) tempbx=tempbx|0x08;
- if(tempah&0x20) tempbx=tempbx|0x02;
- if(tempah&0x01) tempbx=tempbx|0x01;
- tempah=GetReg1(P3c4,0x39);
- if(tempah&0x80) tempbx=tempbx|0x04;
- }else{
- return 0;
- }
- }
-
- if(IF_DEF_TRUMPION==1){
- tempbx=1;
- }
- tempbx=PanelTypeTable[tempbx]; //LVDS table entry
- tempbx=tempbx|(USHORT)(LCDSync<<8);
-
- tempah=tempbx&0x0FF;
- SetReg1(P3d4,0x36,tempah);
- tempah=(tempbx&0xFF00)>>8;
- SetRegANDOR(P3d4,0x37,~LCDSyncBit,tempah);
- return 1;
-}
-
-VOID ModCRT1CRTC(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT OldREFIndex,temp,tempah,i,modeflag1;
-
- OldREFIndex=(USHORT)REFIndex;
- temp=GetLVDSCRT1Ptr(ROMAddr,ModeNo);
- if(temp==0){
- REFIndex=OldREFIndex;
- return;
- }
- tempah=(UCHAR)GetReg1(P3d4,0x11);//unlock cr0-7
- tempah=tempah&0x7F;
- SetReg1(P3d4,0x11,tempah);
- tempah=*((UCHAR *)(ROMAddr+REFIndex));
- SetReg1(P3d4,0x0,tempah);
- REFIndex++;
- for(i=0x02;i<=0x05;REFIndex++){
- tempah=*((UCHAR *)(ROMAddr+REFIndex));
- SetReg1(P3d4,i,tempah);
- }
- for(i=0x06;i<=0x07;REFIndex++){
- tempah=*((UCHAR *)(ROMAddr+REFIndex));
- SetReg1(P3d4,i,tempah);
- }
- for(i=0x10;i<=0x11;REFIndex++){
- tempah=*((UCHAR *)(ROMAddr+REFIndex));
- SetReg1(P3d4,i,tempah);
- }
- for(i=0x15;i<=0x16;REFIndex++){
- tempah=*((UCHAR *)(ROMAddr+REFIndex));
- SetReg1(P3d4,i,tempah);
- }
-
- for(i=0x0A;i<=0x0C;REFIndex++){
- tempah=*((UCHAR *)(ROMAddr+REFIndex));
- SetReg1(P3c4,i,tempah);
- }
- tempah=*((UCHAR *)(ROMAddr+REFIndex));
- tempah=tempah&0x0E0;
- SetReg1(P3c4,0x0E,tempah);
-
- tempah=*((UCHAR *)(ROMAddr+REFIndex));
- tempah=tempah&0x01;
- tempah=tempah<<5;
- modeflag1=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- if(modeflag1&DoubleScanMode){
- tempah=tempah|0x080;
- }
- SetRegANDOR(P3d4,0x09,~0x020,tempah);
- REFIndex=OldREFIndex;
- return;
-}
-
-VOID SetCRT2ECLK(ULONG ROMAddr, USHORT ModeNo)
-{
- USHORT OldREFIndex,tempah,tempal;
- USHORT P3cc=P3c9+3;
- OldREFIndex=(USHORT)REFIndex;
- if(IF_DEF_TRUMPION==0){ //no trumpion
- tempal=GetReg2(P3cc);
- tempal=tempal&0x0C;
- SetReg3(P3c2,tempal);
- REFIndex=GetVCLKPtr(ROMAddr,ModeNo);
- }else{ //trumpion
- SetFlag=SetFlag&(~ProgrammingCRT2);
- tempal=*((UCHAR *)(ROMAddr+REFIndex+0x03)); //di+Ext_CRTVCLK
- tempal=tempal&0x03F;
- if(tempal==0x02){ //31.5MHz
- REFIndex=REFIndex-Ext2StructSize;
- }
- REFIndex=GetVCLKPtr(ROMAddr,ModeNo);
- SetFlag=SetFlag|ProgrammingCRT2;
- }
- tempal=0x02B;
- if(!(VBInfo&SetInSlaveMode)){
- tempal=tempal+3;
- }
- tempah=*((UCHAR *)(ROMAddr+REFIndex));
- SetReg1(P3c4,tempal,tempah);
- tempah=*((UCHAR *)(ROMAddr+REFIndex+1));
- tempal++;
- SetReg1(P3c4,tempal,tempah);
- REFIndex=OldREFIndex;
- return;
-}
-
-USHORT GetLVDSDesPtr(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT tempcl,tempbx,tempal,tempptr,LVDSDesPtrData;
- tempcl=LVDSDesDataLen;
- tempbx=LCDTypeInfo;
- if(LCDInfo&LCDNonExpanding){
- tempbx=tempbx+16;
- }
- if(ModeNo<=0x13){
- tempal=*((UCHAR *)(ROMAddr+ModeIDOffset+0x04)); // si+St_CRT2CRTC
- }else{
- tempal=*((UCHAR *)(ROMAddr+REFIndex+4)); //di+Ext_CRT2CRTC
- }
- tempal=tempal&0x1F;
- tempal=tempal*tempcl;
- tempbx=tempbx<<1;
- LVDSDesPtrData=*((USHORT *)(ROMAddr+ADR_LVDSDesPtrData));
- tempptr=*((USHORT *)(ROMAddr+LVDSDesPtrData+tempbx));
- tempptr=tempptr+tempal;
- return(tempptr);
-
-}
-
-BOOLEAN GetLVDSCRT1Ptr(ULONG ROMAddr,USHORT ModeNo)
-{
- USHORT tempal,tempbx,modeflag1;
- USHORT LVDSCRT1DataPtr;
-
- if(!(VBInfo&SetInSlaveMode)){
- return 0;
- }
- if(ModeNo<=0x13){
- tempal=*((UCHAR *)(ROMAddr+ModeIDOffset+0x04)); // si+St_CRT2CRTC
- }else{
- tempal=*((UCHAR *)(ROMAddr+REFIndex+4)); //di+Ext_CRT2CRTC
- }
- tempal=tempal&0x3F;
-
- tempbx=LCDResInfo;
- tempbx=tempbx-Panel800x600;
- if(LCDInfo&LCDNonExpanding){
- tempbx=tempbx+6;
- }
- modeflag1=*((USHORT *)(ROMAddr+ModeIDOffset+0x01)); // si+St_ModeFlag
- if(modeflag1&HalfDCLK){
- tempbx=tempbx+3;
- }
- tempbx=tempbx<<1;
- LVDSCRT1DataPtr=*((USHORT *)(ROMAddr+ADR_LVDSCRT1DataPtr));
- REFIndex=*((USHORT *)(ROMAddr+LVDSCRT1DataPtr+tempbx));
- tempal=tempal*LVDSCRT1Len;
- REFIndex=REFIndex+tempal;
- return 1;
-}
-
-#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)