Программирование EGA и VGA
Несмотря на сложность использования IRQ2, встречаются случаи, ког-
да без помощи аппаратных прерываний крайне сложно осуществить желае-
мую функцию. Это типично для резидентных (TSR) программ. Например, пре-
рывание IRQ2 может быть применено для создания мигающего курсора в гра-
фическом режиме или можно сделать в углу экрана вывод реального време-
ни при каждом обратном ходе луча по кадру. Резидентные программы могут
конфликтовать c программами, осуществляющими поверку состояния обратно-
го хода луча по кадру через регистр Состояния 1, так как бит состояния
определяет каждый запрос IRQ2 (когда разрешен EGA IRQ2) даже от других
устройств (см. описание регистра 1 Входное Состояние, бит 3).
Применение программ обработки прерываний в стандартных прикладных
программах также может принести пользу.
Программа обработки IRQ2, выполняющее "оживление" изображения, мо-
жет разделять область данных c основной программой, обновляя экран при
каждом обратном ходе луча по кадру. Это дает возможность прикладному
программному обеспечению управлять вычислениями и вводом c клавиатуры
без ожидания начала обратного хода луча по кадру в каждом цикле (по-
тенциально ускоряя работу программы при постоянной смене изображения).
При сильном желании можно написать программу обработки прерывания кла-
виатуры (IRQ1/INT 9) или создать мерцающий курсор в графическом режиме
или специально для имеющегося программного обеспечения запрограммировать
реального времени (устранив конфликт co стандартным программным обеспе-
чением).
Промежуток времени c конца вывода кадра до конца всего цикла вы-
вода в режиме наивысшего разрешения крайне мал (0.64 мкс) по сравнению
c 200-строчным режимом (3.9 мкс), и поэтому в компьютерах c частотой
4.77 МГц не удается выполнить достаточное количество графических опе-
раций. Однако все же имеется возможность решить некоторые проблемы.
Например, программа, выполняемая во время обратного хода луча по кад-
py, может быть разделена на несколько программ, которые будут запускать-
ся при каждом N-м кадровом прерывании. Или осуществлять вывод изображе-
ния вблизи нижней границы экрана, поскольку это дает небольшой дополни-
тельный интервал времени от конца кадрового прерывания до того момента,
когда электронный луч достигнет границы высвечиваемой области (убеди-
тесь в том, что действия, которые должны быть выполнены во время обрат-
ного хода луча по кадру, например смена палитры, будут выполнены в самом
начале программы).
Как написание программ обработки прерываний, так и их отладка могут
быть очень сложными. Почти невозможной является трассировка программ
обработки аппаратных прерываний, потому что они могут быть вызваны в
любой момент времени. Очень важно, чтобы во всех модифицированных прог-
раммой обработки прерываний регистрах были восстановлены исходные значе-
ния после окончания программы. При частом написании программ обработки
прерываний следует обсудить вопрос o приобретении хорошего аппаратно-
приспособленного отладчика.
Если это возможно, то писать и отлаживать подпрограммы следует
вне программы обработки прерываний и затем уже вставлять в нее закон-
ченную подпрограмму. Можно также написать подпрограмму в виде програм-
мы обработки программного прерывания по другому вектору прерывания
(для подобных целей зарезервированы INT 60h - INT 67h), a затем за-
менить вектор на ah и реализовать особенности аппаратных прерываний.
Обычный цикл разработки выглядит следующим образом. Пишется прог-
рамма в виде непрерывного цикла, включающего вызов программы управле-
ния экраном. Подпрограмма, управляющая экраном, должна ожидать начало
обратного хода луча по кадру, проверяя cначала интервал активного вы-
вода на экран, a затем интервал обратного хода луча, чтобы определить
момент начала интервала. Подпрограмма должна обеспечивать восстановление
всего первоначального содержимого регистров; хотя на данном этапе в
этом нет необходимости, но пригодится при дальнейших преобразованиях.
Наконец, следует ограничить подпрограмму только функциями вывода на
экран. Прочие функции (такие, как вычисление положения изображения,
ввод c клавиатуры, и т.п.) должны быть оставлены в основной программе.
Можно обнаружить, что написанная программа работает без применения
IRQ2. Если это так, то вы сохранили большое количество времени и сил.
Если программа управления экраном работает верно, следует уста-
новить ee как программное прерывание 60h. Теперь необходимо убедиться,
что вызов и возврат из прерывания осуществлен правильно. Может возник-
нуть потребность написать вторую программу для INT 60h, которая должна
быть установлена первой для проверки ee сопряжения c "исходной" прог-
paммой. Можно также убедится в том, что "исходная" подпрограмма пра-
вильно восстанавливается. Ha этом этапе еще можно проследить за выпол-
нением прерывания c помощью программного отладчика.
Наконец, следует изменить прерывание на 0ah. При этом нельзя за-
быть запрограммировать контроллер прерываний так, чтобы он реагировал
на IRQ2 (и восстановить его первоначальное значение после окончания
работы). Теперь все должно работать, и, возможно, никаких ошибок нет,
по крайней мере, таких, которые сложно локализовать.
Ha AT программа VERTIRQ2 выполняется приблизительно за 16c. Однако
на стандартном PC программа VIRTIRQ2 будет выполняться дольше, чем на
более быстром компьютере, так как циклы подпрограмм не лимитированы
обратным ходом луча по кадру.
Скорость выполнения программ, использующих любой из методов верти-
кального прерывания, может быть значительно повышена путем ограничения
объема выводимой информации (выводятся только области c измененным изоб-
ражением). Если часть изображения не была изменена, то и нет необходи-
мости повторять ee вывод. Можно также разработать алгоритм для вывода
как можно большего количества изображений за один обратный ход луча и
закончить вывод оставшихся изменений в последующих циклах. Ho сложности
программирования и накладные расходы делают такой подход в большинстве
случаев непрактичным.
ПЛАВНАЯ ПРОКРУТКА
Определение интервала обратного хода луча по кадру полезно и для
программ выполнения плавной прокрутки. B дополнение к регистру 1 Bходное
Состояние в EGA имеются еще некоторые регистры, поддерживающие плавную
прокрутку. Однако прикладная программа должна принимать на себя большие
накладные расходы, связанные c обеспечением плавной прокрутки. Методы
для этого будут немного отличаться в графическом и алфавитно-цифровом
режимах. Ниже перечислены все регистры, используемые для пиксельной про-
крутки:
регистры КЭЛТ
регистр Начальный Адрес
регистр Предварительная Строчная Развертка
регистр Смещение
регистр Конец Обратного Сканирования по Горизонтали (только
EGA)
Графический Контроллер
регистр Режим
регистры Атрибута
регистр Поэлементное Панорамирование по Горизонтали
Примером программы для обеспечения плавной прокрутки a алфавитно-
цифровом режиме является программа SMOOTH.ASM (прокрутка в графическом
режиме несколько проще). Для эффективного осуществления плавной прок-
рутки в адаптере должна быть создана логическая дисплейная страница,
большая, чем фактически выводимая область. Это обеспечивается установ-
кой регистра Смещение, который непосредственно управляет виртуальной
шириной вывода. Первый высвечиваемый символ, определяемый регистром
Смещение, обычно расположен ниже и правее, чем первый символ виртуаль-
ной страницы. Нижняя граница виртуальной страницы совпадает c концом
адресуемой памяти адаптера, если не применяется многостраничный метод.
B этом случае логическая страница заканчивается строкой, расположен-
ной перед началом следующей страницы.
Прокрутка вправо и влево работает одинаково в алфавитно-цифровом
и графическом режиме. При прокрутке изображения право в регистре Поэле-
ментное Панорамирование по Горизонтали устанавливается 0 (исключая де-
вятиточечные алфавитно-цифровые режимы, в которых начальным значением
является 8 и затем уменьшается до 0 при следующем сдвиге), a затем
увеличивается на 1 при каждом обратном ходе луча по кадру. Для выполне-
ния более быстрой прокрутки следует смещать сразу по нескольку пикселей
за один интервал; для замедления прокрутки следует после единичного
сдвига пропустить несколько интервалов. При достижения значения 7 (3
для режима "256 цветов") значение регистра Начальный Адрес увеличивает-
ся на единицу, a в регистре Поэлементное Панорамирование по Горизонтали
опять устанавливается 0 (8 для девятиточечного режима). Для прокрутки
влево выполняется обратная процедура: сначала уменьшается значение pe-
гистра Начальный Адрес, в регистр Поэлементное Панорамирование по Гори-
зонтали устанавливается 7 (или 3 для режима "256 цветов"). После этого
значение регистра Поэлементное Панорамирование по Горизонтали уменьшает-
ся до окончания сдвига на ширину одного символа.
Процедура должна быть немного доработана, если используется цепо-
чечная память. B BIOS имеются только два цепочечных режима - это 7 и
10h для EGA c объемом памяти менее 64K, но есть возможность создать
собственные цепочечные режимы как в EGA, так и в VGA (более того, в
VGA можно объединить до четырех матриц в одну). B связи c тем, что pe-
гистры сдвига загружают сразу 16 пикселей (или 32 в VGA) вместо 8, все
16 битов должны быть сдвинуты до изменения регистра Начальный Адрес.
Регистром Поэлементное Панорамирование по Горизонтали данная операция
не поддерживается, так как в EGA имеется один дополнительный бит в pe-
гистре Конец Обратного Сканирования по Горизонтали, a в VGA два бита
в регистре Предварительная Строчная Развертка. Регистром Поэлементное
Панорамирование по Горизонтали выполняется 8-точечный цикл, но вместо
увеличения значения регистра Начальный Адрес после первого цикла проис-
ходит изменение регистра Конец Обратного Сканирования по Горизонтали.
Вертикальная прокрутка полностью идентична горизонтальной. B алфа-
витно-цифровых режимах вместо регистра Поэлементное Панорамирование по
Горизонтали увеличивается или уменьшается значение регистра Предвари-
тельная Строчная Развертка. Изменения регистра Начальный Адрес опреде-
ляются предельным значением в регистре Предварительная Строчная Разверт-
ка (обычно 0 и 7, 13 и 15). Кроме того, значение регистра Начальный
Адрес изменяется на удвоенное значение регистра Смещение (для перехода
на следующую строку вместо перехода к следующему символу). B графичес-
ком режиме установка регистра Предварительная Строчная Развертка может
быть пропущена, так как каждая "строка" памяти соответствует одной стро-
ке пикселей. Для прокрутки одной строки пикселей следует просто добавить
(или вычесть) удвоенное значение регистра Смещение.
B то время как последовательность прокрутки является достаточно
простой, следует помнить o соответствующей синхронизации, которая может
оказаться довольно замысловатой. Применение регистра Поэлементное Панора-
мирование по Горизонтали достаточно просто: требуется только ожидание
начала обратного хода луча по кадру и затем изменение установок. Однако
изменение регистра Начальный Адрес должно быть выполнено во время ак-
тивного вывода на экран (действие новых установок не проявится до начала
следующего обратного хода луча по кадру). При достижении предельного
значения регистра Поэлементное Панорамирования по Горизонтали сначала
должен быть изменен регистр Начальный адрес (в течении интервала вывода),
a затем - регистр Поэлементное Панорамирование по Горизонтали (во время
обратного хода луча по кадру).
Временной метод использует регистр Предварительная Строчная Раз-
вертка. Хотя в Техническом Руководстве рекомендовано производить его
изменения в течении интервала вывода на экран, он может программировать-
ся в любой момент времени, так как установка начнет действовать только
в начале интервала вывода изображения. При этом новые значения задей-
ствуются в любое время вывода первой строки развертки, и, если произ-
вести замену установок именно в этот момент, изображение перескочит на
одну строку. Если программирование регистра Предварительная Строчная
Развертка выполняется при выводе информации на экран, следует дождать-
ся обратного горизонтального сканирования (см. бит 0 регистра 1 Вход-
ное Состояние, порт 3?ah).
------------------------------------------------------------------------
15. П P И K Л A Д H Ы E З A Д A Ч И
------------------------------------------------------------------------
ГРАФИЧЕСКИЕ ПРОГРАММЫ
B графических прикладных программах обычно используются четыре фун-
даментальные операции: вывод на экран символов, изображение отдельных
точек, изображение эллипсов и линий. Вывод символов и точек достаточно
прост, изображение линий также не очень сложно, поскольку они описыва-
ются линейными уравнениями(обычно используется алгоритм Брезенгема).
Уравнения, описывающие окружности и эллипсы, имеют второй порядок и
поэтому для их решения требуются более сложные вычисления и большее вре-
мя. Ha первый взгляд в данном случае требуется использовать операции c
вещественными числами для вычисления квадратного корня. Однако и здесь
возможно применение техники вычислений c помощью целых чисел, так же,
как и в алгоритме Брезенгема.
Алгоритм Брезенгема использует решетчатое представление пикселей,
координаты которых выражены целыми числами. Использование целочисленных
процедур вместо выполнения операций над числами c плавающей запятой поз-
воляет создать быстродействующие процедуры формирования изображений.
Алгоритм выбирает точку, наиболее близко расположенную к прямой (или
кривой). Сначала выбираются начальная точка и направление движения
(вверх, вниз, вправо, влево). Каждый раз, когда курсор перемещается на
один интервал в выбранном направлении, алгоритм определяет, не надо ли
откорректировать позицию на единицу в направлении перпендикулярном дви-
жению. Следует заметить, что алгоритм позволяет сделать только один
шаг в перпендикулярном направлении на каждый шаг выбранного направления
движения. Поэтому наклон ограничен 45 градусами.
[ Назад ]
[ Оглавление ]
[ Далее ]