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: |