EGA и VGA содержат на своей плате до 256К байт оперативной памяти, разделенной на четыре банка или, другими словами, на четыре цветовых слоя. Эти банки памяти размещаются в одном адресном пространстве. Таким образом, что по каждому адресу расположено четыре байта (по байту в каждом банке памяти). Какой из банков памяти используется для записи или чтения данных процессором, определяется при помощи установки нескольких регистров адаптера. Так как все четыре банка памяти находятся в одном адресном пространстве, то процессор может производить запись во все четыре банка за один цикл записи. Благодаря этому некоторые операции, например заполнение экрана, происходят с большой скоростью. В том случае, когда запись во все четыре банка памяти нежелательна, можно запрещать или разрешать запись в отдельные слои памяти при помощи регистра разрешения записи цветового слоя.
Для операции чтения в каждый момент времени может быть разрешен только один цветовой слой. Читаемый слой определяется регистром выбора читаемого цветового слоя. В большинстве режимов видеоадаптеров видеопамять также разделена на несколько страниц. При этом одна из них является активной и отображается на экране. При помощи функций BIOS или программирования регистров видеоадаптера можно переключать активные страницы видеопамяти. Вывод информации можно производить как в активную, так и в неактивные страницы памяти.
Таким образом, можно заранее подготовить несколько страниц памяти (несколько экранов), а затем быстро сменять их на экране дисплея. Текстовый режим. В текстовых режимах на экране могут отображаться только текстовые символы, а также символы псевдографики. Текстовые режимы работы видеоадаптеров рекомендуется использовать всегда, когда приложению не нужно выводить на экран графическую информацию. Стандартные текстовые режимы работы видеоадаптеров позволяют вывести на экран 25 строк по 40 или 80 символов. Если перепрограммировать некоторые регистры видеоадаптера, то можно увеличить число отображаемых строк для EGA до 43, а для VGA до 50. Для кодирования каждого знакоместа экрана (символа) используются два байта. Первый из них содержит ASCII-код отображаемого символа, а второй - атрибуты символа. ASCII-коды символов экрана располагаются в нулевом цветовом слое, а их атрибуты - в первом цветовом слое.
Атрибуты определяют цвет символа и цвет фона. Благодаря такому режиму хранения информации достигается значительная экономия памяти. При отображении символа на экране происходит преобразование его из формата ASCII в двумерный массив пикселей, выводимых на экран. Для этого преобразования используется таблица трансляции символов (таблица знакогенератора). Данная таблица знакогенератора хранится во втором слое видеопамяти:
Видеопамять в графических режимах
Распределение видеопамяти в графических режимах работы видеоадаптеров отличается от распределения видеопамяти в текстовых режимах. Если вы желаете в дальнейшем изучить программирование видеоадаптеров на уровне регистров, то вам необходимо полное понимание структуры видеопамяти.
Ниже рассмотрена структура видеопамяти отдельно для каждого графического режима.
Режимы 4 и 5
Это режимы низкого разрешения (320х200), используются 4 цвета. Поддерживаются видеоадаптерами CGA, EGA и VGA. У адаптеров EGA и VGA видеоданные расположены в нулевом цветовом слое. Остальные три цветовых слоя не используются. Для совместимости с видеоадаптером CGA, отображение видеопамяти на экран не является непрерывным: первая половина видеопамяти (начальный адрес B800:0000) содержит данные относительно всех нечетных линий экрана, а вторая половина (начальный адрес B800:2000) - относительно всех четных линий. Каждому пикселу изображения соответствуют два бита видеопамяти. За верхний левый пиксел экрана отвечают биты D7 и D6 нулевого байта видеопамяти. На рисунке изображено соответствие видеопамяти пикселам экрана.
Следующие формулы позволяют определить смещение байта от начала станицы видеопамяти и номера битов в нем, управляющие пикселом с координатами (x,y):
Если y четное число, то смещение байта = 50h*(y/2)+(x/4)
Если y нечетное число, то смещение байта = 2000h+50h*((y-1)/2)+(x/4)
Номер первого бита = 7-mod(x/4)*2
Ниже представлена таблица соответствия значений битов, определяющих пиксел цвету пиксела:
Значение битов пиксела |
Стандартный цвет |
Альтернативный цвет |
00 |
черный |
черный |
01 |
светло-синий |
зеленый |
10 |
малиновый |
красный |
11 |
ярко-белый |
коричневый |
Режим 10h
Графический цветной режим с разрешением 640х350 пикселов. Данный режим поддерживают только видеоадаптеры EGA и VGA. Для хранения видеоданных используются четыре цветовых слоя. Каждому пикселу соответствует по одному биту из каждого цветового слоя. Четыре бита на пиксел позволяют отображать 16 различных цветов. Запись в каждый из этих четырех слоев можно разрешить или запретить при помощи регистра разрешения записи цветового слоя. На рисунке представлена cтруктура видеопамяти для этого режима.
Если вы хотите выводить информацию на экран дисплея непосредственно через видеопамять, то необходимо уметь определять биты, которые управляют каждым пикселом изображения. Следующие формулы позволяют определить смещение байта от начала станицы видеопамяти и номер бита в нем, управляющего пикселом с координатами (x,y):
Смещение байта = 50h*y+x/8
Номер бита = 7-mod(x/8)