home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / 2.9-derivatives / 2.9-pro350 / stand / libsa / r5.c next >
Encoding:
C/C++ Source or Header  |  1985-02-26  |  1.3 KB  |  70 lines

  1. /*
  2.  * Standalone rx50 driver for pro3xx
  3.  */
  4.  
  5. #include <sys/param.h>
  6. #include <sys/inode.h>
  7. #include "../saio.h"
  8. #include <sys/r5reg.h>
  9.  
  10. #define R5ADDR ((struct r5device *) 0174200)
  11.  
  12. r5strategy(io, func)
  13. register struct iob *io;
  14. {
  15.     register char *ptr;
  16.     register int i;
  17.     int cc;
  18.     daddr_t bn, xfer;
  19.     unsigned short sn, tn;
  20.  
  21.     ptr = io->i_ma;
  22.     cc = io->i_cc;
  23.     xfer = 0;
  24.     while (cc > 0) {
  25.         bn = io->i_bn+xfer;
  26.         if (bn >= R5_SIZE)
  27.             return(-1);
  28.         tn = bn/10;
  29.         sn = bn%10;
  30.         /* This interleave and skew is compatible with the
  31.          * DEC mscp Qbus controller for RX50's
  32.          */
  33.         sn = ((sn<<1)%10 + (sn<<1)/10 + (tn<<1))%10;
  34.         /* This is consistent with DEC in starting at trk 1 */
  35.         tn = (tn+1) % 80;
  36.         while ((R5ADDR->cs0 & R5_BUSY) == 0)
  37.             ;
  38.         R5ADDR->cs1 = tn;
  39.         R5ADDR->cs2 = sn+1;
  40.         if (func == READ) {
  41.             R5ADDR->cs0 = R5_READCOM|(((io->i_unit&03)<<1)&06);
  42.             R5ADDR->sc = 0;
  43.         }
  44.         else
  45.         {
  46.             R5ADDR->cs0 = R5_WRITECOM|(((io->i_unit&03)<<1)&06);
  47.         }
  48.         while ((R5ADDR->cs0 & R5_BUSY) == 0)
  49.                 ;
  50.         R5ADDR->ca = 0;
  51.         for (i = 0; i < 512; i++) {
  52.             if (R5ADDR->cs0 & R5_ERROR)
  53.                 return(-1);
  54.             if (func == READ)
  55.                 *ptr++ = R5ADDR->dbo;
  56.             else
  57.                 R5ADDR->dbi = *ptr++;
  58.         }
  59.         if (func == WRITE)
  60.             R5ADDR->sc = 0;
  61.         while ((R5ADDR->cs0 & R5_BUSY) == 0)
  62.             ;
  63.         if (R5ADDR->cs0 & R5_ERROR)
  64.             return(-1);
  65.         cc -= 512;
  66.         xfer++;
  67.     }
  68.     return(io->i_cc);
  69. }
  70.