Функции BIOS
При работе в режимах PPG перед выводом рисунков на экран, как правило, приходится выполнять те пли иные действия, связанные с обращением к одному или нескольким DAC-регистрам. Способ доступа к ним зависит от технических особенностей конкретной видеокарты, поэтому расположенное на видеокарте расширение BIOS поддерживает набор функций, выполняющих вовсе необходимые манипуляции с DAC-регистрами. Использование в вашей задаче этих функций обеспечивает се независимость от технических особенностей установленной на ПК видеокарты.
Общая характеристика группы функций 10h
В состав прерывания BIOS int 10h входит группа функций с названием set Palette Registers (установка регистров палитры), выполняющих разнообразные действия, связанные с обслуживанием внутренних регистров видеокарты. Набор функций, образующих эту группу, вместе с перечнем входных и выходных параметров был разработан фирмой IBM для стандарта VGA и с тех пор не изменялся. Появление стандарта VESA не добавило ничего нового в способы работы с DAС-peгистрами, поскольку в этом не было необходимости.
В данном разделе рассмотрены только те функции, которые используются при программировании для режимов PPG. Полное описание всех функций вы найдете, в книгах или в Tech Help.
В англоязычной документации на BIOS, DAC-регистры называют еще регистрами цвета (color registers). Такое название вполне соответствует их назначению, и мы будем его использовать в дальнейшем. Кроме них в составе видеооконтроллера существуют регистры палитры (palette registers). Они не нос пользуются при работе в режимах VESA и не имеют никакого отношения и к тем палитрам, о которых идет речь в настоящей книге. Их назначение описано ниже в данной главе.
Для запроса конкретной функции код группы (10h) помещается в регистр ah, а код запрашиваемой функции – в al. Расположение входных и выходных параметров в регистрах зависит от конкретной функции. BIOS не проверяет допустимость значений параметров. О корректности запроса должен заботиться программист. Вызов функций BIOS, как уже было сказано, выполняет прерывание int10h. Обращаем внимание на то, что совпадение кодов группы и вектора прерывания является случайным.
Работа с одним регистром
В группу 10h прерывания int 10h включены два запроса, позволяющие записать или прочитать один регистр цвета.
Запрос 1010h "Set One Color Register записывает нужный код в один из регистров цвета. Перед его вызовом коды базовых цветов помещаются в регистры dh, ch, cl, соответственно красный, зеленый и синий, а номер регистра цвета указывается в bx.
Замечание
Не забывайте, что при работе с регистрами цвета используется только 6 младших разрядов каждого байта. Содержимое двух старших разрядов регистров dh, ch и cl B10S просто игнорирует.
Запрос 1015h "Read One Color Register выполняет строение содержимого регистра цвета. Перед вызовом в регистре bx указывается его номер, а содержимое после выполнения запроса находится в регистрах dh, ch, cl, соответственно красный, зеленый и синий. B10S возвращает шестиразрядные коды базовых цветов.
Замечание
В запросах 1010h и I015h для указания кода цвета используются одни и те же регистры общего назначения.
В примере 4.2 приведена группа команд, записывающих в последний DAC-регистр видеокарты (OFFh) код яркого белого цвета.
Пример 4.2. Установка содержимого последнего регистра цвета.
mov dh, 3Fh интенсивность красного цвет а mov ch, 3F'h интенсивность зеленого цвет а mov cl, 3Fh интенсивность синего цвета mov bx, 255 номер регистра цвета mov ax, lOlOh код запрашиваемого действия int ICh выполнение запроса Работа с блоком регистров
В группу 10h прерывания int 10h включены два запроса, позволяющие записать или прочитать сразу несколько (блок) регистров цвета.
Запрос 10i2h "Set Block of color Registers записывает коды базовых цветов в несколько (в блок) регистров цвета. Предварительно в оперативной памяти надо сформировать массив, содержащий и троек байтов, где N соответствует размеру блока. В байтах каждой тройки последовательно указываются шестиразрядные коды красного, зеленого и синего цветов. В литературе такой массив принято называть палитрой используемых цветов. Перед обращением к B10S в регистрах задаются следующие величины: bx – номер первого изменяемого DAC-регистр, сх – количество изменяемых DAC-регистров (к), es:dx – адрес оперативной памяти, соответствующий началу массива кодов устанавливаемых цветов (палитры).
Запрос 10i7h "Read Block of Color Registers предназначен для копирования содержимого блока регистров цвета в оперативную память. Входные параметры задаются так же, как для запроса 10i2h. В регистре bх указывается номер первого копируемого регистра цвета, в сх – количество копируемых регистров (N), а в es:dx – адрес начала массива, размером в зы байтов для размещении копируемых значений, где N – число, указанное в сх.