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

         

Регистр установки триггера-защелки светового пера (Light Pen Latch Set Register - LPLSR)


В цветных режимах регистр LPLSR доступен через порт 3DCh, а в монохромных режимах через порт 3BCh. Регистр используется только видеоадаптерами CGA и EGA. Любая операция записи в этот регистр вызывает установку триггера-защелки светового пера.



Регистр выбора читаемого слоя (Read Plane Select Register - RPSR) (индекс4)


Регистр определяет номер цветового слоя видеопамяти, из которого процессор может читать данные. При выполнении операции сравнения цветов значение этого регистра безразлично.

Приведем формат регистра выбора читаемого слоя.

Биты

Описание

D1-D0

Номер читаемого цветового слоя видеопамяти



D7-D2

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

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

Чтение центральным процессором данных из видеопамяти иллюстрируется на рисунке 4.13. На этом рисунке регистр выбора читаемого слоя разрешает чтение второго слоя видеопамяти. Таким образом, при чтении процессором данных из видеопамяти, процессор считывает данные только из второго слоя. Остальные слои видеопамяти недоступны для чтения процессором, пока вы не измените состояние регистра читаемого слоя.

PICTURE._FIG_41.PCX;6";4.308";PCX

Рисунок 4.13   Операция чтения видеопамяти



Регистр выбора цвета (Color Select Register - CSR) (индекс14)


Регистр используется видеоадаптерами VGA и SVGA для управления цветом.

D0    Цвет Р4.

D1    Цвет Р5. Данные биты могут использоваться вместо  линий Р5 и Р4 соответственно (см. регистры палитры и рис. 6.18).

D2    Цвет Р6.

D3    Цвет Р7. Биты используются контроллером атрибутов в качестве двух старших битов, передаваемых ЦАП (рис. 6.18). В режиме 13h биты D2 и D3 не используются.

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



Регистр выбора знакогенератора (Character Generator Select Register - CGSR) (индекс3)


Видеоадаптер EGA позволяет загрузить в память четыре, а VGA и SVGA - восемь таблиц знакогенератора, каждая из которых определяет 256 символов. Одновременно могут использоваться символы одной или двух таблиц знакогенератора. Это позволяет одновременно отображать на экране монитора до 512 различных символов.

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

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

D1-D0    Выбор первой активной таблицы знакогенератора. Эта таблица используется для вывода символа на экран, если бит D3 байта атрибутов символа содержит ноль.

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

D4    Дополнительный бит, доступный на видеоадаптерах VGA и SVGA. Используется для выбора первой таблицы знакогенератора.

D5    Дополнительный бит, доступный на видеоадаптерах VGA и SVGA. Используется для выбора второй таблицы знакогенератора.

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

Для выбора активных таблиц знакогенератора надо установить биты D0-D5 в соответствии со следующей таблицей:

D5 D3 D2

Номер таблицы знакогенератора, используемой, если бит D3 байта атрибутов равен 1

D4 D1 D0

Номер таблицы знакогенератора, используемой если бит D3 байта атрибутов равен 0

0  0  0

Первая таблица знакогенератора

0  0  1

Вторая таблица знакогенератора

0  1  0

Третья таблица знакогенератора

0  1  1

Четвертая таблица знакогенератора

1  0  0

Пятая таблица знакогенератора  (видеоадаптеры VGA и SVGA)

1  0  1

Шестая таблица знакогенератора  (видеоадаптеры VGA и SVGA)

1  1  0

Седьмая таблица знакогенератора  (видеоадаптеры VGA и SVGA)

1  1  1

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

Если нужна только одна активная таблица знакогенератора, то значения битов D5 D3 D2 и битов D4 D1 D0 должны совпадать.

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



Регистры цифро-аналогового преобразователя VGA


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

Цветовая 8-битовая информация, поступающая от контроллера атрибутов (рис. 4.19), преобразуется согласно таблице цветов в три 6-битовые сигнала для трех ЦАП. Такая схема позволяет одновременно отображать на экране 256 различных цветов, каждый из которых можно отдельно выбрать из 26+6+6

= 218 = 262144 возможных цветов.

PICTURE._FIG_31.PCX;6";4.308";PCX

Рисунок 4.19   Схема управления цветами видеоадаптера VGA

Таблица цветов фактически является набором из 256 18-битовых регистров. Используя регистры ЦАП, можно получить доступ для чтения и для записи к каждому регистру таблицы цветов.

ЦАП видеоадаптера VGA управляется пятью регистрами, перечисленными в следующей таблице:

Адрес

Регистр

3C6h

Регистр маскирования пикселов (Pixel Mask Register - PMR)

3C7h

Регистр состояния ЦАП (для чтения) (DAC State Register - DAC_SR)

3C7h

Индекс читаемого регистра таблицы цветов (для записи) (Look-up Table Read Index Register - LTRIR)

3C8h

Индекс записываемого регистра таблицы цветов (Look-up Table Write Index Register - LTWIR)

3C9h

Регистр данных таблицы цветов (Look-up Table Data Register - LTDR)



