/*****************************************************************************
Sector-level disk I/O code for various OSes
This code is public domain (no copyright).
You can do whatever you want with it.
*****************************************************************************/
#include <stdio.h> /* printf(), putchar() */
#include "diskio.h"
/*****************************************************************************
*****************************************************************************/
#define BPERL 16 /* byte/line for dump */
static void dump(unsigned char *data, unsigned count)
{
unsigned char byte1, byte2;
while(count != 0)
{
for(byte1 = 0; byte1 < BPERL; byte1++)
{
if(count == 0)
break;
printf("%02X ", data[byte1]);
count--;
}
printf("\t");
for(byte2 = 0; byte2 < byte1; byte2++)
{
if(data[byte2] < ' ')
putchar('.');
else
putchar(data[byte2]);
}
printf("\n");
data += BPERL;
}
}
/*****************************************************************************
*****************************************************************************/
int main(void)
{
unsigned char buf[512], *ptab_rec;
unsigned i = 0;
disk_t disk;
printf("Looking for FAT (DOS) disk or partition...\n");
/* check if floppy in A: drive */
if(open_disk(&disk, 0) == 0)
{
/* read bootsector, check if FAT */
if(read_sector(&disk, 0, buf) == 0)
{
if(is_fat_bootsector(buf))
goto OK;
}
}
/* scan hard drives for FAT partition */
for(i = 0x80; i < 0x82; i++)
{
if(open_disk(&disk, i) != 0)
continue;
/* read MBR */
if(read_sector(&disk, 0, buf) != 0)
continue;
/* find FAT partition */
for(i = 0; i < 4; i++)
{
ptab_rec = buf + 446 + 16 * i;
/* make sure it's FAT */
if(ptab_rec[4] == 0x01 || /* FAT 12 */
ptab_rec[4] == 0x04 || /* FAT 16 <32meg */
ptab_rec[4] == 0x06 || /* FAT 16 >=32meg */
ptab_rec[4] == 0x0E) /* LBA type 0x06 */
{
/* xxx - note if FAT16 or FAT12 */
disk.partition_start = LE32(ptab_rec + 8);
goto OK;
}
}
}
printf("No FAT partitions found on any disk\n");
return 1;
OK:
if(disk.drive_num >= 0x80)
printf("Partition #%u on ", i);
printf("INT 13h disk number 0x%02X:\n", disk.drive_num);
if(read_sector(&disk, 0, buf) != 0)
printf("Error reading bootsector\n");
else
{
printf("Hex dump of bootsector:\n");
dump(buf, 64);
}
return 0;
}