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



Пример 3 21 Работа с прямоугольной



Пример 3.21. Работа с прямоугольной областью небольшого размера

draw: PushReg <di, si, cx,b> ;,Cur win>; сохранение исходных величин
mov bx, horsize ; копируем в bx значение horsize
sub bx, dx ; и вычитаем из него ширину рисунка
drwout: push ex сохраняем счетчик повторов
mov ex, dx задаем размер строки рисунка
call drawline ! ! или call bp, пояснения в тексте
pop ex восстанавливаем счетчик повторов
add di , bx адрес начала следующей строки
jnc @F -> адрес в пределах сегмента
call NxtWin установка следующего окна
@@: loop drwout управление повторами цикла
PopReg <Cur win,bx, cx,si,di>; восстановление исходных величин
call setwin восстановление исходного окна
ret возврат из подпрограммы

Построение рисунка отличается от закрашивания прямоугольной области тем, что код каждой выводимой точки выбирается из оперативной памяти, а не их регистра-аккумулятора. Поэтому тексты примеров 3.13 и 3.21 различаются только именем подпрограммы, которая вызывается в цикле построения: horiine в примере 3.13 и drawiine в данном случае.

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

Цикл построения рисунка имеет имя drwout. Он начинается с сохранения в стеке значения счетчика повторов (регистра сх) и записи в него размера строки. Затем происходит вызов подпрограммы drawiine для вывода на экран очередной строки рисунка. После возврата из подпрограммы восстанавливается сохраненное в стеке значение счетчика повторов и вычисляется адрес начала следующей строки. Если при сложении будет получен признак переполнения, то произойдет обращение к подпрограмме Nxtwin для установки следующего окна видеопамяти. Последняя команда цикла loop повторяет его выполнение до тех пор, пока не будут построены все строки рисунка.

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









Содержание  Назад  Вперед