| ||||||||||||||||
Run-Length Encoding
by herm1t
See also the project folder ; By using this file, you agree to the terms and conditions set ; forth in the COPYING file which can be found at the top level ; of this distribution. ; ; Run-Length Encoding (c) herm1t@vx.netlux.org, 2005-04-13 ; ; int rle_compress(unsigned char *in, unsigned char *out, int length); ; int rle_expand(unsigned char *in, unsigned char *out, int length); ; BITS 32 CPU 386 %define BITS 2 %define MASK1 (~1 & ~((1 << (8 - BITS)) - 1)) %define MASK2 ((~MASK1) & 0xff) global rle_compress, rle_expand rle_compress: pusha cld add esp, 36 pop esi pop edi pop ecx sub esp, 48 xor eax, eax lodsb mov ebx, eax .rstc: xor edx, edx .loop: lodsb cmp eax, ebx jne .fseq cmp dl, MASK2 je .fseq cmp cl, 1 jz .fseq inc edx loop .loop inc ecx .fseq: xchg eax, ebx or edx, edx jnz .long cmp al, MASK1 jb .stos .long: or dl, MASK1 mov [edi], dl inc edi .stos: stosb mov ebp, edi sub ebp, [esp + 40] cmp ebp, [esp + 44] jb .ok xor ebp, ebp jmp .return .ok: loop .rstc .return: mov [esp + 28], ebp popa ret rle_expand: pusha cld add esp, 36 pop esi pop edi pop edx sub esp, 48 xor eax, eax .loop: lodsb cmp al,MASK1 jb .stos and al, MASK2 mov ecx, eax inc ecx lodsb dec edx rep .stos: stosb .next: dec edx jnz .loop sub edi, [esp + 40] mov [esp + 28], edi popa ret |