Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование видеоадаптеров EGA, VGA и SVGA.doc
Скачиваний:
139
Добавлен:
01.05.2014
Размер:
4.51 Mб
Скачать

Синхронизатор

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

PICTURE._FIG_17.PCX;6";4.308";PCX

Рисунок 3.18 Разрешение записи в цветовые слои

Процессор передает видеоадаптеру данные для записи в видеопамять. Они проходят через графический контроллер и попадают в синхронизатор. Графический контроллер выполняет над данными, записываемыми в видеопамять, операции, определяемые состоянием его регистров (смотри главу "Исполнение видеоадаптером операции записи" из раздела "Графический контроллер").

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

4. Регистры видеоадаптеров ega, vga и svga

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

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

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

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

Краткий обзор

Видеоадаптеры EGA, VGA и SVGA имеют большое количество регистров. Адаптер EGA имеет около шестидесяти регистров, а VGA и SVGA еще больше. Большая часть регистров EGA доступна только для записи, что создает определенные проблемы, особенно для мультизадачных систем.

Некоторые фирмы-изготовители видеоадаптеров выпускают платы видеоадаптеров совместимые с EGA, для регистров которых разрешена также и операция чтения. В адаптерах VGA и SVGA практически все регистры доступны как для записи, так и для чтения.

w В тех случаях, когда видеоадаптеры SVGA и VGA имеют отличия от EGA, мы будем на это специально указывать.

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

Заметим, что в различных режимах работы видеоадаптера, его регистры могут иметь различные адреса.

Приведем список адресов регистров в монохромных режимах:

Адрес

Регистр

3C2h

Регистр определения различных режимов работы (Miscellaneous Output Register - MOR),

Регистр состояния 0 (Input Status Register 0 - ISR0)

3BAh

Регистр управления дополнительным устройством (Feature Control Register),

Регистр состояния 1 (Input Status Register 1 - ISR1)

3BBh

Регистр очистки защелки светового пера (Clear Light Pen Latch Register- CLPLR)

3BCh

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

3C4h, 3C5h

Регистры синхронизатора (Sequencer Register's - SR)

3B4h, 3B5h

Регистры контроллера ЭЛТ (CRT Controller Register's - CRT_CR)

3CAh, 3CCh, 3CEh, 3CFh

Регистры графического контроллера (Graphics Controller Register's - GCR)

3C0h

Регистр контроллера атрибутов (Attribute Controller Register - ACR)

3C3h

Регистр разрешения работы системы VGA (VGA Enable Register - VGA_ER)

3C6h, 3C7h, 3C8h, 3C9h

Регистры цифро-аналогового преобразователя (ЦАП) VGA (VGA Video DAC Register - VGA_DAC_R)

А теперь перечислим адреса тех же регистров, но уже для цветных режимов видеоадаптера:

Адрес

Регистр

3C2h

Регистр определения различных режимов работы (Miscellaneous Output Register - MOR),

Регистр состояния 0 (Input Status Register 0 - ISR0)

3DAh

Регистр управления дополнительным устройством Feature Control Register),

Регистр состояния 1 (Input Status Register 1 - ISR1)

3DBh

Регистр очистки защелки светового пера (Clear Light Pen Latch Register- CLPLR)

3DCh

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

3C4h, 3C5h

Регистры синхронизатора (Sequencer Register's - SR)

3D4h, 3D5h

Регистры контроллера ЭЛТ (CRT Controller Register's - CRT_CR)

3CAh, 3CCh, 3CEh, 3CFh

Регистры графического контроллера (Graphics Controller Register's - GCR)

3C0h

Регистр контроллера атрибутов (Attribute Controller Register - ACR)

3C3h

Регистр разрешения работы системы VGA (VGA Enable Register - VGA_ER)

3C6h, 3C7h, 3C8h, 3C9h

Регистры ЦАП VGA (VGA Video DAC Register - VGA_DAC_R)

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

Номер режима работы

Адрес памяти

0,1,2,3,4,5,6

B000:8000h-B000:FFFFh

7

B000:0000h-B000:7FFFh

0Dh,0Eh,0Fh,10h,11h,12h,13h

A000:0000h-A000:FFFFh

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

Чтобы узнать номер текущего режима видеоадаптера, используется функция 0Fh прерывания INT 10h. Пример вызова данной функции представлен в листинге 4.1.

Листинг 4.1. Файл SEGVMEM.C

// Файл SYSP.H представлен в листинге 3.2 #include "sysp.h" unsigned GetSegVmem(void) { unsigned char mode; unsigned seg_address; // Определяем текущий режим видеоадаптера _asm { mov ah,0Fh int 10h mov mode,al } // Если видеоадаптер находится в режимах 0, 1, 2, 3, // 4, 5, 6 то видеопамять начинается с сегмента B800h if((mode >= 0) && (mode <= 6)) seg_address = 0xB800; // Если видеоадаптер находится в режиме 7, // то видеопамять начинается с сегмента B000h else if(mode == 7) seg_address = 0xB000; // Если видеоадаптер находится в режимах 0Dh - 13h, // то видеопамять начинается с сегмента A000h else if((mode >= 0x0D) && (mode <= 0x13)) seg_address = 0xA000; // Если видеоадаптер не находится в стандартном режиме // возвращаем ноль else seg_address = 0x0; return(seg_address); }

Ниже подробно рассмотрены регистры видеоадаптеров EGA и VGA. Мы выделили следующие группы регистров:

w Внешние регистры

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

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

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

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

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