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

📄 pcvt_out.c

📁 freebsd v4.4内核源码
💻 C
📖 第 1 页 / 共 4 页
字号:
		svsp->ss  = 0;			/* init single shift 2/3 */		svsp->Gs  = NULL;		/* Gs single shift 2/3 */		svsp->maxcol = SCR_COL80;	/* 80 columns now (MUST!!!) */		svsp->wd132col = 0;		/* help good old WD .. */		svsp->scroll_lock = 0;		/* scrollock off */#if PCVT_INHIBIT_NUMLOCK		svsp->num_lock = 0; 		/* numlock off */#else		svsp->num_lock = 1;		/* numlock on */#endif		svsp->caps_lock = 0;		/* capslock off */		svsp->shift_lock = 0;		/* shiftlock off */#if PCVT_24LINESDEF				/* true compatibility */		svsp->force24 = 1;		/* force 24 lines */#else						/* maximum screen size */		svsp->force24 = 0;		/* no 24 lines force yet */#endif /* PCVT_24LINESDEF */		vt_clearudk(svsp);		/* clear vt220 udk's */		vt_str(svsp);			/* init emulator */		if(nscr == 0)		{			/*			 * Preserve data on the startup screen that			 * precedes the cursor position.  Leave the			 * cursor where it was found.			 */			unsigned cursorat;			int filllen;			/* CRTC regs 0x0e and 0x0f are r/w everywhere */			outb(addr_6845, CRTC_CURSORH);			cursorat = inb(addr_6845+1) << 8;			outb(addr_6845, CRTC_CURSORL);			cursorat |= inb(addr_6845+1);			/*			 * Reject cursors that are more than one row off a			 * 25-row screen.  syscons sets the cursor offset			 * to 0xffff. The scroll up fixup fails for this			 * because the assignment to svsp->row overflows			 * and perhaps for other reasons.			 */			if (cursorat > 25 * svsp->maxcol)				cursorat = 25 * svsp->maxcol;			svsp->cur_offset = cursorat;			svsp->row = cursorat / svsp->maxcol;			svsp->col = cursorat % svsp->maxcol;			if (svsp->row >= svsp->screen_rows)			{			/*			 * Scroll up; this should only happen when			 * PCVT_24LINESDEF is set			 */				int nscroll =					svsp->row + 1					- svsp->screen_rows;				bcopy (svsp->Crtat				       + nscroll*svsp->maxcol,				       svsp->Crtat,				       svsp->screen_rows				       * svsp->maxcol * CHR);				svsp->row -= nscroll;				svsp->cur_offset -=					nscroll * svsp->maxcol;			}			filllen = (svsp->maxcol * svsp->screen_rowsize)				- svsp->cur_offset;			if (filllen > 0)				fillw(user_attr | ' ',				      svsp->Crtat+svsp->cur_offset,				      filllen);		}#if PCVT_USL_VT_COMPAT		svsp->smode.mode = VT_AUTO;		svsp->smode.relsig = svsp->smode.acqsig =			svsp->smode.frsig = 0;		svsp->proc = 0;		svsp->pid = svsp->vt_status = 0;#endif /* PCVT_USL_VT_COMPAT */	} 	for(charset = 0;charset < NVGAFONTS;charset++)	{		vgacs[charset].loaded = 0;		/* not populated yet */		vgacs[charset].secondloaded = 0;	/* not populated yet */		switch(adaptor_type)		{			case VGA_ADAPTOR:				/*				 * for a VGA, do not assume any				 * constant - instead, read the actual				 * values. This avoid problems with				 * LCD displays that apparently happen				 * to use font matrices up to 19				 * scan lines and 475 scan lines				 * total in order to make use of the				 * whole screen area				 */				outb(addr_6845, CRTC_VDE);				vgacs[charset].scr_scanlines =					inb(addr_6845 + 1);				outb(addr_6845, CRTC_MAXROW);				vgacs[charset].char_scanlines =					inb(addr_6845 + 1);				break;			case EGA_ADAPTOR:				/* 0x5D for 25 lines */				vgacs[charset].scr_scanlines = 0x5D;				/* 0x4D for 25 lines */				vgacs[charset].char_scanlines = 0x4D;				break;			case CGA_ADAPTOR:			case MDA_ADAPTOR:			default:				/* These shouldn't be used for CGA/MDA */				vgacs[charset].scr_scanlines = 0;				vgacs[charset].char_scanlines = 0;				break;		}		vgacs[charset].screen_size = SIZ_25ROWS; /* set screen size */ 	} 	vgacs[0].loaded = 1; /* The BIOS loaded this at boot */	/* set cursor for first screen */	outb(addr_6845,CRTC_CURSTART);	/* cursor start reg */	outb(addr_6845+1,vs[0].cursor_start);	outb(addr_6845,CRTC_CUREND);	/* cursor end reg */	outb(addr_6845+1,vs[0].cursor_end);	/* this is to satisfy ddb */	if(!keyboard_is_initialized)		kbd_code_init1();}/*---------------------------------------------------------------------------* *	get kernel memory for virtual screens * *	CAUTION: depends on "can_do_132col" being set properly, or *	depends on vga_type() being run before calling this !!! * *---------------------------------------------------------------------------*/voidvt_coldmalloc(void){	int nscr;	int screen_max_size;	/* we need to initialize in case we are not the console */	if(do_initialization)		vt_coldinit();	switch(adaptor_type)	{		default:		case MDA_ADAPTOR:		case CGA_ADAPTOR:			screen_max_size = MAXROW_MDACGA * MAXCOL_MDACGA * CHR;			break;		case EGA_ADAPTOR:			screen_max_size = MAXROW_EGA * MAXCOL_EGA * CHR;			break;		case VGA_ADAPTOR:			if(can_do_132col)				screen_max_size =					MAXROW_VGA * MAXCOL_SVGA * CHR;			else				screen_max_size =					MAXROW_VGA * MAXCOL_VGA * CHR;	}	for(nscr = 0; nscr < PCVT_NSCREENS; nscr++)	{		if((vs[nscr].Memory =		    (u_short *)malloc(screen_max_size * 2, M_DEVBUF, M_WAITOK))		   == NULL)		{			printf("pcvt: screen memory malloc failed, "			       "NSCREEN=%d, nscr=%d\n",			       PCVT_NSCREENS, nscr);			break;		}		if(nscr != 0)		{			vs[nscr].Crtat = vs[nscr].Memory;			fillw(user_attr | ' ',				vs[nscr].Crtat,				vs[nscr].maxcol * vs[nscr].screen_rowsize);			totalscreens++;		}	}}/*---------------------------------------------------------------------------* *	check if we must scroll up screen *---------------------------------------------------------------------------*/static voidcheck_scroll(struct video_state *svsp){	if(!svsp->abs_write)	{		/* we write within scroll region */		if(svsp->cur_offset >= ((svsp->scrr_end + 1) * svsp->maxcol))		{			/* the following piece of code has to be protected */			/* from trying to switch to another virtual screen */			/* while being in there ...                        */			critical_scroll = 1;		/* flag protect ON */			roll_up(svsp, 1);		/* rolling up .. */			svsp->cur_offset -= svsp->maxcol;/* update position */			if(switch_page != -1)	/* someone wanted to switch ? */			{				vgapage(switch_page);	/* yes, then switch ! */				switch_page = -1;	/* reset switch flag  */			}			critical_scroll = 0;		/* flag protect OFF */	  	}	}        else        {		/* clip, if outside of screen */                if (svsp->cur_offset >= svsp->screen_rows * svsp->maxcol)                        svsp->cur_offset -= svsp->maxcol;        }}/*---------------------------------------------------------------------------* *	write to one user function key label *---------------------------------------------------------------------------*/static voidwritefkl(int num, u_char *string, struct video_state *svsp){	if((num < 0) || (num > 7))	/* range ok ? */		return;	strncpy(svsp->ufkl[num], string, 16); /* save string in static array */	if(svsp->which_fkl == USR_FKL)		wrfkl(num,string,svsp);}/*---------------------------------------------------------------------------* *	write to one system function key label *---------------------------------------------------------------------------*/voidswritefkl(int num, u_char *string, struct video_state *svsp){	if((num < 0) || (num > 7))	/* range ok ? */		return;	strncpy(svsp->sfkl[num], string, 16); /* save string in static array */	if(svsp->which_fkl == SYS_FKL)		wrfkl(num,string,svsp);}/*---------------------------------------------------------------------------* *	write function key label onto screen *---------------------------------------------------------------------------*/static voidwrfkl(int num, u_char *string, struct video_state *svsp){	register u_short *p;	register u_short *p1;	register int cnt = 0;	if(!svsp->labels_on || (svsp->vt_pure_mode == M_PUREVT))		return;	p = (svsp->Crtat	     + (svsp->screen_rows * svsp->maxcol)); /* screen_rows+1 line */	if(svsp->maxcol == SCR_COL80)	{		if(num < 4)	/* labels 1 .. 4 */			p += (num * LABEL_LEN);		else		/* labels 5 .. 8 */			p += ((num * LABEL_LEN) + LABEL_MID + 1);	}	else	{		if(num < 4)	/* labels 1 .. 4 */			p += (num * (LABEL_LEN + 6));		else		/* labels 5 .. 8 */			p += ((num * (LABEL_LEN + 6)) + LABEL_MID + 11);	}	p1 = p + svsp->maxcol;	/* second label line */	while((*string != '\0') && (cnt < 8))	{		*p = ((0x70 << 8) + (*string & 0xff));		p++;		string++;		cnt++;	}	while(cnt < 8)	{		*p = ((0x70 << 8) + ' ');		p++;		cnt++;	}	while((*string != '\0') && (cnt < 16))	{		*p1 = ((0x70 << 8) + (*string & 0xff));		p1++;		string++;		cnt++;	}	while(cnt < 16)	{		*p1 = ((0x70 << 8) + ' ');		p1++;		cnt++;	}}/*---------------------------------------------------------------------------* *	remove (=blank) function key labels, row/col and status line *---------------------------------------------------------------------------*/voidfkl_off(struct video_state *svsp){	register u_short *p;	register int num;	register int size;	svsp->labels_on = 0;	if((vgacs[svsp->vga_charset].screen_size==SIZ_28ROWS) && svsp->force24)		size = 4;	else		size = 3;	p = (svsp->Crtat + (svsp->screen_rows * svsp->maxcol));	for(num = 0; num < (size * svsp->maxcol); num++)		*p++ = ' ';}/*---------------------------------------------------------------------------* *	(re-) display function key labels, row/col and status line *---------------------------------------------------------------------------*/voidfkl_on(struct video_state *svsp){	svsp->labels_on = 1;	if(svsp->which_fkl == SYS_FKL)		sw_sfkl(svsp);	else if(svsp->which_fkl == USR_FKL)		sw_ufkl(svsp);}/*---------------------------------------------------------------------------* *	set emulation mode, switch between pure VTxxx mode and HP/VTxxx mode *---------------------------------------------------------------------------*/voidset_emulation_mode(struct video_state *svsp, int mode){	if(svsp->vt_pure_mode == mode)		return;	clr_parms(svsp);		/* escape parameter init */	svsp->state = STATE_INIT;	/* initial state */	svsp->scrr_beg = 0;		/* start of scrolling region */	svsp->sc_flag = 0;		/* invalidate saved cursor position */	svsp->transparent = 0;		/* disable control code processing */	if(mode == M_HPVT)		/* vt-pure -> hp/vt-mode */	{		svsp->screen_rows = svsp->screen_rowsize - 3;		if (svsp->force24 && svsp->screen_rows == 25)			svsp->screen_rows = 24;		if (svsp->row >= svsp->screen_rows) {			/* Scroll up */			int nscroll = svsp->row + 1 - svsp->screen_rows;			bcopy (svsp->Crtat + nscroll * svsp->maxcol,			       svsp->Crtat,			       svsp->screen_rows * svsp->maxcol * CHR);			svsp->row -= nscroll;			svsp->cur_offset -= nscroll * svsp->maxcol;		}		svsp->vt_pure_mode = M_HPVT;		if (svsp->vs_tty)			svsp->vs_tty->t_winsize.ws_row = svsp->screen_rows;		svsp->scrr_len = svsp->screen_rows;		svsp->scrr_end = svsp->scrr_len - 1;		update_hp(svsp);	}	else if(mode == M_PUREVT)	/* hp/vt-mode -> vt-pure */	{		fillw(user_attr | ' ',		      svsp->Crtat + svsp->screen_rows * svsp->maxcol,		      (svsp->screen_rowsize - svsp->screen_rows)		      * svsp->maxcol);		svsp->vt_pure_mode = M_PUREVT;		svsp->screen_rows = svsp->screen_rowsize;		if (svsp->force24 && svsp->screen_rows == 25)			svsp->screen_rows = 24;		if (svsp->vs_tty)			svsp->vs_tty->t_winsize.ws_row = svsp->screen_rows;		svsp->scrr_len = svsp->screen_rows;		svsp->scrr_end = svsp->scrr_len - 1;	}#if PCVT_SIGWINCH	if (svsp->vs_tty && svsp->vs_tty->t_pgrp)		pgsignal(svsp->vs_tty->t_pgrp, SIGWINCH, 1);#endif /* PCVT_SIGWINCH */}/*---------------------------------------------------------------------------* *	initialize user function key labels *---------------------------------------------------------------------------*/voidinit_ufkl(struct video_state *svsp){	writefkl(0,(u_char *)"   f1",svsp);	/* init fkey labels */	writefkl(1,(u_char *)"   f2",svsp);	writefkl(2,(u_char *)"   f3",svsp);	writefkl(3,(u_char *)"   f4",svsp);	writefkl(4,(u_char *)"   f5",svsp);	writefkl(5,(u_char *)"   f6",svsp);	writefkl(6,(u_char *)"   f7",svsp);	writefkl(7,(u_char *)"   f8",svsp);}/*---------------------------------------------------------------------------* *	initialize system user function key labels *---------------------------------------------------------------------------*/voidinit_sfkl(struct video_state *svsp){			    /* 1234567812345678 */	if(can_do_132col)				    /* 1234567812345678 */		swritefkl(0,(u_char *)"132     COLUMNS ",svsp);	else		swritefkl(0,(u_char *)" ",svsp);			    /* 1234567812345678 */	swritefkl(1,(u_char *)"SOFT-RSTTERMINAL",svsp);	if(svsp->force24)		swritefkl(2,(u_char *)"FORCE24 ENABLE *",svsp);	else		swritefkl(2,(u_char *)"FORCE24 ENABLE  ",svsp);#if PCVT_SHOWKEYS	    /* 1234567812345678 */	if(svsp == &vs[0])		swritefkl(3,(u_char *)"KEYBSCANDISPLAY ",svsp);	else		swritefkl(3,(u_char *)" ",svsp);#else	swritefkl(3,(u_char *)" ",svsp);#endif /* PCVT_SHOWKEYS */			    /* 1234567812345678 */	if(svsp->bell_on)		swritefkl(4,(u_char *)"BELL    ENABLE *",svsp);	else		swritefkl(4,(u_char *)"BELL    ENABLE  ",svsp);	if(svsp->sevenbit)		swritefkl(5,(u_char *)"8-BIT   ENABLE  ",svsp);	else		swritefkl(5,(u_char *)"8-BIT   ENABLE *",svsp);	swritefkl(6,(u_char *)"DISPLAY FUNCTNS ",svsp);	swritefkl(7,(u_char *)"AUTOWRAPENABLE *",svsp);			    /* 1234567812345678 */}/*---------------------------------------------------------------------------* *	switch display to user function key labels *---------------------------------------------------------------------------*/voidsw_ufkl(struct video_state *svsp){	int i;	svsp->which_fkl = USR_FKL;	for(i = 0; i < 8; i++)		wrfkl(i,svsp->ufkl[i],svsp);}/*---------------------------------------------------------------------------* *	switch display to system function key labels *---------------------------------------------------------------------------*/voidsw_sfkl(struct video_state *svsp){	int i;	svsp->which_fkl = SYS_FKL;	for(i = 0; i < 8; i++)		wrfkl(i,svsp->sfkl[i],svsp);}/*---------------------------------------------------------------------------* *	toggle force 24 lines *---------------------------------------------------------------------------*/voidtoggl_24l(struct video_state *svsp)

⌨️ 快捷键说明

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