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