Subversion Repositories Kolibri OS

Rev

Rev 425 | Rev 467 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 425 Rev 431
1
$Revision: 425 $
1
$Revision: 431 $
-
 
2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
3
;;                                                              ;;
-
 
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
-
 
5
;; Distributed under terms of the GNU General Public License    ;;
-
 
6
;;                                                              ;;
-
 
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
8
 
2
; void __stdcall unpack(void* packed_data, void* unpacked_data);
9
; void __stdcall unpack(void* packed_data, void* unpacked_data);
3
unpack:
10
unpack:
4
        pushad
11
        pushad
5
        mov     esi, [esp+32+4]
12
        mov     esi, [esp+32+4]
6
        mov     edi, [esp+32+8]
13
        mov     edi, [esp+32+8]
7
        mov     eax, [esi+8]
14
        mov     eax, [esi+8]
8
        and     al, 0xC0
15
        and     al, 0xC0
9
        cmp     al, 0xC0
16
        cmp     al, 0xC0
10
        jz      .failed
17
        jz      .failed
11
        mov     eax, [esi+8]
18
        mov     eax, [esi+8]
12
        push    eax
19
        push    eax
13
        add     esi, 12
20
        add     esi, 12
14
        and     al, not 0xC0
21
        and     al, not 0xC0
15
        dec     eax
22
        dec     eax
16
        jz      .lzma
23
        jz      .lzma
17
.failed:
24
.failed:
18
        pop     eax
25
        pop     eax
19
        popad
26
        popad
20
        ret     8
27
        ret     8
21
.lzma:
28
.lzma:
22
        call    .lzma_unpack
29
        call    .lzma_unpack
23
.common:
30
.common:
24
        pop     eax
31
        pop     eax
25
        test    al, 0x80
32
        test    al, 0x80
26
        jnz     .ctr1
33
        jnz     .ctr1
27
        test    al, 0x40
34
        test    al, 0x40
28
        jz      .ok
35
        jz      .ok
29
        lodsd
36
        lodsd
30
        mov     ecx, eax
37
        mov     ecx, eax
31
        jecxz   .ok
38
        jecxz   .ok
32
        mov     dl, [esi]
39
        mov     dl, [esi]
33
        mov     esi, [esp+32+8]
40
        mov     esi, [esp+32+8]
34
.c1:
41
.c1:
35
        lodsb
42
        lodsb
36
        sub     al, 0E8h
43
        sub     al, 0E8h
37
        cmp     al, 1
44
        cmp     al, 1
38
        ja      .c1
45
        ja      .c1
39
        cmp     byte [esi], dl
46
        cmp     byte [esi], dl
40
        jnz     .c1
47
        jnz     .c1
41
        lodsd
48
        lodsd
42
; "bswap eax" is not supported on i386
49
; "bswap eax" is not supported on i386
43
        shr     ax, 8
50
        shr     ax, 8
44
        ror     eax, 16
51
        ror     eax, 16
45
        xchg    al, ah
52
        xchg    al, ah
46
        sub     eax, esi
53
        sub     eax, esi
47
        add     eax, [esp+32+8]
54
        add     eax, [esp+32+8]
48
        mov     [esi-4], eax
55
        mov     [esi-4], eax
49
        loop    .c1
56
        loop    .c1
50
.ok:
57
.ok:
51
        popad
58
        popad
52
        ret     8
59
        ret     8
53
.ctr1:
60
.ctr1:
54
        lodsd
61
        lodsd
55
        mov     ecx, eax
62
        mov     ecx, eax
56
        jecxz   .ok
63
        jecxz   .ok
57
        mov     dl, [esi]
64
        mov     dl, [esi]
58
        mov     esi, [esp+32+8]
65
        mov     esi, [esp+32+8]
59
.c2:
66
.c2:
60
        lodsb
67
        lodsb
61
@@:
68
@@:
62
        cmp     al, 0xF
69
        cmp     al, 0xF
63
        jnz     .f
70
        jnz     .f
64
        lodsb
71
        lodsb
65
        cmp     al, 80h
72
        cmp     al, 80h
66
        jb      @b
73
        jb      @b
67
        cmp     al, 90h
74
        cmp     al, 90h
68
        jb      @f
75
        jb      @f
69
.f:
76
.f:
70
        sub     al, 0E8h
77
        sub     al, 0E8h
71
        cmp     al, 1
78
        cmp     al, 1
72
        ja      .c2
79
        ja      .c2
73
@@:
80
@@:
74
        cmp     byte [esi], dl
81
        cmp     byte [esi], dl
