Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2462 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
color_border equ 0xff0000
13
color_s0 equ 0xff ;сигнал 0
14
color_s1 equ 0xffffff ;сигнал 1
15
color_s2 equ 0xff00 ;точка без пересечения
16
color_s3 equ 0xff0000 ;временное значение для сохранения
17
color_caption equ 0x808080
18
 
2501 IgorA 19
debug equ 0
20
 
2462 IgorA 21
;номара иконок:
22
el_icon_group equ 0 ;групповая
23
el_icon_points equ 1 ;точки
24
el_icon_sub_points equ 2 ;изоляции
25
el_icon_elems equ 3 ;элемента
26
el_icon_captions equ 4 ;подписи
27
 
28
size_el_opt equ 34 ;размер структуры с опциями элемента
29
el_offs_nam equ 0 ;смещение для начала имени элемента
30
el_offs_col equ 16 ;цвет элемента
31
el_offs_box_x equ 20 ;ширина коробки элемента
32
el_offs_box_y equ 21 ;высота коробки элемента
33
el_offs_table equ 22 ;указатель на таблицу работы элемента
2487 IgorA 34
el_offs_legs_inp equ 26 ;указатель на таблицу описания входных ног
2462 IgorA 35
el_offs_legs_out equ 30 ;смещение на описание выходных ног
36
 
2487 IgorA 37
sp_offs_el_angle equ 8 ;смещение для угла поворота элемента в списке
2462 IgorA 38
sp_offs_el_type equ 9 ;смещение для типа элемента в списке
39
 
40
points_max equ 1000
41
capt_offs equ 10 ;смещение для начала подписи в листе tree1
42
 
43
include '../../../macros.inc'
44
include '../../../proc32.inc'
45
include '../../../develop/libraries/box_lib/load_lib.mac'
46
include '../../../develop/libraries/box_lib/trunk/box_lib.mac'
47
include 'mem.inc'
48
include 'dll.inc'
49
include 'le_pole.inc'
50
include 'le_signal.inc'
51
 
52
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
2507 IgorA 53
caption db 'Логические элементы 26.03.12',0 ;подпись окна
2462 IgorA 54
 
55
panel_0_coord_top equ 5 ;верхняя координата 0-го ряда панели инструментов
56
panel_1_coord_top equ 35
57
panel_2_coord_top equ 60
58
panel_3_coord_top equ 85
59
 
60
align 4
61
proc move_rotate_x_n90 uses ecx edi, d_x:dword, angle:dword
62
	mov edi,[angle] ;угол поворота / 90 (от 0-3)
63
	and edi,3
64
	shl edi,4 ;edi*=16
65
	add edi,mcs
66
 
67
	mov ecx,[d_x]
68
	imul ecx,dword[edi]
69
	add eax,ecx
70
 
71
	mov ecx,[d_x]
72
	imul ecx,dword[edi+8]
73
	add ebx,ecx
74
 
75
	ret
76
endp
77
 
78
struct FileInfoBlock
79
	Function dd ?
80
	Position dd ?
81
	Flags	 dd ?
82
	Count	 dd ?
83
	Buffer	 dd ?
84
		db ?
85
	FileName dd ?
86
ends
87
 
2487 IgorA 88
macro elOpt nam,col,box_x,box_y,table, tbl_i_legs, ol0, ol1, ol2
2462 IgorA 89
{
90
	@@: db nam
91
	rb @b+16-$
92
	dd col
93
	db box_x
94
	db box_y
95
	dd table+0 ;+el_offs_table
2487 IgorA 96
	dd tbl_i_legs+0 ;+26 входные ноги
97
;+30 выходные ноги
98
	db ol0+0, ol1+0, ol2+0, 0
2462 IgorA 99
}
100
 
101
align 4
102
el_opt_beg:
2487 IgorA 103
elOpt 'or[2]', 0xff00ff,5,5,tbl_or, tbl_il_2, 2
104
elOpt 'or[3]', 0xff00ff,5,7,tbl_or, tbl_il_3, 3
105
elOpt 'or[4]', 0xff00ff,5,9,tbl_or, tbl_il_4, 4
106
elOpt 'and[2]',0xffff00,5,5,tbl_and.2, tbl_il_2, 2
107
elOpt 'and[3]',0xffff00,5,7,tbl_and.3, tbl_il_3, 3
108
elOpt 'and[4]',0xffff00,5,9,tbl_and.4, tbl_il_4, 4
2501 IgorA 109
elOpt 'and[5]',0xffff00,5,11,tbl_and.5, tbl_il_5, 5
2487 IgorA 110
elOpt 'not',   0xffff,  3,3,tbl_not, tbl_il_1, 1
111
elOpt 'xor',   0x8000ff,5,5,tbl_xor, tbl_il_2, 2
112
elOpt 'sm[1]', 0x8080ff,7,7,tbl_sm,  tbl_il_3, 1,4
113
;elOpt 'cd[8]', 0x8000, 7,17,tbl_cd_8,tbl_il_8, 6,2,2 ;шифратор на 8 входов
2462 IgorA 114
.end:
2487 IgorA 115
elOpt '???', 0x808080,3,3,tbl_and.3, tbl_il_1, 1 ;не опознанный элемент
2462 IgorA 116
 
117
;таблицы по которым задаются правила работы элементов
118
align 4
119
tbl_or db 0,1,1,1, 1,1,1,1 ;or2, or3
2487 IgorA 120
	db 1,1,1,1,1,1,1,1 ;or4
2462 IgorA 121
tbl_and:
2501 IgorA 122
.5: dq 0,0
2487 IgorA 123
.4: dq 0
124
.3: dd 0
2462 IgorA 125
.2: db 0,0,0,1
126
tbl_xor db 0,1,1,0
127
tbl_sm db 0,2,2,1, 2,1,1,3
128
tbl_not db 1,0 ;not
2487 IgorA 129
;tbl_cd_8 db ;256=2^8
2462 IgorA 130
 
2487 IgorA 131
;таблицы для входных ног
132
tbl_il_1 db 1,0   ;корпус на 1 ногу
133
tbl_il_2 db 1,2,0 ;корпус на 2 ноги
134
tbl_il_3 db 1,2,2,0
135
tbl_il_4 db 1,2,2,2,0
2501 IgorA 136
tbl_il_5 db 1,2,2,2,2,0
2487 IgorA 137
;tbl_il_8 db 1,2,2,2,2,2,2,2,0
138
 
2462 IgorA 139
time dd 0
140
tim_ch db 0
141
pen_mode dd 0 ;режим рисования провода
2482 IgorA 142
pen_coord_x dd 0 ;координата x начальной точки рисования
143
pen_coord_y dd 0
2462 IgorA 144
 
145
txt_set_0 db '0',0
146
txt_set_1 db '1',0
2482 IgorA 147
;txt_mov_l db 27,0 ;<-
148
;txt_mov_r db 26,0 ;->
2462 IgorA 149
 
150
txt_size db 'size',0
151
txt_elements db 'elements',0
152
txt_points db 'points',0
153
txt_sub_points db 'subpoints',0
154
txt_captions db 'captions',0
155
 
156
;матрица косинусов и синусов, используемая для поворотов сигналов и элементов
157
align 4
158
mcs dd 1, 0, 0, 1,\
159
	   0, 1,-1, 0,\
160
	  -1, 0, 0,-1,\
161
	   0,-1, 1, 0
162
 
163
run_file_70 FileInfoBlock
164
image_data dd 0 ;указатель на временную память. для нужен преобразования изображения
165
 
166
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
2507 IgorA 167
IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*24
2462 IgorA 168
image_data_toolbar dd 0
169
 
170
TREE_ICON_SYS16_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*11+54 ;размер bmp файла с системными иконками
171
icon_tl_sys dd 0 ;указатель на память для хранения системных иконок
172
TOOLBAR_ICON_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*5+54 ;размер bmp файла с иконками объектов
173
icon_toolbar dd 0 ;указатель на память для хранения иконок объектов
174
 
175
IMAGE_FONT_SIZE equ 128*144*3
176
image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты
177
 
2482 IgorA 178
cursors_count equ 4
179
IMAGE_CURSORS_SIZE equ 4096*cursors_count ;размер картинки с курсорами
180
 
2462 IgorA 181
macro load_image_file path,buf,size { ;макрос для загрузки изображений
182
	;path - может быть переменной или строковым параметром
183
	if path eqtype '' ;проверяем задан ли строкой параметр path
184
		jmp @f
185
			local .path_str
186
			.path_str db path ;формируем локальную переменную
187
			db 0
188
		@@:
189
		;32 - стандартный адрес по которому должен быть буфер с системным путем
190
		copy_path .path_str,[32],file_name,0x0
191
	else
192
		copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
193
	end if
194
 
195
	stdcall mem.Alloc, dword size ;выделяем память для изображения
196
	mov [buf],eax
197
 
198
	mov eax,70 ;70-я функция работа с файлами
199
	mov [run_file_70.Function], 0
200
	mov [run_file_70.Position], 0
201
	mov [run_file_70.Flags], 0
202
	mov [run_file_70.Count], dword size
203
	m2m [run_file_70.Buffer], [buf]
204
	mov byte[run_file_70+20], 0
205
	mov [run_file_70.FileName], file_name
206
	mov ebx,run_file_70
207
	int 0x40 ;загружаем файл изображения
208
	cmp ebx,0xffffffff
209
	je @f
210
		;определяем вид изображения и переводим его во временный буфер image_data
211
		stdcall dword[img_decode], dword[buf],ebx,0
212
		mov dword[image_data],eax
213
		;преобразуем изображение к формату rgb
214
		stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
215
		;удаляем временный буфер image_data
216
		stdcall dword[img_destroy], dword[image_data]
217
	@@:
218
}
219
 
220
 
221
 
222
align 4
223
start:
224
	load_libraries l_libs_start,l_libs_end
225
	;проверка на сколько удачно загузилась библиотека
226
	mov	ebp,lib_7
227
	cmp	dword [ebp+ll_struc_size-4],0
228
	jz	@f
229
		mcall -1 ;exit not correct
230
	@@:
231
	mcall 48,3,sc,sizeof.system_colors
232
	mcall 40,0x27
233
	stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
234
	stdcall [buf2d_create], buf_0 ;создание буфера
235
	load_image_file 'toolbar.png', image_data_toolbar,IMAGE_TOOLBAR_SIZE
236
 
237
	stdcall pole_init, pole
238
	stdcall dword[tl_data_init], tree1
2487 IgorA 239
	stdcall dword[tl_data_init], tree2
2462 IgorA 240
 
241
	;системные иконки 16*16 для tree_list
242
	load_image_file 'tl_sys_16.png', icon_tl_sys,TREE_ICON_SYS16_BMP_SIZE
243
	;если изображение не открылось, то в icon_tl_sys будут
244
	;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера
245
	mov eax,dword[icon_tl_sys]
246
	mov dword[tree1.data_img_sys],eax
2487 IgorA 247
	mov dword[tree2.data_img_sys],eax
2462 IgorA 248
 
249
	load_image_file 'objects.png', icon_toolbar,TOOLBAR_ICON_BMP_SIZE
250
	mov eax,dword[icon_toolbar]
251
	mov dword[tree1.data_img],eax
2487 IgorA 252
	mov dword[tree2.data_img],eax
2462 IgorA 253
 
2482 IgorA 254
	;*** загрузка шрифта
2462 IgorA 255
	load_image_file 'font6x9.bmp', image_data_gray,IMAGE_FONT_SIZE
256
	stdcall [buf2d_create_f_img], buf_font,[image_data_gray] ;создаем буфер
257
	stdcall mem.Free,[image_data_gray] ;освобождаем память
258
 
259
	stdcall [buf2d_conv_24_to_8], buf_font,1 ;делаем буфер прозрачности 8 бит
260
	stdcall [buf2d_convert_text_matrix], buf_font
261
 
2482 IgorA 262
	;*** загрузка курсоров
263
	load_image_file 'cursors_gr.png',image_data_gray,IMAGE_CURSORS_SIZE
264
	stdcall [buf2d_create_f_img], buf_curs_8,[image_data_gray] ;создаем буфер
265
	stdcall mem.Free,[image_data_gray] ;освобождаем память
266
 
267
	load_image_file 'cursors.png',image_data_gray, IMAGE_CURSORS_SIZE
268
	stdcall [buf2d_create_f_img], buf_curs,[image_data_gray] ;создаем буфер
269
	stdcall mem.Free,[image_data_gray] ;освобождаем память
270
 
271
	stdcall [buf2d_conv_24_to_8], buf_curs_8,1 ;делаем буфер прозрачности 8бит
272
	stdcall [buf2d_conv_24_to_32],buf_curs,buf_curs_8 ;делаем буфер rgba 32бит
273
 
2462 IgorA 274
	stdcall sign_init, 3000
2487 IgorA 275
	mov eax,el_opt_beg+el_offs_nam
276
	mov ecx,(el_opt_beg.end-el_opt_beg)/size_el_opt ;колличество типов элементов
277
	cld
278
	@@:
279
		stdcall [tl_node_add], eax, el_icon_elems shl 16, tree2
280
		stdcall [tl_cur_next], tree2
281
		add eax,size_el_opt
282
		loop @b
283
	stdcall [tl_cur_beg], tree2
2462 IgorA 284
 
285
	mcall 26,9
286
	mov [last_time],eax
287
 
288
align 4
289
red_win:
290
	call draw_window
291
 
292
align 4
293
still:
294
	mcall 26,9
295
	mov ebx,[last_time]
296
	add ebx,10 ;задержка
297
	cmp ebx,eax
298
	jge @f
299
		mov ebx,eax
300
	@@:
301
	sub ebx,eax
302
	;cmp ebx,10 ;задержка
303
	;ja timer_funct
304
	;test ebx,ebx
305
	;jz timer_funct
306
	mcall 23
307
	cmp eax,0
308
	je timer_funct
309
 
310
	cmp al,1
311
	jz red_win
312
	cmp al,EV_KEY
313
	jz key
314
	cmp al,3
315
	jz button
316
	cmp al,EV_MOUSE
317
	jne @f
318
		call mouse
319
	@@:
320
	jmp still
321
 
322
align 4
323
timer_funct:
324
	pushad
325
	mcall 26,9
326
	mov [last_time],eax
327
 
328
	cmp byte[tim_ch],0
329
	je @f
330
		inc dword[time]
331
		call sign_move
332
		mov eax,[time]
333
		and eax,11b ;кратность 4-м
334
		jnz @f
335
			call sign_from_elems
336
			call sign_from_captions
337
	@@:
338
 
339
	popad
340
	jmp still
341
 
342
align 4
343
mouse:
344
	stdcall [tl_mouse], tree1
2487 IgorA 345
	stdcall [tl_mouse], tree2
2462 IgorA 346
 
2501 IgorA 347
	pushad
2462 IgorA 348
	mcall 37,2 ;нажатые кнопки мыши
349
	bt eax,0 ;левая кнопка нажата?
2482 IgorA 350
	jc @f
2501 IgorA 351
	bt eax,1 ;правая кнопка нажата?
352
	jc @f
2482 IgorA 353
		xor eax,eax
354
		mov [pen_coord_x],eax
355
		mov [pen_coord_y],eax
356
		jmp .end_buf_wnd
357
	@@:
2501 IgorA 358
	mov esi,eax
2462 IgorA 359
 
360
	mcall 37,1 ;eax = (x shl 16) + y
361
	cmp ax,word[buf_0.t]
362
	jl .end_buf_wnd ;не попали в окно буфера по оси y
363
 
364
	mov ebx,eax
365
	shr ebx,16
366
	cmp bx,word[buf_0.l]
367
	jl .end_buf_wnd ;не попали в окно буфера по оси x
368
 
369
		and eax,0xffff ;оставляем координату y
370
		sub ax,word[buf_0.t]
371
		sub bx,word[buf_0.l]
372
		;*** деление на zoom
373
		movzx ecx,byte[zoom]
374
		xor edx,edx
375
		div ecx
376
		xchg eax,ebx ;ebx делим на ecx
377
		xor edx,edx
378
		div ecx
379
 
380
		sub eax,[Cor_x]
381
		sub ebx,[Cor_y]
382
 
383
		;*** проверка на попадение в схему
384
		bt eax,31
385
		jc .end_buf_wnd
386
		bt ebx,31
387
		jc .end_buf_wnd
388
		cmp eax,[shem_w]
389
		jge .end_buf_wnd
390
		cmp ebx,[shem_h]
391
		jge .end_buf_wnd
392
 
2487 IgorA 393
		cmp byte[pen_mode],0
394
		jne .end_mode_0
2501 IgorA 395
			bt esi,1
396
			jc .end_mode_0
2487 IgorA 397
			;режим курсора (выбор элемента при нажатии)
398
			stdcall element_is_click,eax,ebx
399
			test eax,eax
400
			jz .end_buf_wnd ;при нажатии не попали ни на один из элементов
401
				stdcall [tl_node_get_data], tree1
402
				pop ebx
403
				cmp eax,ebx
404
				je .end_buf_wnd ;если уже курсор стоит там где нужно
405
 
406
				stdcall [tl_cur_beg], tree1
407
				.cycle0:
408
				stdcall [tl_node_get_data], tree1
409
				pop ebx
410
				test ebx,ebx
411
				jz .end_buf_wnd
412
				cmp eax,ebx
413
				je @f
414
					stdcall [tl_cur_next], tree1
415
					jmp .cycle0
416
				@@:
417
				stdcall [tl_draw], tree1
418
			jmp .end_buf_wnd
419
		.end_mode_0:
2462 IgorA 420
		cmp byte[pen_mode],1
2482 IgorA 421
		jne .end_mode_1
2462 IgorA 422
			;режим рисования провода
2482 IgorA 423
			cmp dword[pen_coord_x],0
424
			jne @f
425
			cmp dword[pen_coord_y],0
426
			jne @f
427
				mov [pen_coord_x],eax
428
				mov [pen_coord_y],ebx
429
			@@:
430
 
431
			cmp dword[pen_coord_x],eax
432
			je .beg_draw
433
			cmp dword[pen_coord_y],ebx
434
			je .beg_draw
435
 
436
			mov ecx,eax
437
			sub ecx,[pen_coord_x]
438
			bt ecx,31
439
			jnc @f
440
				neg ecx
441
				inc ecx
442
			@@:
443
			mov edx,ebx
444
			sub edx,[pen_coord_y]
445
			bt edx,31
446
			jnc @f
447
				neg edx
448
				inc edx
449
			@@:
450
			cmp ecx,edx
451
			jl @f
452
				mov ebx,[pen_coord_y] ;привязка к координате y
453
				jmp .beg_draw
454
			@@:
455
			mov eax,[pen_coord_x] ;привязка к координате x
456
 
457
			.beg_draw:
2501 IgorA 458
			bt esi,1
459
			jc @f
460
				stdcall pole_cell_creat, pole,eax,ebx,0
461
				;ничего не убралось redraw_pole не подходит, т. к. чистить поле не нужно
462
				stdcall pole_paint, pole
463
				stdcall [buf2d_draw], buf_0
464
				jmp .end_buf_wnd
465
			@@:
466
				stdcall pole_cell_delete, pole,eax,ebx
467
				call redraw_pole
468
				jmp .end_buf_wnd
2482 IgorA 469
		.end_mode_1:
2462 IgorA 470
		cmp byte[pen_mode],2
471
		jne @f
472
			;режим рисования изоляции для провода
2501 IgorA 473
			bt esi,1
474
			jc .mode_2_del
475
				stdcall pole_cell_creat, pole,eax,ebx,2
476
				jmp .mode_2_draw
477
			.mode_2_del:
478
				;стирание изоляции
479
				mov ecx,eax
480
				stdcall pole_cell_find, pole,ecx,ebx
481
				test eax,eax
482
				jz .end_buf_wnd
483
				stdcall pole_cell_creat, pole,ecx,ebx,0
484
			.mode_2_draw:
2462 IgorA 485
			stdcall pole_paint, pole
486
			stdcall [buf2d_draw], buf_0
487
			jmp .end_buf_wnd
488
		@@:
489
		cmp byte[pen_mode],3
490
		jne @f
2501 IgorA 491
			bt esi,1
492
			jc @f
2462 IgorA 493
			;режим стирания провода
494
			stdcall pole_cell_delete, pole,eax,ebx
495
			call redraw_pole
496
			jmp .end_buf_wnd
497
		@@:
2482 IgorA 498
		cmp byte[pen_mode],4
499
		jne @f
2501 IgorA 500
			bt esi,1
2507 IgorA 501
			jc .rotate
2482 IgorA 502
			;режим создания элементов
503
			stdcall shem_element_creat, eax,ebx
504
			stdcall pole_paint, pole
505
			stdcall [buf2d_draw], buf_0
506
			jmp .end_buf_wnd
2507 IgorA 507
			.rotate:
508
			;поворот элементов на 90 градусов
509
			stdcall element_is_click,eax,ebx
510
			test eax,eax
511
			jz .end_buf_wnd
512
				inc byte[eax+sp_offs_el_angle]
513
				and byte[eax+sp_offs_el_angle],3 ;для контроля на переполнение
514
				call redraw_pole
515
			jmp .end_buf_wnd
2482 IgorA 516
		@@:
2462 IgorA 517
 
518
	.end_buf_wnd:
2501 IgorA 519
if debug
520
stdcall but_test_pole, pole
521
end if
522
	popad
2462 IgorA 523
	ret
524
 
2487 IgorA 525
;output:
526
; eax - pointer to element data
2462 IgorA 527
align 4
2487 IgorA 528
proc element_is_click uses ebx ecx edx esi edi, coord_x:dword, coord_y:dword
529
	stdcall dword[tl_node_poi_get_info],0,tree1
530
	pop esi
531
	@@:
532
		cmp esi,0
533
		je @f
534
		cmp word[esi],el_icon_elems ;получение через esi тип иконки
535
		jne .end_add_p1
536
			stdcall [tl_node_poi_get_data], esi, tree1
537
			pop ecx
538
 
539
			movzx edx,byte[ecx+sp_offs_el_type]
540
			imul edx,size_el_opt
541
			add edx,el_opt_beg ;находим опцию со свойствами данного элемента
542
 
543
			mov eax,[ecx] ;element coord x
544
			mov ebx,[ecx+4] ;element coord y
545
			movzx edi,byte[ecx+sp_offs_el_angle]
546
			push edi
547
			movzx edi,byte[edx+el_offs_box_y]
548
			dec edi
549
			push edi
550
			movzx edi,byte[edx+el_offs_box_x]
551
			dec edi
552
			push edi
553
			stdcall move_rotate_n90 ;,[edx+el_offs_box_x],[edx+el_offs_box_y],[ecx+sp_offs_el_angle]
554
			;Rect(eax,ebx,[ecx],[ecx+4])
555
			stdcall point_in_rect, [coord_x],[coord_y], eax,ebx,[ecx],[ecx+4]
556
			test eax,eax
557
			jz .end_add_p1
558
				mov eax,ecx
559
				jmp .end_f
560
		.end_add_p1:
561
		stdcall dword[tl_node_poi_get_next_info],esi,tree1
562
		pop esi ;переходим к следущему узлу
563
		jmp @b
564
	@@:
565
		xor eax,eax ;если не нашли
566
	.end_f:
567
	ret
568
endp
569
 
570
;проверка попадения точки в прямоугольник
571
;результат:
572
; если не попадает то eax=0
573
; если попадает то eax=1
574
align 4
575
proc point_in_rect uses ebx ecx, px:dword, py:dword, rx0:dword, ry0:dword, rx1:dword, ry1:dword
576
	xor eax,eax
577
 
578
	;проверка по оси x
579
	mov ebx,[rx0]
580
	mov ecx,[rx1]
581
	cmp ebx,ecx
582
	jle @f
583
		xchg ebx,ecx
584
	@@:
585
	cmp ebx,[px]
586
	jg .no_contains
587
	cmp ecx,[px]
588
	jl .no_contains
589
 
590
	;проверка по оси y
591
	mov ebx,[ry0]
592
	mov ecx,[ry1]
593
	cmp ebx,ecx
594
	jle @f
595
		xchg ebx,ecx
