1: # 2: /* 3: */ 4: 5: /* 6: * GP DR11C driver used for C/A/T 7: */ 8: 9: #include "../h/param.h" 10: #include "../h/dir.h" 11: #include "../h/user.h" 12: #include "../h/tty.h" 13: 14: #define CATADDR ((struct catdev *)0167770) 15: #define PCAT (PZERO+9) 16: #define CATHIWAT 100 17: #define CATLOWAT 30 18: 19: struct { 20: int catlock; 21: struct clist oq; 22: } cat; 23: 24: struct catdev { 25: int catcsr; 26: int catbuf; 27: }; 28: 29: ctopen(dev) 30: { 31: if (cat.catlock==0) { 32: cat.catlock++; 33: CATADDR->catcsr |= IENABLE; 34: } else 35: u.u_error = ENXIO; 36: } 37: 38: ctclose() 39: { 40: cat.catlock = 0; 41: catintr(); 42: } 43: 44: ctwrite(dev) 45: { 46: register c; 47: extern lbolt; 48: 49: while ((c=cpass()) >= 0) { 50: spl5(); 51: while (cat.oq.c_cc > CATHIWAT) 52: sleep((caddr_t)&cat.oq, PCAT); 53: while (putc(c, &cat.oq) < 0) 54: sleep((caddr_t)&lbolt, PCAT); 55: catintr(); 56: spl0(); 57: } 58: } 59: 60: catintr() 61: { 62: register int c; 63: 64: if (CATADDR->catcsr&DONE) { 65: if ((c = getc(&cat.oq)) >= 0) { 66: CATADDR->catbuf = c; 67: if (cat.oq.c_cc==0 || cat.oq.c_cc==CATLOWAT) 68: wakeup((caddr_t)&cat.oq); 69: } else { 70: if (cat.catlock==0) 71: CATADDR->catcsr = 0; 72: } 73: } 74: }