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

         

Установить/определить размер регистров ЦАП


Видеоадаптеры VGA и SVGA содержат три ЦАП, каждый из которых определяет цвет одной из трех компонент цвета пиксела - красной, зеленой и синей.

ЦАП стандартного видеоадаптера VGA отводит по шесть бит на определение каждой из этих компонент. Видеоадаптеры SVGA, имеющие переключаемый ЦАП, поддерживают переменное количество бит на каждую компоненту цвета. Чтобы определить обладает ли видеоадаптер переключаемым ЦАП следует воспользоваться функцией 4F00h.

Функция 4F08h содержит две подфункции, выбираемые регистром BL. Первая подфункция BL = 0 позволяет установить количество бит используемых на каждый чистый цвет. Вторая подфункция BL = 1 позволяет определить количество бит используемых на каждый чистый цвет.

На входе:

AH

4Fh

AL



08h

BL

00h

BH

Количество бит на каждый чистый цвет

BL

01h

На выходе:

AL

4Fh

AH

Результат: 0, в случае успешного завершения, 1 в случае ошибки

BH

Количество бит на каждый чистый цвет



Установить/определить видимую область экрана


Функция 4F07h содержит две подфункции, выбираемые регистром BL. Первая подфункция BL = 0 позволяет установить логические координаты пиксела, отображаемого в левом верхнем углу экрана. Установка новых логических координат позволяет отобразить на экране другую область видеобуфера. В частности, вы можете с помощью функции 4F06h выбрать логическую длину линии развертки больше физической, а затем плавно сворачивать изображение на экране.

Вторая подфункция BL = 1 определить текущие координаты первого пиксела на экране.

На входе:

AH

4Fh

AL

07h

BH

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

BL

00h Установить начало видимой области монитора

CX

Первый (слева) видимый символ в строке развертки

DX

Первая видимая строка развертки

BL

01h Определить начало видимой области монитора

BH

00h

CX

Первый видимый символ в строке развертки

DX

Первая видимая строка развертки

На выходе:

AL

4Fh

AH

Результат: 0, в случае успешного завершения, 1 в случае ошибки

       Данная функция доступна в текстовых режимах, при условии, что значения длинны строки развертки и количества строк развертки умножаются на соответствующие значения размера символов



Установить режим видеоадаптера


Функция предназначена для установки режима работы видеоадаптера. Вы можете использовать ее для выбора любого из режимов, описанных в спецификации VBE и поддерживаемых видеоадаптером. Перед вызовом данной функции рекомендуется проверить, поддерживает ли адаптер данный режим. Для этого можно воспользоваться функцией 01h VBE.

На входе:

AH

4Fh

AL

02h

BX

Номер режима VESA. Номера режимов VESA перечислены в главе "Режимы работы видеоадаптеров"

На выходе:

AL

4Fh

AH

Результат: 0, в случае успешного завершения, 1 в случае ошибки

Перед вызовом функции вы должны занести в регистр BX номер режима VESA, который необходимо установить. Старший бит регистра BX (бит D15) определяет, будет ли выполняться очистка видеопамяти. Если бит D15 равен единице, тогда  видеопамять не очищается.

Бит D14 управляет адресацией видеопамяти. Если бит D14 равен единице, функция устанавливает режим видеоадаптера, используя 32-битную адресацию защищенного режима видеопамяти. В этом случае вы можете получить адрес начала и размер видеобуфера при помощи функции 01h (см. выше).



Установка цвета рамки - подфункция 01h


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

На входе:

AH

10h

AL

01h - установка цвета рамки

BH

Значение, записываемое в регистр (цвет)

На выходе:

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

Программа BORDER, приведенная в листинге 5.4, использует подфункцию 01h для изменения цвета рамки экрана.

Листинг 5.4. Файл BORDER.C

#include <dos.h>

#include <stdio.h>

#include <conio.h>

void main(void);

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

void main(void) {

 

union REGS         inregs, outregs;

 

unsigned char   i;

 

// Пробуем 16 цветов для рамки

 

for(i = 0; i < 16; i++) {

               

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

               

inregs.h.ah = 0x10;                           

               

// Подфункция установки цвета рамки

               

inregs.h.al = 0x1;               

               

// Номер нового цвета рамки

               

inregs.h.bh = i;

               

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

               

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

               

printf("\nДля изменения цвета рамки "

                                                 

"нажмите любую клавишу...");

               

getch();

 

}

}



Установка цветовой палитры (режимы 4,5,6) - функция 0Bh


Данная функция позволяет выбрать одну из двух стандартных цветовых палитр (см. таблицу 9.1). Функция используется для обеспечения совместимости с видеоадаптером CGA и предназначена для использования в текстовых режимах и графических режимах с низким разрешением.

Функция 0Bh имеет следующий формат вызова:

На входе:

AH

0Bh

BH

0, тогда

BL

Цвет фона и рамки (для графического режима) или цвет рамки (для текстового режима)

BH

1, тогда

BL

Номер палитры (0 или 1)

На выходе:

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

В следующей таблице описаны стандартные цветовые палитры для режимов 4, 5, 6:

Номер цвета

Палитра 0

Палитра 1

0

Цвет фона

Цвет фона

1

Зеленый

Синий

2

Красный

Фиолетовый

3

Желтый

Белый



Установка набора символов 8х8 из ПЗУ BIOS


На входе:

AH

11h

AL

23h установка вектора прерывания 43h

BL

Количество строк текста, отображаемых на экране монитора:

0 - количество строк определяется регистром DL;

1 - 14 строк;

2 - 25 строк;

3 - 43 строки

DL

Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю

На выходе:

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



Установка набора символов 8х14 из ПЗУ BIOS


На входе:

AH

11h

AL

22h - установка вектора прерывания 43h

BL

Количество строк текста, отображаемых на экране монитора:

0 - количество строк определяется регистром DL;

1 - 14 строк;

2 - 25 строк;

3 - 43 строки

DL

Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю

На выходе:

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



Установка набора символов 8х16 из ПЗУ BIOS


На входе:

AH

11h

AL

24h установка вектора прерывания 43h

BL

Количество строк текста, отображаемых на экране монитора:

0 - количество строк определяется регистром DL;

1 - 14 строк;

2 - 25 строк;

3 - 43 строки

DL

Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю

На выходе:

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



Установка набора символов для графических режимов - подфункция 21h


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

На входе:

AH

11h

AL

21h - установка вектора прерывания 43h

ES:BP

Адрес таблицы символов, определенной пользователем

CX

Количество байт, кодирующих один символ в таблице символов

BL

Количество строк текста, отображаемых на экране монитора:

0 - количество строк определяется регистром DL;

1 - 14 строк;

2 - 25 строк;

3 - 43 строки

DL

Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю

На выходе:

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



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


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

На входе:

AH

10h

AL

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

BX

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

CX

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

ES:DX

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

На выходе:

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

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



Установка палитры из градаций серого цвета - подфункция 1Bh


Функция заполняет часть таблицы цветов значениями, соответствующими различным оттенкам серого цвета. Для каждого модифицируемого регистра таблицы цветов сначала читаются записанные в нем данные, а затем записываются обратно по следующему правилу: красного 30 - процентов, зеленого - 59 процентов и голубого - 11 процентов от считанного значения.

На входе:

AH

10h

AL

1Bh - установка палитры из градаций серого цвета

BX

Номер первого регистра таблицы цветов

CX

Количество модифицируемых регистров

На выходе:

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

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

mov        ah,10h

mov        al,1Bh

; Номер первого модифицируемого регистра

mov        bx,first_num

; Номер последнего модифицируемого регистра

mov        cx,end_num

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

sub         cx,bx

int           10h

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

Листинг 5.5. Файл BIOSDAC.C

#include <conio.h>

#include <stdio.h>

#include <dos.h>

#include "sysp.h"

typedef struct _RGB_ {

 

unsigned char red;

 

unsigned char green;

 

unsigned char blue;

} RGB;

// Объявление функций

void        main(void);

void        SetVideoMode(unsigned char);

void        SetVgaDAC(unsigned, unsigned);

void        GrayScale(void);

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

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

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

void main(void)

{

 

RGB color_table[256];

 

unsigned char   i,j;

 

unsigned char   far *ptr;

 

int error, x_num, y_num;

 

unsigned seg_table,off_table;

 

// Формируем новые значения для таблицы цветов

 

for(j = 0; j < 4; j++) {

               

for(i = 0; i < 64; i++) {


                                (color_table[i+j*64]).red =

                                                (j == 0) ? i : (j == 4) ? i : 0;

                                (color_table[i+j*64]).green =

                                                (j == 1) ? i : (j == 3) ? i : (j == 4) ? i : 0;

                                (color_table[i+j*64]).blue =

                                                (j == 2) ? i : (j == 3) ? i : (j == 4) ? i : 0;

                }

  }

  // Устанавливаем режим номер 13h

  SetVideoMode(0x13);

  ptr = (unsigned char far*) &color_table[0];

  seg_table = FP_SEG(ptr);

  off_table = FP_OFF(ptr);

  // Загружаем таблицу цветов

  SetVgaDAC(seg_table,off_table);

  // Записываем данные в видеопамять

  ptr = (unsigned char far*) (FP_MAKE(0xA000, 0x0));

  for(y_num = 0; y_num < 200; y_num++) {

                for(x_num = 0; x_num < 320; x_num++) {

                                *ptr = (unsigned char) x_num;

                                ptr++;

                }

  }

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

  getch();

  // Преобразовываем данные в таблице цветов к серому цвету

  GrayScale();

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

  getch();

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

  SetVideoMode(0x3);

}

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

// Функция установки режима

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

void SetVideoMode( unsigned char vmode ) {

  union REGS regs;

  regs.h.ah = 0x0;

  regs.h.al = vmode;

  int86(0x10, &regs, &regs);

}

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

// Функция загрузки таблицы цветов

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

void SetVgaDAC(unsigned seg_table, unsigned off_table) {

  union REGS regs;

  struct SREGS segregs;

  regs.x.ax = 0x1012;

  regs.x.cx = 256;

  regs.x.bx = 0x00;

  segregs.es = seg_table;

  regs.x.dx = off_table;

  int86x(0x10, &regs, &regs, &segregs);

}

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

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

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

void GrayScale( void ) {

  union REGS regs;

  regs.x.ax = 0x101b;

  regs.x.cx = 256;

  regs.x.bx = 0x00;

  int86(0x10, &regs, &regs);

}


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


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

На входе:

AH

10h

AL

00h - установка регистра палитры

BL

Номер регистра палитры для записи

BH

Данные, записываемые в регистр палитры

На выходе:

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

Следующий фрагмент записывает в регистр палитры с номером reg_num содержимое переменной data:

mov        ah,10h                   ; Функция 10h

xor          al,al                                        ; Подфункция 0h

mov        bl,num_reg           ; Задаем номер регистра палитры

mov        bh,data                  ; Новое значение регистра

int           10h



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


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

На входе:

AH

10h

AL

10h - установка регистра таблицы цветов

BX

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

DH

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

CH

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

CL

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

На выходе:

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

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

mov        ah,10h

; Выбираем функцию установки регистра цветов

mov        al,ah

; Устанавливаем номер регистра таблицы цветов

mov        bx,num_reg

; Определяем величины красной, зеленой и синей составляющих

mov        dh,red

mov        ch,green

mov        cl,blue

int           10h



Установка вектора прерывания 1Fh - подфункция 20h


Используется в графических режимах 4, 5 и 6 (совместимых с CGA), если необходимо отображать одновременно больше 128 символов. Вектор 1Fh указывает на таблицу с дополнительными 128 символами, имеющими коды ASCII от 127 до 255. Программа должна поддерживать таблицы для дополнительных символов. Размер символов должен быть 8х8 пикселов.

На входе:

AH

11h

AL

20h - установка вектора прерывания 1Fh, который хранит адрес таблицы дополнительных символов

ES:BP

Адрес таблицы дополнительных символов, определенной пользователем

На выходе:

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



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


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

На входе:

AH

10h

AL

02h - установка регистров палитры и регистра цвета рамки

ES:DX

Адрес таблицы с новыми значениями регистров

На выходе:

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



Увидеть весь мир через замочную скважину


Многие современные видеоадаптеры применяют давно известный прием, ранее использовавшийся для подключения к компьютеру дополнительной памяти. Центральный процессор получает доступ к видеопамяти через небольшое окно. Это окно может иметь небольшой размер - до 64 Кбайт и располагаться в адресном пространстве процессора. Обычно окно занимает адресное пространство A000:0000h - A000:FFFFh, то есть расположено также как и для стандартных цветных режимов видеоадаптеров EGA, VGA и SVGA. Процессор компьютера может перемещать это окно по всей видеопамяти адаптера получая доступ к разным ее участкам.

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

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

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

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

Чтобы немного помочь программистам в решении этих и многих других задач, некоторые реализации видеоадаптеров SVGA отводят для доступа к видеопамяти не одно, а два окна. Обычно они обозначаются как окно A и окно B. В некоторых моделях видеоадаптеров через одно окно можно только записывать данные в видеопамять, а через другое только читать из видеопамяти.



Видеоадаптеры SVGA


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

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

Естественно, чтобы расширить возможности видеоадаптера VGA, пришлось дополнить его новыми регистрами. Видеоадаптеры SVGA имеют значительно больше регистров, чем простые видеоадаптеры VGA. Чтобы видеоадаптер SVGA смог проявить все свои возможности, необходимо, чтобы программное обеспечение правильно использовало все регистры видеоадаптера.

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

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

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



Видеопамять


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

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

Для операции чтения в каждый момент времени может быть разрешен только один цветовой слой. Читаемый слой определяется регистром выбора читаемого цветового слоя.

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

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

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

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



Видеопамять SVGA


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

Лучшие режимы VGA

Типичные режимы SVGA

640 x 480; 16 цветов

800 x 600; 256, 64 К, 16,7 М цветов

320 x 200; 256 цветов

1024 x 768; 256, 64 К, 16,7 М цветов

1280 x 1024; 256, 64 К, 16,7 М цветов

Чтобы иметь возможность отображать большое количество цветов при большой разрешающей способности, видеоадаптер SVGA должен иметь значительно больше видеопамяти, чем адаптер VGA. Например, для реализации режима с разрешением 1024 x 768 пикселов и возможностью одновременного отображения 64 К цветов необходима видеопамять объемом 1,6 Мбайт.

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



Видеопамять в графических режимах


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

Ниже рассмотрена структура видеопамяти отдельно для каждого графического режима.



Видеоподсистема компьютера


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

Видеоадаптер может быть оформлен в виде отдельной платы, вставляемой в слот расширения компьютера, или может быть расположен непосредственно на системной плате компьютера.

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

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

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

Существует несколько основных способов формирования изображения на экране монитора. Наиболее распространены так называемые мониторы с электронно-лучевыми трубками (ЭЛТ). Вы наверняка знакомы с электронно-лучевыми трубками. Они используются практически во всех бытовых телевизионных приемниках.

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

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


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

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

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

Вскоре появился и первый видеоадаптер, позволяющий отображать не только монохромную, но и цветную информацию, как в текстовом, так и в графическом режиме. Этим видеоадаптером стал адаптер CGA. С его помощью компьютер мог выводить 16-цветную текстовую и 4-цветную графическую информацию. Однако он имел очень низкую разрешающую способность - 320х200 пикселов (пиксел - элементарный элемент изображения, точка). В результате такой низкой разрешающей способности изображение на экране представляло собой совокупность видимых точек и быстро утомляло глаза пользователя.

Видеоадаптер CGA можно использовать с композитными мониторами (обычными цветными или черно-белыми бытовыми телевизорами), а также со специальными цифровыми цветными мониторами.

Затем прогресс пошел по пути увеличения разрешающей способности и количества одновременно отображаемых цветов. Были созданы видеоадаптеры EGA и VGA. Видеоадаптер EGA уже мог отображать 16-цветную графическую информацию с разрешением 640х350 пикселов, а VGA - даже с разрешением 800х600 пикселов. Кроме того, в видеоадаптере VGA появился графический режим с разрешением 320х200 пикселов при возможности одновременного отображения 256 различных цветов.



С видеоадаптером EGA можно было использовать либо цветной монитор, либо улучшенный цветной монитор. К видеоадаптерам VGA нужно подключать специальные многочастотные аналоговые мониторы.

Однако с появлением операционной системы Windows требования к видеоподсистеме компьютера многократно возросли. Ни видеоадаптер EGA, ни видеоадаптер VGA не обеспечивают необходимой разрешающей способности и количества одновременно отображаемых цветов. Поэтому многие фирмы приступили к выпуску собственных расширенных версий видеоадаптера VGA. Они получили общее название SVGA (Super VGA). Видеоадаптеры SVGA не являются устоявшимся стандартом, наподобие EGA и VGA. Различные фирмы выпускают адаптеры SVGA, имеющие различные возможности. При этом они не всегда совместимы друг с другом.

Появились видеоадаптеры SVGA, которые работают в режимах High Color и True Color. В режиме High Color видеоадаптер может одновременно отображать на экране 32768 или 65536 различных цветов. Режим True Color еще более многоцветный. В этом режиме видеоадаптер может одновременно отображать более чем 16,7 миллионов различных цветов. Качество изображения, достигаемое такими видеоадаптерами (при условии использования с ними соответствующих мониторов), почти не уступает качеству цветных слайдов.

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

Видеопамять адаптера CGA имела объем всего 16 Кбайт. На современных адаптерах устанавливают как минимум 256 Кбайт памяти. Такого объема видеопамяти достаточно для отображения 16 различных цветов при разрешении 800х600 пикселов. Режимы с большим разрешением или с большим количеством цветов недоступны.

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

