wok-tiny annotate linux/stuff/unpacklz4.S @ rev 141

linux: pack setup (again)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Jul 07 11:56:18 2018 +0200 (2018-07-07)
parents d71bd8881bcd
children 2c80994c5e30
rev   line source
pascal@139 1 // objdump -D -b binary -mi386 -Maddr16,data16 mbr
pascal@139 2
pascal@139 3 .code16
pascal@139 4 .org 0
pascal@139 5
pascal@139 6 #define LZMA 0
pascal@139 7 #define HOLE 0x4000
pascal@141 8 #define DS_OFS 0x0200
pascal@139 9
pascal@139 10 start:
pascal@139 11 cld
pascal@139 12 #define packed_moved HOLE+0x200+packed
pascal@139 13 movw $packed_moved-next, %di
pascal@139 14 xorw %si, %si
pascal@139 15 movw %di, %cx
pascal@139 16 pushw %ds
pascal@139 17 popw %es
pascal@139 18 rep movsb %ds:(%si), %es:(%di) // move setup
pascal@139 19 pushw %cs // CS
pascal@139 20 pushw %cx // IP = 0
pascal@141 21 //pushaw
pascal@139 22 call packed_moved
pascal@139 23 next:
pascal@140 24 popw %bx
pascal@141 25 leaw DS_OFS+start-next(%bx), %di
pascal@141 26 leaw DS_OFS+packed-next(%bx,%si), %si
pascal@139 27 #if LZMA
pascal@139 28 call unlzma
pascal@139 29 #else
pascal@139 30
pascal@139 31 #define ARCHIVE_MAGICNUMBER 0x184C2102
pascal@139 32 #define NEGATIVE_OFFSETS 0 // non standard hack
pascal@139 33 #define LENGTH_16BITS 0 // non standard hack
pascal@139 34 #define BYTE_RLE 0
pascal@139 35
pascal@139 36 lz4main:
pascal@139 37 lodsl // get chunkSize
pascal@139 38 //cmpl $ARCHIVE_MAGICNUMBER, %eax
pascal@139 39 //je lz4main
pascal@140 40 //lodsw
pascal@139 41 addw %si, %ax
pascal@139 42 xchgw %ax, %dx
pascal@140 43 //lodsw
pascal@139 44 jmp lz4chunk // %cx = 0
pascal@139 45
pascal@139 46 lz4len: // get length in %cx
pascal@139 47 andw $0xF, %ax
pascal@139 48 cmpb $0xF, %al
pascal@139 49 xchgw %ax, %cx
pascal@139 50 jne lz4quit
pascal@139 51 lz4len2:
pascal@139 52 lodsb
pascal@139 53 addw %ax, %cx
pascal@139 54 cmpb $0xFF, %al
pascal@139 55 #if LENGTH_16BITS
pascal@139 56 jne lz4quit
pascal@139 57 lodsw
pascal@139 58 addw %ax, %cx
pascal@139 59 #else
pascal@139 60 je lz4len2
pascal@139 61 #endif
pascal@139 62 lz4quit:
pascal@139 63 ret
pascal@139 64
pascal@139 65 #if BYTE_RLE
pascal@139 66 movb -1(%di), %al
pascal@139 67 rep stosb %es:(%di) // fill string
pascal@139 68 jmp lz4chunk
pascal@139 69 #endif
pascal@139 70
pascal@139 71 lz4string:
pascal@139 72 lodsw // get string offset
pascal@139 73 xchgw %ax, %bx
pascal@139 74 call lz4len // get string length
pascal@140 75 add $4, %cx // minimum match is 4
pascal@139 76 #if BYTE_RLE
pascal@139 77 decw %bx
pascal@139 78 jz lz4rle
pascal@139 79 # if NEGATIVE_OFFSETS
pascal@139 80 incw %bx
pascal@139 81 # else
pascal@139 82 notw %bx
pascal@139 83 # endif
pascal@139 84 #endif
pascal@139 85 xchgw %ax, %si
pascal@139 86 #if NEGATIVE_OFFSETS || BYTE_RLE
pascal@139 87 leaw (%bx,%di), %si
pascal@139 88 #else
pascal@139 89 movw %di, %si
pascal@139 90 subw %bx, %si
pascal@139 91 #endif
pascal@139 92 rep movsb %ds:(%si), %es:(%di) // copy string
pascal@139 93 xchgw %ax, %si
pascal@139 94
pascal@139 95 lz4chunk: // uncompress chunk
pascal@139 96 lodsb // get token
pascal@139 97 movb %al, %bl
pascal@139 98 shrb $4, %al
pascal@139 99 call lz4len // get literal length
pascal@139 100 rep movsb %ds:(%si), %es:(%di) // copy literals
pascal@139 101 cmpw %dx, %si
pascal@139 102 jb lz4string
pascal@139 103 #endif
pascal@139 104 done:
pascal@141 105 movw $0x020E, %di
pascal@139 106 movsw // version string
pascal@141 107 movw $0x01F1, %di
pascal@141 108 movsb // setup size
pascal@141 109 //popaw
pascal@139 110 retf
pascal@139 111
pascal@139 112 #if LZMA
pascal@139 113 #define FLAT16 1
pascal@139 114 #define FLAT16OUT 1
pascal@139 115 #define NO_LZMA_HEADER 1
pascal@139 116 unlzma:
pascal@139 117 #include "unlzma.S"
pascal@139 118 #endif
pascal@139 119
pascal@139 120 packed: