Files
lba1-classic/LIB386/LIB_SYS/EXPAND.ASM
Gwen Gourevich c5f4f6ba25 Initial commit
2021-10-27 10:34:18 +02:00

70 lines
1.9 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.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 dcaler 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