diff --git a/programs/media/log_el/docs/about.png b/programs/media/log_el/docs/about.png
new file mode 100644
index 0000000000..3fef1926bb
Binary files /dev/null and b/programs/media/log_el/docs/about.png differ
diff --git a/programs/media/log_el/docs/mn4bit.png b/programs/media/log_el/docs/mn4bit.png
new file mode 100644
index 0000000000..c8899c8696
Binary files /dev/null and b/programs/media/log_el/docs/mn4bit.png differ
diff --git a/programs/media/log_el/docs/readme.htm b/programs/media/log_el/docs/readme.htm
new file mode 100644
index 0000000000..aef9f5c774
--- /dev/null
+++ b/programs/media/log_el/docs/readme.htm
@@ -0,0 +1,122 @@
+
+
+╬уыртыхэшх
+
+
+
+
+
+╦юушўхёъшх ¤ыхьхэЄ√ тхЁёш юЄ 15.03.2012
+╬уыртыхэшх
+
+
+╬ яЁюуЁрььх
+╧ЁюуЁрььр фы ьюфхышЁютрэш ш яЁюёьюЄЁр ыюушўхёъшї ёїхь. ╦юушўхёъшх ёїхь√ ёюёЄю Є шч ыюушўхёъшї ¤ыхьхэЄют, ш ЁрёўшЄрэ√ эр ЁрсюЄє ё фтєь тшфрьш ёшуэрыют 0 ш 1.
+ ═хъюЄюЁ√х шч ЇєэъЎшщ яЁюуЁрьь√ яюър х∙х эх ёфхырэ√.
+ ╦шЎхэчш ётюсюфэр .
+
+┬эх°эшщ тшф яЁюуЁрьь√.
+
+
+╬ЄъЁ√Єшх Їрщыют
+╤їхь√ їЁрэ Єё т ЄхъёЄютюь тшфх, юЄъЁ√трЄ№ шї ьюцэю ўхЁхч ъэюяъє ё яюью∙№■ фшрыюуютюую юъэр.
+
+╟ряєёъ / ╬ёЄрэютър / ╙яЁртыхэшх
+╧юёых юЄъЁ√Єш ёїхь√ фы яЁюёьюЄЁр хх ЁрсюЄ√ эєцэю эрцрЄ№ ъэюяъє чряєёър . ╬ёЄрэютър ьюфхышЁютрэш фхырхЄё Єющ цх ёрьющ ъэюяъющ. ╧юёых чряєёър ёїхьр эрўшэрхЄ ЁрсюЄрЄ№ (ьюуєЄ фтшурЄ№ё Ёрчэ√х ёшуэры√). ─ы єяЁртыхэш ЁрсюЄющ ёїхь√ яЁхфєёьюЄЁхэ√ юс·хъЄ√ эрфяшёхщ. ┼ёыш эрфяшё№ ёючфртрырё№ эх ъръ шэЇюЁьрЎшюээр Єю яюы№чютрЄхы№ ьюцхЄ т√сЁрЄ№ Єръє■ эрфяшё№ т ёяшёъх ш ъэюяърьш ш юяЁхфхы Є№ ъръющ шч ёшуэрыют яюфртрЄ№ (0 шыш 1) эр Єю ьхёЄю ёїхь√, уфх эрїюфшЄё фрээр эрфяшё№.
+
+╨хфръЄшЁютрэшх
+╬яшёрэшх ъэюяюъ фы ЁхфръЄшЁютрэш :
+ - ёсЁюё Ёхцшьр Ёшёютрэш яЁютюфют
+ - єёЄрэютър Ёхцшьр Ёшёютрэш яЁютюфют
+ - єёЄрэютър Ёхцшьр Ёшёютрэш Єюўхъ фы яЁютюфют схч яхЁхёхўхэшщ
+ - єёЄрэютър Ёхцшьр ёЄшЁрэш яЁютюфют
+╨хфръЄшЁютрэшх ьэюушї юс·хъЄют х∙х эх ёфхырэю :( ... ╧юър ьюцэю ЁхфръЄшЁютрЄ№ Їрщы√ ёю ёїхьрьш ЄхъёЄют√ьш ЁхфръЄюЁрьш, эю ¤Єю эх єфюсэю. ╧юЄюьє ёючфрэшх эют√ї ёїхь ёхщўрё яЁюсыхьрЄшўэю.
+
+╤юїЁрэхэшх
+─ы ёюїЁрэхэш ёїхь√ эрцьшЄх эр ъэюяъє ёюїЁрэхэш .
+
+
+╤їхьр фы яхЁхьэюцхэш 4 сшЄэ√ї ўшёхы:
+
+═р Ёшёєэъх ўшёыю a (a0+a1 = 1+2 = 3) єьэюцрхЄё эр b (b1+b3 = 2+8 = 10) ш эр т√їюфх яюыєўрхЄё c (c1+c2+c3+c4 = 2+4+8+16 = 30).
+
+
+┬ Їрщырї ёю ёїхьрьш хёЄ№ 4 тшфр юс·хъЄют.
+
+
+╩ы■ўхтр Єюўър ¤Єю яЁюьхцєЄюўэ√щ юс·хъЄ, ъюЄюЁ√щ ёыєцшЄ фы ёючфрэш яЁютюфют. ╩ы■ўхтр Єюўър ёюёЄюшЄ шч 2-ї ъююЁфшэрЄ ш яхЁхьхээющ эряЁртыхэшщ. ═ряЁртыхэшщ ьюцхЄ с√Є№ ьръёшьєь 4 (ттхЁї, тэшч, тыхтю, тяЁртю). ╬эш юяЁхфхы ■Є т ъръє■ ёЄюЁюэє юЄ фрэющ Єюўъш ЁшёютрЄ№ яЁютюф. ╧Ёш тёЄЁхўх фЁєующ ъы■ўхтющ Єюўъш шыш фюёЄшцхэшш ъюэЎр ёїхь√ Ёшёютрэшх яЁютюфр яЁхъЁр∙рхЄё . ╥ръшь юсЁрчюь ъы■ўхт√х Єюўъш ¤Єю тхъЄюЁэ√х юс·хъЄ√ эр юёэютх ъюЄюЁ√ї Ёшёє■Єё яЁютюфр, ўЄю яючтюы хЄ єьхэ№°шЄ№ ЁрчьхЁ Їрщыр ёю ёїхьющ.
+
+
+┬ёх яЁютюфр ъюЄюЁ√х яхЁхёхър■Єё эр ёїхьх ёўшЄр■Єё ёюхфшэхээ√ьш ьхцфє ёюсющ. ┼ёыш тючэшърхЄ эхюсїюфшьюёЄ№ ёючфрЄ№ яхЁхёхър■∙шхё эю эх ёюхфшэхээ√х яЁютюфр шёяюы№чєхЄё юс·хъЄ яЁютюфр схч яхЁхёхўхэш .
+
+
+╦юуўхёъшх ¤ыхьхэЄ√ ¤Єю ёїхь√ ъюЄюЁ√х шьх■Є тїюф√ ш т√їюф√. ╦юушўхёъшщ ¤ыхьхэЄ рэрышчшЁєхЄ ёшуэры√ ъюЄюЁ√х яюёЄєяр■Є хьє эр тїюф√ ш т чртшёшьюёЄш юЄ эшї ЇюЁьшЁєхЄ ёшуэры√ эр т√їюфрї. ═р ёїхьх юэш Ёшёє■Єё яЁ ьюєуюы№эшърьш ё тїюфэ√ьш ш т√їюфэ√ьш эюурьш. ╦■сє■ ыюушўхёъє■ ёїхьє ьюцэю ёюёЄртшЄ№ шч 3-ї юёэютэ√ї ыюушўхёъшї ¤ыхьхэЄют: "эх", "ш", "шыш". ═шсюыхх ЁрёяЁюёЄЁрэхээ√х ыюушўхёъшх ¤ыхьхэЄ√ ьюфхышЁє■Єё яЁюуЁрььющ, ёЁхфш эшї: "эх", "ш", "шыш", "шёъы■ўр■∙хх шыш" ш "ёєььрЄюЁ". ╩рцф√щ тшф ыюушўхёъюую ¤ыхьхэЄр т яЁюуЁрььх шьххЄ ётющ ЎтхЄ (їюЄ яю яЁртшырь Ёшёютрэш ыюушўхёъшї ёїхь тёх ¤ыхьхэЄ√ Ёшёє■Єё ўхЁэю схы√ьш).
+
+
+═рфяшёш с√тр■Є 2-ї тшфют: шэЇюЁьршюээ√х ш єяЁрты хь√х. ╚эЇюЁьрЎшюээ√х ёыєцрЄ фы яюфяшёхщ юяЁхфхыхээ√ї ўрёЄхщ ёїхь√. └ ўхЁхч єяЁрты хьє■ эрфяшё№ ьюцэю яюфртрЄ№ эр ёїхьє ёшуэры√ 0 шыш 1.
+
+└тЄюЁ
+╚уюЁ№ └. (IgorA) - ЁрчЁрсюЄър яЁюуЁрьь√.
+
+
+
\ No newline at end of file
diff --git a/programs/media/log_el/docs/tb_0.png b/programs/media/log_el/docs/tb_0.png
new file mode 100644
index 0000000000..b5e8db070a
Binary files /dev/null and b/programs/media/log_el/docs/tb_0.png differ
diff --git a/programs/media/log_el/docs/tb_1.png b/programs/media/log_el/docs/tb_1.png
new file mode 100644
index 0000000000..abb066fde0
Binary files /dev/null and b/programs/media/log_el/docs/tb_1.png differ
diff --git a/programs/media/log_el/docs/tb_cursor.png b/programs/media/log_el/docs/tb_cursor.png
new file mode 100644
index 0000000000..05348c2f64
Binary files /dev/null and b/programs/media/log_el/docs/tb_cursor.png differ
diff --git a/programs/media/log_el/docs/tb_eraser.png b/programs/media/log_el/docs/tb_eraser.png
new file mode 100644
index 0000000000..839b0bda70
Binary files /dev/null and b/programs/media/log_el/docs/tb_eraser.png differ
diff --git a/programs/media/log_el/docs/tb_open.png b/programs/media/log_el/docs/tb_open.png
new file mode 100644
index 0000000000..f8e086b0d1
Binary files /dev/null and b/programs/media/log_el/docs/tb_open.png differ
diff --git a/programs/media/log_el/docs/tb_pen_1.png b/programs/media/log_el/docs/tb_pen_1.png
new file mode 100644
index 0000000000..815a8649b0
Binary files /dev/null and b/programs/media/log_el/docs/tb_pen_1.png differ
diff --git a/programs/media/log_el/docs/tb_pen_2.png b/programs/media/log_el/docs/tb_pen_2.png
new file mode 100644
index 0000000000..f6ecf4dea8
Binary files /dev/null and b/programs/media/log_el/docs/tb_pen_2.png differ
diff --git a/programs/media/log_el/docs/tb_run.png b/programs/media/log_el/docs/tb_run.png
new file mode 100644
index 0000000000..08dc68e69e
Binary files /dev/null and b/programs/media/log_el/docs/tb_run.png differ
diff --git a/programs/media/log_el/docs/tb_save.png b/programs/media/log_el/docs/tb_save.png
new file mode 100644
index 0000000000..a709a2b8da
Binary files /dev/null and b/programs/media/log_el/docs/tb_save.png differ
diff --git a/programs/media/log_el/trunk/and_2.txt b/programs/media/log_el/trunk/and_2.txt
new file mode 100644
index 0000000000..d4e9b3cffc
--- /dev/null
+++ b/programs/media/log_el/trunk/and_2.txt
@@ -0,0 +1,9 @@
+size 80 60
+elements 1
+ 24 24 0 and[2]
+captions 3
+ 10 8 z x1
+ 10 44 z x2
+ 56 26 n y1
+points 4
+ 10 25 9 10 27 3 10 44 8 56 26 4
diff --git a/programs/media/log_el/trunk/and_3.txt b/programs/media/log_el/trunk/and_3.txt
new file mode 100644
index 0000000000..d6fc1c6623
--- /dev/null
+++ b/programs/media/log_el/trunk/and_3.txt
@@ -0,0 +1,10 @@
+size 80 60
+elements 1
+ 24 24 0 and[3]
+captions 4
+ 10 8 z x1
+ 10 44 z x2
+ 30 44 z x3
+ 56 27 n y1
+points 5
+ 10 25 9 10 27 3 10 44 8 56 27 4 22 44 9
diff --git a/programs/media/log_el/trunk/build_ru.bat b/programs/media/log_el/trunk/build_ru.bat
new file mode 100644
index 0000000000..8310508924
--- /dev/null
+++ b/programs/media/log_el/trunk/build_ru.bat
@@ -0,0 +1,9 @@
+if not exist bin mkdir bin
+if not exist bin\font6x9.bmp @copy ..\..\..\fs\kfar\trunk\font6x9.bmp bin\font6x9.bmp
+@copy *.png bin\*.png
+@copy *.txt bin\*.txt
+@fasm.exe -m 16384 log_el.asm bin\log_el.kex
+@kpack bin\log_el.kex
+if not exist bin\buf2d.obj @fasm.exe -m 16384 ..\..\..\develop\libraries\buf2d\trunk\buf2d.asm bin\buf2d.obj
+@kpack bin\buf2d.obj
+pause
diff --git a/programs/media/log_el/trunk/calc.txt b/programs/media/log_el/trunk/calc.txt
new file mode 100644
index 0000000000..87d735c03b
--- /dev/null
+++ b/programs/media/log_el/trunk/calc.txt
@@ -0,0 +1,60 @@
+size 168 108
+elements 19
+ 67 33 0 or[2]
+ 67 39 0 or[2]
+ 67 11 0 or[2]
+ 67 5 0 or[2]
+ 81 15 0 sm[1]
+ 81 25 0 sm[1]
+121 44 0 and[3]
+121 52 0 and[3]
+121 60 0 and[3]
+121 68 0 and[3]
+121 76 0 and[3]
+121 92 0 and[3]
+121 84 0 and[3]
+ 94 19 0 not
+101 29 0 not
+ 94 29 0 not
+101 19 0 not
+ 94 15 0 not
+101 15 0 not
+captions 8
+ 11 14 z a1
+ 27 14 z a2
+ 43 14 o a3
+ 11 44 z b1
+ 27 44 o b2
+ 43 44 z b3
+146 44 n 0
+146 92 n 6
+points 105
+ 63 36 3 61 40 3 107 45 11 65 6 4 63 42 11 57 6 3
+ 65 40 4 65 36 4 65 42 4 61 12 3 65 12 4 65 8 4
+ 63 8 3 109 77 11 111 79 11 79 13 6 79 23 8 119 65 4
+111 87 9 146 55 4 75 41 12 119 77 4 75 7 6 99 27 9
+ 75 26 1 77 28 3 119 93 4 117 89 9 63 14 1 119 81 4
+119 89 4 119 87 4 119 79 4 73 31 9 75 31 6 73 18 1
+113 95 9 90 26 8 109 93 9 119 95 4 99 13 3 111 27 6
+115 33 6 90 20 1 43 14 2 43 16 9 63 16 12 27 20 9
+ 27 14 2 113 71 11 119 69 4 61 20 12 57 22 12 11 22 9
+ 11 14 2 43 44 2 43 46 9 63 46 12 61 50 12 27 50 9
+ 27 44 2 11 44 2 11 52 9 57 52 12 99 33 9 57 34 3
+119 97 4 115 97 9 146 87 4 111 55 11 109 16 4 146 79 4
+119 49 4 115 49 11 119 47 4 119 57 4 117 57 11 117 30 6
+119 61 4 146 63 4 146 71 4 119 85 4 119 73 4 146 47 4
+107 61 11 146 95 4 119 55 4 119 53 4 113 20 6 119 45 4
+117 73 11 119 71 4 115 81 11 107 69 9 111 47 11 107 53 11
+ 90 16 1 115 65 11 90 23 4 109 85 11 90 30 1 119 63 4
+107 13 2 113 63 11 77 35 4
+subpoints 74
+ 63 40 63 12 75 18 61 16 57 20 57 16 61 46 57 50
+ 57 46 75 35 75 13 117 49 113 47 107 20 109 20 107 27
+109 27 107 30 115 47 109 30 111 30 113 30 117 55 115 55
+113 55 109 53 111 53 113 53 115 53 113 33 111 33 109 33
+107 33 117 65 115 63 117 63 109 61 111 61 113 61 115 61
+115 71 117 71 117 69 115 69 113 69 111 69 109 69 117 53
+117 81 113 79 115 79 117 79 111 77 113 77 115 77 115 93
+113 93 115 95 117 61 117 87 117 85 115 85 115 87 113 87
+113 85 111 85 117 77 117 47 109 45 111 45 113 45 115 45
+117 45 107 16
diff --git a/programs/media/log_el/trunk/dll.inc b/programs/media/log_el/trunk/dll.inc
new file mode 100644
index 0000000000..5f13fbbc16
--- /dev/null
+++ b/programs/media/log_el/trunk/dll.inc
@@ -0,0 +1,99 @@
+
+proc dll.Load, import_table:dword
+ mov esi,[import_table]
+ .next_lib: mov edx,[esi]
+ or edx,edx
+ jz .exit
+ push esi
+ mov esi,[esi+4]
+ mov edi,s_libdir.fname
+ @@: lodsb
+ stosb
+ or al,al
+ jnz @b
+ mcall 68,19,s_libdir
+ or eax,eax
+ jz .fail
+ stdcall dll.Link,eax,edx
+ push eax
+ mov eax, [eax]
+ cmp dword [eax], 'lib_'
+ pop eax
+ jnz @f
+ stdcall dll.Init,[eax+4]
+ @@:
+ pop esi
+ add esi,8
+ jmp .next_lib
+ .exit: xor eax,eax
+ ret
+ .fail: add esp,4
+ xor eax,eax
+ inc eax
+ ret
+endp
+
+proc dll.Link, exp:dword,imp:dword
+ push eax
+ mov esi,[imp]
+ test esi,esi
+ jz .done
+ .next: lodsd
+ test eax,eax
+ jz .done
+ stdcall dll.GetProcAddress,[exp],eax
+ or eax,eax
+ jz @f
+ mov [esi-4],eax
+ jmp .next
+ @@: mov dword[esp],0
+ .done: pop eax
+ ret
+endp
+
+proc dll.Init, dllentry:dword
+ pushad
+ mov eax,mem.Alloc
+ mov ebx,mem.Free
+ mov ecx,mem.ReAlloc
+ mov edx,dll.Load
+ stdcall [dllentry]
+ popad
+ ret
+endp
+
+proc dll.GetProcAddress, exp:dword,sz_name:dword
+ mov edx,[exp]
+ xor eax,eax
+ .next: or edx,edx
+ jz .end
+ cmp dword[edx],0
+ jz .end
+ stdcall strcmp,[edx],[sz_name]
+ test eax,eax
+ jz .ok
+ add edx,8
+ jmp .next
+ .ok: mov eax,[edx+4]
+ .end: ret
+endp
+
+proc strcmp, str1:dword,str2:dword
+ push esi edi
+ mov esi,[str1]
+ mov edi,[str2]
+ xor eax,eax
+ @@: lodsb
+ scasb
+ jne .fail
+ or al,al
+ jnz @b
+ jmp .ok
+ .fail: or eax,-1
+ .ok: pop edi esi
+ ret
+endp
+
+s_libdir:
+ db '/sys/lib/'
+ .fname rb 32
diff --git a/programs/media/log_el/trunk/le_libs.inc b/programs/media/log_el/trunk/le_libs.inc
new file mode 100644
index 0000000000..27c548c540
--- /dev/null
+++ b/programs/media/log_el/trunk/le_libs.inc
@@ -0,0 +1 @@
+;include 'load_lib.mac'
;include 'mem.inc'
;include 'dll.inc'
;@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
head_f_i:
head_f_l db 'Системная ошибка',0
system_dir_0 db '/sys/lib/'
lib_name_0 db 'proc_lib.obj',0
err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
system_dir_1 db '/sys/lib/'
lib_name_1 db 'libimg.obj',0
err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
system_dir_2 db '/sys/lib/'
lib_name_2 db 'box_lib.obj',0
err_message_found_lib_2 db 'Не найдена библиотека ',39,'box_lib.obj',39,0
err_message_import_2 db 'Ошибка при импорте библиотеки ',39,'box_lib.obj',39,0
system_dir_7 db '/sys/lib/'
lib_name_7 db 'buf2d.obj',0
err_msg_found_lib_7 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
err_msg_import_7 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
l_libs_start:
lib0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i
lib1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i
lib2 l_libs lib_name_2, sys_path, file_name, system_dir_2,\
err_message_found_lib_2, head_f_l, import_box_lib, err_message_import_2, head_f_i
lib_7 l_libs lib_name_7, sys_path, library_path, system_dir_7,\
err_msg_found_lib_7,head_f_l,import_buf2d,err_msg_import_7,head_f_i
l_libs_end:
align 4
proclib_import: ;описание экспортируемых функций
OpenDialog_Init dd aOpenDialog_Init
OpenDialog_Start dd aOpenDialog_Start
dd 0,0
aOpenDialog_Init db 'OpenDialog_init',0
aOpenDialog_Start db 'OpenDialog_start',0
align 4
import_libimg:
dd alib_init1
img_is_img dd aimg_is_img
img_info dd aimg_info
img_from_file dd aimg_from_file
img_to_file dd aimg_to_file
img_from_rgb dd aimg_from_rgb
img_to_rgb dd aimg_to_rgb
img_to_rgb2 dd aimg_to_rgb2
img_decode dd aimg_decode
img_encode dd aimg_encode
img_create dd aimg_create
img_destroy dd aimg_destroy
img_destroy_layer dd aimg_destroy_layer
img_count dd aimg_count
img_lock_bits dd aimg_lock_bits
img_unlock_bits dd aimg_unlock_bits
img_flip dd aimg_flip
img_flip_layer dd aimg_flip_layer
img_rotate dd aimg_rotate
img_rotate_layer dd aimg_rotate_layer
img_draw dd aimg_draw
dd 0,0
alib_init1 db 'lib_init',0
aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
aimg_info db 'img_info',0
aimg_from_file db 'img_from_file',0
aimg_to_file db 'img_to_file',0
aimg_from_rgb db 'img_from_rgb',0
aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB
aimg_to_rgb2 db 'img_to_rgb2',0
aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных
aimg_encode db 'img_encode',0
aimg_create db 'img_create',0
aimg_destroy db 'img_destroy',0
aimg_destroy_layer db 'img_destroy_layer',0
aimg_count db 'img_count',0
aimg_lock_bits db 'img_lock_bits',0
aimg_unlock_bits db 'img_unlock_bits',0
aimg_flip db 'img_flip',0
aimg_flip_layer db 'img_flip_layer',0
aimg_rotate db 'img_rotate',0
aimg_rotate_layer db 'img_rotate_layer',0
aimg_draw db 'img_draw',0
align 4
import_box_lib:
dd alib_init2 ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна
edit_box_draw dd aEdit_box_draw
edit_box_key dd aEdit_box_key
edit_box_mouse dd aEdit_box_mouse
; version_ed dd aVersion_ed
check_box_draw dd aCheck_box_draw
check_box_mouse dd aCheck_box_mouse
; version_ch dd aVersion_ch
; option_box_draw dd aOption_box_draw
; option_box_mouse dd aOption_box_mouse
; version_op dd aVersion_op
scrollbar_ver_draw dd aScrollbar_ver_draw
; scrollbar_ver_mouse dd aScrollbar_ver_mouse
scrollbar_hor_draw dd aScrollbar_hor_draw
; scrollbar_hor_mouse dd aScrollbar_hor_mouse
; version_scrollbar dd aVersion_scrollbar
tl_data_init dd sz_tl_data_init
tl_data_clear dd sz_tl_data_clear
tl_info_clear dd sz_tl_info_clear
tl_key dd sz_tl_key
tl_mouse dd sz_tl_mouse
tl_draw dd sz_tl_draw
tl_info_undo dd sz_tl_info_undo
tl_info_redo dd sz_tl_info_redo
tl_node_add dd sz_tl_node_add
tl_node_set_data dd sz_tl_node_set_data
tl_node_get_data dd sz_tl_node_get_data
tl_node_delete dd sz_tl_node_delete
tl_cur_beg dd sz_tl_cur_beg
tl_cur_next dd sz_tl_cur_next
tl_cur_perv dd sz_tl_cur_perv
tl_node_close_open dd sz_tl_node_close_open
tl_node_lev_inc dd sz_tl_node_lev_inc
tl_node_lev_dec dd sz_tl_node_lev_dec
tl_node_move_up dd sz_tl_node_move_up
tl_node_move_down dd sz_tl_node_move_down
tl_save_mem dd sz_tl_save_mem
tl_load_mem dd sz_tl_load_mem
tl_get_mem_size dd sz_tl_get_mem_size
tl_node_poi_get_info dd sz_tl_node_poi_get_info
tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info
tl_node_poi_get_data dd sz_tl_node_poi_get_data
dd 0,0
alib_init2 db 'lib_init',0
aEdit_box_draw db 'edit_box',0
aEdit_box_key db 'edit_box_key',0
aEdit_box_mouse db 'edit_box_mouse',0
; aVersion_ed db 'version_ed',0
aCheck_box_draw db 'check_box_draw',0
aCheck_box_mouse db 'check_box_mouse',0
; aVersion_ch db 'version_ch',0
; aOption_box_draw db 'option_box_draw',0
; aOption_box_mouse db 'option_box_mouse',0
; aVersion_op db 'version_op',0
aScrollbar_ver_draw db 'scrollbar_v_draw',0
; aScrollbar_ver_mouse db 'scrollbar_v_mouse',0
aScrollbar_hor_draw db 'scrollbar_h_draw',0
; aScrollbar_hor_mouse db 'scrollbar_h_mouse',0
; aVersion_scrollbar db 'version_scrollbar',0
sz_tl_data_init db 'tl_data_init',0
sz_tl_data_clear db 'tl_data_clear',0
sz_tl_info_clear db 'tl_info_clear',0
sz_tl_key db 'tl_key',0
sz_tl_mouse db 'tl_mouse',0
sz_tl_draw db 'tl_draw',0
sz_tl_info_undo db 'tl_info_undo',0
sz_tl_info_redo db 'tl_info_redo',0
sz_tl_node_add db 'tl_node_add',0
sz_tl_node_set_data db 'tl_node_set_data',0
sz_tl_node_get_data db 'tl_node_get_data',0
sz_tl_node_delete db 'tl_node_delete',0
sz_tl_cur_beg db 'tl_cur_beg',0
sz_tl_cur_next db 'tl_cur_next',0
sz_tl_cur_perv db 'tl_cur_perv',0
sz_tl_node_close_open db 'tl_node_close_open',0
sz_tl_node_lev_inc db 'tl_node_lev_inc',0
sz_tl_node_lev_dec db 'tl_node_lev_dec',0
sz_tl_node_move_up db 'tl_node_move_up',0
sz_tl_node_move_down db 'tl_node_move_down',0
sz_tl_save_mem db 'tl_save_mem',0
sz_tl_load_mem db 'tl_load_mem',0
sz_tl_get_mem_size db 'tl_get_mem_size',0
sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0
align 4
import_buf2d:
init dd sz_init
buf2d_create dd sz_buf2d_create
buf2d_create_f_img dd sz_buf2d_create_f_img
buf2d_clear dd sz_buf2d_clear
buf2d_draw dd sz_buf2d_draw
buf2d_delete dd sz_buf2d_delete
buf2d_line dd sz_buf2d_line
buf2d_rect_by_size dd sz_buf2d_rect_by_size
buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
buf2d_circle dd sz_buf2d_circle
buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
buf2d_bit_blt dd sz_buf2d_bit_blt
buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
buf2d_curve_bezier dd sz_buf2d_curve_bezier
buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
buf2d_draw_text dd sz_buf2d_draw_text
buf2d_crop_color dd sz_buf2d_crop_color
buf2d_offset_h dd sz_buf2d_offset_h
buf2d_flood_fill dd sz_buf2d_flood_fill
buf2d_set_pixel dd sz_buf2d_set_pixel
dd 0,0
sz_init db 'lib_init',0
sz_buf2d_create db 'buf2d_create',0
sz_buf2d_create_f_img db 'buf2d_create_f_img',0
sz_buf2d_clear db 'buf2d_clear',0
sz_buf2d_draw db 'buf2d_draw',0
sz_buf2d_delete db 'buf2d_delete',0
sz_buf2d_line db 'buf2d_line',0
sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
sz_buf2d_circle db 'buf2d_circle',0
sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
sz_buf2d_bit_blt db 'buf2d_bit_blt',0
sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
sz_buf2d_draw_text db 'buf2d_draw_text',0
sz_buf2d_crop_color db 'buf2d_crop_color',0
sz_buf2d_offset_h db 'buf2d_offset_h',0
sz_buf2d_flood_fill db 'buf2d_flood_fill',0
sz_buf2d_set_pixel db 'buf2d_set_pixel',0
\ No newline at end of file
diff --git a/programs/media/log_el/trunk/le_pole.inc b/programs/media/log_el/trunk/le_pole.inc
new file mode 100644
index 0000000000..03ef8f44d5
--- /dev/null
+++ b/programs/media/log_el/trunk/le_pole.inc
@@ -0,0 +1,1262 @@
+;
+; функци для создания и редактирования проводов
+;
+
+;--------------------------------------
+struct Cell
+ x dd ? ;+0
+ y dd ? ;+4
+ liv db ? ;+8
+ napr db ? ;+9
+ends
+
+offs_cell_x equ 0
+offs_cell_y equ 4
+offs_cell_liv equ 8
+offs_cell_napr equ 9
+
+;структура для создания поля
+align 4
+pole:
+.index dd 0
+cell dd 0 ;указатель на память со структурами ячеек
+.max_cell dd 90000
+.b_sort dd 0 ;граница для сортированных ячеек
+
+pole_index equ dword[edi]
+pole_data equ dword[edi +4] ;указатель на память со структурами ячеек
+pole_max_cell equ dword[edi +8]
+pole_b_sort equ dword[edi+12] ;граница для сортированных ячеек
+
+macro get_cell_offset reg,ind
+{
+ mov reg,ind
+ imul reg,sizeof.Cell
+ add reg,dword[cell]
+}
+
+er_oom db 0 ;на случай исчерпания памяти
+Cor_x dd 0
+Cor_y dd 0
+zoom db 3 ;масштаб поля
+txt_zoom db 'Масштаб:',0
+txt_osob db 'Точек:',0
+txt_info: db 'Размер: '
+.size: rb 16
+txt_mull db '*',0
+txt_space db ' ',0
+txt_nl db 13,10,0
+txt_buf rb 32
+
+
+align 4
+proc pole_init uses eax ebx edi, pole:dword
+ mov edi,dword[pole]
+
+ ;*** код с одной областью в памяти ***
+ mov ebx,4
+ add ebx,sizeof.Cell
+ imul ebx,pole_max_cell
+ stdcall mem.Alloc,ebx
+ mov pole_index,eax
+
+ mov ebx,pole_max_cell
+ shl ebx,2
+ add eax,ebx
+ mov pole_data,eax
+
+ stdcall pole_clear, edi
+ stdcall pole_paint, edi ;рисование поля в буфере (не на экране)
+ ret
+endp
+
+align 4
+proc pole_delete uses edi, pole:dword
+ mov edi,dword[pole]
+ stdcall mem.Free,pole_index
+ ret
+endp
+
+;чистка проводов на схеме
+align 4
+proc pole_clear uses eax ecx edi, pole:dword
+ mov edi,dword[pole]
+
+ xor eax,eax
+ mov pole_b_sort,eax
+ mov byte[er_oom],al
+ cld
+ mov ecx,pole_max_cell
+ imul ecx,sizeof.Cell
+ mov edi,pole_data
+ repne stosb ;memset(cell,0,sizeof(Cell)*pole_max_cell);
+
+ mov edi,dword[pole]
+ mov ecx,pole_max_cell
+ mov edi,pole_index
+ @@:
+ stosd ;for(i=0;i i
+ ;ecx -> firstC
+ ;edx -> &pole_index[i]
+ ;esi -> cell[pole_index[i]]
+ mov ecx,pole_index
+ mov ebx,pole_b_sort
+ mov edx,ebx
+ shl edx,2
+ add edx,ecx
+ inc ebx
+ mov ecx,dword[ecx]
+ .cycle_b: ;for(i=pole_b_sort+1;i<=fristC;i++)
+ add edx,4
+ get_cell_offset esi,dword[edx]
+ mov eax,dword[x]
+ cmp dword[esi],eax ;+0 = .x
+ jne .if_e
+ mov eax,dword[y]
+ cmp dword[esi+4],eax ;+4 = .y
+ jne .if_e
+ ;if(cell[pole_index[i]].x==x && cell[pole_index[i]].y==y){
+ mov eax,dword[edx] ;fnd=pole_index[i];
+ jmp .cycle_e ;break;
+ .if_e:
+ inc ebx
+ cmp ebx,ecx
+ jle .cycle_b
+ xor eax,eax ;восстанавливаем нулевое значение если не нашли ячейку (в цикле eax портится при проверке координат)
+ .cycle_e:
+ pop esi edx ecx ebx
+ @@:
+ .fun_e:
+ ret
+endp
+
+;output:
+; eax - index
+align 4
+proc pole_bin_find uses ebx ecx edx edi, mas:dword, fx:dword, fy:dword, k:dword
+ xor eax,eax
+ mov ebx,1 ;ebx - максимальный порядок для дерева
+ @@:
+ cmp dword[k],ebx
+ jle @f ;while(k>por)
+ shl ebx,1 ;por<<=1;
+ jmp @b
+ @@:
+ cmp dword[k],ebx
+ jge @f ;if(k>=1;
+ @@:
+ mov ecx,ebx ;i=por;
+
+ ;ecx -> i
+ ;edi -> mas[i]
+ .cycle_b: ;do{
+ shr ebx,1 ;por>>=1;
+
+ mov edi,ecx
+ shl edi,2
+ add edi,dword[mas]
+ ;if(compare_cells_mb(mas[i],fx,fy)){
+ stdcall pole_compare_cells_mb_coords, dword[edi],[fx],[fy]
+ cmp dl,0
+ je .if_u0_e
+ @@: ;while(i+por>k)
+ mov edx,ecx
+ add edx,ebx
+ cmp edx,dword[k] ;i+por>k
+ jle @f
+ shr ebx,1 ;por>>=1;
+ jmp @b
+ @@:
+ add ecx,ebx ;i+=por;
+ jmp .if_e
+ .if_u0_e:
+ ;else if(compare_cells_bm(mas[i],fx,fy))i-=por;
+ stdcall pole_compare_cells_bm_coords, dword[edi],[fx],[fy]
+ cmp dl,0
+ je .if_u1_e
+ sub ecx,ebx
+ jmp .if_e
+ .if_u1_e:
+ ;else { m=i; por=0; }
+ mov eax,ecx
+ xor ebx,ebx
+ .if_e:
+ cmp ebx,0
+ jne .cycle_b ;}while(por);
+
+ ret
+endp
+
+;output:
+; dl
+align 4
+proc pole_compare_cells_bm_coords uses eax ebx ecx, i0:dword, fx:dword, fy:dword
+ get_cell_offset eax,[i0]
+ ;eax -> cell[i0]
+ mov ebx,dword[fx]
+ cmp dword[eax],ebx
+ jle @f
+ mov dl,1
+ jmp .fun_e
+ @@:
+ mov ecx,dword[fy]
+ cmp dword[eax+4],ecx
+ jle @f
+ cmp dword[eax],ebx
+ jne @f
+ mov dl,1
+ jmp .fun_e
+ @@:
+ xor dl,dl
+ .fun_e:
+ ret
+endp
+
+;output:
+; dl
+align 4
+proc pole_compare_cells_mb_coords uses eax ebx ecx, i0:dword, fx:dword, fy:dword
+ get_cell_offset eax,[i0]
+ ;eax -> cell[i0]
+ mov ebx,dword[fx]
+ cmp dword[eax],ebx
+ jge @f
+ mov dl,1
+ jmp .fun_e
+ @@:
+ mov ecx,dword[fy]
+ cmp dword[eax+4],ecx
+ jge @f
+ cmp dword[eax],ebx
+ jne @f
+ mov dl,1
+ jmp .fun_e
+ @@:
+ xor dl,dl
+ .fun_e:
+ ret
+endp
+
+;output:
+; dl
+align 4
+proc pole_compare_cells_bm, i0:dword, i1:dword
+ push eax ebx ecx
+ get_cell_offset eax,[i0] ;eax -> cell[i0]
+ get_cell_offset ebx,[i1] ;ebx -> cell[i1]
+ mov ecx,dword[ebx] ;+0 = .x
+ cmp dword[eax],ecx
+ jle @f ;x0>x1
+ mov dl,1
+ jmp .fun_e
+ @@:
+ jne @f ;x0==x1
+ mov ecx,dword[ebx+4] ;+4 = .y
+ cmp dword[eax+4],ecx
+ jle @f ;y0>y1
+ mov dl,1
+ jmp .fun_e
+ @@:
+ xor dl,dl
+ .fun_e:
+ pop ecx ebx eax
+ ret
+endp
+
+;description:
+; чистка ячеек (проводов), установка на всех проводах 0-го сигнала
+; нужно вызывать при формировании или перед запуском схемы
+align 4
+proc pole_reset_cells uses eax ebx ecx edi, pole:dword
+ mov edi,dword[pole]
+ mov eax,pole_index
+ cmp dword[eax],0
+ je .fun_e ;если нет ячеек (проводов) то выход
+
+ mov ecx,dword[eax]
+ cld
+ @@: ;цикл по всем ячейкам
+ add eax,4
+ mov ebx,[eax]
+ imul ebx,sizeof.Cell
+ add ebx,pole_data
+ ;and byte[ebx+offs_cell_liv],0xfe ;сброс младшего бита
+ cmp byte[ebx+offs_cell_liv],2
+ je .no_clear
+ mov byte[ebx+offs_cell_liv],0
+ .no_clear:
+ loop @b
+ .fun_e:
+ ret
+endp
+
+align 4
+proc p_paint_elems uses eax esi
+ stdcall dword[tl_node_poi_get_info],0,tree1
+ pop esi
+ @@:
+ cmp esi,0
+ je @f
+ cmp word[esi],el_icon_elems ;получение через esi тип иконки
+ jne .end_element
+ stdcall [tl_node_poi_get_data], esi, tree1
+ pop eax
+ stdcall el_draw, eax
+ .end_element:
+ cmp word[esi],el_icon_captions ;получение через esi тип иконки
+ jne .end_caption
+ stdcall [tl_node_poi_get_data], esi, tree1
+ pop eax
+ stdcall capt_draw, eax
+ .end_caption:
+ stdcall dword[tl_node_poi_get_next_info],esi,tree1
+ pop esi ;переходим к следущему узлу
+ jmp @b
+ @@:
+ ret
+endp
+
+;description:
+; функция рисования элемента на поле
+align 4
+proc el_draw, h_elem:dword
+ pushad
+;el_offs_nam
+ mov edi,[h_elem]
+ mov eax,[edi] ;coord x
+ mov ebx,[edi+4] ;coord y
+
+ movzx edi,byte[edi+sp_offs_el_type]
+ imul edi,size_el_opt
+ add edi,el_opt_beg ;edi - указатель на структуру со свойствами элемента
+
+ movzx ecx,byte[edi+el_offs_box_x]
+ movzx edx,byte[edi+el_offs_box_y]
+ dec ecx
+ dec edx
+
+ push eax ebx
+ mov esi,[h_elem]
+ movzx esi,byte[esi+8]
+ push dword[edi+el_offs_col]
+ push ebx
+ push eax
+ stdcall move_rotate_n90, ecx,edx,esi
+ stdcall draw_scaled_rect, eax,ebx ;рисовани корпуса элемента
+ pop ebx eax
+
+ ;*** алгоритм рисования ног ***
+ movzx esi,byte[zoom]
+ cmp esi,1
+ jne .end_m1
+ ;*** рисование ног при 1-м масштабе ***
+ ;входные ноги
+ mov esi,[h_elem]
+ stdcall el_get_leg_coords,esi,0 ;установка параметров 0-й ноги
+ add eax,[Cor_x]
+ add ebx,[Cor_y]
+ movzx esi,byte[esi+8]
+ stdcall move_rotate_n90, 1,0,esi
+ mov edx,el_offs_legs_inp
+ inc edx
+ @@:
+ stdcall [buf2d_set_pixel], buf_0, eax,ebx,dword[edi+el_offs_col]
+ movzx ecx,byte[edi+edx]
+ cmp ecx,0
+ je @f
+ stdcall move_rotate_n90, 0,ecx,esi
+ inc edx
+ jmp @b
+ @@:
+
+ ;выходные ноги
+ mov esi,[h_elem]
+ stdcall el_get_leg_coords,esi,(1 shl 16) ;установка параметров 0-й ноги
+ add eax,[Cor_x] ;для работы с buf2d_line
+ add ebx,[Cor_y] ;для работы с buf2d_line
+ movzx esi,byte[esi+8]
+ stdcall move_rotate_n90, -2,0,esi
+ mov edx,el_offs_legs_out
+ inc edx
+ @@:
+ push dword[edi+el_offs_col]
+ stdcall move_rotate_n90, 1,0,esi
+ push ebx
+ push eax
+ stdcall move_rotate_n90, -1,0,esi
+ ;stdcall draw_scaled_rect, eax,ebx
+ stdcall [buf2d_line], buf_0, eax,ebx
+ movzx ecx,byte[edi+edx]
+ cmp ecx,0
+ je @f
+ stdcall move_rotate_n90, 0,ecx,esi
+ inc edx
+ jmp @b
+ @@:
+
+ jmp .end_mn
+ .end_m1:
+ ;*** рисование ног при n-м масштабе ***
+ ;входные ноги
+ xor edx,edx
+ @@:
+ stdcall el_get_leg_coords,[h_elem],edx
+ mov ecx,eax
+ or ecx,ebx
+ jz @f
+ mov ecx,[h_elem]
+ movzx ecx,byte[ecx+8]
+ stdcall move_rotate_n90, 1,0,ecx
+ add eax,[Cor_x]
+ add ebx,[Cor_y]
+ imul eax,esi
+ imul ebx,esi
+ stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx,esi,esi, dword[edi+el_offs_col]
+ inc edx
+ jmp @b
+ @@:
+
+ ;выходные ноги
+ mov edx,(1 shl 16)
+ @@:
+ stdcall el_get_leg_coords,[h_elem],edx
+ mov ecx,eax
+ or ecx,ebx
+ jz @f
+ mov ecx,[h_elem]
+ movzx ecx,byte[ecx+8]
+
+ push dword[edi+el_offs_col]
+ stdcall move_rotate_n90, -2,0,ecx
+ push ebx
+ push eax
+ stdcall move_rotate_n90, 1,0,ecx
+ stdcall draw_scaled_rect, eax,ebx
+
+ inc edx
+ jmp @b
+ @@:
+ .end_mn:
+ popad
+ ret
+endp
+
+align 4
+proc capt_draw uses eax ebx edi esi, h_capt:dword
+ mov edi,[h_capt]
+ mov eax,[edi] ;coord x
+ mov ebx,[edi+4] ;coord y
+ add eax,[Cor_x]
+ add ebx,[Cor_y]
+
+ movzx esi,byte[zoom]
+ cmp esi,1
+ jle @f
+ imul eax,esi
+ imul ebx,esi
+ @@:
+
+ add edi,capt_offs ;edi - указатель на полную подпись (с координатами)
+ call str_next_val
+ call str_next_val
+ ;call str_next_val
+ stdcall [buf2d_draw_text], buf_0, buf_font,edi,eax,ebx,color_caption ;рисуем строку с текстом
+ ret
+endp
+
+;description:
+; подфункция для рисования увеличенных прямоугольников на схеме
+align 4
+proc draw_scaled_rect uses eax ebx ecx edx edi, x0:dword,y0:dword,x1:dword,y1:dword, color:dword
+ movzx edi,byte[zoom]
+ mov edx,[y1]
+ mov ecx,[x1]
+ mov ebx,[y0]
+ mov eax,[x0]
+
+ cmp eax,ecx
+ jle @f
+ xchg eax,ecx
+ @@:
+ sub ecx,eax
+ cmp ebx,edx
+ jle @f
+ xchg ebx,edx
+ @@:
+ sub edx,ebx
+
+ inc ecx
+ inc edx
+
+ imul edx,edi
+ imul ecx,edi
+ add ebx,[Cor_y]
+ imul ebx,edi
+ add eax,[Cor_x]
+ imul eax,edi
+
+ stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx,ecx,edx, dword[color]
+ ret
+endp
+
+align 4
+proc pole_paint, pole:dword
+ pushad
+
+ ;*** роисование рамки
+ mov eax,[Cor_x]
+ mov ebx,[Cor_y]
+ mov ecx,[shem_w]
+ mov edx,[shem_h]
+ movzx esi,byte[zoom]
+ cmp esi,1
+ jle @f
+ imul eax,esi
+ imul ebx,esi
+ imul ecx,esi
+ imul edx,esi
+ @@:
+ dec eax
+ dec ebx
+ add ecx,2
+ add edx,2
+ stdcall [buf2d_rect_by_size], buf_0, eax,ebx, ecx,edx, color_border
+
+ ;eax -> firstC
+ ;ebx -> i
+ ;ecx -> cell[pole_index[i]]
+ ;edx -> color
+
+ mov edi,dword[pole]
+ mov eax,pole_index
+ cmp dword[eax],0
+ je .no_draw
+
+ mov eax,dword[eax]
+ mov ebx,1
+
+;---
+ @@: ;while(i pole_index[firstC]
+ ;ebx -> pole_index[i]
+ ;edi -> coord_x
+ ;esi -> coord_y
+ shl eax,2
+ shl ebx,2
+ add eax,pole_index
+ add ebx,pole_index
+
+ cmp byte[zoom],2
+ jge .zoom2
+ @@: ;for(;i<=fristC;i++){
+ get_cell_offset ecx,dword[ebx]
+;...
+ mov edi,dword[Cor_x]
+ add edi,dword[ecx] ;+0 = .x
+ mov esi,dword[Cor_y]
+ add esi,dword[ecx+4] ;+4 = .y
+ movzx edx,byte[ecx+offs_cell_liv]
+ and edx,3 ;ограничение
+ shl edx,2
+ add edx,shem_colors
+ stdcall [buf2d_set_pixel], buf_0, edi, esi, [edx]
+;...
+ add ebx,4
+ cmp ebx,eax
+ jle @b
+
+ jmp .no_draw
+ .zoom2:
+
+ @@: ;for(;i<=fristC;i++){
+ get_cell_offset ecx,dword[ebx]
+
+ movzx edx,byte[zoom] ;edx используется для внесения zoom в 4 байтное число
+ mov edi,dword[ecx] ;+0 = .x
+ add edi,dword[Cor_x]
+ imul edi,edx
+ mov esi,dword[ecx+4] ;+4 = .y
+ add esi,dword[Cor_y]
+ imul esi,edx
+
+ movzx edx,byte[ecx+offs_cell_liv]
+ and edx,3 ;ограничение
+ shl edx,2
+ add edx,shem_colors
+
+ movzx ecx,byte[zoom]
+ ;;;dec ecx
+ stdcall [buf2d_filled_rect_by_size], buf_0, edi, esi, ecx, ecx, [edx]
+ add ebx,4
+ cmp ebx,eax
+ jle @b
+
+ .no_draw:
+ popad
+ call p_paint_elems
+ ret
+endp
+
+;Сортировка ячеек поля, нужна для более быстрого поиска
+align 4
+proc pole_sort uses eax edi, pole:dword
+ mov edi,dword[pole]
+ mov eax,pole_index
+ mov eax,dword[eax] ;firstC -> eax
+ stdcall pole_fl_sort, pole_index,eax ;сортируем все ячейки
+ mov pole_b_sort,eax ;ставим число отсортированных ячеек равное числу всех существующих ячеек
+ ret
+endp
+
+;Сортировка вектора a[1..n] методом Флойда
+;Элемент a[0] в сортировке не участвует
+align 4
+proc pole_fl_sort uses eax ecx edx edi esi, a:dword, n:dword
+ mov ecx,dword[a]
+ ;Формировать исходное частично упорядоченное дерево
+ mov eax,dword[n]
+ shr eax,1
+ @@: ;for(i=n>>1; i>=2; i--)
+ stdcall pole_fl_surface, ecx,eax,[n] ;(a,i,n)
+ dec eax
+ cmp eax,2
+ jge @b
+ ;Выполнить процедуру всплытия Флойда для каждого поддерева
+ mov eax,dword[n]
+ @@: ;for(i=n; i>=2; i--){
+ stdcall pole_fl_surface, ecx,1,eax ;(a,1,i)
+ ;Поместить найденный максимальный элемент в конец списка
+ mov edi,eax
+ shl edi,2
+ add edi,ecx ;edi -> &a[i]
+ mov esi,dword[edi] ;w=a[i];
+ mov edx,dword[ecx+4]
+ mov dword[edi],edx ;a[i]=a[1];
+ mov dword[ecx+4],esi ;a[1]=w;
+
+ dec eax
+ cmp eax,2
+ jge @b
+ ret
+endp
+
+;Процедура всплытия Флойда по дереву a[1..k]
+align 4
+proc pole_fl_surface, a:dword, i:dword, k:dword
+locals
+ copy dd ?
+endl
+ pushad
+ ;edx -> ...
+ ;edi -> m
+ ;esi -> j
+ mov eax,dword[a]
+ mov ebx,dword[i]
+ mov ecx,dword[k]
+
+ mov edx,ebx
+ shl edx,2
+ add edx,eax
+ mov edx,dword[edx]
+ mov dword[copy],edx ;copy=a[i];
+ mov edi,ebx
+ shl edi,1 ;m=i<<1;
+ .cycle_b: ;while (m<=k) {
+ cmp edi,ecx
+ jg .cycle_e
+ jne @f ;if (m==k) j=m;
+ mov esi,edi
+ jmp .else_e
+ @@: ;else if (pole_compare_cells_bm(a[m],a[m+1])) j=m;
+ mov edx,edi
+ shl edx,2
+ add edx,eax
+ stdcall pole_compare_cells_bm, dword[edx],dword[edx+4]
+ cmp dl,0
+ je @f
+ mov esi,edi
+ jmp .else_e
+ @@: ;else j=m+1;
+ mov esi,edi
+ inc esi
+ .else_e:
+
+ ;if (pole_compare_cells_bm(a[j],copy)) {
+ mov edx,esi
+ shl edx,2
+ add edx,eax
+ stdcall pole_compare_cells_bm, dword[edx],dword[copy]
+ cmp dl,0
+ je .cycle_e ;} else break; //выход из цикла
+
+ mov edx,esi
+ shl edx,2
+ add edx,eax
+ push dword[edx] ;push a[j];
+ mov edx,ebx
+ shl edx,2
+ add edx,eax
+ pop dword[edx] ;a[i]=a[j];
+ mov ebx,esi ;i=j;
+ mov edi,ebx
+ shl edi,1 ;m=i<<1;
+
+ jmp .cycle_b
+ .cycle_e:
+
+ ;значения многих регистров уже не важны т. к. конец функции
+ shl ebx,2
+ add eax,ebx
+ mov edx,dword[copy]
+ mov dword[eax],edx ;a[i]=copy;
+
+ popad
+ ret
+endp
+;--------------------------------------
+
+align 4
+proc pole_draw_pok uses eax ebx ecx edx edi esi, pole:dword
+ ;mov edi,dword[pole]
+
+ mov eax,4 ;рисование текста
+ mov ebx,325*65536+5
+ mov ecx,[sc.work_text]
+ or ecx,0x80000000 ;or (1 shl 30)
+ mov edx,txt_zoom
+ ;mov edi,[sc.work]
+ int 0x40
+
+ add bx,9
+ mov edx,txt_osob
+ int 0x40
+
+ add bx,9
+ mov edx,txt_info
+ int 0x40
+
+ mov eax,47
+ movzx ecx,byte[zoom]
+ mov ebx,(2 shl 16)
+ mov edx,(325+6*9)*65536+5
+ mov esi,[sc.work_button_text]
+ or esi,(1 shl 30)
+ mov edi,[sc.work_button]
+ int 0x40 ;масштаб
+
+ mov edi,dword[pole]
+ mov ecx,pole_index
+ mov ecx,[ecx]
+ mov edi,[sc.work_button]
+ mov ebx,(5 shl 16)
+ add edx,(6*0)*65536+9
+ int 0x40 ;число точек
+ ret
+endp
+
+align 4
+but_zoom_p:
+ cmp byte[zoom],16
+ jge @f
+ pushad
+ ;вычисление сдвигов для поля, которые обеспечат центровку поля при увеличении масштаба
+ movzx ecx,byte[zoom]
+ xor edx,edx
+ mov eax,dword[buf_0.w]
+ shr eax,1 ;в eax половина ширины поля
+ mov ebx,eax ;делаем резервную копию eax
+ div ecx ;делим eax на текущий масштаб
+ xchg eax,ebx
+ xor edx,edx
+ inc ecx
+ div ecx ;делим eax на новый масштаб
+ sub ebx,eax ;вычисляется сдвиг поля который обеспечит центровку поля
+ sub dword[Cor_x],ebx ;сдвигаем поле зрения по оси x
+ xor ecx,ecx
+ mov cl,byte[zoom]
+ xor edx,edx
+ mov eax,dword[buf_0.h]
+ shr eax,1
+ mov ebx,eax
+ div ecx
+ xchg eax,ebx
+ xor edx,edx
+ inc ecx
+ div ecx
+ sub ebx,eax
+ sub dword[Cor_y],ebx ;сдвигаем поле зрения по оси y
+
+ inc byte[zoom]
+ stdcall pole_draw_pok, pole
+ popad
+
+ .buf_clear:
+ call redraw_pole
+ @@:
+ ret
+
+align 4
+but_zoom_m:
+ cmp byte[zoom],1
+ jle @f
+ pushad
+ ;вычисление сдвигов для поля, которые обеспечат центровку поля при уменьшении масштаба
+ movzx ecx,byte[zoom]
+ xor edx,edx
+ mov eax,dword[buf_0.w]
+ shr eax,1 ;в eax половина ширины поля
+ mov ebx,eax ;делаем резервную копию eax
+ div ecx ;делим eax на текущий масштаб
+ xchg eax,ebx
+ xor edx,edx
+ dec ecx
+ div ecx ;делим eax на новый масштаб
+ sub ebx,eax ;вычисляется сдвиг поля который обеспечит центровку поля
+ sub dword[Cor_x],ebx ;сдвигаем поле зрения по оси x
+ xor ecx,ecx
+ mov cl,byte[zoom]
+ xor edx,edx
+ mov eax,dword[buf_0.h]
+ shr eax,1
+ mov ebx,eax
+ div ecx
+ xchg eax,ebx
+ xor edx,edx
+ dec ecx
+ div ecx
+ sub ebx,eax
+ sub dword[Cor_y],ebx ;сдвигаем поле зрения по оси y
+
+ dec byte[zoom]
+ stdcall pole_draw_pok, pole
+ popad
+
+ .buf_clear:
+ call redraw_pole
+ @@:
+ ret
+
+;центровка схемы по центру экрана
+align 4
+proc but_center uses eax ebx ecx edx
+ movzx ecx,byte[zoom]
+ cmp ecx,1
+ jle .end_m_1
+ mov eax,[buf_0.w]
+ mov ebx,[shem_w]
+ imul ebx,ecx
+
+ sub eax,ebx
+ xor edx,edx
+ shl ecx,1
+ cmp eax,0
+ jge @f
+ neg eax
+ inc eax
+ div ecx
+ neg eax
+ inc eax
+ jmp .set_x
+ @@:
+ div ecx
+ .set_x:
+ mov [Cor_x],eax
+ mov eax,[buf_0.h]
+ mov ebx,[shem_h]
+ shr ecx,1
+ imul ebx,ecx
+ sub eax,ebx
+ xor edx,edx
+ shl ecx,1
+ cmp eax,0
+ jge @f
+ neg eax
+ inc eax
+ div ecx
+ neg eax
+ inc eax
+ jmp .set_y
+ @@:
+ div ecx
+ .set_y:
+ mov [Cor_y],eax
+ jmp .end_m_n
+ .end_m_1:
+ mov eax,[buf_0.w]
+ sub eax,[shem_w]
+ shr eax,1
+ bt eax,30
+ jnc @f
+ bts eax,31
+ @@:
+ mov [Cor_x],eax
+ mov eax,[buf_0.h]
+ sub eax,[shem_h]
+ shr eax,1
+ bt eax,30
+ jnc @f
+ bts eax,31
+ @@:
+ mov [Cor_y],eax
+ .end_m_n:
+ call redraw_pole
+ ret
+endp
+
+align 4
+but_pole_up:
+ push eax ecx edx
+ mov eax,dword[buf_0.h]
+ shr eax,2
+ movzx ecx,byte[zoom]
+ cmp cx,2
+ jl @f ;деление на величину zoom
+ xor edx,edx
+ div ecx
+ @@:
+ add dword[Cor_y],eax
+ pop edx ecx eax
+ call redraw_pole
+ ret
+
+align 4
+but_pole_dn:
+ push eax ecx edx
+ mov eax,dword[buf_0.h]
+ shr eax,2
+ xor ecx,ecx
+ mov cl,byte[zoom]
+ cmp cx,2
+ jl @f ;деление на величину zoom
+ xor edx,edx
+ div ecx
+ @@:
+ sub dword[Cor_y],eax
+ pop edx ecx eax
+ call redraw_pole
+ ret
+
+align 4
+but_pole_left:
+ push eax ecx edx
+ mov eax,dword[buf_0.w]
+ shr eax,2
+ xor ecx,ecx
+ mov cl,byte[zoom]
+ cmp cx,2
+ jl @f ;деление на величину zoom
+ xor edx,edx
+ div ecx
+ @@:
+ add dword[Cor_x],eax
+ pop edx ecx eax
+ call redraw_pole
+ ret
+
+align 4
+but_pole_right:
+ push eax ecx edx
+ mov eax,dword[buf_0.w]
+ shr eax,2
+ xor ecx,ecx
+ mov cl,byte[zoom]
+ cmp cx,2
+ jl @f ;деление на величину zoom
+ xor edx,edx
+ div ecx
+ @@:
+ sub dword[Cor_x],eax
+ pop edx ecx eax
+ call redraw_pole
+ ret
+
+;output:
+; edx - count created points
+align 4
+proc shem_create_line uses eax ebx ecx edi, x:dword, y:dword, opt:dword
+ mov edi,pole
+ xor edx,edx
+
+ mov ebx,[x]
+ mov ecx,[y]
+ bt dword[opt],0
+ jnc @f
+ .line_lr:
+ inc ebx
+ cmp ebx,[shem_w]
+ jge @f
+ stdcall pole_cell_find, pole,ebx,ecx
+ cmp eax,0
+ je .u0
+ imul eax,sizeof.Cell
+ add eax,pole_data
+ cmp byte[eax+offs_cell_liv],1
+ jne @f
+ .u0:
+ stdcall pole_cell_creat, pole,ebx,ecx,1
+ inc edx
+ jmp .line_lr
+ @@:
+
+ mov ebx,[x]
+ ;mov ecx,[y]
+ bt dword[opt],2
+ jnc @f
+ .line_rl:
+ dec ebx
+ cmp ebx,0
+ jl @f
+ stdcall pole_cell_find, pole,ebx,ecx
+ cmp eax,0
+ je .u1
+ imul eax,sizeof.Cell
+ add eax,pole_data
+ cmp byte[eax+offs_cell_liv],1
+ jne @f
+ .u1:
+ stdcall pole_cell_creat, pole,ebx,ecx,1
+ inc edx
+ jmp .line_rl
+ @@:
+
+ mov ebx,[x]
+ mov ecx,[y]
+ bt dword[opt],3
+ jnc @f
+ .line_du:
+ dec ecx
+ cmp ecx,0
+ jl @f
+ stdcall pole_cell_find, pole,ebx,ecx
+ cmp eax,0
+ je .u2
+ imul eax,sizeof.Cell
+ add eax,pole_data
+ cmp byte[eax+offs_cell_liv],1
+ jne @f
+ .u2:
+ stdcall pole_cell_creat, pole,ebx,ecx,1
+ inc edx
+ jmp .line_du
+ @@:
+
+ ;mov ebx,[x]
+ mov ecx,[y]
+ bt dword[opt],1
+ jnc @f
+ .line_ud:
+ inc ecx
+ cmp ecx,[shem_h]
+ jge @f
+ stdcall pole_cell_find, pole,ebx,ecx
+ cmp eax,0
+ je .u3
+ imul eax,sizeof.Cell
+ add eax,pole_data
+ cmp byte[eax+offs_cell_liv],1
+ jne @f
+ .u3:
+ stdcall pole_cell_creat, pole,ebx,ecx,1
+ inc edx
+ jmp .line_ud
+ @@:
+
+ ret
+endp
+
+align 4
+redraw_pole:
+ stdcall [buf2d_clear], buf_0, [buf_0.color]
+ stdcall pole_paint, pole
+ stdcall [buf2d_draw], buf_0
+ ret
diff --git a/programs/media/log_el/trunk/le_signal.inc b/programs/media/log_el/trunk/le_signal.inc
new file mode 100644
index 0000000000..9846c7a7e1
--- /dev/null
+++ b/programs/media/log_el/trunk/le_signal.inc
@@ -0,0 +1 @@
+;
; функци для создания сигналов
;
;color_s0 - сигнал 0
;color_s1 - сигнал 1
;color_s2 - точка без пересечения
;color_s3 - временное значение для сохранения
size_sign equ 10
sign_x equ 0
sign_y equ 4
sign_a equ 8
sign_z equ 9
sign_data dd 0 ;указатель на массив со структурами сигналов
sign_count dd 0 ;текущ. кол. сигналов
sign_max dd 0 ;макс. кол. сигналов
align 4
proc sign_init uses eax ecx, m_count:dword
mov ecx,[m_count]
mov [sign_max],ecx
imul ecx,size_sign
stdcall mem.Alloc, ecx
mov [sign_data],eax
call sign_clear
ret
endp
;очистка всех сигналов
align 4
proc sign_clear uses eax ecx edi
xor eax,eax
mov dword[time],eax
mov dword[sign_count],eax
mov ecx,[sign_max]
imul ecx,size_sign
mov edi,[sign_data]
cld
rep stosb
ret
endp
;очистка одного сигнала
align 4
proc sign_clear_one uses ecx edi esi, p_sign:dword
mov ecx,size_sign
mov esi,[sign_count]
dec esi
imul esi,ecx
add esi,[sign_data]
mov edi,[p_sign]
cld
rep movsb
dec dword[sign_count]
ret
endp
;освобождение памяти занятой массивами для сигналов
align 4
proc sign_delete
stdcall mem.Free, dword[sign_data]
ret
endp
;функция для перемещения сигналов
align 4
proc sign_move
pushad
mov ecx,[sign_count]
cmp ecx,1
jl .end_f
mov esi,ecx
dec esi
imul esi,size_sign
add esi,[sign_data]
;cld
.cycle_beg:
mov eax,[esi+sign_x]
mov ebx,[esi+sign_y]
movzx edi,byte[esi+sign_a]
movzx edx,byte[esi+sign_z]
cmp edx,0
je @f
or edi,0x100
@@:
;пытаемся создать разветвление сигнала
stdcall move_rotate_n90, 0,-1,edi
inc edi
stdcall sign_creat,eax,ebx,edi
stdcall move_rotate_n90, -2,0,edi
add edi,2
stdcall sign_creat,eax,ebx,edi
mov eax,[esi+sign_x]
mov ebx,[esi+sign_y]
inc edi
mov eax,[esi+sign_x]
mov ebx,[esi+sign_y]
shl edx,2
add edx,shem_colors
stdcall draw_signal_rect, eax,ebx, dword[edx] ;рисуем сигнал на поле
.move_1:
stdcall move_rotate_x_n90, 1,edi
mov edi,eax
stdcall pole_cell_find, pole, edi,ebx
cmp eax,0
jne @f
stdcall sign_clear_one,esi ;удаление сигнала, если он зашел в тупик
jmp .cycle_next
@@:
imul eax,sizeof.Cell
add eax,dword[cell]
movzx edx,byte[esi+sign_z]
cmp byte[eax+offs_cell_liv],2
jne @f
;если стоит пересечение проводов
mov eax,edi
movzx edi,byte[esi+sign_a]
jmp .move_1
@@:
cmp byte[eax+offs_cell_liv],dl
jne @f
stdcall sign_clear_one,esi ;удаление сигнала, если он попал на область закрашеную данным цветом
jmp .cycle_next
@@:
mov byte[eax+offs_cell_liv],dl ;ставим на поле знак сигнала
mov [esi+sign_x],edi
mov [esi+sign_y],ebx
.cycle_next:
sub esi,size_sign
;loop .cycle_beg
dec ecx
jnz .cycle_beg
stdcall [buf2d_draw], buf_0
.end_f:
popad
ret
endp
align 4
proc sign_creat uses eax ebx ecx edx edi esi, coord_x:dword, coord_y:dword, opt:dword
mov edi,[sign_count]
cmp edi,[sign_max]
jge .end_f
mov esi,[coord_x]
mov ebx,[coord_y]
.found:
stdcall pole_cell_find, pole, esi,ebx
cmp eax,0
je .end_f
mov ecx,[opt]
get_cell_offset edx,eax
cmp byte[edx+offs_cell_liv],2
jne @f
mov eax,esi
stdcall move_rotate_x_n90,1,ecx
mov esi,eax
jmp .found
@@:
cmp ch,byte[edx+offs_cell_liv] ;проверяем на поле знак сигнала
je .end_f
;доделать установку метки в провод, что-бы избежать дублирования сигналов на широких проводах
imul edi,size_sign
add edi,[sign_data]
mov [edi+sign_x],esi
mov [edi+sign_y],ebx
mov [edi+sign_a],cl
mov [edi+sign_z],ch
inc dword[sign_count]
mov [edx+offs_cell_liv],ch ;ставим на поле знак сигнала
;stdcall draw_signal_rect, [coord_x],[coord_y], 0x800080
.end_f:
ret
endp
;description:
; подфункция для рисования сигналов на схеме
align 4
proc draw_signal_rect uses eax ebx edi, x0:dword,y0:dword, color:dword
movzx edi,byte[zoom]
mov ebx,[y0]
mov eax,[x0]
add ebx,[Cor_y]
imul ebx,edi
add eax,[Cor_x]
imul eax,edi
stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx,edi,edi, dword[color]
ret
endp
align 4
proc sign_from_elems
locals
s_inp dd ?
n_leg dd ?
endl
pushad
mov edi,pole
;*** создание сигналов из логических элементов ***
stdcall dword[tl_node_poi_get_info],0,tree1
pop esi
@@:
cmp esi,0
je @f
cmp word[esi],el_icon_elems ;получение через esi тип иконки
jne .end_add_p3
stdcall [tl_node_poi_get_data], esi, tree1
pop ecx
;*** проверка сигналов на входных ногах
mov dword[s_inp],0
mov dword[n_leg],0 ;word[n_leg] - номер входной ноги
mov edx,1
.add_p1:
stdcall el_get_leg_coords, ecx,dword[n_leg]
test eax,eax
jnz .get1
test ebx,ebx
jnz .get1
jmp .end_add_p1 ;если координаты не взялись (eax=0 && ebx=0), выход из цикла
.get1:
stdcall pole_cell_find, pole, eax,ebx
cmp eax,0
je .get2
imul eax,sizeof.Cell
add eax,pole_data
cmp byte[eax+offs_cell_liv],1
jne .get2
or dword[s_inp],edx
.get2:
inc dword[n_leg]
shl edx,1
jmp .add_p1
.end_add_p1:
;*** определяем выходную комбинацию битов на основе заданной таблицы работы элемента
movzx eax,byte[ecx+sp_offs_el_type]
imul eax,size_el_opt
add eax,el_opt_beg+el_offs_table
mov ebx,[eax]
add ebx,dword[s_inp]
mov ebx,[ebx]
mov dword[s_inp],ebx
;*** установка сигналов на выходных ногах
mov dword[n_leg],(1 shl 16) ;word[n_leg] - номер выходной ноги
.add_p2:
stdcall el_get_leg_coords, ecx,dword[n_leg]
test eax,eax
jnz .get3
test ebx,ebx
jnz .get3
jmp .end_add_p2 ;если координаты не взялись (eax=0 && ebx=0), выход из цикла
.get3:
movzx edx,byte[ecx+8] ;dl - направление сигнала
bt dword[s_inp],0
jnc .set1
or edx,0x100 ;dh - значение сигнала 0 или 1
.set1:
stdcall sign_creat,eax,ebx,edx
inc dword[n_leg]
shr dword[s_inp],1
jmp .add_p2
.end_add_p2:
.end_add_p3:
stdcall dword[tl_node_poi_get_next_info],esi,tree1
pop esi ;переходим к следущему узлу
jmp @b
@@:
popad
ret
endp
;создание сигналов на основе подписей
align 4
proc sign_from_captions
pushad
mov edi,pole
;*** создание сигналов из подписей ***
stdcall dword[tl_node_poi_get_info],0,tree1
pop esi
@@:
cmp esi,0
je @f
cmp word[esi],el_icon_captions ;получение через esi тип иконки
jne .end_add_p3
stdcall [tl_node_poi_get_data], esi, tree1
pop ecx
cmp byte[ecx+8],'n'
je .end_add_p3 ;если надпись информационная, то не создаем сигнала
xor edx,edx
;*** определяем выходой бит,
;который был установлен в but_set_0 и but_set_1
cmp byte[ecx+8],'o'
jne .end_add_p1
or edx,0x100
.end_add_p1:
stdcall sign_creat,dword[ecx],dword[ecx+4],edx
.end_add_p3:
stdcall dword[tl_node_poi_get_next_info],esi,tree1
pop esi ;переходим к следущему узлу
jmp @b
@@:
popad
ret
endp
\ No newline at end of file
diff --git a/programs/media/log_el/trunk/log_el.asm b/programs/media/log_el/trunk/log_el.asm
new file mode 100644
index 0000000000..b3652fe52b
--- /dev/null
+++ b/programs/media/log_el/trunk/log_el.asm
@@ -0,0 +1,2140 @@
+use32
+ org 0x0
+ db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
+ dd 0x1
+ dd start
+ dd i_end ;размер приложения
+ dd mem
+ dd stacktop
+ dd 0
+ dd sys_path
+
+color_border equ 0xff0000
+color_s0 equ 0xff ;сигнал 0
+color_s1 equ 0xffffff ;сигнал 1
+color_s2 equ 0xff00 ;точка без пересечения
+color_s3 equ 0xff0000 ;временное значение для сохранения
+color_caption equ 0x808080
+
+;номара иконок:
+el_icon_group equ 0 ;групповая
+el_icon_points equ 1 ;точки
+el_icon_sub_points equ 2 ;изоляции
+el_icon_elems equ 3 ;элемента
+el_icon_captions equ 4 ;подписи
+
+size_el_opt equ 34 ;размер структуры с опциями элемента
+el_offs_nam equ 0 ;смещение для начала имени элемента
+el_offs_col equ 16 ;цвет элемента
+el_offs_box_x equ 20 ;ширина коробки элемента
+el_offs_box_y equ 21 ;высота коробки элемента
+el_offs_table equ 22 ;указатель на таблицу работы элемента
+el_offs_legs_inp equ 26 ;смещение на описание входных ног
+el_offs_legs_out equ 30 ;смещение на описание выходных ног
+
+sp_offs_el_type equ 9 ;смещение для типа элемента в списке
+
+points_max equ 1000
+capt_offs equ 10 ;смещение для начала подписи в листе tree1
+
+include '../../../macros.inc'
+include '../../../proc32.inc'
+include '../../../develop/libraries/box_lib/load_lib.mac'
+include '../../../develop/libraries/box_lib/trunk/box_lib.mac'
+include 'mem.inc'
+include 'dll.inc'
+include 'le_pole.inc'
+include 'le_signal.inc'
+
+@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
+caption db 'Логические элементы 15.03.12',0 ;подпись окна
+
+panel_0_coord_top equ 5 ;верхняя координата 0-го ряда панели инструментов
+panel_1_coord_top equ 35
+panel_2_coord_top equ 60
+panel_3_coord_top equ 85
+
+align 4
+proc move_rotate_x_n90 uses ecx edi, d_x:dword, angle:dword
+ mov edi,[angle] ;угол поворота / 90 (от 0-3)
+ and edi,3
+ shl edi,4 ;edi*=16
+ add edi,mcs
+
+ mov ecx,[d_x]
+ imul ecx,dword[edi]
+ add eax,ecx
+
+ mov ecx,[d_x]
+ imul ecx,dword[edi+8]
+ add ebx,ecx
+
+ ret
+endp
+
+struct FileInfoBlock
+ Function dd ?
+ Position dd ?
+ Flags dd ?
+ Count dd ?
+ Buffer dd ?
+ db ?
+ FileName dd ?
+ends
+
+macro elOpt nam,col,box_x,box_y,table, il0, il1, il2, ol0, ol1, ol2
+{
+ @@: db nam
+ rb @b+16-$
+ dd col
+ db box_x
+ db box_y
+ dd table+0 ;+el_offs_table
+;+26
+ db il0+0 ;0-я входная нога
+ db il1+0 ;1-я входная нога
+ db il2+0
+ db 0
+;+30
+ db ol0+0
+ db ol1+0
+ db ol2+0
+ db 0
+}
+
+align 4
+el_opt_beg:
+elOpt 'or[2]', 0xff00ff,5,5,tbl_or, 1,2,, 2
+elOpt 'or[3]', 0xff00ff,5,7,tbl_or, 1,2,2, 3
+elOpt 'and[2]',0xffff00,5,5,tbl_and.2, 1,2,, 2
+elOpt 'and[3]',0xffff00,5,7,tbl_and.3, 1,2,2, 3
+elOpt 'not', 0xffff,3,3,tbl_not, 1,,, 1
+elOpt 'xor', 0x8000ff,5,5,tbl_xor, 1,2,, 2
+elOpt 'sm[1]', 0x8080ff,7,7,tbl_sm, 1,2,2, 1,4
+.end:
+elOpt '???', 0x808080,3,3,tbl_and.3, 1,,, 1 ;не опознанный элемент
+
+;таблицы по которым задаются правила работы элементов
+align 4
+tbl_or db 0,1,1,1, 1,1,1,1 ;or2, or3
+tbl_and:
+.3: db 0,0,0,0
+.2: db 0,0,0,1
+tbl_xor db 0,1,1,0
+tbl_sm db 0,2,2,1, 2,1,1,3
+tbl_not db 1,0 ;not
+
+time dd 0
+tim_ch db 0
+pen_mode dd 0 ;режим рисования провода
+
+txt_set_0 db '0',0
+txt_set_1 db '1',0
+txt_mov_l db 27,0 ;<-
+txt_mov_r db 26,0 ;->
+
+txt_size db 'size',0
+txt_elements db 'elements',0
+txt_points db 'points',0
+txt_sub_points db 'subpoints',0
+txt_captions db 'captions',0
+
+;матрица косинусов и синусов, используемая для поворотов сигналов и элементов
+align 4
+mcs dd 1, 0, 0, 1,\
+ 0, 1,-1, 0,\
+ -1, 0, 0,-1,\
+ 0,-1, 1, 0
+
+run_file_70 FileInfoBlock
+image_data dd 0 ;указатель на временную память. для нужен преобразования изображения
+
+IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
+IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*15
+image_data_toolbar dd 0
+
+TREE_ICON_SYS16_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*11+54 ;размер bmp файла с системными иконками
+icon_tl_sys dd 0 ;указатель на память для хранения системных иконок
+TOOLBAR_ICON_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*5+54 ;размер bmp файла с иконками объектов
+icon_toolbar dd 0 ;указатель на память для хранения иконок объектов
+
+IMAGE_FONT_SIZE equ 128*144*3
+image_data_gray dd 0 ;память с временными серыми изображениями в формате 24-bit, из которых будут создаваться трафареты
+
+macro load_image_file path,buf,size { ;макрос для загрузки изображений
+ ;path - может быть переменной или строковым параметром
+ if path eqtype '' ;проверяем задан ли строкой параметр path
+ jmp @f
+ local .path_str
+ .path_str db path ;формируем локальную переменную
+ db 0
+ @@:
+ ;32 - стандартный адрес по которому должен быть буфер с системным путем
+ copy_path .path_str,[32],file_name,0x0
+ else
+ copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
+ end if
+
+ stdcall mem.Alloc, dword size ;выделяем память для изображения
+ mov [buf],eax
+
+ mov eax,70 ;70-я функция работа с файлами
+ mov [run_file_70.Function], 0
+ mov [run_file_70.Position], 0
+ mov [run_file_70.Flags], 0
+ mov [run_file_70.Count], dword size
+ m2m [run_file_70.Buffer], [buf]
+ mov byte[run_file_70+20], 0
+ mov [run_file_70.FileName], file_name
+ mov ebx,run_file_70
+ int 0x40 ;загружаем файл изображения
+ cmp ebx,0xffffffff
+ je @f
+ ;определяем вид изображения и переводим его во временный буфер image_data
+ stdcall dword[img_decode], dword[buf],ebx,0
+ mov dword[image_data],eax
+ ;преобразуем изображение к формату rgb
+ stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
+ ;удаляем временный буфер image_data
+ stdcall dword[img_destroy], dword[image_data]
+ @@:
+}
+
+
+
+align 4
+start:
+ load_libraries l_libs_start,l_libs_end
+ ;проверка на сколько удачно загузилась библиотека
+ mov ebp,lib_7
+ cmp dword [ebp+ll_struc_size-4],0
+ jz @f
+ mcall -1 ;exit not correct
+ @@:
+ mcall 48,3,sc,sizeof.system_colors
+ mcall 40,0x27
+ stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
+ stdcall [buf2d_create], buf_0 ;создание буфера
+ load_image_file 'toolbar.png', image_data_toolbar,IMAGE_TOOLBAR_SIZE
+
+ stdcall pole_init, pole
+ stdcall dword[tl_data_init], tree1
+
+ ;системные иконки 16*16 для tree_list
+ load_image_file 'tl_sys_16.png', icon_tl_sys,TREE_ICON_SYS16_BMP_SIZE
+ ;если изображение не открылось, то в icon_tl_sys будут
+ ;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера
+ mov eax,dword[icon_tl_sys]
+ mov dword[tree1.data_img_sys],eax
+
+ load_image_file 'objects.png', icon_toolbar,TOOLBAR_ICON_BMP_SIZE
+ mov eax,dword[icon_toolbar]
+ mov dword[tree1.data_img],eax
+
+ load_image_file 'font6x9.bmp', image_data_gray,IMAGE_FONT_SIZE
+ stdcall [buf2d_create_f_img], buf_font,[image_data_gray] ;создаем буфер
+ stdcall mem.Free,[image_data_gray] ;освобождаем память
+
+ stdcall [buf2d_conv_24_to_8], buf_font,1 ;делаем буфер прозрачности 8 бит
+ stdcall [buf2d_convert_text_matrix], buf_font
+
+ stdcall sign_init, 3000
+
+ mcall 26,9
+ mov [last_time],eax
+
+align 4
+red_win:
+ call draw_window
+
+align 4
+still:
+ mcall 26,9
+ mov ebx,[last_time]
+ add ebx,10 ;задержка
+ cmp ebx,eax
+ jge @f
+ mov ebx,eax
+ @@:
+ sub ebx,eax
+ ;cmp ebx,10 ;задержка
+ ;ja timer_funct
+ ;test ebx,ebx
+ ;jz timer_funct
+ mcall 23
+ cmp eax,0
+ je timer_funct
+
+ cmp al,1
+ jz red_win
+ cmp al,EV_KEY
+ jz key
+ cmp al,3
+ jz button
+ cmp al,EV_MOUSE
+ jne @f
+ call mouse
+ @@:
+ jmp still
+
+align 4
+timer_funct:
+ pushad
+ mcall 26,9
+ mov [last_time],eax
+
+ cmp byte[tim_ch],0
+ je @f
+ inc dword[time]
+ call sign_move
+ mov eax,[time]
+ and eax,11b ;кратность 4-м
+ jnz @f
+ call sign_from_elems
+ call sign_from_captions
+ @@:
+
+ popad
+ jmp still
+
+align 4
+mouse:
+ stdcall [tl_mouse], tree1
+
+ push eax ebx ecx edx
+ mcall 37,2 ;нажатые кнопки мыши
+ bt eax,0 ;левая кнопка нажата?
+ jnc .end_buf_wnd
+
+ mcall 37,1 ;eax = (x shl 16) + y
+ cmp ax,word[buf_0.t]
+ jl .end_buf_wnd ;не попали в окно буфера по оси y
+
+ mov ebx,eax
+ shr ebx,16
+ cmp bx,word[buf_0.l]
+ jl .end_buf_wnd ;не попали в окно буфера по оси x
+
+ and eax,0xffff ;оставляем координату y
+ sub ax,word[buf_0.t]
+ sub bx,word[buf_0.l]
+ ;*** деление на zoom
+ movzx ecx,byte[zoom]
+ xor edx,edx
+ div ecx
+ xchg eax,ebx ;ebx делим на ecx
+ xor edx,edx
+ div ecx
+
+ sub eax,[Cor_x]
+ sub ebx,[Cor_y]
+
+ ;*** проверка на попадение в схему
+ bt eax,31
+ jc .end_buf_wnd
+ bt ebx,31
+ jc .end_buf_wnd
+ cmp eax,[shem_w]
+ jge .end_buf_wnd
+ cmp ebx,[shem_h]
+ jge .end_buf_wnd
+
+ cmp byte[pen_mode],1
+ jne @f
+ ;режим рисования провода
+ stdcall pole_cell_creat, pole,eax,ebx,0
+ ;ничего не убралось redraw_pole не подходит, т. к. чистить поле не нужно
+ stdcall pole_paint, pole
+ stdcall [buf2d_draw], buf_0
+ ;stdcall but_test_pole, pole
+ jmp .end_buf_wnd
+ @@:
+ cmp byte[pen_mode],2
+ jne @f
+ ;режим рисования изоляции для провода
+ stdcall pole_cell_creat, pole,eax,ebx,2
+ stdcall pole_paint, pole
+ stdcall [buf2d_draw], buf_0
+ ;stdcall but_test_pole, pole
+ jmp .end_buf_wnd
+ @@:
+ cmp byte[pen_mode],3
+ jne @f
+ ;режим стирания провода
+ stdcall pole_cell_delete, pole,eax,ebx
+ call redraw_pole
+ ;stdcall but_test_pole, pole
+ jmp .end_buf_wnd
+ @@:
+
+ .end_buf_wnd:
+ pop edx ecx ebx eax
+ ret
+
+align 4
+draw_window:
+pushad
+ mcall 12,1
+
+ ; *** рисование главного окна (выполняется 1 раз при запуске) ***
+ xor eax,eax
+ mov ebx,(20 shl 16)+520
+ mov ecx,(20 shl 16)+415
+ mov edx,[sc.work]
+ or edx,(3 shl 24)+0x10000000+0x20000000
+ mov edi,caption
+ int 0x40
+
+ ; *** создание кнопок на панель ***
+ mov eax,8
+ mov ebx,(5 shl 16)+20
+ mov ecx,(panel_0_coord_top shl 16)+20
+ mov edx,3
+ mov esi,[sc.work_button]
+ int 0x40
+
+ mov ebx,(30 shl 16)+20
+ mov edx,4
+ int 0x40
+
+ mov ebx,(55 shl 16)+20
+ mov edx,5
+ int 0x40
+
+ mov ebx,(85 shl 16)+20
+ mov edx,6
+ int 0x40
+
+ mov ebx,(110 shl 16)+20
+ mov edx,7
+ int 0x40
+
+ mov ebx,(135 shl 16)+20
+ mov edx,8
+ int 0x40
+
+ mov ebx,(160 shl 16)+20
+ mov edx,9
+ int 0x40
+
+ mov ebx,(185 shl 16)+20
+ mov edx,10
+ int 0x40
+
+ mov ebx,(210 shl 16)+20
+ mov edx,11
+ int 0x40
+
+ mov ebx,(235 shl 16)+20
+ mov edx,12
+ int 0x40
+
+ mov ebx,(265 shl 16)+20
+ mov edx,13
+ int 0x40
+
+ ; *** рисование иконок на кнопках ***
+ mov eax,7
+ mov ebx,[image_data_toolbar]
+ mov ecx,(16 shl 16)+16
+ mov edx,(7 shl 16)+panel_0_coord_top+2 ;icon new
+ int 0x40
+
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;icon open
+ int 0x40
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;icon save
+ int 0x40
+
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(30 shl 16) ;+
+ int 0x40
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;-
+ int 0x40
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;
+ int 0x40
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;m
+ int 0x40
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;m
+ int 0x40
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;m
+ int 0x40
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;m
+ int 0x40
+
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(30 shl 16) ;center
+ int 0x40
+
+ ; *** рисование буфера ***
+ stdcall [buf2d_draw], buf_0
+ mov dword[wScrObj.all_redraw],1
+ stdcall [tl_draw], tree1
+ stdcall pole_draw_pok, pole
+
+ ; *** создание кнопок установки сигналов set_0 и set_1 ***
+ mov eax,8
+ mov ebx,(5 shl 16)+20
+ mov ecx,(panel_1_coord_top shl 16)+20
+ mov edx,20
+ mov esi,[sc.work_button]
+ int 0x40
+
+ add ebx,25 shl 16
+ mov edx,21
+ int 0x40
+
+ add ebx,30 shl 16
+ mov edx,22
+ int 0x40
+
+ add ebx,25 shl 16
+ mov edx,23
+ int 0x40
+
+ add ebx,25 shl 16
+ mov edx,24
+ int 0x40
+
+ add ebx,25 shl 16
+ mov edx,25
+ int 0x40
+
+ mov eax,4 ;рисование текста
+ mov ebx,(10 shl 16)+panel_1_coord_top+5
+ mov ecx,[sc.work_text]
+ or ecx,0x80000000 ;or (1 shl 30)
+ mov edx,txt_set_0
+ ;mov edi,[sc.work]
+ int 0x40
+
+ add ebx,25 shl 16
+ mov edx,txt_set_1
+ int 0x40
+
+ add ebx,35 shl 16
+ mov edx,txt_mov_l
+ int 0x40
+
+ add ebx,25 shl 16
+ mov edx,txt_mov_r
+ int 0x40
+
+ ; *** создание кнопок рисования провода ***
+ mov eax,8
+ mov ebx,(5 shl 16)+20
+ mov ecx,(panel_2_coord_top shl 16)+20
+ mov edx,30
+ mov esi,[sc.work_button]
+ int 0x40
+
+ add ebx,25 shl 16
+ mov edx,31
+ int 0x40
+
+ add ebx,25 shl 16
+ mov edx,32
+ int 0x40
+
+ add ebx,25 shl 16
+ mov edx,33
+ int 0x40
+
+ ; *** рисование иконок на кнопках ***
+ mov eax,7
+ mov ebx,[image_data_toolbar]
+ mov ecx,(16 shl 16)+16
+ mov edx,(7 shl 16)+panel_2_coord_top+2 ;иконка стрела
+
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE*11
+ int 0x40
+
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;icon pen 1
+ int 0x40
+
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;icon pen 2
+ int 0x40
+
+ add ebx,IMAGE_TOOLBAR_ICON_SIZE
+ add edx,(25 shl 16) ;icon pen 3
+ int 0x40
+
+ mcall 12,2
+popad
+ ret
+
+align 4
+key:
+ mcall 2
+ stdcall [tl_key], dword tree1
+ jmp still
+
+
+align 4
+button:
+ mcall 17
+ cmp ah,3
+ jne @f
+ call but_new_file
+ @@:
+ cmp ah,4
+ jne @f
+ call but_open_file
+ @@:
+ cmp ah,5
+ jne @f
+ call but_save_file
+ @@:
+ cmp ah,6
+ jne @f
+ call but_run_stop
+ @@:
+ cmp ah,7
+ jne @f
+ call but_zoom_p
+ @@:
+ cmp ah,8
+ jne @f
+ call but_zoom_m
+ @@:
+ cmp ah,9
+ jne @f
+ call but_pole_left
+ @@:
+ cmp ah,10
+ jne @f
+ call but_pole_right
+ @@:
+ cmp ah,11
+ jne @f
+ call but_pole_up
+ @@:
+ cmp ah,12
+ jne @f
+ call but_pole_dn
+ @@:
+ cmp ah,13
+ jne @f
+ call but_center
+ @@:
+ cmp ah,20
+ jne @f
+ call but_set_0
+ @@:
+ cmp ah,21
+ jne @f
+ call but_set_1
+ @@:
+ cmp ah,22
+ jne @f
+ call but_mov_l
+ @@:
+ cmp ah,23
+ jne @f
+ call but_mov_r
+ @@:
+ cmp ah,24
+ jne @f
+ call but_mov_u
+ @@:
+ cmp ah,25
+ jne @f
+ call but_mov_d
+ @@:
+ cmp ah,30
+ jne @f
+ call but_set_none
+ @@:
+ cmp ah,31
+ jne @f
+ call but_set_pen_1
+ @@:
+ cmp ah,32
+ jne @f
+ call but_set_pen_2
+ @@:
+ cmp ah,33
+ jne @f
+ call but_set_pen_3
+ @@:
+ cmp ah,1
+ jne still
+.exit:
+ stdcall [buf2d_delete],buf_0
+ stdcall [buf2d_delete],buf_font
+ stdcall mem.Free,[image_data_toolbar]
+ stdcall pole_delete, pole
+ call sign_delete
+ stdcall [tl_data_clear], tree1
+ mcall -1
+
+
+align 4
+but_new_file:
+ stdcall pole_clear, pole
+ call redraw_pole
+ ret
+
+align 4
+f_size dd 0 ;размер открываемого файла
+shem_w dd 192 ;ширина схемы
+shem_h dd 128 ;высота схемы
+shem_points dd 0 ;колличество узлов на схеме
+shem_sub_points dd 0 ;колличество изолированных узлов на схеме
+shem_elems dd 0 ;колличество элементов на схеме
+shem_captions dd 0
+shem_colors:
+ dd color_s0, color_s1, color_s2, color_s3
+
+align 4
+open_file_lif:
+ rb 2*4096 ;область для открытия файлов
+.end:
+
+align 4
+but_open_file:
+ pushad
+ copy_path open_dialog_name,communication_area_default_path,file_name,0
+ mov [OpenDialog_data.type],0
+ stdcall [OpenDialog_Start],OpenDialog_data
+ cmp [OpenDialog_data.status],2
+ je .end_open_file
+ ;код при удачном открытии диалога
+
+ mov eax,70 ;70-я функция работа с файлами
+ mov [run_file_70.Function], 0
+ mov [run_file_70.Position], 0
+ mov [run_file_70.Flags], 0
+ mov dword[run_file_70.Count], open_file_lif.end-open_file_lif
+ m2m [run_file_70.Buffer], open_file_lif
+ mov byte[run_file_70+20], 0
+ mov dword[run_file_70.FileName], openfile_path
+ mov ebx,run_file_70
+ int 0x40 ;загружаем файл
+ cmp ebx,0xffffffff
+ je .end_open_file
+
+ mov dword[f_size],ebx
+ add ebx,open_file_lif
+ mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом
+ mcall 71,1,openfile_path
+ ;---
+
+ ;задаем минимальные значения, на случай если в файле будут некоректные размеры
+ mov dword[shem_w],5
+ mov dword[shem_h],5
+
+ mov esi,txt_size
+ call str_analiz_r
+ cmp edi,0
+ je @f
+ stdcall str_len,esi
+ add edi,eax
+ stdcall conv_str_to_int,edi
+ cmp eax,5
+ jl @f ;ошибка в файле (на .end_open_file не переходим, пытаемся прочитать другую информацию)
+ mov dword[shem_w],eax
+
+ call str_next_val
+ stdcall conv_str_to_int,edi
+ cmp eax,5
+ jl @f ;ошибка в файле
+ mov dword[shem_h],eax
+ @@:
+
+ stdcall [tl_info_clear],tree1
+
+ ;*** добавление в список логических элементов ***
+ stdcall [tl_node_add], txt_elements-capt_offs,(el_icon_group shl 16), tree1
+ stdcall [tl_cur_next], tree1
+
+ mov esi,txt_elements
+ call str_analiz_r
+ cmp edi,0
+ je .end_elems
+ stdcall str_len,esi
+ add edi,eax
+ stdcall conv_str_to_int,edi
+ cmp eax,0
+ jle .end_elems ;если число элементов = 0
+ mov [shem_elems],eax
+ mov ecx,eax
+ .cycle_elem:
+ call str_next_val
+ stdcall conv_str_to_int,edi
+ mov dword[txt_buf],eax ;координата x
+ call str_next_val
+ stdcall conv_str_to_int,edi
+ mov dword[txt_buf+4],eax ;координата y
+ call str_next_val
+ stdcall conv_str_to_int,edi
+ mov byte[txt_buf+8],al ;направление
+ call str_next_val
+ ;по адресу edi название элемента
+ stdcall el_get_name, edi
+ mov byte[txt_buf+sp_offs_el_type],al ;тип элемента
+
+ stdcall make_list_capts,txt_buf,edi
+
+ stdcall [tl_node_add], txt_buf,(el_icon_elems shl 16)+1, tree1
+ stdcall [tl_cur_next], tree1
+ dec ecx
+ jnz .cycle_elem
+ .end_elems:
+
+ ;*** добавление в список текстовых подписей ***
+ stdcall [tl_node_add], txt_captions-capt_offs,(el_icon_group shl 16), tree1
+ stdcall [tl_cur_next], tree1
+
+ mov esi,txt_captions
+ call str_analiz_r
+ cmp edi,0
+ je .end_captions
+ stdcall str_len,esi
+ add edi,eax
+ stdcall conv_str_to_int,edi
+ cmp eax,0
+ jle .end_captions ;если число подписей = 0
+ mov [shem_captions],eax
+ mov ecx,eax
+ .cycle_captions:
+ call str_next_val
+ stdcall conv_str_to_int,edi
+ mov dword[txt_buf],eax ;координата x
+ call str_next_val
+ stdcall conv_str_to_int,edi
+ mov dword[txt_buf+4],eax ;координата y
+ call str_next_val
+ mov al,byte[edi]
+ mov byte[txt_buf+8],al ;вид подписи ('z' - сигнал с 0, 'o' - сигнал с 1, 'n' - нет сигнала)
+ call str_next_val
+
+ stdcall make_list_capts,txt_buf,edi
+
+ stdcall [tl_node_add], txt_buf,(el_icon_captions shl 16)+1, tree1
+ stdcall [tl_cur_next], tree1
+ dec ecx
+ jnz .cycle_captions
+ .end_captions:
+
+ mov byte[txt_buf+capt_offs],0 ;обнуление подписей
+
+ ;*** добавление в список ключевых точек ***
+ stdcall [tl_node_add], txt_points-capt_offs,(el_icon_group shl 16), tree1
+ stdcall [tl_cur_next], tree1
+
+ mov dword[shem_points],0
+ mov esi,txt_points
+ call str_analiz_r
+ cmp edi,0
+ je .end_points ;если описания точек нет в файле
+ stdcall str_len,esi
+ add edi,eax
+ stdcall conv_str_to_int,edi
+ cmp eax,0
+ jle .end_points ;если число точек = 0
+ mov [shem_points],eax
+ mov ecx,eax
+ .cycle_poi:
+ call str_next_val
+ stdcall conv_str_to_int,edi
+ mov dword[txt_buf],eax ;координата x
+ call str_next_val
+ stdcall conv_str_to_int,edi
+ mov dword[txt_buf+4],eax ;координата y
+ call str_next_val
+ stdcall conv_str_to_int,edi
+ mov byte[txt_buf+8],al ;направления
+
+; stdcall make_list_capts,txt_buf,0
+
+ stdcall [tl_node_add], txt_buf,(el_icon_points shl 16)+1, tree1
+ stdcall [tl_cur_next], tree1
+ dec ecx
+ jnz .cycle_poi
+ .end_points:
+
+ stdcall [tl_cur_beg], tree1
+
+ ;*** добавление точечных объектов ***
+ stdcall pole_clear, pole
+ stdcall dword[tl_node_poi_get_info],0,tree1
+ pop esi
+ @@:
+ cmp esi,0
+ je @f
+ cmp word[esi],el_icon_points ;получение через esi тип иконки, и пропуск не точечных объектов
+ jne .end_add_p0
+ stdcall [tl_node_poi_get_data], esi, tree1
+ pop eax
+ stdcall pole_cell_creat, pole,dword[eax],dword[eax+4],0
+ .end_add_p0:
+ stdcall dword[tl_node_poi_get_next_info],esi,tree1
+ pop esi ;переходим к следущему узлу
+ jmp @b
+ @@:
+ stdcall pole_sort, pole
+
+ ;*** добавление точечных объектов (на основе логических элементов) ***
+ stdcall dword[tl_node_poi_get_info],0,tree1
+ pop esi
+ @@:
+ cmp esi,0
+ je @f
+ cmp word[esi],el_icon_elems ;получение через esi тип иконки
+ jne .end_add_p3
+ stdcall [tl_node_poi_get_data], esi, tree1
+ pop ecx
+
+ xor edx,edx ;edx - номер входной ноги
+ .add_p1:
+ stdcall el_get_leg_coords, ecx,edx
+ test eax,eax
+ jnz .add_beg1
+ test ebx,ebx
+ jnz .add_beg1
+ jmp .end_add_p1 ;если координаты не взялись (eax=0 && ebx=0), выход из цикла
+ .add_beg1:
+ stdcall pole_cell_creat, pole,eax,ebx,0
+ inc edx
+ jmp .add_p1
+ .end_add_p1:
+
+ mov edx,(1 shl 16) ;edx - номер выходной ноги
+ .add_p2:
+ stdcall el_get_leg_coords, ecx,edx
+ test eax,eax
+ jnz .add_beg2
+ test ebx,ebx
+ jnz .add_beg2
+ jmp .end_add_p2 ;если координаты не взялись (eax=0 && ebx=0), выход из цикла
+ .add_beg2:
+ stdcall pole_cell_creat, pole,eax,ebx,0
+ inc edx
+ jmp .add_p2
+ .end_add_p2:
+
+ .end_add_p3:
+ stdcall dword[tl_node_poi_get_next_info],esi,tree1
+ pop esi ;переходим к следущему узлу
+ jmp @b
+ @@:
+ stdcall pole_sort, pole
+
+ ;*** добавление точечных объектов (на основе подписей) ***
+ stdcall dword[tl_node_poi_get_info],0,tree1
+ pop esi
+ @@:
+ cmp esi,0
+ je @f
+ cmp word[esi],el_icon_captions ;получение через esi тип иконки
+ jne .end_add_p6
+ stdcall [tl_node_poi_get_data], esi, tree1
+ pop ecx
+ cmp byte[ecx+8],'n'
+ je .end_add_p6
+ stdcall pole_cell_creat, pole,[ecx],[ecx+4],0
+ .end_add_p6:
+ stdcall dword[tl_node_poi_get_next_info],esi,tree1
+ pop esi ;переходим к следущему узлу
+ jmp @b
+ @@:
+ stdcall pole_sort, pole
+
+ ;*** рисование проводов (на основе точечных объектов) ***
+ stdcall dword[tl_node_poi_get_info],0,tree1
+ pop esi
+ xor ecx,ecx
+ @@:
+ cmp esi,0
+ je @f
+ cmp word[esi],el_icon_points ;получение через esi тип иконки, и пропуск не точечных объектов
+ jne .end_add_p4
+ stdcall [tl_node_poi_get_data], esi, tree1
+ pop eax
+ movzx ebx,byte[eax+8]
+ stdcall shem_create_line, dword[eax],dword[eax+4],ebx
+ add ecx,edx
+ .end_add_p4:
+ stdcall dword[tl_node_poi_get_next_info],esi,tree1
+ pop esi ;переходим к следущему узлу
+ cmp ecx,250 ;ecx - число добавленных точек
+ jl @b
+ xor ecx,ecx
+ stdcall pole_sort, pole ;сортируем для оптимизации быстродействия
+ jmp @b
+ @@:
+ stdcall pole_sort, pole
+
+ stdcall pole_reset_cells, pole ;чистка проводов
+
+ ;*** добавление изоляционных объектов (прямо из файла, минуя запись в список) ***
+ mov dword[shem_sub_points],0
+ mov esi,txt_sub_points
+ call str_analiz_r
+ cmp edi,0
+ je .end_sub_points ;если описания точек нет в файле
+ stdcall str_len,esi
+ add edi,eax
+ stdcall conv_str_to_int,edi
+ cmp eax,0
+ jle .end_sub_points ;если число точек = 0
+ mov [shem_sub_points],eax
+ mov ecx,eax
+ .cycle_sub_poi:
+ call str_next_val
+ stdcall conv_str_to_int,edi
+ mov ebx,eax ;координата x
+ call str_next_val
+ stdcall conv_str_to_int,edi ;координата y
+ stdcall pole_cell_creat, pole,ebx,eax,2
+
+ dec ecx
+ jnz .cycle_sub_poi
+ .end_sub_points:
+
+ stdcall pole_sort, pole
+
+ ;*** удаление ключевых точек со списка ***
+ mov ecx,[shem_points]
+ inc ecx
+ cld
+ @@:
+ stdcall [tl_info_undo],tree1
+ loop @b
+
+ ;*** формирование подписей о параметрах схемы ***
+ mov dword[txt_info.size],0
+ mov eax,dword[shem_w]
+ mov edi,txt_info.size
+ call convert_int_to_str
+ stdcall str_cat, edi,txt_mull
+ mov eax,dword[shem_h]
+ mov edi,txt_buf
+ call convert_int_to_str
+ stdcall str_cat, txt_info.size,edi
+ stdcall str_cat, txt_info.size,txt_space ;завершающий пробел
+
+ ;---
+ call but_center ;центровка схемы с учетом shem_w и shem_h
+ .end_open_file:
+ popad
+ ret
+
+align 4
+proc but_save_file
+locals
+ napr dd ?
+endl
+pushad
+ ;*** вызов диалогового окна для сохранения файла
+ copy_path open_dialog_name,communication_area_default_path,file_name,0
+ mov [OpenDialog_data.type],1
+ stdcall [OpenDialog_Start],OpenDialog_data
+ cmp [OpenDialog_data.status],1 ;if status==1 then save
+ jne .end_save_file
+
+ ;*** проверка есть ли провода на схеме
+ mov edi,pole
+ mov esi,pole_index
+ cmp dword[esi],0
+ je .cycle1_beg ;.end_save_file ;если нет ячеек (проводов) то выход
+
+ ;*** устанавливаем метки на ключевые точки, которые будут сохранены в файл
+ mov dword[shem_points],0 ;для переопределения точек
+ mov dword[shem_sub_points],0
+ mov ecx,dword[esi]
+ .cycle0: ;цикл по всем точкам
+ add esi,4
+ mov ebx,[esi]
+ imul ebx,sizeof.Cell
+ add ebx,pole_data
+
+ cmp byte[ebx+offs_cell_liv],2
+ jne @f
+ inc dword[shem_sub_points]
+ jmp .cycle0_next
+ @@:
+
+ mov dword[napr],0
+
+ mov edx,[ebx+offs_cell_y]
+ push edx
+ mov edx,[ebx+offs_cell_x]
+ inc edx
+ push edx
+ stdcall pole_cell_find, edi
+ cmp eax,0
+ je @f
+ or dword[napr],1
+ @@:
+
+ mov edx,[ebx+offs_cell_y]
+ inc edx
+ push edx
+ mov edx,[ebx+offs_cell_x]
+ push edx
+ stdcall pole_cell_find, edi
+ cmp eax,0
+ je @f
+ or dword[napr],2
+ @@:
+
+ mov edx,[ebx+offs_cell_y]
+ push edx
+ mov edx,[ebx+offs_cell_x]
+ dec edx
+ push edx
+ stdcall pole_cell_find, edi
+ cmp eax,0
+ je @f
+ or dword[napr],4
+ @@:
+
+ mov edx,[ebx+offs_cell_y]
+ dec edx
+ push edx
+ mov edx,[ebx+offs_cell_x]
+ push edx
+ stdcall pole_cell_find, edi
+ cmp eax,0
+ je @f
+ or dword[napr],8
+ @@:
+
+ cmp dword[napr],5
+ je @f
+ cmp dword[napr],10
+ je @f
+ cmp dword[napr],15
+ je @f
+ mov eax,dword[napr]
+ mov byte[ebx+offs_cell_liv],3 ;установка метки
+ mov byte[ebx+offs_cell_napr],al ;установка направлений
+ inc dword[shem_points]
+ @@:
+ .cycle0_next:
+ dec ecx
+ jnz .cycle0
+
+ ;*** снятие метки с точек, которые находятся на входных ногах логических элементов
+ .cycle1_beg:
+ mov dword[shem_elems],0 ;для пепеопределения числа элементов
+ stdcall dword[tl_node_poi_get_info],0,tree1
+ pop esi
+ .cycle1:
+ cmp esi,0
+ je .cycle1_end
+ cmp word[esi],el_icon_elems ;получение через esi тип иконки
+ jne .end_add_p1
+ stdcall [tl_node_poi_get_data], esi, tree1
+ pop ecx
+ inc dword[shem_elems]
+
+ xor edx,edx ;edx - номер входной ноги
+ @@:
+ stdcall el_get_leg_coords, ecx,edx
+ test eax,eax
+ jz @f ;если координаты не взялись (eax=0 && ebx=0)
+ test ebx,ebx
+ jz @f ;если координаты не взялись (eax=0 && ebx=0)
+ stdcall pole_cell_find, edi,eax,ebx
+ test eax,eax
+ jz .no_erase
+ get_cell_offset ebx,eax
+ mov byte[ebx+offs_cell_liv],0 ;снятие метки
+ dec dword[shem_points]
+ .no_erase:
+ inc edx
+ jmp @b
+ @@:
+ ;mov edx,(1 shl 16) ;edx - номер выходной ноги
+
+ .end_add_p1:
+ stdcall dword[tl_node_poi_get_next_info],esi,tree1
+ pop esi ;переходим к следущему узлу
+ jmp .cycle1
+ .cycle1_end:
+
+ ;*** создание информации для записи в файл ***
+ mov edi,open_file_lif
+ stdcall mem_copy,edi,txt_size,5
+ stdcall str_cat,edi,txt_space
+ mov eax,dword[shem_w]
+ add edi,5
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,[shem_h]
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_nl
+
+ ;*** сохранение логических элементов ***
+ stdcall str_cat,edi,txt_elements
+ stdcall str_cat,edi,txt_space
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,[shem_elems]
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_nl
+
+ cmp eax,1
+ jl .cycle2_end
+ stdcall dword[tl_node_poi_get_info],0,tree1
+ pop esi
+ .cycle2:
+ cmp esi,0
+ je .cycle2_end
+ cmp word[esi],el_icon_elems ;получение через esi тип иконки
+ jne .end_add_p2
+ stdcall [tl_node_poi_get_data], esi, tree1
+ pop ecx
+
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,[ecx] ;coord x
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,[ecx+4] ;coord y
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+
+ stdcall str_len,edi
+ add edi,eax
+ movzx eax,byte[ecx+8] ;angle
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+
+ ;имя элемента
+ movzx eax,byte[ecx+sp_offs_el_type]
+ imul eax,size_el_opt
+ add eax,el_opt_beg+el_offs_nam
+ stdcall str_cat,edi,eax
+
+ stdcall str_cat,edi,txt_nl
+
+ .end_add_p2:
+ stdcall dword[tl_node_poi_get_next_info],esi,tree1
+ pop esi ;переходим к следущему узлу
+ jmp .cycle2
+ .cycle2_end:
+
+ ;*** сохранение подписей ***
+ stdcall str_cat,edi,txt_captions
+ stdcall str_cat,edi,txt_space
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,[shem_captions]
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_nl
+
+ cmp eax,1
+ jl .cycle3_end
+ stdcall dword[tl_node_poi_get_info],0,tree1
+ pop esi
+ .cycle3:
+ cmp esi,0
+ je .cycle3_end
+ cmp word[esi],el_icon_captions ;получение через esi тип иконки
+ jne .end_add_p3
+ stdcall [tl_node_poi_get_data], esi, tree1
+ pop ecx
+
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,[ecx] ;coord x
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,[ecx+4] ;coord y
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+
+ stdcall str_len,edi
+ add edi,eax
+ movzx eax,byte[ecx+8] ;n,z,o
+ mov ah,' ' ;пробел после буквы, что бы не добавлять txt_space
+ mov dword[edi],eax ;al
+
+ ;имя элемента
+ mov ebx,edi
+ mov edi,ecx
+ add edi,capt_offs
+ call str_next_val
+ call str_next_val
+ ;call str_next_val
+ xchg ebx,edi
+ stdcall str_cat,edi,ebx
+
+ stdcall str_cat,edi,txt_nl
+
+ .end_add_p3:
+ stdcall dword[tl_node_poi_get_next_info],esi,tree1
+ pop esi ;переходим к следущему узлу
+ jmp .cycle3
+ .cycle3_end:
+
+ ;*** сохранение ключевых точек ***
+ stdcall str_cat,edi,txt_points
+ stdcall str_cat,edi,txt_space
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,[shem_points]
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_nl
+
+ mov eax,edi
+ mov edi,pole
+ mov esi,pole_index
+ cmp dword[esi],0
+ je .no_points ;если нет ячеек (проводов) то пропуск
+ mov ebx,pole_data
+ mov dword[napr],ebx
+ mov edi,eax
+
+ mov ecx,dword[esi]
+ .cycle4: ;цикл по всем точкам
+ add esi,4
+ mov ebx,[esi]
+ imul ebx,sizeof.Cell
+ add ebx,dword[napr] ;pole_data
+
+ movzx edx,word[ebx+offs_cell_liv] ;also use offs_cell_napr
+ cmp dl,3
+ jne @f
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,dword[ebx+offs_cell_x]
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,dword[ebx+offs_cell_y]
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+
+ stdcall str_len,edi
+ add edi,eax
+ movzx eax,dh
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+ ;stdcall str_cat,edi,txt_nl
+ @@:
+ dec ecx
+ jnz .cycle4
+ stdcall str_cat,edi,txt_nl
+
+ ;*** сохранение изоляционных точек ***
+ stdcall str_cat,edi,txt_sub_points
+ stdcall str_cat,edi,txt_space
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,[shem_sub_points]
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_nl
+
+ mov eax,edi
+ mov edi,pole
+ mov esi,pole_index
+ ;cmp dword[esi],0
+ ;je .no_points ;если нет ячеек (проводов) то пропуск
+ ;mov ebx,pole_data
+ ;mov dword[napr],ebx
+ mov edi,eax
+
+ mov ecx,dword[esi]
+ .cycle5: ;цикл по всем точкам
+ add esi,4
+ mov ebx,[esi]
+ imul ebx,sizeof.Cell
+ add ebx,dword[napr] ;pole_data
+
+ movzx edx,byte[ebx+offs_cell_liv]
+ cmp dl,2
+ jne @f
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,dword[ebx+offs_cell_x]
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,dword[ebx+offs_cell_y]
+ stdcall convert_int_to_str
+ stdcall str_cat,edi,txt_space
+
+ ;stdcall str_cat,edi,txt_nl
+ @@:
+ dec ecx
+ jnz .cycle5
+ stdcall str_cat,edi,txt_nl
+
+ .no_points:
+
+ ;*** определение параметров файла
+ mov edi,open_file_lif
+ stdcall str_len,edi
+ mov ecx,eax
+
+ ;*** запись файла
+ mov eax,70
+ mov [run_file_70.Function], 2
+ mov [run_file_70.Position], 0
+ mov [run_file_70.Flags], 0
+ mov dword[run_file_70.Count], ecx
+ mov [run_file_70.Buffer], edi
+ mov byte[run_file_70+20], 0
+ mov dword[run_file_70.FileName], openfile_path
+ mov ebx,run_file_70
+ int 0x40 ;сохраняем файл
+
+ call redraw_pole
+ .end_save_file:
+popad
+ ret
+endp
+
+;формирование подписи для списка
+align 4
+proc make_list_capts uses eax ebx ecx edi, buf:dword, txt:dword
+ mov ebx,dword[buf]
+
+ mov edi,ebx
+ add edi,capt_offs
+ mov dword[edi],' ' ;пробелы для выравнивания маленьких чисел
+
+ mov eax,dword[ebx] ;+0 - offset coord x
+ cmp eax,100
+ jge @f
+ inc edi
+ @@:
+ cmp eax,10
+ jge @f
+ inc edi
+ @@:
+ call convert_int_to_str ;координата x (для подписи)
+ stdcall str_cat,edi,txt_space
+ stdcall str_len,edi
+ add edi,eax
+ mov eax,dword[ebx+4] ;+4 - offset coord y
+ call convert_int_to_str ;координата y (для подписи)
+ stdcall str_cat,edi,txt_space
+
+ mov edi,dword[txt]
+ cmp edi,0
+ je .end_f
+ stdcall str_len,edi ;eax = strlen([edi])
+ mov ecx,edi
+ call str_next_spaces
+ sub edi,ecx ;определяем длинну подписи
+
+ cmp edi,eax
+ jle @f
+ mov edi,eax ;если строка закончилась не пробелом
+ @@:
+ ;cmp edi,1
+ ;jge @f
+ ; mov edi,1 ;минимум 1 символ
+ ;@@:
+
+ add ebx,capt_offs
+ stdcall str_n_cat, ebx,ecx,edi
+ .end_f:
+ ret
+endp
+
+;output:
+; eax - тип элемента
+align 4
+proc el_get_name uses ecx edi esi, str:dword
+ mov edi,[str]
+ mov esi,el_opt_beg+el_offs_nam
+ xor ecx,ecx
+ @@:
+ stdcall str_instr, edi,esi
+ cmp eax,0
+ je @f
+ add esi,size_el_opt
+ cmp esi,el_opt_beg.end
+ jge @f
+ inc ecx
+ jmp @b
+ @@:
+ mov eax,ecx
+ ret
+endp
+
+;input:
+; el_data - указатель на данные элемента
+; l_opt - номер ноги, для которой ищутся координаты, входная/выходная нога
+;output:
+; eax - coord x (if not found eax=0)
+; ebx - coord y (if not found ebx=0)
+align 4
+proc el_get_leg_coords uses ecx edx edi esi, el_data:dword, l_opt:dword
+ mov edi,[el_data] ;данные элемента
+ movzx esi,byte[edi+sp_offs_el_type] ;тип элемента
+ imul esi,size_el_opt
+ add esi,el_opt_beg
+ ;esi+el_offs_legs_inp - указатель на параметры 0-й входной ноги
+
+ mov eax,[edi+0]
+ mov ebx,[edi+4]
+ mov edx,[l_opt]
+ movzx edi,byte[edi+8] ;угол поворота / 90 (от 0-3)
+
+ btr edx,16 ;входная/выходная нога
+ jc .output_leg
+
+ ;если нога входная
+ inc edx ;номерация ног начинается с нуля, потому добавляем 1
+ stdcall move_rotate_x_n90, -2,edi
+ add esi,el_offs_legs_inp
+ @@:
+ movzx ecx,byte[esi]
+ cmp ecx,0
+ je .not_found ;ноги кончились раньше, чем ожидалось
+ stdcall move_rotate_n90, 0,ecx,edi
+ inc esi
+ dec edx
+ jnz @b
+ jmp .end_f
+
+ ;если нога выходная
+ .output_leg:
+ inc edx ;номерация ног начинается с нуля, потому добавляем 1
+ movzx ecx,byte[esi+el_offs_box_x]
+ add ecx,2
+ stdcall move_rotate_x_n90, ecx,edi
+ add esi,el_offs_legs_out
+ @@:
+ movzx ecx,byte[esi]
+ cmp ecx,0
+ je .not_found ;ноги кончились раньше, чем ожидалось
+ stdcall move_rotate_n90, 0,ecx,edi
+ inc esi
+ dec edx
+ jnz @b
+ jmp .end_f
+
+ .not_found:
+ xor eax,eax
+ xor ebx,ebx
+ .end_f:
+ ret
+endp
+
+align 4
+proc move_rotate_n90 uses ecx edi, d_x:dword, d_y:dword, angle:dword
+ mov edi,[angle] ;угол поворота / 90 (от 0-3)
+ and edi,3
+ shl edi,4 ;edi*=16
+ add edi,mcs
+
+ mov ecx,[d_x]
+ imul ecx,dword[edi]
+ add eax,ecx
+ mov ecx,[d_y]
+ imul ecx,dword[edi+4]
+ add eax,ecx
+
+ mov ecx,[d_x]
+ imul ecx,dword[edi+8]
+ add ebx,ecx
+ mov ecx,[d_y]
+ imul ecx,dword[edi+12]
+ add ebx,ecx
+ ret
+endp
+
+align 4
+proc mem_copy, destination:dword, source:dword, len:dword
+ push ecx esi edi
+ cld
+ mov esi, dword[source]
+ mov edi, dword[destination]
+ mov ecx, dword[len]
+ rep movsb
+ pop edi esi ecx
+ ret
+endp
+
+;description:
+; Функция пропускает одно слово (или число) с учетом разделительных символов:
+; пробела, табуляции, новой строки. Нужна для последовательного считывани чисел из строки
+;input:
+; edi - указатель на пробел или слово
+;output:
+; edi - указатель на следующее слово
+align 4
+str_next_val:
+ call str_skip_spaces
+ @@:
+ cmp byte[edi],0
+ je @f
+
+ cmp byte[edi],' '
+ je @f
+ cmp byte[edi],9
+ je @f
+ cmp byte[edi],10
+ je @f
+ cmp byte[edi],13
+ je @f
+
+ inc edi
+ jmp @b
+ @@:
+ call str_skip_spaces
+ ret
+
+align 4
+str_skip_spaces:
+ dec edi
+ @@:
+ inc edi
+ cmp byte[edi],' '
+ je @b
+ cmp byte[edi],9
+ je @b
+ cmp byte[edi],10
+ je @b
+ cmp byte[edi],13
+ je @b
+ ret
+
+align 4
+str_next_spaces:
+ dec edi
+ @@:
+ inc edi
+ cmp byte[edi],0
+ je @f
+ cmp byte[edi],' '
+ je @f
+ cmp byte[edi],9
+ je @f
+ cmp byte[edi],10
+ je @f
+ cmp byte[edi],13
+ je @f
+ jmp @b
+ @@:
+ ret
+
+;input:
+; esi - указатель на искомое слово
+;output:
+; edi - указатель на позицию в которой слово найдено, если слово не найдено то edi=0
+;портятся регистры:
+; eax ecx
+align 4
+str_analiz_r:
+ mov edi,open_file_lif
+ mov ecx,dword[f_size]
+ @@:
+ mov al,byte[esi] ;устанавливаем первый символ для поиска
+ cld
+ repnz scasb
+ cmp ecx,0
+ je @f ;если закончился весь текст, то выход из функции
+ ;первый символ по адресу edi-1 должен быть из строки esi
+ dec edi
+ stdcall str_instr, edi,esi ;проверяем слово на совпадение
+ inc edi
+ cmp al,0
+ jne @b ;если слово не совпало, ищем в строке следующий первый символ для сравнения
+ ;сюда попадаем если нашли слово esi по адресу edi
+ jmp .exit_f
+ @@:
+ ;сюда попадаем если не нашли слово esi по адресу edi
+ xor edi,edi
+ .exit_f:
+ ret
+
+;description:
+; проверяет содержится ли строка str1 в строке str0
+; проверка делается только начиная с первых символов, указанных в str0 и str1
+; пример 1: если str0='aaabbbccc', str1='bbb' совпадения не будет
+; пример 2: если str0='aaabbbccc', str1='aaa' совпадение будет
+;output:
+; al = 0 если строка str1 содержится в str0
+; al != 0 если строка str1 не содержится в str0
+align 4
+proc str_instr uses edi esi, str0:dword, str1:dword
+ ;xor eax,eax
+ mov edi,[str0]
+ mov esi,[str1]
+ cld
+ @@:
+ mov al,[esi]
+ cmp al,0
+ je .e1
+ inc esi
+ scasb ;сравниваем символы
+ jz @b ;если совпали, то переходим к сравнению следующих
+ ;сюда попадаем если строки не совпали
+ sub al,[edi-1]
+ .e1: ;сюда попадаем если строка str1 (esi) закончилась
+ ret
+endp
+
+align 4
+proc but_run_stop
+ xor byte[tim_ch],1
+ cmp byte[tim_ch],0
+ jne @f
+ ;остановка схемы
+ stdcall pole_reset_cells, pole ;чистка проводов
+ call redraw_pole
+ jmp .end_f
+ @@:
+ ;подготовка схемы к запуску
+ call sign_clear
+ .end_f:
+ ret
+endp
+
+align 4
+proc but_set_0 uses eax
+ stdcall [tl_node_get_data], tree1
+ pop eax
+ test eax,eax
+ jz .end_f
+;el_icon_captions
+; cmp byte[eax+8],'n'
+; je .end_f
+ cmp byte[eax+8],'o' ;временное отсечение, пока нет проверки типа текущей иконки
+ jne .end_f
+ mov byte[eax+8],'z'
+ .end_f:
+ ret
+endp
+
+align 4
+proc but_set_1 uses eax
+ stdcall [tl_node_get_data], tree1
+ pop eax
+ test eax,eax
+ jz .end_f
+;el_icon_captions
+; cmp byte[eax+8],'n'
+; je .end_f
+ cmp byte[eax+8],'z' ;временное отсечение, пока нет проверки типа текущей иконки
+ jne .end_f
+ mov byte[eax+8],'o'
+ .end_f:
+ ret
+endp
+
+;сдвиг объекта влево
+align 4
+proc but_mov_l uses eax edi
+ cmp byte[tim_ch],0
+ jne .end_f
+ stdcall [tl_node_get_data], tree1
+ pop eax
+ test eax,eax
+ jz .end_f
+ cmp dword[eax],1
+ jle .end_f
+ dec dword[eax]
+ mov edi,eax
+ stdcall mem_copy,txt_buf,eax,capt_offs
+ add edi,capt_offs
+ call str_next_val
+ call str_next_val
+ stdcall make_list_capts,txt_buf,edi
+ stdcall mem_copy,eax,txt_buf,32 ;capt_offs
+ call redraw_pole
+ stdcall [tl_draw],tree1
+ .end_f:
+ ret
+endp
+
+;сдвиг объекта вправо
+align 4
+proc but_mov_r uses eax edi
+ cmp byte[tim_ch],0
+ jne .end_f
+ stdcall [tl_node_get_data], tree1
+ pop eax
+ test eax,eax
+ jz .end_f
+ inc dword[eax]
+ mov edi,eax
+ stdcall mem_copy,txt_buf,eax,capt_offs
+ add edi,capt_offs
+ call str_next_val
+ call str_next_val
+ stdcall make_list_capts,txt_buf,edi
+ stdcall mem_copy,eax,txt_buf,32 ;capt_offs
+ call redraw_pole
+ stdcall [tl_draw],tree1
+ .end_f:
+ ret
+endp
+
+align 4
+proc but_mov_u uses eax edi
+ cmp byte[tim_ch],0
+ jne .end_f
+ stdcall [tl_node_get_data], tree1
+ pop eax
+ test eax,eax
+ jz .end_f
+ cmp dword[eax+4],1
+ jle .end_f
+ dec dword[eax+4]
+ mov edi,eax
+ stdcall mem_copy,txt_buf,eax,capt_offs
+ add edi,capt_offs
+ call str_next_val
+ call str_next_val
+ stdcall make_list_capts,txt_buf,edi
+ stdcall mem_copy,eax,txt_buf,32 ;capt_offs
+ call redraw_pole
+ stdcall [tl_draw],tree1
+ .end_f:
+ ret
+endp
+
+align 4
+proc but_mov_d uses eax edi
+ cmp byte[tim_ch],0
+ jne .end_f
+ stdcall [tl_node_get_data], tree1
+ pop eax
+ test eax,eax
+ jz .end_f
+ inc dword[eax+4]
+ mov edi,eax
+ stdcall mem_copy,txt_buf,eax,capt_offs
+ add edi,capt_offs
+ call str_next_val
+ call str_next_val
+ stdcall make_list_capts,txt_buf,edi
+ stdcall mem_copy,eax,txt_buf,32 ;capt_offs
+ call redraw_pole
+ stdcall [tl_draw],tree1
+ .end_f:
+ ret
+endp
+
+;установка обычного режима, без рисования
+align 4
+proc but_set_none
+ mov byte[pen_mode],0
+ ret
+endp
+
+;установка режима рисования провода
+align 4
+proc but_set_pen_1
+ mov byte[pen_mode],1
+ ret
+endp
+
+;
+align 4
+proc but_set_pen_2
+ mov byte[pen_mode],2
+ ret
+endp
+
+;установка режима стирания провода
+align 4
+proc but_set_pen_3
+ mov byte[pen_mode],3
+ ret
+endp
+
+;данные для диалога открытия файлов
+align 4
+OpenDialog_data:
+.type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
+.procinfo dd procinfo ;+4
+.com_area_name dd communication_area_name ;+8
+.com_area dd 0 ;+12
+.opendir_path dd plugin_path ;+16
+.dir_default_path dd default_dir ;+20
+.start_path dd file_name ;+24 путь к диалогу открытия файлов
+.draw_window dd draw_window ;+28
+.status dd 0 ;+32
+.openfile_path dd openfile_path ;+36 путь к открываемому файлу
+.filename_area dd filename_area ;+40
+.filter_area dd Filter
+.x:
+.x_size dw 420 ;+48 ; Window X size
+.x_start dw 10 ;+50 ; Window X position
+.y:
+.y_size dw 320 ;+52 ; Window y size
+.y_start dw 10 ;+54 ; Window Y position
+
+default_dir db '/rd/1',0
+
+communication_area_name:
+ db 'FFFFFFFF_open_dialog',0
+open_dialog_name:
+ db 'opendial',0
+communication_area_default_path:
+ db '/rd/1/File managers/',0
+
+Filter:
+dd Filter.end - Filter ;.1
+.1:
+db 'TXT',0
+db 'ASM',0
+.end:
+db 0
+
+include 'le_libs.inc'
+
+mouse_dd dd 0x0
+sc system_colors
+last_time dd 0
+
+
+
+align 16
+procinfo process_information
+
+align 4
+buf_0: dd 0 ;
+.l: dw 170 ;+4 left
+.t: dw panel_1_coord_top ;+6 top
+.w: dd 335 ;+8 w
+.h: dd 340 ;+12 h
+.color: dd 0 ;+16 color
+ db 24 ;+20 bit in pixel
+
+align 4
+buf_font: ;буфер со шрифтом
+ dd 0 ;указатель на буфер изображения
+ dw 25 ;+4 left
+ dw 25 ;+6 top
+ dd 96 ;+8 w
+ dd 144 ;+12 h
+ dd 0 ;+16 color
+ db 24 ;+20 bit in pixel
+
+el_focus dd 0
+tree1 tree_list 32,points_max+2, tl_key_no_edit, 16,16,\
+ 0x8080ff,0x0000ff,0xffffff, 5,panel_3_coord_top,145,250, 0,capt_offs,0,\
+ el_focus, wScrObj,0
+align 4
+wScrObj:
+.x:
+.size_x dw 16 ;+0
+.start_x dw 0 ;+2
+.y:
+.size_y dw 150 ;+4
+.start_y dw 0 ;+6
+.btn_high dd 15 ;+8
+.type dd 1 ;+12
+.max_area dd 100 ;+16
+.cur_area dd 30 ;+20
+.position dd 0 ;+24
+.bckg_col dd 0xeeeeee ;+28
+.frnt_col dd 0xbbddff ;+32
+.line_col dd 0 ;+36
+.redraw dd 0 ;+40
+.delta dw 0 ;+44
+.delta2 dw 0 ;+46
+.run_x:
+.r_size_x dw 0 ;+48
+.r_start_x dw 0 ;+50
+.run_y:
+.r_size_y dw 0 ;+52
+.r_start_y dw 0 ;+54
+.m_pos dd 0 ;+56
+.m_pos_2 dd 0 ;+60
+.m_keys dd 0 ;+64
+.run_size dd 0 ;+68
+.position2 dd 0 ;+72
+.work_size dd 0 ;+76
+.all_redraw dd 0 ;+80
+.ar_offset dd 1 ;+84
+
+align 4
+proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n:dword
+ mov esi,dword[str2]
+ mov ecx,dword[n]
+ mov edi,dword[str1]
+ stdcall str_len,edi
+ add edi,eax
+ cld
+ repne movsb
+ mov byte[edi],0
+ ret
+endp
+
+align 4
+proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
+ mov esi,dword[str2]
+ stdcall str_len,esi
+ mov ecx,eax
+ inc ecx
+ mov edi,dword[str1]
+ stdcall str_len,edi
+ add edi,eax
+ cld
+ repne movsb
+ ret
+endp
+
+;output:
+; eax = strlen
+align 4
+proc str_len, str1:dword
+ mov eax,[str1]
+ @@:
+ cmp byte[eax],0
+ je @f
+ inc eax
+ jmp @b
+ @@:
+ sub eax,[str1]
+ ret
+endp
+
+;input:
+; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
+;output:
+; eax - число
+align 4
+proc conv_str_to_int, buf:dword
+ xor eax,eax
+ push ebx ecx esi
+ xor ebx,ebx
+ mov esi,[buf]
+
+ ;на случай если перед числом находятся пробелы
+ @@:
+ cmp byte[esi],' '
+ jne @f
+ inc esi
+ jmp @b
+ @@:
+
+ ;определение отрицательных чисел
+ xor ecx,ecx
+ inc ecx
+ cmp byte[esi],'-'
+ jne @f
+ dec ecx
+ inc esi
+ @@:
+
+ cmp word[esi],'0x'
+ je .load_digit_16
+
+ .load_digit_10: ;считывание 10-тичных цифр
+ mov bl,byte[esi]
+ cmp bl,'0'
+ jl @f
+ cmp bl,'9'
+ jg @f
+ sub bl,'0'
+ imul eax,10
+ add eax,ebx
+ inc esi
+ jmp .load_digit_10
+ jmp @f
+
+ .load_digit_16: ;считывание 16-ричных цифр
+ add esi,2
+ .cycle_16:
+ mov bl,byte[esi]
+ cmp bl,'0'
+ jl @f
+ cmp bl,'f'
+ jg @f
+ cmp bl,'9'
+ jle .us1
+ cmp bl,'A'
+ jl @f ;отсеиваем символы >'9' и <'A'
+ .us1: ;составное условие
+ cmp bl,'F'
+ jle .us2
+ cmp bl,'a'
+ jl @f ;отсеиваем символы >'F' и <'a'
+ sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
+ .us2: ;составное условие
+ sub bl,'0'
+ cmp bl,9
+ jle .cor1
+ sub bl,7 ;convert 'A' to '10'
+ .cor1:
+ shl eax,4
+ add eax,ebx
+ inc esi
+ jmp .cycle_16
+ @@:
+ cmp ecx,0 ;если число отрицательное
+ jne @f
+ sub ecx,eax
+ mov eax,ecx
+ @@:
+ pop esi ecx ebx
+ ret
+endp
+
+;этот код не мой, он преобразует число в строку
+;input:
+; eax = value
+; edi = string buffer
+;output:
+align 4
+convert_int_to_str:
+ pushad
+ mov dword[edi+1],0;0x20202020
+ call .str
+ popad
+ ret
+
+align 4
+.str:
+ mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
+ ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
+ cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
+ jb @f
+ xor edx,edx ;очистить edx
+ div ecx ;разделить - остаток в edx
+ push edx ;положить в стек
+ ;dec edi ;смещение необходимое для записи с конца строки
+ call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
+ pop eax
+ @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
+ or al,0x30 ;данная команда короче чем две выше
+ stosb ;записать элемент из регистра al в ячеку памяти es:edi
+ ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
+
+i_end:
+ rb 1024
+stacktop:
+ sys_path rb 1024
+ file_name:
+ rb 1024 ;4096
+ library_path rb 1024
+ plugin_path rb 4096
+ openfile_path rb 4096
+ filename_area rb 256
+mem:
diff --git a/programs/media/log_el/trunk/mem.inc b/programs/media/log_el/trunk/mem.inc
new file mode 100644
index 0000000000..ec78fbf7f6
--- /dev/null
+++ b/programs/media/log_el/trunk/mem.inc
@@ -0,0 +1,48 @@
+;-----------------------------------------------------------------------------
+proc mem.Alloc,size ;/////////////////////////////////////////////////////////
+;-----------------------------------------------------------------------------
+ push ebx ecx
+ mov ecx,[size]
+ ;*** add ecx,4
+ mcall 68,12
+ ;*** add ecx,-4
+ ;*** mov [eax],ecx
+ ;*** add eax,4
+ pop ecx ebx
+ ret
+endp
+
+;-----------------------------------------------------------------------------
+proc mem.ReAlloc,mptr,size ;//////////////////////////////////////////////////
+;-----------------------------------------------------------------------------
+ push ebx ecx edx
+ mov ecx,[size]
+ or ecx,ecx
+ jz @f
+ ;*** add ecx,4
+ @@: mov edx,[mptr]
+ or edx,edx
+ jz @f
+ ;*** add edx,-4
+ @@: mcall 68,20
+ or eax,eax
+ jz @f
+ ;*** add ecx,-4
+ ;*** mov [eax],ecx
+ ;*** add eax,4
+ @@: pop edx ecx ebx
+ ret
+endp
+
+;-----------------------------------------------------------------------------
+proc mem.Free,mptr ;//////////////////////////////////////////////////////////
+;-----------------------------------------------------------------------------
+ push ebx ecx
+ mov ecx,[mptr]
+ or ecx,ecx
+ jz @f
+ ;*** add ecx,-4
+ @@: mcall 68,13
+ pop ecx ebx
+ ret
+endp
diff --git a/programs/media/log_el/trunk/mn_4bit.txt b/programs/media/log_el/trunk/mn_4bit.txt
new file mode 100644
index 0000000000..7f0f45ca93
--- /dev/null
+++ b/programs/media/log_el/trunk/mn_4bit.txt
@@ -0,0 +1,101 @@
+size 204 192
+elements 36
+111 44 3 sm[1]
+123 44 3 sm[1]
+135 44 3 sm[1]
+147 44 3 sm[1]
+159 44 3 sm[1]
+ 80 35 0 and[2]
+ 67 35 0 and[2]
+ 54 35 0 and[2]
+123 71 3 sm[1]
+135 71 3 sm[1]
+147 71 3 sm[1]
+159 71 3 sm[1]
+135 98 3 sm[1]
+147 98 3 sm[1]
+159 98 3 sm[1]
+183 98 3 sm[1]
+147 125 3 sm[1]
+159 125 3 sm[1]
+183 125 3 sm[1]
+195 125 3 sm[1]
+ 41 62 0 and[2]
+ 54 62 0 and[2]
+ 67 62 0 and[2]
+ 80 62 0 and[2]
+ 41 89 0 and[2]
+ 54 89 0 and[2]
+ 67 89 0 and[2]
+ 80 89 0 and[2]
+ 41 116 0 and[2]
+ 54 116 0 and[2]
+ 67 116 0 and[2]
+ 80 116 0 and[2]
+ 41 35 0 and[2]
+171 71 3 sm[1]
+171 98 3 sm[1]
+171 125 3 sm[1]
+captions 10
+ 76 9 z a0
+ 63 9 z a1
+ 50 9 z a2
+ 37 9 z a3
+ 11 122 z b0
+ 11 95 z b1
+ 11 68 z b2
+ 11 41 z b3
+190 183 n c0
+106 183 n c7
+points 167
+190 183 8 37 117 9 106 183 8 37 60 10 115 39 6 108 39 3
+106 13 2 173 135 9 50 117 9 132 93 3 178 13 2 63 117 9
+139 135 9 158 122 3 161 108 9 170 95 3 122 68 3 185 135 9
+ 76 117 9 149 108 9 142 13 2 78 122 12 146 95 3 52 122 13
+154 53 2 115 81 9 178 183 8 166 13 2 78 95 12 190 13 2
+182 108 12 78 68 12 194 135 12 182 135 12 142 53 2 130 53 2
+170 81 12 161 135 9 78 41 12 125 81 9 130 13 2 76 36 11
+ 63 36 11 50 36 11 37 33 10 134 68 3 50 63 11 134 95 3
+ 63 63 11 161 122 6 76 63 11 166 183 8 149 135 9 76 90 11
+ 63 90 11 50 90 11 37 87 10 39 41 13 39 68 13 39 95 13
+ 39 122 13 173 95 6 52 95 13 182 122 3 52 68 13 142 183 8
+ 52 41 13 118 183 8 122 81 12 65 41 13 65 68 13 65 95 13
+ 65 122 13 192 118 6 137 68 6 139 93 6 180 114 6 74 114 3
+130 80 2 149 81 9 158 95 3 118 53 2 61 112 3 168 112 6
+173 108 9 170 108 12 156 110 6 48 110 3 142 107 2 149 122 6
+173 122 6 37 36 1 48 83 3 144 83 6 146 68 3 127 108 9
+156 85 6 61 85 3 142 80 2 146 135 12 185 122 6 154 80 2
+ 74 87 3 168 87 6 154 13 2 137 95 6 180 91 6 146 122 3
+170 122 3 168 64 6 149 95 6 137 108 9 156 60 6 74 60 3
+178 107 2 170 135 12 130 183 8 166 80 2 61 58 3 144 58 6
+134 108 12 158 108 12 132 56 6 48 56 3 37 63 1 127 66 6
+158 135 12 37 90 1 48 29 3 120 29 6 161 68 6 134 81 12
+132 31 6 61 31 3 154 107 2 161 81 9 161 95 6 166 107 2
+ 74 33 3 144 33 6 137 81 9 149 68 6 156 37 6 118 13 2
+158 81 12 158 54 12 149 54 9 149 41 6 146 41 3 146 81 12
+154 183 8 146 54 12 137 54 9 137 41 6 134 41 3 120 66 3
+146 108 12 134 54 12 125 54 9 125 41 6 122 41 3 158 68 3
+125 68 6 122 54 12 113 54 9 113 41 6 110 41 3
+subpoints 174
+ 76 41 63 41 50 41 37 41 144 37 76 33 132 37 132 33
+ 76 31 63 31 120 37 120 33 120 31 76 29 63 29 50 29
+118 81 166 64 154 64 142 64 130 64 118 64 115 64 106 64
+ 76 60 106 60 115 60 118 60 37 68 50 68 63 68 76 68
+142 108 37 95 50 95 154 108 166 108 178 108 106 118 118 118
+130 118 63 95 76 95 106 91 118 91 178 91 166 91 154 91
+142 91 130 91 106 87 118 87 130 87 142 87 142 118 154 118
+166 118 178 118 154 87 166 87 168 91 63 85 130 60 142 60
+154 60 156 64 63 58 76 58 106 58 118 58 76 85 106 85
+118 85 130 85 190 118 180 118 178 114 166 114 142 85 154 85
+156 87 156 91 50 83 63 83 76 83 115 58 130 58 142 58
+144 60 144 64 50 56 63 56 106 83 118 83 130 83 142 83
+154 114 144 85 144 87 144 91 142 114 130 114 118 114 130 108
+127 91 76 56 106 56 127 87 106 114 76 114 127 85 63 112
+ 76 112 106 112 118 112 130 112 142 112 127 83 127 81 115 56
+118 56 166 81 154 81 130 54 142 54 154 54 118 54 115 54
+130 56 132 58 132 60 132 64 142 81 130 81 154 112 106 29
+106 31 106 33 106 37 118 37 118 33 118 31 118 29 130 31
+130 33 130 37 142 37 142 33 154 37 166 112 168 114 168 118
+156 118 156 114 156 112 154 110 142 110 130 110 118 110 106 110
+ 76 110 63 110 50 110 142 135 139 118 139 114 139 112 139 110
+139 108 154 135 166 135 178 135 190 135 76 87
diff --git a/programs/media/log_el/trunk/objects.png b/programs/media/log_el/trunk/objects.png
new file mode 100644
index 0000000000..b8fa44ed1b
Binary files /dev/null and b/programs/media/log_el/trunk/objects.png differ
diff --git a/programs/media/log_el/trunk/or_2.txt b/programs/media/log_el/trunk/or_2.txt
new file mode 100644
index 0000000000..e514fdfe53
--- /dev/null
+++ b/programs/media/log_el/trunk/or_2.txt
@@ -0,0 +1,9 @@
+size 80 60
+elements 1
+ 24 24 0 or[2]
+captions 3
+ 10 8 z x1
+ 10 44 z x2
+ 56 26 n y1
+points 4
+ 10 25 9 10 27 3 10 44 8 56 26 4
diff --git a/programs/media/log_el/trunk/or_3.txt b/programs/media/log_el/trunk/or_3.txt
new file mode 100644
index 0000000000..41c85e94b2
--- /dev/null
+++ b/programs/media/log_el/trunk/or_3.txt
@@ -0,0 +1,10 @@
+size 80 60
+elements 1
+ 24 24 0 or[3]
+captions 4
+ 10 8 z x1
+ 10 44 z x2
+ 30 44 z x3
+ 56 27 n y1
+points 5
+ 10 25 9 10 27 3 10 44 8 56 27 4 22 44 9
diff --git a/programs/media/log_el/trunk/test1.txt b/programs/media/log_el/trunk/test1.txt
new file mode 100644
index 0000000000..ddc56632f2
--- /dev/null
+++ b/programs/media/log_el/trunk/test1.txt
@@ -0,0 +1,40 @@
+size 80 80
+elements 1
+ 6 32 0 not
+points 171
+ 28 52 2 50 75 8 29 52 2 30 52 2 31 52 2 32 52 2
+ 33 52 2 34 52 2 35 52 2 36 52 2 37 52 2 38 52 2
+ 39 52 2 40 52 2 41 52 2 42 52 2 43 52 2 44 52 2
+ 45 52 2 46 52 2 47 52 2 48 52 2 49 52 2 50 52 2
+ 51 52 2 51 75 8 49 75 8 48 75 8 47 75 8 46 75 8
+ 45 75 8 44 75 8 43 75 8 42 75 8 41 75 8 40 75 8
+ 39 75 8 38 75 8 37 75 8 36 75 8 35 75 8 34 75 8
+ 33 75 8 32 75 8 31 75 8 30 75 8 29 75 8 28 75 8
+ 37 65 8 37 69 2 38 69 2 39 69 2 40 69 2 41 69 2
+ 38 65 8 39 65 8 40 65 8 41 65 8 52 75 8 53 75 8
+ 54 75 8 55 75 8 56 75 8 57 75 8 58 75 8 59 75 8
+ 51 49 8 50 49 8 49 49 8 48 49 8 47 49 8 46 49 8
+ 45 49 8 44 49 8 43 49 8 42 49 8 41 49 8 40 49 8
+ 39 49 8 38 49 8 37 49 8 36 49 8 35 49 8 34 49 8
+ 33 49 8 32 49 8 31 49 8 30 49 8 29 49 8 28 49 8
+ 28 4 2 29 4 2 30 4 2 31 4 2 32 4 2 33 4 2
+ 34 4 2 35 4 2 36 4 2 37 4 2 38 4 2 39 4 2
+ 40 4 2 41 4 2 42 4 2 43 4 2 44 4 2 45 4 2
+ 46 4 2 47 4 2 48 4 2 49 4 2 50 4 2 51 4 2
+ 52 4 2 53 4 2 54 4 2 55 4 2 56 4 2 57 4 2
+ 58 4 2 59 4 2 60 4 2 61 4 2 62 4 2 63 4 2
+ 64 4 2 65 4 2 66 4 2 67 4 2 68 4 2 69 4 2
+ 70 4 2 71 4 2 72 4 2 73 4 2 74 4 2 75 4 2
+ 60 75 8 61 75 8 62 75 8 63 75 8 64 75 8 65 75 8
+ 66 75 8 67 75 8 68 75 8 69 75 8 70 75 8 71 75 8
+ 72 75 8 73 75 8 74 75 8 75 75 8 11 30 3 4 30 3
+ 27 30 4 39 14 8 39 17 2 40 17 2 41 17 2 42 17 2
+ 43 17 2 44 17 2 45 17 2 45 14 8 44 14 8 43 14 8
+ 42 14 8 41 14 8 40 14 8
+subpoints 41
+ 58 34 58 36 58 38 58 40 58 42 58 44 58 46 58 48
+ 58 50 58 52 58 54 58 56 58 58 58 60 56 60 54 60
+ 52 60 50 60 48 60 46 60 44 60 42 60 40 60 38 60
+ 36 60 58 32 58 30 56 30 54 30 52 30 50 30 48 30
+ 46 30 44 30 42 30 40 30 38 30 36 30 34 30 32 30
+ 30 30
diff --git a/programs/media/log_el/trunk/test2.txt b/programs/media/log_el/trunk/test2.txt
new file mode 100644
index 0000000000..b9efeced64
--- /dev/null
+++ b/programs/media/log_el/trunk/test2.txt
@@ -0,0 +1,19 @@
+size 250 200
+elements 1
+126 97 0 not
+points 86
+131 95 6 124 95 6 122 95 2 122 101 1 120 103 9 118 105 9
+116 107 9 114 109 9 112 111 9 110 113 9 108 115 9 106 117 9
+104 119 9 102 121 9 100 123 9 98 125 9 96 127 9 94 129 9
+ 92 131 9 90 133 9 88 135 9 86 137 9 84 139 9 82 141 9
+133 101 12 135 103 12 137 105 12 139 107 12 141 109 12 143 111 12
+145 113 12 147 115 12 149 117 12 151 119 12 153 121 12 155 123 12
+157 125 12 159 127 12 161 129 12 163 131 12 165 133 12 167 135 12
+169 137 12 171 139 12 173 141 12 133 93 6 135 91 6 137 89 6
+139 87 6 141 85 6 143 83 6 145 81 6 147 79 6 149 77 6
+151 75 6 153 73 6 155 71 6 157 69 6 159 67 6 161 65 6
+163 63 6 165 61 6 167 59 6 169 57 6 171 55 6 173 53 6
+120 93 3 118 91 3 116 89 3 114 87 3 112 85 3 110 83 3
+108 81 3 106 79 3 104 77 3 102 75 3 100 73 3 98 71 3
+ 96 69 3 94 67 3 92 65 3 90 63 3 88 61 3 86 59 3
+ 84 57 3 82 55 3
diff --git a/programs/media/log_el/trunk/test3.txt b/programs/media/log_el/trunk/test3.txt
new file mode 100644
index 0000000000..7e4522898c
--- /dev/null
+++ b/programs/media/log_el/trunk/test3.txt
@@ -0,0 +1,20 @@
+size 300 200
+elements 1
+126 97 0 not
+points 95
+131 95 6 124 95 6 122 95 2 122 101 1 120 103 9 118 105 9
+116 107 9 114 109 9 112 111 9 110 113 9 108 115 9 106 117 9
+104 119 9 102 121 9 100 123 9 98 125 9 96 127 9 94 129 9
+ 92 131 9 90 133 9 88 135 9 86 137 9 84 139 9 82 141 9
+133 101 12 135 103 12 137 105 12 139 107 12 141 109 12 143 111 12
+145 113 12 147 115 12 149 117 12 151 119 12 153 121 12 155 123 12
+157 125 12 159 127 12 161 129 12 163 131 12 165 133 12 167 135 12
+169 137 12 171 139 12 173 141 12 133 93 6 135 91 6 137 89 6
+139 87 6 141 85 6 143 83 6 145 81 6 147 79 6 149 77 6
+151 75 6 153 73 6 155 71 6 157 69 6 159 67 6 161 65 6
+163 63 6 165 61 6 167 59 6 169 57 6 171 55 6 173 53 6
+120 93 3 118 91 3 116 89 3 114 87 3 112 85 3 110 83 3
+108 81 3 106 79 3 104 77 3 102 75 3 100 73 3 98 71 3
+ 96 69 3 94 67 3 92 65 3 90 63 3 88 61 3 86 59 3
+ 84 57 3 82 55 3 127 101 2 127 95 12 122 98 6 131 98 1
+ 80 53 0 127 51 0 175 98 0 127 143 0 80 98 0
diff --git a/programs/media/log_el/trunk/test4.txt b/programs/media/log_el/trunk/test4.txt
new file mode 100644
index 0000000000..012f04b19d
--- /dev/null
+++ b/programs/media/log_el/trunk/test4.txt
@@ -0,0 +1,33 @@
+size 104 80
+captions 1
+ 7 30 o A
+points 169
+ 52 52 2 74 75 8 53 52 2 54 52 2 55 52 2 56 52 2
+ 57 52 2 58 52 2 59 52 2 60 52 2 61 52 2 62 52 2
+ 63 52 2 64 52 2 65 52 2 66 52 2 67 52 2 68 52 2
+ 69 52 2 70 52 2 71 52 2 72 52 2 73 52 2 74 52 2
+ 75 52 2 75 75 8 73 75 8 72 75 8 71 75 8 70 75 8
+ 69 75 8 68 75 8 67 75 8 66 75 8 65 75 8 64 75 8
+ 63 75 8 62 75 8 61 75 8 60 75 8 59 75 8 58 75 8
+ 57 75 8 56 75 8 55 75 8 54 75 8 53 75 8 52 75 8
+ 61 65 8 61 69 2 62 69 2 63 69 2 64 69 2 65 69 2
+ 62 65 8 63 65 8 64 65 8 65 65 8 76 75 8 77 75 8
+ 78 75 8 79 75 8 80 75 8 81 75 8 82 75 8 83 75 8
+ 75 49 8 74 49 8 73 49 8 72 49 8 71 49 8 70 49 8
+ 69 49 8 68 49 8 67 49 8 66 49 8 65 49 8 64 49 8
+ 63 49 8 62 49 8 61 49 8 60 49 8 59 49 8 58 49 8
+ 57 49 8 56 49 8 55 49 8 54 49 8 53 49 8 52 49 8
+ 52 4 2 53 4 2 54 4 2 55 4 2 56 4 2 57 4 2
+ 58 4 2 59 4 2 60 4 2 61 4 2 62 4 2 63 4 2
+ 64 4 2 65 4 2 66 4 2 67 4 2 68 4 2 69 4 2
+ 70 4 2 71 4 2 72 4 2 73 4 2 74 4 2 75 4 2
+ 76 4 2 77 4 2 78 4 2 79 4 2 80 4 2 81 4 2
+ 82 4 2 83 4 2 84 4 2 85 4 2 86 4 2 87 4 2
+ 88 4 2 89 4 2 90 4 2 91 4 2 92 4 2 93 4 2
+ 94 4 2 95 4 2 96 4 2 97 4 2 98 4 2 99 4 2
+ 84 75 8 85 75 8 86 75 8 87 75 8 88 75 8 89 75 8
+ 90 75 8 91 75 8 92 75 8 93 75 8 94 75 8 95 75 8
+ 96 75 8 97 75 8 98 75 8 99 75 8 64 14 8 65 14 8
+ 51 30 4 63 14 8 63 17 2 64 17 2 65 17 2 66 17 2
+ 67 17 2 68 17 2 69 17 2 69 14 8 68 14 8 67 14 8
+ 66 14 8
diff --git a/programs/media/log_el/trunk/test5.txt b/programs/media/log_el/trunk/test5.txt
new file mode 100644
index 0000000000..5ecf9dbdc7
--- /dev/null
+++ b/programs/media/log_el/trunk/test5.txt
@@ -0,0 +1,21 @@
+size 300 200
+elements 1
+ 47 94 0 not
+points 102
+ 52 92 7 45 92 2 117 92 8 275 34 2 273 32 2 274 33 2
+272 31 2 276 35 2 277 36 2 278 37 2 124 13 1 123 14 1
+122 15 1 121 16 1 120 17 1 119 18 1 118 19 1 117 20 1
+116 21 1 115 22 1 114 23 1 113 24 1 112 25 1 111 26 1
+110 27 1 109 28 1 108 29 1 107 30 1 106 31 1 105 32 1
+104 33 1 103 34 1 102 35 1 101 36 1 100 37 1 99 38 1
+ 98 39 1 97 40 1 96 41 1 279 38 2 282 41 2 281 40 2
+283 42 2 280 39 2 284 43 2 288 47 2 287 46 2 286 45 2
+285 44 2 271 30 2 270 29 2 269 28 2 268 27 2 267 26 2
+266 25 2 265 24 2 264 23 2 263 22 2 262 21 2 261 20 2
+260 19 2 259 18 2 258 17 2 257 16 2 256 15 2 255 14 2
+254 13 2 254 155 4 255 154 4 256 153 4 257 152 4 258 151 4
+259 150 4 260 149 4 261 148 4 262 147 4 263 146 4 264 145 4
+265 144 4 266 143 4 267 142 4 268 141 4 269 140 4 270 139 4
+271 138 4 272 137 4 273 136 4 274 135 4 275 134 4 276 133 4
+277 132 4 278 131 4 279 130 4 280 129 4 281 128 4 282 127 4
+283 126 4 284 125 4 285 124 4 286 123 4 287 122 4 288 121 4
diff --git a/programs/media/log_el/trunk/tl_sys_16.png b/programs/media/log_el/trunk/tl_sys_16.png
new file mode 100644
index 0000000000..073e8a9b05
Binary files /dev/null and b/programs/media/log_el/trunk/tl_sys_16.png differ
diff --git a/programs/media/log_el/trunk/toolbar.png b/programs/media/log_el/trunk/toolbar.png
new file mode 100644
index 0000000000..16c0a6c9d9
Binary files /dev/null and b/programs/media/log_el/trunk/toolbar.png differ
diff --git a/programs/media/log_el/trunk/triger_dc.txt b/programs/media/log_el/trunk/triger_dc.txt
new file mode 100644
index 0000000000..563e147fc3
--- /dev/null
+++ b/programs/media/log_el/trunk/triger_dc.txt
@@ -0,0 +1,20 @@
+size 124 28
+elements 9
+ 66 17 0 not
+ 66 6 0 not
+ 56 5 0 and[2]
+ 56 16 0 and[2]
+ 48 5 0 not
+ 48 18 0 not
+ 38 4 0 and[2]
+ 38 17 0 and[2]
+ 30 19 0 not
+captions 2
+ 4 5 z D
+ 4 7 z C
+points 17
+ 63 7 1 54 11 9 71 7 3 54 13 3 71 18 9 63 18 1
+ 64 11 6 71 15 6 64 15 9 71 13 12 53 19 1 45 19 1
+ 35 20 1 53 6 1 45 6 1 36 7 6 28 5 7
+subpoints 2
+ 64 13 28 7
diff --git a/programs/media/log_el/trunk/triger_rs.txt b/programs/media/log_el/trunk/triger_rs.txt
new file mode 100644
index 0000000000..9007790701
--- /dev/null
+++ b/programs/media/log_el/trunk/triger_rs.txt
@@ -0,0 +1,14 @@
+size 96 32
+elements 4
+ 28 5 0 or[2]
+ 38 6 0 not
+ 28 16 0 or[2]
+ 38 17 0 not
+captions 2
+ 6 6 z R
+ 6 19 z S
+points 12
+ 35 7 1 26 11 9 43 7 3 26 13 3 43 18 9 35 18 1
+ 36 11 6 43 15 6 36 15 9 43 13 12 6 6 1 6 19 1
+subpoints 1
+ 36 13
diff --git a/programs/media/log_el/trunk/triger_web.txt b/programs/media/log_el/trunk/triger_web.txt
new file mode 100644
index 0000000000..6583928994
--- /dev/null
+++ b/programs/media/log_el/trunk/triger_web.txt
@@ -0,0 +1,26 @@
+size 80 64
+elements 12
+ 47 20 0 and[2]
+ 57 21 0 not
+ 47 32 0 and[2]
+ 57 33 0 not
+ 38 20 0 not
+ 38 34 0 not
+ 28 19 0 and[2]
+ 28 32 0 and[3]
+ 28 8 0 and[2]
+ 28 46 0 and[2]
+ 38 47 0 not
+ 38 9 0 not
+captions 2
+ 4 35 z C
+ 4 49 z D
+points 36
+ 62 22 3 62 34 9 54 22 1 45 26 9 54 26 2 62 28 4
+ 45 28 2 54 30 1 62 30 2 54 34 1 43 21 11 43 35 3
+ 35 21 1 35 35 1 26 30 3 43 15 6 24 35 13 35 10 1
+ 35 48 1 26 15 9 43 40 12 26 17 3 35 17 8 35 13 1
+ 43 13 8 24 22 1 22 9 1 22 52 9 43 42 2 26 44 3
+ 35 44 8 26 42 9 35 40 1 43 52 8 43 30 12 4 49 1
+subpoints 5
+ 35 15 54 28 22 35 35 42 22 49