home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Best Objectech Shareware Selections
/
UNTITLED.iso
/
boss
/
util
/
disk
/
003
/
idediag.c
< prev
next >
Wrap
Text File
|
1991-03-02
|
5KB
|
175 lines
/********************************************************************
idediag
shows characteristics of IDE hard disks.
Public Domain by Paolo Bevilacqua, Rome.
You can add more disk type to the idetypes[]
table, and distribuite freely.
********************************************************************/
#include "1010_hdc.h"
unsigned secbuf[256];
int drive;
struct {
unsigned cylinders,
heads,
sectors;
char *name;
} idetypes[] = {
{ 667, 4, 33, "Fujitsu M2611T (42.9 MB)" },
{ 667, 8, 33, "Fujitsu M2612T (85.9 MB)" },
{ 667, 12, 33, "Fujitsu M2613T (128.9 MB)" },
{ 667, 16, 33, "Fujitsu M2614T (171.9 MB)" },
{ 782, 2, 27, "Western Digital WD93024-A (20.6 MB)" },
{ 782, 4, 27, "Western Digital WD93044-A (41.2 MB)" },
{ 845, 3, 35, "Toshiba MK232FC (45.4 MB"},
{ 845, 7, 35, "Toshiba MK234FC (106 MB"},
{ 965, 5, 17, "Quantum ProDrive 40AT (40 MB)"},
{ 965, 10, 17, "Quantum ProDrive 80AT (80 MB)"},
{1050, 2, 40, "Teac SD-340 (41 MB)"},
{ 776, 8, 33, "Conner CP-3104 (100 MB)"},
{ 745, 4, 28, "Priam 3804M 40.7 MB"},
{ 0, 0, 0, ""}
};
struct ideinfo {
unsigned genconf,
fixcyls,
remcyls,
heads,
bytetrack, /* bytes per track */
bytesector, /* bytes per sector */
sectors, /* sectors per track */
byteisg, /* bytes intesector gap */
byteplo, /* bytes in sync */
worduniq; /* words unique status */
char serial[20];
unsigned contype, /* controller type */
bufsiz, /* buffer size in 512 byte blocks */
byteecc; /* ECC bytes trasferred in read/write long */
char firmware[8], /* firmware revision */
model[40]; /* model ID */
unsigned secsint, /* number of sectors transferred per interrupt */
dblword, /* double word transfer flag */
writepro; /* write protect */
};
printinfo() {
struct ideinfo *id = (struct ideinfo *)secbuf;
int i, capacity;
char c, *type;
/* get disk type by characteristics */
for (i=0; idetypes[i].cylinders != 0; ++i)
if (idetypes[i].cylinders == id->fixcyls &&
idetypes[i].heads == id->heads &&
idetypes[i].sectors == id->sectors) {
type = idetypes[i].name;
break;
}
/* unknow disk */
if (idetypes[i].cylinders == 0) {
type = "Unknown ";
/* calculate capacity in MB */
capacity = (id->fixcyls * id->heads * id->sectors) / 2048;
itoa(capacity, type+8, 10);
strcat(type, "Mbytes");
}
/* swap bytes in ASCII fields except for WD disks */
if (i != 4 && i != 5) {
for(i=0; i < 10; ++i) {
c = id->serial[i*2];
id->serial[i*2] = id->serial[i*2+1];
id->serial[i*2+1] = c;
}
for(i=0; i < 4; ++i) {
c = id->firmware[i*2];
id->firmware[i*2] = id->firmware[i*2+1];
id->firmware[i*2+1] = c;
}
for(i=0; i < 20; ++i) {
c = id->model[i*2];
id->model[i*2] = id->model[(i*2)+1];
id->model[i*2+1] = c;
}
}
printf("Informations for drive %u, %s\n"
"Drive ID: %04X\n"
"%u fixed cylinders, %u removables\n"
"%u heads, %u sectors\n"
"Serial number: %.20s\n"
"Controller firmware: %.8s\n"
"Controller model: %.408s\n"
"%u bytes per track, %u per sector\n"
"%u bytes of intersector gap, %u of sync\n"
"Controller type %u, buffer %u Kbytes\n"
"%u bytes of ECC, %u sector(s) transferred per interrupt\n"
"Double word transfer %s allowed, %s write protected.\n",
drive, type,
id->genconf,
id->fixcyls, id->remcyls,
id->heads, id->sectors,
id->serial,
id->firmware,
id->model,
id->bytetrack, id->bytesector,
id->byteisg, id->byteplo,
id->contype, id->bufsiz / 2,
id->byteecc, id->secsint,
id->dblword ? "" : "not", id->writepro ? "" : "not");
}
main() {
drive = 0;
/* disable interrupt from drive */
outp(HDC_FIXED, HDC_FIXED_IRQ);
/* set up task file parameter */
outp(HDC_SDH, 0xA0 + (drive<<4));
/* issue read parameters */
outp(HDC_COMMAND, HDC_COMMAND_READPAR);
/* read up sector */
readsect();
/* print out info */
printinfo();
}
readsect() {
int i;
/* poll DRQ */
while(inp(HDC_STATUS) & HDC_STATUS_BUSY)
;
/* read up sector */
for (i=0; i<256; ++i)
secbuf[i] = inpw(HDC_DATA);
}