Характеристики дисководов - часть 5
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 машин невозможно // определить тип диска, так как в КМОП-памяти для // типа диска установлено значение 0, несмотря на то, // что диск установлен (например машина Bondwell, // модель В-300). В таких случаях можно определить // наличие жесткого диска, используя слово // конфигурации, возвращаемое прерыванием 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;