На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 9 / Цветовые палитры EGA Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Цветовые палитры EGA

При использовании с усовершенствованным цветным дисплеем EGA может отображать любые 16 цветов из 64-цветной палитры. Для представления 16 цветов требуется 4 бита. Каждый из этих битов соответствует одной из четырех битовых матриц EGA. В режиме CGA или в исходной палитре EGA 4 бита соответствуют красному, зеленому, синему ярким цветам, что обычно описывается IRGB. Но как только исходная палитра EGA изменится, то 4-битовый код цвета будет представлять собой просто индекс новой палитры.


64-цветная палитра имеет те же три основных цвета (красный, зеленый, синий), что и 16-цветная палитра, но бит яркости отсутствует. Вместо него каждый цвет имеет 2 бита для яркости отдельного цвета, что дает три уровня яркости каждого цвета. Таким образом 64-цветная палитра может быть представлена 6 битами (3 цвета х 2 бита/цвет). Биты меньшей яркости трех цветов являются самыми значимыми битами в 6-битовом значении и аббревиатура rgb соответствует красному, зеленому и синему цветам малой яркости. Самые незначимые 3 бита представляют красный, зеленый и синий цвета высокой яркости и им соответствует аббревиатура RGB. Общее 6-битовое значение, rgbRGB используется для выбора одного из 64 цветов. Как только один из 16 отображаемых цветов установлен в значение rgbRGB, этот цвет может быть выбран с помощью 4-битового значения IRGB. Биты значения rgbRGB будут всегда показывать красный, зеленый и синий компоненты результирующего цвета, но с подключенным усовершенствованным цветным дисплеем, значение IRGB является просто индексом текущей палитры.


Цвета rgbRGB могут применяться только с EGA, подключенным к расширенному цветному монитору. Когда EGA подключен к цветному дисплею, могут использоваться только 16 цветов исходной палитры. В текстовых режимах и графических режимах EGA отдельные регистры палитры могут быть установлены в любой из 16 исходных цветов. В режимах, совместимых с CGA, палитра должна изменяться с использованием CGA-совместимых вызовов BIOS.


EGA также имеет регистр выходящей строки развертки. Цвет, посылаемый в этот регистр, отображается как граница. Тем не менее, выходящая строка развертки приемлема только в режимах с 200 строками развертки.


Регистры палитры EGA чаще всего устанавливаются с помощью новых вызовов EGA BIOS. Вызов BIOS может установить или один из 16 цветов, или все 16 цветов сразу. Вызов BIOS является функцией 0х10 прерывания 0х10. Имеется четыре подфункции: 0 устанавливает отдельные регистры палитры в любое значение rgbRGB (или в любое значение IRGB, если EGA не подключен к усовершенствованному цветному дисплею), 1 устанавливает регистр выходящей строки развертки, 2 устанавливает все регистры палитры и регистр выходящей строки развертки, и 4 служит переключателем между мерцанием текста и яркостью. Подфункция выбирается в регистре AL.


                                Установить палитру

             Результат:  Int   0x10
             Вызывается: AH =  0х10
                         AL =  0, Установить отдельный регистр палитры
                         BL =  Изменяемый номер цвета (IRGB)
                         BH =  Установить значение rgbRGB
                         AL =  1, Установить регистр выходящей строки
                               развертки
                         BH =  Номер устанавливаемого цвета
                         AL =  2, Установить все регистры палитры и ре-
                               гистр выходящей строки развертки
                               ES:DX указывает на 17-байтовую таблицу
                               Байты 0 - 15 имеют 16 значений rgbRGB для
                               цветов 0 - 15
                               Байт 16 является номером цвета для ре-
                               гистра выходящей строки развертки
                         AL =  3, Переключает бит яркость/мерцание
                               Меняет значение бита 7 байта атрибута
                               текста
                         BL =  0, Разрешает яркость фона
                         BL =  1, Разрешает мерцание переднего плана

К сожалению, регистры палитры EGA только записываемые. В обычном состоянии невозможно определить, какое значение rgbRGB представляет заданный номер цвета. При изменении регистров палитры EGA BIOS проверит наличие 256-байтовой таблицы, называемой областью сохранения параметров. Если эта таблица имеется, то BIOS сохранит в ней значения rgbRGB. Здесь не рассматривается создание и сопровождение области сохранения параметров, но важно использовать вызовы BIOS для установки палитры таким образом, чтобы эта таблица параметров обновлялась.


VGA имеет считываемые/записываемые регистры палитры, поэтому отдельные цвета rgbRGB могут быть определены чтением соответствующего регистра палитры. VGA также имеет более широкую палитру, в которой любой из 16 отображаемых цветов может быть цветом из палитры 262.144 возможных цветов. Вместо 2 битов на цвет в EGA, VGA использует 6 битов на цвет (2 х 3 цвета = 262.144 цвета).


Программа, представленная в листинге 9-8, демонстрирует использование регистров палитры. Эта программа работает только в сочетании EGA с усовершенствованным цветным дисплеем (или VGA). Сначала программа, применяя функцию rect() программы 9-5, начертит 16 цветных прямоугольников. Затем палитра будет непрерывно меняться.


                         Листинг 9-8. Программа PALETTE.C
         ---------------------------------------------------------------

         /* palette.c */
         /* Демонстрирует палитру 64 цветов */
         #include 
         #include 
         #include 
         #include "ega.h"

         void set_all_pal(char*) ;
         void gotoXY(int,int) ;
         main()
         {
         int i,j,ch = 0;
         char palette[17] ;  /* эта матрица содержит палитру */
         set_crt_mode(16) ;  /* имейте правильный монитор! */

         /* Начертить несколько цветных штрихов: */
         printf("\nЦвет #:\n") ;
         for (i=0,j=0;i<16;++i,j+=40)
         {
            printf (" %2i ",i);
            rect(50,j,300,j+39,i);    /* из программы 9-5 */
            palette[i] = (char)i ;    /* инициализировать матрицу */
         }
            gotoXY(15,22) ;
            printf("rgbRGB цвета 7") ;
            printf("%c%c%c%c%c%c",205,205,205,205,205,190) ;
            gotoXY(20,0) ;
            printf("Нажмите Space для одного пробела, Esc для выхода");

            palette[16] = (char)0 ;
            while(ch != 27)          /* пока не нажата клавиша Esc */
               {
               if (kbhit())          /* если клавиша нажата, */
                 ch = getch() ;      /* принять символ */
               for (i = 1; i<=15; ++i)
                 {
                    palette[i]++;
                    if (palette[i] == 64)
                    /* максимальное значение rgbRGB */
                        palette[i] = 1 ;
                 }
                 set_all_pal(palette) ;   /* установить палитру */
                 gotoXY(15,23) ;
                 /* Перевести значение rgbRGB в двоичное */
                 for(i = 5;i>=0; --i)
                 if(palette[7] & 1<

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz