wok annotate memtest/stuff/unlz4.S @ rev 18859

Up 1.0v to 1.0.1v
author Leonardo Laporte <hackdorte@sapo.pt>
date Wed Jan 27 06:07:29 2016 +0000 (2016-01-27)
parents
children ed5f25d05ff6
rev   line source
pascal@13269 1 /*
pascal@13269 2 * Lz4Decode:
pascal@13269 3 #ifndef FLAT32
pascal@13269 4 * input ds:si=inStream, es:di=outStream
pascal@13269 5 * output outStream[], ds:si, es:di
pascal@13269 6 .code16
pascal@13269 7 #else
pascal@13269 8 * input esi=inStream, edi=outStream
pascal@13269 9 * output outStream[], esi, edi
pascal@13269 10 .code32
pascal@13269 11 #endif
pascal@13269 12 */
pascal@13269 13
pascal@13269 14 #define ARCHIVE_MAGICNUMBER 0x184C2102
pascal@13269 15
pascal@13269 16 lz4main:
pascal@13269 17 cld
pascal@13269 18 lodsl // get chunkSize
pascal@13269 19 cmpl $ARCHIVE_MAGICNUMBER, %eax
pascal@13269 20 je lz4main
pascal@13269 21 orl %eax, %eax // end of file ?
pascal@13269 22 je lz4quit
pascal@13269 23 xchgl %eax, %edx
pascal@13269 24 lz4chunk: // uncompress chunk
pascal@13269 25 lodsb // get token
pascal@13269 26 decl %edx
pascal@13269 27 movzbl %al, %ebx
pascal@13269 28 shrb $4, %al
pascal@13269 29 call lz4len // get literal length, %eax < 255
pascal@13269 30 incl %ecx
pascal@13269 31 stc
pascal@13269 32 sbbl %ecx, %edx
pascal@13269 33 pushf
pascal@13269 34 call lz4mov // copy literals
pascal@13269 35 popf
pascal@13269 36 js lz4main
pascal@13269 37 lodsw // get string address
pascal@13269 38 #ifndef FLAT32
pascal@13269 39 pushw %bx
pascal@13269 40 movw %di, %bx
pascal@13269 41 subl %eax, %ebx
pascal@13269 42 popw %ax
pascal@13269 43 call lz4len // get string length
pascal@13269 44 pushw %ds
pascal@13269 45 pushw %si
pascal@13269 46 pushw %es
pascal@13269 47 popw %ds
pascal@13269 48 movw $0xF, %si
pascal@13269 49 andw %bx, %si
pascal@13269 50 shrl $4, %ebx
pascal@13269 51 addl $4+1, %ecx
pascal@13269 52 movw %bx, %bp
pascal@13269 53 call lz4mov2 // copy string
pascal@13269 54 popw %si
pascal@13269 55 popw %ds
pascal@13269 56 #else
pascal@13269 57 negl %eax
pascal@13269 58 xchgl %eax, %ebx
pascal@13269 59 addl %edi, %ebx
pascal@13269 60 call lz4len // get string length
pascal@13269 61 pushl %esi
pascal@13269 62 xchgl %ebx, %esi
pascal@13269 63 call lz4mov // copy string
pascal@13269 64 popl %esi
pascal@13269 65 #endif
pascal@13269 66 jmp lz4chunk
pascal@13269 67
pascal@13269 68 lz4len: // get length in %ecx
pascal@13269 69 andl $0xF, %eax
pascal@13269 70 movl %eax, %ecx
pascal@13269 71 cmpb $0xF, %al
pascal@13269 72 jne lz4quit
pascal@13269 73 lz4len2:
pascal@13269 74 lodsb
pascal@13269 75 decl %edx // remaining chunk size
pascal@13269 76 addl %eax, %ecx
pascal@13269 77 cmpb $0xFF, %al
pascal@13269 78 je lz4len2
pascal@13269 79 lz4quit:
pascal@13269 80 ret
pascal@13269 81
pascal@13269 82 lz4movlp:
pascal@13269 83 movsb
pascal@13269 84 #ifndef FLAT32
pascal@13269 85 movw $0x800, %bp
pascal@13269 86 orw %di, %di
pascal@13269 87 jns lz4di
pascal@13269 88 subw $0x8000, %di
pascal@13269 89 movw %es, %ax
pascal@13269 90 addw %bp, %ax
pascal@13269 91 movw %ax, %es
pascal@13269 92 lz4di:
pascal@13269 93 orw %si, %si
pascal@13269 94 jns lz4si
pascal@13269 95 subw $0x8000, %si
pascal@13269 96 lz4mov2:
pascal@13269 97 movw %ds, %ax
pascal@13269 98 addw %bp, %ax
pascal@13269 99 movw %ax, %ds
pascal@13269 100 lz4si:
pascal@13269 101 #endif
pascal@13269 102 lz4mov:
pascal@13269 103 decl %ecx
pascal@13269 104 jnz lz4movlp
pascal@13269 105 ret