forked from KolibriOS/kolibrios
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