ПОИСК
Категории книг
ОПРОС
Вопрос: Какой язык программирования вы предпочитаете
С/C++
Delphi
Visual Basic
Perl
Java
PHP
ASP
Другой
ЭТО ПОЛЕЗНО!
ОБРАТНАЯ СВЯЗЬ

/ Главная / Программирование / Иллюстрированный самоучитель по SVGA
Иллюстрированный самоучитель по SVGA

 

Таблицы символов

Для вывода текста на экран нужен набор заготовок рисунков всех используемых символов. Обычно эти заготовки хранятся в специальных таблицах символов. Структура стандартных таблиц не зависит от режима, в котором они будут использоваться. При описании текстовых видеорежимов (см. раздел ) нас не интересовала структура таблиц, поскольку изображения символов рисовал видеоконтроллер. В данном случае нам необходимо знать способ хранения данных в таблицах символов, для того чтобы составить подпрограмму, выполняющую функции знакогенератора.

Структура стандартных таблиц. В стандартных таблицах ширина символа составляет восемь точек, т. е. код одной строки (линии) рисунка символа занимает один байт. В зависимости от высоты символа (количества строк в знакоместе) заготовка полного рисунка занимает 8, 14 или 16 байтов, расположенных последовательно друг за другом. Полная таблица содержит 256 заготовок символов и занимает в оперативной памяти пространство 256x8=2048, 256x14=3584 или 256x16=4096 байтов.

Заготовка строки кодируется следующим образом. Старший бит (разряд) байта соответствует крайней левой позиции в строке, а младший бит -крайней правой позиции. Если текущая позиция содержит одну из точек рисунка символа, то соответствующий ей бит установлен (содержит 1), в противном случае он очищен (содержит 0).

На рис. 5.1 схематически изображено расположение русской буквы Б в стандартном прямоугольнике (знакоместе) размером 8x16 точек. Первый столбец рисунка содержит коды байтов каждой строки. В остальных восьми столбцах расположен рисунок буквы Б.

Если клетка содержит точку изображения символа, то в ней записана буква Х, пустые клетки соответствуют фону, окружающему изображение символа.

00
00
FE
X
X
X
X
X
X
X
62
X
X
X
62
X
X
X
60
X
X
X
X
X
X
X
66
X
X
X
X
66
X
X
X
X
66
X
X
X
X
66
X
X
X
X
FC
X
X
X
X
X
X
00
00
00
00

Рис. 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 эта величина нас не интересует.

 


Компьютерные книги © 2006-2013
computers.plib.ru