Имеется в виду сохранение текущего содержимого регистров цвета видеокарты (DAC) и некоторых величин, хранящихся в области данных BIOS. Напомним, что регистры DAC используются только при работе В режимах packed pixel graphics.
Функция 4F04h Save/Restore Video State выполняет Копирование вышеназванных званных величин в указанный массив или, наоборот, из указанного массива в регистры DAC и в область данных BIOS. Кроме того, она позволяет определить размер массива, необходимый для размещения сохраняемых величин. Перед вызовом функции заполняется несколько регистров, каких — это зависит от запрашиваемого действия.
Обязательно заполняются регистры сх и dx. В регистре сх используются 4 младших разряда, установка каждого из которых определяет группу сохраняемых или восстанавливаемых величин:
В регистре dx указывается код запрашиваемого действия:
Если регистр dx очищен, то регистры их и еs не заполняются. После исполнения запроса в их находится количество байтов памяти, которое надо выделить для сохранения указанных в сх групп величин. Теперь можно выбрать расположение массива в памяти и запросить сохранение состояния.
Если в dx задан код 1 или 2, то в паре регистров es:bx указывается полный адрес массива, в котором надо сохранить или из которого нужно восстановить ранее сохраненные величины.
В соответствии со стандартом VGA IBM функция lch прерывания int 10h имеет аналогичное название и выполняет аналогичные действия. В описании VBE дана ссылка на эту функцию и разработчики видеокарт приняли ее как установку к действию. Анализ восстановленного текста BIOS у нескольких видеокарт с версиями VBE 1.2 и VBE 2.0 показал, что выполнение функции 4F04h сводится к проверке кода, указанного в dx. Если он больше чем 2, то запрос отвергается, в противном случае происходит обращение к функции ich. Никакие другие действия не выполняются.
В этой связи возникает вопрос: каким действиям соответствует установка бита 3 регистра сх? Дело в том, что функция ich сохраняет только фрагменты из области данных BIOS и содержимое регистров DAC. Никакие другие величины не сохраняются и не восстанавливаются.
Возможно, что разработчики видеокарт не придали указанному факту должного значения по той причине, что функция 4F04h редко используется при программировании, без нее можно обойтись.
Переключение окон видеопамяти. Окна видеопамяти используются при работе микропроцессора в реальном режиме. В этом случае командам доступно пространство адресов размером не более 64 Кбайт. У современных карт объем видеопамяти намного (в десятки раз) превосходит указанную величину. Поэтому видеопамять делится на одинаковые сегменты размером 64 Кбайт, которые принято называть окнами.
Для доступа к видеопамяти выделяется видеобуфер (или видеосегмент). Это пространство адресов размером 64 Кбайт, в графических режимах его адрес (код) обычно, но не обязательно, равен АОООЬ, а в текстовых вбооь. Код видеосегмента это не более чем признак. Обнаружив его, видеоконтроллер записывает данные в текущее окно видеопамяти или считывает их оттуда.
Текущий номер окна хранится в одном из регистров видеоконтроллера и является частью абсолютного адреса видеопамяти. BIOS поддерживает работу с этим регистром.
Функция 4F05h CPU Video Memory Control читает или изменяет номер теку-
щего окна видеопамяти. Наличие этой функции позволяет задачам работать со всем пространством видеопамяти.
Перед вызовом функции 4F05h в регистре bх указываются номер окна и запрашиваемое действие. Нуль в регистре bh (старший байт регистра bx) означает установку нового окна с номером, указанным в dx. Единица в регистре bh означает чтение номера текущего окна, он возвращается в регистре dx. В главе 2 подробно описана техника переключения окон и формат, в котором указываются их номера.
Стандартом VESA предусмотрена возможность существования у видеокарты двух окон (А и в). Нуль в регистре bl (младшем байте регистра bх) соответствует окну А, а единица — в. Почти все исследованные автором видеокарты поддерживали работу только с окном А. Исключением являются видеокарты фирмы ATI Technologies, у которых окно А доступно только для записи данных в видеопамять, а окно в — только для чтения.
Программная реализация функции 4F05h такова, что основные действия выполняет отдельная процедура (подпрограмма), к которой задача может обращаться непосредственно, т. е. минуя прерывание int 10h. Функция 4FOih размещает адрес этой подпрограммы в выходном массиве в двойном слове со смещением ось (см. табл. 1.2). Стандарт VESA рекомендует прямое обращение к подпрограмме вместо использования функции 4F05h.