596
	@@:
597
	cmp ebx,[py]
598
	jg .no_contains
599
	cmp ecx,[py]
600
	jl .no_contains
601
 
602
	;если попали то eax=1
603
		inc eax
604
		;stdcall draw_scaled_rect, [rx0],[ry0],[rx1],[ry1], 0xffffff
605
		;stdcall [buf2d_draw], buf_0
606
	.no_contains:
607
	ret
608
endp
609
 
610
align 4
2462 IgorA 611
draw_window:
612
pushad
613
	mcall 12,1
614
 
615
	; *** рисование главного окна (выполняется 1 раз при запуске) ***
616
	xor eax,eax
2507 IgorA 617
	mov ebx,(20 shl 16)+580
2462 IgorA 618
	mov ecx,(20 shl 16)+415
619
	mov edx,[sc.work]
620
	or  edx,(3 shl 24)+0x10000000+0x20000000
621
	mov edi,caption
622
	int 0x40
623
 
624
	; *** создание кнопок на панель ***
625
	mov eax,8
626
	mov ebx,(5 shl 16)+20
627
	mov ecx,(panel_0_coord_top shl 16)+20
628
	mov edx,3
629
	mov esi,[sc.work_button]
630
	int 0x40
631
 
2501 IgorA 632
	add ebx,25 shl 16
2462 IgorA 633
	mov edx,4
634
	int 0x40
635
 
2501 IgorA 636
	add ebx,25 shl 16
2462 IgorA 637
	mov edx,5
638
	int 0x40
639
 
2501 IgorA 640
	add ebx,30 shl 16
641
	mov edx,6 ;пуск | остановка
2462 IgorA 642
	int 0x40
643
 
2501 IgorA 644
	add ebx,25 shl 16
2462 IgorA 645
	mov edx,7
646
	int 0x40
647
 
2501 IgorA 648
	add ebx,25 shl 16
2462 IgorA 649
	mov edx,8
650
	int 0x40
651
 
2501 IgorA 652
	add ebx,25 shl 16
2462 IgorA 653
	mov edx,9
654
	int 0x40
655
 
2501 IgorA 656
	add ebx,25 shl 16
2462 IgorA 657
	mov edx,10
658
	int 0x40
659
 
2501 IgorA 660
	add ebx,25 shl 16
2462 IgorA 661
	mov edx,11
662
	int 0x40
663
 
2501 IgorA 664
	add ebx,25 shl 16
2462 IgorA 665
	mov edx,12
666
	int 0x40
667
 
2501 IgorA 668
	add ebx,30 shl 16
669
	mov edx,13 ;центровка схемы
2462 IgorA 670
	int 0x40
671
 
2501 IgorA 672
	add ebx,25 shl 16
673
	mov edx,14
674
	int 0x40
675
 
676
	add ebx,25 shl 16
677
	mov edx,15
678
	int 0x40
679
 
680
	add ebx,25 shl 16
681
	mov edx,16 ;сдвиг схемы вверх
682
	int 0x40
683
 
684
	add ebx,25 shl 16
685
	mov edx,17 ;сдвиг схемы вниз
686
	int 0x40
687
 
2462 IgorA 688
	; *** рисование иконок на кнопках ***
689
	mov eax,7
690
	mov ebx,[image_data_toolbar]
691
	mov ecx,(16 shl 16)+16
692
	mov edx,(7 shl 16)+panel_0_coord_top+2 ;icon new
693
	int 0x40
694
 
695
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
696
	add edx,(25 shl 16) ;icon open
697
	int 0x40
698
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
699
	add edx,(25 shl 16) ;icon save
700
	int 0x40
701
 
702
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
703
	add edx,(30 shl 16) ;+
704
	int 0x40
705
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
706
	add edx,(25 shl 16) ;-
707
	int 0x40
708
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
709
	add edx,(25 shl 16) ;
710
	int 0x40
711
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
712
	add edx,(25 shl 16) ;m
713
	int 0x40
714
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
715
	add edx,(25 shl 16) ;m
716
	int 0x40
717
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
718
	add edx,(25 shl 16) ;m
719
	int 0x40
720
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
721
	add edx,(25 shl 16) ;m
722
	int 0x40
723
 
724
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
725
	add edx,(30 shl 16) ;center
726
	int 0x40
2507 IgorA 727
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
728
	add edx,(25 shl 16) ;m
729
	int 0x40
730
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
731
	add edx,(25 shl 16) ;m
732
	int 0x40
733
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
734
	add edx,(25 shl 16) ;m
735
	int 0x40
736
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
737
	add edx,(25 shl 16) ;m
738
	int 0x40
2462 IgorA 739
 
740
	; *** рисование буфера ***
741
	stdcall [buf2d_draw], buf_0
2487 IgorA 742
	mov dword[wScr1.all_redraw],1
2462 IgorA 743
	stdcall [tl_draw], tree1
2487 IgorA 744
	mov dword[wScr2.all_redraw],1
745
	stdcall [tl_draw], tree2
2462 IgorA 746
	stdcall pole_draw_pok, pole
747
 
748
	; *** создание кнопок установки сигналов set_0 и set_1 ***
749
	mov eax,8
750
	mov ebx,(5 shl 16)+20
751
	mov ecx,(panel_1_coord_top shl 16)+20
752
	mov edx,20
753
	mov esi,[sc.work_button]
754
	int 0x40
755
 
756
	add ebx,25 shl 16
757
	mov edx,21
758
	int 0x40
759
 
760
	add ebx,30 shl 16
761
	mov edx,22
762
	int 0x40
763
 
764
	add ebx,25 shl 16
765
	mov edx,23
766
	int 0x40
767
 
768
	add ebx,25 shl 16
769
	mov edx,24
770
	int 0x40
771
 
772
	add ebx,25 shl 16
773
	mov edx,25
774
	int 0x40
775
 
776
	mov eax,4 ;рисование текста
777
	mov ebx,(10 shl 16)+panel_1_coord_top+5
778
	mov ecx,[sc.work_text]
779
	or  ecx,0x80000000 ;or (1 shl 30)
780
	mov edx,txt_set_0
781
	;mov edi,[sc.work]
782
	int 0x40
783
 
784
	add ebx,25 shl 16
785
	mov edx,txt_set_1
786
	int 0x40
787
 
2482 IgorA 788
	; *** рисование иконок на кнопках ***
789
	mov eax,7
790
	mov ebx,[image_data_toolbar]
791
	mov ecx,(16 shl 16)+16
792
	mov edx,(62 shl 16)+panel_1_coord_top+2
793
 
2507 IgorA 794
	add ebx,IMAGE_TOOLBAR_ICON_SIZE*15
2462 IgorA 795
	int 0x40
796
 
2482 IgorA 797
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
798
	add edx,(25 shl 16)
2462 IgorA 799
	int 0x40
800
 
2482 IgorA 801
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
802
	add edx,(25 shl 16)
803
	int 0x40
804
 
805
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
806
	add edx,(25 shl 16)
807
	int 0x40
808
 
2462 IgorA 809
	; *** создание кнопок рисования провода ***
810
	mov eax,8
811
	mov ebx,(5 shl 16)+20
812
	mov ecx,(panel_2_coord_top shl 16)+20
813
	mov edx,30
814
	mov esi,[sc.work_button]
815
	int 0x40
816
 
817
	add ebx,25 shl 16
818
	mov edx,31
819
	int 0x40
820
 
821
	add ebx,25 shl 16
822
	mov edx,32
823
	int 0x40
824
 
825
	add ebx,25 shl 16
826
	mov edx,33
827
	int 0x40
828
 
2482 IgorA 829
	add ebx,25 shl 16
830
	mov edx,34
831
	int 0x40
832
 
2462 IgorA 833
	; *** рисование иконок на кнопках ***
834
	mov eax,7
835
	mov ebx,[image_data_toolbar]
836
	mov ecx,(16 shl 16)+16
837
	mov edx,(7 shl 16)+panel_2_coord_top+2 ;иконка стрела
838
 
2507 IgorA 839
	add ebx,IMAGE_TOOLBAR_ICON_SIZE*19
2462 IgorA 840
	int 0x40
841
 
842
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
843
	add edx,(25 shl 16) ;icon pen 1
844
	int 0x40
845
 
846
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
847
	add edx,(25 shl 16) ;icon pen 2
848
	int 0x40
849
 
850
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
851
	add edx,(25 shl 16) ;icon pen 3
852
	int 0x40
853
 
2482 IgorA 854
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
855
	add edx,(25 shl 16) ;icon add elemet
856
	int 0x40
857
 
2462 IgorA 858
	mcall 12,2
859
popad
860
	ret
861
 
862
align 4
863
key:
864
	mcall 2
865
	stdcall [tl_key], dword tree1
2487 IgorA 866
	stdcall [tl_key], dword tree2
2462 IgorA 867
	jmp still
868
 
869
 
870
align 4
871
button:
872
	mcall 17
873
	cmp ah,3
874
	jne @f
875
		call but_new_file
876
	@@:
877
	cmp ah,4
878
	jne @f
879
		call but_open_file
880
	@@:
881
	cmp ah,5
882
	jne @f
883
		call but_save_file
884
	@@:
885
	cmp ah,6
886
	jne @f
887
		call but_run_stop
888
	@@:
889
	cmp ah,7
890
	jne @f
891
		call but_zoom_p
892
	@@:
893
	cmp ah,8
894
	jne @f
895
		call but_zoom_m
896
	@@:
897
	cmp ah,9
898
	jne @f
899
		call but_pole_left
900
	@@:
901
	cmp ah,10
902
	jne @f
903
		call but_pole_right
904
	@@:
905
	cmp ah,11
906
	jne @f
907
		call but_pole_up
908
	@@:
909
	cmp ah,12
910
	jne @f
911
		call but_pole_dn
912
	@@:
913
	cmp ah,13
914
	jne @f
915
		call but_center
916
	@@:
2501 IgorA 917
 
918
	;передвижение всех объектов схемы
919
	cmp byte[tim_ch],0
920
	jne .no_move
921
	cmp ah,14
922
	jne @f
923
		stdcall pole_move_all, pole, -1, 0
924
		call redraw_pole
925
	@@:
926
	cmp ah,15
927
	jne @f
928
		stdcall pole_move_all, pole, 1, 0
929
		call redraw_pole
930
	@@:
931
	cmp ah,16 ;сдвиг схемы вверх
932
	jne @f
933
		stdcall pole_move_all, pole, 0, -1
934
		call redraw_pole
935
	@@:
936
	cmp ah,17 ;сдвиг схемы вниз
937
	jne @f
938
		stdcall pole_move_all, pole, 0, 1
939
		call redraw_pole
940
	@@:
941
	.no_move:
942
 
2462 IgorA 943
	cmp ah,20
944
	jne @f
945
		call but_set_0
946
	@@:
947
	cmp ah,21
948
	jne @f
949
		call but_set_1
950
	@@:
951
	cmp ah,22
952
	jne @f
953
		call but_mov_l
954
	@@:
955
	cmp ah,23
956
	jne @f
957
		call but_mov_r
958
	@@:
959
	cmp ah,24
960
	jne @f
961
		call but_mov_u
962
	@@:
963
	cmp ah,25
964
	jne @f
965
		call but_mov_d
966
	@@:
967
	cmp ah,30
968
	jne @f
969
		call but_set_none
970
	@@:
971
	cmp ah,31
972
	jne @f
2487 IgorA 973
		stdcall set_pen_mode,1,0,((9 shl 8)+9) shl 16 ;установка режима рисования провода
2462 IgorA 974
	@@:
975
	cmp ah,32
976
	jne @f
2487 IgorA 977
		stdcall set_pen_mode,2,1,((9 shl 8)+9) shl 16
2462 IgorA 978
	@@:
979
	cmp ah,33
980
	jne @f
2487 IgorA 981
		stdcall set_pen_mode,3,2,((15 shl 8)+9) shl 16 ;установка режима стирания провода
2462 IgorA 982
	@@:
2482 IgorA 983
	cmp ah,34
984
	jne @f
2487 IgorA 985
		stdcall set_pen_mode,4,3,((9 shl 8)+9) shl 16 ;установка режима создания элементов
2482 IgorA 986
	@@:
