Глава 27. Программирование VGA- и SVGA-адаптеров.

Сделай же, Боже, так, чтобы все потомство его не имело на земле счастья!

Н.В. Гоголь. Страшная месть.

При написании главы 10 автор ориентировался на устаревший графический ре­жим 640*350* 16. Можно назвать эту главу вводной. В данной главе возможности VGA рассматриваются более подробно. При работе над ней я воспользовался некоторыми материалалш.предоставленньшимнеАКудрявцевымдорошимпрограммистомиболь-шим знатоком компьютерной графики. Ксожалению, обширная справочная литерату­ра по видеоадаптерам изобилует ошибками. Благодаря данным, предоставленным Куд­рявцевым, мне в значительной степени удалось избежать огромной работы по провер­ке справочной информации. В главе имеется материал, и' по адаптерам SVGA, что является в настоящее время весьма актуальным.

Я позволю себе начать изложение со справочного материала т.к. основы темы были уже изложены в главе

I. Краткий справочник по адаптерам VGA.

В понятие видеоадаптер входит несколько устройств.

Графические устройства.

1. Графический контроллер осуществляет операции обмена информации между микропроцессором и видеопамятью.

2. Последовательный преобразователь: запоминает данные, читаемые из видео­памяти в течение цикла регенерации, преобразует в последовательный поток бит и затем передает контроллеру атрибутов.

3. Контроллер атрибутов: управляет цветами. Цвет символа или пиксела передается (после некоторых преобразований) на дисплей в соответствие с таблицей цветов.

4. Контроллер ЭЛТ. Вырабатывает сигналы управления работой ЭЛТ (развертки и гашения), определяет формат экрана и размер символа, определяет форму кур­сора, управляет вертикальной сверткой.

5. Синхронизатор: управляет временными параметрами видеоадаптера.

6. Видеопамять. Видеопамять содержит данные, отображаемые на экране. Стан­дартный VGA-адаптер содержит объем памяти 256 килобайт. Адаптеры Super VGA могут содержать памяти до 1 мегабайта и выше.

Принцип работы растрового дисплея.

Изображение на экране дисплея формируется посредством группы горизонтальньгх строк, называемых растром. Растр обновляется электронным лучом приблизительно SO­TO раз в секунду. Такая частота совершенно незаметна для глаз человека, поэтому мывидим на экране стационарное изображение. Каждая точка (пиксель) цветного экрана состоит из трех цветных люминесцентных точек - красной, зеленой, синей (RGB - Red Green Blue). Электронный луч, в свою очередь, состоит из трех компонент, отвечающих за свой цвет. В зависимости от интенсивности компонент луча каждая точка получает свой результирующий оттенок. Поскольку глаз человека не способен различить отдель­ные компоненты пикселя, для него точка имеет один определенный цвет.

Луч начинает свое движение из левого верхнего угла экрана. Двигаясь по строке экрана слева направо (прямой горизонтальный ход луча), луч заставляет светиться каж­дую точку в соответствии с информацией, получаемой от видеоадаптера, которая фор­мируется путем соответствующего кодирования информации, считанной адаптером из видеобуфера. Когда луч доходит до правого края экрана, то происходит его гашение, и он переводится в левый угол следующей строки (обратный горизонтальный ход луча), где снова начинает свое движение в правый угол. Кроме основного изображения, фор­мируется еще горизонтальное окаймление. Правое окаймление связано стем, что суще­ствует небольшой интервал между окончанием прямого горизонтального хода луча и началом обратного горизонтального хода луча. Аналогично левое окаймление связано с существованием малого временного интервала между концом обратного горизонталь­ного хода луча и началом прямого горизонтального хода луча.

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

Окаймление экрана

Рабочая область экрана для вывода данных из видеобуфера

Ниже будет дано подробное описание регистров УОА-адаптера. Доступ к боль­шинству регистров осуществляется следующим образом: сначала в порт индекса нуж­но поместить индекс, а затем через порт данных можно читать или писать данные.

Внешние регистры (цветовой режим)

Это регистры, доступ к которым осуществляется непосредственно через свой порт, а не через индексный регистр. Для монохромного режима адреса портов несколько отличаются. Суть различия такова: там, где для цветового режима в адресе порта ря­дом с тройкой стоит В, в монохромном - стоит В.

Подробное описание некоторых регистров.

Регистр определения различных режимов работы. MOR - Miscellaneous Output Register.

Запись через порт ЗСШ, чтение - ЗССРІ. Биты:

0 - выбор адресов ввода-вывода. О - выбирается адресное пространство монохром­ного режима, l - адресное пространство цветового режима.

1 - разрешения доступа к видеопамяти. Если бит равен О, то доступ к видеопамяти будет запрещен.

2,З - выбор частоты:

О 0 - 640 или 320 столбцов,

0 1 -720 столбцов,

1 О - внешний генератор, l l - зарезервировано.

4 - не используется.

5 - выбирает одну из двух графических страниц (64 К). 6,7 - определение скорости сканирования:

О О - не используется,

0 1 - 350 линий,

1 О - 4ОО линий, l l - 48О линий.

Регистр управления дополнительным устройством. Feature Control Register - FCR.

Доступен для записи через порт 3DAH, для чтения ЗСАК

H используется, но бит З должен быть равен нулю.

Регистр состояния 0. ISRO - Input Status Register.

Доступен для чтения по адресу ЗС2а

Биты:

4 - тип дисплея - цветной или монохромный.

У - бит прерывания от ЭЛТ. Этот бит устанавливается в начале обратного верти­кального хода луча и сбрасывается в конце. Остальные биты не используются. Регистр состояния 1. ISR1 - Input Status Register. Доступен для чтения через порт 3DAH.

Биты:

3 - бит обратного вертикального хода луча. Бит имеет значение l в течение обрат­ного вертикального хода луча.

Остальные биты для VGA несущественны.

Регистр разрешения работы системы VGA. VGA_ER - VGA Enable Register. УправляетсячерезпортЗСЗН.

Если бит О сброшен, то запрещен доступ к видеопамяти и портам.

Регистры контроллера ЭЛТ.

в цветовом режиме адрес индексного порта 3D4H, адрес порта данных 3D5H. Для монохромного режима адреса этих портов будут соответственно ЗВ4Н ЗВ5Н Чтобы каждый pa не ломать голову, в каком режиме работает программа, можно воспользо­ваться тем, что адрес индексного регистра расположен по адресу 0000:0463Н.

Мы подробно рассматриваем лишь безопасные регистры ЭЛТ. Неправильное ис­пользование некоторых регистров может привести к разрушению дисплея.

Общая длина линии горизонтальной развертки. HTR - Horizontal Total Register. Индекс 0. Регистр определяет число знакомест на одной линии сканирования, вклю­чая обратный ход луча и рамку экрана. Число знакомест по горизонтали будет на 5 больше, чем значение, хранящееся в регистре.

Длина отображаемой части горизонтальной развертки. HDER - Horizontal Display Enable End Register. Индекс 1. Задает длину участка горизонтальной разверт­ки. Содержимоерегистра на единицу меньше, чем число символов в строке экрана.

Начало импульса гашения луча горизонтальной развертки. SHBR - Start Horizontal Blank Register. Индекс 2. Используется видеоадаптером для определения начала импульса гашения.

