Состав оборудования

Опеределять состав оборудования следует только после того, как мы определили тип ПЭВМ. Это обусловлено тем, что способы получения информации о составе оборудования различны для XT и для AT. Рассмотрим сначала машины класса XT.

Состав оборудования XT (и PC) определяется положением переключателей на специальных колодках. Состояние этих переключателей может быть прочитано из программы обращением к порту 0x60. Но необходимости в этом нет - эту операцию выполняет BIOS при инициализации системы. На основании этой информации BIOS формирует так называемый список оборудования - 2-байтное слово по адресу 0040:0010. Прочитать это слово можно либо обратившись по указанному адресу, либо обратившись к BIOS через прерывание 0x11. Назначения разрядов списка оборудования следующие:

- установлен в 1, если есть НГМД (см.разряды 6, 7);
- установлен в 1, если есть сопроцессор;
2,3 - число 16-Кбайтных блоков ОЗУ на системной плате;
4,5 - код видеоадаптера: 11 - MDA, 10 - CGA, 80 колонок, 01 - CGA, 40 колонок, 00 - другой;
6,7 - число НГМД-1 (если в разряде 0 единица);
- 0, если установлен канал ПДП;
9,10,11 - число последовательных портов RS-232;
- 1, если установлен джойстик;
- 1, если установлен последовательный принтер;
14,15 - число параллельных принтеров.

Для XT и AT биты 8 и 13 всегда будут нулевыми.

Ниже приведен пример получения и интерпретации списка оборудования.

/*= ПРИМЕР 2 =*//*============= Получение списка оборудования ============*/#include <dos.h>main(){ union REGS rr; unsigned int d; /* список оборудования */ int i; /*== Чтение байта обоpудования через прерывание 0x11 ==*/ /* Прерывание 0x11 возвращает его в регистре AX */ int86(0x11,&rr,&rr); /* Побитная распечатка списка оборудования */ printf ("Список активного оборудования из прерывания 11 - "); for (i=15; i>=0; printf("%d",(rr.x.ax>>i--)&0x01)); printf(" (%04x)n",rr.x.ax); /* == Чтение байта обоpудования из памяти BIOS == */ /* Будет получено то же самое */ d=peek(0x40,0x10); printf ("Список активного оборудования из памяти BIOS - "); for (i=15; i>=0; printf("%d",(d>>i--)&0x01)); printf(" (%04x)n",d); /* == Раскодирование списка обоpудования == */ printf(" Дисководов ГМД - "); if (d&0x0001) printf("%dn",((d&0x00c0)>>6)+1); else printf("нетn"); printf(" Сопроцессор 8087 - "); if (d&0x0002) printf("естьn"); else printf("нетn"); printf(" Тип дисплейного адаптера - "); switch (d&0x0030) { case 0: printf("EGA/VGA"); break; case 0x10: printf("CGA,40-кол"); break; case 0x20: printf("CGA,80-кол"); break; case 0x30: printf("MDA"); break; } printf(" (неточно)n"); printf(" Первичный блок памяти - "); switch (d&0x000c) { case 0: printf("16 Кбайтn"); break; case 4: printf("32 Кбайтn"); break; case 8: printf("48 Кбайтn"); break; case 12: printf("64 Кбайт или большеn"); break; } printf(" Портов RS232 - %dn",(d&0x0e00)>>9); printf(" Джойстик - "); if (d&0x1000) printf("естьn"); else printf("нетn"); printf(" Принтеров - %dn",(d&0xe000)>>14);}