ла в последний раз регистр выбора чтения матрицы устанавливается
в 0, значение по умолчанию.
Листинг 9-7. Программа, возвращающая цвет элемента изображения
-----------------------------------------------------------------
/* возвращает цвет элемента изображения */
int readdot(row,col)
int row,col;
{
registr color = 0 ;
registr latch ;
unsigned char far *rgen = (char far *)(0xA0000000L +
(col >> 3) +
(row * GET_CRT_COLS())) ;
int bit_number = (col & 7)^7 ;
int bit_mask = (1 << bit_number) ;
int plane ;
/* Пройти через каждый массив 3, 2, 1, 0 */
for(plane = 3; plane >= 0; plane--)
{
EGA_GRFX(4,plane) ; /* выбрать массив */
latch = *(rgen) & bit_mask ; /* бит из этого массива */
latch >>= bit_number ; /* выровнять справа */
color <<= 1 ; /* место для следующего бита */
color |= latch ; /* прибавить бит */
}
return(color) ;
}
----------------------------------------------------------------
Цветовые палитры 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
- 9-26 -
цветов. Как только один из 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. Здесь не рассматривается создание
и сопровождение области сохранения параметров, но важно использо-
- 9-27 -
вать вызовы 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 */
- 9-28 -
palette[i] = 1 ;
}
set_all_pal(palette) ; /* установить палитру */
gotoXY(15,23) ;
/* Перевести значение rgbRGB в двоичное */
for(i = 5;i>=0; --i)
if(palette[7] & 1<