Работа с прямоугольными областями
В данном разделе нас будет интересовать многофункциональная подпрограмма, способная выполнять различные манипуляции с графическими объектами прямоугольной формы. Ее составление возможно при условии, что требуемые действия выполняют специализированные вспомогательные подпрограммы.
Переадресация строк
При работе с графическими объектами после обработки каждой строки надо вычислять адрес начала следующей. В разделе 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 байта.
Второй вариант длиннее первого на одну команду и выполняется немного дольше, но его можно использовать при любом размере кода точки. Выбор конкретного варианта подпрограммы остается за вами.