Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1680 → Rev 1681

/programs/other/kpack/trunk/const_var.inc
0,0 → 1,59
;---------------------------------------------------------------------
aQuestion db '?'
caption_str db 'KPack',0
buttons1names db ' InFile:'
db 'OutFile:'
db ' Path:'
aCompress db 'COMPRESS',0
aDecompress db 'DECOMPRESS',0
definoutname db 0
defpath db '/RD/1/'
curedit dd 0
 
info_str db 'KPack - Kolibri Packer, version 0.13',10
db 'Uses LZMA v4.32 compression library',10,10
info_len = $ - info_str
usage_str db 'Written by diamond in 2006, 2007, 2009 specially for KolibriOS',10
db 'LZMA is copyright (c) 1999-2005 by Igor Pavlov',10
db 10
db 'Command-line usage:',10
db ' kpack infile [outfile]',10
db 'If no output file is specified,',10
db ' packed data will be written back to input file',10
db 10
db 'Window usage:',10
db " enter input file name, output file name and press needed button",10
usage_len = $ - usage_str
errload_str db 'Cannot load input file',10
errload_len = $ - errload_str
outfileerr_str db 'Cannot save output file',10
outfileerr_len = $ - outfileerr_str
nomem_str db 'No memory',10
nomem_len = $ - nomem_str
too_big_str db 'failed, output is greater than input.',10
too_big_len = $ - too_big_str
compressing_str db 'Compressing ... '
compressing_len = $ - compressing_str
lzma_memsmall_str db 'Warning: not enough memory for default LZMA settings,',10
db ' will use less dictionary size',10
lzma_memsmall_len = $ - lzma_memsmall_str
notpacked_str db 'Input file is not packed with KPack!',10
notpacked_len = $ - notpacked_str
unpacked_ok db 'Unpacked successful',10
unpacked_len = $ - unpacked_ok
 
done_str db 'OK! Compression ratio: '
ratio dw '00'
db '%',10
done_len = $ - done_str
;---------------------------------------------------------------------
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
;---------------------------------------------------------------------
/programs/other/kpack/trunk/data.inc
0,0 → 1,204
;---------------------------------------------------------------------
;rb 0xD3C ;unknown space area
params:
rb 256
;---------------------------------------------------------------------
color_table rd 10
skinheight rd 1
 
innamelen rd 1
inname rb 48
outnamelen rd 1
outname rb 48
pathlen rd 1
path rb 48
curedit_y rd 1
 
message_mem rb 80*20
message_cur_pos rd 1
 
outsize rd 1
infile rd 1
outfile rd 1
outfile1 rd 1
outfile2 rd 1
outfilebest rd 1
inbuftmp rd 1
workmem rd 1
lzma_dictsize rd 1
ct1 rb 256
ctn rd 1
cti rb 1
use_lzma = 1
 
use_no_calltrick = 0
use_calltrick1 = 40h
use_calltrick2 = 80h
 
method rb 1
 
;---------------------------------------------------------------------
align 4
fn70block:
fn70op rd 1
fn70start rd 1
fn70size rd 1
fn70zero rd 1
fn70dest rd 1
fullname rb 100
 
;---------------------------------------------------------------------
align 4
file_attr rd 8
insize rd 1 ; last qword in file_attr
rd 1
;---------------------------------------------------------------------
align 4
rb 4096
stacktop:
;---------------------------------------------------------------------
; Deconpress area
align 4
unpack.p rb 0x1F36*4
unpack.code_:
rd 1
unpack.range:
rd 1
unpack.rep0 rd 1
unpack.rep1 rd 1
unpack.rep2 rd 1
unpack.rep3 rd 1
unpack.previousByte rb 1
;---------------------------------------------------------------------
; Compress area
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
;---------------------------------------------------------------------
/programs/other/kpack/trunk/kpack.asm
14,13 → 14,15
 
db 'MENUET01'
dd 1
dd START ;_start ;0x239F ;0x23A4
dd IM_END ;bss_start ;0x32C9 i_end ;0x32C4
memf dd 0x53000 ;I_END ;bss_end ;memory;
dd stacktop ;bss_end ;0x59DC esp ;0x4ÑA0
dd params ;params ;0x4000 ;0x32C4
dd START
dd IM_END
memf dd I_END
dd stacktop
dd params
dd 0 ;cur_dir_path
;---------------------------------------------------------------------
include '..\..\..\macros.inc'
 
START:
call clear_messages
; set default path = /RD/1/
30,31 → 32,29
movsw
movsd
; get system window info
mov al,48
push 3
pop ebx
mov ecx,color_table
push 40
pop edx
int 40h
mcall 48,3,color_table,40
inc ebx
int 40h
mcall
mov [skinheight],eax
; check command line
mov esi,params
mov [esi+100h],byte 0
;--------------------------------------
parse_opt:
call skip_spaces
test al,al
jz default
 
mov edi,inname
call copy_name
test al,al
jz outeqin
 
mov edi,outname
call copy_name
test al,al
jnz default
;--------------------------------------
doit:
call draw_window
call pack
70,7 → 70,8
exit:
xor eax,eax
dec eax
int 40h
mcall
;--------------------------------------
outeqin:
mov ecx,48/4+1
mov esi,inname-4
104,26 → 105,29
;---------------------------------------------------------------------
dodraw:
call draw_window
;--------------------------------------
waitevent:
push 10
pop eax
int 40h
mcall 10
dec eax
jz dodraw
 
dec eax
jz keypressed
 
dec eax
jnz waitevent
; button pressed
mov al,17
int 40h
mcall 17
xchg al,ah
cmp al,7
jz but7
 
dec eax
jz exit
 
dec eax
jnz nopack
 
call pack
jmp waitevent
;---------------------------------------------------------------------
130,6 → 134,7
nopack:
dec eax
jnz nounpack
 
call unpack
jmp waitevent
;---------------------------------------------------------------------
154,16 → 159,20
add ecx,5
dec eax
jz edit
 
mov esi,outname
add ecx,0Ch
dec eax
jz edit
 
mov esi,path
add ecx,0Ch
;--------------------------------------
edit:
cmp esi,[curedit]
mov [curedit],0
jz waitevent
 
mov [curedit],esi
mov [curedit_y],ecx
mov al,1
173,30 → 182,36
add ebx,42h
add ecx,4
xor edx,edx
;--------------------------------------
@@:
cmp edi,48
jz waitevent
int 40h
 
mcall
add ebx,6
inc edi
jmp @b
;---------------------------------------------------------------------
keypressed:
mov al,2
int 40h
mcall 2
xchg al,ah
mov edi,[curedit]
test edi,edi
jz waitevent
 
mov ebx,[edi-4]
cmp al,8
jz backspace
 
cmp al,13
jz onenter
 
cmp al,20h
jb waitevent
 
cmp ebx,48
jz waitevent
 
mov [edi+ebx],al
inc ebx
mov [edi-4],ebx
205,27 → 220,21
imul ebx,6
add ebx,40h-6
shl ebx,16
mov al,13
mov bl,6
mov ecx,[curedit_y]
push ecx
shl ecx,16
mov cl,9
mov edx,[color_table+20]
int 40h
mcall 13,,,[color_table+20]
pop ecx
mov bx,cx
mov edx,edi
push 1
pop esi
mov ecx,[color_table+32]
mov al,4
int 40h
mcall 4,,[color_table+32],edi,1
jmp waitevent
;---------------------------------------------------------------------
backspace:
test ebx,ebx
jz waitevent
 
dec ebx
mov [edi-4],ebx
; clear symbol and set point
232,14 → 241,12
imul ebx,6
add ebx,40h
shl ebx,16
mov al,13
mov bl,6
mov ecx,[curedit_y]
push ecx
shl ecx,16
mov cl,9
mov edx,[color_table+20]
int 40h
mcall 13,,,[color_table+20]
xor edx,edx
shr ebx,16
inc ebx
246,13 → 253,13
inc ebx
pop ecx
add ecx,4
mov al,1
int 40h
mcall 1
jmp waitevent
;---------------------------------------------------------------------
onenter:
cmp [curedit],inname
jnz @f
 
push 2
pop eax
jmp nounpack
260,6 → 267,7
@@:
cmp [curedit],outname
jnz @f
 
call pack
jmp waitevent
;---------------------------------------------------------------------
286,9 → 294,7
and [ebx+8],dword 0
and [ebx+12],dword 0
mov [ebx+16],dword file_attr
push 70
pop eax
int 40h
mcall 70
test eax,eax
jz inopened
;---------------------------------------------------------------------
331,7 → 337,9
inc ecx
cmp ecx,28
jb @f
 
mov cl,28
;--------------------------------------
@@:
mov edx,ecx
xor eax,eax
342,17 → 350,15
add eax,448000h
pop ecx
add ecx,eax
push 64
pop eax
push 1
pop ebx
int 40h
mcall 64,1
test eax,eax
jz mem_ok
;--------------------------------------
; try to use smaller dictionary
meml0:
cmp edx,4
jbe memf1
 
dec edx
xor eax,eax
inc eax
364,11 → 370,10
pop ecx
push ecx
add ecx,eax
push 64
pop eax
int 40h
mcall 64
test eax,eax
jnz meml0
;--------------------------------------
; ok, say warning and continue
mov [lzma_dictsize],edx
mov esi,lzma_memsmall_str
390,11 → 395,10
mov [ebx+12],eax
mov esi,[infile]
mov [ebx+16],esi
push 70
pop eax
int 40h
mcall 70
test eax,eax
jnz infileerr
 
mov eax,[outfile]
mov [eax],dword 'KPCK' ;'KCPK'
mov ecx,[insize]
405,6 → 409,7
test eax,eax
js no_lzma_setds
jnz lzma_setds
 
mov ecx,[insize]
dec ecx
bsr eax,ecx
411,10 → 416,13
inc eax
cmp eax,28
jb lzma_setds
 
mov eax,28
;--------------------------------------
lzma_setds:
push eax
call lzma_set_dict_size
;--------------------------------------
no_lzma_setds:
push compressing_len
pop ecx
430,19 → 438,23
mov eax,[outfile]
mov [outfilebest],eax
mov [method],use_lzma
;--------------------------------------
@@:
call preprocess_calltrick
test eax,eax
jz noct1
 
call set_outfile
call pack_lzma
add eax,5
cmp eax,[outsize]
jae @f
 
mov [outsize],eax
mov eax,[outfile]
mov [outfilebest],eax
mov [method],use_lzma or use_calltrick1
;--------------------------------------
@@:
noct1:
call set_outfile
452,11 → 464,13
call preprocess_calltrick2
test eax,eax
jz noct2
 
call set_outfile
call pack_lzma
add eax,5
cmp eax,[outsize]
jae @f
 
mov [outsize],eax
mov eax,[outfile]
mov [outfilebest],eax
466,6 → 480,7
push [ctn]
mov al,[cti]
push eax
;--------------------------------------
@@:
noct2:
pop eax
475,6 → 490,7
mov eax,[outsize]
cmp eax,[insize]
jb packed_ok
 
mov esi,too_big_str
push too_big_len
pop ecx
487,6 → 503,7
mov [edi+8],eax
test al,use_calltrick1 or use_calltrick2
jz @f
 
mov ecx,[outsize]
add ecx,edi
mov eax,[ctn]
493,6 → 510,7
mov [ecx-5],eax
mov al,[cti]
mov [ecx-1],al
;--------------------------------------
@@:
mov eax,[outsize]
mov ecx,100
506,6 → 524,7
push done_len
pop ecx
call write_string
;--------------------------------------
; save output file
saveout:
mov esi,outname
516,11 → 535,10
mov ecx,[outsize]
mov [ebx+12],ecx
mov [ebx+16],eax
push 70
pop eax
int 40h
mcall 70
test eax,eax
jz @f
;--------------------------------------
outerr:
mov esi,outfileerr_str
push outfileerr_len
535,8 → 553,7
mov [ebx+8],eax
mov [ebx+12],eax
mov [ebx+16],dword file_attr
mov al,70
int 40h
mcall 70
ret
;---------------------------------------------------------------------
set_outfile:
563,20 → 580,25
mov esi,[infile]
xchg eax,edx
mov ebx,[inbuftmp]
;--------------------------------------
input_pre:
lodsb
sub al,0E8h
cmp al,1
ja input_pre_cont
 
cmp ecx,5
jb input_pre_done
 
lodsd
add eax,esi
sub eax,[infile]
cmp eax,[insize]
jae xxx
 
cmp eax,1000000h
jae xxx
 
sub ecx,4
; bswap is not supported on i386
xchg al,ah
592,8 → 614,10
sub esi,4
movzx eax,byte [esi]
mov [eax+edi],byte 1
;--------------------------------------
input_pre_cont:
loop input_pre
;--------------------------------------
input_pre_done:
mov [ctn],edx
xor eax,eax
600,11 → 624,13
mov ecx,256
repnz scasb
jnz pack_calltrick_fail
 
not cl
mov [cti],cl
@@:
cmp ebx,[inbuftmp]
jz @f
 
sub ebx,4
mov eax,[ebx]
mov [eax-4],cl
636,14 → 662,17
mov esi,[infile]
mov ecx,[ctn]
jecxz pc2l2
;--------------------------------------
pc2l1:
lodsb
sub al,0E8h
cmp al,1
ja pc2l1
 
mov al,[cti]
cmp [esi],al
jnz pc2l1
 
lodsd
shr ax,8
ror eax,16
652,6 → 681,7
add eax,[infile]
mov [esi-4],eax
loop pc2l1
;--------------------------------------
pc2l2:
; input preprocessing
mov edi,ct1
664,32 → 694,42
mov esi,[infile]
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,[infile]
cmp eax,[insize]
jae xxx2
 
cmp eax,1000000h
jae xxx2
 
sub ecx,4
xchg al,ah
rol eax,16
703,8 → 743,10
xxx2: sub esi,4
movzx eax,byte [esi]
mov [eax+edi],byte 1
;--------------------------------------
input_pre_cont2:
loop input_pre2
;--------------------------------------
input_pre_done2:
mov [ctn],edx
xor eax,eax
711,11 → 753,14
mov ecx,256
repnz scasb
jnz pack_calltrick_fail
 
not cl
mov [cti],cl
;--------------------------------------
@@:
cmp ebx,[inbuftmp]
jz @f
 
sub ebx,4
mov eax,[ebx]
mov [eax-4],cl
744,26 → 789,23
and [ebx+8],dword 0
and [ebx+12],dword 0
mov [ebx+16],dword file_attr
push 70
pop eax
int 40h
mcall 70
test eax,eax
jnz infileerr
 
mov eax,[insize]
test eax,eax
jz infileerr
 
mov ecx,[memf]
mov [infile],ecx
add ecx,eax
mov [outfile],ecx
mov [outfilebest],ecx
push 64
pop eax
push 1
pop ebx
int 40h
mcall 64,1
test eax,eax
jnz memf1
 
mov ebx,fn70block
mov [ebx],byte 0
mov eax,[insize]
770,14 → 812,14
mov [ebx+12],eax
mov esi,[infile]
mov [ebx+16],esi
push 70
pop eax
int 40h
mcall 70
test eax,eax
jnz infileerr
 
mov eax,[infile]
cmp [eax],dword 'KPCK' ;'KCPK'
cmp [eax],dword 'KPCK'
jz @f
;--------------------------------------
unpack_err:
mov esi,notpacked_str
push notpacked_len
787,13 → 829,10
@@:
mov ecx,[outfile]
add ecx,dword [eax+4]
push 64
pop eax
push 1
pop ebx
int 40h
mcall 64,1
test eax,eax
jnz memf1
 
mov esi,[infile]
mov eax,[esi+8]
push eax
801,9 → 840,11
cmp al,0C0h
pop eax
jz unpack_err
 
and al,not 0C0h
dec eax
jnz unpack_err
 
mov eax,[esi+4]
mov [outsize],eax
push eax
819,22 → 860,28
mov esi,[infile]
test [esi+8],byte 80h
jnz uctr1
 
test [esi+8],byte 40h
jz udone
 
add esi,[insize]
sub esi,5
lodsd
mov ecx,eax
jecxz udone
 
mov dl,[esi]
mov esi,[outfile]
;--------------------------------------
uc1:
lodsb
sub al,0E8h
cmp al,1
ja uc1
 
cmp [esi],dl
jnz uc1
 
lodsd
shr ax,8
ror eax,16
851,25 → 898,33
lodsd
mov ecx,eax
jecxz udone
 
mov dl,[esi]
mov esi,[outfile]
;--------------------------------------
uc2:
lodsb
;--------------------------------------
@@:
cmp al,15
jnz uf
 
lodsb
cmp al,80h
jb @b
 
cmp al,90h
jb @f
;--------------------------------------
uf:
sub al,0E8h
cmp al,1
ja uc2
;--------------------------------------
@@:
cmp [esi],dl
jnz uc2
 
lodsd
shr ax,8
ror eax,16
878,6 → 933,7
add eax,[outfile]
mov [esi-4],eax
loop uc2
;--------------------------------------
udone:
mov esi,unpacked_ok
push unpacked_len
884,6 → 940,7
pop ecx
call write_string
jmp saveout
 
;---------------------------------------------------------------------
get_full_name:
push esi
894,12 → 951,16
mov al,'/'
cmp [edi-1],al
jz @f
 
