or dx, dx обработана вся строка ?
jnz Unpck2 => нет, продолжение обработки
PopReg <cx,di> восстановление содержимого di и сх
dec di для записи зеленых или синих цветов
loop Unpckl управление внешним циклом
PopReg <di, ex, dx, ax> восстановление регистров
ret возврат из подпрограммы
I PackDrw : pusha сохранение "всех" регистров
PushReg <f s , gs , Cur win> ; сохранение fs, gs и Cur win
mov gs, GenSeg gs = сегмент общего назначения
mov f s , SwpSeg fs = сегмент буфера обмена
xor si, si адрес начала буфера обмена
mov SwpOffs, si адрес начала буфера обмена
mov incount, si incount = 0 — буфер обмена пуст
mov dx, iwidth dx = количество точек в строке рисунка
Выполнение примера 7.28 начинается с сохранения в стеке содержимого всех регистров, а также сегментных регистров fs, gs и переменной cur_win. Затем в gs и fs записываются коды сегментов буферов GenSeg и SwpSeg и очищаются регистр si, переменные swpoffs и incount. В регистры dx и сх копируются размеры рисунка, и вызывается подпрограмма caiioffs для вычисления константы переадресации строк.
Основной цикл примера 7.28 имеет метку make. Для построения каждой строки в нем последовательно вызываются подпрограммы unpack и drawline. Перед вызовом drawline сохраняется исходное содержимое пары регистров fs:si, а в них помещается адрес распакованной строки. После возвращения из drawline, как обычно, корректируется адрес видеопамяти, восстанавливается содержимое регистров si, fs, сх и команда loop make управляет повторами цикла.
Перед возвратом на вызывающий модуль восстанавливаются все сохраненные в стеке величины и исходное окно видеопамяти. Завершает подпрограмму команда ret.
В зависимости от видеорежима в примере 7.28 используется один из вариантов подпрограмм drawline, описанных в примере 7.26.