75
        jnz     .c2
82
        jnz     .c2
76
        lodsd
83
        lodsd
77
        shr     ax, 8
84
        shr     ax, 8
78
        ror     eax, 16
85
        ror     eax, 16
79
        xchg    al, ah
86
        xchg    al, ah
80
        sub     eax, esi
87
        sub     eax, esi
81
        add     eax, [esp+32+8]
88
        add     eax, [esp+32+8]
82
        mov     [esi-4], eax
89
        mov     [esi-4], eax
83
        loop    .c2
90
        loop    .c2
84
        jmp     .ok
91
        jmp     .ok
85
 
92
 
86
.lzma_unpack:
93
.lzma_unpack:
87
 
94
 
88
.pb	=	2	; pos state bits
95
.pb	=	2	; pos state bits
89
.lp	=	0	; literal pos state bits
96
.lp	=	0	; literal pos state bits
90
.lc	=	3	; literal context bits
97
.lc	=	3	; literal context bits
91
.posStateMask	=	((1 shl .pb)-1)
98
.posStateMask	=	((1 shl .pb)-1)
92
.literalPosMask	=	((1 shl .lp)-1)
99
.literalPosMask	=	((1 shl .lp)-1)
93
 
100
 
94
.kNumPosBitsMax	=	4
101
.kNumPosBitsMax	=	4
95
.kNumPosStatesMax =	(1 shl .kNumPosBitsMax)
102
.kNumPosStatesMax =	(1 shl .kNumPosBitsMax)
96
 
103
 
97
.kLenNumLowBits         =       3
104
.kLenNumLowBits         =       3
98
.kLenNumLowSymbols      =       (1 shl .kLenNumLowBits)
105
.kLenNumLowSymbols      =       (1 shl .kLenNumLowBits)
99
.kLenNumMidBits         =       3
106
.kLenNumMidBits         =       3
100
.kLenNumMidSymbols      =       (1 shl .kLenNumMidBits)
107
.kLenNumMidSymbols      =       (1 shl .kLenNumMidBits)
101
.kLenNumHighBits        =       8
108
.kLenNumHighBits        =       8
102
.kLenNumHighSymbols     =       (1 shl .kLenNumHighBits)
109
.kLenNumHighSymbols     =       (1 shl .kLenNumHighBits)
103
 
110
 
104
.LenChoice	=	0
111
.LenChoice	=	0
105
.LenChoice2	=	1
112
.LenChoice2	=	1
106
.LenLow		=	2
113
.LenLow		=	2
107
.LenMid		=	(.LenLow + (.kNumPosStatesMax shl .kLenNumLowBits))
114
.LenMid		=	(.LenLow + (.kNumPosStatesMax shl .kLenNumLowBits))
108
.LenHigh	=	(.LenMid + (.kNumPosStatesMax shl .kLenNumMidBits))
115
.LenHigh	=	(.LenMid + (.kNumPosStatesMax shl .kLenNumMidBits))
109
.kNumLenProbs	=	(.LenHigh + .kLenNumHighSymbols)
116
.kNumLenProbs	=	(.LenHigh + .kLenNumHighSymbols)
110
 
117
 
111
.kNumStates	=	12
118
.kNumStates	=	12
112
.kNumLitStates	=	7
119
.kNumLitStates	=	7
113
.kStartPosModelIndex =	4
120
.kStartPosModelIndex =	4
114
.kEndPosModelIndex =	14
121
.kEndPosModelIndex =	14
115
.kNumFullDistances =	(1 shl (.kEndPosModelIndex/2))
122
.kNumFullDistances =	(1 shl (.kEndPosModelIndex/2))
116
.kNumPosSlotBits =	6
123
.kNumPosSlotBits =	6
117
.kNumLenToPosStates =	4
124
.kNumLenToPosStates =	4
118
.kNumAlignBits	=	4
125
.kNumAlignBits	=	4
119
.kAlignTableSize =	(1 shl .kNumAlignBits)
126
.kAlignTableSize =	(1 shl .kNumAlignBits)
120
.kMatchMinLen	=	2
127
.kMatchMinLen	=	2
121
 
128
 
122
.IsMatch	=	0
129
.IsMatch	=	0
123
.IsRep		=	(.IsMatch + (.kNumStates shl .kNumPosBitsMax))
130
.IsRep		=	(.IsMatch + (.kNumStates shl .kNumPosBitsMax))
124
.IsRepG0	=	(.IsRep + .kNumStates)
131
.IsRepG0	=	(.IsRep + .kNumStates)
125
.IsRepG1	=	(.IsRepG0 + .kNumStates)
132
.IsRepG1	=	(.IsRepG0 + .kNumStates)
126
.IsRepG2	=	(.IsRepG1 + .kNumStates)
133
.IsRepG2	=	(.IsRepG1 + .kNumStates)
127
.IsRep0Long	=	(.IsRepG2 + .kNumStates)
134
.IsRep0Long	=	(.IsRepG2 + .kNumStates)
128
.PosSlot	=	(.IsRep0Long + (.kNumStates shl .kNumPosBitsMax))
135
.PosSlot	=	(.IsRep0Long + (.kNumStates shl .kNumPosBitsMax))
129
.SpecPos	=	(.PosSlot + (.kNumLenToPosStates shl .kNumPosSlotBits))
136
.SpecPos	=	(.PosSlot + (.kNumLenToPosStates shl .kNumPosSlotBits))
130
.Align_		=	(.SpecPos + .kNumFullDistances - .kEndPosModelIndex)
137
.Align_		=	(.SpecPos + .kNumFullDistances - .kEndPosModelIndex)
131
.Lencoder	=	(.Align_ + .kAlignTableSize)
138
.Lencoder	=	(.Align_ + .kAlignTableSize)
132
.RepLencoder	=	(.Lencoder + .kNumLenProbs)
139
.RepLencoder	=	(.Lencoder + .kNumLenProbs)
133
.Literal	=	(.RepLencoder + .kNumLenProbs)
140
.Literal	=	(.RepLencoder + .kNumLenProbs)
134
 
141
 
135
.LZMA_BASE_SIZE	=	1846	; must be ==Literal
142
.LZMA_BASE_SIZE	=	1846	; must be ==Literal
136
.LZMA_LIT_SIZE	=	768
143
.LZMA_LIT_SIZE	=	768
137
 
144
 
138
.kNumTopBits	=	24
145
.kNumTopBits	=	24
139
.kTopValue	=	(1 shl .kNumTopBits)
146
.kTopValue	=	(1 shl .kNumTopBits)
140
 
147
 
141
.kNumBitModelTotalBits =	11
148
.kNumBitModelTotalBits =	11
142
.kBitModelTotal	=	(1 shl .kNumBitModelTotalBits)
149
.kBitModelTotal	=	(1 shl .kNumBitModelTotalBits)
143
.kNumMoveBits	=	5
150
.kNumMoveBits	=	5
144
 
151
 
145
        push    edi
152
        push    edi
146
; int state=0;
153
; int state=0;
147
	xor	ebx, ebx
154
	xor	ebx, ebx
148
	mov	[.previousByte], bl
155
	mov	[.previousByte], bl
149
; unsigned rep0=1,rep1=1,rep2=1,rep3=1;
156
; unsigned rep0=1,rep1=1,rep2=1,rep3=1;
150
	mov	eax, 1
157
	mov	eax, 1
151
	mov	edi, .rep0
158
	mov	edi, .rep0
152
	stosd
159
	stosd
153
	stosd
160
	stosd
154
	stosd
161
	stosd
155
	stosd
162
	stosd
156
; int len=0;
163
; int len=0;
157
; result=0;
164
; result=0;
158
	mov	ecx, .Literal + (.LZMA_LIT_SIZE shl (.lc+.lp))
165
	mov	ecx, .Literal + (.LZMA_LIT_SIZE shl (.lc+.lp))
159
	mov	eax, .kBitModelTotal/2
166
	mov	eax, .kBitModelTotal/2
160
	mov	edi, .p
167
	mov	edi, .p
161
	rep	stosd
168
	rep	stosd
162
; RangeDecoderInit
169
; RangeDecoderInit
163
; rd->ExtraBytes = 0
170
; rd->ExtraBytes = 0
164
; rd->Buffer = stream
171
; rd->Buffer = stream
165
; rd->BufferLim = stream+bufferSize
172
; rd->BufferLim = stream+bufferSize
166
; rd->Range = 0xFFFFFFFF
173
; rd->Range = 0xFFFFFFFF
167
        pop     edi
174
        pop     edi
168
	mov	ebp, [esi-8]	; dest_length
175
	mov	ebp, [esi-8]	; dest_length
169
	add	ebp, edi	; ebp = destination limit
176
	add	ebp, edi	; ebp = destination limit
170
	lodsd
177
	lodsd
171
; rd->code_ = eax
178
; rd->code_ = eax
172
	mov	[.code_], eax
179
	mov	[.code_], eax
173
	or	[.range], -1
180
	or	[.range], -1
174
.main_loop:
181
.main_loop:
175
	cmp	edi, ebp