2462 IgorA 987
	cmp ah,1
988
	jne still
989
.exit:
990
	stdcall [buf2d_delete],buf_0
991
	stdcall [buf2d_delete],buf_font
2482 IgorA 992
	stdcall [buf2d_delete],buf_curs
2462 IgorA 993
	stdcall mem.Free,[image_data_toolbar]
994
	stdcall pole_delete, pole
995
	call sign_delete
996
	stdcall [tl_data_clear], tree1
2487 IgorA 997
	;чистим указатели на изображения, которые были общими для листов и удалены листом tree1
998
	mov dword[tree2.data_img_sys],0
999
	mov dword[tree2.data_img],0
1000
	stdcall [tl_data_clear], tree2
2482 IgorA 1001
	cmp [cursor_pointer],0
1002
	je @f
1003
		mcall 37,6,[cursor_pointer]
1004
	@@:
2462 IgorA 1005
	mcall -1
1006
 
2482 IgorA 1007
;создание новой схемы
2462 IgorA 1008
align 4
2482 IgorA 1009
proc but_new_file uses eax
1010
	call but_set_none
1011
	stdcall [tl_info_clear],tree1
1012
	stdcall [tl_draw],tree1
1013
	xor eax,eax
1014
	mov [shem_elems],eax
1015
	mov [shem_captions],eax
2462 IgorA 1016
	stdcall pole_clear, pole
1017
	call redraw_pole
1018
	ret
2482 IgorA 1019
endp
2462 IgorA 1020
 
1021
align 4
1022
f_size dd 0 ;размер открываемого файла
1023
shem_w dd 192 ;ширина схемы
1024
shem_h dd 128 ;высота схемы
1025
shem_points dd 0 ;колличество узлов на схеме
1026
shem_sub_points dd 0 ;колличество изолированных узлов на схеме
1027
shem_elems dd 0 ;колличество элементов на схеме
1028
shem_captions dd 0
1029
shem_colors:
1030
	dd color_s0, color_s1, color_s2, color_s3
1031
 
1032
align 4
1033
open_file_lif:
1034
	rb 2*4096 ;область для открытия файлов
1035
.end:
1036
 
1037
align 4
1038
but_open_file:
1039
	pushad
1040
	copy_path open_dialog_name,communication_area_default_path,file_name,0
1041
	mov [OpenDialog_data.type],0
1042
	stdcall [OpenDialog_Start],OpenDialog_data
1043
	cmp [OpenDialog_data.status],2
1044
	je .end_open_file
1045
	;код при удачном открытии диалога
1046
 
1047
	mov eax,70 ;70-я функция работа с файлами
1048
	mov [run_file_70.Function], 0
1049
	mov [run_file_70.Position], 0
1050
	mov [run_file_70.Flags], 0
1051
	mov dword[run_file_70.Count], open_file_lif.end-open_file_lif
1052
	m2m [run_file_70.Buffer], open_file_lif
1053
	mov byte[run_file_70+20], 0
1054
	mov dword[run_file_70.FileName], openfile_path
1055
	mov ebx,run_file_70
1056
	int 0x40 ;загружаем файл
1057
	cmp ebx,0xffffffff
1058
	je .end_open_file
1059
 
1060
		mov dword[f_size],ebx
1061
		add ebx,open_file_lif
1062
		mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом
1063
		mcall 71,1,openfile_path
1064
		;---
1065
 
1066
		;задаем минимальные значения, на случай если в файле будут некоректные размеры
1067
		mov dword[shem_w],5
1068
		mov dword[shem_h],5
1069
 
1070
		mov esi,txt_size
1071
		call str_analiz_r
1072
		cmp edi,0
1073
		je @f
1074
			stdcall str_len,esi
1075
			add edi,eax
1076
			stdcall conv_str_to_int,edi
1077
			cmp eax,5
1078
			jl @f ;ошибка в файле (на .end_open_file не переходим, пытаемся прочитать другую информацию)
1079
			mov dword[shem_w],eax
1080
 
1081
			call str_next_val
1082
			stdcall conv_str_to_int,edi
1083
			cmp eax,5
1084
			jl @f ;ошибка в файле
1085
			mov dword[shem_h],eax
1086
		@@:
1087
 
1088
		stdcall [tl_info_clear],tree1
1089
 
1090
		;*** добавление в список логических элементов ***
1091
		stdcall [tl_node_add], txt_elements-capt_offs,(el_icon_group shl 16), tree1
1092
		stdcall [tl_cur_next], tree1
1093
 
1094
		mov esi,txt_elements
1095
		call str_analiz_r
1096
		cmp edi,0
1097
		je .end_elems
1098
			stdcall str_len,esi
1099
			add edi,eax
1100
			stdcall conv_str_to_int,edi
1101
			cmp eax,0
1102
			jle .end_elems ;если число элементов = 0
1103
			mov [shem_elems],eax
1104
			mov ecx,eax
1105
			.cycle_elem:
1106
				call str_next_val
1107
				stdcall conv_str_to_int,edi
1108
				mov dword[txt_buf],eax ;координата x
1109
				call str_next_val
1110
				stdcall conv_str_to_int,edi
1111
				mov dword[txt_buf+4],eax ;координата y
1112
				call str_next_val
1113
				stdcall conv_str_to_int,edi
2487 IgorA 1114
				mov byte[txt_buf+sp_offs_el_angle],al ;направление
2462 IgorA 1115
				call str_next_val
1116
				;по адресу edi название элемента
1117
				stdcall el_get_name, edi
1118
				mov byte[txt_buf+sp_offs_el_type],al ;тип элемента
1119
 
1120
				stdcall make_list_capts,txt_buf,edi
1121
 
1122
				stdcall [tl_node_add], txt_buf,(el_icon_elems shl 16)+1, tree1
1123
				stdcall [tl_cur_next], tree1
1124
				dec ecx
1125
				jnz .cycle_elem
1126
		.end_elems:
1127
 
1128
		;*** добавление в список текстовых подписей ***
1129
		stdcall [tl_node_add], txt_captions-capt_offs,(el_icon_group shl 16), tree1
1130
		stdcall [tl_cur_next], tree1
1131
 
1132
		mov esi,txt_captions
1133
		call str_analiz_r
1134
		cmp edi,0
1135
		je .end_captions
1136
			stdcall str_len,esi
1137
			add edi,eax
1138
			stdcall conv_str_to_int,edi
1139
			cmp eax,0
1140
			jle .end_captions ;если число подписей = 0
1141
			mov [shem_captions],eax
1142
			mov ecx,eax
1143
			.cycle_captions:
1144
				call str_next_val
1145
				stdcall conv_str_to_int,edi
1146
				mov dword[txt_buf],eax ;координата x
1147
				call str_next_val
1148
				stdcall conv_str_to_int,edi
1149
				mov dword[txt_buf+4],eax ;координата y
1150
				call str_next_val
1151
				mov al,byte[edi]
1152
				mov byte[txt_buf+8],al ;вид подписи ('z' - сигнал с 0, 'o' - сигнал с 1, 'n' - нет сигнала)
1153
				call str_next_val
1154
 
1155
				stdcall make_list_capts,txt_buf,edi
1156
 
1157
				stdcall [tl_node_add], txt_buf,(el_icon_captions shl 16)+1, tree1
1158
				stdcall [tl_cur_next], tree1
1159
				dec ecx
1160
				jnz .cycle_captions
1161
		.end_captions:
1162
 
1163
		mov byte[txt_buf+capt_offs],0 ;обнуление подписей
1164
 
1165
		;*** добавление в список ключевых точек ***
1166
		stdcall [tl_node_add], txt_points-capt_offs,(el_icon_group shl 16), tree1
1167
		stdcall [tl_cur_next], tree1
1168
 
1169
		mov dword[shem_points],0
1170
		mov esi,txt_points
1171
		call str_analiz_r
1172
		cmp edi,0
1173
		je .end_points ;если описания точек нет в файле
1174
			stdcall str_len,esi
1175
			add edi,eax
1176
			stdcall conv_str_to_int,edi
1177
			cmp eax,0
1178
			jle .end_points ;если число точек = 0
1179
			mov [shem_points],eax
1180
			mov ecx,eax
1181
			.cycle_poi:
1182
				call str_next_val
1183
				stdcall conv_str_to_int,edi
1184
				mov dword[txt_buf],eax ;координата x
1185
				call str_next_val
1186
				stdcall conv_str_to_int,edi
1187
				mov dword[txt_buf+4],eax ;координата y
1188
				call str_next_val
1189
				stdcall conv_str_to_int,edi
1190
				mov byte[txt_buf+8],al ;направления
1191
 
1192
;                               stdcall make_list_capts,txt_buf,0
1193
 
1194
				stdcall [tl_node_add], txt_buf,(el_icon_points shl 16)+1, tree1
1195
				stdcall [tl_cur_next], tree1
1196
				dec ecx
1197
				jnz .cycle_poi
1198
		.end_points:
1199
 
1200
		stdcall [tl_cur_beg], tree1
1201
 
1202
	;*** добавление точечных объектов ***
1203
	stdcall pole_clear, pole
1204
	stdcall dword[tl_node_poi_get_info],0,tree1
1205
	pop esi
1206
	@@:
1207
		cmp esi,0
1208
		je @f
1209
		cmp word[esi],el_icon_points ;получение через esi тип иконки, и пропуск не точечных объектов
1210
		jne .end_add_p0
1211
			stdcall [tl_node_poi_get_data], esi, tree1
1212
			pop eax
1213
			stdcall pole_cell_creat, pole,dword[eax],dword[eax+4],0
1214
		.end_add_p0:
1215
		stdcall dword[tl_node_poi_get_next_info],esi,tree1
1216
		pop esi ;переходим к следущему узлу
1217
		jmp @b
1218
	@@:
1219
	stdcall pole_sort, pole
1220
 
1221
	;*** добавление точечных объектов (на основе логических элементов) ***
1222
	stdcall dword[tl_node_poi_get_info],0,tree1
1223
	pop esi
1224
	@@:
1225
		cmp esi,0
1226
		je @f
1227
		cmp word[esi],el_icon_elems ;получение через esi тип иконки
1228
		jne .end_add_p3
1229
			stdcall [tl_node_poi_get_data], esi, tree1
1230
			pop ecx
1231
 
1232
			xor edx,edx ;edx - номер входной ноги
1233
			.add_p1:
1234
				stdcall el_get_leg_coords, ecx,edx
1235
				test eax,eax
1236
				jnz .add_beg1
1237
				test ebx,ebx
1238
				jnz .add_beg1
1239
					jmp .end_add_p1 ;если координаты не взялись (eax=0 && ebx=0), выход из цикла
1240
				.add_beg1:
1241
				stdcall pole_cell_creat, pole,eax,ebx,0
1242
				inc edx
1243
				jmp .add_p1
1244
			.end_add_p1:
1245
 
1246
			mov edx,(1 shl 16) ;edx - номер выходной ноги
1247
			.add_p2:
1248
				stdcall el_get_leg_coords, ecx,edx
1249
				test eax,eax
1250
				jnz .add_beg2
1251
				test ebx,ebx
1252
				jnz .add_beg2
1253
					jmp .end_add_p2 ;если координаты не взялись (eax=0 && ebx=0), выход из цикла
1254
				.add_beg2:
1255
				stdcall pole_cell_creat, pole,eax,ebx,0
1256
				inc edx
1257
				jmp .add_p2
1258
			.end_add_p2:
1259
 
1260
		.end_add_p3:
1261
		stdcall dword[tl_node_poi_get_next_info],esi,tree1
1262
		pop esi ;переходим к следущему узлу
1263
		jmp @b
1264
	@@:
1265
	stdcall pole_sort, pole
1266
 
1267
	;*** добавление точечных объектов (на основе подписей) ***
1268
	stdcall dword[tl_node_poi_get_info],0,tree1
1269
	pop esi
1270
	@@:
1271
		cmp esi,0
1272
		je @f
1273
		cmp word[esi],el_icon_captions ;получение через esi тип иконки
1274
		jne .end_add_p6
1275
			stdcall [tl_node_poi_get_data], esi, tree1
1276
			pop ecx
1277
			cmp byte[ecx+8],'n'
