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

Ваш аккаунт

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

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

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

Программирование EGA и VGA

В данном методическом материале рассматривается архитектура графических адаптеров для управления дисплеями классов EGA и VGA, широко применяемых в персональных компьютерах, совместимых с IBM PC. Приводятся основные методы программирования таких адаптеров, даются примеры программ и правила написания драйверов. Материал будет полезен системным программистам и программистам прикладных программ, работающим на компьютерах, совместимых с IBM PC, и применяющих нестандартные приемы работы с графической информацией.

Предисловие

После своего появления в конце 1984 года усовершенствованный графический адаптер (EGA) стал стандартом графики для персональных компьютеров IBM. Сегодня к нему присоединился более мощный и сложный стандарт графики - массив видеографики (VGA). Поскольку EGA является наиболее популярной дополнительной платой для миллионов компьютеров PC, XT, AT и совместимых с ними, а VGA представляет собой стандарт для новых серий компьютеров, выполненных на основе микропроцессоров 80286 и 80386, т.е. PS/2, нет необходимости объяснять важность знания этих графических стандартов для всех, кто интересуется программированием на описанных типах персональных компьютеров и желает наиболее полно использовать графические возможности компьютера.

Однако получить подробную информацию об этих двух графических картах не так просто. Документация по EGA и VGA рассеяна по отдельным руководствам, трудна для понимания и нередко имеет отрывистый характер. Более того, эти руководства содержат небольшое количество примеров, а многие из приведенных примеров представляют собой только фрагменты программ , которые необходимо объединить с еще с несколькими фрагментами, чтобы получить работающую программу. Несмотря на то, что в различных журналах имеется довольно большое число статей, посвященных программированию EGA/VGA, найти то или иное описание в этих статьях достаточно трудно, кроме того значительные сложности вызывает выбор технологии, которая отличается в различных публикациях.

Таким образом, программирование EGA/VGA не только достаточно сложно само по себе, но на программиста ложится дополнительная задача поиска информации, необходимой для понимания работы графических адаптеров.

Цель настоящего руководства - устранить отмеченные выше сложности, объединив все имеющиеся материалы по EGA/VGA в одной работе, расширив число ситуаций, для которых приведены примеры программ, и предоставив некоторые практические рекомендации для повышения эффективности техники программирования EGA/VGA.

В данном документе объединены справочные материалы и объяснения с последовательным использованием терминологии, что облегчает понимание программирования графики, позволяет увеличить производительность, улучшить качество и повысить профессионализм пользователя. В работе особое внимание уделяется достижению следующих целей.

Во-первых, поскольку общими факторами, определяющими качество вывода информации, является скорость, четкость (отсутствие мерцания и других нежелательных эффектов) и размещение информации на экране, наиболее подробно рассматриваются скорость вывода и четкость изображения, так как достижение требуемых характеристик наиболее трудно осуществимо.

Многим доводилось наблюдать игровые программы, в которых встречалось явление мерцания очертаний изображений или некоторых областей экрана при смене изображения или в процессе ожидания вывода от пользователя. Такое мерцание является общей проблемой при программировании на языках высокого уровня. Однако этого недостатка не имеет коммерческое программное обеспечение, распространяемое производителями через торговую сеть, независимо от того, какие задачи это программное обеспечение выполняет (игровые или прикладные программы), изображение на экране остается неподвижным. Это объясняется тем, что профессиональные программисты, понимающие принципы работы адаптера, имеют возможность координировать видеовывод с работой адаптера и быстродействием дисплея. Обычно программирование подобных задач выполняется на языке ассемблера, поскольку он располагает наибольшими возможностями по управлению аппаратурой. Управление аппаратурой заключается в возможности определения текущего состояние и непосредственного внесения изменения в память. В "Руководстве..." сделана попытка обучения технике написания таких программ на языке ассемблера.

Несмотря на то, что в настоящей работе приведены примеры программ, выполненные в основном на ассемблере, описанные методы могут быть адаптированы к другим языкам в случае, когда читатель знает как осуществить прямой доступ к памяти, регистрам ввода-вывода и способам программной обработки прерываний. Хотя управление аппаратным обеспечением не является стандартной частью языка, в большинстве компьютеров эти особенности поддерживаются посредством использования расширенных возможностей трансляторов. (Например, на языке BASIC указанные функции поддерживаются операторами PEEK, POKE, IN и OUT, а на языке Turbo Pascal - функцией INTR, возможностью абсолютной адресации памяти, встроенного кода). Программирование с использованием BIOS - простейший путь для начинающих программистов (BIOS (Basic Input Output System) - базовая система вво

да/вывода. Часто BIOS - это ПО персонального компьютера, поддерживающее управление адаптерами внешних устройств, экранные операции и т.д. BIOS, как правило, разрабатывается изготовителем компьютера и хранится в ПЗУ.) При наличии некоторого опыта работы на ассемблере программирование с использованием BIOS может оказаться достаточно простым делом. В этом случае раздел, содержащий справочные данные по обращению к BIOS, может быть пропущен. Те пользователи, для которых программирование на языке ассемблера является новым родом деятельности, вскоре заметят, что процедуры BIOS характеризуются простотой и невысоким быстродействием, что не характерно для большинства конечных продуктов. После завершения изучения процедур BIOS можно сразу перейти к рассмотрению вопроса регистрового программирования и к более сложным концепциям программирования.

Некоторые из приведенных небольших примеров представляют собой незамысловатые демонстрационные программы. Эти программы приводятся не для того, чтобы демонстрировать возможности EGA/VGA (вероятнее, многие знают о возможностях адаптеров и хотели бы самостоятельно писать программы, реализующие эти возможности), а с целью показать простые, завершенные программы, реализующие возможности адаптеров. Короткие программы легче ввести, не сделав каких-либо ошибок. Желательно попробовать реализовать демонстрационные программы, сделать какие-либо их модификации и использовать в качестве базы для дальнейшей работы. Можно избежать процедуры ввода исходного кода. Для этого следует приобрести дискету, на которой содержаться исходные тексты демонстрационных программ.

Если работа с ассемблером для читателя новое дело, следует быть особенно внимательным. В "Руководстве..." в приведенных примерах использовано несколько полезных методов, диапазон применения которых выходит за рамки программирования графики. Например, программа для изображения эллипса использует 32-битовую и 48-битовую целочисленную арифметику. Хотя этот пример достаточно прост, описание подобных методов, как правило, не приводится (во многих прикладных программах использование 16-битовых целых сильно ограничивает их возможности). В примерах также можно найти широкое использование большинства команд ассемблера 8086.

Приведенные примеры не всегда являются оптимальными с точки зрения эффективного быстродействия или приведенного алгоритма. При подборе примеров преследовалась цель сбалансировать простоту чтения со скоростью выполнения и качеством применяемого алгоритма. Кроме того, преследовалась цель использовать в различных примерах различные методы, чтобы привести возможно большее количество подходов к реализации какой-либо функции. Исключением из этого правила являются программы построения линии и эллипса. В этих программах для повышения быстродействия и гибкости жертвуется наглядностью и размером кода.

Отдельные примеры программирования с использованием BIOS связаны с другими примерами. Например, демонстрационная программа для установки графического режима адаптера 640х350 не выполняет обратного переключения после завершения работы. Таким образом можно наблюдать результаты выполнения в графике некоторых других программ, использующих BIOS (для возврата в алфавитно цифровой режим следует дать команду MODE CON CO80). Некоторые из зависимостей примеров описаны в соответствующих замечаниях. Для лучшего понимания функционирования BIOS следует реализовать на компьютере отдельные примеры.

Можно попытаться усовершенствовать программу. В связи с этим необходимо решить ряд вопросов. Можно ли повысить быстродействие и гибкость программы? Следует ли включать дополнительные проверки на допустимость? Некоторые приемы приведены в предлагаемых примерах. Стандартными методами являются использование команды SUB или XOR (вместо MOV) для обнуления регистра и использование сдвиговых операций для деления и умножения на степени 2. При этом возникает вопрос, как работать с прочими константами: Команда MUL обладает низкой скоростью выполнения; отдельные последовательности команд ADD и SHL могут быть выполнены гораздо намного быстрее ( в этом случае снижается гибкость, поскольку выполнение операции умножения переменных становится невозможным).

