5. Использование функций BIOS для работы с видеоадаптерами

У всех компьютеров, совместимых с IBM PC/XT/AT и PS/2, на системной плате установлена микросхема ПЗУ BIOS. В ней записан набор различных программ или функций, предназначенных для управления различными подсистемами компьютера: дисковой подсистемой, асинхронными последовательными и параллельными портами ввода/вывода, видеоадаптером. Нас в первую очередь будут интересовать функции, предназначенные для управления видеоподсистемой компьютера.

Микросхема ПЗУ BIOS, расположенная на системной плате содержит функции для управления видеоадаптерами. Однако практически все видеоадаптеры имеют собственную микросхему ПЗУ BIOS, расположенную на самой плате адаптера. На практике для управления видеоадаптером используются функции, записанные в его ПЗУ BIOS.

Использование функций BIOS для управления видеоадаптерами имеет как преимущества, так и недостатки. Основным преимуществом функций BIOS является то, что они скрывают всю кропотливую работу по программированию регистров видеоадаптера и видеопамяти, предоставляя программисту достаточно простой интерфейс. Но это еще не все. Так как функции BIOS создаются самими разработчиками видеоадаптера, то они учитывают все особенности конкретной модели адаптера, выравнивая все различия. Как вы узнаете позже, это особенно важно для программирования видеоадаптеров SVGA, так как набор регистров и организация видеопамяти разных моделей может сильно различаться.

К недостаткам функций BIOS можно отнести невысокую скорость их работы. Отчасти это вызвано тем, что доступ к данным, записанным в ПЗУ происходит медленнее, чем к оперативной памяти. Многие системные платы позволяют перенести содержимое медленного ПЗУ BIOS в более быструю оперативную память. Эта область оперативной памяти получила название теневой памяти, так как ее содержимое полностью повторяет соответствующую область ПЗУ. Подключение теневой памяти выполняется с помощью программы BIOS Setup. Отметим, что ПЗУ BIOS видеоадаптера обычно занимает адресное пространство начиная с адреса C000:0000h до адреса C000:7FFFh.

Второй недостаток функций ПЗУ BIOS состоит в том, что большинство их нереентерабельно. То есть пока не завершится вызов функции BIOS нельзя вызвать другую функцию BIOS. Вследствие этого вы не можете как обычно пользоваться функциями BIOS в резидентных программах.

Практически ни одна функция BIOS видеоадаптера не проверяет результат своего выполнения и не сообщает о произошедших ошибках. Поэтому любая неточность в исходном тексте программы может привести к ошибке, причину которой будет трудно выявить.

И, наконец, последний недостаток функций BIOS состоит в том, что они предназначены только для работы в реальном режиме процессора. При вызове функций BIOS из защищенного режима процессора будет происходить переключение процессора в реальный режим.

Для доступа к функциям BIOS видеоадаптера предназначено прерывание INT 10h. Загрузите в регистр AH номер функции BIOS видеоадаптера, которую необходимо вызвать, загрузите остальные регистры процессора в соответствии с вызываемой функцией и выполните прерывание INT 10h.

Большинство функций BIOS видеоадаптера не изменяют содержимое неиспользуемых регистров процессора, однако рекомендуется сохранить наиболее важные регистры.

Выбор режима работы - функция 00h

Функция 00h прерывания 10h позволяет задать любой стандартный режим работы видеоадаптера:

На входе: AH 00h
  AL Номер устанавливаемого режима работы видеоадаптера, если бит D7 = 1, то при установке режима видеопамять не очищается
На выходе: Не используются

Приведем пример выбора режима видеоадаптера:


mov	ah, 0
mov	al, 3	; Выбираем режим номер 3 (16 цветной, текстовый,
int	10h	; разрешение 25х80 символов)

Изменение формы курсора - функция 01h

Функция 01h позволяет изменить вертикальные размеры курсора путем задания верхней и нижней границ курсора (рис. 5.1). Горизонтальные размеры курсора всегда одинаковы и равны ширине одного символа. Курсор отображается только в текстовых режимах работы видеоадаптера.

На входе: AH 00h
  CH Верхняя граница курсора. Если регистр CH содержит значение 20h курсор не отображается
  CL Нижняя граница курсора
На выходе:   Не используются

При выборе режима работы видеоадаптера BIOS устанавливает следующие значения для верхней и нижней границ курсора:

Рисунок 5.1 Изменение положения курсора

Изменение положения курсора - функция 02h

Функция 02h задает текущее положение курсора на экране монитора. Если видеопамять разделена на несколько страниц, то каждая из них имеет свой курсор, координаты которого можно устанавливать отдельно.

Координаты курсора определяют не только место на экране, где он отображается, но также и позицию, начиная с которой соответствующие функции BIOS будут выводить на экран строки или отдельные символы.

На входе: AH 02h
  BH Номер страницы видеопамяти
  DH Номер строки
  DL Номер столбца
На выходе:   Не используются

Определение положения и формы курсора - функция 03h

Функция 03h позволяет узнать размер и текущие координаты курсора для любой страницы видеопамяти:

На входе: AH 03h
  BH Номер страницы видеопамяти
На выходе: CH Верхняя граница курсора
  CL Нижняя граница курсора
  DH Позиция текущей строки курсора
DL Позиция текущего столбца курсора

Данная функция предназначена для использования только в текстовых режимах видеоадаптера.

Использование светового пера - функция 04h

Функция 04h позволяет определить подключено ли к видеоадаптеру световое перо или нет. Если световое перо подключено, можно определить его координаты. Функция позволяет узнать позицию светового пера в текстовых и в графических координатах.

Световое перо видеоадаптера EGA программно не полностью совместимо с CGA, в результате чего программы поддерживающие возможность использования светового пера для видеоадаптера CGA будут работать неправильно с видеоадаптером EGA. Видеоадаптеры VGA и SVGA не имеют светового пера.

На входе: AH 04h
На выходе: AH 0 - световое перо не подключено (все остальные регистры не содержат полезной информации);
1 - световое перо подключено
  CH Координаты вертикальной позиции курсора в пикселах (графические режимы с низким разрешением - 04h, 05h, 06h)
  CX Координаты вертикальной позиции курсора в пикселах (графические режимы с высоким разрешением)
  BX Координаты горизонтальной позиции курсора в пикселах
  DH Номер строки, на которой расположен курсор
  DL Номер столбца на котором расположен курсор

Выбор активной страницы видеопамяти - функция 05h

Функция 05h позволяет изменить активную страницу видеопамяти. Активная страница видеопамяти отображается на экране монитора. Функция не проверяет физического наличия выбранной страницы видеопамяти. Если вы неправильно указали номер страницы результат работы функции не определен.

На входе: AH 05h
  AL Номер страницы видеопамяти, которая станет активной
На выходе:   Не используются

Свертка окна вверх - функция 06h

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

На входе: AH 06h
  AL Количество свертываемых линий. Если оно равно нулю, то окно прокручивается целиком
  BH Атрибут, используемый для символов строк, возникающих снизу окна
  CH Номер строки верхнего левого угла окна
  CL Номер столбца верхнего левого угла окна
  DH Номер строки нижнего правого угла окна
  DL Номер столбца нижнего правого угла окна
На выходе:   Не используются

Функцию 06h можно использовать не только в текстовых, но и в графических режимах работы видеоадаптера. Если вы используете функцию в графическом режиме, то цвет области, появляющийся внизу окна после его свертки зависит от значения регистра BH и номера режима видеоадаптера.

В монохромном графическом режиме с разрешением 640х200 пикселов значение регистра BH определяет цвет 8-и последовательно расположенных пикселов. Задав разный цвет пикселов вы можете закрасить свертываемую область вертикальными штрихами.

В 4-х цветном графическом режиме с разрешением 320х200 пикселов значение регистра BH определяет цвет 4-х последовательно расположенных пикселов. Благодаря этому вы можете закрасить свертываемую область вертикальными штрихами различного цвета.

В остальных графических режимах значение регистра BH определяет цвет всех пикселов в свертываемой области экрана.

Тот факт, что при свертке в нижней части окна возникают чистые строки, впоследствии заполняющие все окно, можно использовать для быстрой очистки экрана. Для этого достаточно задать размеры окна, равные размерам экрана и прокрутить его вверх на 25 или 0 строк. Приведем фрагмент программы на языке ассемблера, который можно использовать для очистки экрана монитора:


push	es		; Сохраняем содержимое регистра ES

xor	ax,ax	; Устанавливаем регистр ES на нулевой
mov	es,ax	; сегмент памяти

mov	ah,6	; Функция свертки экрана вверх
mov	al,0	; Очищаем все окно
mov	bh,7	; Устанавливаем нормальный атрибут
xor	cx,cx	; Устанавливаем левый верхний угол окна в (0,0)

; Определяем число строк в данном режиме
mov	dh,es:[484h]
; Определяем число символов в строке
mov	dl,es:[44Ah]
dec	dl

; Вызываем свертку экрана вверх
int	10h
; Восстанавливаем регистр ES
pop	es

Для определения размеров экрана используется содержимое переменных видеофункций BIOS. Ячейка памяти, расположенная по адресу 0000:0484h содержит число, на единицу меньшее, чем количество строк на экране. По адресу 0000:044Ah находится переменная, определяющая число символов в строке. Более подробно переменные видеофункциий BIOS будут рассмотрены позже.

Свертка текстового окна вниз - функция 07h

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

На входе: AH 07h - свертка окна вниз
  AL Число свертываемых линий, если оно равно нулю, то окно прокручивается целиком
  BH Атрибут, используемый для строк, возникающих в верхней части окна
  CH Номер строки левого верхнего угла окна
  CL Номер столбца левого верхнего угла окна
  DH Номер строки правого нижнего угла окна
  DL Номер столбца правого нижнего угла окна
На выходе:   Не используются

Функция работает аналогично функции 06h (за исключением направления свертки).

Чтение символа и его атрибутов - функция 08h

Данная функция позволяет прочитать символ и его атрибуты из позиции экрана, определенной текущим положением курсора. Чтение можно производить как из активной, так и из неактивных страниц памяти:

На входе: AH 08h
  BH Номер страницы видеопамяти
На выходе: AL ASCII-код символа
  AH Байт атрибутов символа для текстовых режимов

Следующий пример считывает символ и его атрибут из текущей позиции курсора на странице page:


mov	ah,8
mov	bh,page	; Выбираем страницу видеопамяти page

int	10h		; Считываем символ и его атрибут

mov	char,al	; Сохраняем полученный ASCII-код символа
mov	attr,ah	; и его атрибут

Что удивительно данная функция может работать не только в текстовых, но также и в графических режимах. В этом случае она сравнивает пикселы в текущей позиции курсора с записями в таблице определения символов графического режима. Пикселы, значение которых не равно нулю, воспринимаются как пикселы символа. Остальные пикселы рассматриваются в качестве фона. Если соответствующий образ символа не обнаружен, функция возвращает в регистре AL значение 0. Если символ определен, в регистре AL возвращается его ASCII-код.

В качестве таблицы определения символов графического режима используется таблица, на которую указывает вектор прерывания 43h. Для графических режимов низкого разрешения (режимы номер 4, 5, 6) используется таблица символов, на которую указывает вектор прерывания 1Fh. Эта таблица содержит определение символов с ASCII-кодами 80h - FFh.

Запись символа с атрибутами в текущей позиции курсора - функция 09h

Функция позволяет записать один или несколько одинаковых символов в текущей позиции курсора. Запись может происходить как в активную, так и в неактивные страницы видеопамяти. После выполнения операции записи положение курсора не изменяется. Управляющие символы, такие как возврат каретки и перевод строки, не действуют и записываются в видеопамять, как обычные символы. Данная функция работает как в текстовых, так и в графических режимах.

На входе: AH 09h
  AL ASCII-код записываемого символа
  BH Номер страницы видеопамяти или цвет пикселов фона (для графического режима номер 13h)
  BL Атрибут символов (для текстового режима) или цвет пикселов символа (для графического режима);
  CX Количество записываемых символов
На выходе:   Не используются

Если бит D7 регистра BL содержит единицу, то записываемый символ накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ. Естественно, за исключением режима номер 13h, в котором все биты регистра BL используются для задания цвета пикселов символа.

Ниже приведен пример (листинг 5.1), использующий рассмотренные функции BIOS для выбора режима работы видеоадаптера, выбора активной страницы видеопамяти, изменения формы и координат курсора и отображения символов на экране монитора.

Листинг 5.1. Файл BIOSFUN.ASM


TITLE   BIOS_FUNCTION

.MODEL  small

DOSSEG

.STACK  100h

.DATA
	message	DB	"INT 10h", 0
	video_page	DB	2

.CODE
.STARTUP

	; Выбираем режим 3 видеоадаптера
	xor	ah,ah
	mov	al,3
	int	10h

	; Изменяем форму курсора
	mov	ah,1
	mov	ch,0	; начало курсора - линия 0
	mov	cl,7	; конец курсора - линия 7
	int	10h

	; Выбираем активную страницу видеопамяти
	mov	ah,5
	mov	al,video_page	; выбираем страницу video_page
	int	10h

	mov	ah,6
	mov	al,0
	mov	bh,0ffh
	mov	cl,10
	mov	ch,5
	mov	dl,30
	mov	dh,15
	int	10h

	; Устанавливаем координаты курсора
	mov	ah,2
	mov	bh,video_page	; выбираем страницу video_page
	mov	dh,12		; строка 12
	mov	dl,20		; колонка 20
	int	10h

	; Отображаем на активной странице экрана строку message
	mov	si,OFFSET message
	call	WriteString

.EXIT	0


; Процедура WriteString выводит на экран строку, имеющую
; смещение si в сегменте ds
WriteString	PROC

	; Определяем текущую активную страницу экрана
	mov	ah,0Fh
	int	10h	; номер активной страницы в регистре bh

	; Получаем в dx координаты курсора
	mov	ah,3
	int	10h

	; В цикле выводим на экран символы строки

next_char:

	mov	ah,9
	lodsb
	cmp	al,0	; находим конец строки

	; Если достигнут конец строки оканчиваем процедуру
	je	exit_proc

	; Для отображаемых символов используем атрибут 7
	; символы строки выводятся без повтора
	mov	bl,7	;
	mov	cx,1	;
	int	10h

	; Перемещаем курсор в следующую позицию строки
	mov	ah,2
	inc	dl
	int	10h

	jmp	next_char

exit_proc:

	ret

WriteString	ENDP

END

Запись символа в текущей позиции курсора - функция 0Ah

Функция позволяет записать символ в текущей позиции курсора на любой странице видеопамяти. Как и в предыдущей функции, можно производить запись сразу нескольких одинаковых символов. Атрибуты символа не задаются, а используются их старые значения из предыдущих операций записи. После операции записи положение курсора не изменяется. Управляющие символы, такие как возврат каретки и перевод строки, не действуют и записываются в видеопамять, как обычные символы.

На входе: AH 10h
  AL ASCII-код записываемого символа
  BH Номер страницы видеопамяти или цвет пикселов фона (для графического режима номер 13h)
  BL Цвет пикселов символа (для графического режима)
  CX Количество записываемых символов
На выходе:   Не используются

Во всех режимах (за исключением режима номер 13h) если бит D7 регистра BL содержит единицу, то записываемый символ накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ.

Установка цветовой палитры (режимы 4,5,6) - функция 0Bh

Данная функция позволяет выбрать одну из двух стандартных цветовых палитр (см. таблицу 9.1). Функция используется для обеспечения совместимости с видеоадаптером CGA и предназначена для использования в текстовых режимах и графических режимах с низким разрешением.

Функция 0Bh имеет следующий формат вызова:

На входе: AH 0Bh
  BH 0, тогда
  BL Цвет фона и рамки (для графического режима) или цвет рамки (для текстового режима)
  BH 1, тогда
  BL Номер палитры (0 или 1)
На выходе:   Не используются

В следующей таблице описаны стандартные цветовые палитры для режимов 4, 5, 6:

Номер цвета Палитра 0 Палитра 1
0 Цвет фона Цвет фона
1 Зеленый Синий
2 Красный Фиолетовый
3 Желтый Белый

Вывод пиксела - функция 0Ch

Использование функций BIOS для создания изображений, в частности для отображения отдельных пикселов, хотя и медленнее, чем прямая запись в видеопамять и программирование регистров, но более надежно с точки зрения совместимости для различных режимов и видеоадаптеров.

Функция используется в графических режимах для записи пиксела заданного цвета в любую страницу видеопамяти. Необходимо отметить, что у видеоадаптера CGA в графических режимах определена только одна страница видеопамяти.

Формат вызова функции 0Ch представлен ниже:

На входе: AH 0Ch
  AL Номер цвета (значение ячейки видеопамяти, соответствующее пикселу)
  BH Номер страницы (для видеоадаптера CGA не используется)
  CX Координата X пиксела
  DX Координата Y пиксела
На выходе:   Не используются

Во всех режимах (кроме режима номер 13h) если бит D7 регистра AL содержит единицу, то новый пиксел накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ.

Номера цветов, которые можно использовать в различных режимах, перечислены в таблице, приведенной ниже. Цвета, соответствующие номерам цветов в таблице можно посмотреть в главе "Режимы работы видеоадаптеров".

Номер режима Используемые номера цветов
4, 5 0 - 3
6 0 и 1
0Dh 0 - 15
0Eh 0 - 15
0Fh 0 и 1
10h 0 - 15

 

Начало системы координат находится в левом верхнем углу экрана. Оси координат направлены следующим образом: ось X - вправо, ось Y - вниз. Далее, если особо не оговорено, мы всегда будем использовать эту систему координат.

Программа, представленная в листинге 5.2, демонстрирует использование функций выбора цветовой палитры и вывода пиксела.

Листинг 5.2. Файл BIOS_C.C


#include <dos.h>
#include <stdio.h>
#include <conio.h>

void main(void);

void main(void) {

	union REGS	inregs, outregs;
	unsigned char	i, j;

	// Устанавливаем режим 4  видеоадаптера
	// (графический - 320х200 пикселов, 4 цвета)
	inregs.h.ah = 0x0;
	inregs.h.al = 0x4;

	int86( 0x10, &inregs, &outregs );

	// Устанавливаем цвет фона

	inregs.h.ah = 0x0B;
	inregs.h.bh = 0x0;	// устанавливаем цвет фона
	inregs.h.bl = 0x6;	// номер устанавливаемого цвета фона

	int86( 0x10, &inregs, &outregs );

	for(i = 0; i < 2; i++) {

		// Устанавливаем цветовую палитру
		inregs.h.ah = 0x0B;
		inregs.h.bh = 0x1;	// установка палитры
		inregs.h.bl = i;		// номер палитры

		int86( 0x10, &inregs, &outregs );

		// Выводим массив точек
		for(j = 0; j < 64; j++) {

			inregs.h.ah = 0x0C;

			// Номер цвета
			inregs.h.al = (unsigned char)(j / 16);

			// X-координата точки
			inregs.x.cx = 0x10 + j;
			// Y-координата точки
			inregs.x.dx = 0x10 + j;	

			int86( 0x10, &inregs, &outregs );
		}
		getch();
	}
}

Чтение пиксела - функция 0Dh

Функция позволяет определить цвет любого пиксела экрана по его координатам. Функция используется только в графических режимах работы видеоадаптеров.

На входе: AH 0Dh
  BH Номер страницы (для видеоадаптера CGA не используется)
  CX Координата X пиксела
  DX Координата Y пиксела
На выходе:   AL = номер цвета пиксела

Приведем фрагмент программы, который определяет номер цвета пиксела, имеющего координаты x_pos и y_pos:


mov	ah,0Dh
mov	cx,x_pos
mov	dx,y_pos
int	10h

; Сохраняем полученную величину
mov	color_number

Запись символа в режиме телетайпа - функция 0Eh

Функция обеспечивает запись символа на экран в режиме телетайпа: символ отображается в текущей позиции курсора, после чего курсор сдвигается вправо на одну позицию. При необходимости курсор автоматически перемещается на новую строку, а когда весь экран заполняется, происходит вертикальная свертка экрана. В последнем случае верхняя строка экрана исчезает, а снизу возникает новая пустая строка и курсор помещается в ее начало. В текстовых режимах цветовые атрибуты строк, возникающих из-за свертки экрана соответствуют атрибутам отображаемых символов.

Данная функция обрабатывает следующие управляющие символы: звуковой сигнал (7 - BELL), возврат курсора назад на одну позицию (8 - BACKSPACE), возврат каретки (0Dh - CARRIAGE RETURN) и перевод строки (0Ah - LINEFEED).

В текстовых режимах символы отображаются с атрибутами, использованными ранее. Атрибуты символов экрана не меняются и определяют цвет отображаемых символов. Если вам надо отобразить на экране символы различных цветов, вы должны предварительно установить атрибуты всех символов на экране.

В графических режимах цвет отображаемого символа задается регистром BL. Если бит D7 регистра AL содержит единицу, то пикселы символа накладываются на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ (за исключением режима 13h).

Ниже приведен формат вызова функции 0Eh:

На входе: AH 0Eh - запись символа в режиме телетайпа
  AL ASCII-код записываемого символа
  BH Номер страницы видеопамяти (только в текстовых режимах)?
  BL Цвет символа (в графических режимах)
На выходе:   Не используются

Приведем текст процедуры WriteStringT, которая выводит на экран строку, имеющую смещение SI в сегменте DS, при помощи функции 0Eh прерывания INT 10h (листинг 5.3).

Листинг 5.3. Файл WRITESTR.C


WriteStringT	PROC

	; Определяем текущую активную страницу экрана

	mov	ah,0Fh
	int	10h		; Номер активной страницы в регистре BH

	; В цикле выводим на экран символы строки

