MS-DOS для программиста


Программа DISKINFO - часть 3


// Определяем конфигурацию НМД outp(0x70, 0x12); cfg_byte = inp(0x71);

if(cfg_byte == 0) { // Если обе тетрады равны нулю, система // не содержит НМД cfg->n_hard = 0; cfg->t_hard1 = 0; cfg->t_hard2 = 0; } else { // Определяем тип первого диска - диска C: if((cfg_byte & 0xf) != 0xf) cfg->t_hard1 = cfg_byte & 0xf; else { outp(0x70, 0x19); cfg->t_hard1 = inp(0x71); }

// Определяем тип второго диска - диска D: if((cfg_byte & 0xf0) != 0xf0) cfg->t_hard2 = (cfg_byte >> 4) & 0xf; else { outp(0x70, 0x1a); cfg->t_hard2 = inp(0x71); } }

// Вычисляем количество НМД, установленных // в системе cfg->n_hard = 0; if(cfg->t_hard1 != 0) cfg->n_hard++; if(cfg->t_hard2 != 0) cfg->n_hard++;

// Для некоторых совместимых с IBM AT машин невозможно // определить тип диска, так как в CMOS-памяти для // типа диска установлено значение 0, несмотря на то, // что диск имеется. В таких случаях можно определить // наличие жесткого диска, используя слово // конфигурации, возвращаемое прерыванием INT 11h.

if(cfg->n_hard == 0) { int86(0x11, &inregs, &outregs); cfg_word = outregs.x.ax;

// Проверяем, есть ли НМД if((cfg_word & 1) != 0) { cfg->n_hard = 1;

// Считаем, что тип используемого жесткого // диска неопределен cfg->t_hard1 = 0; cfg->t_hard2 = 0; } } break;

default:

// Для остальных типов компьютеров вызываем // прерывание INT 11h, используем возвращаемый // этим прерыванием байт конфигурации int86(0x11, &inregs, &outregs); cfg_word = outregs.x.ax;

// Определяем количество установленных // НГМД cfg->n_floppy = ((cfg_word >> 6) & 3) + 1;

// Считаем, что тип используемого НГМД // неопределен cfg->t_floppy1 = 0; cfg->t_floppy2 = 0;

// Определяем наличие НМД if((cfg_word & 1) != 0) { cfg->n_hard = 1;

// Считаем, что тип используемого НМД // неопределен cfg->t_hard1 = 0; cfg->t_hard2 = 0; } break; } }

/** * get_dpt * * Вычислить адрес таблицы параметров дискеты * * Функция возвращает указатель на таблицу * параметров дискеты * **/

DPT far *get_dpt(void) { void far * far *ptr;

ptr = (void far * far *)MK_FP(0x0, 0x78); return(DPT far*)(*ptr); }

/** * get_hdp1 * * Вычислить адрес первой таблицы параметров диска * * Функция возвращает указатель на первую таблицу * параметров диска * **/

HDPT far *get_hdp1(void) { void far * far *ptr;

ptr = (void far * far *)MK_FP(0x0, 0x104); return(HDPT far*)(*ptr); }

/** * get_hdp2 * * Вычислить адрес второй таблицы параметров диска * * Функция возвращает указатель на вторую таблицу * параметров диска * **/

HDPT far *get_hdp2(void) { void far * far *ptr;

ptr = (void far * far *)MK_FP(0x0, 0x118); return(HDPT far*)(*ptr); }




- Начало -  - Назад -  - Вперед -