Одним из традиционных приемов при работе с видеопамятью является ее деление на страницы. Из нескольких страниц только одна отображается на экране монитора, а остальные не видны. Видимую (отображаемую на экране) страницу называют активной, а невидимые — пассивными. Изменение содержимого невидимых страниц никак не отражается на экране монитора. Поэтому можно заранее подготовить и расположить на пассивной странице нужное изображение, а затем "мгновенно" изменить картинку на экране, сделав эту страницу активной.
Возможность деления видеопамяти на страницы основана на том, что при
взаимодействии с монитором видеоконтроллер отображает только ту ее часть,
которая нужна для заполнения рабочей области экрана. Остальное пространство
видеопамяти просто не используется. Размер рабочего пространства видеопамяти
зависит от установленного видеорежима и изменяется в достаточно больших
пределах (см. табл. 1.1). Соответственно
изменяется и размер свободного пространства. В одних случаях оно может
быть намного больше рабочей части видеопамяти, а в других его может просто
не быть. Поэтому возможность и целесообразность деления видеопамяти на
Стандарт VESA не распространяется на страничную организацию видеопамяти и, вообще, его авторы предпочитают говорить не о страницах, а о разных изображениях, расположенных в видеопамяти. Поэтому все практические вопросы решаются по усмотрению программиста. Именно он выбирает способ переключения и расположение страниц в видеопамяти.
Как уже говорилось, активной является та страница, содержимое которой в данный момент отображается на экране монитора. Специальный механизм переключения страниц отсутствует, но существует функция VBE с кодом 4F07h (см. раздел), которая позволяет переместить начало рабочей области (Display start) в любую точку видеопамяти. Есть только одно ограничение на ее применение — от выбранной точки до конца видеопамяти должно оставаться пространство, достаточное для размещения рабочей области. Координаты выбранной точки указываются в виде строки и столбца.
Перед вызовом этой функции в регистр dx помещается порядковый номер первой отображаемой строки, а в регистр сх — номер ее первой точки. Напомним, что все номера начинаются с нуля. Кроме этого регистр bx очищается, что является признаком изменения начала отображаемой области, а в регистр ах помещается код функции 4F07h. После чего производится обращение к BIOS. Описанные действия выполняет группа команд примера 2.10.
Пример 2.10. Установка нового начала отображаемой области памяти
хог bx, bx ; признак смены страницы
mov ex, BaseCol ; номер точки в исходной строке
mov dx, BaseRow ; номер исходной строки
mov ax, 4F07h ; код запрашиваемой функции
int 10h ; обращение к BIOS
В примере 2.10 значения координат начала рабочей области выбираются из переменных BaseCol и BaseRow, которые должны быть описаны в сегменте данных программы. Для превращения этого примера в подпрограмму переключения активных страниц к нему надо добавить вычисление значений указанных переменных по номеру страницы. Способ вычисления выбирается по усмотрению программиста, а зависит он от выбранного расположения страниц в видеопамяти.
При работе в режимах packed pixel graphics, использующих регистры палитры, перед переключением страниц может понадобиться сохранение в оперативной памяти текущей палитры и установка новой. Способы работы г палитрой цветов описаны в главе 4. При работе в режимах Hi-color и Truecoior палитра не используется, т. к. цвет каждой точки указан в ее коде.
Изменения в вычислениях адресов
Страничная организация памяти влияет олько на способы определения адресов точек графических объектов. Поэтому желательно выбрать такое расположение страниц, при котором изменение работы с адресами точек будет минимально возможным. Иначе говоря, нас интересует такое расположение страниц в видеопамяти, при котором основные процедуры рисования, построения или преобразования графических объектов почти не изменяются.
Перед построением или изменением графического объекта обычно выбирается некая опорная точка, относительно которой вычисляются адреса всех остатьных точек объекта. Чаще всего это левый верхний угол прямоугольной области экрана, в которой располагается или будет расположен объект. Координаты опорной точки обычно задают в виде номера строки и столбца, на пересечении которых она находится. Но для дальнейшей работы их надо преобразовать в адрес видеопамяти.
Если видеопамять не разделена на страницы, то начало ее рабочего пространства находится на пересечении нулевой строки и нулевого столбца. В таком случае существует простая связь между координатами произвольной точки и ее адресом в видеопамяти. Адрес вычисляется как сумма двух произведений: номера строки на размер строки в байтах и номера столбца на размер кода точки в байтах. Здесь имеется в виду размер строки, отображаемой на экране (scan Line). Способы вычисления адресов описаны в разделе (режимы packed pixel graphics) разделе и (режимы direct color), a соответствующие подпрограммы приведены в примерах 3.4 и 7.3.
При делении видеопамяти на страницы вычисленное адреса точек становятся относительными. Для получения абсолютных значений адресов в этом случае при вычислениях надо учитывать адрес начала страницы или ее координаты (номера нулевой строки и нулевого столбца). Следовательно, при введении страничной организации памяти придется изменить подпрограммы, выполняющие вычисление адресов точек по их координатам. Но это не все.
В процессе работы с графическим объектом приходится вычислять адреса начала его строк. В примерах, приведенных в данной книге, для этой цели использовалась "константа переадресации", значением которой является разность между размером отображаемой на экране строки (scan Line) и шириной графического объекта, выраженной в байтах. Обе величины зависят от установленного задачей видеорежима, способ учета этой зависимости описан в разделе , а варианты соответствующих подпрограмм приведены в примере 7.3. При их составлении предполагалось, что отображаемые на экране строки начинаются с нулевого столбца.
Следовательно, если страницы расположить так, чтобы каждая из них начиналась с начала одной из строк видеопамяти, то значение константы переадресации строк не будет зависеть от номера страницы. При таком расположении страниц изменяются только подпрограммы, вычисляющие адреса точек по их координатам.
Расположение и размеры страниц
Если размер страниц равен размеру отображаемой на экране (рабочей) части видеопамяти, то каждая из них будет начинаться с новой строки. При таких размерах страницы располагаются в видеопамяти подряд друг за другом.
Если предполагается использовать N страниц, то в оперативной памяти надо выделить массив размером 2N слов. При выполнении подготовительных действий и эти слова задача должна поместить номера окон, в которых начинаются страницы и адреса нулевых строк страниц в этих окнах. Эти величины нужны для подпрограммы, выполняющей преобразование значений координат в адреса точек. Учитывая, что реальное количество страниц невелико, такой массив можно хранить в разделе данных задачи.
Оиеним возможное количество страниц. Предположим, что установленный
на видеокарте объем памяти составляет 4 Мбайт и используется видеорежим
с разрешением 640x480 точек. Если это режим packed pixel graphics, то
в видеопамяти помещается 13 страниц, в режиме Hi-color их количество сократится
в 2 раза, а в режиме True Color — в 4 раза. При более высоком геометрическом
разрешении количество страниц сокращается. Поэтому можно считать, что
оно не больше десяти.
Для определения допустимого количества страниц при выполнении задачи надо
прочитать байт массива info со смещением 10h. В нем хранится номер последней
страницы, которую можно установить в конкретном видеорежиме при имеющемся
объеме видеопамяти. Страницы нумеруют начиная с нуля, поэтому их количество
на 1 больше числа, хранящегося в байте 10b.
Кроме указанного массива, в разделе данных задачи надо выделить две переменные, например, Base_win и Base_addr для хранения исходного окна и адреса текущей страницы, с которой работает задача. В исходном состоянии эти переменные очищены, поскольку обычно работа начинается с нулевой страницы. В дальнейшем задача изменяет их значения в зависимости от номера используемой страницы.
Страница в начале окна
Особый интерес представляет случай, когда каждая страница начинается с нового окна видеопамяти. При этом базовые адреса равны нулю, и в оперативной памяти надо хранить только номера окон, с которых начинаются страницы. Кроме того, в этом случае значения абсолютных и относительных адресов отличаются только на номер окна. Поэтому после вычисления относительного адреса его надо просто увеличить на номер окна. Как это делается, показано в примерах 3.4 и 7.3.
Рекомендованные стандартом VESA видеорежимы перечислены в табл. 1.1.
Если исключить из рассмотрения текстовые и 16-цветные, то остается О режимов, которые по геометрической разрешающей способности делятся на 5 групп. В каждую группу входит 4 режима, различающихся по количеству цветов.
При работе с тремя группами видеорежимов начала страниц можно совместить с началом окон видеопамяти. В табл. 2.1 приведены размеры страниц этих групп режимов.
Таблица 2.1. Размеры страниц для трех групп видеорежимов
Разрешающая способность в точках | Количество окон (к = 1, 2, 4) |
Количество строк |
640x480 | 5*k |
512 |
1024x768 | 12*k |
768 |
1280x1024 | 20 *k |
1024 |
Во втором столбце табл. 2.1 буква k указывает количество байтов, которое занимает код точки. Это косвенная характеристика цветовой .палитры. 1 байт — 256 цветов (packed pixel graphics), 2 байта — 32К или 64К цветов (Hi-Color), 4 байта — 16М цветов (True Color).
При разрешении 1024x768 и 1280x1024 точки размер страницы совпадает с размером рабочей области видеопамяти. При разрешении 640x480 точек размер страницы на 32 строки больше размера рабочей области, т. е. по сравнению с последовательным расположением страниц теряется некоторое пространство видеопамяти, но это не имеет принципиального значения.
Из двух групп, не попавших в табл. 2.1, практический интерес представляют
видеорежимы с разрешением 800x600 точек. Целое количество строк, содержащих
800 точек, укладывается в 25 окнах, что почти в три раза превышает размер
рабочей области видеопамяти. В этом случае при совмещении начала страниц
с началом окон будет потеряно большое пространство видеопамяти. Поэтому
при разрешении 800x600 точек страницы лучше располагать в видеопамяти
последовательно друг за другом.
Заключение. Использование страниц видеопамяти расширяет возможности работы
с графикой только при решении определенного класса задач. Например, страницы
видеопамяти применяются всеми текстовыми и графическими редакторами. В
некоторых источниках встречаются указания об использовании переключения
страниц для получения спецэффектов, основанных на быстром изменении картинки
на экране. Однако не надо забывать, что требуется определенное время на
создание нужного изображения на пассивных страницах. Поэтому вопрос о
целесообразности введения страниц видеопамяти и способах работы с ними
надо решать, учитывая особенности конкретной задачи.