13. Определение конфигурации (функция _getvideoconfig())

Одной из первоочередных задач, которые решает программист в процессе создания собственных приложений, активно использующих возможности видеоадаптера, является определение типа видеоадаптера и типа дисплея, подключенных к компьютеру.

Наиболее простой способ решить эту проблемму в среде 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 десятого прерывания.