Шрифты в 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
02h - адрес шрифта 8x14
03h - адрес шрифта 8x8
06h - адрес шрифта 8x16
выбор шрифта

Возвращаемые значения:

Регистр Значение Описание
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

Hosted by uCoz