182
	cmp	edi, ebp
176
	jae	.main_loop_done
183
	jae	.main_loop_done
177
	mov	edx, edi
184
	mov	edx, edi
178
	and	edx, .posStateMask
185
	and	edx, .posStateMask
179
	mov	eax, ebx
186
	mov	eax, ebx
180
	shl	eax, .kNumPosBitsMax+2
187
	shl	eax, .kNumPosBitsMax+2
181
	lea	eax, [.p + .IsMatch*4 + eax + edx*4]
188
	lea	eax, [.p + .IsMatch*4 + eax + edx*4]
182
	call	.RangeDecoderBitDecode
189
	call	.RangeDecoderBitDecode
183
	jc	.1
190
	jc	.1
184
	movzx	eax, [.previousByte]
191
	movzx	eax, [.previousByte]
185
if .literalPosMask
192
if .literalPosMask
186
	mov	ah, dl
193
	mov	ah, dl
187
	and	ah, .literalPosMask
194
	and	ah, .literalPosMask
188
end if
195
end if
189
	shr	eax, 8-.lc
196
	shr	eax, 8-.lc
190
	imul	eax, .LZMA_LIT_SIZE*4
197
	imul	eax, .LZMA_LIT_SIZE*4
191
	add	eax, .p+.Literal*4
198
	add	eax, .p+.Literal*4
192
	cmp	ebx, .kNumLitStates
199
	cmp	ebx, .kNumLitStates
193
	jb	.literal
200
	jb	.literal
194
	xor	edx, edx
201
	xor	edx, edx
195
	sub	edx, [.rep0]
202
	sub	edx, [.rep0]
196
	mov	dl, [edi + edx]
203
	mov	dl, [edi + edx]
197
	call	.LzmaLiteralDecodeMatch
204
	call	.LzmaLiteralDecodeMatch
198
	jmp	@f
205
	jmp	@f
199
.literal:
206
.literal:
200
	call	.LzmaLiteralDecode
207
	call	.LzmaLiteralDecode
201
@@:
208
@@:
202
	mov	[.previousByte], al
209
	mov	[.previousByte], al
203
	stosb
210
	stosb
204
	mov	al, bl
211
	mov	al, bl
205
	cmp	bl, 4
212
	cmp	bl, 4
206
	jb	@f
213
	jb	@f
207
	mov	al, 3
214
	mov	al, 3
208
	cmp	bl, 10
215
	cmp	bl, 10
209
	jb	@f
216
	jb	@f
210
	mov	al, 6
217
	mov	al, 6
211
@@:	sub	bl, al
218
@@:	sub	bl, al
212
	jmp	.main_loop
219
	jmp	.main_loop
213
.1:
220
.1:
214
	lea	eax, [.p + .IsRep*4 + ebx*4]
221
	lea	eax, [.p + .IsRep*4 + ebx*4]
215
	call	.RangeDecoderBitDecode
222
	call	.RangeDecoderBitDecode
216
	jnc	.10
223
	jnc	.10
217
	lea	eax, [.p + .IsRepG0*4 + ebx*4]
224
	lea	eax, [.p + .IsRepG0*4 + ebx*4]
218
	call	.RangeDecoderBitDecode
225
	call	.RangeDecoderBitDecode
219
	jc	.111
226
	jc	.111
220
	mov	eax, ebx
227
	mov	eax, ebx
221
	shl	eax, .kNumPosBitsMax+2
228
	shl	eax, .kNumPosBitsMax+2
222
	lea	eax, [.p + .IsRep0Long*4 + eax + edx*4]
229
	lea	eax, [.p + .IsRep0Long*4 + eax + edx*4]
223
	call	.RangeDecoderBitDecode
230
	call	.RangeDecoderBitDecode
224
	jc	.1101
231
	jc	.1101
225
	cmp	bl, 7
232
	cmp	bl, 7
226
	setae	bl
233
	setae	bl
227
	lea	ebx, [9 + ebx + ebx]
234
	lea	ebx, [9 + ebx + ebx]
228
	xor	edx, edx
235
	xor	edx, edx
229
	sub	edx, [.rep0]
236
	sub	edx, [.rep0]
230
	mov	al, [edi + edx]
237
	mov	al, [edi + edx]
231
	stosb
238
	stosb
232
	mov	[.previousByte], al
239
	mov	[.previousByte], al
233
	jmp	.main_loop
240
	jmp	.main_loop
234
.111:
241
.111:
235
	lea	eax, [.p + .IsRepG1*4 + ebx*4]
