Функции 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, и присутствие регистров палитры просто не заметно. Если же принудительно изменить содержимое регистров палитры, то изменится естественный порядок нумерации регистров цвета.