Subversion Repositories Kolibri OS

Rev

Rev 6704 | Rev 6801 | 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:
115
    mcall SF_REDRAW, SSF_BEGIN_DRAW ; функция 12: сообщить ОС о начале отрисовки
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
 
130
	mcall SF_DRAW_NUMBER, (1 shl 16)+1, strategy, <90,10>, 0
131
	mcall , (5 shl 16)+1, m0size, <90,20>
132
	mcall , (5 shl 16)+1, m1size, <90,30>
133
	mcall , (5 shl 16)+1, m2size, <90,120>
134
	;mov ecx,(1 shl 31)
135
	mov esi,[m2size]
136
	cmp esi,95
137
	jle @f
138
		mov esi,95
139
	@@:
140
	mcall SF_DRAW_TEXT, <10,130>, 0, [m2]
141
 
142
	mov esi,7
143
	mov ebx,(10 shl 16)+45 ;(x shl 16)+y
144
	mov edx,buf
145
	.cycle1: ;rows
146
		mcall SF_DRAW_TEXT,, (1 shl 31)
147
		add ebx,10
148
		add edx,32*3
149
	dec esi
150
	jnz .cycle1
151
 
152
    mcall SF_REDRAW, SSF_END_DRAW ; функция 12.2, закончили рисовать
153
    ret
154
 
155
align 4
156
test_code:
157
	stdcall [deflateInit2], my_strm,\
158
		-1, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, [strategy]
159
;Стратегия:
160
; Z_DEFAULT_STRATEGY, Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED
161
 
162
	mov eax,my_strm
163
	mov [eax+z_stream.next_in],m0 ;устанавливаем память для сжатия
164
	mov ecx,[m0size]
6704 IgorA 165
	mov [eax+z_stream.avail_in],ecx ;размер сжимаемыж данных
6617 IgorA 166
	mov [eax+z_stream.next_out],m1 ;устанавливаем буфер для сжатия
6797 IgorA 167
	mov dword[eax+z_stream.avail_out],1024 ;размер буфера для сжатия (максимум 16 Кб)
6617 IgorA 168
 
6639 IgorA 169
	;вычисляем crc для сжимаемыж данных
170
	stdcall [calc_crc32], 0,m0,ecx
171
	mov edx,eax
172
 
6617 IgorA 173
	;call print_z_struct
174
 
175
	stdcall [deflate], my_strm, Z_FINISH ;Z_NO_FLUSH
176
 
177
	;call print_z_struct
178
 
6797 IgorA 179
	;размер сжатых данных: 1024-[my_strm.avail_out]
6617 IgorA 180
	mov ecx,1024
6797 IgorA 181
	sub ecx,[my_strm.avail_out]
6617 IgorA 182
	mov [m1size],ecx
183
 
6639 IgorA 184
	;assert(ret != Z_STREAM_ERROR)
185
	;while (strm.avail_out == 0)
6617 IgorA 186
 
6639 IgorA 187
	;ставим crc на сжатые данные
188
	mov ecx,[m1size]
189
	sub ecx,4
190
	add ecx,m1
191
	mov [ecx],edx
192
 
193
	;формирование текста для отображения сжатых данных
194
	;в 16-ричном виде, нужно только для примера
6617 IgorA 195
	mov ebx,[m1size]
196
	mov esi,m1
197
	mov edi,buf
198
	mov edx,7
6639 IgorA 199
align 4
6617 IgorA 200
	.cycle1: ;rows
201
	mov ecx,32
6639 IgorA 202
align 4
6617 IgorA 203
	.cycle0: ;cols
204
		stdcall hex_in_str, edi,[esi],2
205
		add edi,2
206
		inc esi
207
		mov byte[edi],' ' ;format space
208
		dec ebx
209
		jz .cycle1end ;if end file
210
		inc edi
211
		loop .cycle0
212
	mov byte[edi-1],0
213
	dec edx
214
	jnz .cycle1
215
	.cycle1end:
216
	mov byte[edi],0
217
 
6639 IgorA 218
	;удаление буфера с ранее распакованными данными
6617 IgorA 219
	mcall SF_SYS_MISC,SSF_MEM_FREE,[m2]
220
 
221
	mov eax,[m1size]
222
	sub eax,2 ;;; 2? or 6?
223
	mov [m2size],eax
224
	mov eax,m1
225
	add eax,2
226
	stdcall [deflate_unpack],eax,m2size
6639 IgorA 227
	mov [m2],eax ;запись новых распакованных данных
6617 IgorA 228
	mov ecx,[m0size] ;;; ???
229
	mov [m2size],ecx
230
	ret
231
 
232
align 4
233
proc print_z_struct uses eax ebx
234
	mov eax,my_strm
235
	mov ebx,[eax+z_stream.state]
236
	stdcall debug_fields,eax,sv_2
237
	stdcall debug_fields,ebx,sv_3
238
	ret
239
endp
240
 
241
sc system_colors
242
 
243
title db 'Zlib test, press on [Up], [Down], [Left], [Right]',0
244
 
245
align 4
246
import_archiver:
247
	deflate_unpack dd sz_deflate_unpack
248
	deflateInit		dd sz_deflateInit
249
	deflateInit2	dd sz_deflateInit2
250
	deflateReset	dd sz_deflateReset
251
	deflate			dd sz_deflate
252
	deflateEnd		dd sz_deflateEnd
6639 IgorA 253
	calc_crc32		dd sz_calc_crc32
6617 IgorA 254
	dd 0,0
6673 IgorA 255
	sz_deflate_unpack db 'deflate_unpack',0
6617 IgorA 256
	sz_deflateInit db 'deflateInit',0
257
	sz_deflateInit2 db 'deflateInit2',0
258
	sz_deflateReset db 'deflateReset',0
259
	sz_deflate db 'deflate',0
260
	sz_deflateEnd db 'deflateEnd',0
6639 IgorA 261
	sz_calc_crc32 db 'calc_crc32',0
262
 
6617 IgorA 263
;--------------------------------------------------
264
system_dir_0 db '/sys/lib/'
265
lib_name_0 db 'archiver.obj',0
266
 
267
err_message_found_lib0 db 'Sorry I cannot load library archiver.obj',0
268
head_f_i:
269
head_f_l db 'System error',0
270
err_message_import0 db 'Error on load import library archiver.obj',0
271
 
272
l_libs_start:
273
	lib0 l_libs lib_name_0, cur_dir_path, library_path, system_dir_0,\
274
		err_message_found_lib0, head_f_l, import_archiver,err_message_import0, head_f_i
275
load_lib_end:
276
;---------------------------------------------------------------------
277
 
278
align 16
279
I_END:
280
my_strm z_stream
281
	rd 4096
282
align 16
283
STACKTOP:
284
cur_dir_path:
285
	rb 4096
286
library_path:
287
	rb 4096
288
MEM: