Компьютерный рынок динамичен по своей природе, он постоянно предлагает новое, все более совершенное видеооборудование для ПК. Пользователи, напротив, склонны соразмерять свои потребности и реальные финансовые возможности. Поэтому в эксплуатации находится множество видеосистем, изготовленных разными фирмами и в разное время. Они существенно различаются по конструктивному исполнению, техническим характеристикам и, конечно же, по особенностям программирования. На их примере можно проследить всю историю развития технических средств персональных компьютеров от первых IBM PC XT до новейших моделей на базе процессоров семейства Pentium.
Основными элементами компьютерных видеосистем являются мониторы и видеокарты. Кроме того, к ним относятся графические ускорители и платы для работы с телевизионным изображением, которые используются в зависимости от особенностей решаемых задач.
Монитор или дисплей является одним из важнейших узлов современного персонального
компьютера, предназначенным для визуализации (т. е. для представления
в виде, доступном для человеческого глаза) выводимой информации. За время
существования ПК было выпущено достаточно много мониторов различных типов.
По степени улучшения технических характеристик их можно расположить в
такой последовательности: Color Graphics Adapter (CGA), Enhanced Graphics
Adapter (EGA), Video Graphics Array (VGA), Super Video Graphics Array
(SVGA). Этот перечень не претендует на полноту, но каждая из названных
моделей получила, в свое время, наибольшее распространение. Мониторы CGA,
EGA в настоящее время безнадежно устарели и не выпускаются промышленностью,
однако некоторые из них еще находятся в эксплуатации.
Для получения изображения на экране монитора требуется выполнение специальных действий, поэтому неотъемлемой частью монитора является встроенное в него устройство управления. Это еще не контроллер, речь идет о совершенно других функциях, поэтому в англоязычной литературе для названия таких устройств используется термин unit. Именно благодаря встроенному устройству управления все современные мониторы (VGA и SVGA) подключаются к стандартному разъему компьютера и поддерживают стандартный аппаратный интерфейс, т. е. определенную последовательность управляющих сигналов, их полярность, уровень и форму. Поэтому мониторы выпускаются и продаются как отдельные функциональные устройства без контроллера (так же, как, например, принтеры).
Для получения изображения в современных настольных мониторах используется электронно-лучевая трубка (кинескоп). Модели таких мониторов различаются по размеру экрана, разрешающей способности, используемому кинескопу, способам настройки (простые или с цифровым управлением). Эти характеристики определяют качество изображения и стоимость изделия, но никак не влияют на интерфейс с контроллером и способы программирования.
В переносных и портативных компьютерах применяются мониторы, в которых изображение получается на матрице из жидких кристаллов. На сегодняшний день качество такого изображения хуже, чем у мониторов с обычным кинескопом. Однако поиски новых принципов получения изображения на экране идут весьма активно и, возможно, в ближайшем будущем, будут достигнуты большие успехи в этом направлении.
Как любое внешнее устройство монитор не может быть подключен к ПК без специального контроллера, являющегося посредником между ним и центральным процессором (ЦП). Эти контроллеры легко отличить от других плат, поскольку на них расположен специальный разъем для подключения монитора. При описании такого типа контроллеров используют термины "видеоконтроллер", "видеокарта", "видеоплата", реже "видеоадаптер".
Видеокарты воспринимают цифровую информацию, поступающую от ЦП, и вырабатывают сигналы, управляющие работой монитора. Ядром видеокарты является специализированный микропроцессор, выполняющий все необходимые функции. От него зависят такие технические характеристики, как производительность (или быстродействие), предельно допустимый объем памяти, конкретные особенности программирования. Кроме того, на любой видеокарте расположена оперативная память (RAM), предназначенная для хранения цифрового образа, выводимого на экран изображения. Наконец, на видеокарте находится постоянная память (ком), содержащая фрагмент базовой системы ввода-вывода (BIOS).
Конструктивное исполнение видеокарт соответствует определенным техническим стандартам. Каждая из них способна взаимодействовать только с конкретным типом системной шины. Внешним признаком этого является форма разъема (гнезда) материнской платы, в которое устанавливается видеокарта. Системная шина расположена на материнской плате и представляет собой совокупность проводящих линий, по которым передаются данные, адреса и управляющие сигналы. От нее зависит такая важная характеристика, как скорость передачи данных, а следовательно, и время, затрачиваемое на построение изображения на экране.
На материнских платах компьютеров, собранных на базе процессоров Intel 80286 и Intel 80386 применялась шина ISA (industry standard Architecture), при использовании которой обмен данными между видеокартой и процессором производится словами или байтами. Для процессора Intel 486 была разработана новая системная шина VLB (VESA Local BUS), но ее очень скоро вытеснила шина PCI (Peripheral Component Interconnect). Обе шины позволяли передавать данные двойными словами. Большинство имеющихся в продаже современных видеокарт выполнено в стандарте PCI. С выпуском процессоров Pentium ll на системной плате появилась специальная 128-разрядная шина для обмена данными с видеокартой. Она заканчивается гнездом AGP (Accelerated Graphics Port). В Настоящее Время видеокарты, выполненные в стандарте AGP, преобладают на компьютерном рынке.
Для каждого типа шин выпускались и продолжают выпускаться не только видеокарты, но и платы различного назначения. Поэтому на материнских платах обычно имеются разъемы для установки карт, выполненных в стандартах ISA и PCI. Например, одна из современных материнских плат фирмы Intel (ее тип AL 440 LX) содержит 2 разъема ISA, 4 разъема PCI и 1 разъем AGP. Вполне возможно, что на современном ПК с процессором Pentium вы обнаружите видеокарту, выполненную в стандарте PCI и даже в устаревшем стандарте ISA.
Описанные различия видеокарт учитываются при их программировании лишь в особых случаях, когда требуется максимальная производительность видеосистемы. Большинство прикладных задач в этом не нуждается. Поэтому для нас более важно знать тип монитора, для обслуживания которого предназначена видеокарта, поскольку от этого зависят основные особенности ее программирования и структура графических задач.
Стандарты IBM
Свой первый персональный компьютер американская фирма IBM (International Business Machines) выпустила в 1981 году. В то время основным производителем персональных компьютеров была другая американская фирма DEC (Digital Equipment Corporation). IBM не входила даже в тройку лидеров, но за короткий отрезок времени она стала "законодателем мод" в сфере производства ПК. Этому, в немалой степени, способствовало то, что IBM публиковала подробную информацию о своих новых разработках, и ее могли использовать другие фирмы, занимающиеся производством компьютеров, совместимых с IBM PC, дополнительных плат различного назначения и разработкой программного обеспечения.
Впервые за всю историю существования IBM применила в своем изделии компоненты,
изготовленные другими фирмами. В частности, в IBM PC использовался микропроцессор
Intel 8086. С тех пор все семейство IBM PC базируется на микропроцессорах
фирмы Intel. Кроме них могут применяться совместимые микропроцессоры фирм
AMD и Cyrix.
Первая модель ПК выпускалась недолго, на смену ей пришел компьютер второго
поколения PC хт, аббревиатура хт расшифровывается как extended Technology
(расширенная технология). В нем по-прежнему использовался микропроцессор
Intel 8086, но пространство оперативной памяти было увеличено до 640 Кбайт.
Кроме того, были разработаны новые видеокарты, предназначенные для работы
с монитором CGA и позволявшие отобразить 8 цветов. Объем видеопамяти у
них достигал 4 Кбайт, а разрешающая способность составляла 320x200 точек.
Следующая модель компьютера была создана на базе микропроцессора Intel 80286, она называлась PC AT, аббревиатура AT расшифровывается как Advanced Technology (прогрессивная технология). При разработке PC AT в качестве стандарта был принят монитор EGA. На видеокартах появился новый разъем для подключения монитора. Количество разных цветов точки возросло до 16-ти, а объем видеопамяти до 64 Кбайт. Такой объем видеопамяти и разрешающая способность монитора позволяли создавать на экране изображение размером 640x350 точек.
К этому времени производство видеокарт и мониторов освоили разные фирмы,
и их продукция существенно различалась по техническим характеристикам.
Выпускались карты, которые позволяли использовать 64 цвета и имели объем
видеопамяти больше, чем 64 Кбайт. Однако для использования таких карт
требовалось описание способов их программирования, которое в большинстве
случаев недоступно для программистов.
Для стандартов CGA и EGA характерна сложная организация видеопамяти. Простая
запись кода точки в видеопамять или чтение кода из нее невозможны, для
этого требуется около десятка команд и приходится работать с портами видеокарты.
Стандарт на монитор VGA был опубликован при выпуске новой серии IBM PS (персональные системы) на базе процессора Intel 80386. Эта серия компьютеров не получила широкого распространения. Стандарт был принят, но в стремлении вырваться вперед IBM выпустила недоработанный продукт, чем и не замедлили воспользоваться конкуренты.
Стандарт VGA предусматривал новый трехрядный 15-контактный разъем для подключения монитора. Пожалуй, это наиболее продуманная часть стандарта. В разъеме были оставлены свободные (зарезервированные) контакты для будущих расширений. Поэтому его форма не изменилась до настоящего времени. При подключении современных SVGA-мониторов используются некоторые из ранее зарезервированных контактов разъема. Следует отметить, что такой стандарт разъема распространяется только на видеокарты, предназначенные для семейства IBM PC.
Стандарт VGA был шагом вперед по количеству цветов, которое возросло с 16 до 256. Объем видеопамяти увеличился до 256 Кбайт, и упростилась ее организация. В отличие от стандартов CGA и EGA, запись и чтение кода точки теперь производились одной командой, как при работе с обычной (оперативной) памятью компьютера. Однако стандарт VGA имел следующий существенный недостаток. Видеопамять, как и обычная память, делится на сегменты размером по 64 Кбайт. Стандарт VGA не предусматривал механизм переключения сегментов, поэтому на экране можно было отобразить содержимое только одного из них. Соответственно размер максимально возможного изображения составлял 320x200 точек (320x200 = 64 000, что немного меньше, чем 64 Кбайт).
Стандарты IBM и BIOS
Для программирования конкретной видеокарты надо знать назначение ее внутренних регистров, их размерность (байты, слова и пр.), способ записи или чтения данных и расположение величин в разрядах регистров. Первый стандарт IBM регламентировал назначение, состав и способы работы с внутренними регистрами, что исключало несовместимость видеокарт. Но скоро стало очевидно, что это плохой способ решения проблемы совместимости и в стандартах EGA и VGA указанные требования распространялись только на основную часть регистров.
Для решения проблемы совместимости были стандартизированы функции BIOS. IBM выпустила описание базового набора, содержащее перечень основных функций, способ их вызова, назначение и размещение входных и выходных параметров. Так появилась группа функций BIOS с названием "video Services". Образующие ее подпрограммы и данные не входят в основную часть BIOS, они хранятся в специальной микросхеме, расположенной на видеокарте. Поэтому, устанавливая новую видеокарту, вы одновременно устанавливаете новую реализацию функций указанной группы. У современных моделей видеокарт эта группа может занимать полный сегмент памяти, т. е. 64 Кбайт. Это свидетельствует о сложности и разнообразии выполняемых действий и о большом объеме используемых при этом данных.
Именно благодаря наличию функций "video Services" вы можете
быть уверены в том, что после смены видеокарты ваш ПК сохранит свою работоспособность.
Программисты получили существенное упрощение структуры прикладных задач
и их независимость от моделей видеокарт. А разработчики получили возможность
изменять программную реализацию функций BIOS для учета конкретных особенностей
видеокарты.
Перед выводом на экран монитора текста или графических изображений должен
быть установлен соответствующий видеорежим. В частности, при первоначальной
загрузке ПК BIOS устанавливает текстовый режим работы, при котором на
экране можно расположить 25 строк, каждая из которых содержит не более
чем 80 символов. DOS обычно не изменяет этот режим, а прикладные задачи
могут выполняться в текстовых или в графических режимах.
В группу "video services" обязательно входит функция, выполняющая установку видеорежима. При ее вызове указывается код видеорежима, а данные, необходимые для его установки, хранятся в области BIOS. IBM ввела стандартные значения кодов для 20-ти видеорежимов, значения которых изменяются от о до I3h (буква h — признак шестнадцатеричного числа). Разработчики видеокарт могут вводить новые режимы по своему усмотрению, чем они обычно и пользуются.
Стандарты были не всегда
После неудачи со стандартом VGA IBM прекратила работы по стандартизации видеооборудования. А поскольку никто этим не занимался, то наступил период "разброда и шатаний". Каждая фирма проектировала платы по своему усмотрению, не заботясь о каком-либо общем стандарте, кроме собственного. В результате было выпущено много хороших, но не совместимых друг с другом видеокарт, поддерживающих видеорежимы с более высоким, по сравнению с VGA, геометрическим и цветовым разрешением. Коды и характеристики режимов существенно различались и программы, рассчитанные на работу с одной видеокартой, не могли работать с другими или, в лучшем случае, требовали дополнительной настройки. Разумеется, что программисты нашли выход и в системных библиотеках появились модули для определения типа установленной на компьютере видеокарты и настройки программы на ее параметры, но это были полумеры, требовалось радикальное решение.
При этом следует отметить, что отсутствие стандартов имело и свою положительную сторону. Именно в это время разработчиками видеооборудования был накоплен практический опыт использования различных видеорежимов. Трудно себе представить специалистов, которые могли бы предусмотреть все возможные случаи, не опираясь на существующий опыт. Намного проще обобщить достигнутые результаты, оставить главное и отбросить ненужное.
Необходимость стандартизации понимали не только программисты, но и производители видеооборудования. Благодаря объединению их усилий и была создана специализированная ассоциация VESA, которая до настоящего времени занимается вопросами стандартизации видеооборудования (не только для IBM PC). Все ведущие производители придерживаются этих стандартов и проблема несовместимости мониторов или видеокарт в наше время не столь актуальна, но технический прогресс вынуждает, время от времени, вновь возвращаться к проблеме стандартизации, уже на более высоком уровне работы с графикой.
Подведем итог сказанному в данном разделе. В современных видеокартах используется различная элементная база, поэтому они могут существенно различаться по своим техническим характеристикам. Но при использовании функций BIOS все они без исключения совместимы на программном уровне видеорежимами VGA IBM и VESA. Сказанное распространяется не только а обычные видеокарты, но и на акселераторы.
В истории вычислительной техники развитие программных и аппаратных средств тесно переплетено друг с другом. Новые технические возможности поззволяют программистам сделать очередной шаг вперед и при этом у них просто появляются новые требования к аппаратуре. Основное влияние на расширение функций видеокарт оказало стремление получить на экране монитора объемное движущееся изображение, построенное с учетом перспективы и распределения света и тени. Пионерами этого направления были разработчики компьютерных игр.
Как известно, на холсте или листе бумаги можно нарисовать только плоское изображение, а для придания ему эффекта объемности применяются специальные приемы рисования. То, что мы видим в ре-зультате, является оптической иллюзией (обманом зрения), основанной на нашем жизненном опыте восприятия окружающего мира.
Для получения изображения куба его грани надо расположить под определенными углами. У шара граней нет, поэтому для придания кругу эффекта объемности используется распределение света и тени, создаваемое с помощью штриховки или раскрашивания. Для получения эффекта расположения в пространстве нескольких объектов их размеры уменьшаются по мере удаления от точки наблюдения.
Перечисленные приемы основаны не только на нашем субъективном восприятии окружающего мира, но и на вполне объективных законах оптики, Существует возможность формального описания способов преобразования трехмерных объектов в двухмерные и программной реализации алгоритмов вычислений. Такие алгоритмы не учитывают субъективный фактор, но это второстепенный вопрос.
В отличие от листа бумаги экран монитора является плоской дискретной поверхностью, поэтому компьютерная графика имеет дело с дискретными объектами. Для их аналитического описания нужны специальные методы аппроксимации. При описании плоских (двухмерных) объектов обычно Применяются методы линейной и векторной графики, а при описании трехмерных объектов — полигональной графики (слово polygon переводится как многоугольник). Чаще всего в качестве многоугольников используются треугольники.
В разработку методов трехмерной графики основной вклад внесла Reality b 3D, подразделение ныне не существующей компании Rendermorphis.
Результаты ее работы легли в основу графической библиотеки Direct3D, продукт фирмы Microsoft. Они же были использованы при создании языка VRML, предназначенного для описания трехмерных сценариев. Его создала Cosmo Software, а адаптировала российская фирма ParaGraph.
Процесс построения трехмерного изображения можно разделить на два этапа:
геометрические вычисления; визуализация полученных результатов.Геометрические вычисления сводятся к манипуляциям с векторами и матрицами, в результате которых получается совокупность треугольников, аппроксимирующая поверхность трехмерного объекта. Эти вычисления полностью зависят от конкретных свойств графических объектов, поэтому их выполняет центральный процессор ПК.
Процесс визуализации (rendering) заключается в том, что полученные треугольники отображаются на дискретную плоскость (поверхность экрана). При этом некоторые из них могут превратиться в линии или точки, а часть окажется на невидимой стороне объекта. Треугольники раскрашиваются по заданным образцам (их называют текстурами), а для получения эффекта объемности учитывается распределение уровней освещенности. Кроме того, могут понадобиться вычисления, связанные с изменением размеров всего изображения или отдельных его частей, коррекцией перспективы, созданием эффекта тумана и др.
Все эти действия не столь сложны, как геометрические построения, но их количество огромно, оно во много раз больше, чем количество точек на экране монитора или в рисунке, если он занимает не весь экран. Выполнение визуализации процессором ПК существенно замедляет работу с графикой.
Одним из распространенных приемов ускорения является перенос несложных, но многократно повторяемых вычислений на аппаратный уровень. Для этого создаются специальные процессоры, выполняющие нужные вычисления по микропрограммам, работающим намного быстрее программ аналогичного назначения.
Модели акселераторов
Акселератор (accelerator, ускоритель) является специализированным вычислительным устройством, предназначенным для ускорения процесса построения или преобразования графических изображений. В отличие от обычных видеокарт акселератор получает от процессора не завершенный образ изображения, а более общую и сжатую информацию, на основании которой он, а не процессор, вычисляет точечный образ рисунка и записывает его в видеопамять.
Первые модели акселераторов выпускались в виде отдельных плат, которые
обрабатывали данные, поступающие от процессора, и передавали их обычной
видеокарте. Но очень скоро вычислительный микропроцессор начали
располагать на плате видеокарты, а затем его и видеоконтроллер объединили
в одну большую микросхему (чип). Акселераторы могут предназначаться для
ускорения работы с двухмерными или трехмерными графическими объектами.
В названии первых присутствует обозначение 2D, а в названии вторых — 3D,
где D является первой буквой слова direction — направление.
Акселераторы могут быть рассчитаны на установку в гнездо шины PCI или в специализированный разъем AGP, который появился на материнских платах ПК после выпуска микропроцессора Pentium II. Разъем AGP имеет 128-разрядную шину данных, что существенно ускоряет процесс обмена между центральным процессором и видеокартой.
При вычислениях используется видеопамять, расположенная на плате акселератора, поэтому ее объем всегда больше того, который нужен для работы видеокарты в обычном режиме. В настоящее время в продаже имеются акселераторы AGP с объемом видеопамяти 32 и 64 Мбайт.
Современные модели акселераторов чаще всего собираются на базе специализированного графического процессора, выполненного в виде большой интегральной микросхемы (чипа), которые выпускают более десятка различных фирм. Корпорация Intel выпустила свой чип i740, но пока он не получил широкого распространения. По данным агентства Mercury Research на сентябрь 1998 года, в первую пятерку производителей графических чипов входят: ATI, S3, Cirrus Logis, Silicon Integrated System (SIS) и Trident Microsystems. Кроме основных чипов эти фирмы выпускают комплекты сопутствующих микросхем и полностью завершенную продукцию, т. е. видеокарты и акселераторы. Возглавляющая список ATI Technologies производит 27% всех графических чипов. Поэтому вероятность приобрести акселератор, собранный из ее комплектующих, весьма велика.
Акселераторы существенно различаются по цене, но возможности дешевых моделей ограничены. Обычно у них разрешающая способность не превышает 800x600 точек, а из полноцветных видеорежимов поддерживается только Hi-coior. Однако при использовании акселератора в качестве обычной видеокарты эти ограничения отсутствуют.
Функции акселераторов
Набор выполняемых функций зависит от конкретного назначения акселератора. По личному опыту вы знаете, что при рисовании и черчении приходится иметь дело с различными объектами и с разными способами их изображения. Соответственно, функции акселераторов, предназначенных для ускорения геометрических построений и для работы с художественными изображениями, различаются весьма существенно. Некую комбинацию из этих функций могут поддерживать акселераторы, предназначенные для систем автоматизации проектирования. Специфический набор функций поддерживают акселераторы, используемые для игровых приложений. В этих случаях основными требованиями являются быстрота смены картинки и возможность создания различных спецэффектов, а точность построения самого изображения не столь существенна.
На сегодняшний день невозможно выделить некий стандартный набор функций, выполняемых акселераторами. У разработчиков отсутствует достаточный практический опыт, поэтому они просто воплощают функции, поддерживаемые графическими библиотеками Direct3D и OpenGL. К ним относятся раскрашивание треугольников по заданным образцам (наложение текстур), альфа смешение (см. раздел 7.6), создание эффекта тумана (см. раздел 7.6), вычисление распределения света и тени по методу Гуро (Gouraud Shading), коррекция перспективы и некоторые другие.
Кроме того, у акселераторов появилась функция иного назначения. Это преобразование телевизионного изображения в компьютерное и обратно. В таких случаях на видеокарте имеется разъем для подключения телевизора или видеомагнитофона. В качестве примера можно привести изделия фирм ATI и S3. Подчеркнем, что речь идет не о приеме телевизионных сигналов — для этого существуют специальные платы, а об аппаратном преобразовании сигналов из телевизионного стандарта (NTSC, PAL и т) в последовательность кодов точек, записываемых в видеопамять. Такое преобразование является двухсторонним, т. е. коды хранящихся в видеопамяти точек могут преобразовываться в один из телевизионных стандартов. Такие функции расширяют возможности компьютерной обработки телевизионных изображений и делают ее более доступной для пользователей.
Программирование акселераторов
После включения ПК и загрузки операционной системы, неважно какой, акселератор работает как обычная видеокарта. Такой режим необходим для нормальной работы операционных систем и многих прикладных задач. Примером могут служить Windows и ее многочисленные приложения. Программирование акселератора как обычной видеокарты ничем не отличается от того, что описано в данной книге.
Основные (вычислительные) функции акселераторов выполняются в 32-разрядном (защищенном) режиме работы ПК. Речь идет о разрядности адресов, данные могут содержать меньшее или большее количество разрядов. Выполнение прикладных задач в защищенном режиме поддерживают, например, Windows 9X/2000/NT и OS/2. DOS является операционной системой реального (16-разрядного) режима, но существуют так называемые расширители (DOS extenders), которые подключаются к прикладной задаче и создают на время ее выполнения вычислительную среду, необходимую для работы в защищенном режиме. Наиболее известными из них являются DOS4GW, DOS32A, PMODE/W.
При выборе операционной системы приходится учитывать тот факт, что в настоящее время не существует стандарта на программирование функций акселераторов, хотя ассоциация VESA предпринимает активные усилия по его разработке. Первый документ VBE/AF Standard 1.0 был выпущен в августе 1996 года. В настоящее время опубликована третья редакция этого документа, но в ее первых строках подчеркивается, что она содержит черновые предложения и не более того.
Отсутствие стандартов означает, что непосредственно взаимодействующая с акселератором задача не будет переносимой. Она будет выполняться только на тех ПК, на которых установлена соответствующая модель акселератора. Существует довольно много компьютерных игр, созданных для определенных моделей акселераторов, в остальных случаях они либо вообще не работают, либо работают медленно, если вычисления выполняет процессор.
Проблема переносимости частично решается с помощью драйверов, которые продаются вместе с акселератором. Они составлены для определенной операционной системы и рассчитаны на взаимодействие с одной из распространенных графических библиотек.
Среда Windows позволяет создавать любые графические приложения. Разработчикам доступны графические библиотеки Direct3D и OpenGL, которые хорошо документированы и общедоступны. Если установлен соответствующий драйвер, то они используют возможности акселератора, в противном случае требуемые действия выполняются программно, что замедляет процесс выполнения задач, но решает проблему их переносимости.
Пакет Direct3D разработан Microsoft и является одной из частей библиотеки DirectX, входящей в состав Windows 9X, начиная с версии 98, Windows NT и 2000. Он предназначен для ускорения выполнения игровых задач в среде Windows. Первая версия пакета была выпущена в 1996 году.
Библиотека OpenGL была создана в 1993 году фирмой Silicon Graphics для компьютеров совершенно другого класса и для иной операционной системы. В 1995 году совместно с Microsoft она адаптировала ее для IBM PC. С этой библиотекой работает, например, последняя версия компилятора Фортрана для Windows.
В отличие от Direct3D, OpenGL более гибкая и многофункциональная библиотека. Изначально она создавалась для применения трехмерной графики в системах автоматизированного проектирования. Однако она не содержит средств, позволяющих работать непосредственно с видеопамятью в обход интерфейса графических устройств (GDI), который существенно замедляет выполнение прикладных задач. Для этого нужна дополнительная библиотека WinG или DirectDraw, которая является частью библиотеки DirectX.
Еще совсем недавно мысль о том, что можно создать хорошее трехмерное графическое приложение под Windows казалась совершенно нелепой любому программисту, имеющему дело с этой системой. С появлением библиотеки DirectX ситуация изменилась в лучшую сторону. Но, тем не менее, среда Windows остается весьма инерционной, и разработчики компьютерных игр продолжают и, вероятно, еще долго будут продолжать использовать для ускорения процесса игры расширитель DOS4GW и ему подобные.
Video Electronics Standards Association (ассоциация стандартизации видеоэлектроники),
сокращенно VESA, была основана в 1989 году. В августе того же года она
опубликовала свой первый стандарт для 16-цветного видеорежима SVGA с разрешением
800x600 точек. С тех пор ассоциация выпустила множество различных стандартов,
охватывающих широкий спектр видеооборудования. Одной из ее известных разработок
является стандарт на системную шину VLB (VESA Local BUS) для микропроцессора
Intel 486. Однако, как уже говорилось, эта шина не прижилась.
Если у вас есть доступ к сети Internet, то подробные сведения об ассоциации
VESA и ее продукции можно найти на серверах www.vesa.org
и ftp.vesa.org.
Нас будут интересовать стандарты VESA, регламентирующие способы программирования видеокарт. Первый завершенный стандарт появился в октябре 1991 года, он определял полный набор видеорежимов SVGA и дополнительных функций BIOS И Назывался VESA BIOS Extension (VBE) version 1.2.
Это функции той части BIOS, которая расположена на видеокартах и обслуживает видеосервис. Стандарт объединил предыдущие версии VBE 1.0 и VBE 1.1. Ему соответствуют практически все видеокарты, изготовленные начиная с 1992 года. Более современные видеокарты поддерживают версию VBE 2.0, которая совместима (сверху вниз) с версией VBE 1.2. Поэтому учет рекомендаций VESA при программировании работы с графикой позволяет создавать переносимые задачи, которые будут правильно работать независимо от модели видеокарты, установленной на конкретном компьютере.
Понятие "видеорежим" является обобщенной характеристикой текущего состояния видеоконтроллера. Основная функция видеоконтроллера состоит в отображении содержимого видеопамяти на экране монитора. Выполнение этой функции зависит от множества величин, хранящихся во внутренних регистрах видеоконтроллера. Значения этих величин определяются при установке видеорежима. Нас интересуют те из них, которые не только влияют на работу видеокарты, но и должны учитываться в прикладных задачах.
Прежде всего, видеорежимы делятся на текстовые и графические. В зависимости от типа режима прикладная задача записывает в видеопамять или коды символов в стандарте ASCII, или коды отдельных точек графического объекта. При работе в графических режимах видеоконтроллер просто выводит на экран точки, коды которых хранятся в видеопамяти. При работе в текстовых режимах он, по кодам символов, выбирает их изображения из специальных таблиц, а затем выводит точки изображений на экран.
Другой важной характеристикой является разрешающая способность. В зависимости от типа видеорежима она измеряется количеством символов или точек, которое можно разместить по горизонтали и вертикали в пределах рабочей области экрана. Количество точек является основной, а количество символов — производной единицей, т. к. оно зависит от первой величины и от размеров ячейки (знакоместа), отведенной для размещения одного символа.
Точки, расположенные по горизонтали, образуют строку, а по вертикали — столбец (в документации на BIOS используются термины row (ряд) и column (столбец). Количество точек в строке и в столбце не может быть произвольным, оно всегда кратно восьми. Максимально возможное количество точек в строке зависит от разрешающей способности монитора и его геометрических размеров. У современных мониторов минимальное расстояние между центрами смежных точек составляет от 0,28 до 0,26 мм. При размере экрана 14 дюймов по диагонали количество точек в строке не превышает 1024. У 15-дюймовых мониторов оно достигает значения 1280. Однако возможность работы в режимах с высоком разрешением зависит еще и от видеокарты, о чем будет сказано ниже.
Расстояние между соседними точками, расположенными по горизонтали и
вертикали, подбирается одинаковым, для того чтобы изображение квадрата
на экране выглядело как квадрат, а не как прямоугольник. Обычно количество
точек по горизонтали больше, чем по вертикали, но существуют мониторы
и с вертикальной ориентацией страницы.
Рабочая область никогда не заполняет всю видимую часть экрана. Во всех
видеорежимах ее окружает пространство, которое в документации называется
overscan или border (граница, кайма). Поэтому в разных режимах геометрические
размеры рабочей области могут не совпадать.
Важной характеристикой видеорежимов является количество цветов, которое можно одновременно отобразить на экране. Во всех графических режимах цвет получается в результате совмещения в одной точке экрана трех базовых цветов (красного, зеленого и синего) разной интенсивности. В зависимости от видеорежима коды базовых цветов располагаются либо в специальных регистрах видеокарты, либо в видеопамяти, т. е. непосредственно в коде точки. Первую категорию режимов принято называть packed pixel graphics (упакованная точечная графика), а вторую- direct color (непосредственный цвет). Вторая категория, в свою очередь, делится на режимы Hi-Color и True Color. В любом случае от видеорежима зависят размер кода точки и размеры кодов базовых цветов.
Видеорежимы VESA
Разработчикам стандарта VESA предстояло, в первую очередь, ограничить разнообразие применявшихся на практике видеорежимов, связав с каждым из них конкретный код и набор характеристик. В двух первых версиях стандарта было описано 8 графических режимов packed pixel graphics и 5 текстовых режимов высокого разрешения. Графические видеорежимы direct color были введены в третьей версии стандарта. Коды режимов VESA и их характеристики перечислены в табл. 1.1.
Таблица 1. 1. Видеорежимы VESA
Код режима |
Количество точек в строке |
Количество строк по вертикали |
Размер точки в битах |
Размер строки в байтах |
Количество цветов |
VESA
редакции 1.0 и 1.1 |
|||||
100h |
640 |
400 |
8 |
640 |
256 |
101h |
640 |
480 |
8 |
640 |
256 |
102h |
800 |
600 |
4 |
100 |
16 |
103h |
800 |
600 |
8 |
800 |
256 |
104h |
1024 |
768 |
4 |
128 |
16 |
105h |
1024 |
768 |
8 |
1024 |
256 |
106h |
1280 |
1024 |
4 |
160 |
16 |
107h |
1280 |
1024 |
8 |
1280 |
256 |
108h |
80 |
60 |
— |
160 |
16 |
109h |
132 |
25 |
- |
264 |
16 |
10Ah |
132 |
43 |
- |
264 |
16 |
10Bh |
132 |
50 |
— |
264 |
16 |
10Ch |
132 |
60 |
- |
264 |
16 |
VESA
peдакции 1.2 |
|||||
10Dh |
320 |
200 |
15 |
640 |
32К |
1QEh |
320 |
200 |
16 |
640 |
64К |
10Fh |
320 |
200 |
32/24 |
1280/960 |
16М |
110h |
640 |
480 |
15 |
1280 |
32К |
111h |
640 |
480 |
16 |
1280 |
64К |
11 2h |
640 |
480 |
32/24 |
2560/1920 |
16М |
113h |
800 |
600 |
15 |
1600 |
32К |
114h |
800 |
600 |
16 |
1600 |
64К |
115h |
800 |
600 |
32/24 |
3200/2400 |
16М |
116h |
1024 |
768 |
15 |
2048 |
32К |
117h |
1024 |
768 |
16 |
2048 |
64К |
118h |
1024 |
768 |
32/24 |
4096/3072 |
16М |
119h |
1280 |
1024 |
15 |
2560 |
32К |
11Ah |
1280 |
1024 |
16 |
2560 |
64К |
11Bh |
1280 |
1024 |
32/24 |
5120/3840 |
16М |
В первом столбце табл. 1.1 перечислены коды видеорежимов. Это шестнад-цатеричные
числа, поэтому в их записи могут встречаться не только цифры, но и латинские
буквы от А до F, а в конце кода обязательно указывается латинская буква
n (lOOh = 256). В остальных столбцах таблицы приведены десятичные числа.
В последнем столбце, для сокращения записи количества цветов, использованы
буквы к и м. Они обозначают степени числа два, наиболее близкие по значению
к тысяче (к=1024) и миллиону (м=Ю4857б). Соответственно, количество цветов
может быть следующим:
32К = 32768, 64К = 65536, 16М = 16777216.
В графических режимах размер строки указан в точках, а в текстовых —
в виде количества символов. В текстовых режимах ширина символов постоянна
и составляет 8 точек, а высота — 8 или 16 точек.
Классификация режимов. Перечисленные в табл. 1.1 видеорежимы делятся на
следующие пять групп:
Этим группам соответствуют 4 разные модели видеопамяти, поскольку разновидности
режимов direct color используют одну модель. В описании стандарта понятие
"модель видеопамяти" четко не объясняется, но речь идет
о том, как видеоконтроллер интерпретирует содержимое байтов видеопамяти.
Для программиста важно знать не модель, а способ доступа к видеопамяти
и что при этом записывается в ее байты.
Три из четырех моделей допускают непосредственную работу с видеопамятью, т. е. запись и чтение содержимого ее байтов и слов с помощью обычных команд ассемблера. Исключением являются режимы EGA, в этом случае для чтения или записи необходима работа с внутренними регистрами видеокарты. Эти режимы морально устарели, кроме того, они хорошо описаны в литературе, поэтому в данной книге не рассматриваются.
Текстовые режимы VESA просто расширяют возможности аналогичных режимов IBM и позволяют использовать стандартные процедуры BIOS, предназначенные для работы с текстом. Программирование в текстовых режимах описано в первой части главы 5.
Режимы packed pixel graphics отличаются от режима VGA IBM тем, что введено сегментирование видеопамяти, все пространство которой делится на окна размером по 64 Кбайт. Своевременное переключение окон позволяет работать с большим пространством видеопамяти, которое требуется для поддержки видеорежимов с высоким разрешением. Напомним, что в режиме VGA IBM разрешение составляет 320x200 точек (сравните с табл. 1.1).
В режимах packed pixel graphics между кодами точки и цвета нет однозначного соответствия, поскольку они расположены в разных устройствах видеокарты. Коды точек хранятся в видеопамяти, а коды их цветов — в специальных регистрах видеокарты. Изменяя содержимое этих регистров, можно изменить все цвета, использованные в изображении, без обращения к видеопамяти, т. е. не изменяя кодов точек образа рисунка. Количество регистров (256) определяет размер кодов точек — 1 байт (8 разрядов). В главе 3 описано программирование рисования и построения графических объектов в этих режимах, а в главе 4 — работа с цветом.
В режимах direct color базовые цвета расположены непосредственно в коде точки, который может содержать 2, 3 или 4 байта. На момент написания данной книги трехбайтовый код был обнаружен только у одного семейства акселераторов фирмы ATI. Размещение базовых цветов в коде точки значительно расширяет возможности работы с цветом и позволяет создавать различные спецэффекты, которые широко распространены в современной графике. Программирование в режимах direct color описано в главе 7. В этих режимах увеличивается размер кода точки, а следовательно, и пространство видеопамяти, необходимое для хранения содержимого рабочей области экрана. Например, 1 Мбайт видеопамяти достаточно для работы во всех режимах packed pixel graphics, кроме I07h, с разрешением 1280x1024 точки.
В то время как для поддержки режима H2h с разрешением всего 640x480 точек требуется 2 Мбайт, а для режима 11Bh с разрешением 1280x1024 необходимо 6 Мбайт видеопамяти. Поэтому возможность использования режимов с высоким разрешением зависит не только от монитора, но и от объема видеопамяти.
Выбор конкретного режима зависит от программиста и от особенностей задачи, которую ему предстоит решать. В режимах packed pixel graphics достигается максимальная производительность видеосистемы, но ограничены возможности манипуляций с цветом. В режимах direct color увеличиваются затраты оперативной и видеопамяти и замедляется процесс построения графических объектов, но существенно расширяются возможности работы с цветом. Вариантов много, есть из чего выбирать.
Коды режимов VESA и OEM
Код используется не только при установке видеорежима, но и во многих других случаях. Поэтому, со времен IBM, он хранится в специальном байте оперативной памяти, расположенном в области данных BIOS с абсолютным адресом 0449h. Старший разряд этого байта имеет специальное назначение, поэтому для записи кода видеорежима остается 7 разрядов и он может изменяться от о до 7Fh. Первые 20 значений (от о до 13h) отведены для кодов режимов IBM. Использование остальных значений кодов ничем не регламентировано.
Значения кодов видеорежимов, соответствующих стандарту VESA, изменяются от100 до 11Bh. Такие числа не могут быть записаны в байт и, тем более, в его семь разрядов. Поэтому разработчики видеокарт по своему усмотрению заменяют 9-разрядные коды VESA 7-разрядными кодами OEM. Original Equipment Manufacturer (OEM) в дословном переводе означает "изготовитель оригинального оборудования", в нашем случае — изготовитель видеокарты, которая может собираться из микросхем и деталей других фирм. После установки режимов VESA в байте с адресом 0449h хранятся коды OEM, а в состав BIOS входит специальная таблица их соответствия режимам VESA. Коды OEM уникальны для каждой модели и могут не совпадать даже у видеокарт одного семейства.
По своему усмотрению разработчики видеокарт могут вводить дополнительные режимы, отличающиеся по характеристикам от режимов VESA и IBM. Например, у акселераторов фирм ATI и S3 добавлены режимы с разрешением 320x400, 400x300 и 512x384 точек. Можно предположить, что их удобно использовать при работе с кадрами телевизионных изображений. В соответствии с требованиями VESA коды и характеристики дополнительных режимов должны быть указаны в информационных блоках, хранящихся в области BIOS. Структура этих блоков и способ доступа к ним описаны в следующем разделе данной главы.
Набор режимов, введенный в VBE 1.2, VESA больше никогда не изменяла. В настоящее время выпускаются 20-дюймовые мониторы и видеокарты с объемом памяти 4 Мбайт и более. Это позволяет вводить новые видеорежимы с разрешением 1600x1200 точек. Такие видеорежимы поддерживают, например, видеокарты фирм S3 (VIRGE) и Matrox, в обоих случаях объем видеопамяти составляет 4 Мбайт. При этом код режима packed pixel graphics с разрешением 1600x1200 точек в одном случае I20h, а в другом -- ись. Кроме того, карты Matrox поддерживают режимы Hi-color с указанным разрешением.
Из всего сказанного следует, что работу с новой для вас видеокартой надо начинать с получения исчерпывающей информации о кодах поддерживаемых видеорежимов и их характеристиках. Для этого имеет смысл составить простую программу, которая будет выводить на экран (а лучше в файл) все нужные данные. Способ определения этих данных не сложен, он описан в следующем разделе данной главы.
Авторы стандарта VESA стремились не только облегчить работу программистов, но и не ограничивать разработчиков в выборе способов улучшения характеристик видеокарт. Компромиссным решением было включение в состав BIOS специальных информационных блоков с основными данными о видеокарте. В частности, они содержат список и характеристики всех поддерживаемых видеорежимов. В данном разделе описана структура основных информационных блоков и способ доступа к ним прикладных задач.
На любой видеокарте имеется микросхема пассивной, т. е. доступной только для чтения (ROM), памяти, в которой хранится фрагмент BIOS, содержащий структуры данных и подпрограммы, предназначенные для поддержки работы видеосистемы. В частности, к ним относятся функции, обращение к которым (вызов которых) происходит через прерывание int 10h (Video Services).
В состав группы video Services обязательно входит набор функций для поддержки стандартных режимов IBM. Он необходим, по крайней мере, для нормального выполнения процесса загрузки ПК. Дополнением к нему являются функции VBE, описанные в данном и двух следующих разделах. Перед обращением к BIOS код запрашиваемой функции помещается в регистр ах. Он состоит из кодов группы и функции в группе. Код группы VBE равен 4Fh, он указывается в старшем байте регистра ах. Код функции для версии VBE 1.2 может изменяться от 0 до 8, он указывается в младшем байте регистра ах. Таким образом, содержимое регистра ах при вызове функций VBE 1.2 МОЖет ИЗМенЯТЬСЯ ОТ 4F00h ДО 4F08h.
Функции могут иметь входные и выходные параметры, которые передаются в регистрах общего назначения или в сегментных регистрах. Входные параметры нужны для нормального выполнения конкретной функции, а выходные содержат ее возвращаемый результат. Назначение и размещение параметров в регистрах будет описано для каждой функции. Если запрошенная задачей функция поддерживается BIOS, то в регистр ai возвращается код 4Fh.
Важно Это признак того, что функция могла быть выполнена. При успешном выполнении дополнительно очищается байт ah. В противном случае он содержит код ошибки. Таким образом, код 4Fh в регистре ах является признаком успешного выполнения запроса.
Примеры вызова информационных функций VBE и использования возвращаемых ими данных описаны в главе 2.
Запрос общих данных
Для получения общих данных о видеокарте предназначена функция 4FOOh Get SuperVGA information. Входным параметром является адрес массива размером 256 байтов, при исполнении запроса в него записываются данные о видеокарте. Полный адрес этого массива указывается в регистрах es:di. Форма записи es:di общепринята, она означает, что в регистре es находится сегмент памяти, а в регистре di — расположение (смещение) массива в этом сегменте. При исполнении запроса только первые 20 байтов массива заполняются следующими данными:
00 4 байта — VESASignature; 04 2 байта — VESAVersion; 0б 4 байта — OEMStringptr; 0Ah 4 байта — Capabilities; 0Eh 4 байта — VideoModePtr; 12h 2 байта — TotalMemory.В первом столбце приведенного списка указаны смещения полей относительно начала массива, адрес которого находится в регистрах es:di. Поле VESASignature содержит ASCII-КОДЫ четырех букв, образующих слово "VESA". Вот ЭТИ КОДЫ — 56h, 45h, 53h, 41h.
Поле VESAVersion занимает 2 байта, содержащих номер версии и ее редакцию, например 0102 для VBE 1.2 или 0200 для VBE 2.0.
В поле OEMStringptr находится полный адрес (из области BIOS) начала строки текста, содержащей наименование изготовителя видеокарты. Коды символов соответствуют стандарту ASCII, а строка заканчивается пустым байтом (формат строки ASCIIZ). Полный адрес занимает два слова, в первом из них хранится смещение, а во втором — код сегмента памяти.
Поле Capabilities состоит из 32-х независимых разрядов (битов), в которых указываются специфические особенности видеокарты. Авторы стандарта явно перестарались, даже в новейшей версии VBE 3.0 описано назначение только пяти младших разрядов.
У рядовой видеокарты все 32 разряда поля capabilities очищены. Установка нулевого разряда означает возможность увеличения количества разрядов регистров DAC до 8 (см. описание функции 4F08h). Установка первого разряда означает, что видеоконтроллер не совместим с режимом IBM VGA.
Установка второго разряда означает необходимость синхронизации момента изменения содержимого регистров DAC с обратным ходом луча (см. описание фуНКЦИИ 4F09h).
Третий и четвертый разряды описаны только в VBE 3.0, они устанавливаются в тех случаях, когда видеоконтроллер или внешние устройства поддерживают работу со стереоскопическими сигналами.
В поле videoModePtr находится адрес начала списка видеорежимов, поддерживаемых картой. Первое слово поля содержит смещение, а второе сегмент. Список расположен в области BIOS, код каждого режима занимает одно слово. Признаком конца списка является код OFFFFh.
В поле TotalMemory указан установленный на видеокарте объем памяти, выраженный в блоках размером 64 Кбайт. 1 Мбайт соответствует 16 блокам (10h). На устаревших моделях видеокарт это поле может быть очищено. В каких случаях полезна описанная функция? Например, если графическая задача рассчитана на выполнение в защищенном (32-разрядном) режиме работы микропроцессора, то обязательно надо проверять номер версии VBE. Видеокарта может работать в таком режиме, если на ней реализованы функции VBE 2 . О, НО НС VBE 1. 2.
Анализ состояния разрядов поля capabilities и списка поддерживаемых режимов при выполнении задачи едва ли целесообразен. Поддержка выбранного режима обязательно проверяется в задаче, но делается это более надежным способом, чем просмотр списка, поскольку присутствие режима в списке еще не означает его поддержку. Подробно это обсуждается в главе 2.
Целесообразно составить простую программу, которая сохраняет в файле или распечатывает результаты выполнения запроса 4FOOh, включая список видеорежимов, и учитывать эти результаты при программировании. Запрос характеристик видеорежимов. В начале выполнения любой графической задачи обязательно вызывается другая информационная функция, которая возвращает данные, необходимые для настройки на работу с конкретной видеокартой. Здесь описана структура информационного блока, а процессу настройки посвящена специальная глава 2.
Функция 4F01h Get SuperVGA Mode Information позволяет получить информацию о любом из поддерживаемых видеорежимов независимо от того, установлен он или нет. Ее целесообразно вызывать до попытки установить режим, т. к. полученные данные позволяют определить, поддерживает видеокарта работу в нужном режиме или нет, и выполнить ряд подготовительных действий.
Перед вызовом в регистрах es:di указывается адрес массива размером в 256 байтов (как и для функции 4FOOh), а в регистр сх помещается код инте- ресующего вас режима. Если видеокарта содержит VBE, то при возврате в регистре ах записан код 4Fh. Если режим не поддерживается, то признак ошибки не вырабатывается, просто очищаются все поля табл. 1.2.
Результатом исполнения запроса является структура данных, приведенная в табл. 1.2. В первом столбце таблицы указаны смещения полей от начала массива, адрес которого находится в регистрах es:di. Второй столбец содержит размеры полей в байтах. Для примера в трех последних столбцах показаны значения величин, формируемых видеокартой VIRGE /DX /GS семейства S3 при запросе характеристик режимов 10lh (640x480, 256 цветов), 11оh (640x480, 32К) и H2h (640x480, 16М цветов). В шести случаях последние столбцы слиты в один это означает, что данные в соответствующих полях зависят не от режима, а от характеристик видеокарты.
Таблица 1.2. Информация, возвращаемая по запросу 4F0ih
Адрес поля |
Размер поля |
Что хранится в поле |
Режим 101h |
Режим 110h |
Режим 112h |
00 |
2 |
Атрибуты режима |
009ВН |
OOQBh |
009Bh |
02 |
1 |
Атрибуты окна А |
07 |
||
03 |
1 |
Атрибуты окна в |
00 |
||
04 |
2 |
Размер ячейки окна в Кбайт |
0040И |
||
06 |
2 |
Размер окна в Кбайт |
0040h |
||
08 |
2 |
Код видеосегмента окна А |
AOOOh |
AOOOh |
AOOOh |
OAh |
2 |
Код видеосегмента окна в |
AOOOh |
AOOOh |
AOOOh |
OCh |
4 |
Адрес подпрограммы BIOS |
556Ch COOOh |
||
10h |
2 |
Размер строки в байтах |
0280h |
OSOOh |
OAOOh |
12h |
2 |
Размер строки в точках |
0280h |
0280h |
0280h |
14h |
2 |
Количество строк на экране |
01EOh |
01EOh |
01EOh |
16h |
1 |
Ширина символа (текст)- |
08 |
08 |
08 |
17h |
1 |
Высота символа (текст) |
10h |
10h |
10h |
18h |
1 |
Количество планов памяти |
01 |
01 |
01 |
19h |
1 |
Количество бит на точку |
08 |
OFh |
20h |
1Ah |
1 |
Количество банков видеопамяти |
01 |
01 |
01 |
1Bh |
1 |
Модель видеопамяти |
04 |
06 |
06 |
1Ch | 1 | Размер банка в Кбайт | 00 | 00 | 00 |
Адрес поля |
Размер поля |
Что хранится в поле |
Режим 101h |
Режим 110h |
Режим 112h |
1Dh |
1 |
Номер последнем страницы |
0Bh |
05 |
02 |
1ЕЬ |
1 |
Резервный байт |
01 |
01 |
01 |
IFh |
1 |
Размер маски красного цвета |
00 |
05 |
08 |
20h |
1 |
Позиция маски красного цвета |
00 |
0Ah |
10h |
21h |
1 |
Размер маски зеленого цвета |
00 |
05 |
08 |
22h |
1 |
Позиция маски зеленого цвета |
00 |
05 |
08 |
23h |
1 |
Размер маски синего цвета |
00 |
05 |
08 |
24h |
1 |
Позиция маски синего цвета |
00 |
00 |
00 |
25h |
1 |
Размер резервного поля |
00 |
01 |
08 |
26h |
1 |
Позиция резервного поля |
00 |
0Fh |
18 |
27h |
1 |
Флаги для режимов direct color |
00 |
00 |
00 |
Следующие
3 поля заполняются при VBE 2.0 и выше |
|||||
28h |
4 |
Адрес начала видеопамяти |
0000 F800 |
||
2Ch |
4 |
Адрес свободного пространства |
00 |
00 |
00 |
30h |
2 |
Размер свободного пространства |
00 |
00 |
00 |
Часть величин, перечисленных в табл. 1.2, уже обсуждалась выше, назначение остальных будет описано по мере изложения материала, в тех случаях, когда они используются при программировании. Здесь мы ограничимся одним замечанием и опишем байт атрибутов режима.
Замечание Начиная с версии VBE 1.2, появились поля, в которых указываются количество банков видеопамяти (lAh) и размер банка в килобайтах (ich). У всех исследованных видеокарт указан один банк, а его размер равен нулю. Непонятно о каких банках идет речь, тем более, если их размер, выраженный в килобайтах, помещается в пределах одного байта. Поэтому эти поля лучше не использовать до выяснения их назначения.
Атрибуты видеорежима
Нулевое слово информационного массива, возвращаемого по запросу 4FOih, содержит характеристики видеорежима, которые называются атрибутами. Каждый разряд этого слова имеет конкретное назначение, кроме первого, который зарезервирован. Стандарты VBE 1.2 и 2.0 описывают только назначение разрядов младшего байта этого слова (его адpec в массиве 0), а старший байт зарезервирован. В табл. 1.3 показано, что обозначает 1 в каждом из разрядов.
Таблица 1.3. Назначение разрядов кода атрибутов режимов
Бит |
Код |
Что обозначает установка разряда |
0 |
1 |
Видеокарта поддерживает режим |
1 |
|
Резервный разряд (состояние безразлично) |
2 |
1 |
BIOS поддерживает вывод на экран |
3 |
1 |
Используется цветной монитор |
4 |
1 |
Режим графический |
5 |
1 |
Режим не совместим с VGA |
6 |
1 |
Невозможна работа с окнами видеопамяти |
7 |
1 |
Доступно все пространство видеопамяти (VBE 2 . 0) |
При программировании для защищенного режима надо проверять состояние бита 7. Если он установлен, то возможна непосредственная работа со всем пространством видеопамяти без переключения окон (см.