Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2051 IgorA 1
use32
2
	org 0x0
3
	db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
4
	dd 0x1
5
	dd start
6
	dd i_end ;размер приложения
7
	dd mem
8
	dd stacktop
9
	dd 0
10
	dd sys_path
11
 
12
include '../../macros.inc'
13
include '../../proc32.inc'
14
include '../../develop/libraries/box_lib/load_lib.mac'
15
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
3014 dunkaist 16
include '../../dll.inc'
2051 IgorA 17
include 'lang.inc'
2165 IgorA 18
include 'info_fun_float.inc'
2051 IgorA 19
 
20
debug equ 0
21
 
22
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
23
 
24
struct FileInfoBlock
25
	Function dd ?
26
	Position dd ?
27
	Flags	 dd ?
28
	Count	 dd ?
29
	Buffer	 dd ?
30
		db ?
31
	FileName dd ?
32
ends
33
 
34
run_file_70 FileInfoBlock
35
image_data dd 0 ;указатель на временную память. для нужен преобразования изображения
36
open_file_lif dd 0 ;указатель на память для открытия файлов 3ds
37
 
38
;
39
fn_toolbar db 'toolbar.png',0
40
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
41
IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*7
42
image_data_toolbar dd 0
43
;
44
TREE_ICON_SYS16_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*11+54 ;размер bmp файла с системными иконками
45
icon_tl_sys dd 0 ;указатеель на память для хранения системных иконок
46
icon_toolbar dd 0 ;указатеель на память для хранения иконок объектов
2080 IgorA 47
TOOLBAR_ICON_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*7+54 ;размер bmp файла с иконками объектов
2051 IgorA 48
;
2080 IgorA 49
IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением
2051 IgorA 50
 
51
macro load_image_file path,buf,size { ;макрос для загрузки изображений
52
	;path - может быть переменной или строковым параметром
53
	if path eqtype '' ;проверяем задан ли строкой параметр path
54
		jmp @f
55
			local .path_str
56
			.path_str db path ;формируем локальную переменную
57
			db 0
58
		@@:
59
		;32 - стандартный адрес по которому должен быть буфер с системным путем
60
		copy_path .path_str,[32],file_name,0x0
61
	else
62
		copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
63
	end if
64
 
65
	stdcall mem.Alloc, dword size ;выделяем память для изображения
66
	mov [buf],eax
67
 
68
	mov eax,70 ;70-я функция работа с файлами
69
	mov [run_file_70.Function], 0
70
	mov [run_file_70.Position], 0
71
	mov [run_file_70.Flags], 0
72
	mov [run_file_70.Count], dword size
73
	m2m [run_file_70.Buffer], [buf]
74
	mov byte[run_file_70+20], 0
75
	mov [run_file_70.FileName], file_name
76
	mov ebx,run_file_70
77
	int 0x40 ;загружаем файл изображения
78
	cmp ebx,0xffffffff
79
	je @f
80
		;определяем вид изображения и переводим его во временный буфер image_data
81
		stdcall dword[img_decode], dword[buf],ebx,0
82
		mov dword[image_data],eax
83
		;преобразуем изображение к формату rgb
84
		stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
85
		;удаляем временный буфер image_data
86
		stdcall dword[img_destroy], dword[image_data]
87
	@@:
88
}
89
 
90
;--------------------------------------
2107 IgorA 91
include 'data.inc'
2051 IgorA 92
 
93
level_stack dd 0
94
offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера
95
 
2052 IgorA 96
ID_ICON_CHUNK_MAIN equ 0 ;иконка главного блока
97
ID_ICON_CHUNK_NOT_FOUND equ 1 ;иконка не известного блока
98
ID_ICON_DATA equ 2 ;иконка для данных блока, не определенной структуры
2051 IgorA 99
 
2052 IgorA 100
FILE_ERROR_CHUNK_SIZE equ -3 ;ошибка в размере блока
101
 
2051 IgorA 102
align 4
103
file_3ds:
104
.offs: dd 0 ;+0 указатель на начало блока
105
.size: dd 0 ;+4 размер блока (для 1-го параметра = размер файла 3ds)
2080 IgorA 106
rb 8*MAX_FILE_LEVEL
2051 IgorA 107
 
2080 IgorA 108
size_one_list equ 40
109
list_offs_text equ 12 ;сдвиг начала текста в листе
2051 IgorA 110
buffer rb size_one_list ;буфер для добавления структур в список tree1
111
 
112
txt_3ds_symb db 0,0
113
;--------------------------------------
114
 
2165 IgorA 115
include 'info_wnd_coords.inc'
2051 IgorA 116
 
117
align 4
118
start:
119
	load_libraries l_libs_start,l_libs_end
120
	;проверка на сколько удачно загузилась наша либа
121
	mov	ebp,lib_7
122
	cmp	dword [ebp+ll_struc_size-4],0
123
	jz	@f
124
		mcall -1 ;exit not correct
125
	@@:
126
	mcall 48,3,sc,sizeof.system_colors
127
	mcall 40,0x27
128
	stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
129
 
130
	stdcall dword[tl_data_init], tree1
131
	;системные иконки 16*16 для tree_list
132
	load_image_file 'tl_sys_16.png', icon_tl_sys,TREE_ICON_SYS16_BMP_SIZE
133
	;если изображение не открылось, то в icon_tl_sys будут
134
	;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера
135
	mov eax,dword[icon_tl_sys]
136
	mov dword[tree1.data_img_sys],eax
137
 
138
	load_image_file 'objects.png', icon_toolbar,TOOLBAR_ICON_BMP_SIZE
139
	mov eax,dword[icon_toolbar]
140
	mov dword[tree1.data_img],eax
141
 
142
	stdcall [buf2d_create], buf_0 ;создание буфера
143
 
144
	load_image_file 'font8x9.bmp', image_data_toolbar,IMAGE_FILE1_SIZE
145
	stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер
146
	stdcall mem.Free,[image_data_toolbar] ;освобождаем память
147
	stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
148
	stdcall [buf2d_convert_text_matrix], buf_1
149
 
150
	load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE
151
 
