Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Память, видеосист.DOC
Скачиваний:
6
Добавлен:
16.11.2019
Размер:
1.23 Mб
Скачать

Мерцающий зеленый символ на красном фоне. Программирование непосредственной записи в видеобуфер.

#include<graph.h>

void main ( )

{

char far *v_buf = (char far*) 0xb8000000L;

//(Начало видеобуфера в текстовом режиме).

_setvideomode(_TEXTC80); // режим № 3

403v_buf+ = (12*160)+(40<<1);

// Побитовое смещение на один разряд (40 << 1) эквивалентно умножению на 2.

*v_buf = ‘A’; // в ячейку со смещением (12*160 + 40*2) относительно начала видеобуфера записан ASCII-код буквы А, следовательно, изображение этой буквы появляется на пересечении строки № 13 и столбца № 41.

*(v_buf++) = 202; // задан атрибут.

_setvideomode(_DEFAULTMODE); // восстановление

// видеорежима по умолчанию.

}

2 4.10Видеоконтроллер в графическом режиме (например, cga № 4).

_ setvideomode(_MRES4COLOR) – установить 4-й графический режим (это 320х200 пикселов и 4 цвета).

SVGA видеоадаптер эмулирует этот режим.

Каждому пикселу соответствует часть байта. Каждый байт разделён на 4 части и каждому пикселу соответствует 2 бита.

Цвет с кодом 00 – цвет фона;

Цвет с кодом 01 – светло-голубой (Сyan);

Цвет с кодом 10 – малиновый (Маgenta);

Ц вет с кодом 11 – ярко-белый (brightWhite).

Четвёртый пиксел (пиксел № 3) формируется 1 и 2 битом каждого байта (младшими).

В 1 ряду: - 320 пикселов, 640 бит, 80 байт.

Мы не можем обратиться к отдельному биту (а если и сможем, то программа будет работать медленно).

Для формирования четных строк (нулевая – четная) нужно обращаться к видеостранице с начальным адресом В8000h.

(unsigned char _far*) 0xВ8000000L;

для нечетных – нужно добавлять 2000h.

Теперь необходимо рассчитать номер байта, куда будет записан код цвета пиксела.

В одном ряду 80 байт (320 пикселов); для определения номера байта (номера ячейки видеопамяти) нужно Х-координату пиксела разделить нацело на 4 и прибавить количество байт, соответствующих координате Y. При этом надо учесть, что координате Y == 0 соответствует первая строка (строка № 0) ячеек видеопамяти на странице № 0, а координате Y == 3 соответствует вторая строка (строка № 1) ячеек видеопамяти на странице № 1, имеющей смещение 2000h от начала видеобуфера, поэтому координату Y надо делить нацело на 2.

Номер байта при известных координатах X, Y определяется так:

N = 80 * Y/2 + X/4

– для четных Y;

и N = 80 * Y/2 + X/4 + 2000h

– для нечетных Y.

Если надо вывести 3 пиксел в 50 байте, то надо использовать сдвиг в 50-м байте, рассчитав остаток от деления номера пиксела на 4.

Т ехнология изменения цвета пиксела. П оследовательность действий.

1. Обращение к байту, где есть заменяемый пиксел, занесение этого байта во вспомогательный буфер размером 1 байт, а затем использование масок с применением операций конъюнкции, дизъюнкции и регистрового сдвига.

Необходимо взять маску: 11110011, –

и выполнить операцию логического умножения (логическое «И», конъюнкция) – для обнуления заменяемых разрядов.

2. Формирование маски:

mask1= C0h (11000000)

mask1>>=4==00001100 (сдвиг вправо на 4);

~(mask1)== 11110011 (инверсия).

00011111– вспомогательный буфер;

^

11110011 – маска

00010011 – сохранены все биты, кроме заменяемых.

3. 27.10Теперь необходимо сделать маску, у которой все биты – нулевые, кроме битов 3-го пиксела, которым придаём нужное значение (операцией логического сложения, "ИЛИ”, т.е. дизъюнкцией).

00010011 (рабочий байт)

V

00001000 (маска № 2)

00011011

Для подсчёта сдвига от начала байта необходимо номер пиксела разделить на 4, взять остаток и домножить его на 2.

mod 15/4==3;

При формировании маски № 1 для пиксела № 0 сдвиг от начала – 0;

для № 1 сдвиг ­– 2;

2 – 4;

3 – 6;

(в программе х=160, у=100);

Для 4 строки на (экране) на 1 видеостранице надо брать только 2-й ряд байтов, который начинается с B8050h.

(Побитовое умножение на 3 ~ делению по модулю 4).