требуется средняя эффективная скорость доступа 2 нс/пиксел. Работа в реальном времени с растровыми графическими устройствами осуществляется путем одновременного доступа к группам по 16, 32, 64 и более пикселов. В случае цветного буфера кадра каждый пиксел может содержать до 32 бит, при этом все битовые плоскости для каждого пиксела доступны одновременно. При среднем времени доступа для каждой группы пикселов 1600 нс возможна работа в реальном времени для буферов кадров размером 512 х 512 и 1024 х 1024. Хотя производительности, необходимой для работы в реальном масштабе времени с приемлемыми скоростями регенерации, на растровых устройствах достичь труднее, чем на векторных дисплеях с регенерацией, на них легче изображать сплошные фигуры с плавными переходами цветов.
УПРАВЛЕНИЕ ВИДЕОСИСТЕМАМИ ПЕРСОНАЛЬНЫХ КОМПЬЮТЕРОВ
Прежде чем создать изображение, зеркала должны чуть-чуть поразмышлять
(Ж. Кокто) Аппаратные средства для вывода информации на экран включают видеоадаптер и монитор. Видеоадаптер - это сложное устройство, управляемое собственным микропроцессором, сравнимым по мощности
с центральным процессором ПК.
Видеоадаптер состоит из 2-х частей: контроллера электрон- но-лучевой трубки (ЭЛТ) и видеопамяти. Кроме этого современные видеоадаптеры имеют в своем составе ряд дополнительных узлов, например, контроллеры графики (для быстрой манипуляции содержимым видеопамяти). С видеопамятью связан видеобуфер. Основное назначение видеобуфера - хранение образа информации экрана. Видеоадаптер 25-30 раз в секунду освежает изображение на экране. Изображение строится из точек - пикселов, которые объединяются в телевизионные строки. Число пикселов в строке и число строк различно для разных типов видеоадаптеров.
Память, необходимая для хранения полного образа экрана, называется видеостраницей. Если размер видеобуфера превышает объем страницы, то имеется возможность хранить несколько страниц. Страница, отображаемая на экране, называется видимой страницей, на которую выполняется вывод информации называется активной. Они могут совпадать.
Исторически складывались следующие стандарты видеоадаптеров персональных вычислительных систем:
MDA - монохроматический адаптер дисплея CGA - цветной графический адаптер
EGA - усовершенствованный графический адаптер
VGA - графический видеомассив(video graphics array)
SVGA - супер VGA
MCGA - многоцветный графический массив(для PS/2 модель 30) XGA - стандарт IBM для PS/2
Hercules (HGC - Hercules graphics Carol)- для черно-белых мониторов и видеосистем.
Управление параметрами видеосистемы может выполнятся:
-на уровне портов видеоадаптеров;
-обращением к функциям BIOS.
ВИДЕОРЕЖИМЫ
Видеоадаптер способен работать в некотором множестве режимов. Режим является интегральной характеристикой особенностей
работы видеоадаптера. Поведение видеоадаптера в том или ином режиме полностью характеризует доступные для программиста средства управления видеоадаптером. Чем совершеннее видеоадаптер, тем больше режимов он поддерживает. Отмечается полная совместимость видеоадаптеров снизу вверх:MDA-CGA-EGA-VGA-SVGA.
Основные характеристики видеорежима:
1.Тип (текстовый, графический)
2.Максимальное число цветов
3.Число цветов в палитре
4.Размеры шрифта (8х8, 8х14, 8х16, 9х16, 9х14)
5.Максимальное число страниц (до 8)
6.Разрешение в тексте (число текстовых строк и число знакомест в одной строке)
7.Разрешение в графике (определяется числом пикселов по горизонтали и вертикали экрана)
8.Адрес начала видеобуфера.
Видеорежим с номерами 0-6 |
- CGA-режим |
|
Видеорежим с номерами 0Dh-10h |
- EGA-режим |
|
Видеорежим с номерами |
11h-13h |
- VGA-режим |
Видеорежим с номерами |
1Fh и более |
- SVGA-режим |
Видеорежим с номерами 100h и более - SVGA-режим в стандарте
VESA (Video Electronics Standards Assocation).
При всем многообразии режимов работы видеоадаптеров их можно объединить в две группы: текстовые и графические. Переключение из текстовых режимов в графические означает полное изменение логики работы видеоадаптера с видеобуфером.
ТЕКСТОВЫЕ РЕЖИМЫ
Экран рассматривается как совокупность текселов (текстовые элементы). Каждому знакоместу экрана соответствует два байта памяти видеобуфера. Байт по четному адресу хранит ASCII-код символа, по нечетному - байт атрибутов:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
0 |
+------------------------------------------------- |
|
|
|
|
|
|
|
|
+ |
¦BL ¦R ¦G ¦B ¦I ¦R ¦G ¦B ¦ ASCII-код |
¦ |
||||||||
+------------------------------------------------- |
|
|
|
|
|
|
|
|
+ |
¦\______/ ¦ \______/
¦ |
цвет фона ¦ |
цвет фона |
¦ |
символа ¦ |
символа |
¦+-- яркость символа (1-повышенная,
+---- мерцание |
символа |
0-нормальная) |
(1-есть, |
0-нет) |
|
|
Цвета: |
|
0h-черный |
|
8h-серый |
1h-синий |
|
9h-светло-синий |
2h-зеленый |
Ah-светло-зеленый |
|
3h-голубой |
Bh-светло-голубой |
|
4h-красный |
Ch-светло-красный |
|
5h-фиолетовый |
Dh-светло-фиолетовый |
|
6h-коричневый |
Eh-желтый |
|
7h-белый |
|
Fh-ярко-белый |
Например, 04h - красный символ на черном фоне.
Видеопамять при работе в текстовом режиме доступна для не-
6
посредственного доступа из программы, т.е. возможны чтение и запись. Адрес:
addr = (y * max_col + x) + beg_addr,
х и y отсчитываются от нуля; x - номер колонки в строке, y - номер строки; max_col - число знакомест в строке; beg_addr - адрес начала страницы.
Под адресом здесь понимается только смещение, так как все страницы находятся в одном сегменте. В зависимости от номера видеорежима изменяется начальный адрес видеобуфера: 0..6 - B8000h; 7 - B0000h; >7 - A0000h. Видеоадаптер в текстовом режиме 25-30 раз в секунду считывает содержимое видеобуфера и по коду символа, по байту атрибутов рисует пикселы, задающие очертание символа и фон. Код символа служит индексом для входа в таблицу знакогенератора. В ней содержится карта, по которой видеоадаптер расставляет пикселы символа.
+----------------- |
+ |
¦0 0 0 0 0 0 0 0 ¦ Биты в карте хранятся последовательно
¦0 0 0 1 1 0 0 0 ¦ (0-ая строка, 1-ая строка и т.д.).
¦0 0 1 0 0 1 0 0 ¦
¦ 0 1 0 0 0 0 1 0 ¦ Карта символа А.
¦0 1 1 1 1 1 1 0 ¦
¦0 1 0 0 0 0 1 0 ¦
¦0 1 0 0 0 0 1 0 ¦
¦0 0 0 0 0 0 0 0 ¦
+-----------------+
Чем больше строк используется для символа, тем качественней он выглядит на экране.
Число знакомест в строке зависит от выбранного режима и составляет 40, 80 или 132 позиции.
Число текстовых строк зависит от типа видеоадаптера и выбранного режима. При определении числа текстовых строк видеоадаптер учитывает соотношение полного числа телевизионных строк вертикального размера битовой карты символа. Например, если число телестрок = 200, то на экране возможно разместить 25 строк (по 8 линий). Если 350 телестрок, то 43 (по 8 линий) или 25 (по 14 ли-
ний). Если 400 - то 25 (по 16), 28 (по 14), 50 (по 8).
ГРАФИЧЕСКИЕ РЕЖИМЫ
Появляется возможность управлять цветом любой точки экрана. Экран представляет собой матрицу пикселов: видеоадаптер хранит коды цветов в видеобуфере. При этом для видеорежимов 4..6, 13h возможен непосредственный доступ к видеопамяти из программы. В различных режимах видеопамять используется по разному. Видеорежимы 4,5 - четырехцветные. Для кодирования цвета достаточно 2-х битов. Таким образом в одном байте помещается информация о цвете 4-х подряд расположенных в строке пикселов. На строку требуется 80 байт; на весь экран - 16000 байт. Код цвета представляет собой номер цвета в заранее предопределенной палитре (для CGA - четыре жестко заданные палитры, EGA, VGA, SVGA - определяемые палитры).
Видеорежим 6 - 2-х цветный (640х200). Код цвета занимает 1 бит. Память - 16К. Коды пикселов нечетных и четных строк сгруппированы в два массива: смещение 0h от начала видеобуфера - четные; смещение 2000h от начала видеобуфера - нечетные.
Видеорежимы 0Dh..10h: на каждый пиксел отводится 4 бита (т.е. на экране могут отображаться 16 цветов одновременно).
|
|
|
|
|
|
|
|
|
+-------------------- |
|
|
|
|
+ |
|
|
|
|
|
|
|
|
|
¦ 0Dh |
-- |
320x200 |
¦ |
||
|
|
|
+-------------------- |
|
|
|
|
|
+ ¦ 0Eh |
-- |
640x200 |
¦ |
||
Регистры |
|
¦ |
Номер ¦ Значение |
¦ ¦ 0Fh |
-- |
640x350-моно¦ |
||||||||
палитры |
|
+-------- |
|
+----------- |
|
|
|
¦ ¦ 10h |
-- |
640x350 |
¦ |
|||
|
|
|
¦ |
0 |
¦ |
000000 |
¦ +-------------------- |
|
|
|
|
+ |
||
+-------------- |
|
|
>¦ |
1 |
¦ |
000001 |
¦------ |
|
+ |
|
|
|
||
¦ |
|
|
¦ |
.............. |
|
|
|
|
¦ |
|
¦ |
|
|
|
¦ |
|
|
¦ |
14 |
¦ |
111110 |
¦------ |
|
+-+ |
|
|
|
||
¦ |
|
+ |
-->¦ |
15 |
¦ |
111111 |
¦ |
|
¦ ¦ |
|
|
|
||
¦ |
|
¦ |
+-------------------- |
|
|
|
|
|
+ |
+-+-+------------- |
|
|
+ |
|
¦ |
|
¦ |
|
|
|
|
|
|
|
¦ |
. . |
|
|
¦ |
¦ |
B +------------------------ |
|
|
|
|
|
|
+ |
|
¦ |
|
|
|
¦ |
¦ |
G +----------------------- |
|
|
|
|
|
+ |
¦ |
|
¦ |
|
|
|
¦ |
¦ R +---------------------- |
|
|
|
|
+ |
¦ |
¦ |
|
¦ |
|
|
|
¦ |
|
+--------------------- |
|
|
|
|
+ |
¦ |
¦ |
¦ |
|
+----------------- |
|
|
|
+ |
I ¦ |
|
|
|
|
¦ |
¦ |
¦ |
¦ |
|
|
Экран монитора |
|||
¦ |
|
|
|
|
¦ |
¦ |
¦ |
¦ |
|
|
|
|
|
|
200 ¦ |
|
|
|
|
¦ |
¦ |
+ |
--+ |
|
|
|
|
|
|
¦ |
|
|
|
|
¦ |
+-- |
+ |
|
|
|
|
|
|
|
¦ |
|
|
|
|
+-- |
+ |
|
|
|
|
|
|
|
|
+--------------------- |
|
|
|
|
+ |
|
|
|
|
|
|
|
|
|
|
|
320 |
|
Видеопамять |
|
|
|
|
|
|
||||
Конкретному адресу видеобуфера соответствует 4 байта на би- |
||||||||||||||
товых планах, |
которые |
кодируют |
|
цвет |
восьми соседних пикселов |
|||||||||
строки. |
Код цвета -- |
это номер одного из 16 |
регистров |
палитры |
||||||||||
(6-ти разрядные). Возможные цвета (из 64) задаются форматом |
|
|||||||||||||
r g b |
|
R G B |
|
|
|
|
|
|
|
|
|
|
|
|
+----- |
+ |
+ |
-----+ |
|
|
|
|
|
|
|
|
|
|
|
половинная |
|
полная |
|
|
|
|
|
|
|
|
|
|
|
|
интенсивность |
|
|
|
|
|
|
|
|
|
|
|
|||
Результирующий сигнал образуется сложением сигналов |
цвета, |
|||||||||||||
т.е. возможны 3 градации яркости |
-- |
половинная, |
единичная и по- |
|||||||||||
луторная. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VGA-адаптер |
использует подобную косвенную схему преобразо- |
|||||||||||||
вания кода цвета в реальный цвет на экране. |
Но значение |
в |
ре- |
|||||||||||
гистре |
палитры |
задает |
номер DAC-регистра (регистра ЦАП). |
Для |
||||||||||
VGA-адаптера используются аналоговые мониторы (для CGA, |
EGA -- |
|||||||||||||
мониторы с |
цифровым |
|
уровнем |
|
интенсивности |
цвета, |
|
т.е. |
||||||
"вкл/выкл"), |
для которых яркость |
|
цветов определяется |
уровнем |
||||||||||
аналогового |
сигнала |
(напряжения). ЦАП |
имеет 256 трехбайтовых |
|||||||||||
внутренних регистров (по байту для каждого цвета - |
RGB). |
|
Шесть |
|||||||||||
бит байта кодирует уровень интенсивности цвета (64). Число цветов равно 262144.
При работе VGA-адаптера в EGA-режимах используются 64 DAC-регистра. Возможно обращение к 4-м блокам DAC-регистров (по 64). В каждый момент времени активен только один из блоков (обычно блок 0).
VGA видеорежимы:
11h(VGA) - монохромный режим (640х480).
12h(VGA) - цветной режим (640х480) подобен видеорежиму 10h. 13h - цветной режим (320х200) с 256-мя цветами. Для кодирования цвета пиксела отводится 1 байт. Память - 64К. Возможен доступ к видеопамяти (как в 4-6 видеорежимах). Коды пикселов расположены подряд, без разделения на четные и нечетные строки. Код цвета пиксела задает номер DAC-регистра. Изменение значения
в DAC-регистре меняет цвет пиксела на экране.
Создателем SVGA считается фирма NEC Home Electronics.
7
Различные версии SVGA-видеоадаптеров поддерживают дополнительное множество режимов с разрешением от 512х512 до 1600х1200 и числом цветов 16, 256 и более. С появлением микросхемы DAC с расширенными возможностями были реализованы режимы реального представления цвета HiColor и TrueColor. В этих режимах данные из видеобуфера в процессе цифроаналогового преобразования интерпретируются не как номера регистров DAC, а непосредственно как цвет.
+---------------------------------------------------------- |
|
|
|
|
|
|
|
|
+ |
¦ |
¦ |
|
¦ Биты, отводимые под компоненты |
¦ |
|||||
¦ Режим |
¦ Количество |
+--------------------------------- |
|
|
|
|
|
¦ |
|
¦ |
¦ |
битов |
¦ |
B |
¦ |
G |
¦ |
R |
¦ |
+---------- |
+------------- |
|
+---------- |
|
+---------- |
|
+----------- |
|
¦ |
¦ HiColor |
¦ |
15 |
¦ |
0-4 |
¦ |
5-9 |
¦ |
10-14 |
¦ |
¦ HiColor |
¦ |
16 |
¦ |
0-4 |
¦ |
5-10 |
¦ |
11-15 |
¦ |
¦ TrueColor¦ |
24 |
¦ |
0-7 |
¦ |
8-15 |
¦ |
16-23 |
¦ |
|
+---------------------------------------------------------- |
|
|
|
|
|
|
|
|
+ |
В текстовых режимах видеоадаптер отображает курсор, а BIOS имеет средства "отслеживания" и установки текущей позиции и формы курсора. При переключении в графический режим курсор не отображается, но отслеживание текущей позиции возможно средствами
BIOS.
ОПРЕДЕЛЕНИЕ И НАСТРОЙКА ПАРАМЕТРОВ ВИДЕОАДАПТЕРА
Параметры видеосистемы содержатся в 2-х областях данных BI-
OS. |
|
|
|
|
|
|
+------------------------------------------------------------ |
|
|
|
|
|
+ |
¦ |
Адрес ¦ |
|
Функция |
¦ Размер ¦ |
||
+------- |
+------------------------------------------- |
|
|
+-------- |
|
¦ |
¦ |
40:49h¦ |
Текущий режим видеоадаптера |
¦ |
1 |
¦ |
|
¦ |
4Ah¦ |
Число символов в строке |
¦ |
2 |
¦ |
|
¦ |
4Ch¦ |
Длина буфера видеопамяти в байтах |
¦ |
2 |
¦ |
|
¦ |
4Eh¦ |
Начальный адрес в буфере регенерации(сме- ¦ |
2 |
¦ |
||
¦ |
¦ |
щение от начала видеопамяти до начала ак- ¦ |
|
¦ |
||
¦ |
¦ |
тивной видеостраницы) |
¦ |
|
¦ |
|
¦ |
50h¦ |
Позиция |
курсора для страницы 0(младший |
¦ |
2 |
¦ |
¦ |
¦ |
байт-столбец, старший байт-строка) |
¦ |
|
¦ |
|
¦ |
52h¦ |
Позиция |
курсора для страницы 1(младший |
¦ |
2 |
¦ |
¦ |
¦ |
байт-столбец, старший байт-строка) |
¦ |
|
¦ |
|
¦ |
54h¦ |
Позиция |
курсора для страницы 2(младший |
¦ |
2 |
¦ |
¦ |
¦ |
байт-столбец, старший байт-строка) |
¦ |
|
¦ |
|
¦ |
56h¦ |
Позиция |
курсора для страницы 3(младший |
¦ |
2 |
¦ |
¦ |
¦ |
байт-столбец, старший байт-строка) |
¦ |
|
¦ |
|
¦ |
58h¦ |
Позиция |
курсора для страницы 4(младший |
¦ |
2 |
¦ |
¦ |
¦ |
байт-столбец, старший байт-строка) |
¦ |
|
¦ |
|
¦ |
5Ah¦ |
Позиция |
курсора для страницы 5(младший |
¦ |
2 |
¦ |
¦ |
¦ |
байт-столбец, старший байт-строка) |
¦ |
|
¦ |
|
¦ |
5Ch¦ |
Позиция |
курсора для страницы 6(младший |
¦ |
2 |
¦ |
¦ |
¦ |
байт-столбец, старший байт-строка) |
¦ |
|
¦ |
|
¦ |
5Eh¦ |
Позиция |
курсора для страницы 7(младший |
¦ |
2 |
¦ |
¦ |
¦ |
байт-столбец, старший байт-строка) |
¦ |
|
¦ |
|
¦ |
60h¦ |
Форма курсора(младший байт-номер телеви- |
¦ |
2 |
¦ |
|
¦ |
¦ |
зионной строки конца курсора) |
¦ |
|
¦ |
|
¦ |
62h¦ |
Номер активной видеостраницы |
¦ |
1 |
¦ |
|
¦ |
63h¦ |
Адрес CRT-контроллера (3D4h-для цветного |
¦ |
2 |
¦ |
|
¦ |
¦ |
видеоадаптера, 3B4h-для монохромного |
¦ |
|
¦ |
|
¦ |
¦ |
видеоадаптера |
¦ |
|
¦ |
¦ |
65h¦ |
Текущая установка порта 3D8h (CRT MODE) |
¦ |
1 |
¦ |
¦ |
¦ |
Регистр выбора режима 3B8h (для монохром- ¦ |
|
¦ |
|
¦ |
¦ |
ного видеоадаптера) |
¦ |
|
¦ |
¦ |
66h¦ |
Текущая установка порта 3D9h (CRT Palette)¦ |
1 |
¦ |
|
¦ |
¦ |
Регистр выбора цвета 3B9h |
¦ |
|
¦ |
+------- |
+------------------------------------------- |
|
+-------- |
|
¦ |
¦ 40:84h¦ |
Число строк текста для активного режима |
¦ |
1 |
¦ |
|
¦ |
¦ |
(для CGA видеоадаптера = 0) |
¦ |
|
¦ |
¦ |
85h¦ |
Высота матрицы,задающей изображение симво-¦ |
2 |
¦ |
|
¦ |
¦ |
ла на экране |
¦ |
|
¦ |
¦ |
87h¦ |
Байт INFO |
¦ |
1 |
¦ |
¦ |
88h¦ |
Байт INFO3 |
¦ |
1 |
¦ |
¦ |
89h¦ |
Байт FLAGS |
¦ |
1 |
¦ |
¦ |
8Ah¦ |
Индекс в таблице DCC (тип видеоадаптера и ¦ |
|
¦ |
|
¦ |
¦ дисплея |
¦ |
1 |
¦ |
|
+------------------------------------------------------------ |
|
|
|
|
+ |
Байт INFO
Бит.
0 - разрешена эмуляция текстового курсора;
1 - монохромный дисплей;
2 - BIOS должен ожидать Vertical Retrace, т.е.перемещение луча снизу вверх после прохождения всех строк, перед выполнением некоторых функций. Затем BIOS обнуляет этот флаг;
3 |
- |
видеосистема неактивна; |
|
||
4 |
- |
резерв; |
|
|
|
5,6 - размер |
памяти |
видеобуфера (0-64К, 1-128К, |
2-192К, |
||
3-256К); |
|
|
|
|
|
7 |
- состояние бита 7 в AL функции 0 int 10h. |
|
|||
Байт INFO3 - в VGA 0,7 - резервный, но бит 3 = 0; |
в EGA - |
||||
переключатели режимов (DIP-переключатели). |
|
||||
|
|
|
Байт FLAGS (VGA) |
|
|
0 |
- VGA активен; |
|
|
||
1 |
- разрешено серошкальное суммирование; |
|
|||
2 |
- использование монохромного дисплея; |
|
|||
3 |
- запрещена загрузка палитры по умолчанию; |
|
|||
4,7 - число сканируемых строк |
|
||||
|
|
7 бит |
4 бит |
|
|
|
|
0 |
0 |
350 |
|
|
|
0 |
1 |
400 |
|
|
|
1 |
0 |
200 |
|
|
|
1 |
1 |
480 |
|
5 |
- резерв; |
|
|
|
|
6 |
- разрешено переключение дисплея. |
|
|||
В основном услуги по определению и настройке параметров видеосистемы выполняют функции прерывания 10h BIOS.
ЧТЕНИЕ И ВЫВОД ПИКСЕЛА ЧЕРЕЗ ПОРТЫ EGA И VGA ВИДЕОАДАПТЕРОВ
Непосредственный доступ к видеопамяти в видеорежимах ODh -
8
12h возможен только через операции с портами. Через порты осуществляется доступ к регистрам основных аппаратных блоков видеоадаптеров:
-внешним (EGA) или General (VGA) регистрам;
-регистрам секвенсора(порт 3C4h);
-регистрам CRTC (контроллера ЭЛТ 3D4h);
-регистрам графического контроллера (порт 3CEh);
-регистрам атрибута (палитры, 3D9h);
-регистрам DAC (VGA).
В указанный порт записывается номер регистра, а в смежный порт - значение, помещаемое в регистр:
int reg = 2;
_DX = 0x3C4; outportb(_DX++, reg); outportb (_DX, 0x0F); .
Отметим, что не все регистры позволяют записывать.
Особую роль играют регистры-защелки (latch-регистры). Каждому битовому плану соответствует по одному такому регистру и одному АЛУ. Оно комбинирует данные в регистр-защелку с данными из ЦП. При любой операции чтения адреса из видеобуфера
врегистр-защелку помещается по одному байту с каждого плана. Эти данные могут быть переданы в ЦП. Комбинирование данных ре- гистра-защелки с данными из ЦП осуществляется по операции записи
ввидеобуфер. Обязательно обновление регистра-защелки перед каждой записью в видеобуфер (т.е. необходимо чтение перед записью).
Чтение: char far *ptr = 0xA0000000;
char dummy;
............................
dummy = *ptr;
............................
Способы комбинирования: переопределение, XOR, AND, OR - задается битами 3-4 регистра вращения 3 графического контроллера
(порты 3CE, 3CF).
Выбор пиксела, подлежащего записи, из 8-ми пикселов, соответствующих байту в регистре-защелке, осуществляется регистром битовой маски (регистр 8 графического контроллера, позволяющий только запись). Выбор регистра-защелки осуществляется регистром маски карты (регистр 2 секвенсора. Биты 0-3 соответствуют планам 0-3, биты > 4 не используются).
Способ записи через эти 2 регистра называется режимом записи 0. Режим записи задается битами 0-1 регистра 5 графического контроллера (регистр режима).
НЕПРЯМОЙ МЕТОД ВЫВОДА ПИКСЕЛА
Метод дает высокопроизводительный код программы.
1.Вычисляется смещение до адреса видеобуфера, соответствующего пикселу с координатами x,y :
offset = bytes_per_page * page + y * bytes_per_line + x/8.
2.Формируется значение для регистра битовой маски:
mask = 0x80 >> (x % 8)
или
mask = 0x80 >> (x & 0x07).
3.Маска записывается в регистр 8 графического контроллера:
_DX = 0x3CE; outportb (_DX++,8); outportb (_DX--,mask);
4.Регистр вращения 3, в нем записывается способ комбинирования, например, 0х00 (переопределение) :
outportb (_DX++,3); outportb (_DX,0x00);
5. В регистре маски карты (2, секвенсор) записывается код деблокировки битовых планов, например, 0х0F - все битовые планы деблокированы :
_DX = 0x3C4; outportb (_DX++,2); outportb (_DX--, 0x0F);
6.Фиктивное чтение адреса со смещением offset для заполнения регистра-защелки:
register char _ES * offset;
...........................
_ES = 0xA000; _AL = *offset;
...........................
7.Запись по адресу offset значения 0, что очищает на всех планах по одному биту, соответствующему биту из регистра битовой маски. Регистр-защелка отгружаются в видеопамять и пиксел на экране "гаснет";
offset = 0;
8.В регистр маски карты загружается требуемый код цвета (т.е. номер регистра палитры):
outportb(_DX++,2); outportb(_DX,color);
9.Запись по адресу offset значения 0xFF. Код цвета вмещается на планы:
*offset = 0xFF;
Улучшения кода можно добиться путем использования двухбайтовых ассемблерных команд вывода в порт:
asm out dx,ax.
Например, для пункта 3
_DX = 0x3CE;
_AX = (mask<<8) | 0x08; asm out dx, ax
дает выигрыш более 10%.
Режим записи 1 предназначен для быстрого переноса байтов видеобуфера с одного места на другое. Например, прочтя А000:0000h (заполнив при этом регистр - защелку), можно перенести их текущее содержимое во 2-ую строку экрана, записав по адресу A000:0050h. Байты от ЦП игнорируются.
Режим записи 2 дает альтернативный способ вывода пиксела. Биты 0-3 байта из ЦП рассматриваются как код цвета. Этот код помещается в те биты регистра-защелки, для которых в регистре битовой маски записана 1. Например, если в регистре битовой маски записать 0хFF, то при *offset = 0x0F все пикселы байта offset будут иметь код цвета 0x0F (обычно ярко-белый). Режим хорошо использовать для быстрой заливки окна (экрана).
ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО КОДА ЦВЕТА
Есть 2 режима чтения. Задаются битом 3 регистра режима (регистр 5, графический контроллер, 0x3CE).
Режим чтения 0 : при любом обращении к адресу возвращается байт из одного регистра-защелки, номер которого определяется регистром 4 графического контроллера (регистр выбора карты чтения). План I - 0, план B - 3. Вырезав из каждого байта по биту, соответствующего координатам пиксела, можно сформировать код цвета (номер регистра палитры).
Режим чтения 1 : при чтении адреса памяти возвращается не сам код цвета, а информация о его совпадении с шаблоном, заданным в регистре сравнения цвета (регистр 2 графического контроллера), в котором используются биты 0-3. Если какой-нибудь бит из байта ЦП равен 1, то код цвета пиксела совпадает с шаблоном. Например, при чтении получен байт F0h, а в регистре сравнения записан шаблон 0Fh, т.е. первые четыре пиксела имеют цвет 1111, а остальные какой-то другой. Чтобы уточнить цвет, надо загружать в регистр 2 коды всех цветов. Можно использовать регистр игнорирования цвета (регистр 7 графического контроллера). Биты 0-3 соответствуют планам I-B. 0 означает, что план не учитывается при
9
сравнении цвета.
ОСОБЕННОСТИ УПРАВЛЕНИЯ ВИДЕОСИСТЕМАМИ SVGA
ОПРЕДЕЛЕНИЕ ТИПА SVGA
Начинается с проверки содержимого ROM по адресу C000:0000, где должно быть название фирмы-производителя видеоадаптера: "RE-
ALTEK VGA", "TRIDENT VGA" и др. (для Paradise/Western Digital по адресу C000:007D начинается строка "VGA="). Для определения модификации видеоадаптера обычно резервируется один из регистров CRTC (порт 3D4) или секвенсора (порт 3C4), в котором содержится код версии. Например, регистр 33h CRTC видеоадаптера Realtek в битах 6-7 содержит номер версии видеоадаптера (0-3), а регистр 0B секвенсора видеоадаптера Trident в младшем байте хранит значение кода, соответствующего модификации (23h - Trident 9000). Для видеоадаптеров, поддерживающих стандарт VESA, возможно получение информации с помощью функции AX = 4F00h int 10h. ES:DI должен указывать на 256-байтовый буфер. Если функция поддерживается (т.е. драйвер VESA установлен), то она возвращает AL = 4Fh и AH = 00h (успешно) или AH = 01h (аварийный код). В буфере содержится:
----------------------------------------------------------------
Смещение ¦ Размер |
¦ |
Описание |
||
---------- |
+-------- |
|
+-------------------------------------------- |
|
00 |
¦ |
4 |
¦Сигнатура VESA |
|
04 |
¦ |
2 |
¦Номер версии VESA |
|
06 |
¦ |
4 |
¦Указатель на имя производителя ВА (OEM-имя) |
|
0A |
¦ |
4 |
¦Флаги |
|
0E |
¦ |
4 |
¦Указатель на список поддерживаемых VESA и |
|
|
¦ |
|
¦OEM видеорежимов |
|
12 |
¦ |
238 |
¦Резерв |
|
Функция AX = 4F01h int 10h позволяет получить характеристику выбранного (CX) видеорежима в буфер (ES:DI) длиной 256 байт. Возврат - аналогично AX = 4F00h. Формат информации о режиме:
----------------------------------------------------------------
Смещение ¦ Размер |
¦ |
Описание |
||
---------- |
+-------- |
|
+-------------------------------------------- |
|
00 |
¦ |
2 |
¦Атрибуты режима: |
|
¦¦ бит 0 - режим поддерживается
¦¦ 1 - информация доступна
¦¦ 2 - поддерживается вывод через BIOS
¦¦ 3 - цветной режим
¦¦ 4 - графический режим
02 |
¦ |
1 |
¦Атрибуты окна А: |
||
|
¦ |
|
¦ |
0 |
- существует |
|
¦ |
|
¦ |
1 |
- доступно для чтения |
|
¦ |
|
¦ |
2 |
- доступно для записи |
|
¦ |
|
¦ |
3-7 |
- резерв |
03 |
¦ |
1 |
¦Атрибуты окна В |
||
04 |
¦ |
2 |
¦Гранулярность окна (Кб) |
||
06 |
¦ |
2 |
¦Размер окна (Кб) |
||
08 |
¦ |
2 |
¦Начальный сегмент окна А |
||
0А |
¦ |
2 |
¦Начальный сегмент окна В |
||
0С |
¦ |
4 |
¦Указатель на функцию позиционирования окна |
||
10 |
¦ |
2 |
¦Число байтов на телевизионную строку |
||
12 |
¦ |
2 |
¦Ширина в пикселах |
||
14 |
¦ |
2 |
¦Высота в пикселах |
||
16 |
¦ |
1 |
¦Ширина символа в пикселах |
||
17 |
¦ |
1 |
¦Высота символа в пикселах |
||
18 |
¦ |
1 |
¦Число планов памяти |
19 |
¦ |
1 |
¦Число битов на пиксел |
1А |
¦ |
1 |
¦Число банков |
1В |
¦ |
1 |
¦Тип модели видеопамяти |
1С |
¦ |
1 |
¦Размер банка (Кб) |
----------------------------------------------------------------
Функция AX = 4F02h позволяет установить (BX) видеорежим. Бит 15, установленный в 1, запрещает очистку видеопамяти. Возврат тот же.
Номера видеорежимов устанавливаются производителями видеоадаптеров. VESA-режимы:
100h |
640x400x256 |
||
101h |
640x480x256 |
||
102h |
800x600x16 |
||
103h |
800x480x256 |
||
104h |
1024x768x16 |
||
105h |
1024x768x256 |
||
106h |
1280x1024x16 |
||
107h |
1280x1024x256 |
||
108h |
80x60 text |
||
109h |
132x25 |
text |
|
10Ah |
132x43 |
text |
|
10Bh |
132x50 |
text |
|
10Ch |
132x60 |
text |
|
10Dh |
320x200 |
Hicolor-15 |
|
10Eh |
320x200 |
Hicolor-16 |
|
10Fh |
320x200 |
Truecolor |
|
110h |
640x480 |
Hicolor-15 |
|
111h |
640x480 |
Hicolor-16 |
|
112h |
640x480 |
Truecolor |
|
и т.д.
Съем текущего видеорежима осуществляется по AX = 4F03h.
УПРАВЛЕНИЕ ВИДЕОПАМЯТЬЮ
Для адресации всех точек экрана недостаточно адресного окна размером 64К. Чтобы организовать доступ ко всей информации, видеопамять делится на банки, размером в 64К (иногда в 4К). Банки отображаются на адресное пространство видеобуфера аппаратными средствами видеоадаптера. В каждый момент используется 1 или 2 банка памяти. Чтобы определить номер необходимого банка и местоположение в нем пиксела с координатами (x, y), вычисляется смещение пиксела относительно начала видеопамяти. Старшее слово полученного 32-разрядного значения является номером банка, а младшее - смещением в этом банке. Работа с банками осуществляется в следующих режимах:
1.Режим одного банка (Single Bank Mode). Под банк отводится видеобуфер (A000:0000), под номер банка резервируется регистр видеоадаптера или его часть (Trident 3C4h/0Eh/0-3; Realtek 3D7h;
Paradise 3CEh/09h и т.д.)
2.Режим двух банков (Dual Bank Mode). Резервируется два видеобуфера (A0000 - AFFFF и B0000 - BFFFF или A0000 - A7FFF и
A8000 - AFFFF). Каждому из них соответствует либо отдельный регистр, либо часть регистра.
3.Разделенный режим (Read/Write Bank Mode). Режим аналогичен Dual Bank Mode, но оба банка отображаются на один и тот же видеобуфер (A0000 - AFFFF). Банки разделены функционально - один для чтения, другой для записи. Это позволяет переносить блоки данных между банками без использования промежуточных буферов.
Универсальное управление банками видеопамяти обеспечивает
10