Количество

Разрешение

цветов

640х480

800х600

1024х768

1280х1024

1600х1200

16 

150

235

384

640

938

256

300

469

768

1280

1875

65.536

600

938

1536

2560

3750

16777216

900

1407

2304

3840

5625

<


/p> Например, в режиме видеоадаптера, когда он одновременно отображает 16,7 миллионов цветов при разрешении 1024х768 пикселов, объем видеопамяти должен составлять 2304 Кбайт. Когда вы будете приобретать новый видеоадаптер, следите, чтобы он имел достаточный для вас объем видеопамяти.

Выпускаются адаптеры с видеопамятью двух типов - DRAM (динамическая оперативная память) и VRAM (специальная видеопамять). Различие между DRAM и VRAM состоит в том, что к памяти VRAM могут одновременно и независимо получить доступ два устройства. Поэтому VRAM иногда называют двух портовой памятью.

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

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

Для облегчения использования графических сопроцессоров вместе с ними поставляются драйверы к различным операционным системам и отдельным программам. Большинство видеоадаптеров продаются с драйверами для операционных систем Windows и OS/2, а также с драйверами для системы автоматизированного проектирования AutoCAD. Таким образом, в большинстве случаев у вас нет необходимости самим программировать графические сопроцессоры.

Частным случаем видеоадаптеров с графическими сопроцессорами являются графические акселераторы. Они специально предназначены для повышения производительности видеоподсистемы компьютера при работе в среде Windows  (а также Windows NT, OS/2). Ориентация таких видеоадаптеров на Windows состоит в том, что они могут выполнять характерные для Windows операции с изображениями на аппаратном уровне. Например, они могут аппаратно реализовывать указатель (курсор) мыши размером 64х64 пиксела, могут аппаратно выполнять перемещение окон по экрану и т. д. Во всех этих случаях акселератор Windows, выполняет работу, которую при использовании обычных видеоадаптеров VGA и SVGA, делал центральный процессор компьютера.



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

Чтобы увеличить производительность работы видеоадаптеров, на новых моделях видеоадаптеров устанавливают 64-разрядные графические сопроцессоры. Они значительно превосходят старые 16 и 32-разрядные модели адаптеров. Примером видеоадаптера с 64-разрядным графическим сопроцессором может служить плата Diamond Stealth 64.

Практически все платы графического акселератора и графические сопроцессоры могут работать в режимах High Color и True Color. Однако при таких объемах изображения, которые хранит видеопамять в режимах High Color и True Color, количество информации, передаваемое из оперативной памяти компьютера в видеопамять адаптера становится просто огромно. В этом случае замедление в отображении становиться видимым даже при использовании видеоадаптером прямого доступа к оперативной памяти компьютера.

Узким местом становиться системная шина компьютера. Пропускная способность системных шин компьютера EISA и ISA не превышает 10 Мбайт/с. Все современные видеоадаптеры подключаются к локальной шине процессора. Такой способ подключения видеоадаптера обеспечивает высокую скорость обмена информацией между оперативной памятью компьютера и центральным процессором с одной стороны и видеоадаптером с другой. Высокая скорость обмена информацией между компьютером и видеоадаптером, в свою очередь, гарантирует высокую производительность видеоподсистемы компьютера. Сегодня выпускаются видеоадаптеры, предназначенные для подключения к локальным шинам VLB и PCI.


Включить режим сохранения электроэнергии


Функция устанавливает один из режимов, определенных в спецификации VBE/PM. Перед установкой режима, следует убедиться, что он доступен вашей видеосистеме. Для этого следует воспользоваться функцией 4F10h.

На входе:

AH

4Fh

AL

10h

BL

01h

BH

Режим:

00h - установить режим ON (включить монитор);

01h - установить режим STANDBY (погасить экран);

02h - установить режим SUSPEND (отключить развертку);

04h - установить режим OFF (выключить монитор);

08h - установить режим REDUSED ON (уменьшить яркость)

На выходе:

AL

4Fh - функция поддерживается;

в противном случае функция не поддерживается

AH

0, в случае успешного завершения,

1 в случае ошибки

BH

Не изменяется



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


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

При разработке видеоадаптеров VGA и SVGA внешние регистры были объединены с остальными регистрами в одной микросхеме, но название внешние сохранилось.

Каждому внешнему регистру соответствует порт ввода/вывода.



Восстановление текущего состояния видеоадаптера - подфункция 02h


Функция восстанавливает состояние видеоадаптера из буфера, заполненного подфункцией 01h.

На входе:

AH

1Ch

AL

02h - восстановление состояния видеоадаптера

CX

Тип восстанавливаемых данных:

D0 - регистры видеоадаптера,

D1 - область переменных BIOS,

D2 - таблица цветов (регистры ЦАП)

ES:BX

Адрес буфера данных состояния видеоадаптера

На выходе:

AL

1Ch



Вторая таблица символов текстового режима


Для видеоадаптера VGA вы можете определить второй набор из 256 символов. Формат второй таблицы символов текстового режима полностью соответствует таблице символов текстового режима.



о видеоадаптерах. За несколько лет,


