home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1998 July
/
Chip_1998-07_cd.bin
/
ctenari
/
Soban
/
IDE
/
TESTIDE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-11-18
|
4KB
|
189 lines
/* test ide */
#include "idediag.h"
#include <stdio.h>
static unsigned int buffer[256];
void zobraz_int_jako_dva_znaky(int data)
{
int znak;
znak=(data & 0xff00);
znak>>=8;
printf("%c", znak);
znak=(data & 0x00ff);
printf("%c", znak);
return;
}
void tisk_udaju(int disk)
{
int a;
printf("\nHodnoty hardisku: %d\n\n", disk);
printf("ID zarizeni = %04X Hex\n", buffer[0]);
printf("Datum = ");
for (a=23; a<=26; a++) {
zobraz_int_jako_dva_znaky(buffer[a]);
}
printf("\n");
printf("Seriove cislo = ");
for (a=11; a<=19; a++) {
zobraz_int_jako_dva_znaky(buffer[a]);
}
printf("\n");
printf("Model = ");
for (a=27; a<=47; a++) {
zobraz_int_jako_dva_znaky(buffer[a]);
}
printf("\n");
printf("Clusteru = %u\n", buffer[1]);
printf("Hlav = %u\n", buffer[3]);
printf("Sektoru = %u\n", buffer[6]);
printf("Kapacita disku uzitecna = %u * %u * %u * 512 = %ld\n", buffer[1], buffer[3], buffer[6], ((long)buffer[1] * (long)buffer[3] * (long)buffer[6] * 512L) );
//printf("Kapacita disku neformatovana = %ld\n", ((long)buffer[1] * (long)buffer[3] * (long)buffer[6] * (long) buffer[5]) );
printf("Bytu na stopu = %u\n", buffer[4]);
printf("Bytu na sektor = %u\n", buffer[5]);
printf("Velikost buferu = %u * 512 = %ld\n", buffer[21], ((long) buffer[21]*512L));
printf("Byte ECC = %u\n", buffer[22]);
printf("Radic typ = %u\n", buffer[20]);
/*
printf("remcyls= %d\n", buffer[2]);
printf("byteisg = %d\n", buffer[7]);
printf("byteplo = %d\n", buffer[8]);
printf("wordunig = %d %d\n", buffer[9], buffer[10]);
printf("secsint = %d\n", buffer[47]);
printf("dblword = %d\n", buffer[48]);
printf("writepro = %d %d\n", buffer[49], buffer[50]);
*/
return;
}
void zjisti_udaje(int disk)
{
int a, p, citac, zarizeni;
unsigned char status;
zarizeni=disk;
//zakazani preruseni pro 1 radic bylo v puvodnim programu
//outportb(HDC_FIXED, HDC_FIXED_IRQ);
disk<<=4;
disk+=0xa0;
//vyber disku 0, nebo 1
outportb(HDC_SDH, disk); //k hodnote pricist disk
//provedeni prikazu
outportb(HDC_COMMAND, HDC_COMMAND_READPAR);
for (a=0; a<256; a++)
{
citac=0;
do {
status=inportb(HDC_STATUS);
//platne je pouze pokud BUSY=0 a DRQ=1 tj jsou udaje v buferru hardisku
if ( (status & (HDC_STATUS_BUSY | HDC_STATUS_DRQ))==HDC_STATUS_DRQ ) p=0;
else { p=1; delay(100); printf(" %03d\r", citac); }
citac++;
if (citac>50) { printf(" Nelze precist udaje z disku: %d\n", zarizeni);
return;
}
} while (p); //opakuje se pokud p ma nenulovou hodnotu
buffer[a]=inport(HDC_DATA);
}
printf(" ");
tisk_udaju(zarizeni);
return;
}
void zjisti_udaje_eide(int disk)
{
int a, p, citac, zarizeni;
unsigned char status;
zarizeni=disk;
disk<<=4;
disk+=0xa0;
//vyber disku 0, nebo 1
outportb(EHDC_SDH, disk); //k hodnote pricist disk
//provedeni prikazu
outportb(EHDC_COMMAND, HDC_COMMAND_READPAR);
for (a=0; a<256; a++)
{
citac=0;
do {
status=inportb(EHDC_STATUS);
//platne je pouze pokud BUSY=0 a DRQ=1 tj jsou udaje v buferru hardisku
if ( (status & (HDC_STATUS_BUSY | HDC_STATUS_DRQ))==HDC_STATUS_DRQ ) p=0;
else { p=1; delay(100); printf(" %03d\r", citac); }
citac++;
if (citac>50) { printf(" Nelze precist udaje z disku: %d\n", zarizeni);
return;
}
} while (p); //opakuje se pokud p ma nenulovou hodnotu
buffer[a]=inport(EHDC_DATA);
}
printf(" ");
tisk_udaju(zarizeni);
return;
}
void pokracuj(void)
{
printf("\n Pro pokracovani zmackni klavesu.\n");
getch();
return;
}
int main(void)
{
printf("\n Program pro zjisteni udaju o hardiscich v1.1 (c) 1995 S&S Soban Petr\n\n");
printf(" Prvni radic:\n");
zjisti_udaje(0);
pokracuj();
zjisti_udaje(1);
pokracuj();
printf("\n Druhy radic:\n");
zjisti_udaje_eide(0);
pokracuj();
zjisti_udaje_eide(1);
pokracuj();
return 0;
}