242
	lea	eax, [.p + .IsRepG1*4 + ebx*4]
236
	call	.RangeDecoderBitDecode
243
	call	.RangeDecoderBitDecode
237
	mov	eax, [.rep1]
244
	mov	eax, [.rep1]
238
	jnc	.l3
245
	jnc	.l3
239
.l1:
246
.l1:
240
	lea	eax, [.p + .IsRepG2*4 + ebx*4]
247
	lea	eax, [.p + .IsRepG2*4 + ebx*4]
241
	call	.RangeDecoderBitDecode
248
	call	.RangeDecoderBitDecode
242
	mov	eax, [.rep2]
249
	mov	eax, [.rep2]
243
	jnc	.l2
250
	jnc	.l2
244
	xchg	[.rep3], eax
251
	xchg	[.rep3], eax
245
.l2:
252
.l2:
246
	push	[.rep1]
253
	push	[.rep1]
247
	pop	[.rep2]
254
	pop	[.rep2]
248
.l3:
255
.l3:
249
	xchg	eax, [.rep0]
256
	xchg	eax, [.rep0]
250
	mov	[.rep1], eax
257
	mov	[.rep1], eax
251
.1101:
258
.1101:
252
	mov	eax, .p + .RepLencoder*4
259
	mov	eax, .p + .RepLencoder*4
253
	call	.LzmaLenDecode
260
	call	.LzmaLenDecode
254
	cmp	bl, 7
261
	cmp	bl, 7
255
	setc	bl
262
	setc	bl
256
	adc	bl, bl
263
	adc	bl, bl
257
	xor	bl, 3
264
	xor	bl, 3
258
	add	bl, 8
265
	add	bl, 8
259
	jmp	.repmovsb
266
	jmp	.repmovsb
260
.10:
267
.10:
261
	mov	eax, [.rep0]
268
	mov	eax, [.rep0]
262
	xchg	eax, [.rep1]
269
	xchg	eax, [.rep1]
263
	xchg	eax, [.rep2]
270
	xchg	eax, [.rep2]
264
	xchg	eax, [.rep3]
271
	xchg	eax, [.rep3]
265
	cmp	bl, 7
272
	cmp	bl, 7
266
	setc	bl
273
	setc	bl
267
	adc	bl, bl
274
	adc	bl, bl
268
	xor	bl, 3
275
	xor	bl, 3
269
	add	bl, 7
276
	add	bl, 7
270
	mov	eax, .p + .Lencoder*4
277
	mov	eax, .p + .Lencoder*4
271
	call	.LzmaLenDecode
278
	call	.LzmaLenDecode
272
	mov	eax, .kNumLenToPosStates-1
279
	mov	eax, .kNumLenToPosStates-1
273
	cmp	eax, ecx
280
	cmp	eax, ecx
274
	jb	@f
281
	jb	@f
275
	mov	eax, ecx
282
	mov	eax, ecx
276
@@:
283
@@:
277
	push	ecx
284
	push	ecx
278
	mov	ecx, .kNumPosSlotBits
285
	mov	ecx, .kNumPosSlotBits
279
	shl	eax, cl
286
	shl	eax, cl
280
	shl	eax, 2
287
	shl	eax, 2
281
	add	eax, .p+.PosSlot*4
288
	add	eax, .p+.PosSlot*4
282
	call	.RangeDecoderBitTreeDecode
289
	call	.RangeDecoderBitTreeDecode
283
	mov	[.rep0], ecx
290
	mov	[.rep0], ecx
284
	cmp	ecx, .kStartPosModelIndex
291
	cmp	ecx, .kStartPosModelIndex
285
	jb	.l6
292
	jb	.l6
286
	push	ecx
293
	push	ecx
287
	mov	eax, ecx
294
	mov	eax, ecx
288
	and	eax, 1
295
	and	eax, 1
289
	shr	ecx, 1
296
	shr	ecx, 1
290
	or	eax, 2
297
	or	eax, 2
291
	dec	ecx
298
	dec	ecx
292
	shl	eax, cl
299
	shl	eax, cl
293
	mov	[.rep0], eax
300
	mov	[.rep0], eax
294
	pop	edx
301
	pop	edx
295
	cmp	edx, .kEndPosModelIndex
302
	cmp	edx, .kEndPosModelIndex
296
	jae	.l5
303
	jae	.l5
297
	sub	eax, edx
304
	sub	eax, edx
298
	shl	eax, 2
305
	shl	eax, 2
299
	add	eax, .p + (.SpecPos - 1)*4
306
	add	eax, .p + (.SpecPos - 1)*4
300
	call	.RangeDecoderReverseBitTreeDecode
307
	call	.RangeDecoderReverseBitTreeDecode
301
	add	[.rep0], ecx
308
	add	[.rep0], ecx
302
	jmp	.l6
309
	jmp	.l6
303
.l5:
310
.l5:
304
	sub	ecx, .kNumAlignBits
311
	sub	ecx, .kNumAlignBits
305
	call	.RangeDecoderDecodeDirectBits
312
	call	.RangeDecoderDecodeDirectBits
306
	mov	ecx, .kNumAlignBits
313
	mov	ecx, .kNumAlignBits
307
	shl	eax, cl
314
	shl	eax, cl
308
	add	[.rep0], eax
315
	add	[.rep0], eax
309
	mov	eax, .p+.Align_*4
316
	mov	eax, .p+.Align_*4
310
	call	.RangeDecoderReverseBitTreeDecode
317
	call	.RangeDecoderReverseBitTreeDecode
311
	add	[.rep0], ecx
318
	add	[.rep0], ecx
312
.l6:
319
.l6:
313
	pop	ecx
320
	pop	ecx
314
	inc	[.rep0]
321
	inc	[.rep0]
315
	jz	.main_loop_done
322
	jz	.main_loop_done
316
.repmovsb:
323
.repmovsb:
317
	add	ecx, .kMatchMinLen
324
	add	ecx, .kMatchMinLen
318
	push	esi
325
	push	esi
319
	mov	esi, edi
326
	mov	esi, edi
320
	sub	esi, [.rep0]
327
	sub	esi, [.rep0]
321
	rep	movsb
328
	rep	movsb
322
	pop	esi
329
	pop	esi
323
	mov	al, [edi-1]
330
	mov	al, [edi-1]
324
	mov	[.previousByte], al
331
	mov	[.previousByte], al
325
	jmp	.main_loop
332
	jmp	.main_loop
326
.main_loop_done:
333
.main_loop_done:
327
	ret
334
	ret
328
 
335
 
329
.RangeDecoderBitDecode:
336
.RangeDecoderBitDecode:
330
; in: eax->prob
337
; in: eax->prob
331
; out: CF=bit; destroys eax
338
; out: CF=bit; destroys eax
332
	push	edx
339
	push	edx
333
	mov	edx, [.range]
340
	mov	edx, [.range]
334
	shr	edx, .kNumBitModelTotalBits
341
	shr	edx, .kNumBitModelTotalBits
335
	imul	edx, [eax]
342
	imul	edx, [eax]
336
	cmp	[.code_], edx
343
	cmp	[.code_], edx
337
	jae	.ae
344
	jae	.ae
338
	mov	[.range], edx
345
	mov	[.range], edx
339
	mov	edx, .kBitModelTotal
346
	mov	edx, .kBitModelTotal
340
	sub	edx, [eax]
347
	sub	edx, [eax]
341
	shr	edx, .kNumMoveBits
348
	shr	edx, .kNumMoveBits
342
	add	[eax], edx
349
	add	[eax], edx
343
	clc
350
	clc
344
.n:
351
.n:
345
	lahf
352
	lahf
346
	cmp	[.range], .kTopValue
353
	cmp	[.range], .kTopValue
347
	jae	@f
354
	jae	@f
348
	shl	[.range], 8
355
	shl	[.range], 8
349
	shl	[.code_], 8
356
	shl	[.code_], 8
350
	lodsb
357
	lodsb
351
	mov	byte [.code_], al
358
	mov	byte [.code_], al
352
@@:
359
@@:
353
	sahf
360
	sahf
354
	pop	edx
361
	pop	edx
355
	ret
362
	ret
356
.ae:
363
.ae:
357
	sub	[.range], edx
364
	sub	[.range], edx
358
	sub	[.code_], edx
365
	sub	[.code_], edx
359
	mov	edx, [eax]
366
	mov	edx, [eax]
360
	shr	edx, .kNumMoveBits
367
	shr	edx, .kNumMoveBits
361
	sub	[eax], edx
368
	sub	[eax], edx
362
	stc
369
	stc
363
	jmp	.n
370
	jmp	.n
364
 
371
 
365
.RangeDecoderDecodeDirectBits:
372
.RangeDecoderDecodeDirectBits:
366
; in: ecx=numTotalBits
373
; in: ecx=numTotalBits
367
; out: eax=result; destroys edx
374
; out: eax=result; destroys edx
368
	xor	eax, eax
375
	xor	eax, eax
369
.l:
376
.l:
370
	shr	[.range], 1
