sis_301.c

来自「讲述linux的初始化过程」· C语言 代码 · 共 2,841 行 · 第 1/5 页

C
2,841
字号
			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;

⌨️ 快捷键说明

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