Регистры цветовой палитры (0-15) (Color Palette Register's - CPR)


Четыре цветовых слоя видеоадаптера EGA позволяют закодировать 16 различных цветов, однако улучшенный цветной монитор обеспечивает возможность отображения 64 цветов.

С помощью 16 регистров цветовой палитры можно выбрать любые 16 цветов из 64 возможных. Эти цвета будут использоваться для отображения на экране.

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

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

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



Регистры графического контроллера


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

Графический контроллер содержит девять регистров. Обращение к ним происходит через индексный порт с адресом 3CEh и порт данных с адресом 3CFh. Адаптер EGA имеет два дополнительных порта с адресами 3CAh и 3CCh, используемых при инициализации видеоадаптера.

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

Индекс регистра

Регистр графического контроллера

0

Регистр установки/сброса (Set/Reset Register - SRR)

1

Регистр разрешения установки/сброса (Set/Reset Enable Register - SRER)

2

Регистр сравнения цветов (Color Compare Register - CCR)

3

Регистр циклического сдвига и выбора функции (Data Rotate & Function Select - DRFS)

4

Регистр выбора читаемого слоя (Read Plane Select Register - RPSR)

5

Регистр режима работы (Mode Register - MDR)

6

Регистр смешанного назначения (Miscellaneous Register - MIR)

7

Регистр маскирования цветовых слоев (Color Don't Care Register - CDCR)

8

Регистр битовой маски (Bit Mask Register - BMR)

На рисунке 4.9, демонстрируются функции, выполняемые графическим контроллером. Рассмотрим функционирование графического адаптера.

Байт, записываемый центральным процессором в видеопамять (11100001b), поступает в графический контроллер. В соответствии со значением регистра циклического сдвига и выбора функции, происходит циклический сдвиг на один бит содержимого байта, записываемого в видеопамять.

Полученный результат складывается по логике ИЛИ с содержимым регистров-защелок. Вы можете применить другие булевы функции - И, ИСКЛЮЧАЮЩЕЕ ИЛИ. Используемая булева функция выбирается регистром циклического сдвига и выбора функции.

Дальнейшие преобразования происходят в соответствии со значениями регистра разрешения установки/сброса и регистра установки/сброса:


       Если бит регистра разрешения установки/сброса, управляющий данным цветовым слоем, равен нулю, то байт, записываемый в видеопамять не изменяется.

       Если бит регистра разрешения установки/сброса, управляющий данным цветовым слоем, равен единице, то в него записывается байт, все биты которого устанавливаются в соответствии со значением регистра установки/сброса для данного цветового слоя.

Затем в зависимости от состояния регистра битовой маски происходит запись данных в видеопамять:

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

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



PICTURE._FIG_40.PCX;6";4.308";PCX

Рисунок 4.9   Функции графического контроллера

Теперь рассмотрим регистры графического контроллера более подробно.


Регистры контроллера атрибутов


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

Индекс

Регистры контроллера атрибутов

0 - 0Fh

Шестнадцать регистров цветовой палитры (Color Palette Register's - CPR)

10h

Регистр управления режимом (Mode Control Register - MCR)

11h

Регистр цвета рамки экрана (Screen Border Color Register - SBCR)

12h

Регистр разрешения цветового слоя (Color Plane Enable Register - CPER)

13h

Регистр горизонтального панорамирования (Horizontal Panning Register - HPR)

14h

Регистр выбора цвета (Color Select Register - CSR)

Доступ ко всем регистрам осуществляется через единственный порт с адресом 3C0h (в отличие от предыдущих рассмотренных нами регистров). Этот порт совмещает в себе функции индексного порта и порта данных, регулируемые внутренним триггером. Триггер переключается каждый раз записи данных в порт. В зависимости от состояния триггера записываемые данные воспринимаются либо как индекс регистра, либо как данные для обмена с регистром.

Установить триггер в исходное состояние можно, выполнив чтение из порта 3BAh для монохромного режима или из порта 3DAh - для цветного режима работы видеоадаптера. После установки триггера в исходное состояние данные, записываемые в регистр 3C0h, будут восприниматься, как индекс регистра.



Регистры контроллера ЭЛТ


Регистры контроллера ЭЛТ управляют сигналами синхронизации, необходимыми для формирования растра, определяют формат данных на экране и форму курсора. Для видеоадаптеров CGA и EGA регистры контроллера ЭЛТ также управляют световым пером.

Большинство из регистров ЭЛТ не представляют интереса. Более того, их неправильное использование может послужить причиной физического разрушения монитора. Поэтому мы подробно рассмотрим лишь наиболее полезные и безопасные регистры контроллера. Назначение и формат ряда регистров контроллера ЭЛТ различаются для видеоадаптеров EGA, VGA, SVGA и для видеоадаптеров MDA, Hercules, CGA.

При программировании регистров контроллера ЭЛТ используется понятие одного знакоместа (characters) и времени необходимого для отображения одного символа (character clock). При вычислении значений регистров следует учесть, что ширина одного символа составляет 8 пикселов.

Растр состоит из совокупности строк развертки, следующих одна за другой. Электронный луч включается в начале каждой строки и выключается в конце. Включение и выключение электронного луча выполняется сигналом разрешения отображения (Display Enable), вырабатываемым контроллером ЭЛТ.

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

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

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

Контроллер ЭЛТ позволяет оставить электронный луч включенным во время перемещения по не отражаемой области. При этом вокруг изображения образуется цветная рамка. Размер и цвет рамки вы можете задавать сами.


После того как электронный луч прочертит все горизонтальные линии растра, контроллер ЭЛТ отключает сигнал разрешения отображения (электронный луч гаснет) и вырабатывает сигнал вертикального обратного хода луча. Электронный луч перемещается с нижней части экрана в верхний левый угол. Продолжительность вертикального обратного хода луча меньше, чем период вертикального неотображаемого интервала. В результате в нижней и верхней части экрана возникают неотображаемые области.

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

Генераторы синхросигналов видеоадаптеров MDA, CGA и Hercules работают только на одной частоте. Для видеоадаптеров EGA, VGA и SVGA доступно несколько различных частот.

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

Видеоадаптер

Режим

Частота вывода пикселов, Мгц

Частота горизонтальной развертки, Кгц

Частота вертикальной развертки, Гц

MDA

720х350

16257

18430

50

CGA

640х200

14318

15750

60

EGA

640х200

14318

15750

60

640х350

16257

21850

60

720х350

16257

18430

50

VGA

640х400

25175

31500

70

720х400

28322

31500

70

640х480

25175

31500

60

640х350

25175

31500

70

SVGA

640х480

31500

37861

72,809

800х600

40000

37879

60,317

800х600

50000

48077

72,187

1024х768

65000

48363

60,000

1024х768

75000

56476

70,069

<


/p> Чтобы вычислить, сколько пикселов помещается на каждой строке развертки разделите частоту вывода точек на частоту горизонтальной развертки. Затем разделите полученное значение на 8 и вы узнаете, сколько символов помещается в строке развертки.

Если вы самостоятельно программируете регистры ЭЛТ видеоадаптеров VGA или SVGA вы должны отнять от полученной величины число 5 (для адаптера EGA следует отнять 2) и записать результат в регистр общей длинны линии горизонтальной развертки (Horizontal Total Register - HTR).

Во время выполнения горизонтальной развертки отображаются только пикселы в рабочей области экрана. Например, для режима VGA 640х480 пикселов, на одной линии горизонтальной развертки отображается только 640 пикселов. Разделите количество пикселов отображаемых в одной строке на 8 и вы узнаете, сколько символов выводится в каждой строке. Полученное значение записывается при выборе режима работы адаптера в регистр длины отображаемой части горизонтальной развертки (Horizontal Display Enable End Register - HDER).

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

Регистры начала импульса гашения луча горизонтальной развертки (Start Horizontal Blank Register  - SHBR) и конца импульса гашения луча горизонтальной развертки (End Horizontal Blank Register - EHBR) определяют размер нерабочей области горизонтальной развертки.

Регистры начала горизонтального обратного хода луча (Start Horizontal Retrace Register - SHRR) и конца импульса горизонтального обратного хода луча (End Horizontal Retrace Register - EHRR) определяют момент начала и окончания горизонтального обратного хода луча.

При вычислении значений регистров SHRR и EHRR следует учитывать, что для большинства мониторов, совместимых с видеоадаптерами VGA требуется отвести на горизонтальный обратный ход луча 2-4 микросекунды. Значения регистров SHRR и EHRR, как и других регистров контроллера ЭЛТ, необходимо записать в символах. Вычислим промежуток времени, в течение которого отображается один символ. Для этого следует разделить 1 на частоту вывода точек и умножить полученное число на 8 (горизонтальный размер символа в пикселах). Если частота вывода точек составляет 25,175 Мгц, тогда на отображение одного символа затрачивается 8/25175 = 0,318 микросекунд. Отсюда вычисляем, что для горизонтального обратного хода луча достаточно времени затрачиваемого на отображение 7 (2/0,318) символов.



Выберите значение для регистра начала горизонтального обратного хода луча (SHRR) таким образом, чтобы растр был отцентрован на экране. Участки нерабочей области до и после горизонтального обратного хода луча должны иметь одинаковый размер.

Всего в строке развертки 100 символов. Из них 80 символов отводится для видимой области строки растра и 12 символов для горизонтального обратного хода луча. Остаток - 8 символов (100-80-12)  относится к нерабочей области строки развертки. Значит горизонтальный обратный ход луча должен начинаться по прошествии времени, необходимого для отображения 80+8/2=84 символов.

Регистры контроллера ЭЛТ составляют самую многочисленную группу регистров видеоадаптеров. Для видеоадаптеров EGA и VGA группа содержит 24 регистра. В следующей таблице приведен список всех регистров контроллера ЭЛТ и их индексы, используемые для доступа к ним.

Индекс

Регистр контроллера ЭЛТ

0

Общая длина линии горизонтальной развертки (Horizontal Total Register - HTR)

1

Длина отображаемой части горизонтальной развертки (Horizontal Display Enable End Register - HDER)

2

Начало импульса гашения луча горизонтальной развертки (Start Horizontal Blank Register  - SHBR)

3

Конец импульса гашения луча горизонтальной развертки (End Horizontal Blank Register - EHBR)

4

Начало импульса горизонтального обратного хода луча (Start Horizontal Retrace Register - SHRR)

5

Конец импульса горизонтального обратного хода луча (End Horizontal Retrace Register - EHRR)

6

Количество горизонтальных линий растра (Vertical Total Register - VTR)

7

Дополнительный регистр (Overflow Register - OVR)

8

Предварительная установка горизонтальной развертки (Preset Row Scan Register - PRSR)

9

Высота символов текста (Max Scan Line Register - MSLR)

0Ah

Начальная линия курсора (Cursor Start Register - CSR)

0Bh

Конечная линия курсора (Cursor End Register - CER)

0Ch

Старший байт начального адреса (Start Address Register - SAR, high byte)

0Dh

Младший байт начального адреса (Start address Register - SAR, low byte)

0Eh

Старший байт позиции курсора (Cursor Location Register - CLR, high byte)

0Fh

Младший байт позиции курсора (Cursor Location Register - CLR, low byte)

10h

Начало обратного вертикального хода луча (Vertical Retrace Start Register - VRSR)

11h

Конец обратного вертикального хода луча (Vertical Retrace End Register - VRER)

10h

Старший байт адреса светового пера (Light Pen Address Register - LPAR, high byte)

11h

Младший байт адреса светового пера (Light Pen Address Register - LPAR, low byte)

12h

Начало гашения вертикальной развертки (Vertical Display End Register - VDER)

13h

Логическая ширина экрана (Offset Register - OFR)

14h

Положение подчеркивания символа (Underline Location Register - ULR)

15h

Начало импульса гашения вертикальной развертки  (Start Vertical Blank Register - SVBR)

16h

Конец импульса гашения вертикальной развертки (End Vertical Blank Register - EVBR)

17h

Управление режимом (Mode Control Register - MCR)

18h

Регистр сравнения линий (Line Compare Register - LCR)

<


/p> В отличие от внешних регистров, адресация к регистрам контроллера ЭЛТ происходит через два порта. В первый порт (индексный) записывается индекс регистра, к которому осуществляется доступ, а через второй порт (порт данных) можно выполнять обмен данными (запись или чтение).

     Большинство регистров контроллера ЭЛТ видеоадаптера EGA доступны только для записи. Прочитать значение этих регистров нельзя

У видеоадаптеров MDA и Hercules индексный порт имеет адрес 3B4h, а порт данных - адрес 3B5h. Для CGA адреса портов другие. Индексный порт имеет адрес 3D4h, а порт данных - адрес 3D5h. Адреса портов контроллера ЭЛТ для видеоадаптеров EGA и VGA зависят от режима работы видеоадаптера (монохромный или цветной). В монохромном режиме адрес порта индексного регистра равен 3B4h, а регистра данных - 3B5h. В цветном режиме адреса соответственно равны 3D4h и 3D5h:

Видеоадаптер

Адрес порта индексного регистра

Адрес порта регистра данных

CGA

3D4h

3D5h

EGA, VGA, SVGA

(монохромный режим)

3B4h

3B5h

EGA, VGA, SVGA

(цветной режим)

3D4h

3D5h

MDA, Hercules

3B4h

3B5h

Так как в монохромных и цветных режимах регистры адресуются через различные порты ввода/вывода, то к компьютеру можно одновременно подключить два видеоадаптера.

Адрес порта индексного регистра записан в области переменных BIOS, по адресу 0000:0463h. Приведем фрагмент программы, определяющей адрес индексного порта контроллера ЭЛТ:

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

xor          ax,ax

mov        es,ax

; Записываем в регистр DX адрес порта индексного

; регистра контроллера ЭЛТ

mov        dx,es:[463]

Так как адреса портов индексного регистра и регистра данных контроллера ЭЛТ является смежными, то адрес порта регистра данных можно легко получить, прибавив единицу к адресу порта индексного регистра.


Регистры начального адреса


Это группа из двух регистров: регистр старшего байта начального адреса (Start Address Register - SAR, high byte) (индекс0Ch) и регистр младшего байта начального адреса (Start Address Register - SAR, low byte) (индекс 0Dh).

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

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

На рисунке 4.4 показано, как происходит свертка экрана при изменении регистров начального адреса. В верхней части рисунка регистры начального адреса содержат ноль. Видеопамять отображается на экране с начала. В нижней части значение регистров начального адреса увеличено до 77h. В этом случае видеопамять отображается на экране начиная с данных, имеющих смещение 77h от начала видеопамяти. В нижней части экрана появляется изображение, ранее не помещающееся на экране.

PICTURE._FIG_36.PCX;6";4.308";PCX

Рисунок 4.4   Свертка изображения на экране

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



Регистры, определяющие положение курсора


Два регистра - регистр старшего байта позиции курсора (Cursor Location Register - CLR_h, high byte) (индекс 0Eh) и регистр младшего байта позиции курсора (Cursor Location Register - CLR_l, low byte) (индекс 0Fh) определяют положение курсора на экране (рис. 4.5). Регистры доступны как для записи, так и для чтения.

PICTURE._FIG_37.PCX;6";4.308";PCX

Рисунок 4.5   Отображение курсора на экране

Программа CURSLOC, приведенная в листинге 4.6 переводит видеоадаптер в текстовый режим, устанавливает курсор в позицию 5 строки 10. Затем программа считывает значения регистров позиции курсора (на момент запуска программы) и отображает их на экране монитора. Вы должны получить значение 0325h (80 * 10 + 5 = 805 = 0325h).

Листинг 4.6. Файл CURSLOC.C

// Чтение регистра положения курсора

#include <stdio.h>

#include "sysp.h"

#include "sysgraph.h"

// Описания функций

void        main(void);

// Функции WriteReg и ReadReg определены в файле

// DESIGN.C. Смотри листинг 4.5

void        WriteReg(unsigned reg, unsigned char data);

unsigned char     ReadReg(unsigned reg);

// Главная функция

void main(void) {

 

int                                                          crt_port;

 

unsigned char   h_pos, l_pos;

 

BIOS_VAR _far  *bios_var_ptr;

 

_asm {

               

// Устанавливаем режим 3

               

mov        ah,0

               

mov        al,3

               

int           10h

               

//              Выбираем страницу видеоапамяти 0

               

mov        ah,5

               

mov        al,0

               

int           10h

               

// Устанавливаем курсор в положение (20,10)

               

mov        ah,2

               

mov        dh,10      //

               

mov        dl,5         // строка 10, позиция 5:

                                                                               

// CLR = 80 * 10 + 5 = 805 = 325h

               

xor          bh,bh

               

int           10h

 

}


// Получаем указатель на область переменных видеофункций BIOS

  bios_var_ptr = (BIOS_VAR _far *) FP_MAKE(0x0000, 0x0410);

// Определяем адрес порта индексного регистра контроллера ЭЛТ

  crt_port = bios_var_ptr -> wAddrCRT;

// Выбираем старший байт регистра положения курсора

  WriteReg(crt_port, 0x0E);

// Читаем значение старшего байта регистра

  h_pos = ReadReg(crt_port + 1);

// Выбираем младший байт регистра положения курсора

  WriteReg(crt_port, 0x0F);

// Считываем значение младшего байта регистра

  l_pos = ReadReg(crt_port + 1);

// Отображаем полученные значения

  printf("\nТекущий адрес курсора %2.2X%2.2Xh\n",

                (unsigned char) h_pos, (unsigned char) l_pos );

  return;

}


Регистры синхронизатора


Синхронизатор управляет всеми временными параметрами видеоадаптера, а также разрешением и запрещением доступа к отдельным цветовым слоям видеопамяти. Синхронизатор содержит пять регистров. Их названия перечислены в таблице 4.12. У видеоадаптера EGA все пять регистров доступны только для записи, а у видеоадаптеров VGA и SVGA также и для чтения.

Индекс регистра

Регистр синхронизатора

0

Регистр сброса синхронизатора (Reset Register - RR)

1

Регистр режима синхронизации (Clock Mode Register - CMR)

2

Регистр разрешения записи цветового слоя (Color Plane Write Enable Register - CPWER)

3

Регистр выбора знакогенератора (Character Generator Select Register - CGSR)

4

Регистр определения структуры памяти (Memory Mode Register - MMR)

Доступ к регистрам осуществляется через индексный порт с адресом 3C4h и через порт данных с адресом 3C5h.



Регистры видеоадаптеров EGA, VGA и SVGA


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

Непосредственное использование регистров может вызвать ряд проблем при переносе ваших программ на другие машины. Дело в том, что не все адаптеры совместимы на уровне регистров. Например, оригинальный видеоадаптер CGA создан на основе микросхемы Motorola 6845, а видеоадаптеры EGA и VGA используют более совершенный аналог этой микросхемы. Некоторые регистры CGA располагаются по другим адресам и могут выполнять какие-либо дополнительные функции, чем регистры EGA и VGA. Кроме того, в каждом новом видеоадаптере SVGA расширяется набор используемых регистров.

Существуют модели видеоадаптеров EGA, VGA и SVGA, поддерживающие режим совместимости, когда они эмулируют адаптеры более низкого уровня (например MDA, Hercules, CGA). Эмуляция обычно происходит на уровне регистров, что гарантирует полную их совместимость. Режимы совместимости, если они поддерживаются, описаны в руководстве данного видеоадаптера.

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



Режим 0Dh


Режим 0Dh используется для отображения графической информации. При этом разрешающая способность составляет 320 пикселов по горизонтали и 200 пикселов по вертикали. Данный режим похож на режим 4, но в нем видеоадаптер может отображать 16 цветов.

В зависимости от объема памяти видеоадаптера, поддерживается различное количество страниц видеопамяти:

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

Количество страниц видеопамяти

256 Кбайт

8

128 Кбайт

4

64 Кбайт

2

Страницы видеопамяти располагаются по следующим адресам:

Страница 0  -  B800:0000h

Страница 1  -  B800:1000h

Страница 2  -  B800:2000h

Страница 3  -  B800:3000h

Страница 4  -  B800:3000h

Страница 5  -  B800:5000h

Страница 6  -  B800:4000h

Страница 7  -  B800:7000h

Если видеоадаптеры VGA и SVGA работают в режиме 0Dh, то для увеличения разрешающей способности они используют двойное сканирование.



Режим 0Eh


Режим 0Eh используется для отображения графической информации. Разрешающая способность составляет 640 пикселов по горизонтали и 200 пикселов по вертикали. В данном режиме видеоадаптер может одновременно отображать 16 различных цветов.

В зависимости от объема видеопамяти поддерживается различное количество страниц видеопамяти:

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

Количество страниц видеопамяти

256 Кбайт

4

128 Кбайт

2

64 Кбайт

1

Страницы видеопамяти располагаются по следующим адресам:

Страница 0  -  A000:0000h

Страница 1  -  A000:4000h

Страница 2  -  A000:8000h

Страница 3  -  A000:C000h

Если видеоадаптеры VGA и SVGA работают в режиме 0Eh, то они используют двойное сканирование.



Режим 0Fh


Монохромный графический режим с разрешением 640 пикселов по горизонтали и 350 пикселов по вертикали.

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

Страницы видеопамяти располагаются по следующим адресам:

Страница 0  -  A000:0000h

Страница 1  -  A000:8000h

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


Графический монохромный режим с разрешением 640х350 пикселов. Данный режим поддерживают только видеоадаптеры EGA, VGA и SVGA.

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

На рисунке 3.10 представлена структура видеопамяти для режима 0Fh.

ICTURE._FIG_43.PCX;6";4.308";PCX

Рисунок 3.10   Структура видеопамяти режима 0Fh

Следующие формулы позволяют определить смещение байта от начала станицы видеопамяти и номер бита в нем, управляющего пикселом с координатами (x,y):

Смещение байта = 50h*y+x/8

Номер бита = 7-mod(x/8)



В этом режиме отображается графическая


В этом режиме отображается графическая информация. Экран монитора имеет разрешение 640 пикселов по горизонтали и 200 пикселов по вертикали. Поддерживаются только два цвета. Для видеоадаптера CGA режим 6 является режимом с максимальным разрешением.

Определена только одна страница видеопамяти, имеющая начальный адрес B800:0000h. Если видеоадаптеры VGA или SVGA работают в режиме 6, то они используют двойное сканирование.



Режим 6 (640х200) является режимом наибольшего разрешения для видеоадаптера CGA. В этом режиме видеоадаптеры EGA, VGA и SVGA используют для хранения информации только нулевой слой памяти.

На рисунке 3.8 представлено соответствие видеопамяти и пикселов экрана. Как и в режимах 4 и 5, первая половина видеопамяти содержит данные обо всех нечетных линиях экрана, а вторая половина - обо всех четных линиях.

В режиме 6 на один пиксел отводится один бит видеопамяти. Таким образом, каждый байт видеопамяти управляет восьмью пикселами. Если значение бита видеопамяти, отвечающего за данный пиксел, равно нулю, то пиксел имеет черный цвет, если единице - белый. За верхний левый пиксел экрана отвечает бит D7 в нулевом байте видеопамяти, то есть самый старший его бит.



PICTURE._FIG_58.PCX;6";4.308";PCX

Рисунок 3.8   Структура видеопамяти в режиме 6

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

Если y четное число, то смещение байта = 50h*(y/2)+(x/8)

Если y нечетное число, то смещение байта = 2000h+50h*((y-1)/2)+(x/8)

Номер бита = 7-mod(x/8)

Эти формулы позволяют определить для пиксела, имеющего координаты (x,y), смещение от начала станицы видеопамяти байта и номер бита в нем, управляющего данным пикселом.


В этом режиме отображается монохромная


В этом режиме отображается монохромная текстовая информация. Экран монитора имеет разрешающую способность 25 строк на 80 столбцов. Матрица символов имеет ширину 9 пикселов, а высоту - 14 пикселов.

Видеоадаптеры EGA, VGA и SVGA в режиме 7 практически полностью программно совместимы с видеоадаптером MDA.

В режиме 7 видеоадаптеры EGA, VGA и SVGA поддерживают 8 страниц видеопамяти, за исключением конфигураций, в которых адаптер EGA имеет только 64 Кбайт памяти. В этом случае EGA поддерживает только первые 4 страницы.

Страницы экрана располагаются в видеопамяти по следующим адресам:

Страница 0  -  B800:0000h

Страница 1  -  B800:1000h

Страница 2  -  B800:2000h

Страница 3  -  B800:3000h

Страница 4  -  B800:3000h

Страница 5  -  B800:5000h

Страница 6  -  B800:4000h

Страница 7  -  B800:7000h



Режим видеоадаптеров VGA и SVGA номер 7+, является расширенной версией режима 7 адаптера EGA. Этот режим отличается только размером матрицы пикселов, используемой для отображения символов текста. В режиме 7+ матрица имеет большее число элементов - 9х16 пикселов.

Режим 10h


Цветной графический режим с разрешением 640 пикселов по горизонтали и 350 пикселов по вертикали. Данный режим обеспечивает отображение 16 цветов, кроме конфигураций, в которых видеоадаптер EGA укомплектован только 64 Кбайт видеопамяти. Адаптер EGA с 64 Кбайт видеопамяти обеспечивает отображение только четырех цветов.

Стандартная цветовая палитра для данного режима представлена в следующей таблице:

Полная палитра

(объем видеопамяти не меньше 128 Кбайт)

Неполная палитра

(64 Кбайт видеопамяти)

Черный

Черный

Голубой

Голубой

Зеленый

Черный

Синий

Голубой

Красный

Красный

Фиолетовый

Белый

Коричневый

Красный

Белый

Белый

Темно-серый

Черный

Светло-голубой

Голубой

Светло-зеленый

Черный

Светло-синий

Голубой

Светло-красный

Красный

Светло-малиновый

Белый

Желтый

Красный

Интенсивно-белый

Белый

Вы можете изменить цветовую палитру, переустановив регистры палитры в контроллере атрибутов. Как это сделать мы расскажем в главе "Контроллер атрибутов".


Графический цветной режим с разрешением 640х350 пикселов. Данный режим поддерживают только видеоадаптеры EGA, VGA и SVGA.

Для хранения видеоданных используются четыре цветовых слоя. Каждому пикселу соответствует по одному биту из каждого цветового слоя. Четыре бита на пиксел позволяют отображать 16 различных цветов. Запись в каждый из этих четырех слоев можно разрешить или запретить при помощи регистра разрешения записи цветового слоя.

На рисунке 3.11 представлена структура видеопамяти для режима 10h.

PICTURE._FIG_10.PCX;6";4.308";PCX

Рисунок 3.11   Структура видеопамяти режима 10h

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

Смещение байта = 50h*y+x/8

Номер бита = 7-mod(x/8)



Режим 11h


Цветной графический режим с разрешением 640 пикселов по горизонтали и 480 пикселов по вертикали. Данный режим обеспечивает отображение только двух цветов.

Видеопамять образует одну страницу. Начальный адрес видеопамяти A000:0000h.


Графический цветной режим с разрешением 640х480 пикселов. Данный режим поддерживают только видеоадаптеры VGA и SVGA.

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

На рисунке 3.12 представлена структура видеопамяти для режима 11h.

PICTURE._FIG_11.PCX;6";4.308";PCX

Рисунок 3.12   Структура видеопамяти режима 11h

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

Смещение байта = 50h*y+x/8

Номер бита = 7-mod(x/8)

Формулы позволяют определить для пиксела, имеющего координаты (x,y), смещение от начала станицы видеопамяти байта и номер бита в нем, управляющего данным пикселом.



Режим 12h


Цветной графический режим с разрешением 640 пикселов по горизонтали и 480 пикселов по вертикали. Данный режим обеспечивает отображение 16 цветов. Видеопамять образует одну страницу. Начальный адрес видеопамяти A000:0000h.


Режим 12h похож на режим 10h, за исключением того, что он имеет большую разрешающую способность - 640х480 пикселов. В видеопамяти задействованы все четыре цветовых слоя. Структура видеопамяти показана на рисунке 3.13.

PICTURE._FIG_10.PCX;6";4.308";PCX

Рисунок 3.13   Структура видеопамяти режима 12h

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



Режим 13h


Цветной графический режим с разрешением 320 пикселов по горизонтали и 200 пикселов по вертикали. Данный режим обеспечивает возможность одновременного отображения 256 цветов.

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

Видеопамять образует одну страницу. Начальный адрес видеопамяти A000:0000h.


Этот режим, как и режим 12h, поддерживается только видеоадаптерами VGA и SVGA. Он обеспечивает отображение 256 различных цветов при разрешающей способности 320х200 пикселов.

Структура видеопамяти приведена на рисунке 3.14. Как видно из рисунка, в этом режиме видеопамять организована линейно. Каждый пиксел определяется одним байтом.

PICTURE._FIG_12.PCX;6";4.308";PCX

Рисунок 3.14   Структура видеопамяти в режиме 13h

Следующая формула позволяет определить смещение от начала видеопамяти байта, управляющего пикселом с координатами (x,y):

Смещение байта = 140h*y+x



Режим 320х400 пикселов, 256 цветов


Мы начнем рассмотрение нестандартных режимов с режима, имеющего разрешение 320х400 пикселов. Программирование этого режима является самым простым и безопасным, так как при его установке нам не придется изменять содержимое регистров контроллера ЭЛТ.

Как мы указывали при описании режимов видеоадаптеров, в режиме 13h используется двойное сканирование. То есть в этом режиме - 320х200 пикселов на самом деле отображается не 200, а 400 линий сканирования. Перепрограммировав несколько регистров адаптера можно перевести его в режим 320х400 пикселов.

Рассмотрим последовательность действий, необходимую для перевода видеоадаптера в нестандартный режим с разрешением 320х400 пикселов:

       Устанавливаем при помощи функций BIOS стандартный режим номер 13h (320х200 пикселов, 256 цветов). При этом программируются все регистры видеоадаптера и нам останется только изменить содержимое нескольких регистров.

       Изменяем структуру видеопамяти, чтобы иметь возможность адресовать 256 Кбайт памяти. Для этого в регистре определения структуры памяти синхронизатора запрещаем режимы в которых доступ по разным адресам (кратным двум и/или кратным четырем) осуществляется к различным цветовым слоям памяти. А в регистре режима работы графического контроллера сбрасываем в ноль бит управления четным/нечетным режимом. Это запрещает доступ по четным адресам к четным цветовым слоям, а по нечетным адресам - к нечетным цветовым слоям видеопамяти. Затем в регистре смешанного назначения графического контроллера сбрасываем бит управляющий сцеплением четных и нечетных слоев памяти. После этих действий видеопамять по своей структуре напоминает режим 10h, за исключением того, что каждый пиксел управляется одним байтом, расположенным в одном из слоев видеопамяти.

       Очищаем видеопамять (для одной или двух страниц по необходимости), так как при установке режима 13h BIOS очищает только первые 64 Кбайт из 256 Кбайт. Остальная часть видеопамяти может содержать данные, которые  появятся на экране монитора после перепрограммирования контроллера ЭЛТ.


       Выключаем режим двойного сканирования. Для этого сбрасываем бит управления двойным сканированием и устанавливаем высоту символов равную единице.

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

Приведем программу E256MRES, реализующую изложенный алгоритм. Данная программа переводит видеоадаптер в режим отображающий 256 цветов при разрешающей способности 320х400 пикселов (листинг 4.15).

Листинг 4.15. Файл E256MRES.C

#include    <conio.h>

#include    <stdlib.h>

#include    <stdio.h>

#include    <dos.h>

// Описание функций

void SetVideoMode(unsigned char);

// Следующие функции определены в файле EVGAM.ASM

void __pascal __far Set320x400Mode( void );

void __pascal __far FullScr(unsigned char);

void __pascal __far

WritePixel(unsigned, unsigned, unsigned char);

unsigned char __pascal __far

ReadPixel(unsigned, unsigned, unsigned char);

// Главная функция

void main( void ){

  unsigned             i;

  char                      ch = 13;

  // Устанавливаем режим 320х400 пикселов, 256 цветов

  Set320x400Mode();

  // Загружаем регистры ЦАП VGA

  //            LoadVGA256();

  for(i = 0; i < 400; i++)

                WritePixel(160, (unsigned) i, (unsigned char)(i%256));

  for(i = 0; i < 320; i++)

                WritePixel((unsigned) i, 200, (unsigned char)(i%256));

  ch = getch();

  if( ch == 27 ) exit(1);

  for(i = 0; i < 320; i++)

                WritePixel((unsigned) i,(unsigned) i,

                                                                                (unsigned char)(i%256));

  ch = getch();

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

                FullScr( (unsigned char) i );

                ch = getch();



  }

  // Возвращаемся в текстовый режим

  SetVideoMode(3);

  printf("\n   (C) Frolov G.V., 1992-1995 \n\n");

}

//===========================================================

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

// параметром vmode

//===========================================================

void SetVideoMode( unsigned char vmode ) {

  union  REGS    inregs, outregs;

  inregs.h.ah = 0x0;

  inregs.h.al = vmode;

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

}

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

Листинг 4.16. Файл EVGAM.ASM

TITLE      EVGAM.ASM

NAME     EVGAM

PAGE      55,132

P286

IDEAL

NOWARN BRK

INCLUDE "evga.inc"

SEGMENT EVGA_TEXT WORD PUBLIC 'CODE'

ASSUME                cs:EVGA_TEXT

;============================================================

; void Set320x400Mode( void )

; Установка режима 320х400 пикселов, 256 цветов.

;============================================================

PUBLIC  SET320X400MODE

PROC     SET320X400MODE FAR

  enter    0, 0

  ; Сохраняем регистр di

  push     di

  ; Устанавливаем стандартный режим 13h

  ; (320x200 пикселов, 256 цветов)

  mov      ax,0013h

  int          10h

  ; Выбираем регистр определенияя структуры памяти

  mov      dx,SC_INDEX

  mov      al,MMR

  out        dx,al

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

  inc         dx

  in                           al,dx

  ; Сбрасываем бит D4

  and       al,11110111b

  ; Устанавливаем бит D3, при этом выключается режим

  ; адресации по четным и нечетным адресам к разным слоям

  ; памяти

  or          al,00000100b

  ; Записываем в регистр новое значение

  out        dx,al

  ; После загрузки в этот регистр нового значения структура

  ; видеопамяти соответствует режимам 10h и 12h за

  ; исключением того, что каждому пикселу соответствует один



  ; байт видеопамяти

  ; Выбираем регистр режима работы графического контроллера

  mov      dx,GC_INDEX

  mov      al,MDR

  out        dx,al

  ; Считываем его значение

  inc         dx

  in           al,dx

  ; Выключаем доступ по четным адресам к четным слоям, а по

  ; нечетным адресам к нечетным слоям

  and       al,11101111b

  out        dx,al

  ; Выбираем регистр смешанного назначения графического

  ; контроллера

  dec       dx

  mov      al,MIR

  out        dx,al

  ; Считываем его значение

  inc         dx

  in           al,dx

  ; Сбрасываем бит управляющий сцеплением четных и нечетных

  ; слоев

  and       al,11111101b

  out        dx,al

  ; Разрешаем запись днных во все четыре цветовых слоя,

  ; записывая число 0fh в регистр разрешения записи

  ; цветового слоя

  mov      dx,SC_INDEX

  mov      al,CPWER

  out        dx,al

  inc         dx

  mov      al,00001111b

  out        dx,al

  ; Очищаем первую страницу видеопамяти, так как установка

  ; ржима 13h очищает только первые 64K

  mov      ax,VGA_SEGMENT

  mov      es,ax

  xor        di,di

  mov      ax,di

  mov      cx,8000h

  cld

  rep        stosb

  ; Выбираем регистр высоты символов текста контроллера ЭЛТ

  mov      dx,CRTC_INDEX

  mov      al,MSLR

  out        dx,al

  inc         dx

  in           al,dx

  ; Устанавливаем высоту символа равную нулю

  ; !!! and     al,not 1fh

  ; Запрещаем двойное сканирование

  and       al,01100000b

  out        dx,al

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

  dec       dx

  mov      al,ULR

  out        dx,al

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

  inc         dx

  in           al,dx

  and       al,10111111b

  out        dx,al

  ; Выбираем регистр управления режимом

  dec       dx

  mov      al,MCR

  out        dx,al

  ; Включаем байтовый режим адресации

  inc         dx

  in           al,dx

  or          al,01000000b

  out        dx,al

  pop       di

  leave

  ret

ENDP      SET320X400MODE

;============================================================



; void WritePixel(unsigned x, unsigned y,

; unsigned char color)

;

; Функция отображает на экране пиксел в заданных координатах,

; определенного цвета.

; x - x-координата пиксела (0-319),

; y - y-координата пиксела (0-399),

; color - цвет пиксела (0-255).

;============================================================

color      EQU        [bp+6]

y                              EQU        [bp+8]

x                              EQU        [bp+10]

PUBLIC  WRITEPIXEL

PROC     WRITEPIXEL FAR

  enter    0, 0

  push     di

  mov      cx,x

  mov      dx,y

  mov      bl,color

  mov      ax,VGA_SEGMENT

  mov      es,ax

  mov      ax,( SCREEN_WIDTH / 4 )

  mul       dx

  push     cx

  shr        cx,1

  shr        cx,1

  add       ax,cx

  mov      di,ax

  pop       cx

  and       cl,3

  mov      ah,1

  shl         ah,cl

  mov      dx,SC_INDEX

  mov      al,CPWER

  out        dx,ax

  mov      es:[di],bl

  pop       di

  leave

  ret 6

ENDP      WRITEPIXEL

;============================================================

; unsigned char ReadPixel(unsigned x, unsigned y, unsigned char color)

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

; с заданными координатами.

; x - x-координата пиксела (0-319),

; y - y-координата пиксела (0-399).

; Return  цвет пиксела (0-255).

;============================================================

color      EQU        [bp+6]

y                              EQU        [bp+8]

x                              EQU        [bp+10]

PUBLIC  READPIXEL

PROC     READPIXEL FAR

  enter    0, 0

  push     si

  mov      cx,x

  mov      dx,y

  mov      ax,VGA_SEGMENT

  mov      es,ax

  mov      ax,( SCREEN_WIDTH / 4 )

  mul       dx

  push     cx

  shr        cx,1

  shr        cx,1

  add       ax,cx

  mov      si,ax

  pop       ax

  and       al,3

  mov      ah,al

  mov      dx,GC_INDEX

  mov      al,RPSR

  out        dx,ax

  mov      al,es:[si]

  xor        ah,ah

  pop       si

  leave

  ret 6



ENDP      READPIXEL

;============================================================

; void FullScr( unsigned char color )

; Закрашивает экран заданным цветом.

; color - цвет экрана (0-255).

;============================================================

color      EQU        [bp+6]

PUBLIC  FULLSCR

PROC     FULLSCR FAR

  enter    0, 0

  ;разрешаем запись данных во все четыре цветовых слоя

  push     di

  mov      dx,SC_INDEX

  mov      al,CPWER

  out        dx,al

  inc         dx

  mov      al,0fh

  out        dx,al

  mov      ax,VGA_SEGMENT

  mov      es,ax

  xor        di,di

  mov      al,color

  mov      cx,32000

  cld

  rep        stosb

  pop       di

  leave

  ret 2

ENDP FULLSCR

ENDS      EVGA_TEXT

END

Включаемый файл EVGA.INC, в котором определены различные константы для нестандартных режимов видеоадаптера, представлен в листинге 4.17.

Листинг 4.17. Файл EVGA.INC

; Сегмент видеопамяти для режима 13h

VGA_SEGMENT   EQU        0a000h

; Адрес индексного порта синхронизатора

SC_INDEX             EQU        3c4h

  ; Регистр разрешения записи цветового слоя

  CPWER                EQU        2

  ; Регистр определения структуры памяти

  MMR     EQU        4

; Адрес индексного порта графического контроллера

GC_INDEX             EQU        3ceh

  ; Регистр выбора читаемого слоя

  RPSR    EQU        4

  ; Регистр режима работы

  MDR      EQU        5

  ; Регистр смешанного назначения

  MIR       EQU        6

; Адрес индексного порта контроллера ЭЛТ (цветной режим)

CRTC_INDEX        EQU        3d4h

  ; Регистр высоты символов текста

  MSLR   EQU        9

  ; Регистр начального адреса

  SAR_h  EQU        0ch

  ; Регистр положения подчеркивания символа

  ULR       EQU        14h

  ; Регистр управления режимом

  MCR      EQU        17h

; Регистр определения различных режимов работы

MOR       EQU        3c2h

; Режим 320х400 пикселов

  ; Количество пикселов по вертикали

  SCREEN_HEIGHT               EQU        400

  ; Количество пикселов по горизонтали

  SCREEN_WIDTH                EQU        320

; РЕЖИМ 360х480 пикселов

  ; Количество пикселов по вертикали (режим 320х400)

  SCREEN_HEIGHT_H          EQU        480

  ; Количество пикселов по горизонтали (режим 360х480)

  SCREEN_WIDTH_H           EQU        360


Режим 360х480 пикселов, 256 цветов


Второй нестандартный режим, который мы рассмотрим, может отображать 256 цветов при разрешающей способности 360х480 пикселов. Ниже приведена программа E256HRES, которая переводит видеоадаптер в нестандартный режим с разрешением 360х480 пикселов (листинг 4.18):

Листинг 4.18. Файл E256HRES.C

#include                <conio.h>

#include                <stdlib.h>

#include                <stdio.h>

#include                <dos.h>

#include                "vga_new.h"

// Описание функций

void main( void );

void SetVideoMode(unsigned char);

// Следующие функции определены в файле EVGAH.ASM

void __pascal __far Set360x480Mode( void );

void __pascal __far FullScrH(unsigned char);

void __pascal __far

WritePixelH(unsigned, unsigned, unsigned char);

unsigned char __pascal __far

ReadPixelH(unsigned, unsigned, unsigned char);

// Главная функция

void main( void ){

 

unsigned i;

 

char ch = 13;

 

// Устанавливаем режим 360х480 пикселов, 256 цветов

 

Set360x480Mode();

 

// загружаем регистры ЦАП VGA

 

//            LoadVGA256();

 

for(i = 0; i < 480; i++)

               

WritePixelH(180, (unsigned) i, (unsigned char)(i%256));

 

for(i = 0; i < 360; i++)

               

WritePixelH((unsigned) i, 240, (unsigned char)(i%256));

 

ch = getch();

 

if( ch == 27 ) exit(1);

 

for(i = 0; i < 360; i++)

               

WritePixelH((unsigned) i, (unsigned) i,

                               

(unsigned char) (i % 256) );

 

ch = getch();

 

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

               

FullScrH( (unsigned char) i );

               

ch = getch();

 

}

 

// Возвращаемся в текстовый режим

 

SetVideoMode(3);

 

printf("\n   (C) Frolov G.V., 1992\n\n");

}

//===========================================================

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

// параметром vmode

//===========================================================

void SetVideoMode( unsigned char vmode ) {


  union  REGS    inregs, outregs;

  inregs.h.ah = 0x0;

  inregs.h.al = vmode;

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

}

Основные функции, предназначенные для выбора нестандартного режима с разрешением 360х480 пикселов, записи и чтения пикселов, а также заполнения экрана монитора, написаны на языке ассемблера. Исходный текст этих функций представлен в листинге 4.19.

Листинг 4.19. Файл EVGAH.ASM

TITLE      EVGAH.ASM

NAME     EVGAH

PAGE      55,132

P286

IDEAL

NOWARN BRK

INCLUDE "evga.inc"           // Смотри листинг 4.17

SEGMENT EVGA_TEXT WORD PUBLIC 'CODE'

ASSUME                cs:EVGA_TEXT

;============================================================

; void Set360x480Mode( void )

; Установка режима 360х480 пикселов, 256 цветов.

;============================================================

PUBLIC  SET360X480MODE

PROC     SET360X480MODE FAR

  enter    0, 0

; Устанавливаем режим 12h, чтобы очистить видеопамять

  mov      ax,12h

  int          10h

; Устанавливаем стандартный режим 13h

; (320x200 пикселов, 256 цветов)

  mov      ax,0013h

  int          10h

  ; Перепрограммируем регистр определения структуры памяти:

  ; запрещаем адресацию к разным слоям памяти в зависимости

  ; от кратности адреса памяти четырем (бит D4 chain4)

  mov      dx,SC_INDEX

  mov      ax,0604h

  out        dx,ax

  ; Производим синхронный сброс и остановку синхронизатора

  mov      ax,0100h

  out        dx,ax

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

  ; работы

  mov      dx,MOR

  ; Устанавливаем частоту кадров 60Кц

  mov      al,0e7h

  out        dx,al

  ; Запускаем синхронизатор

  mov      dx,SC_INDEX

  mov      ax,0300h

  out        dx,ax

  ; Выбираем регистр режима работы графического контроллера

  mov      dx,GC_INDEX

  mov      al,MDR

  out        dx,al

  ; Считываем его значение

  inc         dx

  in           al,dx

  ; Выключаем доступ по четным адресам к четным слоям, а по

  ; нечетным адресам к нечетным слоям

  and       al,11101111b



  out        dx,al

  ; Выбираем регистр смешанного назначения графического

  ; контроллера

  dec       dx

  mov      al,MIR

  out        dx,al

  ; Считываем его значение

  inc         dx

  in           al,dx

  ; Сбрасываем бит управляющий сцеплением четных и нечетных

  ; слоев

  and       al,11111101b

  out        dx,al

  ; Выбираем регистр конца обратного вертикального хода луча

  mov      dx,3d4h

  mov      al,11h

  out        dx,al

  ; Снимаем защиту от записи с регистров контроллера ЭЛТ,

  ; имеющих индексы от 0 до 7

  inc         dx

  in           al,dx

  and       al,7fh

  out        dx,al

  dec       dx

  ; Программируем регистры контроллера ЭЛТ, втом числе

  ; регистры, определяющие временные параметры режима

  ; Устанавливаем регистр общей длины линии горизонтальной

  ; развертки

  mov      ax,06b00h

  out        dx,ax

  ; Устанавливаем регистр длины отображаемой части

  ; горизонтальной развертки

  mov      ax,05901h

  out        dx,ax

  ; Устанавливаем регистр начала импульса гашения луча

  ; горизонтальной развертки

  mov      ax,05a02h

  out        dx,ax

  ; Устанавливаем регистр конца импульса гашения луча

  ; горизонтальной развертки

  mov      ax,08e03h

  out        dx,ax

  ; Устанавливаем регистр начала импульса горизонтального

  ; обратного хода луча

  mov      ax,05e04h

  out        dx,ax

  ; Устанавливаем регистр конца импульса горизонтального

  ; обратного хода луча

  mov      ax,08a05h

  out        dx,ax

  ; Устанавливаем регистр числа горизонтальных линий

  ; растра

  mov      ax,0d06h

  out        dx,ax

  ; Устанавливаем дополнительный регистр

  mov      ax,03e07h

  out        dx,ax

  ; Устанавливаем регистр высоты символов текста

  mov      ax,04009h

  out        dx,ax

  ; Устанавливаем регистр начала обратного

  ; вертикального хода луча

  mov      ax,0ea10h

  out        dx,ax

  ; Устанавливаем регистр конца обратного

  ; вертикального хода луча

  mov      ax,0ac11h

  out        dx,ax

  ; Устанавливаем регистр начала гашения вертикальной



  ; развертки

  mov      ax,0df12h

  out        dx,ax

  ; Устанавливаем регистр логической ширины экрана

  mov      ax,02d13h

  out        dx,ax

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

  mov      ax,014h

  out        dx,ax

  ; Устанавливаем регистр начала импульса гашения

  ; вертикальной развертки

  mov      ax,0e715h

  out        dx,ax

  ; Устанавливаем регистр конца импульса гашения

  ; вертикальной развертки

  mov      ax,0616h

  out        dx,ax

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

  mov      ax,0e317h

  out        dx,ax

  leave

  ret

ENDP      SET360X480MODE

;============================================================

; void

; WritePixelH( unsigned x, unsigned y, unsigned char color)

; Функция отображает на экране пиксел в заданных координатах,

; определенного цвета.

; x - x-координата пиксела (0-319),

; y - y-координата пиксела (0-399),

; color - цвет пиксела (0-255).

;============================================================

color      EQU        [bp+6]

y                              EQU        [bp+8]

x                              EQU        [bp+10]

PUBLIC  WRITEPIXELH

PROC     WRITEPIXELH FAR

  enter    0, 0

  push     di

  mov      cx,x

  mov      dx,y

  mov      bl,color

  mov      ax,VGA_SEGMENT

  mov      es,ax

  mov      ax,( SCREEN_WIDTH_H / 4 )

  mul       dx

  push     cx

  shr        cx,1

  shr        cx,1

  add       ax,cx

  mov      di,ax

  pop       cx

  and       cl,3

  mov      ah,1

  shl         ah,cl

  mov      dx,SC_INDEX

  mov      al,CPWER

  out        dx,ax

  mov      es:[di],bl

  pop       di

  leave

  ret 6

ENDP      WRITEPIXELH

;============================================================

; unsigned char

; ReadPixelH(unsigned x, unsigned y, unsigned char color)

; Функция возвращает значение байта видеопамяти,

; определяющего пиксел с заданными координатами.

; x - x-координата пиксела (0-319),

; y - y-координата пиксела (0-399).

; Функция возвращает цвет пиксела (0-255).



;============================================================

color      EQU        [bp+6]

y                              EQU        [bp+8]

x                              EQU        [bp+10]

PUBLIC  READPIXELH

PROC     READPIXELH FAR

  enter    0, 0

  push     si

  mov      cx,x

  mov      dx,y

  mov      ax,VGA_SEGMENT

  mov      es,ax

  mov      ax,( SCREEN_WIDTH_H / 4 )

  mul       dx

  push     cx

  shr        cx,1

  shr        cx,1

  add       ax,cx

  mov      si,ax

  pop       ax

  and       al,3

  mov      ah,al

  mov      dx,GC_INDEX

  mov      al,RPSR

  out        dx,ax

  mov      al,es:[si]

  mov      color,al

  xor          ah,ah

  pop       si

  leave

  ret 6

ENDP      READPIXELH

;============================================================

; void FullScrH( unsigned char color )

; Закрашивает экран заданным цветом.

; color - цвет экрана (0-255).

;============================================================

color      EQU        [bp+6]

PUBLIC  FULLSCRH

PROC     FULLSCRH FAR

  enter    0, 0

  ;Разрешаем запись данных во все четыре цветовых слоя

  push     di

  ;Разрешаем запись данных во все четыре цветовых слоя

  mov      dx,SC_INDEX

  mov      al,CPWER

  out        dx,al

  inc           dx

  mov      al,0fh

  out        dx,al

  mov      ax,VGA_SEGMENT

  mov      es,ax

  xor        di,di

  mov      al,color

  mov      cx,43200

  cld

  rep        stosb

  pop       di

  leave

  ret 2

ENDP FULLSCRH

ENDS      EVGA_TEXT

END


Режимы 0*, 1*


Режимы EGA 0* и 1* являются расширенными версиями режимов 0 и 1 адаптера CGA. Эти режимы отличаются только размером матрицы пикселов, используемой для отображения символов текста. В режимах 0* и 1* матрица имеет большее число элементов - 8х14 пикселов.

Из-за различий в размерности матриц символов ухудшается совместимость между видеоадаптерами CGA и EGA. В частности возникают трудности при установке формы курсора и положения линии подчеркивания символов.


Видеоадаптеры VGA и SVGA реализуют собственные расширенные версии режимов 0 и 1. Они обозначаются как 0+ и 1+. Эти режимы отличаются от режимов 0 и 1 только размером матрицы пикселов, используемой при отображении символов текста. В режимах 0+ и 1+

матрица имеет большее число элементов - 9х16 пикселов.

Как и для режимов 0* и 1*, отличие размерности матриц символов создает трудности при создании совместимых программ для адаптеров CGA, EGA, VGA и SVGA. Необходимо быть уверенным в правильности установки формы курсора и положения линии подчеркивания символов.




При использовании видеоадаптеров EGA или VGA не существует функциональных различий между режимом 0 и режимом 1. В данных режимах монитор отображает цветную текстовую (алфавитно-цифровую) информацию - 25 строк и 40 столбцов. Из-за низкой разрешающей способности режимы 0 и 1 практически не применяются. Современные видеоадаптеры поддерживают эти режимы только для обеспечения совместимости с видеоадаптерами CGA и MDA.

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

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

Стандартный цвет

Дополнительный цвет

Черный

Серый

Синий

Светло-синий

Зеленый

Светло-зеленый

Морской волны

Голубой

Красный

Светло-красный

Фиолетовый

Малиновый

Коричневый

Желтый

Белый

Ярко-белый

Для видеоадаптеров EGA, VGA и SVGA можно изменить используемую палитру цветов. Адаптер EGA с улучшенным цветным монитором позволяет выбрать 16 цветов из 64 возможных, а VGA и SVGA - 16 цветов из 262144 возможных.

В режимах 0 и 1 адаптеры EGA, VGA и SVGA поддерживают восемь страниц видеопамяти. Страницей называется часть видеопамяти, полностью определяющая содержимое одного экрана монитора. Одна из этих восьми страниц является активной. Ее содержимое отображается на экране. Для изменения активной страницы можно вызвать соответствующую функцию BIOS или непосредственно изменить содержимое регистра начального адреса, расположенного в контроллере электронно лучевой трубки.

Рисунок 2.1 демонстрирует страничную организацию видеопамяти. На мониторе отображается содержимое первой страницы памяти, расположенной по адресу B000:0800h.


Режимы 0Dh и 0Eh


Разрешающая способность в режиме 0Dh составляет 320 пикселов по горизонтали и 200 пикселов по вертикали, а в режиме 0Eh соответственно 640 и 200 пикселов.

Режимы 0Dh и 0Eh поддерживают только видеоадаптеры EGA и VGA. На рисунке 3.9 представлена структура видеопамяти для этого режима.

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

Каждому пикселу соответствует четыре бита - по одному биту из каждого цветового слоя. Четыре бита на пиксел, используемые в данных режимах, позволяют одновременно отображать пикселы 16 различных цветов.

PICTURE._FIG_10.PCX;6";4.308";PCX

Рисунок 3.9   Структура видеопамяти в режимах 0Dh и 0Eh

Следующие формулы позволяют определить смещение байта от начала станицы видеопамяти и номер бита в нем, управляющего пикселом с координатами (x,y):

Смещение байта = 50h*y+x/8

Номер бита = 7-mod(x/8)

Запись в каждый из четырех слоев видеопамяти можно разрешить или запретить при помощи регистра разрешения записи цветового слоя. Смотри раздел "Регистры видеоадаптеров EGA, VGA и SVGA".



Режимы 2*, 3*


Режимы EGA 2* и 3* являются расширенными версиями режимов 2 и 3 для CGA. Эти режимы отличаются только размером матрицы пикселов, используемой для отображения символов текста. В режимах 2* и 3* матрица имеет большее число элементов - 8х14 пикселов.


Видеоадаптеры VGA и SVGA реализуют собственные расширенные версии режимов 2 и 3. Они обозначаются как 2+ и 3+. Эти режимы отличаются от режимов 2 и 3 только размером матрицы пикселов, используемой при отображении символов текста. В режимах 2+ и 3+

матрица имеет большее число элементов - 9х16 пикселов.

Как указывалось выше, в режимах 2 и 3 видеоадаптеры VGA и SVGA используют двойное сканирование.




Во втором и третьем режимах монитор отображает цветную текстовую информацию. Количество строк, также как и в режимах 0 и 1, равно 25, а количество столбцов увеличено до 80. Для видеоадаптеров EGA, VGA и SVGA данные режимы не имеют различий.

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

В данных режимах работы видеоадаптеры EGA, VGA и SVGA поддерживают 8 страниц экрана. Исключение составляют конфигурации, в которых видеоадаптер EGA имеет только 64 Кбайт видеопамяти. В этом случае EGA поддерживает только первые 4 страницы видеопамяти. Одна из этих восьми страниц является активной.

Страницы видеопамяти располагаются по следующим адресам:

Страница 0  -  B800:0000h

Страница 1  -  B800:1000h

Страница 2  -  B800:2000h

Страница 3  -  B800:3000h

Страница 4  -  B800:3000h

Страница 5  -  B800:5000h

Страница 6  -  B800:4000h

Страница 7  -  B800:7000h


Режимы 8, 9, 0Ah


Данные режимы используются только в компьютере PCjr и в нашей книге не рассматриваются.



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


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

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

Режим работы

Тип информации

Количество цветов

Разрешение, пиксел x пиксел

Размер символов, пиксел x пиксел

0, 1

Текстовый цветной

16

40x25

8x8

0*, 1*

Текстовый цветной

16

40x25

8x14

0+, 1+

Текстовый цветной

16

40x25

9x16

2, 3

Текстовый цветной

16

80x25

8x8

2*, 3*

Текстовый цветной

16

80x25

8x14

2+, 3+

Текстовый цветной

16

80x25

9x16

4, 5

Графический цветной

4

320x200

6

Графический цветной

2

640x200

7

Текстовый монохромный

2

80x25

9x14

7+

Текстовый монохромный

2

80x25

9x16

8, 9,

0Ah

Используются видеоадаптерами компьютера PC jr, и в настоящее время интереса не представляют

0Bh, 0Ch

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

0Dh

Графический цветной

16

320x200

0Eh

Графический цветной

16

640x200

0Fh

Графический монохромный

2

640x350

10h

Графический цветной

16

640x350

11h

Графический цветной

2

640x480

12h

Графический цветной

16

640x480

13h

Графический цветной

256

320x200

Для видеоадаптеров EGA, VGA и SVGA режимы 0 и 1, 2 и 3, 4 и 5 не различаются. Отличие этих режимов существенно только для видеоадаптера CGA. В режимах 0, 2 и 5 не выполняется разбивка цветов (color burst) для композитного видеосигнала. В результате изображение на монохромных мониторах становиться более качественным.

Стандартные режимы работы не включают в себя все режимы, в которых могут работать видеоадаптеры. Видеоадаптеры SVGA могут также работать в режимах, имеющих улучшенные характеристики. Характеристики этих режимов отличаются у видеоадаптеров разных фирм.


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

Чтобы преодолеть несовместимость и избавить разработчиков программного обеспечения от необходимости создания собственных драйверов, ассоциация VESA (Video Electronics Standards Association) разработала одноименный стандарт VESA. Этот стандарт охватывает практически все возможности, предоставляемые современными видеоадаптерами.

Приведем список режимов работы видеоадаптеров, соответствующих стандарту VESA:

Режим работы

Тип информации

Количество цветов

Разрешение, пиксел x пиксел

Размер символов, пиксел x пиксел

100h

Графический цветной

256

640x400

101h

Графический цветной

256

640x480

8х16

102h

Графический цветной

16

800x600

8х8

103h

Графический цветной

256

800x600

8х8

104h

Графический цветной

16

1024x768

105h

Графический цветной

256

1024x768

8х16

106h

Графический цветной

16

1280x1024

107h

Графический цветной

256

1280x1024

108h

Текстовый цветной

16

80x60

109h

Текстовый цветной

16

132x25

9х16

10Ah

Текстовый цветной

16

132x43

9х9

10Bh

Текстовый цветной

16

132x50

10Ch

Текстовый цветной

16

132x60

10Dh

Графический цветной

32768

320x200

10Eh

Графический цветной

65536

320x200

10Fh

Графический цветной

16777216

320x200

110h

Графический цветной

32768

640x480

111h

Графический цветной

65536

640x480

112h

Графический цветной

16777216

640x480

113h

Графический цветной

32768

800x600

114h

Графический цветной

65536

800x600

115h

Графический цветной

16777216

800x600

116h

Графический цветной

32768

1024x768

117h

Графический цветной

65536

1024x768

118h

Графический цветной

16777216

1024x768

119h

Графический цветной

32768

1024x768

11Ah

Графический цветной

65536

1280x1024

Более полную информацию о стандарте VESA мы привели в главе "Видеоадаптеры SVGA". В этой главе мы также поместили описание расширения BIOS, позволяющего легко программировать видеоадаптеры SVGA, совместимые со стандартом VESA.


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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

TITLE                      RUS_DRV

.MODEL tiny

DOSSEG

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

.CODE

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

.STARTUP

  jmp       start

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

  include CGA_FONT.INC

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

  include EGA_FONT.INC

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

  include VGA_FONT.INC

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



  ; ее запуске

  hello_msg           DB  254, "  Драйвер русских букв.", 13, 10

                                DB  254, "  Copyright (C) Фролов Г.В., 1992-1995"

                                DB  13, 10, "$"

; В следующие две переменные будет записан старый вектор

; прерывания 10h

  off_int_10h         DW         ?

  seg_int_10h       DW         ?

  not_clr                 DB           ?

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

start:

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

  mov      ax,3510h

  int          21h

  mov      off_int_10h,bx

  mov      seg_int_10h,es

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

  mov      dx,OFFSET int_10h

  mov      ax,2510h

  int          21h

  ; Устанавливаем режим 3 видеоадаптера

  ; при этом сразу загружаются новые шрифты

  mov      ax,3

  int          10h

  ; Выводим сообщение о программе

  ; Данная функция описана в главе "Использование функций

  ; MS-DOS для управления видеоадаптерами"

  mov      ah, 9h

  mov      dx, OFFSET hello_msg

  int          21h

  ; Завершаем программу, и оставляем ее резидентной в памяти

  mov      ax,3100h

  mov      dx,OFFSET resident

  shr        dx,1

  shr        dx,1

  shr        dx,1

  shr        dx,1

  inc         dx

  int          21h

;------------------------------------------------------------

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

;------------------------------------------------------------

int_10h:

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

  or          ah,ah

  jz           set_mode  ; да

  jmp       char_gen  ; нет

set_mode:

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

  ; записываем в переменную not_clr 0h, если при установке

  ; нового режима надо очистить видеопамять и 80h в

  ; противном случае

  mov      cs:not_clr,0

  test       al,80h

  jz           test_mode

  mov      cs:not_clr,80h

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

  and       al,7Fh

test_mode:

  ; Затем сохраняем значения регистров процессора



  push     ax

  push     bx

  push     dx

  push     bp

  push     es

  push     ds

  push     cs

  pop       ds

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

  ; Текстовые режимы 0 - 3

  cmp      al,3

  jbe         text_0_3

  ; Текстовый режим 7

  cmp      al,7

  je           text_7

  ; Графические режимы 4 - 0Eh

  cmp      al,0Eh

  jbe         graph_Eh

  ; Графический режим 13h

  cmp      al,13h

  je           graph_13h

  ; Графические режимы 0Eh - 10h

  cmp      al,10h

  jbe         graph_10h

  ; Графические режимы 11h и 12h

  cmp      al,12h

  jbe         graph_12h

  ; Если режим нестандартный, передаем управление BIOS

  ; для его установки и не загружаем свой шрифт

  jmp       old_int_10h

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

text_0_3:

text_7:

  ; Восстанавливаем регистр AX

  or          al,cs:not_clr

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

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

  pushf

  call        DWORD PTR cs:off_int_10h

  ; Получаем в BX высоту символов текста в пикселах

  ; для установленного выше режима

  ; Высота символов записывается BIOS при выборе нового

  ; режима в переменную по адресу 0000:0485h

  xor        dx,dx

  mov      es,dx

  mov      bx,es:[485h]

  ; В соответствии с полученной нами высотой символа

  ; выбираем шрифт 8х8, 8х14 или 8х16 пикселов

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

  jne         line_14

  ; Загружаем в регистр BP смещение таблицы шрифтов 8х8,

  ; таблица шрифтов 8х8 пикселов определена в файле

  ; CGA_FONT.INC

  mov      bp,OFFSET fon8_ascii0

  jmp       set_text_font

line_14:

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

  jne         line_16

  ; Загружаем в регистр BP смещение таблицы шрифтов 8х14,

  ; таблица шрифтов 8х14 пикселов определена в файле

  ; EGA_FONT.INC

  mov      bp,OFFSET fon14_ascii0

  jmp       set_text_font

line_16:

  cmp      bx,16

  ; Если полученная высота символов не равна 8, 14 и 16

  ; завершаем обработку

  jne         exit_int_10h

  ; Загружаем в регистр BP смещение таблицы шрифтов 8х16,



  ; таблица шрифтов 8х16 пикселов определена в файле

  ; VGA_FONT.INC

  mov      bp,OFFSET fon16_ascii0

set_text_font:

  ; Загружаем наш шрифт в память

  mov      ax,1100h

  push     cs

  pop       es

  xchg     bl,bh

  mov      cx,256

old_int_10h:

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

  pushf

  call        DWORD PTR cs:off_int_10h

exit_int_10h:

  ; Восстанавливаем содержимое регистров процессора

  pop       ds

  pop       es

  pop       bp

  pop       dx

  pop       bx

  pop       ax

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

  ; управление вызывающей программе

  iret

; Вызывющая программа устанавливает 

; графические режимы 4, 5, 6, 0Dh, 0Eh

graph_Eh:

graph_13h:

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

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

  pushf

  call        DWORD PTR cs:off_int_10h

  ; Подготавливаем регистры для выбора шрифта 8х8

  mov      dx,OFFSET fon8_ascii0

  mov      bp,OFFSET fon8_ascii128

  jmp       set_gr_font

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

  ; 0Fh, 10h

graph_10h:

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

  ; Для установки нового режима

  pushf

  call        DWORD PTR cs:off_int_10h

  ; Подготавливаем регистры для выбора шрифта 8х8

  mov      dx,OFFSET fon14_ascii0

  mov      bp,OFFSET fon14_ascii128

  jmp       set_gr_font

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

  ; 11Dh, 12h

graph_12h:

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

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

  pushf

  call        DWORD PTR cs:off_int_10h

  ; Подготавливаем регистры для выбора шрифта 8х8

  mov      dx,OFFSET fon16_ascii0

  mov      bp,OFFSET fon16_ascii128

set_gr_font:

  ; Устанавливаем наши графические шрифты,

  ; изменяя векторы прерываний 1Fh и 43h

  mov      ax,2543h

  int          21h

  mov      dx,bp

  mov      ax,251Fh

  int          21h

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

  jmp       exit_int_10h

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

  ; установки режима, проверяем вызвана ли



  ; функция выбора нового шрифта

char_gen:

  cmp      ah,11h

  je           gen_func

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

go_int_10h:

  pushf

  call        DWORD PTR cs:off_int_10h

  iret

gen_func:

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

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

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

  cmp      al,1

  je           text_rom_8_14

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

  ; с переустановкой контроллера ЭЛТ

  cmp      al,11h

  je           text_rom_8_14

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

  cmp      al,2

  je           text_rom_8_8

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

  ; с переустановкой контроллера ЭЛТ

  cmp      al,12h

  je           text_rom_8_8

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

  cmp      al,4

  je           text_rom_8_16

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

  ; с переустановкой контроллера ЭЛТ

  cmp      al,14h

  je           text_rom_8_16

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

  ; управление старому обработчику прерываний

  jmp       go_int_10h

text_rom_8_8:

  ; Выбираем шрифт 8х8 пикселов

  mov      bp,OFFSET fon8_ascii0

  mov      bh,8

  jmp       set_our_text_font

text_rom_8_14:

  ; Выбираем шрифт 8х14 пикселов

  mov      bp,OFFSET fon14_ascii0

  mov      bh,14

  jmp       set_our_text_font

text_rom_8_16:

  ; Выбираем шрифт 8х16 пикселов

  mov      bp,OFFSET fon16_ascii0

  mov      bh,16

set_our_text_font:

  ; Устанавливаем свой шрифт

  and       al,0f0h

  push     cs

  pop       es

  mov      cx,256

  xor        dx,dx

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

  pushf

  call        DWORD PTR cs:off_int_10h

  iret

resident:

END

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



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

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

fon8_ascii0     DB   000h,000h,000h,000h,000h,000h,000h,000h

fon8_ascii1     DB   07Eh,081h,0A5h,081h,0BDh,099h,081h,07Eh

fon8_ascii2     DB   07Eh,0FFh,0DBh,0FFh,0C3h,0E7h,0FFh,07Eh

fon8_ascii3     DB   06Ch,0FEh,0FEh,0FEh,07Ch,038h,010h,000h

fon8_ascii4     DB   010h,038h,07Ch,0FEh,07Ch,038h,010h,000h

fon8_ascii5     DB   038h,07Ch,038h,0FEh,0FEh,07Ch,038h,07Ch

fon8_ascii6     DB   010h,010h,038h,07Ch,0FEh,07Ch,038h,07Ch

fon8_ascii7     DB   000h,000h,018h,03Ch,03Ch,018h,000h,000h

fon8_ascii8     DB   0FFh,0FFh,0E7h,0C3h,0C3h,0E7h,0FFh,0FFh

fon8_ascii9     DB   000h,03Ch,066h,042h,042h,066h,03Ch,000h

fon8_ascii10    DB   0FFh,0C3h,099h,0BDh,0BDh,099h,0C3h,0FFh

fon8_ascii11    DB   00Fh,007h,00Fh,07Dh,0CCh,0CCh,0CCh,078h

fon8_ascii12    DB   03Ch,066h,066h,066h,03Ch,018h,07Eh,018h

fon8_ascii13    DB   03Fh,033h,03Fh,030h,030h,070h,0F0h,0E0h

fon8_ascii14    DB   07Fh,063h,07Fh,063h,063h,067h,0E6h,0C0h

fon8_ascii15    DB   099h,05Ah,03Ch,0E7h,0E7h,03Ch,05Ah,099h

fon8_ascii16    DB   080h,0E0h,0F8h,0FEh,0F8h,0E0h,080h,000h

fon8_ascii17    DB   002h,00Eh,03Eh,0FEh,03Eh,00Eh,002h,000h

fon8_ascii18    DB   018h,03Ch,07Eh,018h,018h,07Eh,03Ch,018h

fon8_ascii19    DB   066h,066h,066h,066h,066h,000h,066h,000h

fon8_ascii20    DB   07Fh,0DBh,0DBh,07Bh,01Bh,01Bh,01Bh,000h

fon8_ascii21    DB   03Eh,063h,038h,06Ch,06Ch,038h,0CCh,078h

fon8_ascii22    DB   000h,000h,000h,000h,07Eh,07Eh,07Eh,000h

fon8_ascii23    DB   018h,03Ch,07Eh,018h,07Eh,03Ch,018h,0FFh

fon8_ascii24    DB   018h,03Ch,07Eh,018h,018h,018h,018h,000h

fon8_ascii25    DB   018h,018h,018h,018h,07Eh,03Ch,018h,000h

fon8_ascii26    DB   000h,018h,00Ch,0FEh,00Ch,018h,000h,000h

fon8_ascii27    DB   000h,030h,060h,0FEh,060h,030h,000h,000h

fon8_ascii28    DB   000h,000h,0C0h,0C0h,0C0h,0FEh,000h,000h

fon8_ascii29    DB   000h,024h,066h,0FFh,066h,024h,000h,000h



fon8_ascii30    DB   000h,018h,03Ch,07Eh,0FFh,0FFh,000h,000h

fon8_ascii31    DB   000h,0FFh,0FFh,07Eh,03Ch,018h,000h,000h

fon8_ascii32    DB   000h,000h,000h,000h,000h,000h,000h,000h

fon8_ascii33    DB   030h,078h,078h,030h,030h,000h,030h,000h

fon8_ascii34    DB   06Ch,06Ch,06Ch,000h,000h,000h,000h,000h

fon8_ascii35    DB   06Ch,06Ch,0FEh,06Ch,0FEh,06Ch,06Ch,000h

fon8_ascii36    DB   030h,07Ch,0C0h,078h,00Ch,0F8h,030h,000h

fon8_ascii37    DB   000h,0C6h,0CCh,018h,030h,066h,0C6h,000h

fon8_ascii38    DB   038h,06Ch,038h,076h,0DCh,0CCh,076h,000h

fon8_ascii39    DB   060h,060h,0C0h,000h,000h,000h,000h,000h

fon8_ascii40    DB   018h,030h,060h,060h,060h,030h,018h,000h

fon8_ascii41    DB   060h,030h,018h,018h,018h,030h,060h,000h

fon8_ascii42    DB   000h,066h,03Ch,0FFh,03Ch,066h,000h,000h

fon8_ascii43    DB   000h,030h,030h,0FCh,030h,030h,000h,000h

fon8_ascii44    DB   000h,000h,000h,000h,000h,030h,030h,060h

fon8_ascii45    DB   000h,000h,000h,0FCh,000h,000h,000h,000h

fon8_ascii46    DB   000h,000h,000h,000h,000h,030h,030h,000h

fon8_ascii47    DB   006h,00Ch,018h,030h,060h,0C0h,080h,000h

fon8_ascii48    DB   07Ch,0C6h,0CEh,0DEh,0F6h,0E6h,07Ch,000h

fon8_ascii49    DB   030h,070h,030h,030h,030h,030h,0FCh,000h

fon8_ascii50    DB   078h,0CCh,00Ch,038h,060h,0CCh,0FCh,000h

fon8_ascii51    DB   078h,0CCh,00Ch,038h,00Ch,0CCh,078h,000h

fon8_ascii52    DB   01Ch,03Ch,06Ch,0CCh,0FEh,00Ch,01Eh,000h

fon8_ascii53    DB   0FCh,0C0h,0F8h,00Ch,00Ch,0CCh,078h,000h

fon8_ascii54    DB   038h,060h,0C0h,0F8h,0CCh,0CCh,078h,000h

fon8_ascii55    DB   0FCh,0CCh,00Ch,018h,030h,030h,030h,000h

fon8_ascii56    DB   078h,0CCh,0CCh,078h,0CCh,0CCh,078h,000h

fon8_ascii57    DB   078h,0CCh,0CCh,07Ch,00Ch,018h,070h,000h

fon8_ascii58    DB   000h,030h,030h,000h,000h,030h,030h,000h

fon8_ascii59    DB   000h,030h,030h,000h,000h,030h,030h,060h

fon8_ascii60    DB   018h,030h,060h,0C0h,060h,030h,018h,000h

fon8_ascii61    DB   000h,000h,0FCh,000h,000h,0FCh,000h,000h

fon8_ascii62    DB   060h,030h,018h,00Ch,018h,030h,060h,000h



fon8_ascii63    DB   078h,0CCh,00Ch,018h,030h,000h,030h,000h

fon8_ascii64    DB   07Ch,0C6h,0DEh,0DEh,0DEh,0C0h,078h,000h

fon8_ascii65    DB   030h,078h,0CCh,0CCh,0FCh,0CCh,0CCh,000h

fon8_ascii66    DB   0FCh,066h,066h,07Ch,066h,066h,0FCh,000h

fon8_ascii67    DB   03Ch,066h,0C0h,0C0h,0C0h,066h,03Ch,000h

fon8_ascii68    DB   0F8h,06Ch,066h,066h,066h,06Ch,0F8h,000h

fon8_ascii69    DB   0FEh,062h,068h,078h,068h,062h,0FEh,000h

fon8_ascii70    DB   0FEh,062h,068h,078h,068h,060h,0F0h,000h

fon8_ascii71    DB   03Ch,066h,0C0h,0C0h,0CEh,066h,03Eh,000h

fon8_ascii72    DB   0CCh,0CCh,0CCh,0FCh,0CCh,0CCh,0CCh,000h

fon8_ascii73    DB   078h,030h,030h,030h,030h,030h,078h,000h

fon8_ascii74    DB   01Eh,00Ch,00Ch,00Ch,0CCh,0CCh,078h,000h

fon8_ascii75    DB   0E6h,066h,06Ch,078h,06Ch,066h,0E6h,000h

fon8_ascii76    DB   0F0h,060h,060h,060h,062h,066h,0FEh,000h

fon8_ascii77    DB   0C6h,0EEh,0FEh,0FEh,0D6h,0C6h,0C6h,000h

fon8_ascii78    DB   0C6h,0E6h,0F6h,0DEh,0CEh,0C6h,0C6h,000h

fon8_ascii79    DB   038h,06Ch,0C6h,0C6h,0C6h,06Ch,038h,000h

fon8_ascii80    DB   0FCh,066h,066h,07Ch,060h,060h,0F0h,000h

fon8_ascii81    DB   078h,0CCh,0CCh,0CCh,0DCh,078h,01Ch,000h

fon8_ascii82    DB   0FCh,066h,066h,07Ch,06Ch,066h,0E6h,000h

fon8_ascii83    DB   078h,0CCh,0E0h,070h,01Ch,0CCh,078h,000h

fon8_ascii84    DB   0FCh,0B4h,030h,030h,030h,030h,078h,000h

fon8_ascii85    DB   0CCh,0CCh,0CCh,0CCh,0CCh,0CCh,0FCh,000h

fon8_ascii86    DB   0CCh,0CCh,0CCh,0CCh,0CCh,078h,030h,000h

fon8_ascii87    DB   0C6h,0C6h,0C6h,0D6h,0FEh,0EEh,0C6h,000h

fon8_ascii88    DB   0C6h,044h,06Ch,038h,038h,06Ch,0C6h,000h

fon8_ascii89    DB   0CCh,0CCh,0CCh,078h,030h,030h,078h,000h

fon8_ascii90    DB   0FEh,0C6h,08Ch,018h,032h,066h,0FEh,000h

fon8_ascii91    DB   078h,060h,060h,060h,060h,060h,078h,000h

fon8_ascii92    DB   0C0h,060h,030h,018h,00Ch,006h,002h,000h

fon8_ascii93    DB   078h,018h,018h,018h,018h,018h,078h,000h

fon8_ascii94    DB   010h,038h,06Ch,0C6h,000h,000h,000h,000h

fon8_ascii95    DB   000h,000h,000h,000h,000h,000h,000h,0FFh



fon8_ascii96    DB   030h,030h,018h,000h,000h,000h,000h,000h

fon8_ascii97    DB   000h,000h,078h,00Ch,07Ch,0CCh,07Ch,000h

fon8_ascii98    DB   060h,060h,060h,07Ch,066h,066h,07Ch,000h

fon8_ascii99    DB   000h,000h,078h,0CCh,0C0h,0CCh,078h,000h

fon8_ascii100   DB   00Ch,00Ch,00Ch,07Ch,0CCh,0CCh,07Ch,000h

fon8_ascii101   DB   000h,000h,078h,0CCh,0FCh,0C0h,078h,000h

fon8_ascii102   DB   038h,06Ch,060h,0F0h,060h,060h,0F0h,000h

fon8_ascii103   DB   000h,000h,07Ch,0CCh,0CCh,07Ch,00Ch,0F8h

fon8_ascii104   DB   060h,060h,07Ch,066h,066h,066h,066h,000h

fon8_ascii105   DB   030h,000h,070h,030h,030h,030h,078h,000h

fon8_ascii106   DB   00Ch,000h,00Ch,00Ch,00Ch,00Ch,06Ch,038h

fon8_ascii107   DB   060h,060h,066h,06Ch,078h,06Ch,066h,000h

fon8_ascii108   DB   070h,030h,030h,030h,030h,030h,078h,000h

fon8_ascii109   DB   000h,000h,0CCh,0FEh,0FEh,0D6h,0C6h,000h

fon8_ascii110   DB   000h,000h,0F8h,0CCh,0CCh,0CCh,0CCh,000h

fon8_ascii111   DB   000h,000h,078h,0CCh,0CCh,0CCh,078h,000h

fon8_ascii112   DB   000h,000h,07Ch,066h,066h,07Ch,060h,060h

fon8_ascii113   DB   000h,000h,07Ch,0CCh,0CCh,07Ch,00Ch,00Ch

fon8_ascii114   DB   000h,000h,0DCh,076h,066h,060h,0F0h,000h

fon8_ascii115   DB   000h,000h,07Ch,0C0h,078h,00Ch,0F8h,000h

fon8_ascii116   DB   010h,030h,07Ch,030h,030h,034h,018h,000h

fon8_ascii117   DB   000h,000h,0CCh,0CCh,0CCh,0CCh,07Ch,000h

fon8_ascii118   DB   000h,000h,0CCh,0CCh,0CCh,078h,030h,000h

fon8_ascii119   DB   000h,000h,0C6h,0D6h,0FEh,0FEh,06Ch,000h

fon8_ascii120   DB   000h,000h,0C6h,06Ch,038h,06Ch,0C6h,000h

fon8_ascii121   DB   000h,000h,0CCh,0CCh,0CCh,07Ch,00Ch,0F8h

fon8_ascii122   DB   000h,000h,0FCh,098h,030h,064h,0FCh,000h

fon8_ascii123   DB   01Ch,030h,030h,0E0h,030h,030h,01Ch,000h

fon8_ascii124   DB   018h,018h,018h,000h,018h,018h,018h,000h

fon8_ascii125   DB   0E0h,030h,030h,01Ch,030h,030h,0E0h,000h

fon8_ascii126   DB   076h,0DCh,000h,000h,000h,000h,000h,000h

fon8_ascii127   DB   000h,010h,038h,06Ch,0C6h,0C6h,0FEh,000h

fon8_ascii128   DB   01Eh,036h,066h,066h,07Eh,066h,066h,000h



fon8_ascii129   DB   07Ch,060h,060h,07Ch,066h,066h,07Ch,000h

fon8_ascii130   DB   07Ch,066h,066h,07Ch,066h,066h,07Ch,000h

fon8_ascii131   DB   07Eh,060h,060h,060h,060h,060h,060h,000h

fon8_ascii132   DB   038h,06Ch,06Ch,06Ch,06Ch,06Ch,0FEh,0C6h

fon8_ascii133   DB   07Eh,060h,060h,07Ch,060h,060h,07Eh,000h

fon8_ascii134   DB   0DBh,0DBh,07Eh,03Ch,07Eh,0DBh,0DBh,000h

fon8_ascii135   DB   03Ch,066h,006h,01Ch,006h,066h,03Ch,000h

fon8_ascii136   DB   066h,066h,06Eh,07Eh,076h,066h,066h,000h

fon8_ascii137   DB   03Ch,066h,06Eh,07Eh,076h,066h,066h,000h

fon8_ascii138   DB   066h,06Ch,078h,070h,078h,06Ch,066h,000h

fon8_ascii139   DB   01Eh,036h,066h,066h,066h,066h,066h,000h

fon8_ascii140   DB   0C6h,0EEh,0FEh,0FEh,0D6h,0C6h,0C6h,000h

fon8_ascii141   DB   066h,066h,066h,07Eh,066h,066h,066h,000h

fon8_ascii142   DB   03Ch,066h,066h,066h,066h,066h,03Ch,000h

fon8_ascii143   DB   07Eh,066h,066h,066h,066h,066h,066h,000h

fon8_ascii144   DB   07Ch,066h,066h,066h,07Ch,060h,060h,000h

fon8_ascii145   DB   03Ch,066h,060h,060h,060h,066h,03Ch,000h

fon8_ascii146   DB   07Eh,018h,018h,018h,018h,018h,018h,000h

fon8_ascii147   DB   066h,066h,066h,03Eh,006h,066h,03Ch,000h

fon8_ascii148   DB   07Eh,0DBh,0DBh,0DBh,07Eh,018h,018h,000h

fon8_ascii149   DB   066h,066h,03Ch,018h,03Ch,066h,066h,000h

fon8_ascii150   DB   066h,066h,066h,066h,066h,066h,07Fh,003h

fon8_ascii151   DB   066h,066h,066h,03Eh,006h,006h,006h,000h

fon8_ascii152   DB   0DBh,0DBh,0DBh,0DBh,0DBh,0DBh,0FFh,000h

fon8_ascii153   DB   0DBh,0DBh,0DBh,0DBh,0DBh,0DBh,0FFh,003h

fon8_ascii154   DB   0E0h,060h,060h,07Ch,066h,066h,07Ch,000h

fon8_ascii155   DB   0C6h,0C6h,0C6h,0F6h,0DEh,0DEh,0F6h,000h

fon8_ascii156   DB   060h,060h,060h,07Ch,066h,066h,07Ch,000h

fon8_ascii157   DB   078h,08Ch,006h,03Eh,006h,08Ch,078h,000h

fon8_ascii158   DB   0CEh,0DBh,0DBh,0FBh,0DBh,0DBh,0CEh,000h

fon8_ascii159   DB   03Eh,066h,066h,066h,03Eh,036h,066h,000h

fon8_ascii160   DB   000h,000h,078h,00Ch,07Ch,0CCh,076h,000h

fon8_ascii161   DB   000h,03Ch,060h,03Ch,066h,066h,03Ch,000h



fon8_ascii162   DB   000h,000h,07Ch,066h,07Ch,066h,07Ch,000h

fon8_ascii163   DB   000h,000h,07Eh,060h,060h,060h,060h,000h

fon8_ascii164   DB   000h,000h,03Ch,06Ch,06Ch,06Ch,0FEh,0C6h

fon8_ascii165   DB   000h,000h,03Ch,066h,07Eh,060h,03Ch,000h

fon8_ascii166   DB   000h,000h,0DBh,07Eh,03Ch,07Eh,0DBh,000h

fon8_ascii167   DB   000h,000h,03Ch,066h,00Ch,066h,03Ch,000h

fon8_ascii168   DB   000h,000h,066h,06Eh,07Eh,076h,066h,000h

fon8_ascii169   DB   000h,018h,066h,06Eh,07Eh,076h,066h,000h

fon8_ascii170   DB   000h,000h,066h,06Ch,078h,06Ch,066h,000h

fon8_ascii171   DB   000h,000h,01Eh,036h,066h,066h,066h,000h

fon8_ascii172   DB   000h,000h,0C6h,0FEh,0FEh,0D6h,0C6h,000h

fon8_ascii173   DB   000h,000h,066h,066h,07Eh,066h,066h,000h

fon8_ascii174   DB   000h,000h,03Ch,066h,066h,066h,03Ch,000h

fon8_ascii175   DB   000h,000h,07Eh,066h,066h,066h,066h,000h

fon8_ascii176   DB   011h,044h,011h,044h,011h,044h,011h,044h

fon8_ascii177   DB   055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh

fon8_ascii178   DB   0DDh,077h,0DDh,077h,0DDh,077h,0DDh,077h

fon8_ascii179   DB   018h,018h,018h,018h,018h,018h,018h,018h

fon8_ascii180   DB   018h,018h,018h,0F8h,018h,018h,018h,018h

fon8_ascii181   DB   018h,0F8h,018h,0F8h,018h,018h,018h,018h

fon8_ascii182   DB   036h,036h,036h,0F6h,036h,036h,036h,036h

fon8_ascii183   DB   000h,000h,000h,0FEh,036h,036h,036h,036h

fon8_ascii184   DB   000h,0F8h,018h,0F8h,018h,018h,018h,018h

fon8_ascii185   DB   036h,0F6h,006h,0F6h,036h,036h,036h,036h

fon8_ascii186   DB   036h,036h,036h,036h,036h,036h,036h,036h

fon8_ascii187   DB   000h,0FEh,006h,0F6h,036h,036h,036h,036h

fon8_ascii188   DB   036h,0F6h,006h,0FEh,000h,000h,000h,000h

fon8_ascii189   DB   036h,036h,036h,0FEh,000h,000h,000h,000h

fon8_ascii190   DB   018h,0F8h,018h,0F8h,000h,000h,000h,000h

fon8_ascii191   DB   000h,000h,000h,0F8h,018h,018h,018h,018h

fon8_ascii192   DB   018h,018h,018h,01Fh,000h,000h,000h,000h

fon8_ascii193   DB   018h,018h,018h,0FFh,000h,000h,000h,000h

fon8_ascii194   DB   000h,000h,000h,0FFh,018h,018h,018h,018h



fon8_ascii195   DB   018h,018h,018h,01Fh,018h,018h,018h,018h

fon8_ascii196   DB   000h,000h,000h,0FFh,000h,000h,000h,000h

fon8_ascii197   DB   018h,018h,018h,0FFh,018h,018h,018h,018h

fon8_ascii198   DB   018h,01Fh,018h,01Fh,018h,018h,018h,018h

fon8_ascii199   DB   036h,036h,036h,037h,036h,036h,036h,036h

fon8_ascii200   DB   036h,037h,030h,03Fh,000h,000h,000h,000h

fon8_ascii201   DB   000h,03Fh,030h,037h,036h,036h,036h,036h

fon8_ascii202   DB   036h,0F7h,000h,0FFh,000h,000h,000h,000h

fon8_ascii203   DB   000h,0FFh,000h,0F7h,036h,036h,036h,036h

fon8_ascii204   DB   036h,037h,030h,037h,036h,036h,036h,036h

fon8_ascii205   DB   000h,0FFh,000h,0FFh,000h,000h,000h,000h

fon8_ascii206   DB   036h,0F7h,000h,0F7h,036h,036h,036h,036h

fon8_ascii207   DB   018h,0FFh,000h,0FFh,000h,000h,000h,000h

fon8_ascii208   DB   036h,036h,036h,0FFh,000h,000h,000h,000h

fon8_ascii209   DB   000h,0FFh,000h,0FFh,018h,018h,018h,018h

fon8_ascii210   DB   000h,000h,000h,0FFh,036h,036h,036h,036h

fon8_ascii211   DB   036h,036h,036h,03Fh,000h,000h,000h,000h

fon8_ascii212   DB   018h,01Fh,018h,01Fh,000h,000h,000h,000h

fon8_ascii213   DB   000h,01Fh,018h,01Fh,018h,018h,018h,018h

fon8_ascii214   DB   000h,000h,000h,03Fh,036h,036h,036h,036h

fon8_ascii215   DB   036h,036h,036h,0FFh,036h,036h,036h,036h

fon8_ascii216   DB   018h,0FFh,018h,0FFh,018h,018h,018h,018h

fon8_ascii217   DB   018h,018h,018h,0F8h,000h,000h,000h,000h

fon8_ascii218   DB   000h,000h,000h,01Fh,018h,018h,018h,018h

fon8_ascii219   DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh

fon8_ascii220   DB   000h,000h,000h,0FFh,0FFh,0FFh,0FFh,0FFh

fon8_ascii221   DB   0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h

fon8_ascii222   DB   00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh

fon8_ascii223   DB   0FFh,0FFh,0FFh,000h,000h,000h,000h,000h

fon8_ascii224   DB   000h,000h,07Ch,066h,066h,07Ch,060h,000h

fon8_ascii225   DB   000h,000h,03Ch,066h,060h,066h,03Ch,000h

fon8_ascii226   DB   000h,000h,07Eh,018h,018h,018h,018h,000h

fon8_ascii227   DB   000h,000h,066h,066h,03Eh,006h,03Ch,000h



fon8_ascii228   DB   000h,000h,07Eh,0DBh,0DBh,07Eh,018h,000h

fon8_ascii229   DB   000h,000h,066h,03Ch,018h,03Ch,066h,000h

fon8_ascii230   DB   000h,000h,066h,066h,066h,066h,07Fh,003h

fon8_ascii231   DB   000h,000h,066h,066h,03Eh,006h,006h,000h

fon8_ascii232   DB   000h,000h,0DBh,0DBh,0DBh,0DBh,0FFh,000h

fon8_ascii233   DB   000h,000h,0DBh,0DBh,0DBh,0DBh,0FFh,003h

fon8_ascii234   DB   000h,000h,0E0h,060h,07Ch,066h,07Ch,000h

fon8_ascii235   DB   000h,000h,0C6h,0C6h,0F6h,0DEh,0F6h,000h

fon8_ascii236   DB   000h,000h,060h,060h,07Ch,066h,07Ch,000h

fon8_ascii237   DB   000h,000h,07Ch,006h,03Eh,006h,07Ch,000h

fon8_ascii238   DB   000h,000h,0CEh,0DBh,0FBh,0DBh,0CEh,000h

fon8_ascii239   DB   000h,000h,03Eh,066h,03Eh,036h,066h,000h

fon8_ascii240   DB   066h,000h,07Eh,060h,07Ch,060h,07Eh,000h

fon8_ascii241   DB   024h,000h,03Ch,066h,07Eh,060h,03Ch,000h

fon8_ascii242   DB   000h,030h,018h,00Ch,006h,00Ch,018h,030h

fon8_ascii243   DB   000h,00Ch,018h,030h,060h,030h,018h,00Ch

fon8_ascii244   DB   00Eh,01Bh,01Bh,018h,018h,018h,018h,018h

fon8_ascii245   DB   018h,018h,018h,018h,018h,0D8h,0D8h,070h

fon8_ascii246   DB   000h,018h,018h,000h,07Eh,000h,018h,018h

fon8_ascii247   DB   000h,076h,0DCh,000h,076h,0DCh,000h,000h

fon8_ascii248   DB   000h,038h,06Ch,06Ch,038h,000h,000h,000h

fon8_ascii249   DB   000h,000h,000h,000h,018h,000h,000h,000h

fon8_ascii250   DB   000h,000h,000h,038h,038h,000h,000h,000h

fon8_ascii251   DB   0F8h,006h,073h,079h,023h,0FEh,0A0h,0A0h

fon8_ascii252   DB   006h,008h,0CBh,06Bh,068h,05Bh,058h,08Ch

fon8_ascii253   DB   030h,048h,010h,020h,078h,000h,000h,000h

fon8_ascii254   DB   0FFh,081h,0BDh,0A5h,0A5h,0BDh,081h,0FFh

fon8_ascii255   DB   000h,000h,000h,000h,000h,042h,07Eh,000h

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

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

fon14_ascii0    DB   000h,000h,000h,000h,000h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h



fon14_ascii1    DB   000h,000h,07Eh,081h,0A5h,081h,081h,0BDh

                DB   099h,081h,07Eh,000h,000h,000h

fon14_ascii2    DB   000h,000h,07Eh,0FFh,0DBh,0FFh,0FFh,0C3h

                DB   0E7h,0FFh,07Eh,000h,000h,000h

fon14_ascii3    DB   000h,000h,000h,06Ch,0FEh,0FEh,0FEh,0FEh

                DB   07Ch,038h,010h,000h,000h,000h

fon14_ascii4    DB   000h,000h,000h,010h,038h,07Ch,0FEh,07Ch

                DB   038h,010h,000h,000h,000h,000h

fon14_ascii5    DB   000h,000h,018h,03Ch,03Ch,0E7h,0E7h,0E7h

                DB   018h,018h,03Ch,000h,000h,000h

fon14_ascii6    DB   000h,000h,018h,03Ch,07Eh,0FFh,0FFh,07Eh

                DB   018h,018h,03Ch,000h,000h,000h

fon14_ascii7    DB   000h,000h,000h,000h,000h,018h,03Ch,03Ch

                DB   018h,000h,000h,000h,000h,000h

fon14_ascii8    DB   0FFh,0FFh,0FFh,0FFh,0FFh,0E7h,0C3h,0C3h

                DB   0E7h,0FFh,0FFh,0FFh,0FFh,0FFh

fon14_ascii9    DB   000h,000h,000h,000h,03Ch,066h,042h,042h

                DB   066h,03Ch,000h,000h,000h,000h

fon14_ascii10   DB   0FFh,0FFh,0FFh,FFh,0C3h,099h,0BDh,0BDh

                DB   099h,0C3h,0FFh,0FFh,0FFh,0FFh

fon14_ascii11   DB   000h,000h,01Eh,0Eh,01Ah,032h,078h,0CCh

                DB   0CCh,0CCh,078h,000h,000h,000h

fon14_ascii12   DB   000h,000h,03Ch,066h,066h,066h,03Ch,018h

                DB   07Eh,018h,018h,000h,000h,000h

fon14_ascii13   DB   000h,000h,03Fh,33h,03Fh,030h,030h,030h

                DB   070h,0F0h,0E0h,000h,000h,000h

fon14_ascii14   DB   000h,000h,07Fh,63h,07Fh,063h,063h,063h

                DB   067h,0E7h,0E6h,0C0h,000h,000h

fon14_ascii15   DB   000h,000h,018h,18h,0DBh,03Ch,0E7h,03Ch

                DB   0DBh,018h,018h,000h,000h,000h

fon14_ascii16   DB   000h,040h,060h,70h,078h,07Ch,07Eh,07Ch

                DB   078h,070h,060h,040h,000h,000h

fon14_ascii17   DB   000h,002h,006h,0Eh,01Eh,03Eh,07Eh,03Eh

                DB   01Eh,00Eh,006h,002h,000h,000h

fon14_ascii18   DB   000h,000h,018h,3Ch,07Eh,018h,018h,018h

                DB   07Eh,03Ch,018h,000h,000h,000h



fon14_ascii19   DB   000h,000h,066h,66h,066h,066h,066h,066h

                DB   000h,066h,066h,000h,000h,000h

fon14_ascii20   DB   000h,000h,07Fh,DBh,0DBh,0DBh,07Bh,01Bh

                DB   01Bh,01Bh,01Bh,000h,000h,000h

fon14_ascii21   DB   000h,07Ch,0C6h,60h,038h,06Ch,0C6h,0C6h

                DB   06Ch,038h,00Ch,0C6h,07Ch,000h

fon14_ascii22   DB   000h,000h,000h,00h,000h,000h,000h,0FEh

                DB   0FEh,0FEh,0FEh,000h,000h,000h

fon14_ascii23   DB   000h,000h,018h,3Ch,07Eh,018h,018h,07Eh

                DB   03Ch,018h,07Eh,000h,000h,000h

fon14_ascii24   DB   000h,000h,018h,3Ch,07Eh,018h,018h,018h

                DB   018h,018h,018h,000h,000h,000h

fon14_ascii25   DB   000h,000h,018h,18h,018h,018h,018h,018h

                DB   07Eh,03Ch,018h,000h,000h,000h

fon14_ascii26   DB   000h,000h,000h,00h,000h,018h,00Ch,0FEh

                DB   00Ch,018h,000h,000h,000h,000h

fon14_ascii27   DB   000h,000h,000h,00h,000h,018h,030h,07Fh

                DB   030h,018h,000h,000h,000h,000h

fon14_ascii28   DB   000h,000h,000h,00h,000h,000h,0C0h,0C0h

                DB   0C0h,0FEh,000h,000h,000h,000h

fon14_ascii29   DB   000h,000h,000h,00h,000h,028h,06Ch,0FEh

                DB   06Ch,028h,000h,000h,000h,000h

fon14_ascii30   DB   000h,000h,000h,00h,010h,038h,038h,07Ch

                DB   07Ch,0FEh,0FEh,000h,000h,000h

fon14_ascii31   DB   000h,000h,000h,00h,0FEh,0FEh,07Ch,07Ch

                DB   038h,038h,010h,000h,000h,000h

fon14_ascii32   DB   000h,000h,000h,00h,000h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii33   DB   000h,000h,018h,3Ch,03Ch,018h,018h,018h

                DB   000h,018h,018h,000h,000h,000h

fon14_ascii34   DB   000h,000h,066h,66h,066h,024h,000h,000h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii35   DB   000h,000h,06Ch,6Ch,0FEh,06Ch,06Ch,06Ch

                DB   0FEh,06Ch,06Ch,000h,000h,000h

fon14_ascii36   DB   018h,018h,07Ch,C6h,0C2h,0C0h,07Ch,006h

                DB   086h,0C6h,07Ch,018h,018h,000h



fon14_ascii37   DB   000h,000h,000h,C2h,0C6h,00Ch,018h,030h

                DB   060h,0C6h,086h,000h,000h,000h

fon14_ascii38   DB   000h,000h,038h,6Ch,06Ch,038h,076h,0DCh

                DB   0CCh,0CCh,076h,000h,000h,000h

fon14_ascii39   DB   000h,000h,030h,30h,030h,060h,000h,000h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii40   DB   000h,000h,00Ch,18h,030h,030h,030h,030h

                DB   030h,018h,00Ch,000h,000h,000h

fon14_ascii41   DB   000h,000h,030h,18h,00Ch,00Ch,00Ch,00Ch

                DB   00Ch,018h,030h,00h,000h,000h

fon14_ascii42   DB   000h,000h,000h,00h,066h,03Ch,0FFh,03Ch

                DB   066h,000h,000h,000h,000h,000h

fon14_ascii43   DB   000h,000h,000h,00h,018h,018h,07Eh,018h

                DB   018h,000h,000h,000h,000h,000h

fon14_ascii44   DB   000h,000h,000h,00h,000h,000h,000h,000h

                DB   018h,018h,018h,030h,000h,000h

fon14_ascii45   DB   000h,000h,000h,00h,000h,000h,0FEh,000h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii46   DB   000h,000h,000h,00h,000h,000h,000h,000h

                DB   000h,018h,018h,000h,000h,000h

fon14_ascii47   DB   000h,000h,000h,02h,006h,00Ch,018h,030h

                DB   060h,0C0h,080h,000h,000h,000h

fon14_ascii48   DB   000h,000h,07Ch,C6h,0CEh,0DEh,0F6h,0E6h

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii49   DB   000h,000h,018h,38h,078h,018h,018h,018h

                DB   018h,018h,03Ch,000h,000h,000h

fon14_ascii50   DB   000h,000h,07Ch,C6h,0C6h,006h,01Ch,030h

                DB   060h,0C6h,0FEh,000h,000h,000h

fon14_ascii51   DB   000h,000h,07Ch,C6h,0C6h,006h,01Ch,006h

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii52   DB   000h,000h,00Ch,1Ch,03Ch,06Ch,0CCh,0CCh

                DB   0FEh,00Ch,00Ch,000h,000h,000h

fon14_ascii53   DB   000h,000h,0FEh,C0h,0C0h,0FCh,006h,006h

                DB   006h,0C6h,07Ch,000h,000h,000h

fon14_ascii54   DB   000h,000h,07Ch,C6h,0C0h,0C0h,0FCh,0C6h

                DB   0C6h,0C6h,07Ch,000h,000h,000h



fon14_ascii55   DB   000h,000h,0FEh,C6h,086h,004h,00Ch,018h

                DB   018h,030h,030h,000h,000h,000h

fon14_ascii56   DB   000h,000h,07Ch,C6h,0C6h,0C6h,07Ch,0C6h

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii57   DB   000h,000h,07Ch,C6h,0C6h,0C6h,07Eh,006h

                DB   006h,0C6h,07Ch,000h,000h,000h

fon14_ascii58   DB   000h,000h,000h,00h,000h,018h,018h,000h

                DB   000h,018h,018h,000h,000h,000h

fon14_ascii59   DB   000h,000h,000h,00h,000h,018h,018h,000h

                DB   000h,018h,018h,030h,000h,000h

fon14_ascii60   DB   000h,000h,000h,0Ch,018h,030h,060h,030h

                DB   018h,00Ch,000h,000h,000h,000h

fon14_ascii61   DB   000h,000h,000h,00h,000h,0FEh,000h,0FEh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii62   DB   000h,000h,000h,30h,018h,00Ch,006h,00Ch

                DB   018h,030h,000h,000h,000h,000h

fon14_ascii63   DB   000h,000h,07Ch,C6h,0C6h,006h,00Ch,018h

                DB   000h,018h,018h,000h,000h,000h

fon14_ascii64   DB   000h,000h,000h,7Ch,0C6h,0C6h,0DEh,0DEh

                DB   0DEh,0DCh,0C0h,07Ch,000h,000h

fon14_ascii65   DB   000h,000h,038h,6Ch,0C6h,0C6h,0FEh,0C6h

                DB   0C6h,0C6h,0C6h,00h,000h,000h

fon14_ascii66   DB   000h,000h,0FCh,66h,066h,066h,07Ch,066h

                DB   066h,066h,0FCh,000h,000h,000h

fon14_ascii67   DB   000h,000h,07Ch,C6h,0C6h,0C0h,0C0h,0C0h

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii68   DB   000h,000h,0FCh,66h,066h,066h,066h,066h

                DB   066h,066h,0FCh,000h,000h,000h

fon14_ascii69   DB   000h,000h,0FEh,66h,062h,068h,078h,068h

                DB   062h,066h,0FEh,000h,000h,000h

fon14_ascii70   DB   000h,000h,0FEh,66h,062h,068h,078h,068h

                DB   060h,060h,0F0h,000h,000h,000h

fon14_ascii71   DB   000h,000h,07Ch,C6h,0C6h,0C0h,0C0h,0CEh

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii72   DB   000h,000h,0C6h,C6h,0C6h,0C6h,0FEh,0C6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h



fon14_ascii73   DB   000h,000h,03Ch,18h,018h,018h,018h,018h

                DB   018h,018h,03Ch,000h,000h,000h

fon14_ascii74   DB   000h,000h,01Eh,0Ch,00Ch,00Ch,00Ch,00Ch

                DB   0CCh,0CCh,078h,000h,000h,000h

fon14_ascii75   DB   000h,000h,0C6h,CCh,0D8h,0F0h,0E0h,0F0h

                DB   0D8h,0CCh,0C6h,000h,000h,000h

fon14_ascii76   DB   000h,000h,0F0h,60h,060h,060h,060h,060h

                DB   062h,066h,0FEh,000h,000h,000h

fon14_ascii77   DB   000h,000h,0C6h,EEh,0FEh,0D6h,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii78   DB   000h,000h,0C6h,E6h,0E6h,0F6h,0DEh,0CEh

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii79   DB   000h,000h,07Ch,C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii80   DB   000h,000h,0FCh,66h,066h,066h,07Ch,060h

                DB   060h,060h,0F0h,000h,000h,000h

fon14_ascii81   DB   000h,000h,07Ch,C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,07Ch,006h,000h,000h

fon14_ascii82   DB   000h,000h,0FCh,66h,066h,066h,07Ch,06Ch

                DB   06Ch,066h,0E6h,000h,000h,000h

fon14_ascii83   DB   000h,000h,07Ch,C6h,0C6h,060h,038h,00Ch

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii84   DB   000h,000h,07Eh,5Ah,018h,018h,018h,018h

                DB   018h,018h,03Ch,000h,000h,000h

fon14_ascii85   DB   000h,000h,0C6h,C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii86   DB   000h,000h,0C6h,C6h,0C6h,0C6h,0C6h,06Ch

                DB   06Ch,038h,010h,000h,000h,000h

fon14_ascii87   DB   000h,000h,0C6h,C6h,0C6h,0C6h,0C6h,0D6h

                DB   0FEh,0EEh,0C6h,000h,000h,000h

fon14_ascii88   DB   000h,000h,0C6h,C6h,06Ch,07Ch,038h,07Ch

                DB   06Ch,0C6h,0C6h,000h,000h,000h

fon14_ascii89   DB   000h,000h,066h,66h,066h,066h,03Ch,018h

                DB   018h,018h,03Ch,000h,000h,000h

fon14_ascii90   DB   000h,000h,0FEh,C6h,086h,00Ch,018h,030h

                DB   062h,0C6h,0FEh,000h,000h,000h



fon14_ascii91   DB   000h,000h,03Ch,30h,030h,030h,030h,030h

                DB   030h,030h,03Ch,000h,000h,000h

fon14_ascii92   DB   000h,000h,080h,C0h,060h,030h,018h,00Ch

                DB   006h,002h,000h,000h,000h,000h

fon14_ascii93   DB   000h,000h,078h,18h,018h,018h,018h,018h

                DB   018h,018h,078h,000h,000h,000h

fon14_ascii94   DB   000h,018h,03Ch,66h,000h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii95   DB   000h,000h,000h,00h,000h,000h,000h,000h

                DB   000h,000h,000h,0FFh,000h,000h

fon14_ascii96   DB   000h,000h,018h,18h,018h,00Ch,000h,000h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii97   DB   000h,000h,000h,00h,000h,07Ch,006h,07Eh

                DB   0C6h,0C6h,07Eh,000h,000h,000h

fon14_ascii98   DB   000h,000h,0C0h,C0h,0C0h,0FCh,0C6h,0C6h

                DB   0C6h,0C6h,0FCh,000h,000h,000h

fon14_ascii99   DB   000h,000h,000h,00h,000h,07Ch,0C6h,0C0h

                DB   0C0h,0C6h,07Ch,000h,000h,000h

fon14_ascii100  DB   000h,000h,006h,06h,006h,07Eh,0C6h,0C6h

                DB   0C6h,0C6h,07Eh,000h,000h,000h

fon14_ascii101  DB   000h,000h,000h,00h,000h,07Ch,0C6h,0FEh

                DB   0C0h,0C6h,07Ch,000h,000h,000h

fon14_ascii102  DB   000h,000h,01Ch,36h,030h,030h,078h,030h

                DB   030h,030h,078h,000h,000h,000h

fon14_ascii103  DB   000h,000h,000h,00h,000h,07Eh,0C6h,0C6h

                DB   0C6h,07Eh,006h,0C6h,07Ch,000h

fon14_ascii104  DB   000h,000h,0C0h,C0h,0C0h,0FCh,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii105  DB   000h,000h,018h,18h,000h,038h,018h,018h

                DB   018h,018h,03Ch,000h,000h,000h

fon14_ascii106  DB   000h,000h,018h,18h,000h,038h,018h,018h

                DB   018h,018h,018h,0D8h,070h,000h

fon14_ascii107  DB   000h,000h,0C0h,C0h,0C0h,0CCh,0D8h,0F0h

                DB   0F8h,0CCh,0C6h,000h,000h,000h

fon14_ascii108  DB   000h,000h,038h,18h,018h,018h,018h,018h

                DB   018h,018h,03Ch,000h,000h,000h



fon14_ascii109  DB   000h,000h,000h,00h,000h,06Ch,0FEh,0D6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii110  DB   000h,000h,000h,00h,000h,0FCh,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii111  DB   000h,000h,000h,00h,000h,07Ch,0C6h,0C6h

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii112  DB   000h,000h,000h,00h,000h,0FCh,0C6h,0C6h

                DB   0C6h,0FCh,0C0h,0C0h,0C0h,000h

fon14_ascii113  DB   000h,000h,000h,00h,000h,07Eh,0C6h,0C6h

                DB   0C6h,07Eh,006h,006h,006h,000h

fon14_ascii114  DB   000h,000h,000h,00h,000h,0DEh,076h,060h

                DB   060h,060h,0F0h,000h,000h,000h

fon14_ascii115  DB   000h,000h,000h,00h,000h,07Ch,0C6h,070h

                DB   01Ch,0C6h,07Ch,000h,000h,000h

fon14_ascii116  DB   000h,000h,018h,18h,018h,07Eh,018h,018h

                DB   018h,018h,01Ch,000h,000h,000h

fon14_ascii117  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,07Eh,000h,000h,000h

fon14_ascii118  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0C6h

                DB   06Ch,038h,010h,000h,000h,000h

fon14_ascii119  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0D6h

                DB   0FEh,0EEh,0C6h,000h,000h,000h

fon14_ascii120  DB   000h,000h,000h,00h,000h,0C6h,06Ch,038h

                DB   038h,06Ch,0C6h,000h,000h,000h

fon14_ascii121  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0C6h

                DB   06Ch,038h,030h,060h,0C0h,000h

fon14_ascii122  DB   000h,000h,000h,00h,000h,0FEh,0CCh,018h

                DB   030h,066h,0FEh,000h,000h,000h

fon14_ascii123  DB   000h,000h,00Eh,18h,018h,018h,070h,018h

                DB   018h,018h,018h,00Eh,000h,000h

fon14_ascii124  DB   000h,000h,018h,18h,018h,018h,000h,018h

                DB   018h,018h,018h,018h,000h,000h

fon14_ascii125  DB   000h,000h,070h,18h,018h,018h,00Eh,018h

                DB   018h,018h,018h,070h,000h,000h

fon14_ascii126  DB   000h,000h,062h,9Ch,000h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h



fon14_ascii127  DB   000h,000h,000h,00h,000h,010h,038h,06Ch

                DB   0C6h,0FEh,000h,000h,000h,000h

fon14_ascii128  DB   000h,000h,01Eh,36h,066h,0C6h,0C6h,0FEh

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii129  DB   000h,000h,0FEh,62h,060h,07Ch,066h,066h

                DB   066h,066h,0FCh,000h,000h,000h

fon14_ascii130  DB   000h,000h,0FCh,66h,066h,066h,07Ch,066h

                DB   066h,066h,0FCh,000h,000h,000h

fon14_ascii131  DB   000h,000h,0FEh,62h,062h,060h,060h,060h

                DB   060h,060h,0F0h,000h,000h,000h

fon14_ascii132  DB   000h,000h,01Eh,36h,066h,066h,066h,066h

                DB   066h,066h,0FFh,0C3h,081h,000h

fon14_ascii133  DB   000h,000h,0FEh,66h,062h,068h,078h,068h

                DB   062h,066h,0FEh,000h,000h,000h

fon14_ascii134  DB   000h,000h,0D6h,D6h,054h,054h,07Ch,054h

                DB   0D6h,0D6h,0D6h,000h,000h,000h

fon14_ascii135  DB   000h,000h,07Ch,C6h,006h,006h,03Ch,006h

                DB   006h,0C6h,07Ch,000h,000h,000h

fon14_ascii136  DB   000h,000h,0C6h,C6h,0CEh,0DEh,0F6h,0E6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii137  DB   038h,038h,0C6h,C6h,0CEh,0DEh,0F6h,0E6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii138  DB   000h,000h,0E6h,66h,06Ch,06Ch,078h,06Ch

                DB   06Ch,066h,0E6h,000h,000h,000h

fon14_ascii139  DB   000h,000h,01Eh,36h,066h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii140  DB   000h,000h,0C6h,EEh,0FEh,0FEh,0D6h,0C6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii141  DB   000h,000h,0C6h,C6h,0C6h,0C6h,0FEh,0C6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii142  DB   000h,000h,07Ch,C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii143  DB   000h,000h,0FEh,C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii144  DB   000h,000h,0FCh,66h,066h,066h,07Ch,060h

                DB   060h,060h,0F0h,000h,000h,000h



fon14_ascii145  DB   000h,000h,03Ch,66h,0C2h,0C0h,0C0h,0C0h

                DB   0C2h,066h,03Ch,000h,000h,000h

fon14_ascii146  DB   000h,000h,07Eh,5Ah,018h,018h,018h,018h

                DB   018h,018h,03Ch,000h,000h,000h

fon14_ascii147  DB   000h,000h,0C6h,C6h,0C6h,0C6h,0C6h,07Eh

                DB   006h,0C6h,07Ch,000h,000h,000h

fon14_ascii148  DB   000h,03Ch,018h,7Eh,0DBh,0DBh,0DBh,0DBh

                DB   07Eh,018h,03Ch,000h,000h,000h

fon14_ascii149  DB   000h,000h,0C6h,C6h,06Ch,07Ch,038h,07Ch

                DB   06Ch,0C6h,0C6h,000h,000h,000h

fon14_ascii150  DB   000h,000h,0CCh,CCh,0CCh,0CCh,0CCh,0CCh

                DB   0CCh,0CCh,0FEh,006h,006h,000h

fon14_ascii151  DB   000h,000h,0C6h,C6h,0C6h,0C6h,0C6h,07Eh

                DB   006h,006h,006h,000h,000h,000h

fon14_ascii152  DB   000h,000h,0DBh,DBh,0DBh,0DBh,0DBh,0DBh

                DB   0DBh,0DBh,0FFh,000h,000h,000h

fon14_ascii153  DB   000h,000h,0DBh,DBh,0DBh,0DBh,0DBh,0DBh

                DB   0DBh,0DBh,0FFh,003h,003h,000h

fon14_ascii154  DB   000h,000h,0F8h,B0h,030h,03Ch,036h,036h

                DB   036h,036h,07Ch,000h,000h,000h

fon14_ascii155  DB   000h,000h,0C3h,C3h,0C3h,0F3h,0DBh,0DBh

                DB   0DBh,0DBh,0F3h,000h,000h,000h

fon14_ascii156  DB   000h,000h,0F0h,60h,060h,07Ch,066h,066h

                DB   066h,066h,0FCh,000h,000h,000h

fon14_ascii157  DB   000h,000h,07Ch,C6h,006h,026h,03Eh,026h

                DB   006h,0C6h,07Ch,000h,000h,000h

fon14_ascii158  DB   000h,000h,0CEh,DBh,0DBh,0DBh,0FBh,0DBh

                DB   0DBh,0DBh,0CEh,000h,000h,000h

fon14_ascii159  DB   000h,000h,03Fh,66h,066h,066h,03Eh,03Eh

                DB   066h,066h,0E7h,000h,000h,000h

fon14_ascii160  DB   000h,000h,000h,00h,000h,078h,00Ch,07Ch

                DB   0CCh,0CCh,076h,000h,000h,000h

fon14_ascii161  DB   000h,002h,006h,3Ch,060h,060h,07Ch,066h

                DB   066h,066h,03Ch,000h,000h,000h

fon14_ascii162  DB   000h,000h,000h,00h,000h,0FCh,066h,07Ch

                DB   066h,066h,0FCh,000h,000h,000h



fon14_ascii163  DB   000h,000h,000h,00h,000h,07Eh,032h,030h

                DB   030h,030h,078h,000h,000h,000h

fon14_ascii164  DB   000h,000h,000h,00h,000h,01Eh,036h,036h

                DB   066h,066h,0FFh,0C3h,0C3h,000h

fon14_ascii165  DB   000h,000h,000h,00h,000h,07Ch,0C6h,0FEh

                DB   0C0h,0C6h,07Ch,000h,000h,000h

fon14_ascii166  DB   000h,000h,000h,00h,000h,0D6h,0D6h,07Ch

                DB   054h,0D6h,0D6h,000h,000h,000h

fon14_ascii167  DB   000h,000h,000h,00h,000h,03Ch,066h,00Ch

                DB   006h,066h,03Ch,000h,000h,000h

fon14_ascii168  DB   000h,000h,000h,00h,000h,0C6h,0CEh,0D6h

                DB   0E6h,0C6h,0C6h,000h,000h,000h

fon14_ascii169  DB   000h,000h,000h,38h,038h,0C6h,0CEh,0D6h

                DB   0E6h,0C6h,0C6h,000h,000h,000h

fon14_ascii170  DB   000h,000h,000h,00h,000h,0E6h,06Ch,078h

                DB   078h,06Ch,0E6h,000h,000h,000h

fon14_ascii171  DB   000h,000h,000h,00h,000h,01Eh,036h,066h

                DB   066h,066h,066h,000h,000h,000h

fon14_ascii172  DB   000h,000h,000h,00h,000h,0C6h,0EEh,0FEh

                DB   0D6h,0D6h,0C6h,000h,000h,000h

fon14_ascii173  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0FEh

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii174  DB   000h,000h,000h,00h,000h,07Ch,0C6h,0C6h

                DB   0C6h,0C6h,07Ch,000h,000h,000h

fon14_ascii175  DB   000h,000h,000h,00h,000h,0FEh,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,000h,000h,000h

fon14_ascii176  DB   011h,044h,011h,44h,011h,044h,011h,044h

                DB   011h,044h,011h,044h,011h,044h

fon14_ascii177  DB   055h,0AAh,055h,AAh,055h,0AAh,055h,0AAh

                DB   055h,0AAh,055h,0AAh,055h,0AAh

fon14_ascii178  DB   0DDh,077h,0DDh,77h,0DDh,077h,0DDh,077h

                DB   0DDh,077h,0DDh,077h,0DDh,077h

fon14_ascii179  DB   018h,018h,018h,18h,018h,018h,018h,018h

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii180  DB   018h,018h,018h,18h,018h,018h,018h,0F8h

                DB   018h,018h,018h,018h,018h,018h



fon14_ascii181  DB   018h,018h,018h,18h,018h,0F8h,018h,0F8h

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii182  DB   036h,036h,036h,36h,036h,036h,036h,0F6h

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii183  DB   000h,000h,000h,00h,000h,000h,000h,0FEh

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii184  DB   000h,000h,000h,00h,000h,0F8h,018h,0F8h

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii185  DB   036h,036h,036h,36h,036h,0F6h,006h,0F6h

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii186  DB   036h,036h,036h,36h,036h,036h,036h,036h

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii187  DB   000h,000h,000h,00h,000h,0FEh,006h,0F6h

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii188  DB   036h,036h,036h,36h,036h,0F6h,006h,0FEh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii189  DB   036h,036h,036h,36h,036h,036h,036h,0FEh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii190  DB   018h,018h,018h,18h,018h,0F8h,018h,0F8h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii191  DB   000h,000h,000h,00h,000h,000h,000h,0F8h

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii192  DB   018h,018h,018h,18h,018h,018h,018h,01Fh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii193  DB   018h,018h,018h,18h,018h,018h,018h,0FFh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii194  DB   000h,000h,000h,00h,000h,000h,000h,0FFh

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii195  DB   018h,018h,018h,18h,018h,018h,018h,01Fh

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii196  DB   000h,000h,000h,00h,000h,000h,000h,0FFh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii197  DB   018h,018h,018h,18h,018h,018h,018h,0FFh

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii198  DB   018h,018h,018h,18h,018h,01Fh,018h,01Fh

                DB   018h,018h,018h,018h,018h,018h



fon14_ascii199  DB   036h,036h,036h,36h,036h,036h,036h,037h

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii200  DB   036h,036h,036h,36h,036h,037h,030h,03Fh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii201  DB   000h,000h,000h,00h,000h,03Fh,030h,037h

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii202  DB   036h,036h,036h,36h,036h,0F7h,000h,0FFh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii203  DB   000h,000h,000h,00h,000h,0FFh,000h,0F7h

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii204  DB   036h,036h,036h,36h,036h,037h,030h,037h

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii205  DB   000h,000h,000h,00h,000h,0FFh,000h,0FFh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii206  DB   036h,036h,036h,36h,036h,0F7h,000h,0F7h

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii207  DB   018h,018h,018h,18h,018h,0FFh,000h,0FFh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii208  DB   036h,036h,036h,36h,036h,036h,036h,0FFh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii209  DB   000h,000h,000h,00h,000h,0FFh,000h,0FFh

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii210  DB   000h,000h,000h,00h,000h,000h,000h,0FFh

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii211  DB   036h,036h,036h,36h,036h,036h,036h,03Fh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii212  DB   018h,018h,018h,18h,018h,01Fh,018h,01Fh

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii213  DB   000h,000h,000h,00h,000h,01Fh,018h,01Fh

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii214  DB   000h,000h,000h,00h,000h,000h,000h,03Fh

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii215  DB   036h,036h,036h,36h,036h,036h,036h,0FFh

                DB   036h,036h,036h,036h,036h,036h

fon14_ascii216  DB   018h,018h,018h,18h,018h,0FFh,018h,0FFh

                DB   018h,018h,018h,018h,018h,018h



fon14_ascii217  DB   018h,018h,018h,18h,018h,018h,018h,0F8h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii218  DB   000h,000h,000h,00h,000h,000h,000h,01Fh

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii219  DB   0FFh,0FFh,0FFh,FFh,0FFh,0FFh,0FFh,0FFh

                DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh

fon14_ascii220  DB   000h,000h,000h,00h,000h,000h,000h,0FFh

                DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh

fon14_ascii221  DB   0F0h,0F0h,0F0h,F0h,0F0h,0F0h,0F0h,0F0h

                DB   0F0h,0F0h,0F0h,0F0h,0F0h,0F0h

fon14_ascii222  DB   00Fh,00Fh,00Fh,0Fh,00Fh,00Fh,00Fh,00Fh

                DB   00Fh,00Fh,00Fh,00Fh,00Fh,00Fh

fon14_ascii223  DB   0FFh,0FFh,0FFh,FFh,0FFh,0FFh,0FFh,000h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii224  DB   000h,000h,000h,00h,000h,0DCh,066h,066h

                DB   066h,066h,07Ch,060h,0F0h,000h

fon14_ascii225  DB   000h,000h,000h,00h,000h,07Ch,0C6h,0C0h

                DB   0C0h,0C6h,07Ch,000h,000h,000h

fon14_ascii226  DB   000h,000h,000h,00h,000h,07Eh,05Ah,018h

                DB   018h,018h,03Ch,000h,000h,000h

fon14_ascii227  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0C6h

                DB   0C6h,07Eh,006h,0C6h,07Ch,000h

fon14_ascii228  DB   000h,000h,000h,00h,03Ch,018h,07Eh,0DBh

                DB   0DBh,0DBh,07Eh,018h,03Ch,000h

fon14_ascii229  DB   000h,000h,000h,00h,000h,0C6h,06Ch,038h

                DB   038h,06Ch,0C6h,000h,000h,000h

fon14_ascii230  DB   000h,000h,000h,00h,000h,0CCh,0CCh,0CCh

                DB   0CCh,0CCh,0FEh,006h,006h,000h

fon14_ascii231  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0C6h

                DB   07Eh,006h,006h,000h,000h,000h

fon14_ascii232  DB   000h,000h,000h,00h,000h,0D6h,0D6h,0D6h

                DB   0D6h,0D6h,0FEh,000h,000h,000h

fon14_ascii233  DB   000h,000h,000h,00h,000h,0D6h,0D6h,0D6h

                DB   0D6h,0D6h,0FEh,003h,003h,000h

fon14_ascii234  DB   000h,000h,000h,00h,000h,0F8h,0B0h,03Eh

                DB   033h,033h,07Eh,000h,000h,000h



fon14_ascii235  DB   000h,000h,000h,00h,000h,0C6h,0C6h,0F6h

                DB   0DEh,0DEh,0F6h,000h,000h,000h

fon14_ascii236  DB   000h,000h,000h,00h,000h,0F0h,060h,07Ch

                DB   066h,066h,0FCh,000h,000h,000h

fon14_ascii237  DB   000h,000h,000h,00h,000h,03Ch,066h,01Eh

                DB   006h,066h,03Ch,000h,000h,000h

fon14_ascii238  DB   000h,000h,000h,00h,000h,0CEh,0DBh,0FBh

                DB   0DBh,0DBh,0CEh,000h,000h,000h

fon14_ascii239  DB   000h,000h,000h,00h,000h,07Eh,0CCh,07Ch

                DB   06Ch,0CCh,0CEh,000h,000h,000h

fon14_ascii240  DB   000h,000h,06Ch,00h,0FEh,062h,068h,078h

                DB   068h,062h,0FEh,000h,000h,000h

fon14_ascii241  DB   000h,000h,000h,6Ch,000h,07Ch,0C6h,0FEh

                DB   0C0h,0C6h,07Ch,000h,000h,000h

fon14_ascii242  DB   000h,000h,000h,30h,018h,00Ch,006h,00Ch

                DB   018h,030h,000h,07Eh,000h,000h

fon14_ascii243  DB   000h,000h,000h,0Ch,018h,030h,060h,030h

                DB   018h,00Ch,000h,07Eh,000h,000h

fon14_ascii244  DB   000h,000h,00Eh,1Bh,01Bh,018h,018h,018h

                DB   018h,018h,018h,018h,018h,018h

fon14_ascii245  DB   018h,018h,018h,18h,018h,018h,018h,018h

                DB   0D8h,0D8h,0D8h,070h,000h,000h

fon14_ascii246  DB   000h,000h,000h,00h,018h,018h,000h,07Eh

                DB   000h,018h,018h,000h,000h,000h

fon14_ascii247  DB   000h,000h,000h,00h,000h,076h,0DCh,000h

                DB   076h,0DCh,000h,000h,000h,000h

fon14_ascii248  DB   000h,038h,06Ch,6Ch,038h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii249  DB   000h,000h,000h,00h,000h,000h,000h,018h

                DB   018h,000h,000h,000h,000h,000h

fon14_ascii250  DB   000h,000h,000h,00h,000h,000h,000h,000h

                DB   018h,000h,000h,000h,000h,000h

fon14_ascii251  DB   000h,000h,0E0h,18h,006h,003h,0F1h,0F9h

                DB   023h,0FEh,0A0h,0A0h,000h,000h

fon14_ascii252  DB   000h,000h,000h,06h,008h,04Bh,04Bh,068h

                DB   06Bh,058h,048h,088h,000h,000h



fon14_ascii253  DB   000h,070h,0D8h,30h,060h,0C8h,0F8h,000h

                DB   000h,000h,000h,000h,000h,000h

fon14_ascii254  DB   000h,000h,000h,0FFh,081h,0BDh,0A5h,0A5h

                DB   0BDh,081h,0FFh,000h,000h,000h

fon14_ascii255  DB   000h,000h,000h,00h,000h,000h,000h,000h

                DB   000h,042h,042h,07Eh,000h,000h

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

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

fon16_ascii0    DB   000h,000h,000h,000h,000h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii1    DB   000h,000h,07Eh,081h,0A5h,081h,081h,0A5h

                DB   099h,081h,081h,07Eh,000h,000h,000h,000h

fon16_ascii2    DB   000h,000h,07Eh,0FFh,0DBh,0FFh,0FFh,0DBh

                DB   0E7h,0FFh,0FFh,07Eh,000h,000h,000h,000h

fon16_ascii3    DB   000h,000h,000h,000h,06Ch,0FEh,0FEh,0FEh

                DB   0FEh,07Ch,038h,010h,000h,000h,000h,000h

fon16_ascii4    DB   000h,000h,000h,000h,010h,038h,07Ch,0FEh

                DB   07Ch,038h,010h,000h,000h,000h,000h,000h

fon16_ascii5    DB   000h,000h,000h,018h,03Ch,03Ch,0E7h,0E7h

                DB   0E7h,018h,018h,03Ch,000h,000h,000h,000h

fon16_ascii6    DB   000h,000h,000h,018h,03Ch,07Eh,0FFh,0FFh

                DB   07Eh,018h,018h,03Ch,000h,000h,000h,000h

fon16_ascii7    DB   000h,000h,000h,000h,000h,000h,018h,03Ch

                DB   03Ch,018h,000h,000h,000h,000h,000h,000h

fon16_ascii8    DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E7h,0C3h

                DB   0C3h,0E7h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh

fon16_ascii9    DB   000h,000h,000h,000h,000h,03Ch,066h,042h

                DB   042h,066h,03Ch,000h,000h,000h,000h,000h

fon16_ascii10   DB   0FFh,0FFh,0FFh,0FFh,0FFh,0C3h,099h,0BDh

                DB   0BDh,099h,0C3h,0FFh,0FFh,0FFh,0FFh,0FFh

fon16_ascii11   DB   000h,000h,01Eh,006h,00Eh,01Ah,078h,0CCh

                DB   0CCh,0CCh,0CCh,078h,000h,000h,000h,000h



fon16_ascii12   DB   000h,000h,03Ch,066h,066h,066h,066h,03Ch

                DB   018h,07Eh,018h,018h,000h,000h,000h,000h

fon16_ascii13   DB   000h,000h,03Fh,033h,03Fh,030h,030h,030h

                DB   030h,070h,0F0h,0E0h,000h,000h,000h,000h

fon16_ascii14   DB   000h,000h,07Fh,063h,07Fh,063h,063h,063h

                DB   063h,067h,0E7h,0E6h,0C0h,000h,000h,000h

fon16_ascii15   DB   000h,000h,000h,018h,018h,0DBh,03Ch,0E7h

                DB   03Ch,0DBh,018h,018h,000h,000h,000h,000h

fon16_ascii16   DB   000h,080h,0C0h,0E0h,0F0h,0F8h,0FEh,0F8h

                DB   0F0h,0E0h,0C0h,080h,000h,000h,000h,000h

fon16_ascii17   DB   000h,002h,006h,00Eh,01Eh,03Eh,0FEh,03Eh

                DB   01Eh,00Eh,006h,002h,000h,000h,000h,000h

fon16_ascii18   DB   000h,000h,018h,03Ch,07Eh,018h,018h,018h

                DB   07Eh,03Ch,018h,000h,000h,000h,000h,000h

fon16_ascii19   DB   000h,000h,066h,066h,066h,066h,066h,066h

                DB   066h,000h,066h,066h,000h,000h,000h,000h

fon16_ascii20   DB   000h,000h,07Fh,0DBh,0DBh,0DBh,07Bh,01Bh

                DB   01Bh,01Bh,01Bh,01Bh,000h,000h,000h,000h

fon16_ascii21   DB   000h,07Ch,0C6h,060h,038h,06Ch,0C6h,0C6h

                DB   06Ch,038h,00Ch,0C6h,07Ch,000h,000h,000h

fon16_ascii22   DB   000h,000h,000h,000h,000h,000h,000h,000h

                DB   0FEh,0FEh,0FEh,0FEh,000h,000h,000h,000h

fon16_ascii23   DB   000h,000h,018h,03Ch,07Eh,018h,018h,018h

                DB   07Eh,03Ch,018h,07Eh,000h,000h,000h,000h

fon16_ascii24   DB   000h,000h,018h,03Ch,07Eh,018h,018h,018h

                DB   018h,018h,018h,018h,000h,000h,000h,000h

fon16_ascii25   DB   000h,000h,018h,018h,018h,018h,018h,018h

                DB   018h,07Eh,03Ch,018h,000h,000h,000h,000h

fon16_ascii26   DB   000h,000h,000h,000h,000h,018h,00Ch,0FEh

                DB   00Ch,018h,000h,000h,000h,000h,000h,000h

fon16_ascii27   DB   000h,000h,000h,000h,000h,030h,060h,0FEh

                DB   060h,030h,000h,000h,000h,000h,000h,000h

fon16_ascii28   DB   000h,000h,000h,000h,000h,000h,0C0h,0C0h



                DB   0C0h,0FEh,000h,000h,000h,000h,000h,000h

fon16_ascii29   DB   000h,000h,000h,000h,000h,028h,06Ch,0FEh

                DB   06Ch,028h,000h,000h,000h,000h,000h,000h

fon16_ascii30   DB   000h,000h,000h,000h,010h,038h,038h,07Ch

                DB   07Ch,0FEh,0FEh,000h,000h,000h,000h,000h

fon16_ascii31   DB   000h,000h,000h,000h,0FEh,0FEh,07Ch,07Ch

                DB   038h,038h,010h,000h,000h,000h,000h,000h

fon16_ascii32   DB   000h,000h,000h,000h,000h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii33   DB   000h,000h,018h,03Ch,03Ch,03Ch,018h,018h

                DB   018h,000h,018h,018h,000h,000h,000h,000h

fon16_ascii34   DB   000h,066h,066h,066h,024h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii35   DB   000h,000h,000h,06Ch,06Ch,0FEh,06Ch,06Ch

                DB   06Ch,0FEh,06Ch,06Ch,000h,000h,000h,000h

fon16_ascii36   DB   018h,018h,07Ch,0C6h,0C2h,0C0h,07Ch,006h

                DB   006h,086h,0C6h,07Ch,018h,018h,000h,000h

fon16_ascii37   DB   000h,000h,000h,000h,0C2h,0C6h,00Ch,018h

                DB   030h,060h,0C6h,086h,000h,000h,000h,000h

fon16_ascii38   DB   000h,000h,038h,06Ch,06Ch,038h,076h,0DCh

                DB   0CCh,0CCh,0CCh,076h,000h,000h,000h,000h

fon16_ascii39   DB   000h,030h,030h,030h,060h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii40   DB   000h,000h,00Ch,018h,030h,030h,030h,030h

                DB   030h,030h,018h,00Ch,000h,000h,000h,000h

fon16_ascii41   DB   000h,000h,030h,018h,00Ch,00Ch,00Ch,00Ch

                DB   00Ch,00Ch,018h,030h,000h,000h,000h,000h

fon16_ascii42   DB   000h,000h,000h,000h,000h,066h,03Ch,0FFh

                DB   03Ch,066h,000h,000h,000h,000h,000h,000h

fon16_ascii43   DB   000h,000h,000h,000h,000h,018h,018h,07Eh

                DB   018h,018h,000h,000h,000h,000h,000h,000h

fon16_ascii44   DB   000h,000h,000h,000h,000h,000h,000h,000h

                DB   000h,018h,018h,018h,030h,000h,000h,000h



fon16_ascii45   DB   000h,000h,000h,000h,000h,000h,000h,0FEh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii46   DB   000h,000h,000h,000h,000h,000h,000h,000h

                DB   000h,000h,018h,018h,000h,000h,000h,000h

fon16_ascii47   DB   000h,000h,000h,000h,002h,006h,00Ch,018h

                DB   030h,060h,0C0h,080h,000h,000h,000h,000h

fon16_ascii48   DB   000h,000h,038h,06Ch,0C6h,0C6h,0D6h,0D6h

                DB   0C6h,0C6h,06Ch,038h,000h,000h,000h,000h

fon16_ascii49   DB   000h,000h,018h,038h,078h,018h,018h,018h

                DB   018h,018h,018h,07Eh,000h,000h,000h,000h

fon16_ascii50   DB   000h,000h,07Ch,0C6h,006h,00Ch,018h,030h

                DB   060h,0C0h,0C6h,0FEh,000h,000h,000h,000h

fon16_ascii51   DB   000h,000h,07Ch,0C6h,006h,006h,03Ch,006h

                DB   006h,006h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii52   DB   000h,000h,00Ch,01Ch,03Ch,06Ch,0CCh,0FEh

                DB   00Ch,00Ch,00Ch,01Eh,000h,000h,000h,000h

fon16_ascii53   DB   000h,000h,0FEh,0C0h,0C0h,0C0h,0FCh,006h

                DB   006h,006h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii54   DB   000h,000h,038h,060h,0C0h,0C0h,0FCh,0C6h

                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii55   DB   000h,000h,0FEh,0C6h,006h,006h,00Ch,018h

                DB   030h,030h,030h,030h,000h,000h,000h,000h

fon16_ascii56   DB   000h,000h,07Ch,0C6h,0C6h,0C6h,07Ch,0C6h

                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii57   DB   000h,000h,07Ch,0C6h,0C6h,0C6h,07Eh,006h

                DB   006h,006h,00Ch,078h,000h,000h,000h,000h

fon16_ascii58   DB   000h,000h,000h,000h,018h,018h,000h,000h

                DB   000h,018h,018h,000h,000h,000h,000h,000h

fon16_ascii59   DB   000h,000h,000h,000h,018h,018h,000h,000h

                DB   000h,018h,018h,030h,000h,000h,000h,000h

fon16_ascii60   DB   000h,000h,000h,006h,00Ch,018h,030h,060h

                DB   030h,018h,00Ch,006h,000h,000h,000h,000h

fon16_ascii61   DB   000h,000h,000h,000h,000h,07Eh,000h,000h



                DB   07Eh,000h,000h,000h,000h,000h,000h,000h

fon16_ascii62   DB   000h,000h,000h,060h,030h,018h,00Ch,006h

                DB   00Ch,018h,030h,060h,000h,000h,000h,000h

fon16_ascii63   DB   000h,000h,07Ch,0C6h,0C6h,00Ch,018h,018h

                DB   018h,000h,018h,018h,000h,000h,000h,000h

fon16_ascii64   DB   000h,000h,000h,07Ch,0C6h,0C6h,0DEh,0DEh

                DB   0DEh,0DCh,0C0h,07Ch,000h,000h,000h,000h

fon16_ascii65   DB   000h,000h,010h,038h,06Ch,0C6h,0C6h,0FEh

                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii66   DB   000h,000h,0FCh,066h,066h,066h,07Ch,066h

                DB   066h,066h,066h,0FCh,000h,000h,000h,000h

fon16_ascii67   DB   000h,000h,03Ch,066h,0C2h,0C0h,0C0h,0C0h

                DB   0C0h,0C2h,066h,03Ch,000h,000h,000h,000h

fon16_ascii68   DB   000h,000h,0F8h,06Ch,066h,066h,066h,066h

                DB   066h,066h,06Ch,0F8h,000h,000h,000h,000h

fon16_ascii69   DB   000h,000h,0FEh,066h,062h,068h,078h,068h

                DB   060h,062h,066h,0FEh,000h,000h,000h,000h

fon16_ascii70   DB   000h,000h,0FEh,066h,062h,068h,078h,068h

                DB   060h,060h,060h,0F0h,000h,000h,000h,000h

fon16_ascii71   DB   000h,000h,03Ch,066h,0C2h,0C0h,0C0h,0DEh

                DB   0C6h,0C6h,066h,03Ah,000h,000h,000h,000h

fon16_ascii72   DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0FEh,0C6h

                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii73   DB   000h,000h,03Ch,018h,018h,018h,018h,018h

                DB   018h,018h,018h,03Ch,000h,000h,000h,000h

fon16_ascii74   DB   000h,000h,01Eh,00Ch,00Ch,00Ch,00Ch,00Ch

                DB   0CCh,0CCh,0CCh,078h,000h,000h,000h,000h

fon16_ascii75   DB   000h,000h,0E6h,066h,066h,06Ch,078h,078h

                DB   06Ch,066h,066h,0E6h,000h,000h,000h,000h

fon16_ascii76   DB   000h,000h,0F0h,060h,060h,060h,060h,060h

                DB   060h,062h,066h,0FEh,000h,000h,000h,000h

fon16_ascii77   DB   000h,000h,0C6h,0EEh,0FEh,0FEh,0D6h,0C6h

                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h



fon16_ascii78   DB   000h,000h,0C6h,0E6h,0F6h,0FEh,0DEh,0CEh

                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii79   DB   000h,000h,07Ch,0C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii80   DB   000h,000h,0FCh,066h,066h,066h,07Ch,060h

                DB   060h,060h,060h,0F0h,000h,000h,000h,000h

fon16_ascii81   DB   000h,000h,07Ch,0C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,0D6h,0DEh,07Ch,00Ch,00Eh,000h,000h

fon16_ascii82   DB   000h,000h,0FCh,066h,066h,066h,07Ch,06Ch

                DB   066h,066h,066h,0E6h,000h,000h,000h,000h

fon16_ascii83   DB   000h,000h,07Ch,0C6h,0C6h,060h,038h,00Ch

                DB   006h,0C6h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii84   DB   000h,000h,07Eh,07Eh,05Ah,018h,018h,018h

                DB   018h,018h,018h,03Ch,000h,000h,000h,000h

fon16_ascii85   DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii86   DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,06Ch,038h,010h,000h,000h,000h,000h

fon16_ascii87   DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0D6h,0D6h

                DB   0D6h,0FEh,0EEh,06Ch,000h,000h,000h,000h

fon16_ascii88   DB   000h,000h,0C6h,0C6h,06Ch,07Ch,038h,038h

                DB   07Ch,06Ch,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii89   DB   000h,000h,066h,066h,066h,066h,03Ch,018h

                DB   018h,018h,018h,03Ch,000h,000h,000h,000h

fon16_ascii90   DB   000h,000h,0FEh,0C6h,086h,00Ch,018h,030h

                DB   060h,0C2h,0C6h,0FEh,000h,000h,000h,000h

fon16_ascii91   DB   000h,000h,03Ch,030h,030h,030h,030h,030h

                DB   030h,030h,030h,03Ch,000h,000h,000h,000h

fon16_ascii92   DB   000h,000h,000h,080h,0C0h,0E0h,070h,038h

                DB   01Ch,00Eh,006h,002h,000h,000h,000h,000h

fon16_ascii93   DB   000h,000h,03Ch,00Ch,00Ch,00Ch,00Ch,00Ch

                DB   00Ch,00Ch,00Ch,03Ch,000h,000h,000h,000h

fon16_ascii94   DB   010h,038h,06Ch,0C6h,000h,000h,000h,000h



                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii95   DB   000h,000h,000h,000h,000h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,0FFh,000h,000h

fon16_ascii96   DB   030h,030h,018h,000h,000h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii97   DB   000h,000h,000h,000h,000h,078h,00Ch,07Ch

                DB   0CCh,0CCh,0CCh,07Ch,000h,000h,000h,000h

fon16_ascii98   DB   000h,000h,060h,060h,060h,078h,06Ch,066h

                DB   066h,066h,066h,07Ch,000h,000h,000h,000h

fon16_ascii99   DB   000h,000h,000h,000h,000h,07Ch,0C6h,0C0h

                DB   0C0h,0C0h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii100  DB   000h,000h,00Ch,00Ch,00Ch,03Ch,06Ch,0CCh

                DB   0CCh,0CCh,0CCh,07Ch,000h,000h,000h,000h

fon16_ascii101  DB   000h,000h,000h,000h,000h,07Ch,0C6h,0FEh

                DB   0C0h,0C0h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii102  DB   000h,000h,038h,06Ch,064h,060h,0F0h,060h

                DB   060h,060h,060h,0F0h,000h,000h,000h,000h

fon16_ascii103  DB   000h,000h,000h,000h,000h,07Ch,0CCh,0CCh

                DB   0CCh,0CCh,0CCh,07Ch,00Ch,0CCh,078h,000h

fon16_ascii104  DB   000h,000h,060h,060h,060h,07Ch,066h,066h

                DB   066h,066h,066h,066h,000h,000h,000h,000h

fon16_ascii105  DB   000h,000h,018h,018h,000h,038h,018h,018h

                DB   018h,018h,018h,03Ch,000h,000h,000h,000h

fon16_ascii106  DB   000h,000h,006h,006h,000h,00Eh,006h,006h

                DB   006h,006h,006h,006h,066h,066h,03Ch,000h

fon16_ascii107  DB   000h,000h,0E0h,060h,060h,066h,06Ch,078h

                DB   078h,06Ch,066h,0E6h,000h,000h,000h,000h

fon16_ascii108  DB   000h,000h,038h,018h,018h,018h,018h,018h

                DB   018h,018h,018h,03Ch,000h,000h,000h,000h

fon16_ascii109  DB   000h,000h,000h,000h,000h,0ECh,0FEh,0D6h

                DB   0D6h,0D6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii110  DB   000h,000h,000h,000h,000h,07Ch,066h,066h

                DB   066h,066h,066h,066h,000h,000h,000h,000h



fon16_ascii111  DB   000h,000h,000h,000h,000h,07Ch,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii112  DB   000h,000h,000h,000h,000h,07Ch,066h,066h

                DB   066h,066h,066h,07Ch,060h,060h,060h,000h

fon16_ascii113  DB   000h,000h,000h,000h,000h,07Ch,0CCh,0CCh

                DB   0CCh,0CCh,0CCh,07Ch,00Ch,00Ch,00Ch,000h

fon16_ascii114  DB   000h,000h,000h,000h,000h,0DCh,076h,066h

                DB   060h,060h,060h,0F0h,000h,000h,000h,000h

fon16_ascii115  DB   000h,000h,000h,000h,000h,07Ch,0C6h,060h

                DB   038h,00Ch,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii116  DB   000h,000h,010h,030h,030h,0FCh,030h,030h

                DB   030h,030h,036h,01Ch,000h,000h,000h,000h

fon16_ascii117  DB   000h,000h,000h,000h,000h,0CCh,0CCh,0CCh

                DB   0CCh,0CCh,0CCh,07Ch,000h,000h,000h,000h

fon16_ascii118  DB   000h,000h,000h,000h,000h,066h,066h,066h

                DB   066h,066h,03Ch,018h,000h,000h,000h,000h

fon16_ascii119  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0D6h

                DB   0D6h,0D6h,0FEh,06Ch,000h,000h,000h,000h

fon16_ascii120  DB   000h,000h,000h,000h,000h,0C6h,06Ch,038h

                DB   038h,038h,06Ch,0C6h,000h,000h,000h,000h

fon16_ascii121  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,07Eh,006h,0C6h,07Ch,000h

fon16_ascii122  DB   000h,000h,000h,000h,000h,0FEh,0CCh,018h

                DB   030h,060h,0C6h,0FEh,000h,000h,000h,000h

fon16_ascii123  DB   000h,000h,00Eh,018h,018h,018h,070h,018h

                DB   018h,018h,018h,00Eh,000h,000h,000h,000h

fon16_ascii124  DB   000h,000h,018h,018h,018h,018h,000h,018h

                DB   018h,018h,018h,018h,000h,000h,000h,000h

fon16_ascii125  DB   000h,000h,070h,018h,018h,018h,00Eh,018h

                DB   018h,018h,018h,070h,000h,000h,000h,000h

fon16_ascii126  DB   000h,000h,076h,0DCh,000h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii127  DB   000h,000h,000h,000h,010h,038h,06Ch,0C6h



                DB   0C6h,0C6h,0FEh,000h,000h,000h,000h,000h

fon16_ascii128  DB   000h,000h,01Eh,036h,066h,0C6h,0C6h,0FEh

                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii129  DB   000h,000h,0FEh,062h,062h,060h,07Ch,066h

                DB   066h,066h,066h,0FCh,000h,000h,000h,000h

fon16_ascii130  DB   000h,000h,0FCh,066h,066h,066h,07Ch,066h

                DB   066h,066h,066h,0FCh,000h,000h,000h,000h

fon16_ascii131  DB   000h,000h,0FEh,062h,062h,060h,060h,060h

                DB   060h,060h,060h,0F0h,000h,000h,000h,000h

fon16_ascii132  DB   000h,000h,01Eh,036h,066h,066h,066h,066h

                DB   066h,066h,066h,0FFh,0C3h,081h,000h,000h

fon16_ascii133  DB   000h,000h,0FEh,066h,062h,068h,078h,068h

                DB   060h,062h,066h,0FEh,000h,000h,000h,000h

fon16_ascii134  DB   000h,000h,0D6h,0D6h,054h,054h,07Ch,07Ch

                DB   054h,0D6h,0D6h,0D6h,000h,000h,000h,000h

fon16_ascii135  DB   000h,000h,07Ch,0C6h,006h,006h,03Ch,006h

                DB   006h,006h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii136  DB   000h,000h,0C6h,0C6h,0CEh,0CEh,0D6h,0E6h

                DB   0E6h,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii137  DB   038h,038h,0C6h,0C6h,0CEh,0CEh,0D6h,0E6h

                DB   0E6h,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii138  DB   000h,000h,0E6h,066h,06Ch,06Ch,078h,078h

                DB   06Ch,06Ch,066h,0E6h,000h,000h,000h,000h

fon16_ascii139  DB   000h,000h,01Eh,036h,066h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii140  DB   000h,000h,0C6h,0EEh,0FEh,0FEh,0D6h,0C6h

                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii141  DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0FEh,0C6h

                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii142  DB   000h,000h,07Ch,0C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii143  DB   000h,000h,0FEh,0C6h,0C6h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h



fon16_ascii144  DB   000h,000h,0FCh,066h,066h,066h,07Ch,060h

                DB   060h,060h,060h,0F0h,000h,000h,000h,000h

fon16_ascii145  DB   000h,000h,03Ch,066h,0C2h,0C0h,0C0h,0C0h

                DB   0C0h,0C2h,066h,03Ch,000h,000h,000h,000h

fon16_ascii146  DB   000h,000h,07Eh,05Ah,018h,018h,018h,018h

                DB   018h,018h,018h,03Ch,000h,000h,000h,000h

fon16_ascii147  DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0C6h,07Eh

                DB   006h,006h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii148  DB   000h,03Ch,018h,07Eh,0DBh,0DBh,0DBh,0DBh

                DB   0DBh,07Eh,018h,03Ch,000h,000h,000h,000h

fon16_ascii149  DB   000h,000h,0C6h,0C6h,06Ch,07Ch,038h,038h

                DB   07Ch,06Ch,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii150  DB   000h,000h,0CCh,0CCh,0CCh,0CCh,0CCh,0CCh

                DB   0CCh,0CCh,0CCh,0FEh,006h,006h,000h,000h

fon16_ascii151  DB   000h,000h,0C6h,0C6h,0C6h,0C6h,0C6h,07Eh

                DB   006h,006h,006h,006h,000h,000h,000h,000h

fon16_ascii152  DB   000h,000h,0DBh,0DBh,0DBh,0DBh,0DBh,0DBh

                DB   0DBh,0DBh,0DBh,0FFh,000h,000h,000h,000h

fon16_ascii153  DB   000h,000h,0DBh,0DBh,0DBh,0DBh,0DBh,0DBh

                DB   0DBh,0DBh,0DBh,0FFh,003h,003h,000h,000h

fon16_ascii154  DB   000h,000h,0F8h,0B0h,030h,030h,03Eh,033h

                DB   033h,033h,033h,07Eh,000h,000h,000h,000h

fon16_ascii155  DB   000h,000h,0C3h,0C3h,0C3h,0C3h,0F3h,0DBh

                DB   0DBh,0DBh,0DBh,0F3h,000h,000h,000h,000h

fon16_ascii156  DB   000h,000h,0F0h,060h,060h,060h,07Ch,066h

                DB   066h,066h,066h,0FCh,000h,000h,000h,000h

fon16_ascii157  DB   000h,000h,07Ch,0C6h,006h,026h,03Eh,026h

                DB   006h,006h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii158  DB   000h,000h,0CEh,0DBh,0DBh,0DBh,0FBh,0DBh

                DB   0DBh,0DBh,0DBh,0CEh,000h,000h,000h,000h

fon16_ascii159  DB   000h,000h,03Fh,066h,066h,066h,03Eh,03Eh

                DB   066h,066h,066h,0E7h,000h,000h,000h,000h

fon16_ascii160  DB   000h,000h,000h,000h,000h,078h,00Ch,07Ch



                DB   0CCh,0CCh,0CCh,076h,000h,000h,000h,000h

fon16_ascii161  DB   000h,002h,006h,03Ch,060h,060h,07Ch,066h

                DB   066h,066h,066h,03Ch,000h,000h,000h,000h

fon16_ascii162  DB   000h,000h,000h,000h,000h,0FCh,066h,066h

                DB   07Ch,066h,066h,0FCh,000h,000h,000h,000h

fon16_ascii163  DB   000h,000h,000h,000h,000h,07Eh,032h,032h

                DB   030h,030h,030h,078h,000h,000h,000h,000h

fon16_ascii164  DB   000h,000h,000h,000h,000h,01Eh,036h,036h

                DB   066h,066h,066h,0FFh,0C3h,0C3h,000h,000h

fon16_ascii165  DB   000h,000h,000h,000h,000h,07Ch,0C6h,0FEh

                DB   0C0h,0C0h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii166  DB   000h,000h,000h,000h,000h,0D6h,0D6h,054h

                DB   07Ch,054h,0D6h,0D6h,000h,000h,000h,000h

fon16_ascii167  DB   000h,000h,000h,000h,000h,03Ch,066h,006h

                DB   00Ch,006h,066h,03Ch,000h,000h,000h,000h

fon16_ascii168  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0CEh

                DB   0D6h,0E6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii169  DB   000h,000h,000h,038h,038h,0C6h,0C6h,0CEh

                DB   0D6h,0E6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii170  DB   000h,000h,000h,000h,000h,0E6h,06Ch,078h

                DB   078h,06Ch,066h,0E6h,000h,000h,000h,000h

fon16_ascii171  DB   000h,000h,000h,000h,000h,01Eh,036h,066h

                DB   066h,066h,066h,066h,000h,000h,000h,000h

fon16_ascii172  DB   000h,000h,000h,000h,000h,0C6h,0EEh,0FEh

                DB   0FEh,0D6h,0D6h,0C6h,000h,000h,000h,000h

fon16_ascii173  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0C6h

                DB   0FEh,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii174  DB   000h,000h,000h,000h,000h,07Ch,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii175  DB   000h,000h,000h,000h,000h,0FEh,0C6h,0C6h

                DB   0C6h,0C6h,0C6h,0C6h,000h,000h,000h,000h

fon16_ascii176  DB   011h,044h,011h,044h,011h,044h,011h,044h

                DB   011h,044h,011h,044h,011h,044h,011h,044h



fon16_ascii177  DB   055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh

                DB   055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh

fon16_ascii178  DB   0DDh,077h,0DDh,077h,0DDh,077h,0DDh,077h

                DB   0DDh,077h,0DDh,077h,0DDh,077h,0DDh,077h

fon16_ascii179  DB   018h,018h,018h,018h,018h,018h,018h,018h

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii180  DB   018h,018h,018h,018h,018h,018h,018h,0F8h

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii181  DB   018h,018h,018h,018h,018h,0F8h,018h,0F8h

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii182  DB   036h,036h,036h,036h,036h,036h,036h,0F6h

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii183  DB   000h,000h,000h,000h,000h,000h,000h,0FEh

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii184  DB   000h,000h,000h,000h,000h,0F8h,018h,0F8h

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii185  DB   036h,036h,036h,036h,036h,0F6h,006h,0F6h

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii186  DB   036h,036h,036h,036h,036h,036h,036h,036h

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii187  DB   000h,000h,000h,000h,000h,0FEh,006h,0F6h

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii188  DB   036h,036h,036h,036h,036h,0F6h,006h,0FEh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii189  DB   036h,036h,036h,036h,036h,036h,036h,0FEh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii190  DB   018h,018h,018h,018h,018h,0F8h,018h,0F8h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii191  DB   000h,000h,000h,000h,000h,000h,000h,0F8h

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii192  DB   018h,018h,018h,018h,018h,018h,018h,01Fh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii193  DB   018h,018h,018h,018h,018h,018h,018h,0FFh



                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii194  DB   000h,000h,000h,000h,000h,000h,000h,0FFh

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii195  DB   018h,018h,018h,018h,018h,018h,018h,01Fh

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii196  DB   000h,000h,000h,000h,000h,000h,000h,0FFh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii197  DB   018h,018h,018h,018h,018h,018h,018h,0FFh

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii198  DB   018h,018h,018h,018h,018h,01Fh,018h,01Fh

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii199  DB   036h,036h,036h,036h,036h,036h,036h,037h

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii200  DB   036h,036h,036h,036h,036h,037h,030h,03Fh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii201  DB   000h,000h,000h,000h,000h,03Fh,030h,037h

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii202  DB   036h,036h,036h,036h,036h,0F7h,000h,0FFh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii203  DB   000h,000h,000h,000h,000h,0FFh,000h,0F7h

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii204  DB   036h,036h,036h,036h,036h,037h,030h,037h

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii205  DB   000h,000h,000h,000h,000h,0FFh,000h,0FFh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii206  DB   036h,036h,036h,036h,036h,0F7h,000h,0F7h

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii207  DB   018h,018h,018h,018h,018h,0FFh,000h,0FFh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii208  DB   036h,036h,036h,036h,036h,036h,036h,0FFh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii209  DB   000h,000h,000h,000h,000h,0FFh,000h,0FFh

                DB   018h,018h,018h,018h,018h,018h,018h,018h



fon16_ascii210  DB   000h,000h,000h,000h,000h,000h,000h,0FFh

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii211  DB   036h,036h,036h,036h,036h,036h,036h,03Fh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii212  DB   018h,018h,018h,018h,018h,01Fh,018h,01Fh

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii213  DB   000h,000h,000h,000h,000h,01Fh,018h,01Fh

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii214  DB   000h,000h,000h,000h,000h,000h,000h,03Fh

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii215  DB   036h,036h,036h,036h,036h,036h,036h,0FFh

                DB   036h,036h,036h,036h,036h,036h,036h,036h

fon16_ascii216  DB   018h,018h,018h,018h,018h,0FFh,018h,0FFh

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii217  DB   018h,018h,018h,018h,018h,018h,018h,0F8h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii218  DB   000h,000h,000h,000h,000h,000h,000h,01Fh

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii219  DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh

                DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh

fon16_ascii220  DB   000h,000h,000h,000h,000h,000h,000h,0FFh

                DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh

fon16_ascii221  DB   0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h

                DB   0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h

fon16_ascii222  DB   00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh

                DB   00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh

fon16_ascii223  DB   0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii224  DB   000h,000h,000h,000h,000h,0DCh,066h,066h

                DB   066h,066h,066h,07Ch,060h,060h,0F0h,000h

fon16_ascii225  DB   000h,000h,000h,000h,000h,07Ch,0C6h,0C0h

                DB   0C0h,0C0h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii226  DB   000h,000h,000h,000h,000h,07Eh,05Ah,018h



                DB   018h,018h,018h,03Ch,000h,000h,000h,000h

fon16_ascii227  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0C6h

                DB   0C6h,0C6h,07Eh,006h,006h,0C6h,07Ch,000h

fon16_ascii228  DB   000h,000h,000h,000h,03Ch,018h,07Eh,0DBh

                DB   0DBh,0DBh,0DBh,07Eh,018h,018h,03Ch,000h

fon16_ascii229  DB   000h,000h,000h,000h,000h,0C6h,06Ch,038h

                DB   038h,038h,06Ch,0C6h,000h,000h,000h,000h

fon16_ascii230  DB   000h,000h,000h,000h,000h,0CCh,0CCh,0CCh

                DB   0CCh,0CCh,0CCh,0FEh,006h,006h,000h,000h

fon16_ascii231  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0C6h

                DB   0C6h,07Eh,006h,006h,000h,000h,000h,000h

fon16_ascii232  DB   000h,000h,000h,000h,000h,0D6h,0D6h,0D6h

                DB   0D6h,0D6h,0D6h,0FEh,000h,000h,000h,000h

fon16_ascii233  DB   000h,000h,000h,000h,000h,0D6h,0D6h,0D6h

                DB   0D6h,0D6h,0D6h,0FEh,003h,003h,000h,000h

fon16_ascii234  DB   000h,000h,000h,000h,000h,0F8h,0B0h,030h

                DB   03Eh,033h,033h,07Eh,000h,000h,000h,000h

fon16_ascii235  DB   000h,000h,000h,000h,000h,0C6h,0C6h,0C6h

                DB   0F6h,0DEh,0DEh,0F6h,000h,000h,000h,000h

fon16_ascii236  DB   000h,000h,000h,000h,000h,0F0h,060h,060h

                DB   07Ch,066h,066h,0FCh,000h,000h,000h,000h

fon16_ascii237  DB   000h,000h,000h,000h,000h,03Ch,066h,006h

                DB   01Eh,006h,066h,03Ch,000h,000h,000h,000h

fon16_ascii238  DB   000h,000h,000h,000h,000h,0CEh,0DBh,0DBh

                DB   0FBh,0DBh,0DBh,0CEh,000h,000h,000h,000h

fon16_ascii239  DB   000h,000h,000h,000h,000h,07Eh,0CCh,0CCh

                DB   0FCh,06Ch,0CCh,0CEh,000h,000h,000h,000h

fon16_ascii240  DB   000h,06Ch,000h,0FEh,066h,062h,068h,078h

                DB   068h,062h,066h,0FEh,000h,000h,000h,000h

fon16_ascii241  DB   000h,000h,000h,06Ch,000h,07Ch,0C6h,0FEh

                DB   0C0h,0C0h,0C6h,07Ch,000h,000h,000h,000h

fon16_ascii242  DB   000h,000h,000h,030h,018h,00Ch,006h,00Ch

                DB   018h,030h,000h,07Eh,000h,000h,000h,000h



fon16_ascii243  DB   000h,000h,000h,00Ch,018h,030h,060h,030h

                DB   018h,00Ch,000h,07Eh,000h,000h,000h,000h

fon16_ascii244  DB   000h,000h,00Eh,01Bh,01Bh,018h,018h,018h

                DB   018h,018h,018h,018h,018h,018h,018h,018h

fon16_ascii245  DB   018h,018h,018h,018h,018h,018h,018h,018h

                DB   0D8h,0D8h,0D8h,070h,000h,000h,000h,000h

fon16_ascii246  DB   000h,000h,000h,000h,018h,018h,000h,07Eh

                DB   000h,018h,018h,000h,000h,000h,000h,000h

fon16_ascii247  DB   000h,000h,000h,000h,000h,076h,0DCh,000h

                DB   076h,0DCh,000h,000h,000h,000h,000h,000h

fon16_ascii248  DB   000h,038h,06Ch,06Ch,038h,000h,000h,000h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii249  DB   000h,000h,000h,000h,000h,000h,000h,018h

                DB   018h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii250  DB   000h,000h,000h,000h,000h,000h,000h,000h

                DB   018h,000h,000h,000h,000h,000h,000h,000h

fon16_ascii251  DB   000h,000h,000h,001h,003h,002h,006h,004h

                DB   0CCh,068h,038h,010h,000h,000h,000h,000h

fon16_ascii252  DB   000h,000h,000h,03Ch,042h,099h,0A5h,0A1h

                DB   0A5h,099h,042h,03Ch,000h,000h,000h,000h

fon16_ascii253  DB   000h,070h,0D8h,030h,060h,0C8h,0F8h,000h

                DB   000h,000h,000h,000h,000h,000h,000h,000h

fon14_ascii254  DB   0FFh,0FFh,081h,081h,0BDh,0BDh,0A5h,0A5h

                DB   0A5h,0A5h,0BDh,0BDh,081h,081h,0FFh,0FFh

fon16_ascii255  DB   000h,000h,000h,000h,000h,000h,000h,000h

                DB   000h,000h,042h,07Eh,000h,000h,000h,000h

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

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

#include <conio.h>

#include <stdio.h>

// Главная функция программы

void main(void) {

  int   ch = 0, i;

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

                // Исключаем из проверки режимы 8 - 0xC

                if(( i > 7 ) && ( i <= 0xC )) continue;

                // Устанавливаем режим i

                _asm {

                                mov        ax,i

                                int           10h

                }

                // Отображаем текстовую строку

                printf(" Режим видеоадаптера номер %x", i );

                ch = getch();

  }

}


