Видеоадаптеры 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 (см. выше).
Функция выполняет запись значения в регистр цвета рамки контроллера атрибутов. Надо иметь в виду, что эта функция не работает в некоторых режимах видеоадаптера 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();
}
}
Данная функция позволяет выбрать одну из двух стандартных цветовых палитр (см. таблицу 9.1). Функция используется для обеспечения совместимости с видеоадаптером CGA и предназначена для использования в текстовых режимах и графических режимах с низким разрешением.
Функция 0Bh имеет следующий формат вызова:
На входе: |
AH |
0Bh |
BH |
0, тогда |
|
BL |
Цвет фона и рамки (для графического режима) или цвет рамки (для текстового режима) |
|
BH |
1, тогда |
|
BL |
Номер палитры (0 или 1) |
|
На выходе: |
Не используются |
В следующей таблице описаны стандартные цветовые палитры для режимов 4, 5, 6:
Номер цвета |
Палитра 0 |
Палитра 1 |
0 |
Цвет фона |
Цвет фона |
1 |
Зеленый |
Синий |
2 |
Красный |
Фиолетовый |
3 |
Желтый |
Белый |
На входе: |
AH |
11h |
AL |
23h установка вектора прерывания 43h |
|
BL |
Количество строк текста, отображаемых на экране монитора: 0 - количество строк определяется регистром DL; 1 - 14 строк; 2 - 25 строк; 3 - 43 строки |
|
DL |
Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю |
|
На выходе: |
Не используются |
На входе: |
AH |
11h |
AL |
22h - установка вектора прерывания 43h |
|
BL |
Количество строк текста, отображаемых на экране монитора: 0 - количество строк определяется регистром DL; 1 - 14 строк; 2 - 25 строк; 3 - 43 строки |
|
DL |
Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю |
|
На выходе: |
Не используются |
На входе: |
AH |
11h |
AL |
24h установка вектора прерывания 43h |
|
BL |
Количество строк текста, отображаемых на экране монитора: 0 - количество строк определяется регистром DL; 1 - 14 строк; 2 - 25 строк; 3 - 43 строки |
|
DL |
Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю |
|
На выходе: |
Не используются |
Позволяет установить собственный набор символов для отображения текста в графических режимах видеоадаптера.
На входе: |
AH |
11h |
AL |
21h - установка вектора прерывания 43h |
|
ES:BP |
Адрес таблицы символов, определенной пользователем |
|
CX |
Количество байт, кодирующих один символ в таблице символов |
|
BL |
Количество строк текста, отображаемых на экране монитора: 0 - количество строк определяется регистром DL; 1 - 14 строк; 2 - 25 строк; 3 - 43 строки |
|
DL |
Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю |
|
На выходе: |
Не используются |
Функция производит запись 18-битной величины в несколько последовательно расположенных регистров таблицы цветов:
На входе: |
AH |
10h |
AL |
12h - установка нескольких регистров таблицы цветов |
|
BX |
Номер первого регистра таблицы цветов (0-255) |
|
CX |
Количество регистров для записи (1-256) |
|
ES:DX |
Адрес таблицы цветов |
|
На выходе: |
Не используются |
Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значимыми являются только 6 младших бит.
Функция заполняет часть таблицы цветов значениями, соответствующими различным оттенкам серого цвета. Для каждого модифицируемого регистра таблицы цветов сначала читаются записанные в нем данные, а затем записываются обратно по следующему правилу: красного 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++) {
Функция выполняет запись в регистр палитры контроллера атрибутов:
На входе: |
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
Функция производит запись 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
Используется в графических режимах 4, 5 и 6 (совместимых с CGA), если необходимо отображать одновременно больше 128 символов. Вектор 1Fh указывает на таблицу с дополнительными 128 символами, имеющими коды ASCII от 127 до 255. Программа должна поддерживать таблицы для дополнительных символов. Размер символов должен быть 8х8 пикселов.
На входе: |
AH |
11h |
AL |
20h - установка вектора прерывания 1Fh, который хранит адрес таблицы дополнительных символов |
|
ES:BP |
Адрес таблицы дополнительных символов, определенной пользователем |
|
На выходе: |
Не используются |
Функция обеспечивает быстрое заполнение новыми значениями всех регистров палитры и регистра цвета рамки. Новые значения регистров должны быть записаны перед вызовом функции в таблице размером 17 байт, расположенной в оперативной памяти компьютера. Байты 0 - 15 этой таблицы содержат новые значения для регистров палитры, а байт 16 новое значение для регистра цвета рамки.
На входе: |
AH |
10h |
AL |
02h - установка регистров палитры и регистра цвета рамки |
|
ES:DX |
Адрес таблицы с новыми значениями регистров |
|
На выходе: |
Не используются |
Многие современные видеоадаптеры применяют давно известный прием, ранее использовавшийся для подключения к компьютеру дополнительной памяти. Центральный процессор получает доступ к видеопамяти через небольшое окно. Это окно может иметь небольшой размер - до 64 Кбайт и располагаться в адресном пространстве процессора. Обычно окно занимает адресное пространство A000:0000h - A000:FFFFh, то есть расположено также как и для стандартных цветных режимов видеоадаптеров EGA, VGA и SVGA. Процессор компьютера может перемещать это окно по всей видеопамяти адаптера получая доступ к разным ее участкам.
Таким образом, процессор может одновременно получить доступ только к части видеопамяти. Чтобы обратиться к другому участку видеопамяти, необходимо переместить окно доступа. Обычно для этого достаточно записать в определенный регистр видеоадаптера SVGA положение окна относительно начала видеопамяти.
Доступ к видеопамяти через небольшое окно создает определенные трудности для программного обеспечения. Теперь чтобы отобразить на экране монитора пиксел вы должны не только вычислить положение соответствующей ячейки видеопамяти, но также определить смещение для окна доступа.
Одновременно усложняются процедуры, отображающие на экране линии и другие геометрические фигуры. Возможно, что выводимое на экран изображение не помещается в одно окно. Процедура должна будет соответственно перемещать окно по видеопамяти.
Усложняются процедуры копирования изображения из одной позиции экрана в другую. Они должны учитывать, что при копировании может понадобиться перемещать окно доступа к видеопамяти.
Чтобы немного помочь программистам в решении этих и многих других задач, некоторые реализации видеоадаптеров SVGA отводят для доступа к видеопамяти не одно, а два окна. Обычно они обозначаются как окно A и окно B. В некоторых моделях видеоадаптеров через одно окно можно только записывать данные в видеопамять, а через другое только читать из видеопамяти.
Сразу после появления видеоадаптера 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 превосходят 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 миллионов различных цветов и подключаемых для повышения быстродействия непосредственно к локальной шине процессора.
Количество |
Разрешение |
||||
цветов |
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 |
Функция устанавливает один из режимов, определенных в спецификации 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 внешние регистры были объединены с остальными регистрами в одной микросхеме, но название внешние сохранилось.
Каждому внешнему регистру соответствует порт ввода/вывода.
Функция восстанавливает состояние видеоадаптера из буфера, заполненного подфункцией 01h.
На входе: |
AH |
1Ch |
AL |
02h - восстановление состояния видеоадаптера |
|
CX |
Тип восстанавливаемых данных: D0 - регистры видеоадаптера, D1 - область переменных BIOS, D2 - таблица цветов (регистры ЦАП) |
|
ES:BX |
Адрес буфера данных состояния видеоадаптера |
|
На выходе: |
AL |
1Ch |
Для видеоадаптера VGA вы можете определить второй набор из 256 символов. Формат второй таблицы символов текстового режима полностью соответствует таблице символов текстового режима.
Используется в системе PS/2 для переключения между видеоадаптером VGA, расположенным на системной плате компьютера, и дополнительным видеоадаптером. Функция работает даже если между видеоадаптерами существует конфликт по адресам видеопамяти или адресам портов ввода/вывода. Система PS/2 после загрузки в качестве первичного видеоадаптера использует дополнительный.
Программа, выполняющая переключение видеоадаптеров должна поддерживать 128-байтовый буфер для сохранения информации о состоянии неактивного видеоадаптера.
На входе: |
AH |
12h |
BL |
35h - выбор активного монитора для PS/2 |
|
ES:DX |
Адрес буфера. Размер буфера должен составлять 128 байт |
|
AL |
0 - выключить дополнительный видеоадаптер (должно быть использовано при первом вызове функции), 1 - включить видеоадаптера VGA, расположенный на системной плате (должно быть использовано при втором вызове функции), 2 - выключить активный видеоадаптер (используется в последующих вызовах функции), 3 - включить неактивный видеоадаптер (используется в последующих вызовах функции) |
|
На выходе: |
AL |
12h |
Функция 05h позволяет изменить активную страницу видеопамяти. Активная страница видеопамяти отображается на экране монитора. Функция не проверяет физического наличия выбранной страницы видеопамяти. Если вы неправильно указали номер страницы результат работы функции не определен.
На входе: |
AH |
05h |
AL |
Номер страницы видеопамяти, которая станет активной |
|
На выходе: |
Не используются |
Программа через эту функцию может установить активные таблицы знакогенератора. Напомним, что видеоадаптер 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 не используются |
|
На выходе: |
Не используются |
Функция используется для получения на видеоадаптере 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. Эта особенность может использоваться для определения типа видеоадаптера.
Функция предназначена для выбора числа подмножеств цветов и выбора активного подмножества:
На входе: |
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
Программа, распечатывающая содержимое экрана монитора по нажатию клавиши <Print Screen>, не работает в режиме 43 текстовых строк. Если вы желает иметь эту возможность, можете выбрать альтернативную программу печати экрана, воспользовавшись подфункцией номер 20h:
На входе: |
AH |
12h |
BL |
20h - выбор альтернативной программы печати экрана монитора |
|
На выходе: |
Не используются |
Функция 00h прерывания 10h позволяет задать любой стандартный режим работы видеоадаптера:
На входе: |
AH |
00h |
AL |
Номер устанавливаемого режима работы видеоадаптера, если бит D7 = 1, то при установке режима видеопамять не очищается |
|
На выходе: |
Не используются |
Приведем пример выбора режима видеоадаптера:
mov ah, 0
mov al, 3 ; Выбираем режим номер 3 (16 цветной, текстовый,
int 10h ; разрешение 25х80 символов)
Регистр 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 пикселов
Использование функций 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 видеоадаптера
Вывод символа на экран через стандартный поток вывода.
На входе: |
AH |
02h |
DL |
ASCII-код выводимого символа |
|
На выходе: |
Не используются |
Данная функция обрабатывает нажатие комбинации клавиш <Ctrl+Break>.
Выводит строку на экран монитора. Строка отображается, начиная с текущей позиции курсора. Строка должна оканчиваться символом '$' (код ASCII 24h). Строка может включать управляющие символы.
На входе: |
AH |
09h |
DS:DX |
Адрес отображаемой строки |
|
На выходе: |
Не используются |
Данная функция обрабатывает нажатие комбинации клавиш <Ctrl+Break>.
Функция 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-код символа, а затем его атрибут.
Функция загружает стандартный набор символов размера 8х14 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:
На входе: |
AH |
11h |
AL |
01h, 11h - загрузка набора символов 8х14 |
|
BL |
Номер загружаемой таблицы знакогенератора (для видеоадаптера EGA доступны таблицы 0 - 3, для VGA 0 - 7) |
|
На выходе: |
Не используются |
Функция загружает стандартный набор символов CGA размера 8х8 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:
На входе: |
AH |
11h |
AL |
02h, 12h - загрузка набора символов размера 8х8 пикселов |
|
BL |
Номер загружаемой таблицы знакогенератора (для видеоадаптера EGA доступны таблицы 0 - 3, для VGA 0 - 7) |
|
На выходе: |
Не используются |
Функция загружает стандартный набор символов VGA размера 8х16 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:
На входе: |
AH |
11h |
AL |
04h, 14h - загрузка набора символов размера 8х16 пикселов |
|
BL |
Номер загружаемой таблицы знакогенератора (для видеоадаптера VGA доступны таблицы 0 - 7) |
|
На выходе: |
Не используются |
Функция заменяет текущий набор символов знакогенератора или его часть набором символов, определенных пользователем. Таблица знакогенератора пользователя должна быть загружена в буфер оперативной памяти до вызова функции. После вызова она может быть удалена из памяти.
На входе: |
AH |
11h |
AL |
00h, 10h - загрузка набора символов пользователя |
|
CX |
Количество загружаемых символов. Может принимать значение от 1 до 256 |
|
DX |
ASCII-код первого загружаемого символа. Используется для загрузки части набора символов |
|
BL |
Номер загружаемой таблицы знакогенератора - для видеоадаптера EGA доступны таблицы 0 - 3, для VGA и SVGA 0 - 7 |
|
BH |
Количество байт, определяющих один символ в таблице символов |
|
ES:BP |
Адрес буфера, содержащего определение символов, загружаемых в таблицу знакогенератора |
|
На выходе: |
Не используются |
Функция 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 может привести к непредсказуемым последствиям.
Данная функция позволяет изменить информацию о конфигурации видеосистемы компьютера:
На входе: |
AH |
1Ah |
AL |
01h - запись конфигурации видеосистемы |
|
BL |
Тип первичного видеоадаптера (см. подфункцию 00h) |
|
BH |
Тип дополнительного видеоадаптера (см. подфункцию 00h) |
|
На выходе: |
AL |
1Ah |
Функция позволяет записать один или несколько одинаковых символов в текущей позиции курсора. Запись может происходить как в активную, так и в неактивные страницы видеопамяти. После выполнения операции записи положение курсора не изменяется. Управляющие символы, такие как возврат каретки и перевод строки, не действуют и записываются в видеопамять, как обычные символы. Данная функция работает как в текстовых, так и в графических режимах.
На входе: |
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
Функция обеспечивает запись символа на экран в режиме телетайпа: символ отображается в текущей позиции курсора, после чего курсор сдвигается вправо на одну позицию. При необходимости курсор автоматически перемещается на новую строку, а когда весь экран заполняется, происходит вертикальная свертка экрана. В последнем случае верхняя строка экрана исчезает, а снизу возникает новая пустая строка и курсор помещается в ее начало. В текстовых режимах цветовые атрибуты строк, возникающих из-за свертки экрана соответствуют атрибутам отображаемых символов.
Данная функция обрабатывает следующие управляющие символы: звуковой сигнал (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
Функция позволяет записать символ в текущей позиции курсора на любой странице видеопамяти. Как и в предыдущей функции, можно производить запись сразу нескольких одинаковых символов. Атрибуты символа не задаются, а используются их старые значения из предыдущих операций записи. После операции записи положение курсора не изменяется. Управляющие символы, такие как возврат каретки и перевод строки, не действуют и записываются в видеопамять, как обычные символы.
На входе: |
AH |
10h |
AL |
ASCII-код записываемого символа |
|
BH |
Номер страницы видеопамяти или цвет пикселов фона (для графического режима номер 13h) |
|
BL |
Цвет пикселов символа (для графического режима) |
|
CX |
Количество записываемых символов |
|
На выходе: |
Не используются |
Во всех режимах (за исключением режима номер 13h) если бит D7 регистра BL содержит единицу, то записываемый символ накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ.
Функция применяется для предотвращения перезагрузки таблицы цветов при выполнении операции выбора режима работы видеоадаптера VGA:
На входе: |
AH |
12h |
BL |
31h - запрещение переустановки палитры |
|
AL |
Разрешение/запрещение переустановки: 0 - разрешить загрузку палитры при выполнении операции выбора режима видеоадаптера, 1 - запретить загрузку палитры при выполнении операции выбора режима видеоадаптера |
|
На выходе: |
AL |
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.
Первая таблица знакогенератора |
Вторая таблица знакогенератора |
Символ 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 |