/* * TeKtronix 603 storage monitor driver. * written at St. Joseph's Hospital, by Geoff Collyer, 12 Jan 1979. */ # include "../param.h" # include "../user.h" # define TKPRI 8 /* same as VTPRI */ # define TKADDR 0166760 struct tkreg { int x; int y; int unused; int csr; }; /* hardware bits in csr */ # define READY 0200 # define IENABLE 0100 # define YINTENS 020 # define XINTENS 010 # define VARIAB (YINTENS | XINTENS) /* variable brightness */ # define ERASE 02 # define INTENSIFY 01 /* misc. */ # define COORDMASK 03777 /* 11 bits wide */ # define READ 0 # define OPEN 1 # define CLOSED 0 # define NO_MORE (-1) # define tkbuild(low, high) (((high)<<8) | ((low)&0377)) int tkstate CLOSED; int tki; char tkc[4]; tkopen(dev, flag) { if(flag == READ || tkstate == OPEN) { u.u_error = ENXIO; return; } tkstate = OPEN; tki = 0; TKADDR->csr = ERASE|IENABLE; } tkclose(dev, flag) { tkwait(); TKADDR->csr |= VARIAB; tkstate = CLOSED; } tkwrite(dev) { register int xc, yc; register int c; for(; ; ) { for(; tki < 4; tki++) { if((c = cpass()) == NO_MORE) return; tkc[tki] = c; } tki = 0; if(tkvalid(xc = tkbuild(tkc[0], tkc[1])) && tkvalid(yc = tkbuild(tkc[2], tkc[3]))) { tkwait(); TKADDR->x = xc; TKADDR->y = yc; TKADDR->csr |= INTENSIFY|IENABLE; } } } tkvalid(coord) register int coord; { return(coord <= COORDMASK && coord >= ~COORDMASK); } tkwait() { /* wait for READY */ spl5(); while(!(TKADDR->csr&READY)) sleep(TKADDR, TKPRI); spl0(); } tkint(dev) { TKADDR->csr &= ~IENABLE; wakeup(TKADDR); }