Программирование видеоадаптеров

         

Аннотация


Книга представляет собой новую редакцию третьего тома "Библиотеки системного программиста" и посвящена программированию видеоадаптеров. В ней рассмотрены различные типы современных видеоадаптеров, в том числе адаптеров SVGA, описаны их регистры, организация видеопамяти. Представлены основные приемы программирования видеоадаптеров.

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



Архитектура видеоадаптеров EGA и VGA


В этой главе мы расскажем об архитектуре видеоадаптеров EGA и VGA. Видеоадаптеры EGA и VGA можно условно разделить на шесть логических блоков:

       Видеопамять

В видеопамяти размещаются данные, отображаемые адаптером на экране монитора. Для видеоадаптеров EGA и VGA видеопамять, как правило, имеет объем 256 Кбайт. Видеоадаптеры SVGA оснащаются значительно большим объемом видеопамяти. В них может быть установлено больше 4 Мбайт памяти. Видеопамять находится в адресном пространстве процессора. Программы могут непосредственно производить с ней обмен данными.

       Графический контроллер

Используется при обмене данными между центральным процессором компьютера и видеопамятью. Аппаратура графического контроллера позволяет выполнять над данными, поступающими в видеопамять, простейшие логические операции (И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ, циклический сдвиг).

       Последовательный преобразователь

Выбирает из видеопамяти один или несколько байт, преобразует их в последовательный поток битов и передает контроллеру атрибутов.

       Контроллер ЭЛТ

Генерирует временные синхросигналы, управляющие ЭЛТ.

       Контроллер атрибутов

Преобразует информацию о цвете из формата, в котором она хранится в видеопамяти, в формат, необходимый для ЭЛТ. Преобразование цветов осуществляется в соответствии с таблицей цветовой палитры (Color Look-up Table). Модифицируя таблицу цветовой палитры, можно выбрать 16 цветов, поддерживаемых видеоадаптером EGA из 64 цветов, которые может отображать цветной улучшенный монитор.

       Синхронизатор

Определяет все временные параметры видеоадаптера. Синхронизатор также управляет доступом процессора к цветовым слоям видеопамяти

На рисунке 3.1 представлена блок схема видеоадаптеров EGA и VGA, в которой отображены связи между их основными логическими блоками.



PICTURE._FIG_19.PCX;6";4.308";PCX

Рисунок 3.1   Блок схема видеоадаптеров EGA/VGA

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



Атрибуты символов


Внешний вид символа, отображаемого на экране в текстовом режиме, определяется не только его кодом ASCII, но и байтом атрибутов. Атрибуты задают цвет символа, цвет фона, а также некоторые другие параметры:

Биты байта

атрибутов

Назначение

D2-D0

Цвет символа

D3

Интенсивность символа и выбор таблицы знакогенератора

D6-D4

Цвет фона символа

D7

Мигание символа или интенсивность фона символа

Биты D0-D2 байта атрибутов определяют цвет символа, а биты D4-D6 цвет фона, на котором отображается символ. Таким образом, можно независимо задавать до 23 = 8 различных цветов для текста и фона.

Бит D3 играет различную роль в зависимости от числа активных таблиц знакогенератора. Если активной является одна таблица, бит D3 используется для управления интенсивностью цвета символа, что позволяет увеличить количество воспроизводимых цветов от 8 до 16.

Если одновременно определены две таблицы знакогенератора, то бит D3 также задает таблицу знакогенератора, которая будет использована при отображении данного символа.

Бит D7 выполняет две различные функции в зависимости от состояния регистра режима контроллера атрибутов. Данный бит управляет либо интенсивностью цвета фона, увеличивая количество одновременно отображаемых цветов до 16, либо разрешением гашения символа, в результате чего символ на экране монитора будет мигать. По умолчанию D7 бит управляет разрешением гашения символа (миганием).

В следующей таблице представлено соответствие цвета символа и цвета фона значению поля цвета символа байта атрибутов:

Код цвета в байте атрибутов

Стандартный цвет

Цвет с повышенной интенсивностью

000

Черный

Серый

001

Синий

Светло-синий

010

Зеленый

Светло-зеленый

011

Морской волны

Голубой

100

Красный

Светло-красный

101

Фиолетовый

Малиновый

110

Коричневый

Желтый

111

Белый

Ярко-белый



Атрибуты символов (монохромный режим)


Назначение полей байта атрибутов в монохромном режиме сходно с их назначениями в цветном режиме (см. выше). Биты D0-D2 управляют типом символа, который может быть обычным, мигающим или подчеркнутым, биты D4-D6 могут выбрать обратный (инвертированный) символ.

Бит D3 играет различную роль в зависимости от того, сколько таблиц знакогенератора одновременно являются активными. Если активной является одна таблица, то бит D3 используется для управления интенсивностью символа.

Если одновременно определены две таблицы знакогенератора, тогда бит D3 также задает таблицу знакогенератора, которая будет использована при отображении данного символа.

Бит D7 выполняет две различные функции в зависимости от состояния регистра режима контроллера атрибутов. Он управляет либо интенсивностью фона, либо миганием символа. По умолчанию бит D7 управляет миганием символа.

Перечислим все возможные значения атрибутов символов в текстовом монохромном режиме:

Атрибут

Внешний вид символа

00000000b (00h)

Черный символ на черном фоне

00000001b (01h)

Подчеркнутый символ

00000111b (07h)

Обычный символ (светлый символ на черном фоне)

00001001b (09h)

Подчеркнутый символ с повышенной  интенсивностью

00001111b (0Fh)

Символ с повышенной интенсивностью

01110000b (70h)

Обратное отображение символа (черный символ на светлом фоне)

10000001b (81h)

Подчеркнутый мигающий символ

10000111b (87h)

Мигающий символ

10001001b (89h)

Подчеркнутый мигающий символ с повышенной интенсивностью

11110000b (0F0h)

Мигающее обратное отображение символа

В случае использования других значений атрибутов результат зависит от конкретной модели видеоадаптера.

Теперь приведем программу TEXTATTR (листинг 3.1), иллюстрирующую непосредственный доступ к видеопамяти в текстовых режимах работы адаптера. При запуске программы TEXTATTR вы должны указать ей два числовых параметра.

Первый параметр определяет режим работы видеоадаптера. Вы можете задать любой текстовый режим. Второй параметр управляет атрибутами символов, отображаемых на экране монитора. Если второй параметр равен 0, то бит D7 байта атрибутов управляет интенсивностью фона символов, а если он равен 1, то бит D7 байта атрибутов управляет миганием символов.


Листинг 3.1. Файл TEXTATTR.C

#include                <stdio.h>

#include                <conio.h>

#include                <dos.h>

// Файл для определения макрокоманды FP_MAKE

#include                "sysp.h"

// Файл для определения структуры VIDEOBUF

#include                "sysgraph.h"

// Описание функций

void        SetVideoMode( unsigned char vmode );

void        SetBlinkIntensity( unsigned char mode );

int           GetColumn(void);

int           GetVideoBuf(int);

void        Hello(void);

int           main( int, char ** );

//======================================================

// Главная функция программы

//======================================================

int main( int argc, char * argv[] )

{

  union REGS         inregs, outregs;

  VIDEOBUF           _far *vbuf, _far *ptr_vbuf;

  unsigned char   background, foreground;

  unsigned char   char_attr;

  int          vmode, bl_in_mode;

  char      szText[4];

  // Проверка командной строки программы

  if( argc != 3 )

  {

                Hello();

                return -1;

  }

  // Разбор строки параметров

  sscanf(argv[1],"%d",&vmode);

  sscanf(argv[2],"%d",&bl_in_mode);

  // Если указан графический режим, завершаем программу

  if(vmode > 3 && vmode != 7)

                return(-2);

  // Если неправильно указан параметр <интенсивность>,

  // завершаем программу

  if((bl_in_mode != 0)&&(bl_in_mode != 1))

                return(-3);

  // Устанавливаем новый режим работы видеоадаптера,

  // указанный параметром <режим>

  SetVideoMode((unsigned char) vmode );

  // Выбираем как будут интерпритироваться атрибуты

  // символов. Если параметр <интенсивность> равен 0

  // атрибуты управляют интенсивностью цвета символов,

  // если параметр равен 1 атрибуты управляют миганием

  //символов

  SetBlinkIntensity((unsigned char) bl_in_mode );

  // Определяем адрес начала активной страницы

  // видеопамяти



  ptr_vbuf = vbuf= (VIDEOBUF _far *)

                FP_MAKE(GetVideoBuf((unsigned char) vmode ),0);

  // Отображаем на экране массив символов, имеющих

  // различные атрибуты

  for( background=0; background<16; background++)

  {

                for( foreground=0; foreground<16; foreground++)

                {

                                char_attr =

                                                                (unsigned char)((background<<4) | foreground);

                                sprintf( szText, "%02X", char_attr );

                                // Отображаем на экране символ. Записываем

                                // в видеопамять код символа и его атрибут

                                ptr_vbuf->chr =

                                                szText[0];             ptr_vbuf->attr = char_attr;

                                ptr_vbuf++;

                                ptr_vbuf->chr =

                                                szText[1]; ptr_vbuf->attr = char_attr;

                                ptr_vbuf++;

                }

                ptr_vbuf = vbuf = vbuf + GetColumn();

  }

  // Ожидаем нажатие на любую клавишу клавиатуры

  getch();

  // Устанавливаем текстотвый режим номер 3

  SetVideoMode(3);

  return 0;

}

//======================================================

// Функция возвращает сегментный адрес активной страницы

// видеопамяти (учитывается значение регистров смещения

// адреса видеопамяти)

//======================================================

int GetVideoBuf(int vmode) {

  unsigned vbase;

  unsigned adr_CRT;

  unsigned high;

  unsigned low;

  unsigned offs;

  // В зависимости от режима видеоадаптера базовый адрес

  // видеопамяти может быть 0xb000 или 0xb800

  vbase = (vmode == 7) ? 0xb000 : 0xb800;

  // Определяем адрес порта контроллера ЭЛТ

  adr_CRT = *(unsigned _far *)(FP_MAKE(0x40,0x63));

  // Считываем содержимое регистров начального адреса

  outp(adr_CRT,0xc);



  high = inp(adr_CRT+1);

  outp(adr_CRT,0xd);

  low = inp(adr_CRT+1);

  offs = ((high << 8) + low) >> 4;

  // Добавляем к базовому адресу видеопамяти смещение,

  // взятое из регистров начального адреса

  vbase += offs;

  return(vbase);

}

//======================================================

// Функция возвращает количество символов в строке

//======================================================

int GetColumn(void) {

  // Считываем содержимое переменной BIOS, расположенной по

  // адресу 0000:044Ah. В ней записано количество символов

  // в строке для текущего режима

  return(*(int _far *)(FP_MAKE(0x40,0x4a)));

}

//======================================================

// Функция устанавливает режим работы видеоадаптера, заданный

// параметром vmode

//======================================================

void SetVideoMode( unsigned char vmode ) {

  union  REGS    inregs, outregs;

  // Устанавливаем режим vmode

  inregs.h.ah = 0x0;

  inregs.h.al = vmode;

  int86( 0x10, &inregs, &outregs );

}

//======================================================

// Функция управляет назначением атрибутов символов.

//  mode = 0 атрибут управляет интенсивностью цвета символов

//  mode = 1 атрибут управляет миганием символов

//======================================================

void SetBlinkIntensity( unsigned char mode ) {

  union  REGS    inregs, outregs;

  inregs.h.ah = 0x10;

  inregs.h.al = 0x3;

  inregs.h.bl = mode;

  int86( 0x10, &inregs, &outregs );

}

//======================================================

// Функция выводит на экран краткую справку о программе

//======================================================

void Hello(void) {

  printf(   "\nCopyright (C)Frolov G.V.,1995. E-mail:"

                                                "frolov@glas.apc.org\n"

                                "\nФормат вызова: TEXTATTR <режим> <интенсивность>"

                                "\n   <режим>: любые текстовые режимы"



                                "\n   <интенсивность>: 0 - интенсивность цвета, "

                                "1 - мигание символа" );

}

Исходный текст включаемого файла SYSP.H, который используется в примере TEXTATTR.C, а также в других примерах книги, представлен в листинге 3.2. Файл SYSP.H содержит определение макрокоманды FP_MAKE, служащей для получения дальнего указателя из сегмента и смещения.

Листинг 3.2. Файл SYSP.H

// Макрокоманда FP_MAKE составляет дальний указатель

// из сегмента и смещения

#define FP_MAKE(seg,off) ((void far *)                                          \

  ((((unsigned long) (unsigned)(seg)) << 16L) |            \

  ((unsigned long) (unsigned) (off))))

Включаемый файл SYSGRAPH.H содержит определения нескольких типов структур, используемых в примерах нашей книги. Исходный текст файла SYSGRAPH.H представлен в листинге 3.3.

Листинг 3.2. Файл SYSGRAPH.H

#pragma pack(1)

// Структура для определения символа и его атрибута

typedef struct _VIDEOBUF_ {

  unsigned char chr;

  unsigned char attr;

} VIDEOBUF;

// Структура для доступа к переменным видеофункций BIOS

typedef struct _BIOS_VAR_ {

  unsigned char  bEquipFlags;

  unsigned char  bReserv1[0x38];

  unsigned char  bVideoMode;

  unsigned       wColumns;

  unsigned       wPageLength;

  unsigned       wVidStart;

  unsigned       w8CursorPos[8];

  unsigned       wCursorShape;

  unsigned char  bActivePage;

  unsigned       wAddrCRT;

  unsigned char  bRegMode;

  unsigned char  bRegPalette;

  unsigned char  bReserv2[0x1D];

  unsigned char  bRows;

  unsigned       wCharHigh;

  unsigned char  bInfo;

  unsigned char  bInfoTwo;

  unsigned char  bReserv3[0x1F];

  void far       dwSavePtr;

} BIOS_VAR;

// Структура для заполнения таблицы цветов (таблицы ЦАП)

typedef struct _RGB_ {

  unsigned char red;

  unsigned char green;

  unsigned char blue;

} RGB;

#pragma pack()


Больше цветов больше бит


Многие режимы видеоадаптера SVGA позволяют одновременно отображать на экране больше чем 256 различных цветов. Естественно что для этого каждый пиксел должен быть представлен большим количеством бит.

Количество различных цветов

Количество бит для кодировки пиксела

256

8

32768

15

65536

16

16777216

24

4294967296

32

Рассмотрим 256-цветный режим видеоадаптера VGA. Каждый пиксел экрана представлен 8 битами данных видеопамяти. Видеоадаптер VGA содержит таблицу цветов (набор из 256 регистров ЦАП), которые согласно значениям, записанным в ней преобразует 8 битные данные видеопамяти в три 6-битных сигнала. Эти три сигнала поступают на три ЦАП и вырабатывающие красную, зеленую и синюю компоненты, определяющие цвет пиксела. Благодаря применению таблицы цветов вы можете выбрать для одновременного отображения на экране монитора любые 256 цветов из 262144 возможных.

Видеоадаптеры SVGA для каждого пиксела используют больше чем 8 бит. Обычно пиксел определяется 15, 16 или 24 битами. Естественно, что в этом случае использование таблицы цветов адаптера VGA затруднено. Например, для режима 65536 цветов (16 бит на пиксел) требуется увеличить размер таблицы цветов до 65536 18-битных регистров. Если адаптер SVGA кодирует пиксел 24 битами, то придется увеличивать размерность таблицы цветов с 18 до 24 или выше.

Поэтому в большинстве режимов SVGA реализована схема прямого кодирования цвета (Direct Color Mode). Биты, определяющие пиксел, группируются на три основные группы, непосредственно определяющие красную, зеленую и синюю компоненты цвета. Данные из этих трех групп передаются на три ЦАП и формируют видеосигнал. Таблица цветов не используется.

В некоторых режимах SVGA существует дополнительная, четвертая группа бит, также соответствующая каждому пикселу. Как правило, четвертая группа бит не используется. Некоторые модели видеоадаптеров могут использовать ее по своему усмотрению.

Например, на видеоадаптере Diamond Stealth 64, в режиме 110h, соответствующему спецификации VESA, для кодирования одного пиксела отводится два байта (рис. 7.1). Они разделены на четыре группы. Три из них имеют размер 5 бит и отвечают за красный, зеленый и синий компоненты цвета пиксела. Четвертая группа, резервная, состоит из одного бита. На рисунке 7.1 резервная группа отмечена символом 'X'.




Рисунок 7.1   Формат видеопамяти, 15 бит на пиксел

Таким образом, в режиме 110h видеоадаптер может отображать пикселы 25+5+5 = 32768-и различных цветов.

В режиме 111h на каждый пиксел также как и в режиме 110h отводится 2 байта, однако они имеют другой формат (рис. 7.2). Резервное поле отсутствует. За счет этого увеличен размер поля, управляющего зеленым компонентом цвета пиксела. Поэтому, в данном режиме видеоадаптер может отображать пикселы 25+6+5 = 65536-и различных цветов.



Рисунок 7.2   Формат видеопамяти, 16 бит на пиксел и резервное поле

Чтобы видеоадаптер мог одновременно отображать на экране 16777216 различных цветов, необходимо, чтобы для кодирования каждого пиксела отводилось 24 бита. Обычно видеоадаптеры используют для этого два различных формата кодирования пиксела (рис. 7.3 и 7.4)



Рисунок 7.3   Формат видеопамяти, 24 бит на пиксел

В режимах 112h, 115 и 118h на один пиксел отводится 4 байта (рис. 7.4). Они разделены на четыре группы по 8 бит в каждой. Три группы отвечают за красный, зеленый и синий компоненты цвета пиксела. Четвертая группа резервная. Такой формат позволяет одновременно отображать на экране монитора пикселы 28+8+8 =  16777216 различных цветов.



Рисунок 7.4   Формат видеопамяти, 24 бит на пиксел и резервное поле

Интересно отметить, что даже в режиме 118h, имеющем разрешение 1024x768 пикселов, на экране отображается 786432 пиксела. То есть меньше, чем количество цветов, которое видеоадаптер может одновременно отобразить на экране монитора.


Число горизонтальных линий растра (Vertical Total Register - VTR) (индекс6)


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