Конец импульса гашения луча горизонтальной развертки. EHBR - End Horizontal Blank Register. Индекс 3.

Биты:

0-4 - гашение луча горизонтальной развертки происходит, когда значение равно

счетчику длины отображаемой части горизонтальной развертки.

5-6 - влияет на отображение символов в текстовом режиме. 7 - равен единице.

Начало импульса горизонтального обратного хода луча. SHRR - Start Horizontal Retrace Register. Индекс 4. Задает момент начала импульса горизонтального обратного хода луча.

Конец импульса горизонтального обратного хода луча. EHRR - End Horizontal

Retrace Register. Индекс 5.

Биты:

0-4 - когда значение битов равно счетчику символов в строке, то обратный гори­зонтальный ход луча завершается.

5-6 - смещение импульса горизонтального обратного хода луча.

7 - пятый бит регистра конца импульса гашения луча горизонтальной развертки.

Число горизонтальных линий растра. VTR - Vertical Total Register. Индекс 6.

Определяет общее число линий горизонтальной развертки в кадре вертикальной развертки, включая гашение вертикального хода луча и обратный вертикальный ход луча. Биты 9 и 10 содержатся в дополнительном регистре OVR.

Дополнительный регистр. OVR - Overflow Register. Индекс 7.

Биты:

0- 6ht8VTR.

1- 6ht8VDER.

2- 6ht8VRSR. 3 - бит 8 SVBR.

4- 6ht8LCR.

5- бит 9 VTR.

6- 6ht9VDER.

7- 6ht9VRSR.

Предварительная установка горизонтальной развертки. PRSR - Preset Row Scan Register. Индекс 8.

Позволяет производить плавную прокрутку экрана в текстовом режиме. Биты:

0-4 - задают для верхней строки текста номер линии в матрице символов, начиная с которой начинаются отображаться символы. Самая верхняя строка текста т.о. ото­бражается не полностью.

5-б -дополнительные битырегистрагоризонтального панорамирования контрол­лера атрибутов, позволяют сдвигать экран более чем на 8 пикселей.

У - не используется.

Высота символа текста. MSLR - Max Scan Line Register. Индекс 9. Используется в текстовом режиме и определяет высоту символа в пикселей. Биты:

0-4 - высота символов в пикселях.

5 - бит 9 SVBR (индекс 15Н).

6 - бит 9 LCR (индекс 18Н).

7 -управление двойным сканированием. Еслибитравен 1,то в режиме с разреше­нием по вертикали 200 пикселей для каждой линии растра применяется двойное ска­нирование, сбрасывание этого бита приводит к увеличению разрешения по вертикали до 400 пикселей.

Начальная линия курсора. CSR - Cursor Start Register. Индекс ОАК

Биты:

0-4 - начальная линия курсора.

5 - если бит установлен, то курсор гаснет.

У-б - не используются.

Конечная линия курсора. CER - Cursor End Register. Индекс ОВК

Биты:

0-4 - номер последней линии курсора. 5-б - отклонение курсора. У - не используется.

Регистры начального адреса. SAR - Start Adres Register. Старший байт индекс ОСН, младший-0DH.

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

Регистры, определяющие положение курсора на экране. CLR - Cursor Location Register. Старший байт индекс ОЕН, младший байт- OFH.

Если курсор находится в точке с координатами Х,Х то число, хранящееся в ука­занных регистрах, будет получено по формуле X+5*Y.

Начало обратного вертикального хода луча. VRSR - Vertical Retrace Start Register. Индекс ЮН.

Определяет начало обратного вертикального хода луча. Содержит Юбит. Лишние биты содержатся в OVR.

Конец обратного вертикального хода луча. VRER - Vertical Retrace End Register. Индекс - ПН.

Доступен для записи. Биты:

0-3 - когда значение битов будет равно четырем младшим битам счетчика горизон­тальных линий, сигнал обратного хода луча будет окончен.

4 - нуль означает сброс вертикального прерывания и переустановку флага неза­конченного вертикального прерывания.

5 - при нулевом значении при каждом обратном ходе луча возникает прерывание на линии IRQ2.

6- если бит равен единице, то во время обратного горизонтального хода луча бу­дет генерироваться пять циклов регенерации видеопамяти вместо 3. 7 - используется для совместимости видеоадаптеров.

Завершение отображения вертикальной развертки. VDER - Vertical Display End Register. Индекс 12H.

Содержит 10 бит. 9 -10 биты, доступны через OVR.

Содержитчисло на единицу меньшее, чем количество горизонтальньгхлиний растра. Логическая ширина экрана. OFR - Offset Register. Индекс 13Н. Может быть использован для отображения большего, чем обычно количества сим­волов в строке.

Положение подчеркивание символа. ULR - Underline bocation Register. Индекс 14Н. Биты:

0-4-определяетположениеподчеркиваниясимвола(0-13).

5 - установка этого бита означает, что для каждого знака-места счетчик адреса регенерации будет увеличиваться на 4 вместо 1.

6 - установка этого бита выбирает адресацию видеопамяти по двойным словам.

7 - не используется.

Начало импульса синхронизации. SVBR- Start Vertical Blank Register. Индекс 15H.

Длина Юбит. Бит9 расположен в OVR. Бит 10-врегистре высоты символов (MSLR).

Определяет момент начала гашения луча в процессе вертикальной развертки.

Конец импульса гашения вертикальной развертки. EVBR - End Vertical Blank Register. Индекс 16H.

момент, когда значение регистра равно счетчику горизонтальных линий, закан­чивается сигнал гашения вертикальной развертки.

Управление режимом. MCR - Mode Control Register. Индекс 17Н.

Биты:

0 - используется для эмуляции графическихрежимов CGA.

1 - используется для эмуляции графических режимов Hercules.

2 - может использоваться для увеличения в два раза вертикальной разрешающей

способности.

3 - если бит равен нулю, то счетчик адреса регенерации изображения увеличива­ется на 1 на каждое знакоместо, иначе на каждые два знакоместа.

4 - используетсядля тестирования.

5 - используется в EGA.

6 - если бит равен нулю - двухбайтовый режим, 1 - однобайтовый.

7 - если бит равен нулю, то горизонтальный и вертикальный обратный ход лучей невозможен.

Регистр сравнения линий. LCR - Line Compare Register. Индекс 18Н. Имеет 10 бит. Бит 9 расположен в OVR. Бит 10 в MSLR.

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

Регистры синхронизатора.

Доступ осуществляется через индексный порт ЗС4Н и порт данных ЗС5Н.

Регистр сброса синхронизатора. RR - Reset Register. Индекс 0.

Бит:

0 - бит асинхронного сброса. После записи в него 0, происходит немедленный сброс и остановка синхронизатора. Могут быть потеряны видеоданные.

1 - Бит синхронного сброса. Нулевое значение сбрасывает и останавливает синх­ронизатор в конце исполняемого цикла.

Регистр режима синхронизации. CMR - Clock Mode Register. Индекс 1.

Управляет временными циклами синхронизатора. Перед модификацией регистра следует сбросить бит 1 в регистре сброса.

Биты: 0 - задает ширину символов в текстовых монохромных режимах. 5 - если бит равен единице, то экран гаснет и процессор получает монополию на доступ к ви­деопамяти. Это может несколько ускорить процесс обмена данными между процессо­ром и видеопамятью.

Остальные биты не используются.

Регистр разрешение записи битовой плоскости. CPWE - Color Plane Write Enable. Индекс 2.

Первые четыре бита определяют возможность записи в четыре битовых плоско­сти. Если бит равен 1, то можно записывать в соответствующую битовую плоскость.

Регистр выбора знакогенератора. CGSR - Character Generator Select Register. Индекс 3.

Видеоадаптер VGA позволяет загрузить до 8 таблиц знакогенератора. Одновре­менно могут использоваться символы двух таблиц. Используются биты 0-5.

Бит 3 байта атрибутов, в случае если разрешено использование двух таблиц сим­волов, определяет, какая таблица будет использоваться при отображении символа с данным атрибутом.

Биты 2,3,5 определяют таблицу, если бит 3 байта атрибутов равен 1, биты 0,1,4 -если этот бит равен 0.

Выбор осуществляется согласно таблице:

Биты

5

З

2

 

-

4

І

о

 

о

о

о

Таблица 1

о

о

І

Таблица2

о

І

о

Таблица 3

о

І

І

Таблица4

І

о

о

Таблица 5

І

о

І

Таблица6

І

І

о

Таблица7

І

І

І

Таблица8

Регистр определения структуры памяти. MMR- Memory Mode Register. Индекс 4. Биты:

О-обычно равен 0.

1 - обычно равен 1.

2 - если бит равен 0, то доступ по четным адресам происходит к нулевой битовой плоскости, апо нечетным - кпервому (дваслоя).

3 -если битравен 0, то доступ по адресам, кратным 0, к слою 0, кратным 1, кслою 1 ,кратным 2 - кслою 2, кратным 3 - кслою 3 (три слоя).

Остальные биты не используются.

Регистры графического контроллера.

Доступ к регистрам осуществляется посредством индексного порта ЗСЕН и порта данныхЗСРЫ.

Регистр установки/сброса. SRR - Set/Reset Register. Индекс 0. Используя этотрегистр вместес SRERMoaaro определить данные, размещаемыев битовых плоскостях видеопамяти. Биты:

0-3 - отвечают за четыре битовых плоскости, Остальные биты не используются.

Регистр разрешения установки/сброса. SRER- Set/Reset Enable Register. Индекс 1. Позволяет при операции записи в видеопамять для одних битовых плоскостей использовать данные от процессора, а для других - из регистра SRR. Биты:

0-3 - отвечают за соответствующие битовые плоскости. Остальные - резерв.

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

Возможность использования этого регистра можно осуществить только в нулевом режиме записи (см. MDR).

Регистр сравнения цветов. CCR - Color Compare Register. Индекс 2.

Используется для быстрого поиска на экране пикселя соответствующего цвета.

Биты:

0-3 - искомые величины для соответствующей битовой плоскости. Остальные биты зарезервированы.

ПередиспользоюниемрегастрадолжныбьпъустановленырегастрыМОКиСЕЮК. Более подробно использование этого регистра будет пояснено ниже.

Регистр циклического сдвига и выбора функции. DRFS - Data Rotate and Fuction Select. Индекс З.

Выполняет две функции:

- циклический сдвигданных, записываемых процессором в видеопамять,

- выполнение над записываемыми в видеопамятьданными и содержимым регист­ров - защелок некоторых логических операций.

Биты:

0-2 - счетчик сдвига.

3-4 - биты выбора логической функции.

Остальные - зарезервированы.

Операции логического сдвига осуществляются в нулевом режиме записи. Логи­ческие операции можно выполнять в нулевом и втором режиме записи. Операция цик­лического сдвига выполняется до логических операций.

Возможныелогическиеоперации: 00 - нет модификации, 01 - логическое"И", 10 -логическое "ИЛИ", 11 - "ИСКЛЮЧАЮЩЕЕ ИЛИ".

Регистр выбора читаемой плоскости. RPSR - Read Plane Select Register. Индекс 4.

Определяет номер битовой плоскости, из которого процессор можетчитать данные.

0-1 - номер битовой плоскостидля чтения.

Регистр режима работы. MDR - Mode Register. Индекс 5.

Биты:

0-1 - режим записи.

РежимО. Режим непосредственной записи. Процессор имеет доступ к видеопамя­ти. Возможны операции: установка/сброс, циклический сдвиг, логические операции, использование регистра битовой маски.

Режим ЕРежимиспользованиярегистровзащелки. Причтенииданныхпроисхо-дит запись 8 битов из каждого слоя в регистры защелки. Затем при записи эти данные могут быть записаны в другое место. Используется для копирования.

Режим 2. В этом режиме младшие четыре бита байта данных процессора играют такую же роль, как содержимое регистра установки/сброса в режиме 0.

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

2 - не используется.

3 - разрешение режима сравнения цветов. 1 - включение режима сравнения цве­тов, режим чтения 0 или 1,

4 - четный/нечетный режим. Используется в текстовом режиме.

5 - режим регистра сдвига. Используется в режимах 4 и 5.

6 - управление режимом с 256 цветами.

7 - не используется.

Регистр многоцелевого назначения. MIR - Miscellaneous Register. Индекс 6. Биты:

0 - бит разрешения графического режима(1).

1 - если бит установлен, то плоскости по 16К объединяются в две плоскости по 32К. 2-3 - установка начального и конечного адресов памяти:

00 АОООЮООО - BO00-.FFFF

0 1 АОООЮООО -AOOO:FFFF

1 ОВООО.-0000 -BO00:7FFF 1 1 В800:0000 - BOOO:FFFF

Регистр маскирования битовых плоскостей. CDCR - Color Don't Care Register.

Индекс 7.

Используется в режиме сравнения цветовых слоев. Если соответствующий бит равен нулю, то при операции сравнения цветов, соответствующий слой в рассмотре­ние не принимается.

Используются биты 0-3.

Регистр битовой маски. BMR - Bit Mask Register. Индекс 8. Управляет записью в видеопамять. Если какой-либо бит будет равен нулю, то со­ответствующий бит будет записываться в видеопамять из регистра защелки.

Регистры контроллера атрибутов.

Доступ осуществляется через один порт ЗСОН, который выполняет роль и индек­сного регистра, и регистра данных. Для того чтобы перевести порт в исходное (индек­сное) состояние, следует осуществить чтение из порта 3DAH (ЗВАН для монохромно­го режима).

Регистры цветовой палитры. CPR - Color Palette Register's.

Индексы0-15.

Каждый регистр имеет по шесть действующих битов, соответствующих 6 линиям управления дисплея.

Регистр управления дисплеем. MCR - Mode Control Register. Индекс ЮН. Биты:

- содержит нуль для текстовых режимов.

1 - тип атрибутов, для монохромных атрибутов он должен быть равен 1.

2 - используется в монохромныхрежимах.

3 - управляет 7-м битом в байте атрибутов. Если бит установлен, то 7-й ' бит опре­деляет мигание, в противном случае - интенсивность.

4 - не используется.

5 - при установке бита запрещено горизонтальное панорамирование стационар­ной части экрана.

6 - равен нулю с 256 цветами.

1 - выбор источника сигнала для видеовыходов 4 и 5. Если равен нулю, то линии 4 и 5 управляются регистрами палитры, иначе сигналы поступают из битов 0-1 регистра выбора цветов.

Регистр цвета рамки экрана. SBCR - Screen Border Color Register. Индекс 11H. Биты соответствуют регистрам цветовой палитры.

Регистр разрешения битовой плоскости. CPER - Color Plane Enable Register. Индекс 12H. Биты:

0-3 - биты разрешения битовых плоскостей (маскирования битовых плоскостей). 4-5 - используются вместе с диагностическими битами регистра состояния. 6-7 - не используются.

Регистр горизонтального панорамирования. HPR - Horizontal Panning Register. Индекс 13Н.

0- 3 - задают величину горизонтального сдвига.

Регистр выбора цвета. CSR - Color Select Register. Индекс 14Н. Биты:

0 - линия 4.

1- линия 5.

2 - линия 6.

3 - линия 7.

Регистры цифро-аналогового преобразователя.

Регистр маскирования пикселей. PMR - Pixel Mask Register. Адрес ЗС6Н. Регистр состояния ЦАП. DAC SR - DAC State Register. Адрес ЗС7Н. Регистр используется только для чтения.

Первые два бита определяют, доступны или нет регистры цветовой таблицы. 11-доступны для записи, 00 -доступныдля чтения.

Индекс читаемого регистра таблицы цветов. LTRIR - Look-up Table Index Register. Доступен для записи через порт ЗС7Н.

Данные из регистров таблицы цветов читаются через порт ЗС9Н как три 6-бито-выхчисла (красный, зеленый, синий). После чтениетретьегочислазначение индекса автоматически увеличивается на    При операции следует запретить прерывания.

Индекс записываемого регистра таблицы цветов. LTWIR - Look-up Table Index

Register. Доступен через порт ЗС8Н.

Запись осуществляется через порт ЗС9Н аналогично операции чтения. Регистр данных таблицы цветов. LDTR - Look-up Table Data Register. Доступен через порт ЗС9Н.

Используется 6 первых бит. Читается и пишется последовательно 3 раза (красный, зеленый, синий).

II. Структура видеопамяти стандартных графических режимов.

Структура видеопамяти для стандартных режимов имеет плоскостной характер. Стандартный объем видеопамяти - 256К, об использовании памяти большего размера речь пойдет ниже. Каждая из четырех битовых плоскостей имеет объем б4К соответ­ственно. Все плоскости соответствуют одному тому же адресному пространству в памяти и одному и тому же координатному пространству на экране. Каждый пиксель формируется из четырех параллельных бит - по одному из каждой плоскости. Таким образом, в общем случае цвет пикселя формируется из четырех бит, т.е. может иметь значение от 0 до 15. Эта стандартная схема видеопамяти пришла в VGA от старых адаптеров. Она имеет два существенных недостатка:

а) битовое управление пикселями, что достаточно неудобно,

б) для увеличения диапазона цветов необходимо добавлять битовые плоскости. В VGA-адаптере был добавлен еще один режим 1 ЗН-й. Структура видеопамяти в

нем линейна. Вся видеопамять разбита на байты, а каждый байт отвечает засвой пик­сель, то есть цвет пикселя может меняться в диапазоне о-255.

Схема работы с видеопамятью в режиме с четырьмя битовыми плоскостями до­вольно полно изложена в главе 10. я привожу программу, демонстрирующую все четыре способа записи в видеопамять. Мы работаем здесь с режимом 12Н, которо­го нет у EGA-адаптера, но, по сути, он нисколько не отличается от режима б40хЗ50, который мы разбирали в главе 10.

/•программа, использующая /•записи в видеопамять CODE SEGMENT

ASSUME CS:C0DE, DS:C0DE

ORG 10OH

различные режимы

BEGIN:

MOV MOV XOR

AX,ОАОООН

ES,AX

BX,BX

;видеопамять

,-работаем с  первым байтом

;режим 640X480, 16 MOV АХ/0012Н

INT ЮН CALL INPUT

;разрешим

MOV MOV MOV OUT ,'регистр MOV MOV OUT плоскости

все битовые

DX,3C4H АН,0FFH AL,2 DX,AX

битовой маски DX,3CEH

AX,0FF08H ;можно DX,AX

менять   все биты

/установка режима чтения/записи -

MOV   АХ,0005Н      -режим чтения О/записи-0

OUT DX,AX /установка режима циклического сдвига

M0V АХ,0003Н

OUT DX,AX

/регистр разрешения установки/сброса   - SRER

MOV   АХ,0001Н      /индекс 1

OUT DX,AX /запись в видеопамять

MOV    AL,11111111В

OR      ES:[BX],AL  /во  все четыре плоскости заноситься

255

/на экране появляется белая полоска CALL INPUT

/разрешаем для   одной  из   плоскостей  использование   данных SRR MOV   АН,00000001В  /для битовой плоскости О MOV    AL,1 OUT DX,AX

MOV AX, 0 /в битовую плоскость 0 будет записан байт О /в результате цвет каждого из 8 пикселей будет уже не 1111В /-   (белый), а  ШОВ - желтый

OUT    DX,AX      /запись в SRR

MOV    AL,0FFH

OR /на  экране желтая полоска

CALL INPUT

/теперь попытаемся поставить точку с координатами Х=5,   Y=5 -;- шестая строка,   цвет точки - 1101В /маскируем все пиксели,   кроме  5-ого ()

MOV АН,00001000В

MOV AL,8

OUT DX,AX

/работаем с регистрами установки/сброса - они обеспечат пра-

бит в плоскости 1    (бит должен быть равен 0) MOV АН,00000010В MOV AL,1 OUT DX,AX ; SRR у нас уже готов MOV AL,0FFH

OR /на экране точка

CALL INPUT

/теперь переходим к режиму  записи 1 -

MOV   АХ,0105Н      /режим чтения 0/записи-1 OUT DX,AX

;перенесем полоску в левом верхнем углу в другое место экрана.

Вы понимаете,    что байт передается не через регистр ;AL,  а через регистры защелки MOV AL,ES:[BX]

MOV строка экрана

CALL INPUT

;теперь режим записи 2 -

MOV   АХ,0205Н      /режим чтения 0/записи-2 OUT DX,AX

/поставим точку  цвета   1001В  с  координатами Х=5 Y=10 /регистр маски битов у нас уже готов,   регистры же установки/ ; сброса нас уже не волнуют

MOV AL,00001001В  ;нас интересуют лишь  4  первых бита

OR    ES:[ВХ]+80*10,AL

CALL INPUT

; режим записи  3 - ■

MOV    АХ,0305Н       /режим чтения О/записи-3 OUT DX,AX

/регистры установки/сброса

/в данном случае мы лишены возможности выбора битовой

операция  будет производиться над всеми плоскостями /т.о.  во все разрешенные пиксели будет записано оооІВ - синий

/цвет

MOV AL, О

MOV   АН, 1 OUT DX,AX

/разрешаем все пиксели MOV АН,11111111В MOV AL, 8 OUT DX,AX

MOV   AL,0FH    /половина полоски станет синей OR      ES:[ВХ],AL

CALL INPUT ; возвращаемся в  текстовый режим CALL SET_REG mov АХ,0003Н

INT ЮН ;возвращаемся в DOS MOV АХ,4С00Н

INT 21H

/область процедур

;ожидать нажатие клавиши

INPUT PROC

XOR АХ,АХ

INPUT ENDP

/установить   значение  регистров   по умолчанию

SET_REG PROC

/•регистр  сдвига маски

MOV    DX,ЗСЕН

MOV    АХ,0FF08H

OUT DX,AX ,-установка режима   чтения/записи

. MOV   АХ, 0005Н      ;режим чтения О/записи-0

OUT DX,AX ; установка режима   циклического сдвига

MOV АХ,0003Н

OUT DX,AX

;регистр разрешения установки/сброса   - SRER MOV   АХ,0001Н       ;индекс 1 OUT     DX, АХ RETN

SET_REG ENDP CODE ENDS

END BEGIN

Рис. 26.1. Пример использования различных способов записи в видеобуфер.

Если Вы разобрали программы и схемы в главе 10, то без труда поймете програм­му на Рис. 26.1. Мыже переходим к обсуждению вопроса чтения из видеопамяти. Как Вам уже известно, существует два режима чтения из видеопамяти. В режиме 0 алго­ритм чтения тривиален. При помощи регистра RPSR выбираем читаемую плоскость и далее читаем. Например, MOV AL,ES:[BXj. Данный способ хорош, если речь идет о чтении некой области экрана (чтобы записать на диск, например). Чтобы узнать цвет конкретного пикселя, однако, требуется не только вначале считать четыре байта из битовых плоскостей, но и провести анализ соответствующий битов.

Для поискаже конкретного пикселя такой подход неудобен. В этом случае использу­ют режим чтения 1. Здесь значения восьми пикселей, переданныхв регистры защелки, сравниваются с четырьмя младшими битами регистра сравнения цветов (CCR). Резуль­тат сравнения передается процессору. Когда цвет пикселя совпадет с содержимым реги­стра CCR, соответствующий битв возвращаемом байте равен 1, при неравенстве-0. В процессе считывания участвуют четыре бита регистра CDCR. Они объединяются по "И" со значениямипикселей.Еслимыне хотим, чтобыданный регистр влиял на резуль­тат, достаточно в его младшие биты поместить 111 lb. Данный режим позволяет быстро найти все пиксели заданного цвета. Однако для того чтобы этим методом узнать цвет конкретнойточки, необходимо сделать до 16считываний из памяти.

Одним из интересныхграфическихрежимов адаптераУОАявляется режим 1 ЗН.Раз-решениевэтомрежимесоставляет 320x200. Структура памяти линейная, т.е. каждый байт ее соответствует одной точке. Значение цвета варьируется в промежутке 0-255. Размер од­ной (и единственной) страницы этого режима составляет 320x200=64000 байт. Смещение видеобуфере байта точки с координатами Х,У вычисляется по элементарной формуле:

320*у+х. Простота и быстрота доступа к пикселям, широкий цветовой диапазон являются

причинойчастогоиспользованияэтогорежимавграфическихп^

лена простая программа, демонстрирующая чтение-запись пикселей в данном режиме.

/пример записи и чтения в режиме 13Н CODE SEGMENT

ASSUME CS:CODE, DS:CODE

ORG 100H

BEGIN:

/установка режима MOV AX,0013H

INT 10H ; начнем с   нулевого байта XOR BX,BX MOV AX,ОАОООН MOV ES,AX CALL INPUT MOV    CX,320*200 MOV    AL, О

;количество пикселей на видеостранице

LOOl;

MOV INC INC LOOP

ES: [ВХ] , AL

AL BX L001

CALL INPUT

XOR ВХ,ВХ ./

MOV СХ,64000

/меняем все цвета />=128 на цвет 255 L002:

CMP BYTE  PTR ES:[BXJ,128

JB NO_CH

MOV BYTE  PTR ES:[BX],255

NO_CH:

INC BX

LOOP LOO2

CALL INPUT

MOV AX,0003H

INT 10H MOV АН,4CH

INT 21H

INPUT PROC

MOV AH,0

INPUT ENDP CODE ENDS

END BEGIN

Рис. 26.2. Пример работы в режиме 13Н.

Отрицательной стороной режима является то, что видеопамять состоит всего из одной страницы67, поэтому возможности мультипликации в этом режиме сильно ограничены. Кроме того, в операциях чтения-записи мы лишены возможности исполь­зовать регистры защелки.

Ш. Нестандартные графические режимы.

Все изложенное выше должно было навести читателя на мысль о недостаточности графических режимов. В частности, хотелось бы иметь видеорежим с 256 цветами и по крайней мере 2 страницами. Простейший расчет позволяет заключить, что это было бы возможно для режима 320x400 для стандартной видеопамяти 256 К. Действитель­но имеем: 320*400= 128000. Эю нам как раз и подходит. Т.е. в четыре битовые плоско­сти по 64 Кб должно поместиться 2 страницы.

Мы рассмотрим два нестандартных графических режима: 320x400 - 256 цветов, 2 - страницы; 640x400 - 16 цветов, 2 страницы.

Начнем с режима 320*400. Режим интересен тем, что необычным для нас способом идет запись в видеопамять. Каждая битовая плоскость отвечает за свой ряд пикселей. В плоскости 0 хранятся цвета пикселей с номерами 0,4,8,12..., в плоскости 1 -сномерами 1,5,9,13..., в плоскости 2 - с номерами 2,6,10,14..., вплоскостиЗ-сномерами 3,7,11, - число пикселей в строке, то положение соответствующего байта в видео­буфере определяется по формуле номер же плоскости, в которой располо­жен соответствующий байт, определится по формуле (X+Y*N) MOD 4. При этом по­скольку Y*N, естественно, делится на 4, то вычислять надо только остаток X MOD 4. Ниже эти формулы применяются для постановки точки в нужном месте экрана. Отмечу что данные формулы работают  для второго нестандартного режима.

CODE SEGMENT

ASSUME CS:CODE, DS:CODE ORG 10OH

BEGIN: t

/устанавливаем режим 13Н MOV AX,0013H INT 10H MOV AX,0A000H MOV ES,AX

*7 Вы, наверное, догадались, что это связано с тем, что задействована только одна битовая плоскость.индексом

нечетным адресам

графического контроллера

индексом 5

; выбираем регистр  синхронизатора с MOV DX,3C4H MOV AL,4 OUT    DX,AL

INC DX IN      AL,DX

■; включаем режим адресации по слоям

AND    AL,11110111В ,; выключаем режим адресации по четным

OR      AL,00000100В

OUT    DX, AL г выбираем регистр

MOV DX,3CEH

MOV AL,5

OUT    DX, AL

INC DX

выключаем    доступ    по четным адресам к четным плоскостям, :га по нечетным адресам - нечетным плоскостям IN      AL, DX AND    AL, 11101111B

OUT DX,AL

DEC DX

выбираем регистр смешанного назначения графического ;•контроллера

MOV   AL, 6 OUT    DX, AL

INC DX

сбрасываем  бит,   управляющий     сцеплением четных  и нечетных плоскостей

IN      AL, DX

AND AL,11111101B

OUT DX,AL

;разрешаем запись данных  во  все    четыре    битовые плоскости, г записывая число OFH в регистр разрешения    записи в битовую ц плоскость

MOV    DX,ЗС4Н

MOV AL,2

OUT DX,AL

INC DX

MOV AL,00001111B OUT     DX, AL

видеопамять выбор режима   13Н очищает только первые 64К. XOR DI,DI MOV AX,DI

mov    СХ,0FFFFH

old

REP STOSB

.; выбираем регистр высоты    символов текста контроллера ЭЛТ MOV   DX,3D4H MOV   AL, 9 OUT DX,AL INC DX

.•запрещаем двойное сканирование, т.е. увеличиваем разрешение ,," по вертикали в 2 раза

IN      AL,DX

AND AL,01100000B

OUT     DX, AL

,;выбираем регистр  положения  подчеркивания символа DEC DX MOV AL,14H

OUT DX,AL INC DX

выключаем режим адресации     видеопамяти по  двойным словам IN      AL,DX AND    AL,10111111В OUT DX,AL ,;выбираем регистр управления режимом

DEC    DX . MOV AL,17H OUT     DX, AL .  INC DX

,г выключаем байтовый режим адресации,   в результате получаем ;разделение  данных между   4-мя  битовыми плоскостями

IN AL,DX

OR      AL, 01000000В

OUT    DX, AL

точку в  середину первой страницы MOV CX,160 MOV DX,200 MOV      BL,50 CALL POINT CALL INPUT

точку   в   середину   второй страницы MOV AX,ES ADD AX,800H MOV ES,AX MOV CX,160 MOV DX,20O

MOV     BL, 1

CALL POINT

CALL INPUT ;переключить страницы,   при этом в ;номер страницы,   умноженный на 4

MOV АХ,0504Н

INT 10H

CALL INPUT

AL посылается

АХ,0002Н

10H

АН,4СН

21H

процедур

в

BL

_END:

MOV INT MOV INT ;область

точку ;СХ - х,  DX - Y,

POINT PROC

MOV    АХ, 80

MUL DX

PUSH CX

SHR CX,1

SHR CX ,1

ADD АХ , СХ

MOV DI , АХ

POP СХ

AND CL ,3

MOV AH , 1

SHL AH ,CL

режиме - цвет

320*400

четверть ширины экрана в пикселях

цвета

MOV

MOV

OUT

MOV

RETN POINT ENDP INPUT PROC

MOV AH, 0

INT 16H

RETN INPUT ENDP CODE ENDS

END BEGIN

DX , 03C4H ;

AL,2 7 DX , AX

ES : [ DI ], BLr

остаток от Х/4

бит, соответствующий номеру плоскости в  которую будет  занесено значение

запись  в регистр синхронизатора с индексом 2

запись  значения цвета

видеопамять

Рис. 26.3. Пример работы с нестандартным режимом 320x400.

Программа на Рис. 26.3 выполняет следующие простые действия: устанавливает графический режим 320x400, ставит точку в середину страницы 0, ставит точку в се­редину страницы 1, показывает страницу 1, Обращаю ваше внимание на следующий интересный момент: при переключении страницы я вместо 1 засылаю в АН 4. Дело в том, что размер страницы формально равен 8К, тогда как на экране помещается 32К.

Режим 640x400 с 2 страницами памяти и 16 цветами хорош прежде всего тем, что имеет2 страницы. Работавэтом режиме практически такаяже, как врежиме 640x350, поэтому мы только укажем способ перехода в этот режим. Ниже дан фрагмент про­граммы, который переводит адаптер в этот нестандартный режим.

mov

ax,OOOeh

;режим 640x200 и  16 цветов

int

10h

 

mov

dx,3d4h

 

mov

al, 9

;регистр MSLR

out

dx, al

 

inc

dx

 

in

al, dx

 

and

al,01100000b

/обнуляем 7-й бит

out

dx,al

/отменяя двойное сканирование

IV. SVGA и стандарт VESA.

Видеоадаптеры SVGA, к сожалению, не являются стандартом. Для улучшения воз­можностей своего детища разные фирмы добавляли в него различные средства управле­ния, которые могут значительно отличаться друг от друга. Перед разработчиками сто­яли две основные задачи: увеличение разрешения экрана и увеличение количества ото­бражаемых цветов. И то и другое требуют увеличения видеопамяти. Заметим при этом, что окно, через которое производится доступ к памяти, остается того же размера: А000Н-A000H:FFFFH. Отом, как передвигать это окно по видеопамяти, будетсказано ниже.

Вспомним, что в графическом режиме, рассматриваемом в главе 10, на каждый цвет был свой регистр палитры. Меняя регистр палитры, мы имели возможность вы­бирать 16 цветов из 256 возможных. Соответственно в адаптере таблица цветов фор­мировалась из 256 регистров палитры. Каждый регистр палитры состоит из 6-битных компонент, отвечающих соответственно за интенсивность красной, зеленой, синей ком­поненты. В результате мы можем получить 256 цветов из набора 64*64*64=262144. В SVGA используется другой принцип формирования цвета, в противном случае при­шлось бы многократно увеличивать количество регистров палитры. Здесь использует­ся схема прямого кодирования цвета (Direct Color Mode). Данная схема основана на том, что биты, которые определяют цвет пикселя, разбиваются на три группы, кото­рые определяют интенсивность красного, зеленого, синего цвета. Предположим, на каждый пиксель отводится два байта памяти. В различных режимах из имеющихся 32 бит могут быть выделены различные группы. Рассмотрим, например, ситуацию, когда на каждую компоненту отводится по 5 бит. В результате получаем, что на экране мо­гут существовать одновременно до 32768 цветов (32*32*32=32768,32 = два в степени 5). В случае если на кодирование цвета отводится 24 бита, получим возможность существования на экране 256*256*256 = 16777216 цветов. Ниже будет дана таблица ре­жимов по стандарту VESA.

Функции VESA (VBE - VESA BIOS Extention).

Функции VESA являются хоть каким-то спасением в деле программирования SVGA. Ведь не будете Вы для своей программы писать драйвер для каждого вида адаптера. «Беспредел» в области производства видеоадаптеров дошел до того, что стали выпускаться адаптеры, которые не вполне совместимы с адаптерами VGA.

Функции VESA зашиты либо в ПЗУ адаптера, либо поставляются в виде драйве­ра. При вызове любой функции VESA регистр АНдолжен содержать 4FH. Номер фун­кции помещается в регистр AL. Если данная реализация поддерживает вызываемую функцию, то в AL возвращается 4FH, еслинет, то возвращается другое значение. Если функция завершена успешно, то в АН возвращается 0, если была ошибка, то возвра­щается 1 ,и, наконец, если аппаратура видеоадаптера не поддерживает данную функ­цию, то в АН возвращается 2.

Рассмотрим основные функции VESA.

1. Получить информацию о VBE и видеоадаптере.

AL = 0

ES:DI - указатель на буфер в 512 байт (версия VBE 1.2) или буфер 256 (версия 1.2). Первые 4 байта буфера должны содержать строку 'VBE2'.

Содержимое буфера.

Смещение

Размер

Описание

00h

4 байта

Строка "VESA"

04Н

2 байта

Номер версии VBE (старший байт старший номер версии, младший - младший номер

06Н

4 байта

Указатель на строку, содержащую описание адаптера и VBE

ОАН

4 байта

Бит 0 (вер. 1.2)-1 - ЦАП может работать с данными переменной длины бит 1 (вер. 2.0) - 1 - адаптер не полностью совмести с VGA, бит 2 (вер. 2.0) - 1 - не поддерживает другие функции VBE

ОЕН

4 байта

Указатель на список возможных режимов. Список состоит из 16-битныхвеличин, в конце стоит FFFFh

12Н

2байта

Только для версии 1.2. Объем видеопамяти в блоках по 64 Кб

Только для версии 2.0.

14Н

2 байта

Дополнительный номер версии.

16Н

4 байта

Указатель на строку, содержащую имя фирмы-разработчика

1АН

4 байта

Указатель на строку, содержащую название видеоадаптера

EH

4 байта

Указатель на строку, содержащую номер версии

 

 

 

видеоадаптера

 

22Н

222 байта

Не используется

 

100Н

байт

Информация фирмы-производителя

 

2.   Получить информацию о режиме видеоадаптера. АЬ=1

СХ - номер режима

Е8:ОІ - указатель на буфер размером 256 байт. Содержание буфера.

Смещение   Размер Описание

ООН 2 байта     Атрибуты режима

бит 0-1 - режим доступен

бит 1 -1 - доступнадополнительная информация бит 2 - 1 - поддерживаются функции BIOS бит 3 -1 - цветовой режим (0 - монохромный) бит 4 - 1 - графический режим

бит 5-1 - назначение регистров или адресация портов,

несовместимая с VGA

бит 6-1 - нельзя использовать

окно АОООН:0000 - AOOOHFFFF бит

7-1 - можно использовать адресацию защищенного

режима

02Н

1 байт

Атрибуты окна А:

бит 0 - доступно,

бит 1 - доступно для чтения,

бит 2 - доступно для записи,

ОЗН

1 байт

тоже для окна В

04Н

2 байта

шаг позиционирования окна в Кб

06Н

2 байта

размер окна в Кб

08Н

2байта

начало сегмента окна А

ОАН

2 байта

начало сегмента окна В

ОСН

4байта

указатель на функцию перемещения окна

ЮН

2 байта

количество байт на линию сканирования

Только для версии VBE 12

12Н

2 байта     разрешение по горизонталивв2

14Н

2 байта

разрешение по вертикали

16Н

1 байт

ширина символа в пикселях

17Н

1 байт

высота символа в пикселях

18Н

1 байт

количество битовых плоскостей

19Н

1 байт

количество бит на пиксель

1АН

1 байт

количество банков памяти

1ВН

Ібайт

тип модели памяти:

0 - текстовый режим

1 - структура аналогична CGA

2 - структура аналогична Hercules

3 - видеопамять разделена на 4 слоя (плоскости)

4 - пиксели представлены битами, расположенными

последовательно,

5 - режим позволяет отображать 256 цветов, слои не сцеплены

6 - используется схема прямого кодирования

1СН

1 байт

размер банка памяти в Кб

1DH

1 байт

количество доступных страниц видеопамяти без 1

1ЕН

1 байт

резерв

1FH

1 байт

количество бит для красного компонента

20H

Ібайт

положение младшего бита поля

21H

1 байт

количество бит для зеленого компонента

22H

1 байт

положение младшего бита поля

23H

1 байт

количество бит для синего компонента

24H

1 байт

положение младшего бита поля

25H

1 байт

количество запасных бит

26Н

1 байт

положение младшего бита запасного поля

27H

1 байт

бит 0-1 - если можно программировать регистры ЦАП бит 1    - если запасное поле можно использовать

Только для версии 2.О.

28Н

4байта

32-разрядтный адрес буфера для использования в защищенном режиме

2СН

4байта

смещение от начала буфера области памяти, не отображаемой на экране

ЗОН

2 байта

размер неиспользуемой области видеопамяти

32Н

2О6 байт

резерв

вв3

3.  Установить режим видеоадаптера. AL=2h

ВХ - номер режимаУЕБА

Список графических режимов по стандарту VESA.

Режим

Тип режима

Количество цветов

Разрешение

100Н

графический

256

640*400

101Н

-

256

640*480

102Н

-

16

800*600

103Н

-

256

800*600

104Н

-

16

1024*768

105Н

-

256

1024*768

106Н

-

16

1280*1024

107Н

-

256

1280*1024

108Н

текстовый

16

80*60

109Н

-

16

1З2*25

10АН

-

16

132*43

10ВН

-

16

132*50

10СН

-

16

132*60

10DH

графический

З2768

320*200

10ЕН

-

655З6

320*200

10FH

-

16777216

320*200 1

ИОН

-

З2768

640*480

111Н

-

655З6

640*480

112Н

-

16777216

640*480

113Н

 

З2768

800*600

114Н

-

655З6

800*600

115Н

-

16777216

800*600

116Н

-

З2768

1024*768

117Н

-

655З6

1024*768

118Н '

-

16777216

1024*768

119Н

-

З2768

1280*1024

ПАН

-

655З6

1280*1024

4. Определить текущий графический режим.

AL = 03H Выход: ВХ- текущий режим.

5. состояние видеоадаптера.

AL = 04H

а) Определить размер буфера состояния.

DL = 0

СХ - параметр сохранения

бит 0 - состояние видеоадаптера

бит 1 - состояние переменныхвидеофункций

регистров бит 3 - состояние регистров SVGA

Выход:

ВХ-размер буфера

б) Сохранить состояние видеоадаптера

DL=1

ES:BX- указатель на буфер

- параметр сохранения

в) Восстановить состояние видеоадаптера

DL=2

- указатель на буфер

- параметр сохранения

6. Переместить окно видеопамяти.

AL = 05

ВН = 0

BL-номер окна (0,1 -АДЗ)

DX - адрес окна в единицах шага.

Шаг кратен размеру окна.

7. Определить адрес окна.

AL = 5

ВН= 1

BL - номер окна На выходе:

DX - адрес       в единицах шага.

Далее в главе будут приведены несколько примеров работы с режимами SVGA. Следующая программа устанавливает режим        (800*600*256) и заполняет экран

цветными точками. Обращаю Ваше внимание на следующие особенности:

а) объем памяти, требуемый для одной видеостраницы, превосходит 256 Кб -800*600=480000. Т.о. мы переходим тот рубеж, который когда-то был определен разработчиками VGA-адаптеров. Для того чтобы перейти этот рубеж, мы исполь­зуем средство VESA BIOS. Других способов автор не знает. К сожалению, утвер­ждение некоторых авторов, что это можно сделать посредством установки окна в пределах А000Н:О0ОО - B000H:FFFFH (см. регистр MIR) не подтверждается. Их программа не стала работать ни на одном из проверяемых компьютеров. В то же время анализ предложенной ими программы не подтверждает наличие в ее тек-стеопечатки. Следовательно, увы, и не существует универсального способа пе­рейти вышеуказанную границу, кроме как использовать средства VESA <*.

б) структура памяти в устанавливаемом нами режиме аналогична структуре ре­жима 320*400*256, который мы устанавливали ранее. Каждая битовая плос­кость отвечает засвойряд пикселей (см. комментарий к программе на Рис. 26.3).

в) в процедуре постановки точки мы вынуждены проверять, не превосходит ли чис­ло (800* Y+X)/4 OFFFFH. Как только это происходит, мы передвигаем адресное окно на один шаг. Этого достаточно, чтобы охватить вторую половину экрана.

г) переменная_81введена,чтобыневызыватьлишнийразпрерывание ЮН. Этобы

еще более замедлило вывод информации на экран. Другим фактором, который замедляет постановку точки, является необходимость вызова процедуры - посто­янное выполнение команд CALLh ЯЕТНявляется серьезным замедляющим фак-. тором. Но о быстром выводе графической информацииречь еще впереди. В качестве упражнения автор предложил бы читателю переработать программу так, чтобы она делала то же самое для режима 101Н (640*480*256). Здесь также при­дется использовать функции VESA, т.к. и здесь предел в 256 Кб оказывается превзой­денным. В этой связи замечу, что с режимом 640*400*256 можно работать без исполь­зования средств VESA (кроме установки режима). •

CODE SEGMENT

ASSUME CS:CODE, DS:CODE ORG 100H

BEGIN:

режим

MOV AX,4F02H   /пытаемся установить   режим 800*600*256

MOV BX,103H INT ЮН

cmp AX,004FH

JZ _OK

JMP _END                      не удалось установить

_OK:

MOV

MOV ES,AX

68

Остается правда малая вероятность, что указанная программа будет работать с VGA-адапте­рами с памятью, превосходящей 256 Кб. Те же SVGA-адаптеры, на которых я проверял ее, были не совсем совместимыми с VGA.

Р************************************* ;выбираем регистр синхронизатора с индексом 4 ;с помощью которого можно определить структуру

памяти

MOV

DX,ЗС4Н

MOV

AL, 4

OUT

DX, AL

INC

DX

IN

AL,DX

;включаем режим адресации по слоям

AND    AL,11110111В ;выключаем режим адресации по четным и нечетным адресам

OR      AL,00000100В

OUT    DX,AL

.л*****************************************************

;разрешаем запись данных во все    четыре    битовые плоскости,' ;записывая число  OFH в регистр разрешения    записи в битовую /плоскость   (адрес  ЗС4Н,   индекс 2) .

MOV DX,3C4H

MOV    АХ,0FF02H

OUT DX,AX

/******************************************************

/заполняем экран разноцветными точками MOV СХ,600

L002:

PUSH СХ

INC

Y

L001:

MOV    X, О MOV СХ,800

PUSH CX MOV MOV MOV CALL INC INC POP LOOP

CX, X DX,Y

BL,COLOR

POINT COLOR X

CX

L001 POP CX

LOOP LOO2 CALL INPUT

.****************************#**#**********************

__END:

MOV AX,0002H

INT 10H

Глава її. Программирование VGA и SVGA адаптеров

MOV

INT 21H

процедур точку

;СХ

POINT

режиме 800*600*256

О:

1:

цвета

X, DX - Y, BL

- цвет

PROC

 

 

MOV

АХ,200

; четверть ширины экрана

MUL

DX

; в пикселях

MOV

DI,CX

 

SHR

СХ,2

 

ADD

АХ,СХ

;Х/4+800*у/4 -> БХ:ЛХ

adc

DX,0

 

CMP

DX, 0

/проверяем,  не передвинуть ли окно

JNZ

_0

 

MOV

SI, 0

 

CMP

_SI,SI

 

JZ

_1

 

CALL

WIN_MOVE

 

JMP SHORT 1

 

MOV

SI, 1

 

CMP

_SI,SI ;

проверяем,   может быть,   окно не передвигать

JZ

1

 

CALL

WIN_MOVE

 

MOV

SI, AX

 

MOV

CX,DI

 

AND

CL, 3

;   остаток от Х/4

MOV

AH,1

;   бит,    соответствующий  номеру плоскости

SHL

AH, CL

;   в  которую будет  занесено значение

MOV

DX,03C4H

;   запись   в  регистр синхронизатора

MOV

AL,2

;   с индексом 2

OUT

DX, AX

 

MOV

ES: [SI],

значение цвета в

RETN

POINT ENDP ;процедура

INPUT PROC

MOV АН, О

INT 16H

RETN

INPUT ENDP

ожидания  нажатия клавиши

; Процедура   передвижения   окна   видимости   на  N шагов ;количество шагов  помещается  в   SI,   шаг реально ;соответствует размеру окна WIN_MOVE PROC

MOV _SI,SI

PUSH AX

PUSH BX

PUSH DX

MOV AH,4FH MOV AL,05

MOV     BH, 0

MOV BL,0

MOV    DX, SI

int 10h

POP DX

POP BX

POP AX

RETN WIN_MOVE ENDP /область переменных / текущие  координаты точки X DW О

Y DW О

/ текущий цвет точки COLOR DB О

текущее   положение окна _SI       DW О CODE ENDS

END BEGIN

Рис. 26.4. Пример работы с режимом 800*600*256.

В качестве еще одного примера рассмотрим режим 1 ЮН по стандарту VESA. Этот режим имеет разрешение 320*200 и 32768 цветов. Формирование цвета происходит пу­тем смешивания трех цветов: красного, зеленого и синего. На каждый цвет отводится по 5 байт. Это как раз случай прямого кодирования. Цвет формируется непосредственно занесением байт в память. При этом на каждую точку отводится по два байта. Пятнад­цать первых бит и составляют цветовую гамму точки. В результате мы получаем, что для экранной памяти требуется 320*200*2= 128000байт. Точка формируется двумя со­седними байтами памяти. Для того чтобы работать со второй половиной экрана нам придется передвинуть окно так, как мы это делали в предыдущем примере.

/пример записи и чтения в режиме 13Н CODE SEGMENT

ASSUME CS:C0DE, DS:CODE

ORG 10OH

BEGIN:

;установка режима /устанавливаем режим 10DH

MOV АХ,4F02H   /пытаемся установить режим 320*200*32768

MOV BX,10DH INT ЮН CMP AX,004FH

JZ      _OK /режим не удалось установить

JMP _END

_ОК:

XOR ВХ,ВХ M0V АХ,0А000Н

MOV

/вначале поставим точку красного цвета CALL INPUT MOV ВХ,20000 MOV   AL,00000000В MOV ES:[BX],AL INC BX

CALL INPUT

MOV AL,11111100B /старшие 5 бит и определяют красный MOV  ES:[BX],AL /цвет

CALL INPUT

/заполним пол-экрана  разноцветными точками

MOV    СХ,320*200   /количество  пикселей на видеостранице MOV    AL, 0 MOV    ВХ, 0

L001:

MOV    ES:[ВХ],AL

INC AL INC BX

MOV    ES:[ВХ],AL

INC BX -LOOP LOOl

окно MOV    АН,4FH

MOV   AL, 5

MOV     BX,0 ;

MOV   DX, 1

INT 10H

CALL INPUT

/заполняем разноцветными точками  вторую половину экрана

MOV   СХ,320*200   /количество пикселей на видеостранице MOV   AL, 0 MOV    ВХ, 0

L002 :

MOV   ES: [BX] , AL INC AL INC BX

MOV ES: [BX] ,AL

INC BX LOOP L002 XOR BX,BX CALL INPUT

_END:

MOVAX,0003H

.....•!. -INT. 10H  _ .. .

MOVAH,4CH

INT 21H INPUT PROC

MOV 'AH, 0

INT 16H RETN

INPUT  ENDP •

CODE ENDS

end begin

ASSEMBLER. Учебный курс

Рис. 26.5. Пример работы с режимом