wok annotate memtest/stuff/unlz4.S @ rev 25487
Up exiftool (12.50), foomatic-db (4.0-20221111), lzsa (1.4.0), zlib (1.2.13)
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Tue Nov 15 16:20:54 2022 +0000 (18 months ago) |
parents | 18d1dc85701e |
children | 2ccf00d9c1cd |
rev | line source |
---|---|
pascal@25487 | 1 // Lz4Decode: |
pascal@13269 | 2 #ifndef FLAT32 |
pascal@25487 | 3 // input ds:si=inStream, es:di=outStream |
pascal@25487 | 4 // output outStream[], ds:si, es:di |
pascal@13269 | 5 .code16 |
pascal@25487 | 6 #define AX %ax |
pascal@25487 | 7 #define BX %bx |
pascal@25487 | 8 #define CX %cx |
pascal@25487 | 9 #define SI %si |
pascal@25487 | 10 #define DI %di |
pascal@13269 | 11 #else |
pascal@25487 | 12 // input esi=inStream, edi=outStream |
pascal@25487 | 13 // output outStream[], ds:esi, es:edi |
pascal@13269 | 14 .code32 |
pascal@25487 | 15 #define AX %eax |
pascal@25487 | 16 #define BX %ebx |
pascal@25487 | 17 #define CX %ecx |
pascal@25487 | 18 #define SI %esi |
pascal@25487 | 19 #define DI %edi |
pascal@13269 | 20 #endif |
pascal@13269 | 21 |
pascal@13269 | 22 #define ARCHIVE_MAGICNUMBER 0x184C2102 |
pascal@13269 | 23 |
pascal@25487 | 24 //#define PARANOIA // cover rare cases, optional |
pascal@25487 | 25 |
pascal@13269 | 26 lz4main: |
pascal@25487 | 27 #ifdef PARANOIA |
pascal@13269 | 28 cld |
pascal@25487 | 29 # if !defined(FLAT32) && !defined(FLAT16OUT) |
pascal@25487 | 30 xorl %cx, %cx |
pascal@25487 | 31 call lz4mov |
pascal@25487 | 32 # endif |
pascal@25487 | 33 #endif |
pascal@13269 | 34 lodsl // get chunkSize |
pascal@13269 | 35 cmpl $ARCHIVE_MAGICNUMBER, %eax |
pascal@13269 | 36 je lz4main |
pascal@13269 | 37 orl %eax, %eax // end of file ? |
pascal@13269 | 38 je lz4quit |
pascal@13269 | 39 xchgl %eax, %edx |
pascal@13269 | 40 lz4chunk: // uncompress chunk |
pascal@13269 | 41 lodsb // get token |
pascal@25487 | 42 movb %al, %bl |
pascal@13269 | 43 shrb $4, %al |
pascal@13269 | 44 call lz4len // get literal length, %eax < 255 |
pascal@25487 | 45 subl %ecx, %edx // count literal |
pascal@25487 | 46 subl $1+2, %edx // count token & string address |
pascal@25487 | 47 #if !defined(FLAT32) && !defined(FLAT16OUT) |
pascal@25487 | 48 pushf |
pascal@13269 | 49 call lz4mov // copy literals |
pascal@13269 | 50 popf |
pascal@25487 | 51 #else |
pascal@25487 | 52 rep movsb |
pascal@25487 | 53 #endif |
pascal@25487 | 54 jle lz4main |
pascal@13269 | 55 lodsw // get string address |
pascal@25487 | 56 xchgw %ax, %bx |
pascal@13269 | 57 call lz4len // get string length |
pascal@25487 | 58 add $4, CX |
pascal@25487 | 59 #if !defined(FLAT32) && !defined(FLAT16OUT) |
pascal@13269 | 60 pushw %ds |
pascal@13269 | 61 pushw %si |
pascal@25487 | 62 movw %di, %si |
pascal@25487 | 63 subw %bx, %si |
pascal@25487 | 64 movw %es, %ax |
pascal@25487 | 65 jnc axok |
pascal@25487 | 66 subb $0x10, %ah |
pascal@25487 | 67 axok: |
pascal@25487 | 68 movw %ax, %ds |
pascal@25487 | 69 call lz4mov // copy string |
pascal@13269 | 70 popw %si |
pascal@13269 | 71 popw %ds |
pascal@13269 | 72 #else |
pascal@25487 | 73 xchg AX, SI |
pascal@25487 | 74 mov DI, SI |
pascal@25487 | 75 sub BX, SI |
pascal@25487 | 76 rep movsb %es(SI), %es(DI) |
pascal@25487 | 77 xchg AX, SI |
pascal@13269 | 78 #endif |
pascal@13269 | 79 jmp lz4chunk |
pascal@13269 | 80 |
pascal@25487 | 81 #if !defined(FLAT32) && !defined(FLAT16OUT) |
pascal@25487 | 82 # if defined(PARANOIA) |
pascal@25487 | 83 lz4movlp: |
pascal@25487 | 84 xchgw %ax, %cx |
pascal@25487 | 85 movw $0x3C00, %cx |
pascal@25487 | 86 rep movsl |
pascal@25487 | 87 xchgw %ax, %cx |
pascal@25487 | 88 sub $0xF0, %ch |
pascal@25487 | 89 # endif |
pascal@25487 | 90 lz4mov: |
pascal@25487 | 91 movw %di, %ax |
pascal@25487 | 92 andw $0xF, %di |
pascal@25487 | 93 shrw $4, %ax |
pascal@25487 | 94 movw %es, %bp |
pascal@25487 | 95 addw %ax, %bp |
pascal@25487 | 96 movw %bp, %es |
pascal@25487 | 97 movw %si, %ax |
pascal@25487 | 98 andw $0xF, %si |
pascal@25487 | 99 shrw $4, %ax |
pascal@25487 | 100 movw %ds, %bp |
pascal@25487 | 101 addw %ax, %bp |
pascal@25487 | 102 movw %bp, %ds |
pascal@25487 | 103 # if defined(PARANOIA) |
pascal@25487 | 104 cmp $0xFF, %ch // catch FFFX case |
pascal@25487 | 105 jz lz4movlp |
pascal@25487 | 106 # endif |
pascal@25487 | 107 rep movsb |
pascal@25487 | 108 ret |
pascal@25487 | 109 #endif |
pascal@25487 | 110 |
pascal@13269 | 111 lz4len: // get length in %ecx |
pascal@13269 | 112 andl $0xF, %eax |
pascal@13269 | 113 movl %eax, %ecx |
pascal@13269 | 114 cmpb $0xF, %al |
pascal@13269 | 115 jne lz4quit |
pascal@13269 | 116 lz4len2: |
pascal@13269 | 117 lodsb |
pascal@13269 | 118 decl %edx // remaining chunk size |
pascal@25487 | 119 addw %ax, %cx |
pascal@13269 | 120 cmpb $0xFF, %al |
pascal@13269 | 121 je lz4len2 |
pascal@13269 | 122 lz4quit: |
pascal@13269 | 123 ret |
pascal@13269 | 124 |