home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / d / dugide10.zip / DUG_IDE.C next >
Text File  |  1993-01-12  |  5KB  |  133 lines

  1. /*
  2. ** DUG_IDE : Provides IDE disk info on both drives in the system
  3. **           Version 1.0
  4. **
  5. ** Copyright (c) 12 Jan 1993 by Doug Merrett - All rights reserved
  6. **
  7. ** Postal Address: PO Box 432
  8. **                 Stones Corner  Q  4120
  9. **                 Australia
  10. **
  11. ** Email Address:  dcm@mincom.oz.au
  12. **
  13. ** You may distribute freely, but no modifications without mailing me a copy.
  14. ** No profit can be made for distribution.  Blah Blah Blah etc.
  15. */
  16.  
  17. /* Used by JPI for clrscr */
  18. #define _JPI_WIN_
  19.  
  20.  
  21. #include <stdlib.h>
  22. #include <dos.h>
  23. #include <stdio.h>
  24. #include <conio.h>
  25. #include <bios.h>
  26.  
  27.  
  28. char *getascii (unsigned int in_data [], int off_start, int off_end);
  29.  
  30. void main (void)
  31. {
  32.   unsigned int dd [256]; /* DiskData */
  33.   unsigned int dd_off;   /* DiskData offset */
  34.   unsigned int loop;     /* Loop variable */
  35.   int num_drv;           /* Number of Hard disks */
  36.  
  37.   union REGS registers;  /* Used for Interrupt for BIOS data */
  38.  
  39.  
  40.   unsigned int bios_cyl [2], bios_head [2], bios_sec [2];  /* Cylinders, Heads, Sectors */
  41.  
  42.  
  43.   clrscr ();
  44.  
  45.   fprintf (stderr, "** DUG_IDE : Provides IDE disk info on both drives in the system\n");
  46.   fprintf (stderr, "** Version 1.0\n");
  47.   fprintf (stderr, "**\n");
  48.   fprintf (stderr, "** Copyright (c) 12 Jan 1993 by Doug Merrett - All rights reserved\n");
  49.   fprintf (stderr, "**\n");
  50.   fprintf (stderr, "** Postal Address: PO Box 432\n");
  51.   fprintf (stderr, "**                 Stones Corner  Q  4120\n");
  52.   fprintf (stderr, "**                 Australia\n");
  53.   fprintf (stderr, "**\n");
  54.   fprintf (stderr, "** Email Address:  dcm@mincom.oz.au\n");
  55.   fprintf (stderr, "**\n");
  56.   fprintf (stderr, "** You may distribute freely, but no modifications without mailing me a copy.\n");
  57.   fprintf (stderr, "** No profit can be made for distribution.  Blah Blah Blah etc.\n\n");
  58.   fprintf (stderr, "Press any key to accept above limitations");
  59.   getch ();
  60.  
  61.   /* How many disk drives & parameters */
  62.   num_drv = peekb (0x40, 0x75);  /* BIOS Data area, Number of Hard disks */
  63.                                  /* Byte at Segment 40H Offset 75H */
  64.  
  65.   for (loop = 0; loop < num_drv; loop++)  /* Loop through drives */
  66.     {
  67.       /* Get IDE Drive info */
  68.  
  69.       while (inp (0x1F7) != 0x50)  /* Wait for controller not busy */
  70.         ;
  71.  
  72.       outp (0x1F6, (loop == 0 ? 0xA0 : 0xB0)); /* Get first/second drive */
  73.  
  74.       outp (0x1F7, 0xEC);          /* Get drive info data */
  75.  
  76.       while (inp (0x1F7) != 0x58)  /* Wait for data ready */
  77.         ;
  78.  
  79.       for (dd_off = 0; dd_off != 256; dd_off++) /* Read "sector" */
  80.         dd [dd_off] = inpw (0x1F0);
  81.  
  82.       /* Get BIOS drive info */
  83.       registers.h.ah = 0x8;            /* Get drive info */
  84.       registers.h.dl = 0x80 + loop;    /* Drive is 80H for Disk 0, 81H for Disk 1 */
  85.       int86 (0x13, ®isters, ®isters);
  86.       if (! registers.x.cflag)   /* All OK if carry not set */
  87.         {
  88.           bios_head [loop] = registers.h.dh + 1; /* Heads are from 0 */
  89.           bios_sec [loop] = registers.h.cl & 0x3F; /* sec is bits 5 - 0 */
  90.           bios_cyl [loop] = ((registers.h.cl & 0xC0) << 2) + registers.h.ch + 2; /* +1 because starts from 0 and +1 for FDISK leaving one out */
  91.         }
  92.  
  93.       clrscr ();
  94.  
  95.       fprintf (stdout, "DRIVE %d:\n", loop);
  96.       fprintf (stdout, "Model Number______________________: %s\n", getascii (dd, 27, 46));
  97.       fprintf (stdout, "Serial Number_____________________: %s\n", getascii (dd, 10, 19));
  98.       fprintf (stdout, "Controller Revision Number________: %s\n\n", getascii (dd, 23, 26));
  99.       fprintf (stdout, "Able to do Double Word Transfer___: %6s\n", (dd [48] == 0 ? "No" : "Yes"));
  100.       fprintf (stdout, "Controller type___________________:   %04X\n", dd [20]);
  101.       fprintf (stdout, "Controller buffer size (bytes)____: %6u\n", dd [21] * 512);
  102.       fprintf (stdout, "Number of ECC bytes transferred___: %6u\n", dd [22]);
  103.       fprintf (stdout, "Number of sectors per interrupt___: %6u\n\n", dd [47]);
  104.       fprintf (stdout, "Hard Disk Reports\n");
  105.       fprintf (stdout, "Number of Cylinders (Fixed)_______: %6u\n", dd [1]);
  106.       fprintf (stdout, "Number of Heads___________________: %6u\n", dd [3]);
  107.       fprintf (stdout, "Number of Sectors per Track_______: %6u\n\n", dd [6]);
  108.       fprintf (stdout, "BIOS Reports\n");
  109.       fprintf (stdout, "Number of Cylinders_______________: %6u\n", bios_cyl [loop]);
  110.       fprintf (stdout, "Number of Heads___________________: %6u\n", bios_head [loop]);
  111.       fprintf (stdout, "Number of Sectors per Track_______: %6u\n\n", bios_sec [loop]);
  112.  
  113.       if (! loop)
  114.         {
  115.           fprintf (stdout, "Press a key");
  116.           getch ();
  117.         }
  118.    }
  119. }
  120.  
  121. char *getascii (unsigned int in_data [], int off_start, int off_end)
  122. {
  123.   static char ret_val [255];
  124.   int loop, loop1;
  125.  
  126.   for (loop = off_start, loop1 = 0; loop <= off_end; loop++)
  127.     {
  128.       ret_val [loop1++] = (char) (in_data [loop] / 256);  /* Get High byte */
  129.       ret_val [loop1++] = (char) (in_data [loop] % 256);  /* Get Low byte */
  130.     }
  131.   ret_val [loop1] = '\0';  /* Make sure it ends in a NULL character */
  132.   return (ret_val);
  133. }