134514Smarc /* 234514Smarc * Copyright (c) 1982, 1986 Regents of the University of California. 334514Smarc * All rights reserved. The Berkeley software License Agreement 434514Smarc * specifies the terms and conditions for redistribution. 534514Smarc * 6*34659Smarc * @(#)qdcons.c 1.2 Berkeley 06/06/88 734514Smarc * 834514Smarc * derived from: @(#)qdcons.c 4.1 (ULTRIX 11/23/87 934514Smarc */ 1034514Smarc 1134514Smarc /************************************************************************ 1234514Smarc * 1334514Smarc * ULTRIX QDSS STANDALONE BOOT DEVICE DRIVER... 1434514Smarc * device driver to boot system with QDSS as console 1534514Smarc * 1634514Smarc *************************************************************************/ 1734514Smarc /************************************************************************ 1834514Smarc * * 1934514Smarc * Copyright (c) 1985 by * 2034514Smarc * Digital Equipment Corporation, Maynard, MA * 2134514Smarc * All rights reserved. * 2234514Smarc * * 2334514Smarc * This software is furnished under a license and may be used and * 2434514Smarc * copied only in accordance with the terms of such license and * 2534514Smarc * with the inclusion of the above copyright notice. This * 2634514Smarc * software or any other copies thereof may not be provided or * 2734514Smarc * otherwise made available to any other person. No title to and * 2834514Smarc * ownership of the software is hereby transferred. * 2934514Smarc * * 3034514Smarc * The information in this software is subject to change without * 3134514Smarc * notice and should not be construed as a commitment by Digital * 3234514Smarc * Equipment Corporation. * 3334514Smarc * * 3434514Smarc * Digital assumes no responsibility for the use or reliability * 3534514Smarc * of its software on equipment which is not supplied by Digital. * 3634514Smarc * * 3734514Smarc ************************************************************************* 38*34659Smarc * revision history: (should be moved into sccs comments) 3934514Smarc ************************************************************************* 4034514Smarc * 4134514Smarc * 09 oct 85 longo added uVAXII console ROM cursor reset to bottom of 4234514Smarc * the screen. Also spruced up qdputc() & scroll_up() 4334514Smarc * 02 oct 85 longo changed references to ADDRESS to be ADDRESS_COMPLETE 4434514Smarc * 23 aug 85 longo changed I/O page CSR address to be 0x1F00 4534514Smarc * 20 aug 85 longo created 4634514Smarc * 4734514Smarc ************************************************************************/ 4834514Smarc 4934514Smarc #include "../h/types.h" 5034514Smarc #include "../vax/cpu.h" 5134514Smarc #define KERNEL 5234514Smarc #include "../ultrix/qdioctl.h" 5334514Smarc #include "../ultrix/qevent.h" 5434514Smarc #include "../ultrix/qduser.h" 5534514Smarc #include "../ultrix/qdreg.h" 5634514Smarc #undef KERNEL 5734514Smarc 5834514Smarc /*----------------------------------------------------------------------- 5934514Smarc * constants used to set VAX ROM's cursor to bottom the of the screen */ 6034514Smarc 6134514Smarc #define NVR_ADRS 0x200B8024 6234514Smarc 6334514Smarc #define CURRENT_ROW 0x4C /* these are offsets to the ROM's scratch.. */ 6434514Smarc #define ROW_MIN 0x4D /* ..RAM start adrs as picked up out of NVR */ 6534514Smarc #define ROW_MAX 0x4E 6634514Smarc #define CURRENT_COL 0x50 6734514Smarc #define COL_MIN 0x51 6834514Smarc #define COL_MAX 0x52 6934514Smarc 7034514Smarc /*---------------------------------------- 7134514Smarc * LK201 keyboard state tracking struct */ 7234514Smarc 7334514Smarc struct q_keyboard { 7434514Smarc 7534514Smarc int shift; /* state variables */ 7634514Smarc int cntrl; 7734514Smarc int lock; 7834514Smarc char last; /* last character */ 7934514Smarc 8034514Smarc } q_keyboard; 8134514Smarc 8234514Smarc int qdputc(), qdgetc(); 8334514Smarc 8434514Smarc extern (*v_putc)(),(*v_getc)(); 8534514Smarc 8634514Smarc /*---------------------------- 8734514Smarc * general purpose defines */ 8834514Smarc 8934514Smarc #define BAD -1 9034514Smarc #define GOOD 0 9134514Smarc 9234514Smarc /*---------------------------------------------- 9334514Smarc * console cursor bitmap (block cursor type) */ 9434514Smarc 9534514Smarc short cons_cursor[32] = { /* white block cursor */ 9634514Smarc 9734514Smarc /* A */ 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 9834514Smarc 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 9934514Smarc /* B */ 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 10034514Smarc 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF 10134514Smarc 10234514Smarc }; 10334514Smarc 10434514Smarc /*------------------------------------- 10534514Smarc * constants used in font operations */ 10634514Smarc 10734514Smarc #define CHARS 95 /* # of chars in the font */ 10834514Smarc #define CHAR_HEIGHT 15 /* char height in pixels */ 10934514Smarc #define CHAR_WIDTH 8 /* char width in pixels*/ 11034514Smarc #define FONT_WIDTH (CHAR_WIDTH * CHARS) /* font width in pixels */ 11134514Smarc #define ROWS CHAR_HEIGHT 11234514Smarc 11334514Smarc #define FONT_X 0 /* font's off screen adrs */ 11434514Smarc #define FONT_Y (2047 - CHAR_HEIGHT) 11534514Smarc /* 11634514Smarc #define FONT_Y 200 11734514Smarc */ 11834514Smarc 11934514Smarc extern char q_font[]; /* reference font object code */ 12034514Smarc 12134514Smarc extern char q_key[]; /* reference key xlation tables */ 12234514Smarc extern char q_shift_key[]; 12334514Smarc extern char *q_special[]; 12434514Smarc 12534514Smarc /*---------------------------- 12634514Smarc * console cursor structure */ 12734514Smarc 12834514Smarc struct cons_cur { 12934514Smarc int x; 13034514Smarc int y; 13134514Smarc } cursor; 13234514Smarc 13334514Smarc /*------------------------------------------ 13434514Smarc * MicroVAX-II q-bus addressing constants */ 13534514Smarc 13634514Smarc #define QMEMBASE 0x30000000 13734514Smarc #define QDSSCSR 0x20001F00 13834514Smarc 13934514Smarc #define CHUNK (64 * 1024) 14034514Smarc #define QMEMSIZE (1024 * 1024 * 4) 14134514Smarc #define QDBASE (QMEMBASE + QMEMSIZE - CHUNK) 14234514Smarc 14334514Smarc /*------------------------------------------------------------------ 14434514Smarc * QDSS register address offsets from start of QDSS address space */ 14534514Smarc 14634514Smarc #define QDSIZE (52 * 1024) /* size of entire QDSS foot print */ 14734514Smarc 14834514Smarc #define TMPSIZE (16 * 1024) /* template RAM is 8k SHORT WORDS */ 14934514Smarc #define TMPSTART 0x8000 /* offset of template RAM from base adrs */ 15034514Smarc 15134514Smarc #define REGSIZE (5 * 512) /* regs touch 2.5k (5 pages) of addr space */ 15234514Smarc #define REGSTART 0xC000 /* offset of reg pages from base adrs */ 15334514Smarc 15434514Smarc #define ADDER (REGSTART+0x000) 15534514Smarc #define DGA (REGSTART+0x200) 15634514Smarc #define DUART (REGSTART+0x400) 15734514Smarc #define MEMCSR (REGSTART+0x800) 15834514Smarc 15934514Smarc #define CLRSIZE (3 * 512) /* color map size */ 16034514Smarc #define CLRSTART (REGSTART+0xA00) /* color map start offset from base */ 16134514Smarc /* 0x0C00 really */ 16234514Smarc #define RED (CLRSTART+0x000) 16334514Smarc #define BLUE (CLRSTART+0x200) 16434514Smarc #define GREEN (CLRSTART+0x400) 16534514Smarc 16634514Smarc /*--------------------------------------- 16734514Smarc * QDSS register address map structure */ 16834514Smarc 16934514Smarc struct qdmap qdmap; 17034514Smarc 17134514Smarc /************************************************************************ 17234514Smarc ************************************************************************* 17334514Smarc ************************************************************************* 17434514Smarc * 17534514Smarc * EXTERNALLY CALLED ROUTINES START HERE: 17634514Smarc * 17734514Smarc ************************************************************************* 17834514Smarc ************************************************************************* 17934514Smarc ************************************************************************/ 18034514Smarc 18134514Smarc /************************************************************************ 18234514Smarc * 18334514Smarc * qd_init()... init the QDSS into a physical memory system 18434514Smarc * 18534514Smarc ************************************************************************/ 18634514Smarc 18734514Smarc qd_init() 18834514Smarc { 18934514Smarc register char *ROM_console; 19034514Smarc register short *NVR; 19134514Smarc register int i; 19234514Smarc 19334514Smarc caddr_t qdaddr; 19434514Smarc struct dga *dga; 19534514Smarc 19634514Smarc qdaddr = (caddr_t) QDSSCSR; 19734514Smarc if (badaddr(qdaddr, sizeof(short))) 19834514Smarc return(0); 19934514Smarc 20034514Smarc *(short *)qdaddr = (short) (QDBASE >> 16); 20134514Smarc 20234514Smarc /*---------------------------------------------------------------------- 20334514Smarc * load qdmap struct with the physical addresses of the QDSS elements */ 20434514Smarc 20534514Smarc qdmap.template = (caddr_t) QDBASE + TMPSTART; 20634514Smarc qdmap.adder = (caddr_t) QDBASE + ADDER; 20734514Smarc qdmap.dga = (caddr_t) QDBASE + DGA; 20834514Smarc qdmap.duart = (caddr_t) QDBASE + DUART; 20934514Smarc qdmap.memcsr = (caddr_t) QDBASE + MEMCSR; 21034514Smarc qdmap.red = (caddr_t) QDBASE + RED; 21134514Smarc qdmap.blue = (caddr_t) QDBASE + BLUE; 21234514Smarc qdmap.green = (caddr_t) QDBASE + GREEN; 21334514Smarc 21434514Smarc /*-------------------------- 21534514Smarc * no interrupts allowed! */ 21634514Smarc 21734514Smarc dga = (struct dga *) qdmap.dga; 21834514Smarc dga->csr = HALT; 21934514Smarc dga->csr |= CURS_ENB; 22034514Smarc 22134514Smarc /*---------------------------- 22234514Smarc * init the default values */ 22334514Smarc 22434514Smarc q_keyboard.shift = 0; /* init keyboard state tracking */ 22534514Smarc q_keyboard.lock = 0; 22634514Smarc q_keyboard.cntrl = 0; 22734514Smarc q_keyboard.last = 0; 22834514Smarc 22934514Smarc cursor.x = 0; /* init cursor to top left */ 23034514Smarc cursor.y = 0; 23134514Smarc 23234514Smarc set_defaults(); /* setup the default device */ 23334514Smarc ldfont(); /* PtoB the font into off-screen */ 23434514Smarc 23534514Smarc /*-------------------------------------------------------------------- 23634514Smarc * tell the VAX ROM that the cursor is at the bottom of the screen */ 23734514Smarc 23834514Smarc NVR = (short *) NVR_ADRS; 23934514Smarc 24034514Smarc i = *NVR++ & 0xFF; 24134514Smarc i |= (*NVR++ & 0xFF) << 8; 24234514Smarc i |= (*NVR++ & 0xFF) << 16; 24334514Smarc i |= (*NVR++ & 0xFF) << 24; 24434514Smarc 24534514Smarc ROM_console = (char *) i; 24634514Smarc 24734514Smarc ROM_console[CURRENT_COL] = ROM_console[COL_MIN]; 24834514Smarc ROM_console[CURRENT_ROW] = ROM_console[ROW_MAX]; 24934514Smarc 25034514Smarc /*---------------------------------------------------------- 25134514Smarc * smash system virtual console service routine addresses */ 25234514Smarc 25334514Smarc v_getc = qdgetc; 25434514Smarc v_putc = qdputc; 25534514Smarc 25634514Smarc return(1); 25734514Smarc 25834514Smarc } /* qd_init */ 25934514Smarc 26034514Smarc /******************************************************************* 26134514Smarc * 26234514Smarc * qdputc()... output a character to the QDSS screen 26334514Smarc * 26434514Smarc ******************************************************************** 26534514Smarc * 26634514Smarc * calling convention: 26734514Smarc * 26834514Smarc * qdputc(chr); 26934514Smarc * char chr; ;character to be displayed 27034514Smarc * 27134514Smarc ********/ 27234514Smarc 27334514Smarc qdputc(chr) 27434514Smarc char chr; 27534514Smarc { 27634514Smarc register struct adder *adder; 27734514Smarc register struct dga *dga; 27834514Smarc register int i; 27934514Smarc 28034514Smarc short x; 28134514Smarc 28234514Smarc adder = (struct adder *) qdmap.adder; 28334514Smarc dga = (struct dga *) qdmap.dga; 28434514Smarc 28534514Smarc /*--------------------------- 28634514Smarc * non display character? */ 28734514Smarc 28834514Smarc chr &= 0x7F; 28934514Smarc 29034514Smarc switch (chr) { 29134514Smarc 29234514Smarc case '\r': /* return char */ 29334514Smarc cursor.x = 0; 29434514Smarc dga->x_cursor = TRANX(cursor.x); 29534514Smarc return(0); 29634514Smarc 29734514Smarc case '\t': /* tab char */ 29834514Smarc 29934514Smarc for (i = 8 - ((cursor.x >> 3) & 0x07); i > 0; --i) { 30034514Smarc qdputc(' '); 30134514Smarc } 30234514Smarc return(0); 30334514Smarc 30434514Smarc case '\n': /* line feed char */ 30534514Smarc 30634514Smarc if ((cursor.y += CHAR_HEIGHT) > (863 - CHAR_HEIGHT)) { 30734514Smarc cursor.y -= CHAR_HEIGHT; 30834514Smarc scroll_up(adder); 30934514Smarc } 31034514Smarc dga->y_cursor = TRANY(cursor.y); 31134514Smarc return(0); 31234514Smarc 31334514Smarc case '\b': /* backspace char */ 31434514Smarc if (cursor.x > 0) { 31534514Smarc cursor.x -= CHAR_WIDTH; 31634514Smarc qdputc(' '); 31734514Smarc cursor.x -= CHAR_WIDTH; 31834514Smarc dga->x_cursor = TRANX(cursor.x); 31934514Smarc } 32034514Smarc return(0); 32134514Smarc 32234514Smarc default: 32334514Smarc if (chr < ' ' || chr > '~') { 32434514Smarc return(0); 32534514Smarc } 32634514Smarc } 32734514Smarc 32834514Smarc /*------------------------------------------ 32934514Smarc * setup VIPER operand control registers */ 33034514Smarc 33134514Smarc write_ID(adder, CS_UPDATE_MASK, 0x0001); /* select plane #0 */ 33234514Smarc write_ID(adder, SRC1_OCR_B, 33334514Smarc EXT_NONE | INT_SOURCE | ID | BAR_SHIFT_DELAY); 33434514Smarc 33534514Smarc write_ID(adder, CS_UPDATE_MASK, 0x00FE); /* select other planes */ 33634514Smarc write_ID(adder, SRC1_OCR_B, 33734514Smarc EXT_SOURCE | INT_NONE | NO_ID | BAR_SHIFT_DELAY); 33834514Smarc 33934514Smarc write_ID(adder, CS_UPDATE_MASK, 0x00FF); /* select all planes */ 34034514Smarc write_ID(adder, DST_OCR_B, 34134514Smarc EXT_NONE | INT_NONE | NO_ID | NO_BAR_SHIFT_DELAY); 34234514Smarc 34334514Smarc write_ID(adder, MASK_1, 0xFFFF); 34434514Smarc write_ID(adder, VIPER_Z_LOAD | FOREGROUND_COLOR_Z, 1); 34534514Smarc write_ID(adder, VIPER_Z_LOAD | BACKGROUND_COLOR_Z, 0); 34634514Smarc 34734514Smarc /*---------------------------------------- 34834514Smarc * load DESTINATION origin and vectors */ 34934514Smarc 35034514Smarc adder->fast_dest_dy = 0; 35134514Smarc adder->slow_dest_dx = 0; 35234514Smarc adder->error_1 = 0; 35334514Smarc adder->error_2 = 0; 35434514Smarc 35534514Smarc adder->rasterop_mode = DST_WRITE_ENABLE | NORMAL; 35634514Smarc 35734514Smarc wait_status(adder, RASTEROP_COMPLETE); 35834514Smarc 35934514Smarc adder->destination_x = cursor.x; 36034514Smarc adder->fast_dest_dx = CHAR_WIDTH; 36134514Smarc 36234514Smarc adder->destination_y = cursor.y; 36334514Smarc adder->slow_dest_dy = CHAR_HEIGHT; 36434514Smarc 36534514Smarc /*----------------------------------- 36634514Smarc * load SOURCE origin and vectors */ 36734514Smarc 36834514Smarc adder->source_1_x = FONT_X + ((chr - ' ') * CHAR_WIDTH); 36934514Smarc adder->source_1_y = FONT_Y; 37034514Smarc 37134514Smarc adder->source_1_dx = CHAR_WIDTH; 37234514Smarc adder->source_1_dy = CHAR_HEIGHT; 37334514Smarc 37434514Smarc write_ID(adder, LU_FUNCTION_R1, FULL_SRC_RESOLUTION | LF_SOURCE); 37534514Smarc adder->cmd = RASTEROP | OCRB | 0 | S1E | DTE; 37634514Smarc 37734514Smarc /*------------------------------------- 37834514Smarc * update console cursor coordinates */ 37934514Smarc 38034514Smarc cursor.x += CHAR_WIDTH; 38134514Smarc dga->x_cursor = TRANX(cursor.x); 38234514Smarc 38334514Smarc if (cursor.x > (1024 - CHAR_WIDTH)) { 38434514Smarc qdputc('\r'); 38534514Smarc qdputc('\n'); 38634514Smarc } 38734514Smarc 38834514Smarc } /* qdputc */ 38934514Smarc 39034514Smarc /******************************************************************* 39134514Smarc * 39234514Smarc * qdgetc()... get a character from the LK201 39334514Smarc * 39434514Smarc *******************************************************************/ 39534514Smarc 39634514Smarc qdgetc() 39734514Smarc { 39834514Smarc register short key; 39934514Smarc register char chr; 40034514Smarc register struct duart *duart; 40134514Smarc 40234514Smarc u_int status; 40334514Smarc 40434514Smarc duart = (struct duart *) qdmap.duart; 40534514Smarc 40634514Smarc /*-------------------------------------- 40734514Smarc * Get a character from the keyboard. */ 40834514Smarc 40934514Smarc LOOP: 41034514Smarc while (!((status = duart->statusA) & RCV_RDY)) 41134514Smarc ; 41234514Smarc 41334514Smarc key = duart->dataA; 41434514Smarc key &= 0xFF; 41534514Smarc 41634514Smarc /*-------------------------------------- 41734514Smarc * Check for various keyboard errors */ 41834514Smarc 41934514Smarc if( key == LK_POWER_ERROR || key == LK_KDOWN_ERROR || 42034514Smarc key == LK_INPUT_ERROR || key == LK_OUTPUT_ERROR) { 42134514Smarc printf("Keyboard error, code = %x\n", key); 42234514Smarc return(0); 42334514Smarc } 42434514Smarc 42534514Smarc if (key < LK_LOWEST) 42634514Smarc return(0); 42734514Smarc 42834514Smarc /*--------------------------------- 42934514Smarc * See if its a state change key */ 43034514Smarc 43134514Smarc switch (key) { 43234514Smarc 43334514Smarc case LOCK: 43434514Smarc q_keyboard.lock ^= 0xffff; /* toggle */ 43534514Smarc if (q_keyboard.lock) 43634514Smarc led_control(LK_LED_ENABLE, LK_LED_LOCK); 43734514Smarc else 43834514Smarc led_control(LK_LED_DISABLE, LK_LED_LOCK); 43934514Smarc goto LOOP; 44034514Smarc 44134514Smarc case SHIFT: 44234514Smarc q_keyboard.shift ^= 0xFFFF; 44334514Smarc goto LOOP; 44434514Smarc 44534514Smarc case CNTRL: 44634514Smarc q_keyboard.cntrl ^= 0xFFFF; 44734514Smarc goto LOOP; 44834514Smarc 44934514Smarc case ALLUP: 45034514Smarc q_keyboard.cntrl = 0; 45134514Smarc q_keyboard.shift = 0; 45234514Smarc goto LOOP; 45334514Smarc 45434514Smarc case REPEAT: 45534514Smarc chr = q_keyboard.last; 45634514Smarc break; 45734514Smarc 45834514Smarc /*------------------------------------------------------- 45934514Smarc * Test for cntrl characters. If set, see if the character 46034514Smarc * is elligible to become a control character. */ 46134514Smarc 46234514Smarc default: 46334514Smarc 46434514Smarc if (q_keyboard.cntrl) { 46534514Smarc chr = q_key[key]; 46634514Smarc if (chr >= ' ' && chr <= '~') 46734514Smarc chr &= 0x1F; 46834514Smarc } 46934514Smarc else if ( q_keyboard.lock || q_keyboard.shift ) 47034514Smarc chr = q_shift_key[key]; 47134514Smarc else 47234514Smarc chr = q_key[key]; 47334514Smarc break; 47434514Smarc } 47534514Smarc 47634514Smarc if (chr < ' ' && chr > '~') /* if input is non-displayable */ 47734514Smarc return(0); /* ..then pitch it! */ 47834514Smarc 47934514Smarc q_keyboard.last = chr; 48034514Smarc 48134514Smarc /*----------------------------------- 48234514Smarc * Check for special function keys */ 48334514Smarc 48434514Smarc if (chr & 0x80) /* pitch the function keys */ 48534514Smarc return(0); 48634514Smarc else 48734514Smarc return(chr); 48834514Smarc 48934514Smarc } /* qdgetc */ 49034514Smarc 49134514Smarc /************************************************************************ 49234514Smarc ************************************************************************* 49334514Smarc ************************************************************************* 49434514Smarc * 49534514Smarc * INTERNALLY USED ROUTINES START HERE: 49634514Smarc * 49734514Smarc ************************************************************************* 49834514Smarc ************************************************************************* 49934514Smarc ************************************************************************/ 50034514Smarc 50134514Smarc /******************************************************************** 50234514Smarc * 50334514Smarc * ldcursor()... load the mouse cursor's template RAM bitmap 50434514Smarc * 50534514Smarc ********************************************************************/ 50634514Smarc 50734514Smarc ldcursor() 50834514Smarc { 50934514Smarc register struct dga *dga; 51034514Smarc register short *temp; 51134514Smarc register int i; 51234514Smarc 51334514Smarc int cursor; 51434514Smarc 51534514Smarc dga = (struct dga *) qdmap.dga; 51634514Smarc temp = (short *) qdmap.template; 51734514Smarc 51834514Smarc temp += (8 * 1024) - 32; /* cursor is 32 WORDS from the end */ 51934514Smarc /* ..of the 8k WORD template space */ 52034514Smarc for (i = 0; i < 32; ++i) 52134514Smarc *temp++ = cons_cursor[i]; 52234514Smarc 52334514Smarc return(0); 52434514Smarc 52534514Smarc } /* ldcursor */ 52634514Smarc 52734514Smarc /********************************************************************** 52834514Smarc * 52934514Smarc * ldfont()... put the console font in the QDSS off-screen memory 53034514Smarc * 53134514Smarc **********************************************************************/ 53234514Smarc 53334514Smarc ldfont() 53434514Smarc { 53534514Smarc register struct adder *adder; 53634514Smarc 53734514Smarc int i; /* scratch variables */ 53834514Smarc int j; 53934514Smarc int k; 54034514Smarc short packed; 54134514Smarc 54234514Smarc adder = (struct adder *) qdmap.adder; 54334514Smarc 54434514Smarc /*------------------------------------------ 54534514Smarc * setup VIPER operand control registers */ 54634514Smarc 54734514Smarc write_ID(adder, MASK_1, 0xFFFF); 54834514Smarc write_ID(adder, VIPER_Z_LOAD | FOREGROUND_COLOR_Z, 255); 54934514Smarc write_ID(adder, VIPER_Z_LOAD | BACKGROUND_COLOR_Z, 0); 55034514Smarc 55134514Smarc write_ID(adder, SRC1_OCR_B, 55234514Smarc EXT_NONE | INT_NONE | ID | BAR_SHIFT_DELAY); 55334514Smarc write_ID(adder, SRC2_OCR_B, 55434514Smarc EXT_NONE | INT_NONE | ID | BAR_SHIFT_DELAY); 55534514Smarc write_ID(adder, DST_OCR_B, 55634514Smarc EXT_SOURCE | INT_NONE | NO_ID | NO_BAR_SHIFT_DELAY); 55734514Smarc 55834514Smarc adder->rasterop_mode = DST_WRITE_ENABLE | DST_INDEX_ENABLE | NORMAL; 55934514Smarc 56034514Smarc /*-------------------------- 56134514Smarc * load destination data */ 56234514Smarc 56334514Smarc wait_status(adder, RASTEROP_COMPLETE); 56434514Smarc 56534514Smarc adder->destination_x = FONT_X; 56634514Smarc adder->destination_y = FONT_Y; 56734514Smarc adder->fast_dest_dx = FONT_WIDTH; 56834514Smarc adder->slow_dest_dy = CHAR_HEIGHT; 56934514Smarc 57034514Smarc /*--------------------------------------- 57134514Smarc * setup for processor to bitmap xfer */ 57234514Smarc 57334514Smarc write_ID(adder, CS_UPDATE_MASK, 0x0001); 57434514Smarc adder->cmd = PBT | OCRB | 2 | DTE | 2; 57534514Smarc 57634514Smarc /*----------------------------------------------- 57734514Smarc * iteratively do the processor to bitmap xfer */ 57834514Smarc 57934514Smarc for (i = 0; i < ROWS; ++i) { 58034514Smarc 58134514Smarc /* PTOB a scan line */ 58234514Smarc 58334514Smarc for (j = 0, k = i; j < 48; ++j) { 58434514Smarc 58534514Smarc /* PTOB one scan of a char cell */ 58634514Smarc 58734514Smarc packed = q_font[k]; 58834514Smarc k += ROWS; 58934514Smarc packed |= ((short)q_font[k] << 8); 59034514Smarc k += ROWS; 59134514Smarc 59234514Smarc wait_status(adder, TX_READY); 59334514Smarc adder->id_data = packed; 59434514Smarc } 59534514Smarc } 59634514Smarc 59734514Smarc } /* ldfont */ 59834514Smarc 59934514Smarc /********************************************************************* 60034514Smarc * 60134514Smarc * led_control()... twiddle LK-201 LED's 60234514Smarc * 60334514Smarc ********************************************************************** 60434514Smarc * 60534514Smarc * led_control(cmd, led_mask); 60634514Smarc * int cmd; LED enable/disable command 60734514Smarc * int led_mask; which LED(s) to twiddle 60834514Smarc * 60934514Smarc *************/ 61034514Smarc 61134514Smarc led_control(cmd, led_mask) 61234514Smarc int cmd; 61334514Smarc int led_mask; 61434514Smarc { 61534514Smarc register int i; 61634514Smarc register int status; 61734514Smarc register struct duart *duart; 61834514Smarc 61934514Smarc duart = (struct duart *) qdmap.duart; 62034514Smarc 62134514Smarc for (i = 1000; i > 0; --i) { 62234514Smarc if ((status = duart->statusA) & XMT_RDY) { 62334514Smarc duart->dataA = cmd; 62434514Smarc break; 62534514Smarc } 62634514Smarc } 62734514Smarc 62834514Smarc for (i = 1000; i > 0; --i) { 62934514Smarc if ((status = duart->statusA) & XMT_RDY) { 63034514Smarc duart->dataA = led_mask; 63134514Smarc break; 63234514Smarc } 63334514Smarc } 63434514Smarc 63534514Smarc if (i == 0) 63634514Smarc return(BAD); 63734514Smarc 63834514Smarc return(GOOD); 63934514Smarc 64034514Smarc } /* led_control */ 64134514Smarc 64234514Smarc /******************************************************************* 64334514Smarc * 64434514Smarc * scroll_up()... move the screen up one character height 64534514Smarc * 64634514Smarc ******************************************************************** 64734514Smarc * 64834514Smarc * calling convention: 64934514Smarc * 65034514Smarc * scroll_up(adder); 65134514Smarc * struct adder *adder; ;address of adder 65234514Smarc * 65334514Smarc ********/ 65434514Smarc 65534514Smarc scroll_up(adder) 65634514Smarc register struct adder *adder; 65734514Smarc { 65834514Smarc 65934514Smarc /*------------------------------------------ 66034514Smarc * setup VIPER operand control registers */ 66134514Smarc 66234514Smarc wait_status(adder, ADDRESS_COMPLETE); 66334514Smarc 66434514Smarc write_ID(adder, CS_UPDATE_MASK, 0x00FF); /* select all planes */ 66534514Smarc 66634514Smarc write_ID(adder, MASK_1, 0xFFFF); 66734514Smarc write_ID(adder, VIPER_Z_LOAD | FOREGROUND_COLOR_Z, 255); 66834514Smarc write_ID(adder, VIPER_Z_LOAD | BACKGROUND_COLOR_Z, 0); 66934514Smarc 67034514Smarc write_ID(adder, SRC1_OCR_B, 67134514Smarc EXT_NONE | INT_SOURCE | ID | BAR_SHIFT_DELAY); 67234514Smarc write_ID(adder, DST_OCR_B, 67334514Smarc EXT_NONE | INT_NONE | NO_ID | NO_BAR_SHIFT_DELAY); 67434514Smarc 67534514Smarc /*---------------------------------------- 67634514Smarc * load DESTINATION origin and vectors */ 67734514Smarc 67834514Smarc adder->fast_dest_dy = 0; 67934514Smarc adder->slow_dest_dx = 0; 68034514Smarc adder->error_1 = 0; 68134514Smarc adder->error_2 = 0; 68234514Smarc 68334514Smarc adder->rasterop_mode = DST_WRITE_ENABLE | NORMAL; 68434514Smarc 68534514Smarc adder->destination_x = 0; 68634514Smarc adder->fast_dest_dx = 1024; 68734514Smarc 68834514Smarc adder->destination_y = 0; 68934514Smarc adder->slow_dest_dy = 864 - CHAR_HEIGHT; 69034514Smarc 69134514Smarc /*----------------------------------- 69234514Smarc * load SOURCE origin and vectors */ 69334514Smarc 69434514Smarc adder->source_1_x = 0; 69534514Smarc adder->source_1_dx = 1024; 69634514Smarc 69734514Smarc adder->source_1_y = 0 + CHAR_HEIGHT; 69834514Smarc adder->source_1_dy = 864 - CHAR_HEIGHT; 69934514Smarc 70034514Smarc write_ID(adder, LU_FUNCTION_R1, FULL_SRC_RESOLUTION | LF_SOURCE); 70134514Smarc adder->cmd = RASTEROP | OCRB | 0 | S1E | DTE; 70234514Smarc 70334514Smarc /*-------------------------------------------- 70434514Smarc * do a rectangle clear of last screen line */ 70534514Smarc 70634514Smarc write_ID(adder, MASK_1, 0xffff); 70734514Smarc write_ID(adder, SOURCE, 0xffff); 70834514Smarc write_ID(adder,DST_OCR_B, 70934514Smarc (EXT_NONE | INT_NONE | NO_ID | NO_BAR_SHIFT_DELAY)); 71034514Smarc write_ID(adder, VIPER_Z_LOAD | FOREGROUND_COLOR_Z, 0); 71134514Smarc adder->error_1 = 0; 71234514Smarc adder->error_2 = 0; 71334514Smarc adder->slow_dest_dx = 0; /* set up the width of */ 71434514Smarc adder->slow_dest_dy = CHAR_HEIGHT; /* rectangle */ 71534514Smarc 71634514Smarc adder->rasterop_mode = (NORMAL | DST_WRITE_ENABLE) ; 71734514Smarc wait_status(adder, RASTEROP_COMPLETE); 71834514Smarc adder->destination_x = 0; 71934514Smarc adder->destination_y = 864 - CHAR_HEIGHT; 72034514Smarc 72134514Smarc adder->fast_dest_dx = 1024; /* set up the height */ 72234514Smarc adder->fast_dest_dy = 0; /* of rectangle */ 72334514Smarc 72434514Smarc write_ID(adder, LU_FUNCTION_R2, (FULL_SRC_RESOLUTION | LF_SOURCE)); 72534514Smarc adder->cmd = (RASTEROP | OCRB | LF_R2 | DTE ) ; 72634514Smarc 72734514Smarc } /* scroll_up */ 72834514Smarc 72934514Smarc /********************************************************************** 73034514Smarc * 73134514Smarc * set_defaults()... init the QDSS device and driver defaults 73234514Smarc * 73334514Smarc **********************************************************************/ 73434514Smarc 73534514Smarc set_defaults() 73634514Smarc { 73734514Smarc setup_input(); /* init the DUART */ 73834514Smarc setup_dragon(); /* init the ADDER/VIPER stuff */ 73934514Smarc ldcursor(); /* load default cursor map */ 74034514Smarc 74134514Smarc } /* set_defaults */ 74234514Smarc 74334514Smarc /********************************************************************* 74434514Smarc * 74534514Smarc * setup_dragon()... init the ADDER, VIPER, bitmaps, & color map 74634514Smarc * 74734514Smarc *********************************************************************/ 74834514Smarc 74934514Smarc setup_dragon() 75034514Smarc { 75134514Smarc 75234514Smarc register struct adder *adder; 75334514Smarc register struct dga *dga; 75434514Smarc short *memcsr; 75534514Smarc 75634514Smarc int i; /* general purpose variables */ 75734514Smarc int status; 75834514Smarc 75934514Smarc short top; /* clipping/scrolling boundaries */ 76034514Smarc short bottom; 76134514Smarc short right; 76234514Smarc short left; 76334514Smarc 76434514Smarc short *red; /* color map pointers */ 76534514Smarc short *green; 76634514Smarc short *blue; 76734514Smarc 76834514Smarc /*------------------ 76934514Smarc * init for setup */ 77034514Smarc 77134514Smarc adder = (struct adder *) qdmap.adder; 77234514Smarc dga = (struct dga *) qdmap.dga; 77334514Smarc memcsr = (short *) qdmap.memcsr; 77434514Smarc 77534514Smarc *memcsr = SYNC_ON; /* blank screen and turn off LED's */ 77634514Smarc adder->command = CANCEL; 77734514Smarc 77834514Smarc /*---------------------- 77934514Smarc * set monitor timing */ 78034514Smarc 78134514Smarc adder->x_scan_count_0 = 0x2800; 78234514Smarc adder->x_scan_count_1 = 0x1020; 78334514Smarc adder->x_scan_count_2 = 0x003A; 78434514Smarc adder->x_scan_count_3 = 0x38F0; 78534514Smarc adder->x_scan_count_4 = 0x6128; 78634514Smarc adder->x_scan_count_5 = 0x093A; 78734514Smarc adder->x_scan_count_6 = 0x313C; 78834514Smarc adder->sync_phase_adj = 0x0100; 78934514Smarc adder->x_scan_conf = 0x00C8; 79034514Smarc 79134514Smarc /*--------------------------------------------------------- 79234514Smarc * got a bug in secound pass ADDER! lets take care of it */ 79334514Smarc 79434514Smarc /* normally, just use the code in the following bug fix code, but to 79534514Smarc * make repeated demos look pretty, load the registers as if there was 79634514Smarc * no bug and then test to see if we are getting sync */ 79734514Smarc 79834514Smarc adder->y_scan_count_0 = 0x135F; 79934514Smarc adder->y_scan_count_1 = 0x3363; 80034514Smarc adder->y_scan_count_2 = 0x2366; 80134514Smarc adder->y_scan_count_3 = 0x0388; 80234514Smarc 80334514Smarc /* if no sync, do the bug fix code */ 80434514Smarc 80534514Smarc if (wait_status(adder, VSYNC) == BAD) { 80634514Smarc 80734514Smarc /* first load all Y scan registers with very short frame and 80834514Smarc * wait for scroll service. This guarantees at least one SYNC 80934514Smarc * to fix the pass 2 Adder initialization bug (synchronizes 81034514Smarc * XCINCH with DMSEEDH) */ 81134514Smarc 81234514Smarc adder->y_scan_count_0 = 0x01; 81334514Smarc adder->y_scan_count_1 = 0x01; 81434514Smarc adder->y_scan_count_2 = 0x01; 81534514Smarc adder->y_scan_count_3 = 0x01; 81634514Smarc 81734514Smarc wait_status(adder, VSYNC); /* delay at least 1 full frame time */ 81834514Smarc wait_status(adder, VSYNC); 81934514Smarc 82034514Smarc /* now load the REAL sync values (in reverse order just to 82134514Smarc * be safe. */ 82234514Smarc 82334514Smarc adder->y_scan_count_3 = 0x0388; 82434514Smarc adder->y_scan_count_2 = 0x2366; 82534514Smarc adder->y_scan_count_1 = 0x3363; 82634514Smarc adder->y_scan_count_0 = 0x135F; 82734514Smarc } 82834514Smarc 82934514Smarc /*---------------------------- 83034514Smarc * zero the index registers */ 83134514Smarc 83234514Smarc adder->x_index_pending = 0; 83334514Smarc adder->y_index_pending = 0; 83434514Smarc adder->x_index_new = 0; 83534514Smarc adder->y_index_new = 0; 83634514Smarc adder->x_index_old = 0; 83734514Smarc adder->y_index_old = 0; 83834514Smarc 83934514Smarc adder->pause = 0; 84034514Smarc 84134514Smarc /*---------------------------------------- 84234514Smarc * set rasterop mode to normal pen down */ 84334514Smarc 84434514Smarc adder->rasterop_mode = DST_WRITE_ENABLE | DST_INDEX_ENABLE | NORMAL; 84534514Smarc 84634514Smarc /*-------------------------------------------------- 84734514Smarc * set the rasterop registers to a default values */ 84834514Smarc 84934514Smarc adder->source_1_dx = 1; 85034514Smarc adder->source_1_dy = 1; 85134514Smarc adder->source_1_x = 0; 85234514Smarc adder->source_1_y = 0; 85334514Smarc adder->destination_x = 0; 85434514Smarc adder->destination_y = 0; 85534514Smarc adder->fast_dest_dx = 1; 85634514Smarc adder->fast_dest_dy = 0; 85734514Smarc adder->slow_dest_dx = 0; 85834514Smarc adder->slow_dest_dy = 1; 85934514Smarc adder->error_1 = 0; 86034514Smarc adder->error_2 = 0; 86134514Smarc 86234514Smarc /*------------------------ 86334514Smarc * scale factor = unity */ 86434514Smarc 86534514Smarc adder->fast_scale = UNITY; 86634514Smarc adder->slow_scale = UNITY; 86734514Smarc 86834514Smarc /*------------------------------- 86934514Smarc * set the source 2 parameters */ 87034514Smarc 87134514Smarc adder->source_2_x = 0; 87234514Smarc adder->source_2_y = 0; 87334514Smarc adder->source_2_size = 0x0022; 87434514Smarc 87534514Smarc /*----------------------------------------------- 87634514Smarc * initialize plane addresses for eight vipers */ 87734514Smarc 87834514Smarc write_ID(adder, CS_UPDATE_MASK, 0x0001); 87934514Smarc write_ID(adder, PLANE_ADDRESS, 0x0000); 88034514Smarc 88134514Smarc write_ID(adder, CS_UPDATE_MASK, 0x0002); 88234514Smarc write_ID(adder, PLANE_ADDRESS, 0x0001); 88334514Smarc 88434514Smarc write_ID(adder, CS_UPDATE_MASK, 0x0004); 88534514Smarc write_ID(adder, PLANE_ADDRESS, 0x0002); 88634514Smarc 88734514Smarc write_ID(adder, CS_UPDATE_MASK, 0x0008); 88834514Smarc write_ID(adder, PLANE_ADDRESS, 0x0003); 88934514Smarc 89034514Smarc write_ID(adder, CS_UPDATE_MASK, 0x0010); 89134514Smarc write_ID(adder, PLANE_ADDRESS, 0x0004); 89234514Smarc 89334514Smarc write_ID(adder, CS_UPDATE_MASK, 0x0020); 89434514Smarc write_ID(adder, PLANE_ADDRESS, 0x0005); 89534514Smarc 89634514Smarc write_ID(adder, CS_UPDATE_MASK, 0x0040); 89734514Smarc write_ID(adder, PLANE_ADDRESS, 0x0006); 89834514Smarc 89934514Smarc write_ID(adder, CS_UPDATE_MASK, 0x0080); 90034514Smarc write_ID(adder, PLANE_ADDRESS, 0x0007); 90134514Smarc 90234514Smarc /* initialize the external registers. */ 90334514Smarc 90434514Smarc write_ID(adder, CS_UPDATE_MASK, 0x00FF); 90534514Smarc write_ID(adder, CS_SCROLL_MASK, 0x00FF); 90634514Smarc 90734514Smarc /* initialize resolution mode */ 90834514Smarc 90934514Smarc write_ID(adder, MEMORY_BUS_WIDTH, 0x000C); /* bus width = 16 */ 91034514Smarc write_ID(adder, RESOLUTION_MODE, 0x0000); /* one bit/pixel */ 91134514Smarc 91234514Smarc /* initialize viper registers */ 91334514Smarc 91434514Smarc write_ID(adder, SCROLL_CONSTANT, SCROLL_ENABLE|VIPER_LEFT|VIPER_UP); 91534514Smarc write_ID(adder, SCROLL_FILL, 0x0000); 91634514Smarc 91734514Smarc /*---------------------------------------------------- 91834514Smarc * set clipping and scrolling limits to full screen */ 91934514Smarc 92034514Smarc for ( i = 1000, adder->status = 0 92134514Smarc ; i > 0 && !((status = adder->status) & ADDRESS_COMPLETE) 92234514Smarc ; --i); 92334514Smarc 92434514Smarc if (i == 0) 92534514Smarc printf("timeout trying to setup clipping\n"); 92634514Smarc 92734514Smarc top = 0; 92834514Smarc bottom = 2048; 92934514Smarc left = 0; 93034514Smarc right = 1024; 93134514Smarc 93234514Smarc adder->x_clip_min = left; 93334514Smarc adder->x_clip_max = right; 93434514Smarc adder->y_clip_min = top; 93534514Smarc adder->y_clip_max = bottom; 93634514Smarc 93734514Smarc adder->scroll_x_min = left; 93834514Smarc adder->scroll_x_max = right; 93934514Smarc adder->scroll_y_min = top; 94034514Smarc adder->scroll_y_max = bottom; 94134514Smarc 94234514Smarc wait_status(adder, VSYNC); /* wait at LEAST 1 full frame */ 94334514Smarc wait_status(adder, VSYNC); 94434514Smarc 94534514Smarc adder->x_index_pending = left; 94634514Smarc adder->y_index_pending = top; 94734514Smarc adder->x_index_new = left; 94834514Smarc adder->y_index_new = top; 94934514Smarc adder->x_index_old = left; 95034514Smarc adder->y_index_old = top; 95134514Smarc 95234514Smarc for ( i = 1000, adder->status = 0 95334514Smarc ; i > 0 && !((status = adder->status) & ADDRESS_COMPLETE) 95434514Smarc ; --i); 95534514Smarc 95634514Smarc if (i == 0) 95734514Smarc printf("timeout waiting for ADDRESS_COMPLETE bit\n"); 95834514Smarc 95934514Smarc write_ID(adder, LEFT_SCROLL_MASK, 0x0000); 96034514Smarc write_ID(adder, RIGHT_SCROLL_MASK, 0x0000); 96134514Smarc 96234514Smarc /*------------------------------------------------------------ 96334514Smarc * set source and the mask register to all ones (ie: white) */ 96434514Smarc 96534514Smarc write_ID(adder, SOURCE, 0xFFFF); 96634514Smarc write_ID(adder, MASK_1, 0xFFFF); 96734514Smarc write_ID(adder, VIPER_Z_LOAD | FOREGROUND_COLOR_Z, 255); 96834514Smarc write_ID(adder, VIPER_Z_LOAD | BACKGROUND_COLOR_Z, 0); 96934514Smarc 97034514Smarc /*-------------------------------------------------------------- 97134514Smarc * initialize Operand Control Register banks for fill command */ 97234514Smarc 97334514Smarc write_ID(adder, SRC1_OCR_A, EXT_NONE | INT_M1_M2 | NO_ID | WAIT); 97434514Smarc write_ID(adder, SRC2_OCR_A, EXT_NONE | INT_SOURCE | NO_ID | NO_WAIT); 97534514Smarc write_ID(adder, DST_OCR_A, EXT_NONE | INT_NONE | NO_ID | NO_WAIT); 97634514Smarc 97734514Smarc write_ID(adder, SRC1_OCR_B, EXT_NONE | INT_SOURCE | NO_ID | WAIT); 97834514Smarc write_ID(adder, SRC2_OCR_B, EXT_NONE | INT_M1_M2 | NO_ID | NO_WAIT); 97934514Smarc write_ID(adder, DST_OCR_B, EXT_NONE | INT_NONE | NO_ID | NO_WAIT); 98034514Smarc 98134514Smarc /*------------------------------------------------------------------ 98234514Smarc * init Logic Unit Function registers, (these are just common values, 98334514Smarc * and may be changed as required). */ 98434514Smarc 98534514Smarc write_ID(adder, LU_FUNCTION_R1, FULL_SRC_RESOLUTION | LF_SOURCE); 98634514Smarc write_ID(adder, LU_FUNCTION_R2, FULL_SRC_RESOLUTION | LF_SOURCE | INV_M1_M2); 98734514Smarc write_ID(adder, LU_FUNCTION_R3, FULL_SRC_RESOLUTION | LF_D_OR_S); 98834514Smarc write_ID(adder, LU_FUNCTION_R4, FULL_SRC_RESOLUTION | LF_D_XOR_S); 98934514Smarc 99034514Smarc /*---------------------------------------- 99134514Smarc * load the color map for black & white */ 99234514Smarc 99334514Smarc for ( i = 0, adder->status = 0 99434514Smarc ; i < 10000 && !((status = adder->status) & VSYNC) 99534514Smarc ; ++i); 99634514Smarc 99734514Smarc if (i == 0) 99834514Smarc printf("timeout waiting for VSYNC bit\n"); 99934514Smarc 100034514Smarc red = (short *) qdmap.red; 100134514Smarc green = (short *) qdmap.green; 100234514Smarc blue = (short *) qdmap.blue; 100334514Smarc 100434514Smarc *red++ = 0x00; /* black */ 100534514Smarc *green++ = 0x00; 100634514Smarc *blue++ = 0x00; 100734514Smarc 100834514Smarc *red-- = 0xFF; /* white */ 100934514Smarc *green-- = 0xFF; 101034514Smarc *blue-- = 0xFF; 101134514Smarc 101234514Smarc /*---------------------------------- 101334514Smarc * set color map for mouse cursor */ 101434514Smarc 101534514Smarc red += 254; 101634514Smarc green += 254; 101734514Smarc blue += 254; 101834514Smarc 101934514Smarc *red++ = 0x00; /* black */ 102034514Smarc *green++ = 0x00; 102134514Smarc *blue++ = 0x00; 102234514Smarc 102334514Smarc *red = 0xFF; /* white */ 102434514Smarc *green = 0xFF; 102534514Smarc *blue = 0xFF; 102634514Smarc 102734514Smarc /*--------------------------------------------------------------------------- 102834514Smarc * clear the bitmap a piece at a time. Since the fast scroll clear only clears 102934514Smarc * the current displayed portion of the bitmap put a temporary value in the y 103034514Smarc * limit register so we can access whole bitmap */ 103134514Smarc 103234514Smarc adder->x_limit = 1024; 103334514Smarc adder->y_limit = 2048 - CHAR_HEIGHT; 103434514Smarc adder->y_offset_pending = 0; 103534514Smarc 103634514Smarc wait_status(adder, VSYNC); /* wait at LEAST 1 full frame */ 103734514Smarc wait_status(adder, VSYNC); 103834514Smarc 103934514Smarc adder->y_scroll_constant = SCROLL_ERASE; 104034514Smarc 104134514Smarc wait_status(adder, VSYNC); 104234514Smarc wait_status(adder, VSYNC); 104334514Smarc 104434514Smarc adder->y_offset_pending = 864; 104534514Smarc 104634514Smarc wait_status(adder, VSYNC); 104734514Smarc wait_status(adder, VSYNC); 104834514Smarc 104934514Smarc adder->y_scroll_constant = SCROLL_ERASE; 105034514Smarc 105134514Smarc wait_status(adder, VSYNC); 105234514Smarc wait_status(adder, VSYNC); 105334514Smarc 105434514Smarc adder->y_offset_pending = 1728; 105534514Smarc 105634514Smarc wait_status(adder, VSYNC); 105734514Smarc wait_status(adder, VSYNC); 105834514Smarc 105934514Smarc adder->y_scroll_constant = SCROLL_ERASE; 106034514Smarc 106134514Smarc wait_status(adder, VSYNC); 106234514Smarc wait_status(adder, VSYNC); 106334514Smarc 106434514Smarc adder->y_offset_pending = 0; /* back to normal */ 106534514Smarc 106634514Smarc wait_status(adder, VSYNC); 106734514Smarc wait_status(adder, VSYNC); 106834514Smarc 106934514Smarc adder->x_limit = MAX_SCREEN_X; 107034514Smarc adder->y_limit = MAX_SCREEN_Y + FONT_HEIGHT; 107134514Smarc 107234514Smarc *memcsr = SYNC_ON | UNBLANK; /* turn off leds and turn on video */ 107334514Smarc return(0); 107434514Smarc 107534514Smarc } /* setup_dragon */ 107634514Smarc 107734514Smarc /****************************************************************** 107834514Smarc * 107934514Smarc * setup_input()... init the DUART and set defaults in input 108034514Smarc * devices 108134514Smarc * 108234514Smarc ******************************************************************/ 108334514Smarc 108434514Smarc setup_input() 108534514Smarc { 108634514Smarc register struct duart *duart; /* DUART register structure pointer */ 108734514Smarc register int bits; 108834514Smarc int i, j; /* scratch variables */ 108934514Smarc 109034514Smarc short status; 109134514Smarc 109234514Smarc /*--------------- 109334514Smarc * init stuff */ 109434514Smarc 109534514Smarc duart = (struct duart *) qdmap.duart; 109634514Smarc 109734514Smarc /*--------------------------------------------- 109834514Smarc * setup the DUART for kbd & pointing device */ 109934514Smarc 110034514Smarc duart->cmdA = RESET_M; /* reset mode reg ptr for kbd */ 110134514Smarc duart->modeA = 0x13; /* 8 bits, no parity, rcv IE, */ 110234514Smarc /* no RTS control,char error mode */ 110334514Smarc duart->modeA = 0x07; /* 1 stop bit,CTS does not IE XMT */ 110434514Smarc /* no RTS control,no echo or loop */ 110534514Smarc duart->auxctl = 0x00; /* baud rate set 1 */ 110634514Smarc 110734514Smarc duart->clkselA = 0x99; /* 4800 baud for kbd */ 110834514Smarc 110934514Smarc /* reset everything for keyboard */ 111034514Smarc 111134514Smarc for (bits = RESET_M; bits < START_BREAK; bits += 0x10) 111234514Smarc duart->cmdA = bits; 111334514Smarc 111434514Smarc duart->cmdA = EN_RCV | EN_XMT; /* enbl xmt & rcv for kbd */ 111534514Smarc 111634514Smarc /*-------------------------- 111734514Smarc * init keyboard defaults */ 111834514Smarc /* 111934514Smarc for (i = 500; i > 0; --i) { 112034514Smarc if ((status = duart->statusA) & XMT_RDY) { 112134514Smarc duart->dataA = LK_DEFAULTS; 112234514Smarc break; 112334514Smarc } 112434514Smarc } 112534514Smarc 112634514Smarc for (j = 0; j < 3; ++j) { 112734514Smarc for (i = 50000; i > 0; --i) { 112834514Smarc if ((status = duart->statusA) & RCV_RDY) { 112934514Smarc status = duart->dataA; 113034514Smarc break; 113134514Smarc } 113234514Smarc } 113334514Smarc } 113434514Smarc 113534514Smarc if (i == 0) 113634514Smarc printf("LK-201 init error\n"); 113734514Smarc */ 113834514Smarc 113934514Smarc /*-------- 114034514Smarc * exit */ 114134514Smarc 114234514Smarc return(0); 114334514Smarc 114434514Smarc } /* setup_input */ 114534514Smarc 114634514Smarc /********************************************************************** 114734514Smarc * 114834514Smarc * wait_status()... delay for at least one display frame time 114934514Smarc * 115034514Smarc *********************************************************************** 115134514Smarc * 115234514Smarc * calling convention: 115334514Smarc * 115434514Smarc * wait_status(adder, mask); 115534514Smarc * struct *adder adder; 115634514Smarc * int mask; 115734514Smarc * 115834514Smarc * return: BAD means that we timed out without ever seeing the 115934514Smarc * vertical sync status bit 116034514Smarc * GOOD otherwise 116134514Smarc * 116234514Smarc **************/ 116334514Smarc 116434514Smarc wait_status(adder, mask) 116534514Smarc register struct adder *adder; 116634514Smarc register int mask; 116734514Smarc { 116834514Smarc register short status; 116934514Smarc int i; 117034514Smarc 117134514Smarc for ( i = 10000, adder->status = 0 117234514Smarc ; i > 0 && !((status = adder->status) & mask) 117334514Smarc ; --i); 117434514Smarc 117534514Smarc if (i == 0) { 117634514Smarc printf("timeout polling for 0x%x in adder->status\n", mask); 117734514Smarc return(BAD); 117834514Smarc } 117934514Smarc 118034514Smarc return(GOOD); 118134514Smarc 118234514Smarc } /* wait_status */ 118334514Smarc 118434514Smarc /********************************************************************** 118534514Smarc * 118634514Smarc * write_ID()... write out onto the ID bus 118734514Smarc * 118834514Smarc *********************************************************************** 118934514Smarc * 119034514Smarc * calling convention: 119134514Smarc * 119234514Smarc * struct *adder adder; ;pntr to ADDER structure 119334514Smarc * short adrs; ;VIPER address 119434514Smarc * short data; ;data to be written 119534514Smarc * write_ID(adder); 119634514Smarc * 119734514Smarc * return: BAD means that we timed out waiting for status bits 119834514Smarc * VIPER-access-specific status bits 119934514Smarc * GOOD otherwise 120034514Smarc * 120134514Smarc **************/ 120234514Smarc 120334514Smarc write_ID(adder, adrs, data) 120434514Smarc register struct adder *adder; 120534514Smarc register short adrs; 120634514Smarc register short data; 120734514Smarc { 120834514Smarc int i; 120934514Smarc short status; 121034514Smarc 121134514Smarc for ( i = 100000, adder->status = 0 121234514Smarc ; i > 0 && !((status = adder->status) & ADDRESS_COMPLETE) 121334514Smarc ; --i); 121434514Smarc 121534514Smarc if (i == 0) 121634514Smarc goto ERR; 121734514Smarc 121834514Smarc for ( i = 100000, adder->status = 0 121934514Smarc ; i > 0 && !((status = adder->status) & TX_READY) 122034514Smarc ; --i); 122134514Smarc 122234514Smarc if (i > 0) { 122334514Smarc adder->id_data = data; 122434514Smarc adder->command = ID_LOAD | adrs; 122534514Smarc return(GOOD); 122634514Smarc } 122734514Smarc 122834514Smarc ERR: 122934514Smarc printf("timeout trying to write to VIPER\n"); 123034514Smarc return(BAD); 123134514Smarc 123234514Smarc } /* write_ID */ 1233