В третьем томе "Библиотеки системного программиста", который называется "Программирование видеоадаптеров CGA, EGA и VGA", мы уже рассказывали вам о видеоадаптерах. За несколько лет, прошедших с момента выхода в свет этого тома, появилось много новых моделей видеоадаптеров, обеспечивающих большую разрешающую способность и большее количество одновременно отображаемых цветов.
Сегодня видеоадаптеры MDA, CGA, Hercules и EGA вытеснены различными моделями адаптеров VGA и SVGA. Поэтому мы убрали материал, относящийся только к этим видеоадаптерам и добавили информацию о видеоадаптерах SVGA. В частности нами описан стандарт VESA, которому соответствуют многие адаптеры SVGA. Благодаря стандарту VESA вы сможете легко программировать видеоадаптеры в режимах с большим разрешением и большим количеством цветов.
Нами подробно описана архитектура видеоадаптеров, совместимых с VGA, их регистры. Воспроизводится формат регистров и описывается их назначение. В наиболее интересных случаях представлены программы, использующие непосредственный доступ к регистрам. Читатель сможет получить на экране своего компьютера видеоэффекты, недоступные при использовании только функций BIOS или функций библиотек трансляторов языков высокого уровня.
Читателю предоставляется возможность подробно рассмотреть стандартные режимы работы видеоадаптеров, структуру видеопамяти в этих режимах. Знание структуры видеопамяти позволяет создавать программы, отображающие информацию на экране путем непосредственного доступа к видеопамяти. А это, в свою очередь, важно при создании быстрых видеопрограмм, в частности, динамических игр и графических редакторов.
В качестве примера рассмотрены два не стандартных режима видеоадаптера VGA. Эти режимы не поддерживаются функциями BIOS и позволяют в режиме с 256 цветами иметь большую разрешающую способность.
Далее в книге излагаются традиционные методы управления видеоадаптерами. Приведен обзор всех прерываний и функций BIOS, предназначенных для работы с видеоадаптерами. Описываются наиболее важные функции стандартной библиотеки трансляторов Borland C++. Применение каждой группы функций иллюстрируется примерами программ.
Большое количество программ, составленных с использованием таких распространенных языков программирования, как Си и ассемблер, значительно облегчают понимание материала, изложенного в книге.
Дополнительно к книге можно купить дискету, содержащую исходные тексты всех разработанных нами программ, описанных в книге. Если вас интересуют сведения, которые были включены в третий том "Библиотеки системного программиста", но не вошли в это издание, вы можете отдельно приобрести дискету с гипертекстовой базой данных.

Выбор активного монитора - подфункция 35h


Используется в системе PS/2 для переключения между видеоадаптером VGA, расположенным на системной плате компьютера, и дополнительным видеоадаптером. Функция работает даже если между видеоадаптерами существует конфликт по адресам видеопамяти или адресам портов ввода/вывода. Система PS/2 после загрузки в качестве первичного видеоадаптера использует дополнительный.

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

На входе:

AH

12h

BL

35h - выбор активного монитора для PS/2

ES:DX

Адрес буфера. Размер буфера должен составлять 128 байт

AL

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

1 - включить видеоадаптера VGA, расположенный на системной плате (должно быть использовано при втором вызове функции),

2 - выключить активный видеоадаптер (используется в последующих вызовах функции),

3 - включить неактивный видеоадаптер (используется в последующих вызовах функции)

На выходе:

AL

12h



Выбор активной страницы видеопамяти - функция 05h


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

На входе:

AH

05h

AL

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

На выходе:

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



Выбор активных таблиц знакогенератора - подфункция 03h


Программа через эту функцию может установить активные таблицы знакогенератора. Напомним, что видеоадаптер EGA имеет четыре таблицы, одна или две из которых могут быть активными, а VGA - восемь. Каждая таблица содержит 256 символов. Одновременно могут отображаться 512 символов. Номер используемой таблицы определяется битом D3 байта атрибутов символа.

На входе:

AH

11h

AL

03h - выбор активных таблиц знакогенератора

BL

Выбирает активные таблицы:

D1-D0    номер таблицы, используемой, когда бит D3 атрибута равен нулю;

D3-D2    номер таблицы используемой, когда бит D3  атрибута равен единице;

D4           только для VGA. Расширение для битов D0 и D1;

D5           только для VGA. Расширение для битов D2 и D3;

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

На выходе:

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



Выбор количества линий развертки в текстовом режиме - подфункция 30h


Функция используется для получения на видеоадаптере VGA текстовых режимов, внешне не отличающихся от CGA или MDA.

На входе:

AH

12h

BL

30h - выбор числа линий развертки

AL

Количество строк развертки:

0 - 200 строк развертки, размер символа 8х8 пикселов,

1 - 350 строк развертки, размер символа 8х14 пикселов,

2 - 400 строк развертки, размер символа 8х16 пикселов

На выходе:

AL

12h

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



Выбор подмножества цветов - подфункция 13h ???


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

На входе:

AH

10h

AL

13h - выбор подмножества цветов

BL

 0 - выбор режима

BH

0 - 4 подмножества из 64 цветов

1 - 16 подмножеств из 16 цветов

BL

1 - выбор активного подмножества

BH

Номер подмножества (0-4 или 0-15)

На выходе:

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

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

; Выбираем режим (bh = 1)

mov        ah,10h

mov        al,13h

xor          bx,bx

inc          bh

int           10h

; Устанавливаем активное подмножество subset_num

mov        ah,10h

mov        al,13h

mov        bl,1

mov        bh,subset_num

int           10h



Выбор программы печати экрана - подфункция 20h


Программа, распечатывающая содержимое экрана монитора по нажатию клавиши <Print Screen>, не работает в режиме 43 текстовых строк. Если вы желает иметь эту возможность, можете выбрать альтернативную программу печати экрана, воспользовавшись подфункцией номер 20h:

На входе:

AH

12h

BL

20h - выбор альтернативной программы печати экрана монитора

На выходе:

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



Выбор режима работы - функция 00h


Функция 00h прерывания 10h позволяет задать любой стандартный режим работы видеоадаптера:

На входе:

AH

00h

AL

Номер устанавливаемого режима работы  видеоадаптера, если бит D7 = 1, то  при установке режима видеопамять не очищается

На выходе:

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

Приведем пример выбора режима видеоадаптера:

mov        ah, 0

mov        al, 3        ; Выбираем режим номер 3 (16 цветной, текстовый,

int           10h         ; разрешение 25х80 символов)



Высота символов текста (Max Scan Line Register - MSLR) (индекс9)


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

D4-D0    Биты задают высоту символа в пикселах (рис. 8.2 и 8.3).

