Характеристики дисководов - часть 4
Теперь мы готовы к тому, чтобы определить конфигурацию дисковой подсистемы - количество и типы используемых дисководов.
Приведем функцию, которая заполнит структуру типа DISK_CONFIG, описанную в файле sysp.h,
информацией о конфигурации дисковой подсистемы.
Структура DISK_CONFIG содержит поля:
n_floppy | количество установленных в системе НГМД. |
n_hard | количество установленных жестких НМД. |
t_floppy1 | тип первого НГМД. |
t_floppy2 | тип второго НГМД. |
t_hard1 | тип первого НМД. |
t_hard2 | тип второго НМД. |
/** *.Name disk_cfg * *.Title Определить конфигурацию дисковой подсистемы * *.Descr Функция заполняет структуру, описывающую * конфигурацию дисковой подсистемы: * * typedef struct _DISK_CONFIG_ { * int n_floppy; * int n_hard; * int t_floppy1; * int t_floppy2; * int t_hard1; * int t_hard2; * } DISK_CONFIG; * * *.Params Нет * *.Return Ничего **/
#include <stdio.h> #include <dos.h> #include "sysp.h"
void disk_cfg(DISK_CONFIG* cfg) {
char unsigned _far *modptr; char unsigned pc_type; char cfg_byte; int cfg_word;
union REGS inregs, outregs;
// Определяем тип компьютера
modptr = FP_MAKE(0xf000,0xfffe); pc_type = *modptr;
// В зависимости от типа компьютера выбираем // способ определения конфигурации дисковой // подсистемы
switch (pc_type) {
case 0xfc:
// Для IBM AT считываем конфигурацию дисковой // подсистемы из КМОП-памяти
// Считываем байт конфигурации
outp(0x70, 0x14); cfg_byte = inp(0x71);
// Определяем количество установленных флоппи-дисков
if((cfg_byte & 1) == 0) {
// Если младший бит байта конфигурации равен 0, // флоппи-диски не установлены
cfg->n_floppy = 0; cfg->t_floppy1 = 0; cfg->t_floppy2 = 0;
} else {
// Определяем количество установленных // флоппи-дисков
cfg->n_floppy = ((cfg_byte >> 6) & 3) + 1;
// Определяем типы флоппи-дисков
outp(0x70, 0x10); cfg_byte = inp(0x71);
cfg->t_floppy2 = cfg_byte & 0xf; cfg->t_floppy1 = (cfg_byte >> 4) & 0xf;
}
// Определяем конфигурацию жестких дисков