home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / sys / dev / cat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-03  |  1013 b   |  75 lines

  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. }
  75.