Программирование EGA и VGA
ТЕСТ НА ПРИСУТСТВИЕ
Существует несколько способов для определения наличия в компьютере
адаптера EGA. Простейший тест заключается в проверке защелки ПЗУ с ад-
ресом C000:0000h (начало ПЗУ EGA). BIOS осуществляет поиск расширений
для существующей ПЗУ путем поверки на значение aa55h в разделе памяти,
зарезервированном для ПЗУ. Поэтому можно написать программу, выполня-
ющую такую же функцию. Однако BIOS PS/2 не использует C000:0000h, и
описанный метод в данном случае не применим.
Гораздо лучший метод заключается в проверке наличия функции BIOS,
являющихся уникальными для конфигурации с EGA или VGA. Прежде всего
следует установить в BX 0 и применить вызов BIOS 1ah для возврата типа
активного (и установленного, но не активного) адаптера. Если значением
BL при этом будет 7, то это означает, что задействован монохромный
адаптер VGA,а если значение BL равно 8, то цветной адаптер VGA (могут
быть возвращены и другие значения,см. описание вызова функции 1ah).При
сохранении нулевого значения BX следует, что в системе не поддержива-
ется вызов BIOS 1ah.
Итак, если функция 1ah не поддерживается, необходимо применить вы-
зов, уникальный для EGA. Таким вызовом является 12h. В BL следует уста-
новить значение 10h; в этом случае будет возвращен код для размера ус-
тановленной памяти при установленном адаптере EGA. Однако, если в BL
остается значение 10h, то установлен не EGA (при наличии EGA значение
BL будет находиться в пределах от 0 до 3).
Приведенная ниже программа выполняет описанную последователь-
ность действий и выводит информацию об установленном активном адаптере
(VGA или EGA). Следует заметить,что если VGA бал установлен как вспо-
могательный адаптер, сообщение об этом не выдается. Такая конфигурация
может быть выявлена путем проверки значения в регистре ВН после вызова
функции 1ah.
Пример на языке ассемблера
-------------------------------------------------------------------
cr equ 13 ;возврат каретки
lf equ 10 ;перевод строки
B_RAM segment at 40h
org 87h
info db ?
B_RAM tnds
data segment public
no_support db 'нет активного EGA или VGA',cr,lf
clr_ega db 'имеется активный цветной EGA',cr,lf
clr_vga db 'имеется активный цветной VGA',cr,lf
mono_ega db 'имеется активный монохромный EGA',cr,lf
mono_vga db 'имеется активный монохромный VGA',cr,lf
data ends
code segment public
assume CS:code
main proc far
start: push DS
sub AX,AX
push AX
mov AX,data
mov DS,AX
assume DS:data
mov AX,1a00h ;функция 1а возвращает код дисплея
int 10h ;AL возвращает 1ah,если есть поддержка функции
cmp AL,1ah
jne no_dc
cmp BL,7 ;это моно VGA?
je mono_v
cmp BL,8 ;это цветной VGA?
je color_v
mov BL,4 ;это цветной EGA?
je color_e
mov BL,5 ;это моно EGA?
je mono_e
no_dc:
mov AH,12h ;получение информации
mov BL,10h ;о EGA
int 10h
cmp BL,10h ;осталось 10h (не EGA)?
je invalid ;да,пропуск следующего текста
push DS
mov AX,B_RAM ;область ОЗУ BIOS
mov DS,AX
assume DS:B_RAM
mov BL,info ;получение байта информации
pop DS
assume DS:DATA
test BL,8 ;активен ли EGA?
js valid ;бит 3=0 означает.что EGA активен
invalid:
mov BX,offset no_support
jmp finish
valid:
cmp BH,1 ;монохромный монитор?
je mono_e
jmp color_e
mono_v:
mov BX,offset mono_vga
jmp finish
color_v:
mov BX,offset clr_vga
jmp finish
color_e:
mov BX,offset clr_ega
jmp finish
mono_e:
mov BX,offset mono_ega
jmp finish
finish:
call print_msg
ret
main endp
print_msg proc near
next_char:
mov dl,[bx] ;загрузить в dl
mov ah,2 ;вывести на экран
int 2lh ;вызов DOS
inc bx
cmp dl,10 ;перевести строку?
jne next_char;нет,получить следующий символ
ret
print_msg endp
code ends
end start
-------------------------------------------------------------------
ПРОБЛЕМЫ ПРИ ИСПОЛЬЗОВАНИИ ТАБЛИЦ АЛЬТЕРНАТИВНОГО ШРИФТА
Применение таблиц загружаемых альтернативных шрифтов отменяет ат-
рибут подчеркивания в режиме 7 и делает невозможным появление курсора
в режимах 0-3 на ECD. К сожалению эта проблема возникает и в текстовых
процессорах при необходимости вывода альтернативных символов и подчер-
кивания на монохромный монитор. Отмеченные сложности связаны с особен-
ностями BIOS EGA.
Применение альтернативных шрифтов в монохромном режиме приводит к
тому,что BIOS пытается поместить подчеркивание на нижнюю строку области
размещения символа. Однако при этом используется в качестве позиции
длина ячейки (1), вместо 1-1 (принимая во внимание, что номера строк
начинаются с 0). Таким образом,подчеркивание при высоте символа 14 то-
чек оказывается на четырнадцатой строке, в то время как в действитель-
ности оно должно находиться на тринадцатой. Решение проблемы заключа-
ется в том, чтобы после каждой переустановки режима производить кор-
ректную установку регистра Положение Подчеркивания. Следует заметить,
что данная проблема никак не связана с таблицей параметров, так как
Вспомогательный Указатель Алфавитно-цифрового Режима отменяет уста-
новки таблицы параметров.
Пропадание курсора на ECD также связано с программным обеспечени-
ем BIOS. Для обеспечения совместимости с CGA в режимах 0-3 BIOS всегда
подразумевает размер области размещения символа,равный 8 строкам (хотя
для ECD он равен 14 строкам). Так же, как и в случае монохромного дис-
плея, позиция курсора базируется на размере области размещения символа
(1) (при этом учитывается, что правильным значением при принятой нуме-
рации в системе будет 1-1). Однако при переустановке режима "укорочен-
ный" формат области размещения не учитывается программой BIOS, и курсор
устанавливается на строки 12-13 вместо 7-8. Обратите внимание на то,
что вызов функции BIOS для установки курсора (вызов функции 1) учиты-
вает укороченную область размещения символа, а внутренняя программа
BIOS во время установки режима - нет.
Для решения описанных проблем следует всегда в своих программах
явно устанавливать позицию подчеркивания и курсора (включая программы,
разрабатываемые не для EGA). Кроме того, будет правильным запоминать
исходные значения установок перед началом работы программы пользователя,
чтобы при окончании восстановить их.
КАДРОВЫЕ ПРЕРЫВАНИЯ
В отличие от некоторых адаптеров, требующих выполнения всех операций
ввода/вывода в интервале обратного сканирования, большинство стандарт-
ных операций EGA могут выполняться в любой момент времени. Однако,
некоторые функции, например, имеющие дело с атрибутами, должны быть
выполнены только при обратном ходе луча по кадру. Кроме того, резуль-
тат работы некоторых функций записи на экран будет лучше выглядеть,
если выполнение этих функций будет происходить во время обратного хода
луча по кадру. Кроме того, результат работы некоторых функций записи
на экран будет лучше выглядеть, если если выполнение этих функций
будет происходить во время обратного хода луча по кадру. Например, при
стирании или перезаписи объектов изображения во время развертки мо-
жет возникнуть мерцание экрана. Напротив, запись в память во время об-
ратного сканирования гарантирует, что ЭЛТ не будет иметь доступа к той
же области памяти. Следует заметить,что природа указанного мерцания от-
личается от "снега" на экране, возникающего в некоторых схемах адапте-
ров и вызванного тем, что ЦП и ЭЛТ обращаются к одной области данных.
Решающее преимущество использования кадровых прерываний связано с час-
тотой дисплея. Поскольку частота ЭЛТ во всех схемах приблизительно
одинаковая (50-70 ГЦ),обратный ход по кадру может служить встроенными
"часами" для обновления экрана. Это дает возможность обеспечить про-
крутку экрана и помещать объекты изображения примерно с одинаковой ско-
ростью на разных типах компьютеров.
Существует два метода определения состояния обратного хода луча
по кадру: либо применение запроса на прерывание IRQ2 для передачи инфор-
мации в программу о кадровом прерывании, либо использование цикла для
проверки состояния. На самом деле в аппаратном обеспечении компьютеров
AT и PS/2 применяется запрос IRQ9 (вместо IRQ2),но для совместимости
программного обеспечения она переадресуется в IRQ2. Основным преиму-
ществом в применении IRQ2 является то,что вызываемая подпрограмма яв-
ляется независимой от основной программы (программа не должна останав-
ливаться и ожидать начала обратного хода луча по кадру),а исполнение
ее всегда начинается в начале обратного хода луча по кадру (если пред-
положить, что подпрограмма EGA - первая в цепочке). Однако использова-
ние IRQ2 достаточно трудоемко и может оказаться неоправданным. Кроме
того, в некоторых EGA-совместимых адаптерах прерывание IRQ2 выполняет-
ся некорректно, а адаптер VGA фирмы IBM для компьютеров PC и AT аппа-
ратное прерывание не поддерживает. Написание программы, просто ожида-
ющей обратного хода луча по кадру, не вызывает трудностей, но состоя-
ние обратного хода луча по кадру указывает только на то, что именно
сейчас идет интервал обратного хода луча; в момент проведения провер-
ки может оказаться, что он уже почти закончился. Эту проблему можно
обойти, первый раз дождавшись интервала вывода на экран и ожидая даль-
ше начала обратного хода луча по кадру.
Что же делает применение кадрового прерывания неудобным? Необхо-
димо обеспечить программу обработки прерывания информацией о состоя-
нии; например, следует ли продвинуть изображение на один пиксель. Сле-
дует убедиться, что IRQ2 вызвано именно графическим адаптером, так как
в некоторых других адаптерах также может применяться IRQ2. Регистр
Конец Обратного Хода Луча по Кадру разрешает проверку IRQ2, а также
устанавливает момент окончания обратного хода луча по кадру. Пос-
кольку регистр Конец Обратного Хода Луча по Кадру в EGA является
только регистром по записи (в VGA может читаться его содержимое), про-
грамма должна восстанавливать его правильное содержание из таблицы па-
раметров, кроме случаев, когда можно гарантировать, что режим не
будет изменен. После использования прерывания должно быть сброшено
и вновь разрешено с помощью регистра Конец Обратного Хода Луча по
Кадру и контроллеру прерываний должно быть сообщено о разрешении
будущих прерываний при завершении программы обработки (это называет-
ся EOI - конец прерывания и выполняется с помощью пересылки значе-
ния 20h в порт 20h; описанная процедура не требуется в компьютерах
семейства PS/2). Наконец, обычно требуется окончание программы обра-
ботки прерывания до завершения обратного хода луча по кадру. Также
может оказаться желательным запретить прерывания во время работы про-
граммы обработки обратного хода луча по кадру. Кроме того, другое пре-
рывание может задержать обработку текущего прерывания.
Необходимо добавить, что в некоторых EGA-совместимых адаптерах
существуют проблемы с применением IRQ2, а бит состояния имеет обратное
значение (см. 7 бит регистра 0 Входного Состояния). В других адапте-
рах не вполне корректно запрограммирован Сброс Кадрового Прерывания
(бит 4 регистра Конец Обратного Хода Луча по Кадру). Обычно сброс
прерывания осуществляется установкой 0, а восстановление - установкой
1 (это не обязательно для запускаемых по фронту прерываний, исполь-
зуемых в компьютерах PC и AT, но требуется для прерывания, запускае-
мых по уровню сигнала и применяемых в Micro Chanel).
Примером определения кадрового прерывания с помощью IRQ2 является
программа VERTIRQ2. Программа поочередно выводит строку пробелов и
строку V на две верхние строки экрана. Первая строка выводится только
в режиме обратного хода луча по кадру, а вторая строка выводится со
скоростью выполнения компьютером цикла процедуры. При запуске программы
можно заметить, что одна строка (первая) присутствует на экране пос-
тоянно, а вторая мерцает.
Программа достаточно проста и демонстрирует сразу несколько при-
мечательных вещей. Во-первых (для тех, кто не очень близко знаком с
аппаратной поддержкой прерываний), процедура IRQ2 занимает INT 0Ah в
таблице векторов прерываний (IRQ0 - IRQ7 используют INT 8 - INT 0fh
соответственно). Во-вторых, программа не может быть успешно выполнена
без собственного стека. Программа VERTINQ2 сцепляется с программой DOS
EOI, которая устанавливает сегмент стека. Если это не сделала приклад-
ная программа, может возникнуть конфликт между стеком, создаваемым DOS,
и сегментами кодов и данных прикладной программы (процедура EOI в DOS
не идентична процедуре BIOS, описанной в Техническом Руководстве, так
как DOS должна содержать защелки в прерывании для драйверов устройств).
B-третьих, при завершении программы окончательный сброс прерывания
(через установку режима BIOS) вызывает прерывание. Необходимо быть
уверенным, что программа может выполнить этот последний запрос.
B-четвертых, следует заметить, что требуются накладные расходы на
выполнение аппаратного прерывания. Конечно, некоторые расходы могут
быть снижены путем требования запуска программы только в определенных
режимах, осуществляя выход из программы, если режим не соответствует
разрешенным, или отказавшись от проверки режима, предполагая, что pe-
жим не будет меняться. Расходы могут быть еще сильнее снижены путем иг-
норирования других программ IRQ2 (не лучший способ на практике, так как
может привести к отказу аппаратных средств, особенно на AT, в котором
объединяются в IRQ2 8 дополнительных прерываний, включая прерывания
жесткого диска). Если было принято решение применить игнорирование
других прерываний IRQ2, после окончания программы следует убедиться,
что в INT 0ah восстановлено исходное значение. Затем программа раз-
решает IRQ2 в программируемом контроллере прерываний (порт 21h) и
сохраняет предшествующие установки для их восстановления при окончании
работы программы.
[ Назад ]
[ Оглавление ]
[ Далее ]