70 lines
1.9 KiB
NASM
70 lines
1.9 KiB
NASM
.386P
|
||
.MODEL SMALL, SYSCALL
|
||
|
||
.CODE
|
||
|
||
public NoLanguage Expand
|
||
|
||
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*
|
||
|
||
Expand PROC USES ESI EDI EBX EBP,\
|
||
src:DWORD, dest:DWORD, count:DWORD ; COUNT devrait etre un DWORD !!!
|
||
|
||
mov esi, src
|
||
mov edi, dest
|
||
mov ebp, count ; compteur pour savoir si on a fini...
|
||
; et puis j'ai plus besoin de lire
|
||
; d'autre parametres... d'ou BP !
|
||
; BP = decomp size
|
||
boucle:
|
||
mov dx, 8 ; 1 octet info pour 8 data de 8 ou
|
||
; 16 bits (ca depend du bit...)
|
||
lodsb
|
||
mov bx, ax ; octet d'info dans bl
|
||
next:
|
||
shr bx, 1 ; ca va plus vite de d‚caler bx ou
|
||
; bl ? (Vrai question, chef)
|
||
jnc copie ; chaque bit indique la nature de
|
||
; ce qui suit
|
||
|
||
movsb ; ici un octet de data a recopier
|
||
dec ebp ; 1 de moins
|
||
jz termine ; si c'est fini, c'est fini
|
||
dec dx ; 1 bit de moins
|
||
jnz next ; s'il en reste on continu
|
||
jmp boucle ; sinon on lit un octet d'info de plus
|
||
|
||
copie: ; ici on a 16 bits formant un offset
|
||
; (sur 12 bits) et une longueur ; (sur 4 bits)
|
||
lodsw ; on lit donc cette donnee
|
||
movzx ecx, ax
|
||
mov eax, ecx
|
||
and ecx, 0Fh ; on recupere la longueur dans cx
|
||
inc ecx ; on ajuste car pas de copie de
|
||
inc ecx ; bloc de longeur < 2 (d'ou gain...)
|
||
sub ebp, ecx ; il restera ca en moins a faire
|
||
shr eax, 4 ;
|
||
; on recupere l'offset
|
||
not eax ; en fait c'est un decalage en
|
||
; arriŠre - 1 (not ax = -ax - 1)
|
||
add eax, edi ; par rapport … di (ax = di - ax - 1)
|
||
xchg eax, esi ; on sauve si tout en lui donnant
|
||
; l'ofset calcule
|
||
rep movsb ; on fait la recopie
|
||
|
||
mov esi, eax ; restore si
|
||
or ebp, ebp ; il en reste ?
|
||
jz termine ; ...
|
||
dec dx ; il reste des bits d'info ?
|
||
jnz next ; ...
|
||
jmp boucle ; ...
|
||
termine: ; c'est fini... Quoi ?!!! deja ?!!!
|
||
; c'est con cette methode de
|
||
; compression ! Mais ca marche !
|
||
ret
|
||
|
||
Expand ENDP
|
||
|
||
|
||
end
|