Кодирование данных в графических режимах

В графических режимах каждый блок видеопамяти описывает один пиксел, причем размер блока определяется количеством отображаемых цветов (или градаций серого цвета). Например, в монохромных (двухцветных) режимах №6 и 11h для описания пиксела достаточно одного бита, в 4-цветных режимах №4, №5 и 0Fh – двух битов, в 16-цветных режимах №0D, №0E, №10h и №12h – четырех битов, а в 256-цветном режиме №13h для описания пиксела потребуется один байт.

Таким образом, одним байтом видеопамяти может быть описано от 1 до 8 пикселов, причем старшие биты байта отвечают за «левые» пикселы, а младшие – за «правые». Например, цвет левого верхнего пиксела экрана кодируется: в режимах №6 и 11h - старшим битом, в режимах №4 и №5 - двумя старшими битами, а в режиме №13h – всеми восемью битами нулевого байта видеостраницы.

Размер видеостраницы определяется разрешающей способностью (количеством пикселов на экране) и размером блока, описывающего один пиксел. Например, в режимах №4 и №5[12] (4 цвета, разрешение 320 х 200) и в режиме №6 (2 цвета, разрешение 640 х 200) для одной видеостраницы потребуется 16000 байт (фактически – 16 Кб). В этих режимах объема видеопамяти достаточно для размещения двух страниц, однако адаптеры CGA, EGA и VGA поддерживают в этих режимах одну страницу с начальным адресом B800:0000. В режиме №13h (256 цветов, разрешение 320 х 200) одна страница занимает 64 Кбайт, то есть целый банк видеопамяти, располагающийся с адреса A000:0000.

Знакогенераторы

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

Графический образ каждого символа описывается битовой матрицей, размерность которой определяется разрешающей способностью видеосистемы и различна для разных видеоадаптеров (CGA – 8х8, EGA – 8х8 и 8х14, VGA – 9х16). Каждый узел матрицы описывается одним битом, при этом единичное значение бита соответствует активному (светлому) пикселу, а нулевое – пассивному (темному).

Следующий рисунок иллюстрирует описание графического образа символа «А» для видеоадаптера CGA.

Образ символа Коды строки матрицы
                0000 0000 00h
        n n n   0000 1110 0Eh
      n     n   0001 0010 12h
    n       n   0010 0010 22h
    n n n n n   0011 1110 3Eh
    n       n   0010 0010 22h
    n       n   0010 0010 22h
    n       n   0010 0010 22h

Рисунок 3.2 - Описание символа битовой матрицей 8х8

Как видно из рисунка, для описания одного символа матрицей 8х8 требуется блок памяти размером в 8 байтов – по одному байту на каждую строку матрицы. Так, символ «А» будет описан следующей последовательностью байтов: 00h, 0Eh, 12h, 22h, 3Eh, 22h, 22, 22h.

При использовании матрицы 8х14 (EGA) для описания одного символа достаточно 14 последовательных байтов, а при использовании матрицы 9х16 (VGA) – 16 байтов (по одному байту на строку матрицы)[13].

В таблице знакогенератора блоки описаний символов расположены в порядке возрастания их ASCII-кодов. При этом адрес блока (смещение относительно начала таблицы знакогенератора) может быть вычислен по формуле : m * <Код символа>, где m – число байтов, отводимых для описания одного символа.

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

Таблицы знакогенераторов EGA / VGA для символов с кодами от 0 до 255 хранятся в ROM BIOS и доступны по вектору прерывания 43h. EGA поддерживает 4 различных таблицы, а VGA – 8 таблиц, при этом одновременно могут быть активны две любые таблицы, что позволяет отображать на экране до 512 различных символов[14].

Таблицы знакогенератора автоматически загружаются в видеопамять (во второй «цветовой слой») при выборе любого из текстовых режимов, что позволяет программно заменить стандартную таблицу знакогенератора своей собственной. BIOS EGA/VGA содержит специальную функцию, управляющую загрузкой шрифтов (функция 11h прерывания 10h).

Лабораторная работа №6