D5    Бит 9 регистра начала импульса гашения вертикальной развертки (SVBR - индекс 15h). Используется только для видеоадаптеров VGA и SVGA.

D6    Бит 9 регистра сравнения линий (LCR индекс 18h). Используется только для видеоадаптеров VGA и SVGA.

D7    Бит управления двойным сканированием. Поддерживается только адаптерами VGA и SVGA. Если бит D7 равен единице, то в режимах, имеющих разрешение по вертикали 200 пикселов используется двойное сканирование. Это увеличивает разрешающую способность по вертикали до 400 пикселов.

Рисунок 4.2 демонстрирует использование регистра высоты символов текста. На левой половине рисунка символы шрифта имеют размер 8х8 пикселов, а регистр высоты символов содержит число семь. На правой половине рисунка, символы шрифта имеют размер 8х14, а значение регистра высоты символов текста равно тринадцати.

PICTURE._FIG_33.PCX;6";4.308";PCX

Рисунок 4.2   Высота символов текста 8 пикселов



Вывод пиксела - функция 0Ch


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

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

Формат вызова функции 0Ch представлен ниже:

На входе:

AH

0Ch

AL

Номер цвета (значение ячейки видеопамяти, соответствующее пикселу)

BH

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

CX

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

DX

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

На выходе:

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

Во всех режимах (кроме режима номер 13h) если бит D7 регистра AL содержит единицу, то новый пиксел накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ.

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

Номер режима

Используемые номера цветов

4, 5

0 - 3

6

0 и 1

0Dh

0 - 15

0Eh

0 - 15

0Fh

0 и 1

10h

0 - 15

Начало системы координат находится в левом верхнем углу экрана. Оси координат направлены следующим образом: ось X - вправо, ось Y - вниз. Далее, если особо не оговорено, мы всегда будем использовать эту систему координат.

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

Листинг 5.2. Файл BIOS_C.C

#include <dos.h>

#include <stdio.h>

#include <conio.h>

void main(void);

void main(void) {

 

union REGS         inregs, outregs;

 

unsigned char   i, j;

 

// Устанавливаем режим 4  видеоадаптера


  // (графический - 320х200 пикселов, 4 цвета)

  inregs.h.ah = 0x0;

  inregs.h.al = 0x4;

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

  // Устанавливаем цвет фона

  inregs.h.ah = 0x0B;

  inregs.h.bh = 0x0;             // устанавливаем цвет фона

  inregs.h.bl = 0x6;              // номер устанавливаемого цвета фона

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

  for(i = 0; i < 2; i++) {

                // Устанавливаем цветовую палитру

                inregs.h.ah = 0x0B;

                inregs.h.bh = 0x1;               // установка палитры

                inregs.h.bl = i;                      // номер палитры

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

                // Выводим массив точек

                for(j = 0; j < 64; j++) {

                                inregs.h.ah = 0x0C;

                                // Номер цвета

                                inregs.h.al = (unsigned char)(j / 16);

                                // X-координата точки

                                inregs.x.cx = 0x10 + j;

                                // Y-координата точки

                                inregs.x.dx = 0x10 + j;      

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

                }

                getch();

  }

}

Вывод символов - функция 02h


Вывод символа на экран через стандартный поток вывода.

На входе:

AH

02h

DL

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

На выходе:

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

Данная функция обрабатывает нажатие комбинации клавиш <Ctrl+Break>.



Вывод строки на экран монитора - функция 09h


Выводит строку на экран монитора. Строка отображается, начиная с текущей позиции курсора. Строка должна оканчиваться символом '$' (код ASCII 24h). Строка может включать управляющие символы.

На входе:

AH

09h

DS:DX

Адрес отображаемой строки

На выходе:

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

Данная функция обрабатывает нажатие комбинации клавиш <Ctrl+Break>.



Вывод текстовой строки - функция 13h


Функция 13h предоставляет широкие возможности для вывода текстовых строк на экран монитора. В зависимости от параметров функции, можно определять атрибуты как строки в целом (атрибуты всех символов одинаковы), так и отдельных символов строки. После вывода строки на экран, курсор может либо оставаться на месте, либо переместиться в позицию за последним символом только что выведенной строки.

Данная функция обрабатывает следующие управляющие символы: звуковой сигнал (BELL), перевод курсора на одну позицию назад (BACKSPACE), возврат каретки (CARRIAGE RETURN) и перевод строки (LINEFEED).

На входе:

AH

13h - вывод строки на экран

AL

Режим отображения строки:

0 - курсор не перемещается, атрибуты символов в строке одинаковы и определяются значением регистра BL,

1 - курсор перемещается за конец отображаемой строки, атрибуты символов в строке одинаковы и определяются значением регистра BL,

2 - курсор не перемещается, атрибуты каждого символа задаются отдельно,

3 - курсор перемещается, атрибуты каждого символа задаются отдельно

BH

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

BL

Атрибуты символов отображаемого текста. Используется если регистр AL содержит 0 или 1

CX

Длина отображаемой строки

DH

Номер строки экрана, в которой отображается текстовая строка

DL

Позиция в строке экрана с которой отображается текстовая строка

ES:BP

Адрес строки в оперативной памяти

На выходе:

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

В режимах 2 и 3 атрибуты каждого символа задаются вперемежку с самими символами строки. Сначала идет ASCII-код символа, а затем его атрибут.



Загрузка набора символов из BIOS - подфункция 01h


Функция загружает стандартный набор символов размера 8х14 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:

На входе:

AH

11h

AL

01h, 11h - загрузка набора символов 8х14

BL

Номер загружаемой таблицы знакогенератора (для видеоадаптера EGA доступны таблицы 0 - 3, для VGA 0 - 7)

На выходе:

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



Загрузка набора символов из BIOS - подфункция 02h


 Функция загружает стандартный набор символов CGA размера 8х8 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:

На входе:

AH

11h

AL

02h, 12h - загрузка набора символов размера 8х8 пикселов

BL

