- •Аннотация
- •Введение
- •Как связаться с авторами
- •Благодарности
- •Замечания
- •1. Видеоподсистема компьютера
- •Мониторы
- •2. Режимы работы видеоадаптеров
- •Режимы 0 и 1
- •Режимы 0*, 1*
- •Режимы 2 и 3
- •Режимы 2*, 3*
- •Режимы 4 и 5
- •Режим 6
- •Режим 7
- •Режимы 8, 9, 0Ah
- •Режим 0Dh
- •Режим 0Eh
- •Режим 0Fh
- •Режим 10h
- •Режим 11h
- •Режим 12h
- •Режим 13h
- •3. Архитектура видеоадаптеров ega и vga
- •Монитор
- •Видеопамять
- •Текстовый режим
- •Знакогенератор
- •Атрибуты символов
- •Атрибуты символов (монохромный режим)
- •Видеопамять в графических режимах
- •Режимы 4 и 5
- •Режим 6
- •Режимы 0Dh и 0Eh
- •Режим 0Fh
- •Режим 10h
- •Режим 11h
- •Режим 12h
- •Режим 13h
- •Графический контроллер
- •Операция записи
- •Операция чтения
- •Последовательный преобразователь
- •Контроллер атрибутов
- •Контроллер элт
- •Синхронизатор
- •4. Регистры видеоадаптеров ega, vga и svga
- •Краткий обзор
- •Внешние регистры
- •Регистр определения различных режимов работы (Miscellaneous Output Register - mor)
- •Регистр управления дополнительным устройством (Feature Control Register - fcr)
- •Регистр состояния 0 (Input Status Register 0 - isr0)
- •Регистр состояния 1 (Input Status Register 1 - isr0)
- •Регистр разрешения работы системы vga (vga Enable Register - vga_er)
- •Регистр сброса триггера-защелки светового пера (Light Pen Latch Reset Register - lplrr)
- •Регистр установки триггера-защелки светового пера (Light Pen Latch Set Register - lplsr)
- •Регистры контроллера элт
- •Общая длина линии горизонтальной развертки (Horizontal Total Register - htr) (индекс 0)
- •Длина отображаемой части горизонтальной развертки (Horizontal Display Enable End Register - hder) (индекс 1)
- •Начало импульса гашения луча горизонтальной развертки (Start Horizontal Blank Register - shbr) (индекс 2)
- •Конец импульса гашения луча горизонтальной развертки (End Horizontal Blank Register - ehbr) (индекс 3)
- •Начало импульса горизонтального обратного хода луча (Start Horizontal Retrace Register - shrr) (индекс 4)
- •Конец импульса горизонтального обратного хода луча (End Horizontal Retrace Register - ehrr) (индекс 5)
- •Число горизонтальных линий растра (Vertical Total Register - vtr) (индекс 6)
- •Дополнительный регистр (Overflow Register - ovr) (индекс 7)
- •Предварительная установка горизонтальной развертки (Preset Row Scan Register - prsr) (индекс 8)
- •Высота символов текста (Max Scan Line Register - mslr) (индекс 9)
- •Начальная линия курсора (Cursor Start Register - csr) (индекс 0Ah)
- •Конечная линия курсора (Cursor End Register - cer) (индекс 0Bh)
- •Регистры начального адреса
- •Регистры, определяющие положение курсора
- •Начало обратного вертикального хода луча (Vertical Retrace Start Register - vrsr) (индекс 10h)
- •Конец обратного вертикального хода луча (Vertical Retrace End Register - vrer) (индекс 11h)
- •Регистр адреса светового пера (Light Pen Address Register - lpar)
- •Завершение отображения вертикальной развертки (Vertical Display End Register - vder) (индекс 12h)
- •Логическая ширина экрана (Offset Register - ofr) (индекс 13h)
- •Положение подчеркивания символа (Underline Location Register - ulr) (индекс 14h)
- •Начало импульса гашения вертикальной развертки (Start Vertical Blank Register - svbr) (индекс 15h)
- •Конец импульса гашения вертикальной развертки (End Vertical Blank Register - evbr) (индекс 16h)
- •Управление режимом (Mode Control Register - mcr) (индекс 17h)
- •Регистр сравнения линий (Line Compare Register - lcr) (индекс 18h)
- •Регистры синхронизатора
- •Регистр сброса синхронизатора (Reset Register - rr) (индекс 0)
- •Регистр режима синхронизации (Clock Mode Register - cmr) (индекс 1)
- •Регистр разрешения записи цветового слоя (Color Plane Write Enable - cpwe) (индекс 2)
- •Регистр выбора знакогенератора (Character Generator Select Register - cgsr) (индекс 3)
- •Регистр определения структуры памяти (Memory Mode Register - mmr) (индекс 4)
- •Регистры графического контроллера
- •Регистр установки/сброса (Set/Reset Register - srr) (индекс 0)
- •Регистр разрешения установки/сброса (Set/Reset Enable Register - srer) (индекс 1)
- •Регистр сравнения цветов (Color Compare Register - ccr) (индекс 2)
- •Регистр циклического сдвига и выбора функции (Data Rotate & Function Select - drfs) (индекс 3)
- •Регистр выбора читаемого слоя (Read Plane Select Register - rpsr) (индекс 4)
- •Регистр режима работы (Mode Register - mdr) (индекс 5)
- •Регистр смешанного назначения (Miscellaneous Register - mir) (индекс 6)
- •Регистр маскирования цветовых слоев (Color Don't Care Register - cdcr) (индекс 7)
- •Регистр битовой маски (Bit Mask Register - bmr) (индекс 8)
- •Регистры контроллера атрибутов
- •Регистры цветовой палитры (0-15) (Color Palette Register's - cpr)
- •Улучшенный цветной монитор
- •Регистр цвета рамки экрана (Screen Border Color Register - sbcr) (индекс 11)
- •Регистр разрешения цветового слоя (Color Plane Enable Register - cper) (индекс 12)
- •Регистр горизонтального панорамирования (Horizontal Panning Register - hpr) (индекс 13)
- •Регистр выбора цвета (Color Select Register - csr) (индекс 14)
- •Регистры цифро-аналогового преобразователя vga
- •Регистр маскирования пикселов (Pixel Mask Register - pmr)
- •Регистр состояния цап (dac State Register - dac_sr)
- •Индекс читаемого регистра таблицы цветов (Look-up Table Read Index Register - ltrir)
- •Индекс записываемого регистра таблицы цветов (Look-up Table Write Index Register - ltwir)
- •Регистр данных таблицы цветов (Look-up Table Data Register - ltdr)
- •Нестандартные режимы видеоадаптера vga
- •Организация видеопамяти
- •Режим 320х400 пикселов, 256 цветов
- •Режим 360х480 пикселов, 256 цветов
- •5. Использование функций bios для работы с видеоадаптерами
- •Выбор режима работы - функция 00h
- •Изменение формы курсора - функция 01h
- •Изменение положения курсора - функция 02h
- •Определение положения и формы курсора - функция 03h
- •Использование светового пера - функция 04h
- •Выбор активной страницы видеопамяти - функция 05h
- •Свертка окна вверх - функция 06h
- •Свертка текстового окна вниз - функция 07h
- •Чтение символа и его атрибутов - функция 08h
- •Запись символа с атрибутами в текущей позиции курсора - функция 09h
- •Запись символа в текущей позиции курсора - функция 0Ah
- •Установка цветовой палитры (режимы 4,5,6) - функция 0Bh
- •Вывод пиксела - функция 0Ch
- •Чтение пиксела - функция 0Dh
- •Запись символа в режиме телетайпа - функция 0Eh
- •Определение текущего режима работы видеоадаптера - функция 0Fh
- •Управление регистрами палитры - функция 10h
- •Установка регистра палитры - подфункция 00h
- •Установка цвета рамки - подфункция 01h
- •Установка всех регистров палитры - подфункция 02h
- •Управление атрибутом мигания и атрибутом интенсивности - подфункция 03h
- •Чтение регистра палитры - подфункция 07h
- •Чтение регистра цвета рамки - подфункция 08h
- •Чтение всех регистров палитры - подфункция 09h
- •Установка регистра таблицы цветов (регистров цап) - подфункция 10h
- •Установка нескольких регистров таблицы цветов (регистров цап) - подфункция 12h
- •Выбор подмножества цветов - подфункция 13h ???
- •Чтение регистра таблицы цветов - подфункция 15h
- •Чтение нескольких регистров таблицы цветов (регистров цап) - подфункция 17h
- •Определение режима подмножества цветов - подфункция 1Ah ???
- •Установка палитры из градаций серого цвета - подфункция 1Bh
- •Загрузка таблиц знакогенератора - функция 11h
- •Загрузка набора символов пользователя - подфункция 00h
- •Загрузка набора символов из bios - подфункция 01h
- •Загрузка набора символов из bios - подфункция 02h
- •Выбор активных таблиц знакогенератора - подфункция 03h
- •Загрузка набора символов из bios - подфункция 04h
- •Установка вектора прерывания 1Fh - подфункция 20h
- •Установка набора символов для графических режимов - подфункция 21h
- •Установка набора символов 8х14 из пзу bios
- •Установка набора символов 8х8 из пзу bios
- •Установка набора символов 8х16 из пзу bios
- •Получение информации об используемом наборе символов - подфункция 30h
- •Определение конфигурации и выбор программы распечатки экрана - функция 12h
- •Определение конфигурации видеоадаптера - подфункция 10h
- •Выбор программы печати экрана - подфункция 20h
- •Выбор количества линий развертки в текстовом режиме - подфункция 30h
- •Запрещение переустановки палитры - подфункция 31h
- •Управление доступом к видеоадаптеру - подфункция 32h
- •Управление преобразованием серого цвета - подфункция 33h
- •Эмуляция курсора cga - подфункция 34h
- •Выбор активного монитора - подфункция 35h
- •Гашение экрана монитора - подфункция 36h
- •Вывод текстовой строки - функция 13h
- •Чтение/запись конфигурации видеосистемы - функция 1Ah
- •Чтение конфигурации видеосистемы - подфункция 00h
- •Запись конфигурации видеосистемы - подфункция 01h
- •Получение данных о состоянии vga - функция 1Bh
- •Сохранение/восстановление состояния видеоадаптера - функция 1Ch
- •Определение размера буфера - подфункция 00h
- •Сохранение текущего состояния видеоадаптера - подфункция 01h
- •Восстановление текущего состояния видеоадаптера - подфункция 02h
- •Русификация видеоадаптеров
- •6. Область данных видеофункций bios
- •Переменные в младших адресах памяти
- •Область сохранения
- •Дополнительная таблица окружения
- •Вторая таблица символов текстового режима
- •7. Видеоадаптеры svga
- •Видеопамять svga
- •Слоеный пирог
- •Увидеть весь мир через замочную скважину
- •Больше цветов больше бит
- •Стандарт vesa
- •Получить информацию о реализации vbe и видеоадаптере
- •Получить информацию о режиме видеоадаптера
- •Установить режим видеоадаптера
- •Определить текущий режим видеоадаптера
- •Сохранить/восстановить состояние видеоадаптера
- •Управление адресацией видеопамяти
- •Установить/определить длину строки развертки
- •Установить/определить видимую область экрана
- •Установить/определить размер регистров цап
- •Управление монитором
- •Определение возможностей управления
- •Включить режим сохранения электроэнергии
- •Определить состояние монитора
- •8. Использование функций ms-dos для управления видеоадаптерами
- •Функция puts
- •Функция printf
- •Функция putch
- •Функция cputs
- •Функция cprintf
- •Литература
- •Оглавление
- •5. Использование функций bios для работы с видеоадаптерами 100
- •6. Область данных видеофункций bios 152
- •7. Видеоадаптеры svga 159
- •8. Использование функций ms-dos для управления видеоадаптерами 175
- •9. Стандартные функции вывода языка Си 176
Регистр разрешения работы системы vga (vga Enable Register - vga_er)
Данный регистр имеет адрес 3С3h. Регистр используется только видеоадаптерами VGA и SVGA. Биты D1-D7 зарезервированы, а бит D0 управляет работой адаптера. Если бит D0 равен нулю, тогда запрещен доступ к видеопамяти и портам ввода/вывода видеоадаптера (кроме регистра VGA_ER).
Регистр сброса триггера-защелки светового пера (Light Pen Latch Reset Register - lplrr)
В цветных режимах регистр LPLRR доступен через порт 3DBh, а в монохромных режимах через порт 3BBh. Регистр используется только видеоадаптерами CGA и EGA. Любая операция записи в регистр LPLRR сбрасывает триггер-защелку светового пера.
Регистр установки триггера-защелки светового пера (Light Pen Latch Set Register - lplsr)
В цветных режимах регистр LPLSR доступен через порт 3DCh, а в монохромных режимах через порт 3BCh. Регистр используется только видеоадаптерами CGA и EGA. Любая операция записи в этот регистр вызывает установку триггера-защелки светового пера.
Регистры контроллера элт
Регистры контроллера ЭЛТ управляют сигналами синхронизации, необходимыми для формирования растра, определяют формат данных на экране и форму курсора. Для видеоадаптеров 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 |
Чтобы вычислить, сколько пикселов помещается на каждой строке развертки разделите частоту вывода точек на частоту горизонтальной развертки. Затем разделите полученное значение на 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) |
В отличие от внешних регистров, адресация к регистрам контроллера ЭЛТ происходит через два порта. В первый порт (индексный) записывается индекс регистра, к которому осуществляется доступ, а через второй порт (порт данных) можно выполнять обмен данными (запись или чтение).
M Большинство регистров контроллера ЭЛТ видеоадаптера 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]
Так как адреса портов индексного регистра и регистра данных контроллера ЭЛТ является смежными, то адрес порта регистра данных можно легко получить, прибавив единицу к адресу порта индексного регистра.