Subversion Repositories Kolibri OS

Rev

Rev 1671 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1681 mario79 1
kIfinityPrice equ 0x0FFFFFFF
2
 
1671 mario79 3
;* Call: ***************************************************************
1681 mario79 4
;lzma_compress(
5
;	const void* source,
6
;	void* destination,
7
;	unsigned length,
8
;	void* workmem)
1671 mario79 9
lzma_compress:
10
	push	ebp
11
	mov	ebp,esp
12
	and	esp,0xFFFFFFF8
1681 mario79 13
	sub	esp,12
1671 mario79 14
	push	ebx
15
	push	esi
16
	push	edi
17
	push	2
18
	pop	esi
19
	xor	ebx,ebx
1681 mario79 20
	mov	[esp+20],esi
21
	mov	[g_FastPos],bl
22
	mov	byte [g_FastPos+1],1
23
	mov	[esp+16],esi
1671 mario79 24
;----------------------------------------------------------
25
.labl_00:
1681 mario79 26
	mov	ecx,[esp+16]
1671 mario79 27
	xor	edi,edi
28
	sar	ecx,1
29
	dec	ecx
30
	inc	edi
31
	shl	edi,cl
32
	cmp	edi,ebx
33
	jbe	.labl_01
1681 mario79 34
 
35
	mov	eax,[esp+20]
1671 mario79 36
	push	edi
1681 mario79 37
	push	dword [esp+20]
38
	lea	eax,[eax+g_FastPos]
1671 mario79 39
	push	eax
40
	call	_memset
1681 mario79 41
	add	esp,12
42
	add	[esp+20],edi
1671 mario79 43
;----------------------------------------------------------
44
.labl_01:
1681 mario79 45
	inc	dword [esp+16]
46
	cmp	dword [esp+16],20
1671 mario79 47
	jl	.labl_00
1681 mario79 48
 
49
	mov	edi,[ebp+20]
1671 mario79 50
	push	3
51
	pop	eax
52
	mov	ecx,edi
53
	and	ecx,eax
1681 mario79 54
	mov	edx,128
55
	mov	[_numFastBytes],edx
56
	mov	[_posStateBits],esi
57
	mov	[_posStateMask],eax
58
	mov	[_numLiteralContextBits],eax
59
	mov	[_numLiteralPosStateBits],ebx
60
	mov	[_writeEndMark],bl
61
	mov	[_finished],bl
1671 mario79 62
	je	.labl_02
1681 mario79 63
 
1671 mario79 64
	sub	edi,ecx
65
	add	edi,4
66
;----------------------------------------------------------
67
.labl_02:
1681 mario79 68
;CLiteralEncoder_Create
69
	mov	[_numPrevBits],eax
70
	mov	eax,[_dictionarySize]
71
	mov	[_posEncoders],edi
1671 mario79 72
	add	edi,0x6000
73
	inc	eax
1681 mario79 74
	mov	[_numPosBits],ebx
75
	mov	[_posMask],ebx
76
;MatchFinder_Create
77
	mov	[_matchMaxLen],edx
78
	mov	[_cyclicBufferSize],eax
79
	mov	[_hash],edi
80
	mov	dword [_cutValue],0xFF
81
	call	CEncoder_Init
82
	call	FillPosSlotPrices
83
	call	FillDistancesPrices
84
	call	FillAlignPrices
85
	push	127
1671 mario79 86
	pop	esi
1681 mario79 87
	mov	[_lenEncoder+0xC88C],esi
88
	mov	[esp+16],ebx
1671 mario79 89
;----------------------------------------------------------
90
.labl_03:
1681 mario79 91
	push	dword [esp+16]
92
	mov	eax,_lenEncoder
93
	call	CPriceTableEncoder_UpdateTable
94
	inc	dword [esp+16]
95
	cmp	dword [esp+16],4
1671 mario79 96
	jb	.labl_03
1681 mario79 97
 
98
	mov	[_repMatchLenEncoder+0xC88C],esi
1671 mario79 99
	xor	esi,esi
100
;----------------------------------------------------------
101
.labl_04:
102
	push	esi
1681 mario79 103
	mov	eax,_repMatchLenEncoder
104
	call	CPriceTableEncoder_UpdateTable
1671 mario79 105
	inc	esi
106
	cmp	esi,4
107
	jb	.labl_04
1681 mario79 108
 
1671 mario79 109
	mov	eax,[ebp+8]
1681 mario79 110
	mov	esi,[ebp+12]
1671 mario79 111
	dec	eax
1681 mario79 112
	mov	[_buffer],eax
113
	mov	eax,[ebp+16]
1671 mario79 114
	inc	eax
1681 mario79 115
	mov	[_streamPos],eax
1671 mario79 116
	mov	ecx,0x110000
117
	xor	eax,eax
1681 mario79 118
	mov	[lastPosSlotFillingPos],ebx
119
	mov	[lastPosSlotFillingPos+4],ebx
120
	mov	[nowPos64],ebx
121
	mov	[nowPos64+4],ebx
122
	mov	[pack_length],esi
123
	mov	dword [_pos],1
1671 mario79 124
	rep	stosd
1681 mario79 125
	mov	[pack_pos],ebx
1671 mario79 126
;----------------------------------------------------------
1681 mario79 127
;MatchFinder_Init
1671 mario79 128
.labl_08:
129
	push	8
130
	mov	eax,ebx
131
	pop	ecx
132
;----------------------------------------------------------
133
.labl_07:
134
	test	al,1
135
	je	.labl_05
1681 mario79 136
 
1671 mario79 137
	shr	eax,1
138
	xor	eax,0xEDB88320
139
	jmp	.labl_06
140
;----------------------------------------------------------
141
.labl_05:
142
	shr	eax,1
143
;----------------------------------------------------------
144
.labl_06:
145
	dec	ecx
146
	jne	.labl_07
1681 mario79 147
 
148
	mov	[crc_table+ebx*4],eax
1671 mario79 149
	inc	ebx
1681 mario79 150
	cmp	ebx,256
1671 mario79 151
	jb	.labl_08
152
;----------------------------------------------------------
153
.labl_09:
1681 mario79 154
	call	CodeOneBlock
1671 mario79 155
	test	al,al
156
	jne	.labl_09
1681 mario79 157
 
158
	mov	eax,[pack_length]
1671 mario79 159
	pop	edi
160
	sub	eax,esi
161
	pop	esi
162
	pop	ebx
163
	mov	esp,ebp
164
	pop	ebp
1681 mario79 165
	ret	16
1671 mario79 166
;*****************************************************************************
167
 
168
;* Call: ***************************************************************
169
_memset:
170
	push	edi
171
	mov	edi,[esp+8]
172
	mov	al,[esp+12]
173
	mov	ecx,[esp+16]
174
	rep	stosb
175
	pop	edi
176
	ret
177
;*****************************************************************************
178
 
179
;* Call: ***************************************************************
1681 mario79 180
CEncoder_Init:
181
;RangeEncoder_Init
182
	and	dword [low],0
183
	and	dword [low+4],0
184
	or	dword [range],0xFFFFFFFF
1671 mario79 185
	push	ebx
186
	push	esi
187
	push	edi
188
	xor	eax,eax
1681 mario79 189
	mov	edi,_repDistances
1671 mario79 190
	stosd
191
	stosd
192
	xor	ebx,ebx
193
	stosd
194
	inc	ebx
1681 mario79 195
;CBaseState_Init
196
	mov	byte [_state],0
197
	mov	byte [_previousByte],0
198
	stosd
199
	mov	[_cacheSize],ebx
200
	mov	byte [_cache],0
1671 mario79 201
	xor	ecx,ecx
202
;----------------------------------------------------------
203
.labl_00:
204
	mov	eax,ebx
205
	shl	eax,cl
206
	push	8
207
	pop	edx
208
	sub	edx,ecx
1681 mario79 209
	lea	esi,[Models+eax*4]
1671 mario79 210
	shl	edx,6
211
;----------------------------------------------------------
212
.labl_01:
213
	mov	edi,eax
214
	shl	edi,6
215
	shr	edi,cl
216
	add	edi,edx
217
	mov	[esi],edi
218
	add	esi,4
219
	dec	eax
220
	jne	.labl_01
1681 mario79 221
 
1671 mario79 222
	inc	ecx
223
	cmp	ecx,9
224
	jl	.labl_00
1681 mario79 225
 
226
	push	12
1671 mario79 227
	pop	edx
1681 mario79 228
	mov	esi,1024
1671 mario79 229
	mov	eax,esi
230
	mov	ecx,edx
1681 mario79 231
	mov	edi,_isRepG2
232
	rep	stosd
1671 mario79 233
	mov	ecx,edx
1681 mario79 234
	mov	edi,_isRepG1
1671 mario79 235
	rep	stosd
236
	mov	ecx,edx
1681 mario79 237
	mov	edi,_isRepG0
1671 mario79 238
	rep	stosd
239
	mov	ecx,edx
1681 mario79 240
	mov	edi,_isRep
1671 mario79 241
	rep	stosd
242
	xor	ecx,ecx
243
;----------------------------------------------------------
244
.labl_02:
1681 mario79 245
	lea	edi,[ecx+_isRep0Long]
1671 mario79 246
	mov	eax,esi
1681 mario79 247
	stosd
248
	stosd
249
	stosd
250
	stosd
251
	lea	edi,[ecx+_isMatch]
1671 mario79 252
	mov	eax,esi
1681 mario79 253
	stosd
254
	stosd
255
	stosd
256
	add	ecx,64
257
	cmp	ecx,768
258
	stosd
1671 mario79 259
	jl	.labl_02
1681 mario79 260
 
261
	mov	eax,[_numPrevBits]
262
	mov	ecx,[_numPosBits]
1671 mario79 263
	add	ecx,eax
264
	mov	eax,ebx
265
	shl	eax,cl
266
	test	eax,eax
267
	jbe	.labl_04
1681 mario79 268
 
1671 mario79 269
	xor	edx,edx
270
	mov	ebx,eax
271
;----------------------------------------------------------
272
.labl_03:
1681 mario79 273
	mov	eax,[_posEncoders]
1671 mario79 274
	lea	edi,[edx+eax]
1681 mario79 275
	mov	ecx,768
1671 mario79 276
	mov	eax,esi
1681 mario79 277
	add	edx,3072
1671 mario79 278
	dec	ebx
279
	rep	stosd
280
	jne	.labl_03
281
;----------------------------------------------------------
282
.labl_04:
1681 mario79 283
	mov	edi,_posSlotEncoder
1671 mario79 284
;----------------------------------------------------------
285
.labl_05:
286
	push	6
287
	pop	ecx
288
	mov	eax,edi
1681 mario79 289
	call	CBitTreeEncoder_Init
290
	add	edi,1028
291
	cmp	edi,lastPosSlotFillingPos
1671 mario79 292
	jl	.labl_05
1681 mario79 293
 
294
	push	114
1671 mario79 295
	mov	eax,esi
296
	pop	ecx
1681 mario79 297
	mov	edi,_literalEncoder
298
	mov	esi,_lenEncoder
1671 mario79 299
	rep	stosd
1681 mario79 300
	call	CPriceTableEncoder_Init
301
	mov	esi,_repMatchLenEncoder
302
	call	CPriceTableEncoder_Init
1671 mario79 303
	push	4
304
	pop	ecx
1681 mario79 305
	mov	eax,_posAlignEncoder
306
	call	CBitTreeEncoder_Init
1671 mario79 307
	pop	edi
308
	xor	eax,eax
309
	pop	esi
1681 mario79 310
	mov	byte [_longestMatchWasFound],0
311
	mov	[_optimumEndIndex],eax
312
	mov	[_optimumCurrentIndex],eax
313
	mov	[_additionalOffset],eax
1671 mario79 314
	pop	ebx
315
	ret
316
;*****************************************************************************
317
 
318
;* Call: ***************************************************************
1681 mario79 319
CodeOneBlock:
1671 mario79 320
	sub	esp,0x2C
1681 mario79 321
	cmp	byte [_finished],0
1671 mario79 322
	push	ebx
323
	push	ebp
324
	push	esi
325
	push	edi
326
	je	.labl_01
327
;----------------------------------------------------------
328
.labl_00:
329
	xor	al,al
330
	jmp	.labl_28
331
;----------------------------------------------------------
332
.labl_01:
1681 mario79 333
	mov	ebp,[nowPos64]
334
	mov	edi,[nowPos64+4]
1671 mario79 335
	mov	eax,ebp
336
	or	eax,edi
1681 mario79 337
	mov	byte [_finished],1
338
	mov	[esp+52],ebp
339
	mov	[esp+56],edi
1671 mario79 340
	jne	.labl_04
1681 mario79 341
 
342
	mov	eax,[_streamPos]
343
	sub	eax,[_pos]
1671 mario79 344
	jne	.labl_03
1681 mario79 345
 
1671 mario79 346
	push	5
347
	pop	esi
348
;----------------------------------------------------------
349
.labl_02:
1681 mario79 350
	call	RangeEncoder_ShiftLow
1671 mario79 351
	dec	esi
352
	jne	.labl_02
1681 mario79 353
 
1671 mario79 354
	jmp	.labl_00
355
;----------------------------------------------------------
356
.labl_03:
1681 mario79 357
	call	ReadMatchDistances
358
	movzx	esi,byte [_state]
1671 mario79 359
	mov	edx,esi
360
	shl	edx,6
361
	xor	edi,edi
362
	push	edi
1681 mario79 363
	add	edx,_isMatch
364
	call	CMyBitEncoder_Encode
1671 mario79 365
	mov	al,[esi+LiteralNextStates]
1681 mario79 366
	mov	ecx,[_pos]
367
	mov	[_state],al
368
	mov	eax,[_buffer]
369
	sub	eax,[_additionalOffset]
1671 mario79 370
	mov	bl,[eax+ecx]
1681 mario79 371
	mov	al,[_previousByte]
372
	mov	[esp+24],bl
373
	push	dword [esp+24]
1671 mario79 374
	push	edi
1681 mario79 375
	call	CState_IsCharState
376
	imul	eax,eax,3072
377
	add	eax,[_posEncoders]
1671 mario79 378
	push	eax
1681 mario79 379
	call	CLiteralEncoder2_Encode
380
	dec	dword [_additionalOffset]
1671 mario79 381
	xor	ebp,ebp
382
	inc	ebp
1681 mario79 383
	mov	[_previousByte],bl
384
	mov	[nowPos64],ebp
385
	mov	[nowPos64+4],edi
1671 mario79 386
;----------------------------------------------------------
387
.labl_04:
1681 mario79 388
	mov	eax,[_streamPos]
389
	sub	eax,[_pos]
1671 mario79 390
	jne	.labl_06
1681 mario79 391
 
1671 mario79 392
	push	5
393
	pop	esi
394
;----------------------------------------------------------
395
.labl_05:
1681 mario79 396
	call	RangeEncoder_ShiftLow
1671 mario79 397
	dec	esi
398
	jne	.labl_05
1681 mario79 399
 
1671 mario79 400
	jmp	.labl_00
401
;----------------------------------------------------------
402
.labl_06:
1681 mario79 403
	lea	eax,[esp+20]
1671 mario79 404
	push	eax
1681 mario79 405
	lea	eax,[esp+20]
1671 mario79 406
	push	eax
407
	mov	ebx,ebp
408
	push	ebp
409
	and	ebx,3
1681 mario79 410
	call	GetOptimum
411
	cmp	dword [esp+20],1
1671 mario79 412
	jne	.labl_09
1681 mario79 413
 
414
	cmp	dword [esp+16],0xFFFFFFFF
1671 mario79 415
	jne	.labl_09
1681 mario79 416
 
417
	movzx	eax,byte [_state]
1671 mario79 418
	shl	eax,4
419
	add	eax,ebx
420
	push	0
1681 mario79 421
	lea	edx,[_isMatch+eax*4]
422
	call	CMyBitEncoder_Encode
423
	mov	eax,[_buffer]
424
	mov	esi,[_additionalOffset]
425
	mov	ebx,[_pos]
1671 mario79 426
	sub	eax,esi
427
	mov	al,[eax+ebx]
1681 mario79 428
	mov	[esp+24],al
429
	mov	al,[_previousByte]
1671 mario79 430
	push	ebp
1681 mario79 431
	call	CState_IsCharState
432
	imul	eax,eax,3072
433
	add	eax,[_posEncoders]
434
	cmp	byte [_state],7
435
	push	dword [esp+24]
1671 mario79 436
	jb	.labl_07
1681 mario79 437
 
438
	mov	ecx,[_buffer]
439
	sub	ecx,[_repDistances]
1671 mario79 440
	sub	ecx,esi
441
	mov	cl,[ecx+ebx-1]
1681 mario79 442
	mov	[esp+52],cl
443
	push	dword [esp+52]
1671 mario79 444
	push	eax
1681 mario79 445
	call	CLiteralEncoder2_EncodeMatched
1671 mario79 446
	jmp	.labl_08
447
;----------------------------------------------------------
448
.labl_07:
449
	push	eax
1681 mario79 450
	call	CLiteralEncoder2_Encode
1671 mario79 451
;----------------------------------------------------------
452
.labl_08:
1681 mario79 453
	movzx	eax,byte [_state]
1671 mario79 454
	mov	al,[eax+LiteralNextStates]
1681 mario79 455
	mov	[_state],al
