Subversion Repositories Kolibri OS

Rev

Rev 1686 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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