Kpack for Linux - all sources only assembler, GCC using for linking
git-svn-id: svn://kolibrios.org@1718 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
8cc2207bd7
commit
585e2cd30a
12
programs/other/kpack/linux/build.sh
Executable file
12
programs/other/kpack/linux/build.sh
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
# This script does for linux the same as build.bat for DOS,
|
||||
# it compiles the KoOS kernel, hopefully ;-)
|
||||
|
||||
fasm -m 16384 kpack.asm kpack.o
|
||||
gcc -s -nostdlib kpack.o -o kpack -lc
|
||||
strip -R .comment -R .gnu.version kpack
|
||||
exit 0
|
||||
|
||||
|
||||
|
||||
|
136
programs/other/kpack/linux/data.inc
Normal file
136
programs/other/kpack/linux/data.inc
Normal file
@ -0,0 +1,136 @@
|
||||
;---------------------------------------------------------------------
|
||||
; Compress data area start
|
||||
;---------------------------------------------------------------------
|
||||
align 4
|
||||
_lenEncoder:
|
||||
rd 8451
|
||||
;-----------------------------------------------------
|
||||
_prices:
|
||||
rd 4384
|
||||
rd 17
|
||||
;-----------------------------------------------------
|
||||
_finished: rb 1
|
||||
_writeEndMark: rb 1
|
||||
_longestMatchWasFound: rb 1
|
||||
_previousByte: rb 1
|
||||
_longestMatchLength: rd 1
|
||||
;-----------------------------------------------------
|
||||
g_FastPos:
|
||||
rb 1024
|
||||
;-----------------------------------------------------
|
||||
_posSlotPrices:
|
||||
rd 256
|
||||
;-----------------------------------------------------
|
||||
_isRep0Long:
|
||||
rd 192
|
||||
;-----------------------------------------------------
|
||||
distances:
|
||||
rd 274
|
||||
;-----------------------------------------------------
|
||||
_optimumCurrentIndex: rd 1
|
||||
_additionalOffset: rd 1
|
||||
;-----------------------------------------------------
|
||||
_isRepG1:
|
||||
rd 12
|
||||
;-----------------------------------------------------
|
||||
_isMatch:
|
||||
rd 192
|
||||
;-----------------------------------------------------
|
||||
_alignPriceCount: rd 1
|
||||
_numLiteralContextBits: rd 1
|
||||
;-----------------------------------------------------
|
||||
_literalEncoder:
|
||||
rd 114
|
||||
;-----------------------------------------------------
|
||||
nowPos64:
|
||||
rd 2
|
||||
;-----------------------------------------------------
|
||||
_distancesPrices:
|
||||
rd 512
|
||||
;-----------------------------------------------------
|
||||
_repDistances:
|
||||
rd 4
|
||||
;-----------------------------------------------------
|
||||
_posSlotEncoder:
|
||||
rd 1028
|
||||
;-----------------------------------------------------
|
||||
lastPosSlotFillingPos:
|
||||
rd 2
|
||||
;-----------------------------------------------------
|
||||
_numFastBytes: rd 1
|
||||
_posStateMask: rd 1
|
||||
;-----------------------------------------------------
|
||||
_isRepG0:
|
||||
rd 12
|
||||
;-----------------------------------------------------
|
||||
_repMatchLenEncoder:
|
||||
rd 8451
|
||||
rd 4384
|
||||
rd 17
|
||||
;-----------------------------------------------------
|
||||
_isRepG2:
|
||||
rd 12
|
||||
;-----------------------------------------------------
|
||||
_dictionarySize: rd 1
|
||||
_numLiteralPosStateBits: rd 1
|
||||
_distTableSize: rd 1
|
||||
_optimumEndIndex: rd 1
|
||||
;-----------------------------------------------------
|
||||
;static CState state
|
||||
state.State: rb 1
|
||||
state.Prev1IsChar: rb 1
|
||||
state.Prev2: rb 2
|
||||
state.PosPrev2: rd 1
|
||||
state.BackPrev2: rd 1
|
||||
state.Price: rd 1
|
||||
state.PosPrev: rd 1
|
||||
state.BackPrev: rd 1
|
||||
state.Backs:
|
||||
rd 4
|
||||
;----------------------------------------------------
|
||||
rd 40950
|
||||
;-----------------------------------------------------
|
||||
_alignPrices:
|
||||
rd 16
|
||||
;-----------------------------------------------------
|
||||
_isRep:
|
||||
rd 12
|
||||
;-----------------------------------------------------
|
||||
_posAlignEncoder:
|
||||
rd 256
|
||||
;-----------------------------------------------------
|
||||
i_01: rd 1
|
||||
;-----------------------------------------------------
|
||||
_state: rb 1
|
||||
_cache: rb 1
|
||||
_state.Prev2: rb 2
|
||||
_posEncoders: rd 1
|
||||
_numPrevBits: rd 1
|
||||
_numPosBits: rd 1
|
||||
_posMask: rd 1
|
||||
_posStateBits: rd 1
|
||||
_range: rd 1
|
||||
_cacheSize: rd 1
|
||||
_cyclicBufferSize: rd 1
|
||||
;-----------------------------------------------------
|
||||
low:
|
||||
rd 2
|
||||
;-----------------------------------------------------
|
||||
Models:
|
||||
rd 512
|
||||
;-----------------------------------------------------
|
||||
_matchMaxLen: rd 1
|
||||
pack_pos: rd 1
|
||||
_cutValue: rd 1
|
||||
_hash: rd 1
|
||||
;-----------------------------------------------------
|
||||
crc_table:
|
||||
rd 256
|
||||
;-----------------------------------------------------
|
||||
_buffer: rd 1
|
||||
_pos: rd 1
|
||||
_streamPos: rd 1
|
||||
pack_length: rd 1
|
||||
;---------------------------------------------------------------------
|
||||
; Compress data area end
|
||||
;---------------------------------------------------------------------
|
912
programs/other/kpack/linux/kpack.asm
Normal file
912
programs/other/kpack/linux/kpack.asm
Normal file
@ -0,0 +1,912 @@
|
||||
; Disassemled and corrected in 2010 specially for FASM
|
||||
; by Marat Zakiyanov aka Mario79, aka Mario
|
||||
; All sources only assembler is now
|
||||
; GCC using for linking
|
||||
;---------------------------------------------------------------------
|
||||
; Linux port by mike.dld in 2007
|
||||
;---------------------------------------------------------------------
|
||||
; kpack = Kolibri Packer
|
||||
; Written by diamond in 2006 specially for KolibriOS
|
||||
|
||||
; Uses LZMA compression library by Igor Pavlov
|
||||
; (for more information on LZMA and 7-Zip visit http://www.7-zip.org)
|
||||
; (plain-C packer and ASM unpacker are ported by diamond)
|
||||
|
||||
format ELF
|
||||
public _start
|
||||
|
||||
;*********************************************************************
|
||||
section ".text" executable align 16
|
||||
|
||||
_start:
|
||||
mov ecx,[esp+0]
|
||||
lea ebx,[esp+4]
|
||||
call combine_program_arguments
|
||||
|
||||
xor ebx, ebx
|
||||
push eax ; reserve dword on the stack
|
||||
|
||||
xor eax,eax
|
||||
inc eax
|
||||
|
||||
xchg eax, ebp
|
||||
; parse command line
|
||||
mov eax,program_arguments
|
||||
|
||||
xchg eax, esi
|
||||
call skip_spaces
|
||||
call get_file_name
|
||||
test al, al
|
||||
jz short usage
|
||||
|
||||
call get_file_name
|
||||
|
||||
mov [infilename], edi
|
||||
test al, al
|
||||
jnz short two_files
|
||||
|
||||
mov [outfilename], edi
|
||||
jmp short cont
|
||||
;*********************************************************************
|
||||
write_string:
|
||||
push eax ; reserve dword on the stack
|
||||
mov eax, esp
|
||||
push ebx
|
||||
push eax
|
||||
push dword [eax+12]
|
||||
push dword [eax+8]
|
||||
push ebp
|
||||
call WriteConsoleA
|
||||
pop eax
|
||||
ret 8
|
||||
;*********************************************************************
|
||||
write_exit:
|
||||
call write_string
|
||||
;---------------------------------------------------------------------
|
||||
doexit:
|
||||
push ebx
|
||||
call ExitProcess
|
||||
;---------------------------------------------------------------------
|
||||
usage:
|
||||
cmp [bNoLogo], 0
|
||||
jnz doexit
|
||||
|
||||
push info_len + usage_len
|
||||
push info_str
|
||||
jmp write_exit
|
||||
;*********************************************************************
|
||||
two_files:
|
||||
call get_file_name
|
||||
mov [outfilename], edi
|
||||
test al, al
|
||||
jnz short usage
|
||||
;---------------------------------------------------------------------
|
||||
cont:
|
||||
cmp [bNoLogo], 0
|
||||
jnz @f
|
||||
|
||||
push info_len
|
||||
push info_str
|
||||
call write_string
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
; Input file
|
||||
push ebx
|
||||
push ebx
|
||||
push 3 ; OPEN_EXISTING
|
||||
push ebx
|
||||
push 1 ; FILE_SHARE_READ
|
||||
push 80000000h ; GENERIC_READ
|
||||
push [infilename]
|
||||
call CreateFileA
|
||||
inc eax
|
||||
jnz short inopened
|
||||
;---------------------------------------------------------------------
|
||||
infileerr:
|
||||
push errload_len
|
||||
push errload_str
|
||||
jmp write_exit
|
||||
;*********************************************************************
|
||||
inopened:
|
||||
dec eax
|
||||
xchg eax, esi
|
||||
push ebx
|
||||
push esi
|
||||
call GetFileSize
|
||||
inc eax
|
||||
jz short infileerr
|
||||
|
||||
dec eax
|
||||
jz short infileerr
|
||||
|
||||
mov [insize], eax
|
||||
push eax
|
||||
push 4 ; PAGE_READWRITE
|
||||
push 1000h ; MEM_COMMIT
|
||||
push eax
|
||||
push ebx
|
||||
call VirtualAlloc
|
||||
test eax, eax
|
||||
jz nomem
|
||||
|
||||
mov [infile], eax
|
||||
pop edx
|
||||
mov ecx, esp
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
push eax
|
||||
push esi
|
||||
call ReadFile
|
||||
test eax, eax
|
||||
jz short infileerr
|
||||
|
||||
push esi
|
||||
call CloseHandle
|
||||
|
||||
mov eax, [insize]
|
||||
shr eax, 3
|
||||
add eax, [insize]
|
||||
add eax, 400h ; should be enough for header
|
||||
mov esi, eax
|
||||
add eax, eax
|
||||
push 4
|
||||
push 1000h
|
||||
push eax
|
||||
push ebx
|
||||
call VirtualAlloc
|
||||
test eax, eax
|
||||
jnz short outmemok
|
||||
;---------------------------------------------------------------------
|
||||
nomem:
|
||||
push nomem_len
|
||||
push nomem_str
|
||||
jmp write_exit
|
||||
;*********************************************************************
|
||||
outmemok:
|
||||
mov [outfile], eax
|
||||
mov [outfile1], eax
|
||||
mov [outfilebest], eax
|
||||
add eax, esi
|
||||
mov [outfile2], eax
|
||||
sub eax, esi
|
||||
mov dword [eax], 'KPCK'
|
||||
mov ecx, [insize]
|
||||
mov dword [eax+4], ecx
|
||||
dec ecx
|
||||
bsr eax, ecx
|
||||
inc eax
|
||||
cmp eax, 28
|
||||
jb short @f
|
||||
|
||||
mov eax, 28
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
push eax
|
||||
push eax
|
||||
call lzma_set_dict_size
|
||||
|
||||
pop ecx
|
||||
mov eax, 1
|
||||
shl eax, cl
|
||||
mov [lzma_dictsize], eax
|
||||
imul eax, 19
|
||||
shr eax, 1
|
||||
add eax, 509000h
|
||||
push 4
|
||||
push 1000h
|
||||
push eax
|
||||
push ebx
|
||||
call VirtualAlloc
|
||||
test eax, eax
|
||||
jz nomem
|
||||
|
||||
mov [workmem], eax
|
||||
push compressing_len
|
||||
push compressing_str
|
||||
call write_string
|
||||
|
||||
mov eax, [outfile2]
|
||||
mov [outfile], eax
|
||||
xchg eax, edi
|
||||
mov esi, [outfile1]
|
||||
movsd
|
||||
movsd
|
||||
call pack_lzma
|
||||
|
||||
mov [outsize], eax
|
||||
mov eax, [outfile]
|
||||
mov [outfilebest], eax
|
||||
mov [method], use_lzma
|
||||
call preprocess_calltrick
|
||||
test eax, eax
|
||||
jz short noct1
|
||||
|
||||
call set_outfile
|
||||
call pack_lzma
|
||||
|
||||
add eax, 5
|
||||
cmp eax, [outsize]
|
||||
jae short @f
|
||||
mov [outsize], eax
|
||||
mov eax, [outfile]
|
||||
mov [outfilebest], eax
|
||||
mov [method], use_lzma or use_calltrick1
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
noct1:
|
||||
call set_outfile
|
||||
|
||||
push [ctn]
|
||||
mov al, [cti]
|
||||
push eax
|
||||
call preprocess_calltrick2
|
||||
test eax, eax
|
||||
jz noct2
|
||||
|
||||
call set_outfile
|
||||
call pack_lzma
|
||||
|
||||
add eax, 5
|
||||
cmp eax, [outsize]
|
||||
jae short @f
|
||||
|
||||
mov [outsize], eax
|
||||
mov eax, [outfile]
|
||||
mov [outfilebest], eax
|
||||
mov [method], use_lzma or use_calltrick2
|
||||
pop ecx
|
||||
pop ecx
|
||||
push [ctn]
|
||||
mov al, [cti]
|
||||
push eax
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
noct2:
|
||||
pop eax
|
||||
mov [cti], al
|
||||
pop [ctn]
|
||||
add [outsize], 12
|
||||
mov eax, [outsize]
|
||||
cmp eax, [insize]
|
||||
jb short packed_ok
|
||||
|
||||
push too_big_len
|
||||
push too_big_str
|
||||
jmp write_exit
|
||||
;*********************************************************************
|
||||
packed_ok:
|
||||
push 8000h ; MEM_RELEASE
|
||||
push ebx
|
||||
push [workmem]
|
||||
call VirtualFree
|
||||
; set header
|
||||
movzx eax, [method]
|
||||
mov edi, [outfilebest]
|
||||
mov [edi+8], eax
|
||||
test al, use_calltrick1 or use_calltrick2
|
||||
jz short @f
|
||||
|
||||
mov ecx, [outsize]
|
||||
add ecx, edi
|
||||
mov eax, [ctn]
|
||||
mov [ecx-5], eax
|
||||
mov al, [cti]
|
||||
mov [ecx-1], al
|
||||
@@:
|
||||
mov eax, [outsize]
|
||||
mov ecx, 100
|
||||
mul ecx
|
||||
div [insize]
|
||||
aam
|
||||
xchg al, ah
|
||||
add ax, '00'
|
||||
mov [ratio], ax
|
||||
push done_len
|
||||
cmp [bNoLogo], 0
|
||||
jz @f
|
||||
|
||||
sub dword [esp], 2
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
push done_str
|
||||
call write_string
|
||||
; Output file
|
||||
push ebx
|
||||
push 80h ; FILE_ATTRIBUTE_NORMAL
|
||||
push 2 ; CREATE_ALWAYS
|
||||
push ebx
|
||||
push ebx
|
||||
push 40000000h ; GENERIC_WRITE
|
||||
push [outfilename]
|
||||
call CreateFileA
|
||||
inc eax
|
||||
jnz short @f
|
||||
;---------------------------------------------------------------------
|
||||
outerr:
|
||||
push outfileerr_len
|
||||
push outfileerr_str
|
||||
jmp write_exit
|
||||
;*********************************************************************
|
||||
@@:
|
||||
dec eax
|
||||
xchg eax, esi
|
||||
mov eax, esp
|
||||
push ebx
|
||||
push eax
|
||||
push [outsize]
|
||||
push edi
|
||||
push esi
|
||||
call WriteFile
|
||||
test eax, eax
|
||||
jz short outerr
|
||||
|
||||
push esi
|
||||
call CloseHandle
|
||||
|
||||
push ebx
|
||||
call ExitProcess
|
||||
;---------------------------------------------------------------------
|
||||
get_file_name:
|
||||
mov edi, esi
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jz short _ret
|
||||
|
||||
cmp al, '"'
|
||||
setz dl
|
||||
jz short @f
|
||||
|
||||
dec esi
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
mov edi, esi
|
||||
;---------------------------------------------------------------------
|
||||
@@loop:
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jz short _ret
|
||||
|
||||
cmp al, ' '
|
||||
ja short @f
|
||||
|
||||
test dl, 1
|
||||
jz short @@end
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
cmp al, '"'
|
||||
jnz short @@loop
|
||||
|
||||
test dl, 1
|
||||
jz short @@loop
|
||||
;---------------------------------------------------------------------
|
||||
@@end:
|
||||
mov byte [esi-1], 0
|
||||
;---------------------------------------------------------------------
|
||||
skip_spaces:
|
||||
lodsb
|
||||
cmp al, 0
|
||||
jz short @f
|
||||
|
||||
cmp al, ' '
|
||||
jbe short skip_spaces
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
dec esi
|
||||
cmp dword [esi+0],'--no'
|
||||
jnz @f
|
||||
|
||||
cmp dword [esi+4],'logo'
|
||||
jnz @f
|
||||
|
||||
mov [bNoLogo], 1
|
||||
add esi, 8
|
||||
jmp skip_spaces
|
||||
;*********************************************************************
|
||||
@@:
|
||||
mov al, [esi]
|
||||
;---------------------------------------------------------------------
|
||||
_ret:
|
||||
ret
|
||||
;*********************************************************************
|
||||
set_outfile:
|
||||
mov eax,[outfilebest]
|
||||
xor eax,[outfile1]
|
||||
xor eax,[outfile2]
|
||||
mov [outfile],eax
|
||||
ret
|
||||
;*********************************************************************
|
||||
pack_calltrick_fail:
|
||||
xor eax,eax
|
||||
xor ebx,ebx
|
||||
mov [ctn],eax
|
||||
ret
|
||||
;*********************************************************************
|
||||
preprocess_calltrick:
|
||||
; input preprocessing
|
||||
push 4 ; PAGE_READWRITE
|
||||
push 1000h ; MEM_COMMIT
|
||||
push [insize]
|
||||
push ebx
|
||||
call VirtualAlloc
|
||||
test eax, eax
|
||||
jz pack_calltrick_fail
|
||||
|
||||
push eax
|
||||
xor eax, eax
|
||||
mov edi, ct1
|
||||
mov ecx, 256/4
|
||||
push edi
|
||||
rep stosd
|
||||
|
||||
pop edi
|
||||
mov ecx, [insize]
|
||||
mov esi, [infile]
|
||||
xchg eax, edx
|
||||
pop eax
|
||||
xchg eax, ebx
|
||||
push ebx
|
||||
;---------------------------------------------------------------------
|
||||
input_pre:
|
||||
lodsb
|
||||
sub al, 0E8h
|
||||
cmp al, 1
|
||||
ja short input_pre_cont
|
||||
|
||||
cmp ecx, 5
|
||||
jb short input_pre_done
|
||||
|
||||
lodsd
|
||||
add eax, esi
|
||||
sub eax, [infile]
|
||||
cmp eax, [insize]
|
||||
jae short xxx
|
||||
|
||||
cmp eax, 1000000h
|
||||
jae short xxx
|
||||
|
||||
sub ecx, 4
|
||||
bswap eax
|
||||
mov [esi-4], eax
|
||||
inc edx
|
||||
mov [ebx], esi
|
||||
add ebx, 4
|
||||
jmp short input_pre_cont
|
||||
;*********************************************************************
|
||||
xxx:
|
||||
sub esi, 4
|
||||
movzx eax, byte [esi]
|
||||
mov byte [eax+edi], 1
|
||||
;---------------------------------------------------------------------
|
||||
input_pre_cont:
|
||||
loop input_pre
|
||||
;---------------------------------------------------------------------
|
||||
input_pre_done:
|
||||
mov [ctn], edx
|
||||
pop edx
|
||||
xor eax, eax
|
||||
mov ecx, 256
|
||||
repnz scasb
|
||||
jnz pack_calltrick_fail
|
||||
not cl
|
||||
|
||||
mov [cti], cl
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
cmp ebx, edx
|
||||
jz @f
|
||||
|
||||
sub ebx, 4
|
||||
mov eax, [ebx]
|
||||
mov [eax-4], cl
|
||||
jmp @b
|
||||
;*********************************************************************
|
||||
@@:
|
||||
xor ebx, ebx
|
||||
push 8000h
|
||||
push ebx
|
||||
push edx
|
||||
call VirtualFree
|
||||
ret
|
||||
;*********************************************************************
|
||||
pack_lzma:
|
||||
mov eax, [outfile]
|
||||
add eax, 11
|
||||
push [workmem]
|
||||
push [insize]
|
||||
push eax
|
||||
push [infile]
|
||||
call lzma_compress
|
||||
|
||||
mov ecx, [outfile]
|
||||
mov edx, [ecx+12]
|
||||
bswap edx
|
||||
mov [ecx+12], edx
|
||||
dec eax
|
||||
ret
|
||||
;*********************************************************************
|
||||
preprocess_calltrick2:
|
||||
; restore input
|
||||
mov esi, [infile]
|
||||
mov ecx, [ctn]
|
||||
jecxz pc2l2
|
||||
;---------------------------------------------------------------------
|
||||
pc2l1:
|
||||
lodsb
|
||||
sub al, 0E8h
|
||||
cmp al, 1
|
||||
ja short pc2l1
|
||||
|
||||
mov al, [cti]
|
||||
cmp [esi], al
|
||||
jnz short pc2l1
|
||||
|
||||
lodsd
|
||||
mov al, 0
|
||||
bswap eax
|
||||
sub eax, esi
|
||||
add eax, [infile]
|
||||
mov [esi-4], eax
|
||||
loop pc2l1
|
||||
;---------------------------------------------------------------------
|
||||
pc2l2:
|
||||
; input preprocessing
|
||||
push 4 ; PAGE_READWRITE
|
||||
push 1000h ; MEM_COMMIT
|
||||
push [insize]
|
||||
push ebx
|
||||
call VirtualAlloc
|
||||
test eax, eax
|
||||
jz pack_calltrick_fail
|
||||
|
||||
mov edi, ct1
|
||||
xchg eax, ebx
|
||||
xor eax, eax
|
||||
push edi
|
||||
mov ecx, 256/4
|
||||
rep stosd
|
||||
|
||||
pop edi
|
||||
mov ecx, [insize]
|
||||
mov esi, [infile]
|
||||
xchg eax, edx
|
||||
push ebx
|
||||
;---------------------------------------------------------------------
|
||||
input_pre2:
|
||||
lodsb
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
cmp al, 0Fh
|
||||
jnz short ip1
|
||||
|
||||
dec ecx
|
||||
jz short input_pre_done2
|
||||
|
||||
lodsb
|
||||
cmp al, 80h
|
||||
jb short @b
|
||||
|
||||
cmp al, 90h
|
||||
jb short @f
|
||||
;---------------------------------------------------------------------
|
||||
ip1:
|
||||
sub al, 0E8h
|
||||
cmp al, 1
|
||||
ja short input_pre_cont2
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
cmp ecx, 5
|
||||
jb short input_pre_done2
|
||||
|
||||
lodsd
|
||||
add eax, esi
|
||||
sub eax, [infile]
|
||||
cmp eax, [insize]
|
||||
jae short xxx2
|
||||
|
||||
cmp eax, 1000000h
|
||||
jae short xxx2
|
||||
|
||||
sub ecx, 4
|
||||
bswap eax
|
||||
mov [esi-4], eax
|
||||
inc edx
|
||||
mov [ebx], esi
|
||||
add ebx, 4
|
||||
jmp short input_pre_cont2
|
||||
;*********************************************************************
|
||||
xxx2:
|
||||
sub esi, 4
|
||||
movzx eax, byte [esi]
|
||||
mov byte [eax+edi], 1
|
||||
;---------------------------------------------------------------------
|
||||
input_pre_cont2:
|
||||
loop input_pre2
|
||||
;---------------------------------------------------------------------
|
||||
input_pre_done2:
|
||||
mov [ctn], edx
|
||||
pop edx
|
||||
xor eax, eax
|
||||
mov ecx, 256
|
||||
repnz scasb
|
||||
jnz pack_calltrick_fail
|
||||
|
||||
not cl
|
||||
mov [cti], cl
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
cmp ebx, edx
|
||||
jz @f
|
||||
|
||||
sub ebx, 4
|
||||
mov eax, [ebx]
|
||||
mov [eax-4], cl
|
||||
jmp @b
|
||||
;*********************************************************************
|
||||
@@:
|
||||
xor ebx, ebx
|
||||
push 8000h
|
||||
push ebx
|
||||
push edx
|
||||
call VirtualFree
|
||||
ret
|
||||
;*********************************************************************
|
||||
extrn exit
|
||||
extrn putchar
|
||||
extrn fopen
|
||||
extrn fread
|
||||
extrn fwrite
|
||||
extrn fclose
|
||||
extrn fseek
|
||||
extrn ftell
|
||||
extrn malloc
|
||||
extrn free
|
||||
|
||||
open_mode db "rb",0
|
||||
create_mode db "wb",0
|
||||
;*********************************************************************
|
||||
combine_program_arguments: ; ecx = argc, ebx = argv
|
||||
mov edi,program_arguments
|
||||
cld
|
||||
mov al,'"'
|
||||
stosb
|
||||
mov esi,[ebx]
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
lodsb
|
||||
or al,al
|
||||
jz @f
|
||||
stosb
|
||||
jmp @b
|
||||
;*********************************************************************
|
||||
@@:
|
||||
add ebx,4
|
||||
mov al,'"'
|
||||
stosb
|
||||
dec ecx
|
||||
jz .no_args
|
||||
;---------------------------------------------------------------------
|
||||
.next_arg:
|
||||
dec ecx
|
||||
js .no_args
|
||||
|
||||
mov al,' '
|
||||
stosb
|
||||
mov esi,[ebx]
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
lodsb
|
||||
or al,al
|
||||
jz @f
|
||||
stosb
|
||||
jmp @b
|
||||
;*********************************************************************
|
||||
@@:
|
||||
add ebx,4
|
||||
jmp .next_arg
|
||||
;*********************************************************************
|
||||
.no_args:
|
||||
mov al,0
|
||||
stosb
|
||||
ret
|
||||
;*********************************************************************
|
||||
WriteConsoleA: ; handle, buf, buf_size, num_wrote, NULL
|
||||
push ebx esi edi
|
||||
mov esi,[esp+16+4]
|
||||
mov ecx,[esp+16+8]
|
||||
cld
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
push ecx
|
||||
movzx edx,byte[esi]
|
||||
push edx
|
||||
call putchar
|
||||
add esp,4
|
||||
inc esi
|
||||
pop ecx
|
||||
loop @b
|
||||
|
||||
pop edi esi ebx
|
||||
ret 20
|
||||
;*********************************************************************
|
||||
CreateFileA: ; filename, access_mode, share_mode, security_attr, creation_disposition, flags, template
|
||||
push ebx esi edi
|
||||
cmp byte[esp+16+16],3
|
||||
push open_mode
|
||||
je @f
|
||||
|
||||
mov dword[esp],create_mode
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
pushd [esp+16+0+4]
|
||||
call fopen
|
||||
add esp,8
|
||||
or eax,eax
|
||||
jnz @f
|
||||
|
||||
or eax,-1
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
pop edi esi ebx
|
||||
ret 28
|
||||
;*********************************************************************
|
||||
GetFileSize: ; handle, high_part
|
||||
push ebx esi edi
|
||||
pushd [esp+16+0]
|
||||
call ftell
|
||||
|
||||
mov [esp],eax
|
||||
pushd 2 0 [esp+16+0+12] ; go to EOF
|
||||
call fseek
|
||||
|
||||
add esp,12
|
||||
pushd [esp+16+0+4]
|
||||
call ftell
|
||||
|
||||
add esp,4
|
||||
xchg eax,[esp]
|
||||
pushd 0 eax [esp+16+0+12] ; go to BOF
|
||||
call fseek
|
||||
|
||||
add esp,12
|
||||
pop eax
|
||||
pop edi esi ebx
|
||||
ret 8
|
||||
;*********************************************************************
|
||||
VirtualAlloc: ; address, size, alloc_type, mem_protection
|
||||
push ebx esi edi
|
||||
mov eax,[esp+16+4]
|
||||
add eax,4095
|
||||
and eax,not 4095
|
||||
push eax
|
||||
call malloc
|
||||
|
||||
add esp,4
|
||||
pop edi esi ebx
|
||||
ret 16
|
||||
;*********************************************************************
|
||||
ReadFile: ; handle, buf, buf_size, num_read, overlapped
|
||||
push ebx esi edi
|
||||
pushd [esp+16+0] 1 [esp+16+8+8] [esp+16+4+12]
|
||||
call fread
|
||||
|
||||
add esp,16
|
||||
mov [esp+16+12],eax
|
||||
cmp eax,1
|
||||
je @f
|
||||
|
||||
xor eax,eax
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
pop edi esi ebx
|
||||
ret 20
|
||||
;*********************************************************************
|
||||
WriteFile: ; handle, buf, buf_size, num_wrote, overlapped
|
||||
push ebx esi edi
|
||||
pushd [esp+16+0] 1 [esp+16+8+8] [esp+16+4+12]
|
||||
call fwrite
|
||||
|
||||
add esp,16
|
||||
mov [esp+16+12],eax
|
||||
cmp eax,1
|
||||
je @f
|
||||
|
||||
xor eax,eax
|
||||
;---------------------------------------------------------------------
|
||||
@@:
|
||||
pop edi esi ebx
|
||||
ret 20
|
||||
;*********************************************************************
|
||||
CloseHandle: ; handle
|
||||
push ebx esi edi
|
||||
pushd [esp+16+0]
|
||||
call fclose
|
||||
add esp,4
|
||||
pop edi esi ebx
|
||||
ret 4
|
||||
;*********************************************************************
|
||||
VirtualFree: ; address, size, free_type
|
||||
push ebx esi edi
|
||||
pushd [esp+16+0]
|
||||
call free
|
||||
add esp,4
|
||||
pop edi esi ebx
|
||||
ret 12
|
||||
;*********************************************************************
|
||||
ExitProcess:
|
||||
pushd [esp+4]
|
||||
call exit
|
||||
ret 4
|
||||
;*********************************************************************
|
||||
include 'lzma_compress.inc'
|
||||
include 'lzma_set_dict_size.inc'
|
||||
;*********************************************************************
|
||||
section ".const" align 4
|
||||
;---------------------------------------------------------------------
|
||||
align 4
|
||||
LiteralNextStates:
|
||||
db 0,0,0,0,1,2,3,4,5,6,4,5
|
||||
MatchNextStates:
|
||||
db 7,7,7,7,7,7,7,10,10,10,10,10
|
||||
RepNextStates:
|
||||
db 8,8,8,8,8,8,8,11,11,11,11,11
|
||||
ShortRepNextStates:
|
||||
db 9,9,9,9,9,9,9,11,11,11,11,11
|
||||
;---------------------------------------------------------------------
|
||||
info_str db 'KPack - Kolibri Packer, version 0.11',13,10
|
||||
db 'Uses LZMA v4.32 compression library',13,10,13,10
|
||||
info_len = $ - info_str
|
||||
usage_str db 'Written by diamond in 2006, 2007 specially for KolibriOS',13,10
|
||||
db 'LZMA compression library is copyright (c) 1999-2005 by Igor Pavlov',13,10
|
||||
db 13,10
|
||||
db 'Usage: kpack [--nologo] <infile> [<outfile>]',13,10
|
||||
usage_len = $ - usage_str
|
||||
errload_str db 'Cannot load input file',13,10
|
||||
errload_len = $ - errload_str
|
||||
outfileerr_str db 'Cannot save output file',13,10
|
||||
outfileerr_len = $ - outfileerr_str
|
||||
nomem_str db 'No memory',13,10
|
||||
nomem_len = $ - nomem_str
|
||||
too_big_str db 'failed, output is greater than input.',13,10
|
||||
too_big_len = $ - too_big_str
|
||||
compressing_str db 'Compressing ... '
|
||||
compressing_len = $ - compressing_str
|
||||
;*********************************************************************
|
||||
section ".data" writeable align 4
|
||||
bNoLogo db 0
|
||||
done_str db 'OK! Compression ratio: '
|
||||
ratio dw '00'
|
||||
db '%',13,10,13,10
|
||||
done_len = $ - done_str
|
||||
|
||||
use_lzma = 1
|
||||
|
||||
use_no_calltrick = 0
|
||||
use_calltrick1 = 40h
|
||||
use_calltrick2 = 80h
|
||||
|
||||
method db 1
|
||||
;*********************************************************************
|
||||
section ".bss" writeable align 4
|
||||
infilename dd ?
|
||||
outfilename dd ?
|
||||
infile dd ?
|
||||
outfile1 dd ?
|
||||
outfile2 dd ?
|
||||
outfile dd ?
|
||||
outfilebest dd ?
|
||||
workmem dd ?
|
||||
insize dd ?
|
||||
outsize dd ?
|
||||
LastWriteTime dq ?
|
||||
LastAccessTime dq ?
|
||||
CreationTime dq ?
|
||||
lzma_dictsize dd ?
|
||||
ct1 db 256 dup (?)
|
||||
ctn dd ?
|
||||
cti db ?
|
||||
|
||||
program_arguments db 512 dup (?)
|
||||
|
||||
include 'data.inc'
|
||||
;*********************************************************************
|
3348
programs/other/kpack/linux/lzma_compress.inc
Normal file
3348
programs/other/kpack/linux/lzma_compress.inc
Normal file
File diff suppressed because it is too large
Load Diff
12
programs/other/kpack/linux/lzma_set_dict_size.inc
Normal file
12
programs/other/kpack/linux/lzma_set_dict_size.inc
Normal file
@ -0,0 +1,12 @@
|
||||
;* Call: ***************************************************************
|
||||
; lzma_set_dict_size(unsigned logdictsize)
|
||||
lzma_set_dict_size:
|
||||
mov ecx,[esp+4]
|
||||
xor eax,eax
|
||||
inc eax
|
||||
shl eax,cl
|
||||
mov [_dictionarySize],eax
|
||||
lea eax,[ecx+ecx]
|
||||
mov [_distTableSize],eax
|
||||
ret 4
|
||||
;*****************************************************************************
|
Loading…
Reference in New Issue
Block a user