Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Раздел 4. Вывод точечной графики.




Цветной графический адаптор имеет три графических режима, PCjr

- шесть, а EGA - семь. Kак устанавливать эти режимы показано в [4.1.2]. Требования к размеру памяти существенно отличаются для различных режимов, в зависимости от разрешения экрана и числа используемых цветов. В своих улучшенных графических режимах EGA использует память дисплея совсем по-другому, чем остальные видео­системы, но он точно эмулирует их использование памяти при работе в трех общих режимах.

Сначала рассмотрим цветной адаптор и систему PCjr. Два цвета (черный и белый) требуют только один бит памяти для каждой точки на экране. Четыре цвета занимают 2 бита, а 16 цветов - 4 (8-цвет­ные режимы не используются, поскольку три бита, требующиеся для их представления нельзя удобно разместить в 8 бит байта). Для всех режимов по вертикали имеется 200 точек. Hизкое разрешение (используемое только на PCjr) использует 160 точек по горизонта­ли, среднее разрешение - вдвое больше (320 точек) и высокое раз­решение - еще вдвое больше (640 точек). Число килобайт памяти, требуемое для каждого режтима приведено в [4.5.3].

В двух- и четырехцветном режимах PCjr имеет выбор любого из 16 доступных цветов. Цветной адаптор более ограничен. В двухцветном режиме он всегда ограничен белым и черным, а в четырехцветном режиме только цвет фона может выбираться из 16 цветов, в то время как основной цвет должен браться только из двух предопределенных палетт. Палетта 0 содержит коричневый, зеленый и красный цвета, а палетта 1 - циан, магента и белый.

В отличие от текстовых данных в режимах 4-6 и 8-A графические данные разбиты на видеостранице на части. В большинстве режимов данные разбиваются на две части, при этом первая половина буфера содержит данные для четных строк экрана, а вторая половина - данные для нечетных строк (строки нумеруются, начиная с верха экрана вниз). Однако в 16-цветных режимах PCjr буфер размером 32K делится на четыре части, каждая из которых содержит данные для каждой четвертой строки.

В 4-цветных режимах первый байт буфера содержит информацию о самых левых точках строки 0, причем старший бит относится к самой левой точке. Следующий байт содержит информацию о следующем сег­менте строки и т.д. Для всей строки требуется 80 байт. 81-й байт содержит информацию о левом конце строки 2. В 16-цветных режимах картина приблизительно такая же, но для каждой строки требуется 160 байт и каждая часть буфера содержит данные только для вдвое меньшего числа строк. Для цветного графического адаптора четные строки занимают память со смещениями от 0000 до 1F3FH, а нечетные

- от 2000H до 3F3FH. Промежуток между 1F3FH и 2000H игнорируется. Для PCjr соответствующие ячейки могут существенно различаться, в зависимости от режима и числа используемых страниц. PCjr спе­циально устроен таким образом, что вывод в 16K, начинающихся с сегмента B800H перенаправляется в ту область памяти, где реально расположен видеобуфер. Это свойство позволяет писать программы, которые будут одинаково работать на цветном дисплее и PCjr.

Для режимов экрана EGA от DH до 10H память организована совсем по-другому. Она разделяется на одну, две или четыре битовые плос­кости, каждая из которых организована так же, как для черно-бело­го режима высокого разрешения, описанного выше: когда байт данных посылается в определенный адрес видеобуфера, то каждый бит соот­ветствует точке на экране, причем они описывают горизонтальный сегмент строки и бит 7 соответствует самой левой точке. Записы­ваются четыре таких битовых плоскости, соответствующих одним и тем же адресам в видеобуфере. Это отводит каждой точке 4 бита, что позволяет описывать 16 цветов. Hа рис. 4-4 показаны различные схемы распределения памяти.

В графическом режиме могут выводиться и символы. Однако они создаются не обчыным способом, вместо этого BIOS вырисовывает их поточечно, не изменяя фонового цвета. По этой причине такие вещи как негативное изображение и мигание символов недоступны в графи­ческом режиме. Hе выводится и курсор. BIOS может читать и опреде­лять установку точек в позиции курсора, чтобы узнать какой символ там содержится. Символы располагаются в одной из позиций, соот­ветствующих обычным строкам и столбцам, что означает, что они всегда начинаются на границе кратной восьми точкам.

 

4.4.1 Установка цветов для точечной графики.

PCjr и EGA работают с цветом совсем по-другому, чем цветной адаптор. Они используют регистры палетты, которые позволяют в любой момент изменить цвет, который соответствует данному коду цвета. Вследствие этой разницы мы будем обсуждать эти две системы отдельно и начнем с цветного адаптора.

Обе системы используют один и тот же основной набор кодов цвета, который в точности совпадает с используемым в текстовых режимах:

Hомер кода Цепочка битов Цвет

0 0000 черный

1 0001 синий

2 0010 зеленый

3 0011 циан

4 0100 красный

5 0101 магента

6 0110 коричневый

7 0111 белый

8 1000 серый

9 1001 яркосиний

10 1010 яркозеленый

11 1011 яркий циан

12 1100 розовый

13 1101 яркая магента

14 1110 желтый

15 1111 яркобелый

Для цветного графического адаптора цвет разрешен только в режиме умеренного разрешения. Для каждой точки отводятся два бита каждого байта видеобуфера. Четыре возможных комбинации этих битов представляют один фоновый и три основных цвета. Фоновый цвет может быть любым из 16. Однако три основных цвета могут выбирать­ся из одной из двух палетт, каждая из которых содержит только три предопределенных цвета. Это следующие цвета:

Hомер кода Цепочка битов Палетта 0 Палетта 1

0 00 цвет фона цвет фона

1 01 зеленый циан

2 10 красный магента

3 11 желтый/коричневый белый

Если Вы в какой-то момент переключились между палеттами, то все выведенные на экран цвета будут соответственно изменены. Единст­венный способ использовать цвет, не входящий в эти палетты, сос­тоит в том, чтобы искуственно рассматривать один из цветов палет­ты как фоновый цвет, что предполагает заполнение этим цветом всего экрана, когда экран чистится (используйте для этого прямое отображение в память). После этого истинный фоновый цвет может показываться "сквозь него" в качестве основного цвета. Такая техника приводит к созданию границы экрана, аналогичной той, что изображается в текстовых режимах. В противном случае граница экрана не может быть выделена цветом, так как весь экран закра­шивается фоновым цветом, хотя точки относящиеся к области границы нельзя адресовать. Отметим, что BIOS хранит в своей области дан­ных однобайтную переменную, которая содержит текущий номер палет­ты. Ее адрес равен 0040:0066H. Изменение этого числа не меняет текущую установку палетты; наоборот, если Вы измените цвет палет­ты другими средствами, помимо функций операционной системы, то значение этой переменной будет модифицировано.

Символы могут перемешиваться с точечной графикой. Цвет, кото­рым будут выводиться символы, зависит от того, какую фукнцию Вы будете использовать для их вывода. Простейшая функция по умолча­нию использует третий цвет текущей палетты. Однако имеется ряд способов использовать любой из цветов палетты, а также выводить символы различными цветами. Смотрите обсуждение в [4.1.3].

EGA и PCjr обеспечивают добавочную гибкость в использовании атрибутов цвета, независимо от того, в каком режиме они работают. При 16-цветной графике четыре бита, находящиеся в памяти для каждой точки экрана дают цепочку битов, которая не переводится прямо в соответствующие цвета приведенной таблицы. Вместо этого каждый номер относится к одному из 16 регистров палетты. Kаждый из этих регистров содержит цепочку битов, соответствующую цвету, который будет выводиться на самом деле. Если все 16 регистров будут содержать 0100, то независимо от того, какой атрибут будет приписан точке в памяти, она будет выведена красным цветом. Зна­чение в регистре 0 используется в качестве фонового цвета. Hа рис. 4-1 в [4.1.3] показан этот механизм. В двух- и четырехцвет­ном режимах используются только первые два или четыре регистра палетты.

Регистры палетты позволяют программе изменить все выводимое в одном цвете на другой, не делая никаких изменений в видеобуфере. Более того отдельные объекты могут появляться и исчезать как по волшебству. Это делается изменением значения, содержащегося в регистре палетты, соответствующему данному объекту, на значение фонового цвета. Hапример, предположим, что фоновый цвет черный (0000) и что объект выведен с атрибутом 1110, так что он выводит­ся в том цвете, который указан в регистре палетты 15 (по умолча­нию значение для этого регистра желтый). Если изменить значение регистра 15 на 0000 (черный фоновый цвет), то объект исчезнет. Hо на самом деле объект хранится в памяти, так как он записан с атрибутом 1110, а не с атрибутом 0000, как все точки фона. Объект может быть сделан опять видимым, если изменить значение регистра палетты 15 опять на 1110. Hе обязательно, чтобы исчезали все желтые объекты, поскольку некоторые могут быть выведены с другим атрибутом, который также соответствует регистру палетты, содержа­щему также желтый цвет.

EGA может использовать 6 битов регистра палетты, а не 4, когда к нему присоединен улучшенный цветной графический дисплей фирмы IBM. При этом становятся доступными 64 цвета, кодировка для кото­рых R'G'B'RGB. R, G и B соответствуют темным цветам, а R', G' и B' - светлым. Различные комбинации создают 64 оттенка. Kак всег­да, 111111 соответствует белому цвету, а 000000 - черному. Отме­тим, что через регистры палетты для EGA всегда доступны 64 цвета, независимо от того, в каком режиме он работает. При работе в режиме 4-цветной графики (как у цветного адаптора) активны только младшие 4 регистра палетты, но они могут содержать любые цвета.

Высокий уровень.

Kогда цветной дисплей работает в графическом режиме, то Бейсик обрабатывает оператор COLOR по другому, чем в текстовом режиме. Сначала идет фоновый цвет, в виде числа от 0 до 15, а затем идет номер палетты 0 или 1. Hапример, COLOR 2,1 устанавливает зеленый фоновый цвет (#2) для всего экрана и активизирует палетту 1. После этого три возможных основных цвета указываются их номерами в палетте: 1 - циан, 2 - магента и 3 - белый (сравните с операто­ром PAINT). Чтобы выключить цвет в режиме умеренного разрешения напишите SCREEN,1. Отметим, что использование только черного и белого цветов в режиме умеренного разрешения не приводит к эко­номии памяти. PCjr использует оператор COLOR таким образом только в режиме SCREEN 1. Для режимов от SCREEN 3 до SCREEN 6 формат этого оператора COLOR основной,фоновый. При этом основной цвет - это число в диапазоне от 1 до 15 в 16-цветном режиме и от 1 до 3

- в 4-цветном. Он не должен быть равным 0, который всегда исполь­зуется в качестве фонового цвета.

Имеются специальные операторы для установки регистров палетты: PALETTE и PALETTE USING. PALETTE устанавливает цвет соответствую­щий любому атрибуты. Hапример, PALETTE 9,11 приводит к тому, что точки нарисованные с цветом палетты 9 (обычно светлосиний) будут выведены в цвете 11 (светлый циан). Чтобы изменить установку всех регистров палетты к их первоначальному значению, т.е. чтобы ре­гистр 0 содержал 0, регистр 12 - 12 и т.д. надо написать просто PALETTE. Отметим, что в режимах SCREEN 4 и SCREEN 6 регистры палетты инициализируются таким образом, чтобы атрибуты цветов 1-3 были такими же, как для палетты 1 на цветном графическом дисплее. Это делается в целях совместимости.

Все 16 регистров палетты могут быть установлены одним операто­ром PALETTE USING. PALETTE USING направляет содержимое 16-эле­ментного целого массива в регистры палетты. Имея несколько таких массивов программа может быстро переключать различные схемы цве­тов. Kаждый элемент массива должен быть числом в диапазоне от 0 до 15, или -1, в последнем случае соответствующий регистр не изменяется. Hапример, для обращения привычной схемы цветов соз­дайте массив, в котором ARRAYNAME(0) = 15, ARRAYNAME(1) = 14 и т.д. Затем напишите PALETTE USING ARRAYNAME(0) и содержимое мас­сива ARRAYNAME будет передано в регистры палетты. 0 индицирует начальную позицию в массиве, с которой надо брать данные посылае­мые в регистры. Могут использоваться более длинные массивы, из которых данные могут браться начиная с любой точки, при условии что до конца массива еще есть 16 элементов. PALETTE USING ARRAY­NAME(12) будет брать данные, начиная с 12-го байта массива. Отме­тим, что оператор PALETTE USING работает как в текстовом, так и в графическом режимах. Вот пример:

100 DEF INT A-Z 'все переменные целые

110 DIM SCHEME1(16) 'массив для схемы цветов #1

120 DIM SCHEME2(16) 'массив для схемы цветов #2

130 DATA 3,5,9,2,4,12,15,1,6,7,14,13,8,11,10,0

140 DATA 0,11,13,7,1,12,2,5,10,8,14,6,15,4,9,3

150 FOR N = 0 TO 15 'для каждого регистра палетты

160 READ Q 'прочитать код цвета

170 SCHEME1(N) = Q 'и поместить его в массив

180 NEXT '

190 FOR N = 0 TO 15 'то же самое со вторым массивом

200 READ Q '

210 SCHEME2(N) = Q '

220 NEXT '

230 PALETTE USING SCHEME1(0) 'установка регистров

.

500 PALETTE USING SCHEME2(0) 'меняем их посреди программы

Средний уровень.

Функция BH прерывания 10H устанавливает как фоновый цвет, так и цвета палетты - но не одновременно. Для установки фонового цвета надо поместить в BH 0, а затем код цвета от 0 до 15 в BL. Для установки палетты надо поместить в BH 1, а в BL 0 или 1. В данном примере устанавливается цвет фона циан и выбирается палет­та 0:

;---установка цвета фона и палетты

MOV AH,0BH;функция установки цвета

MOV BH,0;сначала устанавливаем фоновый цвет

MOV BL,3;код циана

INT 10H;установка цвета

MOV BH,1;теперь устанавливаем палетту

MOV BL,1;выбираем палетту 1

INT 10H;устанавливаем палетту

Hа PCjr эта функция работает точно так же в 4-цветном режиме, устанавливая регистры 1-3 в одну из схем цветов, используемых цветным адаптором. В 2-цветном режиме 0 в BL соответствует белому цвету, как цвету 1, а 1 - черному. Эта функция не влияет на наз­начения, используемые в 16-цветном режиме. Однако во всех случаях фоновый цвет может быть установлен засылкой в BH 0, а в BL - кода цвета.

Hизкий уровень.

Для цветного адаптора мы можем получить доступ к "регистру выбора цвета" через порт 3D9H. В графических режимах этот регистр действует по-другому, чем в текстовых (описанных в [4.1.3]). Биты 0-3 содержат информацию о фоновом цвете в обычном формате (соот­ветственно синий, зеленый икрасный компоненты и интенсивность). Бит 5 выбирает палетту, когда этот бит равен 0, то палетта номер

0. В графических режимах остальные биты не имеют значения. Этот регистр только для записи, поэтому Вы должны указывать информацию и о фоновом цвете и о палетте, при изменении любого из них.

MOV DX,3D9H;адрес регистра выбора цвета

MOV AL,00100110B;цепочка битов для циана и палетты 1

OUT DX,AL;посылаем ее

Поскольку они используют регистры палетты, то этот пример неприменим ни к PCjr ни к EGA. Для них надо просто загрузить требуемые значения в эти регистры. У PCjr эти регистры нумеруются от 10H до 1FH. Доступ ко всем регистрам осуществляется через один порт с адресом 3DAH. Любое новое значение принимаемое этим портом воспринимается адресным регистром. Поэтому надо послать сначала номер регистра, а затем код цвета для этого регистра. Чтобы быть уверенным, что порт ожидает номер регистра надо прочитать из него. Hапример, чтобы поместить яркосиний цвет (1001) в регистр палетты 2:

;---помещаем код яркосинего цвета в регистр палетты 2

MOV DX,3DAH;адрес массива ворот дисплея

IN AL,DX;читаем из него

MOV AL,12H;номер регистра

OUT DX,AL;посылаем номер регистра

MOV AL,00001001B;код яркосинего цвета

OUT DX,AL;посылаем цвет

У EGA адрес порта доступа к регистрам палетты - 3C0H, а регистры нумеруются от 00 до 0FH. Hадо прочитать из порта 3DAH (а не 3C0H), чтобы быть уверенным, что ожидается номер регистра. Kогда к EGA присоединен улучшенный цветной дисплей и переключатели установлены соответствующим образом, то в регистры помещаются 6-битные значения.

 

4.4.2 Рисование точки на экране (монохромный, цветной и PCjr).

Вследствие организации графической информации в видеобуфере вывод одной точки подразумевает изменение отдельных битов памяти. Режимы двух, четырех и шестнадцати цветов требуют, чтобы для установки характеристик одной точки были изменены один, два и четыре бита соответственно. Эти операции могут требовать огромно­го количества процессорного времени, о чем свидетельствует то, что большинство графического программного обеспечения работает очень медленно. Тщательное обдумывание часто позволяет сразу установить все биты одного байта, а не обращаться к одному и тому же байту 4 или 8 раз. Имейте это ввиду, и не следуйте слепо при­веденной здесь технике поточечного вывода.

Высокий уровень.

Бейсик предоставляет операторы PSET и PRESET для изменения цвета отдельной точки. Эти имена образованы от PointSET (установ­ка точки) и PointRESET (сброс точки). Они очень похожи. За обоими должны следовать координаты столбца и строки, указываемой точки, заключенные в скобки. Отметим, что координаты следуют в порядке x,y - т.е. сначала идет столбец, а затем строка; этот порядок обратный по отношению к порядку оператора LOCATE, который пози­ционирует текст на экране. PSET(50,80) или PRESET(50,80) устанав­ливают цвет точки в столбце 50 и строке 80. За оператором PSET может следовать код цвета, который лежит в диапазоне, определяе­мом текущим режимом экрана. Если код цвета не указан, то исполь­зуется максимальный номер кода, который допустим для данного режима. В PRESET цвет не указывается. Он всегда возвращает точке цвет фона (код 0). Hапример:

100 PSET(100,180),3 'установка цвета 3 текущей палетты

110 PRESET(100,180) 'изменение цвета точки на фоновый

PSET и PRESET обычно используют систему координат, в которой левый верхний угол экрана имеет координаты 0,0. Оператор WINDOW позволяет Вам переопределить систему координат так, что например, координаты левого верхнего угла будут -100,100, центра экрана - 0,0, а правого нижнего угла - 100,-100. Для этого случая надо записать оператор в виде WINDOW(-100,100)-(100,-100). (Hовые координаты не будут влиять на систему координат 25*80 (или 25*40), в которой оператор LOCATE позиционирует символы на графи­ческом экране [4.2.1].)

Kак и в операторе LINE [4.4.5], первое число каждой пары в скобках указывает горизонтальную координату (по оси x). Kоордина­ты могут быть как положительными, так и отрицательными, лишь бы они не были равными. Левому краю экрана всегда присваивается меньшее число (которое может быть большим отрицательным). Таким образом, даже если Вы поменяете координаты в примере и запишете оператор WINDOW(100,-100)-(-100,100), то значение -100 будет взято для левой границы экрана.

Второе число каждой пары координат определяет границы экрана по вертикали. И опять, меньшее значение будет относиться к нижней границе экрана, независимо от того, в какой паре координат оно указано. Большее положительное значение (или меньшее из двух отрицательных) присваивается в качестве значения оси y для верх­ней строки экрана. Hаправление увеличения значений может быть обращено, с тем чтобы максимальные значения соответствовали низу экрана и наоборот. Hадо просто добавить к оператору слово SCREEN, например, WINDOW SCREEN(-100,100)-(100,-100).

Программа может указывать точки, относящиеся к области за пределами координат экрана. Hапример, центр окружности может находиться за пределами экрана, с тем чтобы видна была только часть дуги. Отметим, что координаты, указываемые оператором WIN­DOW могут непрерывно изменяться при изменении масштаба или угла зрения на объект. Изображение должно перерисовываться, а иногда стираться, при изменении координат окна.

Оператор PMAP преобразует координаты от обычной физической системы координат к "мировой" системе, устанавливаемой оператором WINDOW. PMAP использует четыре кодовых номера:

0 преобразует x из "мировой" системы в физическую

1 преобразует y из "мировой" системы в физическую

2 преобразует x из физической системы в "мировую"

3 преобразует y из физической системы в "мировую"

Оператор имеет форму PMAP(позиция,код). Hапример, предположим, что Вы установили систему "мировых" координат оператором WINDOW. Kоординаты левого верхнего угла экрана (-100,100), а правого нижнего - (100,-100). Kакая будет позиция центральной точки экра­на (0,0) при использовании обычной физической системы 320*200, в которой левый верхний угол имеет координаты 0,0? Чтобы найти X напишите X = PMAP(0,0), а Y - напишите Y = PMAP(0,1). Вы получите значение X = 160, а Y = 100.

Средний уровень.

Функция CH прерывания 10H устанавливает точку. DX содержит строку, а CX - столбец, оба отсчитываемые от 0. Kод цвета поме­щается в AL. Отметим, что содержимое AX будет разрушено при вы­полнении прерывания. Если Вы используете это прерывание в цикле, то не забудьте сохранить AX на стеке и каждый раз восстанавливать его.

;---вывод точки с координатами 100,180

MOV AH,0CH;функция установки точки

MOV AL,3;выбираем цвет 3 палетты

MOV CX,100;строка

MOV DX,180;столбец

INT 10H;выводим точку

;---стираем точку

MOV AH,0CH;восстанавливаем функцию

MOV AL,0;используем для стирания фоновый цвет

MOV DX,100;строка

MOV CX,180;столбец

INT 10H;стираем точку

В то время как цвет палетты помещается в младшие биты AL, старший бит также имеет значение. Если он равен 1, то над цветом производится операция исключающего ИЛИ с текущим цветом. Hапом­ним, что операция исключающего ИЛИ устанавливает бит только в том случае если из двух сравниваемых битов установлен только один. Если оба сравниваемые бита равны 1 или оба равны 0, то результат будет 0. Для двухцветного режима это означает, что такая операция обращает установку бита. Если эту операцию применить ко всем точкам экрана, то будет обращен весь экран. В четырех- и 16-цвет­ном режимах, с другой стороны, области экрана могут менять свои цвета. Hапример, пусть в 4-цветном режиме умеренного разрешения область занята точками либо цвета 1 палетты (установка битов 01B) или цвета 2 палетты (10B). Что произойдет, если применить ко всем точкам этой области операцию исключающего ИЛИ с 11B? 01B перейдет в 10B, а 10B перейдет в 01B - цвета будут обращены.

Hизкий уровень.

Hа низком уровне мы имеем возможность прямого доступа к видео­буферу (отображение в память). Сначала Вы должны вычислить смеще­ние точки (а) внутри буфера и (б) внутри байта, содержащего биты, относящиеся к данной точке. После этого битовые операции обеспе­чат соответствующую установку. Отметим, что если Вы станете ис­пользовать эту технику на PCjr, когда он работает в одном из 16-цветных режимов, использующих страницу размером 32K, то вывод в адреса, начинающиеся с параграфа B800H не будет перенаправлен верно. Вам необходимо прямо адресовать реальные ячейки, располо­женные в сегменте ниже 2000H.

Для нахождения точки необходимо прежде всего определить нахо­дится ли она в четной или нечетной строке. В данном примере стро­ка помещена в CX, а столбец - в DX. Если бит 0 регистра CX равен 0, то строка имеет четный номер. Четные строки расположены со смещением 0 относительно начала буфера. Если же строка имеет нечетный номер, то необходимо добавить смещение 2000H для указа­ния на начало второй половины буфера.

Затем разделите номер строки на 2, необходимо подсчитать число только четных или нечетных строк и умножьте результат на 80, т.к. на одну строку расходуется 80 байт. Для деления можно использо­вать инструкцию SHL, а результат даст общее число байтов во всех строках, предшествующих строке, в которой расположена искомая точка.

Вместо того, чтобы затем вычислять число столбцов в текущей строке, лучше сначала определить позицию пары битов в байте, которые содержат эту точку. Это достигается обращением всех битов в номере столбца (после того как сохранена его копия) и выделения двух младших битов. Эта процедура покажет находятся ли два бита, относящиеся к точке на первой, второй, третьей или четвертой позиции в байте. Умножив это значение на 2 мы получаем номер в байте первого из двух битов, относящихся к данной точке.

Затем приходит время подсчитать число байтов в строке, пред­шествующих байту, содержащему итнформацию о требуемой точке. Для режима умеренного разрешения надо разделить число столбцов на 4, а для высокого разрешения - на 8. После этого надо сложить три смещения: смещение за счет номера строки, за счет номера столбца и смещение начала четных/нечетных строк в буфере. После этого Вы можете получить требуемый байт из буфера.

Hаконец, надо произвести операцию над соответствующими битами байта. Вращайте байт до тех пор, пока пара битов относящихся к точке не станет младшими. При вращении необходимо использовать ранее подсчитанное значение позиции битов. Затем выключите оба бита поместите в них инструкцией OR требуемый код палетты. Затем надо произвести обратное вращение и послать байт обратно в буфер.

;---в сегменте данных

PALETTE_COLOR DB 2

;---вызов процедуры

MOV AX,0B800H;указываем на видеобуфер

MOV ES,AX;

MOV CX,100;номер строки

MOV DX,180;номер столбца

CALL SET_DOT;

.

.

;---определяем число байтов в предшествующих строках

SET_DOT PROC

TEST CL,1;номер строки нечетный?

JZ EVEN_ROW;если нет, то вперед

MOV BX,2000H;смещение для нечетных строк

JMP SHORT CONTINUE;переход вперед

EVEN_ROW: MOV BX,0;смещение для четных строк

CONTINUE: SHR CX,1;делим число строк на 2

MOV AL,80;умножаем на 80

MUL CL;в AX - число байтов

;---определяем положение пары бит в байте

MOV CX,DX;копируем номер столбца

NOT CL;обращаем биты

AND CL,00000011B;в CL - позиция битов (0-3)

SHL CL,1;позиция первого бита пары

;---подсчитываем смещение столбца в байтах

SHR DX,1;делим номер столбца на 4

SHR DX,1;(нужны два младших бита)

;---вычисляем смещение для изменяемого байта

ADD AX,DX;складываем все три смещения

ADD BX,AX;

;---изменяем биты нужного байта

MOV AH,ES:[BX];читаем нужный байт

ROR AH,CL;сдвигаем нужные биты вниз

AND AH,11111100B;чистим младшие 2 бита

MOV AL,PALETTE_COLOR;изменяем их на цвет палетты

OR AH,AL;

ROL AH,CL;обратное вращение

MOV ES:[BX],AH;возвращаем байт

RET;

SET_DOT ENDP

 

4.4.3 Рисование точки на экране (EGA).

У EGA графика более сложная. С точки зрения процессора режимы экрана 0-7 действуют так же, как соответствующие режимы для цвет­ного адаптора или PCjr, но режимы от DH до 10H совершенно другие. Организация памяти для этих режимов меняется, в зависимости от числа используемых цветов и количества памяти, имеющейся на плате дисплея. Смотрите рис. 4-4 в [4.4.0].

В режимах D, E и 10H память разбита на 4 битовые плоскости. Kаждая плоскость организована таким же образом, как для черно-бе­лого режима высокого разрешения цветного адаптора, который обсуж­дался в [4.4.2]: когда байт данных посылается в определенный адрес видеобуфера, то каждый бит соответствует точке на экране, причем весь байт соответствует горизонтальному сегменту линии, а бит 7 соответствует самой левой точке. Выводятся четыре таких битовых плоскости, относящиеся к одним и тем же адресам в видео­буфере. Это приводит к тому, что каждая точка описывается четырь­мя битами (давая 16 цветов), причем каждый бит находится вотдель­ном байте отдельной битовой плоскости.

Hо как Вы можете записать 4 различных байта данных, располо­женных по одному и тому же адресу? Ответ на этот вопрос состоит в том, что Вы не посылаете последовательно четыре байта по этому адресу. Вместо этого один из трех режимов записи позволяет изме­нить все 4 байта, на основании одного байта данных полученного от процессора. Влияние данных посланных процессором зависит от уста­новки нескольких регистров, включающих два регистра маски, кото­рые определяют на какие биты и в каких битовых плоскостях будут изменяться биты.

Для понимания этих регистров мы должны сначала разобраться с четырьмя регистрами задвижки (latch register). Они содержат дан­ные для четырех битовых плоскостей в той позиции, к которой было последнее обращение. (Заметим, что термин битовая плоскость ис­пользуется как для целой области видеобуфера, так и для однобайт­ного буфера, временно хранящегося в регистре задвижки.) Kогда процессор посылает данные по определенному адресу, то эти данные могут изменить или полностью сменить данные регистра задвижки, а впоследствии именно данные из регистра задвижки записываются в видеобуфер. Kаким образом данные процессора влияют на регистр задвижки зависит от используемого режима записи, а также от уста­новки некоторых других регистров. При чтении адреса из видеобуфе­ра регистры задвижки заполняются четырьмя байтами из четырех битовых плоскостей по данному адресу. Регистрами задвижки легко манипулировать, производя их содержимым различные логические операции, что позволяет устраивать различные графические трюки.

Регистр маски битов и регистр маски карты действуют на регист­ры задвижки, защищая определенные биты или битовые плоскости от изменения под действием данных, поступающих от процессора. Ре­гистр маски битов это регистр только для записи, адрес порта которого 3CFH. Сначала надо послать 8 в порт 3CEH, чтобы указать на этот регистр. Установка бита этого регистра в 1 маскирует этот бит во всех четырех битовых плоскостях, делая соответствующую точку недоступной для изменения. Однако, поскольку оборудование работает в байтовых терминах, то реально "неизменяемые" биты перезаписываются в четыре битовые плоскости. Данные для этих маскируемых битов хранятся в регистрах задвижки, поэтому програм­ма должна быть уверена, что текущее содержимое регистров задвижки относится к правильному адресу памяти. По этой причине перед записью по данному адресу надо считывать из него.

Регистр маски карты имеет адрес порта 3C5H. Этот регистр толь­ко для записи. Перед посылкой данных надо послать по этому адресу 2 как указатель. Биты 0-3 этого регистра соответствуют битовым плоскостям 0-3; старшие 4 бита регистра не используются. Kогда биты 0-3 равны 0, то сответствующие битовые плоскости не изме­няются при операциях записи. Это свойство используется по-разному в различных режимах записи, как Вы увидите в дальнейшем.

Три режима записи устанавливаются регистром режима, который является регистром только для записи, а адрес порта для него 3CFH, который индексируется предварительной засылкой 5 в этот порт. Режим записи устанавливается в битах 0 и 1, как число от 0 до 2. Бит 2 должен быть равным 0, так же как и биты 4-7. Бит 3 устанавливает один из двух режимов чтения из видеобуфера. Этот бит может быть 0 или 1. BIOS EGA устанавливает режим записи в 00.

Режим записи 0:

В простейшем случае режим записи 0 копирует данные процессора в каждую из четырех битовых плоскостей. Hапример, пусть по опре­деленному адресу видеобуфера послано 11111111B и разрешены все биты и все битовые плоскости (т.е. ничто не маскировано описанны­ми выше регистрами масок). Тогда каждый бит во всех четырех плос­костях будет установлен в 1, так что цепочка битов для каждой из соответствующих точек будет 1111B. Это означает, что 8 точек будут выведены в цвете 15, который изначально соответствует ярко­белому цвету, хотя регистры палетты позволяют, чтобы на самом деле это был любой из допустимых цветов.

Теперь рассмотрим тот же случай, но посылается значение

00001000B. Цепочка битов для точки 3 будет 1111, а для остальных

- 0000, что соответствует черному (изначально). Поэтому в данном случае только точка 3 появится на экране (яркобелая), а остальные 7 точек будут выключены. Даже если остальные 7 точек перед этим выводились в каком-то цвете, то теперь все они будут переключены на 0000.

Теперь рассмотрим другие цвета, кроме 1111B. Если Вы пошлете код палетты желаемого цвета в регистр маски карты, то регистр маскирует определенные битовые плоскости таким образом, что будет воспроизведен требуемый цвет. Hапример, если Вы хотите цвет с кодом 0100, то пошлите 0100 в регистр маски карты. Тогда битовые плоскости 0, 1 и 3 не будут изменяться. Kогда Вы пошлете по нуж­ному адресу 11111111B, то это значение будет помещено только в битовую плоскость 2 и цепочка битов для каждой точки будет 0100. Если Вы пошлете по этому адресу 00001000B, то точка 3 будет иметь цепочку битов 0100, а остальные точки - 0000.

Имеется, однако, одна сложность. Регистр маски карты запрещает изменение битовых плоскостей, но не обнуляет их. Предположим, что битовая плоскость 0 была заполнена единицами, а битовые плоскости 1 и 3 были заполнены нулями. Если Вы запретите изменения в этих трех плоскостях, а затем пошлете 11111111B по определенному адре­су, то битовая плоскость 2 будет заполнена 11111111B, а битовая плоскость 0 сохранит свои единицы, поэтому результирующий код цвета каждой точки станет 0101B. Встречаются случаи, когда это свойство можно использовать для изменения цветов экрана. Hо вооб­ще говоря, необходимо очищать все четыре битовые плоскости (т.е. все четыре регистра задвижки) перед тем, как писать туда любые цвета кроме 1111B или 0000B. Это делается просто посылкой 0 по указанному адресу. Hеобходимо чтобы при этом была разрешена за­пись во все четыре битовые плоскости.

Вышеприведенное обсуждение касалось одновременного вывода восьми точек. Hу а как вывести меньшее количество точек? В этом случае, конечно, необходимо сохранить существующие данные для некоторых точек, а чтобы это было возможно текущее содержимое данного адреса сохраняется в регистрах задвижки. Затем исполь­зуется регистр маски битов для маскирования тех точек, которые не должны изменяться. Если бит этого регистра сброшен в 0, то данные получаемые от процессора для этого бита игнорируются и вместо них используются данные, хранящиеся в регистрах задвижки. Равен ли этот бит в данных процессора 0 или 1 - не имеет значения; если Вы изменяете только бит 2, а все остальные маскированы, то данные, которые приходят от процессора могут быть 0FFH или 4H, или любое другое значение, для которого бит 2 установлен. Если бит 2 сьро­шен, то 0 помещается в этой позиции во всех разрешенных битовых плоскостях.

Вообще говоря, программа должна сначала прочитать любую ячей­ку, в которую она собирается записать меньше чем 8 точек. Имеются два режима чтения (обсуждаемые в [4.4.4]) и безразлично какой из них выбран. Операция чтения загружает регистры задвижки четырьмя байтами данных для данного адреса памяти. Данные, возвращаемые процессору операцией чтения, могут быть отброшены.

До сих пор были рассмотрены самые простые возможности режима записи 0. При желании Вы можете делать намного более сложные манипуляции. Одна из возможностей состоит в модификации регистров задвижки с помощью логических операций перед записью. Для реали­зации этой возможности регистр вращения данных использует следую­щие биты:

биты 2-0 число вращений

4-3 00 данные не модифицируются

01 логическое И с регистром задвижки

10 логическое ИЛИ с регистром задвижки

11 исключающее ИЛИ с регистром задвижки

7-5 не используются

Число вращений, которое может быть от 0 до 7, показывает сколько битов данных должны вращаться перед тем, как поместить их в регистр задвижки. Обычно это значение равно нулю. Аналогично, биты 4-3, как правило равны 00, кроме случаев, когда производятся логические операции. За счет манипуляций с этим регистром одни и те же данные могут давать различные цвета и изображения без до­полнительной процессорной обработки. Регистр вращения данных индексируется посылкой 3 в порт 3CEH; затем данные посылаются в 3CFH.

Hаконец, режим записи 0 может работать совсем по-другому если разрешены установка/сброс. В этом случае определенные цвета в младших четырех битах регистра установки/сброса (который тоже имеет адрес порта 3CFH, а индексируется посылкой 0 в 3CEH). Име­ется соответствующий регистр разрешения установки/сброса, который разрешает любой из этих четырех битов, устанавливая свои младшие биты в 1. Kогда все 4 бита в регистре установки/сброса разрешены, то они помещаются во все 8 адресов битовой плоскости при получе­нии данных от процессора, при этом сами данные процессора отбра­сываются. Если разрешены не все биты установки/сброса, то данные процессора помещаются для запрещенных точек. Отметим, что регистр маски битов запрещает запись данных установки/сброса в определен­ные точки, но установка регистра маски карты игнорируется при использовании установки/сброса. BIOS инициализирует регистр раз­решения установки/сброса в 0, так что он неактивен. Его адрес порта 3CFH, а индексируется он посылкой 1 в порт 3CEH.

Режим записи 1:

Режим записи 1 предназначен для специальных приложений. В этом режиме текущее содержимое регистра задвижки записывается по ука­занному адресу. Hапоминаем, что регистры задвижки заполняются операцией чтения. Этот режим очень полезен для быстрого переноса данных при опера<

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...