home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / standalone / tm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-03  |  1.7 KB  |  113 lines

  1. #
  2.  
  3. /*
  4.  * TM tape driver
  5.  */
  6.  
  7. #include <sys/param.h>
  8. #include <sys/inode.h>
  9. #include "saio.h"
  10.  
  11. struct device {
  12.     int    tmer;
  13.     int    tmcs;
  14.     int    tmbc;
  15.     char    *tmba;
  16.     int    tmdb;
  17.     int    tmrd;
  18. };
  19.  
  20. #define    TMADDR ((struct device *)0172520)
  21.  
  22. #define    GO    01
  23. #define    RCOM    02
  24. #define    WCOM    04
  25. #define    WEOF    06
  26. #define    SFORW    010
  27. #define    SREV    012
  28. #define    WIRG    014
  29. #define    REW    016
  30. #define    DENS    060000        /* 9-channel */
  31. #define    IENABLE    0100
  32. #define    CRDY    0200
  33. #define GAPSD    010000
  34. #define    TUR    1
  35. #define    SDWN    010
  36. #define    HARD    0102200    /* ILC, EOT, NXM */
  37. #define    EOF    0040000
  38.  
  39. #define    SSEEK    1
  40. #define    SIO    2
  41.  
  42.  
  43. tmrew(io)
  44. register struct iob *io;
  45. {
  46.     tmstrategy(io, REW);
  47. }
  48.  
  49. tmopen(io)
  50. register struct iob *io;
  51. {
  52.     register skip;
  53.  
  54.     tmstrategy(io, REW);
  55.     skip = io->i_boff;
  56.     while (skip--) {
  57.         io->i_cc = 0;
  58.         while (tmstrategy(io, SFORW))
  59.             ;
  60.     }
  61. }
  62. tmstrategy(io, func)
  63. register struct iob *io;
  64. {
  65.     register int com, unit, errcnt;
  66.  
  67.     unit = io->i_unit;
  68.     errcnt = 0;
  69. retry:
  70.     tmquiet();
  71.     com = (unit<<8)|(segflag<<4)|DENS;
  72.     TMADDR->tmbc = -io->i_cc;
  73.     TMADDR->tmba = io->i_ma;
  74.     if (func == READ)
  75.         TMADDR->tmcs = com | RCOM | GO;
  76.     else if (func == WRITE)
  77.         TMADDR->tmcs = com | WCOM | GO;
  78.     else if (func == SREV) {
  79.         TMADDR->tmbc = -1;
  80.         TMADDR->tmcs = com | SREV | GO;
  81.         return(0);
  82.     } else
  83.         TMADDR->tmcs = com | func | GO;
  84.     while ((TMADDR->tmcs&CRDY) == 0)
  85.         ;
  86.     if (TMADDR->tmer&EOF)
  87.         return(0);
  88.     if (TMADDR->tmer < 0) {
  89.         if (errcnt == 0)
  90.             printf("tape error: er=%o", TMADDR->tmer);
  91.         if (errcnt==10) {
  92.             printf("\n");
  93.             return(-1);
  94.         }
  95.         errcnt++;
  96.         tmstrategy(io, SREV);
  97.         goto retry;
  98.     }
  99.     if (errcnt)
  100.         printf(" recovered by retry\n");
  101.     return( io->i_cc+TMADDR->tmbc );
  102. }
  103.  
  104. tmquiet()
  105. {
  106.     while ((TMADDR->tmcs&CRDY) == 0)
  107.         ;
  108.     while ((TMADDR->tmer&TUR) == 0)
  109.         ;
  110.     while ((TMADDR->tmer&SDWN) != 0)
  111.         ;
  112. }
  113.