Регистр позволяет получить различную информацию о состоянии видеоадаптера.
Для видеоадаптера CGA Содержимое регистраможно считать через порт, имеющий адрес 3DAh. Для адаптеров EGA и VGA данный регистр, имеет адрес 3BAh в монохромных режимах и адрес 3DAh - в цветных. Регистр состояния 1 доступен только для чтения.
Приведем формат регистра состояния 1: D0 Бит разрешения отображения. D1 Бит тригера светового пера. D2 Бит переключателя светового пера. D3 Бит обратного вертикального хода D5-D4 Диагностические биты. D7-D6 Биты не используются.
Таблица 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, не поддерживают эти биты. По-этому их использование может наложить некоторые ограничения на работу программы.
Биты D2 и D1 относятся к управлению световым пером. Для видеоадаптеров VGA и Super VGA эти биты не используются, так как такие адаптеры не поддерживают световое перо.
Во многих случаях возникает необходимость синхронизовать выполнение некоторых действий с периодом вертикального или горизонтального обратного хода луча. Этого можно достичь обработкой прерывания 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 ; ; здесь могут распологаться операции, которые необходимо ; выполнить во время обратного вертикального хода луча ; } }