Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
6617 IgorA 1
use32   ; включить 32-битный режим ассемблера
2
org 0x0 ; адресация с нуля
3
	db 'MENUET01'
4
	dd 1,START,I_END,MEM,STACKTOP,0,cur_dir_path
5
 
6
include '../../../../proc32.inc'
7
include '../../../../macros.inc'
8
include '../../../../KOSfuncs.inc'
9
include '../../../../develop/libraries/box_lib/load_lib.mac'
10
 
11
include 'deflate.inc'
12
include 'debug.inc'
13
include 'zlib.inc'
14
 
15
@use_library
16
 
17
align 4
18
m0size dd 90 ;размер данных для упаковки
19
m1size dd 1024 ;размер буфера данных для упаковки
20
m2size dd 0 ;размер распакованных данных
21
 
22
align 4
23
m0: ;данные для упаковки
24
file 'zlib.txt'
25
 
26
align 4
27
m1 rb 1024 ;буфер для упакованных данных
28
m2 dd 0 ;указатель на распакованные данные
29
 
30
buf rb 1024 ;буфер для вывода сжатых данных в окно
31
strategy dd Z_DEFAULT_STRATEGY ;стратегия сжатия
32
 
33
align 4
34
START:
35
load_libraries l_libs_start,load_lib_end
36
mov	ebp,lib0
37
.test_lib_open:
38
	cmp	dword [ebp+ll_struc_size-4],0
39
	jz	@f
40
	mcall SF_TERMINATE_PROCESS ;exit not correct
41
@@:
42
	add ebp,ll_struc_size
43
	cmp ebp,load_lib_end
44
	jl .test_lib_open
45
 
46
;	mcall SF_SYS_MISC, SSF_HEAP_INIT
47
 
48
	call test_code
49
 
50
align 4
51
red:                    ; перерисовать окно
52
    call draw_window    ; вызываем процедуру отрисовки окна
53
 
54
align 4
55
still:
56
    mcall SF_WAIT_EVENT
57
    cmp  eax,1          ; перерисовать окно ?
58
    je   red
59
    cmp  eax,2          ; нажата клавиша ?
60
    je   key
61
    cmp  eax,3          ; нажата кнопка ?
62
    je   button
63
    jmp  still
64
 
65
align 4
66
key:
67
    mcall SF_GET_KEY
68
 
69
	cmp ah,178 ;Up
70
	jne @f
71
		cmp dword[strategy],0
72
		jle @f
73
		dec dword[strategy]
74
		call test_code
75
		call draw_window
76
	@@:
77
	cmp ah,177 ;Down
78
	jne @f
79
		cmp dword[strategy],4
80
		jge @f
81
		inc dword[strategy]
82
		call test_code
83
		call draw_window
84
	@@:
85
	cmp ah,176 ;Left
86
	jne @f
87
		cmp dword[m0size],8
88
		jl @f
89
		dec dword[m0size]
90
		call test_code
91
		call draw_window
92
	@@:
93
	cmp ah,179 ;Right
94
	jne @f
95
		inc dword[m0size]
96
		call test_code
97
		call draw_window
98
	@@:
99
    jmp  still          ; вернуться к началу цикла
100
 
101
;---------------------------------------------------------------------
102
align 4
103
button:
104
	mcall SF_GET_BUTTON
105
 
106
	cmp ah,1
107
	jne still
108
 
6639 IgorA 109
.exit: ; конец программы
6617 IgorA 110
  	mcall SF_SYS_MISC,SSF_MEM_FREE,[m2]
6639 IgorA 111
    mcall SF_TERMINATE_PROCESS
6617 IgorA 112
 
113
align 4
114
draw_window:
6801 IgorA 115
    mcall SF_REDRAW, SSF_BEGIN_DRAW
6617 IgorA 116
    mcall SF_STYLE_SETTINGS, SSF_GET_COLORS, sc,sizeof.system_colors
117
    mov   edx, [sc.work]         ; цвет фона
118
    or    edx, 0x33000000        ; и тип окна 3
119
    mcall SF_CREATE_WINDOW, <50,600>, <50,180>, , ,title
120
 
121
	cStr edx,'Strategy:'
122
	mcall SF_DRAW_TEXT, <10,10>,0x40f0,,9
123
	cStr edx,'Input size:'
124
	mcall , <10,20>,,,11
125
	cStr edx,'Compr. size:'
126
	mcall , <10,30>,,,12
127
	cStr edx,'Outp. size:'
128
	mcall , <10,120>,,,11
129
 
6801 IgorA 130
	mov edx,[strategy]
131
	imul edx,12
132
	add edx,capt_strateg
133
	mcall , <90,10>,0,,12
134
 
135
	mcall SF_DRAW_NUMBER, (5 shl 16)+1, m0size, <90,20>
6617 IgorA 136
	mcall , (5 shl 16)+1, m1size, <90,30>
137
	mcall , (5 shl 16)+1, m2size, <90,120>
138
	;mov ecx,(1 shl 31)
139
	mov esi,[m2size]
140
	cmp esi,95
141
	jle @f
142
		mov esi,95
143
	@@:
144
	mcall SF_DRAW_TEXT, <10,130>, 0, [m2]
145
 
146
	mov esi,7
147
	mov ebx,(10 shl 16)+45 ;(x shl 16)+y
148
	mov edx,buf
149
	.cycle1: ;rows
150
		mcall SF_DRAW_TEXT,, (1 shl 31)
151
		add ebx,10
152
		add edx,32*3
153
	dec esi
154
	jnz .cycle1
155
 
6801 IgorA 156
    mcall SF_REDRAW, SSF_END_DRAW
6617 IgorA 157
    ret
158
 
159
align 4
160
test_code:
161
	stdcall [deflateInit2], my_strm,\
162
		-1, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, [strategy]
163
;Стратегия:
164
; Z_DEFAULT_STRATEGY, Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED
165
 
166
	mov eax,my_strm
167
	mov [eax+z_stream.next_in],m0 ;устанавливаем память для сжатия
168
	mov ecx,[m0size]
6704 IgorA 169
	mov [eax+z_stream.avail_in],ecx ;размер сжимаемыж данных
6617 IgorA 170
	mov [eax+z_stream.next_out],m1 ;устанавливаем буфер для сжатия
6797 IgorA 171
	mov dword[eax+z_stream.avail_out],1024 ;размер буфера для сжатия (максимум 16 Кб)
6617 IgorA 172
 
6639 IgorA 173
	;вычисляем crc для сжимаемыж данных
174
	stdcall [calc_crc32], 0,m0,ecx
175
	mov edx,eax
176
 
6617 IgorA 177
	;call print_z_struct
178
 
179
	stdcall [deflate], my_strm, Z_FINISH ;Z_NO_FLUSH
180
 
181
	;call print_z_struct
182
 
6797 IgorA 183
	;размер сжатых данных: 1024-[my_strm.avail_out]
6617 IgorA 184
	mov ecx,1024
6797 IgorA 185
	sub ecx,[my_strm.avail_out]
6617 IgorA 186
	mov [m1size],ecx
187
 
6639 IgorA 188
	;assert(ret != Z_STREAM_ERROR)
189
	;while (strm.avail_out == 0)
6617 IgorA 190
 
6639 IgorA 191
	;ставим crc на сжатые данные
192
	mov ecx,[m1size]
193
	sub ecx,4
194
	add ecx,m1
195
	mov [ecx],edx
196
 
197
	;формирование текста для отображения сжатых данных
198
	;в 16-ричном виде, нужно только для примера
6617 IgorA 199
	mov ebx,[m1size]
200
	mov esi,m1
201
	mov edi,buf
202
	mov edx,7
6639 IgorA 203
align 4
6617 IgorA 204
	.cycle1: ;rows
205
	mov ecx,32
6639 IgorA 206
align 4
6617 IgorA 207
	.cycle0: ;cols
208
		stdcall hex_in_str, edi,[esi],2
209
		add edi,2
210
		inc esi
211
		mov byte[edi],' ' ;format space
212
		dec ebx
213
		jz .cycle1end ;if end file
214
		inc edi
215
		loop .cycle0
216
	mov byte[edi-1],0
217
	dec edx
218
	jnz .cycle1
219
	.cycle1end:
220
	mov byte[edi],0
221
 
6639 IgorA 222
	;удаление буфера с ранее распакованными данными
6617 IgorA 223
	mcall SF_SYS_MISC,SSF_MEM_FREE,[m2]
224
 
225
	mov eax,[m1size]
226
	sub eax,2 ;;; 2? or 6?
227
	mov [m2size],eax
228
	mov eax,m1
229
	add eax,2
230
	stdcall [deflate_unpack],eax,m2size
6639 IgorA 231
	mov [m2],eax ;запись новых распакованных данных
6617 IgorA 232
	mov ecx,[m0size] ;;; ???
233
	mov [m2size],ecx
234
	ret
235
 
236
align 4
237
proc print_z_struct uses eax ebx
238
	mov eax,my_strm
239
	mov ebx,[eax+z_stream.state]
240
	stdcall debug_fields,eax,sv_2
241
	stdcall debug_fields,ebx,sv_3
242
	ret
243
endp
244
 
6801 IgorA 245
align 4
6617 IgorA 246
sc system_colors
6801 IgorA 247
align 4
6617 IgorA 248
title db 'Zlib test, press on [Up], [Down], [Left], [Right]',0
249
 
250
align 4
6801 IgorA 251
capt_strateg db '0) Default ',0
252
db '1) Filtered',0
253
db '2) Huffman ',0
254
db '3) Rle     ',0
255
db '4) Fixed   ',0
256
 
257
align 4
6617 IgorA 258
import_archiver:
259
	deflate_unpack dd sz_deflate_unpack
260
	deflateInit		dd sz_deflateInit
261
	deflateInit2	dd sz_deflateInit2
262
	deflateReset	dd sz_deflateReset
263
	deflate			dd sz_deflate
264
	deflateEnd		dd sz_deflateEnd
6639 IgorA 265
	calc_crc32		dd sz_calc_crc32
6617 IgorA 266
	dd 0,0
6673 IgorA 267
	sz_deflate_unpack db 'deflate_unpack',0
6617 IgorA 268
	sz_deflateInit db 'deflateInit',0
269
	sz_deflateInit2 db 'deflateInit2',0
270
	sz_deflateReset db 'deflateReset',0
271
	sz_deflate db 'deflate',0
272
	sz_deflateEnd db 'deflateEnd',0
6639 IgorA 273
	sz_calc_crc32 db 'calc_crc32',0
274
 
6617 IgorA 275
;--------------------------------------------------
276
system_dir_0 db '/sys/lib/'
277
lib_name_0 db 'archiver.obj',0
278
 
279
err_message_found_lib0 db 'Sorry I cannot load library archiver.obj',0
280
head_f_i:
281
head_f_l db 'System error',0
282
err_message_import0 db 'Error on load import library archiver.obj',0
283
 
284
l_libs_start:
285
	lib0 l_libs lib_name_0, cur_dir_path, library_path, system_dir_0,\
286
		err_message_found_lib0, head_f_l, import_archiver,err_message_import0, head_f_i
287
load_lib_end:
288
;---------------------------------------------------------------------
289
 
290
align 16
291
I_END:
292
my_strm z_stream
293
	rd 4096
294
align 16
295
STACKTOP:
296
cur_dir_path:
297
	rb 4096
298
library_path:
299
	rb 4096
300
MEM: