📄 qdcons.c
字号:
adder->y_scan_count_0 = 0x01; adder->y_scan_count_1 = 0x01; adder->y_scan_count_2 = 0x01; adder->y_scan_count_3 = 0x01; wait_status(adder, VSYNC); /* delay at least 1 full frame time */ wait_status(adder, VSYNC); /* now load the REAL sync values (in reverse order just to * be safe. */ adder->y_scan_count_3 = 0x0388; adder->y_scan_count_2 = 0x2366; adder->y_scan_count_1 = 0x3363; adder->y_scan_count_0 = 0x135F; }/*----------------------------* zero the index registers */ adder->x_index_pending = 0; adder->y_index_pending = 0; adder->x_index_new = 0; adder->y_index_new = 0; adder->x_index_old = 0; adder->y_index_old = 0; adder->pause = 0;/*----------------------------------------* set rasterop mode to normal pen down */ adder->rasterop_mode = DST_WRITE_ENABLE | DST_INDEX_ENABLE | NORMAL;/*--------------------------------------------------* set the rasterop registers to a default values */ adder->source_1_dx = 1; adder->source_1_dy = 1; adder->source_1_x = 0; adder->source_1_y = 0; adder->destination_x = 0; adder->destination_y = 0; adder->fast_dest_dx = 1; adder->fast_dest_dy = 0; adder->slow_dest_dx = 0; adder->slow_dest_dy = 1; adder->error_1 = 0; adder->error_2 = 0;/*------------------------* scale factor = unity */ adder->fast_scale = UNITY; adder->slow_scale = UNITY;/*-------------------------------* set the source 2 parameters */ adder->source_2_x = 0; adder->source_2_y = 0; adder->source_2_size = 0x0022;/*-----------------------------------------------* initialize plane addresses for eight vipers */ write_ID(adder, CS_UPDATE_MASK, 0x0001); write_ID(adder, PLANE_ADDRESS, 0x0000); write_ID(adder, CS_UPDATE_MASK, 0x0002); write_ID(adder, PLANE_ADDRESS, 0x0001); write_ID(adder, CS_UPDATE_MASK, 0x0004); write_ID(adder, PLANE_ADDRESS, 0x0002); write_ID(adder, CS_UPDATE_MASK, 0x0008); write_ID(adder, PLANE_ADDRESS, 0x0003); write_ID(adder, CS_UPDATE_MASK, 0x0010); write_ID(adder, PLANE_ADDRESS, 0x0004); write_ID(adder, CS_UPDATE_MASK, 0x0020); write_ID(adder, PLANE_ADDRESS, 0x0005); write_ID(adder, CS_UPDATE_MASK, 0x0040); write_ID(adder, PLANE_ADDRESS, 0x0006); write_ID(adder, CS_UPDATE_MASK, 0x0080); write_ID(adder, PLANE_ADDRESS, 0x0007); /* initialize the external registers. */ write_ID(adder, CS_UPDATE_MASK, 0x00FF); write_ID(adder, CS_SCROLL_MASK, 0x00FF); /* initialize resolution mode */ write_ID(adder, MEMORY_BUS_WIDTH, 0x000C); /* bus width = 16 */ write_ID(adder, RESOLUTION_MODE, 0x0000); /* one bit/pixel */ /* initialize viper registers */ write_ID(adder, SCROLL_CONSTANT, SCROLL_ENABLE|VIPER_LEFT|VIPER_UP); write_ID(adder, SCROLL_FILL, 0x0000);/*----------------------------------------------------* set clipping and scrolling limits to full screen */ for ( i = 1000, adder->status = 0 ; i > 0 && !((status = adder->status) & ADDRESS_COMPLETE) ; --i); if (i == 0) printf("timeout trying to setup clipping\n"); top = 0; bottom = 2048; left = 0; right = 1024; adder->x_clip_min = left; adder->x_clip_max = right; adder->y_clip_min = top; adder->y_clip_max = bottom; adder->scroll_x_min = left; adder->scroll_x_max = right; adder->scroll_y_min = top; adder->scroll_y_max = bottom; wait_status(adder, VSYNC); /* wait at LEAST 1 full frame */ wait_status(adder, VSYNC); adder->x_index_pending = left; adder->y_index_pending = top; adder->x_index_new = left; adder->y_index_new = top; adder->x_index_old = left; adder->y_index_old = top; for ( i = 1000, adder->status = 0 ; i > 0 && !((status = adder->status) & ADDRESS_COMPLETE) ; --i); if (i == 0) printf("timeout waiting for ADDRESS_COMPLETE bit\n"); write_ID(adder, LEFT_SCROLL_MASK, 0x0000); write_ID(adder, RIGHT_SCROLL_MASK, 0x0000);/*------------------------------------------------------------* set source and the mask register to all ones (ie: white) */ write_ID(adder, SOURCE, 0xFFFF); 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);/*--------------------------------------------------------------* initialize Operand Control Register banks for fill command */ write_ID(adder, SRC1_OCR_A, EXT_NONE | INT_M1_M2 | NO_ID | WAIT); write_ID(adder, SRC2_OCR_A, EXT_NONE | INT_SOURCE | NO_ID | NO_WAIT); write_ID(adder, DST_OCR_A, EXT_NONE | INT_NONE | NO_ID | NO_WAIT); write_ID(adder, SRC1_OCR_B, EXT_NONE | INT_SOURCE | NO_ID | WAIT); write_ID(adder, SRC2_OCR_B, EXT_NONE | INT_M1_M2 | NO_ID | NO_WAIT); write_ID(adder, DST_OCR_B, EXT_NONE | INT_NONE | NO_ID | NO_WAIT);/*------------------------------------------------------------------* init Logic Unit Function registers, (these are just common values,* and may be changed as required). */ write_ID(adder, LU_FUNCTION_R1, FULL_SRC_RESOLUTION | LF_SOURCE); write_ID(adder, LU_FUNCTION_R2, FULL_SRC_RESOLUTION | LF_SOURCE | INV_M1_M2); write_ID(adder, LU_FUNCTION_R3, FULL_SRC_RESOLUTION | LF_D_OR_S); write_ID(adder, LU_FUNCTION_R4, FULL_SRC_RESOLUTION | LF_D_XOR_S);/*----------------------------------------* load the color map for black & white */ for ( i = 0, adder->status = 0 ; i < 10000 && !((status = adder->status) & VSYNC) ; ++i); if (i == 0) printf("timeout waiting for VSYNC bit\n"); red = (short *) qdmap.red; green = (short *) qdmap.green; blue = (short *) qdmap.blue; *red++ = 0x00; /* black */ *green++ = 0x00; *blue++ = 0x00; *red-- = 0xFF; /* white */ *green-- = 0xFF; *blue-- = 0xFF; /*---------------------------------- * set color map for mouse cursor */ red += 254; green += 254; blue += 254; *red++ = 0x00; /* black */ *green++ = 0x00; *blue++ = 0x00; *red = 0xFF; /* white */ *green = 0xFF; *blue = 0xFF;/*---------------------------------------------------------------------------* clear the bitmap a piece at a time. Since the fast scroll clear only clears* the current displayed portion of the bitmap put a temporary value in the y* limit register so we can access whole bitmap */ adder->x_limit = 1024; adder->y_limit = 2048 - CHAR_HEIGHT; adder->y_offset_pending = 0; wait_status(adder, VSYNC); /* wait at LEAST 1 full frame */ wait_status(adder, VSYNC); adder->y_scroll_constant = SCROLL_ERASE; wait_status(adder, VSYNC); wait_status(adder, VSYNC); adder->y_offset_pending = 864; wait_status(adder, VSYNC); wait_status(adder, VSYNC); adder->y_scroll_constant = SCROLL_ERASE; wait_status(adder, VSYNC); wait_status(adder, VSYNC); adder->y_offset_pending = 1728; wait_status(adder, VSYNC); wait_status(adder, VSYNC); adder->y_scroll_constant = SCROLL_ERASE; wait_status(adder, VSYNC); wait_status(adder, VSYNC); adder->y_offset_pending = 0; /* back to normal */ wait_status(adder, VSYNC); wait_status(adder, VSYNC); adder->x_limit = MAX_SCREEN_X; adder->y_limit = MAX_SCREEN_Y + FONT_HEIGHT; *memcsr = SYNC_ON | UNBLANK; /* turn off leds and turn on video */ return(0);} /* setup_dragon *//******************************************************************** setup_input()... init the DUART and set defaults in input* devices*******************************************************************/setup_input(){ register struct duart *duart; /* DUART register structure pointer */ register int bits; int i, j; /* scratch variables */ short status;/*---------------* init stuff */ duart = (struct duart *) qdmap.duart;/*---------------------------------------------* setup the DUART for kbd & pointing device */ duart->cmdA = RESET_M; /* reset mode reg ptr for kbd */ duart->modeA = 0x13; /* 8 bits, no parity, rcv IE, */ /* no RTS control,char error mode */ duart->modeA = 0x07; /* 1 stop bit,CTS does not IE XMT */ /* no RTS control,no echo or loop */ duart->auxctl = 0x00; /* baud rate set 1 */ duart->clkselA = 0x99; /* 4800 baud for kbd */ /* reset everything for keyboard */ for (bits = RESET_M; bits < START_BREAK; bits += 0x10) duart->cmdA = bits; duart->cmdA = EN_RCV | EN_XMT; /* enbl xmt & rcv for kbd *//*--------------------------* init keyboard defaults *//* for (i = 500; i > 0; --i) { if ((status = duart->statusA) & XMT_RDY) { duart->dataA = LK_DEFAULTS; break; } } for (j = 0; j < 3; ++j) { for (i = 50000; i > 0; --i) { if ((status = duart->statusA) & RCV_RDY) { status = duart->dataA; break; } } } if (i == 0) printf("LK-201 init error\n");*//*--------* exit */ return(0);} /* setup_input *//************************************************************************ wait_status()... delay for at least one display frame time************************************************************************** calling convention:** wait_status(adder, mask);* struct *adder adder;* int mask;** return: BAD means that we timed out without ever seeing the* vertical sync status bit* GOOD otherwise***************/wait_status(adder, mask)register struct adder *adder;register int mask;{ register short status; int i; for ( i = 10000, adder->status = 0 ; i > 0 && !((status = adder->status) & mask) ; --i); if (i == 0) { printf("timeout polling for 0x%x in adder->status\n", mask); return(BAD); } return(GOOD);} /* wait_status *//************************************************************************ write_ID()... write out onto the ID bus************************************************************************** calling convention:** struct *adder adder; ;pntr to ADDER structure* short adrs; ;VIPER address* short data; ;data to be written* write_ID(adder);** return: BAD means that we timed out waiting for status bits* VIPER-access-specific status bits* GOOD otherwise***************/write_ID(adder, adrs, data)register struct adder *adder;register short adrs;register short data;{ int i; short status; for ( i = 100000, adder->status = 0 ; i > 0 && !((status = adder->status) & ADDRESS_COMPLETE) ; --i); if (i == 0) goto ERR; for ( i = 100000, adder->status = 0 ; i > 0 && !((status = adder->status) & TX_READY) ; --i); if (i > 0) { adder->id_data = data; adder->command = ID_LOAD | adrs; return(GOOD); }ERR: printf("timeout trying to write to VIPER\n"); return(BAD);} /* write_ID */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -