Распаковка данных в формате BitBuster на Ассемблере
Распаковка данных в формате BitBuster на Ассемблере
BitBuster - высокоэффективный алгоритм сжатия данных от GameDev-команды Team Bomba. Исходный код упаковщика и распаковщика открыт, но готовых ассемблерных распаковщиков для BitBuster не было. Ну ничего, посидел вечерок в отладчике, портировал алгоритм распаковки с Си на Ассемблер, теперь есть.
Для упаковки данных надо использовать утилиту из прилагаемого архива. Формат сжатых данных затруднений не вызывает. Размер исходных данных хранится в первом DWORD'е упакованных данных. С 4-го байта идут сами упакованные данные. Несмотря на то, что на больших файлах упаковщик работает очень долго, результат получается впечатляющий. Для примера, BitBuster сжал тестовую иконку с 16958 байт до 192, тогда как упаковщик LZE эту же иконку сжал только до 378 байт. Скорость распаковки тоже очень высокая.
Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------
- ; Распаковка данных в формате BitBuster
- ; by ManHunter / PCL (www.manhunter.ru)
- ;------------------------------------------------------------
- ; На входе:
- ; lpCompressed - указатель на упакованные данные
- ; lpOut - указатель на буфер для распакованных данных
- ; На выходе:
- ; EAX = размер распакованных данных
- ;------------------------------------------------------------
- proc bb_unpack lpCompressed:DWORD,lpOut:DWORD
- pusha
- mov esi,[lpCompressed]
- mov edi,[lpOut]
- lodsd
- mov ebx,eax
- add ebx,edi
- mov dh,8
- .loc_1:
- cmp edi,ebx
- jnb .done
- stdcall .read_bit
- je .loc_2
- ; 1 = packed data
- lodsb
- or al,al
- jnz .loc_3
- ; rle
- stdcall .read_gamma
- mov al,[edi-1]
- rep stosb
- jmp .loc_1
- .loc_3:
- movzx ecx,al
- test al,128
- jz @f
- and al,127
- movzx ecx,al
- stdcall .read_bit
- setnz al
- movzx eax,al
- shl eax,10
- add ecx,eax
- stdcall .read_bit
- setnz al
- movzx eax,al
- shl eax,9
- add ecx,eax
- stdcall .read_bit
- setnz al
- movzx eax,al
- shl eax,8
- add ecx,eax
- stdcall .read_bit
- setnz al
- movzx eax,al
- shl eax,7
- add ecx,eax
- @@:
- push ebx
- mov ebx,ecx
- stdcall .read_gamma
- push esi
- mov esi,edi
- sub esi,ebx
- dec esi
- rep movsb
- pop esi
- pop ebx
- jmp .loc_1
- .loc_2:
- ; 0 = literal byte
- movsb
- jmp .loc_1
- .read_gamma:
- mov ecx,1
- push ebx
- mov bh,0
- @@:
- stdcall .read_bit
- jz @f
- inc bh
- jmp @b
- @@:
- or bh,bh
- jz @f
- dec bh
- add ecx,ecx
- stdcall .read_bit
- jz @b
- inc ecx
- jmp @b
- @@:
- inc ecx
- pop ebx
- retn
- .read_bit:
- cmp dh,8
- jne @f
- mov dl,byte[esi]
- inc esi
- mov dh,0
- @@:
- inc dh
- push eax
- mov al,dl
- add dl,dl
- test al,80h
- pop eax
- retn
- .done:
- sub edi,[lpOut]
- mov [esp+28],edi
- popa
- ret
- endp
В приложении пример программы с исходным текстом, которая извлекает из памяти иконку, упакованную по алгоритму BitBuster, и выводит ее на форму. Там же в архиве утилиты для упаковки и распаковки данных от Team Bomba вместе с исходниками.
Просмотров: 1204 | Комментариев: 0
Метки: Assembler, распаковка
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария