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

         

Восстановление фона



Пример 5.22. Восстановление фона на месте информационной строки

Delinfo : PushReg <Cur win, ax , ex, si, di, fs>; сохранение в стеке
call setwin установка исходного окна
mov di, Inflino di = адрес начала информ. строки
mov fs, GenSeg fs = сегмент общего назначения
xor si, si si = смещение в GenSeg (0)
mov ax, horsize ах = ширина экрана
mul byte ptr hsymh ) умножаем ее на высоту символа
mov ex , ax копируем результат в сх
shr ex, 02 и уменьшаем его в 4 раза
Dellp: movs dword prr [di fs:[si]; копирование двойного слова
or di, di адрес в пределах видеосегмента ?
jne @F -> да, переход на команду loop


call nxtwin установка следующего окна
@@: loop dellp управление циклом копирования
PopReg <fs,di,si,cx , Cur win>; восстановление из стека
call setwin восстановление исходного окна
ret возврат из подпрограммы

В примере 5.22 данные пересылаются из оперативной в видеопамять, что и объясняет все различия текстов примеров 5.21 и 5.22. Цикл пересылки, практически, повторяет анапогичный цикл из примера 3.15 с той разницей, что копируются не байты, а двойные слова. Подразумевается, что регистр es содержит код видеосегмента, указанный в переменной vbuff.

Замечание 1
Замечание 1

При компиляции инструкции movs в том виде, как она записана в примерах 5.21 и 5.22, Макроассемблер MASM 5.1 выдает предупреждающее сообщение, но генерирует правильный код. На это сообщение можно не обращать внимание.

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



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