stosb
;--------------------------------------
@@:
pop esi
cmp [esi],al
jnz @f
 
mov edi,fullname
;--------------------------------------
@@:
mov ecx,[esi-4]
rep movsb
909,15 → 970,19
;---------------------------------------------------------------------
wsret:
ret
;---------------------------------------------------------------------
write_string:
; in: esi=pointer, ecx=length
mov edx,[message_cur_pos]
;--------------------------------------
x1:
lea edi,[message_mem+edx]
;--------------------------------------
do_write_char:
lodsb
cmp al,10
jz newline
 
stosb
inc edx
loop do_write_char
937,21 → 1002,20
add edx,ecx
pop ecx
loop x1
;--------------------------------------
x2:
mov [message_cur_pos],edx
; update window
push 13
pop eax
mov ebx,901A1h
mov ecx,[skinheight]
shl ecx,16
add ecx,3700DEh
mov edx,[color_table+20]
int 40h
mcall 13,<9,417>,,[color_table+20]
;--------------------------------------
draw_messages:
mov ebx,[skinheight]
add ebx,3Ch+12*10000h
mov edi,message_mem
;--------------------------------------
@@:
push edi
xor eax,eax
961,110 → 1025,87
sub ecx,79
neg ecx
mov esi,ecx
mov al,4
pop edi
mov edx,edi
mov ecx,[color_table+32]
int 40h
mcall 4,,[color_table+32],edi
add ebx,10
add edi,80
cmp edi,message_cur_pos
jb @b
 
ret
;---------------------------------------------------------------------
draw_window:
; start redraw
push 12
pop eax
xor ebx,ebx
inc ebx
int 40h
mcall 12,1
mov edi,[skinheight]
; define window
xor eax,eax
mov ebx,6401B3h
mov ecx,64011Eh
mov ecx,100 shl 16+286
add ecx,edi
mov edx,[color_table+20]
add edx,13000000h
push edi
mov edi,caption_str
int 40h
xor esi,esi
mcall ,<100,435>,,,,caption_str
pop edi
; lines - horizontal
mov edx,[color_table+36]
mov ebx,80160h
mov ebx,8 shl 16+352
mov ecx,edi
shl ecx,16
or ecx,edi
add ecx,20002h
mov al,38
int 40h
add ecx,0C000Ch
int 40h
add ecx,0C000Ch
int 40h
add ecx,0C000Ch
int 40h
add ecx,2 shl 16+2
mcall 38,,,[color_table+36]
add ecx,12 shl 16+12
mcall
add ecx,12 shl 16+12
mcall
add ecx,12 shl 16+12
mcall
; lines - vertical
mov ebx,80008h
sub ecx,240000h
int 40h
add ebx,340034h
int 40h
add ebx,1240124h
int 40h
sub ecx,36 shl 16
mcall ,<8,8>
add ebx,52 shl 16+52
mcall
add ebx,292 shl 16+292
mcall
; draw frame for messages data
push ecx
mov ebx,801AAh
add ecx,340010h
int 40h
add ecx,0E0h*10001h
int 40h
mov ebx,80008h
sub cx,0E0h
int 40h
mov ebx,1AA01AAh
int 40h
add ecx,52 shl 16+16
mcall ,<8,425>
add ecx,224*(1 shl 16+1)
mcall
sub cx,224
mcall ,<8,8>
mcall ,<426,426>
pop ecx
; define compress button
mov al,8
mov cx,12h
mov ebx,1620048h
push 2
pop edx
mov esi,[color_table+36]
int 40h
mov cx,18
mcall 8,<354,72>,,2,[color_table+36]
; uncompress button
add ecx,120000h
add ecx,18 shl 16
inc edx
int 40h
mcall
add ecx,-12h+0Ah+140000h
; question button
push esi
mov ebx,1A10009h
mov dl,7
int 40h
mov al,4
mov edx,aQuestion
push 1
pop esi
mcall ,<417,9>
shr ecx,16
lea ebx,[ecx+1A40002h]
mov ecx,[color_table+28]
int 40h
mcall 4,,[color_table+28],aQuestion,1
mov al,8
pop esi
; define settings buttons
mov ebx,90032h
mov ebx,9 shl 16+50
lea ecx,[edi+2]
shl ecx,16
mov cx,0Bh
mov cx,11
push 4
pop edx
;--------------------------------------
@@:
int 40h
add ecx,0C0000h
mcall
add ecx,12 shl 16
inc edx
cmp edx,6
jbe @b
1076,32 → 1117,28
pop edx
push 8
pop esi
;--------------------------------------
@@:
int 40h
mcall
add edx,esi
add ebx,0Ch
add ebx,12
cmp [edx-6],byte ' '
jnz @b
; text on compress and decompress buttons
lea ebx,[edi+8+1720000h]
push aCompress
pop edx
or ecx,80000000h
int 40h
mcall ,,,aCompress
lea ebx,[edi+1Ah+16A0000h]
push aDecompress
pop edx
int 40h
mcall ,,,aDecompress
; infile, outfile, path strings
mov edx,inname
lea ebx,[edi+400005h]
;--------------------------------------
editdraw:
mov esi,[edx-4]
mov al,4
mov ecx,[color_table+32]
int 40h
mcall 4,,[color_table+32],,[edx-4]
cmp edx,[curedit]
jnz cont
 
mov al,1
push ebx
push edx
1112,10 → 1149,12
lea ebx,[ebx+edx+2]
add ecx,4
xor edx,edx
;--------------------------------------
@@:
cmp esi,48
jz @f
int 40h
 
mcall
add ebx,6
inc esi
jmp @b
1123,6 → 1162,7
@@:
pop edx
pop ebx
;--------------------------------------
cont:
add edx,52
add ebx,0Ch
1131,38 → 1171,40
; draw messages
call draw_messages
; end redraw
push 12
pop eax
push 2
pop ebx
int 40h
mcall 12,2
ret
;---------------------------------------------------------------------
copy_name:
lea edx,[edi+48]
;--------------------------------------
@@:
lodsb
cmp al,' '
jbe copy_name_done
 
stosb
cmp edi,edx
jb @b
;--------------------------------------
@@:
lodsb
cmp al,' '
ja @b
;--------------------------------------
copy_name_done:
dec esi
sub edx,48
sub edi,edx
mov [edx-4],edi
 
;--------------------------------------
skip_spaces:
lodsb
cmp al,0
jz @f
 
cmp al,' '
jbe skip_spaces
;--------------------------------------
@@:
dec esi
ret
1172,8 → 1214,8
mov esi,[curedit]
test esi,esi
jz cleared_edit_points
 
push eax
mov al,13
mov ebx,[esi-4]
imul ebx,6
mov edi,ebx
1184,9 → 1226,9
mov ecx,[curedit_y]
shl ecx,16
or cx,9
mov edx,[color_table+20]
int 40h
mcall 13,,,[color_table+20]
pop eax
;--------------------------------------
cleared_edit_points:
ret
;---------------------------------------------------------------------
1199,124 → 1241,13
;lzma_decompress:
include 'lzma_decompress.inc'
;---------------------------------------------------------------------
aQuestion db '?'
caption_str db 'KPack',0
buttons1names db ' InFile:'
db 'OutFile:'
db ' Path:'
aCompress db 'COMPRESS',0
aDecompress db 'DECOMPRESS',0
definoutname db 0
defpath db '/RD/1/'
curedit dd 0
 
info_str db 'KPack - Kolibri Packer, version 0.13',10
db 'Uses LZMA v4.32 compression library',10,10
info_len = $ - info_str
usage_str db 'Written by diamond in 2006, 2007, 2009 specially for KolibriOS',10
db 'LZMA is copyright (c) 1999-2005 by Igor Pavlov',10
db 10
db 'Command-line usage:',10
db ' kpack infile [outfile]',10
db 'If no output file is specified,',10
db ' packed data will be written back to input file',10
db 10
db 'Window usage:',10
db " enter input file name, output file name and press needed button",10
usage_len = $ - usage_str
errload_str db 'Cannot load input file',10
errload_len = $ - errload_str
outfileerr_str db 'Cannot save output file',10
outfileerr_len = $ - outfileerr_str
nomem_str db 'No memory',10
nomem_len = $ - nomem_str
too_big_str db 'failed, output is greater than input.',10
too_big_len = $ - too_big_str
compressing_str db 'Compressing ... '
compressing_len = $ - compressing_str
lzma_memsmall_str db 'Warning: not enough memory for default LZMA settings,',10
db ' will use less dictionary size',10
lzma_memsmall_len = $ - lzma_memsmall_str
notpacked_str db 'Input file is not packed with KPack!',10
notpacked_len = $ - notpacked_str
unpacked_ok db 'Unpacked successful',10
unpacked_len = $ - unpacked_ok
 
done_str db 'OK! Compression ratio: '
ratio dw '00'
db '%',10
done_len = $ - done_str
;initialized variables and constants
include 'const_var.inc'
;---------------------------------------------------------------------
align 4
LiteralNextStates: ;0x30C: ;Binary tree
db 0,0,0,0,1,2,3,4,5,6,4,5
MatchNextStates: ;0x318:
db 7,7,7,7,7,7,7,10,10,10,10,10
RepNextStates: ;0x324:
db 8,8,8,8,8,8,8,11,11,11,11,11
ShortRepNextStates: ;0x330:
db 9,9,9,9,9,9,9,11,11,11,11,11
;0x33C:
;---------------------------------------------------------------------
IM_END:
;---------------------------------------------------------------------
;rb 0xD3C ;unknown space area
params:
rb 256
;uninitialized data
include 'data.inc'
;---------------------------------------------------------------------
color_table rd 10
skinheight rd 1
 
innamelen rd 1
inname rb 48
outnamelen rd 1
outname rb 48
pathlen rd 1
path rb 48
curedit_y rd 1
 
message_mem rb 80*20
message_cur_pos rd 1
 
outsize rd 1
infile rd 1
outfile rd 1
outfile1 rd 1
outfile2 rd 1
outfilebest rd 1
inbuftmp rd 1
workmem rd 1
lzma_dictsize rd 1
ct1 rb 256
ctn rd 1
cti rb 1
use_lzma = 1
 
use_no_calltrick = 0
use_calltrick1 = 40h
use_calltrick2 = 80h
 
method rb 1
 
;---------------------------------------------------------------------
align 4
fn70block:
fn70op rd 1
fn70start rd 1
fn70size rd 1
fn70zero rd 1
fn70dest rd 1
fullname rb 100
 
;---------------------------------------------------------------------
align 4
file_attr rd 8
insize rd 1 ; last qword in file_attr
rd 1
;---------------------------------------------------------------------
align 4
rb 4096
stacktop:
;---------------------------------------------------------------------
I_END:
;---------------------------------------------------------------------
/programs/other/kpack/trunk/lzma_compress.inc
1,9 → 1,16
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,0xC
sub esp,12
push ebx
push esi
push edi
10,13 → 17,13
push 2
pop esi
xor ebx,ebx
mov [esp+0x14],esi
mov [0x19FB0],bl
mov byte [0x19FB1],1
mov [esp+0x10],esi
mov [esp+20],esi
mov [g_FastPos],bl
mov byte [g_FastPos+1],1
mov [esp+16],esi
;----------------------------------------------------------
.labl_00:
mov ecx,[esp+0x10]
mov ecx,[esp+16]
xor edi,edi
sar ecx,1
dec ecx
24,92 → 31,100
shl edi,cl
cmp edi,ebx
jbe .labl_01
mov eax,[esp+0x14]
 
mov eax,[esp+20]
push edi
push dword [esp+0x14]
lea eax,[eax+0x19FB0]
push dword [esp+20]
lea eax,[eax+g_FastPos]
push eax
call _memset
add esp,0xC
add [esp+0x14],edi
add esp,12
add [esp+20],edi
;----------------------------------------------------------
.labl_01:
inc dword [esp+0x10]
cmp dword [esp+0x10],0x14
inc dword [esp+16]
cmp dword [esp+16],20
jl .labl_00
mov edi,[ebp+0x14]
 
mov edi,[ebp+20]
push 3
pop eax
mov ecx,edi
and ecx,eax
mov edx,0x80 ;'€'
mov [0x1CC30],edx
mov [0x51A00],esi
mov [0x1CC34],eax
mov [0x1B234],eax
mov [0x2956C],ebx
mov [0x19FA9],bl
mov [0x19FA8],bl
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:
mov [0x519F4],eax
mov eax,[0x29568]
mov [0x519F0],edi
;CLiteralEncoder_Create
mov [_numPrevBits],eax
mov eax,[_dictionarySize]
mov [_posEncoders],edi
add edi,0x6000
inc eax
mov [0x519F8],ebx
mov [0x519FC],ebx
mov [0x52218],edx
mov [0x51A0C],eax
mov [0x52224],edi
mov dword [0x52220],0xFF ;'ÿ'
call lz_cm_01
call cm_pr_07
call cm_pr_08
call cm_pr_09
push 0x7F ;''
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 [0x19F64],esi
mov [esp+0x10],ebx
mov [_lenEncoder+0xC88C],esi
mov [esp+16],ebx
;----------------------------------------------------------
.labl_03:
push dword [esp+0x10]
mov eax,0xD6D8
call cm_pr_01
inc dword [esp+0x10]
cmp dword [esp+0x10],4
push dword [esp+16]
mov eax,_lenEncoder
call CPriceTableEncoder_UpdateTable
inc dword [esp+16]
cmp dword [esp+16],4
jb .labl_03
mov [0x294F4],esi
 
mov [_repMatchLenEncoder+0xC88C],esi
xor esi,esi
;----------------------------------------------------------
.labl_04:
push esi
mov eax,0x1CC68
call cm_pr_01
mov eax,_repMatchLenEncoder
call CPriceTableEncoder_UpdateTable
inc esi
cmp esi,4
jb .labl_04
 
mov eax,[ebp+8]
mov esi,[ebp+0xC]
mov esi,[ebp+12]
dec eax
mov [0x52628],eax
mov eax,[ebp+0x10]
mov [_buffer],eax
mov eax,[ebp+16]
inc eax
mov [0x52630],eax
mov [_streamPos],eax
mov ecx,0x110000
xor eax,eax
mov [0x1CC28],ebx
mov [0x1CC2C],ebx
mov [0x1B400],ebx
mov [0x1B404],ebx
mov [0x52634],esi
mov dword [0x5262C],1
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 [0x5221C],ebx
mov [pack_pos],ebx
;----------------------------------------------------------
;MatchFinder_Init
.labl_08:
push 8
mov eax,ebx
118,6 → 133,7
.labl_07:
test al,1
je .labl_05
 
shr eax,1
xor eax,0xEDB88320
jmp .labl_06
128,16 → 144,18
.labl_06:
dec ecx
jne .labl_07
mov [0x52228+ebx*4],eax
 
mov [crc_table+ebx*4],eax
inc ebx
cmp ebx,0x100
cmp ebx,256
jb .labl_08
;----------------------------------------------------------
.labl_09:
call lz_cm_02
call CodeOneBlock
test al,al
jne .labl_09
mov eax,[0x52634]
 
mov eax,[pack_length]
pop edi
sub eax,esi
pop esi
144,7 → 162,7
pop ebx
mov esp,ebp
pop ebp
ret 0x10
ret 16
;*****************************************************************************
 
;* Call: ***************************************************************
159,25 → 177,27
;*****************************************************************************
 
;* Call: ***************************************************************
lz_cm_01:
and dword [0x51A10],0
and dword [0x51A14],0
or dword [0x51A04],0xFFFFFFFF
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,0x1BC08
mov edi,_repDistances
stosd
stosd
xor ebx,ebx
stosd
inc ebx
mov byte [0x519EC],0
mov byte [0x19FAB],0
;CBaseState_Init
mov byte [_state],0
mov byte [_previousByte],0
stosd
mov [0x51A08],ebx
mov byte [0x519ED],0
mov [_cacheSize],ebx
mov byte [_cache],0
xor ecx,ecx
;----------------------------------------------------------
.labl_00:
186,7 → 206,7
push 8
pop edx
sub edx,ecx
lea esi,[0x51A18+eax*4]
lea esi,[Models+eax*4]
shl edx,6
;----------------------------------------------------------
.labl_01:
198,102 → 218,107
add esi,4
dec eax
jne .labl_01
 
inc ecx
cmp ecx,9
jl .labl_00
push 0xC
 
push 12
pop edx
mov esi,0x400
mov esi,1024
mov eax,esi
mov ecx,edx
mov edi,0x29538
mov edi,_isRepG2
rep stosd
mov ecx,edx
mov edi,0x1AF00
mov edi,_isRepG1
rep stosd
mov ecx,edx
mov edi,0x1CC38
mov edi,_isRepG0
rep stosd
mov ecx,edx
mov edi,0x515B8
mov edi,_isRep
rep stosd
xor ecx,ecx
;----------------------------------------------------------
.labl_02:
lea edi,[ecx+0x1A7B0]
lea edi,[ecx+_isRep0Long]
mov eax,esi
stosd
stosd
stosd
stosd
lea edi,[ecx+0x1AF30]
lea edi,[ecx+_isMatch]
mov eax,esi
stosd
stosd
stosd
add ecx,0x40 ;'@'
cmp ecx,0x300
add ecx,64
cmp ecx,768
stosd
jl .labl_02
mov eax,[0x519F4]
mov ecx,[0x519F8]
 
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,[0x519F0]
mov eax,[_posEncoders]
lea edi,[edx+eax]
mov ecx,0x300
mov ecx,768
mov eax,esi
add edx,0xC00
add edx,3072
dec ebx
rep stosd
jne .labl_03
;----------------------------------------------------------
.labl_04:
mov edi,0x1BC18
mov edi,_posSlotEncoder
;----------------------------------------------------------
.labl_05:
push 6
pop ecx
mov eax,edi
call cm_pr_15
add edi,0x404
cmp edi,0x1CC28
call CBitTreeEncoder_Init
add edi,1028
cmp edi,lastPosSlotFillingPos
jl .labl_05
push 0x72 ;'r'
 
push 114
mov eax,esi
pop ecx
mov edi,0x1B238
mov esi,0xD6D8
mov edi,_literalEncoder
mov esi,_lenEncoder
rep stosd
call cm_pr_00
mov esi,0x1CC68
call cm_pr_00
call CPriceTableEncoder_Init
mov esi,_repMatchLenEncoder
call CPriceTableEncoder_Init
push 4
pop ecx
mov eax,0x515E8
call cm_pr_15
mov eax,_posAlignEncoder
call CBitTreeEncoder_Init
pop edi
xor eax,eax
pop esi
mov byte [0x19FAA],0 ;0x1B238
mov [0x29574],eax
mov [0x1AEF8],eax
mov [0x1AEFC],eax
mov byte [_longestMatchWasFound],0
mov [_optimumEndIndex],eax
mov [_optimumCurrentIndex],eax
mov [_additionalOffset],eax
pop ebx
ret
;*****************************************************************************
 
;* Call: ***************************************************************
lz_cm_02:
CodeOneBlock:
sub esp,0x2C
cmp byte [0x19FA8],0
cmp byte [_finished],0
push ebx
push ebp
push esi
305,229 → 330,244
jmp .labl_28
;----------------------------------------------------------
.labl_01:
mov ebp,[0x1B400]
mov edi,[0x1B404]
mov ebp,[nowPos64]
mov edi,[nowPos64+4]
mov eax,ebp
or eax,edi
mov byte [0x19FA8],1
mov [esp+0x34],ebp
mov [esp+0x38],edi
mov byte [_finished],1
mov [esp+52],ebp
mov [esp+56],edi
jne .labl_04
mov eax,[0x52630]
sub eax,[0x5262C]
 
mov eax,[_streamPos]
sub eax,[_pos]
jne .labl_03
 
push 5
pop esi
;----------------------------------------------------------
.labl_02:
call cm_pr_13
call RangeEncoder_ShiftLow
dec esi
jne .labl_02
 
jmp .labl_00
;----------------------------------------------------------
.labl_03:
call cm_pr_06
movzx esi,byte [0x519EC]
call ReadMatchDistances
movzx esi,byte [_state]
mov edx,esi
shl edx,6
xor edi,edi
push edi
add edx,0x1AF30
call cm_pr_14
add edx,_isMatch
call CMyBitEncoder_Encode
mov al,[esi+LiteralNextStates]
mov ecx,[0x5262C]
mov [0x519EC],al
mov eax,[0x52628]
sub eax,[0x1AEFC]
mov ecx,[_pos]
mov [_state],al
mov eax,[_buffer]
sub eax,[_additionalOffset]
mov bl,[eax+ecx]
mov al,[0x19FAB]
mov [esp+0x18],bl
push dword [esp+0x18]
mov al,[_previousByte]
mov [esp+24],bl
push dword [esp+24]
push edi
call cm_pr_04
imul eax,eax,0xC00
add eax,[0x519F0]
call CState_IsCharState
imul eax,eax,3072
add eax,[_posEncoders]
push eax
call cm_pr_03
dec dword [0x1AEFC]
call CLiteralEncoder2_Encode
dec dword [_additionalOffset]
xor ebp,ebp
inc ebp
mov [0x19FAB],bl
mov [0x1B400],ebp
mov [0x1B404],edi
mov [_previousByte],bl
mov [nowPos64],ebp
mov [nowPos64+4],edi
;----------------------------------------------------------
.labl_04:
mov eax,[0x52630]
sub eax,[0x5262C]
mov eax,[_streamPos]
sub eax,[_pos]
jne .labl_06
 
push 5
pop esi
;----------------------------------------------------------
.labl_05:
call cm_pr_13
call RangeEncoder_ShiftLow
dec esi
jne .labl_05
 
jmp .labl_00
;----------------------------------------------------------
.labl_06:
lea eax,[esp+0x14]
lea eax,[esp+20]
push eax
lea eax,[esp+0x14]
lea eax,[esp+20]
push eax
mov ebx,ebp
push ebp
and ebx,3
call lz_cm_03
cmp dword [esp+0x14],1
call GetOptimum
cmp dword [esp+20],1
jne .labl_09
cmp dword [esp+0x10],0xFFFFFFFF
 
cmp dword [esp+16],0xFFFFFFFF
jne .labl_09
movzx eax,byte [0x519EC]
 
movzx eax,byte [_state]
shl eax,4
add eax,ebx
push 0
lea edx,[0x1AF30+eax*4]
call cm_pr_14
mov eax,[0x52628]
mov esi,[0x1AEFC]
mov ebx,[0x5262C]
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+0x18],al
mov al,[0x19FAB]
mov [esp+24],al
mov al,[_previousByte]
push ebp
call cm_pr_04
imul eax,eax,0xC00
add eax,[0x519F0]
cmp byte [0x519EC],7
push dword [esp+0x18]
call CState_IsCharState
imul eax,eax,3072
add eax,[_posEncoders]
cmp byte [_state],7
push dword [esp+24]
jb .labl_07
mov ecx,[0x52628]
sub ecx,[0x1BC08]
 
mov ecx,[_buffer]
sub ecx,[_repDistances]
sub ecx,esi
mov cl,[ecx+ebx-1]
mov [esp+0x34],cl
push dword [esp+0x34]
mov [esp+52],cl
push dword [esp+52]
push eax
call lz_cm_04
call CLiteralEncoder2_EncodeMatched
jmp .labl_08
;----------------------------------------------------------
.labl_07:
push eax
call cm_pr_03
call CLiteralEncoder2_Encode
;----------------------------------------------------------
.labl_08:
movzx eax,byte [0x519EC]
movzx eax,byte [_state]
mov al,[eax+LiteralNextStates]
mov [0x519EC],al
mov al,[esp+0x18]
mov [_state],al
mov al,[esp+24]
jmp .labl_24
;----------------------------------------------------------
.labl_09:
movzx edi,byte [0x519EC]
movzx edi,byte [_state]
mov eax,edi
shl eax,4
add eax,ebx
shl eax,2
push 1
lea edx,[eax+0x1AF30]
mov [esp+0x28],eax
call cm_pr_14
cmp dword [esp+0x10],4
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+0x515B8]
call cm_pr_14
cmp dword [esp+0x10],0
lea edx,[esi+0x1CC38]
lea edx,[esi+_isRep]
call CMyBitEncoder_Encode
cmp dword [esp+16],0
lea edx,[esi+_isRepG0]
jne .labl_10
 
push 0
call cm_pr_14
mov edx,[esp+0x24]
call CMyBitEncoder_Encode
mov edx,[esp+36]
xor eax,eax
cmp dword [esp+0x14],1
lea edx,[edx+0x1A7B0]
cmp dword [esp+20],1
lea edx,[edx+_isRep0Long]
setne al
jmp .labl_12
;----------------------------------------------------------
.labl_10:
push 1
call cm_pr_14
cmp dword [esp+0x10],1
lea edx,[esi+0x1AF00]
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 cm_pr_14
mov eax,[esp+0x10]
call CMyBitEncoder_Encode
mov eax,[esp+16]
add eax,0xFFFFFFFE
lea edx,[esi+0x29538]
lea edx,[esi+_isRepG2]
;----------------------------------------------------------
.labl_12:
push eax
;----------------------------------------------------------
.labl_13:
call cm_pr_14
mov eax,[esp+0x14]
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,0x1CC68
call cm_pr_02
mov esi,_repMatchLenEncoder
call CPriceTableEncoder_Encode
mov al,[edi+RepNextStates]
;----------------------------------------------------------
.labl_15:
mov [0x519EC],al
mov eax,[esp+0x10]
mov ecx,[0x1BC08+eax*4]
mov [_state],al
mov eax,[esp+16]
mov ecx,[_repDistances+eax*4]
test eax,eax
je .labl_23
;----------------------------------------------------------
.labl_16:
dec eax
mov edx,[0x1BC08+eax*4]
mov [0x1BC0C+eax*4],edx
mov edx,[_repDistances+eax*4]
mov [_repDistances+4+eax*4],edx
jne .labl_16
mov [0x1BC08],ecx
 
mov [_repDistances],ecx
jmp .labl_23
;----------------------------------------------------------
.labl_17:
push 0
lea edx,[0x515B8+edi*4]
call cm_pr_14
lea edx,[_isRep+edi*4]
call CMyBitEncoder_Encode
mov al,[edi+MatchNextStates]
mov edi,[esp+0x14]
mov [0x519EC],al
mov edi,[esp+20]
mov [_state],al
add edi,0xFFFFFFFE
mov eax,edi
mov esi,0xD6D8
call cm_pr_02
sub dword [esp+0x10],4
mov eax,[esp+0x10]
call cm_pr_000
cmp dword [esp+0x14],6
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,0x404
imul edi,edi,1028
push ebx
add edi,0x1BC18
add edi,_posSlotEncoder
call cm_pr_16
cmp ebx,4
jb .labl_21
mov esi,[esp+0x10]
 
mov esi,[esp+16]
xor eax,eax
inc eax
mov ecx,ebx
538,29 → 578,32
or edi,2
shl edi,cl
sub esi,edi
cmp ebx,0xE
cmp ebx,14
jnb .labl_20
mov [esp+0x20],esi
mov [esp+0x1C],eax
 
mov [esp+32],esi
mov [esp+28],eax
test ecx,ecx
jle .labl_21
mov [esp+0x24],ecx
 
mov [esp+36],ecx
;----------------------------------------------------------
.labl_19:
mov edx,[esp+0x1C]
mov esi,[esp+0x20]
mov edx,[esp+28]
mov esi,[esp+32]
sub edx,ebx
add edx,edi
and esi,1
push esi
lea edx,[0x1B234+edx*4]
call cm_pr_14
mov eax,[esp+0x1C]
shr dword [esp+0x20],1
dec dword [esp+0x24]
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+0x1C],eax
mov [esp+28],eax
jne .labl_19
 
jmp .labl_21
;----------------------------------------------------------
.labl_20:
568,77 → 611,84
mov ecx,esi
shr ecx,4
push ecx
call lz_cm_05
call RangeEncoder_EncodeDirectBits
and esi,0xF
push esi
call lz_cm_06
dec dword [0x1B230]
call CBitTreeEncoder_ReverseEncode
dec dword [_alignPriceCount]
jne .labl_21
call cm_pr_09
 
call FillAlignPrices
;----------------------------------------------------------
.labl_21:
mov eax,0x1BC14
mov eax,_repDistances+12
;----------------------------------------------------------
.labl_22:
mov ecx,[eax-4]
mov [eax],ecx
sub eax,4
cmp eax,0x1BC08
cmp eax,_repDistances
jne .labl_22
mov eax,[esp+0x10]
mov [0x1BC08],eax
 
mov eax,[esp+16]
mov [_repDistances],eax
;----------------------------------------------------------
.labl_23:
mov eax,[0x52628]
mov esi,[0x1AEFC]
mov ebx,[0x5262C]
mov ecx,[esp+0x14]
mov edi,[0x1B404]
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+0x14]
add ebp,[esp+0x14]
mov [0x19FAB],al
sub esi,[esp+20]
add ebp,[esp+20]
mov [_previousByte],al
adc edi,0
mov eax,ebp
sub eax,[0x1CC28]
sub eax,[lastPosSlotFillingPos]
mov ecx,edi
sbb ecx,[0x1CC2C]
mov [0x1AEFC],esi
mov [0x1B400],ebp
mov [0x1B404],edi
mov [esp+0x28],ecx
sbb ecx,[lastPosSlotFillingPos+4]
mov [_additionalOffset],esi
mov [nowPos64],ebp
mov [nowPos64+4],edi
mov [esp+40],ecx
jne .labl_25
cmp eax,0x200
 
cmp eax,512
jb .labl_26
;----------------------------------------------------------
.labl_25:
call cm_pr_07
call cm_pr_08
mov [0x1CC28],ebp
mov [0x1CC2C],edi
call FillPosSlotPrices
call FillDistancesPrices
mov [lastPosSlotFillingPos],ebp
mov [lastPosSlotFillingPos+4],edi
;----------------------------------------------------------
.labl_26:
test esi,esi
jne .labl_06
mov eax,[0x52630]
 
mov eax,[_streamPos]
sub eax,ebx
je .labl_29
 
mov ecx,ebp
sub ecx,[esp+0x34]
sub ecx,[esp+52]
mov eax,edi
sbb eax,[esp+0x38]
sbb eax,[esp+56]
test eax,eax
ja .labl_27
 
jb .labl_06
 
cmp ecx,0x1000
jb .labl_06
;----------------------------------------------------------
.labl_27:
mov byte [0x19FA8],0
mov byte [_finished],0
mov al,1
;----------------------------------------------------------
.labl_28:
646,7 → 696,7
pop esi
pop ebp
pop ebx
add esp,0x2C
add esp,44
ret
;----------------------------------------------------------
.labl_29:
654,305 → 704,325
pop esi
;----------------------------------------------------------
.labl_30:
call cm_pr_13
call RangeEncoder_ShiftLow
dec esi
jne .labl_30
 
jmp .labl_00
;*****************************************************************************
 
;* Call: ***************************************************************
lz_cm_03:
GetOptimum:
push ebp
mov ebp,esp
mov ecx,[0x1AEF8]
sub esp,0x74
mov ecx,[_optimumCurrentIndex]
sub esp,116
push esi
cmp [0x29574],ecx
cmp [_optimumEndIndex],ecx
je .labl_00
 
mov eax,ecx
imul eax,eax,0x28
add eax,0x29578
mov edx,[eax+0x10]
mov eax,[eax+0x14]
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+0x10]
mov ecx,[ebp+16]
mov [ecx],esi
mov ecx,[ebp+0xC]
mov ecx,[ebp+12]
mov [ecx],eax
mov [0x1AEF8],edx
mov [_optimumCurrentIndex],edx
jmp .labl_76
;----------------------------------------------------------
.labl_00:
push edi
xor edi,edi
cmp byte [0x19FAA],0 ;0x1B238
mov [0x29574],edi
mov [0x1AEF8],edi
cmp byte [_longestMatchWasFound],0
mov [_optimumEndIndex],edi
mov [_optimumCurrentIndex],edi
jne .labl_01
call cm_pr_06
 
call ReadMatchDistances
jmp .labl_02
;----------------------------------------------------------
.labl_01:
mov eax,[0x19FAC]
mov byte [0x19FAA],0 ;0x1B238
mov eax,[_longestMatchLength]
mov byte [_longestMatchWasFound],0
;----------------------------------------------------------
.labl_02:
push ebx
mov ebx,[ebp+8]
mov [ebp-0x10],eax
mov [ebp-16],eax
mov eax,ebx
shl eax,2
mov [ebp-0x4C],eax
mov [ebp-76],eax
;----------------------------------------------------------
.labl_03:
mov esi,edi
shl esi,2
mov eax,[esi+0x1BC08]
mov eax,[esi+_repDistances]
push eax
mov [ebp+esi-0x64],eax
mov [ebp+esi-100],eax
push dword 0xFFFFFFFF
mov eax,0x111
call cm_pr_18
mov [ebp+esi-0x74],eax
mov eax,273
call GetMatchLen
mov [ebp+esi-116],eax
test edi,edi
je .labl_04
mov ecx,[ebp-0x4C]
cmp eax,[ebp+ecx-0x74]
 
mov ecx,[ebp-76]
cmp eax,[ebp+ecx-116]
jbe .labl_05
;----------------------------------------------------------
.labl_04:
mov ebx,edi
mov [ebp-0x4C],esi
mov [ebp-76],esi
;----------------------------------------------------------
.labl_05:
inc edi
cmp edi,4
jb .labl_03
mov eax,[ebp+ebx*4-0x74]
mov ecx,0x80 ;'€'
mov [ebp-0x44],eax
 
mov eax,[ebp+ebx*4-116]
mov ecx,128
mov [ebp-68],eax
cmp eax,ecx
jb .labl_06
mov ecx,[ebp+0xC]
 
mov ecx,[ebp+12]
mov [ecx],ebx
jmp .labl_07
;----------------------------------------------------------
.labl_06:
cmp [ebp-0x10],ecx
cmp [ebp-16],ecx
jb .labl_08
mov eax,[0x1ACB0]
mov ecx,[ebp+0xC]
 
mov eax,[distances+512]
mov ecx,[ebp+12]
add eax,4
mov [ecx],eax
mov eax,[ebp-0x10]
mov eax,[ebp-16]
;----------------------------------------------------------
.labl_07:
mov ecx,[ebp+0x10]
mov ecx,[ebp+16]
mov [ecx],eax
dec eax
call lz_cm_07
call MovePos
jmp .labl_75
;----------------------------------------------------------
.labl_08:
mov ecx,[0x52628]
mov eax,[0x5262C]
mov ecx,[_buffer]
mov eax,[_pos]
mov dl,[eax+ecx-1]
sub eax,[0x1BC08]
mov bl,[0x519EC]
mov [0x29578],bl
sub eax,[_repDistances]
mov bl,[_state]
mov [state.State],bl
mov al,[eax+ecx-2]
mov [ebp-0x34],al
mov [ebp-52],al
mov eax,[ebp+8]
and eax,3
movzx ecx,bl
shl ecx,4
add ecx,eax
mov esi,[0x1AF30+ecx*4]
mov [ebp-0x1C],eax
mov esi,[_isMatch+ecx*4]
mov [ebp-28],eax
cmp bl,7
sbb al,al
mov [ebp-0x30],dl
push dword [ebp-0x30]
mov [ebp-48],dl
push dword [ebp-48]
inc al
push dword [ebp-0x34]
push dword [ebp-52]
movzx eax,al
push eax
push dword [ebp+8]
mov al,[0x19FAB]
mov [ebp-0x4C],esi
call cm_pr_05
or dword [0x295B4],0xFFFFFFFF
and dword [0x295B0],0
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,[0x51A18+esi*4]
mov byte [0x295A1],0
mov [0x295AC],eax
lea esi,[ebp-0x64]
mov edi,0x29590
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,0x800
mov eax,2048
mov ecx,eax
sub ecx,[ebp-0x4C]
sub ecx,[ebp-76]
movsd
shr ecx,2
mov edx,[0x51A18+ecx*4]
mov edx,[Models+ecx*4]
movzx ecx,bl
movsd
mov esi,[0x515B8+ecx*4]
mov esi,[_isRep+ecx*4]
sub eax,esi
shr eax,2
mov edi,[0x51A18+eax*4]
mov al,[ebp-0x30]
mov edi,[Models+eax*4]
mov al,[ebp-48]
add edi,edx
mov [ebp-0x4C],edx
cmp [ebp-0x34],al
mov [ebp-76],edx
cmp [ebp-52],al
jne .labl_09
push dword [ebp-0x1C]
 
push dword [ebp-28]
mov al,bl
call cm_pr_10
call GetRepLen1Price
add eax,edi
cmp eax,[0x295AC]
cmp eax,[state.Price+40]
jnb .labl_09
and dword [0x295B4],0
mov [0x295AC],eax
mov byte [0x295A1],0
 
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-0x10],eax
cmp [ebp-16],eax
jnb .labl_10
mov eax,[ebp+0xC]
mov ecx,[0x295B4]
 
mov eax,[ebp+12]
mov ecx,[state.BackPrev+40]
mov [eax],ecx
mov eax,[ebp+0x10]
mov eax,[ebp+16]
mov dword [eax],1
jmp .labl_75
;----------------------------------------------------------
.labl_10:
mov ecx,[ebp-0x10]
mov ecx,[ebp-16]
shr esi,2
mov esi,[0x51A18+esi*4]
add esi,[ebp-0x4C]
mov [ebp-0x4C],esi
cmp ecx,[ebp-0x44]
mov esi,[Models+esi*4]
add esi,[ebp-76]
mov [ebp-76],esi
cmp ecx,[ebp-68]
ja .labl_11
and dword [ebp-0x10],0
 
and dword [ebp-16],0
;----------------------------------------------------------
.labl_11:
mov [ebp-0x18],eax
cmp [ebp-0x10],eax
mov [ebp-24],eax
cmp [ebp-16],eax
jb .labl_13
mov esi,0x295DC
 
mov esi,state.BackPrev+40*2
;----------------------------------------------------------
.labl_12:
mov eax,[ebp-0x18]
mov edx,[0x1AAB0+eax*4]
push dword [ebp-0x1C]
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 cm_pr_12
add eax,[ebp-0x4C]
inc dword [ebp-0x18]
call GetPosLenPrice
add eax,[ebp-76]
inc dword [ebp-24]
mov [esi-8],eax
mov eax,[ebp-0x18]
mov byte [esi-0x13],0
add esi,0x28 ;'('
cmp eax,[ebp-0x10]
mov eax,[ebp-24]
mov byte [esi-19],0
add esi,40
cmp eax,[ebp-16]
jbe .labl_12
;----------------------------------------------------------
.labl_13:
mov ecx,[ebp-0x10]
cmp ecx,[ebp-0x44]
mov ecx,[ebp-16]
cmp ecx,[ebp-68]
jnb .labl_14
mov ecx,[ebp-0x44]
mov [ebp-0x10],ecx
 
mov ecx,[ebp-68]
mov [ebp-16],ecx
;----------------------------------------------------------
.labl_14:
cmp [ebp-0x18],ecx
cmp [ebp-24],ecx
ja .labl_16
mov eax,[ebp-0x18]
sub ecx,[ebp-0x18]
imul eax,eax,0x28
add eax,0x29584
 
mov eax,[ebp-24]
sub ecx,[ebp-24]
imul eax,eax,40
add eax,state.Price
inc ecx
;----------------------------------------------------------
.labl_15:
mov dword [eax],0x0FFFFFFF
add eax,0x28 ;'('
mov dword [eax],kIfinityPrice
add eax,40
dec ecx
jne .labl_15
;----------------------------------------------------------
.labl_16:
and dword [ebp-0x18],0
and dword [ebp-24],0
;----------------------------------------------------------
.labl_17:
mov eax,[ebp-0x18]
mov eax,[ebp+eax*4-0x74]
mov eax,[ebp-24]
mov eax,[ebp+eax*4-116]
push 2
pop ecx
mov [ebp-0x20],ecx
mov [ebp-32],ecx
cmp eax,ecx
jb .labl_20
mov esi,0x295D4
 
mov esi,state.Price+40*2
;----------------------------------------------------------
.labl_18:
push dword [ebp-0x1C]
mov edx,[ebp-0x18]
push dword [ebp-28]
mov edx,[ebp-24]
movzx eax,bl
push eax
mov eax,[ebp-0x20]
call cm_pr_11
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-0x18]
mov eax,[ebp-24]
mov [esi+8],eax
mov byte [esi-0xB],0
mov byte [esi-11],0
;----------------------------------------------------------
.labl_19:
inc dword [ebp-0x20]
mov eax,[ebp-0x18]
mov ecx,[ebp-0x20]
add esi,0x28 ;'('
cmp ecx,[ebp+eax*4-0x74]
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-0x18]
cmp dword [ebp-0x18],4
inc dword [ebp-24]
cmp dword [ebp-24],4
jb .labl_17
mov eax,[ebp-0x10]
 
mov eax,[ebp-16]
xor ecx,ecx
inc ecx
mov [ebp-8],eax
mov [ebp-0xC],ecx
mov [ebp-12],ecx
cmp eax,ecx
je .labl_74
;----------------------------------------------------------
.labl_21:
mov edi,[ebp-0xC]
mov edi,[ebp-12]
inc dword [ebp+8]
mov ebx,edi
imul ebx,ebx,0x28
mov dl,[ebx+0x29579]
mov esi,[ebx+0x29588]
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+0x2957A],0
cmp byte [ebx+state.Prev2],0
je .labl_23
mov eax,[ebx+0x2957C]
imul eax,eax,0x28
cmp dword [ebx+0x29580],4
mov al,[eax+0x29578]
 
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
;----------------------------------------------------------
962,8 → 1032,8
;----------------------------------------------------------
.labl_23:
mov eax,esi
imul eax,eax,0x28
mov al,[eax+0x29578]
imul eax,eax,40
mov al,[eax+state.State]
;----------------------------------------------------------
.labl_24:
movzx eax,al
972,16 → 1042,18
;----------------------------------------------------------
.labl_25:
mov eax,esi
imul eax,eax,0x28
mov cl,[eax+0x29578]
imul eax,eax,40
mov cl,[eax+state.State]
;----------------------------------------------------------
.labl_26:
dec edi
cmp esi,edi
jne .labl_29
cmp dword [ebx+0x2958C],0
 
cmp dword [ebx+state.BackPrev],0
movzx eax,cl
jne .labl_27
 
mov al,[eax+ShortRepNextStates]
jmp .labl_28
;----------------------------------------------------------
989,16 → 1061,18
mov al,[eax+LiteralNextStates]
;----------------------------------------------------------
.labl_28:
mov [ebp-0x14],al
mov [ebp-20],al
jmp .labl_35
;----------------------------------------------------------
.labl_29:
test dl,dl
je .labl_31
cmp byte [ebx+0x2957A],0
 
cmp byte [ebx+state.Prev2],0
je .labl_31
mov esi,[ebx+0x2957C]
mov eax,[ebx+0x29580]
 
mov esi,[ebx+state.PosPrev2]
mov eax,[ebx+state.BackPrev2]
movzx ecx,cl
;----------------------------------------------------------
.labl_30:
1006,28 → 1080,31
jmp .labl_32
;----------------------------------------------------------
.labl_31:
mov eax,[ebx+0x2958C]
mov eax,[ebx+state.BackPrev]
movzx ecx,cl
cmp eax,4
jb .labl_30
 
mov cl,[ecx+MatchNextStates]
;----------------------------------------------------------
.labl_32:
imul esi,esi,0x28
add esi,0x29578
mov [ebp-0x14],cl
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+0x18]
 
mov ecx,[edx+eax*4+24]
xor esi,esi
inc esi
mov [ebp-0x64],ecx
mov [ebp-100],ecx
cmp eax,esi
jb .labl_33
lea esi,[edx+0x18]
 
lea esi,[edx+24]
mov ecx,eax
lea edi,[ebp-0x60]
lea edi,[ebp-96]
rep movsd
lea esi,[eax+1]
cmp esi,4
1035,9 → 1112,9
;----------------------------------------------------------
.labl_33:
push 4
lea edx,[edx+esi*4+0x18]
lea edx,[edx+esi*4+24]
pop ecx
lea edi,[ebp+esi*4-0x64]
lea edi,[ebp+esi*4-100]
sub ecx,esi
mov esi,edx
rep movsd
1045,143 → 1122,154
;----------------------------------------------------------
.labl_34:
add eax,0xFFFFFFFC
mov [ebp-0x64],eax
lea esi,[edx+0x18]
lea edi,[ebp-0x60]
mov [ebp-100],eax
lea esi,[edx+24]
lea edi,[ebp-96]
movsd
movsd
movsd
;----------------------------------------------------------
.labl_35:
mov al,[ebp-0x14]
mov [ebx+0x29578],al
lea edi,[ebx+0x29590]
lea esi,[ebp-0x64]
mov al,[ebp-20]
mov [ebx+state.State],al
lea edi,[ebx+state.Backs]
lea esi,[ebp-100]
movsd
movsd
movsd
movsd
call cm_pr_06
mov [ebp-0x2C],eax
cmp eax,0x80 ;'€'
call ReadMatchDistances
mov [ebp-44],eax
cmp eax,128
jnb .labl_73
mov eax,[ebx+0x29584]
mov edi,[0x5262C]
 
mov eax,[ebx+state.Price]
mov edi,[_pos]
mov esi,[ebp+8]
mov [ebp-0x48],eax
mov eax,[0x52628]
mov [ebp-72],eax
mov eax,[_buffer]
lea eax,[edi+eax-1]
mov cl,[eax]
mov [ebp-0x30],cl
push dword [ebp-0x30]
mov [ebp-48],cl
push dword [ebp-48]
mov ecx,eax
sub ecx,[ebp-0x64]
sub ecx,[ebp-100]
and esi,3
mov cl,[ecx-1]
mov [ebp-0x34],cl
movzx ecx,byte [ebp-0x14]
push dword [ebp-0x34]
mov [ebp-0x40],ecx
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,[0x1AF30+ecx*4]
cmp byte [ebp-0x14],7
mov [ebp-0x4C],ecx
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-0x28],eax
mov [ebp-40],eax
mov al,[eax-1]
mov [ebp-0x1C],esi
call cm_pr_05
mov [ebp-28],esi
call CLiteralEncoder_GetPrice
mov esi,eax
mov eax,[ebp-0x4C]
mov eax,[ebp-76]
shr eax,2
add esi,[0x51A18+eax*4]
add esi,[Models+eax*4]
mov byte [ebp-1],0
add esi,[ebp-0x48]
cmp esi,[ebx+0x295AC]
add esi,[ebp-72]
cmp esi,[ebx+state.Price+40]
jnb .labl_36
mov eax,[ebp-0xC]
or dword [ebx+0x295B4],0xFFFFFFFF
mov [ebx+0x295AC],esi
mov [ebx+0x295B0],eax
mov byte [ebx+0x295A1],0
 
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-0x40]
mov edx,[0x515B8+edx*4]
mov ecx,0x800
mov edx,[ebp-64]
mov edx,[_isRep+edx*4]
mov ecx,2048
mov eax,ecx
sub eax,[ebp-0x4C]
sub eax,[ebp-76]
sub ecx,edx
shr eax,2
mov eax,[0x51A18+eax*4]
add eax,[ebp-0x48]
mov eax,[Models+eax*4]
add eax,[ebp-72]
shr ecx,2
mov ecx,[0x51A18+ecx*4]
mov ecx,[Models+ecx*4]
add ecx,eax
mov [ebp-0x4C],eax
mov al,[ebp-0x30]
mov [ebp-0x54],edx
mov [ebp-0x48],ecx
cmp [ebp-0x34],al
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-0xC]
cmp [ebx+0x295B0],eax
 
mov eax,[ebp-12]
cmp [ebx+state.PosPrev+40],eax
jnb .labl_37
cmp dword [ebx+0x295B4],0
 
cmp dword [ebx+state.BackPrev+40],0
je .labl_38
;----------------------------------------------------------
.labl_37:
push dword [ebp-0x1C]
mov al,[ebp-0x14]
call cm_pr_10
add eax,[ebp-0x48]
cmp eax,[ebx+0x295AC]
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+0x295B4],0
mov [ebx+0x295AC],eax
mov eax,[ebp-0xC]
mov [ebx+0x295B0],eax
mov byte [ebx+0x295A1],0
 
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,[0x52630]
mov eax,[_streamPos]
sub eax,edi
mov ecx,0xFFF
sub ecx,[ebp-0xC]
mov ecx,4095
sub ecx,[ebp-12]
inc eax
mov [ebp-0x38],eax
mov [ebp-56],eax
cmp eax,ecx
jbe .labl_39
 
mov eax,ecx
mov [ebp-0x38],ecx
mov [ebp-56],ecx
;----------------------------------------------------------
.labl_39:
mov [ebp-0x24],eax
mov [ebp-36],eax
cmp eax,2
jb .labl_72
mov ecx,0x80 ;'€'
 
mov ecx,128
cmp eax,ecx
jbe .labl_40
mov [ebp-0x24],ecx
 
mov [ebp-36],ecx
;----------------------------------------------------------
.labl_40:
cmp dword [ebp-0x24],3
cmp dword [ebp-36],3
jb .labl_45
 
cmp byte [ebp-1],0
jne .labl_45
mov ecx,[ebp-0x64]
 
mov ecx,[ebp-100]
xor eax,eax
inc eax
inc ecx
cmp [ebp-0x24],eax
cmp [ebp-36],eax
jbe .labl_42
mov edi,[ebp-0x28]
 
mov edi,[ebp-40]
mov edx,edi
sub edx,ecx
;----------------------------------------------------------
1189,36 → 1277,38
mov cl,[eax+edi]
cmp cl,[edx+eax]
jne .labl_42
 
inc eax
cmp eax,[ebp-0x24]
cmp eax,[ebp-36]
jb .labl_41
;----------------------------------------------------------
.labl_42:
dec eax
mov [ebp-0x20],eax
mov [ebp-32],eax
cmp eax,2
jb .labl_45
mov eax,[ebp-0x40]
 
mov eax,[ebp-64]
mov al,[eax+LiteralNextStates]
mov ecx,[ebp+8]
movzx edx,al
mov [ebp-0x3C],al
mov [ebp-60],al
mov eax,edx
shl eax,4
inc ecx
mov edi,0x800
mov edi,2048
and ecx,3
add eax,ecx
mov ebx,edi
sub ebx,[0x1AF30+eax*4]
sub ebx,[_isMatch+eax*4]
mov eax,edi
sub eax,[0x515B8+edx*4]
mov edx,[ebp-0xC]
sub eax,[_isRep+edx*4]
mov edx,[ebp-12]
shr ebx,2
mov edi,[0x51A18+ebx*4]
mov edi,[Models+ebx*4]
shr eax,2
add edi,[0x51A18+eax*4]
mov eax,[ebp-0x20]
add edi,[Models+eax*4]
mov eax,[ebp-32]
add edi,esi
lea esi,[edx+eax]
mov eax,[ebp-8]
1225,57 → 1315,61
lea edx,[esi+1]
cmp eax,edx
jnb .labl_44
 
sub edx,[ebp-8]
imul eax,eax,0x28
add eax,0x29584
imul eax,eax,40
add eax,state.Price
add [ebp-8],edx
;----------------------------------------------------------
.labl_43:
add eax,0x28 ;'('
add eax,40
dec edx
mov dword [eax],0x0FFFFFFF
mov dword [eax],kIfinityPrice
jne .labl_43
;----------------------------------------------------------
.labl_44:
mov eax,[ebp-0x20]
mov eax,[ebp-32]
push ecx
push dword [ebp-0x3C]
push dword [ebp-60]
xor edx,edx
call cm_pr_11
imul esi,esi,0x28
call GetRepPrice
imul esi,esi,40
add eax,edi
add esi,0x295A0
cmp eax,[esi+0xC]
add esi,state.State+40
cmp eax,[esi+12]
jnb .labl_45
mov [esi+0xC],eax
mov eax,[ebp-0xC]
 
mov [esi+12],eax
mov eax,[ebp-12]
inc eax
and dword [esi+0x14],0
mov [esi+0x10],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-0x18],0
and dword [ebp-24],0
;----------------------------------------------------------
.labl_46:
mov eax,[ebp-0x18]
mov eax,[ebp+eax*4-0x64]
mov edx,[ebp-0x28]
mov eax,[ebp-24]
mov eax,[ebp+eax*4-100]
mov edx,[ebp-40]
inc eax
mov ecx,edx
sub ecx,eax
mov [ebp-0x44],eax
mov [ebp-68],eax
mov al,[edx]
mov [ebp-0x50],ecx
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-0x24],esi
cmp [ebp-36],esi
jbe .labl_48
;----------------------------------------------------------
.labl_47:
1282,68 → 1376,74
mov al,[edx+esi]
cmp al,[ecx+esi]
jne .labl_48
 
inc esi
cmp esi,[ebp-0x24]
cmp esi,[ebp-36]
jb .labl_47
;----------------------------------------------------------
.labl_48:
mov eax,[ebp-0xC]
mov eax,[ebp-12]
lea ebx,[eax+esi]
mov [ebp-0x20],ebx
imul ebx,ebx,0x28
mov [ebp-32],ebx
imul ebx,ebx,40
mov edi,esi
add ebx,0x29584
add ebx,state.Price
;----------------------------------------------------------
.labl_49:
mov eax,[ebp-8]
mov ecx,[ebp-0x20]
mov ecx,[ebp-32]
cmp eax,ecx
jnb .labl_51
 
sub ecx,[ebp-8]
imul eax,eax,0x28
add eax,0x29584
imul eax,eax,40
add eax,state.Price
add [ebp-8],ecx
;----------------------------------------------------------
.labl_50:
add eax,0x28 ;'('
add eax,40
dec ecx
mov dword [eax],0x0FFFFFFF
mov dword [eax],kIfinityPrice
jne .labl_50
;----------------------------------------------------------
.labl_51:
push dword [ebp-0x1C]
mov edx,[ebp-0x18]
push dword [ebp-0x14]
push dword [ebp-28]
mov edx,[ebp-24]
push dword [ebp-20]
mov eax,esi
call cm_pr_11
add eax,[ebp-0x48]
call GetRepPrice
add eax,[ebp-72]
cmp eax,[ebx]
jnb .labl_52
 
mov [ebx],eax
mov eax,[ebp-0xC]
mov eax,[ebp-12]
mov [ebx+4],eax
mov eax,[ebp-0x18]
mov eax,[ebp-24]
mov [ebx+8],eax
mov byte [ebx-0xB],0
mov byte [ebx-11],0
;----------------------------------------------------------
.labl_52:
dec esi
sub ebx,0x28 ;'('
dec dword [ebp-0x20]
sub ebx,40
dec dword [ebp-32]
cmp esi,2
jnb .labl_49
 
lea eax,[edi+1]
lea esi,[eax+0x80]
cmp esi,[ebp-0x38]
lea esi,[eax+128]
cmp esi,[ebp-56]
jbe .labl_53
mov esi,[ebp-0x38]
 
mov esi,[ebp-56]
;----------------------------------------------------------
.labl_53:
cmp eax,esi
jnb .labl_55
mov edx,[ebp-0x28]
 
mov edx,[ebp-40]
mov ecx,eax
sub ecx,[ebp-0x44]
sub ecx,[ebp-68]
add ecx,edx
;----------------------------------------------------------
.labl_54:
1350,6 → 1450,7
mov bl,[eax+edx]
cmp bl,[ecx]
jne .labl_55
 
inc eax
inc ecx
cmp eax,esi
1359,10 → 1460,11
or ecx,0xFFFFFFFF
sub ecx,edi
add eax,ecx
mov [ebp-0x10],eax
mov [ebp-16],eax
cmp eax,2
jb .labl_58
mov eax,[ebp-0x40]
 
mov eax,[ebp-64]
mov al,[eax+RepNextStates]
mov edx,[ebp+8]
movzx eax,al
1369,194 → 1471,206
mov ebx,eax
mov al,[eax+LiteralNextStates]
lea ecx,[edi+edx]
mov [ebp-0x3C],al
mov [ebp-60],al
movzx eax,al
mov esi,ecx
and esi,3
shl ebx,4
add esi,ebx
mov esi,[0x1AF30+esi*4]
mov esi,[_isMatch+esi*4]
lea ebx,[edi+edx+1]
mov [ebp-0x20],eax
mov eax,[ebp-0x28]
mov [ebp-32],eax
mov eax,[ebp-40]
movzx edx,byte [edi+eax]
mov al,[eax+edi-1]
push edx
mov edx,[ebp-0x50]
mov edx,[ebp-80]
movzx edx,byte [edx+edi]
push edx
shr esi,02
mov esi,[0x51A18+esi*4]
shr esi,2
mov esi,[Models+esi*4]
push 1
push ecx
mov [ebp-0x44],esi
mov [ebp-68],esi
and ebx,3
call cm_pr_05
push dword [ebp-0x1C]
mov edx,[ebp-0x18]
push dword [ebp-0x14]
call CLiteralEncoder_GetPrice
push dword [ebp-28]
mov edx,[ebp-24]
push dword [ebp-20]
mov esi,eax
mov eax,edi
call cm_pr_11
mov ecx,[ebp-0x20]
call GetRepPrice
mov ecx,[ebp-32]
add esi,eax
shl ecx,4
add ecx,ebx
mov eax,0x800
mov eax,2048
mov edx,eax
sub edx,[0x1AF30+ecx*4]
mov ecx,[ebp-0x20]
sub eax,[0x515B8+ecx*4]
mov ecx,[ebp-0xC]
sub edx,[_isMatch+ecx*4]
mov ecx,[ebp-32]
sub eax,[_isRep+ecx*4]
mov ecx,[ebp-12]
shr edx,2
add esi,[0x51A18+edx*4]
add esi,[Models+edx*4]
shr eax,2
add esi,[0x51A18+eax*4]
mov eax,[ebp-0x10]
add esi,[ebp-0x44]
add esi,[Models+eax*4]
mov eax,[ebp-16]
add esi,[ebp-68]
lea eax,[eax+edi+1]
add esi,[ebp-0x48]
add esi,[ebp-72]
add eax,ecx
mov [ebp-0x44],eax
mov [ebp-68],eax
cmp [ebp-8],eax
jnb .labl_57
 
mov eax,[ebp-8]
mov ecx,[ebp-0x44]
imul eax,eax,0x28
mov ecx,[ebp-68]
imul eax,eax,40
sub ecx,[ebp-8]
add eax,0x29584
add eax,state.Price
add [ebp-8],ecx
;----------------------------------------------------------
.labl_56:
add eax,0x28 ;'('
add eax,40
dec ecx
mov dword [eax],0x0FFFFFFF
mov dword [eax],kIfinityPrice
jne .labl_56
;----------------------------------------------------------
.labl_57:
mov eax,[ebp-0x10]
mov eax,[ebp-16]
push ebx
push dword [ebp-0x3C]
push dword [ebp-60]
xor edx,edx
call cm_pr_11
mov ecx,[ebp-0x44]
imul ecx,ecx,0x28
call GetRepPrice
mov ecx,[ebp-68]
imul ecx,ecx,40
add eax,esi
add ecx,0x29578
cmp eax,[ecx+0xC]
add ecx,state.State
cmp eax,[ecx+12]
jnb .labl_58
and dword [ecx+0x14],0
mov [ecx+0xC],eax
mov eax,[ebp-0xC]
 
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-0x18]
mov [ecx+0x10],edx
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-0x18]
cmp dword [ebp-0x18],4
inc dword [ebp-24]
cmp dword [ebp-24],4
jb .labl_46
mov eax,[ebp-0x24]
cmp [ebp-0x2C],eax
 
mov eax,[ebp-36]
cmp [ebp-44],eax
jbe .labl_59
mov [ebp-0x2C],eax
 
mov [ebp-44],eax
;----------------------------------------------------------
.labl_59:
cmp dword [ebp-0x2C],2
cmp dword [ebp-44],2
jb .labl_72
mov esi,[ebp-0x2C]
 
mov esi,[ebp-44]
cmp esi,2
jne .labl_60
cmp dword [0x1AAB8],0x80 ;'€'
 
cmp dword [distances+8],0x80
jnb .labl_72
;----------------------------------------------------------
.labl_60:
mov eax,[ebp-0x54]
mov eax,[ebp-84]
shr eax,2
mov eax,[0x51A18+eax*4]
add eax,[ebp-0x4C]
mov [ebp-0x4C],eax
mov eax,[ebp-0xC]
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,0x28
imul eax,eax,40
mov edx,ecx
sub edx,[ebp-8]
add eax,0x29584
add eax,state.Price
add [ebp-8],edx
;----------------------------------------------------------
.labl_61:
add eax,0x28 ;'('
add eax,40
dec edx
mov dword [eax],0x0FFFFFFF
mov dword [eax],kIfinityPrice
jne .labl_61
;----------------------------------------------------------
.labl_62:
imul ecx,ecx,0x28
add ecx,0x29584
lea eax,[0x1AAB4+esi*4]
imul ecx,ecx,40
add ecx,state.Price
lea eax,[distances+4+esi*4]
lea edi,[esi+1]
mov [ebp-0x24],eax
mov [ebp-36],eax
mov ebx,ecx
mov [ebp-0x48],ecx
mov [ebp-72],ecx
;----------------------------------------------------------
.labl_63:
mov eax,[ebp-0x24]
mov eax,[ebp-36]
mov esi,[eax-4]
push dword [ebp-0x1C]
push dword [ebp-28]
lea eax,[edi-1]
mov edx,esi
call cm_pr_12
add eax,[ebp-0x4C]
mov [ebp-0x50],eax
call GetPosLenPrice
add eax,[ebp-76]
mov [ebp-80],eax
cmp eax,[ebx]
jnb .labl_64
 
mov [ebx],eax
mov eax,[ebp-0xC]
mov eax,[ebp-12]
mov [ebx+4],eax
lea eax,[esi+4]
mov [ebx+8],eax
mov byte [ebx-0xB],0
mov byte [ebx-11],0
;----------------------------------------------------------
.labl_64:
lea eax,[edi-1]
cmp eax,[ebp-0x2C]
cmp eax,[ebp-44]
je .labl_65
mov eax,[ebp-0x24]
 
mov eax,[ebp-36]
cmp esi,[eax]
je .labl_71
;----------------------------------------------------------
.labl_65:
inc esi
lea ecx,[edi+0x80]
mov [ebp-0x44],esi
mov [ebp-0x10],edi
cmp ecx,[ebp-0x38]
lea ecx,[edi+128]
mov [ebp-68],esi
mov [ebp-16],edi
cmp ecx,[ebp-56]
jbe .labl_66
mov ecx,[ebp-0x38]
 
mov ecx,[ebp-56]
;----------------------------------------------------------
.labl_66:
cmp edi,ecx
jnb .labl_68
 
mov eax,edi
sub eax,esi
add eax,[ebp-0x28]
add eax,[ebp-40]
;----------------------------------------------------------
.labl_67:
mov edx,[ebp-0x10]
mov esi,[ebp-0x28]
mov edx,[ebp-16]
mov esi,[ebp-40]
mov dl,[edx+esi]
cmp dl,[eax]
jne .labl_68
inc dword [ebp-0x10]
 
inc dword [ebp-16]
inc eax
cmp [ebp-0x10],ecx
cmp [ebp-16],ecx
jb .labl_67
;----------------------------------------------------------
.labl_68:
1563,10 → 1677,11
or ecx,0xFFFFFFFF
lea eax,[edi-1]
sub ecx,eax
add [ebp-0x10],ecx
cmp dword [ebp-0x10],2
add [ebp-16],ecx
cmp dword [ebp-16],2
jb .labl_71
mov eax,[ebp-0x40]
 
mov eax,[ebp-64]
mov al,[eax+MatchNextStates]
mov ecx,[ebp+8]
movzx eax,al
1573,116 → 1688,119
mov esi,eax
mov al,[eax+LiteralNextStates]
lea edx,[edi+ecx-1]
mov [ebp-0x3C],al
mov [ebp-60],al
movzx eax,al
shl esi,4
mov ebx,edx
and ebx,3
add esi,ebx
mov esi,[0x1AF30+esi*4]
mov esi,[_isMatch+esi*4]
lea ebx,[edi+ecx]
mov [ebp-0x20],eax
mov eax,[ebp-0x28]
mov [ebp-32],eax
mov eax,[ebp-40]
movzx ecx,byte [edi+eax-1]
push ecx
mov ecx,edi
sub ecx,[ebp-0x44]
sub ecx,[ebp-68]
shr esi,2
movzx ecx,byte [ecx+eax-1]
mov esi,[0x51A18+esi*4]
mov esi,[Models+esi*4]
mov al,[edi+eax-2]
push ecx
push 1
push edx
mov [ebp-0x54],esi
mov [ebp-84],esi
and ebx,3
call cm_pr_05
mov ecx,[ebp-0x20]
call CLiteralEncoder_GetPrice
mov ecx,[ebp-32]
mov esi,eax
shl ecx,4
add ecx,ebx
mov eax,0x800
mov eax,2048
mov edx,eax
sub edx,[0x1AF30+ecx*4]
mov ecx,[ebp-0x20]
sub eax,[0x515B8+ecx*4]
mov ecx,[ebp-0xC]
sub edx,[_isMatch+ecx*4]
mov ecx,[ebp-32]
sub eax,[_isRep+ecx*4]
mov ecx,[ebp-12]
shr edx,2
add esi,[0x51A18+edx*4]
add esi,[Models+edx*4]
shr eax,2
add esi,[0x51A18+eax*4]
mov eax,[ebp-0x10]
add esi,[ebp-0x54]
add esi,[Models+eax*4]
mov eax,[ebp-16]
add esi,[ebp-84]
add eax,edi
add esi,[ebp-0x50]
add esi,[ebp-80]
add eax,ecx
mov [ebp-0x20],eax
mov [ebp-32],eax
cmp [ebp-8],eax
jnb .labl_70
 
mov eax,[ebp-8]
mov ecx,[ebp-0x20]
imul eax,eax,0x28
mov ecx,[ebp-32]
imul eax,eax,40
sub ecx,[ebp-8]
add eax,0x29584
add eax,state.Price
add [ebp-8],ecx
;----------------------------------------------------------
.labl_69:
add eax,0x28 ;'('
add eax,40
dec ecx
mov dword [eax],0x0FFFFFFF
mov dword [eax],kIfinityPrice
jne .labl_69
;----------------------------------------------------------
.labl_70:
mov eax,[ebp-0x10]
mov eax,[ebp-16]
push ebx
push dword [ebp-0x3C]
push dword [ebp-60]
xor edx,edx
call cm_pr_11
mov ecx,[ebp-0x20]
mov ebx,[ebp-0x48]
imul ecx,ecx,0x28
call GetRepPrice
mov ecx,[ebp-32]
mov ebx,[ebp-72]
imul ecx,ecx,40
add eax,esi
add ecx,0x29578
cmp eax,[ecx+0xC]
add ecx,state.State
cmp eax,[ecx+12]
jnb .labl_71
and dword [ecx+0x14],0
mov [ecx+0xC],eax
mov eax,[ebp-0xC]
 
and dword [ecx+20],0
mov [ecx+12],eax
mov eax,[ebp-12]
lea edx,[edi+eax]
mov [ecx+4],eax
mov eax,[ebp-0x44]
mov eax,[ebp-68]
add eax,3
mov [ecx+0x10],edx
mov [ecx+16],edx
mov byte [ecx+1],1
mov byte [ecx+2],1
mov [ecx+8],eax
;----------------------------------------------------------
.labl_71:
sub dword [ebp-0x24],4
sub ebx,0x28 ;'('
sub dword [ebp-36],4
sub ebx,40
dec edi
lea eax,[edi-1]
mov [ebp-0x48],ebx
mov [ebp-72],ebx
cmp eax,2
jnb .labl_63
;----------------------------------------------------------
.labl_72:
inc dword [ebp-0xC]
mov eax,[ebp-0xC]
inc dword [ebp-12]
mov eax,[ebp-12]
cmp eax,[ebp-8]
jne .labl_21
 
jmp .labl_74
;----------------------------------------------------------
.labl_73:
mov eax,[ebp-0x2C]
mov [0x19FAC],eax
mov byte [0x19FAA],1 ;0x1B238
mov eax,[ebp-44]
mov [_longestMatchLength],eax
mov byte [_longestMatchWasFound],1
;----------------------------------------------------------
.labl_74:
push dword [ebp-0xC]
push dword [ebp+0xC]
call lz_cm_08
mov ecx,[ebp+0x10]
push dword [ebp-12]
push dword [ebp+12]
call Backward
mov ecx,[ebp+16]
mov [ecx],eax
;----------------------------------------------------------
.labl_75:
1692,11 → 1810,11
.labl_76:
pop esi
leave
ret 0xC
ret 12
;*****************************************************************************
 
;* Call: ***************************************************************
lz_cm_04:
CLiteralEncoder2_EncodeMatched:
push ebp
mov ebp,esp
push ecx
1710,8 → 1828,8
.labl_00:
dec dword [ebp-4]
movzx ecx,byte [ebp-4]
movzx esi,byte [ebp+0xC]
movzx edi,byte [ebp+0x10]
movzx esi,byte [ebp+12]
movzx edi,byte [ebp+16]
shr esi,cl
shr edi,cl
mov ecx,[ebp+8]
1722,18 → 1840,20
and edi,1
push edi
lea edx,[ecx+eax*4]
call cm_pr_14
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+0x10]
movzx esi,byte [ebp+16]
mov cl,[ebp-4]
mov eax,[ebp+8]
shr esi,cl
1740,7 → 1860,7
lea edx,[eax+ebx*4]
and esi,1
push esi
call cm_pr_14
call CMyBitEncoder_Encode
add ebx,ebx
or ebx,esi
;----------------------------------------------------------
1753,11 → 1873,11
pop esi
pop ebx
leave
ret 0xC
ret 12
;*****************************************************************************
 
;* Call: ***************************************************************
lz_cm_05:
RangeEncoder_EncodeDirectBits:
push esi
mov esi,eax
jmp .labl_02
1764,47 → 1884,51
;----------------------------------------------------------
.labl_00:
mov eax,[esp+8]
shr dword [0x51A04],1
shr dword [range],1
dec esi
mov ecx,esi
shr eax,cl
test al,1
je .labl_01
mov eax,[0x51A04]
add [0x51A10],eax
adc dword [0x51A14],0
 
mov eax,[range]
add [low],eax
adc dword [low+4],0
;----------------------------------------------------------
.labl_01:
cmp dword [0x51A04],0x1000000
cmp dword [range],0x1000000
jnb .labl_02
shl dword [0x51A04],8
call cm_pr_13
 
shl dword [range],8
call RangeEncoder_ShiftLow
;----------------------------------------------------------
.labl_02:
test esi,esi
jne .labl_00
 
pop esi
ret 4
;*****************************************************************************
 
;* Call: ***************************************************************
lz_cm_06:
CBitTreeEncoder_ReverseEncode:
push esi
xor esi,esi
push edi
mov edi,[0x519E8]
mov edi,[i_01]
inc esi
;----------------------------------------------------------
.labl_00:
mov eax,[esp+0xC]
mov eax,[esp+12]
and eax,1
lea edx,[0x515E8+esi*4]
lea edx,[_posAlignEncoder+esi*4]
push eax
lea esi,[eax+esi*2]
call cm_pr_14
shr dword [esp+0xC],1
call CMyBitEncoder_Encode
shr dword [esp+12],1
dec edi
jne .labl_00
 
pop edi
pop esi
ret 4
1811,17 → 1935,18
;*****************************************************************************
 
;* Call: ***************************************************************
lz_cm_07:
MovePos:
push esi
mov esi,eax
test esi,esi
je .labl_01
add [0x1AEFC],esi
 
add [_additionalOffset],esi
;----------------------------------------------------------
.labl_00:
dec esi
call lz_cm_09
call cm_pr_19
call MatchFinder_MovePos
test esi,esi
jne .labl_00
;----------------------------------------------------------
1831,63 → 1956,66
;*****************************************************************************
 
;* Call: ***************************************************************
lz_cm_08:
Backward:
push ebp
mov ebp,esp
push ecx
mov ecx,[ebp+0xC]
mov ecx,[ebp+12]
mov eax,ecx
imul eax,eax,0x28
mov edx,[eax+0x29588]
mov eax,[eax+0x2958C]
imul eax,eax,40
mov edx,[eax+state.PosPrev]
mov eax,[eax+state.BackPrev]
push ebx
push esi
mov [0x29574],ecx
mov [_optimumEndIndex],ecx
mov [ebp-4],eax
push edi
;----------------------------------------------------------
.labl_00:
imul ecx,ecx,0x28
cmp byte [ecx+0x29579],0
imul ecx,ecx,40
cmp byte [ecx+state.Prev1IsChar],0
je .labl_01
 
mov eax,edx
imul eax,eax,0x28
or dword [eax+0x2958C],0xFFFFFFFF
lea esi,[eax+0x29579]
lea edi,[eax+0x29588]
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+0x2957A],0
cmp byte [ecx+state.Prev2],0
je .labl_01
mov byte [esi-0x28],0
mov esi,[ecx+0x2957C]
mov [edi-0x28],esi
mov ecx,[ecx+0x29580]
mov [eax+0x29564],ecx
 
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,0x28
imul eax,eax,40
mov esi,edx
mov edx,[eax+0x2958C]
mov [eax+0x2958C],ecx
mov ecx,[ebp+0xC]
mov edx,[eax+state.BackPrev]
mov [eax+state.BackPrev],ecx
mov ecx,[ebp+12]
mov [ebp-4],edx
mov edx,[eax+0x29588]
mov [eax+0x29588],ecx
mov edx,[eax+state.PosPrev]
mov [eax+state.PosPrev],ecx
mov ecx,esi
mov [ebp+0xC],ecx
mov [ebp+12],ecx
test esi,esi
jne .labl_00
mov eax,[0x2958C]
 
mov eax,[state.BackPrev]
mov ecx,[ebp+8]
pop edi
mov [ecx],eax
mov eax,[0x29588]
mov eax,[state.PosPrev]
pop esi
mov [0x1AEF8],eax
mov [_optimumCurrentIndex],eax
pop ebx
leave
ret 8
1897,29 → 2025,30
lz_cm_09:
push ebp
mov ebp,esp
mov edx,[0x52218]
mov eax,[0x5262C]
mov ecx,[0x52630]
sub esp,0x2C
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-0x18],edx
 
mov [ebp-24],edx
jmp .labl_01
;----------------------------------------------------------
.labl_00:
sub ecx,eax
mov [ebp-0x18],ecx
mov [ebp-24],ecx
cmp ecx,3
jb .labl_13
;----------------------------------------------------------
.labl_01:
mov ecx,[0x51A0C]
mov ecx,[_cyclicBufferSize]
mov edx,eax
sub edx,ecx
cmp ecx,eax
mov ecx,[0x52628]
mov ecx,[_buffer]
lea esi,[ecx+eax]
movzx ecx,byte [esi+2]
push ebx
1926,108 → 2055,114
movzx ebx,word [esi]
push edi
sbb edi,edi
and dword [ebp-0x1C],0
and dword [ebp-0x28],0
and dword [ebp-28],0
and dword [ebp-40],0
shl ecx,8
and edi,edx
movzx edx,byte [esi]
xor ecx,[0x52228+edx*4]
xor ecx,[crc_table+edx*4]
movzx edx,byte [esi+1]
xor ecx,edx
mov edx,[0x52224]
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,[0x5221C]
mov ecx,[pack_pos]
lea ecx,[edx+ecx*8+0x440000]
mov [ebp-4],ebx
lea ebx,[ecx+4]
mov [ebp-0xC],ecx
mov ecx,[0x52220]
mov [ebp-0x10],ebx
mov [ebp-0x14],ecx
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-0x14]
dec dword [ebp-0x14]
mov ecx,[ebp-20]
dec dword [ebp-20]
test ecx,ecx
je .labl_11
mov ecx,[0x52628]
 
mov ecx,[_buffer]
mov ebx,[ebp-4]
add ecx,ebx
mov [ebp-0x24],ecx
mov ecx,[ebp-0x28]
cmp ecx,[ebp-0x1C]
mov [ebp-36],ecx
mov ecx,[ebp-40]
cmp ecx,[ebp-28]
jb .labl_03
mov ecx,[ebp-0x1C]
 
mov ecx,[ebp-28]
;----------------------------------------------------------
.labl_03:
mov ebx,[ebp-0x24]
mov ebx,[ebp-36]
mov [ebp-8],ecx
add ecx,esi
sub ebx,esi
mov [ebp-0x20],ebx
mov [ebp-32],ebx
jmp .labl_05
;----------------------------------------------------------
.labl_04:
mov ecx,[ebp-0x2C]
mov ebx,[ebp-0x20]
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-0x2C],ecx
mov [ebp-44],ecx
mov ecx,[ebp-8]
cmp ecx,[ebp-0x18]
cmp ecx,[ebp-24]
jne .labl_04
;----------------------------------------------------------
.labl_06:
mov ecx,[0x5221C]
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,[0x51A0C]
add ecx,[_cyclicBufferSize]
;----------------------------------------------------------
.labl_08:
lea ecx,[edx+ecx*8+0x440000]
mov [ebp-0x20],ecx
mov [ebp-32],ecx
mov ecx,[ebp-8]
cmp ecx,[ebp-0x18]
cmp ecx,[ebp-24]
je .labl_14
mov ebx,[ebp-0x24]
 
mov ebx,[ebp-36]
mov bl,[ecx+ebx]
cmp bl,[ecx+esi]
mov ecx,[ebp-4]
jnb .labl_09
mov ebx,[ebp-0xC]
 
mov ebx,[ebp-12]
mov [ebx],ecx
mov ecx,[ebp-0x20]
mov ecx,[ebp-32]
mov ebx,[ebp-8]
add ecx,4
mov [ebp-0xC],ecx
mov [ebp-0x1C],ebx
mov [ebp-12],ecx
mov [ebp-28],ebx
jmp .labl_10
;----------------------------------------------------------
.labl_09:
mov ebx,[ebp-0x10]
mov ebx,[ebp-16]
mov [ebx],ecx
mov ecx,[ebp-0x20]
mov ecx,[ebp-32]
mov ebx,[ebp-8]
mov [ebp-0x10],ecx
mov [ebp-0x28],ebx
mov [ebp-16],ecx
mov [ebp-40],ebx
;----------------------------------------------------------
.labl_10:
mov ecx,[ecx]
2036,9 → 2171,9
ja .labl_02
;----------------------------------------------------------
.labl_11:
mov eax,[ebp-0xC]
mov eax,[ebp-12]
and dword [eax],0
mov eax,[ebp-0x10]
mov eax,[ebp-16]
and dword [eax],0
;----------------------------------------------------------
.labl_12:
2051,43 → 2186,45
ret
;----------------------------------------------------------
.labl_14:
mov eax,[ebp-0x20]
mov eax,[ebp-32]
mov ecx,[eax]
mov edx,[ebp-0xC]
mov edx,[ebp-12]
mov [edx],ecx
mov eax,[eax+4]
mov ecx,[ebp-0x10]
mov ecx,[ebp-16]
mov [ecx],eax
jmp .labl_12
;*****************************************************************************
 
;* Call: ***************************************************************
cm_pr_000:
cmp eax,0x400
GetPosSlot:
cmp eax,1024
jnb .labl_00
movzx eax,byte [eax+0x19FB0]
 
movzx eax,byte [eax+g_FastPos]
ret
;----------------------------------------------------------
.labl_00:
cmp eax,0x80000
jnb .labl_01
 
shr eax,9
movzx eax,byte [eax+0x19FB0]
add eax,0x12
movzx eax,byte [eax+g_FastPos]
add eax,18
ret
;----------------------------------------------------------
.labl_01:
shr eax,0x12
movzx eax,byte [eax+0x19FB0]
add eax,0x24 ;'$'
shr eax,18
movzx eax,byte [eax+g_FastPos]
add eax,36 ;'$'
ret
;*****************************************************************************
 
;* Call: ***************************************************************
cm_pr_00:
CPriceTableEncoder_Init:
push ebx
push edi
mov eax,0x400
mov eax,1024
push 4
mov [esi],eax
mov [esi+4],eax
2098,24 → 2235,25
push 3
lea eax,[edi-0x4040]
pop ecx
call cm_pr_15
call CBitTreeEncoder_Init
push 3
pop ecx
mov eax,edi
call cm_pr_15
add edi,0x404
call CBitTreeEncoder_Init
add edi,1028
dec ebx
jne .labl_00
 
push 8
pop ecx
pop edi
lea eax,[esi+0x8088]
pop ebx
jmp cm_pr_15
jmp CBitTreeEncoder_Init
;*****************************************************************************
 
;* Call: ***************************************************************
cm_pr_01:
CPriceTableEncoder_UpdateTable:
push ebx
push edi
mov edi,eax
2122,24 → 2260,26
xor ebx,ebx
cmp [edi+0xC88C],ebx
jbe .labl_01
mov eax,[esp+0xC]
 
mov eax,[esp+12]
push esi
lea esi,[edi+eax*4+0x848C]
;----------------------------------------------------------
.labl_00:
mov eax,[esp+0x10]
mov eax,[esp+16]
mov edx,ebx
call lz_cm_10
call NLength_CEncoder_GetPrice
mov [esi],eax
inc ebx
add esi,0x40 ;'@'
add esi,64
cmp ebx,[edi+0xC88C]
jb .labl_00
 
pop esi
;----------------------------------------------------------
.labl_01:
mov eax,[edi+0xC88C]
mov ecx,[esp+0xC]
mov ecx,[esp+12]
mov [edi+ecx*4+0xC890],eax
pop edi
pop ebx
2147,7 → 2287,7
;*****************************************************************************
 
;* Call: ***************************************************************
lz_cm_10:
NLength_CEncoder_GetPrice:
push ebp
mov ebp,esp
push ecx
2154,40 → 2294,42
push esi
cmp edx,8
jnb .labl_00
imul eax,eax,0x404
 
imul eax,eax,1028
lea esi,[eax+edi+8]
call cm_pr_17
call CBitTreeEncoder_GetPrice
mov ecx,[edi]
shr ecx,2
add eax,[0x51A18+ecx*4]
add eax,[Models+ecx*4]
jmp .labl_03
;----------------------------------------------------------
.labl_00:
push ebx
mov ebx,0x800
mov ebx,2048
mov ecx,ebx
sub ecx,[edi]
shr ecx,2
mov ecx,[0x51A18+ecx*4]
mov ecx,[Models+ecx*4]
mov [ebp-4],ecx
cmp edx,0x10
cmp edx,16
jnb .labl_01
imul eax,eax,0x404
 
imul eax,eax,1028
add edx,0xFFFFFFF8
lea esi,[eax+edi+0x4048]
call cm_pr_17
call CBitTreeEncoder_GetPrice
mov ecx,[edi+4]
shr ecx,2
add eax,[0x51A18+ecx*4]
add eax,[Models+ecx*4]
jmp .labl_02
;----------------------------------------------------------
.labl_01:
add edx,0xFFFFFFF0
lea esi,[edi+0x8088]
call cm_pr_17
call CBitTreeEncoder_GetPrice
sub ebx,[edi+4]
shr ebx,2
add eax,[0x51A18+ebx*4]
add eax,[Models+ebx*4]
;----------------------------------------------------------
.labl_02:
add [ebp-4],eax
2201,16 → 2343,17
;*****************************************************************************
 
;* Call: ***************************************************************
cm_pr_02:
CPriceTableEncoder_Encode:
push edi
mov edi,eax
mov edx,esi
cmp edi,8
jnb .labl_00
 
push 0
call cm_pr_14
call CMyBitEncoder_Encode
mov eax,ebx
imul eax,eax,0x404
imul eax,eax,1028
push edi
lea edi,[eax+esi+8]
jmp .labl_02
2217,15 → 2360,16
;----------------------------------------------------------
.labl_00:
push 1
call cm_pr_14
call CMyBitEncoder_Encode
lea edx,[esi+4]
cmp edi,0x10
cmp edi,16
jnb .labl_01
 
push 0
call cm_pr_14
call CMyBitEncoder_Encode
add edi,0xFFFFFFF8
mov eax,ebx
imul eax,eax,0x404
imul eax,eax,1028
push edi
lea edi,[eax+esi+0x4048]
jmp .labl_02
2232,7 → 2376,7
;----------------------------------------------------------
.labl_01:
push 1
call cm_pr_14
call CMyBitEncoder_Encode
add edi,0xFFFFFFF0
push edi
lea edi,[esi+0x8088]
2242,9 → 2386,10
dec dword [esi+ebx*4+0xC890]
pop edi
jne .labl_03
 
push ebx
mov eax,esi
call cm_pr_01
call CPriceTableEncoder_UpdateTable
;----------------------------------------------------------
.labl_03:
ret
2251,7 → 2396,7
;*****************************************************************************
 
;* Call: ***************************************************************
cm_pr_03:
CLiteralEncoder2_Encode:
push ebx
push esi
push edi
2261,8 → 2406,8
pop ebx
;----------------------------------------------------------
.labl_00:
movzx esi,byte [esp+0x14]
mov eax,[esp+0x10]
movzx esi,byte [esp+20]
mov eax,[esp+16]
dec ebx
mov cl,bl
shr esi,cl
2269,11 → 2414,12
lea edx,[eax+edi*4]
and esi,1
push esi
call cm_pr_14
call CMyBitEncoder_Encode
add edi,edi
or edi,esi
test ebx,ebx
jne .labl_00
 
pop edi
pop esi
pop ebx
2281,10 → 2427,10
;*****************************************************************************
 
;* Call: ***************************************************************
cm_pr_04:
mov edx,[0x519F4]
CState_IsCharState:
mov edx,[_numPrevBits]
push esi
mov esi,[0x519FC]
mov esi,[_posMask]
and esi,[esp+8]
push 8
pop ecx
2299,17 → 2445,17
;*****************************************************************************
 
;* Call: ***************************************************************
cm_pr_05:
push dword [esp+0x10]
push dword [esp+0x10]
push dword [esp+0x10]
push dword [esp+0x10]
call cm_pr_04
imul eax,eax,0xC00
add eax,[0x519F0]
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 0x10
ret 16
;*****************************************************************************
 
;* Call: ***************************************************************
2324,16 → 2470,17
inc esi
push edi
mov dword [ebp-4],8
cmp [ebp+0xC],al
cmp [ebp+12],al
je .labl_02
movzx ecx,byte [ebp+0x14]
mov [ebp+0xC],ecx
 
movzx ecx,byte [ebp+20]
mov [ebp+12],ecx
;----------------------------------------------------------
.labl_00:
dec dword [ebp-4]
movzx ecx,byte [ebp-4]
movzx edi,byte [ebp+0x10]
mov edx,[ebp+0xC]
movzx edi,byte [ebp+16]
mov edx,[ebp+12]
mov ebx,[ebp+8]
shr edi,cl
shr edx,cl
2341,7 → 2488,7
mov ecx,edi
shl ecx,8
add ecx,esi
mov ecx,[ebx+ecx*4+0x400]
mov ecx,[ebx+ecx*4+1024]
and edx,1
sub ecx,edx
mov ebx,edx
2349,13 → 2496,15
xor ecx,ebx
shr ecx,2
and ecx,0x1FF
add eax,[0x51A18+ecx*4]
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:
2363,7 → 2512,7
je .labl_04
;----------------------------------------------------------
.labl_02:
movzx edi,byte [ebp+0x14]
movzx edi,byte [ebp+20]
;----------------------------------------------------------
.labl_03:
dec dword [ebp-4]
2380,7 → 2529,7
xor ecx,ebx
shr ecx,2
and ecx,0x1FF
add eax,[0x51A18+ecx*4]
add eax,[Models+ecx*4]
or esi,edx
cmp dword [ebp-4],0
jne .labl_03
2390,27 → 2539,28
pop esi
pop ebx
leave
ret 0x10
ret 16
;*****************************************************************************
 
;* Call: ***************************************************************
cm_pr_06:
ReadMatchDistances:
push esi
call lz_cm_12
call GetLongestMatch
mov ecx,eax
mov esi,0x80 ;'€'
mov esi,0x80
cmp ecx,esi
jne .labl_00
push dword [0x1ACB0]
lea eax,[esi+0x11]
 
push dword [distances+512]
lea eax,[esi+17]
push esi
call cm_pr_18
call GetMatchLen
mov ecx,eax
add ecx,esi
;----------------------------------------------------------
.labl_00:
inc dword [0x1AEFC]
call cm_pr_19
inc dword [_additionalOffset]
call MatchFinder_MovePos
mov eax,ecx
pop esi
ret
2417,29 → 2567,30
;*****************************************************************************
 
;* Call: ***************************************************************
lz_cm_12:
GetLongestMatch:
push ebp
mov ebp,esp
sub esp,0x34
mov edx,[0x52218]
mov ecx,[0x5262C]
mov eax,[0x52630]
and dword [ebp-0x18],0
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-0x20],edx
 
mov [ebp-32],edx
;----------------------------------------------------------
.labl_00:
mov eax,[0x51A0C]
mov eax,[_cyclicBufferSize]
mov edx,ecx
sub edx,eax
cmp eax,ecx
sbb eax,eax
and eax,edx
mov [ebp-0x28],eax
mov eax,[0x52628]
mov [ebp-40],eax
mov eax,[_buffer]
push ebx
push edi
lea edi,[eax+ecx]
2447,10 → 2598,10
movzx esi,byte [edi]
movzx eax,word [edi]
shl edx,8
xor edx,[0x52228+esi*4]
xor edx,[crc_table+esi*4]
movzx esi,byte [edi+1]
xor edx,esi
mov esi,[0x52224]
mov esi,[_hash]
and edx,0xFFFFF
lea edx,[esi+edx*4]
mov ebx,[edx]
2458,126 → 2609,135
mov [ebp-8],ebx
mov ebx,[eax]
mov [eax],ecx
or dword [0x01AAB8],0xFFFFFFFF
cmp ebx,[ebp-0x28]
or dword [distances+8],0xFFFFFFFF
cmp ebx,[ebp-40]
jbe .labl_01
 
mov eax,ecx
sub eax,ebx
dec eax
mov [0x01AAB8],eax
mov dword [ebp-0x18],2
mov [distances+8],eax
mov dword [ebp-24],2
;----------------------------------------------------------
.labl_01:
mov ebx,[0x5221C]
and dword [ebp-0x24],0
mov ebx,[pack_pos]
and dword [ebp-36],0
mov [edx],ecx
or dword [0x1AABC],0xFFFFFFFF
and dword [ebp-0x30],0
or dword [distances+12],0xFFFFFFFF
and dword [ebp-48],0
lea edx,[esi+ebx*8+0x440000]
lea eax,[edx+4]
mov [ebp-0x14],eax
mov eax,[0x52220]
mov [ebp-0x1C],eax
mov [ebp-20],eax
mov eax,[_cutValue]
mov [ebp-28],eax
mov eax,[ebp-8]
mov [ebp-0x10],edx
mov [ebp-16],edx
jmp .labl_13
;----------------------------------------------------------
.labl_02:
sub eax,ecx
mov [ebp-0x20],eax
mov [ebp-32],eax
cmp eax,3
jnb .labl_00
 
xor eax,eax
jmp .labl_16
;----------------------------------------------------------
.labl_03:
mov eax,[ebp-0x1C]
dec dword [ebp-0x1C]
mov eax,[ebp-28]
dec dword [ebp-28]
test eax,eax
je .labl_14
mov eax,[0x52628]
 
mov eax,[_buffer]
mov edx,[ebp-8]
add eax,edx
mov [ebp-0x2C],eax
mov eax,[ebp-0x30]
cmp eax,[ebp-0x24]
mov [ebp-44],eax
mov eax,[ebp-48]
cmp eax,[ebp-36]
jb .labl_04
mov eax,[ebp-0x24]
 
mov eax,[ebp-36]
;----------------------------------------------------------
.labl_04:
mov edx,[ebp-0x2C]
mov edx,[ebp-44]
mov [ebp-4],eax
add eax,edi
sub edx,edi
mov [ebp-0xC],edx
mov [ebp-12],edx
jmp .labl_06
;----------------------------------------------------------
.labl_05:
mov edx,[ebp-0xC]
mov eax,[ebp-0x34]
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-0x34],eax
mov [ebp-52],eax
mov eax,[ebp-4]
cmp eax,[ebp-0x20]
cmp eax,[ebp-32]
jne .labl_05
;----------------------------------------------------------
.labl_07:
mov eax,ecx
sub eax,[ebp-8]
mov [ebp-0xC],eax
mov eax,[ebp-0x18]
mov [ebp-12],eax
mov eax,[ebp-24]
cmp eax,[ebp-4]
jnb .labl_09
;----------------------------------------------------------
.labl_08:
mov edx,[ebp-0xC]
mov edx,[ebp-12]
inc eax
dec edx
mov [0x1AAB0+eax*4],edx
mov [distances+eax*4],edx
cmp eax,[ebp-4]
jb .labl_08
mov [ebp-0x18],eax
 
mov [ebp-24],eax
;----------------------------------------------------------
.labl_09:
mov eax,ebx
sub eax,[ebp-0xC]
cmp [ebp-0xC],ebx
sub eax,[ebp-12]
cmp [ebp-12],ebx
jbe .labl_10
add eax,[0x51A0C]
 
add eax,[_cyclicBufferSize]
;----------------------------------------------------------
.labl_10:
lea eax,[esi+eax*8+0x440000]
mov [ebp-0xC],eax
mov [ebp-12],eax
mov eax,[ebp-4]
cmp eax,[ebp-0x20]
cmp eax,[ebp-32]
je .labl_17
mov edx,[ebp-0x2C]
 
mov edx,[ebp-44]
mov dl,[eax+edx]
cmp dl,[eax+edi]
mov eax,[ebp-8]
jnb .labl_11
mov edx,[ebp-0x10]
 
mov edx,[ebp-16]
mov [edx],eax
mov eax,[ebp-0xC]
mov eax,[ebp-12]
mov edx,[ebp-4]
add eax,4
mov [ebp-0x10],eax
mov [ebp-0x24],edx
mov [ebp-16],eax
mov [ebp-36],edx
jmp .labl_12
;----------------------------------------------------------
.labl_11:
mov edx,[ebp-0x14]
mov edx,[ebp-20]
mov [edx],eax
mov eax,[ebp-0xC]
mov eax,[ebp-12]
mov edx,[ebp-4]
mov [ebp-0x14],eax
mov [ebp-0x30],edx
mov [ebp-20],eax
mov [ebp-48],edx
;----------------------------------------------------------
.labl_12:
mov eax,[eax]
2584,17 → 2744,17
mov [ebp-8],eax
;----------------------------------------------------------
.labl_13:
cmp eax,[ebp-0x28]
cmp eax,[ebp-40]
ja .labl_03
;----------------------------------------------------------
.labl_14:
mov eax,[ebp-0x10]
mov eax,[ebp-16]
and dword [eax],0
mov eax,[ebp-0x14]
mov eax,[ebp-20]
and dword [eax],0
;----------------------------------------------------------
.labl_15:
mov eax,[ebp-0x18]
mov eax,[ebp-24]
pop edi
pop ebx
;----------------------------------------------------------
2604,18 → 2764,18
ret
;----------------------------------------------------------
.labl_17:
mov eax,[ebp-0xC]
mov eax,[ebp-12]
mov ecx,[eax]
mov edx,[ebp-0x10]
mov edx,[ebp-16]
mov [edx],ecx
mov eax,[eax+4]
mov ecx,[ebp-0x14]
mov ecx,[ebp-20]
mov [ecx],eax
jmp .labl_15
;*****************************************************************************
 
;* Call: ***************************************************************
cm_pr_07:
FillPosSlotPrices:
push ecx
push ebx
push ebp
2622,31 → 2782,34
push esi
push edi
xor ebp,ebp
mov esi,0x1BC18
mov dword [esp+0x10],4
mov esi,_posSlotEncoder
mov dword [esp+16],4
;----------------------------------------------------------
.labl_00:
xor edi,edi
;----------------------------------------------------------
.labl_01:
mov ebx,[0x29570]
mov ebx,[_distTableSize]
cmp edi,ebx
jnb .labl_03
 
mov edx,edi
call cm_pr_17
call CBitTreeEncoder_GetPrice
lea ecx,[edi+ebp]
inc edi
mov [0x1A3B0+ecx*4],eax
cmp edi,0xE
mov [_posSlotPrices+ecx*4],eax
cmp edi,14
jb .labl_01
 
cmp edi,ebx
jnb .labl_03
 
lea ebx,[edi+ebp]
lea ebx,[0x1A3B0+ebx*4]
lea ebx,[_posSlotPrices+ebx*4]
;----------------------------------------------------------
.labl_02:
mov edx,edi
call cm_pr_17
call CBitTreeEncoder_GetPrice
mov ecx,edi
shr ecx,1
sub ecx,5
2655,14 → 2818,15
mov [ebx],eax
inc edi
add ebx,4
cmp edi,[0x29570]
cmp edi,[_distTableSize]
jb .labl_02
;----------------------------------------------------------
.labl_03:
add esi,0x404
add ebp,0x40 ;'@'
dec dword [esp+0x10]
add esi,1028
add ebp,64
dec dword [esp+16]
jne .labl_00
 
pop edi
pop esi
pop ebp
2672,40 → 2836,40
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_08:
FillDistancesPrices:
push ebp
mov ebp,esp
sub esp,0x24
and dword [ebp-0x14],0
sub esp,36
and dword [ebp-20],0
push ebx
push esi
push edi
push 4
pop ebx
mov dword [ebp-0x18],0x1B418
mov dword [ebp-0x10],0x1A3B0
mov [ebp-0x24],ebx
mov dword [ebp-24],_distancesPrices+16
mov dword [ebp-16],_posSlotPrices
mov [ebp-36],ebx
;----------------------------------------------------------
.labl_00:
mov eax,[ebp-0x18]
mov esi,[ebp-0x10]
lea edi,[eax-0x10]
mov eax,[ebp-24]
mov esi,[ebp-16]
lea edi,[eax-16]
movsd
movsd
movsd
movsd
mov [ebp-4],ebx
mov [ebp-0xC],eax
mov [ebp-12],eax
;----------------------------------------------------------
.labl_01:
mov esi,[ebp-4]
mov eax,esi
call cm_pr_000
call GetPosSlot
mov edx,eax
mov ecx,edx
xor eax,eax
inc eax
mov [ebp-0x20],edx
mov [ebp-32],edx
and edx,eax
shr ecx,1
dec ecx
2713,7 → 2877,7
shl edx,cl
xor edi,edi
mov [ebp-8],eax
mov [ebp-0x1C],ecx
mov [ebp-28],ecx
sub esi,edx
test ecx,ecx
je .labl_03
2720,10 → 2884,10
;----------------------------------------------------------
.labl_02:
mov eax,[ebp-8]
sub eax,[ebp-0x20]
sub eax,[ebp-32]
mov ecx,esi
add eax,edx
mov eax,[0x1B234+eax*4]
mov eax,[_numLiteralContextBits+eax*4]
and ecx,1
sub eax,ecx
mov ebx,ecx
2731,33 → 2895,36
xor eax,ebx
shr eax,2
and eax,0x1FF
add edi,[0x51A18+eax*4]
add edi,[Models+eax*4]
mov eax,[ebp-8]
shr esi,1
dec dword [ebp-0x1C]
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-0x20]
mov ecx,[ebp-0x14]
mov eax,[ebp-32]
mov ecx,[ebp-20]
add ecx,eax
mov eax,[0x1A3B0+ecx*4]
mov ecx,[ebp-0xC]
add [ebp-0xC],ebx
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 ;'€'
cmp dword [ebp-4],0x80
mov [ecx],eax
jb .labl_01
add dword [ebp-0x10],0x100
add dword [ebp-0x14],0x40 ;'@'
add dword [ebp-0x18],0x200
dec dword [ebp-0x24]
 
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
2766,7 → 2933,7
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_09:
FillAlignPrices:
push ebp
mov ebp,esp
push ecx
2778,7 → 2945,7
mov [ebp-8],esi
;----------------------------------------------------------
.labl_00:
mov eax,[0x519E8]
mov eax,[i_01]
xor edx,edx
xor ecx,ecx
inc edx
2785,7 → 2952,7
mov [ebp-4],eax
;----------------------------------------------------------
.labl_01:
mov edi,[0x515E8+edx*4]
mov edi,[_posAlignEncoder+edx*4]
mov eax,esi
and eax,1
sub edi,eax
2794,22 → 2961,24
xor edi,ebx
shr edi,2
and edi,0x1FF
add ecx,[0x51A18+edi*4]
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 0x10
mov [0x51578+esi*4],ecx
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 [0x1B230],eax
mov [_alignPriceCount],eax
pop ebx
leave
ret
2816,35 → 2985,36
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_10:
GetRepLen1Price:
movzx eax,al
mov edx,[0x1CC38+eax*4]
mov edx,[_isRepG0+eax*4]
mov ecx,eax
shl ecx,4
add ecx,[esp+4]
shr edx,2
mov ecx,[0x1A7B0+ecx*4]
mov ecx,[_isRep0Long+ecx*4]
shr ecx,2
mov eax,[0x51A18+ecx*4]
add eax,[0x51A18+edx*4]
mov eax,[Models+ecx*4]
add eax,[Models+edx*4]
ret 4
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_11:
GetRepPrice:
movzx ecx,byte [esp+4]
shl eax,4
add eax,[esp+8]
push esi
mov eax,[0x25074+eax*4]
mov esi,0x800
mov eax,[_repMatchLenEncoder+0x840C+eax*4]
mov esi,2048
test edx,edx
jne .labl_00
 
mov edx,ecx
mov ecx,[0x1CC38+ecx*4]
mov ecx,[_isRepG0+ecx*4]
shl edx,4
add edx,[esp+0xC]
sub esi,[0x1A7B0+edx*4]
add edx,[esp+12]
sub esi,[_isRep0Long+edx*4]
shr ecx,2
jmp .labl_02
;----------------------------------------------------------
2852,20 → 3022,21
push edi
shl ecx,2
mov edi,esi
sub edi,[ecx+0x1CC38]
sub edi,[ecx+_isRepG0]
shr edi,2
add eax,[0x51A18+edi*4]
add eax,[Models+edi*4]
pop edi
cmp edx,1
jne .labl_01
mov ecx,[ecx+0x1AF00]
 
