585e2cd30a
git-svn-id: svn://kolibrios.org@1718 a494cfbc-eb01-0410-851d-a64ba20cac60
3349 lines
66 KiB
PHP
3349 lines
66 KiB
PHP
kIfinityPrice equ 0x0FFFFFFF
|
|
|
|
;* Call: ***************************************************************
|
|
;lzma_compress(
|
|
; const void* source,
|
|
; void* destination,
|
|
; unsigned length,
|
|
; void* workmem)
|
|
lzma_compress:
|
|
push ebp
|
|
mov ebp,esp
|
|
and esp,0xFFFFFFF8
|
|
sub esp,12
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push 2
|
|
pop esi
|
|
xor ebx,ebx
|
|
mov [esp+20],esi
|
|
mov [g_FastPos],bl
|
|
mov byte [g_FastPos+1],1
|
|
mov [esp+16],esi
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov ecx,[esp+16]
|
|
xor edi,edi
|
|
sar ecx,1
|
|
dec ecx
|
|
inc edi
|
|
shl edi,cl
|
|
cmp edi,ebx
|
|
jbe .labl_01
|
|
|
|
mov eax,[esp+20]
|
|
push edi
|
|
push dword [esp+20]
|
|
lea eax,[eax+g_FastPos]
|
|
push eax
|
|
call _memset
|
|
add esp,12
|
|
add [esp+20],edi
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
inc dword [esp+16]
|
|
cmp dword [esp+16],20
|
|
jl .labl_00
|
|
|
|
mov edi,[ebp+20]
|
|
push 3
|
|
pop eax
|
|
mov ecx,edi
|
|
and ecx,eax
|
|
mov edx,128
|
|
mov [_numFastBytes],edx
|
|
mov [_posStateBits],esi
|
|
mov [_posStateMask],eax
|
|
mov [_numLiteralContextBits],eax
|
|
mov [_numLiteralPosStateBits],ebx
|
|
mov [_writeEndMark],bl
|
|
mov [_finished],bl
|
|
je .labl_02
|
|
|
|
sub edi,ecx
|
|
add edi,4
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
;CLiteralEncoder_Create
|
|
mov [_numPrevBits],eax
|
|
mov eax,[_dictionarySize]
|
|
mov [_posEncoders],edi
|
|
add edi,0x6000
|
|
inc eax
|
|
mov [_numPosBits],ebx
|
|
mov [_posMask],ebx
|
|
;MatchFinder_Create
|
|
mov [_matchMaxLen],edx
|
|
mov [_cyclicBufferSize],eax
|
|
mov [_hash],edi
|
|
mov dword [_cutValue],0xFF
|
|
call CEncoder_Init
|
|
call FillPosSlotPrices
|
|
call FillDistancesPrices
|
|
call FillAlignPrices
|
|
push 127
|
|
pop esi
|
|
mov [_lenEncoder+0xC88C],esi
|
|
mov [esp+16],ebx
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
push dword [esp+16]
|
|
mov eax,_lenEncoder
|
|
call CPriceTableEncoder_UpdateTable
|
|
inc dword [esp+16]
|
|
cmp dword [esp+16],4
|
|
jb .labl_03
|
|
|
|
mov [_repMatchLenEncoder+0xC88C],esi
|
|
xor esi,esi
|
|
;----------------------------------------------------------
|
|
.labl_04:
|
|
push esi
|
|
mov eax,_repMatchLenEncoder
|
|
call CPriceTableEncoder_UpdateTable
|
|
inc esi
|
|
cmp esi,4
|
|
jb .labl_04
|
|
|
|
mov eax,[ebp+8]
|
|
mov esi,[ebp+12]
|
|
dec eax
|
|
mov [_buffer],eax
|
|
mov eax,[ebp+16]
|
|
inc eax
|
|
mov [_streamPos],eax
|
|
mov ecx,0x110000
|
|
xor eax,eax
|
|
mov [lastPosSlotFillingPos],ebx
|
|
mov [lastPosSlotFillingPos+4],ebx
|
|
mov [nowPos64],ebx
|
|
mov [nowPos64+4],ebx
|
|
mov [pack_length],esi
|
|
mov dword [_pos],1
|
|
rep stosd
|
|
mov [pack_pos],ebx
|
|
;----------------------------------------------------------
|
|
;MatchFinder_Init
|
|
.labl_08:
|
|
push 8
|
|
mov eax,ebx
|
|
pop ecx
|
|
;----------------------------------------------------------
|
|
.labl_07:
|
|
test al,1
|
|
je .labl_05
|
|
|
|
shr eax,1
|
|
xor eax,0xEDB88320
|
|
jmp .labl_06
|
|
;----------------------------------------------------------
|
|
.labl_05:
|
|
shr eax,1
|
|
;----------------------------------------------------------
|
|
.labl_06:
|
|
dec ecx
|
|
jne .labl_07
|
|
|
|
mov [crc_table+ebx*4],eax
|
|
inc ebx
|
|
cmp ebx,256
|
|
jb .labl_08
|
|
;----------------------------------------------------------
|
|
.labl_09:
|
|
call CodeOneBlock
|
|
test al,al
|
|
jne .labl_09
|
|
|
|
mov eax,[pack_length]
|
|
pop edi
|
|
sub eax,esi
|
|
pop esi
|
|
pop ebx
|
|
mov esp,ebp
|
|
pop ebp
|
|
ret 16
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
_memset:
|
|
push edi
|
|
mov edi,[esp+8]
|
|
mov al,[esp+12]
|
|
mov ecx,[esp+16]
|
|
rep stosb
|
|
pop edi
|
|
ret
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CEncoder_Init:
|
|
;RangeEncoder_Init
|
|
and dword [low],0
|
|
and dword [low+4],0
|
|
or dword [_range],0xFFFFFFFF
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
xor eax,eax
|
|
mov edi,_repDistances
|
|
stosd
|
|
stosd
|
|
xor ebx,ebx
|
|
stosd
|
|
inc ebx
|
|
;CBaseState_Init
|
|
mov byte [_state],0
|
|
mov byte [_previousByte],0
|
|
stosd
|
|
mov [_cacheSize],ebx
|
|
mov byte [_cache],0
|
|
xor ecx,ecx
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov eax,ebx
|
|
shl eax,cl
|
|
push 8
|
|
pop edx
|
|
sub edx,ecx
|
|
lea esi,[Models+eax*4]
|
|
shl edx,6
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov edi,eax
|
|
shl edi,6
|
|
shr edi,cl
|
|
add edi,edx
|
|
mov [esi],edi
|
|
add esi,4
|
|
dec eax
|
|
jne .labl_01
|
|
|
|
inc ecx
|
|
cmp ecx,9
|
|
jl .labl_00
|
|
|
|
push 12
|
|
pop edx
|
|
mov esi,1024
|
|
mov eax,esi
|
|
mov ecx,edx
|
|
mov edi,_isRepG2
|
|
rep stosd
|
|
mov ecx,edx
|
|
mov edi,_isRepG1
|
|
rep stosd
|
|
mov ecx,edx
|
|
mov edi,_isRepG0
|
|
rep stosd
|
|
mov ecx,edx
|
|
mov edi,_isRep
|
|
rep stosd
|
|
xor ecx,ecx
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
lea edi,[ecx+_isRep0Long]
|
|
mov eax,esi
|
|
stosd
|
|
stosd
|
|
stosd
|
|
stosd
|
|
lea edi,[ecx+_isMatch]
|
|
mov eax,esi
|
|
stosd
|
|
stosd
|
|
stosd
|
|
add ecx,64
|
|
cmp ecx,768
|
|
stosd
|
|
jl .labl_02
|
|
|
|
mov eax,[_numPrevBits]
|
|
mov ecx,[_numPosBits]
|
|
add ecx,eax
|
|
mov eax,ebx
|
|
shl eax,cl
|
|
test eax,eax
|
|
jbe .labl_04
|
|
|
|
xor edx,edx
|
|
mov ebx,eax
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
mov eax,[_posEncoders]
|
|
lea edi,[edx+eax]
|
|
mov ecx,768
|
|
mov eax,esi
|
|
add edx,3072
|
|
dec ebx
|
|
rep stosd
|
|
jne .labl_03
|
|
;----------------------------------------------------------
|
|
.labl_04:
|
|
mov edi,_posSlotEncoder
|
|
;----------------------------------------------------------
|
|
.labl_05:
|
|
push 6
|
|
pop ecx
|
|
mov eax,edi
|
|
call CBitTreeEncoder_Init
|
|
add edi,1028
|
|
cmp edi,lastPosSlotFillingPos
|
|
jl .labl_05
|
|
|
|
push 114
|
|
mov eax,esi
|
|
pop ecx
|
|
mov edi,_literalEncoder
|
|
mov esi,_lenEncoder
|
|
rep stosd
|
|
call CPriceTableEncoder_Init
|
|
mov esi,_repMatchLenEncoder
|
|
call CPriceTableEncoder_Init
|
|
push 4
|
|
pop ecx
|
|
mov eax,_posAlignEncoder
|
|
call CBitTreeEncoder_Init
|
|
pop edi
|
|
xor eax,eax
|
|
pop esi
|
|
mov byte [_longestMatchWasFound],0
|
|
mov [_optimumEndIndex],eax
|
|
mov [_optimumCurrentIndex],eax
|
|
mov [_additionalOffset],eax
|
|
pop ebx
|
|
ret
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CodeOneBlock:
|
|
sub esp,0x2C
|
|
cmp byte [_finished],0
|
|
push ebx
|
|
push ebp
|
|
push esi
|
|
push edi
|
|
je .labl_01
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
xor al,al
|
|
jmp .labl_28
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov ebp,[nowPos64]
|
|
mov edi,[nowPos64+4]
|
|
mov eax,ebp
|
|
or eax,edi
|
|
mov byte [_finished],1
|
|
mov [esp+52],ebp
|
|
mov [esp+56],edi
|
|
jne .labl_04
|
|
|
|
mov eax,[_streamPos]
|
|
sub eax,[_pos]
|
|
jne .labl_03
|
|
|
|
push 5
|
|
pop esi
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
call RangeEncoder_ShiftLow
|
|
dec esi
|
|
jne .labl_02
|
|
|
|
jmp .labl_00
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
call ReadMatchDistances
|
|
movzx esi,byte [_state]
|
|
mov edx,esi
|
|
shl edx,6
|
|
xor edi,edi
|
|
push edi
|
|
add edx,_isMatch
|
|
call CMyBitEncoder_Encode
|
|
mov al,[esi+LiteralNextStates]
|
|
mov ecx,[_pos]
|
|
mov [_state],al
|
|
mov eax,[_buffer]
|
|
sub eax,[_additionalOffset]
|
|
mov bl,[eax+ecx]
|
|
mov al,[_previousByte]
|
|
mov [esp+24],bl
|
|
push dword [esp+24]
|
|
push edi
|
|
call CState_IsCharState
|
|
imul eax,eax,3072
|
|
add eax,[_posEncoders]
|
|
push eax
|
|
call CLiteralEncoder2_Encode
|
|
dec dword [_additionalOffset]
|
|
xor ebp,ebp
|
|
inc ebp
|
|
mov [_previousByte],bl
|
|
mov [nowPos64],ebp
|
|
mov [nowPos64+4],edi
|
|
;----------------------------------------------------------
|
|
.labl_04:
|
|
mov eax,[_streamPos]
|
|
sub eax,[_pos]
|
|
jne .labl_06
|
|
|
|
push 5
|
|
pop esi
|
|
;----------------------------------------------------------
|
|
.labl_05:
|
|
call RangeEncoder_ShiftLow
|
|
dec esi
|
|
jne .labl_05
|
|
|
|
jmp .labl_00
|
|
;----------------------------------------------------------
|
|
.labl_06:
|
|
lea eax,[esp+20]
|
|
push eax
|
|
lea eax,[esp+20]
|
|
push eax
|
|
mov ebx,ebp
|
|
push ebp
|
|
and ebx,3
|
|
call GetOptimum
|
|
cmp dword [esp+20],1
|
|
jne .labl_09
|
|
|
|
cmp dword [esp+16],0xFFFFFFFF
|
|
jne .labl_09
|
|
|
|
movzx eax,byte [_state]
|
|
shl eax,4
|
|
add eax,ebx
|
|
push 0
|
|
lea edx,[_isMatch+eax*4]
|
|
call CMyBitEncoder_Encode
|
|
mov eax,[_buffer]
|
|
mov esi,[_additionalOffset]
|
|
mov ebx,[_pos]
|
|
sub eax,esi
|
|
mov al,[eax+ebx]
|
|
mov [esp+24],al
|
|
mov al,[_previousByte]
|
|
push ebp
|
|
call CState_IsCharState
|
|
imul eax,eax,3072
|
|
add eax,[_posEncoders]
|
|
cmp byte [_state],7
|
|
push dword [esp+24]
|
|
jb .labl_07
|
|
|
|
mov ecx,[_buffer]
|
|
sub ecx,[_repDistances]
|
|
sub ecx,esi
|
|
mov cl,[ecx+ebx-1]
|
|
mov [esp+52],cl
|
|
push dword [esp+52]
|
|
push eax
|
|
call CLiteralEncoder2_EncodeMatched
|
|
jmp .labl_08
|
|
;----------------------------------------------------------
|
|
.labl_07:
|
|
push eax
|
|
call CLiteralEncoder2_Encode
|
|
;----------------------------------------------------------
|
|
.labl_08:
|
|
movzx eax,byte [_state]
|
|
mov al,[eax+LiteralNextStates]
|
|
mov [_state],al
|
|
mov al,[esp+24]
|
|
jmp .labl_24
|
|
;----------------------------------------------------------
|
|
.labl_09:
|
|
movzx edi,byte [_state]
|
|
mov eax,edi
|
|
shl eax,4
|
|
add eax,ebx
|
|
shl eax,2
|
|
push 1
|
|
lea edx,[eax+_isMatch]
|
|
mov [esp+40],eax
|
|
call CMyBitEncoder_Encode
|
|
cmp dword [esp+16],4
|
|
jnb .labl_17
|
|
|
|
mov esi,edi
|
|
shl esi,2
|
|
push 1
|
|
lea edx,[esi+_isRep]
|
|
call CMyBitEncoder_Encode
|
|
cmp dword [esp+16],0
|
|
lea edx,[esi+_isRepG0]
|
|
jne .labl_10
|
|
|
|
push 0
|
|
call CMyBitEncoder_Encode
|
|
mov edx,[esp+36]
|
|
xor eax,eax
|
|
cmp dword [esp+20],1
|
|
lea edx,[edx+_isRep0Long]
|
|
setne al
|
|
jmp .labl_12
|
|
;----------------------------------------------------------
|
|
.labl_10:
|
|
push 1
|
|
call CMyBitEncoder_Encode
|
|
cmp dword [esp+16],1
|
|
lea edx,[esi+_isRepG1]
|
|
jne .labl_11
|
|
|
|
push 0
|
|
jmp .labl_13
|
|
;----------------------------------------------------------
|
|
.labl_11:
|
|
push 1
|
|
call CMyBitEncoder_Encode
|
|
mov eax,[esp+16]
|
|
add eax,0xFFFFFFFE
|
|
lea edx,[esi+_isRepG2]
|
|
;----------------------------------------------------------
|
|
.labl_12:
|
|
push eax
|
|
;----------------------------------------------------------
|
|
.labl_13:
|
|
call CMyBitEncoder_Encode
|
|
mov eax,[esp+20]
|
|
cmp eax,1
|
|
jne .labl_14
|
|
|
|
mov al,[edi+ShortRepNextStates]
|
|
jmp .labl_15
|
|
;----------------------------------------------------------
|
|
.labl_14:
|
|
add eax,0xFFFFFFFE
|
|
mov esi,_repMatchLenEncoder
|
|
call CPriceTableEncoder_Encode
|
|
mov al,[edi+RepNextStates]
|
|
;----------------------------------------------------------
|
|
.labl_15:
|
|
mov [_state],al
|
|
mov eax,[esp+16]
|
|
mov ecx,[_repDistances+eax*4]
|
|
test eax,eax
|
|
je .labl_23
|
|
;----------------------------------------------------------
|
|
.labl_16:
|
|
dec eax
|
|
mov edx,[_repDistances+eax*4]
|
|
mov [_repDistances+4+eax*4],edx
|
|
jne .labl_16
|
|
|
|
mov [_repDistances],ecx
|
|
jmp .labl_23
|
|
;----------------------------------------------------------
|
|
.labl_17:
|
|
push 0
|
|
lea edx,[_isRep+edi*4]
|
|
call CMyBitEncoder_Encode
|
|
mov al,[edi+MatchNextStates]
|
|
mov edi,[esp+20]
|
|
mov [_state],al
|
|
add edi,0xFFFFFFFE
|
|
mov eax,edi
|
|
mov esi,_lenEncoder
|
|
call CPriceTableEncoder_Encode
|
|
sub dword [esp+16],4
|
|
mov eax,[esp+16]
|
|
call GetPosSlot
|
|
cmp dword [esp+20],6
|
|
mov ebx,eax
|
|
jb .labl_18
|
|
|
|
push 3
|
|
pop edi
|
|
;----------------------------------------------------------
|
|
.labl_18:
|
|
imul edi,edi,1028
|
|
push ebx
|
|
add edi,_posSlotEncoder
|
|
call cm_pr_16
|
|
cmp ebx,4
|
|
jb .labl_21
|
|
|
|
mov esi,[esp+16]
|
|
xor eax,eax
|
|
inc eax
|
|
mov ecx,ebx
|
|
mov edi,ebx
|
|
and edi,eax
|
|
shr ecx,1
|
|
dec ecx
|
|
or edi,2
|
|
shl edi,cl
|
|
sub esi,edi
|
|
cmp ebx,14
|
|
jnb .labl_20
|
|
|
|
mov [esp+32],esi
|
|
mov [esp+28],eax
|
|
test ecx,ecx
|
|
jle .labl_21
|
|
|
|
mov [esp+36],ecx
|
|
;----------------------------------------------------------
|
|
.labl_19:
|
|
mov edx,[esp+28]
|
|
mov esi,[esp+32]
|
|
sub edx,ebx
|
|
add edx,edi
|
|
and esi,1
|
|
push esi
|
|
lea edx,[_numLiteralContextBits+edx*4]
|
|
call CMyBitEncoder_Encode
|
|
mov eax,[esp+28]
|
|
shr dword [esp+32],1
|
|
dec dword [esp+36]
|
|
lea eax,[esi+eax*2]
|
|
mov [esp+28],eax
|
|
jne .labl_19
|
|
|
|
jmp .labl_21
|
|
;----------------------------------------------------------
|
|
.labl_20:
|
|
lea eax,[ecx-4]
|
|
mov ecx,esi
|
|
shr ecx,4
|
|
push ecx
|
|
call RangeEncoder_EncodeDirectBits
|
|
and esi,0xF
|
|
push esi
|
|
call CBitTreeEncoder_ReverseEncode
|
|
dec dword [_alignPriceCount]
|
|
jne .labl_21
|
|
|
|
call FillAlignPrices
|
|
;----------------------------------------------------------
|
|
.labl_21:
|
|
mov eax,_repDistances+12
|
|
;----------------------------------------------------------
|
|
.labl_22:
|
|
mov ecx,[eax-4]
|
|
mov [eax],ecx
|
|
sub eax,4
|
|
cmp eax,_repDistances
|
|
jne .labl_22
|
|
|
|
mov eax,[esp+16]
|
|
mov [_repDistances],eax
|
|
;----------------------------------------------------------
|
|
.labl_23:
|
|
mov eax,[_buffer]
|
|
mov esi,[_additionalOffset]
|
|
mov ebx,[_pos]
|
|
mov ecx,[esp+20]
|
|
mov edi,[nowPos64+4]
|
|
sub eax,esi
|
|
add eax,ebx
|
|
mov al,[eax+ecx-1]
|
|
;----------------------------------------------------------
|
|
.labl_24:
|
|
sub esi,[esp+20]
|
|
add ebp,[esp+20]
|
|
mov [_previousByte],al
|
|
adc edi,0
|
|
mov eax,ebp
|
|
sub eax,[lastPosSlotFillingPos]
|
|
mov ecx,edi
|
|
sbb ecx,[lastPosSlotFillingPos+4]
|
|
mov [_additionalOffset],esi
|
|
mov [nowPos64],ebp
|
|
mov [nowPos64+4],edi
|
|
mov [esp+40],ecx
|
|
jne .labl_25
|
|
|
|
cmp eax,512
|
|
jb .labl_26
|
|
;----------------------------------------------------------
|
|
.labl_25:
|
|
call FillPosSlotPrices
|
|
call FillDistancesPrices
|
|
mov [lastPosSlotFillingPos],ebp
|
|
mov [lastPosSlotFillingPos+4],edi
|
|
;----------------------------------------------------------
|
|
.labl_26:
|
|
test esi,esi
|
|
jne .labl_06
|
|
|
|
mov eax,[_streamPos]
|
|
sub eax,ebx
|
|
je .labl_29
|
|
|
|
mov ecx,ebp
|
|
sub ecx,[esp+52]
|
|
mov eax,edi
|
|
sbb eax,[esp+56]
|
|
test eax,eax
|
|
ja .labl_27
|
|
|
|
jb .labl_06
|
|
|
|
cmp ecx,0x1000
|
|
jb .labl_06
|
|
;----------------------------------------------------------
|
|
.labl_27:
|
|
mov byte [_finished],0
|
|
mov al,1
|
|
;----------------------------------------------------------
|
|
.labl_28:
|
|
pop edi
|
|
pop esi
|
|
pop ebp
|
|
pop ebx
|
|
add esp,44
|
|
ret
|
|
;----------------------------------------------------------
|
|
.labl_29:
|
|
push 5
|
|
pop esi
|
|
;----------------------------------------------------------
|
|
.labl_30:
|
|
call RangeEncoder_ShiftLow
|
|
dec esi
|
|
jne .labl_30
|
|
|
|
jmp .labl_00
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
GetOptimum:
|
|
push ebp
|
|
mov ebp,esp
|
|
mov ecx,[_optimumCurrentIndex]
|
|
sub esp,116
|
|
push esi
|
|
cmp [_optimumEndIndex],ecx
|
|
je .labl_00
|
|
|
|
mov eax,ecx
|
|
imul eax,eax,40
|
|
add eax,state.State
|
|
mov edx,[eax+16]
|
|
mov eax,[eax+20]
|
|
mov esi,edx
|
|
sub esi,ecx
|
|
mov ecx,[ebp+16]
|
|
mov [ecx],esi
|
|
mov ecx,[ebp+12]
|
|
mov [ecx],eax
|
|
mov [_optimumCurrentIndex],edx
|
|
jmp .labl_76
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
push edi
|
|
xor edi,edi
|
|
cmp byte [_longestMatchWasFound],0
|
|
mov [_optimumEndIndex],edi
|
|
mov [_optimumCurrentIndex],edi
|
|
jne .labl_01
|
|
|
|
call ReadMatchDistances
|
|
jmp .labl_02
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov eax,[_longestMatchLength]
|
|
mov byte [_longestMatchWasFound],0
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
push ebx
|
|
mov ebx,[ebp+8]
|
|
mov [ebp-16],eax
|
|
mov eax,ebx
|
|
shl eax,2
|
|
mov [ebp-76],eax
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
mov esi,edi
|
|
shl esi,2
|
|
mov eax,[esi+_repDistances]
|
|
push eax
|
|
mov [ebp+esi-100],eax
|
|
push dword 0xFFFFFFFF
|
|
mov eax,273
|
|
call GetMatchLen
|
|
mov [ebp+esi-116],eax
|
|
test edi,edi
|
|
je .labl_04
|
|
|
|
mov ecx,[ebp-76]
|
|
cmp eax,[ebp+ecx-116]
|
|
jbe .labl_05
|
|
;----------------------------------------------------------
|
|
.labl_04:
|
|
mov ebx,edi
|
|
mov [ebp-76],esi
|
|
;----------------------------------------------------------
|
|
.labl_05:
|
|
inc edi
|
|
cmp edi,4
|
|
jb .labl_03
|
|
|
|
mov eax,[ebp+ebx*4-116]
|
|
mov ecx,128
|
|
mov [ebp-68],eax
|
|
cmp eax,ecx
|
|
jb .labl_06
|
|
|
|
mov ecx,[ebp+12]
|
|
mov [ecx],ebx
|
|
jmp .labl_07
|
|
;----------------------------------------------------------
|
|
.labl_06:
|
|
cmp [ebp-16],ecx
|
|
jb .labl_08
|
|
|
|
mov eax,[distances+512]
|
|
mov ecx,[ebp+12]
|
|
add eax,4
|
|
mov [ecx],eax
|
|
mov eax,[ebp-16]
|
|
;----------------------------------------------------------
|
|
.labl_07:
|
|
mov ecx,[ebp+16]
|
|
mov [ecx],eax
|
|
dec eax
|
|
call MovePos
|
|
jmp .labl_75
|
|
;----------------------------------------------------------
|
|
.labl_08:
|
|
mov ecx,[_buffer]
|
|
mov eax,[_pos]
|
|
mov dl,[eax+ecx-1]
|
|
sub eax,[_repDistances]
|
|
mov bl,[_state]
|
|
mov [state.State],bl
|
|
mov al,[eax+ecx-2]
|
|
mov [ebp-52],al
|
|
mov eax,[ebp+8]
|
|
and eax,3
|
|
movzx ecx,bl
|
|
shl ecx,4
|
|
add ecx,eax
|
|
mov esi,[_isMatch+ecx*4]
|
|
mov [ebp-28],eax
|
|
cmp bl,7
|
|
sbb al,al
|
|
mov [ebp-48],dl
|
|
push dword [ebp-48]
|
|
inc al
|
|
push dword [ebp-52]
|
|
movzx eax,al
|
|
push eax
|
|
push dword [ebp+8]
|
|
mov al,[_previousByte]
|
|
mov [ebp-76],esi
|
|
call CLiteralEncoder_GetPrice
|
|
or dword [state.BackPrev+40],0xFFFFFFFF
|
|
and dword [state.PosPrev+40],0
|
|
shr esi,2
|
|
add eax,[Models+esi*4]
|
|
mov byte [state.Prev1IsChar+40],0
|
|
mov [state.Price+40],eax
|
|
lea esi,[ebp-100]
|
|
mov edi,state.Backs
|
|
movsd
|
|
movsd
|
|
mov eax,2048
|
|
mov ecx,eax
|
|
sub ecx,[ebp-76]
|
|
movsd
|
|
shr ecx,2
|
|
mov edx,[Models+ecx*4]
|
|
movzx ecx,bl
|
|
movsd
|
|
mov esi,[_isRep+ecx*4]
|
|
sub eax,esi
|
|
shr eax,2
|
|
mov edi,[Models+eax*4]
|
|
mov al,[ebp-48]
|
|
add edi,edx
|
|
mov [ebp-76],edx
|
|
cmp [ebp-52],al
|
|
jne .labl_09
|
|
|
|
push dword [ebp-28]
|
|
mov al,bl
|
|
call GetRepLen1Price
|
|
add eax,edi
|
|
cmp eax,[state.Price+40]
|
|
jnb .labl_09
|
|
|
|
and dword [state.BackPrev+40],0
|
|
mov [state.Price+40],eax
|
|
mov byte [state.Prev1IsChar+40],0
|
|
;----------------------------------------------------------
|
|
.labl_09:
|
|
push 2
|
|
pop eax
|
|
cmp [ebp-16],eax
|
|
jnb .labl_10
|
|
|
|
mov eax,[ebp+12]
|
|
mov ecx,[state.BackPrev+40]
|
|
mov [eax],ecx
|
|
mov eax,[ebp+16]
|
|
mov dword [eax],1
|
|
jmp .labl_75
|
|
;----------------------------------------------------------
|
|
.labl_10:
|
|
mov ecx,[ebp-16]
|
|
shr esi,2
|
|
mov esi,[Models+esi*4]
|
|
add esi,[ebp-76]
|
|
mov [ebp-76],esi
|
|
cmp ecx,[ebp-68]
|
|
ja .labl_11
|
|
|
|
and dword [ebp-16],0
|
|
;----------------------------------------------------------
|
|
.labl_11:
|
|
mov [ebp-24],eax
|
|
cmp [ebp-16],eax
|
|
jb .labl_13
|
|
|
|
mov esi,state.BackPrev+40*2
|
|
;----------------------------------------------------------
|
|
.labl_12:
|
|
mov eax,[ebp-24]
|
|
mov edx,[distances+eax*4]
|
|
push dword [ebp-28]
|
|
and dword [esi-4],0
|
|
lea ecx,[edx+4]
|
|
mov [esi],ecx
|
|
call GetPosLenPrice
|
|
add eax,[ebp-76]
|
|
inc dword [ebp-24]
|
|
mov [esi-8],eax
|
|
mov eax,[ebp-24]
|
|
mov byte [esi-19],0
|
|
add esi,40
|
|
cmp eax,[ebp-16]
|
|
jbe .labl_12
|
|
;----------------------------------------------------------
|
|
.labl_13:
|
|
mov ecx,[ebp-16]
|
|
cmp ecx,[ebp-68]
|
|
jnb .labl_14
|
|
|
|
mov ecx,[ebp-68]
|
|
mov [ebp-16],ecx
|
|
;----------------------------------------------------------
|
|
.labl_14:
|
|
cmp [ebp-24],ecx
|
|
ja .labl_16
|
|
|
|
mov eax,[ebp-24]
|
|
sub ecx,[ebp-24]
|
|
imul eax,eax,40
|
|
add eax,state.Price
|
|
inc ecx
|
|
;----------------------------------------------------------
|
|
.labl_15:
|
|
mov dword [eax],kIfinityPrice
|
|
add eax,40
|
|
dec ecx
|
|
jne .labl_15
|
|
;----------------------------------------------------------
|
|
.labl_16:
|
|
and dword [ebp-24],0
|
|
;----------------------------------------------------------
|
|
.labl_17:
|
|
mov eax,[ebp-24]
|
|
mov eax,[ebp+eax*4-116]
|
|
push 2
|
|
pop ecx
|
|
mov [ebp-32],ecx
|
|
cmp eax,ecx
|
|
jb .labl_20
|
|
|
|
mov esi,state.Price+40*2
|
|
;----------------------------------------------------------
|
|
.labl_18:
|
|
push dword [ebp-28]
|
|
mov edx,[ebp-24]
|
|
movzx eax,bl
|
|
push eax
|
|
mov eax,[ebp-32]
|
|
call GetRepPrice
|
|
add eax,edi
|
|
cmp eax,[esi]
|
|
jnb .labl_19
|
|
|
|
and dword [esi+4],0
|
|
mov [esi],eax
|
|
mov eax,[ebp-24]
|
|
mov [esi+8],eax
|
|
mov byte [esi-11],0
|
|
;----------------------------------------------------------
|
|
.labl_19:
|
|
inc dword [ebp-32]
|
|
mov eax,[ebp-24]
|
|
mov ecx,[ebp-32]
|
|
add esi,40
|
|
cmp ecx,[ebp+eax*4-116]
|
|
jbe .labl_18
|
|
;----------------------------------------------------------
|
|
.labl_20:
|
|
inc dword [ebp-24]
|
|
cmp dword [ebp-24],4
|
|
jb .labl_17
|
|
|
|
mov eax,[ebp-16]
|
|
xor ecx,ecx
|
|
inc ecx
|
|
mov [ebp-8],eax
|
|
mov [ebp-12],ecx
|
|
cmp eax,ecx
|
|
je .labl_74
|
|
;----------------------------------------------------------
|
|
.labl_21:
|
|
mov edi,[ebp-12]
|
|
inc dword [ebp+8]
|
|
mov ebx,edi
|
|
imul ebx,ebx,40
|
|
mov dl,[ebx+state.Prev1IsChar]
|
|
mov esi,[ebx+state.PosPrev]
|
|
test dl,dl
|
|
je .labl_25
|
|
|
|
dec esi
|
|
cmp byte [ebx+state.Prev2],0
|
|
je .labl_23
|
|
|
|
mov eax,[ebx+state.PosPrev2]
|
|
imul eax,eax,40
|
|
cmp dword [ebx+state.BackPrev2],4
|
|
mov al,[eax+state.State]
|
|
movzx eax,al
|
|
jnb .labl_22
|
|
|
|
mov al,[eax+RepNextStates]
|
|
jmp .labl_24
|
|
;----------------------------------------------------------
|
|
.labl_22:
|
|
mov al,[eax+MatchNextStates]
|
|
jmp .labl_24
|
|
;----------------------------------------------------------
|
|
.labl_23:
|
|
mov eax,esi
|
|
imul eax,eax,40
|
|
mov al,[eax+state.State]
|
|
;----------------------------------------------------------
|
|
.labl_24:
|
|
movzx eax,al
|
|
mov cl,[eax+LiteralNextStates]
|
|
jmp .labl_26
|
|
;----------------------------------------------------------
|
|
.labl_25:
|
|
mov eax,esi
|
|
imul eax,eax,40
|
|
mov cl,[eax+state.State]
|
|
;----------------------------------------------------------
|
|
.labl_26:
|
|
dec edi
|
|
cmp esi,edi
|
|
jne .labl_29
|
|
|
|
cmp dword [ebx+state.BackPrev],0
|
|
movzx eax,cl
|
|
jne .labl_27
|
|
|
|
mov al,[eax+ShortRepNextStates]
|
|
jmp .labl_28
|
|
;----------------------------------------------------------
|
|
.labl_27:
|
|
mov al,[eax+LiteralNextStates]
|
|
;----------------------------------------------------------
|
|
.labl_28:
|
|
mov [ebp-20],al
|
|
jmp .labl_35
|
|
;----------------------------------------------------------
|
|
.labl_29:
|
|
test dl,dl
|
|
je .labl_31
|
|
|
|
cmp byte [ebx+state.Prev2],0
|
|
je .labl_31
|
|
|
|
mov esi,[ebx+state.PosPrev2]
|
|
mov eax,[ebx+state.BackPrev2]
|
|
movzx ecx,cl
|
|
;----------------------------------------------------------
|
|
.labl_30:
|
|
mov cl,[ecx+RepNextStates]
|
|
jmp .labl_32
|
|
;----------------------------------------------------------
|
|
.labl_31:
|
|
mov eax,[ebx+state.BackPrev]
|
|
movzx ecx,cl
|
|
cmp eax,4
|
|
jb .labl_30
|
|
|
|
mov cl,[ecx+MatchNextStates]
|
|
;----------------------------------------------------------
|
|
.labl_32:
|
|
imul esi,esi,40
|
|
add esi,state.State
|
|
mov [ebp-20],cl
|
|
mov edx,esi
|
|
cmp eax,4
|
|
jnb .labl_34
|
|
|
|
mov ecx,[edx+eax*4+24]
|
|
xor esi,esi
|
|
inc esi
|
|
mov [ebp-100],ecx
|
|
cmp eax,esi
|
|
jb .labl_33
|
|
|
|
lea esi,[edx+24]
|
|
mov ecx,eax
|
|
lea edi,[ebp-96]
|
|
rep movsd
|
|
lea esi,[eax+1]
|
|
cmp esi,4
|
|
jnb .labl_35
|
|
;----------------------------------------------------------
|
|
.labl_33:
|
|
push 4
|
|
lea edx,[edx+esi*4+24]
|
|
pop ecx
|
|
lea edi,[ebp+esi*4-100]
|
|
sub ecx,esi
|
|
mov esi,edx
|
|
rep movsd
|
|
jmp .labl_35
|
|
;----------------------------------------------------------
|
|
.labl_34:
|
|
add eax,0xFFFFFFFC
|
|
mov [ebp-100],eax
|
|
lea esi,[edx+24]
|
|
lea edi,[ebp-96]
|
|
movsd
|
|
movsd
|
|
movsd
|
|
;----------------------------------------------------------
|
|
.labl_35:
|
|
mov al,[ebp-20]
|
|
mov [ebx+state.State],al
|
|
lea edi,[ebx+state.Backs]
|
|
lea esi,[ebp-100]
|
|
movsd
|
|
movsd
|
|
movsd
|
|
movsd
|
|
call ReadMatchDistances
|
|
mov [ebp-44],eax
|
|
cmp eax,128
|
|
jnb .labl_73
|
|
|
|
mov eax,[ebx+state.Price]
|
|
mov edi,[_pos]
|
|
mov esi,[ebp+8]
|
|
mov [ebp-72],eax
|
|
mov eax,[_buffer]
|
|
lea eax,[edi+eax-1]
|
|
mov cl,[eax]
|
|
mov [ebp-48],cl
|
|
push dword [ebp-48]
|
|
mov ecx,eax
|
|
sub ecx,[ebp-100]
|
|
and esi,3
|
|
mov cl,[ecx-1]
|
|
mov [ebp-52],cl
|
|
movzx ecx,byte [ebp-20]
|
|
push dword [ebp-52]
|
|
mov [ebp-64],ecx
|
|
shl ecx,4
|
|
add ecx,esi
|
|
mov ecx,[_isMatch+ecx*4]
|
|
cmp byte [ebp-20],7
|
|
mov [ebp-76],ecx
|
|
sbb cl,cl
|
|
inc cl
|
|
movzx ecx,cl
|
|
push ecx
|
|
push dword [ebp+8]
|
|
mov [ebp-40],eax
|
|
mov al,[eax-1]
|
|
mov [ebp-28],esi
|
|
call CLiteralEncoder_GetPrice
|
|
mov esi,eax
|
|
mov eax,[ebp-76]
|
|
shr eax,2
|
|
add esi,[Models+eax*4]
|
|
mov byte [ebp-1],0
|
|
add esi,[ebp-72]
|
|
cmp esi,[ebx+state.Price+40]
|
|
jnb .labl_36
|
|
|
|
mov eax,[ebp-12]
|
|
or dword [ebx+state.BackPrev+40],0xFFFFFFFF
|
|
mov [ebx+state.Price+40],esi
|
|
mov [ebx+state.PosPrev+40],eax
|
|
mov byte [ebx+state.Prev1IsChar+40],0
|
|
mov byte [ebp-1],1
|
|
;----------------------------------------------------------
|
|
.labl_36:
|
|
mov edx,[ebp-64]
|
|
mov edx,[_isRep+edx*4]
|
|
mov ecx,2048
|
|
mov eax,ecx
|
|
sub eax,[ebp-76]
|
|
sub ecx,edx
|
|
shr eax,2
|
|
mov eax,[Models+eax*4]
|
|
add eax,[ebp-72]
|
|
shr ecx,2
|
|
mov ecx,[Models+ecx*4]
|
|
add ecx,eax
|
|
mov [ebp-76],eax
|
|
mov al,[ebp-48]
|
|
mov [ebp-84],edx
|
|
mov [ebp-72],ecx
|
|
cmp [ebp-52],al
|
|
jne .labl_38
|
|
|
|
mov eax,[ebp-12]
|
|
cmp [ebx+state.PosPrev+40],eax
|
|
jnb .labl_37
|
|
|
|
cmp dword [ebx+state.BackPrev+40],0
|
|
je .labl_38
|
|
;----------------------------------------------------------
|
|
.labl_37:
|
|
push dword [ebp-28]
|
|
mov al,[ebp-20]
|
|
call GetRepLen1Price
|
|
add eax,[ebp-72]
|
|
cmp eax,[ebx+state.Price+40]
|
|
ja .labl_38
|
|
|
|
and dword [ebx+state.BackPrev+40],0
|
|
mov [ebx+state.Price+40],eax
|
|
mov eax,[ebp-12]
|
|
mov [ebx+state.PosPrev+40],eax
|
|
mov byte [ebx+state.Prev1IsChar+40],0
|
|
;----------------------------------------------------------
|
|
.labl_38:
|
|
mov eax,[_streamPos]
|
|
sub eax,edi
|
|
mov ecx,4095
|
|
sub ecx,[ebp-12]
|
|
inc eax
|
|
mov [ebp-56],eax
|
|
cmp eax,ecx
|
|
jbe .labl_39
|
|
|
|
mov eax,ecx
|
|
mov [ebp-56],ecx
|
|
;----------------------------------------------------------
|
|
.labl_39:
|
|
mov [ebp-36],eax
|
|
cmp eax,2
|
|
jb .labl_72
|
|
|
|
mov ecx,128
|
|
cmp eax,ecx
|
|
jbe .labl_40
|
|
|
|
mov [ebp-36],ecx
|
|
;----------------------------------------------------------
|
|
.labl_40:
|
|
cmp dword [ebp-36],3
|
|
jb .labl_45
|
|
|
|
cmp byte [ebp-1],0
|
|
jne .labl_45
|
|
|
|
mov ecx,[ebp-100]
|
|
xor eax,eax
|
|
inc eax
|
|
inc ecx
|
|
cmp [ebp-36],eax
|
|
jbe .labl_42
|
|
|
|
mov edi,[ebp-40]
|
|
mov edx,edi
|
|
sub edx,ecx
|
|
;----------------------------------------------------------
|
|
.labl_41:
|
|
mov cl,[eax+edi]
|
|
cmp cl,[edx+eax]
|
|
jne .labl_42
|
|
|
|
inc eax
|
|
cmp eax,[ebp-36]
|
|
jb .labl_41
|
|
;----------------------------------------------------------
|
|
.labl_42:
|
|
dec eax
|
|
mov [ebp-32],eax
|
|
cmp eax,2
|
|
jb .labl_45
|
|
|
|
mov eax,[ebp-64]
|
|
mov al,[eax+LiteralNextStates]
|
|
mov ecx,[ebp+8]
|
|
movzx edx,al
|
|
mov [ebp-60],al
|
|
mov eax,edx
|
|
shl eax,4
|
|
inc ecx
|
|
mov edi,2048
|
|
and ecx,3
|
|
add eax,ecx
|
|
mov ebx,edi
|
|
sub ebx,[_isMatch+eax*4]
|
|
mov eax,edi
|
|
sub eax,[_isRep+edx*4]
|
|
mov edx,[ebp-12]
|
|
shr ebx,2
|
|
mov edi,[Models+ebx*4]
|
|
shr eax,2
|
|
add edi,[Models+eax*4]
|
|
mov eax,[ebp-32]
|
|
add edi,esi
|
|
lea esi,[edx+eax]
|
|
mov eax,[ebp-8]
|
|
lea edx,[esi+1]
|
|
cmp eax,edx
|
|
jnb .labl_44
|
|
|
|
sub edx,[ebp-8]
|
|
imul eax,eax,40
|
|
add eax,state.Price
|
|
add [ebp-8],edx
|
|
;----------------------------------------------------------
|
|
.labl_43:
|
|
add eax,40
|
|
dec edx
|
|
mov dword [eax],kIfinityPrice
|
|
jne .labl_43
|
|
;----------------------------------------------------------
|
|
.labl_44:
|
|
mov eax,[ebp-32]
|
|
push ecx
|
|
push dword [ebp-60]
|
|
xor edx,edx
|
|
call GetRepPrice
|
|
imul esi,esi,40
|
|
add eax,edi
|
|
add esi,state.State+40
|
|
cmp eax,[esi+12]
|
|
jnb .labl_45
|
|
|
|
mov [esi+12],eax
|
|
mov eax,[ebp-12]
|
|
inc eax
|
|
and dword [esi+20],0
|
|
mov [esi+16],eax
|
|
mov byte [esi+1],1
|
|
mov byte [esi+2],0
|
|
;----------------------------------------------------------
|
|
.labl_45:
|
|
and dword [ebp-24],0
|
|
;----------------------------------------------------------
|
|
.labl_46:
|
|
mov eax,[ebp-24]
|
|
mov eax,[ebp+eax*4-100]
|
|
mov edx,[ebp-40]
|
|
inc eax
|
|
mov ecx,edx
|
|
sub ecx,eax
|
|
mov [ebp-68],eax
|
|
mov al,[edx]
|
|
mov [ebp-80],ecx
|
|
cmp al,[ecx]
|
|
jne .labl_58
|
|
|
|
mov al,[edx+1]
|
|
cmp al,[ecx+1]
|
|
jne .labl_58
|
|
|
|
push 2
|
|
pop esi
|
|
cmp [ebp-36],esi
|
|
jbe .labl_48
|
|
;----------------------------------------------------------
|
|
.labl_47:
|
|
mov al,[edx+esi]
|
|
cmp al,[ecx+esi]
|
|
jne .labl_48
|
|
|
|
inc esi
|
|
cmp esi,[ebp-36]
|
|
jb .labl_47
|
|
;----------------------------------------------------------
|
|
.labl_48:
|
|
mov eax,[ebp-12]
|
|
lea ebx,[eax+esi]
|
|
mov [ebp-32],ebx
|
|
imul ebx,ebx,40
|
|
mov edi,esi
|
|
add ebx,state.Price
|
|
;----------------------------------------------------------
|
|
.labl_49:
|
|
mov eax,[ebp-8]
|
|
mov ecx,[ebp-32]
|
|
cmp eax,ecx
|
|
jnb .labl_51
|
|
|
|
sub ecx,[ebp-8]
|
|
imul eax,eax,40
|
|
add eax,state.Price
|
|
add [ebp-8],ecx
|
|
;----------------------------------------------------------
|
|
.labl_50:
|
|
add eax,40
|
|
dec ecx
|
|
mov dword [eax],kIfinityPrice
|
|
jne .labl_50
|
|
;----------------------------------------------------------
|
|
.labl_51:
|
|
push dword [ebp-28]
|
|
mov edx,[ebp-24]
|
|
push dword [ebp-20]
|
|
mov eax,esi
|
|
call GetRepPrice
|
|
add eax,[ebp-72]
|
|
cmp eax,[ebx]
|
|
jnb .labl_52
|
|
|
|
mov [ebx],eax
|
|
mov eax,[ebp-12]
|
|
mov [ebx+4],eax
|
|
mov eax,[ebp-24]
|
|
mov [ebx+8],eax
|
|
mov byte [ebx-11],0
|
|
;----------------------------------------------------------
|
|
.labl_52:
|
|
dec esi
|
|
sub ebx,40
|
|
dec dword [ebp-32]
|
|
cmp esi,2
|
|
jnb .labl_49
|
|
|
|
lea eax,[edi+1]
|
|
lea esi,[eax+128]
|
|
cmp esi,[ebp-56]
|
|
jbe .labl_53
|
|
|
|
mov esi,[ebp-56]
|
|
;----------------------------------------------------------
|
|
.labl_53:
|
|
cmp eax,esi
|
|
jnb .labl_55
|
|
|
|
mov edx,[ebp-40]
|
|
mov ecx,eax
|
|
sub ecx,[ebp-68]
|
|
add ecx,edx
|
|
;----------------------------------------------------------
|
|
.labl_54:
|
|
mov bl,[eax+edx]
|
|
cmp bl,[ecx]
|
|
jne .labl_55
|
|
|
|
inc eax
|
|
inc ecx
|
|
cmp eax,esi
|
|
jb .labl_54
|
|
;----------------------------------------------------------
|
|
.labl_55:
|
|
or ecx,0xFFFFFFFF
|
|
sub ecx,edi
|
|
add eax,ecx
|
|
mov [ebp-16],eax
|
|
cmp eax,2
|
|
jb .labl_58
|
|
|
|
mov eax,[ebp-64]
|
|
mov al,[eax+RepNextStates]
|
|
mov edx,[ebp+8]
|
|
movzx eax,al
|
|
mov ebx,eax
|
|
mov al,[eax+LiteralNextStates]
|
|
lea ecx,[edi+edx]
|
|
mov [ebp-60],al
|
|
movzx eax,al
|
|
mov esi,ecx
|
|
and esi,3
|
|
shl ebx,4
|
|
add esi,ebx
|
|
mov esi,[_isMatch+esi*4]
|
|
lea ebx,[edi+edx+1]
|
|
mov [ebp-32],eax
|
|
mov eax,[ebp-40]
|
|
movzx edx,byte [edi+eax]
|
|
mov al,[eax+edi-1]
|
|
push edx
|
|
mov edx,[ebp-80]
|
|
movzx edx,byte [edx+edi]
|
|
push edx
|
|
shr esi,2
|
|
mov esi,[Models+esi*4]
|
|
push 1
|
|
push ecx
|
|
mov [ebp-68],esi
|
|
and ebx,3
|
|
call CLiteralEncoder_GetPrice
|
|
push dword [ebp-28]
|
|
mov edx,[ebp-24]
|
|
push dword [ebp-20]
|
|
mov esi,eax
|
|
mov eax,edi
|
|
call GetRepPrice
|
|
mov ecx,[ebp-32]
|
|
add esi,eax
|
|
shl ecx,4
|
|
add ecx,ebx
|
|
mov eax,2048
|
|
mov edx,eax
|
|
sub edx,[_isMatch+ecx*4]
|
|
mov ecx,[ebp-32]
|
|
sub eax,[_isRep+ecx*4]
|
|
mov ecx,[ebp-12]
|
|
shr edx,2
|
|
add esi,[Models+edx*4]
|
|
shr eax,2
|
|
add esi,[Models+eax*4]
|
|
mov eax,[ebp-16]
|
|
add esi,[ebp-68]
|
|
lea eax,[eax+edi+1]
|
|
add esi,[ebp-72]
|
|
add eax,ecx
|
|
mov [ebp-68],eax
|
|
cmp [ebp-8],eax
|
|
jnb .labl_57
|
|
|
|
mov eax,[ebp-8]
|
|
mov ecx,[ebp-68]
|
|
imul eax,eax,40
|
|
sub ecx,[ebp-8]
|
|
add eax,state.Price
|
|
add [ebp-8],ecx
|
|
;----------------------------------------------------------
|
|
.labl_56:
|
|
add eax,40
|
|
dec ecx
|
|
mov dword [eax],kIfinityPrice
|
|
jne .labl_56
|
|
;----------------------------------------------------------
|
|
.labl_57:
|
|
mov eax,[ebp-16]
|
|
push ebx
|
|
push dword [ebp-60]
|
|
xor edx,edx
|
|
call GetRepPrice
|
|
mov ecx,[ebp-68]
|
|
imul ecx,ecx,40
|
|
add eax,esi
|
|
add ecx,state.State
|
|
cmp eax,[ecx+12]
|
|
jnb .labl_58
|
|
|
|
and dword [ecx+20],0
|
|
mov [ecx+12],eax
|
|
mov eax,[ebp-12]
|
|
lea edx,[edi+eax+1]
|
|
mov [ecx+4],eax
|
|
mov eax,[ebp-24]
|
|
mov [ecx+16],edx
|
|
mov byte [ecx+1],1
|
|
mov byte [ecx+2],1
|
|
mov [ecx+8],eax
|
|
;----------------------------------------------------------
|
|
.labl_58:
|
|
inc dword [ebp-24]
|
|
cmp dword [ebp-24],4
|
|
jb .labl_46
|
|
|
|
mov eax,[ebp-36]
|
|
cmp [ebp-44],eax
|
|
jbe .labl_59
|
|
|
|
mov [ebp-44],eax
|
|
;----------------------------------------------------------
|
|
.labl_59:
|
|
cmp dword [ebp-44],2
|
|
jb .labl_72
|
|
|
|
mov esi,[ebp-44]
|
|
cmp esi,2
|
|
jne .labl_60
|
|
|
|
cmp dword [distances+8],0x80
|
|
jnb .labl_72
|
|
;----------------------------------------------------------
|
|
.labl_60:
|
|
mov eax,[ebp-84]
|
|
shr eax,2
|
|
mov eax,[Models+eax*4]
|
|
add eax,[ebp-76]
|
|
mov [ebp-76],eax
|
|
mov eax,[ebp-12]
|
|
lea ecx,[esi+eax]
|
|
cmp [ebp-8],ecx
|
|
jnb .labl_62
|
|
|
|
mov eax,[ebp-8]
|
|
imul eax,eax,40
|
|
mov edx,ecx
|
|
sub edx,[ebp-8]
|
|
add eax,state.Price
|
|
add [ebp-8],edx
|
|
;----------------------------------------------------------
|
|
.labl_61:
|
|
add eax,40
|
|
dec edx
|
|
mov dword [eax],kIfinityPrice
|
|
jne .labl_61
|
|
;----------------------------------------------------------
|
|
.labl_62:
|
|
imul ecx,ecx,40
|
|
add ecx,state.Price
|
|
lea eax,[distances+4+esi*4]
|
|
lea edi,[esi+1]
|
|
mov [ebp-36],eax
|
|
mov ebx,ecx
|
|
mov [ebp-72],ecx
|
|
;----------------------------------------------------------
|
|
.labl_63:
|
|
mov eax,[ebp-36]
|
|
mov esi,[eax-4]
|
|
push dword [ebp-28]
|
|
lea eax,[edi-1]
|
|
mov edx,esi
|
|
call GetPosLenPrice
|
|
add eax,[ebp-76]
|
|
mov [ebp-80],eax
|
|
cmp eax,[ebx]
|
|
jnb .labl_64
|
|
|
|
mov [ebx],eax
|
|
mov eax,[ebp-12]
|
|
mov [ebx+4],eax
|
|
lea eax,[esi+4]
|
|
mov [ebx+8],eax
|
|
mov byte [ebx-11],0
|
|
;----------------------------------------------------------
|
|
.labl_64:
|
|
lea eax,[edi-1]
|
|
cmp eax,[ebp-44]
|
|
je .labl_65
|
|
|
|
mov eax,[ebp-36]
|
|
cmp esi,[eax]
|
|
je .labl_71
|
|
;----------------------------------------------------------
|
|
.labl_65:
|
|
inc esi
|
|
lea ecx,[edi+128]
|
|
mov [ebp-68],esi
|
|
mov [ebp-16],edi
|
|
cmp ecx,[ebp-56]
|
|
jbe .labl_66
|
|
|
|
mov ecx,[ebp-56]
|
|
;----------------------------------------------------------
|
|
.labl_66:
|
|
cmp edi,ecx
|
|
jnb .labl_68
|
|
|
|
mov eax,edi
|
|
sub eax,esi
|
|
add eax,[ebp-40]
|
|
;----------------------------------------------------------
|
|
.labl_67:
|
|
mov edx,[ebp-16]
|
|
mov esi,[ebp-40]
|
|
mov dl,[edx+esi]
|
|
cmp dl,[eax]
|
|
jne .labl_68
|
|
|
|
inc dword [ebp-16]
|
|
inc eax
|
|
cmp [ebp-16],ecx
|
|
jb .labl_67
|
|
;----------------------------------------------------------
|
|
.labl_68:
|
|
or ecx,0xFFFFFFFF
|
|
lea eax,[edi-1]
|
|
sub ecx,eax
|
|
add [ebp-16],ecx
|
|
cmp dword [ebp-16],2
|
|
jb .labl_71
|
|
|
|
mov eax,[ebp-64]
|
|
mov al,[eax+MatchNextStates]
|
|
mov ecx,[ebp+8]
|
|
movzx eax,al
|
|
mov esi,eax
|
|
mov al,[eax+LiteralNextStates]
|
|
lea edx,[edi+ecx-1]
|
|
mov [ebp-60],al
|
|
movzx eax,al
|
|
shl esi,4
|
|
mov ebx,edx
|
|
and ebx,3
|
|
add esi,ebx
|
|
mov esi,[_isMatch+esi*4]
|
|
lea ebx,[edi+ecx]
|
|
mov [ebp-32],eax
|
|
mov eax,[ebp-40]
|
|
movzx ecx,byte [edi+eax-1]
|
|
push ecx
|
|
mov ecx,edi
|
|
sub ecx,[ebp-68]
|
|
shr esi,2
|
|
movzx ecx,byte [ecx+eax-1]
|
|
mov esi,[Models+esi*4]
|
|
mov al,[edi+eax-2]
|
|
push ecx
|
|
push 1
|
|
push edx
|
|
mov [ebp-84],esi
|
|
and ebx,3
|
|
call CLiteralEncoder_GetPrice
|
|
mov ecx,[ebp-32]
|
|
mov esi,eax
|
|
shl ecx,4
|
|
add ecx,ebx
|
|
mov eax,2048
|
|
mov edx,eax
|
|
sub edx,[_isMatch+ecx*4]
|
|
mov ecx,[ebp-32]
|
|
sub eax,[_isRep+ecx*4]
|
|
mov ecx,[ebp-12]
|
|
shr edx,2
|
|
add esi,[Models+edx*4]
|
|
shr eax,2
|
|
add esi,[Models+eax*4]
|
|
mov eax,[ebp-16]
|
|
add esi,[ebp-84]
|
|
add eax,edi
|
|
add esi,[ebp-80]
|
|
add eax,ecx
|
|
mov [ebp-32],eax
|
|
cmp [ebp-8],eax
|
|
jnb .labl_70
|
|
|
|
mov eax,[ebp-8]
|
|
mov ecx,[ebp-32]
|
|
imul eax,eax,40
|
|
sub ecx,[ebp-8]
|
|
add eax,state.Price
|
|
add [ebp-8],ecx
|
|
;----------------------------------------------------------
|
|
.labl_69:
|
|
add eax,40
|
|
dec ecx
|
|
mov dword [eax],kIfinityPrice
|
|
jne .labl_69
|
|
;----------------------------------------------------------
|
|
.labl_70:
|
|
mov eax,[ebp-16]
|
|
push ebx
|
|
push dword [ebp-60]
|
|
xor edx,edx
|
|
call GetRepPrice
|
|
mov ecx,[ebp-32]
|
|
mov ebx,[ebp-72]
|
|
imul ecx,ecx,40
|
|
add eax,esi
|
|
add ecx,state.State
|
|
cmp eax,[ecx+12]
|
|
jnb .labl_71
|
|
|
|
and dword [ecx+20],0
|
|
mov [ecx+12],eax
|
|
mov eax,[ebp-12]
|
|
lea edx,[edi+eax]
|
|
mov [ecx+4],eax
|
|
mov eax,[ebp-68]
|
|
add eax,3
|
|
mov [ecx+16],edx
|
|
mov byte [ecx+1],1
|
|
mov byte [ecx+2],1
|
|
mov [ecx+8],eax
|
|
;----------------------------------------------------------
|
|
.labl_71:
|
|
sub dword [ebp-36],4
|
|
sub ebx,40
|
|
dec edi
|
|
lea eax,[edi-1]
|
|
mov [ebp-72],ebx
|
|
cmp eax,2
|
|
jnb .labl_63
|
|
;----------------------------------------------------------
|
|
.labl_72:
|
|
inc dword [ebp-12]
|
|
mov eax,[ebp-12]
|
|
cmp eax,[ebp-8]
|
|
jne .labl_21
|
|
|
|
jmp .labl_74
|
|
;----------------------------------------------------------
|
|
.labl_73:
|
|
mov eax,[ebp-44]
|
|
mov [_longestMatchLength],eax
|
|
mov byte [_longestMatchWasFound],1
|
|
;----------------------------------------------------------
|
|
.labl_74:
|
|
push dword [ebp-12]
|
|
push dword [ebp+12]
|
|
call Backward
|
|
mov ecx,[ebp+16]
|
|
mov [ecx],eax
|
|
;----------------------------------------------------------
|
|
.labl_75:
|
|
pop ebx
|
|
pop edi
|
|
;----------------------------------------------------------
|
|
.labl_76:
|
|
pop esi
|
|
leave
|
|
ret 12
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CLiteralEncoder2_EncodeMatched:
|
|
push ebp
|
|
mov ebp,esp
|
|
push ecx
|
|
push ebx
|
|
push esi
|
|
xor ebx,ebx
|
|
push edi
|
|
inc ebx
|
|
mov dword [ebp-4],8
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
dec dword [ebp-4]
|
|
movzx ecx,byte [ebp-4]
|
|
movzx esi,byte [ebp+12]
|
|
movzx edi,byte [ebp+16]
|
|
shr esi,cl
|
|
shr edi,cl
|
|
mov ecx,[ebp+8]
|
|
and esi,1
|
|
lea eax,[esi+1]
|
|
shl eax,8
|
|
add eax,ebx
|
|
and edi,1
|
|
push edi
|
|
lea edx,[ecx+eax*4]
|
|
call CMyBitEncoder_Encode
|
|
add ebx,ebx
|
|
or ebx,edi
|
|
cmp esi,edi
|
|
jne .labl_02
|
|
|
|
cmp dword [ebp-4],0
|
|
jne .labl_00
|
|
|
|
jmp .labl_03
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
dec dword [ebp-4]
|
|
movzx esi,byte [ebp+16]
|
|
mov cl,[ebp-4]
|
|
mov eax,[ebp+8]
|
|
shr esi,cl
|
|
lea edx,[eax+ebx*4]
|
|
and esi,1
|
|
push esi
|
|
call CMyBitEncoder_Encode
|
|
add ebx,ebx
|
|
or ebx,esi
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
cmp dword [ebp-4],0
|
|
jne .labl_01
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
leave
|
|
ret 12
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
RangeEncoder_EncodeDirectBits:
|
|
push esi
|
|
mov esi,eax
|
|
jmp .labl_02
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov eax,[esp+8]
|
|
shr dword [_range],1
|
|
dec esi
|
|
mov ecx,esi
|
|
shr eax,cl
|
|
test al,1
|
|
je .labl_01
|
|
|
|
mov eax,[_range]
|
|
add [low],eax
|
|
adc dword [low+4],0
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
cmp dword [_range],0x1000000
|
|
jnb .labl_02
|
|
|
|
shl dword [_range],8
|
|
call RangeEncoder_ShiftLow
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
test esi,esi
|
|
jne .labl_00
|
|
|
|
pop esi
|
|
ret 4
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CBitTreeEncoder_ReverseEncode:
|
|
push esi
|
|
xor esi,esi
|
|
push edi
|
|
mov edi,[i_01]
|
|
inc esi
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov eax,[esp+12]
|
|
and eax,1
|
|
lea edx,[_posAlignEncoder+esi*4]
|
|
push eax
|
|
lea esi,[eax+esi*2]
|
|
call CMyBitEncoder_Encode
|
|
shr dword [esp+12],1
|
|
dec edi
|
|
jne .labl_00
|
|
|
|
pop edi
|
|
pop esi
|
|
ret 4
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
MovePos:
|
|
push esi
|
|
mov esi,eax
|
|
test esi,esi
|
|
je .labl_01
|
|
|
|
add [_additionalOffset],esi
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
dec esi
|
|
call lz_cm_09
|
|
call MatchFinder_MovePos
|
|
test esi,esi
|
|
jne .labl_00
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
pop esi
|
|
ret
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
Backward:
|
|
push ebp
|
|
mov ebp,esp
|
|
push ecx
|
|
mov ecx,[ebp+12]
|
|
mov eax,ecx
|
|
imul eax,eax,40
|
|
mov edx,[eax+state.PosPrev]
|
|
mov eax,[eax+state.BackPrev]
|
|
push ebx
|
|
push esi
|
|
mov [_optimumEndIndex],ecx
|
|
mov [ebp-4],eax
|
|
push edi
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
imul ecx,ecx,40
|
|
cmp byte [ecx+state.Prev1IsChar],0
|
|
je .labl_01
|
|
|
|
mov eax,edx
|
|
imul eax,eax,40
|
|
or dword [eax+state.BackPrev],0xFFFFFFFF
|
|
lea esi,[eax+state.Prev1IsChar]
|
|
lea edi,[eax+state.PosPrev]
|
|
lea ebx,[edx-1]
|
|
mov byte [esi],0
|
|
mov [edi],ebx
|
|
cmp byte [ecx+state.Prev2],0
|
|
je .labl_01
|
|
|
|
mov byte [esi-40],0
|
|
mov esi,[ecx+state.PosPrev2]
|
|
mov [edi-40],esi
|
|
mov ecx,[ecx+state.BackPrev2]
|
|
mov [eax+state.BackPrev-40],ecx
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov ecx,[ebp-4]
|
|
mov eax,edx
|
|
imul eax,eax,40
|
|
mov esi,edx
|
|
mov edx,[eax+state.BackPrev]
|
|
mov [eax+state.BackPrev],ecx
|
|
mov ecx,[ebp+12]
|
|
mov [ebp-4],edx
|
|
mov edx,[eax+state.PosPrev]
|
|
mov [eax+state.PosPrev],ecx
|
|
mov ecx,esi
|
|
mov [ebp+12],ecx
|
|
test esi,esi
|
|
jne .labl_00
|
|
|
|
mov eax,[state.BackPrev]
|
|
mov ecx,[ebp+8]
|
|
pop edi
|
|
mov [ecx],eax
|
|
mov eax,[state.PosPrev]
|
|
pop esi
|
|
mov [_optimumCurrentIndex],eax
|
|
pop ebx
|
|
leave
|
|
ret 8
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
lz_cm_09:
|
|
push ebp
|
|
mov ebp,esp
|
|
mov edx,[_matchMaxLen]
|
|
mov eax,[_pos]
|
|
mov ecx,[_streamPos]
|
|
sub esp,44
|
|
push esi
|
|
lea esi,[edx+eax]
|
|
cmp esi,ecx
|
|
ja .labl_00
|
|
|
|
mov [ebp-24],edx
|
|
jmp .labl_01
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
sub ecx,eax
|
|
mov [ebp-24],ecx
|
|
cmp ecx,3
|
|
jb .labl_13
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov ecx,[_cyclicBufferSize]
|
|
mov edx,eax
|
|
sub edx,ecx
|
|
cmp ecx,eax
|
|
mov ecx,[_buffer]
|
|
lea esi,[ecx+eax]
|
|
movzx ecx,byte [esi+2]
|
|
push ebx
|
|
movzx ebx,word [esi]
|
|
push edi
|
|
sbb edi,edi
|
|
and dword [ebp-28],0
|
|
and dword [ebp-40],0
|
|
shl ecx,8
|
|
and edi,edx
|
|
movzx edx,byte [esi]
|
|
xor ecx,[crc_table+edx*4]
|
|
movzx edx,byte [esi+1]
|
|
xor ecx,edx
|
|
mov edx,[_hash]
|
|
and ecx,0xFFFFF
|
|
lea ecx,[edx+ecx*4]
|
|
mov [edx+ebx*4+0x400000],eax
|
|
mov ebx,[ecx]
|
|
mov [ecx],eax
|
|
mov ecx,[pack_pos]
|
|
lea ecx,[edx+ecx*8+0x440000]
|
|
mov [ebp-4],ebx
|
|
lea ebx,[ecx+4]
|
|
mov [ebp-12],ecx
|
|
mov ecx,[_cutValue]
|
|
mov [ebp-16],ebx
|
|
mov [ebp-20],ecx
|
|
cmp [ebp-4],edi
|
|
jbe .labl_11
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
mov ecx,[ebp-20]
|
|
dec dword [ebp-20]
|
|
test ecx,ecx
|
|
je .labl_11
|
|
|
|
mov ecx,[_buffer]
|
|
mov ebx,[ebp-4]
|
|
add ecx,ebx
|
|
mov [ebp-36],ecx
|
|
mov ecx,[ebp-40]
|
|
cmp ecx,[ebp-28]
|
|
jb .labl_03
|
|
|
|
mov ecx,[ebp-28]
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
mov ebx,[ebp-36]
|
|
mov [ebp-8],ecx
|
|
add ecx,esi
|
|
sub ebx,esi
|
|
mov [ebp-32],ebx
|
|
jmp .labl_05
|
|
;----------------------------------------------------------
|
|
.labl_04:
|
|
mov ecx,[ebp-44]
|
|
mov ebx,[ebp-32]
|
|
;----------------------------------------------------------
|
|
.labl_05:
|
|
mov bl,[ebx+ecx]
|
|
cmp bl,[ecx]
|
|
jne .labl_06
|
|
|
|
inc dword [ebp-8]
|
|
inc ecx
|
|
mov [ebp-44],ecx
|
|
mov ecx,[ebp-8]
|
|
cmp ecx,[ebp-24]
|
|
jne .labl_04
|
|
;----------------------------------------------------------
|
|
.labl_06:
|
|
mov ecx,[pack_pos]
|
|
mov ebx,eax
|
|
sub ebx,[ebp-4]
|
|
cmp ebx,ecx
|
|
ja .labl_07
|
|
|
|
sub ecx,ebx
|
|
jmp .labl_08
|
|
;----------------------------------------------------------
|
|
.labl_07:
|
|
sub ecx,ebx
|
|
add ecx,[_cyclicBufferSize]
|
|
;----------------------------------------------------------
|
|
.labl_08:
|
|
lea ecx,[edx+ecx*8+0x440000]
|
|
mov [ebp-32],ecx
|
|
mov ecx,[ebp-8]
|
|
cmp ecx,[ebp-24]
|
|
je .labl_14
|
|
|
|
mov ebx,[ebp-36]
|
|
mov bl,[ecx+ebx]
|
|
cmp bl,[ecx+esi]
|
|
mov ecx,[ebp-4]
|
|
jnb .labl_09
|
|
|
|
mov ebx,[ebp-12]
|
|
mov [ebx],ecx
|
|
mov ecx,[ebp-32]
|
|
mov ebx,[ebp-8]
|
|
add ecx,4
|
|
mov [ebp-12],ecx
|
|
mov [ebp-28],ebx
|
|
jmp .labl_10
|
|
;----------------------------------------------------------
|
|
.labl_09:
|
|
mov ebx,[ebp-16]
|
|
mov [ebx],ecx
|
|
mov ecx,[ebp-32]
|
|
mov ebx,[ebp-8]
|
|
mov [ebp-16],ecx
|
|
mov [ebp-40],ebx
|
|
;----------------------------------------------------------
|
|
.labl_10:
|
|
mov ecx,[ecx]
|
|
mov [ebp-4],ecx
|
|
cmp ecx,edi
|
|
ja .labl_02
|
|
;----------------------------------------------------------
|
|
.labl_11:
|
|
mov eax,[ebp-12]
|
|
and dword [eax],0
|
|
mov eax,[ebp-16]
|
|
and dword [eax],0
|
|
;----------------------------------------------------------
|
|
.labl_12:
|
|
pop edi
|
|
pop ebx
|
|
;----------------------------------------------------------
|
|
.labl_13:
|
|
pop esi
|
|
leave
|
|
ret
|
|
;----------------------------------------------------------
|
|
.labl_14:
|
|
mov eax,[ebp-32]
|
|
mov ecx,[eax]
|
|
mov edx,[ebp-12]
|
|
mov [edx],ecx
|
|
mov eax,[eax+4]
|
|
mov ecx,[ebp-16]
|
|
mov [ecx],eax
|
|
jmp .labl_12
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
GetPosSlot:
|
|
cmp eax,1024
|
|
jnb .labl_00
|
|
|
|
movzx eax,byte [eax+g_FastPos]
|
|
ret
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
cmp eax,0x80000
|
|
jnb .labl_01
|
|
|
|
shr eax,9
|
|
movzx eax,byte [eax+g_FastPos]
|
|
add eax,18
|
|
ret
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
shr eax,18
|
|
movzx eax,byte [eax+g_FastPos]
|
|
add eax,36 ;'$'
|
|
ret
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CPriceTableEncoder_Init:
|
|
push ebx
|
|
push edi
|
|
mov eax,1024
|
|
push 4
|
|
mov [esi],eax
|
|
mov [esi+4],eax
|
|
lea edi,[esi+0x4048]
|
|
pop ebx
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
push 3
|
|
lea eax,[edi-0x4040]
|
|
pop ecx
|
|
call CBitTreeEncoder_Init
|
|
push 3
|
|
pop ecx
|
|
mov eax,edi
|
|
call CBitTreeEncoder_Init
|
|
add edi,1028
|
|
dec ebx
|
|
jne .labl_00
|
|
|
|
push 8
|
|
pop ecx
|
|
pop edi
|
|
lea eax,[esi+0x8088]
|
|
pop ebx
|
|
jmp CBitTreeEncoder_Init
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CPriceTableEncoder_UpdateTable:
|
|
push ebx
|
|
push edi
|
|
mov edi,eax
|
|
xor ebx,ebx
|
|
cmp [edi+0xC88C],ebx
|
|
jbe .labl_01
|
|
|
|
mov eax,[esp+12]
|
|
push esi
|
|
lea esi,[edi+eax*4+0x848C]
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov eax,[esp+16]
|
|
mov edx,ebx
|
|
call NLength_CEncoder_GetPrice
|
|
mov [esi],eax
|
|
inc ebx
|
|
add esi,64
|
|
cmp ebx,[edi+0xC88C]
|
|
jb .labl_00
|
|
|
|
pop esi
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov eax,[edi+0xC88C]
|
|
mov ecx,[esp+12]
|
|
mov [edi+ecx*4+0xC890],eax
|
|
pop edi
|
|
pop ebx
|
|
ret 4
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
NLength_CEncoder_GetPrice:
|
|
push ebp
|
|
mov ebp,esp
|
|
push ecx
|
|
push esi
|
|
cmp edx,8
|
|
jnb .labl_00
|
|
|
|
imul eax,eax,1028
|
|
lea esi,[eax+edi+8]
|
|
call CBitTreeEncoder_GetPrice
|
|
mov ecx,[edi]
|
|
shr ecx,2
|
|
add eax,[Models+ecx*4]
|
|
jmp .labl_03
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
push ebx
|
|
mov ebx,2048
|
|
mov ecx,ebx
|
|
sub ecx,[edi]
|
|
shr ecx,2
|
|
mov ecx,[Models+ecx*4]
|
|
mov [ebp-4],ecx
|
|
cmp edx,16
|
|
jnb .labl_01
|
|
|
|
imul eax,eax,1028
|
|
add edx,0xFFFFFFF8
|
|
lea esi,[eax+edi+0x4048]
|
|
call CBitTreeEncoder_GetPrice
|
|
mov ecx,[edi+4]
|
|
shr ecx,2
|
|
add eax,[Models+ecx*4]
|
|
jmp .labl_02
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
add edx,0xFFFFFFF0
|
|
lea esi,[edi+0x8088]
|
|
call CBitTreeEncoder_GetPrice
|
|
sub ebx,[edi+4]
|
|
shr ebx,2
|
|
add eax,[Models+ebx*4]
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
add [ebp-4],eax
|
|
mov eax,[ebp-4]
|
|
pop ebx
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
pop esi
|
|
leave
|
|
ret
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CPriceTableEncoder_Encode:
|
|
push edi
|
|
mov edi,eax
|
|
mov edx,esi
|
|
cmp edi,8
|
|
jnb .labl_00
|
|
|
|
push 0
|
|
call CMyBitEncoder_Encode
|
|
mov eax,ebx
|
|
imul eax,eax,1028
|
|
push edi
|
|
lea edi,[eax+esi+8]
|
|
jmp .labl_02
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
push 1
|
|
call CMyBitEncoder_Encode
|
|
lea edx,[esi+4]
|
|
cmp edi,16
|
|
jnb .labl_01
|
|
|
|
push 0
|
|
call CMyBitEncoder_Encode
|
|
add edi,0xFFFFFFF8
|
|
mov eax,ebx
|
|
imul eax,eax,1028
|
|
push edi
|
|
lea edi,[eax+esi+0x4048]
|
|
jmp .labl_02
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
push 1
|
|
call CMyBitEncoder_Encode
|
|
add edi,0xFFFFFFF0
|
|
push edi
|
|
lea edi,[esi+0x8088]
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
call cm_pr_16
|
|
dec dword [esi+ebx*4+0xC890]
|
|
pop edi
|
|
jne .labl_03
|
|
|
|
push ebx
|
|
mov eax,esi
|
|
call CPriceTableEncoder_UpdateTable
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
ret
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CLiteralEncoder2_Encode:
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
xor edi,edi
|
|
push 8
|
|
inc edi
|
|
pop ebx
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
movzx esi,byte [esp+20]
|
|
mov eax,[esp+16]
|
|
dec ebx
|
|
mov cl,bl
|
|
shr esi,cl
|
|
lea edx,[eax+edi*4]
|
|
and esi,1
|
|
push esi
|
|
call CMyBitEncoder_Encode
|
|
add edi,edi
|
|
or edi,esi
|
|
test ebx,ebx
|
|
jne .labl_00
|
|
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
ret 8
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CState_IsCharState:
|
|
mov edx,[_numPrevBits]
|
|
push esi
|
|
mov esi,[_posMask]
|
|
and esi,[esp+8]
|
|
push 8
|
|
pop ecx
|
|
movzx eax,al
|
|
sub cl,dl
|
|
shr eax,cl
|
|
mov ecx,edx
|
|
shl esi,cl
|
|
add eax,esi
|
|
pop esi
|
|
ret 4
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CLiteralEncoder_GetPrice:
|
|
push dword [esp+16]
|
|
push dword [esp+16]
|
|
push dword [esp+16]
|
|
push dword [esp+16]
|
|
call CState_IsCharState
|
|
imul eax,eax,3072
|
|
add eax,[_posEncoders]
|
|
push eax
|
|
call lz_cm_11
|
|
ret 16
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
lz_cm_11:
|
|
push ebp
|
|
mov ebp,esp
|
|
push ecx
|
|
push ebx
|
|
push esi
|
|
xor esi,esi
|
|
xor eax,eax
|
|
inc esi
|
|
push edi
|
|
mov dword [ebp-4],8
|
|
cmp [ebp+12],al
|
|
je .labl_02
|
|
|
|
movzx ecx,byte [ebp+20]
|
|
mov [ebp+12],ecx
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
dec dword [ebp-4]
|
|
movzx ecx,byte [ebp-4]
|
|
movzx edi,byte [ebp+16]
|
|
mov edx,[ebp+12]
|
|
mov ebx,[ebp+8]
|
|
shr edi,cl
|
|
shr edx,cl
|
|
and edi,1
|
|
mov ecx,edi
|
|
shl ecx,8
|
|
add ecx,esi
|
|
mov ecx,[ebx+ecx*4+1024]
|
|
and edx,1
|
|
sub ecx,edx
|
|
mov ebx,edx
|
|
neg ebx
|
|
xor ecx,ebx
|
|
shr ecx,2
|
|
and ecx,0x1FF
|
|
add eax,[Models+ecx*4]
|
|
add esi,esi
|
|
or esi,edx
|
|
cmp edi,edx
|
|
jne .labl_01
|
|
|
|
cmp dword [ebp-4],0
|
|
jne .labl_00
|
|
|
|
jmp .labl_04
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
cmp dword [ebp-4],0
|
|
je .labl_04
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
movzx edi,byte [ebp+20]
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
dec dword [ebp-4]
|
|
mov cl,[ebp-4]
|
|
mov edx,edi
|
|
shr edx,cl
|
|
mov ecx,[ebp+8]
|
|
mov ecx,[ecx+esi*4]
|
|
add esi,esi
|
|
and edx,1
|
|
sub ecx,edx
|
|
mov ebx,edx
|
|
neg ebx
|
|
xor ecx,ebx
|
|
shr ecx,2
|
|
and ecx,0x1FF
|
|
add eax,[Models+ecx*4]
|
|
or esi,edx
|
|
cmp dword [ebp-4],0
|
|
jne .labl_03
|
|
;----------------------------------------------------------
|
|
.labl_04:
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
leave
|
|
ret 16
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
ReadMatchDistances:
|
|
push esi
|
|
call GetLongestMatch
|
|
mov ecx,eax
|
|
mov esi,0x80
|
|
cmp ecx,esi
|
|
jne .labl_00
|
|
|
|
push dword [distances+512]
|
|
lea eax,[esi+17]
|
|
push esi
|
|
call GetMatchLen
|
|
mov ecx,eax
|
|
add ecx,esi
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
inc dword [_additionalOffset]
|
|
call MatchFinder_MovePos
|
|
mov eax,ecx
|
|
pop esi
|
|
ret
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
GetLongestMatch:
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,0x34
|
|
mov edx,[_matchMaxLen]
|
|
mov ecx,[_pos]
|
|
mov eax,[_streamPos]
|
|
and dword [ebp-24],0
|
|
push esi
|
|
lea esi,[edx+ecx]
|
|
cmp esi,eax
|
|
ja .labl_02
|
|
|
|
mov [ebp-32],edx
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov eax,[_cyclicBufferSize]
|
|
mov edx,ecx
|
|
sub edx,eax
|
|
cmp eax,ecx
|
|
sbb eax,eax
|
|
and eax,edx
|
|
mov [ebp-40],eax
|
|
mov eax,[_buffer]
|
|
push ebx
|
|
push edi
|
|
lea edi,[eax+ecx]
|
|
movzx edx,byte [edi+2]
|
|
movzx esi,byte [edi]
|
|
movzx eax,word [edi]
|
|
shl edx,8
|
|
xor edx,[crc_table+esi*4]
|
|
movzx esi,byte [edi+1]
|
|
xor edx,esi
|
|
mov esi,[_hash]
|
|
and edx,0xFFFFF
|
|
lea edx,[esi+edx*4]
|
|
mov ebx,[edx]
|
|
lea eax,[esi+eax*4+0x400000]
|
|
mov [ebp-8],ebx
|
|
mov ebx,[eax]
|
|
mov [eax],ecx
|
|
or dword [distances+8],0xFFFFFFFF
|
|
cmp ebx,[ebp-40]
|
|
jbe .labl_01
|
|
|
|
mov eax,ecx
|
|
sub eax,ebx
|
|
dec eax
|
|
mov [distances+8],eax
|
|
mov dword [ebp-24],2
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov ebx,[pack_pos]
|
|
and dword [ebp-36],0
|
|
mov [edx],ecx
|
|
or dword [distances+12],0xFFFFFFFF
|
|
and dword [ebp-48],0
|
|
lea edx,[esi+ebx*8+0x440000]
|
|
lea eax,[edx+4]
|
|
mov [ebp-20],eax
|
|
mov eax,[_cutValue]
|
|
mov [ebp-28],eax
|
|
mov eax,[ebp-8]
|
|
mov [ebp-16],edx
|
|
jmp .labl_13
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
sub eax,ecx
|
|
mov [ebp-32],eax
|
|
cmp eax,3
|
|
jnb .labl_00
|
|
|
|
xor eax,eax
|
|
jmp .labl_16
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
mov eax,[ebp-28]
|
|
dec dword [ebp-28]
|
|
test eax,eax
|
|
je .labl_14
|
|
|
|
mov eax,[_buffer]
|
|
mov edx,[ebp-8]
|
|
add eax,edx
|
|
mov [ebp-44],eax
|
|
mov eax,[ebp-48]
|
|
cmp eax,[ebp-36]
|
|
jb .labl_04
|
|
|
|
mov eax,[ebp-36]
|
|
;----------------------------------------------------------
|
|
.labl_04:
|
|
mov edx,[ebp-44]
|
|
mov [ebp-4],eax
|
|
add eax,edi
|
|
sub edx,edi
|
|
mov [ebp-12],edx
|
|
jmp .labl_06
|
|
;----------------------------------------------------------
|
|
.labl_05:
|
|
mov edx,[ebp-12]
|
|
mov eax,[ebp-52]
|
|
;----------------------------------------------------------
|
|
.labl_06:
|
|
mov dl,[edx+eax]
|
|
cmp dl,[eax]
|
|
jne .labl_07
|
|
|
|
inc dword [ebp-4]
|
|
inc eax
|
|
mov [ebp-52],eax
|
|
mov eax,[ebp-4]
|
|
cmp eax,[ebp-32]
|
|
jne .labl_05
|
|
;----------------------------------------------------------
|
|
.labl_07:
|
|
mov eax,ecx
|
|
sub eax,[ebp-8]
|
|
mov [ebp-12],eax
|
|
mov eax,[ebp-24]
|
|
cmp eax,[ebp-4]
|
|
jnb .labl_09
|
|
;----------------------------------------------------------
|
|
.labl_08:
|
|
mov edx,[ebp-12]
|
|
inc eax
|
|
dec edx
|
|
mov [distances+eax*4],edx
|
|
cmp eax,[ebp-4]
|
|
jb .labl_08
|
|
|
|
mov [ebp-24],eax
|
|
;----------------------------------------------------------
|
|
.labl_09:
|
|
mov eax,ebx
|
|
sub eax,[ebp-12]
|
|
cmp [ebp-12],ebx
|
|
jbe .labl_10
|
|
|
|
add eax,[_cyclicBufferSize]
|
|
;----------------------------------------------------------
|
|
.labl_10:
|
|
lea eax,[esi+eax*8+0x440000]
|
|
mov [ebp-12],eax
|
|
mov eax,[ebp-4]
|
|
cmp eax,[ebp-32]
|
|
je .labl_17
|
|
|
|
mov edx,[ebp-44]
|
|
mov dl,[eax+edx]
|
|
cmp dl,[eax+edi]
|
|
mov eax,[ebp-8]
|
|
jnb .labl_11
|
|
|
|
mov edx,[ebp-16]
|
|
mov [edx],eax
|
|
mov eax,[ebp-12]
|
|
mov edx,[ebp-4]
|
|
add eax,4
|
|
mov [ebp-16],eax
|
|
mov [ebp-36],edx
|
|
jmp .labl_12
|
|
;----------------------------------------------------------
|
|
.labl_11:
|
|
mov edx,[ebp-20]
|
|
mov [edx],eax
|
|
mov eax,[ebp-12]
|
|
mov edx,[ebp-4]
|
|
mov [ebp-20],eax
|
|
mov [ebp-48],edx
|
|
;----------------------------------------------------------
|
|
.labl_12:
|
|
mov eax,[eax]
|
|
mov [ebp-8],eax
|
|
;----------------------------------------------------------
|
|
.labl_13:
|
|
cmp eax,[ebp-40]
|
|
ja .labl_03
|
|
;----------------------------------------------------------
|
|
.labl_14:
|
|
mov eax,[ebp-16]
|
|
and dword [eax],0
|
|
mov eax,[ebp-20]
|
|
and dword [eax],0
|
|
;----------------------------------------------------------
|
|
.labl_15:
|
|
mov eax,[ebp-24]
|
|
pop edi
|
|
pop ebx
|
|
;----------------------------------------------------------
|
|
.labl_16:
|
|
pop esi
|
|
leave
|
|
ret
|
|
;----------------------------------------------------------
|
|
.labl_17:
|
|
mov eax,[ebp-12]
|
|
mov ecx,[eax]
|
|
mov edx,[ebp-16]
|
|
mov [edx],ecx
|
|
mov eax,[eax+4]
|
|
mov ecx,[ebp-20]
|
|
mov [ecx],eax
|
|
jmp .labl_15
|
|
;*****************************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
FillPosSlotPrices:
|
|
push ecx
|
|
push ebx
|
|
push ebp
|
|
push esi
|
|
push edi
|
|
xor ebp,ebp
|
|
mov esi,_posSlotEncoder
|
|
mov dword [esp+16],4
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
xor edi,edi
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov ebx,[_distTableSize]
|
|
cmp edi,ebx
|
|
jnb .labl_03
|
|
|
|
mov edx,edi
|
|
call CBitTreeEncoder_GetPrice
|
|
lea ecx,[edi+ebp]
|
|
inc edi
|
|
mov [_posSlotPrices+ecx*4],eax
|
|
cmp edi,14
|
|
jb .labl_01
|
|
|
|
cmp edi,ebx
|
|
jnb .labl_03
|
|
|
|
lea ebx,[edi+ebp]
|
|
lea ebx,[_posSlotPrices+ebx*4]
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
mov edx,edi
|
|
call CBitTreeEncoder_GetPrice
|
|
mov ecx,edi
|
|
shr ecx,1
|
|
sub ecx,5
|
|
shl ecx,6
|
|
add eax,ecx
|
|
mov [ebx],eax
|
|
inc edi
|
|
add ebx,4
|
|
cmp edi,[_distTableSize]
|
|
jb .labl_02
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
add esi,1028
|
|
add ebp,64
|
|
dec dword [esp+16]
|
|
jne .labl_00
|
|
|
|
pop edi
|
|
pop esi
|
|
pop ebp
|
|
pop ebx
|
|
pop ecx
|
|
ret
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
FillDistancesPrices:
|
|
push ebp
|
|
mov ebp,esp
|
|
sub esp,36
|
|
and dword [ebp-20],0
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
push 4
|
|
pop ebx
|
|
mov dword [ebp-24],_distancesPrices+16
|
|
mov dword [ebp-16],_posSlotPrices
|
|
mov [ebp-36],ebx
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov eax,[ebp-24]
|
|
mov esi,[ebp-16]
|
|
lea edi,[eax-16]
|
|
movsd
|
|
movsd
|
|
movsd
|
|
movsd
|
|
mov [ebp-4],ebx
|
|
mov [ebp-12],eax
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov esi,[ebp-4]
|
|
mov eax,esi
|
|
call GetPosSlot
|
|
mov edx,eax
|
|
mov ecx,edx
|
|
xor eax,eax
|
|
inc eax
|
|
mov [ebp-32],edx
|
|
and edx,eax
|
|
shr ecx,1
|
|
dec ecx
|
|
or edx,2
|
|
shl edx,cl
|
|
xor edi,edi
|
|
mov [ebp-8],eax
|
|
mov [ebp-28],ecx
|
|
sub esi,edx
|
|
test ecx,ecx
|
|
je .labl_03
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
mov eax,[ebp-8]
|
|
sub eax,[ebp-32]
|
|
mov ecx,esi
|
|
add eax,edx
|
|
mov eax,[_numLiteralContextBits+eax*4]
|
|
and ecx,1
|
|
sub eax,ecx
|
|
mov ebx,ecx
|
|
neg ebx
|
|
xor eax,ebx
|
|
shr eax,2
|
|
and eax,0x1FF
|
|
add edi,[Models+eax*4]
|
|
mov eax,[ebp-8]
|
|
shr esi,1
|
|
dec dword [ebp-28]
|
|
lea eax,[ecx+eax*2]
|
|
mov [ebp-8],eax
|
|
jne .labl_02
|
|
|
|
push 4
|
|
pop ebx
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
mov eax,[ebp-32]
|
|
mov ecx,[ebp-20]
|
|
add ecx,eax
|
|
mov eax,[_posSlotPrices+ecx*4]
|
|
mov ecx,[ebp-12]
|
|
add [ebp-12],ebx
|
|
add eax,edi
|
|
inc dword [ebp-4]
|
|
cmp dword [ebp-4],0x80
|
|
mov [ecx],eax
|
|
jb .labl_01
|
|
|
|
add dword [ebp-16],256
|
|
add dword [ebp-20],64
|
|
add dword [ebp-24],512
|
|
dec dword [ebp-36]
|
|
jne .labl_00
|
|
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
leave
|
|
ret
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
FillAlignPrices:
|
|
push ebp
|
|
mov ebp,esp
|
|
push ecx
|
|
push ecx
|
|
push ebx
|
|
push esi
|
|
xor esi,esi
|
|
push edi
|
|
mov [ebp-8],esi
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov eax,[i_01]
|
|
xor edx,edx
|
|
xor ecx,ecx
|
|
inc edx
|
|
mov [ebp-4],eax
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov edi,[_posAlignEncoder+edx*4]
|
|
mov eax,esi
|
|
and eax,1
|
|
sub edi,eax
|
|
mov ebx,eax
|
|
neg ebx
|
|
xor edi,ebx
|
|
shr edi,2
|
|
and edi,0x1FF
|
|
add ecx,[Models+edi*4]
|
|
shr esi,1
|
|
dec dword [ebp-4]
|
|
lea edx,[eax+edx*2]
|
|
jne .labl_01
|
|
|
|
mov esi,[ebp-8]
|
|
push 16
|
|
mov [_alignPrices+esi*4],ecx
|
|
inc esi
|
|
pop eax
|
|
mov [ebp-8],esi
|
|
cmp esi,eax
|
|
jb .labl_00
|
|
|
|
pop edi
|
|
pop esi
|
|
mov [_alignPriceCount],eax
|
|
pop ebx
|
|
leave
|
|
ret
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
GetRepLen1Price:
|
|
movzx eax,al
|
|
mov edx,[_isRepG0+eax*4]
|
|
mov ecx,eax
|
|
shl ecx,4
|
|
add ecx,[esp+4]
|
|
shr edx,2
|
|
mov ecx,[_isRep0Long+ecx*4]
|
|
shr ecx,2
|
|
mov eax,[Models+ecx*4]
|
|
add eax,[Models+edx*4]
|
|
ret 4
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
GetRepPrice:
|
|
movzx ecx,byte [esp+4]
|
|
shl eax,4
|
|
add eax,[esp+8]
|
|
push esi
|
|
mov eax,[_repMatchLenEncoder+0x840C+eax*4]
|
|
mov esi,2048
|
|
test edx,edx
|
|
jne .labl_00
|
|
|
|
mov edx,ecx
|
|
mov ecx,[_isRepG0+ecx*4]
|
|
shl edx,4
|
|
add edx,[esp+12]
|
|
sub esi,[_isRep0Long+edx*4]
|
|
shr ecx,2
|
|
jmp .labl_02
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
push edi
|
|
shl ecx,2
|
|
mov edi,esi
|
|
sub edi,[ecx+_isRepG0]
|
|
shr edi,2
|
|
add eax,[Models+edi*4]
|
|
pop edi
|
|
cmp edx,1
|
|
jne .labl_01
|
|
|
|
mov ecx,[ecx+_isRepG1]
|
|
shr ecx,2
|
|
add eax,[Models+ecx*4]
|
|
jmp .labl_03
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
sub esi,[ecx+_isRepG1]
|
|
mov ecx,[ecx+_isRepG2]
|
|
add edx,0xFFFFFFFE
|
|
sub ecx,edx
|
|
neg edx
|
|
xor ecx,edx
|
|
shr ecx,2
|
|
and ecx,0x1FF
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
shr esi,2
|
|
mov edx,[Models+esi*4]
|
|
add edx,[Models+ecx*4]
|
|
add eax,edx
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
pop esi
|
|
ret 8
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
GetPosLenPrice:
|
|
push esi
|
|
mov esi,eax
|
|
mov ecx,0x80
|
|
cmp esi,2
|
|
jne .labl_00
|
|
|
|
cmp edx,ecx
|
|
jb .labl_01
|
|
|
|
mov eax,kIfinityPrice
|
|
jmp .labl_09
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
cmp esi,6
|
|
jnb .labl_02
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
lea eax,[esi-2]
|
|
jmp .labl_03
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
push 3
|
|
pop eax
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
cmp edx,ecx
|
|
jnb .labl_04
|
|
|
|
shl eax,7
|
|
add eax,edx
|
|
mov ecx,[_distancesPrices+eax*4]
|
|
jmp .labl_08
|
|
;----------------------------------------------------------
|
|
.labl_04:
|
|
mov ecx,edx
|
|
;GetPosSlot2
|
|
cmp edx,0x10000 ;if (pos < (1<<16))
|
|
jnb .labl_05
|
|
|
|
shr ecx,6
|
|
movzx ecx,byte [ecx+g_FastPos]
|
|
add ecx,12
|
|
jmp .labl_07
|
|
;----------------------------------------------------------
|
|
.labl_05:
|
|
cmp edx,0x2000000 ;if (pos < (1<<25))
|
|
jnb .labl_06
|
|
|
|
shr ecx,15
|
|
movzx ecx,byte [ecx+g_FastPos]
|
|
add ecx,30
|
|
jmp .labl_07
|
|
;----------------------------------------------------------
|
|
.labl_06:
|
|
shr ecx,24
|
|
movzx ecx,byte [ecx+g_FastPos]
|
|
add ecx,48
|
|
;----------------------------------------------------------
|
|
.labl_07:
|
|
shl eax,6
|
|
add eax,ecx
|
|
mov ecx,[_posSlotPrices+eax*4]
|
|
and edx,15
|
|
add ecx,[_alignPrices+edx*4]
|
|
;----------------------------------------------------------
|
|
.labl_08:
|
|
shl esi,4
|
|
add esi,[esp+8]
|
|
mov eax,[_prices+esi*4]
|
|
add eax,ecx
|
|
;----------------------------------------------------------
|
|
.labl_09:
|
|
pop esi
|
|
ret 4
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
RangeEncoder_ShiftLow:
|
|
push ecx
|
|
push ecx
|
|
mov eax,[low]
|
|
push esi
|
|
mov esi,[low+4]
|
|
cmp eax,0xFF000000
|
|
jb .labl_00
|
|
|
|
test esi,esi
|
|
je .labl_02
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov cl,[_cache]
|
|
and dword [esp+8],0
|
|
mov edx,esi
|
|
push ebx
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov bl,dl
|
|
add bl,cl
|
|
mov ecx,[pack_length]
|
|
inc dword [pack_length]
|
|
mov [ecx],bl
|
|
or cl,0xFF
|
|
dec dword [_cacheSize]
|
|
jne .labl_01
|
|
|
|
mov cl,[low+3]
|
|
mov [_cache],cl
|
|
pop ebx
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
inc dword [_cacheSize]
|
|
shl eax,8
|
|
and dword [low+4],0
|
|
mov [low],eax
|
|
pop esi
|
|
pop ecx
|
|
pop ecx
|
|
ret
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CMyBitEncoder_Encode:
|
|
mov ecx,[_range]
|
|
mov eax,[edx]
|
|
shr ecx,0xB
|
|
imul ecx,eax
|
|
cmp dword [esp+4],0
|
|
jne .labl_00
|
|
|
|
mov [_range],ecx
|
|
mov ecx,2048
|
|
sub ecx,eax
|
|
shr ecx,5
|
|
add ecx,eax
|
|
mov [edx],ecx
|
|
jmp .labl_01
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
add [low],ecx
|
|
adc dword [low+4],0
|
|
sub [_range],ecx
|
|
mov ecx,eax
|
|
shr ecx,5
|
|
sub eax,ecx
|
|
mov [edx],eax
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
cmp dword [_range],0x1000000
|
|
jnb .labl_02
|
|
|
|
shl dword [_range],8
|
|
call RangeEncoder_ShiftLow
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
ret 4
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CBitTreeEncoder_Init:
|
|
xor edx,edx
|
|
inc edx
|
|
shl edx,cl
|
|
mov [eax+1024],ecx
|
|
lea ecx,[edx-1]
|
|
test ecx,ecx
|
|
jbe .labl_00
|
|
|
|
push edi
|
|
lea edi,[eax+4]
|
|
mov eax,1024
|
|
rep stosd
|
|
pop edi
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
ret
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
cm_pr_16:
|
|
mov eax,[esp+4]
|
|
push ebx
|
|
mov ebx,[edi+1024]
|
|
push esi
|
|
xor esi,esi
|
|
inc esi
|
|
add eax,eax
|
|
mov [esp+12],eax
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov eax,[esp+12]
|
|
mov ecx,ebx
|
|
shr eax,cl
|
|
lea edx,[edi+esi*4]
|
|
and eax,1
|
|
push eax
|
|
lea esi,[eax+esi*2]
|
|
call CMyBitEncoder_Encode
|
|
dec ebx
|
|
jne .labl_00
|
|
|
|
pop esi
|
|
pop ebx
|
|
ret 4
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
CBitTreeEncoder_GetPrice:
|
|
mov ecx,[esi+1024]
|
|
push edi
|
|
xor edi,edi
|
|
inc edi
|
|
shl edi,cl
|
|
xor eax,eax
|
|
or edx,edi
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov ecx,edx
|
|
shr edx,1
|
|
mov edi,[esi+edx*4]
|
|
and ecx,1
|
|
sub edi,ecx
|
|
neg ecx
|
|
xor edi,ecx
|
|
shr edi,2
|
|
and edi,0x1FF
|
|
add eax,[Models+edi*4]
|
|
cmp edx,1
|
|
jne .labl_00
|
|
|
|
pop edi
|
|
ret
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
GetMatchLen:
|
|
mov ecx,[_streamPos]
|
|
push edi
|
|
mov edi,eax
|
|
mov eax,[_pos]
|
|
sub ecx,eax
|
|
sub ecx,[esp+8]
|
|
cmp edi,ecx
|
|
jbe .labl_00
|
|
|
|
mov edi,ecx
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
mov ecx,[_buffer]
|
|
inc dword [esp+12]
|
|
add ecx,eax
|
|
add ecx,[esp+8]
|
|
xor eax,eax
|
|
test edi,edi
|
|
jbe .labl_03
|
|
|
|
push esi
|
|
mov esi,ecx
|
|
sub esi,[esp+16]
|
|
;----------------------------------------------------------
|
|
.labl_01:
|
|
mov dl,[eax+ecx]
|
|
cmp dl,[esi+eax]
|
|
jne .labl_02
|
|
|
|
inc eax
|
|
cmp eax,edi
|
|
jb .labl_01
|
|
;----------------------------------------------------------
|
|
.labl_02:
|
|
pop esi
|
|
;----------------------------------------------------------
|
|
.labl_03:
|
|
pop edi
|
|
ret 8
|
|
;***********************************************************************
|
|
|
|
;* Call: ***************************************************************
|
|
MatchFinder_MovePos:
|
|
inc dword [pack_pos]
|
|
mov eax,[pack_pos]
|
|
cmp eax,[_cyclicBufferSize]
|
|
jne .labl_00
|
|
|
|
and dword [pack_pos],0
|
|
;----------------------------------------------------------
|
|
.labl_00:
|
|
inc dword [_pos]
|
|
ret
|
|
;***********************************************************************
|