152
	stdcall mem.Alloc,MAX_FILE_SIZE
153
	mov dword[open_file_lif],eax
154
 
155
	mcall 26,9
156
	mov [last_time],eax
157
 
158
align 4
159
red_win:
160
	call draw_window
161
 
162
align 4
163
still:
164
	mcall 26,9
165
	mov ebx,[last_time]
166
	add ebx,10 ;задержка
167
	cmp ebx,eax
168
	jge @f
169
		mov ebx,eax
170
	@@:
171
	sub ebx,eax
172
	;cmp ebx,10 ;задержка
173
	;ja timer_funct
174
	;test ebx,ebx
175
	;jz timer_funct
176
	mcall 23
177
	cmp eax,0
178
	je timer_funct
179
 
180
	cmp al,1
181
	jz red_win
182
	cmp al,2
183
	jz key
184
	cmp al,3
185
	jz button
186
	cmp al,6
2125 IgorA 187
	jne @f
188
		mcall 9,procinfo,-1
189
		cmp ax,word[procinfo+4]
190
		jne @f ;окно не активно
2051 IgorA 191
		call mouse
192
	@@:
193
	jmp still
194
 
195
align 4
196
mouse:
197
	stdcall [tl_mouse], dword tree1
198
	ret
199
 
200
align 4
201
timer_funct:
202
	pushad
2080 IgorA 203
if debug
204
	mov eax,4
205
	mov ebx,(5 shl 16)+8
206
	mov ecx,0xff+0x80000000
207
	mov edx,txt_0002
208
	int 0x40
209
end if
2051 IgorA 210
	mcall 26,9
211
	mov [last_time],eax
212
 
213
	;
214
	stdcall [tl_node_get_data],tree1
215
	pop ebx
216
	cmp ebx,0
217
	je @f
218
		mov eax,dword[ebx] ;получаем значение сдвига выбранного блока относительно начала файла
2125 IgorA 219
		mov ecx,dword[ebx+4] ;размер блока
2051 IgorA 220
		stdcall hex_in_str, txt_3ds_offs.dig, eax,8
2125 IgorA 221
		stdcall hex_in_str, txt_3ds_offs.siz, ecx,8
2051 IgorA 222
 
223
		add eax,dword[open_file_lif] ;получаем значение сдвига в памяти
224
		cmp dword[offs_last_timer],eax
225
		je @f
226
			mov dword[offs_last_timer],eax
227
			call buf_draw_beg
2080 IgorA 228
			stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs,5,35,0xb000
229
			mov edx,dword[ebx+8]
230
			cmp edx,0 ;смотрим есть ли описание блока
231
			je .no_info
232
				stdcall [buf2d_draw_text], buf_0, buf_1,edx,5,45,0xb000
233
			.no_info:
2051 IgorA 234
			add ecx,eax ;получаем размер блока
235
			stdcall buf_draw_hex_table,eax,ecx ;добавление 16-ричных данных
236
			stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
237
	@@:
238
	popad
239
	jmp still
240
 
241
align 4
242
buf_draw_beg:
243
	stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
244
	stdcall [buf2d_draw_text], buf_0, buf_1,txt_open_3ds,5,5,0xff
245
	stdcall [buf2d_draw_text], buf_0, buf_1,openfile_path,5,15,0xff
2052 IgorA 246
	cmp dword[level_stack],FILE_ERROR_CHUNK_SIZE ;возможна ошибка файла
247
	jne @f
248
		stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_err_sizes,5,25,0xff0000
249
	@@:
2051 IgorA 250
	ret
251
 
252
align 4
253
proc buf_draw_hex_table, offs:dword, size_line:dword
254
	pushad
255
	locals
2080 IgorA 256
		coord_y dd 55 ;координата y для начала вывода таблицы
2051 IgorA 257
	endl
258
		mov esi,dword[offs]
259
		mov edi,dword[open_file_lif]
2080 IgorA 260
		add edi,dword[file_3ds.size] ;edi - указатель на конец файла в памяти
2051 IgorA 261
		mov dword[txt_3ds_offs.dig],0
262
		cld
263
		.cycle_rows:
264
			mov ebx,5 ;отступ слева для цифр
265
			mov edx,5+10*24 ;отступ слева для текста
266
			mov ecx,10
267
			@@:
268
				stdcall hex_in_str, txt_3ds_offs.dig, dword[esi],2
269
				stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs.dig,ebx,[coord_y],0
270
 
271
				mov al,byte[esi]
272
				mov byte[txt_3ds_symb],al
273
				stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_symb,edx,[coord_y],0x808080
274
				inc esi
275
				cmp esi,dword[size_line]
276
				jne .end_block
277
					stdcall draw_block_end_line, dword[coord_y]
278
				.end_block:
279
				cmp esi,edi
280
				jge @f ;jg ???
281
				add ebx,24
282
				add edx,9 ;ширина 1-го символа +1pix
283
				loop @b
284
			add dword[coord_y],10 ;высота 1-го символа (или интервал между строками)
285
			mov ebx,dword[buf_0.h]
286
			cmp dword[coord_y],ebx
287
			jl .cycle_rows
288
		@@:
289
	popad
290
	ret
291
endp
292
 
293
align 4
294
proc draw_block_end_line, coord_y:dword
295
	push eax ebx ecx
296
		add ebx,20 ;20 = width 2.5 symbols
297
		mov eax,[coord_y]
298
		sub eax,2
299
		mov ecx,eax
300
		add ecx,10
301
		stdcall [buf2d_line], buf_0, 0,ecx,ebx,ecx ,0xff
302
		stdcall [buf2d_line], buf_0, ebx,ecx,ebx,eax ,0xff
303
		stdcall [buf2d_line], buf_0, ebx,eax,5+10*24-4,eax ,0xff
304
	pop ecx ebx eax
305
	ret
306
endp
307
 
308
align 4
309
draw_window:
310
pushad
311
	mcall 12,1
312
	xor eax,eax
2052 IgorA 313
	mov ebx,(20 shl 16)+560
2051 IgorA 314
	mov ecx,(20 shl 16)+315
315
	mov edx,[sc.work]
316
	or  edx,(3 shl 24)+0x10000000+0x20000000