next_char:

	mov	ah,0Eh
	lodsb				; Получаем следующий символ строки
	cmp	al,0		; Находим конец строки
	je	exit_proc	; Если конец строки достигнут, то
						; оканчиваем процедуру
	int	10h

	jmp	next_char

exit_proc:

	ret

WriteStringT	ENDP

Определение текущего режима работы видеоадаптера - функция 0Fh

Функция позволяет определить номер текущего режима работы видеоадаптера, номер активной страницы и количество символов в строке экрана. Список различных режимов приведен в таблице 3.1. Формат функции имеет следующий вид:

На входе: AH 0Fh
На выходе: AH Количество символов в строке
  AL Номер текущего режима
  BH Номер активной страницы видеопамяти

Бит D7 регистра AL соответствует значению бита D7 регистра AL, использованному при предыдущем выборе режима работы видеоадаптера (см. функцию 0).

Управление регистрами палитры - функция 10h

Функция 10h предоставляет возможность программирования регистров цветовой палитры, таблицы цветов (для видеоадаптеров VGA и SVGA), а также управляет некоторыми атрибутами символов. Вы можете использовать эту функцию и в текстовых и в графических режимах.

Для видеоадаптера EGA эта функция содержит четыре подфункции:

Номер подфункции Назначение
0 Программирование одного регистра палитры
1 Программирование регистра цвета рамки
2 Программирование всех регистров палитры (таблицы цветов)
3 Управление атрибутом мигания и атрибутом интенсивности

Видеоадаптеры VGA и SVGA дополнительно поддерживают еще 10 подфункций:

Номер подфункции Назначение
7 Чтение регистра палитры
8 Чтение регистра цвета рамки
9 Чтение всех регистров палитры
10h Программирование регистра ЦАП
12h Программирование нескольких регистров ЦАП
13h Выбор подмножества цветов
15h Чтение регистра ЦАП
17h Чтение нескольких регистров ЦАП
1Ah Чтение состояния страницы цветов
1Bh Преобразование регистров ЦАП для работы в монохромном режиме

Установка регистра палитры - подфункция 00h

Функция выполняет запись в регистр палитры контроллера атрибутов:

На входе: AH 10h
  AL 00h - установка регистра палитры
  BL Номер регистра палитры для записи
  BH Данные, записываемые в регистр палитры
На выходе:   Не используются

Следующий фрагмент записывает в регистр палитры с номером reg_num содержимое переменной data:


mov	ah,10h		; Функция 10h
xor	al,al			; Подфункция 0h
mov	bl,num_reg	; Задаем номер регистра палитры
mov	bh,data		; Новое значение регистра
int	10h

Установка цвета рамки - подфункция 01h

Функция выполняет запись значения в регистр цвета рамки контроллера атрибутов. Надо иметь в виду, что эта функция не работает в некоторых режимах видеоадаптера EGA.

На входе: AH 10h
  AL 01h - установка цвета рамки
  BH Значение, записываемое в регистр (цвет)
На выходе:   Не используются

Программа BORDER, приведенная в листинге 5.4, использует подфункцию 01h для изменения цвета рамки экрана.

Листинг 5.4. Файл BORDER.C


#include <dos.h>
#include <stdio.h>
#include <conio.h>

void main(void);

// Главная функция
void main(void) {

	union REGS	inregs, outregs;
	unsigned char	i;

	// Пробуем 16 цветов для рамки
	for(i = 0; i < 16; i++) {

		// Функция управления контроллером атрибутов
		inregs.h.ah = 0x10;		

		// Подфункция установки цвета рамки
		inregs.h.al = 0x1;	

		// Номер нового цвета рамки
		inregs.h.bh = i;

		int86( 0x10, &inregs, &outregs );

		// Ожидаем нажатия на любую клавишу
		printf("\nДля изменения цвета рамки "
				 "нажмите любую клавишу...");
		getch();
	}
}

Установка всех регистров палитры - подфункция 02h

Функция обеспечивает быстрое заполнение новыми значениями всех регистров палитры и регистра цвета рамки. Новые значения регистров должны быть записаны перед вызовом функции в таблице размером 17 байт, расположенной в оперативной памяти компьютера. Байты 0 - 15 этой таблицы содержат новые значения для регистров палитры, а байт 16 новое значение для регистра цвета рамки.

На входе: AH 10h
  AL 02h - установка регистров палитры и регистра цвета рамки
  ES:DX Адрес таблицы с новыми значениями регистров
На выходе:   Не используются

Управление атрибутом мигания и атрибутом интенсивности - подфункция 03h

Управляет битом D7 байта атрибутов символа (см. главу "Атрибуты символов"):

На входе: AH 10h
  AL 03h - управление битом D7 байта атрибутов
  BL 0 - бит D7 байта атрибутов управляет интенсивностью фона символов (символы не мигают),
1 - бит D7 байта атрибутов управляет миганием символов
На выходе:   Не используются

Функция ControlBlinkIntens, представленная листингом 5.4, иллюстрирует использование подфункции 03h для управления атрибутами символов.

Листинг 5.4. Файл CNRBLINK.C


//===========================================================
// void ControlBlinkIntens(unsigneg char  blink)
// Функция управляет назначением бита D7 байта атрибутов
// символа
// Параметры:
// blink - если параметр функции равен нулю, то бит D7
// 	будет определять интенсивность фона символа. Если
// 	параметр равен единице, то бит D7 управляет миганием
// 	символа
//===========================================================
ControlBlinkIntens(unsigneg char  blink) {

	union REGS   inregs, outregs;

	// Функция управления контроллером атрибутов
	inregs.h.ah = 0x10;

	// Подфункция управления атрибутом мигания/интенсивности
	inregs.h.al = 0x3;

	inregs.h.bl = blink;
	int86( 0x10, &inregs, &outregs );
}

Чтение регистра палитры - подфункция 07h

Функция поддерживается только видеоадаптерами VGA и SVGA. Она позволяет прочитать содержимое любого регистра палитры:

На входе: AH 10h
  AL 07h - чтение регистра палитры
  BL Номер регистра палитры (0-15)
На выходе: BH Значение указанного регистра палитры

mov	ah,10h
mov	al,7h
mov	bl,num_reg
int	10h

mov	reg_value,bh

Чтение регистра цвета рамки - подфункция 08h

Функция поддерживается только видеоадаптерами VGA и SVGA. Позволяет прочитать содержимое регистра цвета рамки:

На входе: AH 10h
  AL 08h - чтение регистра цвета рамки
На выходе: BH Значение регистра цвета рамки

Чтение всех регистров палитры - подфункция 09h

Функция позволяет прочитать значения всех регистров палитры и регистра цвета рамки. Для чтения регистров надо зарезервировать буфер в оперативной памяти размером 17 байт. После вызова функции байты 0 - 15 этого буфера будут содержать значения соответствующих регистров палитры, а байт 16 - значение регистра цвета рамки.

На входе: AH 10h
  AL 9 - чтение всех регистров палитры
  ES:DX Указатель на буфер размером 17 байт
На выходе: ES:DX Указатель на буфер, заполненный значениями из регистров палитры и регистра цвета рамки

Приведем фрагмент программы, который считывает значения всех регистров палитры и регистра цвета рамки в буфер памяти buffer:


; Определяем адрес буфера для записи значений регистров
; палитры и регистра цвета рамки	

mov	ax,SEG buffer
mov	es,ax
mov	dx,OFFSET buffer

; Считываем значения всех регистров палитры и регистра
; цвета рамки

mov	ah,10h
mov	al,9				
int	10h

Установка регистра таблицы цветов (регистров ЦАП) - подфункция 10h

Функция производит запись 18-битной величины в один из 256 регистров таблицы цветов:

На входе: AH 10h
  AL 10h - установка регистра таблицы цветов
  BX Номер регистра таблицы цветов (0-255)
  DH Интенсивность красного цвета (6 бит)
  CH Интенсивность зеленого цвета (6 бит)
  CL Интенсивность синего цвета (6 бит)
На выходе:   Не используются

Пример использования функции установки одного регистра таблицы цветов приведен ниже:


mov	ah,10h

; Выбираем функцию установки регистра цветов
mov	al,ah

; Устанавливаем номер регистра таблицы цветов
mov	bx,num_reg

; Определяем величины красной, зеленой и синей составляющих
mov	dh,red
mov	ch,green
mov	cl,blue

int	10h

Установка нескольких регистров таблицы цветов (регистров ЦАП) - подфункция 12h

Функция производит запись 18-битной величины в несколько последовательно расположенных регистров таблицы цветов:

На входе: AH 10h
  AL 12h - установка нескольких регистров таблицы цветов
  BX Номер первого регистра таблицы цветов (0-255)
  CX Количество регистров для записи (1-256)
  ES:DX Адрес таблицы цветов
На выходе:   Не используются

Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значимыми являются только 6 младших бит.

Выбор подмножества цветов - подфункция 13h ???

Функция предназначена для выбора числа подмножеств цветов и выбора активного подмножества:

На входе: AH 10h
  AL 13h - выбор подмножества цветов
  BL 0 - выбор режима
  BH 0 - 4 подмножества из 64 цветов
1 - 16 подмножеств из 16 цветов
  BL 1 - выбор активного подмножества
  BH Номер подмножества (0-4 или 0-15)
На выходе:   Не используются

Приведем фрагмент программы использующий данную функцию:


; Выбираем режим (bh = 1)
mov	ah,10h
mov	al,13h
xor	bx,bx
inc	bh
int	10h

; Устанавливаем активное подмножество subset_num
mov	ah,10h
mov	al,13h
mov	bl,1
mov	bh,subset_num
int	10h

Чтение регистра таблицы цветов - подфункция 15h

Функция поддерживается только для видеоадаптеров VGA и SVGA. Она выполняет чтение одного из регистров таблицы цветов:

На входе: AH 10h
  AL 15h - чтение регистра таблицы цветов
  BL Номер регистра (0-255)
На выходе: DH Интенсивность красного цвета (6 бит)
  CH Интенсивность зеленого цвета (6 бит)
  CL Интенсивность синего цвета (6 бит)

Следующий пример позволяет считать значение регистра таблицы цветов с номером num_color_reg:


mov	ah,10h
mov	al,15h
mov	bx,num_color_reg
int	10h
mov	red_data,dh
mov	green_data,ch
mov	blue_data,cl

Чтение нескольких регистров таблицы цветов (регистров ЦАП) - подфункция 17h

Функция производит чтение 18-битовых значений из нескольких последовательно расположенных регистров таблицы цветов:

На входе: AH 10h
  AL 17h - чтение нескольких регистров таблицы цветов
  BL Номер первого регистра таблицы цветов (0 -255)
  CX Количество регистров для чтения (1-256)
  ES:DX Адрес буфера для таблицы цветов
На выходе: ES:DX Данные прочитанные из таблицы цветов

Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значащими являются только младшие 6 бит.

Определение режима подмножества цветов - подфункция 1Ah ???

Возвращает количество текущих цветовых подмножеств:

На входе: AH 10h
  AL 1Ah - определение числа цветовых подмножеств
На выходе: BL 0 - используются 4 цветовых подмножества по 64 цвета;
1 - используются 16 цветовых подмножеств по 16 цветов
  BH Номер подмножества, используемого в данный момент

mov	ah,10h
mov	al,1ah
int	10h
mov	num_subset,bh

Установка палитры из градаций серого цвета - подфункция 1Bh

Функция заполняет часть таблицы цветов значениями, соответствующими различным оттенкам серого цвета. Для каждого модифицируемого регистра таблицы цветов сначала читаются записанные в нем данные, а затем записываются обратно по следующему правилу: красного 30 - процентов, зеленого - 59 процентов и голубого - 11 процентов от считанного значения.

На входе: AH 10h
  AL 1Bh - установка палитры из градаций серого цвета
  BX Номер первого регистра таблицы цветов
  CX Количество модифицируемых регистров
На выходе:   Не используются

Следующий пример демонстрирует, как преобразовать таблицу цветов для отображения различных градаций серого цвета. Модифицируются значения регистров таблицы цветов, имеющих номера от first_num до end_num:


mov	ah,10h
mov	al,1Bh

; Номер первого модифицируемого регистра
mov	bx,first_num

; Номер последнего модифицируемого регистра
mov	cx,end_num

; Определяем число изменяемых регистров
sub	cx,bx
int	10h

Программа BIOSDAC демонстрирует использование функций BIOS для управления таблицей цветов. Исходный текст программы BIOSDAC представлен на листинге 5.5.

Листинг 5.5. Файл BIOSDAC.C


#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include "sysp.h"

typedef struct _RGB_ {
	unsigned char red;
	unsigned char green;
	unsigned char blue;
} RGB;

// Объявление функций
void	main(void);
void	SetVideoMode(unsigned char);
void	SetVgaDAC(unsigned, unsigned);
void	GrayScale(void);

//======================================================
// Главная функция
//======================================================
void main(void)
{
	RGB color_table[256];
	unsigned char   i,j;
	unsigned char   far *ptr;
	int error, x_num, y_num;
	unsigned seg_table,off_table;

	// Формируем новые значения для таблицы цветов
	for(j = 0; j < 4; j++) {
		for(i = 0; i < 64; i++) {
			(color_table[i+j*64]).red =
				(j == 0) ? i : (j == 4) ? i : 0;

			(color_table[i+j*64]).green =
				(j == 1) ? i : (j == 3) ? i : (j == 4) ? i : 0;

			(color_table[i+j*64]).blue =
				(j == 2) ? i : (j == 3) ? i : (j == 4) ? i : 0;
		}
	}

	// Устанавливаем режим номер 13h
	SetVideoMode(0x13);

	ptr = (unsigned char far*) &color_table[0];
	seg_table = FP_SEG(ptr);
	off_table = FP_OFF(ptr);

	// Загружаем таблицу цветов
	SetVgaDAC(seg_table,off_table);

	// Записываем данные в видеопамять
	ptr = (unsigned char far*) (FP_MAKE(0xA000, 0x0));

	for(y_num = 0; y_num < 200; y_num++) {
		for(x_num = 0; x_num < 320; x_num++) {
			*ptr = (unsigned char) x_num;
			ptr++;
		}
	}

	// Ожидаем нажатие на клавишу клавиатуры
	getch();

	// Преобразовываем данные в таблице цветов к серому цвету
	GrayScale();

	// Ожидаем нажатие на клавишу клавиатуры
	getch();

	// Устанавливаем текстовый режим
	SetVideoMode(0x3);
}

//======================================================
// Функция установки режима
//======================================================
void SetVideoMode( unsigned char vmode ) {

	union REGS regs;

	regs.h.ah = 0x0;
	regs.h.al = vmode;

	int86(0x10, &regs, &regs);
}

//======================================================
// Функция загрузки таблицы цветов
//======================================================
void SetVgaDAC(unsigned seg_table, unsigned off_table) {

	union REGS regs;
	struct SREGS segregs;

	regs.x.ax = 0x1012;
	regs.x.cx = 256;
	regs.x.bx = 0x00;

	segregs.es = seg_table;
	regs.x.dx = off_table;

	int86x(0x10, &regs, &regs, &segregs);
}

//======================================================
// Функция преобразования таблицы цветов в серый цвет
//======================================================
void GrayScale( void ) {

	union REGS regs;

	regs.x.ax = 0x101b;
	regs.x.cx = 256;
	regs.x.bx = 0x00;

	int86(0x10, &regs, &regs);
}

Загрузка таблиц знакогенератора - функция 11h

Функция 11h прерывания 10h предназначена для загрузки в видеопамять таблиц знакогенератора (наборов символов). При помощи данной функции можно загружать как стандартные таблицы знакогенератора, так и таблицы, самостоятельно разработанные программистом. Загружается либо вся таблица, либо ее часть. Функция позволяет легко русифицировать видеоадаптер (если это не видеоадаптер CGA или Hercules).

Функция 11h имеет одиннадцать различных подфункций, перечисленных ниже:

Номер подфункции Назначение
0 Загрузка таблиц знакогенератора
1 Загрузка стандартного монохромного набора символов
2 Загрузка стандартного набора символов видеоадаптера CGA
3 Выбор активных таблиц знакогенератора (EGA)
4 Загрузка стандартного набора символов видеоадаптера VGA и SVGA
20h Установка вектора прерывания 1Fh
21h Использование графического режима для отображения символов пользователя
22h Использование набора символов 8х14 из ПЗУ
23h Использование набора символов 8х8 из ПЗУ
24h Использование набора символов 8х16 из ПЗУ
30h Получение информации об используемом наборе символов

Для подфункций 0, 1, 2, 3 и 4 установка бита D4 в регистре AL вызывает перезагрузку регистров контроллера ЭЛТ. Вновь устанавливаются значения принятые по умолчанию для регистров формы курсора и регистра высоты символа текста. Если используется эта возможность, вызов функции должен происходить сразу после выбора режима работы видеоадаптера. В противном случае вызов функции 11h может привести к непредсказуемым последствиям.

Загрузка набора символов пользователя - подфункция 00h

Функция заменяет текущий набор символов знакогенератора или его часть набором символов, определенных пользователем. Таблица знакогенератора пользователя должна быть загружена в буфер оперативной памяти до вызова функции. После вызова она может быть удалена из памяти.

На входе: AH 11h
  AL 00h, 10h - загрузка набора символов пользователя
  CX Количество загружаемых символов. Может принимать значение от 1 до 256
  DX ASCII-код первого загружаемого символа. Используется для загрузки части набора символов
  BL Номер загружаемой таблицы знакогенератора - для видеоадаптера EGA доступны таблицы 0 - 3, для VGA и SVGA 0 - 7
  BH Количество байт, определяющих один символ в таблице символов
  ES:BP Адрес буфера, содержащего определение символов, загружаемых в таблицу знакогенератора
На выходе:   Не используются

Загрузка набора символов из BIOS - подфункция 01h

Функция загружает стандартный набор символов размера 8х14 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:

На входе: AH 11h
  AL 01h, 11h - загрузка набора символов 8х14
  BL Номер загружаемой таблицы знакогенератора (для видеоадаптера EGA доступны таблицы 0 - 3, для VGA 0 - 7)
На выходе:   Не используются

Загрузка набора символов из BIOS - подфункция 02h

Функция загружает стандартный набор символов CGA размера 8х8 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:

На входе: AH 11h
  AL 02h, 12h - загрузка набора символов размера 8х8 пикселов
  BL Номер загружаемой таблицы знакогенератора (для видеоадаптера EGA доступны таблицы 0 - 3, для VGA 0 - 7)
На выходе:   Не используются

Выбор активных таблиц знакогенератора - подфункция 03h

Программа через эту функцию может установить активные таблицы знакогенератора. Напомним, что видеоадаптер EGA имеет четыре таблицы, одна или две из которых могут быть активными, а VGA - восемь. Каждая таблица содержит 256 символов. Одновременно могут отображаться 512 символов. Номер используемой таблицы определяется битом D3 байта атрибутов символа.

На входе: AH 11h
  AL 03h - выбор активных таблиц знакогенератора
  BL Выбирает активные таблицы:
D1-D0 номер таблицы, используемой, когда бит D3 атрибута равен нулю;
D3-D2 номер таблицы используемой, когда бит D3 атрибута равен единице;
D4 только для VGA. Расширение для битов D0 и D1;
D5 только для VGA. Расширение для битов D2 и D3;
D7-D6 не используются
На выходе:   Не используются

Загрузка набора символов из BIOS - подфункция 04h

Функция загружает стандартный набор символов VGA размера 8х16 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:

На входе: AH 11h
AL 04h, 14h - загрузка набора символов размера 8х16 пикселов
  BL Номер загружаемой таблицы знакогенератора (для видеоадаптера VGA доступны таблицы 0 - 7)
На выходе:   Не используются

Установка вектора прерывания 1Fh - подфункция 20h

Используется в графических режимах 4, 5 и 6 (совместимых с CGA), если необходимо отображать одновременно больше 128 символов. Вектор 1Fh указывает на таблицу с дополнительными 128 символами, имеющими коды ASCII от 127 до 255. Программа должна поддерживать таблицы для дополнительных символов. Размер символов должен быть 8х8 пикселов.

На входе: AH 11h
  AL 20h - установка вектора прерывания 1Fh, который хранит адрес таблицы дополнительных символов
  ES:BP Адрес таблицы дополнительных символов, определенной пользователем
На выходе:   Не используются

Установка набора символов для графических режимов - подфункция 21h

Позволяет установить собственный набор символов для отображения текста в графических режимах видеоадаптера.

На входе: AH 11h
  AL 21h - установка вектора прерывания 43h
  ES:BP Адрес таблицы символов, определенной пользователем
  CX Количество байт, кодирующих один символ в таблице символов
  BL Количество строк текста, отображаемых на экране монитора:
0 - количество строк определяется регистром DL;
1 - 14 строк;
2 - 25 строк;
3 - 43 строки
  DL Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю
На выходе:   Не используются

Установка набора символов 8х14 из ПЗУ BIOS

На входе: AH 11h
  AL 22h - установка вектора прерывания 43h
  BL Количество строк текста, отображаемых на экране монитора:
0 - количество строк определяется регистром DL;
1 - 14 строк;
2 - 25 строк;
3 - 43 строки
  DL Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю
На выходе:   Не используются

Установка набора символов 8х8 из ПЗУ BIOS

На входе: AH 11h
  AL 23h установка вектора прерывания 43h
  BL Количество строк текста, отображаемых на экране монитора:
0 - количество строк определяется регистром DL;
1 - 14 строк;
2 - 25 строк;
3 - 43 строки
  DL Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю
На выходе:   Не используются

Установка набора символов 8х16 из ПЗУ BIOS

На входе: AH 11h
  AL 24h установка вектора прерывания 43h
  BL Количество строк текста, отображаемых на экране монитора:
0 - количество строк определяется регистром DL;
1 - 14 строк;
2 - 25 строк;
3 - 43 строки
  DL Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю
На выходе:   Не используются

Получение информации об используемом наборе символов - подфункция 30h

Функция позволяет получить информацию об используемом наборе символов - высоту символа, число текстовых строк на экране и т.д.

На входе: AH 11h
  AL 30h
  BH Тип запрашиваемой информации:
0 - вернуть содержимое вектора INT 1Fh;
1 - вернуть содержимое вектора INT 43h;
2 - вернуть указатель на набор символов размера 8х14 пикселов, расположенный в ПЗУ BIOS;
3 - вернуть указатель на набор символов размера 8х8 пикселов, расположенный в ПЗУ BIOS;
4 - вернуть указатель на символы с ASCII кодами от 127 до 255 (размера 8х8 пикселов), расположенные в ПЗУ BIOS;
5 - вернуть указатель на альтернативный набор символов размером 9х14 пикселов, расположенный в ПЗУ BIOS;
6 - вернуть указатель на набор символов размером 8х16 пикселов, расположенный в ПЗУ BIOS;
7 - вернуть указатель на альтернативный набор символов размером 9х16 пикселов, расположенный в ПЗУ BIOS
На выходе: CL Высота символов в пикселах
  DL Количество текстовых строк на экране - 1
  ES:BP Указатель на таблицу символов (значение зависит от значения регистра BH)

Определение конфигурации и выбор программы распечатки экрана - функция 12h

Функция 12h содержит девять различных подфункций:

Номер подфункции Назначение
10h Определение конфигурации видеоадаптера
20h Выбор программы печати экрана
30h Выбор количества линий развертки в текстовом режиме
31h Запрещение загрузки палитры цветов, принятой по умолчанию
32h Управление доступом к видеопамяти и регистрам видеоадаптера
33h Управление преобразованием серого цвета
34h Управление эмуляцией курсора видеоадаптера CGA
35h Выбор активного монитора (PS/2)
36h Гашение экрана монитора

Определение конфигурации видеоадаптера - подфункция 10h

Проверяет наличие видеоадаптеров EGA/VGA, а также позволяет получить данные о текущем состоянии видеоадаптера:

На входе: AH 12h
  BL 10h - определение конфигурации EGA/VGA
На выходе: BH Режим видеоадаптера устанавливаемый по умолчанию:
0 - цветной режим,
1 - монохромный режим
  BL Объем видеопамяти (для видеоадаптера EGA):
0 - 64 Кбайт,
1 - 128 Кбайт,
2 - 192 Кбайт,
3 - 256 Кбайт
  CH Биты управления дополнительным устройством
  CL Положение переключателей на плате видеоадаптера EGA

Если видеоадаптер, установленный на компьютере, не является видеоадаптером EGA, VGA или SVGA, то регистр BX не изменяет своего значения. Это можно использовать для проверки наличия видеоадаптеров EGA/VGA:


mov	ah, 12h

; Определение конфигурации EGA/VGA
mov	bl, 10h
mov	bh, 55h
int	10h

; Изменился ли регистр BX
cmp	bx, 5510h

; Если нет, то видеоадаптеры EGA/VGA не обнаружены
je 	ega_vga_not_found

Выбор программы печати экрана - подфункция 20h

Программа, распечатывающая содержимое экрана монитора по нажатию клавиши <Print Screen>, не работает в режиме 43 текстовых строк. Если вы желает иметь эту возможность, можете выбрать альтернативную программу печати экрана, воспользовавшись подфункцией номер 20h:

На входе: AH 12h
  BL 20h - выбор альтернативной программы печати экрана монитора
На выходе:   Не используются

Выбор количества линий развертки в текстовом режиме - подфункция 30h

Функция используется для получения на видеоадаптере VGA текстовых режимов, внешне не отличающихся от CGA или MDA.

На входе: AH 12h
  BL 30h - выбор числа линий развертки
  AL Количество строк развертки:
0 - 200 строк развертки, размер символа 8х8 пикселов,
1 - 350 строк развертки, размер символа 8х14 пикселов,
2 - 400 строк развертки, размер символа 8х16 пикселов
На выходе: AL 12h

Функция 30h возвращает в регистре AL значение 12h, если компьютер имеет видеоадаптер VGA или SVGA. Эта особенность может использоваться для определения типа видеоадаптера.

Запрещение переустановки палитры - подфункция 31h

Функция применяется для предотвращения перезагрузки таблицы цветов при выполнении операции выбора режима работы видеоадаптера VGA:

На входе: AH 12h
  BL 31h - запрещение переустановки палитры
  AL Разрешение/запрещение переустановки:
0 - разрешить загрузку палитры при выполнении операции выбора режима видеоадаптера,
1 - запретить загрузку палитры при выполнении операции выбора режима видеоадаптера
На выходе: AL 12h

Управление доступом к видеоадаптеру - подфункция 32h

Вызов функции позволяет запретить (разрешить) доступ к видеопамяти и регистрам адаптера VGA/SVGA.

На входе: AH 12h
  BL 32h - управление доступом к видеоадаптеру
  AL Разрешение/запрещение доступа:
0 - разрешить доступ,
1 - запретить доступ
На выходе: AL 12h

Управление преобразованием серого цвета - подфункция 33h

Поддерживается только видеоадаптерами VGA и SVGA. Если разрешено преобразование, то при загрузке регистров таблицы цветов (операцией выбора режима работы видеоадаптера или непосредственным вызовом функции загрузки этих регистров) происходит корректировка записываемых значений. После этого содержимое регистров будет соответствовать различным градациям серого цвета.

На входе: AH 12h
  BL 33h - управление преобразованием серого цвета
  AL Разрешение/запрещение преобразования:
0 - разрешить преобразование,
1 - запретить преобразование
На выходе: AL 12h

Приведем фрагмент программы, использующий функцию 33h для управления преобразованием серого цвета:


enable:

	; Разрешение преобразования содержимого регистров
	; таблицы цветов в шкалу градаций серого цвета
	xor	al,al
	jmp	conversion

disable:

	; Запрещение преобразования содержимого регистров
	; таблицы цветов
	mov	al,1

conversion:	

	mov	ah,12h
	mov	bl,33h
	int	10h

Эмуляция курсора CGA - подфункция 34h

Функция 34h управляет режимом эмуляции курсора CGA. При разрешении эмуляции курсора CGA, его размеры устанавливаются, исходя из того, что символы имеют высоту 8 пикселов.

На входе: AH 12h
  BL 34h - управление эмуляцией курсора CGA
  AL Разрешение/запрещение эмуляции курсора:
0 - разрешить эмуляцию,
1 - запретить эмуляцию
На выходе: AL 12h

Выбор активного монитора - подфункция 35h

Используется в системе PS/2 для переключения между видеоадаптером VGA, расположенным на системной плате компьютера, и дополнительным видеоадаптером. Функция работает даже если между видеоадаптерами существует конфликт по адресам видеопамяти или адресам портов ввода/вывода. Система PS/2 после загрузки в качестве первичного видеоадаптера использует дополнительный.

Программа, выполняющая переключение видеоадаптеров должна поддерживать 128-байтовый буфер для сохранения информации о состоянии неактивного видеоадаптера.

На входе: AH 12h
  BL 35h - выбор активного монитора для PS/2
  ES:DX Адрес буфера. Размер буфера должен составлять 128 байт
  AL 0 - выключить дополнительный видеоадаптер (должно быть использовано при первом вызове функции),
1 - включить видеоадаптера VGA, расположенный на системной плате (должно быть использовано при втором вызове функции),
2 - выключить активный видеоадаптер (используется в последующих вызовах функции),
3 - включить неактивный видеоадаптер (используется в последующих вызовах функции)
На выходе: AL 12h

Гашение экрана монитора - подфункция 36h

Видеоадаптеры VGA и SVGA имеют возможность гашения экрана монитора:

На входе: AH 12h
  BL 36h - управление гашением экрана монитора
  AL 0 - включить отображение информации на экране монитора,
1 - погасить экран монитора
На выходе: AL 12h

Функция возвращает в регистре AL значение 12h, если компьютер имеет видеоадаптер VGA.

Вывод текстовой строки - функция 13h

Функция 13h предоставляет широкие возможности для вывода текстовых строк на экран монитора. В зависимости от параметров функции, можно определять атрибуты как строки в целом (атрибуты всех символов одинаковы), так и отдельных символов строки. После вывода строки на экран, курсор может либо оставаться на месте, либо переместиться в позицию за последним символом только что выведенной строки.

Данная функция обрабатывает следующие управляющие символы: звуковой сигнал (BELL), перевод курсора на одну позицию назад (BACKSPACE), возврат каретки (CARRIAGE RETURN) и перевод строки (LINEFEED).

На входе: AH 13h - вывод строки на экран
  AL Режим отображения строки:
0 - курсор не перемещается, атрибуты символов в строке одинаковы и определяются значением регистра BL,
1 - курсор перемещается за конец отображаемой строки, атрибуты символов в строке одинаковы и определяются значением регистра BL,
2 - курсор не перемещается, атрибуты каждого символа задаются отдельно,
3 - курсор перемещается, атрибуты каждого символа задаются отдельно
  BH Номер страницы видеопамяти
  BL Атрибуты символов отображаемого текста. Используется если регистр AL содержит 0 или 1
  CX Длина отображаемой строки
  DH Номер строки экрана, в которой отображается текстовая строка
  DL Позиция в строке экрана с которой отображается текстовая строка
  ES:BP Адрес строки в оперативной памяти
На выходе:   Не используются

В режимах 2 и 3 атрибуты каждого символа задаются вперемежку с самими символами строки. Сначала идет ASCII-код символа, а затем его атрибут.

Чтение/запись конфигурации видеосистемы - функция 1Ah

Функция содержит две подфункции для чтения и записи текущей конфигурации видеосистемы компьютера.

Функция 1Ah реализована только для видеоадаптеров VGA и SVGA. Если после вызова функции регистр AL не содержит число 1Ah, это значит, что функция не поддерживается данным видеоадаптером и для определения конфигурации надо использовать другие способы.

Чтение конфигурации видеосистемы - подфункция 00h

При помощи этой функции можно определить конфигурацию видеосистемы компьютера:

На входе: AH 1Ah
  AL 00h - чтение конфигурации видеосистемы
На выходе: AL 1Ah
  BL Тип первичного видеоадаптера:
0 - монитор отсутствует, 1 - MDA с монохромным монитором, 2 - CGA с цветным монитором, 3 - EGA с улучшенным цветным монитором, 4 - EGA с цветным монитором, 5 - EGA с монохромным монитором, 6 - PGC (профессиональный графический контроллер); 7 - VGA с монохромным аналоговым монитором, 8 - VGA с цветным аналоговым монитором, 0Ah - MCGA с цветным цифровым монитором. 0Bh - MCGA с монохромным аналоговым монитором, 0Ch - MCGA с цветным аналоговым монитором
  BH Тип дополнительного видеоадаптера (см. регистр BL)

Запись конфигурации видеосистемы - подфункция 01h

Данная функция позволяет изменить информацию о конфигурации видеосистемы компьютера:

На входе: AH 1Ah
  AL 01h - запись конфигурации видеосистемы
  BL Тип первичного видеоадаптера (см. подфункцию 00h)
  BH Тип дополнительного видеоадаптера (см. подфункцию 00h)
На выходе: AL 1Ah

Получение данных о состоянии VGA - функция 1Bh

Функция позволяет получить различную информацию о видеоадаптере и мониторе. Программа, вызывающая данную функцию, должна зарезервировать буфер с размером 64 байта для получаемых данных.

На входе: AH 1Bh - получение данных о видеосистеме
  BX 00h
  ES:DI Адрес буфера для записи данных, 64 байта
На выходе: AL 1Bh
  ES:DI Буфер заполненный данными (см. таблицу ниже)

Формат буфера представлен в следующей таблице:

Смещение, байт Размер Содержание
0 Двойное слово Адрес статической таблицы функций (см. ниже)
4 Байт Номер текущего режима работы видеоадаптера
5 Слово Количество символов в строке
7 Слово Размер отображаемой области видеоданных (в байтах)
9 Слово Начальный адрес отображаемой области видеоданных
0Bh 8 слов Позиции курсоров для каждой из 8 страниц видеопамяти (одно слово на страницу). В старшем байте записан номер колонки, в младшем байте номер строки курсора
1Bh Байт Нижняя линия курсора
1Ch Байт Верхняя линия курсора
1Dh Байт Номер активной страницы видеопамяти
1Eh Слово Адрес индексного порта контроллера ЭЛТ (3B4/3D4)
20h Байт Состояние регистра 3x8h
21h Байт Состояние регистра 3x9h
22h Байт Количество текстовых строк на экране
23h Байт Высота символов текста в пикселах
25h Байт Код первичного видеоадаптера (см. функцию 1Ah подфункция 0h)
26h Байт Код дополнительного видеоадаптера (см. функцию 1Ah подфункция 0h)
27h Слово Количество одновременно отображаемых цветов в текущем режиме
29h Байт Количество страниц видеопамяти, доступных в текущем режиме
2Ah Байт Количество строк развертки в текущем режиме:
0 - 200;
1 - 350;
2 - 400;
3 - 480
2Bh Байт Номер первой таблицы знакогенератора
2Ch Байт Номер второй таблицы знакогенератора
2Dh Байт Байт, содержащий различные данные:
D0 не используется;
D1 бит равен единице, если разрешено преобразование палитры в серый цвет;
D2 бит равен единице, если подключен монохромный монитор;
D3 запрещена перезагрузка регистров палитры при выборе режима видеоадаптера;
D4 бит равен единице, если разрешена эмуляция курсора CGA;
D5 определяет назначение бита D3 байта атрибутов: если бит равен 1, то он управляет миганием символа, если бит равен нулю, то бит D3 управляет интенсивностью фона символа;
D7-D6 не используется
2Eh Байт Зарезервировано
2Fh Байт Зарезервировано
31h Байт Объем видеопамяти адаптера:
0 - 64 Кбайт,
1 - 128 Кбайт,
2 - 192 Кбайт,
3 - 256 Кбайт
32h Байт Состояние области сохранения: ???
D0 бит равен единице, если используется набор из 512 символов;
D1 бит равен единице, если используется область сохранения цветовой палитры;
D2 бит равен единице, если используется текстовый набор символов пользователя;
D3 бит равен единице, если используется графический набор символов пользователя;
D4 бит равен единице, если используется цветовая палитра, определенная пользователем;
D7-D5 зарезервировано
33h - 3Fh   Зарезервировано

Далее следует описание статической функциональной таблицы:

Смещение, байт Размер Содержание
0 Байт Таблица режимов работы видеоадаптера. Если бит равен единице, то режим поддерживается:
D0 Режим 00h;
D1 режим 01h;
D2 режим 02h;
D3 режим 03h;
D4 режим 04h;
D5 режим 05h;
D6 режим 06h;
D7 режим 07h
1 Байт D0 Режим 08h;
D1 режим 09h;
D2 режим 0Ah;
D3 режим 0Bh;
D4 режим 0Ch;
D5 режим 0Dh;
D6 режим 0Eh;
D7 режим 0Fh
2 Байт D0 Режим 10h;
D1 режим 11h;
D2 режим 12h;
D3 режим 13h;
D7-D4 Не используются
3 4 байта Зарезервировано
7 Байт Количество строк растра в текстовых режимах. Если бит равен единице, то режим поддерживается:
D0 200 строк растра;
D1 350 строк растра;
D2 400 строк растра;
D7-D3 не используются
8 Байт Количество таблиц знакогенератора, которые можно одновременно использовать (для текстовых режимов)
9 Байт Количество таблиц знакогенератора, доступных в текстовом режиме
0Ah Байт Биты имеют различное назначение: ???
D0 не используется;
D1 поддерживается преобразование таблицы цветов в серые цвета;
D2 поддерживается загрузка шрифтов пользователя;
D3 поддерживается загрузка цветовой палитры по умолчанию;
D4 поддерживается эмуляция курсора CGA;
D5 присутствует палитра EGA;
D6 присутствует таблица цветов;
D7 поддерживается функция выбора множества цветов
0Bh Байт Биты имеют различное назначение: ???
D0 поддерживается световое перо;
D1 сохранение/восстановление видеосостояний, поддерживается функция 1Ch;
D2 управление битом D3 байта атрибутов;
D3 код конфигурации монитора
D7-D4 не используются
0Ch 2 байта Зарезервировано
0Eh Байт Состояние указателя: ???
D0 бит равен единице, если поддерживается набор из 512 символов
D1 бит равен единице, если поддерживается область сохранения цветовой палитры
D2 бит равен единице, если поддерживается текстовый набор символов пользователя
D3 бит равен единице, если поддерживается графический набор символов пользователя
D4 бит равен единице, если поддерживается цветовая палитра, определенная пользователем
D7-D5 зарезервировано
0Fh Байт Зарезервировано

Сохранение/восстановление состояния видеоадаптера - функция 1Ch

Функция имеет три подфункции, при помощи которых программа может быстро переключать режимы работы видеоадаптера:

Номер подфункции Назначение
00h Определение размера буфера, необходимого для сохранения текущего состояния видеоадаптера
01h Сохранение текущего состояния видеоадаптера
02h Восстановление текущего состояния видеоадаптера

Необходимо отметить, что данная функция поддерживается только для видеоадаптеров VGA и SVGA. Функцию можно использовать при переключении режима видеоадаптера в резидентных программах и мультизадачных системах.

Определение размера буфера - подфункция 00h

Функция определяет размер буфера, необходимый для сохранения текущего состояния видеоадаптера. Буфер должен быть зарезервирован до вызова функции сохранения состояния видеоадаптера.

На входе: AH 1Ch
  AL 00h - определение размера буфера
  CX Тип данных, который необходимо сохранить (1 - надо сохранять, 0 - не надо сохранять):
D0 - регистры видеоадаптера,
D1 - область переменных BIOS,
D2 - таблица цветов (регистры ЦАП)
На входе: AL 1Ch
  BX Размер буфера в 64-байтных блоках

Сохранение текущего состояния видеоадаптера - подфункция 01h

Функция записывает данные состояния видеоадаптера в буфер, размер которого определяется подфункцией 00h.

На входе: AH 1Ch
  AL 01h - сохранение состояния видеоадаптера
  CX Тип данных, который необходимо сохранить:
D0 - регистры видеоадаптера,
D1 - область переменных BIOS,
D2 - таблица цветов (регистры ЦАП)
  ES:BX Адрес буфера для сохраняемых данных
На выходе: AL 1Ch

Восстановление текущего состояния видеоадаптера - подфункция 02h

Функция восстанавливает состояние видеоадаптера из буфера, заполненного подфункцией 01h.

На входе: AH 1Ch
  AL 02h - восстановление состояния видеоадаптера
  CX Тип восстанавливаемых данных:
D0 - регистры видеоадаптера,
D1 - область переменных BIOS,
D2 - таблица цветов (регистры ЦАП)
  ES:BX Адрес буфера данных состояния видеоадаптера
На выходе: AL 1Ch

Русификация видеоадаптеров

Видеоадаптеры поддерживают стандартную расширенную таблицу ASCII символов. Если эта таблица не содержит образов символов кириллицы, то ваш компьютер не может отображать их на экране. Однако в некоторых случаях стандартную таблицу символов можно перекодировать, заменив образы некоторых символов на образы символов кириллицы. В этом приложении мы рассмотрим вопрос "русификации" видеоадаптеров CGA, EGA и VGA.

У видеоадаптера CGA таблицы знакогенератора, определяющие символы, которые можно отобразить на экране монитора в текстовых режимах находятся в ПЗУ, которое расположено вне адресного пространства процессора. Программы не имеют возможности изменить или даже считать информацию из этих таблиц. Поэтому для "русификации&quot; текстовых режимов видеоадаптера CGA необходимо перепрограммировать ПЗУ знакогенератора. Единственной возможностью отобразить на CGA русские буквы не перепрограммируя ПЗУ является использование графических режимов работы адаптера. В графических режимах вы можете сами определить образы символов с ASCII кодами от 128 до 255. Образы символов с ASCII кодами от 0 до 127 изменить не перепрограммируя ПЗУ нельзя.

Как определить образы символов с кодами 128 - 255? Для этого надо составить таблицу шрифтов в которой описаны образы символов с кодами 128 - 255. Для видеоадаптера CGA, размеры символов которого равны 8х8 пикселов описание образа каждого символа состоит из восьми байт. Первый байт описывает первую линию символа, второй - вторую и так далее. Если биты данных, описывающих символы, равны единице, соответствующие пикселы на линии символа будут отображаться светлыми пикселами. Остальные пикселы будут темными.

На рисунке 5.2 приведен пример определения образа символа 'А'.

Рисунок 5.2 Определение образа символа

В этом примере образ символа 'А' определяется байтами 00h, 0Eh, 12h, 22h, 3Eh, 22h, 22h, 22h.

Составив таблицу шрифтов надо записать адрес этой таблицы в векторе прерывания 1Fh. После этого можно выводить определенные вами символы на экран.

Для видеоадаптеров EGA и VGA задача русификации облегчается, так как вы имеете доступ к таблицам шрифтов и можете изменять их.

При установке текстовых режимов работы видеоадаптеров EGA и VGA, BIOS загружает таблицы знакогенератора из ПЗУ во второй цветовой слой видеопамяти. Впоследствии эти таблицы используются при отображении символов на экране.

Благодаря этому, можно легко заменить стандартную таблицу знакогенератора своей собственной. BIOS видеоадаптеров EGA и VGA содержит специальную функцию прерывания 10h, которая управляет загрузкой шрифтов. Это функция номер 11h.

Таблица шрифтов для текстовых режимов видеоадаптеров EGA и VGA имеет тот же формат что и таблица шрифтов графических режимов для CGA за исключением того, что образ каждого символа задается не восемью байтами, а четырнадцатью для EGA и шестнадцатью для VGA.