456
	mov	al,[esp+24]
1671 mario79 457
	jmp	.labl_24
458
;----------------------------------------------------------
459
.labl_09:
1681 mario79 460
	movzx	edi,byte [_state]
1671 mario79 461
	mov	eax,edi
462
	shl	eax,4
463
	add	eax,ebx
464
	shl	eax,2
465
	push	1
1681 mario79 466
	lea	edx,[eax+_isMatch]
467
	mov	[esp+40],eax
468
	call	CMyBitEncoder_Encode
469
	cmp	dword [esp+16],4
1671 mario79 470
	jnb	.labl_17
1681 mario79 471
 
1671 mario79 472
	mov	esi,edi
473
	shl	esi,2
474
	push	1
1681 mario79 475
	lea	edx,[esi+_isRep]
476
	call	CMyBitEncoder_Encode
477
	cmp	dword [esp+16],0
478
	lea	edx,[esi+_isRepG0]
1671 mario79 479
	jne	.labl_10
1681 mario79 480
 
1671 mario79 481
	push	0
1681 mario79 482
	call	CMyBitEncoder_Encode
483
	mov	edx,[esp+36]
1671 mario79 484
	xor	eax,eax
1681 mario79 485
	cmp	dword [esp+20],1
486
	lea	edx,[edx+_isRep0Long]
1671 mario79 487
	setne	al
488
	jmp	.labl_12
489
;----------------------------------------------------------
490
.labl_10:
491
	push	1
1681 mario79 492
	call	CMyBitEncoder_Encode
493
	cmp	dword [esp+16],1
494
	lea	edx,[esi+_isRepG1]
1671 mario79 495
	jne	.labl_11
1681 mario79 496
 
1671 mario79 497
	push	0
498
	jmp	.labl_13
499
;----------------------------------------------------------
500
.labl_11:
501
	push	1
1681 mario79 502
	call	CMyBitEncoder_Encode
503
	mov	eax,[esp+16]
1671 mario79 504
	add	eax,0xFFFFFFFE
1681 mario79 505
	lea	edx,[esi+_isRepG2]
1671 mario79 506
;----------------------------------------------------------
507
.labl_12:
508
	push	eax
509
;----------------------------------------------------------
510
.labl_13:
1681 mario79 511
	call	CMyBitEncoder_Encode
512
	mov	eax,[esp+20]
1671 mario79 513
	cmp	eax,1
514
	jne	.labl_14
1681 mario79 515
 
1671 mario79 516
	mov	al,[edi+ShortRepNextStates]
517
	jmp	.labl_15
518
;----------------------------------------------------------
519
.labl_14:
520
	add	eax,0xFFFFFFFE
1681 mario79 521
	mov	esi,_repMatchLenEncoder
522
	call	CPriceTableEncoder_Encode
1671 mario79 523
	mov	al,[edi+RepNextStates]
524
;----------------------------------------------------------
525
.labl_15:
1681 mario79 526
	mov	[_state],al
527
	mov	eax,[esp+16]
528
	mov	ecx,[_repDistances+eax*4]
1671 mario79 529
	test	eax,eax
530
	je	.labl_23
531
;----------------------------------------------------------
532
.labl_16:
533
	dec	eax
1681 mario79 534
	mov	edx,[_repDistances+eax*4]
535
	mov	[_repDistances+4+eax*4],edx
1671 mario79 536
	jne	.labl_16
1681 mario79 537
 
538
	mov	[_repDistances],ecx
1671 mario79 539
	jmp	.labl_23
540
;----------------------------------------------------------
541
.labl_17:
542
	push	0
1681 mario79 543
	lea	edx,[_isRep+edi*4]
544
	call	CMyBitEncoder_Encode
1671 mario79 545
	mov	al,[edi+MatchNextStates]
1681 mario79 546
	mov	edi,[esp+20]
547
	mov	[_state],al
1671 mario79 548
	add	edi,0xFFFFFFFE
549
	mov	eax,edi
1681 mario79 550
	mov	esi,_lenEncoder
551
	call	CPriceTableEncoder_Encode
552
	sub	dword [esp+16],4
553
	mov	eax,[esp+16]
554
	call	GetPosSlot
555
	cmp	dword [esp+20],6
1671 mario79 556
	mov	ebx,eax
557
	jb	.labl_18
1681 mario79 558
 
1671 mario79 559
	push	3
560
	pop	edi
561
;----------------------------------------------------------
562
.labl_18:
1681 mario79 563
	imul	edi,edi,1028
1671 mario79 564
	push	ebx
1681 mario79 565
	add	edi,_posSlotEncoder
1671 mario79 566
	call	cm_pr_16
567
	cmp	ebx,4
568
	jb	.labl_21
1681 mario79 569
 
570
	mov	esi,[esp+16]
1671 mario79 571
	xor	eax,eax
572
	inc	eax
573
	mov	ecx,ebx
574
	mov	edi,ebx
575
	and	edi,eax
576
	shr	ecx,1
577
	dec	ecx
578
	or	edi,2
579
	shl	edi,cl
580
	sub	esi,edi
1681 mario79 581
	cmp	ebx,14
1671 mario79 582
	jnb	.labl_20
1681 mario79 583
 
584
	mov	[esp+32],esi
585
	mov	[esp+28],eax
1671 mario79 586
	test	ecx,ecx
587
	jle	.labl_21
1681 mario79 588
 
589
	mov	[esp+36],ecx
1671 mario79 590
;----------------------------------------------------------
591
.labl_19:
1681 mario79 592
	mov	edx,[esp+28]
593
	mov	esi,[esp+32]
1671 mario79 594
	sub	edx,ebx
595
	add	edx,edi
596
	and	esi,1
597
	push	esi
1681 mario79 598
	lea	edx,[_numLiteralContextBits+edx*4]
599
	call	CMyBitEncoder_Encode
600
	mov	eax,[esp+28]
601
	shr	dword [esp+32],1
602
	dec	dword [esp+36]
1671 mario79 603
	lea	eax,[esi+eax*2]
1681 mario79 604
	mov	[esp+28],eax
1671 mario79 605
	jne	.labl_19
1681 mario79 606
 
1671 mario79 607
	jmp	.labl_21
608
;----------------------------------------------------------
609
.labl_20:
610
	lea	eax,[ecx-4]
611
	mov	ecx,esi
612
	shr	ecx,4
613
	push	ecx
1681 mario79 614
	call	RangeEncoder_EncodeDirectBits
1671 mario79 615
	and	esi,0xF
616
	push	esi
1681 mario79 617
	call	CBitTreeEncoder_ReverseEncode
618
	dec	dword [_alignPriceCount]
1671 mario79 619
	jne	.labl_21
1681 mario79 620
 
621
	call	FillAlignPrices
1671 mario79 622
;----------------------------------------------------------
623
.labl_21:
1681 mario79 624
	mov	eax,_repDistances+12
1671 mario79 625
;----------------------------------------------------------
626
.labl_22:
627
	mov	ecx,[eax-4]
628
	mov	[eax],ecx
629
	sub	eax,4
1681 mario79 630
	cmp	eax,_repDistances
1671 mario79 631
	jne	.labl_22
1681 mario79 632
 
633
	mov	eax,[esp+16]
634
	mov	[_repDistances],eax
1671 mario79 635
;----------------------------------------------------------
636
.labl_23:
1681 mario79 637
	mov	eax,[_buffer]
638
	mov	esi,[_additionalOffset]
639
	mov	ebx,[_pos]
640
	mov	ecx,[esp+20]
641
	mov	edi,[nowPos64+4]
1671 mario79 642
	sub	eax,esi
643
	add	eax,ebx
644
	mov	al,[eax+ecx-1]
645
;----------------------------------------------------------
646
.labl_24:
1681 mario79 647
	sub	esi,[esp+20]
648
	add	ebp,[esp+20]
649
	mov	[_previousByte],al
1671 mario79 650
	adc	edi,0
651
	mov	eax,ebp
1681 mario79 652
	sub	eax,[lastPosSlotFillingPos]
1671 mario79 653
	mov	ecx,edi
1681 mario79 654
	sbb	ecx,[lastPosSlotFillingPos+4]
655
	mov	[_additionalOffset],esi
656
	mov	[nowPos64],ebp
657
	mov	[nowPos64+4],edi
658
	mov	[esp+40],ecx
1671 mario79 659
	jne	.labl_25
1681 mario79 660
 
661
	cmp	eax,512
1671 mario79 662
	jb	.labl_26
663
;----------------------------------------------------------
664
.labl_25:
1681 mario79 665
	call	FillPosSlotPrices
666
	call	FillDistancesPrices
667
	mov	[lastPosSlotFillingPos],ebp
668
	mov	[lastPosSlotFillingPos+4],edi
1671 mario79 669
;----------------------------------------------------------
670
.labl_26:
671
	test	esi,esi
672
	jne	.labl_06
1681 mario79 673
 
674
	mov	eax,[_streamPos]
1671 mario79 675
	sub	eax,ebx
676
	je	.labl_29
1681 mario79 677
 
1671 mario79 678
	mov	ecx,ebp
1681 mario79 679
	sub	ecx,[esp+52]
1671 mario79 680
	mov	eax,edi
1681 mario79 681
	sbb	eax,[esp+56]
1671 mario79 682
	test	eax,eax
683
	ja	.labl_27
1681 mario79 684
 
1671 mario79 685
	jb	.labl_06
1681 mario79 686
 
1671 mario79 687
	cmp	ecx,0x1000
688
	jb	.labl_06
689
;----------------------------------------------------------
690
.labl_27:
1681 mario79 691
	mov	byte [_finished],0
1671 mario79 692
	mov	al,1
693
;----------------------------------------------------------
694
.labl_28:
695
	pop	edi
696
	pop	esi
697
	pop	ebp
698
	pop	ebx
1681 mario79 699
	add	esp,44
1671 mario79 700
	ret
701
;----------------------------------------------------------
702
.labl_29:
703
	push	5
704
	pop	esi
705
;----------------------------------------------------------
706
.labl_30:
1681 mario79 707
	call	RangeEncoder_ShiftLow
1671 mario79 708
	dec	esi
709
	jne	.labl_30
1681 mario79 710
 
1671 mario79 711
	jmp	.labl_00
712
;*****************************************************************************
713
 
714
;* Call: ***************************************************************
1681 mario79 715
GetOptimum:
1671 mario79 716
	push	ebp
717
	mov	ebp,esp
1681 mario79 718
	mov	ecx,[_optimumCurrentIndex]
719
	sub	esp,116
1671 mario79 720
	push	esi
1681 mario79 721
	cmp	[_optimumEndIndex],ecx
1671 mario79 722
	je	.labl_00
1681 mario79 723
 
1671 mario79 724
	mov	eax,ecx
1681 mario79 725
	imul	eax,eax,40
726
	add	eax,state.State
727
	mov	edx,[eax+16]
728
	mov	eax,[eax+20]
1671 mario79 729
	mov	esi,edx
730
	sub	esi,ecx
1681 mario79 731
	mov	ecx,[ebp+16]
1671 mario79 732
	mov	[ecx],esi
1681 mario79 733
	mov	ecx,[ebp+12]
1671 mario79 734
	mov	[ecx],eax
1681 mario79 735
	mov	[_optimumCurrentIndex],edx
1671 mario79 736
	jmp	.labl_76
737
;----------------------------------------------------------
738
.labl_00:
739
	push	edi
740
	xor	edi,edi
1681 mario79 741
	cmp	byte [_longestMatchWasFound],0
742
	mov	[_optimumEndIndex],edi
743
	mov	[_optimumCurrentIndex],edi
1671 mario79 744
	jne	.labl_01
1681 mario79 745
 
746
	call	ReadMatchDistances
1671 mario79 747
	jmp	.labl_02
748
;----------------------------------------------------------
749
.labl_01:
1681 mario79 750
	mov	eax,[_longestMatchLength]
751
	mov	byte [_longestMatchWasFound],0
1671 mario79 752
;----------------------------------------------------------
753
.labl_02:
754
	push	ebx
755
	mov	ebx,[ebp+8]
1681 mario79 756
	mov	[ebp-16],eax
1671 mario79 757
	mov	eax,ebx
758
	shl	eax,2
1681 mario79 759
	mov	[ebp-76],eax
1671 mario79 760
;----------------------------------------------------------
761
.labl_03:
762
	mov	esi,edi
763
	shl	esi,2
1681 mario79 764
	mov	eax,[esi+_repDistances]
1671 mario79 765
	push	eax
1681 mario79 766
	mov	[ebp+esi-100],eax
1671 mario79 767
	push	dword 0xFFFFFFFF
1681 mario79 768
	mov	eax,273
769
	call	GetMatchLen
770
	mov	[ebp+esi-116],eax
1671 mario79 771
	test	edi,edi
772
	je	.labl_04
1681 mario79 773
 
774
	mov	ecx,[ebp-76]
775
	cmp	eax,[ebp+ecx-116]
1671 mario79 776
	jbe	.labl_05
777
;----------------------------------------------------------
778
.labl_04:
779
	mov	ebx,edi
1681 mario79 780
	mov	[ebp-76],esi
1671 mario79 781
;----------------------------------------------------------
782
.labl_05:
783
	inc	edi
784
	cmp	edi,4
785
	jb	.labl_03
1681 mario79 786
 
787
	mov	eax,[ebp+ebx*4-116]
788
	mov	ecx,128
789
	mov	[ebp-68],eax
1671 mario79 790
	cmp	eax,ecx
791
	jb	.labl_06
1681 mario79 792
 
793
	mov	ecx,[ebp+12]
1671 mario79 794
	mov	[ecx],ebx
795
	jmp	.labl_07
796
;----------------------------------------------------------
797
.labl_06:
1681 mario79 798
	cmp	[ebp-16],ecx
1671 mario79 799
	jb	.labl_08
1681 mario79 800
 
801
	mov	eax,[distances+512]
802
	mov	ecx,[ebp+12]
1671 mario79 803
	add	eax,4
804
	mov	[ecx],eax
1681 mario79 805
	mov	eax,[ebp-16]
1671 mario79 806
;----------------------------------------------------------
807
.labl_07:
1681 mario79 808
	mov	ecx,[ebp+16]
1671 mario79 809
	mov	[ecx],eax
810
	dec	eax
1681 mario79 811
	call	MovePos
1671 mario79 812
	jmp	.labl_75
813
;----------------------------------------------------------
814
.labl_08:
1681 mario79 815
	mov	ecx,[_buffer]
816
	mov	eax,[_pos]
1671 mario79 817
	mov	dl,[eax+ecx-1]
1681 mario79 818
	sub	eax,[_repDistances]
819
	mov	bl,[_state]
820
	mov	[state.State],bl
1671 mario79 821
	mov	al,[eax+ecx-2]
1681 mario79 822
	mov	[ebp-52],al
1671 mario79 823
	mov	eax,[ebp+8]
824
	and	eax,3
825
	movzx	ecx,bl
826
	shl	ecx,4
827
	add	ecx,eax
1681 mario79 828
	mov	esi,[_isMatch+ecx*4]
829
	mov	[ebp-28],eax
1671 mario79 830
	cmp	bl,7
831
	sbb	al,al
1681 mario79 832
	mov	[ebp-48],dl
833
	push	dword [ebp-48]
1671 mario79 834
	inc	al
1681 mario79 835
	push	dword [ebp-52]
1671 mario79 836
	movzx	eax,al
837
	push	eax
838
	push	dword [ebp+8]
1681 mario79 839
	mov	al,[_previousByte]
840
	mov	[ebp-76],esi
841
	call	CLiteralEncoder_GetPrice
842
	or	dword [state.BackPrev+40],0xFFFFFFFF
843
	and	dword [state.PosPrev+40],0
1671 mario79 844
	shr	esi,2
1681 mario79 845
	add	eax,[Models+esi*4]
846
	mov	byte [state.Prev1IsChar+40],0
847
	mov	[state.Price+40],eax
848
	lea	esi,[ebp-100]
849
	mov	edi,state.Backs
1671 mario79 850
	movsd
851
	movsd
1681 mario79 852
	mov	eax,2048
1671 mario79 853
	mov	ecx,eax
1681 mario79 854
	sub	ecx,[ebp-76]
1671 mario79 855
	movsd
856
	shr	ecx,2
1681 mario79 857
	mov	edx,[Models+ecx*4]
1671 mario79 858
	movzx	ecx,bl
859
	movsd
1681 mario79 860
	mov	esi,[_isRep+ecx*4]
1671 mario79 861
	sub	eax,esi
862
	shr	eax,2
1681 mario79 863
	mov	edi,[Models+eax*4]
864
	mov	al,[ebp-48]
1671 mario79 865
	add	edi,edx
1681 mario79 866
	mov	[ebp-76],edx
867
	cmp	[ebp-52],al
1671 mario79 868
	jne	.labl_09
1681 mario79 869
 
870
	push	dword [ebp-28]
1671 mario79 871
	mov	al,bl
1681 mario79 872
	call	GetRepLen1Price
1671 mario79 873
	add	eax,edi
1681 mario79 874
	cmp	eax,[state.Price+40]
1671 mario79 875
	jnb	.labl_09
1681 mario79 876
 
877
	and	dword [state.BackPrev+40],0
878
	mov	[state.Price+40],eax
879
	mov	byte [state.Prev1IsChar+40],0