317
	mov edi,capt
318
	int 0x40
319
 
2125 IgorA 320
	mcall 9,procinfo,-1
321
	mov eax,dword[procinfo.box.height]
322
	cmp eax,250
323
	jge @f
324
		mov eax,250
325
	@@:
326
	sub eax,65
327
	mov dword[tree1.box_height],eax
328
	mov word[w_scr_t1+4],ax ;новые размеры скроллинга
2136 IgorA 329
	cmp eax,dword[buf_0.h] ;увеличиваем высоту буфера
330
	jle @f
331
		stdcall [buf2d_resize],buf_0,0,eax
332
		mov dword[offs_last_timer],0 ;для обновления буфера в таймере
333
	@@:
2125 IgorA 334
 
2136 IgorA 335
	mov eax,dword[procinfo.box.width]
336
	cmp eax,400
337
	jge @f
338
		mov eax,400
339
	@@:
340
	sub eax,[buf_0.w]
341
	sub eax,41
342
	mov dword[tree1.box_width],eax
343
	add ax,word[tree1.box_left]
344
	mov word[w_scr_t1.start_x],ax
345
	add ax,16+5
346
	mov word[buf_0.l],ax
347
 
2051 IgorA 348
	mov eax,8
349
	mov ebx,(5 shl 16)+20
350
	mov ecx,(5 shl 16)+20
351
	mov edx,3
352
	mov esi,[sc.work_button]
353
	int 0x40
354
 
355
	mov ebx,(30 shl 16)+20
356
	mov ecx,(5 shl 16)+20
357
	mov edx,4
358
	int 0x40
359
 
2173 IgorA 360
	cmp byte[can_save],0
361
	je @f
362
		mov ebx,(55 shl 16)+20
363
		mov ecx,(5 shl 16)+20
364
		mov edx,5
365
		int 0x40
366
	@@:
2051 IgorA 367
 
2165 IgorA 368
	mov ebx,(85 shl 16)+20
369
	mov ecx,(5 shl 16)+20
370
	mov edx,6 ;окно с координатами
371
	int 0x40
2051 IgorA 372
 
373
	mov eax,7
374
	mov ebx,[image_data_toolbar]
375
	mov ecx,(16 shl 16)+16
376
	mov edx,(7 shl 16)+7 ;new
377
	int 0x40
378
 
379
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
380
	mov edx,(32 shl 16)+7 ;open
381
	int 0x40
382
 
2173 IgorA 383
	cmp byte[can_save],0
384
	je @f
385
		add ebx,IMAGE_TOOLBAR_ICON_SIZE
386
		mov edx,(57 shl 16)+7 ;save
387
		int 0x40
388
	@@:
2051 IgorA 389
 
390
	mov dword[w_scr_t1.all_redraw],1
391
	stdcall [tl_draw],dword tree1
392
 
393
	stdcall [buf2d_draw], buf_0
394
 
395
	mcall 12,2
396
popad
397
	ret
398
 
399
align 4
400
key:
401
	mcall 2
402
	stdcall [tl_key], dword tree1
403
	jmp still
404
 
405
 
406
align 4
407
button:
408
	mcall 17
409
	cmp ah,3
410
	jne @f
411
		call but_new_file
412
	@@:
413
	cmp ah,4
414
	jne @f
415
		call but_open_file
416
	@@:
417
	cmp ah,5
418
	jne @f
419
		call but_save_file
420
	@@:
2165 IgorA 421
	cmp ah,6
422
	jne @f
423
		call but_wnd_coords
424
	@@:
2051 IgorA 425
 
426
	cmp ah,1
427
	jne still
428
.exit:
429
	mov dword[tree1.data_img],0
430
	mov dword[tree1.data_img_sys],0
431
	stdcall dword[tl_data_clear], tree1
432
	stdcall [buf2d_delete],buf_0
433
	stdcall [buf2d_delete],buf_1 ;удаляем буфер
434
	stdcall mem.Free,[image_data_toolbar]
435
	stdcall mem.Free,[open_file_lif]
436
	mcall -1
437
 
438
 
439
align 4
440
but_new_file:
2173 IgorA 441
	mov byte[can_save],0
2051 IgorA 442
	stdcall [tl_info_clear], tree1 ;очистка списка объектов
443
	stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
444
	;;;call draw_window
445
	stdcall [tl_draw], tree1
446
	stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
447
	ret
448
 
449
align 4
450
but_open_file:
451
	pushad
452
	copy_path open_dialog_name,communication_area_default_path,file_name,0
453
	mov [OpenDialog_data.type],0
454
	stdcall [OpenDialog_Start],OpenDialog_data
455
	cmp [OpenDialog_data.status],2
456
	je .end_open_file
457
	;код при удачном открытии диалога
458
 
459
	mov eax,70 ;70-я функция работа с файлами
460
	mov [run_file_70.Function], 0
461
	mov [run_file_70.Position], 0
462
	mov [run_file_70.Flags], 0
463
	mov dword[run_file_70.Count], MAX_FILE_SIZE
464
	m2m [run_file_70.Buffer], dword[open_file_lif]
465
	mov byte[run_file_70+20], 0
466
	mov dword[run_file_70.FileName], openfile_path
467
	mov ebx,run_file_70
468
	int 0x40 ;загружаем файл изображения
469
	cmp ebx,0xffffffff
470
	je .end_open_file
471
 
472
	;add ebx,[open_file_lif]
473
	;mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом
474
	;mcall 71,1,openfile_path
475
 
2173 IgorA 476
	mov byte[can_save],0
2051 IgorA 477
	stdcall [tl_info_clear], tree1 ;очистка списка объектов
478
 
479
	mov esi,dword[open_file_lif]
480
	cmp word[esi],CHUNK_MAIN
481
	je @f
482
		call buf_draw_beg
483
		stdcall [buf2d_draw_text], buf_0, buf_1,txt_no_3ds,5,25,0xff0000 ;рисуем строку с текстом
484
		jmp .end_open
485
	@@:
486
	cmp dword[esi+2],MAX_FILE_SIZE
487
	jle @f
488
		call buf_draw_beg
