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

       

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


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

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

       В тех случаях, когда видеоадаптеры 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)

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

Адрес

Регистр

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. Мы выделили следующие группы регистров:

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

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

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

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

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

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


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