Для видеоадаптера EGA, регистр VTR содержит девять битов. Девятый бит находится в дополнительном регистре (OVR). Регистр VTR видеоадаптеров VGA и SVGA содержит десять битов. Десятый бит, также как и девятый, расположен в дополнительном регистре (OVR).



Чтение конфигурации видеосистемы - подфункция 00h


При помощи этой функции можно определить конфигурацию видеосистемы компьютера:

На входе:

AH

1Ah

AL

00h - чтение конфигурации видеосистемы

На выходе:

AL

1Ah

BL

Тип первичного видеоадаптера:

0 - монитор отсутствует, 1 - MDA с монохромным монитором, 2 - CGA с цветным монитором, 3 - EGA с улучшенным цветным монитором, 4 - EGA с цветным монитором, 5 - EGA с монохромным монитором, 6 - PGC (профессиональный графический контроллер); 7 - VGA с монохромным аналоговым монитором, 8 - VGA с цветным аналоговым монитором, 0Ah - MCGA с цветным цифровым монитором. 0Bh - MCGA с монохромным аналоговым монитором, 0Ch - MCGA с цветным аналоговым монитором

BH

Тип дополнительного видеоадаптера (см. регистр BL)



Чтение нескольких регистров таблицы цветов (регистров ЦАП) - подфункция 17h


Функция производит чтение 18-битовых значений из нескольких последовательно расположенных регистров таблицы цветов:

На входе:

AH

10h

AL

17h  - чтение нескольких регистров таблицы цветов

BL

Номер первого регистра таблицы цветов (0 -255)

CX

Количество регистров для чтения (1-256)

ES:DX

Адрес буфера для таблицы цветов

На выходе:

ES:DX

Данные прочитанные из таблицы цветов

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



Чтение пиксела - функция 0Dh


Функция позволяет определить цвет любого пиксела экрана по его координатам. Функция используется только в графических режимах работы видеоадаптеров.

На входе:

AH

0Dh

BH

Номер страницы (для видеоадаптера CGA не используется)

CX

Координата X пиксела

DX

Координата Y пиксела

На выходе:

AL = номер цвета пиксела

Приведем фрагмент программы, который определяет номер цвета пиксела, имеющего координаты x_pos и y_pos:

mov        ah,0Dh

mov        cx,x_pos

mov        dx,y_pos

int           10h

; Сохраняем полученную величину

mov        color_number



Чтение регистра цвета рамки - подфункция 08h


Функция поддерживается только видеоадаптерами VGA и SVGA. Позволяет прочитать содержимое регистра цвета рамки:

На входе:

AH

10h

AL

08h - чтение регистра цвета рамки

На выходе:

BH

Значение регистра цвета рамки



Чтение регистра палитры - подфункция 07h


Функция поддерживается только видеоадаптерами VGA и SVGA. Она позволяет прочитать содержимое любого регистра палитры:

На входе:

AH

10h

AL

07h - чтение регистра палитры

BL

Номер регистра палитры (0-15)

На выходе:

BH

Значение указанного регистра палитры

mov        ah,10h

mov        al,7h

mov        bl,num_reg

int           10h

mov        reg_value,bh



Чтение регистра таблицы цветов - подфункция 15h


Функция поддерживается только для видеоадаптеров VGA и SVGA. Она выполняет чтение одного из регистров таблицы цветов:

На входе:

AH

10h

AL

15h - чтение регистра таблицы цветов

BL

Номер регистра (0-255)

На выходе:

DH

Интенсивность красного цвета (6 бит)

CH

Интенсивность зеленого цвета (6 бит)

CL

Интенсивность синего цвета (6 бит)

Следующий пример позволяет считать значение регистра таблицы цветов с номером num_color_reg:

mov        ah,10h

mov        al,15h

mov        bx,num_color_reg

int           10h

mov        red_data,dh

mov        green_data,ch

mov        blue_data,cl



Чтение символа и его атрибутов - функция 08h


Данная функция позволяет прочитать символ и его атрибуты из позиции экрана, определенной текущим положением курсора. Чтение можно производить как из активной, так и из неактивных страниц памяти:

На входе:

AH

08h

BH

Номер страницы видеопамяти

На выходе:

AL

ASCII-код символа

AH

Байт атрибутов символа для текстовых режимов

Следующий пример считывает символ и его атрибут из текущей позиции курсора на странице page:

mov        ah,8

mov        bh,page ; Выбираем страницу видеопамяти page

int           10h                         ; Считываем символ и его атрибут

mov        char,al   ; Сохраняем полученный ASCII-код символа

mov        attr,ah    ; и его атрибут

Что удивительно данная функция может работать не только в текстовых, но также и в графических режимах. В этом случае она сравнивает пикселы в текущей позиции курсора с записями в таблице определения символов графического режима. Пикселы, значение которых не равно нулю, воспринимаются как пикселы символа. Остальные пикселы рассматриваются в качестве фона. Если соответствующий образ символа не обнаружен, функция возвращает в регистре AL значение 0. Если символ определен, в регистре AL возвращается его ASCII-код.

В качестве таблицы определения символов графического режима используется таблица, на которую указывает вектор прерывания 43h. Для графических режимов низкого разрешения (режимы номер 4, 5, 6) используется таблица символов, на которую указывает вектор прерывания 1Fh. Эта таблица содержит определение символов с ASCII-кодами 80h - FFh.



Чтение всех регистров палитры - подфункция 09h


Функция позволяет прочитать значения всех регистров палитры и регистра цвета рамки. Для чтения регистров надо зарезервировать буфер в оперативной памяти размером 17 байт. После вызова функции байты 0 - 15 этого буфера будут содержать значения соответствующих регистров палитры, а байт 16 - значение регистра цвета рамки.

На входе:

AH

10h

AL

9 - чтение всех регистров палитры

ES:DX 

Указатель на буфер размером 17 байт

На выходе:

ES:DX

Указатель на буфер, заполненный значениями из регистров палитры и регистра цвета рамки

Приведем фрагмент программы, который считывает значения всех регистров палитры и регистра цвета рамки в буфер памяти buffer:

; Определяем адрес буфера для записи значений регистров

; палитры и регистра цвета рамки              

mov        ax,SEG buffer

mov        es,ax

mov        dx,OFFSET buffer   

; Считываем значения всех регистров палитры и регистра

; цвета рамки

mov        ah,10h

mov        al,9                                                        

int           10h



Чтение/запись конфигурации видеосистемы - функция 1Ah


Функция содержит две подфункции для чтения и записи текущей конфигурации видеосистемы компьютера.

Функция 1Ah реализована только для видеоадаптеров VGA и SVGA. Если после вызова функции регистр AL не содержит число 1Ah, это значит, что функция не поддерживается данным видеоадаптером и для определения конфигурации надо использовать другие способы.



Цветной монитор


D0    Голубой.

D1    Зеленый.

D2    Красный.

D3    Не используется.

D4    Интенсивность.

D7-D5    Не используются.



Длина отображаемой части горизонтальной


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

При установке режима работы видеоадаптера, BIOS загружает в регистр HDER следующие значения:

Режим

0,1,4,5,D

2,3,6,7,E,F,10

Содержимое регистра

27h

4Fh



Дополнительная таблица окружения


Последний элемент таблицы окружения содержит указатель на дополнительную таблицу окружения. Эта таблица содержит несколько дальних указателей на структуры данных, используемые BIOS видеоадаптеров VGA и SVGA.

Дополнительная таблица окружения (также как таблица окружения), используемая сразу после загрузки компьютера, располагается в ПЗУ BIOS. Чтобы изменить какие-либо элементы этой таблицы, вы должны сначала перенести ее в оперативную память (см. раздел "Таблица окружения").

Ниже описаны элементы дополнительной таблицы окружения:

Смещение

Размер

Описание

00h

Слово

Длина дополнительной таблицы окружения в байтах

02h

Двойное слово

Указатель на таблицу кодов комбинаций мониторов

06h

"-"

Указатель на вторую таблицу символов текстового режима

0Ah

"-"

Указатель на таблицу настройки палитры

0Eh

"-"

Зарезервировано

12h

"-"

"-"

16h

"-"

"-"

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



Дополнительный регистр (Overflow Register - OVR) (индекс7)


Многие регистры контроллера ЭЛТ, видеоадаптера EGA, имеют по девять, а для адаптеров VGA и SVGA по десять битов. Дополнительный регистр содержит биты, которые не помещаются в восьмиразрядную сетку основных регистров видеоадаптера.

D0    Бит 8 регистра числа горизонтальных линий растра (VTR).

D1    Бит 8 регистра начала гашения вертикальной  развертки (VDER).

D2    Бит 8 регистра начала обратного вертикального хода луча (VRSR).

D3    Бит 8 регистра начала импульса гашения вертикальной развертки (SVBR).

D4    Бит 8 регистра сравнения линий (LCR).

D5    Бит 9 регистра количества горизонтальных линий в растре (VTR).

D6    Бит 9 регистра начала гашения вертикальной развертки (VDER).

D7    Бит 9 регистра начала обратного вертикального хода луча (VRSR).



Функции putchar и putc


Эти функции помещают один символ в текущую позицию выходного потока. Прототипы функций представлены ниже:

int putc( int ch, FILE *stream );