489
		stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_big_file,5,25,0xff0000 ;рисуем строку с текстом
490
		jmp .end_open
491
	@@:
492
	;--- обработка открытого *.3ds файла
493
	mov eax,file_3ds
494
	mov dword[level_stack],0 ;обнуляем уровень стека
495
	mov dword[offs_last_timer],0
496
	;--- добавление главного блока в список
2080 IgorA 497
	stdcall add_3ds_object, ID_ICON_CHUNK_MAIN,0,dword[esi+2],0
2051 IgorA 498
	call block_children ;вход в дочерний блок
499
 
2052 IgorA 500
	mov edi,dword[file_3ds.offs]
501
	add edi,dword[file_3ds.size]
2051 IgorA 502
	.cycle_main:
503
		cmp dword[level_stack],0
2052 IgorA 504
		jle .end_cycle
505
 
506
		cmp esi,edi ;если конец файла
507
		jge .end_cycle
2051 IgorA 508
 
2080 IgorA 509
		mov edx,dword[esi+2] ;размер блока
2051 IgorA 510
		call block_analiz
2080 IgorA 511
		cmp dword[bl_found],0
2051 IgorA 512
		jne @f
513
			;объект не известного вида
2080 IgorA 514
			stdcall add_3ds_object, ID_ICON_CHUNK_NOT_FOUND,dword[level_stack],edx,0
2051 IgorA 515
			call block_next
516
			jmp .cycle_main
517
		@@:
518
			;объект известного вида
2080 IgorA 519
			mov ecx,dword[bl_found]
2051 IgorA 520
			mov bx,word[ecx+2] ;номер иконки для объекта
2080 IgorA 521
			stdcall add_3ds_object, ebx,dword[level_stack],edx,dword[ecx+5]
2051 IgorA 522
			cmp byte[ecx+4],1
523
			je .bl_data
524
				;блок содержит дочерние блоки
525
				call block_children ;вход в дочерний блок
526
				jmp .cycle_main
527
			.bl_data:
528
				;блок содержит данные
529
				call block_analiz_data
530
				jmp .cycle_main
531
	.end_cycle:
532
		stdcall [tl_cur_beg], tree1
533
		stdcall [tl_draw], tree1
534
	.end_open:
535
 
536
	stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
537
	.end_open_file:
538
	popad
539
	ret
540
 
541
;анализ данных блока
542
;input:
543
; esi - memory pointer
2080 IgorA 544
;output:
545
; eax - new stack pointer
546
; esi - new memory pointer
2051 IgorA 547
align 4
548
block_analiz_data:
2080 IgorA 549
	push ebx ecx edx edi
550
		mov dx,word[esi]
2052 IgorA 551
		mov ecx,dword[esi+2]
552
		sub ecx,6 ;размер данных в блоке
2051 IgorA 553
		add esi,6
554
		mov ebx,dword[level_stack]
555
		inc ebx
2080 IgorA 556
		; *** анализ блоков с разными данными и выделением подблоков
557
		cmp dx,CHUNK_OBJBLOCK ;объект
558
		jne @f
2136 IgorA 559
			push ax
560
				cld
561
				xor al,al
562
				mov edi,esi
563
				repne scasb
564
			pop ax
565
			sub edi,esi ;edi - strlen
566
			stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;название объекта
567
			add esi,edi
568
			;sub ecx,edi ;уже сделано в repne
2080 IgorA 569
			jmp .next_bl
570
		@@:
2125 IgorA 571
		cmp dx,CHUNK_VERTLIST ;список вершин
572
		je .vertexes
573
		cmp dx,0x4111 ;флаги вершин
574
		je .vertexes
2136 IgorA 575
		cmp dx,CHUNK_MAPLIST ;текстурные координаты
2125 IgorA 576
		je .vertexes
577
		jmp @f
578
		.vertexes: ;обработка блоков, содержащих данные вершин
2136 IgorA 579
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число вершин
2125 IgorA 580
			add esi,2
581
			sub ecx,2
582
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;данные вершин
583
			sub esi,8 ;восстановление esi
584
			call block_next
585
			jmp .end_f
586
		@@:
2136 IgorA 587
		cmp dx,CHUNK_FACELIST ;список граней
588
		jne @f
589
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число граней
590
			push eax
591
			xor eax,eax
592
			mov ax,[esi]
593
			shl eax,3
594
			add esi,2
595
			sub ecx,2
596
			stdcall add_3ds_object, ID_ICON_DATA,ebx,eax,0 ;данные вершин
597
 
598
			sub ecx,eax
599
			cmp ecx,1
600
			jl .data_3 ;проверяем есть ли блок описывающий материал, применяемый к объекту
601
				add esi,eax
602
				pop eax
603
				jmp .next_bl
604
				;stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;данные материала
605
				;sub esi,eax ;восстановление esi
606
			.data_3:
607
 
608
			sub esi,8 ;восстановление esi
609
			pop eax
610
			call block_next
611
			jmp .end_f
612
		@@:
613
		cmp dx,CHUNK_FACEMAT ;материалы граней
614
		jne @f
615
			push ax
616
				cld
617
				xor al,al
618
				mov edi,esi
619
				repne scasb
620
			pop ax
621
			sub edi,esi ;edi - strlen
622
			stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;название объекта
623
			add esi,edi
624
			;sub ecx,edi ;уже сделано в repne
625
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число граней
626
			add esi,2
627
			sub ecx,2
628
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;номера граней, к которым применен материал
629
			sub esi,edi ;восстановление esi (1)
630
			sub esi,8   ;восстановление esi (2)
631
			call block_next
632
			jmp .end_f
633
		@@:
2080 IgorA 634
		; *** анализ блока с данными по умолчанию (без выделения подблоков)
635
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0
636
			sub esi,6 ;восстановление esi
637
			call block_next
638
			jmp .end_f
639
		.next_bl:
640
		; *** настройки для анализа оставшихся подблоков
641
			mov dword[eax],esi ;указатель на начало блока
642
			mov ebx,dword[esi+2]
643
			mov dword[eax+4],ebx ;размер блока
644
			inc dword[level_stack]
645
			add eax,8
2051 IgorA 646
		.end_f:
2080 IgorA 647
	pop edi edx ecx ebx
2051 IgorA 648
	ret
649
 
2052 IgorA 650
;вход в 1-й дочерний блок
651
;output:
652
; edx - destroy
2051 IgorA 653
align 4
654
block_children:
2052 IgorA 655
	push ecx
656
		;проверка правильности размеров дочернего блока
657
		mov ebx,esi ;смещение начала родительского блока
658
		add ebx,6 ;переход на начало дочернего блока
659
		add ebx,dword[ebx+2] ;добавляем размер дочернего блока
660
		mov ecx,esi ;смещение начала родительского блока
661
		add ecx,dword[esi+2] ;добавляем размер родительского блока
662
		cmp ebx,ecx ;учитывать заголовки не нужно, т. к. сравниваются только данные блоков
663
		jle @f
664
			;диагностировали ошибку файла, дочерний блок выходит за пределы родительского
665
			mov dword[level_stack],FILE_ERROR_CHUNK_SIZE
666
			jmp .end_f
667
		@@:
668
		mov dword[eax],esi ;указатель на начало блока
669
		mov ebx,dword[esi+2]
670
		mov dword[eax+4],ebx ;размер блока
671
		add esi,6 ;переходим к данным блока
672
		inc dword[level_stack]
673
		add eax,8
674
	.end_f:
675
	pop ecx
2051 IgorA 676
	ret
677
 
678
;переход к следущему блоку текущего уровня
679
align 4
680
block_next:
681
push ebx
682
	add esi,dword[esi+2] ;пропускаем данные блока
683
 
684
	;проверка размеров родительского блока, для возможного выхода на верхний уровень если конец блока
2080 IgorA 685
	@@:
2051 IgorA 686
	mov ebx,dword[eax-8]
687
	add ebx,dword[eax-4]
688
	cmp esi,ebx
689
	jl @f
690
		dec dword[level_stack]
691
		sub eax,8
2080 IgorA 692
		cmp dword[level_stack],0
693
		jg @b
2051 IgorA 694
	@@:
695
pop ebx
696
	ret
697
 
2080 IgorA 698
;функция поиска структуры описывающей блок
2051 IgorA 699
;input:
700
;esi - memory pointer
701
;output:
2080 IgorA 702
;dword[bl_found] - pointer to chunk struct (= 0 if not found)
2051 IgorA 703
align 4
2080 IgorA 704
bl_found dd 0
2051 IgorA 705
block_analiz:
706
pushad
2080 IgorA 707
	mov dword[bl_found],0
2051 IgorA 708
	mov ecx,type_bloks
709
	@@:
710
		mov bx,word[ecx]
711
		cmp word[esi],bx
712
		je .found
713
		add ecx,sizeof.block_3ds
714
		cmp ecx,type_bloks.end
715
		jl @b
716
	jmp .no_found
717
	.found:
2080 IgorA 718
		mov dword[bl_found],ecx
2051 IgorA 719
	.no_found:
720
popad
721
	ret
722
 
723
;input:
724
; esi - указатель на анализируемые данные
725
align 4
2080 IgorA 726
proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword
2051 IgorA 727
	pushad
728
		mov bx,word[icon]
729
		shl ebx,16
730
		mov bx,word[level]
731
 
732
		mov eax,esi
733
		sub eax,dword[open_file_lif]
734
		mov dword[buffer],eax ;смещение блока
735
		mov ecx,dword[size_bl]
736
		mov dword[buffer+4],ecx ;размер блока (используется в функции buf_draw_hex_table для рисования линии)
2080 IgorA 737
		mov ecx,dword[info_bl]
738
		mov dword[buffer+8],ecx
739
		stdcall hex_in_str, buffer+list_offs_text,dword[esi+1],2
740
		stdcall hex_in_str, buffer+list_offs_text+2,dword[esi],2 ;код 3ds блока
741
		cmp ecx,0
742
		jne @f
743
			mov byte[buffer+list_offs_text+4],0 ;0 - символ конеца строки
744
			jmp .no_capt
745
		@@:
746
			mov byte[buffer+list_offs_text+4],' '
747
			mov esi,ecx
748
			mov edi,buffer+list_offs_text+5
749
			mov ecx,size_one_list-(list_offs_text+5)
750
			cld
751
			rep movsb
752
			mov byte[buffer+size_one_list-1],0 ;0 - символ конеца строки
753
		.no_capt:
2051 IgorA 754
		stdcall [tl_node_add], buffer, ebx, tree1
755
		stdcall [tl_cur_next], tree1
756
		if debug
2080 IgorA 757
			stdcall print_err,sz_add_3ds_object,buffer+list_offs_text
2051 IgorA 758
		end if
759
	popad
760
	ret
761
endp
762
 
763
if debug
764
sz_add_3ds_object db 13,10,'3ds_object',0
765
 
766
align 4
767
proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки
768
	pushad
769
	mov eax,63
770
	mov ebx,1
771
 
772
	mov esi,[fun]
773
	@@:
774
		mov cl,byte[esi]
775
		int 0x40
776
		inc esi
777
		cmp byte[esi],0
778
		jne @b
779
	mov cl,':'
780
	int 0x40
781
	mov cl,' '
782
	int 0x40
783
	mov esi,[mes]
784
	@@:
785
		mov cl,byte[esi]
786
		int 0x40
787
		inc esi
788
		cmp byte[esi],0
789
		jne @b
790
	popad
791
	ret
792
endp
793
end if
794
 
795
align 4
796
proc hex_in_str, buf:dword,val:dword,zif:dword
797
	pushad
798
		mov edi,dword[buf]
799
		mov ecx,dword[zif]
800
		add edi,ecx
801
		dec edi
802
		mov ebx,dword[val]
803
 
804
		.cycle:
805
			mov al,bl
806
			and al,0xf
807
			cmp al,10
808
			jl @f
809
				add al,'a'-'0'-10
810
			@@:
811
			add al,'0'
812
			mov byte[edi],al
813
			dec edi
814
			shr ebx,4
815
		loop .cycle
816
 
817
	popad
818
	ret
819
endp
820
 
