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

         

Распаковка строки рисунка (способ RLE для PCX)



Пример 3.24. Распаковка строки рисунка (способ RLE для PCX)

Unpack: PushReg <ax,cx,dx,di,es> ; сохранение содержимого регистров
les di, Dword ptr GenOffs; смещение и сегмент буфера
mov dx, fwidth ; логический размер строки
Unploop: call nxt sym ; читаем в al следующий символ
mov ex, 01 ; количество повторяемых символов
cmp al, OCOh ; символ содержит счетчик повторов ?
jbe Unl ; -> нет, это одиночный символ
mov cl, al ; копируем содержимое al в cl
and cl, 3Fh ; и выделяем количество повторов
call nxt sym ; читаем в al — повторяемый символ
Unl: sub dx, ex ; уменьшаем остаток строки
rep stosb ; записываем символы в буфер строки
or dx, dx ; строка распакована полностью ?
jnz Unploop ; нет, продолжение распаковки
PopReg <es, di, dx, ex, ax> ; восстанавливаем регистры
ret ;-> возврат из подпрограммы

В примере 3.24 перед началом распаковки в стеке сохраняется содержимое используемых регистров. Затем команда les загружает в регистры es:di адрес для записи распакованной строки. Размер строки в байтах помещается в регистр dx, используемый в качестве счетчика распакованных символов. После этого выполняется цикл Unploop.

Действия при распаковке соответствуют описанному выше алгоритму. Очередной байт считывается в регистр al, а в счетчик повторов сх записывается 1. Если код символа меньше чем сон, то происходит пеереход на метку ип_1. В противном случае в cl помещается содержимое 6-ти младших разрядов регистра al и читается повторяемый символ.

Команда, имеющая метку un_i, вычитает из счетчика распакованных символов содержимое регистра сх. Следующая команда записывает в буфер строки содержимое регистра al столько раз, сколько указано в регистре сх. После этого проверяется содержимое регистра dx и если оно отлично от нуля, то цикл распаковки продолжается. В противном случае восстанавливается содержимое сохраненных в стеке регистров и выполняется команда возврата.

Подпрограмма Nxtjsym. Для получения кода очередного байта в примере 3.24 вызывается подпрограмма Nxtjsym, текст которой приведен в примере 3.25.



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