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

📄 qdcons.c

📁 open bsd stand lib of sys
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************* **	qdgetc()... get a character from the LK201********************************************************************/qdgetc(){	register short key;	register char chr;	register struct duart *duart;	u_int status;	duart = (struct duart *) qdmap.duart;	/*--------------------------------------	* Get a character from the keyboard. */LOOP:	while (!((status = duart->statusA) & RCV_RDY))			;	key = duart->dataA;	key &= 0xFF;	/*--------------------------------------	* Check for various keyboard errors  */	if( key == LK_POWER_ERROR || key == LK_KDOWN_ERROR ||	    key == LK_INPUT_ERROR || key == LK_OUTPUT_ERROR) {		printf("Keyboard error, code = %x\n", key);		return(0);	}	if (key < LK_LOWEST) 	    return(0);	/*---------------------------------	* See if its a state change key */	switch (key) {	    case LOCK:		q_keyboard.lock ^= 0xffff;	/* toggle */		if (q_keyboard.lock)		    led_control(LK_LED_ENABLE, LK_LED_LOCK);		else		    led_control(LK_LED_DISABLE, LK_LED_LOCK);		goto LOOP;	    case SHIFT:		q_keyboard.shift ^= 0xFFFF;		goto LOOP;	    case CNTRL:		q_keyboard.cntrl ^= 0xFFFF;		goto LOOP;	    case ALLUP:		q_keyboard.cntrl = 0;		q_keyboard.shift = 0;		goto LOOP;	    case REPEAT:		chr = q_keyboard.last;		break;	    /*-------------------------------------------------------	    * Test for cntrl characters. If set, see if the character	    * is elligible to become a control character. */	    default:		if (q_keyboard.cntrl) {		    chr = q_key[key];		    if (chr >= ' ' && chr <= '~')			chr &= 0x1F;		} 		else if ( q_keyboard.lock || q_keyboard.shift )		    chr = q_shift_key[key];		else		    chr = q_key[key];		break;		}	if (chr < ' ' && chr > '~')  	/* if input is non-displayable */	    return(0);			/* ..then pitch it! */	q_keyboard.last = chr;	/*-----------------------------------	* Check for special function keys */	if (chr & 0x80) 		/* pitch the function keys */	    return(0);	else	    return(chr);} /* qdgetc *//****************************************************************************************************************************************************************************************************************************	INTERNALLY USED ROUTINES START HERE:***************************************************************************************************************************************************************************************************************************//**********************************************************************	ldcursor()... load the mouse cursor's template RAM bitmap*********************************************************************/ldcursor(){	register struct dga *dga;	register short *temp;	register int i;	int cursor;	dga = (struct dga *) qdmap.dga;	temp = (short *) qdmap.template;	temp += (8 * 1024) - 32;	/* cursor is 32 WORDS from the end */					/* ..of the 8k WORD template space */	for (i = 0; i < 32; ++i)	    *temp++ = cons_cursor[i];	return(0);} /* ldcursor *//************************************************************************	ldfont()... put the console font in the QDSS off-screen memory***********************************************************************/ldfont(){	register struct adder *adder;	int i;		/* scratch variables */	int j;	int k;	short packed;	adder = (struct adder *) qdmap.adder;/*------------------------------------------* setup VIPER operand control registers  */	write_ID(adder, MASK_1, 0xFFFF);	write_ID(adder, VIPER_Z_LOAD | FOREGROUND_COLOR_Z, 255);	write_ID(adder, VIPER_Z_LOAD | BACKGROUND_COLOR_Z, 0);	write_ID(adder, SRC1_OCR_B, 			EXT_NONE | INT_NONE | ID | BAR_SHIFT_DELAY);	write_ID(adder, SRC2_OCR_B, 			EXT_NONE | INT_NONE | ID | BAR_SHIFT_DELAY);	write_ID(adder, DST_OCR_B, 			EXT_SOURCE | INT_NONE | NO_ID | NO_BAR_SHIFT_DELAY);	adder->rasterop_mode = DST_WRITE_ENABLE | DST_INDEX_ENABLE | NORMAL;/*--------------------------* load destination data  */	wait_status(adder, RASTEROP_COMPLETE);	adder->destination_x = FONT_X;	adder->destination_y = FONT_Y;	adder->fast_dest_dx = FONT_WIDTH;	adder->slow_dest_dy = CHAR_HEIGHT;/*---------------------------------------* setup for processor to bitmap xfer  */	write_ID(adder, CS_UPDATE_MASK, 0x0001);	adder->cmd = PBT | OCRB | 2 | DTE | 2;/*-----------------------------------------------* iteratively do the processor to bitmap xfer */	for (i = 0; i < ROWS; ++i) {	    /* PTOB a scan line */	    for (j = 0, k = i; j < 48; ++j) { 	        /* PTOB one scan of a char cell */		packed = q_font[k];		k += ROWS;		packed |= ((short)q_font[k] << 8);		k += ROWS;	        wait_status(adder, TX_READY);	        adder->id_data = packed;	    }	}}  /* ldfont *//***********************************************************************	led_control()... twiddle LK-201 LED's*************************************************************************	led_control(cmd, led_mask);*	int cmd;	LED enable/disable command*	int led_mask;	which LED(s) to twiddle**************/led_control(cmd, led_mask)int cmd;int led_mask;{	register int i;	register int status;	register struct duart *duart;	duart = (struct duart *) qdmap.duart;	for (i = 1000; i > 0; --i) {    	    if ((status = duart->statusA) & XMT_RDY) {        	duart->dataA = cmd;		break;    	    }	}	for (i = 1000; i > 0; --i) {    	    if ((status = duart->statusA) & XMT_RDY) {        	duart->dataA = led_mask;		break;    	    }	}	if (i == 0)	    return(BAD);	return(GOOD);} /* led_control *//******************************************************************* **	scroll_up()... move the screen up one character height***********************************************************************	calling convention:**		scroll_up(adder);*		struct adder *adder;    ;address of adder*********/scroll_up(adder)register struct adder *adder;{/*------------------------------------------* setup VIPER operand control registers  */	wait_status(adder, ADDRESS_COMPLETE);	write_ID(adder, CS_UPDATE_MASK, 0x00FF);  /* select all planes */	write_ID(adder, MASK_1, 0xFFFF);	write_ID(adder, VIPER_Z_LOAD | FOREGROUND_COLOR_Z, 255);	write_ID(adder, VIPER_Z_LOAD | BACKGROUND_COLOR_Z, 0);	write_ID(adder, SRC1_OCR_B, 			EXT_NONE | INT_SOURCE | ID | BAR_SHIFT_DELAY);	write_ID(adder, DST_OCR_B, 			EXT_NONE | INT_NONE | NO_ID | NO_BAR_SHIFT_DELAY);/*----------------------------------------* load DESTINATION origin and vectors  */	adder->fast_dest_dy = 0;	adder->slow_dest_dx = 0;	adder->error_1 = 0;	adder->error_2 = 0;	adder->rasterop_mode = DST_WRITE_ENABLE | NORMAL;	adder->destination_x = 0;	adder->fast_dest_dx = 1024;	adder->destination_y = 0;	adder->slow_dest_dy = 864 - CHAR_HEIGHT;/*-----------------------------------* load SOURCE origin and vectors  */	adder->source_1_x = 0;	adder->source_1_dx = 1024;	adder->source_1_y = 0 + CHAR_HEIGHT;	adder->source_1_dy = 864 - CHAR_HEIGHT;	write_ID(adder, LU_FUNCTION_R1, FULL_SRC_RESOLUTION | LF_SOURCE);	adder->cmd = RASTEROP | OCRB | 0 | S1E | DTE;/*--------------------------------------------* do a rectangle clear of last screen line */	write_ID(adder, MASK_1, 0xffff);	write_ID(adder, SOURCE, 0xffff);	write_ID(adder,DST_OCR_B,  	  	(EXT_NONE | INT_NONE | NO_ID | NO_BAR_SHIFT_DELAY));	write_ID(adder, VIPER_Z_LOAD | FOREGROUND_COLOR_Z, 0);	adder->error_1 = 0;	adder->error_2 = 0;	adder->slow_dest_dx = 0;	/* set up the width of	*/	adder->slow_dest_dy = CHAR_HEIGHT;	/* rectangle */	adder->rasterop_mode = (NORMAL | DST_WRITE_ENABLE) ;	wait_status(adder, RASTEROP_COMPLETE);	adder->destination_x = 0;	adder->destination_y = 864 - CHAR_HEIGHT;	adder->fast_dest_dx = 1024;	/* set up the height	*/	adder->fast_dest_dy = 0;	/* of rectangle		*/	write_ID(adder, LU_FUNCTION_R2, (FULL_SRC_RESOLUTION | LF_SOURCE));	adder->cmd = (RASTEROP | OCRB | LF_R2 | DTE ) ;} /* scroll_up */ /************************************************************************	set_defaults()... init the QDSS device and driver defaults***********************************************************************/set_defaults(){	setup_input();		/* init the DUART */	setup_dragon();		/* init the ADDER/VIPER stuff */	ldcursor();		/* load default cursor map */} /* set_defaults *//***********************************************************************	setup_dragon()... init the ADDER, VIPER, bitmaps, & color map**********************************************************************/setup_dragon(){	register struct adder *adder;	register struct dga *dga;	short *memcsr;	int i;			/* general purpose variables */	int status;	short top;		/* clipping/scrolling boundaries */	short bottom;	short right;	short left;	short *red;		/* color map pointers */	short *green;	short *blue;/*------------------* init for setup */	adder = (struct adder *) qdmap.adder;	dga = (struct dga *) qdmap.dga;	memcsr = (short *) qdmap.memcsr;		*memcsr = SYNC_ON;		/* blank screen and turn off LED's */	adder->command = CANCEL;/*----------------------* set monitor timing */	adder->x_scan_count_0 = 0x2800;	adder->x_scan_count_1 = 0x1020;	adder->x_scan_count_2 = 0x003A;	adder->x_scan_count_3 = 0x38F0;	adder->x_scan_count_4 = 0x6128;	adder->x_scan_count_5 = 0x093A;	adder->x_scan_count_6 = 0x313C;	adder->sync_phase_adj = 0x0100;	adder->x_scan_conf = 0x00C8;/*---------------------------------------------------------* got a bug in secound pass ADDER! lets take care of it */	/* normally, just use the code in the following bug fix code, but to 	* make repeated demos look pretty, load the registers as if there was	* no bug and then test to see if we are getting sync */	adder->y_scan_count_0 = 0x135F;	adder->y_scan_count_1 = 0x3363;	adder->y_scan_count_2 = 0x2366;	adder->y_scan_count_3 = 0x0388;	/* if no sync, do the bug fix code */	if (wait_status(adder, VSYNC) == BAD) {	    /* first load all Y scan registers with very short frame and	    * wait for scroll service.  This guarantees at least one SYNC 	    * to fix the pass 2 Adder initialization bug (synchronizes	    * XCINCH with DMSEEDH) */

⌨️ 快捷键说明

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