1671 mario79 880
;----------------------------------------------------------
881
.labl_09:
882
	push	2
883
	pop	eax
1681 mario79 884
	cmp	[ebp-16],eax
1671 mario79 885
	jnb	.labl_10
1681 mario79 886
 
887
	mov	eax,[ebp+12]
888
	mov	ecx,[state.BackPrev+40]
1671 mario79 889
	mov	[eax],ecx
1681 mario79 890
	mov	eax,[ebp+16]
1671 mario79 891
	mov	dword [eax],1
892
	jmp	.labl_75
893
;----------------------------------------------------------
894
.labl_10:
1681 mario79 895
	mov	ecx,[ebp-16]
1671 mario79 896
	shr	esi,2
1681 mario79 897
	mov	esi,[Models+esi*4]
898
	add	esi,[ebp-76]
899
	mov	[ebp-76],esi
900
	cmp	ecx,[ebp-68]
1671 mario79 901
	ja	.labl_11
1681 mario79 902
 
903
	and	dword [ebp-16],0
1671 mario79 904
;----------------------------------------------------------
905
.labl_11:
1681 mario79 906
	mov	[ebp-24],eax
907
	cmp	[ebp-16],eax
1671 mario79 908
	jb	.labl_13
1681 mario79 909
 
910
	mov	esi,state.BackPrev+40*2
1671 mario79 911
;----------------------------------------------------------
912
.labl_12:
1681 mario79 913
	mov	eax,[ebp-24]
914
	mov	edx,[distances+eax*4]
915
	push	dword [ebp-28]
1671 mario79 916
	and	dword [esi-4],0
917
	lea	ecx,[edx+4]
918
	mov	[esi],ecx
1681 mario79 919
	call	GetPosLenPrice
920
	add	eax,[ebp-76]
921
	inc	dword [ebp-24]
1671 mario79 922
	mov	[esi-8],eax
1681 mario79 923
	mov	eax,[ebp-24]
924
	mov	byte [esi-19],0
925
	add	esi,40
926
	cmp	eax,[ebp-16]
1671 mario79 927
	jbe	.labl_12
928
;----------------------------------------------------------
929
.labl_13:
1681 mario79 930
	mov	ecx,[ebp-16]
931
	cmp	ecx,[ebp-68]
1671 mario79 932
	jnb	.labl_14
1681 mario79 933
 
934
	mov	ecx,[ebp-68]
935
	mov	[ebp-16],ecx
1671 mario79 936
;----------------------------------------------------------
937
.labl_14:
1681 mario79 938
	cmp	[ebp-24],ecx
1671 mario79 939
	ja	.labl_16
1681 mario79 940
 
941
	mov	eax,[ebp-24]
942
	sub	ecx,[ebp-24]
943
	imul	eax,eax,40
944
	add	eax,state.Price
1671 mario79 945
	inc	ecx
946
;----------------------------------------------------------
947
.labl_15:
1681 mario79 948
	mov	dword [eax],kIfinityPrice
949
	add	eax,40
1671 mario79 950
	dec	ecx
951
	jne	.labl_15
952
;----------------------------------------------------------
953
.labl_16:
1681 mario79 954
	and	dword [ebp-24],0
1671 mario79 955
;----------------------------------------------------------
956
.labl_17:
1681 mario79 957
	mov	eax,[ebp-24]
958
	mov	eax,[ebp+eax*4-116]
1671 mario79 959
	push	2
960
	pop	ecx
1681 mario79 961
	mov	[ebp-32],ecx
1671 mario79 962
	cmp	eax,ecx
963
	jb	.labl_20
1681 mario79 964
 
965
	mov	esi,state.Price+40*2
1671 mario79 966
;----------------------------------------------------------
967
.labl_18:
1681 mario79 968
	push	dword [ebp-28]
969
	mov	edx,[ebp-24]
1671 mario79 970
	movzx	eax,bl
971
	push	eax
1681 mario79 972
	mov	eax,[ebp-32]
973
	call	GetRepPrice
1671 mario79 974
	add	eax,edi
975
	cmp	eax,[esi]
976
	jnb	.labl_19
1681 mario79 977
 
1671 mario79 978
	and	dword [esi+4],0
979
	mov	[esi],eax
1681 mario79 980
	mov	eax,[ebp-24]
1671 mario79 981
	mov	[esi+8],eax
1681 mario79 982
	mov	byte [esi-11],0
1671 mario79 983
;----------------------------------------------------------
984
.labl_19:
1681 mario79 985
	inc	dword [ebp-32]
986
	mov	eax,[ebp-24]
987
	mov	ecx,[ebp-32]
988
	add	esi,40
989
	cmp	ecx,[ebp+eax*4-116]
1671 mario79 990
	jbe	.labl_18
991
;----------------------------------------------------------
992
.labl_20:
1681 mario79 993
	inc	dword [ebp-24]
994
	cmp	dword [ebp-24],4
1671 mario79 995
	jb	.labl_17
1681 mario79 996
 
997
	mov	eax,[ebp-16]
1671 mario79 998
	xor	ecx,ecx
999
	inc	ecx
1000
	mov	[ebp-8],eax
1681 mario79 1001
	mov	[ebp-12],ecx
1671 mario79 1002
	cmp	eax,ecx
1003
	je	.labl_74
1004
;----------------------------------------------------------
1005
.labl_21:
1681 mario79 1006
	mov	edi,[ebp-12]
1671 mario79 1007
	inc	dword [ebp+8]
1008
	mov	ebx,edi
1681 mario79 1009
	imul	ebx,ebx,40
1010
	mov	dl,[ebx+state.Prev1IsChar]
1011
	mov	esi,[ebx+state.PosPrev]
1671 mario79 1012
	test	dl,dl
1013
	je	.labl_25
1681 mario79 1014
 
1671 mario79 1015
	dec	esi
1681 mario79 1016
	cmp	byte [ebx+state.Prev2],0
1671 mario79 1017
	je	.labl_23
1681 mario79 1018
 
1019
	mov	eax,[ebx+state.PosPrev2]
1020
	imul	eax,eax,40
1021
	cmp	dword [ebx+state.BackPrev2],4
1022
	mov	al,[eax+state.State]
1671 mario79 1023
	movzx	eax,al
1024
	jnb	.labl_22
1681 mario79 1025
 
1671 mario79 1026
	mov	al,[eax+RepNextStates]
1027
	jmp	.labl_24
1028
;----------------------------------------------------------
1029
.labl_22:
1030
	mov	al,[eax+MatchNextStates]
1031
	jmp	.labl_24
1032
;----------------------------------------------------------
1033
.labl_23:
1034
	mov	eax,esi
1681 mario79 1035
	imul	eax,eax,40
1036
	mov	al,[eax+state.State]
1671 mario79 1037
;----------------------------------------------------------
1038
.labl_24:
1039
	movzx	eax,al
1040
	mov	cl,[eax+LiteralNextStates]
1041
	jmp	.labl_26
1042
;----------------------------------------------------------
1043
.labl_25:
1044
	mov	eax,esi
1681 mario79 1045
	imul	eax,eax,40
1046
	mov	cl,[eax+state.State]
1671 mario79 1047
;----------------------------------------------------------
1048
.labl_26:
1049
	dec	edi
1050
	cmp	esi,edi
1051
	jne	.labl_29
1681 mario79 1052
 
1053
	cmp	dword [ebx+state.BackPrev],0
1671 mario79 1054
	movzx	eax,cl
1055
	jne	.labl_27
1681 mario79 1056
 
1671 mario79 1057
	mov	al,[eax+ShortRepNextStates]
1058
	jmp	.labl_28
1059
;----------------------------------------------------------
1060
.labl_27:
1061
	mov	al,[eax+LiteralNextStates]
1062
;----------------------------------------------------------
1063
.labl_28:
1681 mario79 1064
	mov	[ebp-20],al
1671 mario79 1065
	jmp	.labl_35
1066
;----------------------------------------------------------
1067
.labl_29:
1068
	test	dl,dl
1069
	je	.labl_31
1681 mario79 1070
 
1071
	cmp	byte [ebx+state.Prev2],0
1671 mario79 1072
	je	.labl_31
1681 mario79 1073
 
1074
	mov	esi,[ebx+state.PosPrev2]
1075
	mov	eax,[ebx+state.BackPrev2]
1671 mario79 1076
	movzx	ecx,cl
1077
;----------------------------------------------------------
1078
.labl_30:
1079
	mov	cl,[ecx+RepNextStates]
1080
	jmp	.labl_32
1081
;----------------------------------------------------------
1082
.labl_31:
1681 mario79 1083
	mov	eax,[ebx+state.BackPrev]
1671 mario79 1084
	movzx	ecx,cl
1085
	cmp	eax,4
1086
	jb	.labl_30
1681 mario79 1087
 
1671 mario79 1088
	mov	cl,[ecx+MatchNextStates]
1089
;----------------------------------------------------------
1090
.labl_32:
1681 mario79 1091
	imul	esi,esi,40
1092
	add	esi,state.State
1093
	mov	[ebp-20],cl
1671 mario79 1094
	mov	edx,esi
1095
	cmp	eax,4
1096
	jnb	.labl_34
1681 mario79 1097
 
1098
	mov	ecx,[edx+eax*4+24]
1671 mario79 1099
	xor	esi,esi
1100
	inc	esi
1681 mario79 1101
	mov	[ebp-100],ecx
1671 mario79 1102
	cmp	eax,esi
1103
	jb	.labl_33
1681 mario79 1104
 
1105
	lea	esi,[edx+24]
1671 mario79 1106
	mov	ecx,eax
1681 mario79 1107
	lea	edi,[ebp-96]
1671 mario79 1108
	rep	movsd
1109
	lea	esi,[eax+1]
1110
	cmp	esi,4
1111
	jnb	.labl_35
1112
;----------------------------------------------------------
1113
.labl_33:
1114
	push	4
1681 mario79 1115
	lea	edx,[edx+esi*4+24]
1671 mario79 1116
	pop	ecx
1681 mario79 1117
	lea	edi,[ebp+esi*4-100]
1671 mario79 1118
	sub	ecx,esi
1119
	mov	esi,edx
1120
	rep	movsd
1121
	jmp	.labl_35
1122
;----------------------------------------------------------
1123
.labl_34:
1124
	add	eax,0xFFFFFFFC
1681 mario79 1125
	mov	[ebp-100],eax
1126
	lea	esi,[edx+24]
1127
	lea	edi,[ebp-96]
1671 mario79 1128
	movsd
1129
	movsd
1130
	movsd
1131
;----------------------------------------------------------
1132
.labl_35:
1681 mario79 1133
	mov	al,[ebp-20]
1134
	mov	[ebx+state.State],al
1135
	lea	edi,[ebx+state.Backs]
1136
	lea	esi,[ebp-100]
1671 mario79 1137
	movsd
1138
	movsd
1139
	movsd
1140
	movsd
1681 mario79 1141
	call	ReadMatchDistances
1142
	mov	[ebp-44],eax
1143
	cmp	eax,128
1671 mario79 1144
	jnb	.labl_73
1681 mario79 1145
 
1146
	mov	eax,[ebx+state.Price]
1147
	mov	edi,[_pos]
1671 mario79 1148
	mov	esi,[ebp+8]
1681 mario79 1149
	mov	[ebp-72],eax
1150
	mov	eax,[_buffer]
1671 mario79 1151
	lea	eax,[edi+eax-1]
1152
	mov	cl,[eax]
1681 mario79 1153
	mov	[ebp-48],cl
1154
	push	dword [ebp-48]
1671 mario79 1155
	mov	ecx,eax
1681 mario79 1156
	sub	ecx,[ebp-100]
1671 mario79 1157
	and	esi,3
1158
	mov	cl,[ecx-1]
1681 mario79 1159
	mov	[ebp-52],cl
1160
	movzx	ecx,byte [ebp-20]
1161
	push	dword [ebp-52]
1162
	mov	[ebp-64],ecx
1671 mario79 1163
	shl	ecx,4
1164
	add	ecx,esi
1681 mario79 1165
	mov	ecx,[_isMatch+ecx*4]
1166
	cmp	byte [ebp-20],7
1167
	mov	[ebp-76],ecx
1671 mario79 1168
	sbb	cl,cl
1169
	inc	cl
1170
	movzx	ecx,cl
1171
	push	ecx
1172
	push	dword [ebp+8]
1681 mario79 1173
	mov	[ebp-40],eax
1671 mario79 1174
	mov	al,[eax-1]
1681 mario79 1175
	mov	[ebp-28],esi
1176
	call	CLiteralEncoder_GetPrice
1671 mario79 1177
	mov	esi,eax
1681 mario79 1178
	mov	eax,[ebp-76]
1671 mario79 1179
	shr	eax,2
1681 mario79 1180
	add	esi,[Models+eax*4]
1671 mario79 1181
	mov	byte [ebp-1],0
1681 mario79 1182
	add	esi,[ebp-72]
1183
	cmp	esi,[ebx+state.Price+40]
1671 mario79 1184
	jnb	.labl_36
1681 mario79 1185
 
1186
	mov	eax,[ebp-12]
1187
	or	dword [ebx+state.BackPrev+40],0xFFFFFFFF
1188
	mov	[ebx+state.Price+40],esi
1189
	mov	[ebx+state.PosPrev+40],eax
1190
	mov	byte [ebx+state.Prev1IsChar+40],0
1671 mario79 1191
	mov	byte [ebp-1],1
1192
;----------------------------------------------------------
1193
.labl_36:
1681 mario79 1194
	mov	edx,[ebp-64]
1195
	mov	edx,[_isRep+edx*4]
1196
	mov	ecx,2048
1671 mario79 1197
	mov	eax,ecx
1681 mario79 1198
	sub	eax,[ebp-76]
1671 mario79 1199
	sub	ecx,edx
1200
	shr	eax,2
1681 mario79 1201
	mov	eax,[Models+eax*4]
1202
	add	eax,[ebp-72]
1671 mario79 1203
	shr	ecx,2
1681 mario79 1204
	mov	ecx,[Models+ecx*4]
1671 mario79 1205
	add	ecx,eax
1681 mario79 1206
	mov	[ebp-76],eax
1207
	mov	al,[ebp-48]
1208
	mov	[ebp-84],edx
1209
	mov	[ebp-72],ecx
1210
	cmp	[ebp-52],al
1671 mario79 1211
	jne	.labl_38
1681 mario79 1212
 
1213
	mov	eax,[ebp-12]
1214
	cmp	[ebx+state.PosPrev+40],eax
1671 mario79 1215
	jnb	.labl_37
1681 mario79 1216
 
1217
	cmp	dword [ebx+state.BackPrev+40],0
1671 mario79 1218
	je	.labl_38
1219
;----------------------------------------------------------
1220
.labl_37:
1681 mario79 1221
	push	dword [ebp-28]
1222
	mov	al,[ebp-20]
1223
	call	GetRepLen1Price
1224
	add	eax,[ebp-72]
1225
	cmp	eax,[ebx+state.Price+40]
1671 mario79 1226
	ja	.labl_38
1681 mario79 1227
 
1228
	and	dword [ebx+state.BackPrev+40],0
1229
	mov	[ebx+state.Price+40],eax
1230
	mov	eax,[ebp-12]
1231
	mov	[ebx+state.PosPrev+40],eax
1232
	mov	byte [ebx+state.Prev1IsChar+40],0
1671 mario79 1233
;----------------------------------------------------------
1234
.labl_38:
1681 mario79 1235
	mov	eax,[_streamPos]
1671 mario79 1236
	sub	eax,edi
1681 mario79 1237
	mov	ecx,4095
1238
	sub	ecx,[ebp-12]
1671 mario79 1239
	inc	eax
1681 mario79 1240
	mov	[ebp-56],eax
1671 mario79 1241
	cmp	eax,ecx
1242
	jbe	.labl_39
1681 mario79 1243
 
1671 mario79 1244
	mov	eax,ecx
1681 mario79 1245
	mov	[ebp-56],ecx
1671 mario79 1246
;----------------------------------------------------------
1247
.labl_39:
1681 mario79 1248
	mov	[ebp-36],eax
1671 mario79 1249
	cmp	eax,2
1250
	jb	.labl_72
1681 mario79 1251
 
1252
	mov	ecx,128
1671 mario79 1253
	cmp	eax,ecx
1254
	jbe	.labl_40
1681 mario79 1255
 
1256
	mov	[ebp-36],ecx
1671 mario79 1257
;----------------------------------------------------------
1258
.labl_40:
1681 mario79 1259
	cmp	dword [ebp-36],3
1671 mario79 1260
	jb	.labl_45
1681 mario79 1261
 
1671 mario79 1262
	cmp	byte [ebp-1],0
1263
	jne	.labl_45
1681 mario79 1264
 
1265
	mov	ecx,[ebp-100]
1671 mario79 1266
	xor	eax,eax
1267
	inc	eax
1268
	inc	ecx
1681 mario79 1269
	cmp	[ebp-36],eax
1671 mario79 1270
	jbe	.labl_42
1681 mario79 1271
 
1272
	mov	edi,[ebp-40]
1671 mario79 1273
	mov	edx,edi
1274
	sub	edx,ecx
1275
;----------------------------------------------------------
1276
.labl_41:
1277
	mov	cl,[eax+edi]
1278
	cmp	cl,[edx+eax]
1279
	jne	.labl_42
1681 mario79 1280
 
