Программный знакогенератор
В данном разделе будет описана подпрограмма, которая по коду ASCII выбирает из таблицы соответствующую заготовку и рисует изображение символа на экране. В технической литературе для обозначения подобных подпрограмм используется термин "программный знакогенератор". Подпрограмма будет предназначена для выполнения в видеорежимах PPG. Однако, учитывая ее значимость, мы специально обсудим те изменения, которые позволят выводить текст при работе в видеорежимах direct color.
Общая характеристика знакогенератора
Структура заготовки символа (см. Рис. 5.1) ничем не отличается от структуры упакованного двухцветного рисунка. Способ построения строки такого рисунка был показан в Примере 3.18 раздела. Особенности построения небольших рисунков обсуждались в предыдущем разделе, а соответствующая подпрограмма приведена в Примере 3.21. Нам остается объединить эти примеры и учесть следующие обстоятельства.
В отличие от рисунка заготовка символа хранится не в файле, а в таблице символов и знакогенератор должен самостоятельно вычислять адрес ее начала в оперативной памяти. Для этого ему нужны следующие величины: адрес начала таблицы, ширина и высота символа (размер знакоместа для размещения символа) и код ASCII. Мы ограничимся случаями, когда ширина символов составляет 8 точек, т. е. подпрограмма рассчитана на стандартные таблицы символов. Адрес таблицы и высота символов будут находиться в специальных переменных, расположенных в разделе данных задачи.
К рисунку прилагается палитра, содержащая описание использованных в нем цветов. Таблица символов не содержит палитры. В зависимости от состояния текущего бита, знакогенератор выбирает код одного из двух заранее задаваемых цветов, они могут различаться для каждого символа.
При работе в текстовых режимах аппаратный знакогенератор выбирает коды цветов точек изображения символа (foreground) и фона (background) из байта атрибута, находящегося в видеопамяти (см. соответствующий раздел). В нем можно закодировать 16 разных цветов foreground и 8 цветов background, коды которых соответствуют стандартной палитре CGA (см. Табл. 4.2).
При работе в графических режимах для каждого выводимого символа указываются коды цветов точек его изображения и фона. В режимах PPG кодами являются номера регистров цвета видеокарты, содержащих нужные цвета. В режимах direct color это коды самих цветов, имеющие размер слова (Hi-Color) или двойного слова (True Color). В зависимости от используемого видеорежима в разделе данных задачи надо зарезервировать два байта, два слова или два двойных слова, содержащие цвета для раскрашивания изображения символов и окружающего их фона.
Новые переменные
Для того чтобы знакогенератор мог выбрать заготовку рисунка символа из таблицы и раскрасить ее в нужные цвета, в разделе данных задачи должны располагаться переменные, приведенные в примере 5.18.
Пример 5.18. Аргументы программного знакогенератора.
ftaddr dd 00; полный адрес таблицы символов hsymb dw 16; высота символа (размер заготовки в байтах) augment dw 00;!! константа переадресации строк рисунка символа grndcol db OFFh;!! код цвета точек фона, окружающего символ symbcol db 00;!! код цвета точек контура символа
Если адрес таблицы известен при составлении программы, то его значение указывается в исходном тексте вместо нулей. Если используется одна из таблиц русификатора, то ее адрес можно определить так, как это показано в примере 5.17.
Высота символов обычно известна заранее и указывается в исходном тексте программы. Напомним, что стандартные таблицы содержат символы высотой 8, 14 или 16 строк. В тех случаях, когда планируется работа с символами разной высоты, вам придется предусмотреть запись ее значения в переменную hsymb.
Переменная augment содержит величину, которая добавляется к текущему адресу видеопамяти для перехода в начало следующей строки рисунка символа. Напомним, что в режимах PPG она выражается в точках и вычисляется как разность между шириной рабочего поля экрана и шириной рисунка. Если установлен режим с разрешением 640x480 точек, то при ширине символа В 8 точек значение augment = horsize – 8 = 640-8 = 632.
В примере 5.18 значения переменных grndcol и symbcol выбраны исходя из предположения, что символы изображаются черным цветом на белом фоне и что коды черного и белого цветов находятся в DAC – регистрах видеокарты с номерами 00 и 0FFh. Например, именно их используют Windows и ее приложения при работе с текстом. В общем же случае значения указанных переменных зависят от того, в каких регистрах видеокарты расположены коды нужных вам цветов.