В графических режимах вы можете полностью заменить образы всех символов, а не только символов, имеющих ASCII коды от 128 до 255. В этом случае вместо вектора 1Fh на таблицу символов должен указывать вектор 43h.

Теперь мы приведем небольшую резидентную программу для "русификации" видеоадаптеров. Эта программа активизируется при изменении прикладной программой режима работы видеоадаптера и при загрузке шрифтов из ПЗУ. В этих случаях перед возвратом в прикладную программу она заново загружает свои таблицы шрифтов.

После запуска этой программы вы можете отображать символы кириллицы как в графических, так и в текстовых режимах.

Итак текст программы:

Листинг 5.6. Файл RUS_DRV.ASM


TITLE		RUS_DRV

.MODEL	tiny

DOSSEG

; Сегмент кода
.CODE

; Выполняем инициализацию сегментных регистров
.STARTUP

	jmp	start

	; Файл CGA_FONT.INC содержит описание шрифта 8х8 пикселов
	include CGA_FONT.INC

	; Файл EGA_FONT.INC содержит описание шрифта 8х14 пикселов
	include EGA_FONT.INC

	; Файл VGA_FONT.INC содержит описание шрифта 8х16 пикселов
	include VGA_FONT.INC


	; Информация о программе, отображается на экране при
	; ее запуске

	hello_msg	DB  254, "  Драйвер русских букв.", 13, 10
			DB  254, "  Copyright (C) Фролов Г.В., 1992-1995"
			DB  13, 10, "$"

; В следующие две переменные будет записан старый вектор
; прерывания 10h
	off_int_10h	DW	?
	seg_int_10h	DW	?

	not_clr		DB	?

; Начало программы
start:

	; Получаем и сохраняем старый вектор прерывания 10h

	mov	ax,3510h
	int	21h
	mov	off_int_10h,bx
	mov	seg_int_10h,es

	; Устанавливаем новый обработчик прерывания 10h
	mov	dx,OFFSET int_10h
	mov	ax,2510h
	int	21h

	; Устанавливаем режим 3 видеоадаптера
	; при этом сразу загружаются новые шрифты
	mov	ax,3
	int	10h

	; Выводим сообщение о программе
	; Данная функция описана в главе "Использование функций
	; MS-DOS для управления видеоадаптерами"
	mov	ah, 9h
	mov	dx, OFFSET hello_msg
	int	21h

	; Завершаем программу, и оставляем ее резидентной в памяти
	mov	ax,3100h
	mov	dx,OFFSET resident
	shr	dx,1
	shr	dx,1
	shr	dx,1
	shr	dx,1
	inc	dx
	int	21h

;------------------------------------------------------------
; Новый обработчик прерывания INT 10h
;------------------------------------------------------------

int_10h:

	; Проверяем, вызвана ли функция установки режима адаптера
	or 	ah,ah
	jz 	set_mode  ; да
	jmp	char_gen  ; нет

set_mode:

	; Когда вызвана функция установки режима адаптера, то
	; записываем в переменную not_clr 0h, если при установке
	; нового режима надо очистить видеопамять и 80h в
	; противном случае

	mov	cs:not_clr,0
	test	al,80h
	jz 	test_mode

	mov	cs:not_clr,80h

	; Сбрасываем бит D8, его содержимое находится в not_clr
	and	al,7Fh

test_mode:

	; Затем сохраняем значения регистров процессора
	push	ax
	push	bx
	push	dx
	push	bp
	push	es
	push	ds

	push	cs
	pop	ds

	; Определяем, какой режим надо установить

	; Текстовые режимы 0 - 3
	cmp	al,3
	jbe	text_0_3

	; Текстовый режим 7
	cmp	al,7
	je 	text_7

	; Графические режимы 4 - 0Eh
	cmp	al,0Eh
	jbe	graph_Eh

	; Графический режим 13h
	cmp	al,13h
	je 	graph_13h

	; Графические режимы 0Eh - 10h
	cmp	al,10h
	jbe	graph_10h

	; Графические режимы 11h и 12h
	cmp	al,12h
	jbe	graph_12h

	; Если режим нестандартный, передаем управление BIOS
	; для его установки и не загружаем свой шрифт
	jmp	old_int_10h

; Текстовые режимы 0, 1, 2, 3, 7
text_0_3:
text_7:

	; Восстанавливаем регистр AX
	or 	al,cs:not_clr

	; Вызываем старый обработчик прерывания 10h
	; для установки нового режима

	pushf
	call	DWORD PTR cs:off_int_10h

	; Получаем в BX высоту символов текста в пикселах
	; для установленного выше режима

	; Высота символов записывается BIOS при выборе нового
	; режима в переменную по адресу 0000:0485h

	xor	dx,dx
	mov	es,dx
	mov	bx,es:[485h]

	; В соответствии с полученной нами высотой символа
	; выбираем шрифт 8х8, 8х14 или 8х16 пикселов
	cmp	bx,8	    ; высота символов 8 пикселов
	jne	line_14

	; Загружаем в регистр BP смещение таблицы шрифтов 8х8,
	; таблица шрифтов 8х8 пикселов определена в файле
	; CGA_FONT.INC
	mov	bp,OFFSET fon8_ascii0
	jmp	set_text_font

line_14:

	cmp	bx,14	   ; высота символов 14 пикселов
	jne	line_16

	; Загружаем в регистр BP смещение таблицы шрифтов 8х14,
	; таблица шрифтов 8х14 пикселов определена в файле
	; EGA_FONT.INC
	mov	bp,OFFSET fon14_ascii0
	jmp	set_text_font

line_16:

	cmp	bx,16

	; Если полученная высота символов не равна 8, 14 и 16
	; завершаем обработку
	jne	exit_int_10h

	; Загружаем в регистр BP смещение таблицы шрифтов 8х16,
	; таблица шрифтов 8х16 пикселов определена в файле
	; VGA_FONT.INC
	mov	bp,OFFSET fon16_ascii0

set_text_font:

	; Загружаем наш шрифт в память
	mov	ax,1100h

	push	cs
	pop	es

	xchg	bl,bh
	mov	cx,256

old_int_10h:

	; Вызываем старый обработчик прерывания 10h
	pushf
	call	DWORD PTR cs:off_int_10h

exit_int_10h:

	; Восстанавливаем содержимое регистров процессора
	pop	ds
	pop	es
	pop	bp
	pop	dx
	pop	bx
	pop	ax

	; Завершаем обработку прерывания, возвращаем
	; управление вызывающей программе
	iret

; Вызывющая программа устанавливает
; графические режимы 4, 5, 6, 0Dh, 0Eh
graph_Eh:
graph_13h:

	; Вызываем старый обработчик прерывания 10h
	; для установки нового режима
	pushf
	call	DWORD PTR cs:off_int_10h

	; Подготавливаем регистры для выбора шрифта 8х8
	mov	dx,OFFSET fon8_ascii0
	mov	bp,OFFSET fon8_ascii128
	jmp	set_gr_font

	; Вызывющая программа устанавливает графические режимы
	; 0Fh, 10h

graph_10h:

	; Вызываем старый обработчик прерывания 10h
	; Для установки нового режима
	pushf
	call	DWORD PTR cs:off_int_10h

	; Подготавливаем регистры для выбора шрифта 8х8
	mov	dx,OFFSET fon14_ascii0
	mov	bp,OFFSET fon14_ascii128
	jmp	set_gr_font

	; Вызывющая программа устанавливает графические режимы
	; 11Dh, 12h

graph_12h:

	; Вызываем старый обработчик прерывания 10h
	; для установки нового режима
	pushf
	call	DWORD PTR cs:off_int_10h

	; Подготавливаем регистры для выбора шрифта 8х8
	mov	dx,OFFSET fon16_ascii0
	mov	bp,OFFSET fon16_ascii128

set_gr_font:

	; Устанавливаем наши графические шрифты,
	; изменяя векторы прерываний 1Fh и 43h
	mov	ax,2543h
	int	21h

	mov	dx,bp

	mov	ax,251Fh
	int	21h

	; Завершаем обработку прерывания
	jmp	exit_int_10h

	; Если вызывающая программа вызвала не функцию
	; установки режима, проверяем вызвана ли
	; функция выбора нового шрифта

char_gen:

	cmp	ah,11h
	je	gen_func

	; Если нет, передаем управление старому обработчику

go_int_10h:

	pushf
	call	DWORD PTR cs:off_int_10h
	iret

gen_func:

	; Если вызывается функция установки нового шрифта, то
	; смотрим какая вызывается подфункция

	; Вызывается подфункция загрузки шрифта 8х8 из BIOS
	cmp	al,1
	je 	text_rom_8_14

	; Вызывается подфункция загрузки шрифта 8х8 из BIOS
	; с переустановкой контроллера ЭЛТ
	cmp	al,11h
	je 	text_rom_8_14

	; Вызывается подфункция загрузки шрифта 8х14 из BIOS
	cmp	al,2
	je 	text_rom_8_8

	; Вызывается подфункция загрузки шрифта 8х14 из BIOS
	; с переустановкой контроллера ЭЛТ
	cmp	al,12h
	je 	text_rom_8_8

	; Вызывается подфункция загрузки шрифта 8х16 из BIOS
	cmp	al,4
	je 	text_rom_8_16

	; Вызывается подфункция загрузки шрифта 8х16 из BIOS
	; с переустановкой контроллера ЭЛТ
	cmp	al,14h
	je 	text_rom_8_16

	; Если вызывается другая подфункция, то передаем
	; управление старому обработчику прерываний
	jmp	go_int_10h

text_rom_8_8:

	; Выбираем шрифт 8х8 пикселов
	mov	bp,OFFSET fon8_ascii0
	mov	bh,8
	jmp	set_our_text_font

text_rom_8_14:

	; Выбираем шрифт 8х14 пикселов
	mov	bp,OFFSET fon14_ascii0
	mov	bh,14
	jmp	set_our_text_font

text_rom_8_16:

	; Выбираем шрифт 8х16 пикселов
	mov	bp,OFFSET fon16_ascii0
	mov	bh,16

set_our_text_font:

	; Устанавливаем свой шрифт
	and	al,0f0h
	push	cs
	pop	es

	mov	cx,256
	xor	dx,dx

	; Вызываем старый обработчик прерывания 10h
	pushf
	call	DWORD PTR cs:off_int_10h
	iret

resident:

END

Теперь приведем таблицы шрифтов с описаниями образов символов, имеющих размер 8х8, 8х14 и 8х16 пикселов. Эти таблицы содержат описания русских символов согласно стандартной расширенной кодовой таблице ASCII символов номер 437. Символы с ASCII-кодами от 248 до 255 не соответствуют этой таблице.

В листинге 5.7 представлена таблица шрифтов размера 8х8 пикселов, содержащая русские символы. Каждый символ определяется восемью байтами.

Листинг 5.7. Файл CGA_FONT.INC


