RstPal:pusha сохранение регистров
push es сохранение содержимого es
les dx, dword pt г 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 до 255, и присутствие регистров палитры просто не заметно. Если же принудительно изменить содержимое регистров палитры, то изменится естественный порядок нумерации регистров цвета.
Дополнение к программе визуализации
В качестве примера приведем дополнение к примеру 4.1, позволяющее увидеть на экране эффект от изменения содержимого регистров палитры. Оно приведено в примере 4.5 и должно быть включено в текст примера 4.1 между командами int 2lh и mov ax, 03.
Напомним, что программа примера 4.1 заполняет экран разноцветными вертикальными линиями, ждет ввод любого символа и прекращает свою работу. После указанных изменений вместо прекращения работы будет выполняться группа команд из примера 4.5, которая записывает в регистры палитры значения, противоположные исходным (OFh, ОЕb, ..., i, о). В результате картинка на экране окажется повернутой вокруг вертикальной оси. Например, если в исходном варианте палитра сел располагалась в первых 16-ти столбцах на экране, то теперь она будет находиться в столбцах с номерами 240—255, а расположение цветов в этих столбцах будет противоположно исходному.
После выполнения этих действий программа вновь ждет нажатия на одну из клавиш. Это сделано для того, чтобы оператор мог рассмотреть изменения, произошедшие на экране. После нажатия на клавишу выполнение программы будет закончено и произойдет возврат в DOS.
Пример 4.5. Дополнение (вставка) к программе примера 4.1
mov сх, 16 ; количество изменяемых регистров
В примере 4.5 использован запрос 1000h, который производит запись в регистр палитры. Перед его вызовом заполняется регистр bx. В старший байт ьь записывается номер группы регистров цвета, а в младший bl — номер регистра палитры.
Содержимое регистра палитры можно прочитать с помощью запроса 1007h. Номер читаемого регистра палитры указывается в ы, а его содержимое после выполнения запроса будет помещено в bh.
В состав группы 10h входят два запроса, которые позволяют прочитать (код 1009h) или записать (код I002h) сразу все регистры палитры. Кроме того, они считывают или записывают еще один специальный регистр, который называется overscan или Border. О назначении этого регистра следует поговорить особо.
Регистр Overscan
При работе в любом видеорежиме на экране существует небольшое свободное пространство, расположенное за "пределами рабочей области. Окраска этого пространства зависит от содержимого регистра цвета, номер которого хранится в регистре overscan. Обычно не используемое пространство окрашено в черный цвет, а поскольку код черного цвета находится в нулевом регистре, то Overscan просто очищен.
Некоторые,программы, например русификатор Keyrus, изменяют содержимое Overscan для окрашивания неиспользуемого пространства экрана в разные цвета. Это позволяет различать режимы работы программы, например ввод русских или латинских букв, не используя рабочую область экрана. Существуют два запроса — 1001h и 1008h, выполняющие запись и чтение регистра Overscan.
Замечание 3
Замечание 3
В заключение еще раз подчеркнем, что в видеорежимах SVGA деление на страницы действует только при работе с палитрой 16 цветов. При работе с палитрой 256 цветов регистры палитры не используются.