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

📄 pcvt_vtf.c

📁 freebsd v4.4内核源码
💻 C
📖 第 1 页 / 共 4 页
字号:
			else if(ch >= '0' && ch <= '~')	/* final .... */			{				svsp->dld_dscs[svsp->dld_dscsi] = ch;				svsp->dld_id[svsp->dld_dscsi++] = ch;				svsp->dld_id[svsp->dld_dscsi] = '\0';				svsp->dcs_state = DCS_DLD_DEF;			}			else			{				svsp->transparent = 0;				svsp->state = STATE_INIT;				svsp->dcs_state = DCS_INIT;				svsp->dld_id[0] = '\0';			}			break;		case DCS_DLD_DEF:	 /* DCS ... { dscs */			switch(ch)			{				case 0x1b:	 /* ESC */					svsp->dcs_state = DCS_DLD_ESC;					break;				case '/':	 /* sixel upper / lower divider */					svsp->dld_sixel_lower = 1;					break;				case ';':	 /* character divider */					vt_dld(svsp);					svsp->parms[1]++;	/* next char */					break; 				default:					if (svsp->dld_sixel_lower)					{						if(ch >= '?' && ch <= '~')							svsp->sixel.lower[svsp->dld_sixelli] = ch - '?';						svsp->dld_sixelli =						 (svsp->dld_sixelli+1 < MAXSIXEL) ?						 svsp->dld_sixelli+1 : svsp->dld_sixelli;					}					else					{						if(ch >= '?' && ch <= '~')							svsp->sixel.upper[svsp->dld_sixelui] = ch - '?';						svsp->dld_sixelui =						 (svsp->dld_sixelui+1 < MAXSIXEL) ?						 svsp->dld_sixelui+1 : svsp->dld_sixelui;					}					break;			}			break;		case DCS_DLD_ESC:	 /* DCS ... { dscs ... / ... ESC */			switch(ch)			{				case '\\':	/* String Terminator ST */					vt_dld(svsp);					svsp->transparent = 0;					svsp->state = STATE_INIT;					svsp->dcs_state = DCS_INIT;					break; 				default:					svsp->transparent = 0;					svsp->state = STATE_INIT;					svsp->dcs_state = DCS_INIT;					svsp->dld_id[0] = '\0';					break;			}			break;		default:			svsp->transparent = 0;			svsp->state = STATE_INIT;			svsp->dcs_state = DCS_INIT;			break;	}}/*---------------------------------------------------------------------------* *	User Defineable Keys *---------------------------------------------------------------------------*/voidvt_udk(struct video_state *svsp){	int key, start, max, i;	int usedff = 0;	if(svsp->parms[0] != 1)		/* clear all ? */	{		vt_clearudk(svsp);		svsp->parms[0] = 1;	}	if(svsp->udk_fnckey < 17 || svsp->udk_fnckey > 34)	{		init_udk(svsp);		return;	}	key = svsp->udk_fnckey - 17;	/* index into table */	if(svsp->ukt.length[key] == 0)			/* never used ? */	{		if(svsp->udkff < MAXUDKDEF-2)		/* space available ? */		{			start = svsp->udkff;		/* next sequential */			max = MAXUDKDEF - svsp->udkff;	/* space available */			svsp->ukt.first[key] = start;	/* start entry */			usedff = 1;			/* flag to update later */		}		else					/* no space */		{			init_udk(svsp);			return;		}	}	else						/* in use, redefine */	{		start = svsp->ukt.first[key];		/* start entry */		max = svsp->ukt.length[key];		/* space available */	}	if(max < 2)				/* hmmm .. */	{		init_udk(svsp);		return;	}	max--;		/* adjust for tailing '\0' */	for(i = 0; i < max && i < svsp->udk_defi; i++)		svsp->udkbuf[start++] = svsp->udk_def[i];	svsp->udkbuf[start] = '\0';	/* make it a string, see pcvt_kbd.c */	svsp->ukt.length[key] = i+1;	/* count for tailing '\0' */	if(usedff)		svsp->udkff += (i+2);	/* new start location */	init_udk(svsp);}/*---------------------------------------------------------------------------* *	clear all User Defineable Keys *---------------------------------------------------------------------------*/voidvt_clearudk(struct video_state *svsp){	register int i;	for(i = 0; i < MAXUDKEYS; i++)	{		svsp->ukt.first[i] = 0;		svsp->ukt.length[i] = 0;	}	svsp->udkff = 0;}/*---------------------------------------------------------------------------* *	Down line LoaDable Fonts *---------------------------------------------------------------------------*/voidvt_dld(struct video_state *svsp){	unsigned char vgacharset;	unsigned char vgachar[16];	unsigned char vgacharb[16];	if(vgacs[svsp->vga_charset].secondloaded)		vgacharset = vgacs[svsp->vga_charset].secondloaded;	else		return;	svsp->parms[1] = (svsp->parms[1] < 1) ? 1 :		((svsp->parms[1] > 0x7E) ? 0x7E : svsp->parms[1]);	if(svsp->parms[2] != 1)   /* Erase all characters ? */	{		clear_dld(svsp);		svsp->parms[2] = 1;   /* Only erase all characters once per sequence */	}	sixel_vga(&(svsp->sixel),vgachar);	switch(vgacs[vgacharset].char_scanlines & 0x1F)	{		case 7:			vga10_vga8(vgachar,vgacharb);			break;		case 9:		default:			vga10_vga10(vgachar,vgacharb);			break;		case 13:			vga10_vga14(vgachar,vgacharb);			break;		case 15:			vga10_vga16(vgachar,vgacharb);			break;	}	loadchar(vgacharset, svsp->parms[1] + 0xA0, 16, vgacharb);	init_dld(svsp);}/*---------------------------------------------------------------------------* *	select character attributes *---------------------------------------------------------------------------*/voidvt_sca(struct video_state *svsp){	switch(svsp->parms[0])	{		case 1:			svsp->selchar = 1;			break;		case 0:		case 2:		default:			svsp->selchar = 0;			break;	}}/*---------------------------------------------------------------------------* *	initalize selective attribute bit array *---------------------------------------------------------------------------*/voidvt_initsel(struct video_state *svsp){	register int i;	for(i = 0;i < MAXDECSCA;i++)		svsp->decsca[i] = 0;}/*---------------------------------------------------------------------------* *	DECSEL - selective erase in line *---------------------------------------------------------------------------*/voidvt_sel(struct video_state *svsp){	switch(svsp->parms[0])	{		case 0:			selective_erase(svsp, (svsp->Crtat + svsp->cur_offset),					 svsp->maxcol-svsp->col);			break;		case 1:			selective_erase(svsp, (svsp->Crtat + svsp->cur_offset)-					svsp->col, svsp->col + 1);			break;		case 2:			selective_erase(svsp, (svsp->Crtat + svsp->cur_offset)-					svsp->col, svsp->maxcol);			break;	}}/*---------------------------------------------------------------------------* *	DECSED - selective erase in display *---------------------------------------------------------------------------*/voidvt_sed(struct video_state *svsp){	switch(svsp->parms[0])	{		case 0:			selective_erase(svsp, (svsp->Crtat + svsp->cur_offset),			      svsp->Crtat + (svsp->maxcol * svsp->screen_rows) -			      (svsp->Crtat + svsp->cur_offset));			break;		case 1:			selective_erase(svsp, svsp->Crtat,			   (svsp->Crtat + svsp->cur_offset) - svsp->Crtat + 1 );			break;		case 2:			selective_erase(svsp, svsp->Crtat,				svsp->maxcol * svsp->screen_rows);			break;	}}/*---------------------------------------------------------------------------* *	scroll screen n lines up *---------------------------------------------------------------------------*/voidroll_up(struct video_state *svsp, int n){#if (PCVT_NOFASTSCROLL==0)	if(svsp->scrr_beg == 0 &&	/* if scroll region is whole screen */           svsp->scrr_len == svsp->screen_rows &&	   (svsp != vsp ||		/* and either running in memory */	    (svsp->screen_rows == svsp->screen_rowsize && /* or no fkeys */	     adaptor_type != MDA_ADAPTOR)))	/* and not on MDA/Hercules */	{		u_short *Memory =#if PCVT_USL_VT_COMPAT		    (vsp != svsp || (vsp->vt_status & VT_GRAFX)) ?#else		    (vsp != svsp) ?#endif				svsp->Memory : Crtat;		if(svsp->Crtat > (Memory + (svsp->screen_rows - n) *					svsp->maxcol))		{			bcopy(svsp->Crtat + svsp->maxcol * n, Memory,		       	      svsp->maxcol * (svsp->screen_rows - n) * CHR);			svsp->Crtat = Memory;		}		else		{			svsp->Crtat += n * svsp->maxcol;		}#if PCVT_USL_VT_COMPAT		if(vsp == svsp && !(vsp->vt_status & VT_GRAFX))#else		if(vsp == svsp)#endif		{			outb(addr_6845, CRTC_STARTADRH);			outb(addr_6845+1, (svsp->Crtat - Crtat) >> 8);			outb(addr_6845, CRTC_STARTADRL);			outb(addr_6845+1, (svsp->Crtat - Crtat));		}	}	else#endif	{		bcopy(	svsp->Crtat + ((svsp->scrr_beg + n) * svsp->maxcol),			svsp->Crtat + (svsp->scrr_beg * svsp->maxcol),			svsp->maxcol * (svsp->scrr_len - n) * CHR );	}	fillw(	user_attr | ' ',		svsp->Crtat + ((svsp->scrr_end - n + 1) * svsp->maxcol),		n * svsp->maxcol);/*XXX*/	if(svsp->scroll_lock && svsp->openf && curproc)		tsleep((caddr_t)&(svsp->scroll_lock), PUSER, "scrlck", 0);}/*---------------------------------------------------------------------------* *	scroll screen n lines down *---------------------------------------------------------------------------*/static voidroll_down(struct video_state *svsp, int n){#if (PCVT_NOFASTSCROLL==0)	if(svsp->scrr_beg == 0 &&	/* if scroll region is whole screen */           svsp->scrr_len == svsp->screen_rows &&	   (svsp != vsp ||		/* and either running in memory */	    (svsp->screen_rows == svsp->screen_rowsize && /* or no fkeys */	     adaptor_type != MDA_ADAPTOR)))	/* and not on MDA/Hercules */	{		u_short *Memory =#if PCVT_USL_VT_COMPAT		    (vsp != svsp || (vsp->vt_status & VT_GRAFX)) ?#else		    (vsp != svsp) ?#endif				svsp->Memory : Crtat;		if (svsp->Crtat < (Memory + n * svsp->maxcol))		{			bcopy(svsp->Crtat,			      Memory + svsp->maxcol * (svsp->screen_rows + n),		       	      svsp->maxcol * (svsp->screen_rows - n) * CHR);			svsp->Crtat = Memory + svsp->maxcol * svsp->screen_rows;		}		else		{			svsp->Crtat -= n * svsp->maxcol;		}#if PCVT_USL_VT_COMPAT		if(vsp == svsp && !(vsp->vt_status & VT_GRAFX))#else		if(vsp == svsp)#endif		{			outb(addr_6845, CRTC_STARTADRH);			outb(addr_6845+1, (svsp->Crtat - Crtat) >> 8);			outb(addr_6845, CRTC_STARTADRL);			outb(addr_6845+1, (svsp->Crtat - Crtat));		}	}	else#endif	{		bcopy(  svsp->Crtat + (svsp->scrr_beg * svsp->maxcol),			svsp->Crtat + ((svsp->scrr_beg + n) * svsp->maxcol),			svsp->maxcol * (svsp->scrr_len - n) * CHR );	}	fillw(	user_attr | ' ',		svsp->Crtat + (svsp->scrr_beg * svsp->maxcol),		n * svsp->maxcol);/*XXX*/	if(svsp->scroll_lock && svsp->openf && curproc)		tsleep((caddr_t)&(svsp->scroll_lock), PUSER, "scrlck", 0);}/*---------------------------------------------------------------------------* *	switch charset pointers *---------------------------------------------------------------------------*/static voidswcsp(struct video_state *svsp, u_short *ctp){	if(ctp == NULL)		return;	switch(svsp->state)	{		case STATE_BROPN:	/* designate G0 */			svsp->G0 = ctp;			break;		case STATE_BRCLO:	/* designate G1 */		case STATE_MINUS:	/* designate G1 (96) */			svsp->G1 = ctp;			break;		case STATE_STAR:	/* designate G2 */		case STATE_DOT:		/* designate G2 (96) */			svsp->G2 = ctp;			break;		case STATE_PLUS:	/* designate G3 */		case STATE_SLASH:	/* designate G3 (96) */			svsp->G3 = ctp;			break;	}}/*---------------------------------------------------------------------------* *	process terminal responses *---------------------------------------------------------------------------*/static voidrespond(struct video_state *svsp){        if(!(svsp->openf))              /* are we opened ? */                return;        while (*svsp->report_chars && svsp->report_count > 0)        {		(*linesw[svsp->vs_tty->t_line].l_rint)			(*svsp->report_chars++ & 0xff, svsp->vs_tty);		svsp->report_count--;        }}/*---------------------------------------------------------------------------* *	Initialization for User Defineable Keys *---------------------------------------------------------------------------*/static voidinit_udk(struct video_state *svsp){	svsp->udk_defi = 0;	svsp->udk_deflow = 0;	svsp->udk_fnckey = 0;}/*---------------------------------------------------------------------------* *	Clear loaded downloadable (DLD) character set *---------------------------------------------------------------------------*/static voidclear_dld(struct video_state *svsp){	register int i;	unsigned char vgacharset;	unsigned char vgachar[16];	if(vgacs[svsp->vga_charset].secondloaded)		vgacharset = vgacs[svsp->vga_charset].secondloaded;	else		return;	for(i=0;i < 16;i++)  /* A zeroed character, vt220 has inverted '?' */		vgachar[i] = 0x00;	for(i=1;i <= 94;i++) /* Load (erase) all characters */		loadchar(vgacharset, i + 0xA0, 16, vgachar);}/*---------------------------------------------------------------------------* *	Initialization for Down line LoaDable Fonts *---------------------------------------------------------------------------*/static voidinit_dld(struct video_state *svsp){	register int i;	svsp->dld_dscsi = 0;	svsp->dld_sixel_lower = 0;	svsp->dld_sixelli = 0;	svsp->dld_sixelui = 0;	for(i = 0;i < MAXSIXEL;i++)		svsp->sixel.lower[i] = svsp->sixel.upper[i] = 0;}/*---------------------------------------------------------------------------* *	selective erase a region *---------------------------------------------------------------------------*/static voidselective_erase(struct video_state *svsp, u_short *pcrtat, int length){	register int i, j;	for(j = pcrtat - svsp->Crtat, i = 0;i < length;i++,pcrtat++)	{		if(!(svsp->decsca[INT_INDEX(j+i)] & (1 << BIT_INDEX(j+i))))		{			*pcrtat &= 0xFF00; /* Keep the video character attributes */			*pcrtat += ' ';	   /* Erase the character */		}	}}#endif	/* NVT > 0 *//* ------------------------- E O F ------------------------------------------*/

⌨️ 快捷键说明

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