1671 mario79 1281
	inc	eax
1681 mario79 1282
	cmp	eax,[ebp-36]
1671 mario79 1283
	jb	.labl_41
1284
;----------------------------------------------------------
1285
.labl_42:
1286
	dec	eax
1681 mario79 1287
	mov	[ebp-32],eax
1671 mario79 1288
	cmp	eax,2
1289
	jb	.labl_45
1681 mario79 1290
 
1291
	mov	eax,[ebp-64]
1671 mario79 1292
	mov	al,[eax+LiteralNextStates]
1293
	mov	ecx,[ebp+8]
1294
	movzx	edx,al
1681 mario79 1295
	mov	[ebp-60],al
1671 mario79 1296
	mov	eax,edx
1297
	shl	eax,4
1298
	inc	ecx
1681 mario79 1299
	mov	edi,2048
1671 mario79 1300
	and	ecx,3
1301
	add	eax,ecx
1302
	mov	ebx,edi
1681 mario79 1303
	sub	ebx,[_isMatch+eax*4]
1671 mario79 1304
	mov	eax,edi
1681 mario79 1305
	sub	eax,[_isRep+edx*4]
1306
	mov	edx,[ebp-12]
1671 mario79 1307
	shr	ebx,2
1681 mario79 1308
	mov	edi,[Models+ebx*4]
1671 mario79 1309
	shr	eax,2
1681 mario79 1310
	add	edi,[Models+eax*4]
1311
	mov	eax,[ebp-32]
1671 mario79 1312
	add	edi,esi
1313
	lea	esi,[edx+eax]
1314
	mov	eax,[ebp-8]
1315
	lea	edx,[esi+1]
1316
	cmp	eax,edx
1317
	jnb	.labl_44
1681 mario79 1318
 
1671 mario79 1319
	sub	edx,[ebp-8]
1681 mario79 1320
	imul	eax,eax,40
1321
	add	eax,state.Price
1671 mario79 1322
	add	[ebp-8],edx
1323
;----------------------------------------------------------
1324
.labl_43:
1681 mario79 1325
	add	eax,40
1671 mario79 1326
	dec	edx
1681 mario79 1327
	mov	dword [eax],kIfinityPrice
1671 mario79 1328
	jne	.labl_43
1329
;----------------------------------------------------------
1330
.labl_44:
1681 mario79 1331
	mov	eax,[ebp-32]
1671 mario79 1332
	push	ecx
1681 mario79 1333
	push	dword [ebp-60]
1671 mario79 1334
	xor	edx,edx
1681 mario79 1335
	call	GetRepPrice
1336
	imul	esi,esi,40
1671 mario79 1337
	add	eax,edi
1681 mario79 1338
	add	esi,state.State+40
1339
	cmp	eax,[esi+12]
1671 mario79 1340
	jnb	.labl_45
1681 mario79 1341
 
1342
	mov	[esi+12],eax
1343
	mov	eax,[ebp-12]
1671 mario79 1344
	inc	eax
1681 mario79 1345
	and	dword [esi+20],0
1346
	mov	[esi+16],eax
1671 mario79 1347
	mov	byte [esi+1],1
1348
	mov	byte [esi+2],0
1349
;----------------------------------------------------------
1350
.labl_45:
1681 mario79 1351
	and	dword [ebp-24],0
1671 mario79 1352
;----------------------------------------------------------
1353
.labl_46:
1681 mario79 1354
	mov	eax,[ebp-24]
1355
	mov	eax,[ebp+eax*4-100]
1356
	mov	edx,[ebp-40]
1671 mario79 1357
	inc	eax
1358
	mov	ecx,edx
1359
	sub	ecx,eax
1681 mario79 1360
	mov	[ebp-68],eax
1671 mario79 1361
	mov	al,[edx]
1681 mario79 1362
	mov	[ebp-80],ecx
1671 mario79 1363
	cmp	al,[ecx]
1364
	jne	.labl_58
1681 mario79 1365
 
1671 mario79 1366
	mov	al,[edx+1]
1367
	cmp	al,[ecx+1]
1368
	jne	.labl_58
1681 mario79 1369
 
1671 mario79 1370
	push	2
1371
	pop	esi
1681 mario79 1372
	cmp	[ebp-36],esi
1671 mario79 1373
	jbe	.labl_48
1374
;----------------------------------------------------------
1375
.labl_47:
1376
	mov	al,[edx+esi]
1377
	cmp	al,[ecx+esi]
1378
	jne	.labl_48
1681 mario79 1379
 
1671 mario79 1380
	inc	esi
1681 mario79 1381
	cmp	esi,[ebp-36]
1671 mario79 1382
	jb	.labl_47
1383
;----------------------------------------------------------
1384
.labl_48:
1681 mario79 1385
	mov	eax,[ebp-12]
1671 mario79 1386
	lea	ebx,[eax+esi]
1681 mario79 1387
	mov	[ebp-32],ebx
1388
	imul	ebx,ebx,40
1671 mario79 1389
	mov	edi,esi
1681 mario79 1390
	add	ebx,state.Price
1671 mario79 1391
;----------------------------------------------------------
1392
.labl_49:
1393
	mov	eax,[ebp-8]
1681 mario79 1394
	mov	ecx,[ebp-32]
1671 mario79 1395
	cmp	eax,ecx
1396
	jnb	.labl_51
1681 mario79 1397
 
1671 mario79 1398
	sub	ecx,[ebp-8]
1681 mario79 1399
	imul	eax,eax,40
1400
	add	eax,state.Price
1671 mario79 1401
	add	[ebp-8],ecx
1402
;----------------------------------------------------------
1403
.labl_50:
1681 mario79 1404
	add	eax,40
1671 mario79 1405
	dec	ecx
1681 mario79 1406
	mov	dword [eax],kIfinityPrice
1671 mario79 1407
	jne	.labl_50
1408
;----------------------------------------------------------
1409
.labl_51:
1681 mario79 1410
	push	dword [ebp-28]
1411
	mov	edx,[ebp-24]
1412
	push	dword [ebp-20]
1671 mario79 1413
	mov	eax,esi
1681 mario79 1414
	call	GetRepPrice
1415
	add	eax,[ebp-72]
1671 mario79 1416
	cmp	eax,[ebx]
1417
	jnb	.labl_52
1681 mario79 1418
 
1671 mario79 1419
	mov	[ebx],eax
1681 mario79 1420
	mov	eax,[ebp-12]
1671 mario79 1421
	mov	[ebx+4],eax
1681 mario79 1422
	mov	eax,[ebp-24]
1671 mario79 1423
	mov	[ebx+8],eax
1681 mario79 1424
	mov	byte [ebx-11],0
1671 mario79 1425
;----------------------------------------------------------
1426
.labl_52:
1427
	dec	esi
1681 mario79 1428
	sub	ebx,40
1429
	dec	dword [ebp-32]
1671 mario79 1430
	cmp	esi,2
1431
	jnb	.labl_49
1681 mario79 1432
 
1671 mario79 1433
	lea	eax,[edi+1]
1681 mario79 1434
	lea	esi,[eax+128]
1435
	cmp	esi,[ebp-56]
1671 mario79 1436
	jbe	.labl_53
1681 mario79 1437
 
1438
	mov	esi,[ebp-56]
1671 mario79 1439
;----------------------------------------------------------
1440
.labl_53:
1441
	cmp	eax,esi
1442
	jnb	.labl_55
1681 mario79 1443
 
1444
	mov	edx,[ebp-40]
1671 mario79 1445
	mov	ecx,eax
1681 mario79 1446
	sub	ecx,[ebp-68]
1671 mario79 1447
	add	ecx,edx
1448
;----------------------------------------------------------
1449
.labl_54:
1450
	mov	bl,[eax+edx]
1451
	cmp	bl,[ecx]
1452
	jne	.labl_55
1681 mario79 1453
 
1671 mario79 1454
	inc	eax
1455
	inc	ecx
1456
	cmp	eax,esi
1457
	jb	.labl_54
1458
;----------------------------------------------------------
1459
.labl_55:
1460
	or	ecx,0xFFFFFFFF
1461
	sub	ecx,edi
1462
	add	eax,ecx
1681 mario79 1463
	mov	[ebp-16],eax
1671 mario79 1464
	cmp	eax,2
1465
	jb	.labl_58
1681 mario79 1466
 
1467
	mov	eax,[ebp-64]
1671 mario79 1468
	mov	al,[eax+RepNextStates]
1469
	mov	edx,[ebp+8]
1470
	movzx	eax,al
1471
	mov	ebx,eax
1472
	mov	al,[eax+LiteralNextStates]
1473
	lea	ecx,[edi+edx]
1681 mario79 1474
	mov	[ebp-60],al
1671 mario79 1475
	movzx	eax,al
1476
	mov	esi,ecx
1477
	and	esi,3
1478
	shl	ebx,4
1479
	add	esi,ebx
1681 mario79 1480
	mov	esi,[_isMatch+esi*4]
1671 mario79 1481
	lea	ebx,[edi+edx+1]
1681 mario79 1482
	mov	[ebp-32],eax
1483
	mov	eax,[ebp-40]
1671 mario79 1484
	movzx	edx,byte [edi+eax]
1485
	mov	al,[eax+edi-1]
1486
	push	edx
1681 mario79 1487
	mov	edx,[ebp-80]
1671 mario79 1488
	movzx	edx,byte [edx+edi]
1489
	push	edx
1681 mario79 1490
	shr	esi,2
1491
	mov	esi,[Models+esi*4]
1671 mario79 1492
	push	1
1493
	push	ecx
1681 mario79 1494
	mov	[ebp-68],esi
1671 mario79 1495
	and	ebx,3
1681 mario79 1496
	call	CLiteralEncoder_GetPrice
1497
	push	dword [ebp-28]
1498
	mov	edx,[ebp-24]
1499
	push	dword [ebp-20]
1671 mario79 1500
	mov	esi,eax
1501
	mov	eax,edi
1681 mario79 1502
	call	GetRepPrice
1503
	mov	ecx,[ebp-32]
1671 mario79 1504
	add	esi,eax
1505
	shl	ecx,4
1506
	add	ecx,ebx
1681 mario79 1507
	mov	eax,2048
1671 mario79 1508
	mov	edx,eax
1681 mario79 1509
	sub	edx,[_isMatch+ecx*4]
1510
	mov	ecx,[ebp-32]
1511
	sub	eax,[_isRep+ecx*4]
1512
	mov	ecx,[ebp-12]
1671 mario79 1513
	shr	edx,2
1681 mario79 1514
	add	esi,[Models+edx*4]
1671 mario79 1515
	shr	eax,2
1681 mario79 1516
	add	esi,[Models+eax*4]
1517
	mov	eax,[ebp-16]
1518
	add	esi,[ebp-68]
1671 mario79 1519
	lea	eax,[eax+edi+1]
1681 mario79 1520
	add	esi,[ebp-72]
1671 mario79 1521
	add	eax,ecx
1681 mario79 1522
	mov	[ebp-68],eax
1671 mario79 1523
	cmp	[ebp-8],eax
1524
	jnb	.labl_57
1681 mario79 1525
 
1671 mario79 1526
	mov	eax,[ebp-8]
1681 mario79 1527
	mov	ecx,[ebp-68]
1528
	imul	eax,eax,40
1671 mario79 1529
	sub	ecx,[ebp-8]
1681 mario79 1530
	add	eax,state.Price
1671 mario79 1531
	add	[ebp-8],ecx
1532
;----------------------------------------------------------
1533
.labl_56:
1681 mario79 1534
	add	eax,40
1671 mario79 1535
	dec	ecx
1681 mario79 1536
	mov	dword [eax],kIfinityPrice
1671 mario79 1537
	jne	.labl_56
1538
;----------------------------------------------------------
1539
.labl_57:
1681 mario79 1540
	mov	eax,[ebp-16]
1671 mario79 1541
	push	ebx
1681 mario79 1542
	push	dword [ebp-60]
1671 mario79 1543
	xor	edx,edx
1681 mario79 1544
	call	GetRepPrice
1545
	mov	ecx,[ebp-68]
1546
	imul	ecx,ecx,40
1671 mario79 1547
	add	eax,esi
1681 mario79 1548
	add	ecx,state.State
1549
	cmp	eax,[ecx+12]
1671 mario79 1550
	jnb	.labl_58
1681 mario79 1551
 
1552
	and	dword [ecx+20],0
1553
	mov	[ecx+12],eax
1554
	mov	eax,[ebp-12]
1671 mario79 1555
	lea	edx,[edi+eax+1]
1556
	mov	[ecx+4],eax
1681 mario79 1557
	mov	eax,[ebp-24]
1558
	mov	[ecx+16],edx
1671 mario79 1559
	mov	byte [ecx+1],1
1560
	mov	byte [ecx+2],1
1561
	mov	[ecx+8],eax
1562
;----------------------------------------------------------
1563
.labl_58:
1681 mario79 1564
	inc	dword [ebp-24]
1565
	cmp	dword [ebp-24],4
1671 mario79 1566
	jb	.labl_46
1681 mario79 1567
 
1568
	mov	eax,[ebp-36]
1569
	cmp	[ebp-44],eax
1671 mario79 1570
	jbe	.labl_59
1681 mario79 1571
 
1572
	mov	[ebp-44],eax
1671 mario79 1573
;----------------------------------------------------------
1574
.labl_59:
1681 mario79 1575
	cmp	dword [ebp-44],2
1671 mario79 1576
	jb	.labl_72
1681 mario79 1577
 
1578
	mov	esi,[ebp-44]
1671 mario79 1579
	cmp	esi,2
1580
	jne	.labl_60
1681 mario79 1581
 
1582
	cmp	dword [distances+8],0x80
1671 mario79 1583
	jnb	.labl_72
1584
;----------------------------------------------------------
1585
.labl_60:
1681 mario79 1586
	mov	eax,[ebp-84]
1671 mario79 1587
	shr	eax,2
1681 mario79 1588
	mov	eax,[Models+eax*4]
1589
	add	eax,[ebp-76]
1590
	mov	[ebp-76],eax
1591
	mov	eax,[ebp-12]
1671 mario79 1592
	lea	ecx,[esi+eax]
1593
	cmp	[ebp-8],ecx
1594
	jnb	.labl_62
1681 mario79 1595
 
1671 mario79 1596
	mov	eax,[ebp-8]
1681 mario79 1597
	imul	eax,eax,40
1671 mario79 1598
	mov	edx,ecx
1599
	sub	edx,[ebp-8]
1681 mario79 1600
	add	eax,state.Price
1671 mario79 1601
	add	[ebp-8],edx
1602
;----------------------------------------------------------
1603
.labl_61:
1681 mario79 1604
	add	eax,40
1671 mario79 1605
	dec	edx
1681 mario79 1606
	mov	dword [eax],kIfinityPrice
1671 mario79 1607
	jne	.labl_61
1608
;----------------------------------------------------------
1609
.labl_62:
1681 mario79 1610
	imul	ecx,ecx,40
1611
	add	ecx,state.Price
1612
	lea	eax,[distances+4+esi*4]
1671 mario79 1613
	lea	edi,[esi+1]
1681 mario79 1614
	mov	[ebp-36],eax
1671 mario79 1615
	mov	ebx,ecx
1681 mario79 1616
	mov	[ebp-72],ecx
1671 mario79 1617
;----------------------------------------------------------
1618
.labl_63:
1681 mario79 1619
	mov	eax,[ebp-36]
1671 mario79 1620
	mov	esi,[eax-4]
1681 mario79 1621
	push	dword [ebp-28]
1671 mario79 1622
	lea	eax,[edi-1]
1623
	mov	edx,esi
1681 mario79 1624
	call	GetPosLenPrice
1625
	add	eax,[ebp-76]
1626
	mov	[ebp-80],eax
1671 mario79 1627
	cmp	eax,[ebx]
1628
	jnb	.labl_64
1681 mario79 1629
 
1671 mario79 1630
	mov	[ebx],eax
1681 mario79 1631
	mov	eax,[ebp-12]
1671 mario79 1632
	mov	[ebx+4],eax
1633
	lea	eax,[esi+4]
1634
	mov	[ebx+8],eax
1681 mario79 1635
	mov	byte [ebx-11],0
1671 mario79 1636
;----------------------------------------------------------
1637
.labl_64:
1638
	lea	eax,[edi-1]
1681 mario79 1639
	cmp	eax,[ebp-44]
1671 mario79 1640
	je	.labl_65
1681 mario79 1641
 
1642
	mov	eax,[ebp-36]
1671 mario79 1643
	cmp	esi,[eax]
1644
	je	.labl_71
1645
;----------------------------------------------------------
1646
.labl_65:
1647
	inc	esi
1681 mario79 1648
	lea	ecx,[edi+128]
1649
	mov	[ebp-68],esi
1650
	mov	[ebp-16],edi
1651
	cmp	ecx,[ebp-56]
1671 mario79 1652
	jbe	.labl_66
1681 mario79 1653
 
1654
	mov	ecx,[ebp-56]
1671 mario79 1655
;----------------------------------------------------------
1656
.labl_66:
1657
	cmp	edi,ecx
1658
	jnb	.labl_68
1681 mario79 1659
 
1671 mario79 1660
	mov	eax,edi
1661
	sub	eax,esi
1681 mario79 1662
	add	eax,[ebp-40]