fon8_ascii0     DB   000h,000h,000h,000h,000h,000h,000h,000h
fon8_ascii1     DB   07Eh,081h,0A5h,081h,0BDh,099h,081h,07Eh
fon8_ascii2     DB   07Eh,0FFh,0DBh,0FFh,0C3h,0E7h,0FFh,07Eh
fon8_ascii3     DB   06Ch,0FEh,0FEh,0FEh,07Ch,038h,010h,000h
fon8_ascii4     DB   010h,038h,07Ch,0FEh,07Ch,038h,010h,000h
fon8_ascii5     DB   038h,07Ch,038h,0FEh,0FEh,07Ch,038h,07Ch
fon8_ascii6     DB   010h,010h,038h,07Ch,0FEh,07Ch,038h,07Ch
fon8_ascii7     DB   000h,000h,018h,03Ch,03Ch,018h,000h,000h
fon8_ascii8     DB   0FFh,0FFh,0E7h,0C3h,0C3h,0E7h,0FFh,0FFh
fon8_ascii9     DB   000h,03Ch,066h,042h,042h,066h,03Ch,000h
fon8_ascii10    DB   0FFh,0C3h,099h,0BDh,0BDh,099h,0C3h,0FFh
fon8_ascii11    DB   00Fh,007h,00Fh,07Dh,0CCh,0CCh,0CCh,078h
fon8_ascii12    DB   03Ch,066h,066h,066h,03Ch,018h,07Eh,018h
fon8_ascii13    DB   03Fh,033h,03Fh,030h,030h,070h,0F0h,0E0h
fon8_ascii14    DB   07Fh,063h,07Fh,063h,063h,067h,0E6h,0C0h
fon8_ascii15    DB   099h,05Ah,03Ch,0E7h,0E7h,03Ch,05Ah,099h
fon8_ascii16    DB   080h,0E0h,0F8h,0FEh,0F8h,0E0h,080h,000h
fon8_ascii17    DB   002h,00Eh,03Eh,0FEh,03Eh,00Eh,002h,000h
fon8_ascii18    DB   018h,03Ch,07Eh,018h,018h,07Eh,03Ch,018h
fon8_ascii19    DB   066h,066h,066h,066h,066h,000h,066h,000h
fon8_ascii20    DB   07Fh,0DBh,0DBh,07Bh,01Bh,01Bh,01Bh,000h
fon8_ascii21    DB   03Eh,063h,038h,06Ch,06Ch,038h,0CCh,078h
fon8_ascii22    DB   000h,000h,000h,000h,07Eh,07Eh,07Eh,000h
fon8_ascii23    DB   018h,03Ch,07Eh,018h,07Eh,03Ch,018h,0FFh
fon8_ascii24    DB   018h,03Ch,07Eh,018h,018h,018h,018h,000h
fon8_ascii25    DB   018h,018h,018h,018h,07Eh,03Ch,018h,000h
fon8_ascii26    DB   000h,018h,00Ch,0FEh,00Ch,018h,000h,000h
fon8_ascii27    DB   000h,030h,060h,0FEh,060h,030h,000h,000h
fon8_ascii28    DB   000h,000h,0C0h,0C0h,0C0h,0FEh,000h,000h
fon8_ascii29    DB   000h,024h,066h,0FFh,066h,024h,000h,000h
fon8_ascii30    DB   000h,018h,03Ch,07Eh,0FFh,0FFh,000h,000h
fon8_ascii31    DB   000h,0FFh,0FFh,07Eh,03Ch,018h,000h,000h
fon8_ascii32    DB   000h,000h,000h,000h,000h,000h,000h,000h
fon8_ascii33    DB   030h,078h,078h,030h,030h,000h,030h,000h
fon8_ascii34    DB   06Ch,06Ch,06Ch,000h,000h,000h,000h,000h
fon8_ascii35    DB   06Ch,06Ch,0FEh,06Ch,0FEh,06Ch,06Ch,000h
fon8_ascii36    DB   030h,07Ch,0C0h,078h,00Ch,0F8h,030h,000h
fon8_ascii37    DB   000h,0C6h,0CCh,018h,030h,066h,0C6h,000h
fon8_ascii38    DB   038h,06Ch,038h,076h,0DCh,0CCh,076h,000h
fon8_ascii39    DB   060h,060h,0C0h,000h,000h,000h,000h,000h
fon8_ascii40    DB   018h,030h,060h,060h,060h,030h,018h,000h
fon8_ascii41    DB   060h,030h,018h,018h,018h,030h,060h,000h
fon8_ascii42    DB   000h,066h,03Ch,0FFh,03Ch,066h,000h,000h
fon8_ascii43    DB   000h,030h,030h,0FCh,030h,030h,000h,000h
fon8_ascii44    DB   000h,000h,000h,000h,000h,030h,030h,060h
fon8_ascii45    DB   000h,000h,000h,0FCh,000h,000h,000h,000h
fon8_ascii46    DB   000h,000h,000h,000h,000h,030h,030h,000h
fon8_ascii47    DB   006h,00Ch,018h,030h,060h,0C0h,080h,000h
fon8_ascii48    DB   07Ch,0C6h,0CEh,0DEh,0F6h,0E6h,07Ch,000h
fon8_ascii49    DB   030h,070h,030h,030h,030h,030h,0FCh,000h
fon8_ascii50    DB   078h,0CCh,00Ch,038h,060h,0CCh,0FCh,000h
fon8_ascii51    DB   078h,0CCh,00Ch,038h,00Ch,0CCh,078h,000h
fon8_ascii52    DB   01Ch,03Ch,06Ch,0CCh,0FEh,00Ch,01Eh,000h
fon8_ascii53    DB   0FCh,0C0h,0F8h,00Ch,00Ch,0CCh,078h,000h
fon8_ascii54    DB   038h,060h,0C0h,0F8h,0CCh,0CCh,078h,000h
fon8_ascii55    DB   0FCh,0CCh,00Ch,018h,030h,030h,030h,000h
fon8_ascii56    DB   078h,0CCh,0CCh,078h,0CCh,0CCh,078h,000h
fon8_ascii57    DB   078h,0CCh,0CCh,07Ch,00Ch,018h,070h,000h
fon8_ascii58    DB   000h,030h,030h,000h,000h,030h,030h,000h
fon8_ascii59    DB   000h,030h,030h,000h,000h,030h,030h,060h
fon8_ascii60    DB   018h,030h,060h,0C0h,060h,030h,018h,000h
fon8_ascii61    DB   000h,000h,0FCh,000h,000h,0FCh,000h,000h
fon8_ascii62    DB   060h,030h,018h,00Ch,018h,030h,060h,000h
fon8_ascii63    DB   078h,0CCh,00Ch,018h,030h,000h,030h,000h
fon8_ascii64    DB   07Ch,0C6h,0DEh,0DEh,0DEh,0C0h,078h,000h
fon8_ascii65    DB   030h,078h,0CCh,0CCh,0FCh,0CCh,0CCh,000h
fon8_ascii66    DB   0FCh,066h,066h,07Ch,066h,066h,0FCh,000h
fon8_ascii67    DB   03Ch,066h,0C0h,0C0h,0C0h,066h,03Ch,000h
fon8_ascii68    DB   0F8h,06Ch,066h,066h,066h,06Ch,0F8h,000h
fon8_ascii69    DB   0FEh,062h,068h,078h,068h,062h,0FEh,000h
fon8_ascii70    DB   0FEh,062h,068h,078h,068h,060h,0F0h,000h
fon8_ascii71    DB   03Ch,066h,0C0h,0C0h,0CEh,066h,03Eh,000h
fon8_ascii72    DB   0CCh,0CCh,0CCh,0FCh,0CCh,0CCh,0CCh,000h
fon8_ascii73    DB   078h,030h,030h,030h,030h,030h,078h,000h
fon8_ascii74    DB   01Eh,00Ch,00Ch,00Ch,0CCh,0CCh,078h,000h
fon8_ascii75    DB   0E6h,066h,06Ch,078h,06Ch,066h,0E6h,000h
fon8_ascii76    DB   0F0h,060h,060h,060h,062h,066h,0FEh,000h
fon8_ascii77    DB   0C6h,0EEh,0FEh,0FEh,0D6h,0C6h,0C6h,000h
fon8_ascii78    DB   0C6h,0E6h,0F6h,0DEh,0CEh,0C6h,0C6h,000h
fon8_ascii79    DB   038h,06Ch,0C6h,0C6h,0C6h,06Ch,038h,000h
fon8_ascii80    DB   0FCh,066h,066h,07Ch,060h,060h,0F0h,000h
fon8_ascii81    DB   078h,0CCh,0CCh,0CCh,0DCh,078h,01Ch,000h
fon8_ascii82    DB   0FCh,066h,066h,07Ch,06Ch,066h,0E6h,000h
fon8_ascii83    DB   078h,0CCh,0E0h,070h,01Ch,0CCh,078h,000h
fon8_ascii84    DB   0FCh,0B4h,030h,030h,030h,030h,078h,000h
fon8_ascii85    DB   0CCh,0CCh,0CCh,0CCh,0CCh,0CCh,0FCh,000h
fon8_ascii86    DB   0CCh,0CCh,0CCh,0CCh,0CCh,078h,030h,000h
fon8_ascii87    DB   0C6h,0C6h,0C6h,0D6h,0FEh,0EEh,0C6h,000h
fon8_ascii88    DB   0C6h,044h,06Ch,038h,038h,06Ch,0C6h,000h
fon8_ascii89    DB   0CCh,0CCh,0CCh,078h,030h,030h,078h,000h
fon8_ascii90    DB   0FEh,0C6h,08Ch,018h,032h,066h,0FEh,000h
fon8_ascii91    DB   078h,060h,060h,060h,060h,060h,078h,000h
fon8_ascii92    DB   0C0h,060h,030h,018h,00Ch,006h,002h,000h
fon8_ascii93    DB   078h,018h,018h,018h,018h,018h,078h,000h
fon8_ascii94    DB   010h,038h,06Ch,0C6h,000h,000h,000h,000h
fon8_ascii95    DB   000h,000h,000h,000h,000h,000h,000h,0FFh
fon8_ascii96    DB   030h,030h,018h,000h,000h,000h,000h,000h
fon8_ascii97    DB   000h,000h,078h,00Ch,07Ch,0CCh,07Ch,000h
fon8_ascii98    DB   060h,060h,060h,07Ch,066h,066h,07Ch,000h
fon8_ascii99    DB   000h,000h,078h,0CCh,0C0h,0CCh,078h,000h
fon8_ascii100   DB   00Ch,00Ch,00Ch,07Ch,0CCh,0CCh,07Ch,000h
fon8_ascii101   DB   000h,000h,078h,0CCh,0FCh,0C0h,078h,000h
fon8_ascii102   DB   038h,06Ch,060h,0F0h,060h,060h,0F0h,000h
fon8_ascii103   DB   000h,000h,07Ch,0CCh,0CCh,07Ch,00Ch,0F8h
fon8_ascii104   DB   060h,060h,07Ch,066h,066h,066h,066h,000h
fon8_ascii105   DB   030h,000h,070h,030h,030h,030h,078h,000h
fon8_ascii106   DB   00Ch,000h,00Ch,00Ch,00Ch,00Ch,06Ch,038h
fon8_ascii107   DB   060h,060h,066h,06Ch,078h,06Ch,066h,000h
fon8_ascii108   DB   070h,030h,030h,030h,030h,030h,078h,000h
fon8_ascii109   DB   000h,000h,0CCh,0FEh,0FEh,0D6h,0C6h,000h
fon8_ascii110   DB   000h,000h,0F8h,0CCh,0CCh,0CCh,0CCh,000h
fon8_ascii111   DB   000h,000h,078h,0CCh,0CCh,0CCh,078h,000h
fon8_ascii112   DB   000h,000h,07Ch,066h,066h,07Ch,060h,060h
fon8_ascii113   DB   000h,000h,07Ch,0CCh,0CCh,07Ch,00Ch,00Ch
fon8_ascii114   DB   000h,000h,0DCh,076h,066h,060h,0F0h,000h
fon8_ascii115   DB   000h,000h,07Ch,0C0h,078h,00Ch,0F8h,000h
fon8_ascii116   DB   010h,030h,07Ch,030h,030h,034h,018h,000h
fon8_ascii117   DB   000h,000h,0CCh,0CCh,0CCh,0CCh,07Ch,000h
fon8_ascii118   DB   000h,000h,0CCh,0CCh,0CCh,078h,030h,000h
fon8_ascii119   DB   000h,000h,0C6h,0D6h,0FEh,0FEh,06Ch,000h
fon8_ascii120   DB   000h,000h,0C6h,06Ch,038h,06Ch,0C6h,000h
fon8_ascii121   DB   000h,000h,0CCh,0CCh,0CCh,07Ch,00Ch,0F8h
fon8_ascii122   DB   000h,000h,0FCh,098h,030h,064h,0FCh,000h
fon8_ascii123   DB   01Ch,030h,030h,0E0h,030h,030h,01Ch,000h
fon8_ascii124   DB   018h,018h,018h,000h,018h,018h,018h,000h
fon8_ascii125   DB   0E0h,030h,030h,01Ch,030h,030h,0E0h,000h
fon8_ascii126   DB   076h,0DCh,000h,000h,000h,000h,000h,000h
fon8_ascii127   DB   000h,010h,038h,06Ch,0C6h,0C6h,0FEh,000h
fon8_ascii128   DB   01Eh,036h,066h,066h,07Eh,066h,066h,000h
fon8_ascii129   DB   07Ch,060h,060h,07Ch,066h,066h,07Ch,000h
fon8_ascii130   DB   07Ch,066h,066h,07Ch,066h,066h,07Ch,000h
fon8_ascii131   DB   07Eh,060h,060h,060h,060h,060h,060h,000h
fon8_ascii132   DB   038h,06Ch,06Ch,06Ch,06Ch,06Ch,0FEh,0C6h
fon8_ascii133   DB   07Eh,060h,060h,07Ch,060h,060h,07Eh,000h
fon8_ascii134   DB   0DBh,0DBh,07Eh,03Ch,07Eh,0DBh,0DBh,000h
fon8_ascii135   DB   03Ch,066h,006h,01Ch,006h,066h,03Ch,000h
fon8_ascii136   DB   066h,066h,06Eh,07Eh,076h,066h,066h,000h
fon8_ascii137   DB   03Ch,066h,06Eh,07Eh,076h,066h,066h,000h
fon8_ascii138   DB   066h,06Ch,078h,070h,078h,06Ch,066h,000h
fon8_ascii139   DB   01Eh,036h,066h,066h,066h,066h,066h,000h
fon8_ascii140   DB   0C6h,0EEh,0FEh,0FEh,0D6h,0C6h,0C6h,000h
fon8_ascii141   DB   066h,066h,066h,07Eh,066h,066h,066h,000h
fon8_ascii142   DB   03Ch,066h,066h,066h,066h,066h,03Ch,000h
fon8_ascii143   DB   07Eh,066h,066h,066h,066h,066h,066h,000h
fon8_ascii144   DB   07Ch,066h,066h,066h,07Ch,060h,060h,000h
fon8_ascii145   DB   03Ch,066h,060h,060h,060h,066h,03Ch,000h
fon8_ascii146   DB   07Eh,018h,018h,018h,018h,018h,018h,000h
fon8_ascii147   DB   066h,066h,066h,03Eh,006h,066h,03Ch,000h
fon8_ascii148   DB   07Eh,0DBh,0DBh,0DBh,07Eh,018h,018h,000h
fon8_ascii149   DB   066h,066h,03Ch,018h,03Ch,066h,066h,000h
fon8_ascii150   DB   066h,066h,066h,066h,066h,066h,07Fh,003h
fon8_ascii151   DB   066h,066h,066h,03Eh,006h,006h,006h,000h
fon8_ascii152   DB   0DBh,0DBh,0DBh,0DBh,0DBh,0DBh,0FFh,000h
fon8_ascii153   DB   0DBh,0DBh,0DBh,0DBh,0DBh,0DBh,0FFh,003h
fon8_ascii154   DB   0E0h,060h,060h,07Ch,066h,066h,07Ch,000h
fon8_ascii155   DB   0C6h,0C6h,0C6h,0F6h,0DEh,0DEh,0F6h,000h
fon8_ascii156   DB   060h,060h,060h,07Ch,066h,066h,07Ch,000h
fon8_ascii157   DB   078h,08Ch,006h,03Eh,006h,08Ch,078h,000h
fon8_ascii158   DB   0CEh,0DBh,0DBh,0FBh,0DBh,0DBh,0CEh,000h
fon8_ascii159   DB   03Eh,066h,066h,066h,03Eh,036h,066h,000h
fon8_ascii160   DB   000h,000h,078h,00Ch,07Ch,0CCh,076h,000h
fon8_ascii161   DB   000h,03Ch,060h,03Ch,066h,066h,03Ch,000h
fon8_ascii162   DB   000h,000h,07Ch,066h,07Ch,066h,07Ch,000h
fon8_ascii163   DB   000h,000h,07Eh,060h,060h,060h,060h,000h
fon8_ascii164   DB   000h,000h,03Ch,06Ch,06Ch,06Ch,0FEh,0C6h
fon8_ascii165   DB   000h,000h,03Ch,066h,07Eh,060h,03Ch,000h
fon8_ascii166   DB   000h,000h,0DBh,07Eh,03Ch,07Eh,0DBh,000h
fon8_ascii167   DB   000h,000h,03Ch,066h,00Ch,066h,03Ch,000h
fon8_ascii168   DB   000h,000h,066h,06Eh,07Eh,076h,066h,000h
fon8_ascii169   DB   000h,018h,066h,06Eh,07Eh,076h,066h,000h
fon8_ascii170   DB   000h,000h,066h,06Ch,078h,06Ch,066h,000h
fon8_ascii171   DB   000h,000h,01Eh,036h,066h,066h,066h,000h
fon8_ascii172   DB   000h,000h,0C6h,0FEh,0FEh,0D6h,0C6h,000h
fon8_ascii173   DB   000h,000h,066h,066h,07Eh,066h,066h,000h
fon8_ascii174   DB   000h,000h,03Ch,066h,066h,066h,03Ch,000h
fon8_ascii175   DB   000h,000h,07Eh,066h,066h,066h,066h,000h
fon8_ascii176   DB   011h,044h,011h,044h,011h,044h,011h,044h
fon8_ascii177   DB   055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
fon8_ascii178   DB   0DDh,077h,0DDh,077h,0DDh,077h,0DDh,077h
fon8_ascii179   DB   018h,018h,018h,018h,018h,018h,018h,018h
fon8_ascii180   DB   018h,018h,018h,0F8h,018h,018h,018h,018h
fon8_ascii181   DB   018h,0F8h,018h,0F8h,018h,018h,018h,018h
fon8_ascii182   DB   036h,036h,036h,0F6h,036h,036h,036h,036h
fon8_ascii183   DB   000h,000h,000h,0FEh,036h,036h,036h,036h
fon8_ascii184   DB   000h,0F8h,018h,0F8h,018h,018h,018h,018h
fon8_ascii185   DB   036h,0F6h,006h,0F6h,036h,036h,036h,036h
fon8_ascii186   DB   036h,036h,036h,036h,036h,036h,036h,036h
fon8_ascii187   DB   000h,0FEh,006h,0F6h,036h,036h,036h,036h
fon8_ascii188   DB   036h,0F6h,006h,0FEh,000h,000h,000h,000h
fon8_ascii189   DB   036h,036h,036h,0FEh,000h,000h,000h,000h
fon8_ascii190   DB   018h,0F8h,018h,0F8h,000h,000h,000h,000h
fon8_ascii191   DB   000h,000h,000h,0F8h,018h,018h,018h,018h
fon8_ascii192   DB   018h,018h,018h,01Fh,000h,000h,000h,000h
fon8_ascii193   DB   018h,018h,018h,0FFh,000h,000h,000h,000h
fon8_ascii194   DB   000h,000h,000h,0FFh,018h,018h,018h,018h
fon8_ascii195   DB   018h,018h,018h,01Fh,018h,018h,018h,018h
fon8_ascii196   DB   000h,000h,000h,0FFh,000h,000h,000h,000h
fon8_ascii197   DB   018h,018h,018h,0FFh,018h,018h,018h,018h
fon8_ascii198   DB   018h,01Fh,018h,01Fh,018h,018h,018h,018h
fon8_ascii199   DB   036h,036h,036h,037h,036h,036h,036h,036h
fon8_ascii200   DB   036h,037h,030h,03Fh,000h,000h,000h,000h
fon8_ascii201   DB   000h,03Fh,030h,037h,036h,036h,036h,036h
fon8_ascii202   DB   036h,0F7h,000h,0FFh,000h,000h,000h,000h
fon8_ascii203   DB   000h,0FFh,000h,0F7h,036h,036h,036h,036h
fon8_ascii204   DB   036h,037h,030h,037h,036h,036h,036h,036h
fon8_ascii205   DB   000h,0FFh,000h,0FFh,000h,000h,000h,000h
fon8_ascii206   DB   036h,0F7h,000h,0F7h,036h,036h,036h,036h
fon8_ascii207   DB   018h,0FFh,000h,0FFh,000h,000h,000h,000h
fon8_ascii208   DB   036h,036h,036h,0FFh,000h,000h,000h,000h
fon8_ascii209   DB   000h,0FFh,000h,0FFh,018h,018h,018h,018h
fon8_ascii210   DB   000h,000h,000h,0FFh,036h,036h,036h,036h
fon8_ascii211   DB   036h,036h,036h,03Fh,000h,000h,000h,000h
fon8_ascii212   DB   018h,01Fh,018h,01Fh,000h,000h,000h,000h
fon8_ascii213   DB   000h,01Fh,018h,01Fh,018h,018h,018h,018h
fon8_ascii214   DB   000h,000h,000h,03Fh,036h,036h,036h,036h
fon8_ascii215   DB   036h,036h,036h,0FFh,036h,036h,036h,036h
fon8_ascii216   DB   018h,0FFh,018h,0FFh,018h,018h,018h,018h
fon8_ascii217   DB   018h,018h,018h,0F8h,000h,000h,000h,000h
fon8_ascii218   DB   000h,000h,000h,01Fh,018h,018h,018h,018h
fon8_ascii219   DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
fon8_ascii220   DB   000h,000h,000h,0FFh,0FFh,0FFh,0FFh,0FFh
fon8_ascii221   DB   0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h
fon8_ascii222   DB   00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh
fon8_ascii223   DB   0FFh,0FFh,0FFh,000h,000h,000h,000h,000h
fon8_ascii224   DB   000h,000h,07Ch,066h,066h,07Ch,060h,000h
fon8_ascii225   DB   000h,000h,03Ch,066h,060h,066h,03Ch,000h
fon8_ascii226   DB   000h,000h,07Eh,018h,018h,018h,018h,000h
fon8_ascii227   DB   000h,000h,066h,066h,03Eh,006h,03Ch,000h
fon8_ascii228   DB   000h,000h,07Eh,0DBh,0DBh,07Eh,018h,000h
fon8_ascii229   DB   000h,000h,066h,03Ch,018h,03Ch,066h,000h
fon8_ascii230   DB   000h,000h,066h,066h,066h,066h,07Fh,003h
fon8_ascii231   DB   000h,000h,066h,066h,03Eh,006h,006h,000h
fon8_ascii232   DB   000h,000h,0DBh,0DBh,0DBh,0DBh,0FFh,000h
fon8_ascii233   DB   000h,000h,0DBh,0DBh,0DBh,0DBh,0FFh,003h
fon8_ascii234   DB   000h,000h,0E0h,060h,07Ch,066h,07Ch,000h
fon8_ascii235   DB   000h,000h,0C6h,0C6h,0F6h,0DEh,0F6h,000h
fon8_ascii236   DB   000h,000h,060h,060h,07Ch,066h,07Ch,000h
fon8_ascii237   DB   000h,000h,07Ch,006h,03Eh,006h,07Ch,000h
fon8_ascii238   DB   000h,000h,0CEh,0DBh,0FBh,0DBh,0CEh,000h
fon8_ascii239   DB   000h,000h,03Eh,066h,03Eh,036h,066h,000h
fon8_ascii240   DB   066h,000h,07Eh,060h,07Ch,060h,07Eh,000h
fon8_ascii241   DB   024h,000h,03Ch,066h,07Eh,060h,03Ch,000h
fon8_ascii242   DB   000h,030h,018h,00Ch,006h,00Ch,018h,030h
fon8_ascii243   DB   000h,00Ch,018h,030h,060h,030h,018h,00Ch
fon8_ascii244   DB   00Eh,01Bh,01Bh,018h,018h,018h,018h,018h
fon8_ascii245   DB   018h,018h,018h,018h,018h,0D8h,0D8h,070h
fon8_ascii246   DB   000h,018h,018h,000h,07Eh,000h,018h,018h
fon8_ascii247   DB   000h,076h,0DCh,000h,076h,0DCh,000h,000h
fon8_ascii248   DB   000h,038h,06Ch,06Ch,038h,000h,000h,000h
fon8_ascii249   DB   000h,000h,000h,000h,018h,000h,000h,000h
fon8_ascii250   DB   000h,000h,000h,038h,038h,000h,000h,000h
fon8_ascii251   DB   0F8h,006h,073h,079h,023h,0FEh,0A0h,0A0h
fon8_ascii252   DB   006h,008h,0CBh,06Bh,068h,05Bh,058h,08Ch
fon8_ascii253   DB   030h,048h,010h,020h,078h,000h,000h,000h
fon8_ascii254   DB   0FFh,081h,0BDh,0A5h,0A5h,0BDh,081h,0FFh
fon8_ascii255   DB   000h,000h,000h,000h,000h,042h,07Eh,000h

Исходный текст файла EGA_FONT.INC, содержащий определение шрифтов размера 8х14 пикселов приведен в листинге 5.8. Каждый символ определяется четырнадцатью байтами.

Листинг 5.8. Файл EGA_FONT.INC


fon14_ascii0    DB   000h,000h,000h,000h,000h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii1    DB   000h,000h,07Eh,081h,0A5h,081h,081h,0BDh
                DB   099h,081h,07Eh,000h,000h,000h
fon14_ascii2    DB   000h,000h,07Eh,0FFh,0DBh,0FFh,0FFh,0C3h
                DB   0E7h,0FFh,07Eh,000h,000h,000h
fon14_ascii3    DB   000h,000h,000h,06Ch,0FEh,0FEh,0FEh,0FEh
                DB   07Ch,038h,010h,000h,000h,000h
fon14_ascii4    DB   000h,000h,000h,010h,038h,07Ch,0FEh,07Ch
                DB   038h,010h,000h,000h,000h,000h
fon14_ascii5    DB   000h,000h,018h,03Ch,03Ch,0E7h,0E7h,0E7h
                DB   018h,018h,03Ch,000h,000h,000h
fon14_ascii6    DB   000h,000h,018h,03Ch,07Eh,0FFh,0FFh,07Eh
                DB   018h,018h,03Ch,000h,000h,000h
fon14_ascii7    DB   000h,000h,000h,000h,000h,018h,03Ch,03Ch
                DB   018h,000h,000h,000h,000h,000h
fon14_ascii8    DB   0FFh,0FFh,0FFh,0FFh,0FFh,0E7h,0C3h,0C3h
                DB   0E7h,0FFh,0FFh,0FFh,0FFh,0FFh
fon14_ascii9    DB   000h,000h,000h,000h,03Ch,066h,042h,042h
                DB   066h,03Ch,000h,000h,000h,000h
fon14_ascii10   DB   0FFh,0FFh,0FFh,FFh,0C3h,099h,0BDh,0BDh
                DB   099h,0C3h,0FFh,0FFh,0FFh,0FFh
fon14_ascii11   DB   000h,000h,01Eh,0Eh,01Ah,032h,078h,0CCh
                DB   0CCh,0CCh,078h,000h,000h,000h
fon14_ascii12   DB   000h,000h,03Ch,066h,066h,066h,03Ch,018h
                DB   07Eh,018h,018h,000h,000h,000h
fon14_ascii13   DB   000h,000h,03Fh,33h,03Fh,030h,030h,030h
                DB   070h,0F0h,0E0h,000h,000h,000h
fon14_ascii14   DB   000h,000h,07Fh,63h,07Fh,063h,063h,063h
                DB   067h,0E7h,0E6h,0C0h,000h,000h
fon14_ascii15   DB   000h,000h,018h,18h,0DBh,03Ch,0E7h,03Ch
                DB   0DBh,018h,018h,000h,000h,000h
fon14_ascii16   DB   000h,040h,060h,70h,078h,07Ch,07Eh,07Ch
                DB   078h,070h,060h,040h,000h,000h
fon14_ascii17   DB   000h,002h,006h,0Eh,01Eh,03Eh,07Eh,03Eh
                DB   01Eh,00Eh,006h,002h,000h,000h
fon14_ascii18   DB   000h,000h,018h,3Ch,07Eh,018h,018h,018h
                DB   07Eh,03Ch,018h,000h,000h,000h
fon14_ascii19   DB   000h,000h,066h,66h,066h,066h,066h,066h
                DB   000h,066h,066h,000h,000h,000h
fon14_ascii20   DB   000h,000h,07Fh,DBh,0DBh,0DBh,07Bh,01Bh
                DB   01Bh,01Bh,01Bh,000h,000h,000h
fon14_ascii21   DB   000h,07Ch,0C6h,60h,038h,06Ch,0C6h,0C6h
                DB   06Ch,038h,00Ch,0C6h,07Ch,000h
fon14_ascii22   DB   000h,000h,000h,00h,000h,000h,000h,0FEh
                DB   0FEh,0FEh,0FEh,000h,000h,000h
fon14_ascii23   DB   000h,000h,018h,3Ch,07Eh,018h,018h,07Eh
                DB   03Ch,018h,07Eh,000h,000h,000h
fon14_ascii24   DB   000h,000h,018h,3Ch,07Eh,018h,018h,018h
                DB   018h,018h,018h,000h,000h,000h
fon14_ascii25   DB   000h,000h,018h,18h,018h,018h,018h,018h
                DB   07Eh,03Ch,018h,000h,000h,000h
fon14_ascii26   DB   000h,000h,000h,00h,000h,018h,00Ch,0FEh
                DB   00Ch,018h,000h,000h,000h,000h
fon14_ascii27   DB   000h,000h,000h,00h,000h,018h,030h,07Fh
                DB   030h,018h,000h,000h,000h,000h
fon14_ascii28   DB   000h,000h,000h,00h,000h,000h,0C0h,0C0h
                DB   0C0h,0FEh,000h,000h,000h,000h
fon14_ascii29   DB   000h,000h,000h,00h,000h,028h,06Ch,0FEh
                DB   06Ch,028h,000h,000h,000h,000h
fon14_ascii30   DB   000h,000h,000h,00h,010h,038h,038h,07Ch
                DB   07Ch,0FEh,0FEh,000h,000h,000h
fon14_ascii31   DB   000h,000h,000h,00h,0FEh,0FEh,07Ch,07Ch
                DB   038h,038h,010h,000h,000h,000h
fon14_ascii32   DB   000h,000h,000h,00h,000h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii33   DB   000h,000h,018h,3Ch,03Ch,018h,018h,018h
                DB   000h,018h,018h,000h,000h,000h
fon14_ascii34   DB   000h,000h,066h,66h,066h,024h,000h,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii35   DB   000h,000h,06Ch,6Ch,0FEh,06Ch,06Ch,06Ch
                DB   0FEh,06Ch,06Ch,000h,000h,000h
fon14_ascii36   DB   018h,018h,07Ch,C6h,0C2h,0C0h,07Ch,006h
                DB   086h,0C6h,07Ch,018h,018h,000h
fon14_ascii37   DB   000h,000h,000h,C2h,0C6h,00Ch,018h,030h
                DB   060h,0C6h,086h,000h,000h,000h
fon14_ascii38   DB   000h,000h,038h,6Ch,06Ch,038h,076h,0DCh
                DB   0CCh,0CCh,076h,000h,000h,000h
fon14_ascii39   DB   000h,000h,030h,30h,030h,060h,000h,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii40   DB   000h,000h,00Ch,18h,030h,030h,030h,030h
                DB   030h,018h,00Ch,000h,000h,000h
fon14_ascii41   DB   000h,000h,030h,18h,00Ch,00Ch,00Ch,00Ch
                DB   00Ch,018h,030h,00h,000h,000h
fon14_ascii42   DB   000h,000h,000h,00h,066h,03Ch,0FFh,03Ch
                DB   066h,000h,000h,000h,000h,000h
fon14_ascii43   DB   000h,000h,000h,00h,018h,018h,07Eh,018h
                DB   018h,000h,000h,000h,000h,000h
