Программирование видеоадаптеров CGA,EGA и VGA

       

Вывод пиксела - функция 0Ch


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

Функция используется в графических режимах для записи пиксела заданного цвета в любую страницу видеопамяти. Необходимо отметить, что у видеоадаптера CGA в графических режимах определена только одна страница видеопамяти. Значения цветов, которые можно использовать в различных режимах, перечилены в таблице 9.2:

Номер режимаИспользуемые номера цветов
4,50 - 3
60 и 1
0Dh0 - 15
0Eh0 - 15
0Fh0 и 1
10h0 - 15

Цвета, соответствующие номерам цветов в таблице можно посмотреь в главе "Режимы работы видеоадаптеров".



Таблица 9.2 Возможные значения номеров цветов для различных режимов.

Формат вызова функции 0Ch представлен ниже: На входе: AH = 0Ch - запись пиксела; AL = номер цвета; BH = номер страницы (для CGA не используется); CX = координата X; DX = координата Y. На выходе: Не используются.

Если бит D7 регистра AL содержит единицу, то новый пиксел накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ.

Заметим, что начало системы координат находится в левом верхнем углу экрана, а оси координат направлены следующим образом: ось X - вправо, ось Y - вниз. Далее, если особо не оговарено, мы всегда будем использовать эту систему координат. // Демонстрация функций - выбора цветовой палитры и вывода // пиксела. #include <dos.h> #include <stdio.h> void main(void); void main(void) { union REGS inregs, outregs; unsigned char i, j; // устанавливаем режим 4 видеоадаптера // (графический - 320х200, 4 цвета) inregs.h.ah = 0x0; inregs.h.al = 0x4; int86( 0x10, &inregs, &outregs ); // устанавливаем цвет фона inregs.h.ah = 0x0B; inregs.h.bh = 0x0; //устанавливаем цвет фона inregs.h.bl = 0x6; //номер устанавливаемого цвета фона int86( 0x10, &inregs, &outregs ); for(i = 0; i < 2; i++) { // устанавливаем цветовую палитру inregs.h.ah = 0x0B; inregs.h.bh = 0x1; // установка палитры inregs.h.bl = i; // номер палитры int86( 0x10, &inregs, &outregs ); // выводим массив точек for(j = 0; j < 64; j++) { // выводим на экран дисплея точку inregs.h.ah = 0x0C; inregs.h.al = (unsigned char)(j / 16);// номер цвета inregs.x.cx = 0x10 + j; // x-координата точки inregs.x.dx = 0x10 + j; // y-координата точки int86( 0x10, &inregs, &outregs ); } getch(); } }



Содержание раздела