Синхронизатор


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

PICTURE._FIG_17.PCX;6";4.308";PCX

Рисунок 3.18   Разрешение записи в цветовые слои

Процессор передает видеоадаптеру данные для записи в видеопамять. Они проходят через графический контроллер и попадают в синхронизатор. Графический контроллер выполняет над данными, записываемыми в видеопамять, операции, определяемые состоянием его регистров (смотри главу "Исполнение видеоадаптером операции записи" из раздела "Графический контроллер").

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



Слоеный пирог


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

Простейший путь втиснуть в адресное пространство объемом 64 Кбайт больше памяти лежит в увеличении количества слоев видеопамяти. Действительно у некоторых моделей видеоадаптера SVGA видеопамять организована в 8 и даже в 16 слоев. Каждый байт видеопамяти определяет 8 пикселов. Восемь слоев памяти позволяют закодировать 256 возможных цветов для пиксела, а шестнадцать слоев - 65536 различных цветов.

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



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


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

На входе:

AH

1Ch

AL

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

CX

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

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

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

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

ES:BX

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

На выходе:

AL

1Ch



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


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

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

Назначение

00h

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

01h

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

02h

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

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



Сохранить/восстановить состояние видеоадаптера


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

На входе:

AH

4Fh

AL

04h

DL

00h Определить размер буфера состояния

