home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / c / other / file / disk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-27  |  1.6 KB  |  68 lines

  1. /* DISK.C illustrates low-level disk access using functions:
  2.  *      _bios_disk          _dos_getdiskfree
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <conio.h>
  7. #include <bios.h>
  8. #include <dos.h>
  9. #include <stdlib.h>
  10.  
  11. char far diskbuf[512];
  12.  
  13. main( int argc, char *argv[] )
  14. {
  15.     unsigned status = 0, i;
  16.     struct diskinfo_t di;
  17.     struct diskfree_t df;
  18.     unsigned char far *p, linebuf[17];
  19.  
  20.     if( argc != 5 )
  21.     {
  22.         printf( "  SYNTAX: DISK <driveletter> <head> <track> <sector>" );
  23.         exit( 1 );
  24.     }
  25.  
  26.     if( (di.drive = toupper( argv[1][0] ) - 'A' ) > 1 )
  27.     {
  28.         printf( "Must be floppy drive" );
  29.         exit( 1 );
  30.     }
  31.     di.head     = atoi( argv[2] );
  32.     di.track    = atoi( argv[3] );
  33.     di.sector   = atoi( argv[4] );
  34.     di.nsectors = 1;
  35.     di.buffer   = diskbuf;
  36.  
  37.     /* Get information about disk size. */
  38.     if( _dos_getdiskfree( di.drive + 1, &df ) )
  39.         exit( 1 );
  40.  
  41.     /* Try reading disk three times before giving up. */
  42.     for( i = 0; i < 3; i++ )
  43.     {
  44.         status = _bios_disk( _DISK_READ, &di ) >> 8;
  45.         if( !status )
  46.             break;
  47.     }
  48.  
  49.     /* Display one sector. */
  50.     if( status )
  51.         printf( "Error: 0x%.2x\n", status );
  52.     else
  53.     {
  54.         for( p = diskbuf, i = 0; p < (diskbuf + df.bytes_per_sector); p++ )
  55.         {
  56.             linebuf[i++] = (*p > 32) ? *p : '.';
  57.             printf( "%.2x ", *p );
  58.             if( i == 16 )
  59.             {
  60.                 linebuf[i] = '\0';
  61.                 printf( " %16s\n", linebuf );
  62.                 i = 0;
  63.             }
  64.         }
  65.     }
  66.     exit( 1 );
  67. }
  68.