home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 July / Chip_1998-07_cd.bin / ctenari / Soban / IDE / TESTIDE.C < prev    next >
C/C++ Source or Header  |  1995-11-18  |  4KB  |  189 lines

  1. /* test ide */
  2.  
  3. #include "idediag.h"
  4. #include <stdio.h>
  5.  
  6. static unsigned int buffer[256];
  7.  
  8. void zobraz_int_jako_dva_znaky(int data)
  9. {
  10. int znak;
  11.  
  12. znak=(data & 0xff00);
  13. znak>>=8;
  14. printf("%c", znak);
  15. znak=(data & 0x00ff);
  16. printf("%c", znak);
  17.  
  18. return;
  19. }
  20.  
  21. void tisk_udaju(int disk)
  22. {
  23. int a;
  24.  
  25. printf("\nHodnoty hardisku: %d\n\n", disk);
  26.  
  27. printf("ID zarizeni = %04X Hex\n", buffer[0]);
  28.  
  29. printf("Datum = ");
  30. for (a=23; a<=26; a++) {
  31. zobraz_int_jako_dva_znaky(buffer[a]);
  32. }
  33. printf("\n");
  34.  
  35. printf("Seriove cislo = ");
  36. for (a=11; a<=19; a++) {
  37. zobraz_int_jako_dva_znaky(buffer[a]);
  38. }
  39. printf("\n");
  40.  
  41. printf("Model = ");
  42. for (a=27; a<=47; a++) {
  43. zobraz_int_jako_dva_znaky(buffer[a]);
  44. }
  45. printf("\n");
  46. printf("Clusteru = %u\n", buffer[1]);
  47. printf("Hlav = %u\n", buffer[3]);
  48. printf("Sektoru = %u\n", buffer[6]);
  49. 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) );
  50. //printf("Kapacita disku neformatovana = %ld\n", ((long)buffer[1] * (long)buffer[3] * (long)buffer[6] * (long) buffer[5]) );
  51. printf("Bytu na stopu = %u\n", buffer[4]);
  52. printf("Bytu na sektor = %u\n", buffer[5]);
  53.  
  54. printf("Velikost buferu = %u * 512 = %ld\n", buffer[21], ((long) buffer[21]*512L));
  55. printf("Byte ECC = %u\n", buffer[22]);
  56. printf("Radic typ = %u\n", buffer[20]);
  57. /*
  58.  
  59. printf("remcyls= %d\n", buffer[2]);
  60. printf("byteisg = %d\n", buffer[7]);
  61. printf("byteplo = %d\n", buffer[8]);
  62. printf("wordunig = %d %d\n", buffer[9], buffer[10]);
  63. printf("secsint = %d\n", buffer[47]);
  64. printf("dblword = %d\n", buffer[48]);
  65. printf("writepro = %d %d\n", buffer[49], buffer[50]);
  66.  
  67. */
  68.  
  69. return;
  70. }
  71.  
  72. void zjisti_udaje(int disk)
  73. {
  74. int a, p, citac, zarizeni;
  75. unsigned char status;
  76.  
  77.  
  78. zarizeni=disk;
  79. //zakazani preruseni pro 1 radic bylo v puvodnim programu
  80. //outportb(HDC_FIXED, HDC_FIXED_IRQ);
  81. disk<<=4;
  82. disk+=0xa0;
  83. //vyber disku 0, nebo 1
  84. outportb(HDC_SDH, disk);  //k hodnote pricist disk
  85. //provedeni prikazu
  86. outportb(HDC_COMMAND, HDC_COMMAND_READPAR);
  87.  
  88.  
  89. for (a=0; a<256; a++)
  90. {
  91. citac=0;
  92.  
  93. do {
  94.     status=inportb(HDC_STATUS);
  95.     //platne je pouze pokud BUSY=0 a DRQ=1 tj jsou udaje v buferru hardisku
  96.     if ( (status & (HDC_STATUS_BUSY | HDC_STATUS_DRQ))==HDC_STATUS_DRQ ) p=0;
  97.     else { p=1; delay(100); printf(" %03d\r", citac); }
  98.  
  99.     citac++;
  100.  
  101.     if (citac>50) { printf(" Nelze precist udaje z disku: %d\n", zarizeni);
  102.               return;
  103.             }
  104.  
  105.  
  106.     } while (p); //opakuje se pokud p ma nenulovou hodnotu
  107.  
  108. buffer[a]=inport(HDC_DATA);
  109. }
  110. printf("      ");
  111.  
  112.  
  113. tisk_udaju(zarizeni);
  114.  
  115. return;
  116. }
  117.  
  118. void zjisti_udaje_eide(int disk)
  119. {
  120. int a, p, citac, zarizeni;
  121. unsigned char status;
  122.  
  123.  
  124. zarizeni=disk;
  125.  
  126. disk<<=4;
  127. disk+=0xa0;
  128. //vyber disku 0, nebo 1
  129. outportb(EHDC_SDH, disk);  //k hodnote pricist disk
  130. //provedeni prikazu
  131. outportb(EHDC_COMMAND, HDC_COMMAND_READPAR);
  132.  
  133.  
  134. for (a=0; a<256; a++)
  135. {
  136. citac=0;
  137.  
  138. do {
  139.     status=inportb(EHDC_STATUS);
  140.     //platne je pouze pokud BUSY=0 a DRQ=1 tj jsou udaje v buferru hardisku
  141.     if ( (status & (HDC_STATUS_BUSY | HDC_STATUS_DRQ))==HDC_STATUS_DRQ ) p=0;
  142.     else { p=1; delay(100); printf(" %03d\r", citac); }
  143.  
  144.     citac++;
  145.  
  146.     if (citac>50) { printf(" Nelze precist udaje z disku: %d\n", zarizeni);
  147.               return;
  148.             }
  149.  
  150.  
  151.     } while (p); //opakuje se pokud p ma nenulovou hodnotu
  152.  
  153. buffer[a]=inport(EHDC_DATA);
  154. }
  155. printf("      ");
  156.  
  157.  
  158. tisk_udaju(zarizeni);
  159.  
  160. return;
  161. }
  162.  
  163.  
  164. void pokracuj(void)
  165. {
  166. printf("\n Pro pokracovani zmackni klavesu.\n");
  167. getch();
  168. return;
  169. }
  170.  
  171. int main(void)
  172. {
  173.  
  174. printf("\n Program pro zjisteni udaju o hardiscich v1.1 (c) 1995 S&S Soban Petr\n\n");
  175. printf(" Prvni radic:\n");
  176. zjisti_udaje(0);
  177. pokracuj();
  178. zjisti_udaje(1);
  179. pokracuj();
  180. printf("\n Druhy radic:\n");
  181. zjisti_udaje_eide(0);
  182. pokracuj();
  183. zjisti_udaje_eide(1);
  184. pokracuj();
  185.  
  186.  
  187. return 0;
  188. }
  189.