1671 mario79 1663
;----------------------------------------------------------
1664
.labl_67:
1681 mario79 1665
	mov	edx,[ebp-16]
1666
	mov	esi,[ebp-40]
1671 mario79 1667
	mov	dl,[edx+esi]
1668
	cmp	dl,[eax]
1669
	jne	.labl_68
1681 mario79 1670
 
1671
	inc	dword [ebp-16]
1671 mario79 1672
	inc	eax
1681 mario79 1673
	cmp	[ebp-16],ecx
1671 mario79 1674
	jb	.labl_67
1675
;----------------------------------------------------------
1676
.labl_68:
1677
	or	ecx,0xFFFFFFFF
1678
	lea	eax,[edi-1]
1679
	sub	ecx,eax
1681 mario79 1680
	add	[ebp-16],ecx
1681
	cmp	dword [ebp-16],2
1671 mario79 1682
	jb	.labl_71
1681 mario79 1683
 
1684
	mov	eax,[ebp-64]
1671 mario79 1685
	mov	al,[eax+MatchNextStates]
1686
	mov	ecx,[ebp+8]
1687
	movzx	eax,al
1688
	mov	esi,eax
1689
	mov	al,[eax+LiteralNextStates]
1690
	lea	edx,[edi+ecx-1]
1681 mario79 1691
	mov	[ebp-60],al
1671 mario79 1692
	movzx	eax,al
1693
	shl	esi,4
1694
	mov	ebx,edx
1695
	and	ebx,3
1696
	add	esi,ebx
1681 mario79 1697
	mov	esi,[_isMatch+esi*4]
1671 mario79 1698
	lea	ebx,[edi+ecx]
1681 mario79 1699
	mov	[ebp-32],eax
1700
	mov	eax,[ebp-40]
1671 mario79 1701
	movzx	ecx,byte [edi+eax-1]
1702
	push	ecx
1703
	mov	ecx,edi
1681 mario79 1704
	sub	ecx,[ebp-68]
1671 mario79 1705
	shr	esi,2
1706
	movzx	ecx,byte [ecx+eax-1]
1681 mario79 1707
	mov	esi,[Models+esi*4]
1671 mario79 1708
	mov	al,[edi+eax-2]
1709
	push	ecx
1710
	push	1
1711
	push	edx
1681 mario79 1712
	mov	[ebp-84],esi
1671 mario79 1713
	and	ebx,3
1681 mario79 1714
	call	CLiteralEncoder_GetPrice
1715
	mov	ecx,[ebp-32]
1671 mario79 1716
	mov	esi,eax
1717
	shl	ecx,4
1718
	add	ecx,ebx
1681 mario79 1719
	mov	eax,2048
1671 mario79 1720
	mov	edx,eax
1681 mario79 1721
	sub	edx,[_isMatch+ecx*4]
1722
	mov	ecx,[ebp-32]
1723
	sub	eax,[_isRep+ecx*4]
1724
	mov	ecx,[ebp-12]
1671 mario79 1725
	shr	edx,2
1681 mario79 1726
	add	esi,[Models+edx*4]
1671 mario79 1727
	shr	eax,2
1681 mario79 1728
	add	esi,[Models+eax*4]
1729
	mov	eax,[ebp-16]
1730
	add	esi,[ebp-84]
1671 mario79 1731
	add	eax,edi
1681 mario79 1732
	add	esi,[ebp-80]
1671 mario79 1733
	add	eax,ecx
1681 mario79 1734
	mov	[ebp-32],eax
1671 mario79 1735
	cmp	[ebp-8],eax
1736
	jnb	.labl_70
1681 mario79 1737
 
1671 mario79 1738
	mov	eax,[ebp-8]
1681 mario79 1739
	mov	ecx,[ebp-32]
1740
	imul	eax,eax,40
1671 mario79 1741
	sub	ecx,[ebp-8]
1681 mario79 1742
	add	eax,state.Price
1671 mario79 1743
	add	[ebp-8],ecx
1744
;----------------------------------------------------------
1745
.labl_69:
1681 mario79 1746
	add	eax,40
1671 mario79 1747
	dec	ecx
1681 mario79 1748
	mov	dword [eax],kIfinityPrice
1671 mario79 1749
	jne	.labl_69
1750
;----------------------------------------------------------
1751
.labl_70:
1681 mario79 1752
	mov	eax,[ebp-16]
1671 mario79 1753
	push	ebx
1681 mario79 1754
	push	dword [ebp-60]
1671 mario79 1755
	xor	edx,edx
1681 mario79 1756
	call	GetRepPrice
1757
	mov	ecx,[ebp-32]
1758
	mov	ebx,[ebp-72]
1759
	imul	ecx,ecx,40
1671 mario79 1760
	add	eax,esi
1681 mario79 1761
	add	ecx,state.State
1762
	cmp	eax,[ecx+12]
1671 mario79 1763
	jnb	.labl_71
1681 mario79 1764
 
1765
	and	dword [ecx+20],0
1766
	mov	[ecx+12],eax
1767
	mov	eax,[ebp-12]
1671 mario79 1768
	lea	edx,[edi+eax]
1769
	mov	[ecx+4],eax
1681 mario79 1770
	mov	eax,[ebp-68]
1671 mario79 1771
	add	eax,3
1681 mario79 1772
	mov	[ecx+16],edx
1671 mario79 1773
	mov	byte [ecx+1],1
1774
	mov	byte [ecx+2],1
1775
	mov	[ecx+8],eax
1776
;----------------------------------------------------------
1777
.labl_71:
1681 mario79 1778
	sub	dword [ebp-36],4
1779
	sub	ebx,40
1671 mario79 1780
	dec	edi
1781
	lea	eax,[edi-1]
1681 mario79 1782
	mov	[ebp-72],ebx
1671 mario79 1783
	cmp	eax,2
1784
	jnb	.labl_63
1785
;----------------------------------------------------------
1786
.labl_72:
1681 mario79 1787
	inc	dword [ebp-12]
1788
	mov	eax,[ebp-12]
1671 mario79 1789
	cmp	eax,[ebp-8]
1790
	jne	.labl_21
1681 mario79 1791
 
1671 mario79 1792
	jmp	.labl_74
1793
;----------------------------------------------------------
1794
.labl_73:
1681 mario79 1795
	mov	eax,[ebp-44]
1796
	mov	[_longestMatchLength],eax
1797
	mov	byte [_longestMatchWasFound],1
1671 mario79 1798
;----------------------------------------------------------
1799
.labl_74:
1681 mario79 1800
	push	dword [ebp-12]
1801
	push	dword [ebp+12]
1802
	call	Backward
1803
	mov	ecx,[ebp+16]
1671 mario79 1804
	mov	[ecx],eax
1805
;----------------------------------------------------------
1806
.labl_75:
1807
	pop	ebx
1808
	pop	edi
1809
;----------------------------------------------------------
1810
.labl_76:
1811
	pop	esi
1812
	leave
1681 mario79 1813
	ret	12
1671 mario79 1814
;*****************************************************************************
1815
 
1816
;* Call: ***************************************************************
1681 mario79 1817
CLiteralEncoder2_EncodeMatched:
1671 mario79 1818
	push	ebp
1819
	mov	ebp,esp
1820
	push	ecx
1821
	push	ebx
1822
	push	esi
1823
	xor	ebx,ebx
1824
	push	edi
1825
	inc	ebx
1826
	mov	dword [ebp-4],8
1827
;----------------------------------------------------------
1828
.labl_00:
1829
	dec	dword [ebp-4]
1830
	movzx	ecx,byte [ebp-4]
1681 mario79 1831
	movzx	esi,byte [ebp+12]
1832
	movzx	edi,byte [ebp+16]
1671 mario79 1833
	shr	esi,cl
1834
	shr	edi,cl
1835
	mov	ecx,[ebp+8]
1836
	and	esi,1
1837
	lea	eax,[esi+1]
1838
	shl	eax,8
1839
	add	eax,ebx
1840
	and	edi,1
1841
	push	edi
1842
	lea	edx,[ecx+eax*4]
1681 mario79 1843
	call	CMyBitEncoder_Encode
1671 mario79 1844
	add	ebx,ebx
1845
	or	ebx,edi
1846
	cmp	esi,edi
1847
	jne	.labl_02
1681 mario79 1848
 
1671 mario79 1849
	cmp	dword [ebp-4],0
1850
	jne	.labl_00
1681 mario79 1851
 
1671 mario79 1852
	jmp	.labl_03
1853
;----------------------------------------------------------
1854
.labl_01:
1855
	dec	dword [ebp-4]
1681 mario79 1856
	movzx	esi,byte [ebp+16]
1671 mario79 1857
	mov	cl,[ebp-4]
1858
	mov	eax,[ebp+8]
1859
	shr	esi,cl
1860
	lea	edx,[eax+ebx*4]
1861
	and	esi,1
1862
	push	esi
1681 mario79 1863
	call	CMyBitEncoder_Encode
1671 mario79 1864
	add	ebx,ebx
1865
	or	ebx,esi
1866
;----------------------------------------------------------
1867
.labl_02:
1868
	cmp	dword [ebp-4],0
1869
	jne	.labl_01
1870
;----------------------------------------------------------
1871
.labl_03:
1872
	pop	edi
1873
	pop	esi
1874
	pop	ebx
1875
	leave
1681 mario79 1876
	ret	12
1671 mario79 1877
;*****************************************************************************
1878
 
1879
;* Call: ***************************************************************
1681 mario79 1880
RangeEncoder_EncodeDirectBits:
1671 mario79 1881
	push	esi
1882
	mov	esi,eax
1883
	jmp	.labl_02
1884
;----------------------------------------------------------
1885
.labl_00:
1886
	mov	eax,[esp+8]
1681 mario79 1887
	shr	dword [range],1
1671 mario79 1888
	dec	esi
1889
	mov	ecx,esi
1890
	shr	eax,cl
1891
	test	al,1
1892
	je	.labl_01
1681 mario79 1893
 
1894
	mov	eax,[range]
1895
	add	[low],eax
1896
	adc	dword [low+4],0
1671 mario79 1897
;----------------------------------------------------------
1898
.labl_01:
1681 mario79 1899
	cmp	dword [range],0x1000000
1671 mario79 1900
	jnb	.labl_02
1681 mario79 1901
 
1902
	shl	dword [range],8
1903
	call	RangeEncoder_ShiftLow
1671 mario79 1904
;----------------------------------------------------------
1905
.labl_02:
1906
	test	esi,esi
1907
	jne	.labl_00
1681 mario79 1908
 
1671 mario79 1909
	pop	esi
1910
	ret	4
1911
;*****************************************************************************
1912
 
1913
;* Call: ***************************************************************
1681 mario79 1914
CBitTreeEncoder_ReverseEncode:
1671 mario79 1915
	push	esi
1916
	xor	esi,esi
1917
	push	edi
1681 mario79 1918
	mov	edi,[i_01]
1671 mario79 1919
	inc	esi
1920
;----------------------------------------------------------
1921
.labl_00:
1681 mario79 1922
	mov	eax,[esp+12]
1671 mario79 1923
	and	eax,1
1681 mario79 1924
	lea	edx,[_posAlignEncoder+esi*4]
1671 mario79 1925
	push	eax
1926
	lea	esi,[eax+esi*2]
1681 mario79 1927
	call	CMyBitEncoder_Encode
1928
	shr	dword [esp+12],1
1671 mario79 1929
	dec	edi
1930
	jne	.labl_00
1681 mario79 1931
 
1671 mario79 1932
	pop	edi
1933
	pop	esi
1934
	ret	4
1935
;*****************************************************************************
1936
 
1937
;* Call: ***************************************************************
1681 mario79 1938
MovePos:
1671 mario79 1939
	push	esi
1940
	mov	esi,eax
1941
	test	esi,esi
1942
	je	.labl_01
1681 mario79 1943
 
1944
	add	[_additionalOffset],esi
1671 mario79 1945
;----------------------------------------------------------
1946
.labl_00:
1947
	dec	esi
1948
	call	lz_cm_09
1681 mario79 1949
	call	MatchFinder_MovePos
1671 mario79 1950
	test	esi,esi
1951
	jne	.labl_00
1952
;----------------------------------------------------------
1953
.labl_01:
1954
	pop	esi
1955
	ret
1956
;*****************************************************************************
1957
 
1958
;* Call: ***************************************************************
1681 mario79 1959
Backward:
1671 mario79 1960
	push	ebp
1961
	mov	ebp,esp
1962
	push	ecx
1681 mario79 1963
	mov	ecx,[ebp+12]
1671 mario79 1964
	mov	eax,ecx
1681 mario79 1965
	imul	eax,eax,40
1966
	mov	edx,[eax+state.PosPrev]
1967
	mov	eax,[eax+state.BackPrev]
1671 mario79 1968
	push	ebx
1969
	push	esi
1681 mario79 1970
	mov	[_optimumEndIndex],ecx
1671 mario79 1971
	mov	[ebp-4],eax
1972
	push	edi
1973
;----------------------------------------------------------
1974
.labl_00:
1681 mario79 1975
	imul	ecx,ecx,40
1976
	cmp	byte [ecx+state.Prev1IsChar],0
1671 mario79 1977
	je	.labl_01
1681 mario79 1978
 
1671 mario79 1979
	mov	eax,edx
1681 mario79 1980
	imul	eax,eax,40
1981
	or	dword [eax+state.BackPrev],0xFFFFFFFF
1982
	lea	esi,[eax+state.Prev1IsChar]
1983
	lea	edi,[eax+state.PosPrev]
1671 mario79 1984
	lea	ebx,[edx-1]
1985
	mov	byte [esi],0
1986
	mov	[edi],ebx
1681 mario79 1987
	cmp	byte [ecx+state.Prev2],0
1671 mario79 1988
	je	.labl_01
1681 mario79 1989
 
1990
	mov	byte [esi-40],0
1991
	mov	esi,[ecx+state.PosPrev2]
1992
	mov	[edi-40],esi
1993
	mov	ecx,[ecx+state.BackPrev2]
1994
	mov	[eax+state.BackPrev-40],ecx
1671 mario79 1995
;----------------------------------------------------------
1996
.labl_01:
1997
	mov	ecx,[ebp-4]
1998
	mov	eax,edx
1681 mario79 1999
	imul	eax,eax,40
1671 mario79 2000
	mov	esi,edx
1681 mario79 2001
	mov	edx,[eax+state.BackPrev]
2002
	mov	[eax+state.BackPrev],ecx
2003
	mov	ecx,[ebp+12]
1671 mario79 2004
	mov	[ebp-4],edx
1681 mario79 2005
	mov	edx,[eax+state.PosPrev]
2006
	mov	[eax+state.PosPrev],ecx
1671 mario79 2007
	mov	ecx,esi
1681 mario79 2008
	mov	[ebp+12],ecx
1671 mario79 2009
	test	esi,esi
2010
	jne	.labl_00
1681 mario79 2011
 
2012
	mov	eax,[state.BackPrev]
1671 mario79 2013
	mov	ecx,[ebp+8]
2014
	pop	edi
2015
	mov	[ecx],eax
1681 mario79 2016
	mov	eax,[state.PosPrev]
1671 mario79 2017
	pop	esi
1681 mario79 2018
	mov	[_optimumCurrentIndex],eax
1671 mario79 2019
	pop	ebx
2020
	leave
2021
	ret	8
2022
;*****************************************************************************
2023
 
2024
;* Call: ***************************************************************
2025
lz_cm_09:
2026
	push	ebp
2027
	mov	ebp,esp
1681 mario79 2028
	mov	edx,[_matchMaxLen]
2029
	mov	eax,[_pos]
2030
	mov	ecx,[_streamPos]
2031
	sub	esp,44
1671 mario79 2032
	push	esi
2033
	lea	esi,[edx+eax]
2034
	cmp	esi,ecx
2035
	ja	.labl_00
1681 mario79 2036
 
2037
	mov	[ebp-24],edx
1671 mario79 2038
	jmp	.labl_01
2039
;----------------------------------------------------------
2040
.labl_00:
2041
	sub	ecx,eax
1681 mario79 2042
	mov	[ebp-24],ecx
1671 mario79 2043
	cmp	ecx,3
2044
	jb	.labl_13
2045
;----------------------------------------------------------
2046
.labl_01:
1681 mario79 2047
	mov	ecx,[_cyclicBufferSize]
1671 mario79 2048
	mov	edx,eax
2049
	sub	edx,ecx
2050
	cmp	ecx,eax
1681 mario79 2051
	mov	ecx,[_buffer]
1671 mario79 2052
	lea	esi,[ecx+eax]
2053
	movzx	ecx,byte [esi+2]
2054
	push	ebx
2055
	movzx	ebx,word [esi]
2056
	push	edi
2057
	sbb	edi,edi
1681 mario79 2058
	and	dword [ebp-28],0
2059
	and	dword [ebp-40],0
1671 mario79 2060
	shl	ecx,8
2061
	and	edi,edx
2062
	movzx	edx,byte [esi]
1681 mario79 2063
	xor	ecx,[crc_table+edx*4]
1671 mario79 2064
	movzx	edx,byte [esi+1]
2065
	xor	ecx,edx
1681 mario79 2066
	mov	edx,[_hash]
1671 mario79 2067
	and	ecx,0xFFFFF
2068
	lea	ecx,[edx+ecx*4]
2069
	mov	[edx+ebx*4+0x400000],eax