int putchar( int ch );

Функция putc отличается от putchar наличием второго аргумента, который определяет выходной поток, в который помещается символ. Она может использоваться и для записи символов в открытый файл и для записи в стандартные потоки ввода-вывода. В частности, если второй аргумент функции равен константе stdout, то она эквивалентна функции putchar и выводит символ в стандартный выходной поток. Этот поток может идти на экран монитора или в файл, если используется свойство переназначения потока. Фактически функция putchar является макроопределением:

#define putchar(_c)                           putc((_c),stdout)

Первые параметры обеих функций совпадают по смыслу и задают ASCII-код выводимого символа (не смотря на то, что переменная ch целого типа, используется только ее младший байт). Функции обрабатывают управляющие символы. Список управляющих символов приведен в следующей таблице:

Символ

Код ASCII

Значение

\a

07h

Звуковой сигнал

\b

08h

Перемещение назад

\f

0Ch

Переход к новой странице

\n

0Ah

Новая строка

\r

0Dh

Возврат каретки

\t

09h

Горизонтальная табуляция

\v

0Bh

Вертикальная табуляция

\'

27h

Символ кавычки

\"

22h

Двойная кавычка

\\

5Ch

Обратный слеш

\%

25h

Знак процента

Функции возвращают ASCII-код выведенного на экран символа, а в случае ошибки возвращают константу EOF. Чтобы конкретизировать ошибку можно воспользоваться функцией ferror.

Программа PUTCHAR (листинг 9.1) демонстрирует использование функции putchar.

Листинг 9.1. Файл PUTCHAR.C

// Использование функции putchar

#include <stdio.h>

void main(void) {

 

char *ptr,

               

out_str[] = "\aputchar\nputc\a";

 

for(ptr = out_str; *ptr; putchar(*(ptr++)) );

}

Включаемый файл STDIO.H содержит спецификации функций putchar и putc. Следовательно, этот файл необходимо включать во все программы, использующие данные функции.



Функция cprintf


Функция обеспечивает вывод на экран монитора строк, отдельных символов и чисел в различных форматах непосредственно на консоль. Для вывода отдельных символов используется функция putch.

Приведем прототип функции cprintf:

int cprintf( char *format [,argument]... );

Ее параметры соответствуют параметрам функции printf, описанной выше. Единственное отличие состоит в том, что она не преобразует символ перевода строки в пару символов - возврат каретки, перевод строки.

Функция cprintf возвращает количество напечатанных символов или отрицательную величину в случае ошибки.



Функция cputs


Функция выполняет запись строки символов, оканчивающихся нулем, на консоль. В отличие от функции puts курсор не переводится на новую строку.

Приведем прототип функции cputs:

int cputs( char *string );

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

При использовании функции cputs необходимо включить директивой include файл CONIO.H, содержащий спецификацию этой функции.



Функция printf


Наиболее универсальной стандартной функцией, обеспечивающей запись в выходной поток stdout, является функция printf. Она производит вывод на экран монитора строк, отдельных символов и чисел в различных форматах.

Приведем прототип функции printf:

 int printf( char *format [,argument]... );

Первый аргумент функции содержит указатель на управляющую строку, которая может состоять из:

       символов непосредственно отображаемых на экране,

       управляющих символов,

       спецификаторов формата.

Непосредственно выводимые символы и управляющие символы помещаются в выходной поток без изменения.

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

Различные спецификаторы формата перечислены в следующей таблице:

Спецификатор формата

Тип данных

%d, %i

Целое десятичное число

%s

Текстовая строка

%c

Один символ

%e, %E

Число с плавающей точкой в экспоненциальной форме

%f

Число с плавающей точкой в десятичной записи

%u

Целое десятичное число без знака

%o

Целое восьмеричное число без знака

%x, %X

Целое шестнадцатиричное число без знака

%g, %G

Либо %e, либо %f в зависимости от того, в каком формате запись короче

%p

Значение указателя

%n

Количество символов

В более общем случае, в спецификаторе формата между символом '%' и символом, определяющим тип преобразования можно разместить флаги и префиксы типов:

% [флаг] [ширина] [.точность] [префикс типа] символ преобразования

Флаги приведены в таблице 13.3, а префиксы типов в таблице 13.4.

Параметр [ширина] задает минимальную ширину поля, используемую при печати строки или числа. Если это число или строка не помещаются в поле целиком, то ширина поля увеличивается.


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

Флаг

Значение

-

Выравнивание по левой границе

+

Перед числом помещается его знак

пробел (' ')

Перед данными помещается пробел

Префикс типа

Значение

F

Дальний указатель

N

Ближний указатель

h

Короткое целое

l, L

Длинное целое

Функция printf возвращает количество напечатанных ею символов или, в случае ошибки, отрицательную величину.

Использование различных спецификаторов формата функции printf демонстрируется программой PRINTF (листинг 9.3).

Листинг 9.3. Файл PRINTF.C

// При использовании функции printf необходим файл stdio.h

#include <stdio.h>

void main(void) {

  int  char_count;

  char ptr[] = "строка";

  printf("\n%23d  \n%e  \n%.3E  \n%f  \n%+g  \n%-23G \n\n",

                   1111,   0.01, 0.01,   0.01, 0.01,  0.0000001);

  printf("%s%n", ptr,  &char_count);

  printf("\n\nПредыдущая функция вывела %d символов.\n\n",

         char_count);

  printf("Это %s, расположенная по адресу %Lp.\n\a",

                ptr, ptr);

}


Функция putch


Функция выполняет запись символа на консоль без буферизации. Прототип функции:

int putch( int ch );

Параметр функции ch содержит код ASCII выводимого символа. Заметим, что используется только младший байт параметра функции.

Функция putch возвращает код ASCII записанного символа, или, в случае возникновения ошибки, константу EOF.

При использовании функции putch необходимо включить в программу файл CONIO.H, который содержит ее спецификацию.



Функция puts


Функция puts позволяет записать строку в стандартный выходной поток stdout. Строка должна оканчиваться нулем (символ '\0'). Этот символ не помещается в выходной поток. Вместо него записывается управляющий символ '\n', который переводит курсор в начало новой строки.

Функция имеет следующий прототип:

int puts( char *string );

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

При использовании функции puts необходимо включить директивой include файл STDIO.H, содержащий спецификацию этой функции.

Программа PUTS (листинг 9.2) демонстрирует использование функции puts.

Листинг 9.2. Файл PUTS.C

#include <stdio.h>

void main(void) {

 

puts("Работает функция puts!");

}



Гашение экрана монитора - подфункция 36h


Видеоадаптеры VGA и SVGA имеют возможность гашения экрана монитора:

На входе:

AH

12h

BL

36h - управление гашением экрана монитора

AL

0 - включить отображение информации на экране монитора,

1 - погасить экран монитора

На выходе:

AL

12h

Функция возвращает в регистре AL значение 12h, если компьютер имеет видеоадаптер VGA.



Графический контроллер


Графический контроллер осуществляет обмен данными между видеопамятью и процессором. Графический контроллер может выполнять над данными, поступающими в видеопамять, простейшие логические операции: И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ, операцию циклического сдвига.



Индекс читаемого регистра таблицы цветов (Look-up Table Read Index Register - LTRIR)


Этот индексный регистр доступен через порт 3C7h только для записи. Запись в данный регистр индекса элемента цветовой таблицы позволяет прочитать его через регистр данных цветовой таблицы.

D7-D0    Индекс регистра таблицы цветов (0-255).

Данные из регистров таблицы цветов читаются через порт 3C9h, как три 6-битовых числа. После чтения третьего числа значение индексного регистра (LTRIR) автоматически увеличивается на единицу, что позволяет прочитать всю таблицу цветов, загрузив регистр индекса только один раз.

Во время операций чтения или записи таблицы цветов прерывания должны быть запрещены.



Индекс записываемого регистра таблицы цветов (Look-up Table Write Index Register - LTWIR)


После записи в регистр LTWIR индекса регистра таблицы цветов можно записать в него новое значение через регистр данных таблицы цветов (см. ниже).

D7-D0    Индекс регистра таблицы цветов (0-255).

Данные записываются в регистры таблицы цветов через порт 3C9h, как три 6-битовых числа. После записи третьего числа значение индексного регистра (LTWIR) автоматически увеличивается на единицу, что позволяет прочитать таблицу цветов, загрузив регистр индекса только один раз.



Использование функций BIOS для работы с видеоадаптерами


У всех компьютеров, совместимых с IBM PC/XT/AT и PS/2, на системной плате установлена микросхема ПЗУ BIOS. В ней записан набор различных программ или функций, предназначенных для управления различными подсистемами компьютера: дисковой подсистемой, асинхронными последовательными и параллельными портами ввода/вывода, видеоадаптером. Нас в первую очередь будут интересовать функции, предназначенные для управления видеоподсистемой компьютера.

Микросхема ПЗУ BIOS, расположенная на системной плате содержит функции для управления видеоадаптерами. Однако практически все видеоадаптеры имеют собственную микросхему ПЗУ BIOS, расположенную на самой плате адаптера. На практике для управления видеоадаптером используются функции, записанные в его ПЗУ BIOS.

Использование функций BIOS для управления видеоадаптерами имеет как преимущества, так и недостатки. Основным преимуществом функций BIOS является то, что они скрывают всю кропотливую работу по программированию регистров видеоадаптера и видеопамяти, предоставляя программисту достаточно простой интерфейс. Но это еще не все. Так как функции BIOS создаются самими разработчиками видеоадаптера, то они учитывают все особенности конкретной модели адаптера, выравнивая все различия. Как вы узнаете позже, это особенно важно для программирования видеоадаптеров SVGA, так как набор регистров и организация видеопамяти разных моделей может сильно различаться.

К недостаткам функций BIOS можно отнести невысокую скорость их работы. Отчасти это вызвано тем, что доступ к данным, записанным в ПЗУ происходит медленнее, чем к оперативной памяти. Многие системные платы позволяют перенести содержимое медленного ПЗУ BIOS в более быструю оперативную память. Эта область оперативной памяти получила название теневой памяти, так как ее содержимое полностью повторяет соответствующую область ПЗУ. Подключение теневой памяти выполняется с помощью программы BIOS Setup. Отметим, что ПЗУ BIOS видеоадаптера обычно занимает адресное пространство начиная с адреса C000:0000h до адреса C000:7FFFh.


Второй недостаток функций ПЗУ BIOS состоит в том, что большинство их нереентерабельно. То есть пока не завершится вызов функции BIOS нельзя вызвать другую функцию BIOS. Вследствие этого вы не можете как обычно пользоваться функциями BIOS в резидентных программах.

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

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

Для доступа к функциям BIOS видеоадаптера предназначено прерывание INT10h. Загрузите в регистр AH номер функции BIOS видеоадаптера, которую необходимо вызвать, загрузите остальные регистры процессора в соответствии с вызываемой функцией и выполните прерывание INT 10h.

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


Использование функций MS-DOS для управления видеоадаптерами


Операционная система MS-DOS предоставляет программистам всего несколько функций для работы с видеоподсистемой компьютера.



Использование светового пера - функция 04h


Функция 04h позволяет определить подключено ли к видеоадаптеру световое перо или нет. Если световое перо подключено, можно определить его координаты. Функция позволяет узнать позицию светового пера в текстовых и в графических координатах.

Световое перо видеоадаптера EGA программно не полностью совместимо с CGA, в результате чего программы поддерживающие возможность использования светового пера для видеоадаптера CGA будут работать неправильно с видеоадаптером EGA. Видеоадаптеры VGA и SVGA не имеют светового пера.

На входе:

AH

04h

На выходе:

AH

0 - световое перо не подключено (все  остальные регистры не содержат полезной  информации);

1 - световое перо подключено

CH

Координаты вертикальной позиции курсора в пикселах (графические режимы с низким разрешением - 04h, 05h, 06h)

CX

Координаты вертикальной позиции курсора в пикселах (графические режимы с высоким разрешением)

BX

Координаты горизонтальной позиции курсора в пикселах

DH

Номер строки, на которой расположен курсор

DL

Номер столбца на котором расположен курсор



Изменение формы курсора - функция 01h


Функция 01h позволяет изменить вертикальные размеры курсора путем задания верхней и нижней границ курсора (рис. 5.1). Горизонтальные размеры курсора всегда одинаковы и равны ширине одного символа. Курсор отображается только в текстовых режимах работы видеоадаптера.

На входе:

AH

00h

CH

Верхняя граница курсора. Если регистр CH содержит значение 20h курсор не отображается

CL

Нижняя  граница курсора

На выходе:

Не используются

При выборе режима работы видеоадаптера BIOS устанавливает следующие значения для верхней и нижней границ курсора:

       Для монохромного и улучшенного цветного монитора верхняя граница = 11h, а нижняя = 12h.

       Для цветного монитора верхняя граница = 6h, а нижняя = 7h.

PICTURE._FIG_35.PCX;6";4.308";PCX

Рисунок 5.1   Изменение положения курсора



Изменение положения курсора - функция 02h


Функция 02h задает текущее положение курсора на экране монитора. Если видеопамять разделена на несколько страниц, то каждая из них имеет свой курсор, координаты которого можно устанавливать отдельно.

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

На входе:

AH

02h

BH

Номер страницы видеопамяти

DH

Номер строки

DL

Номер столбца

На выходе:

Не используются



Эмуляция курсора CGA - подфункция 34h


Функция 34h управляет режимом эмуляции курсора CGA. При разрешении эмуляции курсора CGA, его размеры устанавливаются, исходя из того, что символы имеют высоту 8 пикселов.

На входе:

AH

12h

BL

34h - управление эмуляцией курсора CGA

AL

Разрешение/запрещение эмуляции курсора:

0 - разрешить эмуляцию,

1 - запретить эмуляцию

На выходе:

AL

12h



Как связаться с авторами


Авторы имеют собственный почтовый адрес в сети GlasNet. Все свои замечания и предложения по содержанию книг серий "Библиотека системного программиста" и "Персональный компьютер - шаг за шагом" вы можете присылать нам по следующему адресу:

frolov@glas.apc.org

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

Глобальная сеть

Наш адрес

CompuServe

>internet:frolov@glas.apc.org

GlasNet

frolov@glas.apc.org

Internet

frolov@glas.apc.org

Relcom

frolov@glas.apc.org

UUCP

uunet!cdp!glas!frolov

Вы также можете присылать свои пожелания почтой по адресу:

Издательский отдел АО "ДИАЛОГ-МИФИ"

Индекс 115409, город Москва, улица Москворечье, дом 31, корпус 2



Конец импульса гашения луча горизонтальной


D4-D0    Конец импульса гашения луча горизонтальной развертки. Гашение луча горизонтальной развертки происходит, когда биты D4-D0 равны счетчику длины отображаемой части горизонтальной развертки.

D6-D5    Биты смещения используются в текстовых режимах, чтобы разрешить отображение символов до разрешения вывода. Если величина битов смещения слишком маленькая, то символы на  левой стороне экрана могут быть потеряны, а если она слишком большая, то символы на левой стороне экрана могут дублироваться по несколько раз.

     

D6           D5

     

0              0 - нет смещения

     

0              1 - смещение на один символ

     

1              0 - смещение на два символа

     

1              1 - смещение на три символа

D7    Бит D7 равен единице для видеоадаптера VGA и нулю для EGA.

При установке режима работы видеоадаптера, BIOS загружает в регистр EHBR следующие значения:

Режим

0,1,4,5,D

2,3

6,E

7

F

10

Содержимое регистра

37h

2Fh

2Dh

3Ah

1Fh

17h

Если используется улучшенный цветной монитор, то эти значения отличаются:

Режим

0,1

2,3

Содержимое регистра

2Dh

37h



Конец импульса гашения вертикальной развертки (End Vertical Blank Register - EVBR) (индекс16h)


Сигнал гашения вертикальной развертки завершается, когда счетчик горизонтальных линий соответствует значению регистра EVBR. Для видеоадаптера EGA регистр имеет 5 разрядов, а для VGA и SVGA 8 разрядов.



Конец импульса горизонтального


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

D6-D5    Смещение импульса горизонтального обратного хода луча относительно отображаемого участка горизонтальной развертки. Биты используются видеоадаптером EGA.

     

D6           D5

     

0              0 - нет смещения

     

0              1 - смещение на один символ

     

1              0 - смещение на два символа

     

1              1 - смещение на три символа

D7    Для адаптера EGA с объемом видеопамяти меньшим 256 Кбайт, бит D7 используется для управления горизонтальной сверткой экрана (горизонтальным панорамированием), когда слои видеопамяти сцеплены. Если бит D7 равен нулю, то после обратного хода луча первый адрес видеопамяти для обновления экрана будет четным.

          Для видеоадаптеров VGA и SVGA бит D7 является пятым битом  регистра конца импульса гашения луча горизонтальной развертки (EHBR).



Конец обратного вертикального хода луча (Vertical Retrace End Register - VRER) (индекс11h)


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

Биты

Описание

D3-D0

Конец обратного вертикального хода луча

D4

Сброс вертикального прерывания

D5

Разрешения вертикального прерывания

D6

Изменение скорости регенерации экрана (видеоадаптеры VGA и SVGA)

D7

Защита от записи (видеоадаптеры VGA и SVGA)

D7    Если бит D7 равен единице, то регистры контроллера ЭЛТ, имеющие индексы от 0 до 7, будут защищены от записи. Защита от записи позволяет решить некоторые проблемы совместимости между адаптером VGA и видеоадаптерами, построенными на основе микросхемы 6845 (например CGA).

D6    Если бит D6 равен единице, то во время обратного горизонтального хода луча будет генерироваться пять циклов регенерации видеопамяти вместо обычных трех.

D5    Если бит равен нулю, то при каждом обратном вертикальном ходе луча на линии IRQ2 будет возникать прерывание. Сигнал прерывания сбрасывается при записи нуля в бит D4 данного регистра.

D4    Запись нуля в данный бит вызывает сброс прерывания на линии IRQ2 и переустановку флага незаконченного вертикального прерывания.

D3-D0    Сигнал обратного вертикального хода луча завершается, когда значение четырех младших бита счетчика горизонтальных линий совпадает с битами D3-D0