377
	shr	[.range], 1
371
	shl	eax, 1
378
	shl	eax, 1
372
	mov	edx, [.code_]
379
	mov	edx, [.code_]
373
	sub	edx, [.range]
380
	sub	edx, [.range]
374
	jb	@f
381
	jb	@f
375
	mov	[.code_], edx
382
	mov	[.code_], edx
376
	or	eax, 1
383
	or	eax, 1
377
@@:
384
@@:
378
	cmp	[.range], .kTopValue
385
	cmp	[.range], .kTopValue
379
	jae	@f
386
	jae	@f
380
	shl	[.range], 8
387
	shl	[.range], 8
381
	shl	[.code_], 8
388
	shl	[.code_], 8
382
	push	eax
389
	push	eax
383
	lodsb
390
	lodsb
384
	mov	byte [.code_], al
391
	mov	byte [.code_], al
385
	pop	eax
392
	pop	eax
386
@@:
393
@@:
387
	loop	.l
394
	loop	.l
388
	ret
395
	ret
389
 
396
 
390
.LzmaLiteralDecode:
397
.LzmaLiteralDecode:
391
; in: eax->probs
398
; in: eax->probs
392
; out: al=byte; destroys edx
399
; out: al=byte; destroys edx
393
	push	ecx
400
	push	ecx
394
	mov	ecx, 1
401
	mov	ecx, 1
395
@@:
402
@@:
396
	push	eax
403
	push	eax
397
	lea	eax, [eax+ecx*4]
404
	lea	eax, [eax+ecx*4]
398
	call	.RangeDecoderBitDecode
405
	call	.RangeDecoderBitDecode
399
	pop	eax
406
	pop	eax
400
	adc	cl, cl
407
	adc	cl, cl
401
	jnc	@b
408
	jnc	@b
402
.LzmaLiteralDecode.ret:
409
.LzmaLiteralDecode.ret:
403
	mov	al, cl
410
	mov	al, cl
404
	pop	ecx
411
	pop	ecx
405
	ret
412
	ret
406
.LzmaLiteralDecodeMatch:
413
.LzmaLiteralDecodeMatch:
407
; in: eax->probs, dl=matchByte
414
; in: eax->probs, dl=matchByte
408
; out: al=byte; destroys edx
415
; out: al=byte; destroys edx
409
	push	ecx
416
	push	ecx
410
	mov	ecx, 1
417
	mov	ecx, 1
411
.LzmaLiteralDecodeMatch.1:
418
.LzmaLiteralDecodeMatch.1:
412
	add	dl, dl
419
	add	dl, dl
413
	setc	ch
420
	setc	ch
414
	push	eax
421
	push	eax
415
	lea	eax, [eax+ecx*4+0x100*4]
422
	lea	eax, [eax+ecx*4+0x100*4]
416
	call	.RangeDecoderBitDecode
423
	call	.RangeDecoderBitDecode
417
	pop	eax
424
	pop	eax
418
	adc	cl, cl
425
	adc	cl, cl
419
	jc	.LzmaLiteralDecode.ret
426
	jc	.LzmaLiteralDecode.ret
420
	xor	ch, cl
427
	xor	ch, cl
421
	test	ch, 1
428
	test	ch, 1
422
	mov	ch, 0
429
	mov	ch, 0
423
	jnz	@b
430
	jnz	@b
424
	jmp	.LzmaLiteralDecodeMatch.1
431
	jmp	.LzmaLiteralDecodeMatch.1
425
 
432
 
426
.LzmaLenDecode:
433
.LzmaLenDecode:
427
; in: eax->prob, edx=posState
434
; in: eax->prob, edx=posState
428
; out: ecx=len
435
; out: ecx=len
429
	push	eax
436
	push	eax
430
	add	eax, .LenChoice*4
437
	add	eax, .LenChoice*4
431
	call	.RangeDecoderBitDecode
438
	call	.RangeDecoderBitDecode
432
	pop	eax
439
	pop	eax
433
	jnc	.0
440
	jnc	.0
434
	push	eax
441
	push	eax
435
	add	eax, .LenChoice2*4
442
	add	eax, .LenChoice2*4
436
	call	.RangeDecoderBitDecode
443
	call	.RangeDecoderBitDecode
437
	pop	eax
444
	pop	eax
438
	jc	@f
445
	jc	@f
439
	mov	ecx, .kLenNumMidBits
446
	mov	ecx, .kLenNumMidBits
440
	shl	edx, cl
447
	shl	edx, cl
441
	lea	eax, [eax + .LenMid*4 + edx*4]
448
	lea	eax, [eax + .LenMid*4 + edx*4]
442
	call	.RangeDecoderBitTreeDecode
449
	call	.RangeDecoderBitTreeDecode
443
	add	ecx, .kLenNumLowSymbols
450
	add	ecx, .kLenNumLowSymbols
444
	ret
451
	ret
445
@@:
452
@@:
446
	add	eax, .LenHigh*4
453
	add	eax, .LenHigh*4
447
	mov	ecx, .kLenNumHighBits
454
	mov	ecx, .kLenNumHighBits
448
	call	.RangeDecoderBitTreeDecode
455
	call	.RangeDecoderBitTreeDecode
449
	add	ecx, .kLenNumLowSymbols + .kLenNumMidSymbols
456
	add	ecx, .kLenNumLowSymbols + .kLenNumMidSymbols
450
	ret
457
	ret
451
.0:
458
.0:
452
	mov	ecx, .kLenNumLowBits
459
	mov	ecx, .kLenNumLowBits
453
	shl	edx, cl
460
	shl	edx, cl
454
	lea	eax, [eax + .LenLow*4 + edx*4]
461
	lea	eax, [eax + .LenLow*4 + edx*4]
455
.RangeDecoderBitTreeDecode:
462
.RangeDecoderBitTreeDecode:
456
; in: eax->probs,ecx=numLevels
463
; in: eax->probs,ecx=numLevels
457
; out: ecx=length; destroys edx
464
; out: ecx=length; destroys edx
458
	push	ebx
465
	push	ebx
459
	mov	edx, 1
466
	mov	edx, 1
460
	mov	ebx, edx
467
	mov	ebx, edx
461
@@:
468
@@:
462
	push	eax
469
	push	eax
463
	lea	eax, [eax+edx*4]
470
	lea	eax, [eax+edx*4]
464
	call	.RangeDecoderBitDecode
471
	call	.RangeDecoderBitDecode
465
	pop	eax
472
	pop	eax
466
	adc	dl, dl
473
	adc	dl, dl
467
	add	bl, bl
474
	add	bl, bl
468
	loop	@b
475
	loop	@b
469
	sub	dl, bl
476
	sub	dl, bl
470
	pop	ebx
477
	pop	ebx
471
	mov	ecx, edx
478
	mov	ecx, edx
472
	ret
479
	ret
473
.RangeDecoderReverseBitTreeDecode:
480
.RangeDecoderReverseBitTreeDecode:
474
; in: eax->probs,ecx=numLevels
481
; in: eax->probs,ecx=numLevels
475
; out: ecx=length; destroys edx
482
; out: ecx=length; destroys edx
476
	push	ebx ecx
483
	push	ebx ecx
477
	mov	edx, 1
484
	mov	edx, 1
478
	xor	ebx, ebx
485
	xor	ebx, ebx
479
@@:
486
@@:
480
	push	eax
487
	push	eax
481
	lea	eax, [eax+edx*4]
488
	lea	eax, [eax+edx*4]
482
	call	.RangeDecoderBitDecode
489
	call	.RangeDecoderBitDecode
483
	lahf
490
	lahf
484
	adc	edx, edx
491
	adc	edx, edx
485
	sahf
492
	sahf
486
	rcr	ebx, 1
493
	rcr	ebx, 1
487
	pop	eax
494
	pop	eax
488
	loop	@b
495
	loop	@b
489
	pop	ecx
496
	pop	ecx
490
	rol	ebx, cl
497
	rol	ebx, cl
491
	mov	ecx, ebx
498
	mov	ecx, ebx
492
	pop	ebx
499
	pop	ebx
493
	ret
500
	ret
494
 
501
 
495
uglobal
502
uglobal
496
align 4
503
align 4
497
unpack.p	rd	unpack.LZMA_BASE_SIZE + (unpack.LZMA_LIT_SIZE shl (unpack.lc+unpack.lp))
504
unpack.p	rd	unpack.LZMA_BASE_SIZE + (unpack.LZMA_LIT_SIZE shl (unpack.lc+unpack.lp))
498
unpack.code_	dd	?
505
unpack.code_	dd	?
499
unpack.range	dd	?
506
unpack.range	dd	?
500
unpack.rep0	dd	?
507
unpack.rep0	dd	?
501
unpack.rep1	dd	?
508
unpack.rep1	dd	?
502
unpack.rep2	dd	?
509
unpack.rep2	dd	?
503
unpack.rep3	dd	?
510
unpack.rep3	dd	?
504
unpack.previousByte db	?
511
unpack.previousByte db	?
505
endg
512
endg