821
align 4
822
but_save_file:
2173 IgorA 823
	pushad
824
	copy_path open_dialog_name,communication_area_default_path,file_name,0
825
	mov [OpenDialog_data.type],1
826
	stdcall [OpenDialog_Start],OpenDialog_data
827
	cmp [OpenDialog_data.status],2
828
	je .end_save_file
829
	;код при удачном открытии диалога
830
 
831
	mov eax,70 ;70-я функция работа с файлами
832
	mov [run_file_70.Function], 2
833
	mov [run_file_70.Position], 0
834
	mov [run_file_70.Flags], 0
835
	mov ebx, dword[open_file_lif]
836
	mov [run_file_70.Buffer], ebx
837
	mov ebx,dword[ebx+2]
838
	mov dword[run_file_70.Count], ebx ;размер файла
839
	mov byte[run_file_70+20], 0
840
	mov dword[run_file_70.FileName], openfile_path
841
	mov ebx,run_file_70
842
	int 0x40 ;загружаем файл изображения
843
	cmp ebx,0xffffffff
844
	je .end_save_file
845
 
846
	.end_save_file:
847
	popad
2051 IgorA 848
	ret
849
 
2165 IgorA 850
align 4
851
but_wnd_coords:
852
	cmp byte[prop_wnd_run],0
853
	jne @f
854
		pushad
855
		mcall 51,1,prop_start,thread_coords
856
		popad
857
	@@:
858
	ret
2051 IgorA 859
 
860
 
861
;input:
862
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
863
;output:
864
; eax - число
865
align 4
866
proc conv_str_to_int, buf:dword
867
	xor eax,eax
868
	push ebx ecx esi
869
	xor ebx,ebx
870
	mov esi,[buf]
871
	;определение отрицательных чисел
872
	xor ecx,ecx
873
	inc ecx
874
	cmp byte[esi],'-'
875
	jne @f
876
		dec ecx
877
		inc esi
878
	@@:
879
 
880
	cmp word[esi],'0x'
881
	je .load_digit_16
882
 
883
	.load_digit_10: ;считывание 10-тичных цифр
884
		mov bl,byte[esi]
885
		cmp bl,'0'
886
		jl @f
887
		cmp bl,'9'
888
		jg @f
889
			sub bl,'0'
890
			imul eax,10
891
			add eax,ebx
892
			inc esi
893
			jmp .load_digit_10
894
	jmp @f
895
 
896
	.load_digit_16: ;считывание 16-ричных цифр
897
		add esi,2
898
	.cycle_16:
899
		mov bl,byte[esi]
900
		cmp bl,'0'
901
		jl @f
902
		cmp bl,'f'
903
		jg @f
904
		cmp bl,'9'
905
		jle .us1
906
			cmp bl,'A'
907
			jl @f ;отсеиваем символы >'9' и <'A'
908
		.us1: ;составное условие
909
		cmp bl,'F'
910
		jle .us2
911
			cmp bl,'a'
912
			jl @f ;отсеиваем символы >'F' и <'a'
913
			sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
914
		.us2: ;составное условие
915
			sub bl,'0'
916
			cmp bl,9
917
			jle .cor1
918
				sub bl,7 ;convert 'A' to '10'
919
			.cor1:
920
			shl eax,4
921
			add eax,ebx
922
			inc esi
923
			jmp .cycle_16
924
	@@:
925
	cmp ecx,0 ;если число отрицательное
926
	jne @f
927
		sub ecx,eax
928
		mov eax,ecx
929
	@@:
930
	pop esi ecx ebx
931
	ret
932
endp
933
 
934
;данные для диалога открытия файлов
935
align 4
936
OpenDialog_data:
937
.type			dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
938
.procinfo		dd procinfo	;+4
939
.com_area_name		dd communication_area_name	;+8
940
.com_area		dd 0	;+12
941
.opendir_path		dd plugin_path	;+16
942
.dir_default_path	dd default_dir ;+20
943
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
944
.draw_window		dd draw_window	;+28
945
.status 		dd 0	;+32
946
.openfile_path		dd openfile_path	;+36 путь к открываемому файлу
947
.filename_area		dd filename_area	;+40
948
.filter_area		dd Filter
949
.x:
950
.x_size 		dw 420 ;+48 ; Window X size
951
.x_start		dw 10 ;+50 ; Window X position
952
.y:
953
.y_size 		dw 320 ;+52 ; Window y size
954
.y_start		dw 10 ;+54 ; Window Y position
955
 
956
default_dir db '/rd/1',0
957
 
958
communication_area_name:
959
	db 'FFFFFFFF_open_dialog',0
960
open_dialog_name:
961
	db 'opendial',0
962
communication_area_default_path:
963
	db '/rd/1/File managers/',0
964
 
965
Filter:
966
dd Filter.end - Filter.1
967
.1:
968
db '3DS',0
969
db 'TXT',0
970
.end:
971
db 0
972
 
973
 
974
 
975
head_f_i:
976
head_f_l db 'Системная ошибка',0
977
 
978
system_dir_0 db '/sys/lib/'
979
lib_name_0 db 'proc_lib.obj',0
980
err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
981
err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
982
 
983
system_dir_1 db '/sys/lib/'
984
lib_name_1 db 'libimg.obj',0
985
err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
986
err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
987
 
988
system_dir_2 db '/sys/lib/'
989
lib_name_2 db 'box_lib.obj',0
990
err_msg_found_lib_2 db 'Не найдена библиотека ',39,'box_lib.obj',39,0
991
err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'box_lib',39,0
992
 
993
system_dir_7 db '/sys/lib/'
994
lib_name_7 db 'buf2d.obj',0
995
err_msg_found_lib_7 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
996
err_msg_import_7 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
997
 
998
l_libs_start:
999
	lib0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
1000
		err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i
1001
	lib1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
1002
		err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i
1003
	lib_2 l_libs lib_name_2, sys_path, library_path, system_dir_2,\
1004
		err_msg_found_lib_2,head_f_l,import_box_lib,err_msg_import_2,head_f_i
1005
	lib_7 l_libs lib_name_7, sys_path, library_path, system_dir_7,\
