Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

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

© Александр Фролов, Григорий Фролов
Том 3, М.: Диалог-МИФИ, 1992, 287 стр.

[Назад] [Содеожание] [Дальше]

9.1. Управление регистрами палитры - функция 10h

Функция 10h предоставляет возможность программирования регистров цветовой палитры, таблицы цветов (VGA), а также управляет некоторыми атрибутами символов.

Для EGA эта функция содержит следующие четыре подфункции:

Номер подфункции Назначение
0 программирование одного регистра палитры
1 программирование регистра цвета рамки
2 программирование всех регистров палитры (таблицы цветов)
3 управление атрибутом мигания и атрибутом интенсивности

VGA поддерживает дополнительно еще 10 подфункций:

Номер подфункции Назначение
7 чтение одного регистра палитры
8 чтение регистра цвета рамки
9 чтение всех регистров палитры
10h программирование одного регистра ЦАП
12h прграммирование нескольких регистров ЦАП
13h выбор подмножества цветов
15h чтение одного регистра ЦАП
17h чтение несколььких регистров ЦАП
1Ah чтение состояния страницы цветов
1Bh преобразование регистров ЦАП для работы в монохромном режиме

Установка одного регистра палитры - подфункция 00h

Функция выполняет запись в регистр палитры:


На входе:   AH = 10h - функция 10h;

   AL = 00h - установка регистра палитры;

   BL = номер регистра палитры (0-Fh);

   BH = данные, записываемые в регистр.

На выходе:   Не используются.

Следующий фрагмент записывает в регистр палитры с номером reg_num содержимое переменной data:

   mov   ah,10h      ; функция 10h
   xor   al,al      ; подфункция 0h
   mov   bl,num_reg   ; задаем номер регистра палитры
   mov   bh,data      ; новое значение регистра
   int   10h

Установка цвета рамки - подфункция 01h

Функция выполняет запись значения в регистр цвета рамки контроллера атрибутов. Надо иметь в виду, что эта функция не работает в некоторых режимах EGA.


На входе:   AH = 10h;

   AL = 01h - устновка цвета рамки;

   BH = значение, записываемое в регистр (цвет).

На выходе:   Не используются.

Пример, приведенный ниже, использует подфункцию 01h для изменения цвета рамки экрана:

#include <dos.h>
#include <stdio.h>

void main(void);

void main(void) {

   union REGS   inregs, outregs;
   unsigned char   i;

   // пробуем 16 цветов для рамки

   for(i = 0; i < 16; i++) {

      // функция управления контроллером атрибутов

      inregs.h.ah = 0x10;      

      // подфункция установки цвета рамки

      inregs.h.al = 0x1;   

      // номер нового цвета рамки

      inregs.h.bh = i;

      int86( 0x10, &inregs, &outregs );

      // ожидаем нажатия на любую клавишу

      getch();
   }
}

Установка всех регистров палитры - подфункция 02h

Функция обеспечивает быстрое заполнение новыми значениями всех регистров палитры и регистра цвета рамки. Новые значения регистров записываются в 17-байтовой таблице где-нибудь в оперативной памяти компьютера. Байты 0 - 15 содержат новые значения для регистров палитры, а байт 16 для регистра цвета рамки.


На входе:   AH = 10h;

   AL = 02h - установка регистров палитры и
   регистра цвета рамки;

   ES:DX = адрес таблицы с новыми значениями
   регистров.

На выходе:   Не используются.

Управление атрибутом мигания и атрибутом интенсивности - подфункция 03h

Управляет битом D7 байта атрибутов символа (см. главу "Атрибуты символов"):


На входе:   AH = 10h;

   AL = 03h - управление битом D7 байта атрибутов;

   BL = 0 - бит D7 управляет интенсивностью фона,
      1 - бит D7 управляет миганием символа.

На выходе:   Не используются.

