Скачиваний:
93
Добавлен:
09.05.2014
Размер:
37 Мб
Скачать
☆

Алгоритмы кг. Построение точки на растре.

Построение точки (дисплей 256х256 точек).

Объем ВП=32х256байт=8Кб.

Х

Y

Содержимое байта

№ байта

Х=0

Y=0

1

0

0

0

0

0

0

0

0 байт

Х=1

Y=0

0

1

0

0

0

0

0

0

0 байт

Х=2

Y=0

0

0

1

0

0

0

0

0

0 байт

Х=7

Y=0

0

0

0

0

0

0

0

1

0 байт

Х=8

Y=0

1

0

0

0

0

0

0

0

1 байт

Х=9

Y=0

0

1

0

0

0

0

0

0

1 байт

Х=15

Y=0

0

0

0

0

0

0

0

1

1 байт

Задача: в байт с адресом 3 записано Сколько точек увидим на экране и с какими координатами?

(Ответ: 2 точки Х1=26 Y1=0 Х2=30 Y2=0).

Что надо сделать, чтобы поставить на темном экране точку с заданными координатами X, Y?

Надо найти адрес байта в видеопамяти и бит, в который необходимо записать 1 (на фоне всех основных нулей в ВП). Для предыдущего случая разрешения 256х256 точек Координаты Х от 0…255 Y от 0…255. Выделим для хранения этих координат 2 регистра. Разрядность регистров – 8 разрядов.

Как зависит адрес байта видеопамяти от координаты Y?

Одна строка развертки – 32 байта ВП, поэтому адрес байта ВП, соответствующий началу строки = 32*Y.

Как зависит адрес байта видеопамяти от координаты Х?

Изменение координаты Х от 0 до 7 - байт №0

Изменение координаты Х от 8 до 15 - байт №1

Адрес байта (относительный) в строке = целое(х/8).

13 бит = адрес байта ВП (213=8192 байта = 8Кб).

Определение положения бита в байте?

Положение бита в байте определяет координата Х. Остаток от деления Х на 8 определяет положение «1» в байте.

Алгоритм построения точки на растре по заданным координатам х и y.

  1. Выделим 13 разрядов адреса байта (5 старших разрядов – координата Х + 8 разрядов – координата Y).

  2. Формируем код, соответствующий положению «1» в байте (точка на экране).

Варианты:

А. Используем 3 младших разряда координаты Х в качестве счетчика числа сдвигов для сдвига

предварительно подготовленной маски 10000000 вправо.

Б. Заводим в памяти все возможные варианты положения «1» в байте и используем 3 младших разряда

координаты Х для выбора у памяти нужного значения. Выделение 3х младших разрядов координаты Х:

Координата Х

01001110 &

Маска

00000111

результат

00000110



Построение точки в разных графических адаптерах.

Для четных строк: Адрес байта = целое(Y/2)*80+x/8

Для нечетных строк: Адрес байта = целое(Y/2)*80+x/8+2000h

Определение четности/нечетности строки.

Y сдвигаем вправо на 1 бит =Y/2 (что тоже требуется и по соответствующему признаку в регистре флагов осуществляется переход либо без добавления 2000h, либо с добавлением).

Умножение Y/2 на 80.

Y/2*80= Y/2*(16+64). Y/2 – сдвиг влево на 4 разряда (Y/2*16). Запоминаем Y/2*16. Y/2*16 - сдвиг влево на 2 разряда (Y/2*64). Сложение (Y/2*16) и (Y/2*64).

CGA – цветной.

320 точек в строке Х 200 строк развертки. В строке 80 байт, в байте 4 точки. Для четных строк:

Адрес байта = целое(Y/2)*80+x/4. Для нечетных строк: Адрес байта = целое(Y/2)*80+x/4+2000h

Надо найти положение 2х битов цвета в байте. Как это сделать?

Четыре возможных положения битов цвета в байте: ХХ000000 00ХХ0000 0000ХХ00 000000ХХ.

Вариант: заводим маску 11000000 и сдвигаем ее вправо на остаток (Y/4). Коды цвета представляем в виде байта, например, 01010101 вместо 01. С найденной маской положения двух битов цвета и байтов кода цвета выполняем операцию «AND». Полученный код записываем в видеопамять.

ПРОБЛЕМА: все хорошо, если ставим точку на пустом экране. Если же в ВП уже есть сформированная картинка, то существуют 2 опасности:

  1. Если записать в память по mov, то можно затереть соседние биты байта (например, код записываемый в байт ВП =00000100 - обнулит разряды байта 0,1,4,5,6,7,8)

  2. Если записать в память по or, то можно получить точку другого цвета, так как в двух битах байта ВП может быть уже записан код цвета 01, тогда 01 OR 10 = 11.

ВЫХОД: предварительная очистка двух бит в байте, в которые будет записываться код цвета. Для очистки можно , например использовать полученную маску. Например: 00110000 инвертируем 11001111 и используя операцию AND между инвертированной маской и байтом видеопамяти производим очистку. Затем записываем код цветной точки в байт по OR.

Соседние файлы в папке конспект лекций