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

  1. /* This program is a standalone formatter/bad block locator for
  2.  * the rd50/51 on the pro 300. It writes 0377 in the backup revision
  3.  * byte to mark a sector bad and creates a sector log ala bad144.
  4.  */
  5. #include <sys/types.h>
  6. #define BADSECT 1
  7. #include <sys/dkbad.h>
  8. #include <sys/rdreg.h>
  9. #define    SKEW    4
  10. #define    INTRLV    2
  11.  
  12. #define RDADDR    ((struct rddevice *) 0174000)
  13. struct rdst rdst[] = {
  14.     16,    4,    16*4,    305,
  15.     16,    4,    16*4,    152,
  16.     0,    0,    0,    0,
  17. };
  18.  
  19. char module[] = {"Rdfmt"};
  20. struct dkbad badblk;
  21. int badpos, secpos;
  22. int inblk[256];
  23.  
  24. main() {
  25.     register int cnt, *ptr;
  26.     register struct rdst *st;
  27.     int cylder, track, sector, out;
  28.     char buff[100];
  29.  
  30.     do {
  31.         printf("Drive type (RD51 - 0 or RD50 - 1) ?");
  32.         gets(buff);
  33.     } while(buff[0] < '0' || buff[0] > '1');
  34.     st = &rdst[buff[0]-'0'];
  35.     badblk.bt_csn = 1;
  36.     badblk.bt_mbz = 0;
  37.     badblk.bt_flag = 0;
  38.     for (cnt = 0; cnt < 126; cnt++) {
  39.         badblk.bt_bad[cnt].bt_cyl = 0xffff;
  40.         badblk.bt_bad[cnt].bt_trksec = 0xffff;
  41.     }
  42.     badpos = 0;
  43.     secpos = 0;
  44.     for (cnt = 0; cnt < 256; cnt++)
  45.         inblk[cnt] = 0x5555;
  46.     rdinit();
  47.     printf("Format begins...\n");
  48.     for(cylder = 0; cylder <= st->ncyl; cylder++)
  49.       for(track = 0; track < st->ntrak; track++) {
  50.     for(cnt = 0; cnt < st->nsect; cnt++)
  51.         inblk[((((cnt*INTRLV)%(st->nsect))+(cnt/((st->nsect)/INTRLV))+secpos)%(st->nsect))] = cnt;
  52.     secpos = ((secpos+SKEW)%(st->nsect));
  53.     RDADDR->cyl = cylder;
  54.     RDADDR->trk = track;
  55.     RDADDR->csr = RD_FORMATCOM;
  56.     for (cnt = 0; cnt < 256; cnt++) {
  57.         while ((RDADDR->st & RD_DRQ) == 0) ;
  58.         RDADDR->db = inblk[cnt];
  59.     }
  60.     while ((RDADDR->st & RD_OPENDED) == 0) ;
  61.     if (RDADDR->csr & RD_ERROR) {
  62.         printf("Hard err cyl=%d trk=%d sec=%d stat=%o\n",
  63.             cylder,track,sector,RDADDR->err);
  64.             halt();
  65.     }
  66.     for(sector = 0; sector < st->nsect; sector++) {
  67.         RDADDR->cyl = cylder;
  68.         RDADDR->trk = track;
  69.         RDADDR->sec = sector;
  70.         RDADDR->csr = RD_READCOM;
  71.         while (RDADDR->st & RD_BUSY) ;
  72.         if (RDADDR->csr & RD_ERROR) {
  73.             printf("Bad block cyl=%d trk=%d sec=%d stat=%o\n",
  74.             cylder,track,sector,RDADDR->err);
  75.             badblk.bt_bad[badpos].bt_cyl = cylder;
  76.             badblk.bt_bad[badpos++].bt_trksec = ((track<<8)&0177400)|(sector);
  77.             rdinit();
  78.             RDADDR->cyl = cylder;
  79.             RDADDR->trk = track;
  80.             RDADDR->sec = RD_BAD|sector;
  81.             RDADDR->csr = RD_WRITECOM;
  82.             for(cnt = 0; cnt < 256; cnt++) {
  83.                 while ((RDADDR->st & RD_DRQ) == 0) ;
  84.                 RDADDR->db = 0;
  85.             }
  86.             while ((RDADDR->st & RD_OPENDED) == 0) ;
  87.             if (RDADDR->csr & RD_ERROR)
  88.                 rdinit();
  89.         } else {
  90.             for(cnt = 0; cnt < 256; cnt++) {
  91.                 while ((RDADDR->st & RD_DRQ) == 0) ;
  92.                 out = RDADDR->db;
  93.             }
  94.             while ((RDADDR->st & RD_OPENDED) == 0) ;
  95.         }
  96.       }
  97.     }
  98.     for(sector = 0; sector < st->nsect; sector++) {
  99.         RDADDR->cyl = st->ncyl;
  100.         RDADDR->trk = st->ntrak-1;
  101.         RDADDR->sec = sector;
  102.         RDADDR->csr = RD_WRITECOM;
  103.         ptr = &badblk;
  104.         for(cnt = 0; cnt < 256; cnt++) {
  105.             while ((RDADDR->st & RD_DRQ) == 0) ;
  106.             RDADDR->db = *ptr++;
  107.         }
  108.         while ((RDADDR->st & RD_OPENDED) == 0) ;
  109.         if (RDADDR->csr & RD_ERROR) {
  110.             printf("Hard err cyl=%d trk=%d sec=%d stat=%o\n",
  111.             cylder,track,sector,RDADDR->err);
  112.             halt();
  113.         }
  114.     }
  115.     printf("Format and bad scan done\n");
  116.     printf("Total bad blocks = %d\n",badpos);
  117. }
  118. halt() {
  119.  
  120.     for(;;) ;
  121. }
  122.