mov ecx,[ecx+_isRepG1]
shr ecx,2
add eax,[0x51A18+ecx*4]
add eax,[Models+ecx*4]
jmp .labl_03
;----------------------------------------------------------
.labl_01:
sub esi,[ecx+0x1AF00]
mov ecx,[ecx+0x29538]
sub esi,[ecx+_isRepG1]
mov ecx,[ecx+_isRepG2]
add edx,0xFFFFFFFE
sub ecx,edx
neg edx
2875,8 → 3046,8
;----------------------------------------------------------
.labl_02:
shr esi,2
mov edx,[0x51A18+esi*4]
add edx,[0x51A18+ecx*4]
mov edx,[Models+esi*4]
add edx,[Models+ecx*4]
add eax,edx
;----------------------------------------------------------
.labl_03:
2885,15 → 3056,17
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_12:
GetPosLenPrice:
push esi
mov esi,eax
mov ecx,0x80 ;'€'
mov ecx,0x80
cmp esi,2
jne .labl_00
 
cmp edx,ecx
jb .labl_01
mov eax,0x0FFFFFFF
 
mov eax,kIfinityPrice
jmp .labl_09
;----------------------------------------------------------
.labl_00:
2911,44 → 3084,48
.labl_03:
cmp edx,ecx
jnb .labl_04
 
shl eax,7
add eax,edx
mov ecx,[0x1B408+eax*4]
mov ecx,[_distancesPrices+eax*4]
jmp .labl_08
;----------------------------------------------------------
.labl_04:
mov ecx,edx
cmp edx,0x10000
;GetPosSlot2
cmp edx,0x10000 ;if (pos < (1<<16))
jnb .labl_05
 
shr ecx,6
movzx ecx,byte [ecx+0x19FB0]
add ecx,0xC
movzx ecx,byte [ecx+g_FastPos]
add ecx,12
jmp .labl_07
;----------------------------------------------------------
.labl_05:
cmp edx,0x2000000
cmp edx,0x2000000 ;if (pos < (1<<25))
jnb .labl_06
shr ecx,0xF
movzx ecx,byte [ecx+0x19FB0]
add ecx,0x1E
 
shr ecx,15
movzx ecx,byte [ecx+g_FastPos]
add ecx,30
jmp .labl_07
;----------------------------------------------------------
.labl_06:
shr ecx,0x18
movzx ecx,byte [ecx+0x19FB0]
add ecx,0x30 ;'0'
shr ecx,24
movzx ecx,byte [ecx+g_FastPos]
add ecx,48
;----------------------------------------------------------
.labl_07:
shl eax,6
add eax,ecx
mov ecx,[0x1A3B0+eax*4]
and edx,0xF
add ecx,[0x51578+edx*4]
mov ecx,[_posSlotPrices+eax*4]
and edx,15
add ecx,[_alignPrices+edx*4]
;----------------------------------------------------------
.labl_08:
shl esi,4
add esi,[esp+8]
mov eax,[0x15AE4+esi*4]
mov eax,[_prices+esi*4]
add eax,ecx
;----------------------------------------------------------
.labl_09:
2957,19 → 3134,20
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_13:
RangeEncoder_ShiftLow:
push ecx
push ecx
mov eax,[0x51A10]
mov eax,[low]
push esi
mov esi,[0x51A14]
mov esi,[low+4]
cmp eax,0xFF000000
jb .labl_00
 
test esi,esi
je .labl_02
;----------------------------------------------------------
.labl_00:
mov cl,[0x519ED]
mov cl,[_cache]
and dword [esp+8],0
mov edx,esi
push ebx
2977,21 → 3155,22
.labl_01:
mov bl,dl
add bl,cl
mov ecx,[0x52634]
inc dword [0x52634]
mov ecx,[pack_length]
inc dword [pack_length]
mov [ecx],bl
or cl,0xFF
dec dword [0x51A08]
dec dword [_cacheSize]
jne .labl_01
mov cl,[0x51A13]
mov [0x519ED],cl
 
mov cl,[low+3]
mov [_cache],cl
pop ebx
;----------------------------------------------------------
.labl_02:
inc dword [0x51A08]
inc dword [_cacheSize]
shl eax,8
and dword [0x51A14],0
mov [0x51A10],eax
and dword [low+4],0
mov [low],eax
pop esi
pop ecx
pop ecx
2999,15 → 3178,16
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_14:
mov ecx,[0x51A04]
CMyBitEncoder_Encode:
mov ecx,[range]
mov eax,[edx]
shr ecx,0xB
imul ecx,eax
cmp dword [esp+4],0
jne .labl_00
mov [0x51A04],ecx
mov ecx,0x800
 
mov [range],ecx
mov ecx,2048
sub ecx,eax
shr ecx,5
add ecx,eax
3015,9 → 3195,9
jmp .labl_01
;----------------------------------------------------------
.labl_00:
add [0x51A10],ecx
adc dword [0x51A14],0
sub [0x51A04],ecx
add [low],ecx
adc dword [low+4],0
sub [range],ecx
mov ecx,eax
shr ecx,5
sub eax,ecx
3024,10 → 3204,11
mov [edx],eax
;----------------------------------------------------------
.labl_01:
cmp dword [0x51A04],0x1000000
cmp dword [range],0x1000000
jnb .labl_02
shl dword [0x51A04],8
call cm_pr_13
 
shl dword [range],8
call RangeEncoder_ShiftLow
;----------------------------------------------------------
.labl_02:
ret 4
3034,17 → 3215,18
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_15:
CBitTreeEncoder_Init:
xor edx,edx
inc edx
shl edx,cl
mov [eax+0x400],ecx
mov [eax+1024],ecx
lea ecx,[edx-1]
test ecx,ecx
jbe .labl_00
 
push edi
lea edi,[eax+4]
mov eax,0x400
mov eax,1024
rep stosd
pop edi
;----------------------------------------------------------
3056,15 → 3238,15
cm_pr_16:
mov eax,[esp+4]
push ebx
mov ebx,[edi+0x400]
mov ebx,[edi+1024]
push esi
xor esi,esi
inc esi
add eax,eax
mov [esp+0xC],eax
mov [esp+12],eax
;----------------------------------------------------------
.labl_00:
mov eax,[esp+0xC]
mov eax,[esp+12]
mov ecx,ebx
shr eax,cl
lea edx,[edi+esi*4]
3071,9 → 3253,10
and eax,1
push eax
lea esi,[eax+esi*2]
call cm_pr_14
call CMyBitEncoder_Encode
dec ebx
jne .labl_00
 
pop esi
pop ebx
ret 4
3080,8 → 3263,8
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_17:
mov ecx,[esi+0x400]
CBitTreeEncoder_GetPrice:
mov ecx,[esi+1024]
push edi
xor edi,edi
inc edi
3099,41 → 3282,45
xor edi,ecx
shr edi,2
and edi,0x1FF
add eax,[0x51A18+edi*4]
add eax,[Models+edi*4]
cmp edx,1
jne .labl_00
 
pop edi
ret
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_18:
mov ecx,[0x52630]
GetMatchLen:
mov ecx,[_streamPos]
push edi
mov edi,eax
mov eax,[0x5262C]
mov eax,[_pos]
sub ecx,eax
sub ecx,[esp+8]
cmp edi,ecx
jbe .labl_00
 
mov edi,ecx
;----------------------------------------------------------
.labl_00:
mov ecx,[0x52628]
inc dword [esp+0xC]
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+0x10]
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
3147,14 → 3334,15
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_19:
inc dword [0x5221C]
mov eax,[0x5221C]
cmp eax,[0x51A0C]
MatchFinder_MovePos:
inc dword [pack_pos]
mov eax,[pack_pos]
cmp eax,[_cyclicBufferSize]
jne .labl_00
and dword [0x5221C],0
 
and dword [pack_pos],0
;----------------------------------------------------------
.labl_00:
inc dword [0x5262C]
inc dword [_pos]
ret
;***********************************************************************
/programs/other/kpack/trunk/lzma_decompress.inc
4,9 → 4,9
push edi
push ebx
push ebp
mov esi,[esp+0x14]
mov esi,[esp+20]
xor ebp,ebp
mov edi,0xD6B8
mov edi,unpack.code_
inc esi
lodsd
bswap eax
20,32 → 20,35
xchg esi,eax
stosd
mov ecx,0x1F36
mov eax,0x400
mov edi,0x59E0
mov eax,1024
mov edi,unpack.p
rep stosd
mov edi,[esp+0x18]
mov edi,[esp+24]
mov ebx, edi
add ebx,[esp+0x1C]
add ebx,[esp+28]
;--------------------------------------------------------------------
.labl_00:
.main_loop:
cmp edi,ebx
jnb .labl_19
jnb .main_loop_done
 
mov edx,edi
and edx,3
push eax
mov eax,ebp
shl eax,6
lea eax,[eax+edx*4+0x59E0]
call cm_pr_20
lea eax,[eax+edx*4+unpack.p]
call RangeDecoderBitDecode
pop eax
jb .labl_06
 
movzx eax,al
shr eax,5
imul eax,eax,0xC00
add eax,0x76B8
imul eax,eax,3072
add eax,unpack.p+0x1CD8
mov cl,1
cmp ebp,7
jb .labl_02
 
mov dl,[edi+esi]
;--------------------------------------------------------------------
.labl_01:
52,11 → 55,12
add dl,dl
setb ch
push eax
lea eax,[eax+ecx*4+0x400]
call cm_pr_20
lea eax,[eax+ecx*4+1024]
call RangeDecoderBitDecode
pop eax
adc cl,cl
jb .labl_03
 
xor ch,cl
test ch,1
mov ch,0
65,7 → 69,7
.labl_02:
push eax
lea eax,[eax+ecx*4]
call cm_pr_20
call RangeDecoderBitDecode
pop eax
adc cl,cl
jnb .labl_02
74,9 → 78,11
mov eax,ebp
cmp al,4
jb .labl_04
cmp al,0xA
 
cmp al,10
mov al,3
jb .labl_04
 
mov al,6
;--------------------------------------------------------------------
.labl_04:
83,55 → 89,61
sub ebp,eax
xchg ecx,eax
;--------------------------------------------------------------------
.labl_05:
.main_loop_1:
stosb
jmp .labl_00
jmp .main_loop
;--------------------------------------------------------------------
.labl_06:
lea eax,[0x5CE0+ebp*4]
call cm_pr_20
lea eax,[unpack.p+768+ebp*4]
call RangeDecoderBitDecode
jnb .labl_09
add eax,0x30 ;'0'
call cm_pr_20
 
add eax,48
call RangeDecoderBitDecode
jb .labl_07
 
mov eax, ebp
shl eax,6
lea eax,[eax+edx*4+0x5DA0]
call cm_pr_20
lea eax,[eax+edx*4+unpack.p+0x3C0]
call RangeDecoderBitDecode
jb .labl_08
 
cmp ebp,7
sbb ebp,ebp
lea ebp,[ebp+ebp+0xB]
lea ebp,[ebp+ebp+11]
mov al,[edi+esi]
jmp .labl_05
jmp .main_loop_1
;--------------------------------------------------------------------
.labl_07:
add eax,0x30 ;'0'
call cm_pr_20
xchg esi,[0xD6C0]
add eax,48
call RangeDecoderBitDecode
xchg esi,[unpack.rep0]
jnb .labl_08
add eax,0x30 ;'0'
call cm_pr_20
xchg esi,[0xD6C4]
 
add eax,48
call RangeDecoderBitDecode
xchg esi,[unpack.rep1]
jnb .labl_08
xchg esi,[0xD6C8]
 
xchg esi,[unpack.rep2]
;--------------------------------------------------------------------
.labl_08:
mov eax,0x6EB0
call cm_pr_22
mov eax,unpack.p+0x14D0
call LzmaLenDecode
push 8
jmp .labl_17
;--------------------------------------------------------------------
.labl_09:
xchg esi,[0xD6C0]
xchg esi,[0xD6C4]
mov [0xD6C8],esi
mov eax,0x66A8
call cm_pr_22
xchg esi,[unpack.rep0]
xchg esi,[unpack.rep1]
mov [unpack.rep2],esi
mov eax,unpack.p+0xCC8
call LzmaLenDecode
push 3
pop eax
cmp eax,ecx
jb .labl_10
 
mov eax,ecx
;--------------------------------------------------------------------
.labl_10:
140,11 → 152,12
pop ecx
shl eax,cl
shl eax,2
add eax,0x60A0
call cm_pr_23
add eax,unpack.p+0x6C0
call RangeDecoderBitTreeDecode
mov esi,ecx
cmp ecx,4
jb .labl_16
 
push ecx
xor eax,eax
inc eax
154,11 → 167,12
shl eax,cl
mov esi, eax
pop edx
cmp edx,0xE
cmp edx,14
jnb .labl_11
 
sub eax,edx
shl eax,2
add eax,0x649C
add eax,unpack.p+0xABC
jmp .labl_14
;--------------------------------------------------------------------
.labl_11:
166,21 → 180,22
xor eax,eax
;--------------------------------------------------------------------
.labl_12:
shr dword [0xD6BC],1
shr dword [unpack.range],1
add eax, eax
mov edx,[0xD6B8]
sub edx,[0xD6BC]
mov edx,[unpack.code_]
sub edx,[unpack.range]
jb .labl_13
mov [0xD6B8],edx
 
mov [unpack.code_],edx
inc eax
;--------------------------------------------------------------------
.labl_13:
call cm_pr_21
call RangeDecoderBitDecode_1
loop .labl_12
mov cl,4
shl eax,cl
add esi,eax
mov eax,0x6668
mov eax,unpack.p+0xC88
;--------------------------------------------------------------------
.labl_14:
push edi
192,7 → 207,7
.labl_15:
push eax
lea eax,[eax+edx*4]
call cm_pr_20
call RangeDecoderBitDecode
lahf
adc edx,edx
sahf
213,6 → 228,7
cmp ebp,7
pop ebp
jb .labl_18
 
inc ebp
inc ebp
inc ebp
224,86 → 240,94
rep movsb
lodsb
pop esi
jmp .labl_05
jmp .main_loop_1
;--------------------------------------------------------------------
.labl_19:
.main_loop_done:
pop ebp
pop ebx
pop edi
pop esi
ret 0xC
ret 12
;*****************************************************************************
 
;* Call: ***************************************************************
cm_pr_20:
RangeDecoderBitDecode:
; in: eax->prob
; out: CF=bit; destroys eax
push edx
mov edx,[0xD6BC]
shr edx,0xB
mov edx,[unpack.range]
shr edx,11
imul edx,[eax]
cmp [0xD6B8],edx
jnb .labl_01
mov [0xD6BC],edx
mov edx,0x800
cmp [unpack.code_],edx
jnb .2
 
mov [unpack.range],edx
mov edx,2048
sub edx,[eax]
shr edx,5
add [eax],edx
;--------------------------------------------------------------------
.labl_00:
.1:
pushfd
call cm_pr_21
call RangeDecoderBitDecode_1
popfd
pop edx
ret
;--------------------------------------------------------------------
.labl_01:
sub [0xD6BC],edx
sub [0xD6B8],edx
.2:
sub [unpack.range],edx
sub [unpack.code_],edx
mov edx,[eax]
shr edx,5
sub [eax],edx
stc
jmp .labl_00
jmp .1
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_21:
cmp [0xD6BF],byte 0
jne .labl_00
shl dword [0xD6BC],8
shl dword [0xD6B8],8
RangeDecoderBitDecode_1:
cmp byte [unpack.range+3],0
jne @f
 
shl dword [unpack.range],8
shl dword [unpack.code_],8
push eax
mov eax,[0xD6CC]
mov eax,[unpack.rep3]
mov al,[eax]
inc dword [0xD6CC]
mov [0xD6B8],al
inc dword [unpack.rep3]
mov [unpack.code_],al
pop eax
;--------------------------------------------------------------------
.labl_00:
@@:
ret
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_22:
call cm_pr_20
jnb .labl_01
LzmaLenDecode:
; in: eax->prob, edx=posState
; out: ecx=len
call RangeDecoderBitDecode
jnb .2
 
add eax,4
call cm_pr_20
jb .labl_00
call RangeDecoderBitDecode
jb .1
 
mov cl,3
shl edx,cl
lea eax,[eax+edx*4+0x204]
call cm_pr_23
lea eax,[eax+edx*4+516]
call RangeDecoderBitTreeDecode
add ecx,8
ret
;--------------------------------------------------------------------
.labl_00:
add eax,0x404
.1:
add eax,1028
mov cl,8
call cm_pr_23
add ecx,0x10
call RangeDecoderBitTreeDecode
add ecx,16
ret
;--------------------------------------------------------------------
.labl_01:
.2:
mov cl,3
shl edx,cl
lea eax,[eax+edx*4+8]
310,7 → 334,9
;***********************************************************************
 
;* Call: ***************************************************************
cm_pr_23:
RangeDecoderBitTreeDecode:
; in: eax->probs,ecx=numLevels
; out: ecx=length; destroys edx
push edi
xor edx,edx
inc edx
317,14 → 343,14
mov edi,edx
xchg edi, eax
;--------------------------------------------------------------------
.labl_00:
@@:
push eax
lea eax,[edi+edx*4]
call cm_pr_20
call RangeDecoderBitDecode
pop eax
adc dl,dl
add al,al
loop .labl_00
loop @b
sub dl,al
pop edi
mov ecx,edx
/programs/other/kpack/trunk/lzma_set_dict_size.inc
1,11 → 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 [0x29568],eax
mov [_dictionarySize],eax
lea eax,[ecx+ecx]
mov [0x29570],eax
mov [_distTableSize],eax
ret 4
;*****************************************************************************