1278
			je .end_add_p6
1279
				stdcall pole_cell_creat, pole,[ecx],[ecx+4],0
1280
		.end_add_p6:
1281
		stdcall dword[tl_node_poi_get_next_info],esi,tree1
1282
		pop esi ;переходим к следущему узлу
1283
		jmp @b
1284
	@@:
1285
	stdcall pole_sort, pole
1286
 
1287
	;*** рисование проводов (на основе точечных объектов) ***
1288
	stdcall dword[tl_node_poi_get_info],0,tree1
1289
	pop esi
1290
	xor ecx,ecx
1291
	@@:
1292
		cmp esi,0
1293
		je @f
1294
		cmp word[esi],el_icon_points ;получение через esi тип иконки, и пропуск не точечных объектов
1295
		jne .end_add_p4
1296
			stdcall [tl_node_poi_get_data], esi, tree1
1297
			pop eax
1298
			movzx ebx,byte[eax+8]
1299
			stdcall shem_create_line, dword[eax],dword[eax+4],ebx
1300
			add ecx,edx
1301
		.end_add_p4:
1302
		stdcall dword[tl_node_poi_get_next_info],esi,tree1
1303
		pop esi ;переходим к следущему узлу
1304
		cmp ecx,250 ;ecx - число добавленных точек
1305
		jl @b
1306
		xor ecx,ecx
1307
		stdcall pole_sort, pole ;сортируем для оптимизации быстродействия
1308
		jmp @b
1309
	@@:
1310
	stdcall pole_sort, pole
1311
 
1312
		stdcall pole_reset_cells, pole ;чистка проводов
1313
 
1314
		;*** добавление изоляционных объектов (прямо из файла, минуя запись в список) ***
1315
		mov dword[shem_sub_points],0
1316
		mov esi,txt_sub_points
1317
		call str_analiz_r
1318
		cmp edi,0
1319
		je .end_sub_points ;если описания точек нет в файле
1320
			stdcall str_len,esi
1321
			add edi,eax
1322
			stdcall conv_str_to_int,edi
1323
			cmp eax,0
1324
			jle .end_sub_points ;если число точек = 0
1325
			mov [shem_sub_points],eax
1326
			mov ecx,eax
1327
			.cycle_sub_poi:
1328
				call str_next_val
1329
				stdcall conv_str_to_int,edi
1330
				mov ebx,eax ;координата x
1331
				call str_next_val
1332
				stdcall conv_str_to_int,edi ;координата y
1333
				stdcall pole_cell_creat, pole,ebx,eax,2
1334
 
1335
				dec ecx
1336
				jnz .cycle_sub_poi
1337
		.end_sub_points:
1338
 
1339
		stdcall pole_sort, pole
1340
 
1341
		;*** удаление ключевых точек со списка ***
1342
		mov ecx,[shem_points]
1343
		inc ecx
1344
		cld
1345
		@@:
1346
			stdcall [tl_info_undo],tree1
1347
		loop @b
1348
 
1349
		;*** формирование подписей о параметрах схемы ***
1350
		mov dword[txt_info.size],0
1351
		mov eax,dword[shem_w]
1352
		mov edi,txt_info.size
1353
		call convert_int_to_str
1354
		stdcall str_cat, edi,txt_mull
1355
		mov eax,dword[shem_h]
1356
		mov edi,txt_buf
1357
		call convert_int_to_str
1358
		stdcall str_cat, txt_info.size,edi
1359
		stdcall str_cat, txt_info.size,txt_space ;завершающий пробел
1360
 
1361
		;---
1362
		call but_center ;центровка схемы с учетом shem_w и shem_h
2482 IgorA 1363
		call but_set_none
2462 IgorA 1364
	.end_open_file:
1365
	popad
1366
	ret
1367
 
1368
align 4
1369
proc but_save_file
1370
locals
1371
	napr dd ?
2501 IgorA 1372
	s_param dd ? ;параметр для красивого сохранения
2462 IgorA 1373
endl
1374
pushad
1375
	;*** вызов диалогового окна для сохранения файла
1376
	copy_path open_dialog_name,communication_area_default_path,file_name,0
1377
	mov [OpenDialog_data.type],1
1378
	stdcall [OpenDialog_Start],OpenDialog_data
1379
	cmp [OpenDialog_data.status],1 ;if status==1 then save
1380
	jne .end_save_file
1381
 
1382
	;*** проверка есть ли провода на схеме
1383
	mov edi,pole
1384
	mov esi,pole_index
1385
	cmp dword[esi],0
1386
	je .cycle1_beg ;.end_save_file ;если нет ячеек (проводов) то выход
1387
 
1388
	;*** устанавливаем метки на ключевые точки, которые будут сохранены в файл
1389
	mov dword[shem_points],0 ;для переопределения точек
1390
	mov dword[shem_sub_points],0
1391
	mov ecx,dword[esi]
1392
	.cycle0: ;цикл по всем точкам
1393
		add esi,4
1394
		mov ebx,[esi]
1395
		imul ebx,sizeof.Cell
1396
		add ebx,pole_data
1397
 
1398
		cmp byte[ebx+offs_cell_liv],2
1399
		jne @f
1400
			inc dword[shem_sub_points]
1401
			jmp .cycle0_next
1402
		@@:
1403
 
1404
		mov dword[napr],0
1405
 
1406
		mov edx,[ebx+offs_cell_y]
1407
		push edx
1408
		mov edx,[ebx+offs_cell_x]
1409
		inc edx
1410
		push edx
1411
		stdcall pole_cell_find, edi
1412
		cmp eax,0
1413
		je @f
1414
			or dword[napr],1
1415
		@@:
1416
 
1417
		mov edx,[ebx+offs_cell_y]
1418
		inc edx
1419
		push edx
1420
		mov edx,[ebx+offs_cell_x]
1421
		push edx
1422
		stdcall pole_cell_find, edi
1423
		cmp eax,0
1424
		je @f
1425
			or dword[napr],2
1426
		@@:
1427
 
1428
		mov edx,[ebx+offs_cell_y]
1429
		push edx
1430
		mov edx,[ebx+offs_cell_x]
1431
		dec edx
1432
		push edx
1433
		stdcall pole_cell_find, edi
1434
		cmp eax,0
1435
		je @f
1436
			or dword[napr],4
1437
		@@:
1438
 
1439
		mov edx,[ebx+offs_cell_y]
1440
		dec edx
1441
		push edx
1442
		mov edx,[ebx+offs_cell_x]
1443
		push edx
1444
		stdcall pole_cell_find, edi
1445
		cmp eax,0
1446
		je @f
1447
			or dword[napr],8
1448
		@@:
1449
 
1450
		cmp dword[napr],5
1451
		je @f
1452
		cmp dword[napr],10
1453
		je @f
1454
		cmp dword[napr],15
1455
		je @f
1456
			mov eax,dword[napr]
1457
			mov byte[ebx+offs_cell_liv],3 ;установка метки
1458
			mov byte[ebx+offs_cell_napr],al ;установка направлений
1459
			inc dword[shem_points]
1460
		@@:
1461
		.cycle0_next:
1462
		dec ecx
1463
		jnz .cycle0
1464
 
1465
	;*** снятие метки с точек, которые находятся на входных ногах логических элементов
1466
	.cycle1_beg:
1467
	mov dword[shem_elems],0 ;для пепеопределения числа элементов
1468
	stdcall dword[tl_node_poi_get_info],0,tree1
1469
	pop esi
1470
	.cycle1:
1471
		cmp esi,0
1472
		je .cycle1_end
1473
		cmp word[esi],el_icon_elems ;получение через esi тип иконки
1474
		jne .end_add_p1
2507 IgorA 1475
;			stdcall [tl_node_poi_get_data], esi, tree1
1476
;			pop ecx
2462 IgorA 1477
			inc dword[shem_elems]
2507 IgorA 1478
if 0
2462 IgorA 1479
			xor edx,edx ;edx - номер входной ноги
1480
			@@:
1481
				stdcall el_get_leg_coords, ecx,edx
1482
				test eax,eax
1483
				jz @f ;если координаты не взялись (eax=0 && ebx=0)
1484
				test ebx,ebx
1485
				jz @f ;если координаты не взялись (eax=0 && ebx=0)
1486
				stdcall pole_cell_find, edi,eax,ebx
1487
				test eax,eax
1488
				jz .no_erase
1489
					get_cell_offset ebx,eax
1490
					mov byte[ebx+offs_cell_liv],0 ;снятие метки
1491
					dec dword[shem_points]
1492
				.no_erase:
1493
				inc edx
1494
				jmp @b
1495
			@@:
1496
			;mov edx,(1 shl 16) ;edx - номер выходной ноги
2507 IgorA 1497
end if
2462 IgorA 1498
		.end_add_p1:
1499
		stdcall dword[tl_node_poi_get_next_info],esi,tree1
1500
		pop esi ;переходим к следущему узлу
1501
		jmp .cycle1
1502
	.cycle1_end:
1503
 
1504
	;*** создание информации для записи в файл ***
1505
	mov edi,open_file_lif
1506
	stdcall mem_copy,edi,txt_size,5
1507
	stdcall str_cat,edi,txt_space
1508
	mov eax,dword[shem_w]
1509
	add edi,5
1510
	stdcall convert_int_to_str
1511
	stdcall str_cat,edi,txt_space
1512
	stdcall str_len,edi
1513
	add edi,eax
1514
	mov eax,[shem_h]
1515
	stdcall convert_int_to_str
1516
	stdcall str_cat,edi,txt_nl
1517
 
1518
	;*** сохранение логических элементов ***
1519
	stdcall str_cat,edi,txt_elements
1520
	stdcall str_cat,edi,txt_space
1521
	stdcall str_len,edi
1522
	add edi,eax
1523
	mov eax,[shem_elems]
1524
	stdcall convert_int_to_str
1525
	stdcall str_cat,edi,txt_nl
1526
 
1527
	cmp eax,1
1528
	jl .cycle2_end
1529
	stdcall dword[tl_node_poi_get_info],0,tree1
1530
	pop esi
1531
	.cycle2:
1532
		cmp esi,0
1533
		je .cycle2_end
1534
		cmp word[esi],el_icon_elems ;получение через esi тип иконки
1535
		jne .end_add_p2
1536
			stdcall [tl_node_poi_get_data], esi, tree1
1537
			pop ecx
1538
 
1539
			stdcall str_len,edi
1540
			add edi,eax
1541
			mov eax,[ecx] ;coord x
1542
			stdcall convert_int_to_str
1543
			stdcall str_cat,edi,txt_space
1544
 
1545
			stdcall str_len,edi
1546
			add edi,eax
1547
			mov eax,[ecx+4] ;coord y
1548
			stdcall convert_int_to_str
1549
			stdcall str_cat,edi,txt_space
1550
 
1551
			stdcall str_len,edi
1552
			add edi,eax
2487 IgorA 1553
			movzx eax,byte[ecx+sp_offs_el_angle] ;angle
2462 IgorA 1554
			stdcall convert_int_to_str
1555
			stdcall str_cat,edi,txt_space
1556
 
1557
			;имя элемента
1558
			movzx eax,byte[ecx+sp_offs_el_type]
1559
			imul eax,size_el_opt
1560
			add eax,el_opt_beg+el_offs_nam
1561
			stdcall str_cat,edi,eax
1562
 
1563
			stdcall str_cat,edi,txt_nl
1564
 
1565
		.end_add_p2:
1566
		stdcall dword[tl_node_poi_get_next_info],esi,tree1
1567
		pop esi ;переходим к следущему узлу
1568
		jmp .cycle2
1569
	.cycle2_end:
1570
 
1571
	;*** сохранение подписей ***
1572
	stdcall str_cat,edi,txt_captions
1573
	stdcall str_cat,edi,txt_space
1574
	stdcall str_len,edi
1575
	add edi,eax
1576
	mov eax,[shem_captions]
1577
	stdcall convert_int_to_str
1578
	stdcall str_cat,edi,txt_nl
1579
 
1580
	cmp eax,1
1581
	jl .cycle3_end
1582
	stdcall dword[tl_node_poi_get_info],0,tree1
1583
	pop esi
1584
	.cycle3:
1585
		cmp esi,0
1586
		je .cycle3_end
1587
		cmp word[esi],el_icon_captions ;получение через esi тип иконки
1588
		jne .end_add_p3
1589
			stdcall [tl_node_poi_get_data], esi, tree1
1590
			pop ecx
1591
 
1592
			stdcall str_len,edi
1593
			add edi,eax
1594
			mov eax,[ecx] ;coord x
1595
			stdcall convert_int_to_str
1596
			stdcall str_cat,edi,txt_space
1597
 
1598
			stdcall str_len,edi
1599
			add edi,eax
1600
			mov eax,[ecx+4] ;coord y
1601
			stdcall convert_int_to_str
1602
			stdcall str_cat,edi,txt_space
1603
 
1604
			stdcall str_len,edi
1605
			add edi,eax
1606
			movzx eax,byte[ecx+8] ;n,z,o
1607
			mov ah,' ' ;пробел после буквы, что бы не добавлять txt_space
1608
			mov dword[edi],eax ;al
1609
 
1610
			;имя элемента
1611
			mov ebx,edi
1612
			mov edi,ecx
1613
			add edi,capt_offs
1614
			call str_next_val
1615
			call str_next_val
1616
			;call str_next_val
1617
			xchg ebx,edi
1618
			stdcall str_cat,edi,ebx
1619
 
1620
			stdcall str_cat,edi,txt_nl
1621
 
1622
		.end_add_p3:
1623
		stdcall dword[tl_node_poi_get_next_info],esi,tree1
1624
		pop esi ;переходим к следущему узлу
1625
		jmp .cycle3
1626
	.cycle3_end:
1627
 
1628
	;*** сохранение ключевых точек ***
1629
	stdcall str_cat,edi,txt_points
1630
	stdcall str_cat,edi,txt_space
1631
	stdcall str_len,edi
1632
	add edi,eax
1633
	mov eax,[shem_points]
1634
	stdcall convert_int_to_str
1635
	stdcall str_cat,edi,txt_nl
1636
 
1637
	mov eax,edi
1638
	mov edi,pole
1639
	mov esi,pole_index
1640
	cmp dword[esi],0
1641
	je .no_points ;если нет ячеек (проводов) то пропуск
1642
	mov ebx,pole_data
1643
	mov dword[napr],ebx
1644
	mov edi,eax
1645
 
1646
	mov ecx,dword[esi]
2501 IgorA 1647
	mov dword[s_param],0
2462 IgorA 1648
	.cycle4: ;цикл по всем точкам
1649
		add esi,4
1650
		mov ebx,[esi]
1651
		imul ebx,sizeof.Cell
1652
		add ebx,dword[napr] ;pole_data
1653
 
1654
		movzx edx,word[ebx+offs_cell_liv] ;also use offs_cell_napr
1655
		cmp dl,3
1656
		jne @f
1657
			stdcall str_len,edi
1658
			add edi,eax
1659
			mov eax,dword[ebx+offs_cell_x]
1660
			stdcall convert_int_to_str
1661
			stdcall str_cat,edi,txt_space
1662
 
1663
			stdcall str_len,edi
1664
			add edi,eax
1665
			mov eax,dword[ebx+offs_cell_y]
1666
			stdcall convert_int_to_str
1667
			stdcall str_cat,edi,txt_space
1668
 
1669
			stdcall str_len,edi
1670
			add edi,eax
1671
			movzx eax,dh
1672
			stdcall convert_int_to_str
2501 IgorA 1673
 
1674
			cmp dword[s_param],7 ;для формата строки
1675
			je .new_line
1676
				inc dword[s_param]
1677
				stdcall str_cat,edi,txt_space
1678
			jmp @f
1679
			.new_line:
1680
				mov dword[s_param],0
1681
				stdcall str_cat,edi,txt_nl
2462 IgorA 1682
		@@:
1683
		dec ecx
1684
		jnz .cycle4
2501 IgorA 1685
		cmp dword[s_param],0
1686
		je @f
1687
			stdcall str_cat,edi,txt_nl
1688
		@@:
2462 IgorA 1689
 
1690
	;*** сохранение изоляционных точек ***
1691
	stdcall str_cat,edi,txt_sub_points
1692
	stdcall str_cat,edi,txt_space
1693
	stdcall str_len,edi
1694
	add edi,eax
1695
	mov eax,[shem_sub_points]
1696
	stdcall convert_int_to_str
1697
	stdcall str_cat,edi,txt_nl
1698
 
1699
	mov eax,edi
1700
	mov edi,pole
1701
	mov esi,pole_index
1702
	;cmp dword[esi],0
1703
	;je .no_points ;если нет ячеек (проводов) то пропуск
1704
	;mov ebx,pole_data
1705
	;mov dword[napr],ebx
1706
	mov edi,eax
1707
 
1708
	mov ecx,dword[esi]
1709
	.cycle5: ;цикл по всем точкам
1710
		add esi,4
1711
		mov ebx,[esi]
1712
		imul ebx,sizeof.Cell
1713
		add ebx,dword[napr] ;pole_data
1714
 
1715
		movzx edx,byte[ebx+offs_cell_liv]
1716
		cmp dl,2
1717
		jne @f
1718
			stdcall str_len,edi
1719
			add edi,eax
1720
			mov eax,dword[ebx+offs_cell_x]
1721
			stdcall convert_int_to_str
1722
			stdcall str_cat,edi,txt_space
1723
 
1724
			stdcall str_len,edi
1725
			add edi,eax
1726
			mov eax,dword[ebx+offs_cell_y]
1727
			stdcall convert_int_to_str
1728
			stdcall str_cat,edi,txt_space
1729
 
1730
			;stdcall str_cat,edi,txt_nl
1731
		@@:
1732
		dec ecx
1733
		jnz .cycle5
1734
		stdcall str_cat,edi,txt_nl
1735
 
1736
	.no_points:
1737
 
1738
	;*** определение параметров файла
1739
	mov edi,open_file_lif
1740
	stdcall str_len,edi
1741
	mov ecx,eax
1742
 
1743
	;*** запись файла
1744
	mov eax,70
1745
	mov [run_file_70.Function], 2
1746
	mov [run_file_70.Position], 0
1747
	mov [run_file_70.Flags], 0
1748
	mov dword[run_file_70.Count], ecx
1749
	mov [run_file_70.Buffer], edi
1750
	mov byte[run_file_70+20], 0
1751
	mov dword[run_file_70.FileName], openfile_path
1752
	mov ebx,run_file_70
1753
	int 0x40 ;сохраняем файл
1754
 
1755
	call redraw_pole
1756
	.end_save_file:
1757
popad
1758
	ret
1759
endp
1760
 
1761
;формирование подписи для списка
1762
align 4
1763
proc make_list_capts uses eax ebx ecx edi, buf:dword, txt:dword
1764
	mov ebx,dword[buf]
1765
 
1766
	mov edi,ebx
1767
	add edi,capt_offs
1768
	mov dword[edi],'    ' ;пробелы для выравнивания маленьких чисел
1769
 
1770
	mov eax,dword[ebx] ;+0 - offset coord x
1771
	cmp eax,100
1772
	jge @f
1773
		inc edi
1774
	@@:
1775
	cmp eax,10
1776
	jge @f
1777
		inc edi
1778
	@@:
1779
	call convert_int_to_str ;координата x (для подписи)
1780
	stdcall str_cat,edi,txt_space
1781
	stdcall str_len,edi
1782
	add edi,eax
1783
	mov eax,dword[ebx+4] ;+4 - offset coord y
1784
	call convert_int_to_str ;координата y (для подписи)
1785
	stdcall str_cat,edi,txt_space
1786
 
1787
	mov edi,dword[txt]
1788
	cmp edi,0
1789
	je .end_f
1790
		stdcall str_len,edi ;eax = strlen([edi])
1791
		mov ecx,edi
1792
		call str_next_spaces
1793
		sub edi,ecx ;определяем длинну подписи
1794
 
1795
		cmp edi,eax
1796
		jle @f
1797
			mov edi,eax ;если строка закончилась не пробелом
1798
		@@:
1799
		;cmp edi,1
1800
		;jge @f
1801
		;       mov edi,1 ;минимум 1 символ
1802
		;@@:
1803
 
1804
		add ebx,capt_offs
1805
		stdcall str_n_cat, ebx,ecx,edi
1806
	.end_f:
1807
	ret
1808
endp
1809
 
2482 IgorA 1810
;добавление нового элемента управления на схему
1811
;при добавлении используются стандартные настройки
1812
align 4
1813
proc shem_element_creat uses eax ebx, coord_x:dword, coord_y:dword
1814
	mov eax,dword[coord_x]
1815
	mov dword[txt_buf],eax ;координата x
2487 IgorA 1816
	mov ebx,dword[coord_y]
2482 IgorA 1817
 
2487 IgorA 1818
	stdcall element_is_click,eax,ebx ;проверяем есть ли в данной точке другой элемент созданный раньше
1819
	test eax,eax
1820
	jnz .end_f ;при нажатии попали на один из элементов
1821
	mov dword[txt_buf+4],ebx ;координата y
1822
 
1823
	;xor eax,eax
1824
	mov byte[txt_buf+sp_offs_el_angle],al ;направление
1825
 
1826
	stdcall [tl_node_get_data], tree2
1827
	pop ebx
1828
	test ebx,ebx
1829
	jnz @f
1830
		mov ebx,el_opt_beg+el_offs_nam ;если не взялось имя элемента, то по умолчанию берем 1-й из списка
1831
	@@:
1832
	stdcall el_get_name, ebx
2482 IgorA 1833
	mov byte[txt_buf+sp_offs_el_type],al ;тип элемента
1834
 
1835
	stdcall make_list_capts,txt_buf,ebx
1836
	stdcall [tl_node_add], txt_buf,(el_icon_elems shl 16)+1, tree1
1837
	stdcall [tl_cur_next], tree1
1838
	stdcall [tl_draw], tree1
2487 IgorA 1839
	.end_f:
2482 IgorA 1840
	ret
1841
endp
1842
 
2462 IgorA 1843
;output:
1844
; eax - тип элемента
1845
align 4
1846
proc el_get_name uses ecx edi esi, str:dword
1847
	mov edi,[str]
1848
	mov esi,el_opt_beg+el_offs_nam
1849
	xor ecx,ecx
1850
	@@:
1851
		stdcall str_instr, edi,esi
1852
		cmp eax,0
1853
		je @f
1854
		add esi,size_el_opt
1855
		cmp esi,el_opt_beg.end
1856
		jge @f
1857
		inc ecx
1858
		jmp @b
1859
	@@:
1860
	mov eax,ecx
1861
	ret
1862
endp
1863
 
1864
;input:
1865
; el_data - указатель на данные элемента
1866
; l_opt - номер ноги, для которой ищутся координаты, входная/выходная нога
1867
;output:
1868
; eax - coord x (if not found eax=0)
1869
; ebx - coord y (if not found ebx=0)
1870
align 4
1871
proc el_get_leg_coords uses ecx edx edi esi, el_data:dword, l_opt:dword
1872
	mov edi,[el_data] ;данные элемента
1873
	movzx esi,byte[edi+sp_offs_el_type] ;тип элемента
1874
	imul esi,size_el_opt
1875
	add esi,el_opt_beg
2487 IgorA 1876
	;esi+el_offs_legs_inp - указатель на таблицу с параметрами входных ног
2462 IgorA 1877
 
1878
	mov eax,[edi+0]
1879
	mov ebx,[edi+4]
1880
	mov edx,[l_opt]
2487 IgorA 1881
	movzx edi,byte[edi+sp_offs_el_angle] ;угол поворота / 90 (от 0-3)
2462 IgorA 1882
 
1883
	btr edx,16 ;входная/выходная нога
1884
	jc .output_leg
1885
 
1886
	;если нога входная
1887
	inc edx ;номерация ног начинается с нуля, потому добавляем 1
1888
	stdcall move_rotate_x_n90, -2,edi
2487 IgorA 1889
	mov esi,[esi+el_offs_legs_inp]
2462 IgorA 1890
	@@:
1891
		movzx ecx,byte[esi]
1892
		cmp ecx,0
1893
		je .not_found ;ноги кончились раньше, чем ожидалось
