Системное программное обеспечение персональных ЭВМ


Пример 2



Пример 2

/*= ПРИМЕР 5.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("%d\n",((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 - %d\n",(d&0x0e00)>>9); printf(" Джойстик - "); if (d&0x1000) printf("есть\n"); else printf("нет\n"); printf(" Принтеров - %d\n",(d&0xe000)>>14); }

Бросается в глаза, что список оборудования содержит явно недостаточно информации по дисплейному адаптеру - видимо, при его проектировании не была учтена возможность появления новых типов адаптеров после CGA.


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