Программирование видеоадаптеров CGA, EGA и VGA© Александр Фролов, Григорий ФроловТом 3, М.: Диалог-МИФИ, 1992, 287 стр. 7.2. Внешние регистрыЭти регистры называются внешними, так как в видеоадаптере EGA они не принадлежат центральной микросхеме, содержащей контроллер атрибутов, контроллер ЭЛТ, графический контроллер и преобразователь последовательности. В адаптере VGA все регистры находятся на одной микросхеме, но эти регистры традиционно называют "внешними". Заметим, что в отличие от остальных регистров, внешние регистры адресуются непосредственно по адресам своих портов, без использования индексного регистра. Регистр определения различных режимов работы
|
D3 | D2 | Режим |
0 | 0 | 640 столбцов (или 320 столбцов) |
0 | 1 | 720 столбцов |
1 | 0 | внешний генератор (доступен через разъем дополнительного устройства) |
1 | 1 | зарезервированно |
Таблица 8.5 Установка битов D3 и D2.
- D1 Разрешение доступа к видеопамяти. Данный бит может быть запретить доступ процессора к видеопамяти для операций чтения и записи. Если бит равен нулю, то доступ к видеопамяти запрещен. Хотя процессор при запрещении доступа к видеопамяти не может обращаться к ней, циклы регенерации все равно будут выполняться. И содержимое видеопамяти не разрушится.
- D0 Выбор адресов ввода/вывода. Бит D0 определяет адрес регистра управления дополнительным устройством (Feature Control Register), регистра состояния 1 (Input Status Register 1) и регистров контроллера ЭЛТ (CRT Controller). Когда данный бит равен нулю, происходит выбор адресного пространства монохромного режима (3Bхh). Если бит равен единице, то используется адресное пространство цветного режима работы видеоадаптера (3Dхh).
Данные, первоначально записываемые BIOS в этот
регистр зависят от режима работы видеоадаптера:
Режим | 0-6,0Dh,0Eh | 7 | Fh | 10h |
Содержимое регистра | 23h | 0A6h | 0A2h | 0A7h |
Регистр управления дополнительным
устройством
(Feature Control Register - FCR)
Для видеоадаптера EGA биты D1 и D0 данного регистра передают сигналы на разъем дополнительного устройства, соответственно, на линии FC0 (вывод 21) и FC1 (вывод 20) разъема. Этот регистр не используется для VGA, но бит D3 должен содержать ноль.
Адрес порта ввода/вывода данного регистра зависит от режима видеоадаптера. В монохромном режиме адрес порта 3BAh, а в цветном - 3DAh.
Регистр доступен только для записи, но VGA позволяет прочитать его содержимое через порт 3CAh.
Регистр состояния 0
(Input Status Register 0 - ISR0)
Данный регистр, имеющий адрес 3C2h, доступен только для чтения.
Регистр позволяет получить различную информацию от видеоадаптера EGA. Формат регистра приведен ниже:
3-D0 Не используются. 4 Состояние переключателей. 5 Бит 0 дополнительного устройства (FEAT0). 6 Бит 1 дополнительного устройства (FEAT1). 7 Бит прерывания от ЭЛТ.
- D7 Бит прерывания от ЭЛТ. Бит установлен в 1, когда произошло вертикальное прерывание (по линии IRQ2) из-за обратного вертикального хода луча по кадру (погашеный луч перемещается из правого нижнего угла экрана в левый верхний). Этот бит устанавливается в начале обратного вертикального хода луча и сбрасывается записью в регистр конца вертикального хода луча.
- D6 Бит 1 дополнительного устройства. Используется только EGA. Бит регистра подключен к 17-му выводу разъема дополнительного устройства.
- D5 Бит 0 дополнительного устройства. Используется только EGA. Бит регистра подключен к 19-му выводу разъема дополнительного устройства.
- D4 Состояние переключателей. При помощи данного бита регистра, BIOS EGA считывает состояние четырех переключателей, находящихся на плате видеоадаптера и определяющих его конфигурацию. Номер считываемого переключателя задается двумя битами выбора частоты (Бтиы D2 и D3) регистра определения различных режимов работы (MOR), согласно следующей таблице:
Бит D3 | Бит D2 | Считываемый переключатель |
0 | 0 | переключатель 1 |
0 | 1 | переключатель 2 |
1 | 0 | переключатель 3 |
1 | 1 | переключатель 4 |
Таблица 8.6 Установка битов D3 и D2.
Если бит D4 установлен в единицу, то переключатель, заданный битами D2 и D3 регистра определения различных режимов работы, находится в положении ON. Если бит сброшен в ноль, то переключатель находится в положении OFF.
Для EGA эти четыре переключателя определяют, какой дисплей используется с видеоадаптером и какой дополнительный видеоадаптер может быть подключен к компьютеру (cм. главу "Системы с двумя дисплеями").
Ниже показаны правильные варианты установки переключателей для различных конфигураций видеосистемы.
4 3 2 1 _________ Первичный: EGA с цветным дисплеем (40х25). ON ¦Ё Ё¦ OFF ¦ Ё Ё ¦ Дополнительный: MDA. _________ 4 3 2 1 _________ Первичный: EGA с цветным дисплеем (80х25). ON ¦Ё ¦ OFF ¦ Ё Ё Ё¦ Дополнительный: MDA. _________ 4 3 2 1 _________ Первичный: EGA с улучшенным цветным дисплеем. ON ¦ Ё Ё Ё¦ OFF ¦Ё ¦ Дополнительный: MDA. _________ 4 3 2 1 _________ Первичный: EGA с улучшенным цветным дисплеем. ON ¦ Ё Ё ¦ OFF ¦Ё Ё¦ Дополнительный: MDA. _________ 4 3 2 1 _________ Первичный: EGA с монохромным дисплеем. ON ¦ Ё Ё¦ OFF ¦Ё Ё ¦ Дополнительный: CGA с цветным дисплеем _________ (40х25). 4 3 2 1 _________ Первичный: EGA с монохромным дисплеем. ON ¦ Ё ¦ OFF ¦Ё Ё Ё¦ Дополнительный: CGA с цветным дисплеем _________ (80х25) 4 3 2 1 _________ Первичный: MDA. ON ¦Ё Ё Ё Ё¦ OFF ¦ ¦ Дополнительный: EGA с цветным дисплеем _________ (40х25). 4 3 2 1 _________ Первичный: MDA. ON ¦Ё Ё Ё ¦ OFF ¦ Ё¦ Дополнительный EGA с цветным дисплеем _________ (80х25). 4 3 2 1 _________ Первичный: MDA. ON ¦Ё Ё Ё¦ OFF ¦ Ё ¦ Дополнительный: EGA с улучшенным цветным _________ дисплеем. 4 3 2 1 _________ Первичный: MDA. ON ¦Ё Ё ¦ OFF ¦ Ё Ё¦ Дополнительный: EGA с улучшенным цветным _________ дисплеем. 4 3 2 1 _________ Первичный: CGA с цветным дисплеем 40х25 ON ¦Ё Ё Ё¦ OFF ¦ Ё ¦ Дополнительный: EGA с монохромным дисплеем. _________ 4 3 2 1 _________ Первичный: CGA с цветным дисплеем 80х25 ON ¦Ё Ё ¦ OFF ¦ Ё Ё¦ Дополнительный: EGA с монохромным дисплеем. _________
VGA использует бит D4 для определения типа используемого дисплея (цветной или монохромный).
Особенно подчеркнем, что положение этих переключателей может быть считано также из байта памяти с адресом 0000:0488h:
- D3-D0 Биты, соответствующие переключателям. Если бит установлен в единицу, то соответствующий переключатель находится в положении ON. Если бит сброшен в ноль, то переключатель находится в положении OFF.
- D7-D4 Не используются.
Следующая программа считывает значение регистра состояния 0, выделяет биты D5 и D6, поступающие с разъема дополнительного устройства и отображает значения этих битв на экране диспля.
// чтение битов дополнительного устройства // (битов D5 и D6 регистра состояния 0) #include <stdio.h> #include "sysp.h" #include "sysgraph.h" void main(void) { int feature_bits; unsigned crt_address; BIOS_VAR _far *bios_var_ptr; // читаем содержимое регистра состояния 0 и выделяем // биты D5 и D6 feature_bits = (ReadReg(0x3C2) & 0x60) >> 5; printf("Биты дополнительного устройства: %x\n", feature_bits); }
Функция ReadReg, используемая в программе, описана ранее.
Регистр состояния 1
(Input Status Register 1 - ISR0)
Регистр позволяет получить различную информацию о состоянии видеоадаптера.
Для видеоадаптера CGA Содержимое регистраможно считать через порт, имеющий адрес 3DAh. Для адаптеров EGA и VGA данный регистр, имеет адрес 3BAh в монохромных режимах и адрес 3DAh - в цветных. Регистр состояния 1 доступен только для чтения.
Приведем формат регистра состояния 1:
D0 Бит разрешения отображения. D1 Бит тригера светового пера. D2 Бит переключателя светового пера. D3 Бит обратного вертикального хода D5-D4 Диагностические биты. D7-D6 Биты не используются.
- D7, D6 Биты не используются.
- D5, D4 Диагностические биты, применяемые для получения двух из шести цветовых выходных сигналов передаваемых на дисплей (для EGA). Какие два сигнала из шести будут диагностироваться, определяют с помощью регистра разрешения цветового слоя контролленра атрибутов (Таблица 8.7):
Регистр разрешения Регистр состояния 1 цветового слоя D5 D4 D5 D4 0 0 красный синий 0 1 второй красный второй зеленый 1 0 второй синий зеленый 1 1 не используется не используется
Таблица 8.7 Считывание диагностических битов EGA.
Таблица 8.8 показывает, как можно считать два из восьми цветовых сигналов вырабатываемых контроллером атрибутов видеоадаптера VGA:
Регистр разрешения Регистр состояния 1 цветового слоя D5 D4 D5 D4 0 0 P2 P0 0 1 P5 P4 1 0 P3 P1 1 1 P7 P6
Таблица 8.8 Считывание диагностических битов VGA.
Фактически биты D5 и D4 представляют возможность прочитать содержимое регистров таблицы цветовой палитры для видеоадаптера EGA. Следует отметить, что некоторые адаптеры, совместимые с EGA, не поддерживают эти биты. По-этому их использование может наложить некоторые ограничения на работу программы.
- D3 Бит обратного вертикального хода луча. Бит принимает значение 1 в течение обратного вертикального хода луча по кадру. Данный бит также установлен в случае, если разрешено прерывание IRQ2 EGA, и другое устройство выдает запрос на это прерывание.
Биты D2 и D1 относятся к управлению световым пером. Для видеоадаптеров VGA и Super VGA эти биты не используются, так как такие адаптеры не поддерживают световое перо.
- D2 Бит переключателя светового пера. Если переключатель светового пера находится в положении ON (включено), то бит D2 равен единице. Если же переключатель находится в положении OFF (выключено), то бит D2 равен нулю.
- D1 Бит триггера светового пера. Бит равен единице, если триггер светового пера установлен. Этот бит будет сохранять единицу до записи нуля через порт с адресом 3BBh для монохромного режима, или через порт 3DBh - для цветного режима.
- D0 Бит разрешения отображения. Бит принимает значение единицы во время интервала активности дисплея (когда адаптер читает данные из видеопамяти), и равен нулю во время горизонтального и вертикального обратного хода луча.
Во многих случаях возникает необходимость синхронизовать выполнение некоторых действий с периодом вертикального или горизонтального обратного хода луча. Этого можно достичь обработкой прерывания IRQ2 или тестированием регистра состояния 1.
Ниже представлена программа, использующая функцию WaitVert, для определения частоты кадров. Функция WaitVert задерживает выполнение программы до начала обратного вертикального хода луча.
// программа определения частоты кадров #include <time.h> #include <stdio.h> #include <bios.h> #define NUM 200 void WaitVert(void); void main() { time_t t_start, t_end; int i; float fr; // определяем время запуска процесса t_start = clock(); // ожидаем когда процесс вертикальной разверти выполнится NUM раз for(i = 0; i < NUM; i++) WaitVert(); // определяем время завершения процесса t_end = clock(); // вычисляем частоту кадров fr = NUM/(((float)t_end - t_start) / CLK_TCK); printf( "\nЧастота кадров = %4.1f \n", (float)fr ); } /** *.Name WaitVert * *.Title Определение начала обратного вертикального хода луча. * *.Descr Функция ожидает начало обратного вертикального хода луча. * Использование функции позволяет синхронизировать работу * программы с периодами работы видеоадаптера. * *.Proto void WaitVert(void) * *.Params Отсутствуют. * *.Return Не используются. * *.Sample get_vert.c **/ void WaitVert(void) { unsigned count; _asm { ; устанавливаем регистр es на сегмент с нулевым адресом mov ax,0h mov es,ax ; определяем адрес порта индексного регистра ; контроллера ЭЛТ (3B4h/3D4h в ; зависимости от режима работы видеоадаптера - ; монохромный или цветной) mov dx,es:[463h] ; вычисляем адрес порта регистра состояния 1 (ISR1); ; это достигается добавлением к адресу порта ; индексного регистра 6, так как адрес порта регистра ; состояния 1 равен 3BAh или 3DAh в зависимости от режима ; работы видеоадаптера (монохромный или цветной) add dl,6 ; читаем содержимое порта регистра состояния 1 in al,dx ; тестируем бит D3 регистра состояния 1 ; бит D3 = 1 во время обратного вертикального хода луча test al,8 jz wait_on wait_off: in al,dx ; тестируем бит D3 test al,8 ; ожидаем конец обратного вертикального хода луча jnz wait_off wait_on: in al,dx test al,8 ; ожидаем начало обратного вертикального хода луча jz wait_on ; ; здесь могут распологаться операции, которые необходимо ; выполнить во время обратного вертикального хода луча ; } }
Регистр разрешения работы системы VGA
(VGA Enable Register - VGA_ER)
Данный регистр имеет адрес 3С3h. Регистр используется только для VGA. Биты D1-D7 зарезервированны, а бит D0 управляет работой VGA. Если он равен нулю, то запрещен доступ к видеопамяти и портам ввода/вывода видеоадаптера (кроме самого регистра VGA_ER).
Регистр сброса триггера-защелки светового пера (Light Pen Latch Reset Register - LPLRR)
Доступ к регистру производится через порт 3DBh для цветного режима и через 3BBh для монохромного. Регистр используется только видеоадаптерами CGA и EGA. Любая операция записи (OUT) в этот регистр сбрасывает триггер-защелку светового пера.
Регистр установки триггера-защелки светового пера (Light Pen Latch Set Register - LPLRR)
Доступ к регистру производится через порт 3DCh для цветного режима и через 3BCh для монохромного. Регистр используется только видеоадаптерами CGA и EGA. Любая операция записи (OUT) в этот регистр вызывает установку триггера-защелки светового пера.