1894
		stdcall move_rotate_n90, 0,ecx,edi
1895
		inc esi
1896
		dec edx
1897
		jnz @b
1898
		jmp .end_f
1899
 
1900
	;если нога выходная
1901
	.output_leg:
1902
	inc edx ;номерация ног начинается с нуля, потому добавляем 1
1903
	movzx ecx,byte[esi+el_offs_box_x]
1904
	add ecx,2
1905
	stdcall move_rotate_x_n90, ecx,edi
1906
	add esi,el_offs_legs_out
1907
	@@:
1908
		movzx ecx,byte[esi]
1909
		cmp ecx,0
1910
		je .not_found ;ноги кончились раньше, чем ожидалось
1911
		stdcall move_rotate_n90, 0,ecx,edi
1912
		inc esi
1913
		dec edx
1914
		jnz @b
1915
		jmp .end_f
1916
 
1917
	.not_found:
1918
		xor eax,eax
1919
		xor ebx,ebx
1920
	.end_f:
1921
	ret
1922
endp
1923
 
1924
align 4
1925
proc move_rotate_n90 uses ecx edi, d_x:dword, d_y:dword, angle:dword
1926
	mov edi,[angle] ;угол поворота / 90 (от 0-3)
1927
	and edi,3
1928
	shl edi,4 ;edi*=16
1929
	add edi,mcs
1930
 
1931
	mov ecx,[d_x]
1932
	imul ecx,dword[edi]
1933
	add eax,ecx
1934
	mov ecx,[d_y]
1935
	imul ecx,dword[edi+4]
1936
	add eax,ecx
1937
 
1938
	mov ecx,[d_x]
1939
	imul ecx,dword[edi+8]
1940
	add ebx,ecx
1941
	mov ecx,[d_y]
1942
	imul ecx,dword[edi+12]
1943
	add ebx,ecx
1944
	ret
1945
endp
1946
 
1947
align 4
1948
proc mem_copy, destination:dword, source:dword, len:dword
1949
  push ecx esi edi
1950
    cld
1951
    mov esi, dword[source]
1952
    mov edi, dword[destination]
1953
    mov ecx, dword[len]
1954
    rep movsb
1955
  pop edi esi ecx
1956
  ret
1957
endp
1958
 
1959
;description:
1960
; Функция пропускает одно слово (или число) с учетом разделительных символов:
1961
; пробела, табуляции, новой строки. Нужна для последовательного считывани чисел из строки
1962
;input:
1963
; edi - указатель на пробел или слово
1964
;output:
1965
; edi - указатель на следующее слово
1966
align 4
1967
str_next_val:
1968
	call str_skip_spaces
1969
	@@:
1970
		cmp byte[edi],0
1971
		je @f
1972
 
1973
		cmp byte[edi],' '
1974
		je @f
1975
		cmp byte[edi],9
1976
		je @f
1977
		cmp byte[edi],10
1978
		je @f
1979
		cmp byte[edi],13
1980
		je @f
1981
 
1982
		inc edi
1983
		jmp @b
1984
	@@:
1985
	call str_skip_spaces
1986
	ret
1987
 
1988
align 4
1989
str_skip_spaces:
1990
	dec edi
1991
	@@:
1992
		inc edi
1993
		cmp byte[edi],' '
1994
		je @b
1995
		cmp byte[edi],9
1996
		je @b
1997
		cmp byte[edi],10
1998
		je @b
1999
		cmp byte[edi],13
2000
		je @b
2001
	ret
2002
 
2003
align 4
2004
str_next_spaces:
2005
	dec edi
2006
	@@:
2007
		inc edi
2008
		cmp byte[edi],0
2009
		je @f
2010
		cmp byte[edi],' '
2011
		je @f
2012
		cmp byte[edi],9
2013
		je @f
2014
		cmp byte[edi],10
2015
		je @f
2016
		cmp byte[edi],13
2017
		je @f
2018
		jmp @b
2019
	@@:
2020
	ret
2021
 
2022
;input:
2023
; esi - указатель на искомое слово
2024
;output:
2025
; edi - указатель на позицию в которой слово найдено, если слово не найдено то edi=0
2026
;портятся регистры:
2027
; eax ecx
2028
align 4
2029
str_analiz_r:
2030
	mov edi,open_file_lif
2031
	mov ecx,dword[f_size]
2032
	@@:
2033
		mov al,byte[esi] ;устанавливаем первый символ для поиска
2034
		cld
2035
		repnz scasb
2036
		cmp ecx,0
2037
		je @f ;если закончился весь текст, то выход из функции
2038
		;первый символ по адресу edi-1 должен быть из строки esi
2039
		dec edi
2040
		stdcall str_instr, edi,esi ;проверяем слово на совпадение
2041
		inc edi
2042
		cmp al,0
2043
		jne @b ;если слово не совпало, ищем в строке следующий первый символ для сравнения
2044
		;сюда попадаем если нашли слово esi по адресу edi
2045
		jmp .exit_f
2046
	@@:
2047
		;сюда попадаем если не нашли слово esi по адресу edi
2048
		xor edi,edi
2049
	.exit_f:
2050
	ret
2051
 
2052
;description:
2053
; проверяет содержится ли строка str1 в строке str0
2054
; проверка делается только начиная с первых символов, указанных в str0 и str1
2055
; пример 1: если str0='aaabbbccc', str1='bbb' совпадения не будет
2056
; пример 2: если str0='aaabbbccc', str1='aaa' совпадение будет
2057
;output:
2058
; al = 0 если строка str1 содержится в str0
2059
; al != 0 если строка str1 не содержится в str0
2060
align 4
2061
proc str_instr uses edi esi, str0:dword, str1:dword
2062
	;xor eax,eax
2063
	mov edi,[str0]
2064
	mov esi,[str1]
2065
	cld
2066
	@@:
2067
		mov al,[esi]
2068
		cmp al,0
2069
		je .e1
2070
		inc esi
2071
		scasb ;сравниваем символы
2072
	jz @b ;если совпали, то переходим к сравнению следующих
2073
	;сюда попадаем если строки не совпали
2074
	sub al,[edi-1]
2075
	.e1: ;сюда попадаем если строка str1 (esi) закончилась
2076
	ret
2077
endp
2078
 
2079
align 4
2080
proc but_run_stop
2081
	xor byte[tim_ch],1
2082
	cmp byte[tim_ch],0
2083
	jne @f
2084
		;остановка схемы
2085
		stdcall pole_reset_cells, pole ;чистка проводов
2086
		call redraw_pole
2087
		jmp .end_f
2088
	@@:
2089
		;подготовка схемы к запуску
2090
		call sign_clear
2091
	.end_f:
2092
	ret
2093
endp
2094
 
2095
align 4
2096
proc but_set_0 uses eax
2097
	stdcall [tl_node_get_data], tree1
2098
	pop eax
2099
	test eax,eax
2100
	jz .end_f
2101
;el_icon_captions
2102
;       cmp byte[eax+8],'n'
2103
;       je .end_f
2104
	cmp byte[eax+8],'o' ;временное отсечение, пока нет проверки типа текущей иконки
2105
	jne .end_f
2106
		mov byte[eax+8],'z'
2107
	.end_f:
2108
	ret
2109
endp
2110
 
2111
align 4
2112
proc but_set_1 uses eax
2113
	stdcall [tl_node_get_data], tree1
2114
	pop eax
2115
	test eax,eax
2116
	jz .end_f
2117
;el_icon_captions
2118
;       cmp byte[eax+8],'n'
2119
;       je .end_f
2120
	cmp byte[eax+8],'z' ;временное отсечение, пока нет проверки типа текущей иконки
2121
	jne .end_f
2122
		mov byte[eax+8],'o'
2123
	.end_f:
2124
	ret
2125
endp
2126
 
2127
;сдвиг объекта влево
2128
align 4
2129
proc but_mov_l uses eax edi
2130
	cmp byte[tim_ch],0
2131
	jne .end_f
2132
	stdcall [tl_node_get_data], tree1
2133
	pop eax
2134
	test eax,eax
2135
	jz .end_f
2136
		cmp dword[eax],1
2137
		jle .end_f
2138
		dec dword[eax]
2139
		mov edi,eax
2140
		stdcall mem_copy,txt_buf,eax,capt_offs
2141
		add edi,capt_offs
2142
		call str_next_val
2143
		call str_next_val
2144
		stdcall make_list_capts,txt_buf,edi
2145
		stdcall mem_copy,eax,txt_buf,32 ;capt_offs
2146
		call redraw_pole
2147
		stdcall [tl_draw],tree1
2148
	.end_f:
2149
	ret
2150
endp
2151
 
2152
;сдвиг объекта вправо
2153
align 4
2154
proc but_mov_r uses eax edi
2155
	cmp byte[tim_ch],0
2156
	jne .end_f
2157
	stdcall [tl_node_get_data], tree1
2158
	pop eax
2159
	test eax,eax
2160
	jz .end_f
2161
		inc dword[eax]
2162
		mov edi,eax
2163
		stdcall mem_copy,txt_buf,eax,capt_offs
2164
		add edi,capt_offs
2165
		call str_next_val
2166
		call str_next_val
2167
		stdcall make_list_capts,txt_buf,edi
2168
		stdcall mem_copy,eax,txt_buf,32 ;capt_offs
2169
		call redraw_pole
2170
		stdcall [tl_draw],tree1
2171
	.end_f:
2172
	ret
2173
endp
2174
 
2175
align 4
2176
proc but_mov_u uses eax edi
2177
	cmp byte[tim_ch],0
2178
	jne .end_f
2179
	stdcall [tl_node_get_data], tree1
2180
	pop eax
2181
	test eax,eax
2182
	jz .end_f
2183
		cmp dword[eax+4],1
2184
		jle .end_f
2185
		dec dword[eax+4]
2186
		mov edi,eax
2187
		stdcall mem_copy,txt_buf,eax,capt_offs
2188
		add edi,capt_offs
2189
		call str_next_val
2190
		call str_next_val
2191
		stdcall make_list_capts,txt_buf,edi
2192
		stdcall mem_copy,eax,txt_buf,32 ;capt_offs
2193
		call redraw_pole
2194
		stdcall [tl_draw],tree1
2195
	.end_f:
2196
	ret
2197
endp
2198
 
2199
align 4
2200
proc but_mov_d uses eax edi
2201
	cmp byte[tim_ch],0
2202
	jne .end_f
2203
	stdcall [tl_node_get_data], tree1
2204
	pop eax
2205
	test eax,eax
2206
	jz .end_f
2207
		inc dword[eax+4]
2208
		mov edi,eax
2209
		stdcall mem_copy,txt_buf,eax,capt_offs
2210
		add edi,capt_offs
2211
		call str_next_val
2212
		call str_next_val
2213
		stdcall make_list_capts,txt_buf,edi
2214
		stdcall mem_copy,eax,txt_buf,32 ;capt_offs
2215
		call redraw_pole
2216
		stdcall [tl_draw],tree1
2217
	.end_f:
2218
	ret
2219
endp
2220
 
2221
;установка обычного режима, без рисования
2222
align 4
2223
proc but_set_none
2224
	mov byte[pen_mode],0
2482 IgorA 2225
	cmp [cursor_pointer],0
2226
	je @f
2227
		push eax ebx ecx
2228
		mcall 37,6,[cursor_pointer]
2229
		pop ecx ebx eax
2230
	@@:
2462 IgorA 2231
	ret
2232
endp
2233
 
2487 IgorA 2234
;hot_p - координаты горячей точки курсора, смещенные на бит 16 ((cx shl 8) + cy) shl 16
2462 IgorA 2235
align 4
2487 IgorA 2236
proc set_pen_mode uses eax ebx ecx edx, mode:dword, icon:dword, hot_p:dword
2482 IgorA 2237
	mov eax,[mode]
2238
	cmp byte[pen_mode],al
2239
	je @f
2240
		mov byte[pen_mode],al
2487 IgorA 2241
		mov edx,[hot_p]
2242
		mov dx,2 ;LOAD_INDIRECT
2482 IgorA 2243
		mov ecx,[icon]
2244
		shl ecx,12 ;умножаем на 4 кб