DL

01h Сохранить состояние видеосистемы

ES:BX

Указатель на буфер

DL

02h Восстановить состояние видеосистемы

ES:BX

Указатель на буфер

CX

Флаги управления сохранением и восстановлением:

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

D1 состояние видеоданных BIOS;

D2 состояние регистров ЦАП;

D3 состояние регистров SVGA

На выходе:

AL

4Fh

AH

Результат: 0, в случае успешного завершения, 1 в случае ошибки



Стандарт VESA


Стандарт VESA описывает расширение прерывания BIOS номер 10h (VESA BIOS Extention - VBE), отвечающего за управление видеоадаптерами. Поддержка VBE обычно включается производителями видеоадаптеров в ПЗУ самого адаптера или поставляется в виде отдельной резидентной программы. Во втором случае перед использованием функций VBE необходимо загрузить данную резидентную программу в оперативную память компьютера. Ниже мы полностью опишем функции VBE версии 1.2 и опишем некоторые функции VBE версии 2.0.

Перед вызовом функций VBE следует записать в регистр AH значение 4Fh. Если ваша реализация VBE поддерживает данную функцию, то в регистре AL возвращается значение 4Fh. Если функция не реализована, тогда в регистре AL возвращается значение, отличное от 4Fh.

Результат выполнения функции записывается в регистр AH. В случае успешного завершения функции в регистре AH возвращается нулевое значение. Если в регистре AH записано значение 1h, значит функция завершилась с ошибкой. И, наконец, если в регистре AH возвращается значение 2h, значит аппаратура видеоадаптера не поддерживает данную функцию.