Конечная линия курсора (Cursor End Register - CER) (индекс0Bh)


Этот регистр, также как и регистр CSR, является доступным для чтения и для записи. Регистр задает линию сканирования символа, в которой кончается курсор.

D4-D0    Соответствует номеру последней линии курсора для видеоадаптеров VGA и SVGA (рис. 4.3). Для видеоадаптера EGA - номеру следующей линии.

D6-D5    Отклонение курсора. Задает смещение курсора относительно позиции, определенной регистром CLR.

     

00 - нет отклонения

     

01 - отклонение вправо на один символ

     

10 - отклонение вправо на два символа

     

11 - отклонение вправо на три символа

D7    Не используется.

При установке режима работы видеоадаптера BIOS загружает  в регистр конечной линии курсора следующие значения:

Режим

0,1,2,3

4,5,6,D,E,F,10

7

Содержимое регистра

07

00

0Ch

Изменяя значение регистров начальной и конечной линии курсора, можно менять его положение и размер (рис. 4.3). На левой части рисунка, приведенного ниже, регистр начальной линии курсора равен 0Ah, регистр конечной линии курсора равен 0Bh. На правой части рисунка значение регистров изменено. Регистр начальной линии равен 4, а регистр конечной линии - 5.

PICTURE._FIG_35.PCX;6";4.308";PCX

Рисунок 4.3   Изменение положения курсора

Следующая программа позволяет прочитать значение регистров начальной и конечной линии курсора:

Листинг 4.4. Файл GETCURS.C

#include <stdio.h>

#include <conio.h>

#include "sysp.h"                                               // см. листинг 3.2

#include "sysgraph.h"      // см. листинг 3.3

// Описания функций

void        main(void);

void        WriteReg(unsigned reg, unsigned char data);

unsigned char     ReadReg(unsigned reg);

// Главная функция

void main(void) {

 

char           top = 0, bottom = 0;

 

unsigned       crt_address;

 

BIOS_VAR _far  *bios_var_ptr;

 

// Получаем указатель на область переменных BIOS

 

bios_var_ptr = (BIOS_VAR _far *) FP_MAKE(0x0000, 0x0410);

 

// Определяем адрес индексного регистра контроллера ЭЛТ


  crt_address = bios_var_ptr->wAddrCRT;

  // Считываем значения регистров начальной и конечной линии

  // курсора

  // Выбираем регистр начальной линии курсора

  WriteReg(crt_address++, 0x0A);

  // Считываем значение регистра

  top = (unsigned char) ReadReg(crt_address--);

  // Выбираем регистр конечной линии курсора

  WriteReg(crt_address++, 0x0B);

  // Считываем значение регистра

  bottom = (unsigned char) ReadReg(crt_address);

  // Отображаем на экране значение регистров

  printf("\ nРегистр начальной линии курсора содержит: %d\n"

                                 "\nРегистр конечной линии курсора содержит: %d\n",

                                top, bottom);

  getch();

}

Для доступа к регистрам видеоадаптера мы пользуемся функциями WriteReg и ReadReg, определенными в файле DESIGN.C (листинг 4.5).

Листинг 4.5. Файл DESIGN.C

//=========================================================

// WriteReg(unsigned reg, unsigned char data)

// Функция выводит данные в порт

//

// Параметры:

//                              reg - номер порта

//                              data - данные, записываемые в порт reg

//=========================================================

void WriteReg(unsigned reg, unsigned char data) {

  _asm {

                mov  dx,reg

                mov  al,data

                out  dx,al

  }

}

//=========================================================

// unsigned char ReadReg(unsigned reg)

// Функция читает данные из определенного порта

//

// Параметры:

//                              reg - номер порта

//

//              Возвращаемое значение:

//                              данные, считанные из порта reg

//=========================================================

unsigned char ReadReg(unsigned reg) {

  unsigned char  data;

  _asm {

                mov  dx,reg

                in   al,dx

                mov  data,al

  }

  return(data);

}


Контроллер атрибутов


Контроллер атрибутов в графических и текстовых режимах работы видеоадаптера управляет цветом элементов изображения. Значениям цветовых атрибутов ставится в соответствие определенный цвет. Для этого используется таблица цветовой палитры (Color Lock-up Table). Таблица цветовой палитры ставит в соответствие четырем битам, взятым из видеопамяти, 6 битов цветовой информации. Изменяя данные, записанные BIOS в таблицу цветовой палитры, можно менять используемую палитру цветов.

Для видеоадаптера EGA эта информация поступает непосредственно на видеовход монитора. Если к видеоадаптеру EGA подключен цветной монитор, то используются только четыре младших бита из шести.

Видеоадаптеры VGA и SVGA выполняют более сложные операции по преобразованию цвета. Данные полученные от таблицы цветовой палитры преобразуются дальше в соответствии с таблицей цветов. В результате получаются три 6 битовых значения, представляющих красный, зеленый и синий компоненты цвета. Эти значения поступают на три цифро-аналоговых преобразователя и уже в аналоговом виде поступают в монитор.

На рисунках 3.16 и 3.17 показана работа контроллера атрибутов в графическом и текстовом режимах.

PICTURE._FIG_16.PCX;6";4.308";PCX

Рисунок 3.16   Контроллер атрибутов в текстовых режимах

В текстовых режимах видеоадаптеров, цвет символа и цвет фона символа определяется байтом атрибутов. Цвет фона символа задают четыре старших бита байта атрибутов. Значение этих четырех бит служит индексом в таблице цветовой палитры. Элемент таблицы с данным индексом впоследствии определяет цвет фона символа.

Аналогично битам, определяющим цвет фона символа, четыре младших бита задают цвет самого символа.

PICTURE._FIG_15.PCX;6";4.308";PCX

Рисунок 3.17   Контроллер атрибутов в графических режимах

В отличие от текстовых режимов, в графических режимах цвет каждого пиксела определяется отдельно. На рисунке 6.18 четыре бита, считанные из цветовых слоев видеопамяти определяют один пиксел. Значение этих бит служат индексом для таблицы цветовой палитры.

Контроллер атрибутов подробно описан в разделе "Регистры видеоадаптеров EGA и VGA".



Контроллер ЭЛТ


Контроллер ЭЛТ выполняет следующие функции:

       Вырабатывает сигналы, управляющие работой ЭЛТ (сигналы развертки и гашения)

       Определяет формат экрана и формат символов текста (разрешающую способность экрана и размер символов)

       Определяет форму курсора

       Управляет световым пером

       Управляет вертикальной сверткой (скроллингом) содержимого экрана

Так как контроллер ЭЛТ выполняет жизненно важные для монитора функции, то изменять содержимое регистров этого контроллера очень опасно. В некоторых случаях может даже произойти физическое повреждение экрана (например, повреждение люминофора).

Регистры контроллера ЭЛТ загружаются BIOS значениями, зависящими от типа монитора, видеоадаптера и текущего режима работы. Мы не рекомендуем вам без особой необходимости изменять содержимое этих регистров. Практически все что необходимо, можно сделать при помощи функций BIOS, не подвергая дорогостоящий видеоадаптер и монитор излишнему риску.



Краткий обзор


Видеоадаптеры EGA, VGA и SVGA имеют большое количество регистров. Адаптер EGA имеет около шестидесяти регистров, а VGA и SVGA еще больше. Большая часть регистров EGA доступна только для записи, что создает определенные проблемы, особенно для мультизадачных систем.

Некоторые фирмы-изготовители видеоадаптеров выпускают платы видеоадаптеров совместимые с EGA, для регистров которых разрешена также и операция чтения. В адаптерах VGA и SVGA практически все регистры доступны как для записи, так и для чтения.

       В тех случаях, когда видеоадаптеры SVGA и VGA имеют отличия от EGA, мы будем на это специально указывать.

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

Заметим, что в различных режимах работы видеоадаптера, его регистры могут иметь различные адреса.

Приведем список адресов регистров в монохромных режимах:

Адрес

Регистр

3C2h

Регистр определения различных режимов работы (Miscellaneous Output Register - MOR),

Регистр состояния 0 (Input Status Register 0 - ISR0)

3BAh

Регистр управления дополнительным устройством (Feature Control Register),

Регистр состояния 1 (Input Status Register 1 - ISR1)

3BBh

Регистр очистки защелки светового пера (Clear Light Pen Latch Register- CLPLR)

3BCh

Установка защелки светового пера (Set Light Pen Latch Register - SLPLR)

3C4h, 3C5h

