home *** CD-ROM | disk | FTP | other *** search
- #
- /*
- */
-
- /*
- * GP DR11C driver used for C/A/T
- */
-
- #include "../h/param.h"
- #include "../h/dir.h"
- #include "../h/user.h"
- #include "../h/tty.h"
-
- #define CATADDR ((struct catdev *)0167770)
- #define PCAT (PZERO+9)
- #define CATHIWAT 100
- #define CATLOWAT 30
-
- struct {
- int catlock;
- struct clist oq;
- } cat;
-
- struct catdev {
- int catcsr;
- int catbuf;
- };
-
- ctopen(dev)
- {
- if (cat.catlock==0) {
- cat.catlock++;
- CATADDR->catcsr |= IENABLE;
- } else
- u.u_error = ENXIO;
- }
-
- ctclose()
- {
- cat.catlock = 0;
- catintr();
- }
-
- ctwrite(dev)
- {
- register c;
- extern lbolt;
-
- while ((c=cpass()) >= 0) {
- spl5();
- while (cat.oq.c_cc > CATHIWAT)
- sleep((caddr_t)&cat.oq, PCAT);
- while (putc(c, &cat.oq) < 0)
- sleep((caddr_t)&lbolt, PCAT);
- catintr();
- spl0();
- }
- }
-
- catintr()
- {
- register int c;
-
- if (CATADDR->catcsr&DONE) {
- if ((c = getc(&cat.oq)) >= 0) {
- CATADDR->catbuf = c;
- if (cat.oq.c_cc==0 || cat.oq.c_cc==CATLOWAT)
- wakeup((caddr_t)&cat.oq);
- } else {
- if (cat.catlock==0)
- CATADDR->catcsr = 0;
- }
- }
- }
-