Программирование EGA и VGA
4 пикселя
на байт
--------T-------T-------------¬
0¦ b8000h¦ b8001h¦ ¦
+-T-T-T-+-T-T-T-+ ¦
четные 2¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+-+-+-+-+-+-+-+-- ¦
¦ ¦ ¦ ¦ ¦ ¦
строки 4¦ ¦ ¦ ¦ ¦ ¦
+-+-+-+-+ -----
¦ ¦ ¦ ¦ ¦ ¦
развертки 8¦ ¦ ¦ ¦ ¦ -----
+-+-+-+-- ¦
¦ ¦
¦ -------
¦ ¦
L----------------
--------T-------T--------------¬
1¦ ba000h¦ ba001h¦ ¦
+-T-T-T-+-T-T-T-+ ¦
нечетные ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
3¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+-+-+-+-+-+-+-+-- ¦
строки ¦ ¦ ¦ ¦ ¦ ¦
5¦ ¦ ¦ ¦ ¦ ¦
+-+-+-+-+ ------
развертки ¦ ¦ ¦ ¦ ¦ ¦
7¦ ¦ ¦ ¦ ¦ ----
+-+-+-+-- ¦
¦ ------
¦ ¦
L------------------
Рис.5.2. Двухцветная графика CGA
--------T-------T------T------T¬
0¦ a0000h¦ a0001h¦ ¦ ¦¦
+-------+-------+------+-------¦
1¦ ¦ ¦ ¦ ¦
+-------+-------+------- ¦
2¦ ¦ ¦
+-------- ¦
¦ ¦
¦ ------
¦ ¦
¦ ----
¦ ¦
¦ ------
¦ ¦
L------------------
Рис.5.3. 256-цветный режим VGA
Прочие новые режимы, поддерживаемые EGA и VGA, также используют
более простую организацию, нежели CGA, однако при этом усложняется за-
пись различных цветов. Начальным адресом всех новых графических режи-
мов является адрес a0000h. Каждому биту поставлен в соответствие один
пиксель. Таким образом каждый байт описывает 8 пикселей. Может пока-
заться странным, что с помощью одного бита описывается 16 цветов.
Объяснением этого является своеобразная организация EGA/VGA.
Память организована в виде битовых матриц (bit planes). Матрицы
могут размещаться по одному и тому же адресу: для 4-цветных режимов
требуется две матрицы, а для 16-цветных - четыре матрицы. Матрицы мож-
но наглядно представить в виде блоков памяти, которые помещаются один
над другим. Каждой адресуемой ячейке памяти ставится в соответствие до
четырех битов,по одному из каждой матрицы. Каждая комбинация матриц
определяет цвет (выбранный из 64 возможных цветов), при этом любые
комбинации матриц могут быть изменены одновременно.
Организация памяти в виде битовых матриц удобна по трем причинам.
Во-первых, положение пикселя на экране непосредственно связано с его
расположением в памяти. В простейшем случае каждая битовая матрица свя-
зана с основным цветом и яркостью (точнее говоря, такое положение
верно не столько для EGA и VGA, сколько для цветной схемы, принятой по
умолчанию). Во-вторых, количество цветов может быть удвоено просто за
счет добавления одной битовой матрицы. Программы, осуществляющие опе-
рации прямой записи в память, не нуждаются в пересчете адресов для но-
вых совместимых адаптеров, если выполнение цветов выполнено через но-
вые матрицы. В-третьих, модифицирование памяти в 1024-цветном режиме
(если бы такой режим поддерживался ) выполняется также быстро, как
и в 2-цветном режиме, поскольку модифицирование всех битовых матриц
может быть выполнено за одно обращение к памяти.
Однако для управления битовыми матрицами требуются некоторые до-
полнительные операции. Дополнительные матрицы не принесут много поль-
зы, даже если все они записываются одновременно, поскольку количество
поддерживаемых цветов останется равным двум. Адаптер предусматривает
два метода для установки цветной точки по команде центрального процес-
сора ( третий метод предназначен для перемещения данных из одной ячей-
ки памяти адаптера в другую с полным сохранением сведений о цвете).
Первый метод основан на использовании регистра Маскирования Растра
(Map Mask Register) для определения битовых матриц, в которых устанав-
ливаются значения 1. Каждый раз при изменении цвета в регистр Маскиро-
вания Растра должно записываться новое значение.
Необходимо отметить, что регистр Маскирования Растра предназначен
не для определения матриц,в которые записываются значения 1, а для оп-
ределения изменяемых матриц. Для записи чистых цветов необходимо запи-
сать 0 во все битовые матрицы (для очистки немодифицированных матриц
перед записью новых значений). Альтернативным вариантом является ис-
пользование регистров Установка/Сброс (Set/reset) и Разрешение Уста-
новки/Сброса (Enable Set/Reset) для очистки этих же матриц. Следует
записать 0 в регистр Установка/Сброс для записи 0 в разрешенные матри-
цы. После этого нужно применить логическое отрицание регистра Маскиро-
вание Растра для регистра Разрешение Установки/Сброса, т.е. если зна-
чение, помещенное в регистр Маскирования Растра, равно 0101b, значение
в регистре Разрешение Установки/Сброса будет равно 1010b. Применение
метода Установка/Сброс предпочтительно в случае записи символов, пос-
кольку в этом случае используется все восемь битов (таким образом осу-
ществляется очистка фона); запись 0 во все матрицы предпочтительна для
построения изображений и при записи символов без воздействия на фон в
связи с тем, что незадействованные пиксели могут быть маскированы.
Поскольку ЦП выполняет запись полного байта, после каждого обраще-
ния к памяти осуществляется изменение состояния восьми пикселей, запи-
санных в измененные битовые матрицы, где значения битов равны 1, и
отключении для нулевых значений битов. Такой метод удобен для записи
символьных данных в графическом режиме (где каждый символ представлен
трафаретом шириной в 8 битов), однако не пригоден для построения от-
дельных пикселей. Регистр Битовой Маски (Bit Mask register) может быть
использован для выборки отдельных пикселей из байта. Если бит маски
имеет значение 1, возможно изменение значения соответствующего бита
каждого, и , следовательно, модифицирование пикселя может быть выпол-
нено установкой только одного бита в маске. Следует отметить, что пик-
сель может быть "включен" или "выключен" путем установки значения со-
ответствующего бита ЦП в 1 или 0 соответственно (т.е. установка пик-
селя в единицу не выполняется принудительно регистром Битовой Маски).
Использование регистра Маскирования Растра для определения цве-
тов является принятой по умолчанию технологией BIOS и может рассмат-
риваться как запись в режиме 0 (не следует путать с видео режимами
BIOS). Поскольку большинство функций BIOS работает с символьными дан-
ными, которые они получают в восьмибитовом формате, имеет смысл ис-
пользовать в BIOS именно такой прием. Однако в EGA предусмотрен иной
метод для записи видеопамяти, как правило работающий лучше при постро-
ении отдельных пикселей. Этот метод называется записью в режиме 2 и
поддерживается с помощью регистра Режима Графического Контроллера(Gra-
phics Contrroller Mode register). В случае записи в режиме 2 регистр
Маскирования Растра не используется; номер цвета помещается в регистр
ЦП, а затем переписывается в память адаптера. Этот метод имеет серьез-
ное преимущество по сравнению с режимом записи 0, состоящее в том, что
во все четыре битовые матрицы записываются 0 и 1 в соответствие с вы-
бранным цветом, что позволяет экономить на одной операции записи(чер-
ный записывается перед цветом), или на использовании регистров Уста-
новки/Сброса. Как и в режиме записи 0, выбор пикселей осуществляется
за счет использования регистра Битовой Маски (на режим записи 2 влияет
состояние регистра Маскирования Растра, значение которого в обычном
случае должно быть равно 0f для разрешения всех битовых матриц).
Установка режимов записи 0 и 2 также определяется значениями, по-
мещенными в другие регистры. Из этих регистров наиболее часто исполь-
зуется регистр Циклического Сдвига Данных (ЦСД) (Data Rotate register)
Регистр ЦСД определяет АЛУ, которые будут выполнять логические операции
с данными ЦП и адаптера (Арифметико-Логические Устройства представляют
собой внутренние устройства, комбинирующие содержимое регистра-защелки
и данные ЦП для каждой битовой матрицы). Таким образом,при необходи-
мости записи текста без изменения фона следует выполнять следующие
действия.
1. Провести логическое умножение (операция И) инверсного изображения
символа во всех битовых матрицах и немаскированных битах (для очистки
пикселей,формирующих символ).
2. Выполнить логическое сложение (ИЛИ) пикселей символа требуемого цве-
та (при использовании цвета, отличного от 0).
Предложенный метод удобен для создания мультипликации. Альтерна-
тивным способом является использование трафарета символа для установки
битовой маски и запись в режиме 2 с целью установки требуемого цвета
непосредственно процессором. На первый взгляд управление выводом пик-
селя является сравнительно простой операцией и представляет собой сле-
дующую последовательность действий.
1. Указать адрес и бит.
2. Поместить в регистр Битовый Маски значение 0f, после чего записать
0 по адресу (если не используется режим записи 2).
3. Установить цвет посредством использования регистра Маскирования
Растра (если не используется режим записи 2).
4. Записать пиксель.
Хотя приведенная схема в сущности правильна, существуют осложне-
ния, связанные с архитектурой аппаратных средств, значительно затруд-
няющие задачу. Например, отсутствие возможности прямого доступа к па-
мяти адаптера со стороны ЦП. Для сохранения немодифицированных битов
текущее содержимое памяти адаптера должно загружаться в набор регист-
ров-защелок (имеются четыре восьмибитовых регистра-защелки - по одно-
му для каждой битовой матрицы).
Загрузка в регистры-защелки выполняется путем перемещения данных
из памяти адаптера в ЦП, т.е. путем выполнения команды MOV AL,ES:BX,
где ES:BX - указатель на нужную ячейку памяти (значение, содержащееся
в AL, как правило, игнорируется, поскольку оно зависит от режима чте-
ния.См.ниже). При записи из ЦП в память данные ЦП комбинируются с дан-
ными в регистре-защелке и в АЛУ, после чего данные сохраняются в памя-
ти адаптера. По большей части эта операция скрыта от пользователя, но
несколько регистров дают возможность управлять описанным процессом.
Дополнительные аппаратные сложности обусловлены ограниченностью
адресного пространства портов семейства РС. Например,регистры Маскиро-
вания Растра,Установка/Сброс, Разрешение Установки/Сброса и регистр
Битовой Маски могут быть выбраны косвенно через адресные регистры.
Регистр Маскирования Растра доступен через регистр Адреса Указателя
Последовательности (Sequencer Addres register). Регистр Адреса Указа-
теля Последовательности записывается с индексом регистра Маскирования
Растра, после чего выполняется запись Маскирования Растра с матрицами,
которые будут модифицированы. Таким же образом другим регистрам может
соответствовать тот же адрес порта,что и регистру Маскирования Растра,
тем самым происходит экономия адресного пространства. По аналогии с
битовыми матрицами, которые образуют "слои" памяти, можно говорить о
слоях регистров (хотя за один раз возможно изменение только одного ин-
дексного регистра). Доступ к регистрам Битовой Маски, Установки/Сброса
и Разрешения Установки/Сброса происходит аналогичным образом через ре-
гитр Адреса Графики 1 и 2 (Graphics 1 and 2 Address register).
EGA и VGA используют косвенный режим адресации для обращения к
регистрам (и памяти). В нескольких случаях ссылка выполняется на глу-
бину до 3 уровней: адрес указателя на второй адрес, указывающий на та-
блицу значений. Приведенная ниже диаграмма может быть полезна при
рассмотрении использования регистров (уже упоминающиеся регистры отме-
чены символом).
Регистры EGA, используемые для доступа к памяти и реализации
дополнительных возможностей
Адрес Сброс(Reset)
Указателя
Последовательности
Режим синхронизации (Clocking Mode)
Маскирование Растра (Map Mask)
Выбор Символьного Растра (Character Map Select)
Выбор Режима Памяти (Memory Mode Select)
Адрес Графики Установка/Сброс (Set/Reset)
1 и 2
Разрешение Установки/Сброса (Enable Set/Reset)
Сравнение цветов (Color Compare)
Циклического Сдвига Данных (Data Rotate)
Выбор Схемы Чтения Растра (Read Map Select)
Режима (Mode)
Смешанный (Miscellaneous)
Цвет Безразличен (Color Don't Care)
Битовой Маски (Bit Mask)
Ниже рассматривается процесс вывода пикселя. Предполагается,что
установлен режим записи 0, поскольку именно этот режим предусмотрен в
BIOS по умолчанию. Во-первых, необходимо выбрать регистр Битовой Маски
с помощью регистра Адреса Графики 1 и 2. Далее следует рассчитать
ячейку памяти, в которой располагается изменяемый пиксель. Пусть тре-
буется построить пиксель с координатами: 23-й столбец, 183-я строка. В
строке помещается 640 пикселей. Это означает, что изменяемым является
бит 183*640+23=117143. Для получения номера байта следует разделить
полученный результат на 8:117143/8=14642 и 7 в остатке. По этому номе-
ру (14642) программой считывается байт для загрузки через регистры-за-
щелки (предполагается, что DS является указателем на сегмент адап-
тера):
mov BX,14642 ;указатель на байт
mov AL,[BX] ;загрузка регистров-защелок
Остаток 7 указывает на необходимость установки нулевого бита, так
как начиная с бита 7 слева невходимо сместиться вправо на 7 позиций
(направление оси координат дисплея слева направо). Для модификации ну-
левого бита без влияния на остальные пиксели в байте требуется устано-
вить регистр Битовой Маски. Для этого следует выбрать Битовую Маску,
записав 8 в порт 3ceh (регистр Адреса Графики 1 и 2), после чего за-
писать1 в нулевой бит порта 3cfh(регистр Битовой Маски).
mov DX,3ceh ;установка адресного регистра Адреса Графики 1 и 2
mov AL,8 ;индекс регистра Битовой Маски
out DX,AL
mov DX,3cfh ;выбор регистра Битовой Маски
mov AL,1 ;установка младшего бита Битовой Маски
out DX,AL
Следующая операция - это выбор регистра Маскирования Растра с
помощью регистра Адреса Указателя Последовательности. Эта операция
выполняется посредством записи значения 2 в порт 3c4h. Очистка теку-
щего цвета производится посредством установки значения маски 0fh и
записи0. После этого значение цвета (число, представляющее модифициру-
емые битовые матрицы) записывается в порт 3c5h. Так выполняется вывод
пикселя:
mov DX,3c4h ;указатель на регистр Адреса Указателя
;Последовательности
mov AL,2 ;индекс регистра Маскирования Растра
out DX,AL
mov DX,3c5h ;указатель на регистр Маскирования Растра
mov AL,0fh ;все битовые матрицы (1111b)
out DX,AL
mov [BX],0 ;запись 0 для очистки матриц
;замечание:регистр Маскирования Растра еще
;задействован
mov AL,0ah ;цвет 10-битовые матрицы 4 и 2 (1010b)
out DX,AL ;установка маски Растра
mov [BX],0ffh;запись цвета
Как видно из приведенного текста,требуется довольно много кодиро-
вания для выполнения такой простой операции,как вывод пикселя (и это с
учетом того, что раздел расчета адресов в текст не включен).Безусловно,
нельзя утверждать, что программа, часть которой приведена выше,харак-
теризуется высоким быстродействием. Однако существуют способы, позво-
ляющие уменьшить размер кода и увеличить быстродействие.Программа, в
которой используется один из этих методов(режим записи 0), предназна-
ченная для построения линии в верхней части экрана,приведена в Прило-
жении. Аналогичная программа,основанная на обращениях к функциям BIOS,
приведена в разделе описания обращения к функции 0 главы 2.Программы
построения линии и эллипса демонстрируют использование режима записи
2, наилучшим образом подходящего для построения пикселей.
[ Назад ]
[ Оглавление ]
[ Далее ]