Subversion Repositories Kolibri OS

Rev

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