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 ;***********************************************************************