⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcvt_ext.c

📁 freebsd v4.4内核源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	outb(addr_6845, CRTC_VSYNCE);	byte = inb(addr_6845+1);	outb(addr_6845, CRTC_VSYNCE);	outb(addr_6845+1, byte & 0x7f);	/* enable access to WD/Paradise "control extensions" */	outb(GDC_INDEX, GDC_PR5GPLOCK);	outb(GDC_INDEX, 0x05);	outb(addr_6845, CRTC_PR10);	outb(addr_6845, 0x85);	outb(TS_INDEX, TS_UNLOCKSEQ);	outb(TS_DATA, 0x48);	if(cols == SCR_COL132)		/* switch 80 -> 132 */	{		/* save state of board for 80 columns */		if(!regsaved)		{			regsaved = 1;			/* save current fonts */#if !PCVT_BACKUP_FONTS			for(i = 0; i < totalfonts; i++)			{				if(vgacs[i].loaded)				{					if((sv_fontwd[i] =					    (u_char *)malloc(32 * 256,							     M_DEVBUF,							     M_WAITOK))					   == NULL)						printf("pcvt: no font buffer\n");					else						vga_move_charset(i,								 sv_fontwd[i],								 1);				}				else				{					sv_fontwd[i] = 0;				}			}#endif /* !PCVT_BACKUP_FONTS */			sp = savearea.wd90c11;			outb(addr_6845, 0x00);	/* Horizontal Total */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x01);	/* Horizontal Display End */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x02);	/* Horizontal Blank Start */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x03);	/* Horizontal Blank End */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x04);	/* Horizontal Retrace Start */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x05);	/* Horizontal Retrace End */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x13);	/* Row Offset Register */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x2e);	/* misc 1 */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x2f);	/* misc 2 */			*sp++ = inb(addr_6845+1);			outb(TS_INDEX, 0x10);/* Timing Sequencer */			*sp++ = inb(TS_DATA);			outb(TS_INDEX, 0x12);/* Timing Sequencer */			*sp++ = inb(TS_DATA);			*sp++ = inb(GN_MISCOUTR);	/* Misc output register */		}		/* setup chipset for 132 column operation */		outb(addr_6845, 0x00);	/* Horizontal Total */		outb(addr_6845+1, 0x9c);		outb(addr_6845, 0x01);	/* Horizontal Display End */		outb(addr_6845+1, 0x83);		outb(addr_6845, 0x02);	/* Horizontal Blank Start */		outb(addr_6845+1, 0x84);		outb(addr_6845, 0x03);	/* Horizontal Blank End */		outb(addr_6845+1, 0x9f);		outb(addr_6845, 0x04);	/* Horizontal Retrace Start */		outb(addr_6845+1, 0x8a);		outb(addr_6845, 0x05);	/* Horizontal Retrace End */		outb(addr_6845+1, 0x1c);		outb(addr_6845, 0x13);	/* Row Offset Register */		outb(addr_6845+1, 0x42);		outb(addr_6845, 0x2e);	/* misc 1 */		outb(addr_6845+1, 0x04);		outb(addr_6845, 0x2f);	/* misc 2 */		outb(addr_6845+1, 0x00);		outb(TS_INDEX, 0x10);/* Timing Sequencer */		outb(TS_DATA, 0x21);		outb(TS_INDEX, 0x12);/* Timing Sequencer */		outb(TS_DATA, 0x14);		outb(GN_MISCOUTW, (inb(GN_MISCOUTR) | 0x08));	/* Misc output register */		vsp->wd132col = 1;	}	else	/* switch 132 -> 80 */	{		if(!regsaved)			/* failsafe */		{			/* disable access to first 7 CRTC registers */			outb(addr_6845, CRTC_VSYNCE);			outb(addr_6845+1, byte);			/* disable access to WD/Paradise "control extensions" */			outb(GDC_INDEX, GDC_PR5GPLOCK);			outb(GDC_INDEX, 0x00);			outb(addr_6845, CRTC_PR10);			outb(addr_6845, 0x00);			outb(TS_INDEX, TS_UNLOCKSEQ);			outb(TS_DATA, 0x00);			vga_screen_on();			return(0);		}		sp = savearea.wd90c11;		outb(addr_6845, 0x00);	/* Horizontal Total */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x01);	/* Horizontal Display End */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x02);	/* Horizontal Blank Start */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x03);	/* Horizontal Blank End */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x04);	/* Horizontal Retrace Start */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x05);	/* Horizontal Retrace End */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x13);	/* Row Offset Register */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x2e);	/* misc 1 */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x2f);	/* misc 2 */		outb(addr_6845+1, *sp++);		outb(TS_INDEX, 0x10);/* Timing Sequencer */		outb(addr_6845+1, *sp++);		outb(TS_INDEX, 0x12);/* Timing Sequencer */		outb(addr_6845+1, *sp++);		outb(GN_MISCOUTW, *sp++);	/* Misc output register */		vsp->wd132col = 0;	}	/* restore fonts */#if !PCVT_BACKUP_FONTS	for(i = 0; i < totalfonts; i++)	{		if(sv_fontwd[i])			vga_move_charset(i, sv_fontwd[i], 0);	}#else	for(i = 0; i < totalfonts; i++)		if(saved_charsets[i])			vga_move_charset(i, 0, 0);#endif /* !PCVT_BACKUP_FONTS */	select_vga_charset(vsp->vga_charset);	/* disable access to first 7 CRTC registers */	outb(addr_6845, CRTC_VSYNCE);	outb(addr_6845+1, byte);	/* disable access to WD/Paradise "control extensions" */	outb(GDC_INDEX, GDC_PR5GPLOCK);	outb(GDC_INDEX, 0x00);	outb(addr_6845, CRTC_PR10);	outb(addr_6845, 0x00);	outb(TS_INDEX, TS_UNLOCKSEQ);	outb(TS_DATA, 0x00);	vga_screen_on();	return(1);}/*---------------------------------------------------------------------------* *	toggle 80/132 column operation for TRIDENT 9000 based boards *---------------------------------------------------------------------------*/inttri9000_col(int cols){	u_char *sp;	u_char byte;	vga_screen_off();	/* sync reset is necessary to preserve memory contents ... */	outb(TS_INDEX, TS_SYNCRESET);	outb(TS_DATA, 0x01);	/* synchronous reset */	/* disable protection of misc out and other regs */	outb(addr_6845, CRTC_MTEST);	byte = inb(addr_6845+1);	outb(addr_6845, CRTC_MTEST);	outb(addr_6845+1, byte & ~0x50);	/* enable access to first 7 CRTC registers */	outb(addr_6845, CRTC_VSYNCE);	byte = inb(addr_6845+1);	outb(addr_6845, CRTC_VSYNCE);	outb(addr_6845+1, byte & 0x7f);	if(cols == SCR_COL132)		/* switch 80 -> 132 */	{		/* save state of board for 80 columns */		if(!regsaved)		{			regsaved = 1;			sp = savearea.tri9000;			outb(addr_6845, 0x00);	/* Horizontal Total */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x01);	/* Horizontal Display End */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x02);	/* Horizontal Blank Start */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x03);	/* Horizontal Blank End */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x04);	/* Horizontal Retrace Start */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x05);	/* Horizontal Retrace End */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x13);			*sp++ = inb(addr_6845+1);			outb(TS_INDEX, TS_MODE);/* Timing Sequencer */			*sp++ = inb(TS_DATA);			outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */			outb(TS_DATA, 0x00);	  /* write ANYTHING switches to OLD */			outb(TS_INDEX, TS_MODEC2);			*sp++ = inb(TS_DATA);			outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */			inb(TS_DATA);		  /* read switches to NEW */			outb(TS_INDEX, TS_MODEC2);			*sp++ = inb(TS_DATA);			if(color)				inb(GN_INPSTAT1C);			else				inb(GN_INPSTAT1M);			/* ATC Mode control */			outb(ATC_INDEX, ATC_MODE | ATC_ACCESS);			*sp++ = inb(ATC_DATAR);			if(color)				inb(GN_INPSTAT1C);			else				inb(GN_INPSTAT1M);			/* ATC Horizontal Pixel Panning */			outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS);			*sp++ = inb(ATC_DATAR);			*sp++ = inb(GN_MISCOUTR);	/* Misc output register */		}		/* setup chipset for 132 column operation */		outb(addr_6845, 0x00);	/* Horizontal Total */		outb(addr_6845+1, 0x9b);		outb(addr_6845, 0x01);	/* Horizontal Display End */		outb(addr_6845+1, 0x83);		outb(addr_6845, 0x02);	/* Horizontal Blank Start */		outb(addr_6845+1, 0x84);		outb(addr_6845, 0x03);	/* Horizontal Blank End */		outb(addr_6845+1, 0x1e);		outb(addr_6845, 0x04);	/* Horizontal Retrace Start */		outb(addr_6845+1, 0x87);		outb(addr_6845, 0x05);	/* Horizontal Retrace End */		outb(addr_6845+1, 0x1a);		outb(addr_6845, 0x13);	/* Row Offset Register */		outb(addr_6845+1, 0x42);		outb(TS_INDEX, TS_MODE);/* Timing Sequencer */		outb(TS_DATA, 0x01);	/* 8 dot char clock */		outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */		outb(TS_DATA, 0x00);	  /* write ANYTHING switches to OLD */		outb(TS_INDEX, TS_MODEC2);		outb(TS_DATA, 0x00);		outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */		inb(TS_DATA);		  /* read switches to NEW */		outb(TS_INDEX, TS_MODEC2);		outb(TS_DATA, 0x01);		if(color)			inb(GN_INPSTAT1C);		else			inb(GN_INPSTAT1M);		outb(ATC_INDEX, ATC_MODE | ATC_ACCESS); /* ATC Mode control */		outb(ATC_DATAW, 0x08);	/* Line graphics disable */		if(color)			inb(GN_INPSTAT1C);		else			inb(GN_INPSTAT1M);		outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS); /* ATC Horizontal Pixel Panning */		outb(ATC_DATAW, 0x00);		outb(GN_MISCOUTW, (inb(GN_MISCOUTR) | 0x0c));	/* Misc output register */	}	else	/* switch 132 -> 80 */	{		if(!regsaved)			/* failsafe */		{			/* disable access to first 7 CRTC registers */			outb(addr_6845, CRTC_VSYNCE);			outb(addr_6845+1, byte);			outb(TS_INDEX, TS_SYNCRESET);			outb(TS_DATA, 0x03);	/* clear synchronous reset */			vga_screen_on();			return(0);		}		sp = savearea.tri9000;		outb(addr_6845, 0x00);	/* Horizontal Total */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x01);	/* Horizontal Display End */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x02);	/* Horizontal Blank Start */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x03);	/* Horizontal Blank End */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x04);	/* Horizontal Retrace Start */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x05);	/* Horizontal Retrace End */		outb(addr_6845+1, *sp++);		outb(addr_6845, 0x13);	/* Row Offset Register */		outb(addr_6845+1, *sp++);		outb(TS_INDEX, TS_MODE);/* Timing Sequencer */		outb(TS_DATA, *sp++);		outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */		outb(TS_DATA, 0x00);	  /* write ANYTHING switches to OLD */		outb(TS_INDEX, TS_MODEC2);/* Timing Sequencer */		outb(TS_DATA, *sp++);		outb(TS_INDEX, TS_HWVERS);/* Hardware Version register */		inb(TS_DATA);		  /* read switches to NEW */		outb(TS_INDEX, TS_MODEC2);/* Timing Sequencer */		outb(TS_DATA, *sp++);		if(color)			inb(GN_INPSTAT1C);		else			inb(GN_INPSTAT1M);		/* ATC Mode control */		outb(ATC_INDEX, ATC_MODE | ATC_ACCESS);		outb(ATC_DATAW, *sp++);		if(color)			inb(GN_INPSTAT1C);		else			inb(GN_INPSTAT1M);		/* ATC Horizontal Pixel Panning */		outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS);		outb(ATC_DATAW, *sp++);		outb(GN_MISCOUTW, *sp++);	/* Misc output register */	}	/* disable access to first 7 CRTC registers */	outb(addr_6845, CRTC_VSYNCE);	outb(addr_6845+1, byte);	outb(TS_INDEX, TS_SYNCRESET);	outb(TS_DATA, 0x03);	/* clear synchronous reset */	vga_screen_on();	return(1);}/*---------------------------------------------------------------------------* *	toggle 80/132 column operation for Video7 VGA 1024i *---------------------------------------------------------------------------*/intv7_1024i_col(int cols){	u_char *sp;	u_char byte;	u_char save__byte;	vga_screen_off();	/* enable access to first 7 CRTC registers */	/* first, enable read access to vertical retrace start/end */	outb(addr_6845, CRTC_HBLANKE);	byte = inb(addr_6845+1);	outb(addr_6845, CRTC_HBLANKE);	outb(addr_6845+1, (byte | 0x80));	/* second, enable access to protected registers */	outb(addr_6845, CRTC_VSYNCE);	save__byte = byte = inb(addr_6845+1);	byte |= 0x20;	/* no irq 2 */	byte &= 0x6f;	/* wr enable, clr irq flag */	outb(addr_6845, CRTC_VSYNCE);	outb(addr_6845+1, byte);	outb(TS_INDEX, TS_EXTCNTL);	/* enable extensions */	outb(TS_DATA, 0xea);	if(cols == SCR_COL132)		/* switch 80 -> 132 */	{		/* save state of board for 80 columns */		if(!regsaved)		{			regsaved = 1;			sp = savearea.v7_1024i;			outb(addr_6845, 0x00);	/* Horizontal Total */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x01);	/* Horizontal Display End */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x02);	/* Horizontal Blank Start */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x03);	/* Horizontal Blank End */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x04);	/* Horizontal Retrace Start */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x05);	/* Horizontal Retrace End */			*sp++ = inb(addr_6845+1);			outb(addr_6845, 0x13);	/* Row Offset Register */			*sp++ = inb(addr_6845+1);			outb(TS_INDEX, TS_MODE);/* Timing Sequencer */			*sp++ = inb(TS_DATA);			if(color)				inb(GN_INPSTAT1C);			else				inb(GN_INPSTAT1M);			/* ATC Mode control */			outb(ATC_INDEX, ATC_MODE | ATC_ACCESS);			*sp++ = inb(ATC_DATAR);			if(color)				inb(GN_INPSTAT1C);			else				inb(GN_INPSTAT1M);			/* ATC Horizontal Pixel Panning */			outb(ATC_INDEX, ATC_HORPIXPAN | ATC_ACCESS);			*sp++ = inb(ATC_DATAR);			outb(TS_INDEX, 0x83);			*sp++ = inb(TS_DATA);			outb(TS_INDEX, 0xa4);			*sp++ = inb(TS_DATA);			outb(TS_INDEX, 0xe0);			*sp++ = inb(TS_DATA);			outb(TS_INDEX, 0xe4);			*sp++ = inb(TS_DATA);			outb(TS_INDEX, 0xf8);			*sp++ = inb(TS_DATA);			outb(TS_INDEX, 0xfd);			*sp++ = inb(TS_DATA);			*sp++ = inb(GN_MISCOUTR);	/* Misc output register */		}		/* setup chipset for 132 column operation */		outb(addr_6845, 0x00);	/* Horizontal Total */		outb(addr_6845+1, 0x9c);

⌨️ 快捷键说明

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