Иллюстрированный самоучитель по SVGA

Функции BIOS

Подпрограммы сохранения и восстановления палитры

При выполнении графической задачи может возникнуть необходимость изменить уже установленную палитру, а спустя некоторое время восстановить ее. Чаше всего это делается при полном изменении находящейся на экране картинки, или при переходе к другой странице видеопамяти. В таких случаях перед изменением текущей палитры содержимое всех 256-ти регистров цвета надо сохранить в оперативной памяти. Для сохранения текущей палитры в памяти необходимо выделить пространство (буфер) размером в 3x256 = 768 байтов. Где именно будет расположен этот буфер, не имеет значения, но для возможности его использования в сегменте данных задачи надо выделить два слова и поместить в них смещение (адрес в сегменте) и значение сегмента, содержащего буфер.

Зарезервировать эти два слова можно, например, так:

BuffPal dw 0; для указания смещения буфера от начала сегмента
dw 0; для указания значения сегмента, содержащего буфер

При выполнении задачи в эти слова вместо нулей должны быть записаны конкретные значения сегмента и смещения в нем. Распределение пространства оперативной памяти обычно производится в начале выполнения задачи, как это делается, описано в приложении Б данной книги. Если местонахождение буфера известно при составлении программы, то оно указывается в Приведенных выше директивах вместо нулей.

В Примерах 4.3 и 4.4 приведены подпрограммы для сохранения текущей и восстановления ранее сохраненной палитры. Обе подпрограммы используют описанную выше переменную BuffPal для загрузки сегмента и смешения буфера, выделенного для храпения палитры.

Пример 4.3. Сохранение текущей палитры в буфере.

SavePa 1: pusha сохранение "всех" регистров
push es сохранение содержимого es
les dx, dword pt г Buff Pal; сегмент и смещение буфера
xor bx, bx номер первого регистра цвета
mov ex, 256 количество сохраняемых регистров
mov ax, 1017h код запрашиваемой функции
int lOh обращение к функции B10S
pop es восстановление содержимого es
popa восстановление "всех" регистров
ret возврат из подпрограммы

Пример 4.4. Восстановление исходной палитры из буфера.

RstPal:pusha сохранение регистров
push es сохранение содержимого es
les dx, dword pt r Buff Pal; сегмент и смещение буфера
xor bx, bx номер первого регистра цвета
rnov ex, 256 количество записываемых регистров
mov ax, 1012h код запрашиваемой функции.
int lOh обращение к B10S
pop es восстановление содержимого es
popa восстановление "всех" регистров
ret возврат из подпрограммы

Тексты примеров 4.3 и 4.4 не требуют особых пояснений, напомним только, что команда les копирует содержимое первого слова переменной BuffPal н регистр dx. а второго слова – в регистр es. Тексты примеров различаются только кодом запроса, помещаемым в регистр ах командой mov. При желании, для сохранения или восстановления палитры можно использовать только одну подпрограмму. Из ее текста надо исключить указанную команду mov, а код запроса (ioi2h или Ю17п) задавать в регистре ах перед вызовом подпрограммы.

Что такое "регистры палитры"

В заключение несколько замечаний о назначении регистров палитры. С ними можно работать только в режимах EGA. VGA и в 16-цветных режимах VESA, а в режимах PPG они не доступны. Если вас не интересуют особенности работы в перечисленных режимах, то можно пропустить оставшуюся часть данного раздела.

Появлению стандарта EGA сопутствовала разработка мониторов, которые позволяли выводить на экран 64 цвета. Однако в стандарте EGA код точки 4-разрядный и, соответственно, доступны только 16 регистров цвета. Для более полного использования возможностей EGA-мониторов количество регистров цвета на видеокартах было увеличено до 64-х. Одновременно работать со всеми регистрами было, по-прежнему, невозможно. Поэтому они делились на четыре одинаковые группы и были введены четыре специальных регистра палитры. Хранящееся в них число (от 0 до 3) указывает помер группы из 116-ти регистров цвета, доступной в данный момент времени.

С появлением VGA-мониторов количество регистров цвета на видеокартах увеличилось до 256-ти, и появилась возможность делить их на 4x64 пли 16x16 групп. Размер кода точки в стандарте VGA IBM позволяет использовать любой из 256-ти регистров цвета. Тем не менее, для совместимости с режимом EGA и расширения его возможностей деление на группы сохранилось, а у видеоконтроллера появилось 16 регистров палитры.

При работе в режиме VGA IBM (но не VESA) восьмиразрядный код точки рассматривается как две независимые тетрады XY. Содержимое старшей тетрады х является номером регистра палитры (от о до F), в котором находится номер одной из 16-ти групп регистров цвета (тоже от о до F). Младшая тетрада Y является номером регистра в этой группе. При установке видеорежима в регистры палитры записываются их порядковые номера от 0 до огп, в результате регистры цвета оказываются как бы пронумерованными от 0 до 255, и присутствие регистров палитры просто не заметно. Если же принудительно изменить содержимое регистров палитры, то изменится естественный порядок нумерации регистров цвета.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.