patch-2.4.0-test11 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

diff -u --recursive --new-file v2.4.0-test10/linux/drivers/video/sis/sis_301.c linux/drivers/video/sis/sis_301.c
@@ -0,0 +1,2868 @@
+/* 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)