|
|
|
|
Цветовые палитры 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<
|
|
|