Шрифты в MS-DOS
Введение
Загрузка пользовательских шрифтов в MS-DOS широко используется для поддержки национальных символов (например для русификации), а также для приданию шрифту стиля, отличного от стандартного, заложенного в знакогенератор видеоадаптера. Загрузку шрифтов используют также для добавления символов псевдографики, отсутствующих в стандартном шрифте. Например, пакет утилит Norton Utilities для DOS использует символы псевдографики для отображения на экране в текстовом режиме курсора мыши. В данной статье рассматриваются возможности работы со шрифтами в MS-DOS для стандартного видеоадаптера VGA.
В MS-DOS средствами BIOS поддерживается работа с растровыми шрифтами. Функции BIOS позволяют получать и устанавливать пользовательские шрифты, а также получать шрифты из знакогенератора видеоадаптера. Все устанавливаемые шрифты имеют одинаковую ширину 8 точек, а высота может иметь три фиксированных значения - 8, 14 или 16 точек. Конкретное значение высоты шрифта определяется видеорежимом, для которого загружается шрифт. Высота шрифта 8 точек соответствует видеорежиму с 50/43 строками, высота 14 точек - видеорежиму с 25 строками для EGA, а высота 16 точек - видеорежиму VGA с 25 строками.
Функции BIOS для работы со шрифтами доступны через прерывание 10h (видеосервис) и функцию 11h. Различные подфункции этой функции позволяют выполнять различные действия со шрифтами. Ниже представлено описание подфункций функции 11h прерывания 10h для работы со шрифтами.
Функции работы со шрифтами
Подфункция 00h - загрузка пользовательского шрифта. Данная подфункция служит для загрузки пользовательского шрифта заданной высоты для текущего видеорежима. Есть возможность загрузки не всех, а только некоторых символов. Формат вызова подфункции:
Регистр | Значение | Описание |
AH | 11h | номер функции |
AL | 00h | номер подфункции |
BH | количество строк в символе | высота шрифта - 8, 14 или 16 |
BL | 0 | номер знакогенератора |
CX | количество символов в шрифте | количество загружаемых символов (если требуется загрузить лишь часть шрифта) |
DX | номер первого символа | номер первого символа (начиная с 0), с которого начинается загрузка CX символов |
ES:BP | адрес таблицы шрифта | адрес области памяти, содержащей описание каждого символа в шрифте |
Подфункция 02h - загрузка 8x8 шрифта из BIOS. Подфункция позволяет загрузить стандартный шрифт высотой 8 точек из BIOS. Формат вызова подфункции:
Регистр | Значение | Описание |
AH | 11h | номер функции |
AL | 02h | номер подфункции |
BL | 0 | номер знакогенератора |
Подфункция 04h - загрузка 8x16 шрифта из BIOS. Подфункция позволяет загрузить стандартный шрифт высотой 16 точек из BIOS. Формат вызова подфункции:
Регистр | Значение | Описание |
AH | 11h | номер функции |
AL | 04h | номер подфункции |
BL | 0 | номер знакогенератора |
Подфункция 30h - получение справочной информации о шрифтах. Подфункция позволяет получить адрес области памяти, содержащей описание символов шрифта (данные шрифта) для шрифтов разного размера. Формат вызова подфункции:
Регистр | Значение | Описание | |
AH | 11h | номер функции | |
AL | 30h | номер подфункции | |
BH |
|
выбор шрифта |
Возвращаемые значения:
Регистр | Значение | Описание |
CX | 8 для VGA | количество линий в знаке |
DL | количество строк на экране минус 1 | |
ES:BP | адрес таблицы шрифта |
Описание таблицы шрифта
Таблица шрифта представляет собой массив, каждый элемент которого описывает один символ. Максимальное количество элементов в таблице - 256 (так как на экране возможно отображение не более 256 различных символов одновременно). Если требуется загрузить только некоторые символы (подфункция 00h), то элементов может быть меньше. Символ в каждом элементе таблицы описывается построчно. Так как ширина символа постоянна и равна 8 точкам, то каждая строка символа кодируется 8 битами, т.е. одним байтом. Установленный бит (1) означает, что соответствующая точка символа отображается на экране цветом текста, а сброшенный бит (0) означает, что точка отображается цветом фона (цвет текста и фона задаётся в видеопамяти байтами атрибутов символа - 4 бита на цвет текста и 4 бита на цвет фона). Количество байт в элементе таблицы шрифта равно количеству строк в символе. Так, например, для шрифта высотой 16 точек каждый элемент таблицы занимает 16 байт. Ниже представлен пример кодирования латинской буквы 'A' в шрифте с высотой 16 точек:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Байты, соответствующие каждой строке буквы 'A' будут следующими: 00h,00h,18h,24h,42h,42h,42h,42h,7Eh,42h,42h,42h,42h.
Примеры программ
Для загрузки шрифта, обычно, в память считывается файл с таблицей шрифта, а затем выполняется его загрузка с помощью подфункции 00h функции 11h прерывания 10h. Ниже приведён листинг программы на языке C++, выполняющей загрузку шрифта высотой 16 точек из файла font.fnt:
#include <iostream.h> #include <stdlib.h> #include <dos.h> #define FONTHEIGHT 16 char font[256 * FONTHEIGHT]; void LoadFont(char *filename) { ifstream in(filename, ios::binary); if (!in) { cout << "Невозможно открыть файл\n"; exit(1); } in.read(font, 256 * FONTHEIGHT); in.close(); } void SetFont() { struct REGPACK regs; regs.r_ax = 0x1100; regs.r_bx = 0x1000; regs.r_cx = 256; regs.r_dx = 0; regs.r_es = FP_SEG((void far *)font); regs.r_bp = FP_OFF((void far *)font); intr(0x10, &regs); } void main(void) { LoadFont("font.fnt"); SetFont(); }
Пример аналогичной программы на ассемблере (таблица шрифта определена в файле 08x16.inc):
code segment assume cs:code org 100h @1: jmp @2 font label byte include 08x16.inc @2: mov ax, ds mov es, ax mov bp, offset font mov ax, 1100H mov bh, 10H mov bl, 0 mov cx, 100H mov dx, 0 int 10H mov ax, 4C00H int 21H code ends end @1
Программы подобные последней часто используются для загрузки пользовательских шрифтов (так называемые драйверы шрифтов).
Заключение
Для создания программы русификатора требуется установить обработчик прерывания 10h, так как при смене видеорежима загружается стандартный шрифт. Обработчик должен загружать шрифт после вызова старого обработчика прерывания 10h, если была вызвана функция установки видеорежима (00h).
Функция BIOS установки шрифта, как правило, используется для установки шрифта при смене видеорежима. Для динамической загрузки шрифта или некоторых его символов эта функция не подходит, так как она производит комплексную инициализацию видеоадаптера для загрузки нового шрифта - это приводит к мерцанию экрана, но при смене видеорежима мерцание незаметно. Если требуется часто загружать символы шрифта (например, для рисования графического курсора мыши в текстовом режиме) рекомендуется использовать метод программировния видеоадаптера через регистры.
Copyright © 1999 by HackMaster