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 / rd.c < prev   
Encoding:
C/C++ Source or Header  |  1985-02-26  |  1.3 KB  |  71 lines

  1. /*
  2.  * Standalone rd50/51 driver for pro3xx
  3.  */
  4.  
  5. #include <sys/param.h>
  6. #include <sys/inode.h>
  7. #include "../saio.h"
  8. #include <sys/rdreg.h>
  9.  
  10. #define RDADDR ((struct rddevice *) 0174000)
  11.  
  12. struct rdst rdst[] = {
  13.     16,    4,    16*4,    305,
  14.     16,    4,    16*4,    152,
  15.     0,    0,    0,    0,
  16. };
  17.  
  18. rdstrategy(io, func)
  19. register struct iob *io;
  20. {
  21.     register int i, *ptr;
  22.     register struct rdst *st;
  23.     int cc, xfer;
  24.     daddr_t bn;
  25.     int sn;
  26.  
  27.     st = &rdst[(io->i_unit>>3)&01];
  28.     ptr = io->i_ma;
  29.     cc = io->i_cc;
  30.     xfer = 0;
  31.     while (cc > 0) {
  32.         bn = io->i_bn + xfer;
  33.         sn = bn % (st->nspc);
  34.         while (RDADDR->st & RD_BUSY)
  35.             ;
  36.         RDADDR->trk = sn / (st->nsect);
  37.         RDADDR->sec = sn % (st->nsect);
  38.         RDADDR->cyl = bn/(st->nspc);
  39.         if (func == READ)
  40.             RDADDR->csr = RD_READCOM;
  41.         else
  42.             RDADDR->csr = RD_WRITECOM;
  43.         for (i = 0; i < 256; i++) {
  44.             while ((RDADDR->st & (RD_DRQ|RD_OPENDED)) == 0)
  45.                 ;
  46.             if (RDADDR->csr & RD_ERROR)
  47.                 return(-1);
  48.             if (func == READ)
  49.                 *ptr++ = RDADDR->db;
  50.             else
  51.                 RDADDR->db = *ptr++;
  52.         }
  53.         while ((RDADDR->st & RD_OPENDED) == 0)
  54.             ;
  55.         if (RDADDR->csr & RD_ERROR)
  56.             return(-1);
  57.         cc -= 512;
  58.         xfer++;
  59.     }
  60.     return(io->i_cc);
  61. }
  62. rdinit()
  63. {
  64.     RDADDR->st = RD_INIT;
  65.     while (RDADDR->st & RD_BUSY)
  66.         ;
  67.     RDADDR->csr = RD_RESTORE;
  68.     while ((RDADDR->st & RD_BUSY) || (!(RDADDR->st & RD_OPENDED)))
  69.         ;
  70. }
  71.