Проверка на BAD сектора флопи диска.

Тема в разделе "WASM.BEGINNERS", создана пользователем Firefish, 10 янв 2008.

  1. Firefish

    Firefish New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2008
    Сообщения:
    2
    Здравствуйте всем.
    Есть небольшая проблема, в ниже приложенном коде, я не пойму где допустил ошибку. Вроде программа работает, т.е. "что то " читает, но не находит сбойные сектора вообще, как я только диск не портил - и ничего (.
    Подскажите где я мог допустить ошибку ? Вот функция отвечающая за проверку:

    Код (Text):
    1. void CheckDrive(DriveInfo &drive)
    2. {
    3.     DriveGeometry geometry;
    4.     // запросить геометрию диска
    5.     if (!GetDriveGeometry(drive.number, geometry))
    6.     {
    7.         printf("Error requesting drive geometry: %s%d", (drive.number & 0x80 ? "HDD" : "FDD"), drive.number & 0x7F);
    8.         return;
    9.     }
    10.  
    11.     // вывести уведомление о начале проверки
    12.     printf("Checking %s%d\nPress Alt+X to abort.\n\b", (drive.number & 0x80 ? "HDD" : "FDD"), drive.number & 0x7F);
    13.  
    14.     unsigned c, h, s;
    15.  
    16.     // данные для рассчёта степени выполнения процесса
    17.     double total = 1.0 * geometry.cylinders * geometry.heads;
    18.     double current = 0;
    19.  
    20.  
    21.     // буффер для хранения данных при верификацииы
    22.     char buffer[512];
    23.     unsigned long errors = 0;
    24.  
    25.     // записывать файл отчёта
    26.     FILE *log = fopen("checklog.txt", "w");
    27.  
    28.     // пройтись по структурным элементам
    29.     for (c = 0; c < geometry.cylinders; ++c)
    30.     {
    31.         for (h = 0; h < geometry.heads; ++h)
    32.         {
    33.             for (s = 0; s < geometry.sectors; ++s)
    34.             {
    35.                 // запросить верификацию сектора через функцию 04h (DISK - VERIFY DISK SECTOR(S)) прерывания 13h (дисковая подсистема)
    36.                 /**
    37.                     Inp.:
    38.                         AH = 04h
    39.                         AL = number of sectors to verify (must be nonzero)
    40.                         CH = low eight bits of cylinder number
    41.                         CL = sector number 1-63 (bits 0-5)
    42.                                  high two bits of cylinder (bits 6-7, hard disk only)
    43.                         DH = head number
    44.                         DL = drive number (bit 7 set for hard disk)
    45.                         ES:BX -> data buffer (PC,XT,AT with BIOS prior to 11/15/85)
    46.                     Return: CF set on error
    47.                         CF clear if successful
    48.                         AH = status
    49.                         AL = number of sectors verified
    50.  
    51.                     Copied from Ralf Brown's Interrupt List
    52.                 */
    53.                 char _ah;
    54.                 int ah;
    55.                 int cflag;
    56.                 int number = drive.number;
    57.  
    58.                 _asm {
    59.                     push    es
    60.                     mov     ax, 401h
    61.                     mov     cx, [c]
    62.                     rol     cx, 8
    63.                     shl     cl, 6
    64.                     or      cl, byte ptr [s]
    65.                     mov     dx, [number]
    66.                     mov     dh, byte ptr [h]
    67.                     lea     bx, buffer
    68.                     push    ss
    69.                     pop     es
    70.                     int     13h
    71.                     mov     byte ptr [_ah], ah
    72.                     pushf
    73.                     pop     dx
    74.                     and     dx, 1
    75.                     mov     [cflag], dx
    76.  
    77.                     pop     es
    78.                 }
    79.  
    80.                 // проанализировать результат выполнения операции
    81.                 if (cflag)
    82.                 {
    83.                     ah = _ah;
    84.                     // отработать возможные ошибки
    85.                     switch (ah & 0xFF)
    86.                     {
    87.                         case 0x31:
    88.                             fprintf(stderr, "\nError: no media in drive\n");
    89.                             goto quit;
    90.                         case 0x80:
    91.                             fprintf(stderr, "\nError: drive not ready (timeout)\n");
    92.                             goto quit;
    93.  
    94.                         case 0x10:
    95.                             fprintf(stderr, "\nBad sector: CYL %d HEAD %d SECT %d\n", c, h, s);
    96.                             if (log)
    97.                             {
    98.                                 fprintf(log, "Bad sector: CYL %d HEAD %d SECT %d\n", c, h, s);
    99.                             }
    100.                             ++errors;
    101.                             break;
    102.                         default:;
    103.                     }
    104.  
    105.                 }
    106.  
    107.                 // если клавиша нажата
    108.                 if (kbhit())
    109.                 {
    110.                     if (getch() == 0)
    111.                     {
    112.                         if (getch() == 0x2D)
    113.                         {
    114.                             // и это Alt+X, то прекратить выполнение проверки
    115.                             printf("\n\nOperation aborted!\n\n");
    116.                             goto quit;
    117.                         }
    118.                     }
    119.  
    120.                 }
    121.  
    122.             }
    123.             // нарастить счётчик выполнения
    124.             current += 1.0;
    125.             // и вывести отчёт о выполнении
    126.             printf("CYL %3d HEAD %3d (%.1f%% done)\r", c, h, 100.0 * current / total);
    127.         }
    128.     }
    Подскажите кто сможет. Нужно срочно.... (.
     
  2. Firefish

    Firefish New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2008
    Сообщения:
    2
    Неужели никто не подскажет ?
     
  3. human45

    human45 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    18
    не знаю как работает эта досовская функция на прерывании
    может когда bad sector то CF не должен быть выставлен ? если это функция проверки сектора то в случае удачи сектор либо битый либо целый такая логика
     
  4. wad

    wad New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2008
    Сообщения:
    2
    FirefishПривет такое дело надо твая рабочая програ если ты конечно ее дописал
    просто у меня похожа курсовая работа PLZ!
     
  5. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    1. Насколько я помню, функция int 13h c ah=4 не тестирует качество сектора, т.к. не выполняет попытки чтения данных. Она просто проверяет существование сектора с данными c/h/s. Поэтому рекомендую юзать ah=2 и, кроме того, каждый сектор читать минимум 3 раза (чередуя со сбросами ah=0), а уж потом делать вывод о BAD или GOOD.
    По крайней мере 15 лет назад я делал именно так, и все работало.

    2. Цилиндры и стороны должны нумероваться с 0 до максимума, а сектора - с 1. Поэтому надо
    Код (Text):
    1. for (s = 1; s <= geometry.sectors; ++s)
    Это все навскидку, може и еще ошибки есть.
     
  6. wad

    wad New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2008
    Сообщения:
    2
    Дело в том что в эту тематику еще не вникал!
    может всетаки остался рабочий исходничек PLZ!
    ___________________________________________
    Студенты - народ НУ О4ЕНЬ ЛЕНИВЫЙ....
     
  7. inviZ

    inviZ Сергей

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    92
    Адрес:
    Хабаровск
    wad
    Ты не только не вникал, ты и не хочешь вникать. Тем более задание такое на самом деле не на курсовую, а максимум на лабу на неделю. Никто здесь тебе ничего не даст.