Subversion Repositories Kolibri OS

Rev

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