Subversion Repositories Kolibri OS

Rev

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