📄 qdcons.c
字号:
/******************************************************************* ** 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 + -