Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МП 1,2.doc
Скачиваний:
11
Добавлен:
05.11.2018
Размер:
2.77 Mб
Скачать

Void putpixel (int color, int X, int y)

{

unsigned addr = x/8 + y*80;

char b, mask = 0x80>>(x&7);

outportb (0x3CE, 1);

outportb (0x3CF, 0xF); // регистр 1 = 0Fh

outportb (0x3CE, 0);

outportb (0x3CF, color); // регистр 0 = color

outportb (0x3CE, 8);

outportb (0x3CF, mask); // регистр 8 = маска

b = peekb (0xA000, addr); // чтение в регистры защелки

pokeb (0xA000, addr, b); // запись любого байта

outportb (0x3CE, 8);

outportb (0x3CF, 0xFF); // восстановление регистра 8

outportb (0x3CE, 1);

outportb (0x3CF, 0); // восстановление регистра 1

}

  1. Регистр 1 равен 0. Значения пикселов являются результатом операции, указанной в битах 4-3 регистра 3, над байтом процессора и байтами регистров защелки. Операция производится над байтом процессора и каждым из регистров защелки, полученные результаты записываются в соответствующую битовую плоскость. Биты, имеющие нулевые значения в регистре маски, записываются без изменения. Например, байт процессора с = 00100111, записывается в некоторый байт видеопамяти, имеющий адрес Mem, с помощью команды *Mem = c. Преобразование и запись в битовые плоскости показаны на рис. 4.5:

Режим записи 1. Содержимое четырех регистров защелки копируется в битовые плоскости по указанному адресу. Копируется сразу 8 пикселов. Байт процессора роли не играет. Регистры масок и режима не действуют.

Пример 3. Напишем подпрограмму копирования прямоугольной области экрана для случая, когда прямоугольник не пересекается со своим образом и имеет координаты вершин, кратные 8:

void copy (int x1, int y1, int x2, int y2, int xnew, int ynew)

// координаты вершин и координаты левого верхнего угла образа

{

unsigned char *v = (char *)0xA0000000;

unsigned SrcAddr, DstAddr;

int Cols, NextRow, x, y;

SrcAddr = y1*80 + (x1>>3); // начальный адрес

DstAddr = ynew*80 + (xnew>>3);

Cols = (x2>>3)-(x1>>3); //число столбцов

NextRow = 80 - Cols; // разница между адресами последнего байта

// строки и первого байта следующей строки

SetRWMode(0,1); // режим чтения - 0, записи - 1

for(y=y1; y<=y2; y++)

{

for(x=1; x<=Cols; x++)

{

*(v+DstAddr) = *(v+SrcAddr);

DstAddr++; SrcAddr++;

}

SrcAddr += NextRow; // переход на

DstAddr += NextRow; // следующую строку

}

SetRWMode(0,1); // восстановление режимов

}

Режим записи 2. Младшие четыре бита байта процессора играют роль, аналогичную той, которую играл регистр 0 установки/сброса в режиме записи 0 в случае, когда регистр 1 был равен 0Fh. Битовые плоскости модифицируются путем объединения значений пикселов в регистрах защелки со значением пиксела, заданного байтом процессора. Содержимое регистров двоичной маски показывает, какие биты из восьми будут модифицированы.

Пример 4. Напишем подпрограмму вывода точки в режиме записи 2:

void writepixel (int x, int y, int color)

{

unsigned char c, mask = 0x80 >> (x % 8);

unsigned addr= y*80 + x/8;

outportb (0x3CE, 8);

outportb (0x3CF, mask);

SetRWMode(0,2); // установить режим записи - 2

outportb (0x3CE, 3); 

outportb (0x3CF, 0); // copy_put

c = peekb (0xA000, addr); // чтение в регистры защелки

pokeb(0xA000, addr,color);

}

(Здесь желательно добавить восстановление регистров 5 и 8).

Режим записи 3. Новое значение пиксела получается путём комбинирования содержимого регистров защелки и содержимого регистра 0 установки/сброса. Сдвинутый вправо на количество разрядов, записанное в битах 0-3 регистра 3, байт процессора объединяется с помощью операции AND со значением регистра 8 двоичной маски. Полученная в итоге битовая маска играет роль, аналогичную роли значения регистра двоичной маски в режимах 0 и 2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]