Возможна ситуация, когда VBE может выполнить запрашиваемую функцию, а аппаратура видеоадаптера - нет. В этом случае после завершения функции регистр AH содержит значение 4Fh, а регистр AH - 2h.



Стандартные функции вывода языка Си


В главе рассмотрены основные стандартные функции вывода текстовых данных на экран (через стандартный выходной поток и через консоль). К ним относятся функции putc, putchar, putch, puts, cputs, printf и cprintf.

Несмотря на то, что эти функции не входят в определение языка Си, по причинам совместимости их формат одинаков для всех трансляторов с языка Си.



Свертка окна вверх - функция 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 (за исключением направления свертки).



Таблица кодов комбинаций мониторов


Таблица кодов комбинаций мониторов содержит список всех комбинаций видеоподсистем, которые поддерживает BIOS (см. прерывание INT10h, функция 1Ah). Формат таблицы представлен ниже:

Смещение

Размер

Описание

00h

Байт

Количество элементов в массиве комбинаций кодов (см. смещение 04h)

01h

"-"

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

02h

"-"

Максимальный код комбинаций мониторов

03h

"-"

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

04h

Массив слов

Каждое слово в массиве описывает пару видеоподсистем, поддерживаемых BIOS



Таблица настройки палитры


Таблица настройки палитры содержит значения, загружаемые при выборе режима работы видеоадаптера в регистр положения подчеркивания символа (регистра ULR), регистры палитры, и регистры таблицы цветов.

