Страничная организация видеопамяти
Одним из традиционных приемов при работе с видеопамятью является ее деление на страницы. Из нескольких страниц только одна отображается на экране монитора, а остальные не видны. Видимую (отображаемую на экране) страницу называют активной, а невидимые – пассивными. Изменение содержимого невидимых страниц никак не отражается на экране монитора. Поэтому можно заранее подготовить и расположить на пассивной странице нужное изображение, а затем "мгновенно" изменить картинку на экране, сделав эту страницу активной.
Возможность деления видеопамяти на страницы основана на том, что при взаимодействии с монитором видеоконтроллер отображает только ту ее часть, которая нужна для заполнения рабочей области экрана. Остальное пространство видеопамяти просто не используется. Размер рабочего пространства видеопамяти зависит от установленного видеорежима и изменяется в достаточно больших пределах (см. Табл. 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 и Truecolor палитра не используется, т. к. цвет каждой точки указан в ее коде.