1006
		err_msg_found_lib_7,head_f_l,import_buf2d,err_msg_import_7,head_f_i
1007
l_libs_end:
1008
 
1009
align 4
1010
import_libimg:
1011
	dd alib_init1
1012
	img_is_img  dd aimg_is_img
1013
	img_info    dd aimg_info
1014
	img_from_file dd aimg_from_file
1015
	img_to_file dd aimg_to_file
1016
	img_from_rgb dd aimg_from_rgb
1017
	img_to_rgb  dd aimg_to_rgb
1018
	img_to_rgb2 dd aimg_to_rgb2
1019
	img_decode  dd aimg_decode
1020
	img_encode  dd aimg_encode
1021
	img_create  dd aimg_create
1022
	img_destroy dd aimg_destroy
1023
	img_destroy_layer dd aimg_destroy_layer
1024
	img_count   dd aimg_count
1025
	img_lock_bits dd aimg_lock_bits
1026
	img_unlock_bits dd aimg_unlock_bits
1027
	img_flip    dd aimg_flip
1028
	img_flip_layer dd aimg_flip_layer
1029
	img_rotate  dd aimg_rotate
1030
	img_rotate_layer dd aimg_rotate_layer
1031
	img_draw    dd aimg_draw
1032
 
1033
	dd 0,0
1034
	alib_init1   db 'lib_init',0
1035
	aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
1036
	aimg_info    db 'img_info',0
1037
	aimg_from_file db 'img_from_file',0
1038
	aimg_to_file db 'img_to_file',0
1039
	aimg_from_rgb db 'img_from_rgb',0
1040
	aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
1041
	aimg_to_rgb2 db 'img_to_rgb2',0
1042
	aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
1043
	aimg_encode  db 'img_encode',0
1044
	aimg_create  db 'img_create',0
1045
	aimg_destroy db 'img_destroy',0
1046
	aimg_destroy_layer db 'img_destroy_layer',0
1047
	aimg_count   db 'img_count',0
1048
	aimg_lock_bits db 'img_lock_bits',0
1049
	aimg_unlock_bits db 'img_unlock_bits',0
1050
	aimg_flip    db 'img_flip',0
1051
	aimg_flip_layer db 'img_flip_layer',0
1052
	aimg_rotate  db 'img_rotate',0
1053
	aimg_rotate_layer db 'img_rotate_layer',0
1054
	aimg_draw    db 'img_draw',0
1055
 
1056
align 4
1057
proclib_import: ;описание экспортируемых функций
1058
	OpenDialog_Init dd aOpenDialog_Init
1059
	OpenDialog_Start dd aOpenDialog_Start
1060
dd 0,0
1061
	aOpenDialog_Init db 'OpenDialog_init',0
1062
	aOpenDialog_Start db 'OpenDialog_start',0
1063
 
1064
align 4
1065
import_buf2d:
1066
	dd sz_init0
1067
	buf2d_create dd sz_buf2d_create
1068
	buf2d_create_f_img dd sz_buf2d_create_f_img
1069
	buf2d_clear dd sz_buf2d_clear
1070
	buf2d_draw dd sz_buf2d_draw
1071
	buf2d_delete dd sz_buf2d_delete
2136 IgorA 1072
	buf2d_resize dd sz_buf2d_resize
2051 IgorA 1073
	buf2d_line dd sz_buf2d_line
1074
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
1075
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
1076
	buf2d_circle dd sz_buf2d_circle
1077
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1078
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1079
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1080
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1081
	buf2d_bit_blt dd sz_buf2d_bit_blt
1082
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1083
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1084
	buf2d_curve_bezier dd sz_buf2d_curve_bezier
1085
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1086
	buf2d_draw_text dd sz_buf2d_draw_text
1087
	buf2d_crop_color dd sz_buf2d_crop_color
1088
	buf2d_offset_h dd sz_buf2d_offset_h
1089
	buf2d_flood_fill dd sz_buf2d_flood_fill
1090
	buf2d_set_pixel dd sz_buf2d_set_pixel
1091
	dd 0,0
1092
	sz_init0 db 'lib_init',0
1093
	sz_buf2d_create db 'buf2d_create',0
1094
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1095
	sz_buf2d_clear db 'buf2d_clear',0
1096
	sz_buf2d_draw db 'buf2d_draw',0
1097
	sz_buf2d_delete db 'buf2d_delete',0
2136 IgorA 1098
	sz_buf2d_resize db 'buf2d_resize',0
2051 IgorA 1099
	sz_buf2d_line db 'buf2d_line',0
1100
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
1101
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
1102
	sz_buf2d_circle db 'buf2d_circle',0
1103
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1104
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1105
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1106
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1107
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1108
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1109
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1110
	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
1111
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1112
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1113
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1114
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1115
	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
1116
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
1117
 
1118
align 4
1119
import_box_lib:
1120
	dd sz_init1
1121
	init_checkbox dd sz_init_checkbox
1122
	check_box_draw dd sz_check_box_draw
1123
	edit_box_draw dd sz_edit_box_draw
1124
	edit_box_key dd sz_edit_box_key
1125
	edit_box_mouse dd sz_edit_box_mouse
1126
	edit_box_set_text dd sz_edit_box_set_text
1127
	scrollbar_ver_draw dd sz_scrollbar_ver_draw
1128
	scrollbar_hor_draw dd sz_scrollbar_hor_draw
1129
 
1130
	tl_data_init dd sz_tl_data_init
1131
	tl_data_clear dd sz_tl_data_clear
1132
	tl_info_clear dd sz_tl_info_clear
1133
	tl_key dd sz_tl_key
1134
	tl_mouse dd sz_tl_mouse
1135
	tl_draw dd sz_tl_draw
1136
	tl_info_undo dd sz_tl_info_undo
1137
	tl_info_redo dd sz_tl_info_redo
1138
	tl_node_add dd sz_tl_node_add
1139
	tl_node_set_data dd sz_tl_node_set_data
1140
	tl_node_get_data dd sz_tl_node_get_data
1141
	tl_node_delete dd sz_tl_node_delete
1142
	tl_node_move_up dd sz_tl_node_move_up
1143
	tl_node_move_down dd sz_tl_node_move_down
1144
	tl_cur_beg dd sz_tl_cur_beg
1145
	tl_cur_next dd sz_tl_cur_next
1146
	tl_cur_perv dd sz_tl_cur_perv
1147
	tl_node_close_open dd sz_tl_node_close_open
1148
	tl_node_lev_inc dd sz_tl_node_lev_inc
1149
	tl_node_lev_dec dd sz_tl_node_lev_dec
1150
	tl_node_poi_get_info dd sz_tl_node_poi_get_info
1151
	tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info
1152
	tl_node_poi_get_data dd sz_tl_node_poi_get_data
1153
 
1154
	dd 0,0
1155
	sz_init1 db 'lib_init',0
1156
	sz_init_checkbox db 'init_checkbox2',0
1157
	sz_check_box_draw db 'check_box_draw2',0
1158
	sz_edit_box_draw db 'edit_box',0
1159
	sz_edit_box_key db 'edit_box_key',0
1160
	sz_edit_box_mouse db 'edit_box_mouse',0
1161
	sz_edit_box_set_text db 'edit_box_set_text',0
1162
	sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
1163
	sz_scrollbar_hor_draw db 'scrollbar_h_draw',0
1164
 
1165
	sz_tl_data_init db 'tl_data_init',0
1166
	sz_tl_data_clear db 'tl_data_clear',0
1167
	sz_tl_info_clear db 'tl_info_clear',0
1168
	sz_tl_key db 'tl_key',0
1169
	sz_tl_mouse db 'tl_mouse',0
1170
	sz_tl_draw db 'tl_draw',0
1171
	sz_tl_info_undo db 'tl_info_undo',0
1172
	sz_tl_info_redo db 'tl_info_redo',0
1173
	sz_tl_node_add db 'tl_node_add',0
1174
	sz_tl_node_set_data db 'tl_node_set_data',0
1175
	sz_tl_node_get_data db 'tl_node_get_data',0
1176
	sz_tl_node_delete db 'tl_node_delete',0
1177
	sz_tl_node_move_up db 'tl_node_move_up',0
1178
	sz_tl_node_move_down db 'tl_node_move_down',0
1179
	sz_tl_cur_beg db 'tl_cur_beg',0
1180
	sz_tl_cur_next db 'tl_cur_next',0
1181
	sz_tl_cur_perv db 'tl_cur_perv',0
1182
	sz_tl_node_close_open db 'tl_node_close_open',0
1183
	sz_tl_node_lev_inc db 'tl_node_lev_inc',0
1184
	sz_tl_node_lev_dec db 'tl_node_lev_dec',0
1185
	sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
1186
	sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
1187
	sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0
1188
 
1189
 
1190
 
1191
mouse_dd dd 0x0
1192
sc system_colors
1193
last_time dd 0
1194
 
1195
align 16
1196
procinfo process_information
1197
 
1198
align 4
1199
buf_0: dd 0 ;указатель на буфер изображения
2136 IgorA 1200
.l: dw 205 ;+4 left
2173 IgorA 1201
.t: dw 35 ;+6 top
2051 IgorA 1202
.w: dd 340 ;+8 w
1203
.h: dd 250 ;+12 h
1204
.color: dd 0xffffd0 ;+16 color
1205
	db 24 ;+20 bit in pixel
1206
 
1207
align 4
1208
buf_1:
1209
	dd 0 ;указатель на буфер изображения
1210
	dw 25 ;+4 left
1211
	dw 25 ;+6 top
1212
	dd 128 ;+8 w
1213
	dd 144 ;+12 h
1214
	dd 0 ;+16 color
1215
	db 24 ;+20 bit in pixel
1216
 
1217
el_focus dd tree1
2080 IgorA 1218
tree1 tree_list size_one_list,200+2, tl_key_no_edit+tl_draw_par_line,\
1219
	16,16, 0xffffff,0xb0d0ff,0xd000ff, 5,35,195-16,250, 16,list_offs_text,0, el_focus,\
2051 IgorA 1220
	w_scr_t1,0
1221
 
1222
align 4
1223
w_scr_t1:
1224
.size_x     dw 16 ;+0
2136 IgorA 1225
.start_x    dw 0
1226
rb 2+2
2051 IgorA 1227
.btn_high   dd 15 ;+8
1228
.type	    dd 1  ;+12
1229
.max_area   dd 100  ;+16
1230
rb 4+4
1231
.bckg_col   dd 0xeeeeee ;+28
1232
.frnt_col   dd 0xbbddff ;+32
1233
.line_col   dd 0  ;+36
1234
rb 4+2+2
1235
.run_x:
1236
rb 2+2+2+2+4+4+4+4+4+4
1237
.all_redraw dd 0 ;+80
1238
.ar_offset  dd 1 ;+84
1239
 
1240
 
1241
 
1242
;этот код не мой, он преобразует число в строку
1243
;input:
1244
; eax = value
1245
; edi = string buffer
1246
;output:
1247
align 4
1248
tl_convert_to_str:
1249
	pushad
1250
		mov dword[edi+1],0;0x20202020
1251
		call .str
1252
	popad
1253
	ret
1254
 
1255
align 4
1256
.str:
1257
	mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1258
    ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1259
	cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1260
	jb @f
1261
		xor edx,edx  ;очистить edx
1262
		div ecx      ;разделить - остаток в edx
1263
		push edx     ;положить в стек
1264
		;dec edi             ;смещение необходимое для записи с конца строки
1265
		call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1266
		pop eax
1267
	@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1268
	or al,0x30  ;данная команда короче  чем две выше
1269
	stosb	    ;записать элемент из регистра al в ячеку памяти es:edi
1270
	ret	      ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1271
 
1272
i_end:
1273
	rb 1024
2165 IgorA 1274
thread_coords:
1275
	rb 1024
2051 IgorA 1276
stacktop:
1277
	sys_path rb 1024
1278
	file_name:
1279
		rb 1024 ;4096
1280
	library_path rb 1024
1281
	plugin_path rb 4096
1282
	openfile_path rb 4096
1283
	filename_area rb 256
1284
mem: