Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

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

© Александр Фролов, Григорий Фролов
Том 3, М.: Диалог-МИФИ, 1992, 287 стр.

[Назад] [Содеожание] [Дальше]

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

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

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

Номер режима Используемые номера цветов
4,5 0 - 3
6 0 и 1
0Dh 0 - 15
0Eh 0 - 15
0Fh 0 и 1
10h 0 - 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();
   }
}
[Назад] [Содеожание] [Дальше]