Одной из первоочередных задач, которые решает программист в процессе создания собственных приложений, активно использующих возможности видеоадаптера, является определение типа видеоадаптера и типа дисплея, подключенных к компьютеру.
Наиболее простой способ решить эту проблемму в среде Microsoft Quick C заключается в использовании библиотечной функции _getvideoconfig(). Функция _getvideoconfig() заполняет структуру videoconfig, опреденную во включаемом файле graph.h следующим образом:
struct videoconfig { numxpixels // количество пикселов на оси x numypixels // количество пикселов на оси y numtextcols // количество символов в строке numtextrows // количество текстовых строк numcolors // количество используемых цветов bitsperpixel // количество бит видеопамяти на пиксел numvideopages // количество страниц видеопамяти mode // текущий режим работы видеоадаптера adapter // тип активного (первичного) видеоадаптера monitor // тип активного дисплея memory // объем видеопамяти в килобайтах }
Поле adapter определяет тип первичного видеоадаптера. Оно может принимать одно из следующих значений, определенных в файле graph.h:
Константа Название видеоадаптера _MDPA MDA _CGA CGA _OCGA CGA фирмы Olivetti (AT&T) _EGA EGA _OEGA EGA фирмы Olivetti (AT&T) _VGA VGA _OVGA VGA фирмы Olivetti (AT&T) _MCGA MCGA (Multicolor Graphics Array) _HGC Hercules
Поле monitor определяет тип используемого в данный момент дисплея. Оно может принимать одно из следующих значений, определенных в файле graph.h:
Константа Тип дисплея _MONO монохромный _COLOR цветной (или улучшенный цветной, эмулирующий цветной) _ENHCOLOR улучшенный цветной _ANALOGMONO монохромный аналоговый _ANALOGCOLOR цветной аналоговый _ANALOG аналоговый
Приведем программу, определяющую конфигурацию видеосистемы компьютера, а также режим ее работы, при помощи функции _getvideoconfig() из стандартной библиотеки трансляторов Microsoft Quick C 2.5, Quick C 2.01 и C 6.0:
#include <stdio.h> #include <graph.h> void main(void) { struct videoconfig vc; // заполняем поля структуры vc _getvideoconfig( &vc ); // выводим на экран данные,записанные в структуру vc printf("\nТип видеоадаптера: "); switch(vc.adapter) { case _MDPA : puts("MDA."); break; case _CGA : puts("CGA."); break; case _EGA : puts("EGA."); break; case _VGA : puts("VGA."); break; case _MCGA : puts("MCGA."); break; case _HGC : puts("Hercules."); break; default : puts(" неизвестный."); } printf("\nТип дисплея: "); switch(vc.monitor) { case _MONO : puts("монохромный."); break; case _COLOR : puts("цветной или эмулирующий его."); break; case _ENHCOLOR : puts("улучшенный цветной."); break; case _ANALOGMONO : puts("монохромный аналоговый."); break; case _ANALOGCOLOR : puts("цветной аналоговый."); break; case _ANALOG : puts("аналоговый."); break; default : puts("неизвестный."); } printf("\nОбъем видеопамяти %dК байт.", vc.memory ); printf("\n\nНомер режима: %d.", vc.mode ); printf("\n\nЧисло доступных страниц видеопамяти: %d.", vc.numvideopages ); // если режим работы видеоадаптера графический if(vc.numxpixels) { printf("\n\nРазрешающая способность:%dx%d пикселов.", vc.numxpixels, vc.numypixels ); printf("\n\nКоличесво бит на пиксел: %d.", vc.bitsperpixel ); } printf("\n\nЧисло символов в строке: %d.", vc.numtextcols ); printf("\n\nЧисло строк: %d.", vc.numtextrows ); printf("\n\nЧисло цветов: %d.", vc.numcolors ); }
Другим, низкоуровневым способом определения типа первичного видеоадаптера, является тестирование переменных BIOS, находящихся по адресам 0000:0410 и 0000:0487, а также вызов функций 1Ah и 12h десятого прерывания.