Subversion Repositories Kolibri OS

Rev

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