Subversion Repositories Kolibri OS

Rev

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