wok annotate memtest/stuff/unlzsa1.S @ rev 25500

new default version for java8-jre
author Hans-G?nter Theisgen
date Fri Dec 30 10:14:12 2022 +0100 (18 months ago)
parents 2ccf00d9c1cd
children 7f7bd3c9775e
rev   line source
pascal@25487 1 // Lzsa1Decode:
pascal@25487 2 #ifndef FLAT32
pascal@25487 3 // input ds:si=inStream, es:di=outStream
pascal@25487 4 // output outStream[], ds:si, es:di
pascal@25487 5 .code16
pascal@25487 6 #define AX %ax
pascal@25487 7 #define BX %bx
pascal@25487 8 #define SI %si
pascal@25487 9 #define DI %di
pascal@25487 10 #else
pascal@25487 11 // input esi=inStream, edi=outStream
pascal@25487 12 // output outStream[], ds:esi, es:edi
pascal@25487 13 .code32
pascal@25487 14 #define AX %eax
pascal@25487 15 #define BX %ebx
pascal@25487 16 #define SI %esi
pascal@25487 17 #define DI %edi
pascal@25487 18 #endif
pascal@25487 19
pascal@25487 20 MATCH_RUN_LEN = 15
pascal@25487 21 LITERALS_RUN_LEN = 7
pascal@25487 22 MIN_MATCH_SIZE = 3
pascal@25487 23 MIN_LITERALS_SIZE = 0
pascal@25487 24
pascal@25487 25 #define PACKED_ONLY // assume no copy block, optional
pascal@25487 26 //#define PARANOIA // cover rare cases, optional
pascal@25487 27
pascal@25487 28 lzsa1main:
pascal@25487 29 #ifdef PARANOIA
pascal@25487 30 cld
pascal@25487 31 #endif
pascal@25487 32 #ifndef RAW_FORMAT
pascal@25487 33 # if defined(PARANOIA) && !defined(FLAT32) && !defined(FLAT16)
pascal@25487 34 xorw %cx, %cx
pascal@25487 35 call normalize
pascal@25487 36 # endif
pascal@25492 37 # ifndef NO_LZSA1_HEADER
pascal@25487 38 lodsw
pascal@25487 39 cmpw $0x9E7B, %ax // magic
pascal@25487 40 jne lzsa1main
pascal@25487 41 lodsb
pascal@25487 42 cmpb $0, %al // lzsa1
pascal@25487 43 jne lzsa1main
pascal@25492 44 # endif
pascal@25487 45 lzsa1block: // uncompress chunk
pascal@25487 46 lodsw // block size
pascal@25487 47 xchgw %ax, %cx
pascal@25487 48 lodsb
pascal@25487 49 # ifndef PACKED_ONLY
pascal@25487 50 orb %al, %al
pascal@25487 51 jns lzsa1compressed
pascal@25487 52 # if !defined(FLAT32) && !defined(FLAT16OUT)
pascal@25487 53 movw %cx, %dx
pascal@25493 54 movb $0, %cl
pascal@25493 55 movb $0, %dh
pascal@25493 56 copytail:
pascal@25487 57 call lzsa1movStr
pascal@25487 58 xchg %dx, %cx
pascal@25487 59 incw %cx
pascal@25493 60 loop copytail
pascal@25487 61 # else
pascal@25487 62 movsb // copy block
pascal@25487 63 copylp:
pascal@25487 64 movsb // copy block
pascal@25487 65 loop copylp // handle 64K case
pascal@25487 66 # endif
pascal@25487 67 jmp lzsa1block
pascal@25487 68 lzsa1compressed:
pascal@25487 69 jne lzsa1chunk // 64Kb block
pascal@25487 70 # endif
pascal@25487 71 jcxz lzsa1quit // bail if we hit EOD
pascal@25487 72 movw %cx, %dx
pascal@25487 73 # if !defined(FLAT32) && !defined(FLAT16)
pascal@25487 74 xorw %cx, %cx
pascal@25487 75 call normalize
pascal@25493 76 # define NeedNormalize
pascal@25487 77 # endif
pascal@25487 78 addw %si, %dx
pascal@25487 79 #endif
pascal@25487 80 lzsa1chunk: // uncompress chunk
pascal@25487 81 lodsb // get token O|LLL|MMMM
pascal@25487 82 movb %al, %bl // keep token in bl
pascal@25487 83 shrb $4, %al // shift literals length into place
pascal@25487 84 movw $LITERALS_RUN_LEN*256+MIN_LITERALS_SIZE, %cx
pascal@25487 85 call lzsa1len // %ch = LITERALS_RUN_LEN
pascal@25493 86 #if defined(NeedNormalize) && defined(PARANOIA)
pascal@25487 87 call lzsa1movLit // copy %cx literals from %ds:%si to %es:%di
pascal@25487 88 #else
pascal@25487 89 rep movsb // copy %cx literals from %ds:%si to %es:%di
pascal@25487 90 #endif
pascal@25487 91 #ifndef RAW_FORMAT
pascal@25487 92 cmpw %dx, %si
pascal@25487 93 jae lzsa1block // bail if we hit EOD
pascal@25487 94 #endif
pascal@25487 95 #ifdef FLAT32
pascal@25487 96 orl $-1, %eax
pascal@25487 97 #else
pascal@25487 98 movb $-1, %ah
pascal@25487 99 #endif
pascal@25487 100 testb %bl, %bl // check match offset size in token (O bit)
pascal@25487 101 jns lzsa1ShortOfs
pascal@25487 102 lodsw
pascal@25487 103 .byte 0x3C // mask lodsb with cmpb $0xAC, %al
pascal@25487 104 lzsa1ShortOfs:
pascal@25487 105 lodsb
pascal@25487 106 #ifdef RAW_FORMAT
pascal@25487 107 orw %ax, %ax
pascal@25487 108 jz lzsa1quit // bail if we hit EOD
pascal@25487 109 #endif
pascal@25487 110 xchg AX, BX // %bx: match offset %ax: original token
pascal@25487 111 movw $MATCH_RUN_LEN*256+MIN_MATCH_SIZE, %cx
pascal@25487 112 call lzsa1len
pascal@25487 113 #if !defined(FLAT32) && !defined(FLAT16OUT)
pascal@25487 114 pushw %ds
pascal@25487 115 pushw %si
pascal@25487 116 movw %di, %si
pascal@25487 117 addw %bx, %si
pascal@25487 118 movw %es, %ax
pascal@25493 119 jc axok
pascal@25487 120 subb $0x10, %ah
pascal@25493 121 axok:
pascal@25493 122 .macro norm reg
pascal@25493 123 movw %si, \reg
pascal@25493 124 andw $0xF, %si
pascal@25493 125 shrw $4, \reg
pascal@25493 126 addw \reg, %ax
pascal@25487 127 movw %ax, %ds
pascal@25493 128 lzsa1movLit:
pascal@25493 129 movw %di, \reg
pascal@25493 130 andw $0xF, %di
pascal@25493 131 shrw $4, \reg
pascal@25493 132 movw %es, %ax
pascal@25493 133 addw \reg, %ax
pascal@25493 134 movw %ax, %es
pascal@25493 135 .endm
pascal@25493 136 # if defined(NeedNormalize) || defined(PARANOIA)
pascal@25487 137 call lzsa1movStr // copy string
pascal@25493 138 # else
pascal@25493 139 norm %bp
pascal@25493 140 rep movsb
pascal@25493 141 # endif
pascal@25487 142 popw %si
pascal@25487 143 popw %ds
pascal@25487 144 #else
pascal@25487 145 xchg AX, SI // save %si
pascal@25487 146 lea (BX,DI), SI
pascal@25487 147 rep movsb %es:(SI), %es:(DI)
pascal@25487 148 xchg AX, SI // restore %si
pascal@25487 149 #endif
pascal@25487 150 jmp lzsa1chunk
pascal@25487 151
pascal@25487 152 lzsa1len: // get length in %ecx
pascal@25487 153 andb %ch, %al
pascal@25487 154 cbw // clear %ah
pascal@25493 155 cmpb %ch, %al
pascal@25487 156 jne lzsa1minNumber // S=0-6, L=0-14
pascal@25487 157 lodsb
pascal@25493 158 addb %ch, %cl
pascal@25493 159 lzsa1minNumber:
pascal@25493 160 addb %cl, %al
pascal@25487 161 jnc lzsa1gotNumber // 0-255
pascal@25487 162 movb %al, %ah // S=256-1791, L=256-3839 or S=256-511, L=256-511
pascal@25487 163 jne lzsa1midNumber
pascal@25487 164 lodsw // 0-65535
pascal@25487 165 .byte 0x3C // mask lodsb with cmpb $0xAC, %al
pascal@25487 166 lzsa1midNumber:
pascal@25487 167 lodsb
pascal@25487 168 lzsa1gotNumber:
pascal@25487 169 xchgw %ax, %cx
pascal@25487 170 lzsa1quit:
pascal@25487 171 ret
pascal@25487 172
pascal@25493 173 #if defined(NeedNormalize) || defined(PARANOIA)
pascal@25487 174 # if defined(PARANOIA)
pascal@25487 175 lzsa1movlp:
pascal@25487 176 decw %ch
pascal@25487 177 rep movsb
pascal@25487 178 incw %ch
pascal@25487 179 # endif
pascal@25487 180 normalize:
pascal@25493 181 movw %ds, %bp
pascal@25487 182 lzsa1movStr:
pascal@25493 183 norm %bp
pascal@25487 184 # if defined(PARANOIA)
pascal@25487 185 cmpb $0xFF, %ch // catch FFFX case
pascal@25487 186 je lzsa1movlp
pascal@25487 187 # endif
pascal@25487 188 rep movsb
pascal@25487 189 ret
pascal@25487 190 #endif