home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 225_01 / chkdsk.c < prev    next >
Text File  |  1987-06-10  |  8KB  |  208 lines

  1. /*-----------------------------------------------------------------*/
  2. /* FILE:           CHKDSK.C
  3.    ----
  4.  
  5.    This programme checks the disk parameters using the Disk
  6.    Parameter Block information in the BIOS.   It will only work
  7.    with CP/M 2.0 or higher.
  8.  
  9.    NOTE:      Written for BDS C.
  10.    ----       It also requires DEFF4.CRL to compile the "COM"
  11.               programme.
  12.  
  13.    Written:        August 23, 1986
  14.    -------
  15.    Updated:        November 8, 1986
  16.    -------
  17.    Version:        1.1
  18.    -------
  19.  
  20.    Copyright 1986 - Cogar Computer Services Pty. Ltd.              */
  21. /*-----------------------------------------------------------------*/
  22. #include <bdscio.h>
  23. #include <pec.h>
  24. /*-----------------------------------------------------------------*/
  25. #define    NAME    "CHKDSK"
  26. #define    VERSION    "1.1"
  27.  
  28. main(argc, argv)
  29. int argc;
  30. char *argv[];
  31. {
  32. /*-----------------------------------------------------------------*/
  33. /*  Space reserved for variables used in programme                 */
  34. /*-----------------------------------------------------------------*/
  35.     struct dpb *THIS;    /* Pointer to disk parameter block */
  36.     char DRIVE;        /* For the drive code              */
  37.     int i, NO_TRKS, LAST_TRACK, LAST_BLOCK;
  38.     int BLOCK, BLK_TRK, FD;
  39.     char c;
  40.     int  BLOCKS;        /* The number of Allocation Blocks */
  41.     int  BYTE_COUNT;    /* The bytes holding Al. Blocks    */
  42.     char *MAP_ADR;         /* The bit map address             */
  43.     int CPM;    /* To check the CP/M Version number        */
  44.     char OLD_DRIVE;    /* The drive at start of programme         */
  45.     char OLD_USER;    /* The User No. at start of programme      */
  46.     char USER;    /* The User No. for this programme         */
  47. /*-----------------------------------------------------------------*/
  48. /*  First check the CP/M Version in use.   If it is less than
  49.     Version 2.0 then inform the user and terminate programme.      */
  50. /*-----------------------------------------------------------------*/
  51.  
  52.     CPM = get_cpm();    /* Obtain the CP/M version and No. */
  53.  
  54.     i = (CPM & 0xff) - 0x20; /* Mask off the MP/M bit          */
  55.  
  56.     if(i < 0)        /* Must be less than V 2.0         */
  57.     {
  58.     printf("This programme requires at least V 2.x of CP/M.\n");
  59.         printf("Sorry but it won't run for you.\n");
  60.         exit();
  61.     }
  62. /*-----------------------------------------------------------------*/
  63. /*  The CP/M Version is OK, so save the starting User No. and the
  64.     starting Drive No.in case either is changed later.             */
  65. /*-----------------------------------------------------------------*/
  66.  
  67.     OLD_USER = user_id(0xff);
  68.     OLD_DRIVE = get_default() + 0x41;
  69. /*-----------------------------------------------------------------*/
  70. /*  The actual programme starts here.                              */
  71. /*-----------------------------------------------------------------*/
  72.  
  73.     pec_clear();
  74.     printf("%s  -  Version %s\n", NAME, VERSION);
  75.     printf("Copyright 1986 - Cogar Computer Services Pty. Ltd.\n\n");
  76.     printf("-----------------------------------------------------\n");
  77.     printf("This programme checks the Disk Parameter Block of the\n");
  78.     printf("nominated disk and prints out the information it gets\n");
  79.     printf("from the DPB plus a copy of the Data Map.\n");
  80.     printf("This shows 1 [one] for each Allocation Block in use\n");
  81.     printf("and 0 [zero] for an unused Allocation Block.\n");
  82.     printf("-----------------------------------------------------\n");
  83.     line();
  84. /*-----------------------------------------------------------------*/
  85. /*  Check which drive to examine.                                  */
  86. /*-----------------------------------------------------------------*/
  87.  
  88.     if(argc != 2)        /* See if any drive was given      */
  89.     {
  90.     printf("Nominate the drive to be checked  A, B, C.... ");
  91.     DRIVE = toupper(getchar());
  92.     }
  93.     else DRIVE = toupper(argv[1][0]);
  94.  
  95.     reset_dsk();        /* Load dpb's into memory          */
  96.     if(select_dsk(DRIVE) != 0)
  97.         exit();             /* Select the drive to be done */
  98. /*-----------------------------------------------------------------*/
  99. /*  Now get the disk parameters for this drive.                    */
  100. /*-----------------------------------------------------------------*/
  101.  
  102.     THIS = dpb_adr();
  103.     BLOCK = 128 << THIS->BSH;  /* Allocation Block in bytes    */
  104.     BLK_TRK = (THIS->SPT)*128/BLOCK;  /* Blocks per track      */
  105.     BLOCKS = THIS->DSM + 1;
  106. /*-----------------------------------------------------------------*/
  107. /*  And print the information to screen.                           */
  108. /*-----------------------------------------------------------------*/
  109.     pec_clear();
  110.     printf("%s  -  Version %s\n", NAME, VERSION);
  111.     printf("Copyright 1986 - Cogar Computer Services Pty. Ltd.\n\n");
  112. /*-----------------------------------------------------------------*/
  113.  
  114.     printf("The disk parameter block for Drive  %c  is - \n\n", DRIVE);
  115.     printf("Allocation vector AL0       - %d \t",THIS->AL0);
  116.     printf("Allocation vector AL1       - %d\n",THIS->AL1);
  117.     printf("Allocation Block (bytes)    - %d \t", BLOCK);
  118.     printf("Block mask                  - %d\n",THIS->BLM);
  119.     printf("Block shift factor          - %d \t",THIS->BSH);
  120.     printf("Blocks per track            - %d\n", BLK_TRK);
  121.     printf("Check area size             - %d \t",THIS->CKS);
  122.     printf("Drive capacity (Blocks)     - %d\n",BLOCKS);
  123.     printf("Directory size (Entries)    - %d \t",THIS->DRM + 1);
  124.     printf("Extent mask                 - %d\n",THIS->EXM);
  125.     printf("Records per track           - %d \t",THIS->SPT);
  126.     printf("Records per block           - %d\n", BLOCK/128);
  127.     printf("Reserved tracks             - %d \t",THIS->OFF);
  128.  
  129.     if((LAST_BLOCK = (THIS->DSM + 1) << THIS->BSH)%THIS->SPT != 0)
  130.         NO_TRKS = LAST_BLOCK/THIS->SPT + 1;
  131.     else NO_TRKS = LAST_BLOCK/THIS->SPT;
  132.     NO_TRKS = NO_TRKS + THIS->OFF; /* Add the offset     */
  133.     LAST_TRACK = NO_TRKS - 1; /* Numbered from zero         */
  134.     printf("Last Track No.              - %d\n",LAST_TRACK);
  135. /*-----------------------------------------------------------------*/
  136. /* Now print out the bit map for the active drive.                 */
  137. /*-----------------------------------------------------------------*/
  138.     if(BLOCKS%8 == 0)
  139.         BYTE_COUNT = BLOCKS/8;
  140.     else BYTE_COUNT = BLOCKS/8 + 1;
  141.  
  142.     MAP_ADR = get_map();
  143.     for(i = 0; i < 75; i++)
  144.         printf("-");
  145.     printf("\n");
  146.     printf("The Allocation Block Table is -\n\n");
  147.     for(i = 0; i < BYTE_COUNT; i++)
  148.     {
  149.         print_byte(MAP_ADR[i]);
  150.         putchar(SPACE);
  151.         if((i + 1)%8 == 0)
  152.             putchar('\n');
  153.     }
  154.     line();
  155. /*-----------------------------------------------------------------*/
  156. /*  Before closing, make sure the User No. and the Drive No.
  157.     return to original settings.                                   */
  158. /*-----------------------------------------------------------------*/
  159.  
  160.     user_id(OLD_USER);
  161.     if(select_dsk(OLD_DRIVE) != 0)
  162.     {
  163.         printf("\nUnable to return to original Drive.");
  164.         exit();
  165.     }
  166. /*-----------------------------------------------------------------*/
  167. /*  Ask if any further utilities are to be run.                    */
  168. /*-----------------------------------------------------------------*/
  169.     printf("Do you want to run any more utilities  -  Y/N");
  170. if((FD = open("UTIL.COM", 0)) != -1 && (c = toupper(getchar()) == 'Y'))
  171.     {
  172.         close(FD);
  173.         exec("UTIL");
  174.     }
  175.     else printf("\nReturning to CP/M.");
  176.  
  177. }
  178. /*-----------------------------------------------------------------*/
  179. /*  Sub-routines used in this programme.                           */
  180. /*-----------------------------------------------------------------*/
  181.  
  182. unsigned get_map()
  183. {
  184.     return(bdos(27, 0));
  185. }
  186. /*-----------------------------------------------------------------*/
  187.  
  188. print_byte(c)
  189. char c;
  190. {
  191.     int i;
  192.     char bin_display[9];
  193.     bin_display[8] = '\0';    /* Null terminated                 */
  194.  
  195.     for(i = 0; i < 8; i++)
  196.     {
  197.         if(c & 0x01)
  198.             bin_display[7 - i] = '1';
  199.         else bin_display[7 - i] = '0';
  200.  
  201.         c = c >> 1;
  202.     }
  203.     printf("%s", bin_display);
  204. }
  205. /*-----------------------------------------------------------------*/
  206.  
  207. ------------------------*/
  208. /* Now