Программирование видеоадаптеров

       

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


Регистр позволяет получить различную информацию о состоянии видеоадаптера. Для видеоадаптера CGA содержимое регистра можно считать через порт, имеющий адрес 3DAh. Для адаптеров EGA, VGA и SVGA данный регистр, имеет адрес 3BAh в монохромных режимах и адрес 3DAh - в цветных. Регистр состояния 1 доступен только для чтения.

Приведем формат регистра состояния 1:

Биты

Описание

D0

Бит разрешения отображения



D1

Бит триггера светового пера

D2

Бит переключателя светового пера

D3

Бит обратного вертикального хода

D5-D4

Диагностические биты

D7-D6

Биты не используются

D7, D6   Биты не используются

D5, D4   Диагностические биты позволяют проверить два из шести цветовых выходных сигналов передаваемых монитору (для видеоадаптера EGA). Для выбора проверяемых сигналов используют регистр разрешения цветового слоя контроллера атрибутов:

Регистр разрешения цветового слоя

Регистр состояния 1

D5

D4

D5

D4

0

0

Красный

Синий

0

1

Второй красный

Второй зеленый

1

0

Второй синий

Зеленый

1

1

Не используется

Не используется

Следующая таблица показывает, как можно считать два из восьми цветовых сигналов, вырабатываемых контроллером атрибутов видеоадаптера VGA:

Регистр разрешения цветового слоя

Регистр состояния 1

D5

D4

D5

D4

0

0

P2

P0

0

1

P5

P4

1

0

P3

P1

1

1

P7

P6

Биты D5 и D4 позволяют прочитать содержимое регистров таблицы цветовой палитры видеоадаптера EGA. Следует отметить, что некоторые адаптеры, совместимые с EGA, не поддерживают эти биты. Поэтому их использование может наложить ограничения на работу программы.

D3    Бит обратного вертикального хода луча. Бит принимает значение 1 в течение обратного вертикального хода луча по кадру. Данный бит также установлен в случае, если разрешено прерывание IRQ2, и любое устройство компьютера выдает запрос на это прерывание.

Биты D2 и D1 управляют световым пером. Видеоадаптеры VGA и SVGA не поддерживают световое перо, поэтому биты D2 и D1 не используются.


D2    Бит переключателя светового пера. Если переключатель светового пера находится в положении ON (включено), то бит D2 равен единице. Если переключатель находится в положении OFF (выключено), то бит D2 равен нулю.

D1    Бит триггера светового пера. Бит равен единице, если триггер светового пера установлен. Сброс бита происходит при записи нуля через порт с адресом 3BBh для монохромного режима, или через порт 3DBh - для цветного режима.

D0    Бит разрешения отображения. Бит принимает значение единицы во время интервала активности монитора (когда адаптер читает данные из видеопамяти), и равен нулю во время горизонтального и вертикального обратного хода луча.

Во многих случаях возникает необходимость синхронизовать программирование регистров видеоадаптера с периодом вертикального или горизонтального обратного хода луча. Этого можно достичь периодической проверкой регистра состояния 1.

Листинг 4.2 содержит программу, использующую функцию WaitVert для определения частоты кадров. Функция WaitVert задерживает выполнение программы до начала обратного вертикального хода луча.

Листинг 4.2. Файл RASTR.C

// Программа определения частоты кадров

#include  <time.h>

#include  <stdio.h>

#include  <bios.h>

#define   NUM  200

// Описания функций. Смотри файл DISPLAY.ASM

void                        __pascal __far WaitVert(void);

unsigned               __pascal __far HorByVer(void);

//===========================================================

// Главная функция

//===========================================================

void main() {

  time_t  t_start, t_end;

  int                          i;

  float                      fr;

  unsigned             vert_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 );



}

Исходный текст функции WaitVert представлен в листинге 4.3. Функция WaitVert периодически проверяет регистр состояния 1 (ISR1), ожидая начало обратного вертикального хода луча по экрану монитора.

Листинг 4.3. Файл DISPLAY.ASM

TITLE      DISPLAY.ASM

NAME     DISPLAY

PAGE      55,132

P286

IDEAL

NOWARN BRK

SEGMENT WAIT_TEXT WORD PUBLIC 'CODE'

ASSUME                cs:WAIT_TEXT

;===========================================================

; Функция void WaitVert(void)

;===========================================================

PUBLIC  WAITVERT

PROC     WAITVERT FAR

  enter    0, 0

  mov  ax,0h

  mov  es,ax

  ; Определяем адрес порта индексного регистра контроллера

  ; ЭЛТ (3B4h/3D4h)

  mov  dx,es:[463h]

  ; Вычисляем адрес порта регистра состояния 1 (ISR1)

  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

  ; +------------------------------------------------------+

  ;  Здесь могут распологаться операции, которые необходимо

  ;  выполнить  во время обратного  вертикального хода луча

  ; +------------------------------------------------------+

  leave

  ret

  ENDP    WAITVERT

ENDS      WAIT_TEXT

END


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