/**
*.Name         ControlBlinkIntens
*.Title        Управление атрибутом мигания/интенсивности
*
*.Descr        Эта функция управляет назначением бита D7 байта 
*              атрибутов символа. 
*
*.Proto        void ControlBlinkIntens(unsigneg char  blink)
*
*.Params       unsigneg char  blink - если параметр функции
*         равен нулю, то бит D7 будет определять
*         интенсивность фона символа. Если параметр равен
*         единице, то бит D7 управляет миганием символа.
*
*.Return       Не определено.
**/

ControlBlinkIntens(unsigneg char  blink) {

   union REGS   inregs, outregs;

   // функция управления контроллером атрибутов

   inregs.h.ah = 0x10;

   // подфункция управления атрибутом мигания/интенсивности

   inregs.h.al = 0x3;

   inregs.h.bl = blink;
   int86( 0x10, &inregs, &outregs );

}

Чтение регистра палитры - подфункция 07h

Функция поддерживается только видеоадаптером VGA. Она позволяет прочитать содержимое любого регистра палитры:


На входе:   AH = 10h;

   AL = 07h - чтение регистра палитры;

   BL = номер читаемого регистра палитры (0-15).

На выходе:   BH = содержимое регистра палитры.

   ...
   mov   ah,10h
   mov   al,7h
   mov   bl,num_reg
   int   10h

   mov   reg_value,bh
   ...

Чтение регистра цвета рамки - подфункция 08h

Функция поддерживается только видеоадаптером VGA. Позволяет прочитать содержимое регистра цвета рамки:


На входе:   AH = 10h;

   AL = 08h - чтение регистра цвета рамки.

На выходе:   BH = содержимое регистра цвета рамки.

Чтение всех регистров палитры - подфункция 09h

Для видеоадаптера VGA данная функция позволяет прочитать значения всех регистров палитры и регистра цвета рамки. Для чтения регистров надо зарезервировать участок памяти (17 байт). После вызова функции байты 0 - 15 будут содержать значения соответствующих регистров палитры, а байт 16 - значение регистра цвета рамки.


На входе:   AH = 10h;

   AL = 9 - чтение всех регистров палитры;

   ES:DX  - указатель на 17-байтовую таблицу.

На выходе:   По адресу ES:DX содержится таблица, заполненная
   значениями из регистров палитры.

Приведем фрагмент программы, который считывает значения всех регистров палитры и регистра цвета рамки в буфер памяти buffer:

; определяем адрес буфера для записи значений регистров 
; палитры и регистра цвета рамки   

mov   ax,SEG buffer      
mov   es,ax         
mov   dx,OFFSET buffer    

; считываем значения всех регистров палитры и регистра
; цвета рамки

mov   ah,10h
mov   al,9            
int   10h

Установка одного регистра таблицы цветов (регистров ЦАП) - подфункция 10h

Функция производит запись 18-битной величины в один из 256 регистров таблицы цветов:


На входе:   AH = 10h;

   AL = 10h - установка регистра таблицы цветов;

   BX = номер регистра таблицы цветов (0-255);

   DH = интенсивность красного цвета (6 бит);

   CH = интенсивность зеленого цвета (6 бит);

   CL = интенсивность синего цвета (6 бит).

На выходе:   Не используются.

Пример использования функции установки одного регистра таблицы цветов приведен ниже:

   mov   ah,10h

   ; выбираем функцию установки регистра цветов

   mov   al,ah

   ; устанавливаем номер регистра таблицы цветов

   mov   bx,num_reg

   ; определяем величины красной, зеленой и синей составляющих

   mov   dh,red      
   mov   ch,green      
   mov   cl,blue

   int   10h

Установка нескольких регистров таблицы цветов (регистров ЦАП) - подфункция 12h

Функция производит запись 18-битной величины в несколько последовательно расположенных регистров таблицы цветов:


