home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / zcat / dstat01.lbr / DSTAT.C next >
Text File  |  1991-01-30  |  3KB  |  126 lines

  1. /* DSTAT : Disk Stat: the Whole Shebang
  2.  * Wilson H. Bent, Jr. : RCP/M: Lillipute: (312) 649-1730 Chicago
  3.  * Version 0.1 : Last Mod 06/02/86
  4.  *
  5.  * A Thorough Dump of the Disk Parameters as known by the BIOS.
  6.  * Written for Aztec C : uses functions bioshl() and bdos()
  7.  */
  8.  
  9. /* BDOS Defines */
  10. #define SELDISK    14
  11. #define CRNTDSK    25
  12.  
  13. /* BIOS Defines */
  14. #define SELDSK    9
  15.  
  16. /* The structure member names are those used in
  17.  * the CP/M 2.2 Operating System Manual
  18.  */
  19. /* Disk Parameter Header */
  20. struct dph {
  21.     char        *xlt;    /* Logical-Physical Translation pointer */
  22.     int         xxx[3];/* (used by BDOS) */
  23.     char        *dbuf;    /* Directory Buffer pointer */
  24.     struct dpb    *dpb;    /* Disk Parameter Block pointer */
  25.     int        *csv;    /* Scratch Pad pointer */
  26.     int        *alv;    /* Allocation Vector pointer */
  27. } *dphp;
  28.  
  29. /* Disk Parameter Block */
  30. struct dpb {
  31.     int    spt;        /* Sectors per Track */
  32.     char    bsh;        /* Block Shift */
  33.     char    blm;        /* Block Mask */
  34.     char    exm;        /* Extent Mask */
  35.     int    dsm;        /* Max. Block Number */
  36.     int    drm;        /* No. of Dir Entries - 1 */
  37.     char    al0, al1;    /* Dir Block Bitmap */
  38.     int    cks;        /* Dir Check Vector Size */
  39.     int    off;        /* Reserved Tracks Offset */
  40. } *dpbp;
  41.  
  42. int        currdisk;    /* Current Disk */
  43. int        seldisk;    /* Selected Disk */
  44. unsigned int    bls;        /* Block Size */
  45. long        dcap;        /* Disk Capacity */
  46.  
  47. main (argc, argv)
  48. char *argv[];
  49. {
  50.     register int i;
  51.  
  52.     /* preserve the current disk */
  53.     currdisk = bdos (CRNTDSK, 0);
  54.  
  55.     /* get the argument disk, if one is asked for */
  56.     if (argc > 1)
  57.         seldisk = *argv[1] - 'A';
  58.  
  59.     /* ..otherwise, use the current disk */
  60.     else
  61.         seldisk = currdisk;
  62.  
  63.     /* use the BIOS call to get a pointer to the DPH */
  64.     dphp = bioshl (SELDSK, seldisk, 0);
  65.     printf ("Disk %c:\n  DPH: 0%04x\n", seldisk + 'A', dphp);
  66.     if (dphp == 0) {
  67.         printf ("No such disk!\n");
  68.         goto away;
  69.     }
  70.  
  71.     /* The DPH Stats! */
  72.     printf ("Log-Phys Trans:\t0%04x\n", dphp -> xlt);
  73.     printf ("Dir Buff:\t0%04x\n", dphp -> dbuf);
  74.     printf ("Scratch Pad:\t0%04x\n", dphp -> csv);
  75.     printf ("Alloc Vector:\t0%04x\n", dphp -> alv);
  76.  
  77.     /* the DPH has the pointer to the DPB */
  78.     dpbp = dphp -> dpb;
  79.  
  80.     /* The DPB Stats! */
  81.     printf ("\n  DPB Addr: 0%04x\n", dpbp);
  82.     printf ("Sect per Track:\t%5d\n", dpbp -> spt);
  83.     printf ("Block Shift:\t   %2d\n", (int)dpbp -> bsh);
  84.     printf ("Block Mask:\t   %2d\n", (int)dpbp -> blm);
  85.     printf ("Extent Mask:\t   %2d\n", (int)dpbp -> exm);
  86.  
  87.     /* Block Size is a computed value, not in the DPB */
  88.     for (i = dpbp -> bsh, bls = 1; i > 0; --i)
  89.         bls <<= 1;
  90.     bls *= 0x80;
  91.     printf ("Block Size: %u bytes\n", bls);
  92.  
  93.     /* the Disk Capacity is also a computed value */
  94.     printf ("Max Block:\t %4xh\n", dpbp -> dsm + 1);
  95.     dcap = (long) bls * (long) (dpbp -> dsm + 1);
  96.     printf ("DISK CAPACITY (incl. Directory): %ld (0%lx) Bytes\n",
  97.         dcap, dcap);
  98.  
  99.     printf ("Dir Entries:\t%5d\n", dpbp -> drm);
  100.     printf ("Dir Bitmap:  ");
  101.     pbits (dpbp -> al0, 8);
  102.     pbits (dpbp -> al1, 8);
  103.     putchar ('\n');
  104.     printf ("DSV Size:\t%5d\n", dpbp -> cks);
  105.     printf ("Sys Tracks:\t%5d\n", dpbp -> off);
  106.  
  107.     /* back to the proper disk! */
  108. away:
  109.     bdos (SELDISK, currdisk);
  110. }
  111.  
  112. /* print NUM in binary, which is of size BITS */
  113. pbits(num,bits)
  114.     int num;
  115.     int bits;
  116. {
  117.     unsigned mask;
  118.     for (mask = 1 << (bits - 1); mask; mask >>= 1)
  119.         putchar ((num & mask) ? '1' : '0');
  120. }
  121. m;
  122.     int bits;
  123. {
  124.     unsigned mask;
  125.     for (mask = 1 << (bits - 1); mask; mask >>= 1)
  126.         putchar ((num & mask) ? '1'