|
|
1.1 ! root 1: #include "bpd.h" ! 2: #if NBPD > 0 ! 3: ! 4: /* ! 5: * BIT-PAD DEVICE DRIVER ! 6: */ ! 7: ! 8: #include "../h/param.h" ! 9: #include "../h/dir.h" ! 10: #include "../h/user.h" ! 11: #include "../h/proc.h" ! 12: #include "../h/ioctl.h" ! 13: #include "../h/buf.h" ! 14: #include "../h/systm.h" ! 15: #include "../h/map.h" ! 16: #include "../h/pte.h" ! 17: #include "../h/ubavar.h" ! 18: #include "../h/ubareg.h" ! 19: ! 20: ! 21: #define RIE 0100 ! 22: #define DTR 02 ! 23: #define RTS 04 ! 24: #define SYNC 0100 ! 25: #define DMASK 077 ! 26: #define ERROR 060000 ! 27: #define CMOD 01 ! 28: #define STRM 02 ! 29: #define CURON 03 ! 30: #define POINT 04 ! 31: #define NOPLOT 05 ! 32: #define REPLOT 06 ! 33: #define SLPRI PZERO+1 ! 34: ! 35: struct bpddevice{ ! 36: short rcs; ! 37: short rdb; ! 38: short tcs; ! 39: short tdb; ! 40: }; ! 41: ! 42: struct bpdparam{ ! 43: int bpd_x; /*bitpad x address*/ ! 44: int bpd_y; /*bitpad y address*/ ! 45: int bpd_cflags; /*bitpad buttons*/ ! 46: int bpd_tx; /*temp x address*/ ! 47: int bpd_ty; /*temp y address*/ ! 48: int bpd_tflags; /*temp buttons*/ ! 49: int bpd_curx; /*current x screen cursor*/ ! 50: int bpd_cury; /*current y screen cursor*/ ! 51: int bpd_bn; /*byte no. - for sequencing*/ ! 52: int bpd_open; /*device open flag*/ ! 53: int bpd_stream; /*stream flag*/ ! 54: int bpd_cursor; /*cursor enable flag*/ ! 55: int bpd_noplot; /*noplot mode hack*/ ! 56: int bpd_on; /*set if bit-pad running*/ ! 57: int bpd_ubad; /*physical unibus address for dma's*/ ! 58: } bpdsoft[NBPD]; ! 59: ! 60: char curs_data[512]; /*buffer for cursor dma transfers*/ ! 61: ! 62: int bpdprobe(),bpdattach(); ! 63: ! 64: struct uba_device *bpdinfo[NBPD]; ! 65: u_short bpdstd[]= {0176510,0176520,0}; ! 66: ! 67: struct uba_driver bpddriver = ! 68: {bpdprobe,0,bpdattach,0,bpdstd,"bpd",bpdinfo}; ! 69: ! 70: bpdprobe(reg) /*called by autoconfig(4) - fake an interrupt*/ ! 71: caddr_t reg;{ ! 72: register int br,cvec; ! 73: br=0x15; ! 74: switch((int)(reg)&070){ ! 75: case 010: cvec=0410; break; ! 76: case 020: cvec=0420; break; ! 77: } ! 78: return(1); ! 79: } ! 80: ! 81: bpdattach(ui) /*driver initialization*/ ! 82: struct uba_dev *ui;{ ! 83: ! 84: } ! 85: ! 86: bpdopen(dev) ! 87: dev_t dev;{ ! 88: register struct bpddevice *bpp; ! 89: register struct uba_device *ui; ! 90: register struct bpdparam *bpds; ! 91: if(minor(dev)>=NBPD){ ! 92: u.u_error=ENXIO; /*device does not exist*/ ! 93: return; ! 94: } ! 95: bpds= &bpdsoft[minor(dev)]; ! 96: ui=bpdinfo[minor(dev)]; ! 97: if((bpds->bpd_open)||(ui==0)||(ui->ui_alive==0)){ ! 98: u.u_error=ENXIO; /*device already open or not really present*/ ! 99: return; ! 100: } ! 101: bpp=(struct bpddevice *)(ui->ui_addr); ! 102: bpds->bpd_open++; /*flag device as open*/ ! 103: bpds->bpd_on++; /*flag device as on*/ ! 104: bpds->bpd_stream=bpds->bpd_cursor=bpds->bpd_x=bpds->bpd_y=bpds->bpd_cflags=0; ! 105: bpp->tcs=0; /*output interrupt off*/ ! 106: bpp->rcs= RTS|DTR; /*set up modem controls*/ ! 107: bpp->tdb= 'L'; /*set to 35 samples/sec. stream*/ ! 108: bpp->rcs= RIE|DTR|RTS; /*enable receive interrupts*/ ! 109: } ! 110: ! 111: bpdclose(dev) ! 112: dev_t dev;{ ! 113: register struct bpddevice *bpp; ! 114: register struct uba_device *ui; ! 115: register struct bpdparam *bpds; ! 116: ui=bpdinfo[minor(dev)]; ! 117: bpp=(struct bpddevice *)(ui->ui_addr); ! 118: bpds= &bpdsoft[minor(dev)]; ! 119: bpp->rcs= 0; /*turn interrupts off*/ ! 120: bpds->bpd_stream=bpds->bpd_open=0; ! 121: } ! 122: ! 123: bpdintr(dev) dev_t dev; ! 124: { ! 125: register struct uba_device *ui = bpdinfo[minor(dev)]; ! 126: register struct bpddevice *bpp = (struct bpddevice *)(ui->ui_addr); ! 127: register struct bpdparam *bpds = &bpdsoft[minor(dev)]; ! 128: int dx, dy; ! 129: ! 130: if(bpp->rdb & ERROR) ! 131: { bpds->bpd_bn= -1; ! 132: return; ! 133: } ! 134: if(bpp->rdb & SYNC) bpds->bpd_bn=1; ! 135: if(bpds->bpd_bn < 0) return; ! 136: switch(bpds->bpd_bn) ! 137: { case 1: bpds->bpd_tflags = (int)(bpp->rdb&DMASK); ! 138: break; ! 139: case 2: bpds->bpd_tx = (int)(bpp->rdb&DMASK); ! 140: break; ! 141: case 3: bpds->bpd_tx += (int)((bpp->rdb&DMASK)<<6); ! 142: break; ! 143: case 4: bpds->bpd_ty = (int)(bpp->rdb&DMASK); ! 144: break; ! 145: case 5: bpds->bpd_ty += (int)((bpp->rdb&DMASK)<<6); ! 146: if(bpds->bpd_tflags != bpds->bpd_cflags) wakeup(bpds); ! 147: if((bpds->bpd_cursor)&&(bpds->bpd_on)) ! 148: { if(bpds->bpd_tx<bpds->bpd_x) ! 149: bpds->bpd_curx=(bpds->bpd_tx+1)/2; ! 150: else if(bpds->bpd_tx>bpds->bpd_x) ! 151: bpds->bpd_curx=(bpds->bpd_tx)/2; ! 152: if(bpds->bpd_ty<bpds->bpd_y) ! 153: bpds->bpd_cury=(bpds->bpd_ty+1)/2; ! 154: else if(bpds->bpd_ty>bpds->bpd_y) ! 155: bpds->bpd_cury=(bpds->bpd_ty)/2; ! 156: ! 157: if (!bpds->bpd_noplot) ! 158: { ! 159: dx = bpds->bpd_x - bpds->bpd_tx; ! 160: if(dx < 0) dx = -dx; ! 161: dy = bpds->bpd_y - bpds->bpd_ty; ! 162: if(dy < 0) dy = -dy; ! 163: if(dx > 1 || dy > 1) ! 164: omcur(dev,bpds->bpd_curx,bpds->bpd_cury); ! 165: } ! 166: } ! 167: bpds->bpd_x=bpds->bpd_tx; ! 168: bpds->bpd_y=bpds->bpd_ty; ! 169: bpds->bpd_cflags=bpds->bpd_tflags; ! 170: bpds->bpd_bn=0; ! 171: break; ! 172: } ! 173: bpds->bpd_bn++; ! 174: } ! 175: ! 176: bpdioctl(dev,cmd,addr,flag) ! 177: dev_t dev; ! 178: caddr_t addr;{ ! 179: register struct bpddevice *bpp; ! 180: register struct uba_device *ui; ! 181: register struct bpdparam *bpds; ! 182: char c; ! 183: ui=bpdinfo[minor(dev)]; ! 184: bpp=(struct bpddevice *)(ui->ui_addr); ! 185: bpds= &bpdsoft[minor(dev)]; ! 186: switch(cmd){ ! 187: case CMOD: /*send char. to change mode*/ ! 188: c=fubyte(addr)&0177; ! 189: bpds->bpd_on=(c=='S')?0:1; ! 190: bpp->tdb=(short)c; ! 191: break; ! 192: case STRM: /*put driver into stream mode*/ ! 193: bpds->bpd_stream=1; ! 194: break; ! 195: case CURON: /*turn cursor on*/ ! 196: bpds->bpd_cursor=1; ! 197: break; ! 198: case POINT: /*turn off stream mode*/ ! 199: bpds->bpd_stream=0; ! 200: break; ! 201: case NOPLOT: /*track without plotting on device*/ ! 202: bpds->bpd_noplot=1; ! 203: break; ! 204: case REPLOT: ! 205: bpds->bpd_noplot=0; ! 206: break; ! 207: } ! 208: } ! 209: ! 210: bpdread(dev) ! 211: dev_t dev;{ ! 212: register struct bpdparam *bpds; ! 213: register *dp= (int *)(u.u_base); ! 214: bpds= &bpdsoft[minor(dev)]; ! 215: if(bpds->bpd_stream==0){ ! 216: while(bpds->bpd_cflags) sleep(bpds,SLPRI); /*wait for buttons up*/ ! 217: while(!(bpds->bpd_cflags)) sleep(bpds,SLPRI); /*wait for button down*/ ! 218: } ! 219: suword(dp++,bpds->bpd_x); ! 220: suword(dp++,bpds->bpd_y); ! 221: suword(dp,bpds->bpd_cflags); ! 222: u.u_base=(caddr_t)dp; ! 223: u.u_count=0; ! 224: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.