У всех компьютеров, совместимых с 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 прерывания 10h позволяет задать любой стандартный режим работы видеоадаптера:
На входе: |
AH |
00h |
|
AL |
Номер устанавливаемого режима работы видеоадаптера, если бит D7 = 1, то при установке режима видеопамять не очищается |
На выходе: |
Не используются |
Приведем пример выбора режима видеоадаптера:
mov ah, 0 mov al, 3 ; Выбираем режим номер 3 (16 цветной, текстовый, int 10h ; разрешение 25х80 символов)
Функция 01h позволяет изменить вертикальные размеры курсора путем задания верхней и нижней границ курсора (рис. 5.1). Горизонтальные размеры курсора всегда одинаковы и равны ширине одного символа. Курсор отображается только в текстовых режимах работы видеоадаптера.
На входе: |
AH |
00h |
|
CH |
Верхняя граница курсора. Если регистр CH содержит значение 20h курсор не отображается |
|
CL |
Нижняя граница курсора |
На выходе: |
|
Не используются |
При выборе режима работы видеоадаптера BIOS устанавливает следующие значения для верхней и нижней границ курсора:
Рисунок 5.1 Изменение положения курсора
Функция 02h задает текущее положение курсора на экране монитора. Если видеопамять разделена на несколько страниц, то каждая из них имеет свой курсор, координаты которого можно устанавливать отдельно.
Координаты курсора определяют не только место на экране, где он отображается, но также и позицию, начиная с которой соответствующие функции BIOS будут выводить на экран строки или отдельные символы.
На входе: |
AH |
02h |
|
BH |
Номер страницы видеопамяти |
|
DH |
Номер строки |
|
DL |
Номер столбца |
На выходе: |
|
Не используются |
Функция 03h позволяет узнать размер и текущие координаты курсора для любой страницы видеопамяти:
На входе: |
AH |
03h |
|
BH |
Номер страницы видеопамяти |
На выходе: |
CH |
Верхняя граница курсора |
|
CL |
Нижняя граница курсора |
|
DH |
Позиция текущей строки курсора |
DL |
Позиция текущего столбца курсора |
Данная функция предназначена для использования только в текстовых режимах видеоадаптера.
Функция 04h позволяет определить подключено ли к видеоадаптеру световое перо или нет. Если световое перо подключено, можно определить его координаты. Функция позволяет узнать позицию светового пера в текстовых и в графических координатах.
Световое перо видеоадаптера EGA программно не полностью совместимо с CGA, в результате чего программы поддерживающие возможность использования светового пера для видеоадаптера CGA будут работать неправильно с видеоадаптером EGA. Видеоадаптеры VGA и SVGA не имеют светового пера.
На входе: |
AH |
04h |
На выходе: |
AH |
0 - световое перо не подключено (все остальные регистры не содержат полезной информации); |
|
CH |
Координаты вертикальной позиции курсора в пикселах (графические режимы с низким разрешением - 04h, 05h, 06h) |
|
CX |
Координаты вертикальной позиции курсора в пикселах (графические режимы с высоким разрешением) |
|
BX |
Координаты горизонтальной позиции курсора в пикселах |
|
DH |
Номер строки, на которой расположен курсор |
|
DL |
Номер столбца на котором расположен курсор |
Функция 05h позволяет изменить активную страницу видеопамяти. Активная страница видеопамяти отображается на экране монитора. Функция не проверяет физического наличия выбранной страницы видеопамяти. Если вы неправильно указали номер страницы результат работы функции не определен.
На входе: |
AH |
05h |
|
AL |
Номер страницы видеопамяти, которая станет активной |
На выходе: |
|
Не используются |
Свернуть содержимое окна экрана вверх можно при помощи функции 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. Окно задается координатами верхнего левого и нижнего правого углов. При свертке в верхней части окна появляются новые пустые строки, а нижние строки исчезают. Область экрана вне окна не изменяется.
На входе: |
AH |
07h - свертка окна вниз |
|
AL |
Число свертываемых линий, если оно равно нулю, то окно прокручивается целиком |
|
BH |
Атрибут, используемый для строк, возникающих в верхней части окна |
|
CH |
Номер строки левого верхнего угла окна |
|
CL |
Номер столбца левого верхнего угла окна |
|
DH |
Номер строки правого нижнего угла окна |
|
DL |
Номер столбца правого нижнего угла окна |
На выходе: |
|
Не используются |
Функция работает аналогично функции 06h (за исключением направления свертки).
Данная функция позволяет прочитать символ и его атрибуты из позиции экрана, определенной текущим положением курсора. Чтение можно производить как из активной, так и из неактивных страниц памяти:
На входе: |
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.
Функция позволяет записать один или несколько одинаковых символов в текущей позиции курсора. Запись может происходить как в активную, так и в неактивные страницы видеопамяти. После выполнения операции записи положение курсора не изменяется. Управляющие символы, такие как возврат каретки и перевод строки, не действуют и записываются в видеопамять, как обычные символы. Данная функция работает как в текстовых, так и в графических режимах.
На входе: |
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
Функция позволяет записать символ в текущей позиции курсора на любой странице видеопамяти. Как и в предыдущей функции, можно производить запись сразу нескольких одинаковых символов. Атрибуты символа не задаются, а используются их старые значения из предыдущих операций записи. После операции записи положение курсора не изменяется. Управляющие символы, такие как возврат каретки и перевод строки, не действуют и записываются в видеопамять, как обычные символы.
На входе: |
AH |
10h |
|
AL |
ASCII-код записываемого символа |
|
BH |
Номер страницы видеопамяти или цвет пикселов фона (для графического режима номер 13h) |
|
BL |
Цвет пикселов символа (для графического режима) |
|
CX |
Количество записываемых символов |
На выходе: |
|
Не используются |
Во всех режимах (за исключением режима номер 13h) если бит D7 регистра BL содержит единицу, то записываемый символ накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ.
Данная функция позволяет выбрать одну из двух стандартных цветовых палитр (см. таблицу 9.1). Функция используется для обеспечения совместимости с видеоадаптером CGA и предназначена для использования в текстовых режимах и графических режимах с низким разрешением.
Функция 0Bh имеет следующий формат вызова:
На входе: |
AH |
0Bh |
|
BH |
0, тогда |
|
BL |
Цвет фона и рамки (для графического режима) или цвет рамки (для текстового режима) |
|
BH |
1, тогда |
|
BL |
Номер палитры (0 или 1) |
На выходе: |
|
Не используются |
В следующей таблице описаны стандартные цветовые палитры для режимов 4, 5, 6:
Номер цвета |
Палитра 0 |
Палитра 1 |
0 |
Цвет фона |
Цвет фона |
1 |
Зеленый |
Синий |
2 |
Красный |
Фиолетовый |
3 |
Желтый |
Белый |
Использование функций 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(); } }
Функция позволяет определить цвет любого пиксела экрана по его координатам. Функция используется только в графических режимах работы видеоадаптеров.
На входе: |
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
Функция обеспечивает запись символа на экран в режиме телетайпа: символ отображается в текущей позиции курсора, после чего курсор сдвигается вправо на одну позицию. При необходимости курсор автоматически перемещается на новую строку, а когда весь экран заполняется, происходит вертикальная свертка экрана. В последнем случае верхняя строка экрана исчезает, а снизу возникает новая пустая строка и курсор помещается в ее начало. В текстовых режимах цветовые атрибуты строк, возникающих из-за свертки экрана соответствуют атрибутам отображаемых символов.
Данная функция обрабатывает следующие управляющие символы: звуковой сигнал (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
Функция позволяет определить номер текущего режима работы видеоадаптера, номер активной страницы и количество символов в строке экрана. Список различных режимов приведен в таблице 3.1. Формат функции имеет следующий вид:
На входе: |
AH |
0Fh |
На выходе: |
AH |
Количество символов в строке |
|
AL |
Номер текущего режима |
|
BH |
Номер активной страницы видеопамяти |
Бит D7 регистра AL соответствует значению бита D7 регистра AL, использованному при предыдущем выборе режима работы видеоадаптера (см. функцию 0).
Функция 10h предоставляет возможность программирования регистров цветовой палитры, таблицы цветов (для видеоадаптеров VGA и SVGA), а также управляет некоторыми атрибутами символов. Вы можете использовать эту функцию и в текстовых и в графических режимах.
Для видеоадаптера EGA эта функция содержит четыре подфункции:
Номер подфункции |
Назначение |
0 |
Программирование одного регистра палитры |
1 |
Программирование регистра цвета рамки |
2 |
Программирование всех регистров палитры (таблицы цветов) |
3 |
Управление атрибутом мигания и атрибутом интенсивности |
Видеоадаптеры VGA и SVGA дополнительно поддерживают еще 10 подфункций:
Номер подфункции |
Назначение |
7 |
Чтение регистра палитры |
8 |
Чтение регистра цвета рамки |
9 |
Чтение всех регистров палитры |
10h |
Программирование регистра ЦАП |
12h |
Программирование нескольких регистров ЦАП |
13h |
Выбор подмножества цветов |
15h |
Чтение регистра ЦАП |
17h |
Чтение нескольких регистров ЦАП |
1Ah |
Чтение состояния страницы цветов |
1Bh |
Преобразование регистров ЦАП для работы в монохромном режиме |
Функция выполняет запись в регистр палитры контроллера атрибутов:
На входе: |
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
Функция выполняет запись значения в регистр цвета рамки контроллера атрибутов. Надо иметь в виду, что эта функция не работает в некоторых режимах видеоадаптера 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(); } }
Функция обеспечивает быстрое заполнение новыми значениями всех регистров палитры и регистра цвета рамки. Новые значения регистров должны быть записаны перед вызовом функции в таблице размером 17 байт, расположенной в оперативной памяти компьютера. Байты 0 - 15 этой таблицы содержат новые значения для регистров палитры, а байт 16 новое значение для регистра цвета рамки.
На входе: |
AH |
10h |
|
AL |
02h - установка регистров палитры и регистра цвета рамки |
|
ES:DX |
Адрес таблицы с новыми значениями регистров |
На выходе: |
|
Не используются |
Управляет битом D7 байта атрибутов символа (см. главу "Атрибуты символов"):
На входе: |
AH |
10h |
|
AL |
03h - управление битом D7 байта атрибутов |
|
BL |
0 - бит 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 ); }
Функция поддерживается только видеоадаптерами 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
Функция поддерживается только видеоадаптерами VGA и SVGA. Позволяет прочитать содержимое регистра цвета рамки:
На входе: |
AH |
10h |
|
AL |
08h - чтение регистра цвета рамки |
На выходе: |
BH |
Значение регистра цвета рамки |
Функция позволяет прочитать значения всех регистров палитры и регистра цвета рамки. Для чтения регистров надо зарезервировать буфер в оперативной памяти размером 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
Функция производит запись 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
Функция производит запись 18-битной величины в несколько последовательно расположенных регистров таблицы цветов:
На входе: |
AH |
10h |
|
AL |
12h - установка нескольких регистров таблицы цветов |
|
BX |
Номер первого регистра таблицы цветов (0-255) |
|
CX |
Количество регистров для записи (1-256) |
|
ES:DX |
Адрес таблицы цветов |
На выходе: |
|
Не используются |
Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значимыми являются только 6 младших бит.
Функция предназначена для выбора числа подмножеств цветов и выбора активного подмножества:
На входе: |
AH |
10h |
|
AL |
13h - выбор подмножества цветов |
|
BL |
0 - выбор режима |
|
BH |
0 - 4 подмножества из 64 цветов |
|
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
Функция поддерживается только для видеоадаптеров 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
Функция производит чтение 18-битовых значений из нескольких последовательно расположенных регистров таблицы цветов:
На входе: |
AH |
10h |
|
AL |
17h - чтение нескольких регистров таблицы цветов |
|
BL |
Номер первого регистра таблицы цветов (0 -255) |
|
CX |
Количество регистров для чтения (1-256) |
|
ES:DX |
Адрес буфера для таблицы цветов |
На выходе: |
ES:DX |
Данные прочитанные из таблицы цветов |
Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значащими являются только младшие 6 бит.
Возвращает количество текущих цветовых подмножеств:
На входе: |
AH |
10h |
|
AL |
1Ah - определение числа цветовых подмножеств |
На выходе: |
BL |
0 - используются 4 цветовых подмножества по 64 цвета; |
|
BH |
Номер подмножества, используемого в данный момент |
mov ah,10h mov al,1ah int 10h mov num_subset,bh
Функция заполняет часть таблицы цветов значениями, соответствующими различным оттенкам серого цвета. Для каждого модифицируемого регистра таблицы цветов сначала читаются записанные в нем данные, а затем записываются обратно по следующему правилу: красного 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, ®s, ®s); } //====================================================== // Функция загрузки таблицы цветов //====================================================== 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, ®s, ®s, &segregs); } //====================================================== // Функция преобразования таблицы цветов в серый цвет //====================================================== void GrayScale( void ) { union REGS regs; regs.x.ax = 0x101b; regs.x.cx = 256; regs.x.bx = 0x00; int86(0x10, ®s, ®s); }
Функция 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 может привести к непредсказуемым последствиям.
Функция заменяет текущий набор символов знакогенератора или его часть набором символов, определенных пользователем. Таблица знакогенератора пользователя должна быть загружена в буфер оперативной памяти до вызова функции. После вызова она может быть удалена из памяти.
На входе: |
AH |
11h |
|
AL |
00h, 10h - загрузка набора символов пользователя |
|
CX |
Количество загружаемых символов. Может принимать значение от 1 до 256 |
|
DX |
ASCII-код первого загружаемого символа. Используется для загрузки части набора символов |
|
BL |
Номер загружаемой таблицы знакогенератора - для видеоадаптера EGA доступны таблицы 0 - 3, для VGA и SVGA 0 - 7 |
|
BH |
Количество байт, определяющих один символ в таблице символов |
|
ES:BP |
Адрес буфера, содержащего определение символов, загружаемых в таблицу знакогенератора |
На выходе: |
|
Не используются |
Функция загружает стандартный набор символов размера 8х14 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:
На входе: |
AH |
11h |
|
AL |
01h, 11h - загрузка набора символов 8х14 |
|
BL |
Номер загружаемой таблицы знакогенератора (для видеоадаптера EGA доступны таблицы 0 - 3, для VGA 0 - 7) |
На выходе: |
|
Не используются |
Функция загружает стандартный набор символов CGA размера 8х8 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:
На входе: |
AH |
11h |
|
AL |
02h, 12h - загрузка набора символов размера 8х8 пикселов |
|
BL |
Номер загружаемой таблицы знакогенератора (для видеоадаптера EGA доступны таблицы 0 - 3, для VGA 0 - 7) |
На выходе: |
|
Не используются |
Программа через эту функцию может установить активные таблицы знакогенератора. Напомним, что видеоадаптер EGA имеет четыре таблицы, одна или две из которых могут быть активными, а VGA - восемь. Каждая таблица содержит 256 символов. Одновременно могут отображаться 512 символов. Номер используемой таблицы определяется битом D3 байта атрибутов символа.
На входе: |
AH |
11h |
|
AL |
03h - выбор активных таблиц знакогенератора |
|
BL |
Выбирает активные таблицы: |
На выходе: |
|
Не используются |
Функция загружает стандартный набор символов VGA размера 8х16 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:
На входе: |
AH |
11h |
AL |
04h, 14h - загрузка набора символов размера 8х16 пикселов |
|
|
BL |
Номер загружаемой таблицы знакогенератора (для видеоадаптера VGA доступны таблицы 0 - 7) |
На выходе: |
|
Не используются |
Используется в графических режимах 4, 5 и 6 (совместимых с CGA), если необходимо отображать одновременно больше 128 символов. Вектор 1Fh указывает на таблицу с дополнительными 128 символами, имеющими коды ASCII от 127 до 255. Программа должна поддерживать таблицы для дополнительных символов. Размер символов должен быть 8х8 пикселов.
На входе: |
AH |
11h |
|
AL |
20h - установка вектора прерывания 1Fh, который хранит адрес таблицы дополнительных символов |
|
ES:BP |
Адрес таблицы дополнительных символов, определенной пользователем |
На выходе: |
|
Не используются |
Позволяет установить собственный набор символов для отображения текста в графических режимах видеоадаптера.
На входе: |
AH |
11h |
|
AL |
21h - установка вектора прерывания 43h |
|
ES:BP |
Адрес таблицы символов, определенной пользователем |
|
CX |
Количество байт, кодирующих один символ в таблице символов |
|
BL |
Количество строк текста, отображаемых на экране монитора: |
|
DL |
Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю |
На выходе: |
|
Не используются |
На входе: |
AH |
11h |
|
AL |
22h - установка вектора прерывания 43h |
|
BL |
Количество строк текста, отображаемых на экране монитора: |
|
DL |
Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю |
На выходе: |
|
Не используются |
На входе: |
AH |
11h |
|
AL |
23h установка вектора прерывания 43h |
|
BL |
Количество строк текста, отображаемых на экране монитора: |
|
DL |
Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю |
На выходе: |
|
Не используются |
На входе: |
AH |
11h |
|
AL |
24h установка вектора прерывания 43h |
|
BL |
Количество строк текста, отображаемых на экране монитора: |
|
DL |
Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю |
На выходе: |
|
Не используются |
Функция позволяет получить информацию об используемом наборе символов - высоту символа, число текстовых строк на экране и т.д.
На входе: |
AH |
11h |
|
AL |
30h |
|
BH |
Тип запрашиваемой информации: |
На выходе: |
CL |
Высота символов в пикселах |
|
DL |
Количество текстовых строк на экране - 1 |
|
ES:BP |
Указатель на таблицу символов (значение зависит от значения регистра BH) |
Функция 12h содержит девять различных подфункций:
Номер подфункции |
Назначение |
10h |
Определение конфигурации видеоадаптера |
20h |
Выбор программы печати экрана |
30h |
Выбор количества линий развертки в текстовом режиме |
31h |
Запрещение загрузки палитры цветов, принятой по умолчанию |
32h |
Управление доступом к видеопамяти и регистрам видеоадаптера |
33h |
Управление преобразованием серого цвета |
34h |
Управление эмуляцией курсора видеоадаптера CGA |
35h |
Выбор активного монитора (PS/2) |
36h |
Гашение экрана монитора |
Проверяет наличие видеоадаптеров EGA/VGA, а также позволяет получить данные о текущем состоянии видеоадаптера:
На входе: |
AH |
12h |
|
BL |
10h - определение конфигурации EGA/VGA |
На выходе: |
BH |
Режим видеоадаптера устанавливаемый по умолчанию: |
|
BL |
Объем видеопамяти (для видеоадаптера EGA): |
|
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
Программа, распечатывающая содержимое экрана монитора по нажатию клавиши <Print Screen>, не работает в режиме 43 текстовых строк. Если вы желает иметь эту возможность, можете выбрать альтернативную программу печати экрана, воспользовавшись подфункцией номер 20h:
На входе: |
AH |
12h |
|
BL |
20h - выбор альтернативной программы печати экрана монитора |
На выходе: |
|
Не используются |
Функция используется для получения на видеоадаптере VGA текстовых режимов, внешне не отличающихся от CGA или MDA.
На входе: |
AH |
12h |
|
BL |
30h - выбор числа линий развертки |
|
AL |
Количество строк развертки: |
На выходе: |
AL |
12h |
Функция 30h возвращает в регистре AL значение 12h, если компьютер имеет видеоадаптер VGA или SVGA. Эта особенность может использоваться для определения типа видеоадаптера.
Функция применяется для предотвращения перезагрузки таблицы цветов при выполнении операции выбора режима работы видеоадаптера VGA:
На входе: |
AH |
12h |
|
BL |
31h - запрещение переустановки палитры |
|
AL |
Разрешение/запрещение переустановки: |
На выходе: |
AL |
12h |
Вызов функции позволяет запретить (разрешить) доступ к видеопамяти и регистрам адаптера VGA/SVGA.
На входе: |
AH |
12h |
|
BL |
32h - управление доступом к видеоадаптеру |
|
AL |
Разрешение/запрещение доступа: |
На выходе: |
AL |
12h |
Поддерживается только видеоадаптерами VGA и SVGA. Если разрешено преобразование, то при загрузке регистров таблицы цветов (операцией выбора режима работы видеоадаптера или непосредственным вызовом функции загрузки этих регистров) происходит корректировка записываемых значений. После этого содержимое регистров будет соответствовать различным градациям серого цвета.
На входе: |
AH |
12h |
|
BL |
33h - управление преобразованием серого цвета |
|
AL |
Разрешение/запрещение преобразования: |
На выходе: |
AL |
12h |
Приведем фрагмент программы, использующий функцию 33h для управления преобразованием серого цвета:
enable: ; Разрешение преобразования содержимого регистров ; таблицы цветов в шкалу градаций серого цвета xor al,al jmp conversion disable: ; Запрещение преобразования содержимого регистров ; таблицы цветов mov al,1 conversion: mov ah,12h mov bl,33h int 10h
Функция 34h управляет режимом эмуляции курсора CGA. При разрешении эмуляции курсора CGA, его размеры устанавливаются, исходя из того, что символы имеют высоту 8 пикселов.
На входе: |
AH |
12h |
|
BL |
34h - управление эмуляцией курсора CGA |
|
AL |
Разрешение/запрещение эмуляции курсора: |
На выходе: |
AL |
12h |
Используется в системе PS/2 для переключения между видеоадаптером VGA, расположенным на системной плате компьютера, и дополнительным видеоадаптером. Функция работает даже если между видеоадаптерами существует конфликт по адресам видеопамяти или адресам портов ввода/вывода. Система PS/2 после загрузки в качестве первичного видеоадаптера использует дополнительный.
Программа, выполняющая переключение видеоадаптеров должна поддерживать 128-байтовый буфер для сохранения информации о состоянии неактивного видеоадаптера.
На входе: |
AH |
12h |
|
BL |
35h - выбор активного монитора для PS/2 |
|
ES:DX |
Адрес буфера. Размер буфера должен составлять 128 байт |
|
AL |
0 - выключить дополнительный видеоадаптер (должно быть использовано при первом вызове функции), |
На выходе: |
AL |
12h |
Видеоадаптеры VGA и SVGA имеют возможность гашения экрана монитора:
На входе: |
AH |
12h |
|
BL |
36h - управление гашением экрана монитора |
|
AL |
0 - включить отображение информации на экране монитора, |
На выходе: |
AL |
12h |
Функция возвращает в регистре AL значение 12h, если компьютер имеет видеоадаптер VGA.
Функция 13h предоставляет широкие возможности для вывода текстовых строк на экран монитора. В зависимости от параметров функции, можно определять атрибуты как строки в целом (атрибуты всех символов одинаковы), так и отдельных символов строки. После вывода строки на экран, курсор может либо оставаться на месте, либо переместиться в позицию за последним символом только что выведенной строки.
Данная функция обрабатывает следующие управляющие символы: звуковой сигнал (BELL), перевод курсора на одну позицию назад (BACKSPACE), возврат каретки (CARRIAGE RETURN) и перевод строки (LINEFEED).
На входе: |
AH |
13h - вывод строки на экран |
|
AL |
Режим отображения строки: |
|
BH |
Номер страницы видеопамяти |
|
BL |
Атрибуты символов отображаемого текста. Используется если регистр AL содержит 0 или 1 |
|
CX |
Длина отображаемой строки |
|
DH |
Номер строки экрана, в которой отображается текстовая строка |
|
DL |
Позиция в строке экрана с которой отображается текстовая строка |
|
ES:BP |
Адрес строки в оперативной памяти |
На выходе: |
|
Не используются |
В режимах 2 и 3 атрибуты каждого символа задаются вперемежку с самими символами строки. Сначала идет ASCII-код символа, а затем его атрибут.
Функция содержит две подфункции для чтения и записи текущей конфигурации видеосистемы компьютера.
Функция 1Ah реализована только для видеоадаптеров VGA и SVGA. Если после вызова функции регистр AL не содержит число 1Ah, это значит, что функция не поддерживается данным видеоадаптером и для определения конфигурации надо использовать другие способы.
При помощи этой функции можно определить конфигурацию видеосистемы компьютера:
На входе: |
AH |
1Ah |
|
AL |
00h - чтение конфигурации видеосистемы |
На выходе: |
AL |
1Ah |
|
BL |
Тип первичного видеоадаптера: |
|
BH |
Тип дополнительного видеоадаптера (см. регистр BL) |
Данная функция позволяет изменить информацию о конфигурации видеосистемы компьютера:
На входе: |
AH |
1Ah |
|
AL |
01h - запись конфигурации видеосистемы |
|
BL |
Тип первичного видеоадаптера (см. подфункцию 00h) |
|
BH |
Тип дополнительного видеоадаптера (см. подфункцию 00h) |
На выходе: |
AL |
1Ah |
Функция позволяет получить различную информацию о видеоадаптере и мониторе. Программа, вызывающая данную функцию, должна зарезервировать буфер с размером 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 |
Байт |
Количество строк развертки в текущем режиме: |
2Bh |
Байт |
Номер первой таблицы знакогенератора |
2Ch |
Байт |
Номер второй таблицы знакогенератора |
2Dh |
Байт |
Байт, содержащий различные данные: |
2Eh |
Байт |
Зарезервировано |
2Fh |
Байт |
Зарезервировано |
31h |
Байт |
Объем видеопамяти адаптера: |
32h |
Байт |
Состояние области сохранения: ??? |
33h - 3Fh |
|
Зарезервировано |
Далее следует описание статической функциональной таблицы:
Смещение, байт |
Размер |
Содержание |
0 |
Байт |
Таблица режимов работы видеоадаптера. Если бит равен единице, то режим поддерживается: |
1 |
Байт |
D0 Режим 08h; |
2 |
Байт |
D0 Режим 10h; |
3 |
4 байта |
Зарезервировано |
7 |
Байт |
Количество строк растра в текстовых режимах. Если бит равен единице, то режим поддерживается: |
8 |
Байт |
Количество таблиц знакогенератора, которые можно одновременно использовать (для текстовых режимов) |
9 |
Байт |
Количество таблиц знакогенератора, доступных в текстовом режиме |
0Ah |
Байт |
Биты имеют различное назначение: ??? |
0Bh |
Байт |
Биты имеют различное назначение: ??? |
0Ch |
2 байта |
Зарезервировано |
0Eh |
Байт |
Состояние указателя: ??? |
0Fh |
Байт |
Зарезервировано |
Функция имеет три подфункции, при помощи которых программа может быстро переключать режимы работы видеоадаптера:
Номер подфункции |
Назначение |
00h |
Определение размера буфера, необходимого для сохранения текущего состояния видеоадаптера |
01h |
Сохранение текущего состояния видеоадаптера |
02h |
Восстановление текущего состояния видеоадаптера |
Необходимо отметить, что данная функция поддерживается только для видеоадаптеров VGA и SVGA. Функцию можно использовать при переключении режима видеоадаптера в резидентных программах и мультизадачных системах.
Функция определяет размер буфера, необходимый для сохранения текущего состояния видеоадаптера. Буфер должен быть зарезервирован до вызова функции сохранения состояния видеоадаптера.
На входе: |
AH |
1Ch |
|
AL |
00h - определение размера буфера |
|
CX |
Тип данных, который необходимо сохранить (1 - надо сохранять, 0 - не надо сохранять): |
На входе: |
AL |
1Ch |
|
BX |
Размер буфера в 64-байтных блоках |
Функция записывает данные состояния видеоадаптера в буфер, размер которого определяется подфункцией 00h.
На входе: |
AH |
1Ch |
|
AL |
01h - сохранение состояния видеоадаптера |
|
CX |
Тип данных, который необходимо сохранить: |
|
ES:BX |
Адрес буфера для сохраняемых данных |
На выходе: |
AL |
1Ch |
Функция восстанавливает состояние видеоадаптера из буфера, заполненного подфункцией 01h.
На входе: |
AH |
1Ch |
|
AL |
02h - восстановление состояния видеоадаптера |
|
CX |
Тип восстанавливаемых данных: |
|
ES:BX |
Адрес буфера данных состояния видеоадаптера |
На выходе: |
AL |
1Ch |
Видеоадаптеры поддерживают стандартную расширенную таблицу ASCII символов. Если эта таблица не содержит образов символов кириллицы, то ваш компьютер не может отображать их на экране. Однако в некоторых случаях стандартную таблицу символов можно перекодировать, заменив образы некоторых символов на образы символов кириллицы. В этом приложении мы рассмотрим вопрос "русификации" видеоадаптеров CGA, EGA и VGA.
У видеоадаптера CGA таблицы знакогенератора, определяющие символы, которые можно отобразить на экране монитора в текстовых режимах находятся в ПЗУ, которое расположено вне адресного пространства процессора. Программы не имеют возможности изменить или даже считать информацию из этих таблиц. Поэтому для "русификации" текстовых режимов видеоадаптера 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(); } }