From 843504d6694bdad0afcc2861b433d19492f8d1b2 Mon Sep 17 00:00:00 2001 From: "Marat Zakiyanov (Mario79)" Date: Wed, 1 Dec 2010 20:02:47 +0000 Subject: [PATCH] Kerpack - disassembled, rewrited and corrected for FASM git-svn-id: svn://kolibrios.org@1712 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/other/kerpack/trunk/build.bat | 7 + programs/other/kerpack/trunk/build.sh | 13 + programs/other/kerpack/trunk/calltrick2.inc | 32 + programs/other/kerpack/trunk/kerpack.asm | 417 ++ programs/other/kerpack/trunk/loader_lzma.inc | 459 +++ .../other/kerpack/trunk/lzma_compress.inc | 3348 +++++++++++++++++ .../kerpack/trunk/lzma_set_dict_size.inc | 12 + 7 files changed, 4288 insertions(+) create mode 100644 programs/other/kerpack/trunk/build.bat create mode 100755 programs/other/kerpack/trunk/build.sh create mode 100644 programs/other/kerpack/trunk/calltrick2.inc create mode 100644 programs/other/kerpack/trunk/kerpack.asm create mode 100644 programs/other/kerpack/trunk/loader_lzma.inc create mode 100644 programs/other/kerpack/trunk/lzma_compress.inc create mode 100644 programs/other/kerpack/trunk/lzma_set_dict_size.inc diff --git a/programs/other/kerpack/trunk/build.bat b/programs/other/kerpack/trunk/build.bat new file mode 100644 index 0000000000..babaf9be5d --- /dev/null +++ b/programs/other/kerpack/trunk/build.bat @@ -0,0 +1,7 @@ +@fasm -m 16384 kerpack.asm kerpack +@kpack kerpack +@pause + + + + diff --git a/programs/other/kerpack/trunk/build.sh b/programs/other/kerpack/trunk/build.sh new file mode 100755 index 0000000000..26d0674a20 --- /dev/null +++ b/programs/other/kerpack/trunk/build.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# This script does for linux the same as build.bat for DOS, +# it compiles the KoOS kernel, hopefully ;-) + + echo "lang fix en" + echo "lang fix en" > lang.inc + fasm -m 16384 kerpack.asm kerpack + rm -f lang.inc + exit 0 + + + + diff --git a/programs/other/kerpack/trunk/calltrick2.inc b/programs/other/kerpack/trunk/calltrick2.inc new file mode 100644 index 0000000000..36b04430ca --- /dev/null +++ b/programs/other/kerpack/trunk/calltrick2.inc @@ -0,0 +1,32 @@ + pop esi + push esi +loader_patch4: + mov ecx, 0 ; will be patched: number of calltrick entries +ctrloop: + lodsb +@@: + cmp al, 0xF + jnz .f + lodsb + cmp al, 80h + jb @b + cmp al, 90h + jb @f +.f: + sub al, 0E8h + cmp al, 1 + ja ctrloop +@@: + cmp byte [esi], 0 ; will be patched: code in calltrick entries +loader_patch5: + jnz ctrloop + lodsd +; "bswap eax" is not supported on i386 +; mov al,0/bswap eax = 4 bytes, following instructions = 9 bytes + shr ax, 8 + ror eax, 16 + xchg al, ah + sub eax, esi + add eax, [esp] + mov [esi-4], eax + loop ctrloop diff --git a/programs/other/kerpack/trunk/kerpack.asm b/programs/other/kerpack/trunk/kerpack.asm new file mode 100644 index 0000000000..2eecddb919 --- /dev/null +++ b/programs/other/kerpack/trunk/kerpack.asm @@ -0,0 +1,417 @@ +; Kolibri kernel packer +; (C) copyright diamond 2006, 2007 +; +; Disassemled and corrected in 2010 specially for FASM +; by Marat Zakiyanov aka Mario79, aka Mario +; +; This program is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. + +; Uses LZMA compression library by Igor Pavlov +; (for more information on LZMA and 7-Zip visit http://www.7-zip.org) +; (plain-C packer is ported by diamond) + +;--------------------------------------------------------------------- +use32 + org 0 + + db 'MENUET01' + dd 1 + dd START + dd IM_END + dd I_END + dd stacktop + dd 0 ;params + dd 0 ;cur_dir_path +;--------------------------------------------------------------------- +include '../../../macros.inc' +; do not touch "purge mov"!!! +purge mov ; for the correct patch of loader +; do not touch "purge mov"!!! +;********************************************************************* +die_with_err: + pop esi +@@: + lodsb + test al,al + jz @f + + mov cl,al + mcall 63,1 + jmp @b +;********************************************************************* +@@: + mcall 63,,13 + mcall ,,10 + mcall -1 +;********************************************************************* +START: + mcall 70,fn70_read + cmp eax,6 + jz read_ok +;-------------------------------------- +read_err: + call die_with_err + db 'KerPack: cannot load kernel.mnt',0 +;********************************************************************* +read_ok: + push 18 + call lzma_set_dict_size +; find jump to 32-bit code + mov edi,infile - 1 +;-------------------------------------- +@@: + inc edi + cmp dword [edi],0xE88EE08E ; mov fs,ax/mov gs,ax + jnz @b + + cmp dword [edi+4],0x00BCD08E ; mov ss,ax/mov esp,00xxxxxx + jnz @b + + add edi,11 + mov [inptr],edi + sub edi, infile + mov [indelta],edi + lea eax,[ebx+0x10000] + mov dword [loader_patch3+2],eax + sub ebx,edi + mov [insize],ebx + call preprocess_calltrick2 + + mov al,[cti] + mov [loader_patch5-1],al + mov eax,[ctn] + mov [loader_patch4+1],eax + mov eax,[inptr] + add eax, outfile - infile + loader_size - 5 + push workmem + push [insize] + push eax + push [inptr] + call lzma_compress + + add eax, loader_size-5 + mov [loader_patch1+6],eax + add eax,[indelta] + mov [outsize],eax + mov eax,[indelta] + mov ecx,dword [eax + outfile + loader_size - 4] + bswap ecx + mov [loader_patch2+4],ecx + add eax, 0x10000 + mov [loader_patch1+1],eax + mov esi,infile + mov edi,outfile + mov ecx,[indelta] + rep movsb + + mov esi,loader_start + mov ecx,loader_size + rep movsb + + mcall 70,fn70_write + test eax,eax + jz @f + + call die_with_err + db 'KerPack: cannot save kernel.mnt',0 +;********************************************************************* +@@: + call die_with_err + db 'KerPack: all is OK',0 +;********************************************************************* +preprocess_calltrick2: +; input preprocessing + mov edi,ct1 + xor eax,eax + push edi + mov ecx,256/4 + rep stosd + + pop edi + mov ecx,ebx + mov esi,[inptr] + mov ebx,inbuftmp + xchg eax,edx +;-------------------------------------- +input_pre2: + lodsb +;-------------------------------------- +@@: + cmp al,0Fh + jnz ip1 + + dec ecx + jz input_pre_done2 + + lodsb + cmp al,80h + jb @b + + cmp al,90h + jb @f +;-------------------------------------- +ip1: + sub al,0E8h + cmp al,1 + ja input_pre_cont2 +;-------------------------------------- +@@: + cmp ecx,5 + jb input_pre_done2 + + lodsd + add eax,esi + sub eax,[inptr] + cmp eax,[insize] + jae xxx2 + + cmp eax,1000000h + jae xxx2 + + sub ecx,4 + xchg al,ah + rol eax,16 + xchg al,ah + mov [esi-4],eax + inc edx + mov [ebx],esi + add ebx,4 + jmp input_pre_cont2 +;********************************************************************* +xxx2: + sub esi,4 + movzx eax,byte [esi] + mov byte [eax+edi],1 +;-------------------------------------- +input_pre_cont2: + loop input_pre2 +;-------------------------------------- +input_pre_done2: + mov [ctn],edx + xor eax,eax + mov ecx,256 + repnz scasb + jnz pack_calltrick_done + + not cl + mov [cti],cl +;-------------------------------------- +@@: + cmp ebx,inbuftmp + jz pack_calltrick_done + + sub ebx,4 + mov eax,[ebx] + mov [eax-4],cl + jmp @b +;********************************************************************* +pack_calltrick_done: + ret +;********************************************************************* +;lzma_compress: +include 'lzma_compress.inc' +;--------------------------------------------------------------------- +;lzma_set_dict_size: +include 'lzma_set_dict_size.inc' +;--------------------------------------------------------------------- +; +include 'loader_lzma.inc' +;********************************************************************* +fn70_read: + dd 0 + dd 0 + dd 0 + dd 200*1024 + dd infile +filename db '/rd/1/kernel.mnt',0 + +fn70_write: + dd 2 + dd 0 + dd 0 +outsize dd ? + dd outfile + db 0 + dd filename +;--------------------------------------------------------------------- +align 4 +LiteralNextStates: +db 0,0,0,0,1,2,3,4,5,6,4,5 +MatchNextStates: +db 7,7,7,7,7,7,7,10,10,10,10,10 +RepNextStates: +db 8,8,8,8,8,8,8,11,11,11,11,11 +ShortRepNextStates: +db 9,9,9,9,9,9,9,11,11,11,11,11 +;--------------------------------------------------------------------- +;********************************************************************* +IM_END: +;********************************************************************* +;params: +; rb 256 +;--------------------------------------------------------------------- +;cur_dir_path: +; rb 4096 +;--------------------------------------------------------------------- +align 4 + rb 4096 +stacktop: +;--------------------------------------------------------------------- +align 4 +inptr dd ? +indelta dd ? +insize dd ? +ct1 rb 256 +ctn dd ? +cti db ? + +infile rb 200*1024 +inbuftmp rb 200*1024 +outfile rb 200*1024 +workmem rb 6A8000h +;--------------------------------------------------------------------- +; Compress data area start +;--------------------------------------------------------------------- +align 4 +_lenEncoder: + rd 8451 +;----------------------------------------------------- +_prices: + rd 4384 + rd 17 +;----------------------------------------------------- +_finished: rb 1 +_writeEndMark: rb 1 +_longestMatchWasFound: rb 1 +_previousByte: rb 1 +_longestMatchLength: rd 1 +;----------------------------------------------------- +g_FastPos: + rb 1024 +;----------------------------------------------------- +_posSlotPrices: + rd 256 +;----------------------------------------------------- +_isRep0Long: + rd 192 +;----------------------------------------------------- +distances: + rd 274 +;----------------------------------------------------- +_optimumCurrentIndex: rd 1 +_additionalOffset: rd 1 +;----------------------------------------------------- +_isRepG1: + rd 12 +;----------------------------------------------------- +_isMatch: + rd 192 +;----------------------------------------------------- +_alignPriceCount: rd 1 +_numLiteralContextBits: rd 1 +;----------------------------------------------------- +_literalEncoder: + rd 114 +;----------------------------------------------------- +nowPos64: + rd 2 +;----------------------------------------------------- +_distancesPrices: + rd 512 +;----------------------------------------------------- +_repDistances: + rd 4 +;----------------------------------------------------- +_posSlotEncoder: + rd 1028 +;----------------------------------------------------- +lastPosSlotFillingPos: + rd 2 +;----------------------------------------------------- +_numFastBytes: rd 1 +_posStateMask: rd 1 +;----------------------------------------------------- +_isRepG0: + rd 12 +;----------------------------------------------------- +_repMatchLenEncoder: + rd 8451 + rd 4384 + rd 17 +;----------------------------------------------------- +_isRepG2: + rd 12 +;----------------------------------------------------- +_dictionarySize: rd 1 +_numLiteralPosStateBits: rd 1 +_distTableSize: rd 1 +_optimumEndIndex: rd 1 +;----------------------------------------------------- +;static CState state +state.State: rb 1 +state.Prev1IsChar: rb 1 +state.Prev2: rb 2 +state.PosPrev2: rd 1 +state.BackPrev2: rd 1 +state.Price: rd 1 +state.PosPrev: rd 1 +state.BackPrev: rd 1 +state.Backs: + rd 4 +;---------------------------------------------------- + rd 40950 +;----------------------------------------------------- +_alignPrices: + rd 16 +;----------------------------------------------------- +_isRep: + rd 12 +;----------------------------------------------------- +_posAlignEncoder: + rd 256 +;----------------------------------------------------- +i_01: rd 1 +;----------------------------------------------------- +_state: rb 1 +_cache: rb 1 +_state.Prev2: rb 2 +_posEncoders: rd 1 +_numPrevBits: rd 1 +_numPosBits: rd 1 +_posMask: rd 1 +_posStateBits: rd 1 +_range: rd 1 +_cacheSize: rd 1 +_cyclicBufferSize: rd 1 +;----------------------------------------------------- +low: + rd 2 +;----------------------------------------------------- +Models: + rd 512 +;----------------------------------------------------- +_matchMaxLen: rd 1 +pack_pos: rd 1 +_cutValue: rd 1 +_hash: rd 1 +;----------------------------------------------------- +crc_table: + rd 256 +;----------------------------------------------------- +_buffer: rd 1 +_pos: rd 1 +_streamPos: rd 1 +pack_length: rd 1 +;--------------------------------------------------------------------- +; Compress data area end +;--------------------------------------------------------------------- +I_END: +;--------------------------------------------------------------------- \ No newline at end of file diff --git a/programs/other/kerpack/trunk/loader_lzma.inc b/programs/other/kerpack/trunk/loader_lzma.inc new file mode 100644 index 0000000000..3165dc6135 --- /dev/null +++ b/programs/other/kerpack/trunk/loader_lzma.inc @@ -0,0 +1,459 @@ +loader_start: +; start address; this code will be injected after the init code +; (some commands below "B32" in the kernel) + mov edi, 0x280000 + lea ebx, [edi+loader_size1+16] + lea edx, [ebx+4] +loader_patch1: + mov esi, 0 ; will be patched: start address to copy + mov ecx, 0 ; will be patched: size of data to copy + push esi + rep movsb + jmp edx +loader_size1 = $ - loader_start + +loader_patch2: + dd 0x280000 + loader_size + dd 0 ; will be patched: start value for code + ; (LZMA-specific) + dd -1 + dd _RangeDecoderBitDecode_edx - loader_start + 0x280000 + dd _RangeDecoderBitDecode - loader_start + 0x280000 +RangeDecoderBitDecode equ dword [ebx] +RangeDecoderBitDecode_edx equ dword [ebx-4] +code_ equ ebx-12 +range equ ebx-8 + +rep1 equ ebx-28 +rep2 equ ebx-24 +rep3 equ ebx-20 +inptr_ldr equ ebx-16 + +pb equ 2 ; pos state bits +lp equ 0 ; literal pos state bits +lc equ 3 ; literal context bits +posStateMask equ ((1 shl pb)-1) +literalPosMask equ ((1 shl lp)-1) + +kNumPosBitsMax = 4 +kNumPosStatesMax = (1 shl kNumPosBitsMax) + +kLenNumLowBits = 3 +kLenNumLowSymbols = (1 shl kLenNumLowBits) +kLenNumMidBits = 3 +kLenNumMidSymbols = (1 shl kLenNumMidBits) +kLenNumHighBits = 8 +kLenNumHighSymbols = (1 shl kLenNumHighBits) + +LenChoice = 0 +LenChoice2 = 1 +LenLow = 2 +LenMid = (LenLow + (kNumPosStatesMax shl kLenNumLowBits)) +LenHigh = (LenMid + (kNumPosStatesMax shl kLenNumMidBits)) +kNumLenProbs = (LenHigh + kLenNumHighSymbols) + +kNumStates = 12 +kNumLitStates = 7 +kStartPosModelIndex = 4 +kEndPosModelIndex = 14 +kNumFullDistances = (1 shl (kEndPosModelIndex/2)) +kNumPosSlotBits = 6 +kNumLenToPosStates = 4 +kNumAlignBits = 4 +kAlignTableSize = (1 shl kNumAlignBits) +kMatchMinLen = 2 + +IsMatch = 0 +IsRep = 0xC0 ; (IsMatch + (kNumStates shl kNumPosBitsMax)) +IsRepG0 = 0xCC ; (IsRep + kNumStates) +IsRepG1 = 0xD8 ; (IsRepG0 + kNumStates) +IsRepG2 = 0xE4 ; (IsRepG1 + kNumStates) +IsRep0Long = 0xF0 ; (IsRepG2 + kNumStates) +PosSlot = 0x1B0 ; (IsRep0Long + (kNumStates shl kNumPosBitsMax)) +SpecPos = 0x2B0 ; (PosSlot + (kNumLenToPosStates shl kNumPosSlotBits)) +Align_ = 0x322 ; (SpecPos + kNumFullDistances - kEndPosModelIndex) +Lencoder = 0x332 ; (Align_ + kAlignTableSize) +RepLencoder = 0x534 ; (Lencoder + kNumLenProbs) +Literal = 0x736 ; (RepLencoder + kNumLenProbs) + +LZMA_BASE_SIZE = 1846 ; must be ==Literal +LZMA_LIT_SIZE = 768 + +kNumTopBits = 24 +kTopValue = (1 shl kNumTopBits) + +kNumBitModelTotalBits = 11 +kBitModelTotal = (1 shl kNumBitModelTotalBits) +kNumMoveBits = 5 + +uninit_base = 2C0000h + +p = uninit_base + +unpacker: + xor ebp, ebp + xor eax, eax + dec eax + lea edi, [rep1] + stosd + stosd + stosd + + xchg eax, esi +; mov ecx, Literal + (LZMA_LIT_SIZE shl (lc+lp)) + mov ch, (Literal + (LZMA_LIT_SIZE shl (lc+lp)) + 0xFF) shr 8 + mov eax, kBitModelTotal/2 + mov edi, p + rep stosd + + pop edi + push edi +loader_patch3: +.main_loop: + cmp edi, dword 0 ; will be patched: end of data to unpack + jae .main_loop_done + +if posStateMask + mov edx, edi + and edx, posStateMask +else + xor edx, edx +end if + push eax ; al = previous byte + lea eax, [ebp + ((p+IsMatch*4) shr (kNumPosBitsMax+2))] + shl eax, kNumPosBitsMax+2 +if posStateMask + call RangeDecoderBitDecode_edx +else + call RangeDecoderBitDecode +end if + pop eax + jc .1 + + movzx eax, al +if literalPosMask + mov ah, dl + and ah, literalPosMask +end if +if ((LZMA_LIT_SIZE*4) and ((1 shl (8-lc)) - 1)) <> 0 + shr eax, 8-lc + imul eax, LZMA_LIT_SIZE*4 +else + and al, not ((1 shl (8-lc)) - 1) + imul eax, (LZMA_LIT_SIZE*4) shr (8-lc) +end if + add eax, p+Literal*4 + mov dl, 1 + cmp ebp, kNumLitStates + jb .literal + + mov cl, [edi + esi] +;-------------------------------------- +.lx0: + add cl, cl + adc dh, 1 + call RangeDecoderBitDecode_edx + + adc dl, dl + jc .lx1 + + xor dh, dl + test dh, 1 + mov dh, 0 + jnz .lx0 +;-------------------------------------- +.literal: +@@: + call RangeDecoderBitDecode_edx + adc dl, dl + jnc @b +;-------------------------------------- +.lx1: + mov eax, ebp + cmp al, 4 + jb @f + + cmp al, 10 + mov al, 3 + jb @f + + mov al, 6 +@@: + sub ebp, eax + xchg eax, edx +;-------------------------------------- +.stosb_main_loop: + stosb + jmp .main_loop +;********************************************************************* +.1: + lea eax, [p + IsRep*4 + ebp*4] + call RangeDecoderBitDecode + jnc .10 + + add eax, (IsRepG0 - IsRep)*4 ;lea eax, [p + IsRepG0*4 + ebp*4] + call RangeDecoderBitDecode + jc .111 + + mov eax, ebp + shl eax, kNumPosBitsMax+2 + add eax, p + IsRep0Long*4 + call RangeDecoderBitDecode_edx + jc .1101 + + cmp ebp, 7 + sbb ebp, ebp + lea ebp, [ebp+ebp+11] + mov al, [edi + esi] + jmp .stosb_main_loop +;********************************************************************* +.111: + add eax, (IsRepG1 - IsRepG0) * 4 ;lea eax, [p + IsRepG1*4 + ebp*4] + call RangeDecoderBitDecode + xchg esi, [rep1] + jnc @f + + add eax, (IsRepG2 - IsRepG1) * 4 ;lea eax, [p + IsRepG2*4 + ebp*4] + call RangeDecoderBitDecode + xchg esi, [rep2] + jnc @f + + xchg esi, [rep3] +;-------------------------------------- +@@: +.1101: + mov eax, p + RepLencoder*4 + call LzmaLenDecode + + push 8 + jmp .rmu +;********************************************************************* +.10: + xchg esi, [rep1] + xchg esi, [rep2] + mov [rep3], esi + mov eax, p + Lencoder*4 + call LzmaLenDecode + + push kNumLenToPosStates-1 + pop edx + cmp edx, ecx + jb @f + + mov edx, ecx +;-------------------------------------- +@@: + push ecx + push kNumPosSlotBits + pop ecx + mov eax, p+PosSlot*4 + shl edx, cl + call RangeDecoderBitTreeDecode + + mov esi, ecx + cmp ecx, kStartPosModelIndex + jb .l6 + + mov edx, ecx + xor eax, eax + shr ecx, 1 + adc al, 2 + dec ecx + shl eax, cl + mov esi, eax + sub eax, edx + lea eax, [p + (SpecPos - 1)*4 + eax*4] + cmp edx, kEndPosModelIndex + jb .l59 +; call RangeDecoderDecodeDirectBits +;RangeDecoderDecodeDirectBits: + xor eax, eax +;-------------------------------------- +.l: + shr dword [range], 1 + add eax, eax + mov edx, [code_] + sub edx, [range] + jb @f + + mov [code_], edx + add al, 1 shl kNumAlignBits +;-------------------------------------- +@@: + call update_decoder + dec ecx + cmp ecx, kNumAlignBits + jnz .l +; ret + add esi, eax + mov eax, p+Align_*4 +;-------------------------------------- +.l59: +; call RangeDecoderReverseBitTreeDecode_addesi +;_RangeDecoderReverseBitTreeDecode_addesi: +; in: eax->probs,ecx=numLevels +; out: esi+=length; destroys edx + push edi + xor edx, edx + inc edx + mov edi, edx +;-------------------------------------- +@@: + call RangeDecoderBitDecode_edx + jnc .591 + + add esi, edi + stc +;-------------------------------------- +.591: + adc edx, edx + add edi, edi + loop @b + + pop edi +; ret +;-------------------------------------- +.l6: + pop ecx + not esi + push 7 +;-------------------------------------- +.rmu: + cmp ebp, 7 + pop ebp + jb @f + add ebp, 3 +;-------------------------------------- +@@: +.repmovsb: + inc ecx + push esi + add esi, edi + rep movsb + + lodsb + pop esi + jmp .stosb_main_loop +;********************************************************************* +.main_loop_done: +include 'calltrick2.inc' + ret +;********************************************************************* +_RangeDecoderBitDecode: +; in: eax->prob +; out: CF=bit + push edx + mov edx, [range] + shr edx, kNumBitModelTotalBits + imul edx, [eax] + cmp [code_], edx + jae .ae + + mov [range], edx + mov edx, kBitModelTotal + sub edx, [eax] + shr edx, kNumMoveBits + add [eax], edx +;-------------------------------------- +.n: + pushfd + call update_decoder + + popfd + pop edx + ret +;********************************************************************* +.ae: + sub [range], edx + sub [code_], edx + mov edx, [eax] + shr edx, kNumMoveBits + sub [eax], edx + stc + jmp .n +;********************************************************************* +update_decoder: + cmp byte [range+3], 0 ;cmp dword [range], kTopValue + jnz @f ;jae @f + + shl dword [range], 8 + shl dword [code_], 8 + push eax + mov eax, [inptr_ldr] + mov al, [eax] + inc dword [inptr_ldr] + mov byte [code_], al + pop eax +@@: + ret +;********************************************************************* +_RangeDecoderBitDecode_edx: + push eax + lea eax, [eax+edx*4] + call RangeDecoderBitDecode + + pop eax + ret +;********************************************************************* +LzmaLenDecode: +; in: eax->prob, edx=posState +; out: ecx=len + +; LenChoice==0 +; add eax, LenChoice*4 +if kLenNumMidBits <> kLenNumLowBits +error in optimization +end if + mov cl, kLenNumMidBits + call RangeDecoderBitDecode + jnc .0 + + add eax, (LenChoice2-LenChoice)*4 + call RangeDecoderBitDecode + jc @f +if (kLenNumMidBits <> 3) | (LenMid-LenChoice2 > 0x7F + kLenNumMidBits) + shl edx, cl + add edx, LenMid-LenChoice2 +else + lea edx, [ecx + edx*8 - kLenNumMidBits + LenMid-LenChoice2] +end if + push kLenNumLowSymbols + jmp RangeDecoderBitTreeDecode.1 +;********************************************************************* +@@: + mov edx, LenHigh-LenChoice2 + mov cl, kLenNumHighBits + push kLenNumLowSymbols + kLenNumMidSymbols + jmp RangeDecoderBitTreeDecode.1 +;********************************************************************* +.0: + shl edx, cl +if LenLow = 2 + inc edx + inc edx +else + add edx, LenLow +end if +;-------------------------------------- +RangeDecoderBitTreeDecode: +; in: eax+edx*4->probs,ecx=numLevels +; out: ecx=length; destroys edx + push 0 +.1: + lea eax, [eax+edx*4] + xor edx, edx + inc edx + push ecx +@@: + call RangeDecoderBitDecode_edx + + adc edx, edx + loop @b + + pop ecx + btc edx, ecx + pop ecx + add ecx, edx + ret +loader_size = $ - loader_start +;********************************************************************* \ No newline at end of file diff --git a/programs/other/kerpack/trunk/lzma_compress.inc b/programs/other/kerpack/trunk/lzma_compress.inc new file mode 100644 index 0000000000..46f6866229 --- /dev/null +++ b/programs/other/kerpack/trunk/lzma_compress.inc @@ -0,0 +1,3348 @@ +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 +;*********************************************************************** diff --git a/programs/other/kerpack/trunk/lzma_set_dict_size.inc b/programs/other/kerpack/trunk/lzma_set_dict_size.inc new file mode 100644 index 0000000000..c0a9224b9a --- /dev/null +++ b/programs/other/kerpack/trunk/lzma_set_dict_size.inc @@ -0,0 +1,12 @@ +;* Call: *************************************************************** +; lzma_set_dict_size(unsigned logdictsize) +lzma_set_dict_size: + mov ecx,[esp+4] + xor eax,eax + inc eax + shl eax,cl + mov [_dictionarySize],eax + lea eax,[ecx+ecx] + mov [_distTableSize],eax + ret 4 +;*****************************************************************************