fon14_ascii44   DB   000h,000h,000h,00h,000h,000h,000h,000h
                DB   018h,018h,018h,030h,000h,000h
fon14_ascii45   DB   000h,000h,000h,00h,000h,000h,0FEh,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii46   DB   000h,000h,000h,00h,000h,000h,000h,000h
                DB   000h,018h,018h,000h,000h,000h
fon14_ascii47   DB   000h,000h,000h,02h,006h,00Ch,018h,030h
                DB   060h,0C0h,080h,000h,000h,000h
fon14_ascii48   DB   000h,000h,07Ch,C6h,0CEh,0DEh,0F6h,0E6h
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii49   DB   000h,000h,018h,38h,078h,018h,018h,018h
                DB   018h,018h,03Ch,000h,000h,000h
fon14_ascii50   DB   000h,000h,07Ch,C6h,0C6h,006h,01Ch,030h
                DB   060h,0C6h,0FEh,000h,000h,000h
fon14_ascii51   DB   000h,000h,07Ch,C6h,0C6h,006h,01Ch,006h
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii52   DB   000h,000h,00Ch,1Ch,03Ch,06Ch,0CCh,0CCh
                DB   0FEh,00Ch,00Ch,000h,000h,000h
fon14_ascii53   DB   000h,000h,0FEh,C0h,0C0h,0FCh,006h,006h
                DB   006h,0C6h,07Ch,000h,000h,000h
fon14_ascii54   DB   000h,000h,07Ch,C6h,0C0h,0C0h,0FCh,0C6h
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii55   DB   000h,000h,0FEh,C6h,086h,004h,00Ch,018h
                DB   018h,030h,030h,000h,000h,000h
fon14_ascii56   DB   000h,000h,07Ch,C6h,0C6h,0C6h,07Ch,0C6h
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii57   DB   000h,000h,07Ch,C6h,0C6h,0C6h,07Eh,006h
                DB   006h,0C6h,07Ch,000h,000h,000h
fon14_ascii58   DB   000h,000h,000h,00h,000h,018h,018h,000h
                DB   000h,018h,018h,000h,000h,000h
fon14_ascii59   DB   000h,000h,000h,00h,000h,018h,018h,000h
                DB   000h,018h,018h,030h,000h,000h
fon14_ascii60   DB   000h,000h,000h,0Ch,018h,030h,060h,030h
                DB   018h,00Ch,000h,000h,000h,000h
fon14_ascii61   DB   000h,000h,000h,00h,000h,0FEh,000h,0FEh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii62   DB   000h,000h,000h,30h,018h,00Ch,006h,00Ch
                DB   018h,030h,000h,000h,000h,000h
fon14_ascii63   DB   000h,000h,07Ch,C6h,0C6h,006h,00Ch,018h
                DB   000h,018h,018h,000h,000h,000h
fon14_ascii64   DB   000h,000h,000h,7Ch,0C6h,0C6h,0DEh,0DEh
                DB   0DEh,0DCh,0C0h,07Ch,000h,000h
fon14_ascii65   DB   000h,000h,038h,6Ch,0C6h,0C6h,0FEh,0C6h
                DB   0C6h,0C6h,0C6h,00h,000h,000h
fon14_ascii66   DB   000h,000h,0FCh,66h,066h,066h,07Ch,066h
                DB   066h,066h,0FCh,000h,000h,000h
fon14_ascii67   DB   000h,000h,07Ch,C6h,0C6h,0C0h,0C0h,0C0h
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii68   DB   000h,000h,0FCh,66h,066h,066h,066h,066h
                DB   066h,066h,0FCh,000h,000h,000h
fon14_ascii69   DB   000h,000h,0FEh,66h,062h,068h,078h,068h
                DB   062h,066h,0FEh,000h,000h,000h
fon14_ascii70   DB   000h,000h,0FEh,66h,062h,068h,078h,068h
                DB   060h,060h,0F0h,000h,000h,000h
fon14_ascii71   DB   000h,000h,07Ch,C6h,0C6h,0C0h,0C0h,0CEh
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii72   DB   000h,000h,0C6h,C6h,0C6h,0C6h,0FEh,0C6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii73   DB   000h,000h,03Ch,18h,018h,018h,018h,018h
                DB   018h,018h,03Ch,000h,000h,000h
fon14_ascii74   DB   000h,000h,01Eh,0Ch,00Ch,00Ch,00Ch,00Ch
                DB   0CCh,0CCh,078h,000h,000h,000h
fon14_ascii75   DB   000h,000h,0C6h,CCh,0D8h,0F0h,0E0h,0F0h
                DB   0D8h,0CCh,0C6h,000h,000h,000h
fon14_ascii76   DB   000h,000h,0F0h,60h,060h,060h,060h,060h
                DB   062h,066h,0FEh,000h,000h,000h
fon14_ascii77   DB   000h,000h,0C6h,EEh,0FEh,0D6h,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii78   DB   000h,000h,0C6h,E6h,0E6h,0F6h,0DEh,0CEh
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii79   DB   000h,000h,07Ch,C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii80   DB   000h,000h,0FCh,66h,066h,066h,07Ch,060h
                DB   060h,060h,0F0h,000h,000h,000h
fon14_ascii81   DB   000h,000h,07Ch,C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,07Ch,006h,000h,000h
fon14_ascii82   DB   000h,000h,0FCh,66h,066h,066h,07Ch,06Ch
                DB   06Ch,066h,0E6h,000h,000h,000h
fon14_ascii83   DB   000h,000h,07Ch,C6h,0C6h,060h,038h,00Ch
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii84   DB   000h,000h,07Eh,5Ah,018h,018h,018h,018h
                DB   018h,018h,03Ch,000h,000h,000h
fon14_ascii85   DB   000h,000h,0C6h,C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii86   DB   000h,000h,0C6h,C6h,0C6h,0C6h,0C6h,06Ch
                DB   06Ch,038h,010h,000h,000h,000h
fon14_ascii87   DB   000h,000h,0C6h,C6h,0C6h,0C6h,0C6h,0D6h
                DB   0FEh,0EEh,0C6h,000h,000h,000h
fon14_ascii88   DB   000h,000h,0C6h,C6h,06Ch,07Ch,038h,07Ch
                DB   06Ch,0C6h,0C6h,000h,000h,000h
fon14_ascii89   DB   000h,000h,066h,66h,066h,066h,03Ch,018h
                DB   018h,018h,03Ch,000h,000h,000h
fon14_ascii90   DB   000h,000h,0FEh,C6h,086h,00Ch,018h,030h
                DB   062h,0C6h,0FEh,000h,000h,000h
fon14_ascii91   DB   000h,000h,03Ch,30h,030h,030h,030h,030h
                DB   030h,030h,03Ch,000h,000h,000h
fon14_ascii92   DB   000h,000h,080h,C0h,060h,030h,018h,00Ch
                DB   006h,002h,000h,000h,000h,000h
fon14_ascii93   DB   000h,000h,078h,18h,018h,018h,018h,018h
                DB   018h,018h,078h,000h,000h,000h
fon14_ascii94   DB   000h,018h,03Ch,66h,000h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii95   DB   000h,000h,000h,00h,000h,000h,000h,000h
                DB   000h,000h,000h,0FFh,000h,000h
fon14_ascii96   DB   000h,000h,018h,18h,018h,00Ch,000h,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii97   DB   000h,000h,000h,00h,000h,07Ch,006h,07Eh
                DB   0C6h,0C6h,07Eh,000h,000h,000h
fon14_ascii98   DB   000h,000h,0C0h,C0h,0C0h,0FCh,0C6h,0C6h
                DB   0C6h,0C6h,0FCh,000h,000h,000h
fon14_ascii99   DB   000h,000h,000h,00h,000h,07Ch,0C6h,0C0h
                DB   0C0h,0C6h,07Ch,000h,000h,000h
fon14_ascii100  DB   000h,000h,006h,06h,006h,07Eh,0C6h,0C6h
                DB   0C6h,0C6h,07Eh,000h,000h,000h
fon14_ascii101  DB   000h,000h,000h,00h,000h,07Ch,0C6h,0FEh
                DB   0C0h,0C6h,07Ch,000h,000h,000h
fon14_ascii102  DB   000h,000h,01Ch,36h,030h,030h,078h,030h
                DB   030h,030h,078h,000h,000h,000h
fon14_ascii103  DB   000h,000h,000h,00h,000h,07Eh,0C6h,0C6h
                DB   0C6h,07Eh,006h,0C6h,07Ch,000h
fon14_ascii104  DB   000h,000h,0C0h,C0h,0C0h,0FCh,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii105  DB   000h,000h,018h,18h,000h,038h,018h,018h
                DB   018h,018h,03Ch,000h,000h,000h
fon14_ascii106  DB   000h,000h,018h,18h,000h,038h,018h,018h
                DB   018h,018h,018h,0D8h,070h,000h
fon14_ascii107  DB   000h,000h,0C0h,C0h,0C0h,0CCh,0D8h,0F0h
                DB   0F8h,0CCh,0C6h,000h,000h,000h
fon14_ascii108  DB   000h,000h,038h,18h,018h,018h,018h,018h
                DB   018h,018h,03Ch,000h,000h,000h
fon14_ascii109  DB   000h,000h,000h,00h,000h,06Ch,0FEh,0D6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii110  DB   000h,000h,000h,00h,000h,0FCh,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii111  DB   000h,000h,000h,00h,000h,07Ch,0C6h,0C6h
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii112  DB   000h,000h,000h,00h,000h,0FCh,0C6h,0C6h
                DB   0C6h,0FCh,0C0h,0C0h,0C0h,000h
fon14_ascii113  DB   000h,000h,000h,00h,000h,07Eh,0C6h,0C6h
                DB   0C6h,07Eh,006h,006h,006h,000h
fon14_ascii114  DB   000h,000h,000h,00h,000h,0DEh,076h,060h
                DB   060h,060h,0F0h,000h,000h,000h
fon14_ascii115  DB   000h,000h,000h,00h,000h,07Ch,0C6h,070h
                DB   01Ch,0C6h,07Ch,000h,000h,000h
fon14_ascii116  DB   000h,000h,018h,18h,018h,07Eh,018h,018h
                DB   018h,018h,01Ch,000h,000h,000h
fon14_ascii117  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,07Eh,000h,000h,000h
fon14_ascii118  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0C6h
                DB   06Ch,038h,010h,000h,000h,000h
fon14_ascii119  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0D6h
                DB   0FEh,0EEh,0C6h,000h,000h,000h
fon14_ascii120  DB   000h,000h,000h,00h,000h,0C6h,06Ch,038h
                DB   038h,06Ch,0C6h,000h,000h,000h
fon14_ascii121  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0C6h
                DB   06Ch,038h,030h,060h,0C0h,000h
fon14_ascii122  DB   000h,000h,000h,00h,000h,0FEh,0CCh,018h
                DB   030h,066h,0FEh,000h,000h,000h
fon14_ascii123  DB   000h,000h,00Eh,18h,018h,018h,070h,018h
                DB   018h,018h,018h,00Eh,000h,000h
fon14_ascii124  DB   000h,000h,018h,18h,018h,018h,000h,018h
                DB   018h,018h,018h,018h,000h,000h
fon14_ascii125  DB   000h,000h,070h,18h,018h,018h,00Eh,018h
                DB   018h,018h,018h,070h,000h,000h
fon14_ascii126  DB   000h,000h,062h,9Ch,000h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii127  DB   000h,000h,000h,00h,000h,010h,038h,06Ch
                DB   0C6h,0FEh,000h,000h,000h,000h
fon14_ascii128  DB   000h,000h,01Eh,36h,066h,0C6h,0C6h,0FEh
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii129  DB   000h,000h,0FEh,62h,060h,07Ch,066h,066h
                DB   066h,066h,0FCh,000h,000h,000h
fon14_ascii130  DB   000h,000h,0FCh,66h,066h,066h,07Ch,066h
                DB   066h,066h,0FCh,000h,000h,000h
fon14_ascii131  DB   000h,000h,0FEh,62h,062h,060h,060h,060h
                DB   060h,060h,0F0h,000h,000h,000h
fon14_ascii132  DB   000h,000h,01Eh,36h,066h,066h,066h,066h
                DB   066h,066h,0FFh,0C3h,081h,000h
fon14_ascii133  DB   000h,000h,0FEh,66h,062h,068h,078h,068h
                DB   062h,066h,0FEh,000h,000h,000h
fon14_ascii134  DB   000h,000h,0D6h,D6h,054h,054h,07Ch,054h
                DB   0D6h,0D6h,0D6h,000h,000h,000h
fon14_ascii135  DB   000h,000h,07Ch,C6h,006h,006h,03Ch,006h
                DB   006h,0C6h,07Ch,000h,000h,000h
fon14_ascii136  DB   000h,000h,0C6h,C6h,0CEh,0DEh,0F6h,0E6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii137  DB   038h,038h,0C6h,C6h,0CEh,0DEh,0F6h,0E6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii138  DB   000h,000h,0E6h,66h,06Ch,06Ch,078h,06Ch
                DB   06Ch,066h,0E6h,000h,000h,000h
fon14_ascii139  DB   000h,000h,01Eh,36h,066h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii140  DB   000h,000h,0C6h,EEh,0FEh,0FEh,0D6h,0C6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii141  DB   000h,000h,0C6h,C6h,0C6h,0C6h,0FEh,0C6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii142  DB   000h,000h,07Ch,C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii143  DB   000h,000h,0FEh,C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii144  DB   000h,000h,0FCh,66h,066h,066h,07Ch,060h
                DB   060h,060h,0F0h,000h,000h,000h
fon14_ascii145  DB   000h,000h,03Ch,66h,0C2h,0C0h,0C0h,0C0h
                DB   0C2h,066h,03Ch,000h,000h,000h
fon14_ascii146  DB   000h,000h,07Eh,5Ah,018h,018h,018h,018h
                DB   018h,018h,03Ch,000h,000h,000h
fon14_ascii147  DB   000h,000h,0C6h,C6h,0C6h,0C6h,0C6h,07Eh
                DB   006h,0C6h,07Ch,000h,000h,000h
fon14_ascii148  DB   000h,03Ch,018h,7Eh,0DBh,0DBh,0DBh,0DBh
                DB   07Eh,018h,03Ch,000h,000h,000h
fon14_ascii149  DB   000h,000h,0C6h,C6h,06Ch,07Ch,038h,07Ch
                DB   06Ch,0C6h,0C6h,000h,000h,000h
fon14_ascii150  DB   000h,000h,0CCh,CCh,0CCh,0CCh,0CCh,0CCh
                DB   0CCh,0CCh,0FEh,006h,006h,000h
fon14_ascii151  DB   000h,000h,0C6h,C6h,0C6h,0C6h,0C6h,07Eh
                DB   006h,006h,006h,000h,000h,000h
fon14_ascii152  DB   000h,000h,0DBh,DBh,0DBh,0DBh,0DBh,0DBh
                DB   0DBh,0DBh,0FFh,000h,000h,000h
fon14_ascii153  DB   000h,000h,0DBh,DBh,0DBh,0DBh,0DBh,0DBh
                DB   0DBh,0DBh,0FFh,003h,003h,000h
fon14_ascii154  DB   000h,000h,0F8h,B0h,030h,03Ch,036h,036h
                DB   036h,036h,07Ch,000h,000h,000h
fon14_ascii155  DB   000h,000h,0C3h,C3h,0C3h,0F3h,0DBh,0DBh
                DB   0DBh,0DBh,0F3h,000h,000h,000h
fon14_ascii156  DB   000h,000h,0F0h,60h,060h,07Ch,066h,066h
                DB   066h,066h,0FCh,000h,000h,000h
fon14_ascii157  DB   000h,000h,07Ch,C6h,006h,026h,03Eh,026h
                DB   006h,0C6h,07Ch,000h,000h,000h
fon14_ascii158  DB   000h,000h,0CEh,DBh,0DBh,0DBh,0FBh,0DBh
                DB   0DBh,0DBh,0CEh,000h,000h,000h
fon14_ascii159  DB   000h,000h,03Fh,66h,066h,066h,03Eh,03Eh
                DB   066h,066h,0E7h,000h,000h,000h
fon14_ascii160  DB   000h,000h,000h,00h,000h,078h,00Ch,07Ch
                DB   0CCh,0CCh,076h,000h,000h,000h
fon14_ascii161  DB   000h,002h,006h,3Ch,060h,060h,07Ch,066h
                DB   066h,066h,03Ch,000h,000h,000h
fon14_ascii162  DB   000h,000h,000h,00h,000h,0FCh,066h,07Ch
                DB   066h,066h,0FCh,000h,000h,000h
fon14_ascii163  DB   000h,000h,000h,00h,000h,07Eh,032h,030h
                DB   030h,030h,078h,000h,000h,000h
fon14_ascii164  DB   000h,000h,000h,00h,000h,01Eh,036h,036h
                DB   066h,066h,0FFh,0C3h,0C3h,000h
fon14_ascii165  DB   000h,000h,000h,00h,000h,07Ch,0C6h,0FEh
                DB   0C0h,0C6h,07Ch,000h,000h,000h
fon14_ascii166  DB   000h,000h,000h,00h,000h,0D6h,0D6h,07Ch
                DB   054h,0D6h,0D6h,000h,000h,000h
fon14_ascii167  DB   000h,000h,000h,00h,000h,03Ch,066h,00Ch
                DB   006h,066h,03Ch,000h,000h,000h
fon14_ascii168  DB   000h,000h,000h,00h,000h,0C6h,0CEh,0D6h
                DB   0E6h,0C6h,0C6h,000h,000h,000h
fon14_ascii169  DB   000h,000h,000h,38h,038h,0C6h,0CEh,0D6h
                DB   0E6h,0C6h,0C6h,000h,000h,000h
fon14_ascii170  DB   000h,000h,000h,00h,000h,0E6h,06Ch,078h
                DB   078h,06Ch,0E6h,000h,000h,000h
fon14_ascii171  DB   000h,000h,000h,00h,000h,01Eh,036h,066h
                DB   066h,066h,066h,000h,000h,000h
fon14_ascii172  DB   000h,000h,000h,00h,000h,0C6h,0EEh,0FEh
                DB   0D6h,0D6h,0C6h,000h,000h,000h
fon14_ascii173  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0FEh
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii174  DB   000h,000h,000h,00h,000h,07Ch,0C6h,0C6h
                DB   0C6h,0C6h,07Ch,000h,000h,000h
fon14_ascii175  DB   000h,000h,000h,00h,000h,0FEh,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,000h,000h,000h
fon14_ascii176  DB   011h,044h,011h,44h,011h,044h,011h,044h
                DB   011h,044h,011h,044h,011h,044h
fon14_ascii177  DB   055h,0AAh,055h,AAh,055h,0AAh,055h,0AAh
                DB   055h,0AAh,055h,0AAh,055h,0AAh
fon14_ascii178  DB   0DDh,077h,0DDh,77h,0DDh,077h,0DDh,077h
                DB   0DDh,077h,0DDh,077h,0DDh,077h
fon14_ascii179  DB   018h,018h,018h,18h,018h,018h,018h,018h
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii180  DB   018h,018h,018h,18h,018h,018h,018h,0F8h
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii181  DB   018h,018h,018h,18h,018h,0F8h,018h,0F8h
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii182  DB   036h,036h,036h,36h,036h,036h,036h,0F6h
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii183  DB   000h,000h,000h,00h,000h,000h,000h,0FEh
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii184  DB   000h,000h,000h,00h,000h,0F8h,018h,0F8h
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii185  DB   036h,036h,036h,36h,036h,0F6h,006h,0F6h
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii186  DB   036h,036h,036h,36h,036h,036h,036h,036h
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii187  DB   000h,000h,000h,00h,000h,0FEh,006h,0F6h
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii188  DB   036h,036h,036h,36h,036h,0F6h,006h,0FEh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii189  DB   036h,036h,036h,36h,036h,036h,036h,0FEh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii190  DB   018h,018h,018h,18h,018h,0F8h,018h,0F8h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii191  DB   000h,000h,000h,00h,000h,000h,000h,0F8h
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii192  DB   018h,018h,018h,18h,018h,018h,018h,01Fh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii193  DB   018h,018h,018h,18h,018h,018h,018h,0FFh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii194  DB   000h,000h,000h,00h,000h,000h,000h,0FFh
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii195  DB   018h,018h,018h,18h,018h,018h,018h,01Fh
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii196  DB   000h,000h,000h,00h,000h,000h,000h,0FFh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii197  DB   018h,018h,018h,18h,018h,018h,018h,0FFh
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii198  DB   018h,018h,018h,18h,018h,01Fh,018h,01Fh
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii199  DB   036h,036h,036h,36h,036h,036h,036h,037h
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii200  DB   036h,036h,036h,36h,036h,037h,030h,03Fh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii201  DB   000h,000h,000h,00h,000h,03Fh,030h,037h
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii202  DB   036h,036h,036h,36h,036h,0F7h,000h,0FFh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii203  DB   000h,000h,000h,00h,000h,0FFh,000h,0F7h
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii204  DB   036h,036h,036h,36h,036h,037h,030h,037h
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii205  DB   000h,000h,000h,00h,000h,0FFh,000h,0FFh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii206  DB   036h,036h,036h,36h,036h,0F7h,000h,0F7h
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii207  DB   018h,018h,018h,18h,018h,0FFh,000h,0FFh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii208  DB   036h,036h,036h,36h,036h,036h,036h,0FFh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii209  DB   000h,000h,000h,00h,000h,0FFh,000h,0FFh
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii210  DB   000h,000h,000h,00h,000h,000h,000h,0FFh
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii211  DB   036h,036h,036h,36h,036h,036h,036h,03Fh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii212  DB   018h,018h,018h,18h,018h,01Fh,018h,01Fh
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii213  DB   000h,000h,000h,00h,000h,01Fh,018h,01Fh
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii214  DB   000h,000h,000h,00h,000h,000h,000h,03Fh
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii215  DB   036h,036h,036h,36h,036h,036h,036h,0FFh
                DB   036h,036h,036h,036h,036h,036h