Смещение

Размер

Описание

00h

Байт

Управление подчеркиванием символов в текстовых режимах:

1 подчеркивание разрешено во всех текстовых режимах;

0 подчеркивание разрешено во всех монохромных текстовых режимах;

-1 подчеркивание не используется

01h

Байт

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

02h

Слово

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

04h

Слово

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

06h

Слово

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

08h

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

Адрес таблицы, содержащей значения регистров контроллера атрибутов

0Ch

Слово

Количество регистров таблицы цветов

0Eh

Слово

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

10h

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

Адрес таблицы, содержащей значения регистров таблицы цветов

14h

Массив байт переменной длины

Список режимов, в которых используется данная таблица. Каждый байт содержит номер режима. Список заканчивается числом 0FFh

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

Формат вызова программы BIOSVAR имеет следующий вид:

BIOSVAR <номер режима>

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

Листинг 6.1. Файл BIOSVAR.С

#include <stdio.h>

#include <dos.h>

#include <mem.h>

#include "sysgraph.h"

int           main( int, char ** );

//===========================================================

// Главная функция программы

//===========================================================

int main( int argc, char * argv[] )

{

 

BIOS_VAR _far  *bios_var_ptr;

 

BIOS_VAR bios_var_table;


  union  REGS    inregs, outregs;

  int          vmode;

// Проверка командной строки программы

  if( argc != 2 )

  {

                printf( "\nФормат вызова: BIOSVAR <режим>"

                                                  "\n   <режим>: режим видеоадаптера \n" );

                return -1;

  }

  sscanf(argv[1],"%d",&vmode);

// Устанавливаем режим работы видеоадаптера,

// заданный параметром vmode

  inregs.h.ah = 0x0;

  inregs.h.al = vmode;

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

// Получаем указатель на область переменных видеофункций BIOS

  bios_var_ptr = (BIOS_VAR _far *) FP_MAKE(0x0000, 0x0410);

// Копируем переменные видеофункций BIOS в структуру

// bios_var_table

  _fmemcpy(&bios_var_table,

                (void far*) bios_var_ptr, sizeof(BIOS_VAR) );

// Устанавливаем текстовые режим видеоадаптера номер 3

  inregs.h.ah = 0x0;

  inregs.h.al = 3;

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

// Отображаем содержимое переменных BIOS

  printf(  "Флаги конфигурации:                  %Xh\n"

                "Текущий режим работы видеоадаптера:        %Xh\n"

                "Количество символов в строке:              %d\n"

                "Размер страницы видеопамяти:               %d\n"

                "Начальный адрес:                           %Xh\n"

                "Координаты курсора нулевой страницы:       %Xh\n"

                "Форма курсора:                             %Xh\n"

                "Активная страница:                         %Xh\n"

                "Адрес индексного регистра контроллера ЭЛТ: %Xh\n"

                "Регистр режима CGA:                        %Xh\n"

                "Цветовая палитра CGA:                      %Xh\n"

                "Количество текстовых строк:                %d\n"

                "Высота символов:                           %d\n"


                "Информация о EGA 1:                        %Xh\n"

                "Информация о EGA 2:                        %Xh\n"

                " Адрес таблицы окружения:                   %Fp\n",

                (unsigned char) bios_var_table.bEquipFlags,

                (unsigned char) bios_var_table.bVideoMode,

                (unsigned) bios_var_table.wColumns,

                (unsigned) bios_var_table.wPageLength,

                (unsigned) bios_var_table.wVidStart,

                (unsigned) bios_var_table.w8CursorPos[0],

                (unsigned) bios_var_table.wCursorShape,

                (unsigned char) bios_var_table.bActivePage,

                (unsigned) bios_var_table.wAddrCRT,

                (unsigned char) bios_var_table.bRegMode,

                (unsigned char) bios_var_table.bRegPalette,

                (unsigned char) bios_var_table.bRows + 1,

                (unsigned) bios_var_table.wCharHigh,

                (unsigned char) bios_var_table.bInfo,

                (unsigned char) bios_var_table.bInfoTwo,

                (void far*) bios_var_table.dwSavePtr

  );

  printf("\nCopyright (C)Frolov G.V., 1992-1995. "

                "E-mail: frolov@glas.apc.org\n");

  return 0;

}

