Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программирование 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) и
сохраняет предшествующие установки для их восстановления при окончании
работы программы.

[ Назад ] [ Оглавление ] [ Далее ]

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог