Программирование видеоадаптеров CGA, EGA и VGA© Александр Фролов, Григорий ФроловТом 3, М.: Диалог-МИФИ, 1992, 287 стр. 8.13. Вывод пиксела - функция 0ChИспользование функций BIOS для создания изображений, в частности для отображения отдельных пикселов, хотя и медленнее, чем прямая запись в видеопамять и программирование регистров, но более надежно с точки зрения совместимости для различных режимов и видеоадаптеров. Функция используется в графических режимах для
записи пиксела заданного цвета в любую страницу
видеопамяти. Необходимо отметить, что у
видеоадаптера CGA в графических режимах
определена только одна страница видеопамяти.
Значения цветов, которые можно использовать в
различных режимах, перечилены в таблице 9.2:
Цвета, соответствующие номерам цветов в таблице можно посмотреь в главе "Режимы работы видеоадаптеров". Таблица 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(); } } |