Номер загружаемой таблицы знакогенератора (для видеоадаптера EGA доступны таблицы 0 - 3, для VGA 0 - 7)

На выходе:

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



Загрузка набора символов из BIOS - подфункция 04h


Функция загружает стандартный набор символов VGA размера 8х16 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:

На входе:

AH

11h

AL

04h, 14h - загрузка набора символов размера 8х16 пикселов

BL

Номер загружаемой таблицы знакогенератора (для видеоадаптера VGA доступны таблицы 0 - 7)

На выходе:

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



Загрузка набора символов пользователя - подфункция 00h


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

На входе:

AH

11h

AL

00h, 10h - загрузка набора символов пользователя

CX

Количество загружаемых символов. Может принимать значение от 1 до 256

DX

ASCII-код первого загружаемого символа. Используется для загрузки части набора символов

BL

Номер загружаемой таблицы знакогенератора - для видеоадаптера EGA доступны таблицы 0 - 3, для VGA и SVGA 0 - 7

BH

Количество байт, определяющих один символ в таблице символов

ES:BP

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

На выходе:

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



Загрузка таблиц знакогенератора - функция 11h


Функция 11h прерывания 10h предназначена для загрузки в видеопамять таблиц знакогенератора (наборов символов). При помощи данной функции можно загружать как стандартные таблицы знакогенератора, так и таблицы, самостоятельно разработанные программистом. Загружается либо вся таблица, либо ее часть. Функция позволяет легко русифицировать видеоадаптер (если это не видеоадаптер CGA или Hercules).

Функция 11h имеет одиннадцать различных подфункций, перечисленных ниже:

Номер подфункции

Назначение

0

Загрузка таблиц знакогенератора

1

Загрузка стандартного монохромного набора символов

2

Загрузка стандартного набора символов видеоадаптера CGA

3

Выбор активных таблиц знакогенератора (EGA)

4

Загрузка стандартного набора символов видеоадаптера VGA и SVGA

20h

Установка вектора прерывания 1Fh

21h

Использование графического режима для отображения символов пользователя

22h

Использование набора символов 8х14 из ПЗУ

23h

Использование набора символов 8х8 из ПЗУ

24h

Использование набора символов 8х16 из ПЗУ

30h

Получение информации об используемом наборе символов

Для подфункций 0, 1, 2, 3 и 4 установка бита D4 в регистре AL вызывает перезагрузку регистров контроллера ЭЛТ. Вновь устанавливаются значения принятые по умолчанию для регистров формы курсора и регистра высоты символа текста. Если используется эта возможность, вызов функции должен происходить сразу после выбора режима работы видеоадаптера. В противном случае вызов функции 11h может привести к непредсказуемым последствиям.



При описании регистров мы используем


При описании регистров мы используем следующее соглашение о нумерации битов регистров: биты в байте нумеруются справа налево. Бит D7 является старшим, а бит D0 - младшим битами.
Если мы приводим значения переменных, регистров или адресов в шестнадцатиричной системе счисления, то после числа указывается символ 'h' (от слова Hexadecimal). Если число представлено в двоичной системе счисления, то после него указывается символ 'b' (от слова Binary).

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


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

На входе:

AH

1Ah

AL

01h - запись конфигурации видеосистемы

BL

Тип первичного видеоадаптера (см. подфункцию 00h)

BH

Тип дополнительного видеоадаптера (см. подфункцию 00h)

На выходе:

AL

1Ah



Запись символа с атрибутами в текущей позиции курсора - функция 09h


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

На входе:

AH

09h

AL

ASCII-код записываемого символа

BH

Номер страницы видеопамяти или цвет пикселов фона (для графического режима номер 13h)

BL

Атрибут символов (для текстового режима) или цвет пикселов символа (для графического режима);

CX

Количество записываемых символов

На выходе:

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

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

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

Листинг 5.1. Файл BIOSFUN.ASM

TITLE   BIOS_FUNCTION

.MODEL  small

DOSSEG

.STACK  100h

.DATA

 

message             DB           "INT 10h", 0

 

video_page         DB           2

.CODE

.STARTUP

 

; Выбираем режим 3 видеоадаптера

 

xor        ah,ah

 

mov      al,3

 

int          10h

 

; Изменяем форму курсора

 

mov      ah,1

 

mov      ch,0        ; начало курсора - линия 0

 

mov      cl,7         ; конец курсора - линия 7

 

int          10h

 

; Выбираем активную страницу видеопамяти

 

mov      ah,5

 

mov      al,video_page      ; выбираем страницу video_page

 

int          10h

 

mov      ah,6

 

mov      al,0

 

mov      bh,0ffh


  mov      cl,10

  mov      ch,5

  mov      dl,30

  mov      dh,15

  int          10h

  ; Устанавливаем координаты курсора

  mov      ah,2

  mov      bh,video_page     ; выбираем страницу video_page

  mov      dh,12                      ; строка 12

  mov      dl,20                       ; колонка 20

  int          10h

  ; Отображаем на активной странице экрана строку message

  mov      si,OFFSET message

  call        WriteString

.EXIT       0

; Процедура WriteString выводит на экран строку, имеющую

; смещение si в сегменте ds

WriteString          PROC

  ; Определяем текущую активную страницу экрана

  mov      ah,0Fh

  int          10h         ; номер активной страницы в регистре bh

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

  mov      ah,3

  int          10h

  ; В цикле выводим на экран символы строки

next_char:

  mov      ah,9

  lodsb

  cmp      al,0         ; находим конец строки

  ; Если достигнут конец строки оканчиваем процедуру

  je           exit_proc

  ; Для отображаемых символов используем атрибут 7

  ; символы строки выводятся без повтора

  mov      bl,7         ;

  mov      cx,1        ;

  int          10h

  ; Перемещаем курсор в следующую позицию строки

  mov      ah,2

  inc         dl

  int          10h

  jmp       next_char

exit_proc:

  ret

WriteString          ENDP

END


Запись символа в режиме телетайпа - функция 0Eh


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

Данная функция обрабатывает следующие управляющие символы: звуковой сигнал (7 - BELL), возврат курсора назад на одну позицию (8 - BACKSPACE), возврат каретки (0Dh - CARRIAGE RETURN) и перевод строки (0Ah - LINEFEED).

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

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

Ниже приведен формат вызова функции 0Eh:

На входе:

AH

0Eh - запись символа в режиме телетайпа

AL

ASCII-код записываемого символа

BH

Номер страницы видеопамяти (только в текстовых режимах)?

BL

Цвет символа (в графических режимах)

На выходе:

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

Приведем текст процедуры WriteStringT, которая выводит на экран строку, имеющую смещение SI в сегменте DS, при помощи функции 0Eh прерывания INT 10h (листинг 5.3).

Листинг 5.3. Файл WRITESTR.C

WriteStringT        PROC

 

; Определяем текущую активную страницу экрана

 

mov      ah,0Fh

 

int          10h                         ; Номер активной страницы в регистре BH

 

; В цикле выводим на экран символы строки

next_char:

 

mov      ah,0Eh

 

lodsb                                                    ; Получаем следующий символ строки

 

cmp      al,0                         ; Находим конец строки

 

je           exit_proc              ; Если конец строки достигнут, то

                                                                               

; оканчиваем процедуру

 

int          10h

 

jmp       next_char

exit_proc:

 

ret

WriteStringT        ENDP



Запись символа в текущей позиции курсора - функция 0Ah


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

На входе:

AH

10h

AL

ASCII-код записываемого символа

BH

Номер страницы видеопамяти или цвет пикселов фона (для графического режима номер 13h)

BL

Цвет пикселов символа (для графического режима)

CX

Количество записываемых символов

На выходе:

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

Во всех режимах (за исключением режима номер 13h) если бит D7 регистра BL содержит единицу, то записываемый символ накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ.



Запрещение переустановки палитры - подфункция 31h


Функция применяется для предотвращения перезагрузки таблицы цветов при выполнении операции выбора режима работы видеоадаптера VGA:

На входе:

AH

12h

BL

31h - запрещение переустановки палитры

AL

Разрешение/запрещение переустановки:

0 - разрешить загрузку палитры при выполнении операции выбора режима видеоадаптера,

1 - запретить загрузку палитры при выполнении операции выбора режима видеоадаптера

На выходе:

AL

12h



Завершение отображения вертикальной развертки (Vertical Display End Register - VDER) (индекс 12h)


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

У видеоадаптера EGA регистр VDER имеет 9, а у адаптеров VGA и SVGA - 10 разрядов. Девятый и десятый биты регистра доступны через дополнительный регистр (OVR).



Знакогенератор


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

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

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

Каждая такая таблица знакогенератора содержит описание 256 символов. Активными могут быть одна или две таблицы знакогенератора. Это дает возможность одновременно отображать на экране до 512 различных символов.

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

Рисунок 3.6 иллюстрирует использование двух таблиц знакогенератора. В верхней части рисунка символ, имеющий код ASCII 31h, отображается на экране при помощи первой таблицы знакогенератора. В нижней части рисунка символ с тем же кодом ASCII отображается при помощи третей таблицы знакогенератора, и имеет другую форму.

PICTURE._FIG_23.PCX;6";4.308";PCX

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

Видеоадаптер EGA поддерживает два размера для матриц символов - стандартный и улучшенный. Стандартный размер составляет 8 пикселов в ширину и 8 пикселов в высоту, а улучшенный - 8 пикселов в ширину и 14 пикселов в высоту. Один из этих наборов символов автоматически загружается BIOS в видеопамять при выборе текстового режима. Так как адаптеры VGA и SVGA имеют большую разрешающую способность, то их набор символов имеет в ширину 9 пикселов, а в высоту - 16.


Адреса таблиц знакогенератора для видеоадаптеров EGA, VGA и SVGA приведены в следующей таблице:

Первая таблица знакогенератора

Вторая таблица знакогенератора

Символ ASCII 0       0000h-001Fh

Символ ASCII 0      2000h-201Fh

Символ ASCII 1       0020h-003Fh

Символ ASCII 1      2020h-203Fh

Символ ASCII 2       0040h-005Fh

Символ ASCII 2      2040h-205Fh

...            ...       

...           ...       

Символ ASCII 255     1FE0h-1FFFh

Символ ASCII 255    3FE0h-3FFFh

Третья таблица знакогенератора

Четвертая таблица знакогенератора

Символ ASCII 0       4000h-401Fh

Символ ASCII 0      6000h-601Fh

Символ ASCII 1       4020h-403Fh

Символ ASCII 1      6020h-603Fh

Символ ASCII 2       4040h-405Fh

Символ ASCII 2      6040h-605Fh

...            ...       

...           ...       

Символ ASCII 255     5FE0h-1FFFh

Символ ASCII 255    7FE0h-7FFFh

Пятая таблица знакогенератора  (только VGA)

Шестая таблица знакогенератора (только VGA)

Символ ASCII 0       8000h-801Fh

Символ ASCII 0      A000h-A01Fh

Символ ASCII 1       8020h-803Fh

Символ ASCII 1      A020h-A03Fh

Символ ASCII 2       8040h-805Fh

Символ ASCII 2      A040h-A05Fh

...            ...       

...           ...       

Символ ASCII 255     9FE0h-9FFFh

Символ ASCII 255    BFE0h-BFFFh

Седьмая таблица знакогенератора (только VGA)

Восьмая таблица знакогенератора (только VGA)

Символ ASCII 0       C000h-C01Fh

Символ ASCII 0      E000h-E01Fh

Символ ASCII 1       C020h-C03Fh

Символ ASCII 1      E020h-E03Fh

Символ ASCII 2       C040h-C05Fh

Символ ASCII 2      E040h-E05Fh

...            ...       

...           ...       

Символ ASCII 255    DFE0h-DFFFh

Символ ASCII 255   FFE0h-FFFFh

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