Отображение строки в определенном цвете.
Отображение строки в определенном цвете не является столь трудной задачей, как вам может казаться на первый взгляд, если вы используете функции записи символа, которые используют, в свою очередь, возможности BIOS и видеопамяти (ROM-BIOS). ROM-BIOS прерывание 10Н, функция 9 позволяет отобразить текущий символ (один!) в позиции курсора и его атрибуты. Проблема состоит лишь в перемещении курсора по записываемой вами строке, но это должна осуществлять непосредственно ваша подпрограмма.
В соответствии с этим возникает, во-первых, необходимость определения текущей позиции курсора. Для этого используется функция read_cursor_xy(), представленная ниже. Эта функция использует ROM-BIOS-прерывание 10Н, функцию 3, для чтения текущих координат позиции курсора X и Y. Координаты позиции курсора возвращаются в качестве значений аргументов функции.
/* Чтение текущих координат позиции курсора */
void read_cursor_xy(x,y)
char *x,*y;
union REGS r;
r.h.ah = 3; /* чтение текущей позиции курсора */
r.h.bh = 0; /* видеостраница */
int86(0x10,&r,&r);
*y = r.h.dl;
*x = r.h.dh;
После определения координат текущей позиции курсора, функция, которая выполняет печать строки, должна осуществить перемещение курсора к следующему символу, с тем, чтобы используя ROM-BIOS-прерывание напечатать его. Для перемещения курсора целесообразно использовать функцию goto_xy(), которая была уже рассмотрена ранее и приводится в этой главе для полноты изложения материала.
/* Перемещение курсора в позицию, специфицированную
координатами X и Y
*/
void goto_xy (x,y)
int x,y;
union REGS r;
r.h.ah = 2; /* функция адресации курсора */
r.h.dl = x; /* координата столбца */
r.h.dh = y; /* координата строки */
r.h.bh = 0; /* видеостраница */
int86(0x10,&r,&r);
Функция color_puts(), представленная ниже, отображает специфицированную пользователем строку в указанном цвете.
/* Печать строки в цвете */
void color_puts(s,color)
char *s; /* строка */
char color; /* цвет строки */
union REGS r;
char x,y;
read_cursor_xy(&x,&y); /* получение текущей позиции курсора
*/
while (*s)
if (*s == '\n') /* обработка символа новой строки */
printf("\n");
s++;
x = 0; y++; /* переход на следующую строку */
continue;
r.h.ah = 9; /* функция отображения символа и его атрибутов */
r.h.al = *s++; /* отображаемый символ */
r.h.bl = color; /* атрибуты цвета */
r.h.bh = 0; /*видеостраница 0 */
r.x.cx = 1; /* отобразить за единицу времени ( такт ) */
int86(0x10,&r,&r);
x++;
goto_xy(x,y); /* перемещение курсора */
Как вы можете видеть, отображаемый символ запоминается в регистре AL, атрибуты цвета символа - в регистре BL, номер видеостраницы - в регистре BH, а количество интервалов времени (тактов процессора), за которое будет отображен символ - в регистре CX. Заметим, что функция также обрабатывает специальный символ новой строки ('\n'). Вы можете также, по желанию, организовать обработку символов табуляции ('\t'), двойных кавычек (") и других специальных символов.
Использование функции color_puts() предполагает наличие ряда макроопределений в начале вызывающей функцию программы. Перечень макроопределений представлен ниже
#define BLUE 1
#define GREEN 2
#define RED 4
#define INTENSE 8
#define BLUE_BACK 16
#define GREEN_BACK 32
#define RED_BACK 64
#define BLINK 128
Используя эти макросы, вы можете по своему усмотрению выдать
на экран строку текста на фоне установленного вами цвета, а также
саму строку в определенном вами цвете. Вы можете также управлять
режимом отображения строки (повышенная яркость или мерцание).
Комбинируя цвета, режимы мерцания или повышенной яркости для одного или совокупности символов, вы можете добиться любого желаемого вами эффекта. Например, представленная ниже строка программы приведет к отображению строки "А это - текст" в режиме повышенной яркости в голубом (циановом) цвете:
color_puts("А это - текст",GREEN | RED | INTENSE );