Регистр установки триггера-защелки светового пера (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
|
1х
|
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
|
Максимальное количество строк развертки
|
Если запрашивается длинна строки развертки, которая не поддерживается, тогда устанавливается первое возможное значение, большее запрашиваемого
Линия развертки может быть шире видимой области экрана
Данная функция доступна в текстовых режимах, при условии, что значения длинны строки развертки и количества строк развертки умножаются на соответствующие значения размера символов