Графические устройства

         

Рисование линии режим True Color трехбайтовый код



Пример 7.9. Рисование линии, режим True Color, трехбайтовый код

horline: push bx сохраняем содержимое регистра bx
mov ebx, eax копируем еах в ebx
shr ebx, 16 bx = старшие разряды кода точки
hrln__l : cmp di, -3 это последняя точка в окне 9
jae hrln_3 -> да, особый случай
stosw запись двух младших байтов кода
mov es: [di], Ы запись старшего байта кода
hrln_2 : inc di переадресация операнда
loop hrln 1 управление повторами цикла
pop bx восстанавливаем содержимое bx
ret возврат из подпрограммы
hrln 3: call wrtpnt запись кода особой точки
call NxtWinA установка следующего окна
jrap short hrln 2 короткий переход на метку hrln_2

Для упрощения действий, выполняемых в основном цикле примера 7.9, код точки надо расположить в регистрах ах и bх. Исходное содержимое регистра bх сохраняется в стеке, а на его место помещается старшая половина регистра еах, поэтому код красного цвета оказывается в регистре bl.



Основной цикл имеет метку hrin_i и начинается с проверки адреса. Если окажется, что до конца сегмента осталось больше чем 3 байта, то продолжается выполнение основной части цикла. Сначала в видеопамять записываются коды двух младших байтов точки, а затем код старшего байта. Затем производится переадресация операнда, и команда loop управляет повторами цикла. По окончании цикла восстанавливается исходное содержимое регистра bx и происходит возврат на вызывающий модуль.

Особые точки обрабатывает фрагмент примера, имеющий метку hrin_3. Переход на нее происходит в тех случаях, когда до конца видеосегмента остается меньше четырех байтов. При этом вызывается подпрограмма wrtpnt (см. пример 7.1) для записи кода точки, устанавливается следующее окно видеопамяти и происходит переход на метку hrin_2 для продолжения цикла.

Если вам придется работать с видеокартой, поддерживающей в режимах True Color трехбайтовый код точки, то составьте вариант примера 7.6, работающий с таким кодом. Мы не описываем этот вариант потому, что пока подобные видеокарты не получили широкого распространения.

Замечание 2
Замечание 2

Рисование линий сводится к многократно повторяемой записи одного и того же кода в подряд расположенные адреса видеопамяти. В видеорежимах direct color этот код может занимать 2, 3 или 4 байта и от его размера зависит способ записи в видеопамять. Это обстоятельство не позволяет составить одну универсальную подпрограмму для рисования линий в любых видеорежимах VESA. Однако если исключить из рассмотрения трехбайтовый код точки, то можно составить универсальную заготовку подпрограммы, в которой варианты некоторых команд будут выбираться Макроассемблером в зависимости от значения специального признака.

 


Содержание раздела