Subversion Repositories Kolibri OS

Rev

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