13
Одной из первоочередных задач, которые решает программист в процессе
создания собственных приложений, активно использующих возможности
видеоадаптера, является определение типа видеоадаптера и типа
дисплея, подключенных к компьютеру.
Наиболее простой способ решить эту проблемму в среде 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("nnНомер режима: %d.", vc.mode );
printf("nnЧисло доступных страниц видеопамяти: %d.",
vc.numvideopages );
// если режим работы видеоадаптера графический
if(vc.numxpixels) {
printf("nnРазрешающая способность:%dx%d пикселов.",
vc.numxpixels, vc.numypixels );
printf("nnКоличесво бит на пиксел: %d.",
vc.bitsperpixel );
}
printf("nnЧисло символов в строке: %d.", vc.numtextcols );
printf("nnЧисло строк: %d.", vc.numtextrows );
printf("nnЧисло цветов: %d.", vc.numcolors );
}
Другим, низкоуровневым способом определения типа первичного видеоадаптера,
является тестирование переменных BIOS, находящихся по адресам
0000:0410 и 0000:0487, а также вызов функций 1Ah и 12h десятого
прерывания.
|