Таблицы символов
Для вывода текста на экран нужен набор заготовок рисунков всех используемых
символов. Обычно эти заготовки хранятся в специальных таблицах символов.
Структура стандартных таблиц не зависит от режима, в котором они будут
использоваться. При описании текстовых видеорежимов (см. раздел
) нас не интересовала структура таблиц, поскольку изображения символов
рисовал видеоконтроллер. В данном случае нам необходимо знать способ хранения
данных в таблицах символов, для того чтобы составить подпрограмму, выполняющую
функции знакогенератора.
Структура стандартных таблиц. В стандартных таблицах ширина символа
составляет восемь точек, т. е. код одной строки (линии) рисунка символа
занимает один байт. В зависимости от высоты символа (количества строк
в знакоместе) заготовка полного рисунка занимает 8, 14 или 16 байтов,
расположенных последовательно друг за другом. Полная таблица содержит
256 заготовок символов и занимает в оперативной памяти пространство 256x8=2048,
256x14=3584 или 256x16=4096 байтов.
Заготовка строки кодируется следующим образом. Старший бит (разряд)
байта соответствует крайней левой позиции в строке, а младший бит -крайней
правой позиции. Если текущая позиция содержит одну из точек рисунка символа,
то соответствующий ей бит установлен (содержит 1), в противном случае
он очищен (содержит 0).
На рис. 5.1 схематически изображено расположение русской буквы Б в стандартном
прямоугольнике (знакоместе) размером 8x16 точек. Первый столбец рисунка
содержит коды байтов каждой строки. В остальных восьми столбцах расположен
рисунок буквы Б.
Если клетка содержит точку изображения символа, то в ней записана буква
Х, пустые клетки соответствуют фону, окружающему изображение символа.
Рис. 5.1. Буква Б из таблицы символов размером 8x16
Доступ к таблице символов
Доступ к таблице символов. Для доступа к таблице символов надо знать,
где она расположена. В текстовых режимах таблицы располагались в видеопамяти.
В графических режимах они находятся в оперативной памяти. Адрес текущей
таблицы хранится в векторе прерывания 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 является двойным словом, а регистр Ьр имеет размер слова. Благодаря
явному указанию типа смещение будет записано в первое из двух слов ftaddr.
Ftaddr+2 является словом и при пересылке сегмента явное указание типа
не требуется.
При выполнении запроса в регистр сх помещается высота символа (размер
заготовки в байтах). Эта величина нужна для дальнейшей работы, но она
известна заранее и равна 16 байтам. Напомним, что записанный в ьь код
Об означает, что мы запрашиваем адрес таблицы, содержащей символы размером
8x16 точек.
Кроме того, запрос возвращает в регистр di количество строк на экране,
но при работе в графических режимах VESA эта величина нас не интересует. |