Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование видеоадаптеров EGA, VGA и SVGA.doc
Скачиваний:
138
Добавлен:
01.05.2014
Размер:
4.51 Mб
Скачать

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

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

На входе:

AH

10h

AL

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

BX

Номер первого регистра таблицы цветов

CX

Количество модифицируемых регистров

На выходе:

Не используются

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

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

Программа BIOSDAC демонстрирует использование функций BIOS для управления таблицей цветов. Исходный текст программы BIOSDAC представлен на листинге 5.5.

Листинг 5.5. Файл BIOSDAC.C

#include <conio.h> #include <stdio.h> #include <dos.h> #include "sysp.h" typedef struct _RGB_ { unsigned char red; unsigned char green; unsigned char blue; } RGB; // Объявление функций void main(void); void SetVideoMode(unsigned char); void SetVgaDAC(unsigned, unsigned); void GrayScale(void); //====================================================== // Главная функция //====================================================== void main(void) { RGB color_table[256]; unsigned char i,j; unsigned char far *ptr; int error, x_num, y_num; unsigned seg_table,off_table; // Формируем новые значения для таблицы цветов for(j = 0; j < 4; j++) { for(i = 0; i < 64; i++) { (color_table[i+j*64]).red = (j == 0) ? i : (j == 4) ? i : 0; (color_table[i+j*64]).green = (j == 1) ? i : (j == 3) ? i : (j == 4) ? i : 0; (color_table[i+j*64]).blue = (j == 2) ? i : (j == 3) ? i : (j == 4) ? i : 0; } } // Устанавливаем режим номер 13h SetVideoMode(0x13); ptr = (unsigned char far*) &color_table[0]; seg_table = FP_SEG(ptr); off_table = FP_OFF(ptr); // Загружаем таблицу цветов SetVgaDAC(seg_table,off_table); // Записываем данные в видеопамять ptr = (unsigned char far*) (FP_MAKE(0xA000, 0x0)); for(y_num = 0; y_num < 200; y_num++) { for(x_num = 0; x_num < 320; x_num++) { *ptr = (unsigned char) x_num; ptr++; } } // Ожидаем нажатие на клавишу клавиатуры getch(); // Преобразовываем данные в таблице цветов к серому цвету GrayScale(); // Ожидаем нажатие на клавишу клавиатуры getch(); // Устанавливаем текстовый режим SetVideoMode(0x3); } //====================================================== // Функция установки режима //====================================================== void SetVideoMode( unsigned char vmode ) { union REGS regs; regs.h.ah = 0x0; regs.h.al = vmode; int86(0x10, &regs, &regs); } //====================================================== // Функция загрузки таблицы цветов //====================================================== void SetVgaDAC(unsigned seg_table, unsigned off_table) { union REGS regs; struct SREGS segregs; regs.x.ax = 0x1012; regs.x.cx = 256; regs.x.bx = 0x00; segregs.es = seg_table; regs.x.dx = off_table; int86x(0x10, &regs, &regs, &segregs); } //====================================================== // Функция преобразования таблицы цветов в серый цвет //====================================================== void GrayScale( void ) { union REGS regs; regs.x.ax = 0x101b; regs.x.cx = 256; regs.x.bx = 0x00; int86(0x10, &regs, &regs); }