Таблица окружения


Адрес таблицы окружения содержится в области переменных видеофункций BIOS (см. выше, переменная по адресу 0000:04A8h). Таблица окружения содержит пять двойных слов, представляющих собой указатели на различные структуры (таблицы и буфера памяти), используемые BIOS видеоадаптера.

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

Вы можете заменить таблицу окружения, записав указатель на новую таблицу по адресу 0000:04A8h. Таким образом, вы можете изменить шрифты и некоторые другие параметры, устанавливаемые BIOS при выборе режима работы видеоадаптера.

Ниже описаны элементы таблицы окружения:

Смещение

Размер

Описание

00h

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

Указатель на таблицу параметров, содержащую значения регистров EGA/VGA, устанавливаемые BIOS по умолчанию

04h

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

Указатель на область сохранения значений некоторых регистров EGA/VGA, доступных только для чтения

08h

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

Указатель на таблицу символов текстового режима

0Ch

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

Указатель на таблицу символов графического режима

10h

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

Указатель на дополнительную таблицу окружения, используемую для расширения таблицы окружения (доступна только для видеоадаптеров VGA и SVGA)

14h

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

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

18h

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

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

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



Таблица параметров


Таблица параметров используется функциями BIOS для установки регистров видеоадаптера при изменении режимов его работы. Таблица содержит описания для каждого поддерживаемого адаптером режима (по 64 байта на каждый режим):