2245
		add ecx,[buf_curs.data]
2246
		mcall 37,4
2462 IgorA 2247
 
2482 IgorA 2248
		cmp eax,0
2249
		je @f
2250
			mov [cursor_pointer],eax
2251
			mcall 37,5,[cursor_pointer]
2252
	@@:
2462 IgorA 2253
	ret
2254
endp
2255
 
2256
;данные для диалога открытия файлов
2257
align 4
2258
OpenDialog_data:
2259
.type			dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
2260
.procinfo		dd procinfo	;+4
2261
.com_area_name		dd communication_area_name	;+8
2262
.com_area		dd 0	;+12
2263
.opendir_path		dd plugin_path	;+16
2264
.dir_default_path	dd default_dir ;+20
2265
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
2266
.draw_window		dd draw_window	;+28
2267
.status 		dd 0	;+32
2268
.openfile_path		dd openfile_path	;+36 путь к открываемому файлу
2269
.filename_area		dd filename_area	;+40
2270
.filter_area		dd Filter
2271
.x:
2272
.x_size 		dw 420 ;+48 ; Window X size
2273
.x_start		dw 10 ;+50 ; Window X position
2274
.y:
2275
.y_size 		dw 320 ;+52 ; Window y size
2276
.y_start		dw 10 ;+54 ; Window Y position
2277
 
2278
default_dir db '/rd/1',0
2279
 
2280
communication_area_name:
2281
	db 'FFFFFFFF_open_dialog',0
2282
open_dialog_name:
2283
	db 'opendial',0
2284
communication_area_default_path:
2285
	db '/rd/1/File managers/',0
2286
 
2287
Filter:
2288
dd Filter.end - Filter ;.1
2289
.1:
2290
db 'TXT',0
2291
db 'ASM',0
2292
.end:
2293
db 0
2294
 
2295
include 'le_libs.inc'
2296
 
2297
mouse_dd dd 0x0
2298
sc system_colors
2299
last_time dd 0
2300
 
2301
 
2302
 
2303
align 16
2304
procinfo process_information
2305
 
2306
align 4
2307
buf_0: dd 0 ;
2308
.l: dw 170 ;+4 left
2309
.t: dw panel_1_coord_top ;+6 top
2507 IgorA 2310
.w: dd 395 ;+8 w
2462 IgorA 2311
.h: dd 340 ;+12 h
2312
.color: dd 0 ;+16 color
2313
	db 24 ;+20 bit in pixel
2314
 
2315
align 4
2316
buf_font: ;буфер со шрифтом
2317
	dd 0 ;указатель на буфер изображения
2318
	dw 25 ;+4 left
2319
	dw 25 ;+6 top
2320
	dd 96 ;+8 w
2321
	dd 144 ;+12 h
2322
	dd 0 ;+16 color
2323
	db 24 ;+20 bit in pixel
2324
 
2482 IgorA 2325
align 4
2326
buf_curs: ;буфер с курсорами
2327
.data: dd 0 ;указатель на буфер изображения
2328
	dw 0 ;+4 left
2329
	dw 0 ;+6 top
2330
	dd 32 ;+8 w
2331
	dd 32*cursors_count ;+12 h
2332
	dd 0 ;+16 color
2333
	db 24 ;+20 bit in pixel
2334
 
2335
align 4
2336
buf_curs_8: ;буфер с курсорами
2337
.data: dd 0 ;указатель на буфер изображения
2338
	dw 0 ;+4 left
2339
	dw 0 ;+6 top
2340
	dd 32 ;+8 w
2341
	dd 32*cursors_count ;+12 h
2342
	dd 0 ;+16 color
2343
	db 24 ;+20 bit in pixel
2344
 
2345
cursor_pointer dd 0 ;указатель на данные для курсора
2346
 
2462 IgorA 2347
el_focus dd 0
2348
tree1 tree_list 32,points_max+2, tl_key_no_edit, 16,16,\
2487 IgorA 2349
    0x8080ff,0x0000ff,0xffffff, 5,panel_3_coord_top+85,145,170, 0,capt_offs,0,\
2350
    el_focus, wScr1,0
2351
tree2 tree_list el_offs_col-el_offs_nam,100+2, tl_key_no_edit+tl_list_box_mode, 16,16,\
2352
    0x8080ff,0x0000ff,0xffffff, 5,panel_3_coord_top,145,80, 0,0,0,\
2353
    el_focus, wScr2,0
2354
 
2462 IgorA 2355
align 4
2487 IgorA 2356
wScr1:
2462 IgorA 2357
.x:
2358
.size_x     dw 16 ;+0
2359
.start_x    dw 0 ;+2
2360
.y:
2361
.size_y     dw 150 ;+4
2362
.start_y    dw 0 ;+6
2363
.btn_high   dd 15 ;+8
2364
.type	    dd 1  ;+12
2365
.max_area   dd 100  ;+16
2366
.cur_area   dd 30  ;+20
2367
.position   dd 0  ;+24
2368
.bckg_col   dd 0xeeeeee ;+28
2369
.frnt_col   dd 0xbbddff ;+32
2370
.line_col   dd 0  ;+36
2371
.redraw     dd 0  ;+40
2372
.delta	    dw 0  ;+44
2373
.delta2     dw 0  ;+46
2374
.run_x:
2375
.r_size_x   dw 0  ;+48
2376
.r_start_x  dw 0  ;+50
2377
.run_y:
2378
.r_size_y   dw 0 ;+52
2379
.r_start_y  dw 0 ;+54
2380
.m_pos	    dd 0 ;+56
2381
.m_pos_2    dd 0 ;+60
2382
.m_keys     dd 0 ;+64
2383
.run_size   dd 0 ;+68
2384
.position2  dd 0 ;+72
2385
.work_size  dd 0 ;+76
2386
.all_redraw dd 0 ;+80
2387
.ar_offset  dd 1 ;+84
2388
 
2389
align 4
2487 IgorA 2390
wScr2:
2391
.x:
2392
.size_x     dw 16 ;+0
2393
.start_x    dw 0 ;+2
2394
.y:
2395
.size_y     dw 150 ;+4
2396
.start_y    dw 0 ;+6
2397
.btn_high   dd 15 ;+8
2398
.type	    dd 1  ;+12
2399
.max_area   dd 100  ;+16
2400
.cur_area   dd 30  ;+20
2401
.position   dd 0  ;+24
2402
.bckg_col   dd 0xeeeeee ;+28
2403
.frnt_col   dd 0xbbddff ;+32
2404
.line_col   dd 0  ;+36
2405
.redraw     dd 0  ;+40
2406
.delta	    dw 0  ;+44
2407
.delta2     dw 0  ;+46
2408
.run_x:
2409
.r_size_x   dw 0  ;+48
2410
.r_start_x  dw 0  ;+50
2411
.run_y:
2412
.r_size_y   dw 0 ;+52
2413
.r_start_y  dw 0 ;+54
2414
.m_pos	    dd 0 ;+56
2415
.m_pos_2    dd 0 ;+60
2416
.m_keys     dd 0 ;+64
2417
.run_size   dd 0 ;+68
2418
.position2  dd 0 ;+72
2419
.work_size  dd 0 ;+76
2420
.all_redraw dd 0 ;+80
2421
.ar_offset  dd 1 ;+84
2422
 
2423
align 4
2462 IgorA 2424
proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n:dword
2425
	mov esi,dword[str2]
2426
	mov ecx,dword[n]
2427
	mov edi,dword[str1]
2428
	stdcall str_len,edi
2429
	add edi,eax
2430
	cld
2431
	repne movsb
2432
	mov byte[edi],0
2433
	ret
2434
endp
2435
 
2436
align 4
2437
proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
2438
	mov esi,dword[str2]
2439
	stdcall str_len,esi
2440
	mov ecx,eax
2441
	inc ecx
2442
	mov edi,dword[str1]
2443
	stdcall str_len,edi
2444
	add edi,eax
2445
	cld
2446
	repne movsb
2447
	ret
2448
endp
2449
 
2450
;output:
2451
; eax = strlen
2452
align 4
2453
proc str_len, str1:dword
2454
	mov eax,[str1]
2455
	@@:
2456
		cmp byte[eax],0
2457
		je @f
2458
		inc eax
2459
		jmp @b
2460
	@@:
2461
	sub eax,[str1]
2462
	ret
2463
endp
2464
 
2465
;input:
2466
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
2467
;output:
2468
; eax - число
2469
align 4
2470
proc conv_str_to_int, buf:dword
2471
	xor eax,eax
2472
	push ebx ecx esi
2473
	xor ebx,ebx
2474
	mov esi,[buf]
2475
 
2476
	;на случай если перед числом находятся пробелы
2477
	@@:
2478
	cmp byte[esi],' '
2479
	jne @f
2480
		inc esi
2481
		jmp @b
2482
	@@:
2483
 
2484
	;определение отрицательных чисел
2485
	xor ecx,ecx
2486
	inc ecx
2487
	cmp byte[esi],'-'
2488
	jne @f
2489
		dec ecx
2490
		inc esi
2491
	@@:
2492
 
2493
	cmp word[esi],'0x'
2494
	je .load_digit_16
2495
 
2496
	.load_digit_10: ;считывание 10-тичных цифр
2497
		mov bl,byte[esi]
2498
		cmp bl,'0'
2499
		jl @f
2500
		cmp bl,'9'
2501
		jg @f
2502
			sub bl,'0'
2503
			imul eax,10
2504
			add eax,ebx
2505
			inc esi
2506
			jmp .load_digit_10
2507
	jmp @f
2508
 
2509
	.load_digit_16: ;считывание 16-ричных цифр
2510
		add esi,2
2511
	.cycle_16:
2512
		mov bl,byte[esi]
2513
		cmp bl,'0'
2514
		jl @f
2515
		cmp bl,'f'
2516
		jg @f
2517
		cmp bl,'9'
2518
		jle .us1
2519
			cmp bl,'A'
2520
			jl @f ;отсеиваем символы >'9' и <'A'
2521
		.us1: ;составное условие
2522
		cmp bl,'F'
2523
		jle .us2
2524
			cmp bl,'a'
2525
			jl @f ;отсеиваем символы >'F' и <'a'
2526
			sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
2527
		.us2: ;составное условие
2528
			sub bl,'0'
2529
			cmp bl,9
2530
			jle .cor1
2531
				sub bl,7 ;convert 'A' to '10'
2532
			.cor1:
2533
			shl eax,4
2534
			add eax,ebx
2535
			inc esi
2536
			jmp .cycle_16
2537
	@@:
2538
	cmp ecx,0 ;если число отрицательное
2539
	jne @f
2540
		sub ecx,eax
2541
		mov eax,ecx
2542
	@@:
2543
	pop esi ecx ebx
2544
	ret
2545
endp
2546
 
2547
;этот код не мой, он преобразует число в строку
2548
;input:
2549
; eax = value
2550
; edi = string buffer
2551
;output:
2552
align 4
2507 IgorA 2553
proc convert_int_to_str uses eax ecx edx edi
2554
	mov dword[edi+1],0
2555
	call .str
2462 IgorA 2556
	ret
2507 IgorA 2557
endp
2462 IgorA 2558
 
2559
align 4
2560
.str:
2507 IgorA 2561
	mov ecx,0x0a ;задается система счисления изменяются регистры eax,ecx,edx входные параметры eax - число
2462 IgorA 2562
    ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
2563
	cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
2564
	jb @f
2565
		xor edx,edx  ;очистить edx
2566
		div ecx      ;разделить - остаток в edx
2567
		push edx     ;положить в стек
2568
		;dec edi             ;смещение необходимое для записи с конца строки
2569
		call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
2570
		pop eax
2571
	@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
2507 IgorA 2572
	or al,0x30  ;данная команда короче чем две выше
2462 IgorA 2573
	stosb	    ;записать элемент из регистра al в ячеку памяти es:edi
2574
	ret	      ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
2575
 
2576
i_end:
2577
	rb 1024
2578
stacktop:
2579
	sys_path rb 1024
2580
	file_name:
2581
		rb 1024 ;4096
2582
	library_path rb 1024
2583
	plugin_path rb 4096
2584
	openfile_path rb 4096
2585
	filename_area rb 256
2586
mem: