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

         

Построение упакованного рисунка формата PCX



Пример 7.28. Построение упакованного рисунка формата PCX

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 = количество точек в строке рисунка
1 mov ex, iheight сх = количество строк в рисунке
call calloffs bx -- константа для коррекции адресов
make: push ex ; сохраняем счетчик повторов цикла
call Unpack распаковка очередной строки
PushReg <fs,si> сохраняем содержимое fs и si
Ifs si, dword ptr GenOffs; fs:si = адрес распакованной строки
raov ex, dx сх = количество точек в строке рисунка
call drawline построение очередной строки
add di , bx адрес начала следующей строки
jnc @F ; -> адрес в пределах текущего сегмента
call Nxtwin установка следующего окна
@@: PopReg <s i , f s , cx> восстанавливаем содержимое si, fs и сх
loop make управление повторами цикла
PopReg <Cur win,gs, fs> ; восстановление Cur win, gs и fs
popa восстановление "всех" регистров
call Setwin восстановление исходного окна
ret возврат из подпрограммы

Выполнение примера 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.



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