Смещение

Размер

0

Байт

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

1

-"-

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

2

-"-

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

3

Слово

Объем страницы видеопамяти в байтах

Синхронизатор

5

Байт

Регистр режима синхронизации (CMR)

6

-"-

Регистр разрешения записи цветового слоя (CPWER)

7

-"-

Регистр выбора знакогенератора (CGSR)

8

-"-

Регистр определения структуры памяти (MMR)

9

-"-

Регистр определения различных режимов работы (MOR)

Контроллер ЭЛТ

0Ah

Байт

Общая длина линии горизонтальной развертки (HTR)

0Bh

-"-

Длина отображаемой части горизонтальной развертки (HDER)

0Ch

-"-

Начало импульса гашения луча горизонтальной развертки (SHBR)

0Dh

-"-

Конец импульса гашения луча горизонтальной развертки (EHBR)

0Eh

-"-

Начало импульса горизонтального обратного хода луча (SHRR)

0Fh

-"-

Конец импульса горизонтального обратного хода луча (EHRR)

10h

-"-

Количество горизонтальных линий растра (VTR)

11h

-"-

Дополнительный регистр (OVR)

12h

-"-

Предварительная установка горизонтальной развертки (PRSR)

13h

-"-

Высота символов текста (MSLR)

14h

-"-

Начальная линия курсора (CSR)

15h

-"-

Конечная линия курсора (CER)

16-19h

4 Байта

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

1Ah

Байт

Начало обратного вертикального хода луча (VRSR)

1Bh

-"-

Конец обратного вертикального хода луча (VRER)

1Ch

-"-

Начало гашения вертикальной развертки (VDER)

1Dh

-"-

Логическая ширина экрана (OFR)

1Eh

-"-

Положение подчеркивания символа (ULR)

1Fh

-"-

Начало импульса гашения вертикальной развертки (SVBR)

20h

-"-

Конец импульса гашения вертикальной развертки (EVBR)

21h

-"-

Управление режимом (MCR)

22h

-"-

Разделение экрана монитора (LCR)

<
Контроллер атрибутов

23-32h
Байт
Регистры цветовой палитры (0-15) (CPR)
33h
-"-
Регистр управления режимом (MCR)
34h
-"-
Регистр цвета рамки экрана (SBCR)
35h
-"-
Регистр разрешения цветового слоя (CPER)
36h
-"-
Регистр горизонтального панорамирования (HPR)

Графический контроллер

37h
Байт
Регистр установки/сброса (SRR)
38h
-"-
Регистр разрешения установки/сброса (SRER)
39h
-"-
Регистр сравнения цветов (CCR)
3Ah
-"-
Регистр циклического сдвига и выбора функции (DRFS)
3Bh
-"-
Регистр выбора читаемого слоя (RPSR)
3Ch
-"-
Регистр режима работы (MDR)
3Dh
-"-
Регистр смешанного назначения (MIR)
3Eh
-"-
Регистр маскирования цветовых слоев (CDCR)
3Fh
-"-
Регистр битовой маски (BMR)

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

Смешение от начала таблицы параметров
Номер режима видеоадаптера
+00h
0h
+40h
1h
+80h
2h
+C0h
3h
+100h
4h
+140h
5h
+180h
6h
+1C0h
7h
+200h
8h
+240h
9h
+280h
Ah
+2C0h
Bh
+300h
Ch
+340h
Dh
+380h
Eh
+3C0h
Fh (адаптер EGA, имеющий 64 Кбайт памяти)
+400h
10h (адаптер EGA, имеющий 64 Кбайт памяти)
+440h
Fh
+480h
10h
+4C0h
0*h
+500h
1*h
+540h
2*h
+580h
3*h
+5C0h
0h+,1h+
+600h
2h+,3h+
+640h
7h+
+680h
11h
+6C0h
12h
+700h
13h

Таблица символов графического режима


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

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

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

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

Размер

0

Байт

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

1

Слово

Количество байт, используемых при определении одного символа шрифта

3

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

Указатель на таблицу символов

7

Массив байт переменной длины

Список режимов, использующих данную таблицу символов. На каждый номер режима отводится один байт. Должен оканчиваться числом 0FFh



Таблица символов текстового режима


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

Формат таблицы символов текстового режима:

Смещение (байт)

Размер

0

Байт

Количество байт, используемых для определения одного символа шрифта

1

Байт

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

2

Слово

Количество символов в таблице знакогенератора (обычно 256)

4

Слово

Номер первого символа, определяемого таблицей

6

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

Указатель на таблицу символов (см. описание INT 1Fh)

0Ah

Байт

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

0Bh

Массив байт переменной длины

Список режимов, использующих данную таблицу символов. На каждый номер режима отводится один байт. Должен оканчиваться числом 0FFh

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



Текстовый режим


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

Стандартные текстовые режимы работы видеоадаптеров позволяют вывести на экран 25 строк по 40 или 80 символов. Если перепрограммировать некоторые регистры видеоадаптера, то можно увеличить число отображаемых строк для адаптера EGA до 43, а для VGA до 50. Если в компьютере установлен видеоадаптер SVGA, вам могут быть доступны другие текстовые режимы - 80x60, 132x25, 132x43, 132x50, 132x60 символов.

Для кодирования каждого знакоместа экрана (символа) используются два байта. Первый из них содержит ASCII-код отображаемого символа, а второй - атрибуты символа (рис. 3.3). Атрибуты символа определяют его цвет и цвет фона.

PICTURE._FIG_21.PCX;6";4.308";PCX

Рисунок 3.3   Структура видеопамяти в текстовых режимах

ASCII-коды символов экрана располагаются в нулевом цветовом слое, а их атрибуты - в первом цветовом слое. Благодаря такому режиму хранения информации достигается значительная экономия памяти. При отображении символа на экране происходит преобразование его из формата ASCII в двумерный массив пикселов, выводимых на экран. Для этого преобразования используется таблица трансляции символов (таблица знакогенератора). Таблица знакогенератора хранится во втором слое видеопамяти (рис. 3.4).

PICTURE._FIG_06.PCX;6";4.308";PCX

Рисунок 3.4   Преобразование кода ASCII в образ символа на экране

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

PICTURE._FIG_22.PCX;6";4.308";PCX

Рисунок 3.5   Отображение цветовых слоев

Ниже приведен дамп видеопамяти в текстовом режиме с разрешением 80х25 символов:


Адрес           0  1   2   3  4   5   6   7  8   9   A  B   C   D  E  F    0123456789ABCDEF

-----------------------------------------------------------------------------

B800:0000  91 07 E2 07 E0 07 AE 07-AA 07 A0 07 20 07 AD 07   С.т.р.о.к.а. .н.

B800:0010  AE 07 AC 07 A5 07 E0 07-20 07 30 07 20 07 20 07   о.м.е.р. .0. . .

B800:0020  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0030  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0040  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0050  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0060  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0070  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0080  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0090  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:00A0  91 07 E2 07 E0 07 AE 07-AA 07 A0 07 20 07 AD 07   С.т.р.о.к.а. .н.

B800:00B0  AE 07 AC 07 A5 07 E0 07-20 07 31 07 20 07 20 07   о.м.е.р. .1. . .

B800:00C0  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:00D0  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:00E0  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:00F0  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0100  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0110  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0120  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

B800:0130  20 07 20 07 20 07 20 07-20 07 20 07 20 07 20 07    . . . . . . . .

Байты кодов символов из нулевого цветового слоя видеопамяти чередуются с байтами атрибутов символов из первого цветового слоя. Байты кодов символов расположены по четным адресам, а байты атрибутов, которые для данного участка видеопамяти имеют значение 07h - по нечетным.


Улучшенный цветной монитор


D0    Голубой.

D1    Зеленый.

D2    Красный.

D3    Второй голубой.

D4    Второй зеленый.

D5    Второй красный.

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



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


Центральный процессор получает доступ к видеопамяти адаптера через окно небольшого размера. Функция 4F05h позволяет позиционировать окно по видеопамяти и определять его текущее положение. Окно может позиционироваться с определенным шагом.

Функция 4F05h содержит две подфункции, выбираемые регистром BH. Первая подфункция BH = 0 позволяет переместить окно в определенную позицию. Вторая подфункция BH = 1 определяет текущее положение окна.

На входе:

AH

4Fh

AL

05h

BL

Номер окна: 0 - окно A, 1 - окно B

BH

00h выбор окна видеопамяти

DX

Адрес окна видеопамяти (в единицах шага)

BH

01h определить адрес окна видеопамяти

DX

Адрес окна видеопамяти (в единицах шага)

На выходе:

AL

4Fh

AH

Результат: 0, в случае успешного завершения, 1 в случае ошибки



Управление атрибутом мигания и атрибутом интенсивности - подфункция 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 );

}



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


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

На входе:

AH

12h

BL

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

AL

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

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

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

На выходе:

AL

12h



Управление монитором


Многие современные мониторы позволяют временно отключать свои подсистемы, резко уменьшая потребление электроэнергии. Для обеспечения этой особенности монитор видеоадаптер должен соответствовать спецификации Energy Star и Display Power Management Signaling (DPMS).

Мы опишем несколько функций VBE/PM (VESA Display BIOS Extensions/Power Management) версии 1.0. С помощью них вы сможете определить, какие режимы экономии электроэнергии обеспечивает ваша видеосистема и выбрать любой из этих режимов.

В спецификации VBE/PM 1.0 различают следующие режимы:

Режим

Описание

ON

Обычный режим монитора

STANDBY

Гаснет изображение на экране монитора. Режим STANDBY доступен для всех типов мониторов

REDUSED ON

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

SUSPEND

Отключаются строчная развертка. Монитор переходит в режим экономии электроэнергии первого уровня (см. описание вашего монитора). Чтобы видеоадаптер мог установить режим SUSPEND, необходимо, чтобы монитор соответствовал стандарту Energy Star

OFF

Монитор отключаются полностью. Работает необходимый минимум схем монитора, позволяющий снова его включить. Монитор должен соответствовать стандарту Energy Star



Управление преобразованием серого цвета - подфункция 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



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


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

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

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

Назначение

0

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

1

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

2

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

3

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

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

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

Назначение

7

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

8

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

9

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

10h

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

12h

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

13h

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

15h

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

17h

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

1Ah

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

1Bh

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



Управление режимом (Mode Control Register - MCR) (индекс17h)


Регистр содержит набор битов, управляющих контроллером ЭЛТ.

D7    Бит D7 запрещает горизонтальный и вертикальный обратный ход луча.

D6    Если бит D6 равен единице, то установлен байтовый режим, а если он равен нулю - двухбайтовый. Двухбайтовый режим поддерживает разделение данных между двумя цветовыми слоями. Видеоадаптеры VGA и SVGA дополнительно поддерживают четырехбайтовый режим (см. регистр ULR).

Биты D6 D5

00

01

MA0

MA13

MA15

MA1

MA0

MA0

MA2

MA1

MA1

MA3

MA2

MA2

MA4

MA3

MA3

MA5

MA4

MA4

MA6

MA5

MA5

MA7

MA6

MA6

MA8

MA7

MA7

MA9

MA8

MA8

MA10

MA9

MA9

MA11

MA10

MA10

MA12

MA11

MA11

MA13

MA12

MA12

MA14

MA13

MA13

MA15

MA14

MA14

Бит D5 равен нулю только для видеоадаптеров EGA с объемом видеопамяти 64 Кбайт. В этом случае происходит сцепление слоев в графических режимах с высоким разрешением.

D4    Если бит D4 равен единице, то все выходные линии контроллера ЭЛТ переводятся в третье состояние. Этот бит используется при тестировании видеоадаптера.

D3    Если бит D3 равен нулю, то счетчик адреса регенерации изображения увеличивается на единицу на каждое знакоместо экрана, а если бит равен единице, то на каждые два знакоместа.

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

D1    Используется для эмуляции графических режимов видеоадаптера Hercules. Запись нуля в этот бит приводит к замещению бита D14 адресного регистра битом D1 из регистра счетчика горизонтальных линий.

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



Установить/определить длину строки развертки


Функция 4F06h содержит две подфункции, выбираемые регистром BH. Первая подфункция BL = 0 позволяет установить логическую длину строки развертки больше чем физически может поместиться на экране. Такая возможность полезна для организации плавной свертки экрана.

Вторая подфункция BL = 1 определяет длину строки развертки.

На входе:

AH

4Fh

AL

06h

BL

00h установить длину строки развертки

CX

Требуемая длинна строки развертки в пикселах

BL

01h определить длину строки развертки

На выходе:

AL

4Fh

AH

Результат: 0, в случае успешного завершения, 1 в случае ошибки

BX

Количество байт на строку развертки

CX

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

DX

Максимальное количество строк развертки

       Если запрашивается длинна строки развертки, которая не поддерживается, тогда устанавливается первое возможное значение, большее запрашиваемого

       Линия развертки может быть шире видимой области экрана

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