Subversion Repositories Kolibri OS

Rev

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