На входе:   AH = 10h;

   AL = 12h - установка нескольких регистров
            таблицы цветов;

   BX = номер первого регистра таблицы цветов (0
      -255);

   CX = число устанавливаемых регистров (1-256);

   ES:DX    - адрес таблицы цветов.

На выходе:   Не используются.

Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значимыми являются только 6 младших бит.

Выбор подмножества цветов - подфункция 13h

Функция предназначена для выбора числа подмножеств цветов и выбора активного подмножества:


На входе:   AH = 10h;

   AL = 13h - выбор подмножества цветов;

   BL = 0 - выбор режима:

      BH = 0 - 4 подмножества из 64 цветов;

      BH = 1 - 16 подмножеств из 16 цветов;


   BL = 1 - выбор активного подмножества:

      BH = номер подмножества (0-4 или 0-15).

На выходе:   Не используются.

Приведем фрагмент программы использующий данную функцию:

; выбираем режим (bh = 1)

mov   ah,10h
mov   al,13h
xor   bx,bx
inc   bh
int   10h

; устанавливаем активное подмножество subset_num

mov   ah,10h
mov   al,13h
mov   bl,1
mov   bh,subset_num
int   10h

Чтение регистра таблицы цветов - подфункция 15h

Функция поддерживается только для видеоадаптеров VGA. Она выполняет чтение одного из регистров таблицы цветов:


На входе:   AH = 10h;

   AL = 15h - чтение регистра таблицы цветов;

   BL = номер читаемого регистра (0-255).

На выходе:   DH = интенсивность красного цвета (6 бит);

   CH = интенсивность зеленого цвета (6 бит);

   CL = интенсивность синего цвета (6 бит);

Следующий пример позволяет считать значение регистра таблицы цветов с номером num_color_reg:

   mov   ah,10h
   mov   al,15h
   mov   bx,num_color_reg
   int   10h
   mov   red_data,dh
   mov   green_data,ch
   mov   blue_data,cl

Чтение нескольких регистров таблицы цветов (регистров ЦАП) - подфункция 17h

Функция производит чтение 18-битовых значений из нескольких последовательно расположенных регистров таблицы цветов:


На входе:   AH = 10h;

   AL = 17h - чтение нескольких регистров
            таблицы цветов;

   BL = номер первого регистра таблицы цветов (0
      -255);

   CX = число считываемых регистров (1-256);

   ES:DX    - адрес таблицы цветов;

На выходе:   Данные в таблице по адресу ES:DX.

Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значащимии являются только младшие 6 бит.

Определение режима подмножества цветов - подфункция 1Ah

Возвращает число текущих цветовых подмножеств:


На входе:   AH = 10h;

   AL = 1Ah - определение числа цветовых
      подмножеств.

На выходе:   BL = 0 - используются 4 цветовых подмножества
          по 64 цвета;

      1 - используются 16 цветовых подмножеств
          по 16 цветов;

   BH - номер подмножества, используемого в данный
      момент.

   mov   ah,10h
   mov   al,1ah
   int   10h
   mov   num_subset,bh

Установка палитры из градаций серого цвета - подфункция 1Bh

Функция заполняет часть таблицы цветов значениями, соответствующими различным оттенкам серого цвета.

Для каждого модифицируемого регистра таблицы цветов сначала читаются записанные в нем данные, а затем записываются обратно по следующему правилу: красного 30 - процентов, зеленого - 59 процентов и голубого - 11 прцентов от считанного значения.


На входе:   AH = 10h;

   AL = 1Bh - установка палитры из градаций серого
      цвета;

   BX = номер первого регистра таблицы цветов (0
      -255);

   CX =  число модифицируемых регистров (1-256).

На выходе:   Не используются.

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

   mov   ah,10h
   mov   al,1Bh
   mov   bx,first_num   ; номер первого модифицируемого регистра
   mov   cx,end_num   ; номер последнего модифицируемого регистра
   sub   cx,bx      ; определяем число изменяемых регистров
   int   10h
[Назад] [Содеожание] [Дальше]