Графические режимы. Таблицы символов.
Доступ к таблице символов
Для доступа к таблице символов надо знать, где она расположена. В текстовых режимах таблицы располагались в видеопамяти. В графических режимах они находятся в оперативной памяти. Адрес текущей таблицы хранится в векторе прерывания 43h, состоящем из двух слов с адресами 0000:010С и 0000:010Е. В первом слове находится смещение начала таблицы в сегменте, а во втором – сам сегмент. При установке режимов VESA в вектор 43h записывается адрес англоязычной таблицы, находящейся в ROM BIOS. Нам, обычно, нужны таблицы с русскими символами, поэтому исходное содержимое вектора 43h не представляет интереса.
Как и при работе в текстовых режимах, задача может использовать собственную таблицу символов или одну из таблиц русификатора.
В первом случае место расположения таблицы в оперативной памяти выбирает программист по своему усмотрению. При работе с собственной таблицей выполнение задачи не зависит от наличия русификатора на конкретном компьютере и возможно использование символов произвольного размера и начертания. Графические видеорежимы не накладывают никаких ограничений на размеры и начертание символов – их выбирает программист, разрабатывающий конкретную прикладную задачу.
Если на компьютере установлен русификатор, например Keyrus, то можно использовать его таблицы со стандартными шрифтами трех размеров: 8x8, 8x14 и 8x16 точек. Их адреса определяются при выполнении задачи.
Установка таблицы символов
Как уже говорилось в предыдущем разделе, в состав прерывания int 10h входит функция иь, обрабатывающая запросы, относящиеся к знакогенератору. Одним из них является следующий.
Запрос 1130h "Get video Font information возвращает сведения о таблицах шрифтов. Перед его изданием в регистре ьь указывается код таблицы, сведения о которой надо получить. BIOS возвращает в регистрах следующие величины: es:bp – полный адрес таблицы, сх – размер заготовки символа в байтах, dl – количество строк на экране.
Код таблицы указывается в регистре ы-i, он может иметь значения от 0 до 7. Нас будут интересовать значения 2, 3 и 6, соответствующие таблицам 8x14, 8x8 и 8x16 точек. Запрос возвращает адреса англоязычных таблиц, расположенных в ROM BIOS. Русификатор перехватывает запрос и при обнаружении указанных кодов возвращает адрес одной из своих таблиц, находящихся в оперативной памяти.
Если используется только одна таблица, то ее адрес определяется в начале выполнения задачи, сохраняется в специально выделенном двойном слове и используется по мере необходимости. Адрес таблицы желательно хранить в разделе данных программы. Полный адрес состоит из сегмента и смещения, для их размещения нужно двойное слово. Оно описывается с помощью директивы ассемблера dd, перед которой располагается метка, например:
ftaddr dd 00; поле для размещения адреса таблицы символов
Фрагмент программы, определяющий адрес таблицы символов размером 8x16 точек и сохраняющий его в ftaddr, приведен в примере 5.17.
Пример 5.17. Определение адреса таблицы с размером символов 8x16.
mov bh, 06; код таблицы символов mov ax, 1130h; код запроса на получение информации int 10h; выполнение запроса mov word ptr ftaddr, bp; сохранение смещения в сегменте mov ftaddr+2, es; сохранение сегмента адреса таблицы
При пересылке смещения указатель типа word ptr нужен потому, что поле ftaddr является двойным словом, а регистр bр имеет размер слова. Благодаря явному указанию типа смещение будет записано в первое из двух слов ftaddr. Ftaddr+2 является словом и при пересылке сегмента явное указание типа не требуется.
При выполнении запроса в регистр сх помещается высота символа (размер заготовки в байтах). Эта величина нужна для дальнейшей работы, но она известна заранее и равна 16 байтам. Напомним, что записанный в ьь код Об означает, что мы запрашиваем адрес таблицы, содержащей символы размером 8x16 точек.
Кроме того, запрос возвращает в регистр di количество строк на экране, но при работе в графических режимах VESA эта величина нас не интересует.