Регистры синхронизатора (Sequencer Register's - SR)

3B4h, 3B5h

Регистры контроллера ЭЛТ (CRT Controller Register's - CRT_CR)

3CAh, 3CCh, 3CEh, 3CFh

Регистры графического контроллера (Graphics Controller Register's - GCR)

3C0h

Регистр контроллера атрибутов (Attribute Controller Register - ACR)

3C3h

Регистр разрешения работы системы VGA (VGA Enable Register - VGA_ER)

3C6h, 3C7h, 3C8h, 3C9h

Регистры цифро-аналогового преобразователя (ЦАП) VGA (VGA Video DAC Register - VGA_DAC_R)

<
/p> А теперь перечислим адреса тех же регистров, но уже для цветных режимов видеоадаптера:

Адрес

Регистр

3C2h

Регистр определения различных режимов работы (Miscellaneous Output Register - MOR),

Регистр состояния 0 (Input Status Register 0 - ISR0)

3DAh

Регистр управления дополнительным устройством Feature Control Register),

Регистр состояния 1 (Input Status Register 1 - ISR1)

3DBh

Регистр очистки защелки светового пера (Clear Light Pen Latch Register- CLPLR)

3DCh

Установка защелки светового пера (Set Light Pen Latch Register - SLPLR)

3C4h, 3C5h

Регистры синхронизатора (Sequencer Register's - SR)

3D4h, 3D5h

Регистры контроллера ЭЛТ (CRT Controller Register's - CRT_CR)

3CAh, 3CCh, 3CEh, 3CFh

Регистры графического контроллера (Graphics Controller Register's - GCR)

3C0h

Регистр контроллера атрибутов (Attribute Controller Register - ACR)

3C3h

Регистр разрешения работы системы VGA (VGA Enable Register - VGA_ER)

3C6h, 3C7h, 3C8h, 3C9h

Регистры ЦАП VGA (VGA Video DAC Register - VGA_DAC_R)

В зависимости от режима работы видеопамять адаптера занимает различное адресное пространство:

Номер режима работы

Адрес памяти

0,1,2,3,4,5,6

B000:8000h-B000:FFFFh

7

B000:0000h-B000:7FFFh

0Dh,0Eh,0Fh,10h,11h,12h,13h

A000:0000h-A000:FFFFh

Ниже мы привели исходный текст функции Get_Seg_Vmem. Данная функция определяет текущий режим работы видеоадаптера и возвращает сегментный адрес начала видеопамяти. Если видеоадаптер работает в нестандартном режиме, функция возвращает нулевое значение.

Чтобы узнать номер текущего режима видеоадаптера, используется функция 0Fh прерывания INT 10h. Пример вызова данной функции представлен в листинге 4.1.

Листинг 4.1. Файл SEGVMEM.C

// Файл SYSP.H представлен в листинге 3.2

#include "sysp.h"

unsigned GetSegVmem(void) {

  unsigned char   mode;

  unsigned                                             seg_address;

  // Определяем текущий режим видеоадаптера



  _asm {

                mov ah,0Fh

                int 10h

                mov mode,al

  }

  // Если видеоадаптер находится в режимах 0, 1, 2, 3,

  // 4, 5, 6 то видеопамять начинается с сегмента B800h

  if((mode >= 0) && (mode <= 6))

                seg_address = 0xB800;

  // Если видеоадаптер находится в режиме 7,

  // то видеопамять начинается с сегмента B000h

  else if(mode == 7)

                seg_address = 0xB000;

  // Если видеоадаптер находится в режимах 0Dh - 13h,

  // то видеопамять начинается с сегмента A000h

  else if((mode >= 0x0D) && (mode <= 0x13))

                seg_address = 0xA000;

  // Если видеоадаптер не находится в стандартном режиме

  // возвращаем ноль

  else seg_address = 0x0;

  return(seg_address);

}

Ниже подробно рассмотрены регистры видеоадаптеров EGA и VGA. Мы выделили следующие группы регистров:

       Внешние регистры

       Регистры контроллера ЭЛТ

       Регистры графического контроллера

       Регистры контроллера атрибутов

       Регистры синхронизатора

       Регистры цифро-аналогового преобразователя VGA


Литература


1.             Richard Wilton, "Programmer's Guide to PC Video Systems", Second Edition, Microsoft Press, 1987.

2.             Richard Wilton, "Programmer's Guide to PC & PS/2 Video Systems", Microsoft Press, 1987.

3.             George Sutty, Steve Blair, "Programmer's Guide to the EGA/VGA", New York, 1988.

4.             Bradley Dyck Kliewer, "EGA/VGA A Programmer's Reference Guide", New York, 1988.

5.             Michael Abrash, "VGA color paging", Programmer's Journal 7.5, 1989.

6.             Michael Abrash, "Still-higher 256-color VGA resolutions", Programmer's Journal 7.5, 1989.

7.             Michael Abrash, "Higher 256-color resolutions on the VGA ", Programmer's Journal 7.1, 1989.

8.             А. В. Фролов, Г. В. Фролов. Библиотека системного программиста. Тома 11-13. Операционная система Microsoft Windows 3.1 для программиста. Часть 1-3. Москва, "Диалог-МИФИ", 1994

9.             А. В. Фролов, Г. В. Фролов. Персональный компьютер - шаг за шагом. Том 2. Операционная система Microsoft Windows 3.1. Москва, "Диалог-МИФИ", 1994

10.          А. В. Фролов, Г. В. Фролов. Персональный компьютер - шаг за шагом. Том 4. Что вы должны знать о своем компьютере, "Диалог-МИФИ", 1994

11.          А. В. Фролов, Г. В. Фролов. Библиотека системного программиста. Том 10. Компьютер IBM PC/AT, MS-DOS и Windows. Вопросы и ответы. Москва, "Диалог-МИФИ", 1994

12.          А. В. Фролов, Г. В. Фролов. Библиотека системного программиста. Том 3. Программирование видеоадаптеров CGA, EGA и VGA. Москва, "Диалог-МИФИ", 1992



Логическая ширина экрана (Offset Register - OFR) (индекс13h)


Регистр позволяет отобразить на экране больше символов в строке, чем в стандартных текстовых режимах. Например, вы можете воспользоваться регистром OFR при переводе видеоадаптера в режим отображения 132 символов в строке.

В текстовых режимах регистр содержит смещение между соседними строками экрана, заданное в 16-битных словах.

В графических режимах регистр OFR задает логическую длину (в 16-битных словах или 32-битных двойных словах) горизонтальной линии развертки. Если линия Num развертки начинается по адресу Adr, то следующая линия развертки Num+1 начинается по адресу Adr+Offset, где Offset является значением регистра OFR.

Использование регистра OFR иллюстрируется рисунком 4.6. На верхней части рисунка видеоадаптер находится в стандартном текстовом режиме с разрешением 80 символов в строке. При этом значение регистра логической ширины экрана равно 40. На нижней части рисунка представлен результат увеличения содержимого регистра до 41. Логическая ширина экрана в этом случае увеличивается до 82 символов в строке. Последние два символа каждой строки не помещаются на экране. Для их отображения надо выполнить горизонтальную свертку экрана.

PICTURE._FIG_38.PCX;6";4.308";PCX

Рисунок 4.6   Логическая ширина экрана



Монитор


В большинстве мониторов устройство отображения представляет собой электронно-лучевую трубку, газоразрядную или жидкокристаллическую панель. Для стационарных компьютеров обычно используются мониторы с ЭЛТ. Газоразрядные и жидкокристаллические панели применяют в переносных и блокнотных компьютерах.

ЭЛТ состоит из электронной пушки (или из трех пушек для цветного монитора), отклоняющей системы и экрана, покрытого слоем люминофора. Все эти устройства помещены в вакуумный баллон. Электронная пушка служит источником электронов, направляемых при помощи отклоняющей системы в нужную часть экрана, где электроны взаимодействуют с покрытием экрана. В результате взаимодействия испускается видимый свет.

Изображение формируется за счет пробега луча электронов слева направо по горизонтальным линиям экрана (строкам развертки). Чтобы глаз не замечал смены кадров, пробег луча по всему экрану происходит с частотой, большей чем 25 Гц.

Луч электронов начинает пробегать по экрану с верхнего левого угла до правого верхнего угла. Когда луч доходит до правой стороны, он гасится и перемещается на следующую горизонтальную линию, находящуюся под предыдущей линией. После того как луч пробежит по всему экрану, он гасится и перемещается в верхний левый угол. Затем процесс повторяется снова. След от луча на экране образует растр (рис. 3.2).

PICTURE._FIG_20.PCX;6";4.308";PCX

Рисунок 3.2   Экран электронно-лучевой трубки

Изменяя силу тока в луче электронов при формировании им растра, можно менять интенсивность свечения отдельных элементов экрана - пикселов. Данные в видеопамяти как раз и определяют, как модулируется луч электронов во время сканирования экрана.

Для решения задач управления лучом электронов служит большинство регистров контроллера электронно-лучевой трубки (контроллера ЭЛТ).



Монитор VGA


D0    P0

D1    P1

D2    P2

D3    P3

D4    P4

D5    P5

D7-D6    Не используются.



Мониторы


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

По типу интерфейса с видеоадаптером мониторы можно разделить на композитные, цифровые и аналоговые RGB. Перечислим основные характеристики каждого из интерфейсов:

       Композитный. Монитор имеет один аналоговый вход. Видеосигнал поступает в монитор в стандарте NTSC (National Television System Commitete). Стандарт NTSC используется в бытовом телевидении. Композитный монитор обычно применяется совместно с видеоадаптером CGA

       Цифровой. Имеет от одной до шести входных линий. На цифровом мониторе может отображаться до 2n различных цветов, где n равно количеству входных линий. Данный тип мониторов используется вместе с видеоадаптерами CGA и EGA

       Аналоговый RGB. Имеет три аналоговые входные линии, управляющие красным, зеленым и синим цветами. Уровень напряжения на каждой линии отвечает за интенсивность соответствующего цвета на экране. Количество цветов, которые может отображать аналоговый монитор, ограничено практически только возможностями видеоадаптера. Аналоговый монитор используется совместно с адаптерами VGA, SVGA, графическими сопроцессорами, акселераторами Windows

Мониторы различаются по размеру зерна. Наибольшее распространение получили мониторы с зерном 0,28 мм, 0,31 мм и 0,39 мм. Мониторы с зерном 0,28 мм несколько дороже чем 0,39 мм, но зато обладают более высоким качеством. Мы рекомендуем приобретать мониторы с разрешением не больше 0,28 мм. На таких мониторах изображение более резкое и при работе за ними меньше устают глаза. Лучшие модели мониторов, например Sony Multiscan 15 SF, имеют зерно 0,25 мм.

Другими важными характеристиками монитора являются значения частот горизонтальной и вертикальной развертки, с которыми он может работать. Частота вертикальной развертки иногда также называется частотой кадров. В зависимости от этих частот и частоты синхросигнала видеоадаптера (описывается ниже) монитор может работать в режимах имеющих различное разрешение.


Мониторы старых моделей, например монохромные мониторы, могут работать только с фиксированными значениями частот горизонтальной и вертикальной развертки. Мониторы, предназначенные для подключения к видеоадаптерам VGA работают с несколькими фиксированными значениями частот развертки. Такие мониторы называют многочастотными. Большинство современных мониторов работают в некотором интервале частот развертки. Поэтому они получили название мультичастотных.

Следует учесть, что некоторые типы мониторов в режимах с большой разрешающей способностью используют метод чересстрочной развертки (Interlaced). При чересстрочной развертке сначала отображаются нечетные, а затем четные строки. Этот позволяет использовать в режимах с высоким разрешением мониторы, работающие с более низкой частотой развертки. К сожалению, использование чересстрочной развертки сопровождается слабым мерцанием изображения, раздражающим глаза. Более предпочтительно использование мониторов и видеоадаптеров, не применяющих метод чересстрочной развертки изображения (NonInterlaced).

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

Проблема заключается в том, что если вы нашли подходящую модель монитора с маленьким размером зерна, например 0,28 мм, это не гарантирует что вам достанется отличный монитор. К сожалению, многие мониторы имеют такие дефекты, как искажение изображения, несведение лучей и т. д. Вам следует посмотреть на несколько мониторов, прежде чем остановить свой выбор.

Убедитесь что монитор имеет действительно маленькие размеры зерна. Проще всего это проверяется при отображении текстовой информации. Контуры символов должны быть четкие и хорошо проработанные. На экране высококачественных мониторов видно, что пикселы имеют квадратную форму. Если буквы "мохнатые", а пикселы отображаются как жирные точки, скорее всего, вам предлагают монитор с размером зерна 0,31 мм или 0,39 мм.



Теперь обратите внимание на дефект, называемый несведением лучей. Отобразите на экране монитора сетку из вертикальных и горизонтальных линий. Для этого можно воспользоваться тестами программы CheckIt. Посмотрите внимательно на границы линий. Их цвет должен соответствовать цвету линий. Если линии белые, а их границы синего или красного цвета - у этого монитора несведение лучей. Обычно несведение лучей наиболее выражено на границах экрана.

Несведение лучей можно наблюдать практически на всех мониторах, даже на очень высококачественных. Единственный простой и доступный способ борьбы с этим дефектом - просмотреть несколько мониторов, сравнить их и выбрать лучший.

Когда вы приобретаете монитор с размером экрана 17 дюймов, то ожидаете, что 17 дюймов это не размер корпуса монитора или электронно-лучевой трубки, а размер изображения на экране. Вооружитесь обычной линейкой и измерьте диагональ изображения на экране монитора. Она должна максимально соответствовать данным из паспорта данной модели. Если это не так, возможно лучше выбрать другой монитор.

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

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

Современные видеоадаптеры и мониторы обладают возможностью временного отключения при длительном перерыве в работе с компьютером. В этом случае монитор переходит в экономичный режим и потребляет очень мало электроэнергии.

Фактически вы уже знакомы с возможностью отключения монитора. В серии "Персональный компьютер - шаг за шагом" мы рассказывали о программах сохранения экрана, которые могут гасить изображение.



Параметры наиболее распространенных мониторов, применяемых на компьютерах, совместимых с IBM PC/XT/AT, приведены в следующей таблице :

Монитор

Совместимый с монитором видеоадаптер

Количество цветов

Разрешение в текстовом режиме

Разрешение в графическом режиме

Монохромный (MD)

MDA, Hercules, EGA

2

80х25

640х350

720х350

720х348

Цветной (CD)

CGA, EGA

16

40x25

80x25

320x200

640x200

Улучшенный цветной (ECD)

CGA, EGA

16 из 64

80х25

320х200

640х200

640х350

Многочастотный цифровой

CGA, EGA

16 из 64

40x25

80х25

320x200

640х200

640х350

Многочастотный аналоговый

VGA, SVGA

256

80x25

640x480

800х600

Цветной VGA

VGA

256

40х25

80х25

320х400

640х400

Монохромный VGA

VGA

256

40х25

80х25

320х350

640х350

720х350

720х400

720х480

       Монохромный монитор

Первоначально компьютер IBM PC выпускался с монохромным монитором фирмы IBM (MD) и монохромным видеоадаптером (MDA). Видеоадаптер MDA не предоставляет возможности отображения графики и цвета, но за счет высокой разрешающей способности - 720х350 пикселов - он широко используется для приложений, работающих с текстами.

Монохромный монитор фирмы IBM и совместимые с ним видеоадаптеры используют частоту кадров, равную 50 Гц.

       Цветной монитор

Цветной монитор фирмы IBM (CD - Color Display) используется совместно с адаптером CGA и обеспечивает отображение четырех различных цветов для графики и восьми цветов для текста. Сам цветной монитор имеет возможность отображать шестнадцать различных цветов. Разрешение цветного монитора меньше, чем у монохромного - 640х200 и размер символов составляет 8 пикселов (пиксел - минимальный элемент изображения) по высоте и 8 пикселов по ширине. В результате заметно, что символы состоят из отдельных пикселов. С появлением улучшенного цветного монитора, имеющего большую разрешающую способность, этот недостаток был устранен.

Цветной монитор имеет частоту смены кадров, равную 60 Гц.



       Улучшенный цветной монитор

Улучшенный цветной монитор создан для использования совместно с видеоадаптером EGA. Он имеет большую разрешающую способность - 640х350 и может отображать большее количество цветов (любые 16 из 64), чем обычный цветной монитор. Символы имеют размер 8 пикселов по ширине и 14 пикселов по высоте.

       Многочастотный цветной монитор

Этот монитор имеет возможность работать с различной частотой кадров, что позволяет поддерживать режимы с различной разрешающей способностью. Обычно эти мониторы имеют разрешающую способность 640х350, (что соответствует EGA) и выше - 640х400, 640x480, 800x600, 1024x768. Последние два режима реализуются только видеоадаптерами SVGA.

Многочастотный цветной монитор может воспроизводить больше цветов, чем улучшенный цветной монитор. При работе в цифровом режиме он имеет те же 64 цвета, что и ECD, а при работе в аналоговом режиме он может отображать практически неограниченное число цветов. Большинство многочастотных мониторов можно использовать совместно с VGA. Первые модели многочастотного монитора фирмы NEC видеоадаптер VGA не поддерживали.

       Монитор VGA

Для видеоадаптера VGA фирмой IBM был разработан аналоговый RGB монитор с высоким разрешением, а также монохромный аналоговый монитор с высоким разрешением. На монохромном мониторе различные цвета изображаются различными градациями серого цвета. Эти два монитора (монохромный и цветной) являются взаимозаменяемыми - приложения, написанные для одного из монитора, могут работать с другим монитором.


Монохромный монитор


D2-D0    Не используются.

D3    Видео выход.

D4    Интенсивность.

D7-D5    Не используются.



Начальная линия курсора (Cursor Start Register - CSR) (индекс0Ah)


Регистр CSR является доступным как для чтения, так и для записи. Регистр определяет линию сканирования символа, в которой начинается курсор. Вместе с регистром конечной линии курсора (CER) регистр CSR определяет размер и форму курсора.

D4-D0    Начальная линия курсора. (Рис. 4.3).

D5    Бит гашения курсора. Реализован только для видеоадаптеров VGA и SVGA. Если бит D5 содержит единицу, тогда текстовый курсор гаснет.

D7-D6    Не используются.

При установке режима работы видеоадаптера, BIOS загружает в регистр CSR  следующие значения:

Режим

0,1,2,3

4,5,6,D,E,F,10

7

Содержимое регистра

06

00

0Bh



Начало импульса гашения луча горизонтальной


Регистр используется видеоадаптерами EGA, VGA и SVGA для определения начала импульса гашения луча горизонтальной развертки.

При установке режима работы видеоадаптера, BIOS загружает в регистр SHBR следующие значения:

Режим

0,1,4,5,D

2,3

6,E

7,F

10

Содержимое регистра

2Dh

5Ch

59h

56h

53h

Если используется улучшенный цветной монитор, то эти значения отличаются:

Режим

0,1

2,3

Содержимое регистра

2Bh

53h