- 1 - ВИДЕОРЕЖИМЫ ГРАФИЧЕСКОГО АДАПТЕРА VGA * Ричард Уилтон АННОТАЦИЯ: В статье рассматриваются некоторые вопросы програм- мирования видеорежимов графического адаптера VGA. Графический адаптер VGA (Video Graphic Array) устанавли- вается на моделях 50, 60 и 80 ПЭВМ серии PS/2 фирмы IBM. Кроме персональных компьютеров серии PS/2, адаптер VGA может исполь- зоваться также и на ПЭВМ IBM PC XT/AT. С точки зрения функцио- нальных возможностей и производительности, VGA является нес- колько улучшеной версией графического адаптера EGA. Несмотря на это, VGA поддерживает более широкий спектр видеорежимов, осо- бенно при использовании мониторов с изменяемой рабочей частотой. Также как и графический адаптер EGA, VGA в своем составе содержит несколько программно-управляемых компонентов: блок уп- равления электронно-лучевой трубкой (ЭЛТ), блок синхронизации, графический контроллер и устройство управления атрибутами выво- да. Каждый из этих компонентов адаптера управляется программно. Программы обслуживания VGA в составе базовой системы ввода/вы- вода (BIOS) доступны по прерыванию 10h. Использование функции с номером 0 данного прерывания позволяет установить адаптер в один из 24 стандартных видеорежимов, поддерживаемых BIOS. Каждый компонент VGA содержит в своем составе ряд регист- ров, используемых для управления функционированием адаптера. Для каждого видеорежима в программе видеобслуживания BIOS со- держится соответствующая таблица значений регистров видеоадап- тера, в связи с чем, в большинстве случаев, для установки тре- буемого видеорежима вместо непосредственной записи в регистры адаптера достаточно воспользоваться программами из BIOS. В тех случаях, когда необходимо установить видеорежим не поддерживае- мый программами BIOS, необходимо, в первую очередь, выяснить, какие же значения должы быть помещены в управляющие регистры адаптера для чего требуется достаточно глубокое понимание рабо- ты видеосистемы ПЭВМ. Почему возникает необходимость в создании дополнительных видеорежимов? Обычно это связано с желанием иметь возможность получения на экране изображения с более высоким разрешением в графическом режиме или возможностью вывода на экран больших порций данных в текстовом режиме по сравнению со стандартными видеорежимами, поддерживаемыми базовой системой ввода/вывода. Некоторые из широко распространенных программных систем, таких, например, как Microsoft Word или Lotus 1-2-3 используют свои собственные видеорежимы. ____________________________ * "VGA Video Modes", RICHARD WILTON . - 2 - Управление видеорежимами Видеорежимы характеризуются следующими параметрами: - вертикальным разрешением (количеством строк растра на эк- ране); - горизонтальным разрешением (количеством символов или пик- селов в строке); - представлением данных в буфере; - атрибутами вывода (цвет, мерцание и т. п.). При программировании VGA большое место занимает управление го- ризонтальным и вертикальным разрешением изображения на экране дисплея. Адаптер VGA обладает значительно меньшими возможностя- ми управления представлением данных в экранной памяти и атрибу- тами вывода по сравнению с возможностями управления разрешением экрана. По этой причине, наиболее простым путем перехода к нес- тандартному видеорежиму является использование программ BIOS для установки некоторого стандартного видеорежима с последующим изменением значений нескольких регистров видеоадаптера. Сигналы управления видеомонитором Как горизонтальное, так и вертикальное разрешение опреде- ляется последовательностью согласованных во времени выходных сигналов графического адаптера, управляющих движением электрон- ного луча ЭЛТ. Понятно, что изображение на экране не является статическим - электронный луч "рисует" изображение на экране двигаясь по строкам растра сверху вниз (см. рис. 1). Весь экран полностью обновляется от 50 до 70 раз в секунду в зависимости от видеорежима. ┌─────────────────────────────────────────────────────┐ │ Бордюр │ │ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ Изображение ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ │ │ │ Бордюр │ └─────────────────────────────────────────────────────┘ 0 Пикселы 80 84 Бордюр ° ° ° ° ═════─────────────────────────────────────────────═════ ═════ Бордюр ∙ ∙ 96 0 Рис. 1. Экран видеомонитора и характеристики строки растра. . - 3 - В процессе вывода каждой строки растра интенсивность электронного луча изменяется в зависимости от сигналов подавае- мых на вход монитора видеоадаптером (в цветном мониторе для каждого первичного цвета используется собственный электронный луч, что, в данном случае, несущественно). В ЭЛТ электронный луч движется с постоянной скоростью вдоль строки растра и вниз с одной строки растра на следующую. Для управления наступлением момента времени перехода луча от крайней правой точки строки к крайней левой точке следующей строки (т.е. для управления гори- зонтальным обратным ходом луча) адаптер VGA генерирует сигнал горизонтальной синхронизации. Сигнал вертикальной синхрониза- ции используется для управления перемещением электронного луча от крайней правой позиции в самой нижней строке растра в левый верхний угол экрана (управление вертикальным обратным ходом лу- ча). Видеоадаптер VGA всегда программируется таким образом, чтобы время, необходимое для вывода данных из видеобуфера всег- да было меньшим общего количества времени развертки одного кад- ра. Это дает возможность вывода на экран бордюра (overscan), окаймляющего собственно выводимое изображение, что позволяет центрировать изображение на экране. Управлять параметрами сигналов развертки, генерируемых видеоадаптером VGA можно путем изменения значений соответствую- щих регистров блока управления ЭЛТ в составе VGA. Значения, по- мещаемые в эти регистры задают длительность отрезков времени, измеренную в так называемых символьных единицах времени (character clock). Символьная единица это отрезок времени необ- ходимый для вывода на экран 8 пикселов в графическом режиме VGA и 8 или 9 пикселов в алфавитно-цифровых режимах. Параметры строчной (горизонтальной) развертки определяют- ся: - общим количеством времени, затрачиваемым на вывод строки рас- тра - общая длительность строки (horisontal total); - длительностью времени в символьных единицах в течение которо- го происходит отображение данных из видеобуфера при выводе на экран одной строки растра - длительность участка отображе- ния в строке (horisontal displayed). Разница между общей дли- тельностью строки и длительностью участка отображения опреде- ляет размер горизонтального бордюра; - значение (в символьных единицах), при котором начинается сиг- нал горизонтальной синхронизации (horisontal sync). Параметры кадровой (вертикальной) развертки аналогичны параметрам строчной развертки, однако время здесь измеряется в строках растра - отрезках времени, затрачиваемых для вывода од- ной строки растра на экран и перехода к началу следующей строки: - общее количество строк растра в кадре - размер кадра (vertical total); - количество строк в кадре, используемых для вывода данных на экран - количество строк данных в кадре (vertical displayed). Разница между размером кадра и количеством строк данных в кадре определяет величину вертикального бордюра; - номер строки растра в которой начинается сигнал вертикальной синхронизации (vertical sync). . - 4 - Ограничения на значения временных параметров Для правильного задания временных характеристик сигналов управления генерацией изображения на экране монитора необходимо при расчете значений, помещаемых в регистры, учитывать базовые частотные характеристики видеомонитора и адаптера, такие как частота вывода пикселов (dot rate), частота строк (scan rate) и частота кадров (vertical scan rate). ЧАСТОТА ВЫВОДА ПИКСЕЛОВ. Эта характеристика (ее также часто на- зывавют полосой пропускания видеомонитора) определяет скорость вывода пикселов. Для формирования сигналов, задающих скорость вывода пикселов используется пьезокристаллический генератор. В VGA допускается использование одного из трех таких генераторов, каждый из которых обеспечивает формирование сигналов заданной частоты. Два таких генератора включены в состав видеоадаптера VGA. Они обеспечивают формирование сигралов с частотами 25.175 МГц и 28.322 МГц. Кроме того, может использоваться генератор, установленный на системной плате ПЭВМ PS/2 моделей 50, 60 и 80. ЧАСТОТА СТРОК. Данная характеристика определяет количество строк растра формируемых за одну секунду. Частота строк зави- сит от количества пикселов в строке и равна частному от деления частоты вывода пикселов на количество пикселов в строке. ЧАСТОТА КАДРОВ. Определяет сколько кадров за одну секунду выво- дится на экран монитора. Частота кадров при программировании VGA, также как и частота строк, не задается непосредственно, а определяется количеством строк в кадре. Для вычисления частоты кадров достаточно разделить частоту строк на размер кадра, за- данный в строках растра. Центральным моментом при программировании нестандартных видеорежимом является выбор таких значений временных параметров управления экраном, чтобы не выйти за допустимые пределы час- тотных характеристик используемого монитора (см. табл. 1). Частотные характеристики видеомониторов Табл. 1 ╔═════════════════════════════════════════════════════════════╗ ║ Тип монитора Полоса Макс. частота Макс. частота ║ ║ ║ пропускания (МГц) строк (КГц) кадров (Гц) ║ ╠═════════════════════════════════════════════════════════════╣ ║ IBM 8503 (монохром.) 28 31.5 50-70 ║ ║ IBM 8513 (цветной) 28 31.5 50-70 ║ ║ NEC MultiSync 30 35 56-65 ║ ║ NEC MultiSync Plus 30 45 56-80 ║ ║ Electrohome ECM 1310 30 34 47-85 ║ ║ Sony Multiscan CDP 1302 25 34 50-100 ║ ║ Princeton Ultrasync 30 35 45-120 ║ ╚═════════════════════════════════════════════════════════════╝ Рассмотрим, например, видеорежим с номером 18 (12h) базо- вой системы ввода/вывода - графический режим 640 x 480 с однов- ременным отображением на экране 16 цветов. Этот режим разрабо- . - 5 - тан для мониторов с частотой строк 31.5 КГц. Используется гене- ратор пикселов с частотой 25.175 МГц. Теперь можно легко вычис- лить значения временных параметров для этого видеорежима. Для определения количества пикселов в строке разделим частоту используемого генератора пикселов на частоту строк. Для нахождения общей длительности строки в символьных единицах не- обходимо разделить полученное значение на 8. Общая длительность строки = (25175000 / 31500) / 8 = 100. Т.к. в каждой строке растра содержится 640 точек, дли- тельность участка отображения в строке равна 640 / 8, или 80. Оставшееся в размере 20 символьных единиц время используется для формирования бордюра и горизонтального обратного хода луча. Для того чтобы строка располагалась в центре экрана, сигнал го- ризонтальной синхронизации начинается с момента времени, соот- ветстствующего 84 символьной единице и имеет длительность 12 символьных единиц. В результате получим горизонтальный бордюр размером в 4 символьных единицы. Аналогичным образом можно определить характеристики вер- тикальной развертки. Для указанного видеорежима программы BIOS устанавливают такие значения параметров, чтобы частота кадров рабнялась 60 Гц, что примерно соответствует середине допустимо- го интервала для частоты кадров видеомонитора. Количество строк в кадре определяется как частное от деления частоты строк на частоту кадров. Размер кадра в строках = 25175000 / (100 * 8) / 60 = 524. Т.к. число строк данных в кадре равно 480, то оставшиеся 44 строки используются для формирования вертикального бордюра и вертикального обратного хода луча. Программы видеобслуживания BIOS устанавливают параметры VGA таковыми, что вертикальный об- ратный ход луча начинается после вывода 503 строки и его дли- тельность соответствует длительности вывода двух строк растра. Таким образом, выводится 522 строки, причем, 42 строки из них используются для формирования вертикального бордюра (524 - 480 - 2). Программирование видеорежимов После выбора значений временных параметров видеорежима можно приступать к программированию видеоадаптера VGA, что включает в себя: - программирование блока управления ЭЛТ; - программирование блока синхронизации; - задание частоты генератора пикселов; - задание высоты символов (в строках растра); - модификация требуемых переменных BIOS. Доступ к регистрам VGA осуществляется через порты вво- да/вывода (см. табл. 2) посредством применения команд ассембле- ра IN и OUT или, при разработке программы на языке высокого уровня, путем использования специальных функций, эквивалентных по своим действиям этим командам. Для доступа к программам ви- деобслуживания BIOS используется прерывание с номером 16 (10h). . - 6 - Адреса портов ввода/вывода адаптера VGA Табл. 2 ╔═════════════════════════════════════════════════════════════╗ ║ Адрес Назначение Возможность ║ ║ порта доступа ║ ╠═════════════════════════════════════════════════════════════╣ ║ 3C0 Управление атрибутами вывода Чтение/запись║ ║ 3C2 Многоцелевой регистр Запись ║ ║ 3C4/3C5 Блок синхронизации Чтение/запись║ ║ 3CC Многоцелевой регистр Чтение ║ ║ 3CE/3CF Графический контроллер Чтение/запись║ ║ 3D4/3D5 * Блок управления ЭЛТ Чтение/запись║ ║ * 3B4/3B5 в видеорежимах 7 и 0Fh ║ ╚═════════════════════════════════════════════════════════════╝ Блок управления ЭЛТ выполняет большую часть действий по управлению строчной и кадровой разверткой. В регистрах этого блока задается длительность подаваемых на вход монитора сигна- лов управления строчной и кадровой разверткой. В нем также осу- ществляется синхронизация моментов формирования указанных сиг- налов с выборкой данных из видеобуфера и их обработкой перед выводом на экран. Список регистров блока управления ЭЛТ с их назначением приведен в таблице 3. Назначение регистров блока управления ЭЛТ адаптера VGA, используемых для программирования видеорежимов Табл. 3 ╔═════════════════════════════════════════════════════════════╗ ║ Номер Наименование Назначение ║ ║ регистра ║ ╠═════════════════════════════════════════════════════════════╣ ║ 0 Общая длительность строки [Общая длительность ║ ║ (horisontal total) строки] -5 ║ ║ 1 Длительность участка отоб- [Длительность участка отоб- ║ ║ ражения в строке (Horizon- ражения в строке] - 1 ║ ║ tal display enable end) ║ ║ 2 Начало горизонтального Номер символьной единицы, в ║ ║ гашения (Start horison- которой начинается сигнал ║ ║ tal blank) горизонтального гашения луча║ ║ 3 Окончание горизонтального Окончание сигнала гашения ║ ║ ║ гашения луча (End horison- луча (используются только ║ ║ tal blank) биты 4-0). ║ ║ 4 Начало горизонтального об- Номер символьной единицы ║ ║ ратного хода луча (Start начала сигнала горизонталь- ║ ║ horisontal retrace) ной синхронизации ║ ║ 5 Окончание горизонтального Момент окончания сигнала ║ ║ обратного хода луча (End горизонтальной синнхрони- ║ ║ horisontal retrace) зации (биты 4-0) ║ ║ 6 Общее количество строк Общее количество строк ║ ║ растра в кадре (vertical растра в кадре (биты 7-0 ║ ║ total) 10-битового значения) ║ ║ 7 Регистр переполнения Бит 0: 8-й бит общего коли- ║ ║ (Overflow) чества строк в кадре ║ ║ Бит 1: 8-й бит количества ║ ║ строк отображения в ║ ║ кадре ║ ╚═════════════════════════════════════════════════════════════╝ . - 7 - Продолжение табл. 3 ╔═════════════════════════════════════════════════════════════╗ ║ Номер Наименование Назначение ║ ║ регистра ║ ╠═════════════════════════════════════════════════════════════╣ ║ Бит 2: бит 8 начала верти- ║ ║ кального обратного ║ ║ хода луча ║ ║ Бит 3: 8-й бит начала вер- ║ ║ тикального гашения ║ ║ луча ║ ║ Бит 5: 9-й бит общего коли- ║ ║ чества строк в кадре ║ ║ Бит 6: 9-й бит количества ║ ║ строк отображения в ║ ║ кадре ║ ║ Бит 7: 9-й бит начала вер- ║ ║ тикального обратного ║ ║ хода луча ║ ║ 9 Максимальное количество Биты 4-0: [количество строк ║ ║ строк (Maximum scan line) растра в символе] - 1║ ║ Бит 5: 9-й бит начала верти-║ ║ кального гашения луча║ ║ 10h Начало вертикального Номер строки растра, в кото-║ ║ обратного хода луча (Start рой начинается сигнал верти-║ ║ vertical retrace) кальной синхронизации (биты ║ ║ 7-0 10-битового значения) ║ ║ 11h Окочание вертикального Бит 7: запрет записи в ре- ║ ║ обратного хода луча (End гистры 0-7 блока ║ ║ vertical retrace) управления ЭЛТ ║ ║ Бит 3-0: номер строки окон- ║ ║ чания сигнала верти- ║ ║ ║ кальной синхронизации║ ║ 12h Количество строк отоб- Количество строк растра в ║ ║ ражения в кадре (Vertical части кадра занимаемой ║ ║ display enable end) собственно изображением ║ ║ 13h Смещение (Offset) Количество слов данных в ло-║ ║ ческой строке видеопамяти ║ ║ 15h Начало вертикального [Номер строки растра, в ко- ║ ║ гашения луча (Start торой начинается сигнал вер-║ ║ vertical blank) тикального гашения луча] - 1║ ║ (биты 7-0 10-битового значе-║ ║ ния) ║ ║ 16h Окончание вертикального Номер строки растра, в кото-║ ║ гашения луча (End vertical рой заканчивается сигнал ║ ║ blank) вертикального гашения луча ║ ║ (биты 7-0) ║ ╚═════════════════════════════════════════════════════════════╝ Для записи данных в регистр необходимо поместить номер регистра в порт ввода/вывода с адресом 3D4h, после чего произ- вести запись нового значения в порт 3D5h (См. листинг програм- мы 1). При программировании блока управления ЭЛТ можно применить ряд специальных приемов. Во-первых, можно производить запись в . - 8 - один 16-битовый порт вместо последовательного вывода в два 8-битовых порта для получения одних и тех же результатов: ;AL = номер регистра mov al,RegNumber ;AH = новое значение регистра mov ah,RegValue mov dx,3D4h ;Запись в порт 3D4h/3D5h out dx,ax Если используется доступ к 8-битовым портам, обязательно необходимо запретить прерывания. В противном случае, между за- писями в порты может произойти аппаратное прерывание, программа обработки которого модифицирует регистры блока управления ЭЛТ, после чего исходная программа не сможет правильно функциониро- вать. В случае программирования адаптера VGA для видеорежимов BIOS с номерами 7 или 0Fh вместо портов ввода/вывода 3D4h и 3D5h следует использовать порты с адресами 3B4h и 3B5h соот- ветственно. Эти адреса портов совпадают с адресами аналогичных портов монохромного дисплейного адаптера (Monochrome Display Adapter - MDA), что позволяет устанавливать на одном и том же компьютере кроме видеоадаптера VGA еще одну цветную графическую подсистему. Изменение значений регистров блока управления ЭЛТ Листинг программы 1 ╔═════════════════════════════════════════════════════════════╗ ║ ║ ║ cli ; запретить прерывания ║ ║ mov al,RegNumber ; AL = номер регистра ║ ║ mov dx,3D4h ║ ║ out dx,al ; запись в порт 3D4h ║ ║ mov al,RegValue ; AL = новое значение регистра ║ ║ inc dx ║ ║ out dx,al ; запись в порт 3D5h ║ ║ sti ; разрешить прерывания ║ ║ ║ ╚═════════════════════════════════════════════════════════════╝ В отличие от предыдущих моделей видеоадаптеров фирмы IBM, управляющие регистры VGA могут быть не только записаны, но и прочитаны (см. листинг программы 2), что дает возможность прог- рамме запомнить текущее состояние регистров адаптера перед тем как модифицировать содержащиеся в них значения. Устройство синхронизации адаптера VGA выполняет ряд взаи- мосвязанных функций, включая синхронизацию вывода символов с работой генератора пикселов. Одна строка растра символов может отображаться либо за 8 либо за 9 тактов генератора пикселов или, другими словами, в алфавитно-цифровом режиме каждый символ может состоять из 8 или 9 пикселов по горизонтали в зависимости от того, какие значения будут помещены в управляющие регистры блока синхронизации. По умолчанию, при использовании VGA, каждый символ состо- ит из 9 пикселов по горизонтали. В графическом режиме или в . - 9 - 350-строчном алфавитно-цифровом режиме (режим совместимости с EGA), блок синхронизации программируется таким образом, что каждый символ занимает 8 пикселов в строке. Использование до- полнительного (девятого) пиксела позволяет повысить четкость отображаемого на экране текста. В отличие от предыдущих моделей видеоадаптеров, VGA позволяет производить чтение управляющих регистров Листинг программы 2 ╔═════════════════════════════════════════════════════════════╗ ║ ║ ║ cli ; запретить прерывания ║ ║ mov al,RegNumber ; AL = номер регистра ║ ║ mov dx,3D4h ║ ║ out dx,al ; запись в порт 3D4h ║ ║ inc dx ║ ║ in al,dx ; чтение значения регистра в AL ║ ║ sti ; разрешить прерывания ║ ║ ║ ╚═════════════════════════════════════════════════════════════╝ Регистры блока синхронизации доступны через порты вво- да/вывода с адресами 3C4h и 3C5h (см. табл. 4). При программи- ровании этого блока используется тот же подход, что и при прог- раммировании блока управления ЭЛТ, описанный ранее. Однако, здесь имеются и свои особенности. Если необходимо изменить час- тоту генератора пикселов или размер символа по горизонтали, требуется "перезапустить" (reset) блок синхронизации установив бит 1 регистра перезапуска в 1 и обратно. Пример программы, позволяющей переключить адаптер в режим вывода символов шириной в 8 пикселов приведен в листинге 3. Регистры блока синхронизации VGA Табл. 4 ╔═════════════════════════════════════════════════════════════╗ ║ Номер Наименование Назначение ║ ║ регистра ║ ╠═════════════════════════════════════════════════════════════╣ ║ 0 Перезапуск (reset) Бит 1: синхронный перезапуск ║ ║ ║ ║ 1 Количество пикселов в Бит 0: 1 = 8 пикселов ║ ║ строке символа (Clocking 0 = 9 пикселов ║ ╚═════════════════════════════════════════════════════════════╝ Биты 2 и 3 многоцелевого регистра вывода (miscellaneous output register) используются для управления частотой генерато- ра пикселов (см. табл. 5). Для изменения частоты генератора не- обходимо прочесть содержимое регистра 3CCh, модифицировать биты 2 и 3 полученного значения и записать результат в порт 3C2h. При выполнении таких действий необходимо перезапустить блок синхронизации подобно тому, как это было описано выше. По умолчанию, программы видеообслуживания BIOS устанавли- вают адаптер VGA в алфавитно-цифровой режим с 25 текстовыми строками на экране. В этом режиме изображение на экране состоит из 400 строк растра и, следовательно, каждый символ занимает по . - 10 - высоте 16 растровых строк. В алфавитно-цифровых режимах можно увеличить количество текстовых строк, появляющихся на экране, уменьшив число строк растра символа. Использование многоцелевого регистра вывода для выбора частоты генератора пикселов Табл. 5 ╔═════════════════════════════════════════════════════════════╗ ║ Бит 3 Бит 2 Частота генератора пикселов ║ ╠═════════════════════════════════════════════════════════════╣ ║ 0 0 25.175 МГц ║ ║ 0 1 28.322 МГц ║ ╚═════════════════════════════════════════════════════════════╝ Биты 0 - 4 регистра 09h (регистр максимального количества строк в символе) блока управления ЭЛТ используются для задания размера символа по вертикали. Сюда помещается значение, которое должно быть на 1 меньшим количества строк в растре символа. Та- ким образом, по умолчанию, в этом регистре содержится значение 0Fh. Если, например, указанное значение будет изменено на 07h, каждый символ будет состоять из 8 строк растра и, следователь- но, на экран может быть выведено 50 строк вместо 25. Хотя значение в регистре количества строк в символе может быть изменено непосредственно, предпочтительнее воспользоваться для его модификации программами видеообслуживания BIOS. Прог- раммы BIOS предоставляют для этого достаточно гибкие средства и, кроме задания размеров символа, позволяют одновремменно осу- ществить выбор соответствующей таблицы графических представле- ний символов: ; AH = 11h (номер функции BIOS) ; AL = 12h (номер подфункции) mov ax,1112h mov bl,0 ; вызов программы BIOS int 10h Приведенная последовательность команд может быть исполь- зована для перехода к режиму вывода символов с размером по го- ризонтали 8 пикселов. При этом программами видеообслуживания BIOS производится загрузка требуемой таблицы символов в генера- тор символов, модифицируются значения требуемых регистров блока управления ЭЛТ и записывается новое значение в область описания характеристик текущего режима видеоадаптера. Два примера программ Автором разработаны две программы (тексты которых не при- водятся), позволяющие автоматизировать расчет значений, которые должны быть записаны в регистры блока управления адаптерап VGA для различных видеорежимов. Программа, обеспечивающая возмож- ность работы в алфавитно-цифровом режиме носит название AVMODE. Эта программа в качестве параметров принимает количество симво- лов в строке, размер символов и, кроме того, использует один специальный параметр, предназначенный для управления центриро- . - 11 - ванием текста на экране дисплея. Так, для перехода к видеорежи- му, в котором допускается использование 90 символов размером 8 x 8 в строке, достаточно выполнить команду: AVMODE 90 8 8 Если полученное изображение располагается не в центре эк- рана, можно включить в команду еще один параметр, управляющий горизонтальным центрированием изображения. Например, для того чтобы сдвинуть изображение на ширину одного символа вправо, введите команду: AVMODE 90 8 8 -1 Для управления высотой символов в программе используется интерфейс генератора символов видеообслуживания BIOS. После ус- тановки размера символа по вертикали, в блоке синхронизации ус- танавливается размер символа по горизонтали - 8 или 9 точек. В конце работы программы в регистры блока управления ЭЛТ адаптера записываются требуемые значения временных параметров, управляю- щих строчной разверткой. Программирование блока синхронизации VGA для формирования символов "шириной" 8 пикселов Листинг программы 3 ╔═════════════════════════════════════════════════════════════╗ ║ ║ ║ cli ; запретить прерывания ║ ║ mov dx,3C4h ║ ║ mov ax,0100h ; AH = значение регистра перезапуска: ║ ║ бит 1 = 0; бит 0 = 1 ║ ║ out dx,al ; запись в порт 3D4h ║ ║ out dx,ax ; синхронный перезапуск блока синхрониз. ║ ║ mov al,1 ; AL = номер регистра количества пикселов║ ║ ; в строке символа ║ ║ out dx,al ║ ║ inc dx ║ ║ in al,dx ; AL = значение регистра ║ ║ dec dx ║ ║ or al,1 ; установить бит 1 ║ ║ mov ah,al ; AH = новое значение регистра ║ ║ mov al,1 ║ ║ out dx,ax ; запись нового значения ║ ║ mov ax,0300h ; AH = значение регистра перезапуска: ║ ║ ; бит 1 = 1; бит 0 = 1 ║ ║ out dx,ax ║ ║ sti ║ ╚═════════════════════════════════════════════════════════════╝ Для упрощения, в программе AVMODE.C все действия по прог- раммирования блока синхронизации выполняются подпрограммами, написанными на языке высокого уровня. На практике, однако, эти программы должны быть написаны на языке ассемблера, т.к. функ- ции inp() и outp() в языке программирования высокого уровня ор- . - 12 - ганизованы в виде вызова подпрограмм, а не как встроенные не- посредственно в вызывающую программу команды IN и OUT. По этой причине, для выполнения функций inp() или outp() требуется дос- таточно большой промежуток времени, что делает их весьма чувст- вительными к возникновению аппаратных прерываний и, следова- тельно, снижают надежность их работы. При использовании мониторов, устанавливаемых на ПЭВМ се- рии PS/2 фирмы IBM, в алфавитно-цифровом режиме можно выводить на экран до 96 символов (шириной 8 точек) в строке. Дальнейшее увеличение количества символов в строке ограничивается техни- ческими характеристиками мониторов. При использовании мониторов с переменной частотой, VGA позволяет выводить на экран до 132 символов в строке. Частота кадров при этом составляет всего 51.5 Гц, что может привести к возникновению мерцаний при выводе на экран больших и ярких участков изображения. Это является следствием недостаточно вы- сокой частоты кадров. Если для установления видеорежима используется программа AVMODE и при этом был изменен вертикальный размер символов, ко- мандой CLS (очистка экрана) операционной системы MS DOS следует пользоваться с осторожностью. Программы видеообслуживания BIOS записывают по адресу 0040:0084h текущий размер символа по вер- тикали, однако операционная система игнорирует это значение, предполагая, что на экране всегда представлено 25 строк текста. Если в текущем видеорежиме выводится 50 строк, командой CLS бу- дет очищена только верхняя половина экрана. В связи с этим, ре- комендуется написать собственную программу очистки экрана ( см. листинг программы 4), использующую функцию с номером 6 прерыва- ния видеообслуживания 10h. Программа GVMODE позволяет устанавливать нестандартные графические видеорежимы. При ее использовании следует задавать размер экрана в количестве пикселов по горизонтали и по верти- кали. Для получения 16-цветного видеорежима с разрешением 720 x 480 необходимо выполнить команду: GVMODE 720 480 Программа выбирает частоту генератора пикселов в зави- симости от значений параметров, что обеспечивает более широкие возможности по выбору характеристик видеорежима чем при исполь- зовании только одного генератора. В остальном же, программа GVMODE функционирует аналогично программе AVMODE. На стандартном адаптере VGA при использовании программы GVMODE удается добиться разрешения 720 x 512 точек, хотя такой режим для аналоговых мониторов PS/2 лежит на пределе их возмож- ностей. При использовании мониторов с переменной частотой можно получить на экране изображение размером 800 x 600 точек. Как и ранее, при использовании режимов с более высоким разрешением снижается частота кадров, что может привести к мер- цанию изображения на экране. . - 13 - Программа очистки экрана Листинг программы 3 ╔═════════════════════════════════════════════════════════════╗ ║ ║ ║ ; Наименование программы: vgacls.asm ║ ║ ; Назначение: очистка экрана при использовании нестандарт- ║ ║ ; ных видеорежимов ║ ║ ; Замечания: для получения загрузочного модуля выполните ║ ║ ; следующие действия: ║ ║ ; MASM VGACLS ║ ║ ; LINK VGACLS ║ ║ ; ║ ║ CodeSeg SEGMENT byte ║ ║ ASSUME cs:CodeSeg,ss:StackSeg ║ ║ VGAcls PROC far ║ ║ mov ah,0Fh ; AH = номер функции прерывания 10h ║ ║ int 10h ; Определение видеорежима ║ ║ ; AH = количество символьных позиций в строке ║ ║ ; AL = видеорежим ║ ║ ; BH = номер текущей видеостраницы ║ ║ push bx ; Сохранение BX и AX в стеке ║ ║ push ax ║ ║ mov ax,1130h ; AH = 11h (номер функции прер. 10h) ║ ║ ; AL = 30h (номер подфункции) ║ ║ int 10h ; Чтение информации о генераторе ║ ║ ; символов: ║ ║ ; DL = [Число символьных строк] - 1 ║ ║ pop ax ; Восстановление AX ║ ║ mov dh,dl ; DH = номер последней строки экрана ║ ║ mov dl,ah ║ ║ dec dl ; DL = номер последн. позиции строки ║ ║ sub cx,cx ; CH = 0 (номер первой строки экрана)║ ║ ; CL = 0 (первая позиция строки) ║ ║ mov dh,7 ; BH = атрибут по умолчанию ║ ║ cmp al,7 ║ ║ jle L01 ; переход, если алфавитно-цифровой ║ ║ ; режим ║ ║ xor bh,bh ; BH = графический атрибут по умолч. ║ ║ L01: mov ax,0600h ; AH = 6 (номер функции прерыван.10h)║ ║ ; AL = 0 (число строк для скроллинга)║ ║ int 10h ; Скролиинг вверх (очистка экрана) ║ ║ pop bx ; BH = номер текущей видеостраницы ║ ║ xor dx,dx ; DH,DL = 0 ( новая позиция курсора) ║ ║ mov ah,2 ║ ║ int 10h ; Установка курсора ║ ║ mov ax,4C00h ║ ║ int 21h ; Обращение к DOS для прекращения ║ ║ ; программы ║ ║ VGAcls ENDP ║ ║ CodeSeg ENDS ║ ║ ║ ║ StackSeg SEGMENT stack ║ ║ DB 800h dup(?) ║ ║ StackSeg ENDS ║ ║ END VGAcls ║ ╚═════════════════════════════════════════════════════════════╝ . - 14 - VGA - совместимые видеоадаптеры Микросхемы, используемые фирмой IBM в адаптере VGA, раз- работаны и выпускаются самой этой фирмой и не поставляются дру- гим фирмам - производителям графической видеоаппаратуры для ПЭВМ. В связи с этим, конкурирующие фирмы вынуждены разрабаты- вать собственную аппаратуру с теми же характеристиками что и адаптер VGA. Это означает, что совместимые по своим характерис- тикам с VGA адаптеры не обязательно совместимы с этим адаптером на аппаратном уровне. Возникает два типа несовместимости: по значениям, которые должны быть помещены в управляющие регистры устройства и по частотам генератора пикселов. Т.к. не для всех типов VGA - совместимых видеоадаптеров используются те же значения при программировании блока управле- ния ЭЛТ, что и в VGA фирмы IBM, предложенный подход к програм- мированию адаптера не может быть применен ко всем типам совмес- тимой видеоаппаратуры. В частности, при программировании адап- тера VEGA фирмы Video Seven, в регистры необходимо заносить значения, отличные от тех, которые необходимы для VGA фирмы IBM. В то же время в некоторых других типах совместимых адапте- ров, например, Paradise VGA Plus, используются те же значения, что и в оригинальном VGA, в связи с чем при его программирова- нии никаких затруднений не возникает. Обычно VGA - совместимые адаптеры обеспечивают более вы- сокое разрешение за счет использования генераторов пикселов с более высокой частотой. Например, в устройстве Paradise VGA Plus при выводе 132 символов в строке в алфавитно-цифровом ре- жиме и графическом режиме с разрешением 800 x 600 используется генератор с частотой 36 МГц. Поэтому частота строк и кадров при использовании адаптера указанного типа выше, чем при использо- вании VGA фирмы IBM с частотой генератора 28.322 МГц, что зна- чительно снижает уровень мерцаний. Заключение Использование нестандартных видеорежимов требует опреде- ленного уровня знаний о видеоадаптере и понимания того, как ра- ботает видеосистема ПЭВМ. С другой стороны, нестандартные видеорежимы крайне редко поддерживажтся существующим программным обеспечением. Настройка стандартной программы обработки крупноформатных таблиц или тек- стового редактора может потребовать разработки специальных средств генерации системы. Программы видеообслуживания BIOS не- которых VGA - совместимых адаптеров обеспечивают работу системы в нестандартных видеорежимах. Во многих случаях при настройке той или иной программной системы допускается использование спе- циальных драйверов, поставляемых разработчиком видеоаапаратуры. При отсутствии таких драйверов для обеспечения функционирования программной системы в нестандартных видеорежимах приходится разрабатывать собственные драйверы. Несмотря на сказанное выше, во вногих случаях целесооб- разно использовать VGA в нестандартном режиме. При аккуратном программировании видеоадаптера и правильном использовании прог- рамм видеообслуживания BIOS можно разрабатывать приложения, требующие для своей работы большего разрешения экрана, чем это обеспечивается программами BIOS. .