home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume10 / logo / part01 / dr11k.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-06-23  |  2.0 KB  |  110 lines

  1.  
  2. /*
  3.  * Driver for Terrapin turtles interfaced via DR11-K.
  4.  * Based on DR-11C driver Copyright (c) 1978, the Children's Museum.
  5.  * This version by Brian Harvey, Lincoln-Sudbury Regional High School.
  6.  */
  7.  
  8. #include "../h/param.h"
  9. #include "../h/dir.h"
  10. #include "../h/user.h"
  11.  
  12. /* The hardware registers */
  13. struct dr {
  14.     int drcsr;
  15.     char dribuf[2];
  16.     char drobuf[2];
  17. };
  18.  
  19. #define NTURTDR 1 /* Number of DR11Ks for turtles (2 turtles per DR) */
  20.  
  21. struct dr *dr_addr[2] = { (struct dr *)0167770, (struct dr *)0167760};
  22.  
  23. struct turt {
  24.     struct proc *procp;
  25.     int time;
  26.     char turnoff;
  27. } turtle[2*NTURTDR];
  28.  
  29. struct turtcmd {
  30.     char cmd,bits;
  31. }  trans[] ={
  32.     'f', 05,    /* forward */
  33.     'b',012,    /* back */
  34.     'l',011,    /* left */
  35.     'r', 06,    /* right */
  36.     'P', 0200,    /* pen down */
  37.     'H', 060,    /* high horn */
  38.     'L', 040,    /* low horn */
  39.     'B', 0100,    /* headlights (bright) */
  40. };
  41.  
  42. #define NCMDS (sizeof(trans) / sizeof(struct turtcmd))
  43.  
  44. turtopen(dev,flag) {
  45.     dev = minor(dev);
  46.     if (dev >= 2*NTURTDR) {
  47.         u.u_error = ENXIO;
  48.         return;
  49.     }
  50.     if (turtle[dev].procp) {
  51.         u.u_error = EBUSY;
  52.         return;
  53.     }
  54.     turtle[dev].procp = u.u_procp;
  55. }
  56.  
  57. turtclose(dev) {
  58.     dev = minor(dev);
  59.     turtle[dev].procp = 0;
  60.     turtle[dev].time = 0;
  61.     dr_addr[dev>>1]->drobuf[dev&01] = -1;
  62. }
  63.  
  64. turttimo(dev) {
  65.     spl5();
  66.     dr_addr[dev>>1]->drobuf[dev&01] |= turtle[dev].turnoff;
  67.     turtle[dev].time = 0;
  68.     wakeup(&turtle[dev]);
  69.     spl0();
  70. }
  71.  
  72. turtwrite(dev) {
  73.     register c,i;
  74.  
  75.     dev = minor(dev);
  76.     c = cpass();
  77.     if (c < 0) return;
  78.     for (i=0; i<NCMDS; i++) {
  79.         if (c == trans[i].cmd) goto good;
  80.     }
  81.     cpass();
  82.     u.u_error = EIO;
  83.     return;
  84. good:
  85.     spl5();
  86.     if((turtle[dev].time = 2*cpass()) < 0) {    /* BH 8/25/80 2* */
  87.         turtle[dev].time = 0;
  88.         spl0();
  89.         u.u_error = EIO;
  90.         return;
  91.     }
  92.     dr_addr[dev>>1]->drobuf[dev&01] &= ~trans[i].bits;
  93.     if (turtle[dev].time) {
  94.         turtle[dev].turnoff = trans[i].bits;
  95.         timeout(turttimo,dev,turtle[dev].time);
  96.         while(turtle[dev].time)
  97.             sleep(&turtle[dev],9);
  98.     }
  99.     spl0();
  100. }
  101.  
  102. turtread(dev) {
  103.     register c;
  104.  
  105.     dev = minor(dev);
  106.     c = dr_addr[dev>>1]->dribuf[dev&01];
  107.     passc(c);
  108. }
  109.  
  110.