From 49b4b54d2520fd5834e174306c41497eae5c6e6f Mon Sep 17 00:00:00 2001 From: IgorA Date: Thu, 15 Mar 2012 09:43:33 +0000 Subject: [PATCH] add new program 'log_el' (modeling logik elements) git-svn-id: svn://kolibrios.org@2462 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/media/log_el/docs/about.png | Bin 0 -> 22319 bytes programs/media/log_el/docs/mn4bit.png | Bin 0 -> 24712 bytes programs/media/log_el/docs/readme.htm | 122 ++ programs/media/log_el/docs/tb_0.png | Bin 0 -> 247 bytes programs/media/log_el/docs/tb_1.png | Bin 0 -> 221 bytes programs/media/log_el/docs/tb_cursor.png | Bin 0 -> 496 bytes programs/media/log_el/docs/tb_eraser.png | Bin 0 -> 650 bytes programs/media/log_el/docs/tb_open.png | Bin 0 -> 707 bytes programs/media/log_el/docs/tb_pen_1.png | Bin 0 -> 513 bytes programs/media/log_el/docs/tb_pen_2.png | Bin 0 -> 365 bytes programs/media/log_el/docs/tb_run.png | Bin 0 -> 274 bytes programs/media/log_el/docs/tb_save.png | Bin 0 -> 536 bytes programs/media/log_el/trunk/and_2.txt | 9 + programs/media/log_el/trunk/and_3.txt | 10 + programs/media/log_el/trunk/build_ru.bat | 9 + programs/media/log_el/trunk/calc.txt | 60 + programs/media/log_el/trunk/dll.inc | 99 + programs/media/log_el/trunk/le_libs.inc | 1 + programs/media/log_el/trunk/le_pole.inc | 1262 ++++++++++++ programs/media/log_el/trunk/le_signal.inc | 1 + programs/media/log_el/trunk/log_el.asm | 2140 ++++++++++++++++++++ programs/media/log_el/trunk/mem.inc | 48 + programs/media/log_el/trunk/mn_4bit.txt | 101 + programs/media/log_el/trunk/objects.png | Bin 0 -> 1159 bytes programs/media/log_el/trunk/or_2.txt | 9 + programs/media/log_el/trunk/or_3.txt | 10 + programs/media/log_el/trunk/test1.txt | 40 + programs/media/log_el/trunk/test2.txt | 19 + programs/media/log_el/trunk/test3.txt | 20 + programs/media/log_el/trunk/test4.txt | 33 + programs/media/log_el/trunk/test5.txt | 21 + programs/media/log_el/trunk/tl_sys_16.png | Bin 0 -> 1367 bytes programs/media/log_el/trunk/toolbar.png | Bin 0 -> 5054 bytes programs/media/log_el/trunk/triger_dc.txt | 20 + programs/media/log_el/trunk/triger_rs.txt | 14 + programs/media/log_el/trunk/triger_web.txt | 26 + 36 files changed, 4074 insertions(+) create mode 100644 programs/media/log_el/docs/about.png create mode 100644 programs/media/log_el/docs/mn4bit.png create mode 100644 programs/media/log_el/docs/readme.htm create mode 100644 programs/media/log_el/docs/tb_0.png create mode 100644 programs/media/log_el/docs/tb_1.png create mode 100644 programs/media/log_el/docs/tb_cursor.png create mode 100644 programs/media/log_el/docs/tb_eraser.png create mode 100644 programs/media/log_el/docs/tb_open.png create mode 100644 programs/media/log_el/docs/tb_pen_1.png create mode 100644 programs/media/log_el/docs/tb_pen_2.png create mode 100644 programs/media/log_el/docs/tb_run.png create mode 100644 programs/media/log_el/docs/tb_save.png create mode 100644 programs/media/log_el/trunk/and_2.txt create mode 100644 programs/media/log_el/trunk/and_3.txt create mode 100644 programs/media/log_el/trunk/build_ru.bat create mode 100644 programs/media/log_el/trunk/calc.txt create mode 100644 programs/media/log_el/trunk/dll.inc create mode 100644 programs/media/log_el/trunk/le_libs.inc create mode 100644 programs/media/log_el/trunk/le_pole.inc create mode 100644 programs/media/log_el/trunk/le_signal.inc create mode 100644 programs/media/log_el/trunk/log_el.asm create mode 100644 programs/media/log_el/trunk/mem.inc create mode 100644 programs/media/log_el/trunk/mn_4bit.txt create mode 100644 programs/media/log_el/trunk/objects.png create mode 100644 programs/media/log_el/trunk/or_2.txt create mode 100644 programs/media/log_el/trunk/or_3.txt create mode 100644 programs/media/log_el/trunk/test1.txt create mode 100644 programs/media/log_el/trunk/test2.txt create mode 100644 programs/media/log_el/trunk/test3.txt create mode 100644 programs/media/log_el/trunk/test4.txt create mode 100644 programs/media/log_el/trunk/test5.txt create mode 100644 programs/media/log_el/trunk/tl_sys_16.png create mode 100644 programs/media/log_el/trunk/toolbar.png create mode 100644 programs/media/log_el/trunk/triger_dc.txt create mode 100644 programs/media/log_el/trunk/triger_rs.txt create mode 100644 programs/media/log_el/trunk/triger_web.txt diff --git a/programs/media/log_el/docs/about.png b/programs/media/log_el/docs/about.png new file mode 100644 index 0000000000000000000000000000000000000000..3fef1926bb42aeed93550dd9c668a34c0c8ffafc GIT binary patch literal 22319 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 F{s&7>*gF6K literal 0 HcmV?d00001 diff --git a/programs/media/log_el/docs/mn4bit.png b/programs/media/log_el/docs/mn4bit.png new file mode 100644 index 0000000000000000000000000000000000000000..c8899c86963015dda75fbfa8e28bcb704cf03d46 GIT binary patch literal 24712 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 P3&0GH8R-|2D8c^+r*qY? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b5e8db070a3baff2df1c5c6da224e7ae7041224c GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RY7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS0b$0e+I-SL!5&W+#}EtuzZuZ*%TbGTXR#wX_=R psRf_yEau8t6f^{UQudT%c(JEj>4DqkOrX0MJYD@<);T3K0RU!yScCuo literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..abb066fde0c5405a6426f942da80f17eaab12f6d GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RY7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS0b$0e+I-SL!6Hu=#}Etu%a5z@En-vo>lSK^vju<##hWmo;a=AU6LZf zb#B@Ayt|8{%xb^Axmj>BaEV$?M3!}5w>@4QWSrjy6y%b3iVA$~Tn9%DV>W_i8 OGkCiCxvXPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf02y>eSaefwW^{L9 za%BKPWN%_+AW3auXJt}lVPtu6$z?nM00Cf0L_t(IPmPdWOTthb#vjdI=0&iJpfi~xQLzy^hIbvJ)f$@H}sQYopP?cs$0%{>xUAjewxlY&J0(jc}fO-Uvy3LOk7SwVAXcTJvwWmyQy!L5OfuIs2&D&Y_}t;7s$+eW+HMzvZE zi~W8d6h$GQ&x5fvvO%C*tJOkX?UMn+Fwis&f*?Rq6f&T6dxwvMn{|-mICQ(+&|tAx mkO654nx-MkGFX;P1^fVazlko*>HTy70000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf02y>eSaefwW^{L9 za%BKPWN%_+AW3auXJt}lVPtu6$z?nM00H_*L_t(IPmPn?YZ^fm#=l)Jg=9rBeF(%- z+<}>3WAsDcFx!}wI)pl4m0eY z-#6#Xd?S1+*fwq$N$V@x9}fYRy7FuX#!6yFh&REBj)AieUm$O8Vm*~Y>-}eF?W5ZX zBv>K=ax#f-rvuBf5ZT_w>AM5OTUjn5T-O5aa>n5GjSY0WT?nEGK@b2o2ZKR;(+{xv z{K?eGJs z*DS{4@w|ZIJ3)=96FeLadBW1$y_rb+5A65*QT(1q=*8}(zys+gs?{oo2ZI5Jow)P* zDNaizR>%YdoB0AlFZXb~_Gl^)U2dXMsX$d#^!xoem_*8K=gFI04wo2w@6|r?q4e|? zSid$U#N%-e|2wEEksV?n5I`=M!R6b?+^2-Y+WEw6f|>$wwG zFOFdt2GZ#?cbzk+>=g6AwWMA9WVpbZUEo((uh)46j!`0!2xM7?$K!$5>*X_r+wF$S k<$`W9hu-En|L?{A1{Gm3s^{Xq6#xJL07*qoM6N<$f}q_Uj{pDw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8e086b0d194cb0f7a0e0a320744f35e19c844c9 GIT binary patch literal 707 zcmV;!0zCbRP)N2bPDNB8 zb~7$DE;u(kfL#Cp0zgSbK~y+TrBgd-6j2mCGdmksjfpXZMl_9;2!S+iV{75J2ngEP zX<;ummKLct5zH1*1OvuGK_TJ?#l}D&5DSA~qPWTKV#G~$XJ%*S&CL6GXI55a2`qTw z@aDa_=iGDOoiX06YK{L0qg#RZFCT%09R0mJkw1B%U9u~Indu@fU%l2Q&6C)PQ0EdTnr^%+`FlB_NFY3r`L!X+QfKV2s zHeo!TDd;n2hhUgio16%!%@sUZJOIHZL4XSZNf1Kf*w}bm+LB5FB7$k@v~q@ExMi3K zaPj!J4i9&p@BQb@czADIpFh11xokEiznO2Q2})_IrXZxE>WK?l35kQ`Oh^qytEH5J z<{?Z|VeRV=Fy4oA`6lf%e^oMo+1v4fW zqU9tF5dzYO3>kP3pt`YzyKjducJmdrO_mfnSg$zHWIKPvqbh_XBnKh~k~I)IE&|7f zPnca`*!sTInwpT3@<|N$aTQndW!Xx5?0F+SBkZkK;mFy zGYf;796jg*tPX@WS+&8MHUc6AP6N!gQLFyMTzL?mN^}pu!;<9SbEO|g2iEXmuGoGN zOAAa`2;v>^;~oUOhc37mUn&ZPXVrF|F>&iU&C5X;#qfLv&tq`C0FLXYaB1(+-e*yo pW70ro7m_wx(bdoNXB?eRzW@ZiVc0SQH=qCj002ovPDHLkV1iitD0u(? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..815a8649b07e3e6703395c0f89d055d005b1a5a5 GIT binary patch literal 513 zcmV+c0{;DpP)N2bPDNB8 zb~7$DE;u(kfL#Cp0e(qDK~y+TW88P^|9=KD07w@X8v_FqA-!DZk21)wo5H|$`8bMF zMxf5`zX=)e_b-FgipdNzQ2`95`r-^i%lZ(8K;4bk1%kU)Ge{ph$nf9Bmf_dTnGD}J zcrYA{+kjs`7^LTRGyMAdhvEPCZw&8u?qvAp5lOrOyldt#Fh707@a^9}hOhtsG2D+U zWMJarCDMQ|9~t-;PiFWI)cg&o<%yyS!yk`utl^E-3vA1#GBCV*!|)Ag^H)YjhF8g@ z42*0X#2N7a%?k#OrPIJp{{{@{=h_Ag%=UgbV;jQ-f48k<`1S1@!*`&TFHDRK-_k1> z7@1j!H{k2H4-CpXwlgqUSTMY^c4FW(al)I{FvH-@GX_R3E`}E>+6t`}Bv2%j8g3>(`(42ojni0(~6ytxrdku^(e+I$I$q-#o0E`GQ z7hN+*8pQ?rPO60R7K;4EeYa5!fXjj`$7UV6^MPsroqvO;u=QS$00000NkvXXu0mjf DJ4)AC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f6ecf4dea8a473aa590b8b7e677dc1bdea2fc9a4 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSL74G){)!Z!pj3%#L`iUdT1k0gQ7S_~VrE{6o}X)oLYc9ish**M!Iz?iKvge2 zT^vI!{F85#zqa@6V4VKSw4MLEuFd{`7wk+}Elgd+=hS?9^m?y*{H-)Ow`JX8>btdxy9eLZ_WwWWVbM*i2uSZc>wOIANQmdQHH6 z6xZ`dtc**wom7ls-L&z^SL22XO}>D%c2_-g7$p)^fjHe^z;W6 zF%jNX&;ABR8h=#R72%akHRe!rX<^GfAIu_n!D3D)|MXA>m*}AP3(do9fu3gYboFyt I=akR{0DY>ChX4Qo literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..08dc68e69e6eaf6f152e4a0f386976fc11a8c70f GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH+5P_o1|q9iy!t)x7$D3u`~F*C13&(AePq0Cs%RL{cPx*-;*sNd7Y zF~q_@`A+%k|MhHK48p8c2ctC28U&|{OMO1qlxy(i*O3R$A9h?`SP@%b;MMl9^!k&Kp3NY9C?zAn8=1@aPlYMYab;vKQHIFdt@& z?rB&o7_M;W5bN}`39COWW1hhH!$jDpv&H0bDdWbV85mqN2bPDNB8 zb~7$DE;u(kfL#Cp0hLKaK~y+TrIJlc!$1&*-=qmN1)+$Po_bIe6$*YFMGM8FXa9tt zNAVYkSMUA-kK)Ng(TZ0C7An+_TMI6o$qX~bb(T06%BUc7=0z^>+ z#ux%|8WseJk{;ou8j2o(D@Yik)9ogTJmifc)vE%CWI$gQzrFw@i9F<`nm!;1LWCm0 z1bJi!!b4uF=>sT1`g&n7)9FN!C-xISuJPgM9E-&T_`W~Z8ZFC0y>^e;{Vlb|FbpKs zwr%h~?vOiiMi7)E9E=``tkk99(=sDIPK;D^NmlCkKvxLja z72K99ZW)BZ>BF7AK;?RHCcAh$pd@6|J0pVX1raE8twzj)Q`P=0FO!urA958&6T aF_PbOL|F&dHN8~;0000 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 0000000000000000000000000000000000000000..b8fa44ed1b7ae1f0d64e0336a2ad9d5da09a835c GIT binary patch literal 1159 zcmV;21bF+2P)^@R9HvtSKn(CR}}tc*IjitQM26* zY&EGGO>Kh`kcwI?iccb1eDI;_TT329R4jc`$Oiub5kZXP&D8#ohEm!GTTznuGejk} z)o9$rUx`thghXo+GdrGhXJ_}$?A*=hB7%5en3=oheD^!wIcH{8OC$^f1(;72n@SnD zl^n!xe= z&V&OPf1v{bg)9Wpy|N5HH8TkLrOo$(g4+6@A;r7SnE{-?Pm~mep-pbDn1i32?_hk~ z1o3eZ4f+8bQ$7>;h>o-O)F4GcbS?W3Cr;jmuBYG&2L1RV8b;vnMqrd^(N7vg!quNdvEHX4(9v&#%q|AF0#rT=L>n1H$;p4PtN02I?;S=( zMG^e|G=QcNNL36Qh)s|L6(I2CPgeI`gOgsA=$2R7fs_HT4Vh?Gv+b#`jt40K9SbDM>KZw}zs;ZaPKhOob~11pys zV6l69fyTz^h{Y;UULMJ&;B53yDxx`IM>z!wRnvod zFhWDXj0nsvSlP<#ELTAloOc%FKFBBXn`>pSrG3x9@nZ2Rob0C*ksFEIc(MnI#?$#a zJ6kaYk8|M+R3Do1bMUo?iJu47P>Gyf)Oxj6c6mp>8h}f=-T{C~KQJci(zmaHYYMeX zF1a$V>sXevK808KdnjW~X7Iqytv2V#!A6|E(2h0Bm)h2a2CLV#XODV+#v$@`_F5&T zVBkarE`)u9TYf}kX^Gt>V_z*XD`9Ng@fk#5+W4N0*W_zn zbNWsZyIIKTosXsUa5}sBx@*8davIKiDGhTPX-5@pTM7*1@Xe01moi$cB;R-7-B@rZ Zz68CD4(iO?1&IIv002ovPDHLkV1mJT8^Qnp literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..073e8a9b050f0c28a549972beeb249e2a87104c9 GIT binary patch literal 1367 zcmV-d1*rOoP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGh)&Kwv)&Y=jd7J&jG7(Kc{K)Jgeq>scjF-r&xO-UG zjUbEQvX{MxDENhncu+ieRT1%^qKF>E=<~gru1-yLbyu~TXtW8B87BRH^Xlu>zg`V< zU4Tz9_9@QfYXt1reGh7z3$U{72y_+R2BI|r$eC?t@WZb0P_toG0AdH|XTSy!vS&g7 z;sf^Ve+BiqJ|3=Y)lLQ&0q9Qy@d1mQH^Z1;D@qTm_SgeRklEQaygz(ELt@NLVc^2TW;N0PLzI;12f3iV5X_pSS%FW9!Fpa=^|=V05ndF$JwVuapDACKMk= z(TR$))kN|E8fPnjv$dZ$iP|i}mZLRJB-2{?8Uff|oL}5rZ?Z%+BiMulz&kGK#H0_B zd4OW$v#$lz2QKanF6slvTyPZxp^GXV7g z0Vqf4Ad!G`Cuei#=co@vk`a(o`zMBMu2LV|zn}3P1wce1QhsCvVSop?(Ynhgnx0j}77S|MJQEXu z@i;ULorw9sRjutPW~TS%#dPhzDxMEi`@MNI^tQB{0WV(6)aHYiPZ;#9vPdXlfIH_I z6o0BVM{sOoMQI@^R$PM%tMi5#kSNtJrq*ND6NdiClg~c{$N3GKn*N4DVIY3}fSl9m zG%Q`3f!f-(0L0h?0yvHXU0q#}$t({*e8Aqluc5K=Padvp>GXOIaB(-$L3}_%!#-HH zEW;mGEuYVGfDEat+fu%m=FM9Kot>TjgTg`gN|97oE6aJwlC_Y_<*Weh?d>pY*8K7a za=G(RQ!|H?Rm*0xKA4>6&Rqx{9XIXj2VxYcDXO#G@!uOpowF4noBfwJiP|i}{^sik zUtK;JiA9*g8$8||E**2itm71}gLnG1(A}~F{@ON9s|$oq_@gZaJ)2tffZm2l@a*BB zI+xE0;{D5~47%$p&AYSCnLfLF8TElP!wl$a#Bb5*gLTtTcwaID5`FN+^g(ju8G;gs zE+=%HwmUD-p<8!eINp*9KQA1p8wCSz4f!DIyl`m!Vz_-a8W4S6z;%9*vW+GWh|h}7 z^oa99vNIWvy6RqOl)58vb5-X-?0TXK@al;t@V>DZ?;FkaL=8aH6R9AnLV}~9>I0>o zs6qk&ojy?Oi3BOC_l;t_ZS(;ZC9Ud-VfugybKUBFqd()MjYa4KwVqhS`^Jy1C(6!t zaSR^Fhe{f_**+DNNG>vdaf5AZ|X8FKL86h?Ng) z^g(1ku+az6`9Px&;^l*otW4QSx1`N`W9)pOMi4t6Bob#ZX*hH_gXd>5dLPm^;ls#K zCwu1N>qh|q9m$3XAh(&??R~o+f#?sVPX_xyYBRO{mIR>pqCe>~aG?w+0Dvw8sk!J>r?2_QB3I<8)9hK13y=6ql|AI$pTJDQ26Izia~ ZKLEyLIYFLsfvx}m002ovPDHLkV1mS7irD}F literal 0 HcmV?d00001 diff --git a/programs/media/log_el/trunk/toolbar.png b/programs/media/log_el/trunk/toolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..16c0a6c9d9c438a819857ac79e34c477a77964d0 GIT binary patch literal 5054 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 Uk)#8>ZvX%Q07*qoM6N<$f{h1>zW@LL literal 0 HcmV?d00001 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