2070
	mov	ebx,[ecx]
2071
	mov	[ecx],eax
1681 mario79 2072
	mov	ecx,[pack_pos]
1671 mario79 2073
	lea	ecx,[edx+ecx*8+0x440000]
2074
	mov	[ebp-4],ebx
2075
	lea	ebx,[ecx+4]
1681 mario79 2076
	mov	[ebp-12],ecx
2077
	mov	ecx,[_cutValue]
2078
	mov	[ebp-16],ebx
2079
	mov	[ebp-20],ecx
1671 mario79 2080
	cmp	[ebp-4],edi
2081
	jbe	.labl_11
2082
;----------------------------------------------------------
2083
.labl_02:
1681 mario79 2084
	mov	ecx,[ebp-20]
2085
	dec	dword [ebp-20]
1671 mario79 2086
	test	ecx,ecx
2087
	je	.labl_11
1681 mario79 2088
 
2089
	mov	ecx,[_buffer]
1671 mario79 2090
	mov	ebx,[ebp-4]
2091
	add	ecx,ebx
1681 mario79 2092
	mov	[ebp-36],ecx
2093
	mov	ecx,[ebp-40]
2094
	cmp	ecx,[ebp-28]
1671 mario79 2095
	jb	.labl_03
1681 mario79 2096
 
2097
	mov	ecx,[ebp-28]
1671 mario79 2098
;----------------------------------------------------------
2099
.labl_03:
1681 mario79 2100
	mov	ebx,[ebp-36]
1671 mario79 2101
	mov	[ebp-8],ecx
2102
	add	ecx,esi
2103
	sub	ebx,esi
1681 mario79 2104
	mov	[ebp-32],ebx
1671 mario79 2105
	jmp	.labl_05
2106
;----------------------------------------------------------
2107
.labl_04:
1681 mario79 2108
	mov	ecx,[ebp-44]
2109
	mov	ebx,[ebp-32]
1671 mario79 2110
;----------------------------------------------------------
2111
.labl_05:
2112
	mov	bl,[ebx+ecx]
2113
	cmp	bl,[ecx]
2114
	jne	.labl_06
1681 mario79 2115
 
1671 mario79 2116
	inc	dword [ebp-8]
2117
	inc	ecx
1681 mario79 2118
	mov	[ebp-44],ecx
1671 mario79 2119
	mov	ecx,[ebp-8]
1681 mario79 2120
	cmp	ecx,[ebp-24]
1671 mario79 2121
	jne	.labl_04
2122
;----------------------------------------------------------
2123
.labl_06:
1681 mario79 2124
	mov	ecx,[pack_pos]
1671 mario79 2125
	mov	ebx,eax
2126
	sub	ebx,[ebp-4]
2127
	cmp	ebx,ecx
2128
	ja	.labl_07
1681 mario79 2129
 
1671 mario79 2130
	sub	ecx,ebx
2131
	jmp	.labl_08
2132
;----------------------------------------------------------
2133
.labl_07:
2134
	sub	ecx,ebx
1681 mario79 2135
	add	ecx,[_cyclicBufferSize]
1671 mario79 2136
;----------------------------------------------------------
2137
.labl_08:
2138
	lea	ecx,[edx+ecx*8+0x440000]
1681 mario79 2139
	mov	[ebp-32],ecx
1671 mario79 2140
	mov	ecx,[ebp-8]
1681 mario79 2141
	cmp	ecx,[ebp-24]
1671 mario79 2142
	je	.labl_14
1681 mario79 2143
 
2144
	mov	ebx,[ebp-36]
1671 mario79 2145
	mov	bl,[ecx+ebx]
2146
	cmp	bl,[ecx+esi]
2147
	mov	ecx,[ebp-4]
2148
	jnb	.labl_09
1681 mario79 2149
 
2150
	mov	ebx,[ebp-12]
1671 mario79 2151
	mov	[ebx],ecx
1681 mario79 2152
	mov	ecx,[ebp-32]
1671 mario79 2153
	mov	ebx,[ebp-8]
2154
	add	ecx,4
1681 mario79 2155
	mov	[ebp-12],ecx
2156
	mov	[ebp-28],ebx
1671 mario79 2157
	jmp	.labl_10
2158
;----------------------------------------------------------
2159
.labl_09:
1681 mario79 2160
	mov	ebx,[ebp-16]
1671 mario79 2161
	mov	[ebx],ecx
1681 mario79 2162
	mov	ecx,[ebp-32]
1671 mario79 2163
	mov	ebx,[ebp-8]
1681 mario79 2164
	mov	[ebp-16],ecx
2165
	mov	[ebp-40],ebx
1671 mario79 2166
;----------------------------------------------------------
2167
.labl_10:
2168
	mov	ecx,[ecx]
2169
	mov	[ebp-4],ecx
2170
	cmp	ecx,edi
2171
	ja	.labl_02
2172
;----------------------------------------------------------
2173
.labl_11:
1681 mario79 2174
	mov	eax,[ebp-12]
1671 mario79 2175
	and	dword [eax],0
1681 mario79 2176
	mov	eax,[ebp-16]
1671 mario79 2177
	and	dword [eax],0
2178
;----------------------------------------------------------
2179
.labl_12:
2180
	pop	edi
2181
	pop	ebx
2182
;----------------------------------------------------------
2183
.labl_13:
2184
	pop	esi
2185
	leave
2186
	ret
2187
;----------------------------------------------------------
2188
.labl_14:
1681 mario79 2189
	mov	eax,[ebp-32]
1671 mario79 2190
	mov	ecx,[eax]
1681 mario79 2191
	mov	edx,[ebp-12]
1671 mario79 2192
	mov	[edx],ecx
2193
	mov	eax,[eax+4]
1681 mario79 2194
	mov	ecx,[ebp-16]
1671 mario79 2195
	mov	[ecx],eax
2196
	jmp	.labl_12
2197
;*****************************************************************************
2198
 
2199
;* Call: ***************************************************************
1681 mario79 2200
GetPosSlot:
2201
	cmp	eax,1024
1671 mario79 2202
	jnb	.labl_00
1681 mario79 2203
 
2204
	movzx	eax,byte [eax+g_FastPos]
1671 mario79 2205
	ret
2206
;----------------------------------------------------------
2207
.labl_00:
2208
	cmp	eax,0x80000
2209
	jnb	.labl_01
1681 mario79 2210
 
1671 mario79 2211
	shr	eax,9
1681 mario79 2212
	movzx	eax,byte [eax+g_FastPos]
2213
	add	eax,18
1671 mario79 2214
	ret
2215
;----------------------------------------------------------
2216
.labl_01:
1681 mario79 2217
	shr	eax,18
2218
	movzx	eax,byte [eax+g_FastPos]
2219
	add	eax,36 ;'$'
1671 mario79 2220
	ret
2221
;*****************************************************************************
2222
 
2223
;* Call: ***************************************************************
1681 mario79 2224
CPriceTableEncoder_Init:
1671 mario79 2225
	push	ebx
2226
	push	edi
1681 mario79 2227
	mov	eax,1024
1671 mario79 2228
	push	4
2229
	mov	[esi],eax
2230
	mov	[esi+4],eax
2231
	lea	edi,[esi+0x4048]
2232
	pop	ebx
2233
;----------------------------------------------------------
2234
.labl_00:
2235
	push	3
2236
	lea	eax,[edi-0x4040]
2237
	pop	ecx
1681 mario79 2238
	call	CBitTreeEncoder_Init
1671 mario79 2239
	push	3
2240
	pop	ecx
2241
	mov	eax,edi
1681 mario79 2242
	call	CBitTreeEncoder_Init
2243
	add	edi,1028
1671 mario79 2244
	dec	ebx
2245
	jne	.labl_00
1681 mario79 2246
 
1671 mario79 2247
	push	8
2248
	pop	ecx
2249
	pop	edi
2250
	lea	eax,[esi+0x8088]
2251
	pop	ebx
1681 mario79 2252
	jmp	CBitTreeEncoder_Init
1671 mario79 2253
;*****************************************************************************
2254
 
2255
;* Call: ***************************************************************
1681 mario79 2256
CPriceTableEncoder_UpdateTable:
1671 mario79 2257
	push	ebx
2258
	push	edi
2259
	mov	edi,eax
2260
	xor	ebx,ebx
2261
	cmp	[edi+0xC88C],ebx
2262
	jbe	.labl_01
1681 mario79 2263
 
2264
	mov	eax,[esp+12]
1671 mario79 2265
	push	esi
2266
	lea	esi,[edi+eax*4+0x848C]
2267
;----------------------------------------------------------
2268
.labl_00:
1681 mario79 2269
	mov	eax,[esp+16]
1671 mario79 2270
	mov	edx,ebx
1681 mario79 2271
	call	NLength_CEncoder_GetPrice
1671 mario79 2272
	mov	[esi],eax
2273
	inc	ebx
1681 mario79 2274
	add	esi,64
1671 mario79 2275
	cmp	ebx,[edi+0xC88C]
2276
	jb	.labl_00
1681 mario79 2277
 
1671 mario79 2278
	pop	esi
2279
;----------------------------------------------------------
2280
.labl_01:
2281
	mov	eax,[edi+0xC88C]
1681 mario79 2282
	mov	ecx,[esp+12]
1671 mario79 2283
	mov	[edi+ecx*4+0xC890],eax
2284
	pop	edi
2285
	pop	ebx
2286
	ret	4
2287
;*****************************************************************************
2288
 
2289
;* Call: ***************************************************************
1681 mario79 2290
NLength_CEncoder_GetPrice:
1671 mario79 2291
	push	ebp
2292
	mov	ebp,esp
2293
	push	ecx
2294
	push	esi
2295
	cmp	edx,8
2296
	jnb	.labl_00
1681 mario79 2297
 
2298
	imul	eax,eax,1028
1671 mario79 2299
	lea	esi,[eax+edi+8]
1681 mario79 2300
	call	CBitTreeEncoder_GetPrice
1671 mario79 2301
	mov	ecx,[edi]
2302
	shr	ecx,2
1681 mario79 2303
	add	eax,[Models+ecx*4]
1671 mario79 2304
	jmp	.labl_03
2305
;----------------------------------------------------------
2306
.labl_00:
2307
	push	ebx
1681 mario79 2308
	mov	ebx,2048
1671 mario79 2309
	mov	ecx,ebx
2310
	sub	ecx,[edi]
2311
	shr	ecx,2
1681 mario79 2312
	mov	ecx,[Models+ecx*4]
1671 mario79 2313
	mov	[ebp-4],ecx
1681 mario79 2314
	cmp	edx,16
1671 mario79 2315
	jnb	.labl_01
1681 mario79 2316
 
2317
	imul	eax,eax,1028
1671 mario79 2318
	add	edx,0xFFFFFFF8
2319
	lea	esi,[eax+edi+0x4048]
1681 mario79 2320
	call	CBitTreeEncoder_GetPrice
1671 mario79 2321
	mov	ecx,[edi+4]
2322
	shr	ecx,2
1681 mario79 2323
	add	eax,[Models+ecx*4]
1671 mario79 2324
	jmp	.labl_02
2325
;----------------------------------------------------------
2326
.labl_01:
2327
	add	edx,0xFFFFFFF0
2328
	lea	esi,[edi+0x8088]
1681 mario79 2329
	call	CBitTreeEncoder_GetPrice
1671 mario79 2330
	sub	ebx,[edi+4]
2331
	shr	ebx,2
1681 mario79 2332
	add	eax,[Models+ebx*4]
1671 mario79 2333
;----------------------------------------------------------
2334
.labl_02:
2335
	add	[ebp-4],eax
2336
	mov	eax,[ebp-4]
2337
	pop	ebx
2338
;----------------------------------------------------------
2339
.labl_03:
2340
	pop	esi
2341
	leave
2342
	ret
2343
;*****************************************************************************
2344
 
2345
;* Call: ***************************************************************
1681 mario79 2346
CPriceTableEncoder_Encode:
1671 mario79 2347
	push	edi
2348
	mov	edi,eax
2349
	mov	edx,esi
2350
	cmp	edi,8
2351
	jnb	.labl_00
1681 mario79 2352
 
1671 mario79 2353
	push	0
1681 mario79 2354
	call	CMyBitEncoder_Encode
1671 mario79 2355
	mov	eax,ebx
1681 mario79 2356
	imul	eax,eax,1028
1671 mario79 2357
	push	edi
2358
	lea	edi,[eax+esi+8]
2359
	jmp	.labl_02
2360
;----------------------------------------------------------
2361
.labl_00:
2362
	push	1
1681 mario79 2363
	call	CMyBitEncoder_Encode
1671 mario79 2364
	lea	edx,[esi+4]
1681 mario79 2365
	cmp	edi,16
1671 mario79 2366
	jnb	.labl_01
1681 mario79 2367
 
1671 mario79 2368
	push	0
1681 mario79 2369
	call	CMyBitEncoder_Encode
1671 mario79 2370
	add	edi,0xFFFFFFF8
2371
	mov	eax,ebx
1681 mario79 2372
	imul	eax,eax,1028
1671 mario79 2373
	push	edi
2374
	lea	edi,[eax+esi+0x4048]
2375
	jmp	.labl_02
2376
;----------------------------------------------------------
2377
.labl_01:
2378
	push	1
1681 mario79 2379
	call	CMyBitEncoder_Encode
1671 mario79 2380
	add	edi,0xFFFFFFF0
2381
	push	edi
2382
	lea	edi,[esi+0x8088]
2383
;----------------------------------------------------------
2384
.labl_02:
2385
	call	cm_pr_16
2386
	dec	dword [esi+ebx*4+0xC890]
2387
	pop	edi
2388
	jne	.labl_03
1681 mario79 2389
 
1671 mario79 2390
	push	ebx
2391
	mov	eax,esi
1681 mario79 2392
	call	CPriceTableEncoder_UpdateTable
1671 mario79 2393
;----------------------------------------------------------
2394
.labl_03:
2395
	ret
2396
;*****************************************************************************
2397
 
2398
;* Call: ***************************************************************
1681 mario79 2399
CLiteralEncoder2_Encode:
1671 mario79 2400
	push	ebx
2401
	push	esi
2402
	push	edi
2403
	xor	edi,edi
2404
	push	8
2405
	inc	edi
2406
	pop	ebx
2407
;----------------------------------------------------------
2408
.labl_00:
1681 mario79 2409
	movzx	esi,byte [esp+20]
2410
	mov	eax,[esp+16]
1671 mario79 2411
	dec	ebx
2412
	mov	cl,bl
2413
	shr	esi,cl
2414
	lea	edx,[eax+edi*4]
2415
	and	esi,1
2416
	push	esi
1681 mario79 2417
	call	CMyBitEncoder_Encode
1671 mario79 2418
	add	edi,edi
2419
	or	edi,esi
2420
	test	ebx,ebx
2421
	jne	.labl_00
1681 mario79 2422
 
1671 mario79 2423
	pop	edi
2424
	pop	esi
2425
	pop	ebx
2426
	ret	8
2427
;*****************************************************************************
2428
 
2429
;* Call: ***************************************************************
1681 mario79 2430
CState_IsCharState:
2431
	mov	edx,[_numPrevBits]
1671 mario79 2432
	push	esi
1681 mario79 2433
	mov	esi,[_posMask]
1671 mario79 2434
	and	esi,[esp+8]
2435
	push	8
2436
	pop	ecx
2437
	movzx	eax,al
2438
	sub	cl,dl
2439
	shr	eax,cl
2440
	mov	ecx,edx
2441
	shl	esi,cl
2442
	add	eax,esi
2443
	pop	esi
2444
	ret	4
2445
;*****************************************************************************
2446
 
2447
;* Call: ***************************************************************
1681 mario79 2448
CLiteralEncoder_GetPrice:
2449
	push	dword [esp+16]
2450
	push	dword [esp+16]
2451
	push	dword [esp+16]
2452
	push	dword [esp+16]
2453
	call	CState_IsCharState
2454
	imul	eax,eax,3072
2455
	add	eax,[_posEncoders]
1671 mario79 2456
	push	eax
2457
	call	lz_cm_11
1681 mario79 2458
	ret	16
1671 mario79 2459
;*****************************************************************************
2460
 
2461
;* Call: ***************************************************************
2462
lz_cm_11:
2463
	push	ebp
2464
	mov	ebp,esp
2465
	push	ecx
2466
	push	ebx
2467
	push	esi
2468
	xor	esi,esi
2469
	xor	eax,eax
2470
	inc	esi
2471
	push	edi
2472
	mov	dword [ebp-4],8
1681 mario79 2473
	cmp	[ebp+12],al
1671 mario79 2474
	je	.labl_02
1681 mario79 2475
 
2476
	movzx	ecx,byte [ebp+20]
2477
	mov	[ebp+12],ecx
1671 mario79 2478
;----------------------------------------------------------
2479
.labl_00:
2480
	dec	dword [ebp-4]
2481
	movzx	ecx,byte [ebp-4]
1681 mario79 2482
	movzx	edi,byte [ebp+16]
2483
	mov	edx,[ebp+12]
1671 mario79 2484
	mov	ebx,[ebp+8]
2485
	shr	edi,cl
2486
	shr	edx,cl
2487
	and	edi,1
2488
	mov	ecx,edi
2489
	shl	ecx,8
2490
	add	ecx,esi
1681 mario79 2491
	mov	ecx,[ebx+ecx*4+1024]
1671 mario79 2492
	and	edx,1
2493
	sub	ecx,edx
2494
	mov	ebx,edx
2495
	neg	ebx
2496
	xor	ecx,ebx
2497
	shr	ecx,2
2498
	and	ecx,0x1FF
1681 mario79 2499
	add	eax,[Models+ecx*4]
1671 mario79 2500
	add	esi,esi
2501
	or	esi,edx
2502
	cmp	edi,edx
2503
	jne	.labl_01
1681 mario79 2504
 
1671 mario79 2505
	cmp	dword [ebp-4],0
2506
	jne	.labl_00
1681 mario79 2507
 
1671 mario79 2508
	jmp	.labl_04
2509
;----------------------------------------------------------
2510
.labl_01:
2511
	cmp	dword [ebp-4],0
2512
	je	.labl_04
2513
;----------------------------------------------------------
2514
.labl_02:
1681 mario79 2515
	movzx	edi,byte [ebp+20]
1671 mario79 2516
;----------------------------------------------------------
2517
.labl_03:
2518
	dec	dword [ebp-4]
2519
	mov	cl,[ebp-4]
2520
	mov	edx,edi
2521
	shr	edx,cl
2522
	mov	ecx,[ebp+8]
2523
	mov	ecx,[ecx+esi*4]
2524
	add	esi,esi
2525
	and	edx,1
2526
	sub	ecx,edx
2527
	mov	ebx,edx
2528
	neg	ebx
2529
	xor	ecx,ebx
2530
	shr	ecx,2
2531
	and	ecx,0x1FF
1681 mario79 2532
	add	eax,[Models+ecx*4]
1671 mario79 2533
	or	esi,edx
2534
	cmp	dword [ebp-4],0
2535
	jne	.labl_03
2536
;----------------------------------------------------------
2537
.labl_04:
2538
	pop	edi
2539
	pop	esi
2540
	pop	ebx
2541
	leave
1681 mario79 2542
	ret	16
1671 mario79 2543
;*****************************************************************************
2544
 
2545
;* Call: ***************************************************************
1681 mario79 2546
ReadMatchDistances:
1671 mario79 2547
	push	esi
1681 mario79 2548
	call	GetLongestMatch
1671 mario79 2549
	mov	ecx,eax
1681 mario79 2550
	mov	esi,0x80
1671 mario79 2551
	cmp	ecx,esi
2552
	jne	.labl_00
1681 mario79 2553
 
2554
	push	dword [distances+512]
2555
	lea	eax,[esi+17]
1671 mario79 2556
	push	esi
1681 mario79 2557
	call	GetMatchLen
1671 mario79 2558
	mov	ecx,eax
2559
	add	ecx,esi
2560
;----------------------------------------------------------
2561
.labl_00:
1681 mario79 2562
	inc	dword [_additionalOffset]
2563
	call	MatchFinder_MovePos
1671 mario79 2564
	mov	eax,ecx
2565
	pop	esi
2566
	ret
2567
;*****************************************************************************
2568
 
2569
;* Call: ***************************************************************
1681 mario79 2570
GetLongestMatch:
1671 mario79 2571
	push	ebp
2572
	mov	ebp,esp
2573
	sub	esp,0x34
1681 mario79 2574
	mov	edx,[_matchMaxLen]
2575
	mov	ecx,[_pos]
2576
	mov	eax,[_streamPos]
2577
	and	dword [ebp-24],0
1671 mario79 2578
	push	esi
2579
	lea	esi,[edx+ecx]
2580
	cmp	esi,eax
2581
	ja	.labl_02
1681 mario79 2582
 
2583
	mov	[ebp-32],edx
1671 mario79 2584
;----------------------------------------------------------
2585
.labl_00:
1681 mario79 2586
	mov	eax,[_cyclicBufferSize]
1671 mario79 2587
	mov	edx,ecx
2588
	sub	edx,eax
2589
	cmp	eax,ecx
2590
	sbb	eax,eax
2591
	and	eax,edx
1681 mario79 2592
	mov	[ebp-40],eax
2593
	mov	eax,[_buffer]
1671 mario79 2594
	push	ebx
2595
	push	edi
2596
	lea	edi,[eax+ecx]
2597
	movzx	edx,byte [edi+2]
2598
	movzx	esi,byte [edi]
2599
	movzx	eax,word [edi]
2600
	shl	edx,8
1681 mario79 2601
	xor	edx,[crc_table+esi*4]
1671 mario79 2602
	movzx	esi,byte [edi+1]
2603
	xor	edx,esi
1681 mario79 2604
	mov	esi,[_hash]
1671 mario79 2605
	and	edx,0xFFFFF
2606
	lea	edx,[esi+edx*4]
2607
	mov	ebx,[edx]
2608
	lea	eax,[esi+eax*4+0x400000]
2609
	mov	[ebp-8],ebx
2610
	mov	ebx,[eax]
2611
	mov	[eax],ecx
1681 mario79 2612
	or	dword [distances+8],0xFFFFFFFF
2613
	cmp	ebx,[ebp-40]
1671 mario79 2614
	jbe	.labl_01
1681 mario79 2615
 
1671 mario79 2616
	mov	eax,ecx
2617
	sub	eax,ebx
2618
	dec	eax
1681 mario79 2619
	mov	[distances+8],eax
2620
	mov	dword [ebp-24],2
1671 mario79 2621
;----------------------------------------------------------
2622
.labl_01:
1681 mario79 2623
	mov	ebx,[pack_pos]
2624
	and	dword [ebp-36],0
1671 mario79 2625
	mov	[edx],ecx
1681 mario79 2626
	or	dword [distances+12],0xFFFFFFFF
2627
	and	dword [ebp-48],0
1671 mario79 2628
	lea	edx,[esi+ebx*8+0x440000]
2629
	lea	eax,[edx+4]
1681 mario79 2630
	mov	[ebp-20],eax
2631
	mov	eax,[_cutValue]
2632
	mov	[ebp-28],eax
1671 mario79 2633
	mov	eax,[ebp-8]
1681 mario79 2634
	mov	[ebp-16],edx
1671 mario79 2635
	jmp	.labl_13
2636
;----------------------------------------------------------
2637
.labl_02:
2638
	sub	eax,ecx
1681 mario79 2639
	mov	[ebp-32],eax
1671 mario79 2640
	cmp	eax,3
2641
	jnb	.labl_00
1681 mario79 2642
 
1671 mario79 2643
	xor	eax,eax
2644
	jmp	.labl_16
2645
;----------------------------------------------------------
2646
.labl_03:
1681 mario79 2647
	mov	eax,[ebp-28]
2648
	dec	dword [ebp-28]
1671 mario79 2649
	test	eax,eax
2650
	je	.labl_14
1681 mario79 2651
 
2652
	mov	eax,[_buffer]
1671 mario79 2653
	mov	edx,[ebp-8]
2654
	add	eax,edx
1681 mario79 2655
	mov	[ebp-44],eax
2656
	mov	eax,[ebp-48]
2657
	cmp	eax,[ebp-36]
1671 mario79 2658
	jb	.labl_04
1681 mario79 2659
 
2660
	mov	eax,[ebp-36]
1671 mario79 2661
;----------------------------------------------------------
2662
.labl_04:
1681 mario79 2663
	mov	edx,[ebp-44]
1671 mario79 2664
	mov	[ebp-4],eax
2665
	add	eax,edi
2666
	sub	edx,edi
1681 mario79 2667
	mov	[ebp-12],edx
1671 mario79 2668
	jmp	.labl_06
2669
;----------------------------------------------------------
2670
.labl_05:
1681 mario79 2671
	mov	edx,[ebp-12]
2672
	mov	eax,[ebp-52]
1671 mario79 2673
;----------------------------------------------------------
2674
.labl_06:
2675
	mov	dl,[edx+eax]
2676
	cmp	dl,[eax]
2677
	jne	.labl_07
1681 mario79 2678
 
1671 mario79 2679
	inc	dword [ebp-4]
2680
	inc	eax
1681 mario79 2681
	mov	[ebp-52],eax
1671 mario79 2682
	mov	eax,[ebp-4]
1681 mario79 2683
	cmp	eax,[ebp-32]
1671 mario79 2684
	jne	.labl_05
2685
;----------------------------------------------------------
2686
.labl_07:
2687
	mov	eax,ecx
2688
	sub	eax,[ebp-8]
1681 mario79 2689
	mov	[ebp-12],eax
2690
	mov	eax,[ebp-24]
1671 mario79 2691
	cmp	eax,[ebp-4]
2692
	jnb	.labl_09
2693
;----------------------------------------------------------
2694
.labl_08:
1681 mario79 2695
	mov	edx,[ebp-12]
1671 mario79 2696
	inc	eax
2697
	dec	edx
1681 mario79 2698
	mov	[distances+eax*4],edx
1671 mario79 2699
	cmp	eax,[ebp-4]
2700
	jb	.labl_08
1681 mario79 2701
 
2702
	mov	[ebp-24],eax
1671 mario79 2703
;----------------------------------------------------------
2704
.labl_09:
2705
	mov	eax,ebx
1681 mario79 2706
	sub	eax,[ebp-12]
2707
	cmp	[ebp-12],ebx
1671 mario79 2708
	jbe	.labl_10
1681 mario79 2709
 
2710
	add	eax,[_cyclicBufferSize]
1671 mario79 2711
;----------------------------------------------------------
2712
.labl_10:
2713
	lea	eax,[esi+eax*8+0x440000]
1681 mario79 2714
	mov	[ebp-12],eax
1671 mario79 2715
	mov	eax,[ebp-4]
1681 mario79 2716
	cmp	eax,[ebp-32]
1671 mario79 2717
	je	.labl_17
1681 mario79 2718
 
2719
	mov	edx,[ebp-44]
1671 mario79 2720
	mov	dl,[eax+edx]
2721
	cmp	dl,[eax+edi]
2722
	mov	eax,[ebp-8]
2723
	jnb	.labl_11
1681 mario79 2724
 
2725
	mov	edx,[ebp-16]
1671 mario79 2726
	mov	[edx],eax
1681 mario79 2727
	mov	eax,[ebp-12]
1671 mario79 2728
	mov	edx,[ebp-4]
2729
	add	eax,4
1681 mario79 2730
	mov	[ebp-16],eax
2731
	mov	[ebp-36],edx
1671 mario79 2732
	jmp	.labl_12
2733
;----------------------------------------------------------
2734
.labl_11:
1681 mario79 2735
	mov	edx,[ebp-20]
1671 mario79 2736
	mov	[edx],eax
1681 mario79 2737
	mov	eax,[ebp-12]
1671 mario79 2738
	mov	edx,[ebp-4]
1681 mario79 2739
	mov	[ebp-20],eax
2740
	mov	[ebp-48],edx
1671 mario79 2741
;----------------------------------------------------------
2742
.labl_12:
2743
	mov	eax,[eax]
2744
	mov	[ebp-8],eax
2745
;----------------------------------------------------------
2746
.labl_13:
1681 mario79 2747
	cmp	eax,[ebp-40]
1671 mario79 2748
	ja	.labl_03
2749
;----------------------------------------------------------
2750
.labl_14:
1681 mario79 2751
	mov	eax,[ebp-16]
1671 mario79 2752
	and	dword [eax],0
1681 mario79 2753
	mov	eax,[ebp-20]
1671 mario79 2754
	and	dword [eax],0
2755
;----------------------------------------------------------
2756
.labl_15:
1681 mario79 2757
	mov	eax,[ebp-24]
1671 mario79 2758
	pop	edi
2759
	pop	ebx
2760
;----------------------------------------------------------
2761
.labl_16:
2762
	pop	esi
2763
	leave
2764
	ret
2765
;----------------------------------------------------------
2766
.labl_17:
1681 mario79 2767
	mov	eax,[ebp-12]
1671 mario79 2768
	mov	ecx,[eax]
1681 mario79 2769
	mov	edx,[ebp-16]
1671 mario79 2770
	mov	[edx],ecx
2771
	mov	eax,[eax+4]
1681 mario79 2772
	mov	ecx,[ebp-20]
1671 mario79 2773
	mov	[ecx],eax
2774
	jmp	.labl_15
2775
;*****************************************************************************
2776
 
2777
;* Call: ***************************************************************
1681 mario79 2778
FillPosSlotPrices:
1671 mario79 2779
	push	ecx
2780
	push	ebx
2781
	push	ebp
2782
	push	esi
2783
	push	edi
2784
	xor	ebp,ebp
1681 mario79 2785
	mov	esi,_posSlotEncoder
2786
	mov	dword [esp+16],4
1671 mario79 2787
;----------------------------------------------------------
2788
.labl_00:
2789
	xor	edi,edi
2790
;----------------------------------------------------------
2791
.labl_01:
1681 mario79 2792
	mov	ebx,[_distTableSize]
1671 mario79 2793
	cmp	edi,ebx
2794
	jnb	.labl_03
1681 mario79 2795
 
1671 mario79 2796
	mov	edx,edi
1681 mario79 2797
	call	CBitTreeEncoder_GetPrice
1671 mario79 2798
	lea	ecx,[edi+ebp]
2799
	inc	edi
1681 mario79 2800
	mov	[_posSlotPrices+ecx*4],eax
2801
	cmp	edi,14
1671 mario79 2802
	jb	.labl_01
1681 mario79 2803
 
1671 mario79 2804
	cmp	edi,ebx
2805
	jnb	.labl_03
1681 mario79 2806
 
1671 mario79 2807
	lea	ebx,[edi+ebp]
1681 mario79 2808
	lea	ebx,[_posSlotPrices+ebx*4]
1671 mario79 2809
;----------------------------------------------------------
2810
.labl_02:
2811
	mov	edx,edi
1681 mario79 2812
	call	CBitTreeEncoder_GetPrice
1671 mario79 2813
	mov	ecx,edi
2814
	shr	ecx,1
2815
	sub	ecx,5
2816
	shl	ecx,6
2817
	add	eax,ecx
2818
	mov	[ebx],eax
2819
	inc	edi
2820
	add	ebx,4
1681 mario79 2821
	cmp	edi,[_distTableSize]
1671 mario79 2822
	jb	.labl_02
2823
;----------------------------------------------------------
2824
.labl_03:
1681 mario79 2825
	add	esi,1028
2826
	add	ebp,64
2827
	dec	dword [esp+16]
1671 mario79 2828
	jne	.labl_00
1681 mario79 2829
 
1671 mario79 2830
	pop	edi
2831
	pop	esi
2832
	pop	ebp
2833
	pop	ebx
2834
	pop	ecx
2835
	ret
2836
;***********************************************************************
2837
 
2838
;* Call: ***************************************************************
1681 mario79 2839
FillDistancesPrices:
1671 mario79 2840
	push	ebp
2841
	mov	ebp,esp
1681 mario79 2842
	sub	esp,36
2843
	and	dword [ebp-20],0
1671 mario79 2844
	push	ebx
2845
	push	esi
2846
	push	edi
2847
	push	4
2848
	pop	ebx
1681 mario79 2849
	mov	dword [ebp-24],_distancesPrices+16
2850
	mov	dword [ebp-16],_posSlotPrices
2851
	mov	[ebp-36],ebx
1671 mario79 2852
;----------------------------------------------------------
2853
.labl_00:
1681 mario79 2854
	mov	eax,[ebp-24]
2855
	mov	esi,[ebp-16]
2856
	lea	edi,[eax-16]
1671 mario79 2857
	movsd
2858
	movsd
2859
	movsd
2860
	movsd
2861
	mov	[ebp-4],ebx
1681 mario79 2862
	mov	[ebp-12],eax
1671 mario79 2863
;----------------------------------------------------------
2864
.labl_01:
2865
	mov	esi,[ebp-4]
2866
	mov	eax,esi
1681 mario79 2867
	call	GetPosSlot
1671 mario79 2868
	mov	edx,eax
2869
	mov	ecx,edx
2870
	xor	eax,eax
2871
	inc	eax
1681 mario79 2872
	mov	[ebp-32],edx
1671 mario79 2873
	and	edx,eax
2874
	shr	ecx,1
2875
	dec	ecx
2876
	or	edx,2
2877
	shl	edx,cl
2878
	xor	edi,edi
2879
	mov	[ebp-8],eax
1681 mario79 2880
	mov	[ebp-28],ecx
1671 mario79 2881
	sub	esi,edx
2882
	test	ecx,ecx
2883
	je	.labl_03
2884
;----------------------------------------------------------
2885
.labl_02:
2886
	mov	eax,[ebp-8]
1681 mario79 2887
	sub	eax,[ebp-32]
1671 mario79 2888
	mov	ecx,esi
2889
	add	eax,edx
1681 mario79 2890
	mov	eax,[_numLiteralContextBits+eax*4]
1671 mario79 2891
	and	ecx,1
2892
	sub	eax,ecx
2893
	mov	ebx,ecx
2894
	neg	ebx
2895
	xor	eax,ebx
2896
	shr	eax,2
2897
	and	eax,0x1FF
1681 mario79 2898
	add	edi,[Models+eax*4]
1671 mario79 2899
	mov	eax,[ebp-8]
2900
	shr	esi,1
1681 mario79 2901
	dec	dword [ebp-28]
1671 mario79 2902
	lea	eax,[ecx+eax*2]
2903
	mov	[ebp-8],eax
2904
	jne	.labl_02
1681 mario79 2905
 
1671 mario79 2906
	push	4
2907
	pop	ebx
2908
;----------------------------------------------------------
2909
.labl_03:
1681 mario79 2910
	mov	eax,[ebp-32]
2911
	mov	ecx,[ebp-20]
1671 mario79 2912
	add	ecx,eax
1681 mario79 2913
	mov	eax,[_posSlotPrices+ecx*4]
2914
	mov	ecx,[ebp-12]
2915
	add	[ebp-12],ebx
1671 mario79 2916
	add	eax,edi
2917
	inc	dword [ebp-4]
1681 mario79 2918
	cmp	dword [ebp-4],0x80
1671 mario79 2919
	mov	[ecx],eax
2920
	jb	.labl_01
1681 mario79 2921
 
2922
	add	dword [ebp-16],256
2923
	add	dword [ebp-20],64
2924
	add	dword [ebp-24],512
2925
	dec	dword [ebp-36]
1671 mario79 2926
	jne	.labl_00
1681 mario79 2927
 
1671 mario79 2928
	pop	edi
2929
	pop	esi
2930
	pop	ebx
2931
	leave
2932
	ret
2933
;***********************************************************************
2934
 
2935
;* Call: ***************************************************************
1681 mario79 2936
FillAlignPrices:
1671 mario79 2937
	push	ebp
2938
	mov	ebp,esp
2939
	push	ecx
2940
	push	ecx
2941
	push	ebx
2942
	push	esi
2943
	xor	esi,esi
2944
	push	edi
2945
	mov	[ebp-8],esi
2946
;----------------------------------------------------------
2947
.labl_00:
1681 mario79 2948
	mov	eax,[i_01]
1671 mario79 2949
	xor	edx,edx
2950
	xor	ecx,ecx
2951
	inc	edx
2952
	mov	[ebp-4],eax
2953
;----------------------------------------------------------
2954
.labl_01:
1681 mario79 2955
	mov	edi,[_posAlignEncoder+edx*4]
1671 mario79 2956
	mov	eax,esi
2957
	and	eax,1
2958
	sub	edi,eax
2959
	mov	ebx,eax
2960
	neg	ebx
2961
	xor	edi,ebx
2962
	shr	edi,2
2963
	and	edi,0x1FF
1681 mario79 2964
	add	ecx,[Models+edi*4]
1671 mario79 2965
	shr	esi,1
2966
	dec	dword [ebp-4]
2967
	lea	edx,[eax+edx*2]
2968
	jne	.labl_01
1681 mario79 2969
 
1671 mario79 2970
	mov	esi,[ebp-8]
1681 mario79 2971
	push	16
2972
	mov	[_alignPrices+esi*4],ecx
1671 mario79 2973
	inc	esi
2974
	pop	eax
2975
	mov	[ebp-8],esi
2976
	cmp	esi,eax
2977
	jb	.labl_00
1681 mario79 2978
 
1671 mario79 2979
	pop	edi
2980
	pop	esi
1681 mario79 2981
	mov	[_alignPriceCount],eax
1671 mario79 2982
	pop	ebx
2983
	leave
2984
	ret
2985
;***********************************************************************
2986
 
2987
;* Call: ***************************************************************
1681 mario79 2988
GetRepLen1Price:
1671 mario79 2989
	movzx	eax,al
1681 mario79 2990
	mov	edx,[_isRepG0+eax*4]
1671 mario79 2991
	mov	ecx,eax
2992
	shl	ecx,4
2993
	add	ecx,[esp+4]
2994
	shr	edx,2
1681 mario79 2995
	mov	ecx,[_isRep0Long+ecx*4]
1671 mario79 2996
	shr	ecx,2
1681 mario79 2997
	mov	eax,[Models+ecx*4]
2998
	add	eax,[Models+edx*4]
1671 mario79 2999
	ret	4
3000
;***********************************************************************
3001
 
3002
;* Call: ***************************************************************
1681 mario79 3003
GetRepPrice:
1671 mario79 3004
	movzx	ecx,byte [esp+4]
3005
	shl	eax,4
3006
	add	eax,[esp+8]
3007
	push	esi
1681 mario79 3008
	mov	eax,[_repMatchLenEncoder+0x840C+eax*4]
3009
	mov	esi,2048
1671 mario79 3010
	test	edx,edx
3011
	jne	.labl_00
1681 mario79 3012
 
1671 mario79 3013
	mov	edx,ecx
1681 mario79 3014
	mov	ecx,[_isRepG0+ecx*4]
1671 mario79 3015
	shl	edx,4
1681 mario79 3016
	add	edx,[esp+12]
3017
	sub	esi,[_isRep0Long+edx*4]
1671 mario79 3018
	shr	ecx,2
3019
	jmp	.labl_02
3020
;----------------------------------------------------------
3021
.labl_00:
3022
	push	edi
3023
	shl	ecx,2
3024
	mov	edi,esi
1681 mario79 3025
	sub	edi,[ecx+_isRepG0]
1671 mario79 3026
	shr	edi,2
1681 mario79 3027
	add	eax,[Models+edi*4]
1671 mario79 3028
	pop	edi
3029
	cmp	edx,1
3030
	jne	.labl_01
1681 mario79 3031
 
3032
	mov	ecx,[ecx+_isRepG1]
1671 mario79 3033
	shr	ecx,2
1681 mario79 3034
	add	eax,[Models+ecx*4]
1671 mario79 3035
	jmp	.labl_03
3036
;----------------------------------------------------------
3037
.labl_01:
1681 mario79 3038
	sub	esi,[ecx+_isRepG1]
3039
	mov	ecx,[ecx+_isRepG2]
1671 mario79 3040
	add	edx,0xFFFFFFFE
3041
	sub	ecx,edx
3042
	neg	edx
3043
	xor	ecx,edx
3044
	shr	ecx,2
3045
	and	ecx,0x1FF
3046
;----------------------------------------------------------
3047
.labl_02:
3048
	shr	esi,2
1681 mario79 3049
	mov	edx,[Models+esi*4]
3050
	add	edx,[Models+ecx*4]
1671 mario79 3051
	add	eax,edx
3052
;----------------------------------------------------------
3053
.labl_03:
3054
	pop	esi
3055
	ret	8
3056
;***********************************************************************
3057
 
3058
;* Call: ***************************************************************
1681 mario79 3059
GetPosLenPrice:
1671 mario79 3060
	push	esi
3061
	mov	esi,eax
1681 mario79 3062
	mov	ecx,0x80
1671 mario79 3063
	cmp	esi,2
3064
	jne	.labl_00
1681 mario79 3065
 
1671 mario79 3066
	cmp	edx,ecx
3067
	jb	.labl_01
1681 mario79 3068
 
3069
	mov	eax,kIfinityPrice
1671 mario79 3070
	jmp	.labl_09
3071
;----------------------------------------------------------
3072
.labl_00:
3073
	cmp	esi,6
3074
	jnb	.labl_02
3075
;----------------------------------------------------------
3076
.labl_01:
3077
	lea	eax,[esi-2]
3078
	jmp	.labl_03
3079
;----------------------------------------------------------
3080
.labl_02:
3081
	push	3
3082
	pop	eax
3083
;----------------------------------------------------------
3084
.labl_03:
3085
	cmp	edx,ecx
3086
	jnb	.labl_04
1681 mario79 3087
 
1671 mario79 3088
	shl	eax,7
3089
	add	eax,edx
1681 mario79 3090
	mov	ecx,[_distancesPrices+eax*4]
1671 mario79 3091
	jmp	.labl_08
3092
;----------------------------------------------------------
3093
.labl_04:
3094
	mov	ecx,edx
1681 mario79 3095
;GetPosSlot2
3096
	cmp	edx,0x10000	;if (pos < (1<<16))
1671 mario79 3097
	jnb	.labl_05
1681 mario79 3098
 
1671 mario79 3099
	shr	ecx,6
1681 mario79 3100
	movzx	ecx,byte [ecx+g_FastPos]
3101
	add	ecx,12
1671 mario79 3102
	jmp	.labl_07
3103
;----------------------------------------------------------
3104
.labl_05:
1681 mario79 3105
	cmp	edx,0x2000000	;if (pos < (1<<25))
1671 mario79 3106
	jnb	.labl_06
1681 mario79 3107
 
3108
	shr	ecx,15
3109
	movzx	ecx,byte [ecx+g_FastPos]
3110
	add	ecx,30
1671 mario79 3111
	jmp	.labl_07
3112
;----------------------------------------------------------
3113
.labl_06:
1681 mario79 3114
	shr	ecx,24
3115
	movzx	ecx,byte [ecx+g_FastPos]
3116
	add	ecx,48
1671 mario79 3117
;----------------------------------------------------------
3118
.labl_07:
3119
	shl	eax,6
3120
	add	eax,ecx
1681 mario79 3121
	mov	ecx,[_posSlotPrices+eax*4]
3122
	and	edx,15
3123
	add	ecx,[_alignPrices+edx*4]
1671 mario79 3124
;----------------------------------------------------------
3125
.labl_08:
3126
	shl	esi,4
3127
	add	esi,[esp+8]
1681 mario79 3128
	mov	eax,[_prices+esi*4]
1671 mario79 3129
	add	eax,ecx
3130
;----------------------------------------------------------
3131
.labl_09:
3132
	pop	esi
3133
	ret	4
3134
;***********************************************************************
3135
 
3136
;* Call: ***************************************************************
1681 mario79 3137
RangeEncoder_ShiftLow:
1671 mario79 3138
	push	ecx
3139
	push	ecx
1681 mario79 3140
	mov	eax,[low]
1671 mario79 3141
	push	esi
1681 mario79 3142
	mov	esi,[low+4]
1671 mario79 3143
	cmp	eax,0xFF000000
3144
	jb	.labl_00
1681 mario79 3145
 
1671 mario79 3146
	test	esi,esi
3147
	je	.labl_02
3148
;----------------------------------------------------------
3149
.labl_00:
1681 mario79 3150
	mov	cl,[_cache]
1671 mario79 3151
	and	dword [esp+8],0
3152
	mov	edx,esi
3153
	push	ebx
3154
;----------------------------------------------------------
3155
.labl_01:
3156
	mov	bl,dl
3157
	add	bl,cl
1681 mario79 3158
	mov	ecx,[pack_length]
3159
	inc	dword [pack_length]
1671 mario79 3160
	mov	[ecx],bl
3161
	or	cl,0xFF
1681 mario79 3162
	dec	dword [_cacheSize]
1671 mario79 3163
	jne	.labl_01
1681 mario79 3164
 
3165
	mov	cl,[low+3]
3166
	mov	[_cache],cl
1671 mario79 3167
	pop	ebx
3168
;----------------------------------------------------------
3169
.labl_02:
1681 mario79 3170
	inc	dword [_cacheSize]
1671 mario79 3171
	shl	eax,8
1681 mario79 3172
	and	dword [low+4],0
3173
	mov	[low],eax
1671 mario79 3174
	pop	esi
3175
	pop	ecx
3176
	pop	ecx
3177
	ret
3178
;***********************************************************************
3179
 
3180
;* Call: ***************************************************************
1681 mario79 3181
CMyBitEncoder_Encode:
3182
	mov	ecx,[range]
1671 mario79 3183
	mov	eax,[edx]
3184
	shr	ecx,0xB
3185
	imul	ecx,eax
3186
	cmp	dword [esp+4],0
3187
	jne	.labl_00
1681 mario79 3188
 
3189
	mov	[range],ecx
3190
	mov	ecx,2048
1671 mario79 3191
	sub	ecx,eax
3192
	shr	ecx,5
3193
	add	ecx,eax
3194
	mov	[edx],ecx
3195
	jmp	.labl_01
3196
;----------------------------------------------------------
3197
.labl_00:
1681 mario79 3198
	add	[low],ecx
3199
	adc	dword [low+4],0
3200
	sub	[range],ecx
1671 mario79 3201
	mov	ecx,eax
3202
	shr	ecx,5
3203
	sub	eax,ecx
3204
	mov	[edx],eax
3205
;----------------------------------------------------------
3206
.labl_01:
1681 mario79 3207
	cmp	dword [range],0x1000000
1671 mario79 3208
	jnb	.labl_02
1681 mario79 3209
 
3210
	shl	dword [range],8
3211
	call	RangeEncoder_ShiftLow
1671 mario79 3212
;----------------------------------------------------------
3213
.labl_02:
3214
	ret	4
3215
;***********************************************************************
3216
 
3217
;* Call: ***************************************************************
1681 mario79 3218
CBitTreeEncoder_Init:
1671 mario79 3219
	xor	edx,edx
3220
	inc	edx
3221
	shl	edx,cl
1681 mario79 3222
	mov	[eax+1024],ecx
1671 mario79 3223
	lea	ecx,[edx-1]
3224
	test	ecx,ecx
3225
	jbe	.labl_00
1681 mario79 3226
 
1671 mario79 3227
	push	edi
3228
	lea	edi,[eax+4]
1681 mario79 3229
	mov	eax,1024
1671 mario79 3230
	rep	stosd
3231
	pop	edi
3232
;----------------------------------------------------------
3233
.labl_00:
3234
	ret
3235
;***********************************************************************
3236
 
3237
;* Call: ***************************************************************
3238
cm_pr_16:
3239
	mov	eax,[esp+4]
3240
	push	ebx
1681 mario79 3241
	mov	ebx,[edi+1024]
1671 mario79 3242
	push	esi
3243
	xor	esi,esi
3244
	inc	esi
3245
	add	eax,eax
1681 mario79 3246
	mov	[esp+12],eax
1671 mario79 3247
;----------------------------------------------------------
3248
.labl_00:
1681 mario79 3249
	mov	eax,[esp+12]
1671 mario79 3250
	mov	ecx,ebx
3251
	shr	eax,cl
3252
	lea	edx,[edi+esi*4]
3253
	and	eax,1
3254
	push	eax
3255
	lea	esi,[eax+esi*2]
1681 mario79 3256
	call	CMyBitEncoder_Encode
1671 mario79 3257
	dec	ebx
3258
	jne	.labl_00
1681 mario79 3259
 
1671 mario79 3260
	pop	esi
3261
	pop	ebx
3262
	ret	4
3263
;***********************************************************************
3264
 
3265
;* Call: ***************************************************************
1681 mario79 3266
CBitTreeEncoder_GetPrice:
3267
	mov	ecx,[esi+1024]
1671 mario79 3268
	push	edi
3269
	xor	edi,edi
3270
	inc	edi
3271
	shl	edi,cl
3272
	xor	eax,eax
3273
	or	edx,edi
3274
;----------------------------------------------------------
3275
.labl_00:
3276
	mov	ecx,edx
3277
	shr	edx,1
3278
	mov	edi,[esi+edx*4]
3279
	and	ecx,1
3280
	sub	edi,ecx
3281
	neg	ecx
3282
	xor	edi,ecx
3283
	shr	edi,2
3284
	and	edi,0x1FF
1681 mario79 3285
	add	eax,[Models+edi*4]
1671 mario79 3286
	cmp	edx,1
3287
	jne	.labl_00
1681 mario79 3288
 
1671 mario79 3289
	pop	edi
3290
	ret
3291
;***********************************************************************
3292
 
3293
;* Call: ***************************************************************
1681 mario79 3294
GetMatchLen:
3295
	mov	ecx,[_streamPos]
1671 mario79 3296
	push	edi
3297
	mov	edi,eax
1681 mario79 3298
	mov	eax,[_pos]
1671 mario79 3299
	sub	ecx,eax
3300
	sub	ecx,[esp+8]
3301
	cmp	edi,ecx
3302
	jbe	.labl_00
1681 mario79 3303
 
1671 mario79 3304
	mov	edi,ecx
3305
;----------------------------------------------------------
3306
.labl_00:
1681 mario79 3307
	mov	ecx,[_buffer]
3308
	inc	dword [esp+12]
1671 mario79 3309
	add	ecx,eax
3310
	add	ecx,[esp+8]
3311
	xor	eax,eax
3312
	test	edi,edi
3313
	jbe	.labl_03
1681 mario79 3314
 
1671 mario79 3315
	push	esi
3316
	mov	esi,ecx
1681 mario79 3317
	sub	esi,[esp+16]
1671 mario79 3318
;----------------------------------------------------------
3319
.labl_01:
3320
	mov	dl,[eax+ecx]
3321
	cmp	dl,[esi+eax]
3322
	jne	.labl_02
1681 mario79 3323
 
1671 mario79 3324
	inc	eax
3325
	cmp	eax,edi
3326
	jb	.labl_01
3327
;----------------------------------------------------------
3328
.labl_02:
3329
	pop	esi
3330
;----------------------------------------------------------
3331
.labl_03:
3332
	pop	edi
3333
	ret	8
3334
;***********************************************************************
3335
 
3336
;* Call: ***************************************************************
1681 mario79 3337
MatchFinder_MovePos:
3338
	inc	dword [pack_pos]
3339
	mov	eax,[pack_pos]
3340
	cmp	eax,[_cyclicBufferSize]
1671 mario79 3341
	jne	.labl_00
1681 mario79 3342
 
3343
	and	dword [pack_pos],0
1671 mario79 3344
;----------------------------------------------------------
3345
.labl_00:
1681 mario79 3346
	inc	dword [_pos]
1671 mario79 3347
	ret
3348
;***********************************************************************