[Назад] [Содеожание] [Дальше]

Программирование видеоадаптеров.

© Александр Фролов, Григорий Фролов
Том 21, М.: Диалог-МИФИ, 1993.

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

  • Выбор режима работы - функция 00h
  • Изменение формы курсора - функция 01h
  • Изменение положения курсора - функция 02h
  • Определение положения и формы курсора - функция 03h
  • Использование светового пера - функция 04h
  • Изменение активной страницы видеопамяти - функция 05h
  • Свертка текстового окна вверх - функция 06h
  • Свертка текстового окна вниз - функция 07h
  • Чтение символа и его атрибутов - функция 08h
  • Запись символа с атрибутами в текущей позиции курсора - функция 09h
  • Запись символа в текущей позиции курсора - функция 0Ah
  • Установка цветовой палитры (ржимы 4,5,6) - функция 0Bh
  • Вывод пиксела - функция 0Ch
  • Чтение пиксела - функция 0Dh
  • Запись символа в режиме телетайпа - функция 0Eh
  • Определение текущего режима работы видеоадаптера - функция 0Fh
  • Управление регистрами палитры - функция 10h
  • Загрузка таблиц знакогенератора - функция 11h
  • Определение конфигурации и выбор программы распечатки экрана - функция 12h
  • Вывод текстовой строки - функция 13h
  • Чтение/запись конфигурации видеосистемы - функция 1Ah
  • Получение данных о состоянии VGA - функция 1Bh
  • Сохранение/восстановление состояния видеоадаптера - функция 1Ch
  • Русификация видеоадаптеров
  • У всех компьютеров, совместимых с IBM PC/XT/AT и PS/2, на системной плате установлена микросхема ПЗУ BIOS. В ней записан набор различных программ или функций, предназначенных для управления различными подсистемами компьютера: дисковой подсистемой, асинхронными последовательными и параллельными портами ввода/вывода, видеоадаптером. Нас в первую очередь будут интересовать функции, предназначенные для управления видеоподсистемой компьютера.

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

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

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

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

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

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

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

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

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

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

    На входе:

    AH

    00h

     

    AL

    Номер устанавливаемого режима работы видеоадаптера, если бит D7 = 1, то при установке режима видеопамять не очищается

    На выходе:

    Не используются

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

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

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

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

    На входе:

    AH

    00h

     

    CH

    Верхняя граница курсора. Если регистр CH содержит значение 20h курсор не отображается

     

    CL

    Нижняя граница курсора

    На выходе:

     

    Не используются

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

    .   Для монохромного и улучшенного цветного монитора верхняя граница = 11h, а нижняя = 12h.

    .   Для цветного монитора верхняя граница = 6h, а нижняя = 7h.

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

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

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

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

    На входе:

    AH

    02h

     

    BH

    Номер страницы видеопамяти

     

    DH

    Номер строки

     

    DL

    Номер столбца

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    03h

     

    BH

    Номер страницы видеопамяти

    На выходе:

    CH

    Верхняя граница курсора

     

    CL

    Нижняя граница курсора

     

    DH

    Позиция текущей строки курсора

    DL

    Позиция текущего столбца курсора

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

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

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

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

    На входе:

    AH

    04h

    На выходе:

    AH

    0 - световое перо не подключено (все остальные регистры не содержат полезной информации);

    1 - световое перо подключено

     

    CH

    Координаты вертикальной позиции курсора в пикселах (графические режимы с низким разрешением - 04h, 05h, 06h)

     

    CX

    Координаты вертикальной позиции курсора в пикселах (графические режимы с высоким разрешением)

     

    BX

    Координаты горизонтальной позиции курсора в пикселах

     

    DH

    Номер строки, на которой расположен курсор

     

    DL

    Номер столбца на котором расположен курсор

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

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

    На входе:

    AH

    05h

     

    AL

    Номер страницы видеопамяти, которая станет активной

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    06h

     

    AL

    Количество свертываемых линий. Если оно равно нулю, то окно прокручивается целиком

     

    BH

    Атрибут, используемый для символов строк, возникающих снизу окна

     

    CH

    Номер строки верхнего левого угла окна

     

    CL

    Номер столбца верхнего левого угла окна

     

    DH

    Номер строки нижнего правого угла окна

     

    DL

    Номер столбца нижнего правого угла окна

    На выходе:

     

    Не используются

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

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

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

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

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

    
    push    es              ; Сохраняем содержимое регистра ES
    
    xor     ax,ax   ; Устанавливаем регистр ES на нулевой
    mov     es,ax   ; сегмент памяти
    
    mov     ah,6    ; Функция свертки экрана вверх
    mov     al,0    ; Очищаем все окно
    mov     bh,7    ; Устанавливаем нормальный атрибут
    xor     cx,cx   ; Устанавливаем левый верхний угол окна в (0,0)
    
    ; Определяем число строк в данном режиме
    mov     dh,es:[484h]
    ; Определяем число символов в строке
    mov     dl,es:[44Ah]
    dec     dl
    
    ; Вызываем свертку экрана вверх
    int     10h
    ; Восстанавливаем регистр ES
    pop     es
    

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

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

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

    На входе:

    AH

    07h - свертка окна вниз

     

    AL

    Число свертываемых линий, если оно равно нулю, то окно прокручивается целиком

     

    BH

    Атрибут, используемый для строк, возникающих в верхней части окна

     

    CH

    Номер строки левого верхнего угла окна

     

    CL

    Номер столбца левого верхнего угла окна

     

    DH

    Номер строки правого нижнего угла окна

     

    DL

    Номер столбца правого нижнего угла окна

    На выходе:

     

    Не используются

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

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

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

    На входе:

    AH

    08h

     

    BH

    Номер страницы видеопамяти

    На выходе:

    AL

    ASCII-код символа

     

    AH

    Байт атрибутов символа для текстовых режимов

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

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

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

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

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

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

    На входе:

    AH

    09h

     

    AL

    ASCII-код записываемого символа

     

    BH

    Номер страницы видеопамяти или цвет пикселов фона (для графического режима номер 13h)

     

    BL

    Атрибут символов (для текстового режима) или цвет пикселов символа (для графического режима);

     

    CX

    Количество записываемых символов

    На выходе:

     

    Не используются

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

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

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

    
    TITLE   BIOS_FUNCTION
    
    .MODEL  small
    
    DOSSEG
    
    .STACK  100h
    
    .DATA
            message DB      "INT 10h", 0
            video_page      DB      2
    
    .CODE
    .STARTUP
    
            ; Выбираем режим 3 видеоадаптера
            xor     ah,ah
            mov     al,3
            int     10h
    
            ; Изменяем форму курсора
            mov     ah,1
            mov     ch,0    ; начало курсора - линия 0
            mov     cl,7    ; конец курсора - линия 7
            int     10h
    
            ; Выбираем активную страницу видеопамяти
            mov     ah,5
            mov     al,video_page   ; выбираем страницу video_page
            int     10h
    
            mov     ah,6
            mov     al,0
            mov     bh,0ffh
            mov     cl,10
            mov     ch,5
            mov     dl,30
            mov     dh,15
            int     10h
    
            ; Устанавливаем координаты курсора
            mov     ah,2
            mov     bh,video_page   ; выбираем страницу video_page
            mov     dh,12           ; строка 12
            mov     dl,20           ; колонка 20
            int     10h
    
            ; Отображаем на активной странице экрана строку message
            mov     si,OFFSET message
            call    WriteString
    
    .EXIT   0
    
    
    ; Процедура WriteString выводит на экран строку, имеющую
    ; смещение si в сегменте ds
    WriteString     PROC
    
            ; Определяем текущую активную страницу экрана
            mov     ah,0Fh
            int     10h     ; номер активной страницы в регистре bh
    
            ; Получаем в dx координаты курсора
            mov     ah,3
            int     10h
    
            ; В цикле выводим на экран символы строки
    
    next_char:
    
            mov     ah,9
            lodsb
            cmp     al,0    ; находим конец строки
    
            ; Если достигнут конец строки оканчиваем процедуру
            je      exit_proc
    
            ; Для отображаемых символов используем атрибут 7
            ; символы строки выводятся без повтора
            mov     bl,7    ;
            mov     cx,1    ;
            int     10h
    
            ; Перемещаем курсор в следующую позицию строки
            mov     ah,2
            inc     dl
            int     10h
    
            jmp     next_char
    
    exit_proc:
    
            ret
    
    WriteString     ENDP
    
    END
    

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

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

    На входе:

    AH

    10h

     

    AL

    ASCII-код записываемого символа

     

    BH

    Номер страницы видеопамяти или цвет пикселов фона (для графического режима номер 13h)

     

    BL

    Цвет пикселов символа (для графического режима)

     

    CX

    Количество записываемых символов

    На выходе:

     

    Не используются

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

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

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

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

    На входе:

    AH

    0Bh

     

    BH

    0, тогда

     

    BL

    Цвет фона и рамки (для графического режима) или цвет рамки (для текстового режима)

     

    BH

    1, тогда

     

    BL

    Номер палитры (0 или 1)

    На выходе:

     

    Не используются

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

    Номер цвета

    Палитра 0

    Палитра 1

    0

    Цвет фона

    Цвет фона

    1

    Зеленый

    Синий

    2

    Красный

    Фиолетовый

    3

    Желтый

    Белый

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

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

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

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

    На входе:

    AH

    0Ch

     

    AL

    Номер цвета (значение ячейки видеопамяти, соответствующее пикселу)

     

    BH

    Номер страницы (для видеоадаптера CGA не используется)

     

    CX

    Координата X пиксела

     

    DX

    Координата Y пиксела

    На выходе:

     

    Не используются

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

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

    Номер режима

    Используемые номера цветов

    4, 5

    0 - 3

    6

    0 и 1

    0Dh

    0 - 15

    0Eh

    0 - 15

    0Fh

    0 и 1

    10h

    0 - 15

     

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

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

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

    
    #include <dos.h>
    #include <stdio.h>
    #include <conio.h>
    
    void main(void);
    
    void main(void) {
    
            union REGS      inregs, outregs;
            unsigned char   i, j;
    
            // Устанавливаем режим 4  видеоадаптера
            // (графический - 320х200 пикселов, 4 цвета)
            inregs.h.ah = 0x0;
            inregs.h.al = 0x4;
    
            int86( 0x10, &inregs, &outregs );
    
            // Устанавливаем цвет фона
    
            inregs.h.ah = 0x0B;
            inregs.h.bh = 0x0;      // устанавливаем цвет фона
            inregs.h.bl = 0x6;      // номер устанавливаемого цвета фона
    
            int86( 0x10, &inregs, &outregs );
    
            for(i = 0; i < 2; i++) {
    
                    // Устанавливаем цветовую палитру
                    inregs.h.ah = 0x0B;
                    inregs.h.bh = 0x1;      // установка палитры
                    inregs.h.bl = i;                // номер палитры
    
                    int86( 0x10, &inregs, &outregs );
    
                    // Выводим массив точек
                    for(j = 0; j < 64; j++) {
    
                            inregs.h.ah = 0x0C;
    
                            // Номер цвета
                            inregs.h.al = (unsigned char)(j / 16);
    
                            // X-координата точки
                            inregs.x.cx = 0x10 + j;
                            // Y-координата точки
                            inregs.x.dx = 0x10 + j;
    
                            int86( 0x10, &inregs, &outregs );
                    }
                    getch();
            }
    }
    

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

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

    На входе:

    AH

    0Dh

     

    BH

    Номер страницы (для видеоадаптера CGA не используется)

     

    CX

    Координата X пиксела

     

    DX

    Координата Y пиксела

    На выходе:

     

    AL = номер цвета пиксела

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

    
    mov     ah,0Dh
    mov     cx,x_pos
    mov     dx,y_pos
    int     10h
    
    ; Сохраняем полученную величину
    mov     color_number
    

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

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

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

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

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

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

    На входе:

    AH

    0Eh - запись символа в режиме телетайпа

     

    AL

    ASCII-код записываемого символа

     

    BH

    Номер страницы видеопамяти (только в текстовых режимах)?

     

    BL

    Цвет символа (в графических режимах)

    На выходе:

     

    Не используются

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

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

    
    WriteStringT    PROC
    
            ; Определяем текущую активную страницу экрана
    
            mov     ah,0Fh
            int     10h             ; Номер активной страницы в регистре BH
    
            ; В цикле выводим на экран символы строки
    
    next_char:
    
            mov     ah,0Eh
            lodsb                           ; Получаем следующий символ строки
            cmp     al,0            ; Находим конец строки
            je      exit_proc       ; Если конец строки достигнут, то
                                                    ; оканчиваем процедуру
            int     10h
    
            jmp     next_char
    
    exit_proc:
    
            ret
    
    WriteStringT    ENDP
    

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

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

    На входе:

    AH

    0Fh

    На выходе:

    AH

    Количество символов в строке

     

    AL

    Номер текущего режима

     

    BH

    Номер активной страницы видеопамяти

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

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

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

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

    Номер подфункции

    Назначение

    0

    Программирование одного регистра палитры

    1

    Программирование регистра цвета рамки

    2

    Программирование всех регистров палитры (таблицы цветов)

    3

    Управление атрибутом мигания и атрибутом интенсивности

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

    Номер подфункции

    Назначение

    7

    Чтение регистра палитры

    8

    Чтение регистра цвета рамки

    9

    Чтение всех регистров палитры

    10h

    Программирование регистра ЦАП

    12h

    Программирование нескольких регистров ЦАП

    13h

    Выбор подмножества цветов

    15h

    Чтение регистра ЦАП

    17h

    Чтение нескольких регистров ЦАП

    1Ah

    Чтение состояния страницы цветов

    1Bh

    Преобразование регистров ЦАП для работы в монохромном режиме

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

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

    На входе:

    AH

    10h

     

    AL

    00h - установка регистра палитры

     

    BL

    Номер регистра палитры для записи

     

    BH

    Данные, записываемые в регистр палитры

    На выходе:

     

    Не используются

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

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

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

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

    На входе:

    AH

    10h

     

    AL

    01h - установка цвета рамки

     

    BH

    Значение, записываемое в регистр (цвет)

    На выходе:

     

    Не используются

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

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

    
    #include <dos.h>
    #include <stdio.h>
    #include <conio.h>
    
    void main(void);
    
    // Главная функция
    void main(void) {
    
            union REGS      inregs, outregs;
            unsigned char   i;
    
            // Пробуем 16 цветов для рамки
            for(i = 0; i < 16; i++) {
    
                    // Функция управления контроллером атрибутов
                    inregs.h.ah = 0x10;
    
                    // Подфункция установки цвета рамки
                    inregs.h.al = 0x1;
    
                    // Номер нового цвета рамки
                    inregs.h.bh = i;
    
                    int86( 0x10, &inregs, &outregs );
    
                    // Ожидаем нажатия на любую клавишу
                    printf("\nДля изменения цвета рамки "
                                     "нажмите любую клавишу...");
                    getch();
            }
    }
    

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

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

    На входе:

    AH

    10h

     

    AL

    02h - установка регистров палитры и регистра цвета рамки

     

    ES:DX

    Адрес таблицы с новыми значениями регистров

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    10h

     

    AL

    03h - управление битом D7 байта атрибутов

     

    BL

    0 - бит D7 байта атрибутов управляет интенсивностью фона символов (символы не мигают),

    1 - бит D7 байта атрибутов управляет миганием символов

    На выходе:

     

    Не используются

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

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

    
    //===========================================================
    // void ControlBlinkIntens(unsigneg char  blink)
    // Функция управляет назначением бита D7 байта атрибутов
    // символа
    // Параметры:
    // blink - если параметр функции равен нулю, то бит D7
    //      будет определять интенсивность фона символа. Если
    //      параметр равен единице, то бит D7 управляет миганием
    //      символа
    //===========================================================
    ControlBlinkIntens(unsigneg char  blink) {
    
            union REGS   inregs, outregs;
    
            // Функция управления контроллером атрибутов
            inregs.h.ah = 0x10;
    
            // Подфункция управления атрибутом мигания/интенсивности
            inregs.h.al = 0x3;
    
            inregs.h.bl = blink;
            int86( 0x10, &inregs, &outregs );
    }
    

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

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

    На входе:

    AH

    10h

     

    AL

    07h - чтение регистра палитры

     

    BL

    Номер регистра палитры (0-15)

    На выходе:

    BH

    Значение указанного регистра палитры

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

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

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

    На входе:

    AH

    10h

     

    AL

    08h - чтение регистра цвета рамки

    На выходе:

    BH

    Значение регистра цвета рамки

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

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

    На входе:

    AH

    10h

     

    AL

    9 - чтение всех регистров палитры

     

    ES:DX

    Указатель на буфер размером 17 байт

    На выходе:

    ES:DX

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

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

    
    ; Определяем адрес буфера для записи значений регистров
    ; палитры и регистра цвета рамки
    
    mov     ax,SEG buffer
    mov     es,ax
    mov     dx,OFFSET buffer
    
    ; Считываем значения всех регистров палитры и регистра
    ; цвета рамки
    
    mov     ah,10h
    mov     al,9
    int     10h
    

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

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

    На входе:

    AH

    10h

     

    AL

    10h - установка регистра таблицы цветов

     

    BX

    Номер регистра таблицы цветов (0-255)

     

    DH

    Интенсивность красного цвета (6 бит)

     

    CH

    Интенсивность зеленого цвета (6 бит)

     

    CL

    Интенсивность синего цвета (6 бит)

    На выходе:

     

    Не используются

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

    
    mov     ah,10h
    
    ; Выбираем функцию установки регистра цветов
    mov     al,ah
    
    ; Устанавливаем номер регистра таблицы цветов
    mov     bx,num_reg
    
    ; Определяем величины красной, зеленой и синей составляющих
    mov     dh,red
    mov     ch,green
    mov     cl,blue
    
    int     10h
    

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

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

    На входе:

    AH

    10h

     

    AL

    12h - установка нескольких регистров таблицы цветов

     

    BX

    Номер первого регистра таблицы цветов (0-255)

     

    CX

    Количество регистров для записи (1-256)

     

    ES:DX

    Адрес таблицы цветов

    На выходе:

     

    Не используются

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

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

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

    На входе:

    AH

    10h

     

    AL

    13h - выбор подмножества цветов

     

    BL

    0 - выбор режима

     

    BH

    0 - 4 подмножества из 64 цветов

    1 - 16 подмножеств из 16 цветов

     

    BL

    1 - выбор активного подмножества

     

    BH

    Номер подмножества (0-4 или 0-15)

    На выходе:

     

    Не используются

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

    
    ; Выбираем режим (bh = 1)
    mov     ah,10h
    mov     al,13h
    xor     bx,bx
    inc     bh
    int     10h
    
    ; Устанавливаем активное подмножество subset_num
    mov     ah,10h
    mov     al,13h
    mov     bl,1
    mov     bh,subset_num
    int     10h
    

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

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

    На входе:

    AH

    10h

     

    AL

    15h - чтение регистра таблицы цветов

     

    BL

    Номер регистра (0-255)

    На выходе:

    DH

    Интенсивность красного цвета (6 бит)

     

    CH

    Интенсивность зеленого цвета (6 бит)

     

    CL

    Интенсивность синего цвета (6 бит)

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

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

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

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

    На входе:

    AH

    10h

     

    AL

    17h - чтение нескольких регистров таблицы цветов

     

    BL

    Номер первого регистра таблицы цветов (0 -255)

     

    CX

    Количество регистров для чтения (1-256)

     

    ES:DX

    Адрес буфера для таблицы цветов

    На выходе:

    ES:DX

    Данные прочитанные из таблицы цветов

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

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

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

    На входе:

    AH

    10h

     

    AL

    1Ah - определение числа цветовых подмножеств

    На выходе:

    BL

    0 - используются 4 цветовых подмножества по 64 цвета;

    1 - используются 16 цветовых подмножеств по 16 цветов

     

    BH

    Номер подмножества, используемого в данный момент

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

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

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

    На входе:

    AH

    10h

     

    AL

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

     

    BX

    Номер первого регистра таблицы цветов

     

    CX

    Количество модифицируемых регистров

    На выходе:

     

    Не используются

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

    
    mov     ah,10h
    mov     al,1Bh
    
    ; Номер первого модифицируемого регистра
    mov     bx,first_num
    
    ; Номер последнего модифицируемого регистра
    mov     cx,end_num
    
    ; Определяем число изменяемых регистров
    sub     cx,bx
    int     10h
    

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

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

    
    #include <conio.h>
    #include <stdio.h>
    #include <dos.h>
    #include "sysp.h"
    
    typedef struct _RGB_ {
            unsigned char red;
            unsigned char green;
            unsigned char blue;
    } RGB;
    
    // Объявление функций
    void    main(void);
    void    SetVideoMode(unsigned char);
    void    SetVgaDAC(unsigned, unsigned);
    void    GrayScale(void);
    
    //======================================================
    // Главная функция
    //======================================================
    void main(void)
    {
            RGB color_table[256];
            unsigned char   i,j;
            unsigned char   far *ptr;
            int error, x_num, y_num;
            unsigned seg_table,off_table;
    
            // Формируем новые значения для таблицы цветов
            for(j = 0; j < 4; j++) {
                    for(i = 0; i < 64; i++) {
                            (color_table[i+j*64]).red =
                                    (j == 0) ? i : (j == 4) ? i : 0;
    
                            (color_table[i+j*64]).green =
                                    (j == 1) ? i : (j == 3) ? i : (j == 4) ? i : 0;
    
                            (color_table[i+j*64]).blue =
                                    (j == 2) ? i : (j == 3) ? i : (j == 4) ? i : 0;
                    }
            }
    
            // Устанавливаем режим номер 13h
            SetVideoMode(0x13);
    
            ptr = (unsigned char far*) &color_table[0];
            seg_table = FP_SEG(ptr);
            off_table = FP_OFF(ptr);
    
            // Загружаем таблицу цветов
            SetVgaDAC(seg_table,off_table);
    
            // Записываем данные в видеопамять
            ptr = (unsigned char far*) (FP_MAKE(0xA000, 0x0));
    
            for(y_num = 0; y_num < 200; y_num++) {
                    for(x_num = 0; x_num < 320; x_num++) {
                            *ptr = (unsigned char) x_num;
                            ptr++;
                    }
            }
    
            // Ожидаем нажатие на клавишу клавиатуры
            getch();
    
            // Преобразовываем данные в таблице цветов к серому цвету
            GrayScale();
    
            // Ожидаем нажатие на клавишу клавиатуры
            getch();
    
            // Устанавливаем текстовый режим
            SetVideoMode(0x3);
    }
    
    //======================================================
    // Функция установки режима
    //======================================================
    void SetVideoMode( unsigned char vmode ) {
    
            union REGS regs;
    
            regs.h.ah = 0x0;
            regs.h.al = vmode;
    
            int86(0x10, &regs, &regs);
    }
    
    //======================================================
    // Функция загрузки таблицы цветов
    //======================================================
    void SetVgaDAC(unsigned seg_table, unsigned off_table) {
    
            union REGS regs;
            struct SREGS segregs;
    
            regs.x.ax = 0x1012;
            regs.x.cx = 256;
            regs.x.bx = 0x00;
    
            segregs.es = seg_table;
            regs.x.dx = off_table;
    
            int86x(0x10, &regs, &regs, &segregs);
    }
    
    //======================================================
    // Функция преобразования таблицы цветов в серый цвет
    //======================================================
    void GrayScale( void ) {
    
            union REGS regs;
    
            regs.x.ax = 0x101b;
            regs.x.cx = 256;
            regs.x.bx = 0x00;
    
            int86(0x10, &regs, &regs);
    }
    

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

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

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

    Номер подфункции

    Назначение

    0

    Загрузка таблиц знакогенератора

    1

    Загрузка стандартного монохромного набора символов

    2

    Загрузка стандартного набора символов видеоадаптера CGA

    3

    Выбор активных таблиц знакогенератора (EGA)

    4

    Загрузка стандартного набора символов видеоадаптера VGA и SVGA

    20h

    Установка вектора прерывания 1Fh

    21h

    Использование графического режима для отображения символов пользователя

    22h

    Использование набора символов 8х14 из ПЗУ

    23h

    Использование набора символов 8х8 из ПЗУ

    24h

    Использование набора символов 8х16 из ПЗУ

    30h

    Получение информации об используемом наборе символов

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

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

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

    На входе:

    AH

    11h

     

    AL

    00h, 10h - загрузка набора символов пользователя

     

    CX

    Количество загружаемых символов. Может принимать значение от 1 до 256

     

    DX

    ASCII-код первого загружаемого символа. Используется для загрузки части набора символов

     

    BL

    Номер загружаемой таблицы знакогенератора - для видеоадаптера EGA доступны таблицы 0 - 3, для VGA и SVGA 0 - 7

     

    BH

    Количество байт, определяющих один символ в таблице символов

     

    ES:BP

    Адрес буфера, содержащего определение символов, загружаемых в таблицу знакогенератора

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    11h

     

    AL

    01h, 11h - загрузка набора символов 8х14

     

    BL

    Номер загружаемой таблицы знакогенератора (для видеоадаптера EGA доступны таблицы 0 - 3, для VGA 0 - 7)

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    11h

     

    AL

    02h, 12h - загрузка набора символов размера 8х8 пикселов

     

    BL

    Номер загружаемой таблицы знакогенератора (для видеоадаптера EGA доступны таблицы 0 - 3, для VGA 0 - 7)

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    11h

     

    AL

    03h - выбор активных таблиц знакогенератора

     

    BL

    Выбирает активные таблицы:

    D1-D0 номер таблицы, используемой, когда бит D3 атрибута равен нулю;

    D3-D2 номер таблицы используемой, когда бит D3 атрибута равен единице;

    D4 только для VGA. Расширение для битов D0 и D1;

    D5 только для VGA. Расширение для битов D2 и D3;

    D7-D6 не используются

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    11h

    AL

    04h, 14h - загрузка набора символов размера 8х16 пикселов

     

    BL

    Номер загружаемой таблицы знакогенератора (для видеоадаптера VGA доступны таблицы 0 - 7)

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    11h

     

    AL

    20h - установка вектора прерывания 1Fh, который хранит адрес таблицы дополнительных символов

     

    ES:BP

    Адрес таблицы дополнительных символов, определенной пользователем

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    11h

     

    AL

    21h - установка вектора прерывания 43h

     

    ES:BP

    Адрес таблицы символов, определенной пользователем

     

    CX

    Количество байт, кодирующих один символ в таблице символов

     

    BL

    Количество строк текста, отображаемых на экране монитора:

    0 - количество строк определяется регистром DL;

    1 - 14 строк;

    2 - 25 строк;

    3 - 43 строки

     

    DL

    Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю

    На выходе:

     

    Не используются

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

    На входе:

    AH

    11h

     

    AL

    22h - установка вектора прерывания 43h

     

    BL

    Количество строк текста, отображаемых на экране монитора:

    0 - количество строк определяется регистром DL;

    1 - 14 строк;

    2 - 25 строк;

    3 - 43 строки

     

    DL

    Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю

    На выходе:

     

    Не используются

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

    На входе:

    AH

    11h

     

    AL

    23h установка вектора прерывания 43h

     

    BL

    Количество строк текста, отображаемых на экране монитора:

    0 - количество строк определяется регистром DL;

    1 - 14 строк;

    2 - 25 строк;

    3 - 43 строки

     

    DL

    Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю

    На выходе:

     

    Не используются

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

    На входе:

    AH

    11h

     

    AL

    24h установка вектора прерывания 43h

     

    BL

    Количество строк текста, отображаемых на экране монитора:

    0 - количество строк определяется регистром DL;

    1 - 14 строк;

    2 - 25 строк;

    3 - 43 строки

     

    DL

    Количество строк текста, отображаемых на экране. Используется только если регистр BL равен нулю

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    11h

     

    AL

    30h

     

    BH

    Тип запрашиваемой информации:

    0 - вернуть содержимое вектора INT 1Fh;

    1 - вернуть содержимое вектора INT 43h;

    2 - вернуть указатель на набор символов размера 8х14 пикселов, расположенный в ПЗУ BIOS;

    3 - вернуть указатель на набор символов размера 8х8 пикселов, расположенный в ПЗУ BIOS;

    4 - вернуть указатель на символы с ASCII кодами от 127 до 255 (размера 8х8 пикселов), расположенные в ПЗУ BIOS;

    5 - вернуть указатель на альтернативный набор символов размером 9х14 пикселов, расположенный в ПЗУ BIOS;

    6 - вернуть указатель на набор символов размером 8х16 пикселов, расположенный в ПЗУ BIOS;

    7 - вернуть указатель на альтернативный набор символов размером 9х16 пикселов, расположенный в ПЗУ BIOS

    На выходе:

    CL

    Высота символов в пикселах

     

    DL

    Количество текстовых строк на экране - 1

     

    ES:BP

    Указатель на таблицу символов (значение зависит от значения регистра BH)

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

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

    Номер подфункции

    Назначение

    10h

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

    20h

    Выбор программы печати экрана

    30h

    Выбор количества линий развертки в текстовом режиме

    31h

    Запрещение загрузки палитры цветов, принятой по умолчанию

    32h

    Управление доступом к видеопамяти и регистрам видеоадаптера

    33h

    Управление преобразованием серого цвета

    34h

    Управление эмуляцией курсора видеоадаптера CGA

    35h

    Выбор активного монитора (PS/2)

    36h

    Гашение экрана монитора

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

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

    На входе:

    AH

    12h

     

    BL

    10h - определение конфигурации EGA/VGA

    На выходе:

    BH

    Режим видеоадаптера устанавливаемый по умолчанию:

    0 - цветной режим,

    1 - монохромный режим

     

    BL

    Объем видеопамяти (для видеоадаптера EGA):

    0 - 64 Кбайт,

    1 - 128 Кбайт,

    2 - 192 Кбайт,

    3 - 256 Кбайт

     

    CH

    Биты управления дополнительным устройством

     

    CL

    Положение переключателей на плате видеоадаптера EGA

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

    
    mov     ah, 12h
    
    ; Определение конфигурации EGA/VGA
    mov     bl, 10h
    mov     bh, 55h
    int     10h
    
    ; Изменился ли регистр BX
    cmp     bx, 5510h
    
    ; Если нет, то видеоадаптеры EGA/VGA не обнаружены
    je      ega_vga_not_found
    

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

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

    На входе:

    AH

    12h

     

    BL

    20h - выбор альтернативной программы печати экрана монитора

    На выходе:

     

    Не используются

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

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

    На входе:

    AH

    12h

     

    BL

    30h - выбор числа линий развертки

     

    AL

    Количество строк развертки:

    0 - 200 строк развертки, размер символа 8х8 пикселов,

    1 - 350 строк развертки, размер символа 8х14 пикселов,

    2 - 400 строк развертки, размер символа 8х16 пикселов

    На выходе:

    AL

    12h

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

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

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

    На входе:

    AH

    12h

     

    BL

    31h - запрещение переустановки палитры

     

    AL

    Разрешение/запрещение переустановки:

    0 - разрешить загрузку палитры при выполнении операции выбора режима видеоадаптера,

    1 - запретить загрузку палитры при выполнении операции выбора режима видеоадаптера

    На выходе:

    AL

    12h

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

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

    На входе:

    AH

    12h

     

    BL

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

     

    AL

    Разрешение/запрещение доступа:

    0 - разрешить доступ,

    1 - запретить доступ

    На выходе:

    AL

    12h

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

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

    На входе:

    AH

    12h

     

    BL

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

     

    AL

    Разрешение/запрещение преобразования:

    0 - разрешить преобразование,

    1 - запретить преобразование

    На выходе:

    AL

    12h

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

    
    enable:
    
            ; Разрешение преобразования содержимого регистров
            ; таблицы цветов в шкалу градаций серого цвета
            xor     al,al
            jmp     conversion
    
    disable:
    
            ; Запрещение преобразования содержимого регистров
            ; таблицы цветов
            mov     al,1
    
    conversion:
    
            mov     ah,12h
            mov     bl,33h
            int     10h
    

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

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

    На входе:

    AH

    12h

     

    BL

    34h - управление эмуляцией курсора CGA

     

    AL

    Разрешение/запрещение эмуляции курсора:

    0 - разрешить эмуляцию,

    1 - запретить эмуляцию

    На выходе:

    AL

    12h

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

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

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

    На входе:

    AH

    12h

     

    BL

    35h - выбор активного монитора для PS/2

     

    ES:DX

    Адрес буфера. Размер буфера должен составлять 128 байт

     

    AL

    0 - выключить дополнительный видеоадаптер (должно быть использовано при первом вызове функции),

    1 - включить видеоадаптера VGA, расположенный на системной плате (должно быть использовано при втором вызове функции),

    2 - выключить активный видеоадаптер (используется в последующих вызовах функции),

    3 - включить неактивный видеоадаптер (используется в последующих вызовах функции)

    На выходе:

    AL

    12h

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

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

    На входе:

    AH

    12h

     

    BL

    36h - управление гашением экрана монитора

     

    AL

    0 - включить отображение информации на экране монитора,

    1 - погасить экран монитора

    На выходе:

    AL

    12h

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

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

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

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

    На входе:

    AH

    13h - вывод строки на экран

     

    AL

    Режим отображения строки:

    0 - курсор не перемещается, атрибуты символов в строке одинаковы и определяются значением регистра BL,

    1 - курсор перемещается за конец отображаемой строки, атрибуты символов в строке одинаковы и определяются значением регистра BL,

    2 - курсор не перемещается, атрибуты каждого символа задаются отдельно,

    3 - курсор перемещается, атрибуты каждого символа задаются отдельно

     

    BH

    Номер страницы видеопамяти

     

    BL

    Атрибуты символов отображаемого текста. Используется если регистр AL содержит 0 или 1

     

    CX

    Длина отображаемой строки

     

    DH

    Номер строки экрана, в которой отображается текстовая строка

     

    DL

    Позиция в строке экрана с которой отображается текстовая строка

     

    ES:BP

    Адрес строки в оперативной памяти

    На выходе:

     

    Не используются

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

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

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

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

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

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

    На входе:

    AH

    1Ah

     

    AL

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

    На выходе:

    AL

    1Ah

     

    BL

    Тип первичного видеоадаптера:

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

     

    BH

    Тип дополнительного видеоадаптера (см. регистр BL)

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

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

    На входе:

    AH

    1Ah

     

    AL

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

     

    BL

    Тип первичного видеоадаптера (см. подфункцию 00h)

     

    BH

    Тип дополнительного видеоадаптера (см. подфункцию 00h)

    На выходе:

    AL

    1Ah

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

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

    На входе:

    AH

    1Bh - получение данных о видеосистеме

     

    BX

    00h

     

    ES:DI

    Адрес буфера для записи данных, 64 байта

    На выходе:

    AL

    1Bh

     

    ES:DI

    Буфер заполненный данными (см. таблицу ниже)

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

    Смещение, байт

    Размер

    Содержание

    0

    Двойное слово

    Адрес статической таблицы функций (см. ниже)

    4

    Байт

    Номер текущего режима работы видеоадаптера

    5

    Слово

    Количество символов в строке

    7

    Слово

    Размер отображаемой области видеоданных (в байтах)

    9

    Слово

    Начальный адрес отображаемой области видеоданных

    0Bh

    8 слов

    Позиции курсоров для каждой из 8 страниц видеопамяти (одно слово на страницу). В старшем байте записан номер колонки, в младшем байте номер строки курсора

    1Bh

    Байт

    Нижняя линия курсора

    1Ch

    Байт

    Верхняя линия курсора

    1Dh

    Байт

    Номер активной страницы видеопамяти

    1Eh

    Слово

    Адрес индексного порта контроллера ЭЛТ (3B4/3D4)

    20h

    Байт

    Состояние регистра 3x8h

    21h

    Байт

    Состояние регистра 3x9h

    22h

    Байт

    Количество текстовых строк на экране

    23h

    Байт

    Высота символов текста в пикселах

    25h

    Байт

    Код первичного видеоадаптера (см. функцию 1Ah подфункция 0h)

    26h

    Байт

    Код дополнительного видеоадаптера (см. функцию 1Ah подфункция 0h)

    27h

    Слово

    Количество одновременно отображаемых цветов в текущем режиме

    29h

    Байт

    Количество страниц видеопамяти, доступных в текущем режиме

    2Ah

    Байт

    Количество строк развертки в текущем режиме:

    0 - 200;

    1 - 350;

    2 - 400;

    3 - 480

    2Bh

    Байт

    Номер первой таблицы знакогенератора

    2Ch

    Байт

    Номер второй таблицы знакогенератора

    2Dh

    Байт

    Байт, содержащий различные данные:

    D0 не используется;

    D1 бит равен единице, если разрешено преобразование палитры в серый цвет;

    D2 бит равен единице, если подключен монохромный монитор;

    D3 запрещена перезагрузка регистров палитры при выборе режима видеоадаптера;

    D4 бит равен единице, если разрешена эмуляция курсора CGA;

    D5 определяет назначение бита D3 байта атрибутов: если бит равен 1, то он управляет миганием символа, если бит равен нулю, то бит D3 управляет интенсивностью фона символа;

    D7-D6 не используется

    2Eh

    Байт

    Зарезервировано

    2Fh

    Байт

    Зарезервировано

    31h

    Байт

    Объем видеопамяти адаптера:

    0 - 64 Кбайт,

    1 - 128 Кбайт,

    2 - 192 Кбайт,

    3 - 256 Кбайт

    32h

    Байт

    Состояние области сохранения: ???

    D0 бит равен единице, если используется набор из 512 символов;

    D1 бит равен единице, если используется область сохранения цветовой палитры;

    D2 бит равен единице, если используется текстовый набор символов пользователя;

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

    D4 бит равен единице, если используется цветовая палитра, определенная пользователем;

    D7-D5 зарезервировано

    33h - 3Fh

     

    Зарезервировано

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

    Смещение, байт

    Размер

    Содержание

    0

    Байт

    Таблица режимов работы видеоадаптера. Если бит равен единице, то режим поддерживается:

    D0 Режим 00h;

    D1 режим 01h;

    D2 режим 02h;

    D3 режим 03h;

    D4 режим 04h;

    D5 режим 05h;

    D6 режим 06h;

    D7 режим 07h

    1

    Байт

    D0 Режим 08h;

    D1 режим 09h;

    D2 режим 0Ah;

    D3 режим 0Bh;

    D4 режим 0Ch;

    D5 режим 0Dh;

    D6 режим 0Eh;

    D7 режим 0Fh

    2

    Байт

    D0 Режим 10h;

    D1 режим 11h;

    D2 режим 12h;

    D3 режим 13h;

    D7-D4 Не используются

    3

    4 байта

    Зарезервировано

    7

    Байт

    Количество строк растра в текстовых режимах. Если бит равен единице, то режим поддерживается:

    D0 200 строк растра;

    D1 350 строк растра;

    D2 400 строк растра;

    D7-D3 не используются

    8

    Байт

    Количество таблиц знакогенератора, которые можно одновременно использовать (для текстовых режимов)

    9

    Байт

    Количество таблиц знакогенератора, доступных в текстовом режиме

    0Ah

    Байт

    Биты имеют различное назначение: ???

    D0 не используется;

    D1 поддерживается преобразование таблицы цветов в серые цвета;

    D2 поддерживается загрузка шрифтов пользователя;

    D3 поддерживается загрузка цветовой палитры по умолчанию;

    D4 поддерживается эмуляция курсора CGA;

    D5 присутствует палитра EGA;

    D6 присутствует таблица цветов;

    D7 поддерживается функция выбора множества цветов

    0Bh

    Байт

    Биты имеют различное назначение: ???

    D0 поддерживается световое перо;

    D1 сохранение/восстановление видеосостояний, поддерживается функция 1Ch;

    D2 управление битом D3 байта атрибутов;

    D3 код конфигурации монитора

    D7-D4 не используются

    0Ch

    2 байта

    Зарезервировано

    0Eh

    Байт

    Состояние указателя: ???

    D0 бит равен единице, если поддерживается набор из 512 символов

    D1 бит равен единице, если поддерживается область сохранения цветовой палитры

    D2 бит равен единице, если поддерживается текстовый набор символов пользователя

    D3 бит равен единице, если поддерживается графический набор символов пользователя

    D4 бит равен единице, если поддерживается цветовая палитра, определенная пользователем

    D7-D5 зарезервировано

    0Fh

    Байт

    Зарезервировано

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

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

    Номер подфункции

    Назначение

    00h

    Определение размера буфера, необходимого для сохранения текущего состояния видеоадаптера

    01h

    Сохранение текущего состояния видеоадаптера

    02h

    Восстановление текущего состояния видеоадаптера

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

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

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

    На входе:

    AH

    1Ch

     

    AL

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

     

    CX

    Тип данных, который необходимо сохранить (1 - надо сохранять, 0 - не надо сохранять):

    D0 - регистры видеоадаптера,

    D1 - область переменных BIOS,

    D2 - таблица цветов (регистры ЦАП)

    На входе:

    AL

    1Ch

     

    BX

    Размер буфера в 64-байтных блоках

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

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

    На входе:

    AH

    1Ch

     

    AL

    01h - сохранение состояния видеоадаптера

     

    CX

    Тип данных, который необходимо сохранить:

    D0 - регистры видеоадаптера,

    D1 - область переменных BIOS,

    D2 - таблица цветов (регистры ЦАП)

     

    ES:BX

    Адрес буфера для сохраняемых данных

    На выходе:

    AL

    1Ch

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

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

    На входе:

    AH

    1Ch

     

    AL

    02h - восстановление состояния видеоадаптера

     

    CX

    Тип восстанавливаемых данных:

    D0 - регистры видеоадаптера,

    D1 - область переменных BIOS,

    D2 - таблица цветов (регистры ЦАП)

     

    ES:BX

    Адрес буфера данных состояния видеоадаптера

    На выходе:

    AL

    1Ch

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
    TITLE           RUS_DRV
    
    .MODEL  tiny
    
    DOSSEG
    
    ; Сегмент кода
    .CODE
    
    ; Выполняем инициализацию сегментных регистров
    .STARTUP
    
            jmp     start
    
            ; Файл CGA_FONT.INC содержит описание шрифта 8х8 пикселов
            include CGA_FONT.INC
    
            ; Файл EGA_FONT.INC содержит описание шрифта 8х14 пикселов
            include EGA_FONT.INC
    
            ; Файл VGA_FONT.INC содержит описание шрифта 8х16 пикселов
            include VGA_FONT.INC
    
    
            ; Информация о программе, отображается на экране при
            ; ее запуске
    
            hello_msg       DB  254, "  Драйвер русских букв.", 13, 10
                            DB  254, "  Copyright (C) Фролов Г.В., 1992-1995"
                            DB  13, 10, "$"
    
    ; В следующие две переменные будет записан старый вектор
    ; прерывания 10h
            off_int_10h     DW      ?
            seg_int_10h     DW      ?
    
            not_clr         DB      ?
    
    ; Начало программы
    start:
    
            ; Получаем и сохраняем старый вектор прерывания 10h
    
            mov     ax,3510h
            int     21h
            mov     off_int_10h,bx
            mov     seg_int_10h,es
    
            ; Устанавливаем новый обработчик прерывания 10h
            mov     dx,OFFSET int_10h
            mov     ax,2510h
            int     21h
    
            ; Устанавливаем режим 3 видеоадаптера
            ; при этом сразу загружаются новые шрифты
            mov     ax,3
            int     10h
    
            ; Выводим сообщение о программе
            ; Данная функция описана в главе "Использование функций
            ; MS-DOS для управления видеоадаптерами"
            mov     ah, 9h
            mov     dx, OFFSET hello_msg
            int     21h
    
            ; Завершаем программу, и оставляем ее резидентной в памяти
            mov     ax,3100h
            mov     dx,OFFSET resident
            shr     dx,1
            shr     dx,1
            shr     dx,1
            shr     dx,1
            inc     dx
            int     21h
    
    ;------------------------------------------------------------
    ; Новый обработчик прерывания INT 10h
    ;------------------------------------------------------------
    
    int_10h:
    
            ; Проверяем, вызвана ли функция установки режима адаптера
            or      ah,ah
            jz      set_mode  ; да
            jmp     char_gen  ; нет
    
    set_mode:
    
            ; Когда вызвана функция установки режима адаптера, то
            ; записываем в переменную not_clr 0h, если при установке
            ; нового режима надо очистить видеопамять и 80h в
            ; противном случае
    
            mov     cs:not_clr,0
            test    al,80h
            jz      test_mode
    
            mov     cs:not_clr,80h
    
            ; Сбрасываем бит D8, его содержимое находится в not_clr
            and     al,7Fh
    
    test_mode:
    
            ; Затем сохраняем значения регистров процессора
            push    ax
            push    bx
            push    dx
            push    bp
            push    es
            push    ds
    
            push    cs
            pop     ds
    
            ; Определяем, какой режим надо установить
    
            ; Текстовые режимы 0 - 3
            cmp     al,3
            jbe     text_0_3
    
            ; Текстовый режим 7
            cmp     al,7
            je      text_7
    
            ; Графические режимы 4 - 0Eh
            cmp     al,0Eh
            jbe     graph_Eh
    
            ; Графический режим 13h
            cmp     al,13h
            je      graph_13h
    
            ; Графические режимы 0Eh - 10h
            cmp     al,10h
            jbe     graph_10h
    
            ; Графические режимы 11h и 12h
            cmp     al,12h
            jbe     graph_12h
    
            ; Если режим нестандартный, передаем управление BIOS
            ; для его установки и не загружаем свой шрифт
            jmp     old_int_10h
    
    ; Текстовые режимы 0, 1, 2, 3, 7
    text_0_3:
    text_7:
    
            ; Восстанавливаем регистр AX
            or      al,cs:not_clr
    
            ; Вызываем старый обработчик прерывания 10h
            ; для установки нового режима
    
            pushf
            call    DWORD PTR cs:off_int_10h
    
            ; Получаем в BX высоту символов текста в пикселах
            ; для установленного выше режима
    
            ; Высота символов записывается BIOS при выборе нового
            ; режима в переменную по адресу 0000:0485h
    
            xor     dx,dx
            mov     es,dx
            mov     bx,es:[485h]
    
            ; В соответствии с полученной нами высотой символа
            ; выбираем шрифт 8х8, 8х14 или 8х16 пикселов
            cmp     bx,8        ; высота символов 8 пикселов
            jne     line_14
    
            ; Загружаем в регистр BP смещение таблицы шрифтов 8х8,
            ; таблица шрифтов 8х8 пикселов определена в файле
            ; CGA_FONT.INC
            mov     bp,OFFSET fon8_ascii0
            jmp     set_text_font
    
    line_14:
    
            cmp     bx,14      ; высота символов 14 пикселов
            jne     line_16
    
            ; Загружаем в регистр BP смещение таблицы шрифтов 8х14,
            ; таблица шрифтов 8х14 пикселов определена в файле
            ; EGA_FONT.INC
            mov     bp,OFFSET fon14_ascii0
            jmp     set_text_font
    
    line_16:
    
            cmp     bx,16
    
            ; Если полученная высота символов не равна 8, 14 и 16
            ; завершаем обработку
            jne     exit_int_10h
    
            ; Загружаем в регистр BP смещение таблицы шрифтов 8х16,
            ; таблица шрифтов 8х16 пикселов определена в файле
            ; VGA_FONT.INC
            mov     bp,OFFSET fon16_ascii0
    
    set_text_font:
    
            ; Загружаем наш шрифт в память
            mov     ax,1100h
    
            push    cs
            pop     es
    
            xchg    bl,bh
            mov     cx,256
    
    old_int_10h:
    
            ; Вызываем старый обработчик прерывания 10h
            pushf
            call    DWORD PTR cs:off_int_10h
    
    exit_int_10h:
    
            ; Восстанавливаем содержимое регистров процессора
            pop     ds
            pop     es
            pop     bp
            pop     dx
            pop     bx
            pop     ax
    
            ; Завершаем обработку прерывания, возвращаем
            ; управление вызывающей программе
            iret
    
    ; Вызывющая программа устанавливает
    ; графические режимы 4, 5, 6, 0Dh, 0Eh
    graph_Eh:
    graph_13h:
    
            ; Вызываем старый обработчик прерывания 10h
            ; для установки нового режима
            pushf
            call    DWORD PTR cs:off_int_10h
    
            ; Подготавливаем регистры для выбора шрифта 8х8
            mov     dx,OFFSET fon8_ascii0
            mov     bp,OFFSET fon8_ascii128
            jmp     set_gr_font
    
            ; Вызывющая программа устанавливает графические режимы
            ; 0Fh, 10h
    
    graph_10h:
    
            ; Вызываем старый обработчик прерывания 10h
            ; Для установки нового режима
            pushf
            call    DWORD PTR cs:off_int_10h
    
            ; Подготавливаем регистры для выбора шрифта 8х8
            mov     dx,OFFSET fon14_ascii0
            mov     bp,OFFSET fon14_ascii128
            jmp     set_gr_font
    
            ; Вызывющая программа устанавливает графические режимы
            ; 11Dh, 12h
    
    graph_12h:
    
            ; Вызываем старый обработчик прерывания 10h
            ; для установки нового режима
            pushf
            call    DWORD PTR cs:off_int_10h
    
            ; Подготавливаем регистры для выбора шрифта 8х8
            mov     dx,OFFSET fon16_ascii0
            mov     bp,OFFSET fon16_ascii128
    
    set_gr_font:
    
            ; Устанавливаем наши графические шрифты,
            ; изменяя векторы прерываний 1Fh и 43h
            mov     ax,2543h
            int     21h
    
            mov     dx,bp
    
            mov     ax,251Fh
            int     21h
    
            ; Завершаем обработку прерывания
            jmp     exit_int_10h
    
            ; Если вызывающая программа вызвала не функцию
            ; установки режима, проверяем вызвана ли
            ; функция выбора нового шрифта
    
    char_gen:
    
            cmp     ah,11h
            je      gen_func
    
            ; Если нет, передаем управление старому обработчику
    
    go_int_10h:
    
            pushf
            call    DWORD PTR cs:off_int_10h
            iret
    
    gen_func:
    
            ; Если вызывается функция установки нового шрифта, то
            ; смотрим какая вызывается подфункция
    
            ; Вызывается подфункция загрузки шрифта 8х8 из BIOS
            cmp     al,1
            je      text_rom_8_14
    
            ; Вызывается подфункция загрузки шрифта 8х8 из BIOS
            ; с переустановкой контроллера ЭЛТ
            cmp     al,11h
            je      text_rom_8_14
    
            ; Вызывается подфункция загрузки шрифта 8х14 из BIOS
            cmp     al,2
            je      text_rom_8_8
    
            ; Вызывается подфункция загрузки шрифта 8х14 из BIOS
            ; с переустановкой контроллера ЭЛТ
            cmp     al,12h
            je      text_rom_8_8
    
            ; Вызывается подфункция загрузки шрифта 8х16 из BIOS
            cmp     al,4
            je      text_rom_8_16
    
            ; Вызывается подфункция загрузки шрифта 8х16 из BIOS
            ; с переустановкой контроллера ЭЛТ
            cmp     al,14h
            je      text_rom_8_16
    
            ; Если вызывается другая подфункция, то передаем
            ; управление старому обработчику прерываний
            jmp     go_int_10h
    
    text_rom_8_8:
    
            ; Выбираем шрифт 8х8 пикселов
            mov     bp,OFFSET fon8_ascii0
            mov     bh,8
            jmp     set_our_text_font
    
    text_rom_8_14:
    
            ; Выбираем шрифт 8х14 пикселов
            mov     bp,OFFSET fon14_ascii0
            mov     bh,14
            jmp     set_our_text_font
    
    text_rom_8_16:
    
            ; Выбираем шрифт 8х16 пикселов
            mov     bp,OFFSET fon16_ascii0
            mov     bh,16
    
    set_our_text_font:
    
            ; Устанавливаем свой шрифт
            and     al,0f0h
            push    cs
            pop     es
    
            mov     cx,256
            xor     dx,dx
    
            ; Вызываем старый обработчик прерывания 10h
            pushf
            call    DWORD PTR cs:off_int_10h
            iret
    
    resident:
    
    END
    

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

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

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

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

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

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

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

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

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

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

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

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

    
    #include <conio.h>
    #include <stdio.h>
    
    // Главная функция программы
    void main(void) {
    
            int   ch = 0, i;
    
            for( i = 0; ( i <= 0x13 ) && ( ch != 27 ); i++ ) {
    
                    // Исключаем из проверки режимы 8 - 0xC
                    if(( i > 7 ) && ( i <= 0xC )) continue;
    
                    // Устанавливаем режим i
                    _asm {
                            mov     ax,i
                            int     10h
                    }
    
                    // Отображаем текстовую строку
                    printf(" Режим видеоадаптера номер %x", i );
                    ch = getch();
            }
    }
    

    [Назад] [Содеожание] [Дальше]


    Hosted by uCoz