Files
lba1-classic/LIB386/LIB_SYS/EXPAND.ASM

70 lines
2.0 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