Если таблица времени выполнения команд ассемблера отсутствует, её можно получить, используя Macro Assembler фирмы Microsoft, который содержит эту информацию. Есть ёще несколько путей, кроме указанного для получения рассматриваемой информации. Некоторые издания по языку ассемблера и "Programmer's Pocket Reference Guide" фирмы Intel содержат дополнительную информацию. При необходимости повышения быстродействия программы следует опробовать несколько методов, после чего определить метод, позволяющий получить самые высокие показатели скорости выполнения. При проведении испытаний возможно получение времен исполнения команд, но, несмотря на это, как правило достаточно одного взгляда на таблицу времен, чтобы некоторые методы были отброшены. Однако полностью доверять полученным результатам не следует; нередко они зависят от возможности предварительного подбора данных для вызова подпрограммы, типа процессора и числа тактов ожидания памяти или соответствующего порта (особенно при взаимодействии с экранной памятью).

Если производительность программного продукта является определяющим фактором, следует сравнить те подпрограммы, которые выполняются за приблизительно равное число тактов. По возможности следует попробовать выполнить программу на различных процессорах, при этом целесообразно организовать цикл, с помощью которого можно повторять каждую программу достаточное число раз для определения времени выполнения. Экспериментируя с различными методами, можно значительно повысить производительность программы и в тоже время глубже познакомиться с системой программирования. В том случае, когда быстродействие не играет определяющей роли, следует иметь в виду, что размер адресуемой EGA памяти составляет 256К, тогда как для цветного экрана CGA этот же размер ограничен 16К. Как правило, всё адресное пространство используется, при этом размер изображения, находящегося в памяти, зависит от разрешения и количества используемых цветов.

Кроме использования различных последовательностей команд следует попытаться применит различные методы программирования. EGA и VGA предусматривают большое число различных режимов, которые позволяют реализовать похожие эффекты. Например, существует четыре различных способа записи информации в память (наряду с многочисленными способами модификации уже записанных данных). Полезно знание регистров (особенно регистров Графического Контроллера) и функций, которые они выполняют. В "Руководстве..." приведены некоторые функции, нигде ранее не упоминавшиеся. Даже если на первый взгляд нельзя найти применение тому или иному регистру следует задать себе вопрос, чем может быть полезно его использование. Благодаря пониманию функций, выполняемых адаптером, улучшается техника программирования следствием чего являются хорошие программы.

Соглашение по терминологии

Числа шестнадцатиричной системы счисления заканчиваются буквой h нижнего регистра; таким образом, число 16 в шестнадцатиричной системе счисления будет записано как 10h. Аналогично, двоичные числа заканчиваются буквой b нижнего регистра. B наименованиях регистров используются буквы верхнего регистра.

Среднее разрешение означает разрешение 320x200 точек; высокое разрешение - 640x200, a улучшенное разрешение - 640x350. Разрешение VGA 640x480 в тексте упоминается просто как разрешение 640x480.

Приняты следующие наименования адаптеров: MDA (монохромный адаптер дисплея), CGA (цветной графический адаптер), EGA (усовершенствованный графический адаптер), VGA (массив видеографики).

Bce ссылки на DOS означают версию 2.0 или более позднюю, если по тексту нет каких-либо дополнительных замечаний. Bce программы, написанные на языке ассемблера, транслировались c помощью Microsoft Macro Assembler версии 4.0.

Понятие совместимости режимов относится исключительно к графическим режимам, поскольку все алфавитно-цифровые режимы совместимы в разных адаптерах.

EGA и VGA используют несколько методов распределения памяти в адресном пространстве PC. Появление информации в адресном пространстве обозначается как адрес ЦП или процессора, что означает операцию ввода/ вывода c дисплея процессоров 8086 или 8088.


[ Оглавление ] [ Далее ]

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

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