Программирование EGA и VGA
Текстовый и графический режимы.
Смена режима, как правило, выполняется через BIOS, так как эта операция не критична ко времени выполнения, но весьма трудна для программирования. Графическая плата IBM поддерживает два типа режимов. Вопервых, алфавитно-цифровой режим (называемый также "альфа" или "текстовым"), который позволяет вывести только 256 различных символов (при использовании специальных методов программирования EGA позволяет вывести до 512 символов одновременно). Во-вторых, графический режим, позволяющий осуществить индивидуальный вывод на экран любого элемента изображения (пикселя), а также 256 предопределенных символа. Графический режим иногда называют APA (All Point Addressable - адресующий все точки), поскольку он поддерживает индивидуальное управление всеми элементами изображения (пикселями).
EGA имеет 5 текстовых и 7 графических режимов. Текстовые режимы имеют номера 0 - 3 и 7. Режимы 0 - 3 не отличаются от режимов 0 - 3 CGA, а режим 7 близок к режиму 7 монохромного адаптера. Графические режимы 4 - 6 EGA не отличаются от режимов 4 - 6 CGA. Новые графические режимы (предусматривающие высокое разрешение и/или большее количество цветов) пронумерованы 0dh - 10h. После установки режима информация может быть записана на экран (или считана с него) с помощью вызова функций BIOS или непосредственного доступа к видеопамяти.
Режим Тип режима Совместимость ----- ------------------ --------------- 0 алфавитно-цифровой Совместим с CGA 1 алфавитно-цифровой Совместим с CGA 2 алфавитно-цифровой Совместим с CGA 3 алфавитно-цифровой Совместим с CGA 4 графический Совместим с CGA 5 графический Совместим с CGA 6 графический Совместим с CGA 7 графический Совместим с MDA 0dh графический Новый режим 0eh графический Новый режим 0fh графический Новый режим 10h графический Новый режим ----- ------------------ ---------------
VGA позволяет расширить приведенный список еще на три дополнительных режима: монохромный и цветной высокого разрешения и цветной графический с низким разрешением, но допускающий использование 256 цветов. Несмотря на то, что 256-цветный режим имеет низкое разрешение, при его использовании некоторые изображения выглядят более реалистично, поскольку за счет большого количества цветов возможно отображение мелких деталей изображения. Эффективное применение таких деталей может повысить кажущееся разрешение изображения.
IBM сохраняет совместимость между обращениями к BIOS и адресацией памяти для пронумерованных режимов, поэтому использование имеющихся режимов возможно в любом случае. За счет применения режимов 0 - 7 и параметров, которые приводятся в таблицах настоящего руководства, написанные программы будут совместимы со всеми типами существующих адаптеров и теми адаптерами, которые предполагается производить.
В этой главе описаны обращения к функциям 0 - 7, то есть функциям, которые устанавливают состояние экрана и его окружения (режим, размещение курсора, и т.д.). Эти функции являются общими для всех типов видеоадаптеров IBM, кроме того, EGA и VGA позволяют несколько расширить возможности. Например, эти адаптеры позволяют использовать дополнительные страницы дисплея.
Вызов функции 0: Установка режима.
Комментарии
Эта функция используется для выбора режима работы адаптера. Основными режимами являются алфавитно-цифровой (неграфический), графический 320х200, графический 640х200 и графический 640х350. Применение VGA делает доступным графический режим 640х480. Запись символов может быть выполнена с помощью функций 9, 0ah, 0eh и 13h. Построение точек выполняется с помощью функции 0ch.
Исходные данные
Регистры (устанавливаются до вызова функции): --------------------------------------------------------------- AH: устанавливается 0 AL: устанавливается номер режима: 0,1 - 40 столбцов, алфавитно-цифровой, совместим с CGA 2,3 - 80 столбцов, алфавитно-цифровой, совместим с CGA 4,5 - 320х200 4-цветный графический, совместим с CGA (ограничение: только 2 палитры) 6 - 640х200 2-цветный графический, совместим с CGA (один из цветов должен быть черный) 7 - алфавитно-цифровой монохромный, совместим с MDA 8-0ch - резерв 0dh - 320х200 16 цветов 0eh - 640х200 16 цветов 0fh - 640х350 монохромный графический 10h - 640х350 цветной графический (4 цвета для EGA с 64К, 16 цветов для EGA с >64К) 11h - 640х480 монохромный графический, только VGA 12h - 640х480 16-цветный графический, только VGA 13h - 320х200 256-цветный графический, только VGA ---------------------------------------------------------------
Использование комбинации EGA/монохромный монитор возможно только для режимов 7 и 0fh (эти режимы могут не поддерживать комбинацию EGA/ цветной монитор).
При необходимости сохранения экранной памяти при переустановке режима следует задать значение старшего бита регистра AL равным 1. Это делается путем увеличения номера режима на 80h.
Программа, приведенная ниже, позволяет установить цветной графический режим с разрешением 640х350 и изобразить линию от левой до правой границы экрана вдоль строки 10 всеми возможными цветами (вызов функции ch BIOS). Режим 10h будет сохранен после выполнения программы. Для возвращения в текстовый режим следует дать команду MODE CO80.
Пример на ассемблере:
data segment public clr db 16 ;начальное значение цвета - 16 data ends code segment public assume CX:code main proc far start: push DS sub AX,AX push AX mov AX,data mov DS,AX assume DS:data mov AH,0 ;функция 0 - установка режима mov AL,10h ;выбор режима 10h int 10h ;обращение к видео-BIOS mov CX,639 ;это будет столбец lp: mov AH,0ch ;функция ch - изображение точки mov AL,clr ;установка цвета dec AX ;вычитание 1 из номера цвета mov clr,AL ;сохранение нового цвета jnz skip ;переход на skip, если цвет не 0 mov clr,16 ;установить цвет равным 16 skip: mov BH,0 ;выбор страницы 0 mov DX,10 ;установить строку 10 int 10h ;обращение к видео-BIOS loop lp ;декремент CX (следующий столбец) ret main endp code ends end start
Пример на языке Turbo-Pascal:
type regs = record AX,BX,CX,DX,BP,SI,DI,DS,ES, FLAGS:INTEGER; end; var reg : regs; column,color : integer; begin reg.AX:=$0010; intr($10,reg); color:=16; for column:=639 downto 0 do begin color:=color-1; reg.AX:=$0c00+color; if color=0 then color:=16; reg.BX:=0; reg.DX:=10; reg.CX:=column; intr($10,reg); end; end.
Этот и последующий примеры приведены в версии 3.0 Turbo-Pascal. Для преобразования к более поздней версии см. "Руководство пользователя по системе Turbo-Pascal 5.0".
Вызов функции 1: Уcтановка типа курсора.
Комментарии
Эта функция позволяет установить размер курсора. Предусмотрено определение первой и последней линий (имеются в виду линии или строки развертки), ограничивающие область расположения символа (установка начальной линии вверху области, а конечной - внизу области необязательна, то есть курсор может быть установлен в середине описанной области). Следует отметить, что в графическом режиме курсор отсутствует.
Для определения начальной и конечной линий требуются только 4 младших бита. Значения битов 5 и 6 всегда устанавливаются равными 0. Линия 0 является самой верхней линией области расположения символа. Курсор может быть отключен установкой первой и последней строки ниже об
ласти расположения символа. При работе с EGA установка значения начальной строки, большего значения конечной строки, приводит к "перевороту" курсора, в результате чего отображается двойная линия (это напоминает инверсное отображение курсора на поле символа). VGA не поддерживает сдвоенный курсор; при установке номера начальной строки, большего номера конечной строки, курсор на VGA просто не отображается.
В случае использования ECD возможен несколько необычный результат работы с функцией 1. В связи с тем, что прежние цветные алфавитно-цифровые режимы использовали 8-строчный курсор, поддерживается установка только 8 строк. Алфавитно-цифровой режим ECD предусматривает использование 14-строчной области расположения курсора: линии 0 - 4 определяют верхние 5 строк, а линии 5 - 7 нижние 3 строки. Любой из диапазонов, содержащий линии 4 и 5, также определяет 6 линий между ними ( при установке курсора на линиях 4 и 5 формируется изображение курсора в виде большого прямоугольного блока).
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается 1
- CH: номер начальной строки (линии развертки в текстовой строке)
- CL: номер конечной строки (линии развертки в текстовой строке)
С помощью приведенной ниже программы формируется изображение курсора, состоящее из двух верхних линий области расположения символа.
Программа на языке ассемблера:
code segment public assume CX:code main proc far start: push DS sub AX,AX push AX mov AX,1 ;функция 1 - установка режима курсора mov CX,1 ;начальная линия 0, конечная 1 int 10h ;обращение к видео-BIOS ret main endp code ends end start
Пример на языке Turbo-Pascal:
type regs = record AX,BX,CX,DX,BP,SI,DI,DS,ES, FLAGS:INTEGER; end; var reg : regs; begin reg.AX:=$0100; reg.CX:=$0001; intr($10,reg); end.