Subversion Repositories Kolibri OS

Rev

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

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