fon14_ascii216  DB   018h,018h,018h,18h,018h,0FFh,018h,0FFh
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii217  DB   018h,018h,018h,18h,018h,018h,018h,0F8h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii218  DB   000h,000h,000h,00h,000h,000h,000h,01Fh
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii219  DB   0FFh,0FFh,0FFh,FFh,0FFh,0FFh,0FFh,0FFh
                DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
fon14_ascii220  DB   000h,000h,000h,00h,000h,000h,000h,0FFh
                DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
fon14_ascii221  DB   0F0h,0F0h,0F0h,F0h,0F0h,0F0h,0F0h,0F0h
                DB   0F0h,0F0h,0F0h,0F0h,0F0h,0F0h
fon14_ascii222  DB   00Fh,00Fh,00Fh,0Fh,00Fh,00Fh,00Fh,00Fh
                DB   00Fh,00Fh,00Fh,00Fh,00Fh,00Fh
fon14_ascii223  DB   0FFh,0FFh,0FFh,FFh,0FFh,0FFh,0FFh,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii224  DB   000h,000h,000h,00h,000h,0DCh,066h,066h
                DB   066h,066h,07Ch,060h,0F0h,000h
fon14_ascii225  DB   000h,000h,000h,00h,000h,07Ch,0C6h,0C0h
                DB   0C0h,0C6h,07Ch,000h,000h,000h
fon14_ascii226  DB   000h,000h,000h,00h,000h,07Eh,05Ah,018h
                DB   018h,018h,03Ch,000h,000h,000h
fon14_ascii227  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0C6h
                DB   0C6h,07Eh,006h,0C6h,07Ch,000h
fon14_ascii228  DB   000h,000h,000h,00h,03Ch,018h,07Eh,0DBh
                DB   0DBh,0DBh,07Eh,018h,03Ch,000h
fon14_ascii229  DB   000h,000h,000h,00h,000h,0C6h,06Ch,038h
                DB   038h,06Ch,0C6h,000h,000h,000h
fon14_ascii230  DB   000h,000h,000h,00h,000h,0CCh,0CCh,0CCh
                DB   0CCh,0CCh,0FEh,006h,006h,000h
fon14_ascii231  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0C6h
                DB   07Eh,006h,006h,000h,000h,000h
fon14_ascii232  DB   000h,000h,000h,00h,000h,0D6h,0D6h,0D6h
                DB   0D6h,0D6h,0FEh,000h,000h,000h
fon14_ascii233  DB   000h,000h,000h,00h,000h,0D6h,0D6h,0D6h
                DB   0D6h,0D6h,0FEh,003h,003h,000h
fon14_ascii234  DB   000h,000h,000h,00h,000h,0F8h,0B0h,03Eh
                DB   033h,033h,07Eh,000h,000h,000h
fon14_ascii235  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0F6h
                DB   0DEh,0DEh,0F6h,000h,000h,000h
fon14_ascii236  DB   000h,000h,000h,00h,000h,0F0h,060h,07Ch
                DB   066h,066h,0FCh,000h,000h,000h
fon14_ascii237  DB   000h,000h,000h,00h,000h,03Ch,066h,01Eh
                DB   006h,066h,03Ch,000h,000h,000h
fon14_ascii238  DB   000h,000h,000h,00h,000h,0CEh,0DBh,0FBh
                DB   0DBh,0DBh,0CEh,000h,000h,000h
fon14_ascii239  DB   000h,000h,000h,00h,000h,07Eh,0CCh,07Ch
                DB   06Ch,0CCh,0CEh,000h,000h,000h
fon14_ascii240  DB   000h,000h,06Ch,00h,0FEh,062h,068h,078h
                DB   068h,062h,0FEh,000h,000h,000h
fon14_ascii241  DB   000h,000h,000h,6Ch,000h,07Ch,0C6h,0FEh
                DB   0C0h,0C6h,07Ch,000h,000h,000h
fon14_ascii242  DB   000h,000h,000h,30h,018h,00Ch,006h,00Ch
                DB   018h,030h,000h,07Eh,000h,000h
fon14_ascii243  DB   000h,000h,000h,0Ch,018h,030h,060h,030h
                DB   018h,00Ch,000h,07Eh,000h,000h
fon14_ascii244  DB   000h,000h,00Eh,1Bh,01Bh,018h,018h,018h
                DB   018h,018h,018h,018h,018h,018h
fon14_ascii245  DB   018h,018h,018h,18h,018h,018h,018h,018h
                DB   0D8h,0D8h,0D8h,070h,000h,000h
fon14_ascii246  DB   000h,000h,000h,00h,018h,018h,000h,07Eh
                DB   000h,018h,018h,000h,000h,000h
fon14_ascii247  DB   000h,000h,000h,00h,000h,076h,0DCh,000h
                DB   076h,0DCh,000h,000h,000h,000h
fon14_ascii248  DB   000h,038h,06Ch,6Ch,038h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii249  DB   000h,000h,000h,00h,000h,000h,000h,018h
                DB   018h,000h,000h,000h,000h,000h
fon14_ascii250  DB   000h,000h,000h,00h,000h,000h,000h,000h
                DB   018h,000h,000h,000h,000h,000h
fon14_ascii251  DB   000h,000h,0E0h,18h,006h,003h,0F1h,0F9h
                DB   023h,0FEh,0A0h,0A0h,000h,000h
fon14_ascii252  DB   000h,000h,000h,06h,008h,04Bh,04Bh,068h
                DB   06Bh,058h,048h,088h,000h,000h
fon14_ascii253  DB   000h,070h,0D8h,30h,060h,0C8h,0F8h,000h
                DB   000h,000h,000h,000h,000h,000h
fon14_ascii254  DB   000h,000h,000h,0FFh,081h,0BDh,0A5h,0A5h
                DB   0BDh,081h,0FFh,000h,000h,000h
fon14_ascii255  DB   000h,000h,000h,00h,000h,000h,000h,000h
                DB   000h,042h,042h,07Eh,000h,000h

Исходный текст файла VGA_FONT.INC, содержащий определение шрифтов размера 8х16 пикселов приведен в листинге 5.9. Каждый символ определяется шестнадцатью байтами.

Листинг 5.9. Файл VGA_FONT.INC


fon16_ascii0    DB   000h,000h,000h,000h,000h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii1    DB   000h,000h,07Eh,081h,0A5h,081h,081h,0A5h
                DB   099h,081h,081h,07Eh,000h,000h,000h,000h
fon16_ascii2    DB   000h,000h,07Eh,0FFh,0DBh,0FFh,0FFh,0DBh
                DB   0E7h,0FFh,0FFh,07Eh,000h,000h,000h,000h
fon16_ascii3    DB   000h,000h,000h,000h,06Ch,0FEh,0FEh,0FEh
                DB   0FEh,07Ch,038h,010h,000h,000h,000h,000h
fon16_ascii4    DB   000h,000h,000h,000h,010h,038h,07Ch,0FEh
                DB   07Ch,038h,010h,000h,000h,000h,000h,000h
fon16_ascii5    DB   000h,000h,000h,018h,03Ch,03Ch,0E7h,0E7h
                DB   0E7h,018h,018h,03Ch,000h,000h,000h,000h
fon16_ascii6    DB   000h,000h,000h,018h,03Ch,07Eh,0FFh,0FFh
                DB   07Eh,018h,018h,03Ch,000h,000h,000h,000h
fon16_ascii7    DB   000h,000h,000h,000h,000h,000h,018h,03Ch
                DB   03Ch,018h,000h,000h,000h,000h,000h,000h
fon16_ascii8    DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E7h,0C3h
                DB   0C3h,0E7h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
fon16_ascii9    DB   000h,000h,000h,000h,000h,03Ch,066h,042h
                DB   042h,066h,03Ch,000h,000h,000h,000h,000h
fon16_ascii10   DB   0FFh,0FFh,0FFh,0FFh,0FFh,0C3h,099h,0BDh
                DB   0BDh,099h,0C3h,0FFh,0FFh,0FFh,0FFh,0FFh
fon16_ascii11   DB   000h,000h,01Eh,006h,00Eh,01Ah,078h,0CCh
                DB   0CCh,0CCh,0CCh,078h,000h,000h,000h,000h
fon16_ascii12   DB   000h,000h,03Ch,066h,066h,066h,066h,03Ch
                DB   018h,07Eh,018h,018h,000h,000h,000h,000h
fon16_ascii13   DB   000h,000h,03Fh,033h,03Fh,030h,030h,030h
                DB   030h,070h,0F0h,0E0h,000h,000h,000h,000h
fon16_ascii14   DB   000h,000h,07Fh,063h,07Fh,063h,063h,063h
                DB   063h,067h,0E7h,0E6h,0C0h,000h,000h,000h
fon16_ascii15   DB   000h,000h,000h,018h,018h,0DBh,03Ch,0E7h
                DB   03Ch,0DBh,018h,018h,000h,000h,000h,000h
fon16_ascii16   DB   000h,080h,0C0h,0E0h,0F0h,0F8h,0FEh,0F8h
                DB   0F0h,0E0h,0C0h,080h,000h,000h,000h,000h
fon16_ascii17   DB   000h,002h,006h,00Eh,01Eh,03Eh,0FEh,03Eh
                DB   01Eh,00Eh,006h,002h,000h,000h,000h,000h
fon16_ascii18   DB   000h,000h,018h,03Ch,07Eh,018h,018h,018h
                DB   07Eh,03Ch,018h,000h,000h,000h,000h,000h
fon16_ascii19   DB   000h,000h,066h,066h,066h,066h,066h,066h
                DB   066h,000h,066h,066h,000h,000h,000h,000h
fon16_ascii20   DB   000h,000h,07Fh,0DBh,0DBh,0DBh,07Bh,01Bh
                DB   01Bh,01Bh,01Bh,01Bh,000h,000h,000h,000h
fon16_ascii21   DB   000h,07Ch,0C6h,060h,038h,06Ch,0C6h,0C6h
                DB   06Ch,038h,00Ch,0C6h,07Ch,000h,000h,000h
fon16_ascii22   DB   000h,000h,000h,000h,000h,000h,000h,000h
                DB   0FEh,0FEh,0FEh,0FEh,000h,000h,000h,000h
fon16_ascii23   DB   000h,000h,018h,03Ch,07Eh,018h,018h,018h
                DB   07Eh,03Ch,018h,07Eh,000h,000h,000h,000h
fon16_ascii24   DB   000h,000h,018h,03Ch,07Eh,018h,018h,018h
                DB   018h,018h,018h,018h,000h,000h,000h,000h
fon16_ascii25   DB   000h,000h,018h,018h,018h,018h,018h,018h
                DB   018h,07Eh,03Ch,018h,000h,000h,000h,000h
fon16_ascii26   DB   000h,000h,000h,000h,000h,018h,00Ch,0FEh
                DB   00Ch,018h,000h,000h,000h,000h,000h,000h
fon16_ascii27   DB   000h,000h,000h,000h,000h,030h,060h,0FEh
                DB   060h,030h,000h,000h,000h,000h,000h,000h
fon16_ascii28   DB   000h,000h,000h,000h,000h,000h,0C0h,0C0h
                DB   0C0h,0FEh,000h,000h,000h,000h,000h,000h
fon16_ascii29   DB   000h,000h,000h,000h,000h,028h,06Ch,0FEh
                DB   06Ch,028h,000h,000h,000h,000h,000h,000h
fon16_ascii30   DB   000h,000h,000h,000h,010h,038h,038h,07Ch
                DB   07Ch,0FEh,0FEh,000h,000h,000h,000h,000h
fon16_ascii31   DB   000h,000h,000h,000h,0FEh,0FEh,07Ch,07Ch
                DB   038h,038h,010h,000h,000h,000h,000h,000h
fon16_ascii32   DB   000h,000h,000h,000h,000h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii33   DB   000h,000h,018h,03Ch,03Ch,03Ch,018h,018h
                DB   018h,000h,018h,018h,000h,000h,000h,000h
fon16_ascii34   DB   000h,066h,066h,066h,024h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii35   DB   000h,000h,000h,06Ch,06Ch,0FEh,06Ch,06Ch
                DB   06Ch,0FEh,06Ch,06Ch,000h,000h,000h,000h
fon16_ascii36   DB   018h,018h,07Ch,0C6h,0C2h,0C0h,07Ch,006h
                DB   006h,086h,0C6h,07Ch,018h,018h,000h,000h
fon16_ascii37   DB   000h,000h,000h,000h,0C2h,0C6h,00Ch,018h
                DB   030h,060h,0C6h,086h,000h,000h,000h,000h
fon16_ascii38   DB   000h,000h,038h,06Ch,06Ch,038h,076h,0DCh
                DB   0CCh,0CCh,0CCh,076h,000h,000h,000h,000h
fon16_ascii39   DB   000h,030h,030h,030h,060h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii40   DB   000h,000h,00Ch,018h,030h,030h,030h,030h
                DB   030h,030h,018h,00Ch,000h,000h,000h,000h
fon16_ascii41   DB   000h,000h,030h,018h,00Ch,00Ch,00Ch,00Ch
                DB   00Ch,00Ch,018h,030h,000h,000h,000h,000h
fon16_ascii42   DB   000h,000h,000h,000h,000h,066h,03Ch,0FFh
                DB   03Ch,066h,000h,000h,000h,000h,000h,000h
fon16_ascii43   DB   000h,000h,000h,000h,000h,018h,018h,07Eh
                DB   018h,018h,000h,000h,000h,000h,000h,000h
fon16_ascii44   DB   000h,000h,000h,000h,000h,000h,000h,000h
                DB   000h,018h,018h,018h,030h,000h,000h,000h
fon16_ascii45   DB   000h,000h,000h,000h,000h,000h,000h,0FEh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii46   DB   000h,000h,000h,000h,000h,000h,000h,000h
                DB   000h,000h,018h,018h,000h,000h,000h,000h
fon16_ascii47   DB   000h,000h,000h,000h,002h,006h,00Ch,018h
                DB   030h,060h,0C0h,080h,000h,000h,000h,000h
fon16_ascii48   DB   000h,000h,038h,06Ch,0C6h,0C6h,0D6h,0D6h
                DB   0C6h,0C6h,06Ch,038h,000h,000h,000h,000h
fon16_ascii49   DB   000h,000h,018h,038h,078h,018h,018h,018h
                DB   018h,018h,018h,07Eh,000h,000h,000h,000h
fon16_ascii50   DB   000h,000h,07Ch,0C6h,006h,00Ch,018h,030h
                DB   060h,0C0h,0C6h,0FEh,000h,000h,000h,000h
fon16_ascii51   DB   000h,000h,07Ch,0C6h,006h,006h,03Ch,006h
                DB   006h,006h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii52   DB   000h,000h,00Ch,01Ch,03Ch,06Ch,0CCh,0FEh
                DB   00Ch,00Ch,00Ch,01Eh,000h,000h,000h,000h
fon16_ascii53   DB   000h,000h,0FEh,0C0h,0C0h,0C0h,0FCh,006h
                DB   006h,006h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii54   DB   000h,000h,038h,060h,0C0h,0C0h,0FCh,0C6h
                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii55   DB   000h,000h,0FEh,0C6h,006h,006h,00Ch,018h
                DB   030h,030h,030h,030h,000h,000h,000h,000h
fon16_ascii56   DB   000h,000h,07Ch,0C6h,0C6h,0C6h,07Ch,0C6h
                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii57   DB   000h,000h,07Ch,0C6h,0C6h,0C6h,07Eh,006h
                DB   006h,006h,00Ch,078h,000h,000h,000h,000h
fon16_ascii58   DB   000h,000h,000h,000h,018h,018h,000h,000h
                DB   000h,018h,018h,000h,000h,000h,000h,000h
fon16_ascii59   DB   000h,000h,000h,000h,018h,018h,000h,000h
                DB   000h,018h,018h,030h,000h,000h,000h,000h
fon16_ascii60   DB   000h,000h,000h,006h,00Ch,018h,030h,060h
                DB   030h,018h,00Ch,006h,000h,000h,000h,000h
fon16_ascii61   DB   000h,000h,000h,000h,000h,07Eh,000h,000h
                DB   07Eh,000h,000h,000h,000h,000h,000h,000h
fon16_ascii62   DB   000h,000h,000h,060h,030h,018h,00Ch,006h
                DB   00Ch,018h,030h,060h,000h,000h,000h,000h
fon16_ascii63   DB   000h,000h,07Ch,0C6h,0C6h,00Ch,018h,018h
                DB   018h,000h,018h,018h,000h,000h,000h,000h
fon16_ascii64   DB   000h,000h,000h,07Ch,0C6h,0C6h,0DEh,0DEh
                DB   0DEh,0DCh,0C0h,07Ch,000h,000h,000h,000h
fon16_ascii65   DB   000h,000h,010h,038h,06Ch,0C6h,0C6h,0FEh
                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii66   DB   000h,000h,0FCh,066h,066h,066h,07Ch,066h
                DB   066h,066h,066h,0FCh,000h,000h,000h,000h
fon16_ascii67   DB   000h,000h,03Ch,066h,0C2h,0C0h,0C0h,0C0h
                DB   0C0h,0C2h,066h,03Ch,000h,000h,000h,000h
fon16_ascii68   DB   000h,000h,0F8h,06Ch,066h,066h,066h,066h
                DB   066h,066h,06Ch,0F8h,000h,000h,000h,000h
fon16_ascii69   DB   000h,000h,0FEh,066h,062h,068h,078h,068h
                DB   060h,062h,066h,0FEh,000h,000h,000h,000h
fon16_ascii70   DB   000h,000h,0FEh,066h,062h,068h,078h,068h
                DB   060h,060h,060h,0F0h,000h,000h,000h,000h
fon16_ascii71   DB   000h,000h,03Ch,066h,0C2h,0C0h,0C0h,0DEh
                DB   0C6h,0C6h,066h,03Ah,000h,000h,000h,000h
fon16_ascii72   DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0FEh,0C6h
                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii73   DB   000h,000h,03Ch,018h,018h,018h,018h,018h
                DB   018h,018h,018h,03Ch,000h,000h,000h,000h
fon16_ascii74   DB   000h,000h,01Eh,00Ch,00Ch,00Ch,00Ch,00Ch
                DB   0CCh,0CCh,0CCh,078h,000h,000h,000h,000h
fon16_ascii75   DB   000h,000h,0E6h,066h,066h,06Ch,078h,078h
                DB   06Ch,066h,066h,0E6h,000h,000h,000h,000h
fon16_ascii76   DB   000h,000h,0F0h,060h,060h,060h,060h,060h
                DB   060h,062h,066h,0FEh,000h,000h,000h,000h
fon16_ascii77   DB   000h,000h,0C6h,0EEh,0FEh,0FEh,0D6h,0C6h
                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii78   DB   000h,000h,0C6h,0E6h,0F6h,0FEh,0DEh,0CEh
                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii79   DB   000h,000h,07Ch,0C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii80   DB   000h,000h,0FCh,066h,066h,066h,07Ch,060h
                DB   060h,060h,060h,0F0h,000h,000h,000h,000h
fon16_ascii81   DB   000h,000h,07Ch,0C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,0D6h,0DEh,07Ch,00Ch,00Eh,000h,000h
fon16_ascii82   DB   000h,000h,0FCh,066h,066h,066h,07Ch,06Ch
                DB   066h,066h,066h,0E6h,000h,000h,000h,000h
fon16_ascii83   DB   000h,000h,07Ch,0C6h,0C6h,060h,038h,00Ch
                DB   006h,0C6h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii84   DB   000h,000h,07Eh,07Eh,05Ah,018h,018h,018h
                DB   018h,018h,018h,03Ch,000h,000h,000h,000h
fon16_ascii85   DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii86   DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,06Ch,038h,010h,000h,000h,000h,000h
fon16_ascii87   DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0D6h,0D6h
                DB   0D6h,0FEh,0EEh,06Ch,000h,000h,000h,000h
fon16_ascii88   DB   000h,000h,0C6h,0C6h,06Ch,07Ch,038h,038h
                DB   07Ch,06Ch,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii89   DB   000h,000h,066h,066h,066h,066h,03Ch,018h
                DB   018h,018h,018h,03Ch,000h,000h,000h,000h
fon16_ascii90   DB   000h,000h,0FEh,0C6h,086h,00Ch,018h,030h
                DB   060h,0C2h,0C6h,0FEh,000h,000h,000h,000h
fon16_ascii91   DB   000h,000h,03Ch,030h,030h,030h,030h,030h
                DB   030h,030h,030h,03Ch,000h,000h,000h,000h
fon16_ascii92   DB   000h,000h,000h,080h,0C0h,0E0h,070h,038h
                DB   01Ch,00Eh,006h,002h,000h,000h,000h,000h
fon16_ascii93   DB   000h,000h,03Ch,00Ch,00Ch,00Ch,00Ch,00Ch
                DB   00Ch,00Ch,00Ch,03Ch,000h,000h,000h,000h
fon16_ascii94   DB   010h,038h,06Ch,0C6h,000h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii95   DB   000h,000h,000h,000h,000h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,0FFh,000h,000h
fon16_ascii96   DB   030h,030h,018h,000h,000h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii97   DB   000h,000h,000h,000h,000h,078h,00Ch,07Ch
                DB   0CCh,0CCh,0CCh,07Ch,000h,000h,000h,000h
fon16_ascii98   DB   000h,000h,060h,060h,060h,078h,06Ch,066h
                DB   066h,066h,066h,07Ch,000h,000h,000h,000h
fon16_ascii99   DB   000h,000h,000h,000h,000h,07Ch,0C6h,0C0h
                DB   0C0h,0C0h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii100  DB   000h,000h,00Ch,00Ch,00Ch,03Ch,06Ch,0CCh
                DB   0CCh,0CCh,0CCh,07Ch,000h,000h,000h,000h
fon16_ascii101  DB   000h,000h,000h,000h,000h,07Ch,0C6h,0FEh
                DB   0C0h,0C0h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii102  DB   000h,000h,038h,06Ch,064h,060h,0F0h,060h
                DB   060h,060h,060h,0F0h,000h,000h,000h,000h
fon16_ascii103  DB   000h,000h,000h,000h,000h,07Ch,0CCh,0CCh
                DB   0CCh,0CCh,0CCh,07Ch,00Ch,0CCh,078h,000h
fon16_ascii104  DB   000h,000h,060h,060h,060h,07Ch,066h,066h
                DB   066h,066h,066h,066h,000h,000h,000h,000h
fon16_ascii105  DB   000h,000h,018h,018h,000h,038h,018h,018h
                DB   018h,018h,018h,03Ch,000h,000h,000h,000h
fon16_ascii106  DB   000h,000h,006h,006h,000h,00Eh,006h,006h
                DB   006h,006h,006h,006h,066h,066h,03Ch,000h
fon16_ascii107  DB   000h,000h,0E0h,060h,060h,066h,06Ch,078h
                DB   078h,06Ch,066h,0E6h,000h,000h,000h,000h
fon16_ascii108  DB   000h,000h,038h,018h,018h,018h,018h,018h
                DB   018h,018h,018h,03Ch,000h,000h,000h,000h
fon16_ascii109  DB   000h,000h,000h,000h,000h,0ECh,0FEh,0D6h
                DB   0D6h,0D6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii110  DB   000h,000h,000h,000h,000h,07Ch,066h,066h
                DB   066h,066h,066h,066h,000h,000h,000h,000h
fon16_ascii111  DB   000h,000h,000h,000h,000h,07Ch,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii112  DB   000h,000h,000h,000h,000h,07Ch,066h,066h
                DB   066h,066h,066h,07Ch,060h,060h,060h,000h
fon16_ascii113  DB   000h,000h,000h,000h,000h,07Ch,0CCh,0CCh
                DB   0CCh,0CCh,0CCh,07Ch,00Ch,00Ch,00Ch,000h
fon16_ascii114  DB   000h,000h,000h,000h,000h,0DCh,076h,066h
                DB   060h,060h,060h,0F0h,000h,000h,000h,000h
fon16_ascii115  DB   000h,000h,000h,000h,000h,07Ch,0C6h,060h
                DB   038h,00Ch,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii116  DB   000h,000h,010h,030h,030h,0FCh,030h,030h
                DB   030h,030h,036h,01Ch,000h,000h,000h,000h
fon16_ascii117  DB   000h,000h,000h,000h,000h,0CCh,0CCh,0CCh
                DB   0CCh,0CCh,0CCh,07Ch,000h,000h,000h,000h
fon16_ascii118  DB   000h,000h,000h,000h,000h,066h,066h,066h
                DB   066h,066h,03Ch,018h,000h,000h,000h,000h
fon16_ascii119  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0D6h
                DB   0D6h,0D6h,0FEh,06Ch,000h,000h,000h,000h
fon16_ascii120  DB   000h,000h,000h,000h,000h,0C6h,06Ch,038h
                DB   038h,038h,06Ch,0C6h,000h,000h,000h,000h
fon16_ascii121  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,07Eh,006h,0C6h,07Ch,000h
fon16_ascii122  DB   000h,000h,000h,000h,000h,0FEh,0CCh,018h
                DB   030h,060h,0C6h,0FEh,000h,000h,000h,000h
fon16_ascii123  DB   000h,000h,00Eh,018h,018h,018h,070h,018h
                DB   018h,018h,018h,00Eh,000h,000h,000h,000h
fon16_ascii124  DB   000h,000h,018h,018h,018h,018h,000h,018h
                DB   018h,018h,018h,018h,000h,000h,000h,000h
fon16_ascii125  DB   000h,000h,070h,018h,018h,018h,00Eh,018h
                DB   018h,018h,018h,070h,000h,000h,000h,000h
fon16_ascii126  DB   000h,000h,076h,0DCh,000h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii127  DB   000h,000h,000h,000h,010h,038h,06Ch,0C6h
                DB   0C6h,0C6h,0FEh,000h,000h,000h,000h,000h
fon16_ascii128  DB   000h,000h,01Eh,036h,066h,0C6h,0C6h,0FEh
                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii129  DB   000h,000h,0FEh,062h,062h,060h,07Ch,066h
                DB   066h,066h,066h,0FCh,000h,000h,000h,000h
fon16_ascii130  DB   000h,000h,0FCh,066h,066h,066h,07Ch,066h
                DB   066h,066h,066h,0FCh,000h,000h,000h,000h
fon16_ascii131  DB   000h,000h,0FEh,062h,062h,060h,060h,060h
                DB   060h,060h,060h,0F0h,000h,000h,000h,000h
fon16_ascii132  DB   000h,000h,01Eh,036h,066h,066h,066h,066h
                DB   066h,066h,066h,0FFh,0C3h,081h,000h,000h
fon16_ascii133  DB   000h,000h,0FEh,066h,062h,068h,078h,068h
                DB   060h,062h,066h,0FEh,000h,000h,000h,000h
fon16_ascii134  DB   000h,000h,0D6h,0D6h,054h,054h,07Ch,07Ch
                DB   054h,0D6h,0D6h,0D6h,000h,000h,000h,000h
fon16_ascii135  DB   000h,000h,07Ch,0C6h,006h,006h,03Ch,006h
                DB   006h,006h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii136  DB   000h,000h,0C6h,0C6h,0CEh,0CEh,0D6h,0E6h
                DB   0E6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii137  DB   038h,038h,0C6h,0C6h,0CEh,0CEh,0D6h,0E6h
                DB   0E6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii138  DB   000h,000h,0E6h,066h,06Ch,06Ch,078h,078h
                DB   06Ch,06Ch,066h,0E6h,000h,000h,000h,000h
fon16_ascii139  DB   000h,000h,01Eh,036h,066h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii140  DB   000h,000h,0C6h,0EEh,0FEh,0FEh,0D6h,0C6h
                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii141  DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0FEh,0C6h
                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii142  DB   000h,000h,07Ch,0C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii143  DB   000h,000h,0FEh,0C6h,0C6h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii144  DB   000h,000h,0FCh,066h,066h,066h,07Ch,060h
                DB   060h,060h,060h,0F0h,000h,000h,000h,000h
fon16_ascii145  DB   000h,000h,03Ch,066h,0C2h,0C0h,0C0h,0C0h
                DB   0C0h,0C2h,066h,03Ch,000h,000h,000h,000h
fon16_ascii146  DB   000h,000h,07Eh,05Ah,018h,018h,018h,018h
                DB   018h,018h,018h,03Ch,000h,000h,000h,000h
fon16_ascii147  DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0C6h,07Eh
                DB   006h,006h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii148  DB   000h,03Ch,018h,07Eh,0DBh,0DBh,0DBh,0DBh
                DB   0DBh,07Eh,018h,03Ch,000h,000h,000h,000h
fon16_ascii149  DB   000h,000h,0C6h,0C6h,06Ch,07Ch,038h,038h
                DB   07Ch,06Ch,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii150  DB   000h,000h,0CCh,0CCh,0CCh,0CCh,0CCh,0CCh
                DB   0CCh,0CCh,0CCh,0FEh,006h,006h,000h,000h
fon16_ascii151  DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0C6h,07Eh
                DB   006h,006h,006h,006h,000h,000h,000h,000h
fon16_ascii152  DB   000h,000h,0DBh,0DBh,0DBh,0DBh,0DBh,0DBh
                DB   0DBh,0DBh,0DBh,0FFh,000h,000h,000h,000h
fon16_ascii153  DB   000h,000h,0DBh,0DBh,0DBh,0DBh,0DBh,0DBh
                DB   0DBh,0DBh,0DBh,0FFh,003h,003h,000h,000h
fon16_ascii154  DB   000h,000h,0F8h,0B0h,030h,030h,03Eh,033h
                DB   033h,033h,033h,07Eh,000h,000h,000h,000h
fon16_ascii155  DB   000h,000h,0C3h,0C3h,0C3h,0C3h,0F3h,0DBh
                DB   0DBh,0DBh,0DBh,0F3h,000h,000h,000h,000h
fon16_ascii156  DB   000h,000h,0F0h,060h,060h,060h,07Ch,066h
                DB   066h,066h,066h,0FCh,000h,000h,000h,000h
fon16_ascii157  DB   000h,000h,07Ch,0C6h,006h,026h,03Eh,026h
                DB   006h,006h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii158  DB   000h,000h,0CEh,0DBh,0DBh,0DBh,0FBh,0DBh
                DB   0DBh,0DBh,0DBh,0CEh,000h,000h,000h,000h
fon16_ascii159  DB   000h,000h,03Fh,066h,066h,066h,03Eh,03Eh
                DB   066h,066h,066h,0E7h,000h,000h,000h,000h
fon16_ascii160  DB   000h,000h,000h,000h,000h,078h,00Ch,07Ch
                DB   0CCh,0CCh,0CCh,076h,000h,000h,000h,000h
fon16_ascii161  DB   000h,002h,006h,03Ch,060h,060h,07Ch,066h
                DB   066h,066h,066h,03Ch,000h,000h,000h,000h
fon16_ascii162  DB   000h,000h,000h,000h,000h,0FCh,066h,066h
                DB   07Ch,066h,066h,0FCh,000h,000h,000h,000h
fon16_ascii163  DB   000h,000h,000h,000h,000h,07Eh,032h,032h
                DB   030h,030h,030h,078h,000h,000h,000h,000h
fon16_ascii164  DB   000h,000h,000h,000h,000h,01Eh,036h,036h
                DB   066h,066h,066h,0FFh,0C3h,0C3h,000h,000h
fon16_ascii165  DB   000h,000h,000h,000h,000h,07Ch,0C6h,0FEh
                DB   0C0h,0C0h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii166  DB   000h,000h,000h,000h,000h,0D6h,0D6h,054h
                DB   07Ch,054h,0D6h,0D6h,000h,000h,000h,000h
fon16_ascii167  DB   000h,000h,000h,000h,000h,03Ch,066h,006h
                DB   00Ch,006h,066h,03Ch,000h,000h,000h,000h
fon16_ascii168  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0CEh
                DB   0D6h,0E6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii169  DB   000h,000h,000h,038h,038h,0C6h,0C6h,0CEh
                DB   0D6h,0E6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii170  DB   000h,000h,000h,000h,000h,0E6h,06Ch,078h
                DB   078h,06Ch,066h,0E6h,000h,000h,000h,000h
fon16_ascii171  DB   000h,000h,000h,000h,000h,01Eh,036h,066h
                DB   066h,066h,066h,066h,000h,000h,000h,000h
fon16_ascii172  DB   000h,000h,000h,000h,000h,0C6h,0EEh,0FEh
                DB   0FEh,0D6h,0D6h,0C6h,000h,000h,000h,000h
fon16_ascii173  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0C6h
                DB   0FEh,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii174  DB   000h,000h,000h,000h,000h,07Ch,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii175  DB   000h,000h,000h,000h,000h,0FEh,0C6h,0C6h
                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h
fon16_ascii176  DB   011h,044h,011h,044h,011h,044h,011h,044h
                DB   011h,044h,011h,044h,011h,044h,011h,044h
fon16_ascii177  DB   055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
                DB   055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
fon16_ascii178  DB   0DDh,077h,0DDh,077h,0DDh,077h,0DDh,077h
                DB   0DDh,077h,0DDh,077h,0DDh,077h,0DDh,077h
fon16_ascii179  DB   018h,018h,018h,018h,018h,018h,018h,018h
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii180  DB   018h,018h,018h,018h,018h,018h,018h,0F8h
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii181  DB   018h,018h,018h,018h,018h,0F8h,018h,0F8h
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii182  DB   036h,036h,036h,036h,036h,036h,036h,0F6h
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii183  DB   000h,000h,000h,000h,000h,000h,000h,0FEh
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii184  DB   000h,000h,000h,000h,000h,0F8h,018h,0F8h
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii185  DB   036h,036h,036h,036h,036h,0F6h,006h,0F6h
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii186  DB   036h,036h,036h,036h,036h,036h,036h,036h
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii187  DB   000h,000h,000h,000h,000h,0FEh,006h,0F6h
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii188  DB   036h,036h,036h,036h,036h,0F6h,006h,0FEh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii189  DB   036h,036h,036h,036h,036h,036h,036h,0FEh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii190  DB   018h,018h,018h,018h,018h,0F8h,018h,0F8h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii191  DB   000h,000h,000h,000h,000h,000h,000h,0F8h
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii192  DB   018h,018h,018h,018h,018h,018h,018h,01Fh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii193  DB   018h,018h,018h,018h,018h,018h,018h,0FFh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii194  DB   000h,000h,000h,000h,000h,000h,000h,0FFh
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii195  DB   018h,018h,018h,018h,018h,018h,018h,01Fh
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii196  DB   000h,000h,000h,000h,000h,000h,000h,0FFh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii197  DB   018h,018h,018h,018h,018h,018h,018h,0FFh
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii198  DB   018h,018h,018h,018h,018h,01Fh,018h,01Fh
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii199  DB   036h,036h,036h,036h,036h,036h,036h,037h
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii200  DB   036h,036h,036h,036h,036h,037h,030h,03Fh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii201  DB   000h,000h,000h,000h,000h,03Fh,030h,037h
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii202  DB   036h,036h,036h,036h,036h,0F7h,000h,0FFh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii203  DB   000h,000h,000h,000h,000h,0FFh,000h,0F7h
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii204  DB   036h,036h,036h,036h,036h,037h,030h,037h
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii205  DB   000h,000h,000h,000h,000h,0FFh,000h,0FFh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii206  DB   036h,036h,036h,036h,036h,0F7h,000h,0F7h
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii207  DB   018h,018h,018h,018h,018h,0FFh,000h,0FFh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii208  DB   036h,036h,036h,036h,036h,036h,036h,0FFh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii209  DB   000h,000h,000h,000h,000h,0FFh,000h,0FFh
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii210  DB   000h,000h,000h,000h,000h,000h,000h,0FFh
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii211  DB   036h,036h,036h,036h,036h,036h,036h,03Fh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii212  DB   018h,018h,018h,018h,018h,01Fh,018h,01Fh
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii213  DB   000h,000h,000h,000h,000h,01Fh,018h,01Fh
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii214  DB   000h,000h,000h,000h,000h,000h,000h,03Fh
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii215  DB   036h,036h,036h,036h,036h,036h,036h,0FFh
                DB   036h,036h,036h,036h,036h,036h,036h,036h
fon16_ascii216  DB   018h,018h,018h,018h,018h,0FFh,018h,0FFh
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii217  DB   018h,018h,018h,018h,018h,018h,018h,0F8h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii218  DB   000h,000h,000h,000h,000h,000h,000h,01Fh
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii219  DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
                DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
fon16_ascii220  DB   000h,000h,000h,000h,000h,000h,000h,0FFh
                DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
fon16_ascii221  DB   0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h
                DB   0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h
fon16_ascii222  DB   00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh
                DB   00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh
fon16_ascii223  DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii224  DB   000h,000h,000h,000h,000h,0DCh,066h,066h
                DB   066h,066h,066h,07Ch,060h,060h,0F0h,000h
fon16_ascii225  DB   000h,000h,000h,000h,000h,07Ch,0C6h,0C0h
                DB   0C0h,0C0h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii226  DB   000h,000h,000h,000h,000h,07Eh,05Ah,018h
                DB   018h,018h,018h,03Ch,000h,000h,000h,000h
fon16_ascii227  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0C6h
                DB   0C6h,0C6h,07Eh,006h,006h,0C6h,07Ch,000h
fon16_ascii228  DB   000h,000h,000h,000h,03Ch,018h,07Eh,0DBh
                DB   0DBh,0DBh,0DBh,07Eh,018h,018h,03Ch,000h
fon16_ascii229  DB   000h,000h,000h,000h,000h,0C6h,06Ch,038h
                DB   038h,038h,06Ch,0C6h,000h,000h,000h,000h
fon16_ascii230  DB   000h,000h,000h,000h,000h,0CCh,0CCh,0CCh
                DB   0CCh,0CCh,0CCh,0FEh,006h,006h,000h,000h
fon16_ascii231  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0C6h
                DB   0C6h,07Eh,006h,006h,000h,000h,000h,000h
fon16_ascii232  DB   000h,000h,000h,000h,000h,0D6h,0D6h,0D6h
                DB   0D6h,0D6h,0D6h,0FEh,000h,000h,000h,000h
fon16_ascii233  DB   000h,000h,000h,000h,000h,0D6h,0D6h,0D6h
                DB   0D6h,0D6h,0D6h,0FEh,003h,003h,000h,000h
fon16_ascii234  DB   000h,000h,000h,000h,000h,0F8h,0B0h,030h
                DB   03Eh,033h,033h,07Eh,000h,000h,000h,000h
fon16_ascii235  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0C6h
                DB   0F6h,0DEh,0DEh,0F6h,000h,000h,000h,000h
fon16_ascii236  DB   000h,000h,000h,000h,000h,0F0h,060h,060h
                DB   07Ch,066h,066h,0FCh,000h,000h,000h,000h
fon16_ascii237  DB   000h,000h,000h,000h,000h,03Ch,066h,006h
                DB   01Eh,006h,066h,03Ch,000h,000h,000h,000h
fon16_ascii238  DB   000h,000h,000h,000h,000h,0CEh,0DBh,0DBh
                DB   0FBh,0DBh,0DBh,0CEh,000h,000h,000h,000h
fon16_ascii239  DB   000h,000h,000h,000h,000h,07Eh,0CCh,0CCh
                DB   0FCh,06Ch,0CCh,0CEh,000h,000h,000h,000h
fon16_ascii240  DB   000h,06Ch,000h,0FEh,066h,062h,068h,078h
                DB   068h,062h,066h,0FEh,000h,000h,000h,000h
fon16_ascii241  DB   000h,000h,000h,06Ch,000h,07Ch,0C6h,0FEh
                DB   0C0h,0C0h,0C6h,07Ch,000h,000h,000h,000h
fon16_ascii242  DB   000h,000h,000h,030h,018h,00Ch,006h,00Ch
                DB   018h,030h,000h,07Eh,000h,000h,000h,000h
fon16_ascii243  DB   000h,000h,000h,00Ch,018h,030h,060h,030h
                DB   018h,00Ch,000h,07Eh,000h,000h,000h,000h
fon16_ascii244  DB   000h,000h,00Eh,01Bh,01Bh,018h,018h,018h
                DB   018h,018h,018h,018h,018h,018h,018h,018h
fon16_ascii245  DB   018h,018h,018h,018h,018h,018h,018h,018h
                DB   0D8h,0D8h,0D8h,070h,000h,000h,000h,000h
fon16_ascii246  DB   000h,000h,000h,000h,018h,018h,000h,07Eh
                DB   000h,018h,018h,000h,000h,000h,000h,000h
fon16_ascii247  DB   000h,000h,000h,000h,000h,076h,0DCh,000h
                DB   076h,0DCh,000h,000h,000h,000h,000h,000h
fon16_ascii248  DB   000h,038h,06Ch,06Ch,038h,000h,000h,000h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii249  DB   000h,000h,000h,000h,000h,000h,000h,018h
                DB   018h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii250  DB   000h,000h,000h,000h,000h,000h,000h,000h
                DB   018h,000h,000h,000h,000h,000h,000h,000h
fon16_ascii251  DB   000h,000h,000h,001h,003h,002h,006h,004h
                DB   0CCh,068h,038h,010h,000h,000h,000h,000h
fon16_ascii252  DB   000h,000h,000h,03Ch,042h,099h,0A5h,0A1h
                DB   0A5h,099h,042h,03Ch,000h,000h,000h,000h
fon16_ascii253  DB   000h,070h,0D8h,030h,060h,0C8h,0F8h,000h
                DB   000h,000h,000h,000h,000h,000h,000h,000h
fon14_ascii254  DB   0FFh,0FFh,081h,081h,0BDh,0BDh,0A5h,0A5h
                DB   0A5h,0A5h,0BDh,0BDh,081h,081h,0FFh,0FFh
fon16_ascii255  DB   000h,000h,000h,000h,000h,000h,000h,000h
                DB   000h,000h,042h,07Eh,000h,000h,000h,000h

Теперь приведем исходный текст программы TEST_RUS (листинг 5.10), которая позволяет проверить работу русификатора RUS_DRV в различных режимах работы видеоадаптера.

Листинг 5.10. Файл TEST_RUS.INC


#include <conio.h>
#include <stdio.h>

// Главная функция программы
void main(void) {

	int   ch = 0, i;

	for( i = 0; ( i <= 0x13 ) && ( ch != 27 ); i++ ) {

		// Исключаем из проверки режимы 8 - 0xC
		if(( i > 7 ) && ( i <= 0xC )) continue;

		// Устанавливаем режим i
		_asm {
			mov	ax,i
			int	10h
		}

		// Отображаем текстовую строку
		printf(" Режим видеоадаптера номер %x", i );
		ch = getch();
	}
}