wok-6.x annotate plop/stuff/unlz4.S @ rev 25565

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