Окна видеопамяти
При работе в видеорежимах SVGA изображение, находящееся на экране монитора содержит большое количество точек. Оно зависит от разрешающей способности установленного режима и равно произведению количества точек в строке на количество строк.
Например, при разрешении 640x480 на экране находится 307200 точек, а при разрешении 1600x1200-1 920000 точек. Объем видеопамяти, необходимый для хранения содержимого экрана, также зависит от размера кода точки. В режимах PPG код точки занимает 1 байт, поэтому объем видеопамяти совпадает с количеством точек, находящихся на экране, в режимах direct color он в 2 или 4 раза больше. Следовательно, для работы с графическими объектами в режимах SVGA нужен доступ к большому пространству видеопамяти.
Сегментирование памяти
Независимо от конкретного назначения команды IBM PC всегда имеют доступ к ограниченному пространству адресов, предельный размер которого зависит от нескольких факторов, в том числе и от режима работы микропроцессора. Начиная с модели Intel 80386, микропроцессоры могут работать в реальном, виртуальном и защищенном режимах. В реальном и виртуальном режимах все пространство памяти делится на сегменты, предельный размер которых составляет 65 536 байтов.
Указанные в командах адреса операндов всегда относятся к конкретному сегменту, и ни при каких условиях не могут выходить за его пределы, – это вызывает аварийную ситуацию. Значение сегмента хранится в одном из сегментных регистров, который либо явно указывается в имени операнда, либо используется по умолчанию.
Доступ к сегментам
При работе на IBM PC в реальном режиме для доступа к пространству адресов, расположенному за пределами сегмента, используются два разных способа, выбор которых зависит от типа памяти.
Первый способ заключается в том, что в сегментный регистр записывается абсолютный адрес начала нужного сегмента. Специфической особенностью семейства IBM PC является то, что при работе с сегментами общий объем адресуемого пространства не может превышать один мегабайт. Следовательно, возможно использование только 16 сегментов предельного размера (16x65536 = 1048576 = 1 Мбайт). Поэтому прямое указание адреса начала сегмента применяется только при работе с младшей частью оперативной памяти (первые 640 Кбайт). Как это делается, описано в Приложении Б данной книги.
Второй способ заключается в том, что сегмент выполняет роль окна, через которое "видна" (доступна) та или иная часть реального пространства адресов. Содержимое сегментного регистра при этом неизменно, а доступная или "отображаемая" часть адресов изменяется по запросам задачи. Такой способ подразумевает существование специального устройства и программного обеспечения, поддерживающих работу с нужным пространством адресов. На IBM PC он применяется для доступа к видеопамяти и к расширенному пространству оперативной памяти ПК (см. Приложение Б).
Доступ к видеопамяти
Рассмотрим, как организуется работа со всем пространством видеопамяти. Для обращения к нему используется специальный сегмент, который принято называть видеосегментом. При работе в графических режимах он обычно имеет код АОООb, но лучше взять его точное значение из массива info (см. Главу 2). Код видеосегмента является просто признаком обращения к видеокарте, а не к какому-либо другому устройству, и не является частью адреса видеопамяти.
Опознав обращение к себе, видеоконтроллер получает от процессора 16-разрядный адрес и прибавляет его к старшей части, хранящейся в одном из его внутренних регистров. В результате получается полный (абсолютный) адрес ячейки видеопамяти, к которой обращается команда. Ячейкой, как обычно, может быть байт, слово или двойное слово.
Во внутреннем регистре видеоконтроллера хранится число, которое принято называть номером окна (или банка) видеопамяти. У современных видеокарт размер окна фиксирован и составляет 65 536 байтов, поэтому, зная объем видеопамяти, можно вычислить количество существующих окон. Одному мегабайту видеопамяти соответствует 16 окон, двум – 32 и т. д.
При каждой смене видеорежима регистр, содержащий номер окна, очищается, т. е. устанавливается нулевое окно видеопамяти. В дальнейшем текущий номер окна зависит только от действий, выполняемых в задаче, которая может устанавливать его любое допустимое значение. При переключении окон надо изменять содержимое внутреннего регистра видеоконтроллера, поэтому для выполнения таких действий предусмотрена специальная процедура BIOS. к Уже говорилось в Главе 2, ее вызов через прерывание int 10h не существо замедляет переключение окон, и стандарт VBE рекомендует прямое обращение, минуя прерывание int 10h.
В Примере 2.8 приведены тексты трех подпрограмм для установки заданного (setwin), следующего (Nxtwin) и предыдущего (prevwin) окна. Они работают c переменной Cur win, имеющей размер слова и содержащей номер текущего окна. В Примере 2.11 показано, как зарезервировать эту переменную з разделе данных программы. Если задача составлена корректно, то при ее заполнении значение cur_win должно совпадать с номером окна, хранящемся в видеоконтроллере.