; kpack = Kolibri Packer ; Kolibri version ; Written by diamond in 2006, 2007 specially for KolibriOS ; ; Disassemled and corrected in 2010 specially for FASM ; by Marat Zakiyanov aka Mario79, aka Mario ; ; 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) ;--------------------------------------------------------------------- use32 org 0 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 0 ;cur_dir_path ;--------------------------------------------------------------------- START: call clear_messages ; set default path = /RD/1/ mov esi,defpath mov edi,path mov [edi-4],dword 6 movsw movsd ; get system window info mov al,48 push 3 pop ebx mov ecx,color_table push 40 pop edx int 40h inc ebx int 40h 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 jmp waitevent ;--------------------------------------------------------------------- clear_messages: xor eax,eax mov ecx,80*20/4+1 mov edi,message_mem rep stosd ret ;--------------------------------------------------------------------- exit: xor eax,eax dec eax int 40h outeqin: mov ecx,48/4+1 mov esi,inname-4 mov edi,outname-4 rep movsd jmp doit ;--------------------------------------------------------------------- default: mov [curedit],inname mov ecx,[skinheight] add ecx,5 mov [curedit_y],ecx mov esi,definoutname mov edi,esi xor ecx,ecx xor eax,eax dec ecx repnz scasb not ecx dec ecx mov [innamelen],ecx push ecx push esi mov edi,inname rep movsb pop esi pop ecx mov [outnamelen],ecx mov edi,outname rep movsb ;--------------------------------------------------------------------- dodraw: call draw_window waitevent: push 10 pop eax int 40h dec eax jz dodraw dec eax jz keypressed dec eax jnz waitevent ; button pressed mov al,17 int 40h xchg al,ah cmp al,7 jz but7 dec eax jz exit dec eax jnz nopack call pack jmp waitevent ;--------------------------------------------------------------------- nopack: dec eax jnz nounpack call unpack jmp waitevent ;--------------------------------------------------------------------- but7: call clear_messages ; display logo mov esi,info_str push info_len pop ecx call write_string ; display info mov esi,usage_str mov ecx,usage_len call write_string jmp waitevent ;--------------------------------------------------------------------- nounpack: ; this is infile/outfile/path button call clear_edit_points mov esi,inname mov ecx,[skinheight] 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 mov ebx,[esi-4] mov edi,ebx imul ebx,6 add ebx,42h add ecx,4 xor edx,edx @@: cmp edi,48 jz waitevent int 40h add ebx,6 inc edi jmp @b ;--------------------------------------------------------------------- keypressed: mov al,2 int 40h 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 ; clear point and draw symbol lea edi,[edi+ebx-1] 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 pop ecx mov bx,cx mov edx,edi push 1 pop esi mov ecx,[color_table+32] mov al,4 int 40h jmp waitevent ;--------------------------------------------------------------------- backspace: test ebx,ebx jz waitevent dec ebx mov [edi-4],ebx ; clear symbol and set point 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 xor edx,edx shr ebx,16 inc ebx inc ebx pop ecx add ecx,4 mov al,1 int 40h jmp waitevent ;--------------------------------------------------------------------- onenter: cmp [curedit],inname jnz @f push 2 pop eax jmp nounpack ;--------------------------------------------------------------------- @@: cmp [curedit],outname jnz @f call pack jmp waitevent ;--------------------------------------------------------------------- @@: call clear_edit_points jmp waitevent ;--------------------------------------------------------------------- pack: call clear_edit_points and [curedit],0 ; clear messages call clear_messages ; display logo mov esi,info_str push info_len pop ecx call write_string ; load input file mov esi,inname call get_full_name mov ebx,fn70block mov [ebx],dword 5 and [ebx+4],dword 0 and [ebx+8],dword 0 and [ebx+12],dword 0 mov [ebx+16],dword file_attr push 70 pop eax int 40h test eax,eax jz inopened ;--------------------------------------------------------------------- infileerr: mov esi,errload_str push errload_len pop ecx jmp write_string ;--------------------------------------------------------------------- inopened: mov ebx,[insize] test ebx,ebx jz infileerr ; maximum memory requests: 2*insize + 2*(maxoutsize+400h) + worksize mov esi,[memf] mov [infile],esi add esi,ebx mov [inbuftmp],esi add esi,ebx mov [outfile],esi mov [outfile1],esi mov [outfilebest],esi mov ecx,ebx shr ecx,3 add ecx,ebx add ecx,400h add esi,ecx mov [outfile2],esi add esi,ecx mov [workmem],esi add ecx,ebx add ecx,ecx add ecx,[memf] ; LZMA requires 0x448000 + dictsize*9.5 bytes for workmem, and [lzma_dictsize],0 push ecx mov eax,ebx dec eax bsr ecx,eax inc ecx cmp ecx,28 jb @f mov cl,28 @@: mov edx,ecx xor eax,eax inc eax shl eax,cl imul eax,19 shr eax,1 add eax,448000h pop ecx add ecx,eax push 64 pop eax push 1 pop ebx int 40h test eax,eax jz mem_ok ; try to use smaller dictionary meml0: cmp edx,4 jbe memf1 dec edx xor eax,eax inc eax mov ecx,edx shl eax,cl imul eax,19 shr eax,1 add eax,509000h pop ecx push ecx add ecx,eax push 64 pop eax int 40h test eax,eax jnz meml0 ; ok, say warning and continue mov [lzma_dictsize],edx mov esi,lzma_memsmall_str push lzma_memsmall_len pop ecx call write_string jmp mem_ok ;--------------------------------------------------------------------- memf1: mov esi,nomem_str push nomem_len pop ecx jmp write_string ;--------------------------------------------------------------------- mem_ok: mov eax,[insize] mov ebx,fn70block mov [ebx],byte 0 mov [ebx+12],eax mov esi,[infile] mov [ebx+16],esi push 70 pop eax int 40h test eax,eax jnz infileerr mov eax,[outfile] mov [eax],dword 'KPCK' ;'KCPK' mov ecx,[insize] mov [eax+4],dword ecx mov edi,eax ; set LZMA dictionary size mov eax,[lzma_dictsize] test eax,eax js no_lzma_setds jnz lzma_setds mov ecx,[insize] dec ecx bsr eax,ecx 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 mov esi,compressing_str call write_string mov esi,[outfile1] mov edi,[outfile2] movsd 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 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 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 @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 packed_ok mov esi,too_big_str push too_big_len pop ecx jmp write_string ;--------------------------------------------------------------------- packed_ok: ; set header movzx eax,[method] mov edi,[outfilebest] mov [edi+8],eax test al,use_calltrick1 or use_calltrick2 jz @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 mov esi,done_str push done_len pop ecx call write_string ; save output file saveout: mov esi,outname call get_full_name mov ebx,fn70block mov [ebx],byte 2 mov eax,[outfilebest] mov ecx,[outsize] mov [ebx+12],ecx mov [ebx+16],eax push 70 pop eax int 40h test eax,eax jz @f outerr: mov esi,outfileerr_str push outfileerr_len pop ecx jmp write_string ;--------------------------------------------------------------------- @@: xor eax,eax mov ebx,fn70block mov [ebx],byte 6 mov [ebx+4],eax mov [ebx+8],eax mov [ebx+12],eax mov [ebx+16],dword file_attr mov al,70 int 40h ret ;--------------------------------------------------------------------- set_outfile: mov eax,[outfilebest] xor eax,[outfile1] xor eax,[outfile2] mov [outfile],eax ret ;--------------------------------------------------------------------- pack_calltrick_fail: xor eax,eax mov [ctn],0 ret ;--------------------------------------------------------------------- preprocess_calltrick: ; input preprocessing 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 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 ror eax,16 xchg al,ah mov [esi-4],eax inc edx mov [ebx],esi add ebx,4 jmp input_pre_cont ;--------------------------------------------------------------------- xxx: 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 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 jmp @b ;--------------------------------------------------------------------- @@: mov al,1 ret ;--------------------------------------------------------------------- pack_lzma: mov eax,[outfile] add eax,11 push [workmem] ;workmem push [insize] ;length push eax ;destination push [infile] ;source call lzma_compress mov ecx,[outfile] mov edx,[ecx+12] xchg dl,dh ror edx,16 xchg dl,dh 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 pc2l1 mov al,[cti] cmp [esi],al jnz pc2l1 lodsd shr ax,8 ror eax,16 xchg al,ah sub eax,esi add eax,[infile] mov [esi-4],eax loop pc2l1 pc2l2: ; input preprocessing mov edi,ct1 xor eax,eax push edi mov ecx,256/4 rep stosd pop edi mov ecx,[insize] 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 xchg al,ah mov [esi-4],eax inc edx mov [ebx],esi add ebx,4 jmp input_pre_cont2 ;--------------------------------------------------------------------- xxx2: sub esi,4 movzx eax,byte [esi] mov [eax+edi],byte 1 input_pre_cont2: loop input_pre2 input_pre_done2: mov [ctn],edx xor eax,eax 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 jmp @b ;--------------------------------------------------------------------- @@: mov al,1 ret ;--------------------------------------------------------------------- unpack: call clear_edit_points and [curedit],0 ; clear messages call clear_messages ; display logo mov esi,info_str push info_len pop ecx call write_string ; load input file mov esi,inname call get_full_name mov ebx,fn70block mov [ebx],dword 5 and [ebx+4],dword 0 and [ebx+8],dword 0 and [ebx+12],dword 0 mov [ebx+16],dword file_attr push 70 pop eax int 40h 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 test eax,eax jnz memf1 mov ebx,fn70block mov [ebx],byte 0 mov eax,[insize] mov [ebx+12],eax mov esi,[infile] mov [ebx+16],esi push 70 pop eax int 40h test eax,eax jnz infileerr mov eax,[infile] cmp [eax],dword 'KPCK' ;'KCPK' jz @f unpack_err: mov esi,notpacked_str push notpacked_len pop ecx jmp write_string ;--------------------------------------------------------------------- @@: mov ecx,[outfile] add ecx,dword [eax+4] push 64 pop eax push 1 pop ebx int 40h test eax,eax jnz memf1 mov esi,[infile] mov eax,[esi+8] push eax and al,0C0h 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 push [outfile] add esi,11 push esi mov eax,[esi+1] xchg al,ah ror eax,16 xchg al,ah mov [esi+1],eax call lzma_decompress 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 xchg al,ah sub eax,esi add eax,[outfile] mov [esi-4],eax loop uc1 jmp udone ;--------------------------------------------------------------------- uctr1: add esi,[insize] sub esi,5 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 xchg al,ah sub eax,esi add eax,[outfile] mov [esi-4],eax loop uc2 udone: mov esi,unpacked_ok push unpacked_len pop ecx call write_string jmp saveout ;--------------------------------------------------------------------- get_full_name: push esi mov esi,path mov ecx,[esi-4] mov edi,fullname rep movsb 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 xor eax,eax stosb ret ;--------------------------------------------------------------------- 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 jmp x2 ;--------------------------------------------------------------------- newline: xor eax,eax stosb xchg eax,edx push ecx push eax mov ecx,80 div ecx pop eax xchg eax,edx sub edx,eax 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 draw_messages: mov ebx,[skinheight] add ebx,3Ch+12*10000h mov edi,message_mem @@: push edi xor eax,eax push 80 pop ecx repnz scasb sub ecx,79 neg ecx mov esi,ecx mov al,4 pop edi mov edx,edi mov ecx,[color_table+32] int 40h 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 mov edi,[skinheight] ; define window xor eax,eax mov ebx,6401B3h mov ecx,64011Eh add ecx,edi mov edx,[color_table+20] add edx,13000000h push edi mov edi,caption_str int 40h pop edi ; lines - horizontal mov edx,[color_table+36] mov ebx,80160h 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 ; lines - vertical mov ebx,80008h sub ecx,240000h int 40h add ebx,340034h int 40h add ebx,1240124h int 40h ; 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 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 ; uncompress button add ecx,120000h inc edx int 40h 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 shr ecx,16 lea ebx,[ecx+1A40002h] mov ecx,[color_table+28] int 40h mov al,8 pop esi ; define settings buttons mov ebx,90032h lea ecx,[edi+2] shl ecx,16 mov cx,0Bh push 4 pop edx @@: int 40h add ecx,0C0000h inc edx cmp edx,6 jbe @b ; text on settings buttons lea ebx,[edi+5+0C0000h] mov al,4 mov ecx,[color_table+28] push buttons1names pop edx push 8 pop esi @@: int 40h add edx,esi add ebx,0Ch 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 lea ebx,[edi+1Ah+16A0000h] push aDecompress pop edx int 40h ; 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 cmp edx,[curedit] jnz cont mov al,1 push ebx push edx movzx ecx,bx shr ebx,16 lea edx,[esi*2] lea edx,[edx+edx*2] lea ebx,[ebx+edx+2] add ecx,4 xor edx,edx @@: cmp esi,48 jz @f int 40h add ebx,6 inc esi jmp @b ;--------------------------------------------------------------------- @@: pop edx pop ebx cont: add edx,52 add ebx,0Ch cmp edx,path+52 jb editdraw ; draw messages call draw_messages ; end redraw push 12 pop eax push 2 pop ebx int 40h 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 ;--------------------------------------------------------------------- clear_edit_points: ; clear edit points (if is) 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 add ebx,40h shl ebx,16 add ebx,48*6 sub bx,di mov ecx,[curedit_y] shl ecx,16 or cx,9 mov edx,[color_table+20] int 40h pop eax cleared_edit_points: ret ;--------------------------------------------------------------------- ;lzma_compress: include 'lzma_compress.inc' ;--------------------------------------------------------------------- ;lzma_set_dict_size: include 'lzma_set_dict_size.inc' ;--------------------------------------------------------------------- ;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 ;--------------------------------------------------------------------- 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 ;--------------------------------------------------------------------- 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: ;---------------------------------------------------------------------