Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1713 → Rev 1718

/programs/other/kpack/linux/build.sh
0,0 → 1,12
#!/bin/bash
# This script does for linux the same as build.bat for DOS,
# it compiles the KoOS kernel, hopefully ;-)
 
fasm -m 16384 kpack.asm kpack.o
gcc -s -nostdlib kpack.o -o kpack -lc
strip -R .comment -R .gnu.version kpack
exit 0
 
 
 
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/other/kpack/linux/data.inc
0,0 → 1,136
;---------------------------------------------------------------------
; 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
;---------------------------------------------------------------------
/programs/other/kpack/linux/kpack.asm
0,0 → 1,912
; Disassemled and corrected in 2010 specially for FASM
; by Marat Zakiyanov aka Mario79, aka Mario
; All sources only assembler is now
; GCC using for linking
;---------------------------------------------------------------------
; Linux port by mike.dld in 2007
;---------------------------------------------------------------------
; kpack = Kolibri Packer
; Written by diamond in 2006 specially for KolibriOS
 
; Uses LZMA compression library by Igor Pavlov
; (for more information on LZMA and 7-Zip visit http://www.7-zip.org)
; (plain-C packer and ASM unpacker are ported by diamond)
 
format ELF
public _start
 
;*********************************************************************
section ".text" executable align 16
 
_start:
mov ecx,[esp+0]
lea ebx,[esp+4]
call combine_program_arguments
 
xor ebx, ebx
push eax ; reserve dword on the stack
 
xor eax,eax
inc eax
 
xchg eax, ebp
; parse command line
mov eax,program_arguments
 
xchg eax, esi
call skip_spaces
call get_file_name
test al, al
jz short usage
 
call get_file_name
 
mov [infilename], edi
test al, al
jnz short two_files
 
mov [outfilename], edi
jmp short cont
;*********************************************************************
write_string:
push eax ; reserve dword on the stack
mov eax, esp
push ebx
push eax
push dword [eax+12]
push dword [eax+8]
push ebp
call WriteConsoleA
pop eax
ret 8
;*********************************************************************
write_exit:
call write_string
;---------------------------------------------------------------------
doexit:
push ebx
call ExitProcess
;---------------------------------------------------------------------
usage:
cmp [bNoLogo], 0
jnz doexit
 
push info_len + usage_len
push info_str
jmp write_exit
;*********************************************************************
two_files:
call get_file_name
mov [outfilename], edi
test al, al
jnz short usage
;---------------------------------------------------------------------
cont:
cmp [bNoLogo], 0
jnz @f
 
push info_len
push info_str
call write_string
;---------------------------------------------------------------------
@@:
; Input file
push ebx
push ebx
push 3 ; OPEN_EXISTING
push ebx
push 1 ; FILE_SHARE_READ
push 80000000h ; GENERIC_READ
push [infilename]
call CreateFileA
inc eax
jnz short inopened
;---------------------------------------------------------------------
infileerr:
push errload_len
push errload_str
jmp write_exit
;*********************************************************************
inopened:
dec eax
xchg eax, esi
push ebx
push esi
call GetFileSize
inc eax
jz short infileerr
 
dec eax
jz short infileerr
 
mov [insize], eax
push eax
push 4 ; PAGE_READWRITE
push 1000h ; MEM_COMMIT
push eax
push ebx
call VirtualAlloc
test eax, eax
jz nomem
 
mov [infile], eax
pop edx
mov ecx, esp
push ebx
push ecx
push edx
push eax
push esi
call ReadFile
test eax, eax
jz short infileerr
 
push esi
call CloseHandle
 
mov eax, [insize]
shr eax, 3
add eax, [insize]
add eax, 400h ; should be enough for header
mov esi, eax
add eax, eax
push 4
push 1000h
push eax
push ebx
call VirtualAlloc
test eax, eax
jnz short outmemok
;---------------------------------------------------------------------
nomem:
push nomem_len
push nomem_str
jmp write_exit
;*********************************************************************
outmemok:
mov [outfile], eax
mov [outfile1], eax
mov [outfilebest], eax
add eax, esi
mov [outfile2], eax
sub eax, esi
mov dword [eax], 'KPCK'
mov ecx, [insize]
mov dword [eax+4], ecx
dec ecx
bsr eax, ecx
inc eax
cmp eax, 28
jb short @f
 
mov eax, 28
;---------------------------------------------------------------------
@@:
push eax
push eax
call lzma_set_dict_size
 
pop ecx
mov eax, 1
shl eax, cl
mov [lzma_dictsize], eax
imul eax, 19
shr eax, 1
add eax, 509000h
push 4
push 1000h
push eax
push ebx
call VirtualAlloc
test eax, eax
jz nomem
 
mov [workmem], eax
push compressing_len
push compressing_str
call write_string
 
mov eax, [outfile2]
mov [outfile], eax
xchg eax, edi
mov esi, [outfile1]
movsd
movsd
call pack_lzma
 
mov [outsize], eax
mov eax, [outfile]
mov [outfilebest], eax
mov [method], use_lzma
call preprocess_calltrick
test eax, eax
jz short noct1
 
call set_outfile
call pack_lzma
 
add eax, 5
cmp eax, [outsize]
jae short @f
mov [outsize], eax
mov eax, [outfile]
mov [outfilebest], eax
mov [method], use_lzma or use_calltrick1
;---------------------------------------------------------------------
@@:
noct1:
call set_outfile
 
push [ctn]
mov al, [cti]
push eax
call preprocess_calltrick2
test eax, eax
jz noct2
 
call set_outfile
call pack_lzma
 
add eax, 5
cmp eax, [outsize]
jae short @f
 
mov [outsize], eax
mov eax, [outfile]
mov [outfilebest], eax
mov [method], use_lzma or use_calltrick2
pop ecx
pop ecx
push [ctn]
mov al, [cti]
push eax
;---------------------------------------------------------------------
@@:
noct2:
pop eax
mov [cti], al
pop [ctn]
add [outsize], 12
mov eax, [outsize]
cmp eax, [insize]
jb short packed_ok
 
push too_big_len
push too_big_str
jmp write_exit
;*********************************************************************
packed_ok:
push 8000h ; MEM_RELEASE
push ebx
push [workmem]
call VirtualFree
; set header
movzx eax, [method]
mov edi, [outfilebest]
mov [edi+8], eax
test al, use_calltrick1 or use_calltrick2
jz short @f
 
mov ecx, [outsize]
add ecx, edi
mov eax, [ctn]
mov [ecx-5], eax
mov al, [cti]
mov [ecx-1], al
@@:
mov eax, [outsize]
mov ecx, 100
mul ecx
div [insize]
aam
xchg al, ah
add ax, '00'
mov [ratio], ax
push done_len
cmp [bNoLogo], 0
jz @f
 
sub dword [esp], 2
;---------------------------------------------------------------------
@@:
push done_str
call write_string
; Output file
push ebx
push 80h ; FILE_ATTRIBUTE_NORMAL
push 2 ; CREATE_ALWAYS
push ebx
push ebx
push 40000000h ; GENERIC_WRITE
push [outfilename]
call CreateFileA
inc eax
jnz short @f
;---------------------------------------------------------------------
outerr:
push outfileerr_len
push outfileerr_str
jmp write_exit
;*********************************************************************
@@:
dec eax
xchg eax, esi
mov eax, esp
push ebx
push eax
push [outsize]
push edi
push esi
call WriteFile
test eax, eax
jz short outerr
 
push esi
call CloseHandle
 
push ebx
call ExitProcess
;---------------------------------------------------------------------
get_file_name:
mov edi, esi
lodsb
cmp al, 0
jz short _ret
 
cmp al, '"'
setz dl
jz short @f
 
dec esi
;---------------------------------------------------------------------
@@:
mov edi, esi
;---------------------------------------------------------------------
@@loop:
lodsb
cmp al, 0
jz short _ret
 
cmp al, ' '
ja short @f
 
test dl, 1
jz short @@end
;---------------------------------------------------------------------
@@:
cmp al, '"'
jnz short @@loop
 
test dl, 1
jz short @@loop
;---------------------------------------------------------------------
@@end:
mov byte [esi-1], 0
;---------------------------------------------------------------------
skip_spaces:
lodsb
cmp al, 0
jz short @f
 
cmp al, ' '
jbe short skip_spaces
;---------------------------------------------------------------------
@@:
dec esi
cmp dword [esi+0],'--no'
jnz @f
 
cmp dword [esi+4],'logo'
jnz @f
 
mov [bNoLogo], 1
add esi, 8
jmp skip_spaces
;*********************************************************************
@@:
mov al, [esi]
;---------------------------------------------------------------------
_ret:
ret
;*********************************************************************
set_outfile:
mov eax,[outfilebest]
xor eax,[outfile1]
xor eax,[outfile2]
mov [outfile],eax
ret
;*********************************************************************
pack_calltrick_fail:
xor eax,eax
xor ebx,ebx
mov [ctn],eax
ret
;*********************************************************************
preprocess_calltrick:
; input preprocessing
push 4 ; PAGE_READWRITE
push 1000h ; MEM_COMMIT
push [insize]
push ebx
call VirtualAlloc
test eax, eax
jz pack_calltrick_fail
 
push eax
xor eax, eax
mov edi, ct1
mov ecx, 256/4
push edi
rep stosd
 
pop edi
mov ecx, [insize]
mov esi, [infile]
xchg eax, edx
pop eax
xchg eax, ebx
push ebx
;---------------------------------------------------------------------
input_pre:
lodsb
sub al, 0E8h
cmp al, 1
ja short input_pre_cont
 
cmp ecx, 5
jb short input_pre_done
 
lodsd
add eax, esi
sub eax, [infile]
cmp eax, [insize]
jae short xxx
 
cmp eax, 1000000h
jae short xxx
 
sub ecx, 4
bswap eax
mov [esi-4], eax
inc edx
mov [ebx], esi
add ebx, 4
jmp short input_pre_cont
;*********************************************************************
xxx:
sub esi, 4
movzx eax, byte [esi]
mov byte [eax+edi], 1
;---------------------------------------------------------------------
input_pre_cont:
loop input_pre
;---------------------------------------------------------------------
input_pre_done:
mov [ctn], edx
pop edx
xor eax, eax
mov ecx, 256
repnz scasb
jnz pack_calltrick_fail
not cl
 
mov [cti], cl
;---------------------------------------------------------------------
@@:
cmp ebx, edx
jz @f
 
sub ebx, 4
mov eax, [ebx]
mov [eax-4], cl
jmp @b
;*********************************************************************
@@:
xor ebx, ebx
push 8000h
push ebx
push edx
call VirtualFree
ret
;*********************************************************************
pack_lzma:
mov eax, [outfile]
add eax, 11
push [workmem]
push [insize]
push eax
push [infile]
call lzma_compress
 
mov ecx, [outfile]
mov edx, [ecx+12]
bswap edx
mov [ecx+12], edx
dec eax
ret
;*********************************************************************
preprocess_calltrick2:
; restore input
mov esi, [infile]
mov ecx, [ctn]
jecxz pc2l2
;---------------------------------------------------------------------
pc2l1:
lodsb
sub al, 0E8h
cmp al, 1
ja short pc2l1
 
mov al, [cti]
cmp [esi], al
jnz short pc2l1
 
lodsd
mov al, 0
bswap eax
sub eax, esi
add eax, [infile]
mov [esi-4], eax
loop pc2l1
;---------------------------------------------------------------------
pc2l2:
; input preprocessing
push 4 ; PAGE_READWRITE
push 1000h ; MEM_COMMIT
push [insize]
push ebx
call VirtualAlloc
test eax, eax
jz pack_calltrick_fail
 
mov edi, ct1
xchg eax, ebx
xor eax, eax
push edi
mov ecx, 256/4
rep stosd
 
pop edi
mov ecx, [insize]
mov esi, [infile]
xchg eax, edx
push ebx
;---------------------------------------------------------------------
input_pre2:
lodsb
;---------------------------------------------------------------------
@@:
cmp al, 0Fh
jnz short ip1
 
dec ecx
jz short input_pre_done2
 
lodsb
cmp al, 80h
jb short @b
 
cmp al, 90h
jb short @f
;---------------------------------------------------------------------
ip1:
sub al, 0E8h
cmp al, 1
ja short input_pre_cont2
;---------------------------------------------------------------------
@@:
cmp ecx, 5
jb short input_pre_done2
 
lodsd
add eax, esi
sub eax, [infile]
cmp eax, [insize]
jae short xxx2
 
cmp eax, 1000000h
jae short xxx2
 
sub ecx, 4
bswap eax
mov [esi-4], eax
inc edx
mov [ebx], esi
add ebx, 4
jmp short 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
pop edx
xor eax, eax
mov ecx, 256
repnz scasb
jnz pack_calltrick_fail
 
not cl
mov [cti], cl
;---------------------------------------------------------------------
@@:
cmp ebx, edx
jz @f
 
sub ebx, 4
mov eax, [ebx]
mov [eax-4], cl
jmp @b
;*********************************************************************
@@:
xor ebx, ebx
push 8000h
push ebx
push edx
call VirtualFree
ret
;*********************************************************************
extrn exit
extrn putchar
extrn fopen
extrn fread
extrn fwrite
extrn fclose
extrn fseek
extrn ftell
extrn malloc
extrn free
 
open_mode db "rb",0
create_mode db "wb",0
;*********************************************************************
combine_program_arguments: ; ecx = argc, ebx = argv
mov edi,program_arguments
cld
mov al,'"'
stosb
mov esi,[ebx]
;---------------------------------------------------------------------
@@:
lodsb
or al,al
jz @f
stosb
jmp @b
;*********************************************************************
@@:
add ebx,4
mov al,'"'
stosb
dec ecx
jz .no_args
;---------------------------------------------------------------------
.next_arg:
dec ecx
js .no_args
 
mov al,' '
stosb
mov esi,[ebx]
;---------------------------------------------------------------------
@@:
lodsb
or al,al
jz @f
stosb
jmp @b
;*********************************************************************
@@:
add ebx,4
jmp .next_arg
;*********************************************************************
.no_args:
mov al,0
stosb
ret
;*********************************************************************
WriteConsoleA: ; handle, buf, buf_size, num_wrote, NULL
push ebx esi edi
mov esi,[esp+16+4]
mov ecx,[esp+16+8]
cld
;---------------------------------------------------------------------
@@:
push ecx
movzx edx,byte[esi]
push edx
call putchar
add esp,4
inc esi
pop ecx
loop @b
 
pop edi esi ebx
ret 20
;*********************************************************************
CreateFileA: ; filename, access_mode, share_mode, security_attr, creation_disposition, flags, template
push ebx esi edi
cmp byte[esp+16+16],3
push open_mode
je @f
 
mov dword[esp],create_mode
;---------------------------------------------------------------------
@@:
pushd [esp+16+0+4]
call fopen
add esp,8
or eax,eax
jnz @f
 
or eax,-1
;---------------------------------------------------------------------
@@:
pop edi esi ebx
ret 28
;*********************************************************************
GetFileSize: ; handle, high_part
push ebx esi edi
pushd [esp+16+0]
call ftell
 
mov [esp],eax
pushd 2 0 [esp+16+0+12] ; go to EOF
call fseek
 
add esp,12
pushd [esp+16+0+4]
call ftell
 
add esp,4
xchg eax,[esp]
pushd 0 eax [esp+16+0+12] ; go to BOF
call fseek
 
add esp,12
pop eax
pop edi esi ebx
ret 8
;*********************************************************************
VirtualAlloc: ; address, size, alloc_type, mem_protection
push ebx esi edi
mov eax,[esp+16+4]
add eax,4095
and eax,not 4095
push eax
call malloc
 
add esp,4
pop edi esi ebx
ret 16
;*********************************************************************
ReadFile: ; handle, buf, buf_size, num_read, overlapped
push ebx esi edi
pushd [esp+16+0] 1 [esp+16+8+8] [esp+16+4+12]
call fread
 
add esp,16
mov [esp+16+12],eax
cmp eax,1
je @f
 
xor eax,eax
;---------------------------------------------------------------------
@@:
pop edi esi ebx
ret 20
;*********************************************************************
WriteFile: ; handle, buf, buf_size, num_wrote, overlapped
push ebx esi edi
pushd [esp+16+0] 1 [esp+16+8+8] [esp+16+4+12]
call fwrite
 
add esp,16
mov [esp+16+12],eax
cmp eax,1
je @f
 
xor eax,eax
;---------------------------------------------------------------------
@@:
pop edi esi ebx
ret 20
;*********************************************************************
CloseHandle: ; handle
push ebx esi edi
pushd [esp+16+0]
call fclose
add esp,4
pop edi esi ebx
ret 4
;*********************************************************************
VirtualFree: ; address, size, free_type
push ebx esi edi
pushd [esp+16+0]
call free
add esp,4
pop edi esi ebx
ret 12
;*********************************************************************
ExitProcess:
pushd [esp+4]
call exit
ret 4
;*********************************************************************
include 'lzma_compress.inc'
include 'lzma_set_dict_size.inc'
;*********************************************************************
section ".const" align 4
;---------------------------------------------------------------------
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
;---------------------------------------------------------------------
info_str db 'KPack - Kolibri Packer, version 0.11',13,10
db 'Uses LZMA v4.32 compression library',13,10,13,10
info_len = $ - info_str
usage_str db 'Written by diamond in 2006, 2007 specially for KolibriOS',13,10
db 'LZMA compression library is copyright (c) 1999-2005 by Igor Pavlov',13,10
db 13,10
db 'Usage: kpack [--nologo] <infile> [<outfile>]',13,10
usage_len = $ - usage_str
errload_str db 'Cannot load input file',13,10
errload_len = $ - errload_str
outfileerr_str db 'Cannot save output file',13,10
outfileerr_len = $ - outfileerr_str
nomem_str db 'No memory',13,10
nomem_len = $ - nomem_str
too_big_str db 'failed, output is greater than input.',13,10
too_big_len = $ - too_big_str
compressing_str db 'Compressing ... '
compressing_len = $ - compressing_str
;*********************************************************************
section ".data" writeable align 4
bNoLogo db 0
done_str db 'OK! Compression ratio: '
ratio dw '00'
db '%',13,10,13,10
done_len = $ - done_str
 
use_lzma = 1
 
use_no_calltrick = 0
use_calltrick1 = 40h
use_calltrick2 = 80h
 
method db 1
;*********************************************************************
section ".bss" writeable align 4
infilename dd ?
outfilename dd ?
infile dd ?
outfile1 dd ?
outfile2 dd ?
outfile dd ?
outfilebest dd ?
workmem dd ?
insize dd ?
outsize dd ?
LastWriteTime dq ?
LastAccessTime dq ?
CreationTime dq ?
lzma_dictsize dd ?
ct1 db 256 dup (?)
ctn dd ?
cti db ?
 
program_arguments db 512 dup (?)
 
include 'data.inc'
;*********************************************************************
/programs/other/kpack/linux/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/kpack/linux/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
;*****************************************************************************