Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1711 → Rev 1712

/programs/other/kerpack/trunk/build.bat
0,0 → 1,7
@fasm -m 16384 kerpack.asm kerpack
@kpack kerpack
@pause
 
 
 
 
/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
 
 
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/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
/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:
;---------------------------------------------------------------------
/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
;*********************************************************************
/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
;***********************************************************************
/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
;*****************************************************************************