Программирование видеоадаптеров CGA,EGA и VGA

       

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



Регистр состояния 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 ; ; здесь могут распологаться операции, которые необходимо ; выполнить во время обратного вертикального хода луча ; } }



Содержание раздела