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

📄 qvcons.c

📁 open bsd stand lib of sys
💻 C
字号:
/* * Copyright (c) 1988 *	The Regents of the University of California.  All rights reserved. * (c) UNIX System Laboratories, Inc. * All or some portions of this file are derived from material licensed * to the University of California by American Telephone and Telegraph * Co. or Unix System Laboratories, Inc. and are reproduced herein with * the permission of UNIX System Laboratories, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * *	@(#)qvcons.c	7.8 (Berkeley) 1/21/94 *//* *	derived from: @(#)qvcons.c	4.1 11/23/87 *//************************************************************************ *									* *			Copyright (c) 1985 by				* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************//* --------------------------------------------------------------------- * Modification History - moved to sccs log * *  7 Jul 84 --  rjl *	Initial version to support the qvss as the system console *	during the boot process. * * --------------------------------------------------------------------- */#include "sys/types.h"#define KERNEL#include "../uba/qvioctl.h"#undef KERNEL#include "../include/cpu.h"/* * MicroVAX-II q-bus memory base */#define QMEMBASE 0x30000000#define QVMAXEVQ	64#define QVSSCSR 0x20001e80/* * Screen initialization tables. qv_def_scn is used as an index into the * table to select the proper initialization parameters. */int qv_def_scn = 1;			/* Screen initialization flag	*/char	qv_scrn_15[]= {	31,25,27,0142,31,13,30,31,4,15,040,0,0,0,0,0};char	qv_scrn_19s[]= {	39,30,31,0264,55,5,54,54,4,15,040,0,0,0,0,0};char	*qv_init_tbl[]= {	qv_scrn_15,	qv_scrn_19s,};struct qv_info qv_scn_defaults[] = {	{0, {0, 0}, 0, {0, 0}, 0, 0, 30, 80, 768, 480, 768-16, 480-16,	 0, 0, 0, 0, 0, QVMAXEVQ, 0, 0, {0, 0}, {0, 0, 0, 0}, 2, 4},	{0, {0, 0}, 0, {0, 0}, 0, 0, 55, 120, 960, 864, 960-16, 864-16,	 0, 0, 0, 0, 0, QVMAXEVQ, 0, 0, {0, 0}, {0, 0, 0, 0}, 2, 4},	{0, {0, 0}, 0, {0, 0}, 0, 0, 56, 120,1024, 864,1024-16, 864-16,	 0, 0, 0, 0, 0, QVMAXEVQ, 0, 0, {0, 0}, {0, 0, 0, 0}, 2, 4}};struct qv_info  qv_scn;struct qv_keyboard {	int shift;			/* state variables	*/	int cntrl;	int lock;	char last;			/* last character	*/} qv_keyboard;int qvputc(),qvgetc();/* * Keyboard translation and font tables */extern  char q_key[],q_shift_key[],*q_special[],q_font[];extern	short q_cursor[];extern (*v_putc)(),(*v_getc)();/* * Routine called to init a qvss. */qv_init(){	struct qvdevice *qvaddr = (struct qvdevice *)QVSSCSR;	char *qvssmem;	short *scanline;	int i;	short scan;	char *ptr;	extern int cpu;        if( badaddr( qvaddr, sizeof(short) ) )                return(0);        if( qvaddr->qv_csr & QV_19INCH )                qv_def_scn = 1;        else                qv_def_scn = 0;        qv_scn = qv_scn_defaults[ qv_def_scn ];	qv_scn.qvaddr = qvaddr;	/*	 * Initialize the screen.	 */	ptr = qv_init_tbl[ qv_def_scn ];	for( i=0 ; i<16 ; i++ ) {		qvaddr->qv_crtaddr = i;		qvaddr->qv_crtdata = *ptr++;	}	/*	 * Turn on the keyboard. 	 */	qvaddr->qv_uartcmd = 0x15;	/* set mode pntr/enable rx/tx	*/	qvaddr->qv_uartmode = 0x17;	/* noparity, 8-bit		*/	qvaddr->qv_uartmode = 0x07;	/* 1 stop bit			*/	qvaddr->qv_uartstatus = 0x99;	/* 4800 baud xmit/recv 		*/	qvssmem = (char *)((qvaddr->qv_csr & QV_MEM_BANK) << 7);	if( cpu == VAX_630 )		qvssmem += QMEMBASE;	qv_scn.bitmap = qvssmem;	qv_scn.scanmap = (short *)((int)qvssmem + ( 254 * 1024 ));	qv_scn.cursorbits = (short *)((int)qvssmem + ( 256 * 1024 ) - 32);	/*	 * Setup the cursor.	 */	for( i=0 ; i<16 ; i++ )		qv_scn.cursorbits[i] = q_cursor[i];	/*	 * Clear the bit map	 */	for( i=0 , ptr = qv_scn.bitmap ; i<254 ; i += 2 , ptr += 2048)		bzero( ptr, 2048 );		/*	 * Reinitialize the scanmap	 */	scan = qv_scn.qvaddr->qv_csr & QV_MEM_BANK;	scanline = qv_scn.scanmap;	for(i = 0 ; i < qv_scn.max_y ; i++ )		*scanline++ = scan++;	/*	 * Home the cursor	 */	qv_scn.row = qv_scn.col = 0;	/*	 * Turn it on.	 */	v_getc = qvgetc;	v_putc = qvputc;	qvaddr->qv_csr |= QV_CUR_MODE | QV_VIDEO_ENA;	return 1;}/* * Routine to display a character on the screen.  The model used is a  * glass tty.  It is assummed that the user will only use this emulation * during system boot and that the screen will be eventually controlled * by a window manager. */qvputc( c )char c;{	char *b_row, *f_row;	int i, j;	short *scanline;	c &= 0x7f;	switch ( c ) {	case '\t':				/* tab		*/		for( j = 8 - (qv_scn.col & 0x7) ; j > 0 ; j-- )			qvputc( ' ' );		break;	case '\r':				/* return	*/		qv_scn.col = 0;		break;	case '\010':				/* backspace	*/		if( --qv_scn.col < 0 )			qv_scn.col = 0;		break;	case '\n':				/* linefeed	*/		if( qv_scn.row+1 >= qv_scn.max_row )			qvscroll();		else			qv_scn.row++;		break;	case '\007':				/* bell		*/		if( qv_scn.qvaddr )			qv_key_out( LK_BELL_ENABLE );		return;	default:		if( c >= ' ' && c <= '~' ) {			scanline = qv_scn.scanmap;			b_row = qv_scn.bitmap+(scanline[qv_scn.row*15]&0x3ff)*128+qv_scn.col;			i = c - ' ';			if( i < 0 || i > 95 )				i = 0;			else				i *= 15;			f_row = (char *)((int)q_font + i);					for( i=0 ; i<15 ; i++ , b_row += 128, f_row++ )				*b_row = *f_row;			if( ++qv_scn.col >= qv_scn.max_col ) {				qv_scn.col = 0 ;				if( qv_scn.row+1 >= qv_scn.max_row )					qvscroll();				else					qv_scn.row++;			}		}		break;	}	/*	 * Position the cursor to the next character location.	 */	qv_pos_cur( qv_scn.col*8, qv_scn.row*15 );}/* * Position the cursor to a particular spot. */qv_pos_cur( x, y)int x,y;{	struct qvdevice *qvaddr;	if( qvaddr = qv_scn.qvaddr ) {		if( y < 0 || y > qv_scn.max_cur_y )			y = qv_scn.max_cur_y;		if( x < 0 || x > qv_scn.max_cur_x )			x = qv_scn.max_cur_x;		qvaddr->qv_crtaddr = 10;	/* select cursor start reg */		qvaddr->qv_crtdata = y & 0xf;		qvaddr->qv_crtaddr = 11;	/* select cursor end reg */		qvaddr->qv_crtdata = y & 0xf;		qvaddr->qv_crtaddr = 14;	/* select cursor y pos. */		qvaddr->qv_crtdata = y >> 4;		qvaddr->qv_xcur = x;		/* pos x axis	*/	}}/* * Scroll the bitmap by moving the scanline map words. This could * be done by moving the bitmap but it's much too slow for a full screen. * The only drawback is that the scanline map must be reset when the user  * wants to do graphics. */qvscroll(){	int i;	short tmpscanlines[15];	char *b_row;	short *scanline;	/*	 * Save the first 15 scanlines so that we can put them at	 * the bottom when done.	 */	bcopy( qv_scn.scanmap, tmpscanlines, sizeof tmpscanlines );	/*	 * Clear the wrapping line so that it won't flash on the bottom	 * of the screen.	 */	scanline = qv_scn.scanmap;	b_row = qv_scn.bitmap+(*scanline&0x3ff)*128;	bzero( b_row, 1920 );	/*	 * Now move the scanlines down 	 */	bcopy( qv_scn.scanmap+15, qv_scn.scanmap, (qv_scn.row * 15) * sizeof (short) );	/*	 * Now put the other lines back	 */	bcopy( tmpscanlines, qv_scn.scanmap+(qv_scn.row * 15), sizeof tmpscanlines );}/* * QVSS keyboard interrupt. */qvgetc(){	int c;	struct qvdevice *qvaddr;	char *string;	int j;	qvaddr = qv_scn.qvaddr;	/*	 * Get a character from the keyboard.	 */loop:	while( (qvaddr->qv_uartstatus & 0x01) == 0 )		;	j = qvaddr->qv_uartdata & 0xff;	/*	 * See if its a state change key	 */	switch ( j ) {	case LOCK:		qv_keyboard.lock ^= 0xffff;	/* toggle */		if( qv_keyboard.lock )			qv_key_out( LK_LED_ENABLE );		else			qv_key_out( LK_LED_DISABLE );		qv_key_out( LED_3 );		goto loop;	case SHIFT:		qv_keyboard.shift ^= 0xffff;		goto loop;	case CNTRL:		qv_keyboard.cntrl ^= 0xffff;		goto loop;	case ALLUP:		qv_keyboard.cntrl = qv_keyboard.shift = 0;		goto loop;	case REPEAT:		c = qv_keyboard.last;		break;	default:		/*		 * Test for control characters. If set, see if the character		 * is elligible to become a control character.		 */		if( qv_keyboard.cntrl ) {			c = q_key[ j ];			if( c >= ' ' && c <= '~' )				c &= 0x1f;		} else if( qv_keyboard.lock || qv_keyboard.shift )			c = q_shift_key[ j ];		else			c = q_key[ j ];		break;	}	qv_keyboard.last = c;	/*	 * Check for special function keys	 */	if( c & 0x80 ) 		return 0;	else		return c;}/* * Output to the keyboard. This routine status polls the transmitter on the * keyboard to output a code. The timer is to avoid hanging on a bad device. */qv_key_out( c )char c;{	int timer = 30000;	if( qv_scn.qvaddr ) {		while( (qv_scn.qvaddr->qv_uartstatus & 0x4) == 0  && timer-- )			;		qv_scn.qvaddr->qv_uartdata = c;	}}

⌨️ 快捷键说明

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