Заполняем блок парметров для форматирования.
// Заполняем блок парметров для форматирования. // Байт специальных функций содержит значение, // равное 5. Это означает, что: // - используется текущий блок параметров BIOS BPB ; // - используются все поля в блоке парметров устройства; // - все секторы на дорожке имеют одинаковый размер dbp->spec = 5;
// Считываем из BPB количество секторов на дорожке sectors = dbp->bpb.seccnt;
// Подготавливаем таблицу, описывающую формат дорожки
// Записываем количество секторов на дорожке dbp->trkcnt = sectors;
// Для каждого сектора на дорожке в таблицу // записываем его номер и размер. // Заметьте, что записывается размер сектора // в байтах, а не код размера, как это делается // при форматировании с помощью // функции 05h прерывания INT 13h for(i = 0; i < sectors; i++) { dbp->trk[i].no = i + 1; dbp->trk[i].size = 512; }
// Устанавливаем новые параметры для диска А: reg.x.ax = 0x440d; reg.h.bl = 1; reg.x.cx = 0x0840; reg.x.dx = FP_OFF(dbp); segreg.ds = FP_SEG(dbp); intdosx(®, ®, &segreg);
// Проверяем результат выполнения операции if(reg.x.cflag != 0) { printf("\nОшибка: %d",reg.x.ax); return(-1); }
// Подготавливаем блок параметров устройства, // который будет использован при вызове // операции проверки возможности форматирования // дорожки. // В поле специальных функций записываем 1, // это означает, что будет выполняться проверка // возможности использования // указанного формата дорожки dbp_f->spec = 1; dbp_f->head = 0; dbp_f->track = 20;
reg.x.ax = 0x440d; reg.h.bl = 1; reg.x.cx = 0x0842; reg.x.dx = FP_OFF(dbp_f); segreg.ds = FP_SEG(dbp_f); intdosx(®, ®, &segreg);
// Проверяем результат выполнения операции if(reg.x.cflag != 0) { printf("\nОшибка: %d", reg.x.ax); return(-1); }
// Если указанный формат дорожки поддерживается, // поле специальных функций будет содержать 0. // Проверяем это if(dbp_f->spec != 0) { printf("\nФормат дорожки не поддерживается"); return(-1); }
// Заполняем блок параметров для выполнения // операции форматирования dbp_f->spec = 0; dbp_f->head = 0; dbp_f->track = 20;
// Форматируем дорожку с номером 20, головка 0 reg.x.ax = 0x440d; reg.h.bl = 1; reg.x.cx = 0x0842; reg.x.dx = FP_OFF(dbp_f); segreg.ds = FP_SEG(dbp_f); intdosx(®, ®, &segreg);
// Проверяем резултат выполнения операции if(reg.x.cflag != 0) { printf("\nОшибка: %d", reg.x.ax); return(-1); }
// Освобождаем память farfree(dbp); farfree(dbp_f);
return(0); }
После запуска программа форматирования читает текущие параметры для диска А:, формирует структуру дорожки и устанавливает параметры для выполнения операции форматирования. Затем программа проверяет возможность использования указанной структуры дорожки и выполняет форматирование.