Иллюстрированный самоучитель по SVGA

Работа с прямоугольными областями

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

Переадресация строк

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

offsline = bperline – widthrect*bytppnt = (horsize – widthrect)*bytppnt.

Как видно из этой формулы, значение offsline зависит от видеорежима (переменные Horsize и bytppnt) и от ширины объекта (переменная widthrect), поэтому его приходится вычислять в каждом конкретном случае.

При работе в видеорежимах PPG команды для вычисления значения offsline (пересылка в и вычитание) мы включали в тексты примеров.

При работе в видеорежимах direct color увеличивается не только количество команд, вычисляющих значение offsline, но и количество регистров, в которых расположены операнды этих команд. Поэтому имеет смысл составить короткую подпрограмму, выполняющую необходимые вычисления и учитывающую характеристики установленного видеорежима.

Варианты подпрограммы calloffs. В примере 7.13 показаны два варианта подпрограмм, вычисляющие значение offsline с использованием команд умножения или сдвигов. Входным параметром является значение переменной widthrect, которое указывается в регистре dx. Этот регистр выбран потому, что во всех примерах он использовался для указания ширины прямоугольной области. Для совместимости с ранее приведенными примерами результат вычислений находится в регистре bх.

Пример 7.13. Варианты подпрограмм для вычисления offsline.

; Вариант 1 – вычисление off-sline с использованием сдвигов
calloffs: push ex сохранение содержимого сх
mov ex, wrdppnt ex = величина сдвига
mov bx, horsize bx = ширина экрана в точках
sub bx, dx bx = horsize – widthrect
shl bx, cl bx = (horsize – widthreet) * bytppnt
pop ex восстановление содержимого сх
ret возврат из подпрограммы
; Вариант 2 – вычисле ние offsline с использованием умножения
calloffs: push dx сохранение содержимого dx
xchg ax, bx обмен содержимого регистров ах, bx
mov ax, horsize ах = ширина экрана в точках
sub ax, dx ах = horsize – widthrect
mul bytppnt ах = (horsize – widthrect)* bytppnt
xchg ax, bx; обмен содержимого регистров ах, bх
pop dx; восстановление содержимого dx
ret; возврат из подпрограммы

Первый вариант подпрограммы примера 7.13 короче на одну команду и выполняется немного быстрее второго, но его можно использовать только в тех случаях, когда код точки занимает 1, 2 или 4 байта.

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.