Rev 1688 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1686 | mario79 | 1 | ;********************************************************************* |
2 | pack: |
||
1713 | mario79 | 3 | call displogo_and_readfile |
1686 | mario79 | 4 | jz inopened |
5 | ;--------------------------------------------------------------------- |
||
6 | infileerr: |
||
7 | call return_memory |
||
8 | mov esi,errload_str |
||
9 | push errload_len |
||
10 | pop ecx |
||
11 | jmp write_string |
||
12 | ;--------------------------------------------------------------------- |
||
13 | inopened: |
||
14 | mov ebx,[insize] |
||
15 | test ebx,ebx |
||
16 | jz infileerr |
||
17 | ; maximum memory requests: 2*insize + 2*(maxoutsize+400h) + worksize |
||
18 | xor esi,esi |
||
19 | add esi,ebx |
||
20 | mov [inbuftmp],esi |
||
21 | add esi,ebx |
||
22 | mov [outfile],esi |
||
23 | mov [outfile1],esi |
||
24 | mov [outfilebest],esi |
||
25 | |||
26 | mov ecx,ebx |
||
27 | shr ecx,3 |
||
28 | add ecx,ebx |
||
29 | add ecx,400h |
||
30 | add esi,ecx |
||
31 | mov [outfile2],esi |
||
32 | add esi,ecx |
||
33 | mov [workmem],esi |
||
34 | add ecx,ebx |
||
35 | add ecx,ecx |
||
36 | ; LZMA requires 0x448000 + dictsize*9.5 bytes for workmem, |
||
37 | and [lzma_dictsize],0 |
||
38 | push ecx |
||
39 | mov eax,ebx |
||
40 | dec eax |
||
41 | bsr ecx,eax |
||
42 | inc ecx |
||
43 | cmp ecx,28 |
||
44 | jb @f |
||
45 | |||
46 | mov cl,28 |
||
47 | ;-------------------------------------- |
||
48 | @@: |
||
49 | mov edx,ecx |
||
50 | xor eax,eax |
||
51 | inc eax |
||
52 | shl eax,cl |
||
53 | imul eax,19 |
||
54 | shr eax,1 |
||
55 | add eax,448000h |
||
56 | pop ecx |
||
57 | add ecx,eax |
||
58 | |||
59 | mcall 68,12 |
||
60 | |||
61 | mov [infile],eax |
||
62 | add [inbuftmp],eax |
||
63 | add [outfile],eax |
||
64 | add [outfile1],eax |
||
65 | add [outfilebest],eax |
||
66 | add [outfile2],eax |
||
67 | add [workmem],eax |
||
68 | ;-------------------------------------- |
||
69 | ; try to use smaller dictionary |
||
70 | ;meml0: |
||
71 | ; cmp edx,4 |
||
72 | ; jbe memf1 |
||
73 | ; |
||
74 | ; dec edx |
||
75 | ; xor eax,eax |
||
76 | ; inc eax |
||
77 | ; mov ecx,edx |
||
78 | ; shl eax,cl |
||
79 | ; imul eax,19 |
||
80 | ; shr eax,1 |
||
81 | ; add eax,509000h |
||
82 | ; pop ecx |
||
83 | ; push ecx |
||
84 | ; add ecx,eax |
||
85 | ; mcall 64 |
||
86 | ; test eax,eax |
||
87 | ; jnz meml0 |
||
88 | ;-------------------------------------- |
||
89 | ; ok, say warning and continue |
||
90 | ; mov [lzma_dictsize],edx |
||
91 | ; mov esi,lzma_memsmall_str |
||
92 | ; push lzma_memsmall_len |
||
93 | ; pop ecx |
||
94 | ; call write_string |
||
95 | ; jmp mem_ok |
||
96 | ;--------------------------------------------------------------------- |
||
97 | ;memf1: |
||
98 | ; mov esi,nomem_str |
||
99 | ; push nomem_len |
||
100 | ; pop ecx |
||
101 | ; jmp write_string |
||
102 | ;--------------------------------------------------------------------- |
||
103 | mem_ok: |
||
104 | mov eax,[insize] |
||
105 | mov ebx,fn70block |
||
106 | mov [ebx],byte 0 |
||
107 | mov [ebx+12],eax |
||
108 | mov esi,[infile] |
||
109 | mov [ebx+16],esi |
||
110 | mcall 70 |
||
111 | test eax,eax |
||
112 | jnz infileerr |
||
113 | |||
114 | mov eax,[outfile] |
||
1688 | mario79 | 115 | mov [eax],dword 'KPCK' |
1686 | mario79 | 116 | mov ecx,[insize] |
117 | mov [eax+4],dword ecx |
||
118 | mov edi,eax |
||
119 | ; set LZMA dictionary size |
||
120 | mov eax,[lzma_dictsize] |
||
121 | test eax,eax |
||
122 | js no_lzma_setds |
||
123 | jnz lzma_setds |
||
124 | |||
125 | mov ecx,[insize] |
||
126 | dec ecx |
||
127 | bsr eax,ecx |
||
128 | inc eax |
||
129 | cmp eax,28 |
||
130 | jb lzma_setds |
||
131 | |||
132 | mov eax,28 |
||
133 | ;-------------------------------------- |
||
134 | lzma_setds: |
||
135 | push eax |
||
136 | call lzma_set_dict_size |
||
137 | ;-------------------------------------- |
||
138 | no_lzma_setds: |
||
1713 | mario79 | 139 | call tell_compress_mess |
140 | |||
1686 | mario79 | 141 | mov esi,[outfile1] |
142 | mov edi,[outfile2] |
||
143 | movsd |
||
144 | movsd |
||
145 | movsd |
||
146 | call pack_lzma |
||
147 | mov [outsize],eax |
||
148 | mov eax,[outfile] |
||
149 | mov [outfilebest],eax |
||
150 | mov [method],use_lzma |
||
151 | ;-------------------------------------- |
||
152 | @@: |
||
153 | call preprocess_calltrick |
||
154 | test eax,eax |
||
155 | jz noct1 |
||
156 | |||
157 | call set_outfile |
||
158 | call pack_lzma |
||
159 | add eax,5 |
||
160 | cmp eax,[outsize] |
||
161 | jae @f |
||
162 | |||
163 | mov [outsize],eax |
||
164 | mov eax,[outfile] |
||
165 | mov [outfilebest],eax |
||
166 | mov [method],use_lzma or use_calltrick1 |
||
167 | ;-------------------------------------- |
||
168 | @@: |
||
169 | noct1: |
||
170 | call set_outfile |
||
171 | push [ctn] |
||
172 | mov al,[cti] |
||
173 | push eax |
||
174 | call preprocess_calltrick2 |
||
175 | test eax,eax |
||
176 | jz noct2 |
||
177 | |||
178 | call set_outfile |
||
179 | call pack_lzma |
||
180 | add eax,5 |
||
181 | cmp eax,[outsize] |
||
182 | jae @f |
||
183 | |||
184 | mov [outsize],eax |
||
185 | mov eax,[outfile] |
||
186 | mov [outfilebest],eax |
||
187 | mov [method],use_lzma or use_calltrick2 |
||
188 | pop ecx |
||
189 | pop ecx |
||
190 | push [ctn] |
||
191 | mov al,[cti] |
||
192 | push eax |
||
193 | ;-------------------------------------- |
||
194 | @@: |
||
195 | noct2: |
||
196 | pop eax |
||
197 | mov [cti],al |
||
198 | pop [ctn] |
||
199 | add [outsize],12 |
||
200 | mov eax,[outsize] |
||
201 | cmp eax,[insize] |
||
202 | jb packed_ok |
||
203 | |||
204 | mov esi,too_big_str |
||
205 | push too_big_len |
||
206 | pop ecx |
||
207 | jmp write_string |
||
208 | ;--------------------------------------------------------------------- |
||
209 | packed_ok: |
||
210 | ; set header |
||
211 | movzx eax,[method] |
||
212 | mov edi,[outfilebest] |
||
213 | mov [edi+8],eax |
||
214 | test al,use_calltrick1 or use_calltrick2 |
||
215 | jz @f |
||
216 | |||
217 | mov ecx,[outsize] |
||
218 | add ecx,edi |
||
219 | mov eax,[ctn] |
||
220 | mov [ecx-5],eax |
||
221 | mov al,[cti] |
||
222 | mov [ecx-1],al |
||
223 | ;-------------------------------------- |
||
224 | @@: |
||
225 | mov eax,[outsize] |
||
226 | mov ecx,100 |
||
227 | mul ecx |
||
228 | div [insize] |
||
229 | aam |
||
230 | xchg al,ah |
||
231 | add ax,'00' |
||
232 | mov [ratio],ax |
||
233 | mov esi,done_str |
||
234 | push done_len |
||
235 | pop ecx |
||
236 | call write_string |
||
237 | ;-------------------------------------- |
||
238 | ; save output file |
||
239 | saveout: |
||
240 | mov esi,outname |
||
241 | call get_full_name |
||
242 | mov ebx,fn70block |
||
243 | mov [ebx],byte 2 |
||
244 | mov eax,[outfilebest] |
||
245 | mov ecx,[outsize] |
||
246 | mov [ebx+12],ecx |
||
247 | mov [ebx+16],eax |
||
248 | mcall 70 |
||
249 | test eax,eax |
||
250 | jz @f |
||
251 | ;-------------------------------------- |
||
252 | outerr: |
||
253 | mov esi,outfileerr_str |
||
254 | push outfileerr_len |
||
255 | pop ecx |
||
256 | jmp write_string |
||
257 | ;--------------------------------------------------------------------- |
||
258 | @@: |
||
259 | xor eax,eax |
||
260 | mov ebx,fn70block |
||
261 | mov [ebx],byte 6 |
||
262 | mov [ebx+4],eax |
||
263 | mov [ebx+8],eax |
||
264 | mov [ebx+12],eax |
||
265 | mov [ebx+16],dword file_attr |
||
266 | mcall 70 |
||
267 | |||
268 | call return_memory |
||
269 | ret |
||
270 | ;--------------------------------------------------------------------- |
||
271 | set_outfile: |
||
272 | mov eax,[outfilebest] |
||
273 | xor eax,[outfile1] |
||
274 | xor eax,[outfile2] |
||
275 | mov [outfile],eax |
||
276 | ret |
||
277 | ;--------------------------------------------------------------------- |
||
278 | pack_calltrick_fail: |
||
279 | xor eax,eax |
||
280 | mov [ctn],0 |
||
281 | ret |
||
282 | ;--------------------------------------------------------------------- |
||
283 | preprocess_calltrick: |
||
284 | ; input preprocessing |
||
285 | xor eax,eax |
||
286 | mov edi,ct1 |
||
287 | mov ecx,256/4 |
||
288 | push edi |
||
289 | rep stosd |
||
290 | pop edi |
||
291 | mov ecx,[insize] |
||
292 | mov esi,[infile] |
||
293 | xchg eax,edx |
||
294 | mov ebx,[inbuftmp] |
||
295 | ;-------------------------------------- |
||
296 | input_pre: |
||
297 | lodsb |
||
298 | sub al,0E8h |
||
299 | cmp al,1 |
||
300 | ja input_pre_cont |
||
301 | |||
302 | cmp ecx,5 |
||
303 | jb input_pre_done |
||
304 | |||
305 | lodsd |
||
306 | add eax,esi |
||
307 | sub eax,[infile] |
||
308 | cmp eax,[insize] |
||
309 | jae xxx |
||
310 | |||
311 | cmp eax,1000000h |
||
312 | jae xxx |
||
313 | |||
314 | sub ecx,4 |
||
315 | ; bswap is not supported on i386 |
||
316 | xchg al,ah |
||
317 | ror eax,16 |
||
318 | xchg al,ah |
||
319 | mov [esi-4],eax |
||
320 | inc edx |
||
321 | mov [ebx],esi |
||
322 | add ebx,4 |
||
323 | jmp input_pre_cont |
||
324 | ;--------------------------------------------------------------------- |
||
325 | xxx: |
||
326 | sub esi,4 |
||
327 | movzx eax,byte [esi] |
||
328 | mov [eax+edi],byte 1 |
||
329 | ;-------------------------------------- |
||
330 | input_pre_cont: |
||
331 | loop input_pre |
||
332 | ;-------------------------------------- |
||
333 | input_pre_done: |
||
334 | mov [ctn],edx |
||
335 | xor eax,eax |
||
336 | mov ecx,256 |
||
337 | repnz scasb |
||
338 | jnz pack_calltrick_fail |
||
339 | |||
340 | not cl |
||
341 | mov [cti],cl |
||
342 | @@: |
||
343 | cmp ebx,[inbuftmp] |
||
344 | jz @f |
||
345 | |||
346 | sub ebx,4 |
||
347 | mov eax,[ebx] |
||
348 | mov [eax-4],cl |
||
349 | jmp @b |
||
350 | ;--------------------------------------------------------------------- |
||
351 | @@: |
||
352 | mov al,1 |
||
353 | ret |
||
354 | ;--------------------------------------------------------------------- |
||
355 | pack_lzma: |
||
356 | mov eax,[outfile] |
||
357 | add eax,11 |
||
358 | push [workmem] ;workmem |
||
359 | push [insize] ;length |
||
360 | push eax ;destination |
||
361 | push [infile] ;source |
||
362 | call lzma_compress |
||
363 | mov ecx,[outfile] |
||
364 | mov edx,[ecx+12] |
||
365 | xchg dl,dh |
||
366 | ror edx,16 |
||
367 | xchg dl,dh |
||
368 | mov [ecx+12],edx |
||
369 | dec eax |
||
370 | ret |
||
371 | ;--------------------------------------------------------------------- |
||
372 | preprocess_calltrick2: |
||
373 | ; restore input |
||
374 | mov esi,[infile] |
||
375 | mov ecx,[ctn] |
||
376 | jecxz pc2l2 |
||
377 | ;-------------------------------------- |
||
378 | pc2l1: |
||
379 | lodsb |
||
380 | sub al,0E8h |
||
381 | cmp al,1 |
||
382 | ja pc2l1 |
||
383 | |||
384 | mov al,[cti] |
||
385 | cmp [esi],al |
||
386 | jnz pc2l1 |
||
387 | |||
388 | lodsd |
||
389 | shr ax,8 |
||
390 | ror eax,16 |
||
391 | xchg al,ah |
||
392 | sub eax,esi |
||
393 | add eax,[infile] |
||
394 | mov [esi-4],eax |
||
395 | loop pc2l1 |
||
396 | ;-------------------------------------- |
||
397 | pc2l2: |
||
398 | ; input preprocessing |
||
399 | mov edi,ct1 |
||
400 | xor eax,eax |
||
401 | push edi |
||
402 | mov ecx,256/4 |
||
403 | rep stosd |
||
404 | pop edi |
||
405 | mov ecx,[insize] |
||
406 | mov esi,[infile] |
||
407 | mov ebx,[inbuftmp] |
||
408 | xchg eax,edx |
||
409 | ;-------------------------------------- |
||
410 | input_pre2: |
||
411 | lodsb |
||
412 | ;-------------------------------------- |
||
413 | @@: |
||
414 | cmp al,0Fh |
||
415 | jnz ip1 |
||
416 | |||
417 | dec ecx |
||
418 | jz input_pre_done2 |
||
419 | |||
420 | lodsb |
||
421 | cmp al,80h |
||
422 | jb @b |
||
423 | |||
424 | cmp al,90h |
||
425 | jb @f |
||
426 | ;-------------------------------------- |
||
427 | ip1: |
||
428 | sub al,0E8h |
||
429 | cmp al,1 |
||
430 | ja input_pre_cont2 |
||
431 | ;-------------------------------------- |
||
432 | @@: |
||
433 | cmp ecx,5 |
||
434 | jb input_pre_done2 |
||
435 | |||
436 | lodsd |
||
437 | add eax,esi |
||
438 | sub eax,[infile] |
||
439 | cmp eax,[insize] |
||
440 | jae xxx2 |
||
441 | |||
442 | cmp eax,1000000h |
||
443 | jae xxx2 |
||
444 | |||
445 | sub ecx,4 |
||
446 | xchg al,ah |
||
447 | rol eax,16 |
||
448 | xchg al,ah |
||
449 | mov [esi-4],eax |
||
450 | inc edx |
||
451 | mov [ebx],esi |
||
452 | add ebx,4 |
||
453 | jmp input_pre_cont2 |
||
454 | ;--------------------------------------------------------------------- |
||
455 | xxx2: sub esi,4 |
||
456 | movzx eax,byte [esi] |
||
457 | mov [eax+edi],byte 1 |
||
458 | ;-------------------------------------- |
||
459 | input_pre_cont2: |
||
460 | loop input_pre2 |
||
461 | ;-------------------------------------- |
||
462 | input_pre_done2: |
||
463 | mov [ctn],edx |
||
464 | xor eax,eax |
||
465 | mov ecx,256 |
||
466 | repnz scasb |
||
467 | jnz pack_calltrick_fail |
||
468 | |||
469 | not cl |
||
470 | mov [cti],cl |
||
471 | ;-------------------------------------- |
||
472 | @@: |
||
473 | cmp ebx,[inbuftmp] |
||
474 | jz @f |
||
475 | |||
476 | sub ebx,4 |
||
477 | mov eax,[ebx] |
||
478 | mov [eax-4],cl |
||
479 | jmp @b |
||
480 | ;--------------------------------------------------------------------- |
||
481 | @@: |
||
482 | mov al,1 |
||
483 | ret |
||
484 | ;********************************************************************* |